@payloadcms/plugin-import-export 4.0.0-internal.43ccea7 → 4.0.0-internal.442e8b6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/components/CollectionField/index.d.ts +3 -2
  2. package/dist/components/CollectionField/index.d.ts.map +1 -1
  3. package/dist/components/CollectionField/index.js.map +1 -1
  4. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
  5. package/dist/components/ExportListMenuItem/index.js +14 -12
  6. package/dist/components/ExportListMenuItem/index.js.map +1 -1
  7. package/dist/components/ExportPreview/index.css +0 -3
  8. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  9. package/dist/components/ExportPreview/index.js +11 -1
  10. package/dist/components/ExportPreview/index.js.map +1 -1
  11. package/dist/components/FieldsToExport/index.d.ts +3 -2
  12. package/dist/components/FieldsToExport/index.d.ts.map +1 -1
  13. package/dist/components/FieldsToExport/index.js.map +1 -1
  14. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
  15. package/dist/components/FormatField/index.d.ts +3 -2
  16. package/dist/components/FormatField/index.d.ts.map +1 -1
  17. package/dist/components/FormatField/index.js.map +1 -1
  18. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -1
  19. package/dist/components/ImportListMenuItem/index.js +14 -12
  20. package/dist/components/ImportListMenuItem/index.js.map +1 -1
  21. package/dist/components/ImportPreview/index.css +0 -3
  22. package/dist/components/ImportPreview/index.d.ts.map +1 -1
  23. package/dist/components/ImportPreview/index.js +27 -8
  24. package/dist/components/ImportPreview/index.js.map +1 -1
  25. package/dist/components/LimitField/index.d.ts +3 -2
  26. package/dist/components/LimitField/index.d.ts.map +1 -1
  27. package/dist/components/LimitField/index.js.map +1 -1
  28. package/dist/components/LocaleField/index.d.ts +3 -2
  29. package/dist/components/LocaleField/index.d.ts.map +1 -1
  30. package/dist/components/LocaleField/index.js.map +1 -1
  31. package/dist/components/Page/index.d.ts +3 -2
  32. package/dist/components/Page/index.d.ts.map +1 -1
  33. package/dist/components/Page/index.js.map +1 -1
  34. package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts +7 -0
  35. package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts.map +1 -0
  36. package/dist/components/RelationshipCell/getRelationshipGroupKey.js +3 -0
  37. package/dist/components/RelationshipCell/getRelationshipGroupKey.js.map +1 -0
  38. package/dist/components/RelationshipCell/getRelationshipGroups.d.ts +43 -0
  39. package/dist/components/RelationshipCell/getRelationshipGroups.d.ts.map +1 -0
  40. package/dist/components/RelationshipCell/getRelationshipGroups.js +109 -0
  41. package/dist/components/RelationshipCell/getRelationshipGroups.js.map +1 -0
  42. package/dist/components/RelationshipCell/index.css +30 -0
  43. package/dist/components/RelationshipCell/index.d.ts +15 -0
  44. package/dist/components/RelationshipCell/index.d.ts.map +1 -0
  45. package/dist/components/RelationshipCell/index.js +57 -0
  46. package/dist/components/RelationshipCell/index.js.map +1 -0
  47. package/dist/components/SortBy/index.d.ts +3 -2
  48. package/dist/components/SortBy/index.d.ts.map +1 -1
  49. package/dist/components/SortBy/index.js.map +1 -1
  50. package/dist/components/SortOrder/index.d.ts +3 -2
  51. package/dist/components/SortOrder/index.d.ts.map +1 -1
  52. package/dist/components/SortOrder/index.js.map +1 -1
  53. package/dist/export/batchProcessor.d.ts +2 -1
  54. package/dist/export/batchProcessor.d.ts.map +1 -1
  55. package/dist/export/batchProcessor.js +6 -2
  56. package/dist/export/batchProcessor.js.map +1 -1
  57. package/dist/export/createExport.d.ts +2 -0
  58. package/dist/export/createExport.d.ts.map +1 -1
  59. package/dist/export/createExport.js +6 -1
  60. package/dist/export/createExport.js.map +1 -1
  61. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  62. package/dist/export/getCreateExportCollectionTask.js +11 -0
  63. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  64. package/dist/export/getExportCollection.d.ts.map +1 -1
  65. package/dist/export/getExportCollection.js +5 -0
  66. package/dist/export/getExportCollection.js.map +1 -1
  67. package/dist/export/getFields.d.ts.map +1 -1
  68. package/dist/export/handleDownload.d.ts.map +1 -1
  69. package/dist/export/handleDownload.js +7 -3
  70. package/dist/export/handleDownload.js.map +1 -1
  71. package/dist/export/handlePreview.d.ts.map +1 -1
  72. package/dist/export/handlePreview.js +24 -5
  73. package/dist/export/handlePreview.js.map +1 -1
  74. package/dist/exports/types.d.ts +1 -1
  75. package/dist/exports/types.d.ts.map +1 -1
  76. package/dist/exports/types.js.map +1 -1
  77. package/dist/import/batchProcessor.d.ts +2 -1
  78. package/dist/import/batchProcessor.d.ts.map +1 -1
  79. package/dist/import/batchProcessor.js +15 -8
  80. package/dist/import/batchProcessor.js.map +1 -1
  81. package/dist/import/createImport.d.ts +3 -2
  82. package/dist/import/createImport.d.ts.map +1 -1
  83. package/dist/import/createImport.js +8 -1
  84. package/dist/import/createImport.js.map +1 -1
  85. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  86. package/dist/import/getCreateImportCollectionTask.js +5 -2
  87. package/dist/import/getCreateImportCollectionTask.js.map +1 -1
  88. package/dist/import/getFields.d.ts.map +1 -1
  89. package/dist/import/getImportCollection.d.ts.map +1 -1
  90. package/dist/import/getImportCollection.js +2 -0
  91. package/dist/import/getImportCollection.js.map +1 -1
  92. package/dist/import/handlePreview.d.ts.map +1 -1
  93. package/dist/import/handlePreview.js +5 -1
  94. package/dist/import/handlePreview.js.map +1 -1
  95. package/dist/translations/languages/en.d.ts.map +1 -1
  96. package/dist/types.d.ts +17 -1
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/types.js.map +1 -1
  99. package/dist/utilities/applyFieldHooks.d.ts.map +1 -1
  100. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
  101. package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -1
  102. package/dist/utilities/fieldToRegex.d.ts.map +1 -1
  103. package/dist/utilities/flattenObject.d.ts.map +1 -1
  104. package/dist/utilities/flattenedFields.d.ts.map +1 -1
  105. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
  106. package/dist/utilities/getExportFieldFunctions.js +64 -27
  107. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  108. package/dist/utilities/getFileFromDoc.d.ts.map +1 -1
  109. package/dist/utilities/getFileFromDoc.js +3 -3
  110. package/dist/utilities/getFileFromDoc.js.map +1 -1
  111. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  112. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
  113. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  114. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  115. package/dist/utilities/getSelect.d.ts.map +1 -1
  116. package/dist/utilities/getSelect.js +11 -3
  117. package/dist/utilities/getSelect.js.map +1 -1
  118. package/dist/utilities/getSubmittedFormValues.d.ts +12 -0
  119. package/dist/utilities/getSubmittedFormValues.d.ts.map +1 -0
  120. package/dist/utilities/getSubmittedFormValues.js +24 -0
  121. package/dist/utilities/getSubmittedFormValues.js.map +1 -0
  122. package/dist/utilities/isPlainObject.d.ts.map +1 -1
  123. package/dist/utilities/parseCSV.d.ts.map +1 -1
  124. package/dist/utilities/parseJSON.d.ts.map +1 -1
  125. package/dist/utilities/polymorphicRel.d.ts.map +1 -1
  126. package/dist/utilities/processRichTextField.d.ts.map +1 -1
  127. package/dist/utilities/removeDisabledFields.d.ts.map +1 -1
  128. package/dist/utilities/setNestedValue.d.ts +2 -1
  129. package/dist/utilities/setNestedValue.d.ts.map +1 -1
  130. package/dist/utilities/setNestedValue.js +65 -34
  131. package/dist/utilities/setNestedValue.js.map +1 -1
  132. package/dist/utilities/sortHelpers.d.ts +1 -1
  133. package/dist/utilities/sortHelpers.d.ts.map +1 -1
  134. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  135. package/dist/utilities/unflattenPostProcess.d.ts.map +1 -1
  136. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  137. package/package.json +9 -9
  138. package/dist/components/FieldsToExport/reduceFields.spec.js +0 -239
  139. package/dist/components/FieldsToExport/reduceFields.spec.js.map +0 -1
  140. package/dist/utilities/applyFieldHooks.spec.js +0 -205
  141. package/dist/utilities/applyFieldHooks.spec.js.map +0 -1
  142. package/dist/utilities/buildDisabledFieldRegex.spec.js +0 -64
  143. package/dist/utilities/buildDisabledFieldRegex.spec.js.map +0 -1
  144. package/dist/utilities/fieldToRegex.spec.js +0 -151
  145. package/dist/utilities/fieldToRegex.spec.js.map +0 -1
  146. package/dist/utilities/filterToSelectedFields.spec.js +0 -204
  147. package/dist/utilities/filterToSelectedFields.spec.js.map +0 -1
  148. package/dist/utilities/flattenObject.spec.js +0 -158
  149. package/dist/utilities/flattenObject.spec.js.map +0 -1
  150. package/dist/utilities/getExportFieldFunctions.spec.js +0 -50
  151. package/dist/utilities/getExportFieldFunctions.spec.js.map +0 -1
  152. package/dist/utilities/getImportFieldFunctions.spec.js +0 -167
  153. package/dist/utilities/getImportFieldFunctions.spec.js.map +0 -1
  154. package/dist/utilities/getSchemaColumns.spec.js +0 -157
  155. package/dist/utilities/getSchemaColumns.spec.js.map +0 -1
  156. package/dist/utilities/parseCSV.spec.js +0 -195
  157. package/dist/utilities/parseCSV.spec.js.map +0 -1
  158. package/dist/utilities/processRichTextField.spec.js +0 -308
  159. package/dist/utilities/processRichTextField.spec.js.map +0 -1
  160. package/dist/utilities/siblingDoc.spec.js +0 -278
  161. package/dist/utilities/siblingDoc.spec.js.map +0 -1
  162. package/dist/utilities/unflattenObject.spec.js +0 -819
  163. package/dist/utilities/unflattenObject.spec.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/RelationshipCell/index.tsx"],"sourcesContent":["'use client'\nimport { useConfig, useTranslation } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { getRelationshipGroupKey } from './getRelationshipGroupKey.js'\nimport { getRelationshipGroups } from './getRelationshipGroups.js'\nimport './index.css'\n\nconst baseClass = 'import-preview-relationship'\n\ntype Props = {\n fieldPath: string\n /** `field.relationTo` — an array when the field is polymorphic. */\n relationTo: string | string[]\n value: unknown\n}\n\n/**\n * Renders a relationship or upload value for the import preview table, stacking\n * one row per target collection.\n */\nexport const RelationshipCell: React.FC<Props> = ({ fieldPath, relationTo, value }) => {\n const { config } = useConfig()\n const { i18n } = useTranslation()\n\n const groups = getRelationshipGroups({\n collections: config.collections,\n dateFormat: config.admin.dateFormat,\n i18n,\n relationTo,\n value,\n })\n\n // The column heading already names a monomorphic field, whose collection never varies.\n const shouldShowCollectionLabels = Array.isArray(relationTo)\n\n if (!groups.length) {\n return null\n }\n\n return (\n <div className={baseClass}>\n {groups.map(({ slug, label, options, remaining }) => (\n <div className={`${baseClass}__group`} key={getRelationshipGroupKey({ slug, fieldPath })}>\n {/* A `label` element would be unassociated here — the cell holds no control */}\n {shouldShowCollectionLabels && label && (\n <span className={`${baseClass}__collection`}>{label}</span>\n )}\n <div className={`${baseClass}__values`}>\n {options.join(', ')}\n {remaining > 0 && (\n <span className={`${baseClass}__more`}>\n {i18n.t('fields:itemsAndMore', { count: remaining, items: '' }).trim()}\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n )\n}\n"],"names":["useConfig","useTranslation","React","getRelationshipGroupKey","getRelationshipGroups","baseClass","RelationshipCell","fieldPath","relationTo","value","config","i18n","groups","collections","dateFormat","admin","shouldShowCollectionLabels","Array","isArray","length","div","className","map","slug","label","options","remaining","span","join","t","count","items","trim"],"mappings":"AAAA;;AACA,SAASA,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AAC1D,OAAOC,WAAW,QAAO;AAEzB,SAASC,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,qBAAqB,QAAQ,6BAA4B;AAClE,OAAO,cAAa;AAEpB,MAAMC,YAAY;AASlB;;;CAGC,GACD,OAAO,MAAMC,mBAAoC,CAAC,EAAEC,SAAS,EAAEC,UAAU,EAAEC,KAAK,EAAE;IAChF,MAAM,EAAEC,MAAM,EAAE,GAAGV;IACnB,MAAM,EAAEW,IAAI,EAAE,GAAGV;IAEjB,MAAMW,SAASR,sBAAsB;QACnCS,aAAaH,OAAOG,WAAW;QAC/BC,YAAYJ,OAAOK,KAAK,CAACD,UAAU;QACnCH;QACAH;QACAC;IACF;IAEA,uFAAuF;IACvF,MAAMO,6BAA6BC,MAAMC,OAAO,CAACV;IAEjD,IAAI,CAACI,OAAOO,MAAM,EAAE;QAClB,OAAO;IACT;IAEA,qBACE,KAACC;QAAIC,WAAWhB;kBACbO,OAAOU,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAEC,KAAK,EAAEC,OAAO,EAAEC,SAAS,EAAE,iBAC9C,MAACN;gBAAIC,WAAW,GAAGhB,UAAU,OAAO,CAAC;;oBAElCW,8BAA8BQ,uBAC7B,KAACG;wBAAKN,WAAW,GAAGhB,UAAU,YAAY,CAAC;kCAAGmB;;kCAEhD,MAACJ;wBAAIC,WAAW,GAAGhB,UAAU,QAAQ,CAAC;;4BACnCoB,QAAQG,IAAI,CAAC;4BACbF,YAAY,mBACX,KAACC;gCAAKN,WAAW,GAAGhB,UAAU,MAAM,CAAC;0CAClCM,KAAKkB,CAAC,CAAC,uBAAuB;oCAAEC,OAAOJ;oCAAWK,OAAO;gCAAG,GAAGC,IAAI;;;;;eAThC7B,wBAAwB;gBAAEoB;gBAAMhB;YAAU;;AAiB9F,EAAC"}
@@ -1,4 +1,5 @@
1
- import type { SelectFieldClientComponent } from 'payload';
1
+ import type { SelectFieldClientProps } from 'payload';
2
+ import React from 'react';
2
3
  import './index.css';
3
- export declare const SortBy: SelectFieldClientComponent;
4
+ export declare const SortBy: React.FC<SelectFieldClientProps>;
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAgBzD,OAAO,aAAa,CAAA;AAIpB,eAAO,MAAM,MAAM,EAAE,0BAoHpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortBy/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAWrD,OAAO,KAA+C,MAAM,OAAO,CAAA;AAKnE,OAAO,aAAa,CAAA;AAIpB,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAoHnD,CAAA"}
@@ -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, useMemo, useRef, useState } from 'react'\n\nimport { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js'\nimport { reduceFields } from '../FieldsToExport/reduceFields.js'\nimport { useImportExport } from '../ImportExportProvider/index.js'\nimport './index.css'\n\nconst baseClass = 'sort-by-fields'\n\nexport const SortBy: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n\n // The \"sort\" text field that stores 'title' or '-title'\n const { setValue: setSort, value: sortRaw } = useField<string>()\n\n // Sibling order field ('asc' | 'desc') used when writing sort on change\n const { value: sortOrder = 'asc' } = useField<string>({ path: 'sortOrder' })\n // Needed so we can initialize sortOrder when SortOrder component is hidden\n const { setValue: setSortOrder } = useField<'asc' | 'desc'>({ path: 'sortOrder' })\n\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { query } = useListQuery()\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n\n // ReactSelect's displayed option\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 = useMemo(\n () => reduceFields({ excludeUnsortable: true, fields: collectionConfig?.fields }),\n [collectionConfig?.fields],\n )\n\n // Normalize the stored value for display (strip the '-') and pick the option\n useEffect(() => {\n const clean = stripSortDash(sortRaw)\n if (!clean) {\n setDisplayedValue(null)\n return\n }\n\n const option = fieldOptions.find((f) => f.value === clean)\n if (option && (!displayedValue || displayedValue.value !== clean)) {\n setDisplayedValue(option)\n }\n }, [sortRaw, fieldOptions, displayedValue])\n\n // One-time init guard so clearing `sort` doesn't rehydrate from query again\n const didInitRef = useRef(false)\n\n // Sync the visible select from list-view query sort (preferred) or groupBy (fallback)\n // and initialize both `sort` and `sortOrder` here as SortOrder may be hidden by admin.condition.\n useEffect(() => {\n if (didInitRef.current) {\n return\n }\n if (id) {\n didInitRef.current = true\n return\n }\n if (typeof sortRaw === 'string' && sortRaw.length > 0) {\n // Already initialized elsewhere\n didInitRef.current = true\n return\n }\n\n const qsSort = normalizeQueryParam(query?.sort)\n const qsGroupBy = normalizeQueryParam(query?.groupBy)\n\n const source = qsSort ?? qsGroupBy\n if (!source) {\n didInitRef.current = true\n return\n }\n\n const isDesc = !!qsSort && qsSort.startsWith('-')\n const base = stripSortDash(source)\n const order: 'asc' | 'desc' = isDesc ? 'desc' : 'asc'\n\n // Write BOTH fields so preview/export have the right values even if SortOrder is hidden\n setSort(applySortOrder(base, order))\n setSortOrder(order)\n\n const option = fieldOptions.find((f) => f.value === base)\n if (option) {\n setDisplayedValue(option)\n }\n\n didInitRef.current = true\n }, [id, query?.groupBy, query?.sort, sortRaw, fieldOptions, setSort, setSortOrder])\n\n // When user selects a different field, store it with the current order applied\n const onChange = (option: { id: string; label: ReactNode; value: string } | null) => {\n if (!option) {\n setSort('')\n setDisplayedValue(null)\n } else {\n setDisplayedValue(option)\n const next = applySortOrder(option.value, String(sortOrder) as 'asc' | 'desc')\n setSort(next)\n }\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\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","useMemo","useRef","useState","applySortOrder","normalizeQueryParam","stripSortDash","reduceFields","useImportExport","baseClass","SortBy","props","id","setValue","setSort","value","sortRaw","sortOrder","path","setSortOrder","collectionSlug","query","getEntityConfig","collection","displayedValue","setDisplayedValue","collectionConfig","fieldOptions","excludeUnsortable","fields","clean","option","find","f","didInitRef","current","length","qsSort","sort","qsGroupBy","groupBy","source","isDesc","startsWith","base","order","onChange","next","String","div","className","label","field","disabled","readOnly","getOptionValue","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,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEnE,SAASC,cAAc,EAAEC,mBAAmB,EAAEC,aAAa,QAAQ,iCAAgC;AACnG,SAASC,YAAY,QAAQ,oCAAmC;AAChE,SAASC,eAAe,QAAQ,mCAAkC;AAClE,OAAO,cAAa;AAEpB,MAAMC,YAAY;AAElB,OAAO,MAAMC,SAAqC,CAACC;IACjD,MAAM,EAAEC,EAAE,EAAE,GAAGhB;IAEf,wDAAwD;IACxD,MAAM,EAAEiB,UAAUC,OAAO,EAAEC,OAAOC,OAAO,EAAE,GAAGnB;IAE9C,wEAAwE;IACxE,MAAM,EAAEkB,OAAOE,YAAY,KAAK,EAAE,GAAGpB,SAAiB;QAAEqB,MAAM;IAAY;IAC1E,2EAA2E;IAC3E,MAAM,EAAEL,UAAUM,YAAY,EAAE,GAAGtB,SAAyB;QAAEqB,MAAM;IAAY;IAEhF,MAAM,EAAEH,OAAOK,cAAc,EAAE,GAAGvB,SAAiB;QAAEqB,MAAM;IAAiB;IAC5E,MAAM,EAAEG,KAAK,EAAE,GAAGvB;IAClB,MAAM,EAAEwB,eAAe,EAAE,GAAG3B;IAC5B,MAAM,EAAE4B,UAAU,EAAE,GAAGf;IAEvB,iCAAiC;IACjC,MAAM,CAACgB,gBAAgBC,kBAAkB,GAAGtB,SAIlC;IAEV,MAAMuB,mBAAmBJ,gBAAgB;QAAEF,gBAAgBA,kBAAkBG;IAAW;IACxF,MAAMI,eAAe1B,QACnB,IAAMM,aAAa;YAAEqB,mBAAmB;YAAMC,QAAQH,kBAAkBG;QAAO,IAC/E;QAACH,kBAAkBG;KAAO;IAG5B,6EAA6E;IAC7E7B,UAAU;QACR,MAAM8B,QAAQxB,cAAcU;QAC5B,IAAI,CAACc,OAAO;YACVL,kBAAkB;YAClB;QACF;QAEA,MAAMM,SAASJ,aAAaK,IAAI,CAAC,CAACC,IAAMA,EAAElB,KAAK,KAAKe;QACpD,IAAIC,UAAW,CAAA,CAACP,kBAAkBA,eAAeT,KAAK,KAAKe,KAAI,GAAI;YACjEL,kBAAkBM;QACpB;IACF,GAAG;QAACf;QAASW;QAAcH;KAAe;IAE1C,4EAA4E;IAC5E,MAAMU,aAAahC,OAAO;IAE1B,sFAAsF;IACtF,iGAAiG;IACjGF,UAAU;QACR,IAAIkC,WAAWC,OAAO,EAAE;YACtB;QACF;QACA,IAAIvB,IAAI;YACNsB,WAAWC,OAAO,GAAG;YACrB;QACF;QACA,IAAI,OAAOnB,YAAY,YAAYA,QAAQoB,MAAM,GAAG,GAAG;YACrD,gCAAgC;YAChCF,WAAWC,OAAO,GAAG;YACrB;QACF;QAEA,MAAME,SAAShC,oBAAoBgB,OAAOiB;QAC1C,MAAMC,YAAYlC,oBAAoBgB,OAAOmB;QAE7C,MAAMC,SAASJ,UAAUE;QACzB,IAAI,CAACE,QAAQ;YACXP,WAAWC,OAAO,GAAG;YACrB;QACF;QAEA,MAAMO,SAAS,CAAC,CAACL,UAAUA,OAAOM,UAAU,CAAC;QAC7C,MAAMC,OAAOtC,cAAcmC;QAC3B,MAAMI,QAAwBH,SAAS,SAAS;QAEhD,wFAAwF;QACxF5B,QAAQV,eAAewC,MAAMC;QAC7B1B,aAAa0B;QAEb,MAAMd,SAASJ,aAAaK,IAAI,CAAC,CAACC,IAAMA,EAAElB,KAAK,KAAK6B;QACpD,IAAIb,QAAQ;YACVN,kBAAkBM;QACpB;QAEAG,WAAWC,OAAO,GAAG;IACvB,GAAG;QAACvB;QAAIS,OAAOmB;QAASnB,OAAOiB;QAAMtB;QAASW;QAAcb;QAASK;KAAa;IAElF,+EAA+E;IAC/E,MAAM2B,WAAW,CAACf;QAChB,IAAI,CAACA,QAAQ;YACXjB,QAAQ;YACRW,kBAAkB;QACpB,OAAO;YACLA,kBAAkBM;YAClB,MAAMgB,OAAO3C,eAAe2B,OAAOhB,KAAK,EAAEiC,OAAO/B;YACjDH,QAAQiC;QACV;IACF;IAEA,qBACE,MAACE;QAAIC,WAAWzC;;0BACd,KAAChB;gBAAW0D,OAAOxC,MAAMyC,KAAK,CAACD,KAAK;gBAAEjC,MAAMP,MAAMO,IAAI;;0BACtD,KAACxB;gBACC2D,UAAU1C,MAAM2C,QAAQ;gBACxBC,gBAAgB,CAACxB,SAAWiB,OAAOjB,OAAOhB,KAAK;gBAC/CyC,SAAS,CAAC,MAAM,EAAE7C,MAAMO,IAAI,CAACuC,OAAO,CAAC,OAAO,OAAO;gBACnDC,aAAa;gBACbC,YAAY;gBACZ,uCAAuC;gBACvCb,UAAUA;gBACVc,SAASjC;gBACT,gCAAgC;gBAChCZ,OAAOS;;;;AAIf,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/SortBy/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientProps } 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, useMemo, useRef, useState } from 'react'\n\nimport { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js'\nimport { reduceFields } from '../FieldsToExport/reduceFields.js'\nimport { useImportExport } from '../ImportExportProvider/index.js'\nimport './index.css'\n\nconst baseClass = 'sort-by-fields'\n\nexport const SortBy: React.FC<SelectFieldClientProps> = (props) => {\n const { id } = useDocumentInfo()\n\n // The \"sort\" text field that stores 'title' or '-title'\n const { setValue: setSort, value: sortRaw } = useField<string>()\n\n // Sibling order field ('asc' | 'desc') used when writing sort on change\n const { value: sortOrder = 'asc' } = useField<string>({ path: 'sortOrder' })\n // Needed so we can initialize sortOrder when SortOrder component is hidden\n const { setValue: setSortOrder } = useField<'asc' | 'desc'>({ path: 'sortOrder' })\n\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { query } = useListQuery()\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n\n // ReactSelect's displayed option\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 = useMemo(\n () => reduceFields({ excludeUnsortable: true, fields: collectionConfig?.fields }),\n [collectionConfig?.fields],\n )\n\n // Normalize the stored value for display (strip the '-') and pick the option\n useEffect(() => {\n const clean = stripSortDash(sortRaw)\n if (!clean) {\n setDisplayedValue(null)\n return\n }\n\n const option = fieldOptions.find((f) => f.value === clean)\n if (option && (!displayedValue || displayedValue.value !== clean)) {\n setDisplayedValue(option)\n }\n }, [sortRaw, fieldOptions, displayedValue])\n\n // One-time init guard so clearing `sort` doesn't rehydrate from query again\n const didInitRef = useRef(false)\n\n // Sync the visible select from list-view query sort (preferred) or groupBy (fallback)\n // and initialize both `sort` and `sortOrder` here as SortOrder may be hidden by admin.condition.\n useEffect(() => {\n if (didInitRef.current) {\n return\n }\n if (id) {\n didInitRef.current = true\n return\n }\n if (typeof sortRaw === 'string' && sortRaw.length > 0) {\n // Already initialized elsewhere\n didInitRef.current = true\n return\n }\n\n const qsSort = normalizeQueryParam(query?.sort)\n const qsGroupBy = normalizeQueryParam(query?.groupBy)\n\n const source = qsSort ?? qsGroupBy\n if (!source) {\n didInitRef.current = true\n return\n }\n\n const isDesc = !!qsSort && qsSort.startsWith('-')\n const base = stripSortDash(source)\n const order: 'asc' | 'desc' = isDesc ? 'desc' : 'asc'\n\n // Write BOTH fields so preview/export have the right values even if SortOrder is hidden\n setSort(applySortOrder(base, order))\n setSortOrder(order)\n\n const option = fieldOptions.find((f) => f.value === base)\n if (option) {\n setDisplayedValue(option)\n }\n\n didInitRef.current = true\n }, [id, query?.groupBy, query?.sort, sortRaw, fieldOptions, setSort, setSortOrder])\n\n // When user selects a different field, store it with the current order applied\n const onChange = (option: { id: string; label: ReactNode; value: string } | null) => {\n if (!option) {\n setSort('')\n setDisplayedValue(null)\n } else {\n setDisplayedValue(option)\n const next = applySortOrder(option.value, String(sortOrder) as 'asc' | 'desc')\n setSort(next)\n }\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\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","useMemo","useRef","useState","applySortOrder","normalizeQueryParam","stripSortDash","reduceFields","useImportExport","baseClass","SortBy","props","id","setValue","setSort","value","sortRaw","sortOrder","path","setSortOrder","collectionSlug","query","getEntityConfig","collection","displayedValue","setDisplayedValue","collectionConfig","fieldOptions","excludeUnsortable","fields","clean","option","find","f","didInitRef","current","length","qsSort","sort","qsGroupBy","groupBy","source","isDesc","startsWith","base","order","onChange","next","String","div","className","label","field","disabled","readOnly","getOptionValue","inputId","replace","isClearable","isSortable","options"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import type { SelectFieldClientComponent } from 'payload';
1
+ import type { SelectFieldClientProps } from 'payload';
2
+ import React from 'react';
2
3
  import './index.css';
3
- export declare const SortOrder: SelectFieldClientComponent;
4
+ export declare const SortOrder: React.FC<SelectFieldClientProps>;
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortOrder/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAMzD,OAAO,aAAa,CAAA;AAcpB,eAAO,MAAM,SAAS,EAAE,0BAsGvB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortOrder/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAGrD,OAAO,KAA+C,MAAM,OAAO,CAAA;AAGnE,OAAO,aAAa,CAAA;AAcpB,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAsGtD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SortOrder/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientComponent } from 'payload'\n\nimport { FieldLabel, ReactSelect, useDocumentInfo, useField, useListQuery } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\n\nimport { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js'\nimport './index.css'\n\nconst baseClass = 'sort-order-field'\n\ntype Order = 'asc' | 'desc'\ntype OrderOption = { label: string; value: Order }\n\nconst options = [\n { label: 'Ascending', value: 'asc' as const },\n { label: 'Descending', value: 'desc' as const },\n] as const\n\nconst defaultOption: OrderOption = options[0]\n\nexport const SortOrder: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { query } = useListQuery()\n\n // 'sortOrder' select field: 'asc' | 'desc'\n const { setValue: setOrder, value: orderValueRaw } = useField<Order>()\n\n // 'sort' text field: 'title' | '-title'\n const { setValue: setSort, value: sortRaw } = useField<string>({ path: 'sort' })\n\n // The current order value, defaulting to 'asc' for UI\n const orderValue: Order = orderValueRaw || 'asc'\n\n // Map 'asc' | 'desc' to the option object for ReactSelect\n const currentOption = useMemo<OrderOption>(\n () => options.find((o) => o.value === orderValue) ?? defaultOption,\n [orderValue],\n )\n const [displayed, setDisplayed] = useState<null | OrderOption>(currentOption)\n\n // One-time init guard so clearing `sort` doesn't rehydrate from query again\n const didInitRef = useRef(false)\n\n // Derive from list-view query.sort if present; otherwise fall back to groupBy\n useEffect(() => {\n if (didInitRef.current) {\n return\n }\n\n // Existing export -> don't initialize here\n if (id) {\n didInitRef.current = true\n return\n }\n\n // If sort already has a value, treat as initialized\n if (typeof sortRaw === 'string' && sortRaw.length > 0) {\n didInitRef.current = true\n return\n }\n\n const qsSort = normalizeQueryParam(query?.sort)\n const qsGroupBy = normalizeQueryParam(query?.groupBy)\n\n if (qsSort) {\n const isDesc = qsSort.startsWith('-')\n const base = stripSortDash(qsSort)\n const order: Order = isDesc ? 'desc' : 'asc'\n setOrder(order)\n setSort(applySortOrder(base, order)) // combined: 'title' or '-title'\n didInitRef.current = true\n return\n }\n\n // Fallback: groupBy (always ascending)\n if (qsGroupBy) {\n setOrder('asc')\n setSort(applySortOrder(qsGroupBy, 'asc')) // write 'groupByField' (no dash)\n didInitRef.current = true\n return\n }\n\n // Nothing to initialize\n didInitRef.current = true\n }, [id, query?.sort, query?.groupBy, sortRaw, setOrder, setSort])\n\n // Keep the select's displayed option in sync with the stored order\n useEffect(() => {\n setDisplayed(currentOption ?? defaultOption)\n }, [currentOption])\n\n // Handle manual order changes via ReactSelect:\n // - update the order field\n // - rewrite the combined \"sort\" string to add/remove the leading '-'\n const onChange = (option: null | OrderOption) => {\n const next = option?.value ?? 'asc'\n setOrder(next)\n\n const base = stripSortDash(sortRaw)\n if (base) {\n setSort(applySortOrder(base, next))\n }\n\n setDisplayed(option ?? defaultOption)\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\n disabled={props.readOnly}\n inputId={`field-${props.path.replace(/\\./g, '__')}`}\n isClearable={false}\n isSearchable={false}\n // @ts-expect-error react-select option typing differs from our local type\n onChange={onChange}\n options={options as unknown as OrderOption[]}\n // @ts-expect-error react-select option typing differs from our local type\n value={displayed}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useDocumentInfo","useField","useListQuery","React","useEffect","useMemo","useRef","useState","applySortOrder","normalizeQueryParam","stripSortDash","baseClass","options","label","value","defaultOption","SortOrder","props","id","query","setValue","setOrder","orderValueRaw","setSort","sortRaw","path","orderValue","currentOption","find","o","displayed","setDisplayed","didInitRef","current","length","qsSort","sort","qsGroupBy","groupBy","isDesc","startsWith","base","order","onChange","option","next","div","className","field","disabled","readOnly","inputId","replace","isClearable","isSearchable"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/SortOrder/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientProps } from 'payload'\n\nimport { FieldLabel, ReactSelect, useDocumentInfo, useField, useListQuery } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\n\nimport { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js'\nimport './index.css'\n\nconst baseClass = 'sort-order-field'\n\ntype Order = 'asc' | 'desc'\ntype OrderOption = { label: string; value: Order }\n\nconst options = [\n { label: 'Ascending', value: 'asc' as const },\n { label: 'Descending', value: 'desc' as const },\n] as const\n\nconst defaultOption: OrderOption = options[0]\n\nexport const SortOrder: React.FC<SelectFieldClientProps> = (props) => {\n const { id } = useDocumentInfo()\n const { query } = useListQuery()\n\n // 'sortOrder' select field: 'asc' | 'desc'\n const { setValue: setOrder, value: orderValueRaw } = useField<Order>()\n\n // 'sort' text field: 'title' | '-title'\n const { setValue: setSort, value: sortRaw } = useField<string>({ path: 'sort' })\n\n // The current order value, defaulting to 'asc' for UI\n const orderValue: Order = orderValueRaw || 'asc'\n\n // Map 'asc' | 'desc' to the option object for ReactSelect\n const currentOption = useMemo<OrderOption>(\n () => options.find((o) => o.value === orderValue) ?? defaultOption,\n [orderValue],\n )\n const [displayed, setDisplayed] = useState<null | OrderOption>(currentOption)\n\n // One-time init guard so clearing `sort` doesn't rehydrate from query again\n const didInitRef = useRef(false)\n\n // Derive from list-view query.sort if present; otherwise fall back to groupBy\n useEffect(() => {\n if (didInitRef.current) {\n return\n }\n\n // Existing export -> don't initialize here\n if (id) {\n didInitRef.current = true\n return\n }\n\n // If sort already has a value, treat as initialized\n if (typeof sortRaw === 'string' && sortRaw.length > 0) {\n didInitRef.current = true\n return\n }\n\n const qsSort = normalizeQueryParam(query?.sort)\n const qsGroupBy = normalizeQueryParam(query?.groupBy)\n\n if (qsSort) {\n const isDesc = qsSort.startsWith('-')\n const base = stripSortDash(qsSort)\n const order: Order = isDesc ? 'desc' : 'asc'\n setOrder(order)\n setSort(applySortOrder(base, order)) // combined: 'title' or '-title'\n didInitRef.current = true\n return\n }\n\n // Fallback: groupBy (always ascending)\n if (qsGroupBy) {\n setOrder('asc')\n setSort(applySortOrder(qsGroupBy, 'asc')) // write 'groupByField' (no dash)\n didInitRef.current = true\n return\n }\n\n // Nothing to initialize\n didInitRef.current = true\n }, [id, query?.sort, query?.groupBy, sortRaw, setOrder, setSort])\n\n // Keep the select's displayed option in sync with the stored order\n useEffect(() => {\n setDisplayed(currentOption ?? defaultOption)\n }, [currentOption])\n\n // Handle manual order changes via ReactSelect:\n // - update the order field\n // - rewrite the combined \"sort\" string to add/remove the leading '-'\n const onChange = (option: null | OrderOption) => {\n const next = option?.value ?? 'asc'\n setOrder(next)\n\n const base = stripSortDash(sortRaw)\n if (base) {\n setSort(applySortOrder(base, next))\n }\n\n setDisplayed(option ?? defaultOption)\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\n disabled={props.readOnly}\n inputId={`field-${props.path.replace(/\\./g, '__')}`}\n isClearable={false}\n isSearchable={false}\n // @ts-expect-error react-select option typing differs from our local type\n onChange={onChange}\n options={options as unknown as OrderOption[]}\n // @ts-expect-error react-select option typing differs from our local type\n value={displayed}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useDocumentInfo","useField","useListQuery","React","useEffect","useMemo","useRef","useState","applySortOrder","normalizeQueryParam","stripSortDash","baseClass","options","label","value","defaultOption","SortOrder","props","id","query","setValue","setOrder","orderValueRaw","setSort","sortRaw","path","orderValue","currentOption","find","o","displayed","setDisplayed","didInitRef","current","length","qsSort","sort","qsGroupBy","groupBy","isDesc","startsWith","base","order","onChange","option","next","div","className","field","disabled","readOnly","inputId","replace","isClearable","isSearchable"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Uses the generic batch processing utilities from useBatchProcessor.
4
4
  */
5
5
  import type { PayloadRequest, SelectType, Sort, User, Where } from 'payload';
6
- import type { ExportAfterHook, ExportBeforeHook } from '../types.js';
6
+ import type { ExportAfterHook, ExportBeforeHook, ExportDoc } from '../types.js';
7
7
  import { type BatchProcessorOptions } from '../utilities/useBatchProcessor.js';
8
8
  /**
9
9
  * Export-specific batch processor options
@@ -35,6 +35,7 @@ export interface ExportProcessOptions<TDoc = unknown> {
35
35
  * The slug of the collection to export
36
36
  */
37
37
  collectionSlug: string;
38
+ exportDoc: ExportDoc;
38
39
  /**
39
40
  * Arguments to pass to payload.find()
40
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/export/batchProcessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE5E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEpE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAE9E;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,IAAI,GAAG,OAAO;IAClD;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAA;IACxB;;OAEG;IACH,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,gDAAgD;IAChD,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAC1B,CAAA;IACD;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,GAAG,EAAE,cAAc,CAAA;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;sBA6NnD,IAAI,kBACjB,oBAAoB,CAAC,IAAI,CAAC,KACzC,OAAO,CAAC,MAAM,EAAE,CAAC;oBA7MS,IAAI,kBACf,oBAAoB,CAAC,IAAI,CAAC,KACzC,OAAO,CAAC,YAAY,CAAC;mBA0GK,IAAI,kBACf,oBAAoB,CAAC,IAAI,CAAC,KACzC,cAAc,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC;EAwJ1E"}
1
+ {"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/export/batchProcessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE5E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE/E,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAE9E;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,IAAI,GAAG,OAAO;IAClD;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAA;IACxB;;OAEG;IACH,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,gDAAgD;IAChD,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAC1B,CAAA;IACD;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,GAAG,EAAE,cAAc,CAAA;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;sBAmOnD,IAAI,kBACjB,oBAAoB,CAAC,IAAI,CAAC,KACzC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAnNS,IAAI,kBACf,oBAAoB,CAAC,IAAI,CAAC,KACzC,OAAO,CAAC,YAAY,CAAC;mBA6GK,IAAI,kBACf,oBAAoB,CAAC,IAAI,CAAC,KACzC,cAAc,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC;EA2J1E"}
@@ -33,7 +33,7 @@
33
33
  * @param processOptions - Options for the export operation
34
34
  * @returns The export result containing transformed documents and column info
35
35
  */ const processExport = async (processOptions)=>{
36
- const { findArgs, format, hooks, maxDocs, req, startPage = 1, totalDocs, transformDoc } = processOptions;
36
+ const { exportDoc, findArgs, format, hooks, maxDocs, req, startPage = 1, totalDocs, transformDoc } = processOptions;
37
37
  const totalBatches = computeTotalBatches(totalDocs, maxDocs);
38
38
  const docs = [];
39
39
  const columnsSet = new Set();
@@ -60,6 +60,7 @@
60
60
  const dataToWrite = hooks?.before && batchData.length > 0 ? await hooks.before({
61
61
  batchNumber,
62
62
  data: batchData,
63
+ exportDoc,
63
64
  format,
64
65
  originalData: originalDocs,
65
66
  req,
@@ -80,6 +81,7 @@
80
81
  await hooks.after({
81
82
  batchNumber,
82
83
  data: dataToWrite,
84
+ exportDoc,
83
85
  format,
84
86
  originalData: originalDocs,
85
87
  req,
@@ -113,7 +115,7 @@
113
115
  * }
114
116
  * ```
115
117
  */ async function* streamExport(processOptions) {
116
- const { findArgs, format, hooks, maxDocs, req, startPage = 1, totalDocs, transformDoc } = processOptions;
118
+ const { exportDoc, findArgs, format, hooks, maxDocs, req, startPage = 1, totalDocs, transformDoc } = processOptions;
117
119
  const totalBatches = computeTotalBatches(totalDocs, maxDocs);
118
120
  const columnsSet = new Set();
119
121
  const columns = [];
@@ -139,6 +141,7 @@
139
141
  const dataToWrite = hooks?.before && batchData.length > 0 ? await hooks.before({
140
142
  batchNumber,
141
143
  data: batchData,
144
+ exportDoc,
142
145
  format,
143
146
  originalData: originalDocs,
144
147
  req,
@@ -164,6 +167,7 @@
164
167
  await hooks.after({
165
168
  batchNumber,
166
169
  data: dataToWrite,
170
+ exportDoc,
167
171
  format,
168
172
  originalData: originalDocs,
169
173
  req,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/batchProcessor.ts"],"sourcesContent":["/**\n * Export-specific batch processor for processing documents in batches during export.\n * Uses the generic batch processing utilities from useBatchProcessor.\n */\nimport type { PayloadRequest, SelectType, Sort, User, Where } from 'payload'\n\nimport type { ExportAfterHook, ExportBeforeHook } from '../types.js'\n\nimport { type BatchProcessorOptions } from '../utilities/useBatchProcessor.js'\n\n/**\n * Export-specific batch processor options\n */\nexport interface ExportBatchProcessorOptions extends BatchProcessorOptions {\n debug?: boolean\n}\n\n/**\n * Find arguments for querying documents during export\n */\nexport interface ExportFindArgs {\n collection: string\n depth: number\n draft: boolean\n limit: number\n locale?: string\n overrideAccess: boolean\n page?: number\n select?: SelectType\n sort?: Sort\n user?: User\n where?: Where\n}\n\n/**\n * Options for processing an export operation\n */\nexport interface ExportProcessOptions<TDoc = unknown> {\n /**\n * The slug of the collection to export\n */\n collectionSlug: string\n /**\n * Arguments to pass to payload.find()\n */\n findArgs: ExportFindArgs\n /**\n * The export format - affects column tracking for CSV\n */\n format: 'csv' | 'json'\n /** Lifecycle hooks for this export operation */\n hooks?: {\n after?: ExportAfterHook\n before?: ExportBeforeHook\n }\n /**\n * Maximum number of documents to export\n */\n maxDocs: number\n /**\n * The Payload request object\n */\n req: PayloadRequest\n /**\n * Starting page for pagination (default: 1)\n */\n startPage?: number\n /** Total number of docs available (used to compute totalBatches for hooks) */\n totalDocs?: number\n /**\n * Transform function to apply to each document\n */\n transformDoc: (doc: TDoc) => Record<string, unknown>\n}\n\n/**\n * Result from processing an export operation\n */\nexport interface ExportResult {\n /**\n * Discovered column names (for CSV exports)\n */\n columns: string[]\n /**\n * Transformed documents ready for output\n */\n docs: Record<string, unknown>[]\n /**\n * Total number of documents fetched\n */\n fetchedCount: number\n}\n\n/**\n * Creates an export batch processor with the specified options.\n *\n * @param options - Configuration options for the batch processor\n * @returns An object containing the processExport method\n *\n * @example\n * ```ts\n * const processor = createExportBatchProcessor({ batchSize: 100, debug: true })\n *\n * const result = await processor.processExport({\n * collectionSlug: 'posts',\n * findArgs: { collection: 'posts', depth: 1, draft: false, limit: 100, overrideAccess: false },\n * format: 'csv',\n * maxDocs: 1000,\n * req,\n * transformDoc: (doc) => flattenObject({ data: doc }),\n * })\n * ```\n */\nexport function createExportBatchProcessor(options: ExportBatchProcessorOptions = {}) {\n const batchSize = options.batchSize ?? 100\n const debug = options.debug ?? false\n\n const computeTotalBatches = (totalDocs: number | undefined, maxDocs: number): number => {\n const effectiveDocs =\n totalDocs !== undefined\n ? Math.min(totalDocs, maxDocs === Number.POSITIVE_INFINITY ? totalDocs : maxDocs)\n : 0\n return effectiveDocs > 0 ? Math.ceil(effectiveDocs / batchSize) : 1\n }\n\n /**\n * Process an export operation by fetching and transforming documents in batches.\n *\n * @param processOptions - Options for the export operation\n * @returns The export result containing transformed documents and column info\n */\n const processExport = async <TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): Promise<ExportResult> => {\n const {\n findArgs,\n format,\n hooks,\n maxDocs,\n req,\n startPage = 1,\n totalDocs,\n transformDoc,\n } = processOptions\n\n const totalBatches = computeTotalBatches(totalDocs, maxDocs)\n\n const docs: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\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 req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing export batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n const batchNumber = currentPage - startPage + 1\n const originalDocs = result.docs as Record<string, unknown>[]\n const batchData = result.docs.map((doc) => transformDoc(doc as TDoc))\n\n const dataToWrite =\n hooks?.before && batchData.length > 0\n ? await hooks.before({\n batchNumber,\n data: batchData,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n : batchData\n\n for (const row of dataToWrite) {\n docs.push(row)\n\n if (format === 'csv') {\n for (const key of Object.keys(row)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n }\n\n if (hooks?.after && dataToWrite.length > 0) {\n await hooks.after({\n batchNumber,\n data: dataToWrite,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n\n return { columns, docs, fetchedCount: fetched }\n }\n\n /**\n * Async generator for streaming export - yields batches instead of collecting all.\n * Useful for streaming exports where you want to process batches as they're fetched.\n *\n * @param processOptions - Options for the export operation\n * @yields Batch results containing transformed documents and discovered columns\n *\n * @example\n * ```ts\n * const processor = createExportBatchProcessor({ batchSize: 100 })\n *\n * for await (const batch of processor.streamExport({ ... })) {\n * // Process each batch as it's yielded\n * console.log(`Got ${batch.docs.length} documents`)\n * }\n * ```\n */\n async function* streamExport<TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): AsyncGenerator<{ columns: string[]; docs: Record<string, unknown>[] }> {\n const {\n findArgs,\n format,\n hooks,\n maxDocs,\n req,\n startPage = 1,\n totalDocs,\n transformDoc,\n } = processOptions\n\n const totalBatches = computeTotalBatches(totalDocs, maxDocs)\n\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\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 req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming export batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n const batchNumber = currentPage - startPage + 1\n const originalDocs = result.docs as Record<string, unknown>[]\n const batchData = result.docs.map((doc) => transformDoc(doc as TDoc))\n\n const dataToWrite =\n hooks?.before && batchData.length > 0\n ? await hooks.before({\n batchNumber,\n data: batchData,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n : batchData\n\n for (const row of dataToWrite) {\n if (format === 'csv') {\n for (const key of Object.keys(row)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n }\n\n yield { columns: [...columns], docs: dataToWrite }\n\n if (hooks?.after && dataToWrite.length > 0) {\n await hooks.after({\n batchNumber,\n data: dataToWrite,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n }\n\n /**\n * Discover all columns from the dataset by scanning through all batches.\n * Useful for CSV exports where you need to know all columns before streaming.\n *\n * @param processOptions - Options for the export operation\n * @returns Array of discovered column names\n */\n const discoverColumns = async <TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): Promise<string[]> => {\n const { findArgs, maxDocs, req, startPage = 1, transformDoc } = processOptions\n\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\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 req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Scanning columns from batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n for (const doc of result.docs) {\n const transformedDoc = transformDoc(doc as TDoc)\n\n for (const key of Object.keys(transformedDoc)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${columns.length} columns`)\n }\n\n return columns\n }\n\n return {\n discoverColumns,\n processExport,\n streamExport,\n }\n}\n"],"names":["createExportBatchProcessor","options","batchSize","debug","computeTotalBatches","totalDocs","maxDocs","effectiveDocs","undefined","Math","min","Number","POSITIVE_INFINITY","ceil","processExport","processOptions","findArgs","format","hooks","req","startPage","transformDoc","totalBatches","docs","columnsSet","Set","columns","currentPage","fetched","hasNextPage","remaining","max","result","payload","find","limit","page","logger","length","batchNumber","originalDocs","batchData","map","doc","dataToWrite","before","data","originalData","row","push","key","Object","keys","has","add","after","fetchedCount","streamExport","discoverColumns","transformedDoc"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/batchProcessor.ts"],"sourcesContent":["/**\n * Export-specific batch processor for processing documents in batches during export.\n * Uses the generic batch processing utilities from useBatchProcessor.\n */\nimport type { PayloadRequest, SelectType, Sort, User, Where } from 'payload'\n\nimport type { ExportAfterHook, ExportBeforeHook, ExportDoc } from '../types.js'\n\nimport { type BatchProcessorOptions } from '../utilities/useBatchProcessor.js'\n\n/**\n * Export-specific batch processor options\n */\nexport interface ExportBatchProcessorOptions extends BatchProcessorOptions {\n debug?: boolean\n}\n\n/**\n * Find arguments for querying documents during export\n */\nexport interface ExportFindArgs {\n collection: string\n depth: number\n draft: boolean\n limit: number\n locale?: string\n overrideAccess: boolean\n page?: number\n select?: SelectType\n sort?: Sort\n user?: User\n where?: Where\n}\n\n/**\n * Options for processing an export operation\n */\nexport interface ExportProcessOptions<TDoc = unknown> {\n /**\n * The slug of the collection to export\n */\n collectionSlug: string\n exportDoc: ExportDoc\n /**\n * Arguments to pass to payload.find()\n */\n findArgs: ExportFindArgs\n /**\n * The export format - affects column tracking for CSV\n */\n format: 'csv' | 'json'\n /** Lifecycle hooks for this export operation */\n hooks?: {\n after?: ExportAfterHook\n before?: ExportBeforeHook\n }\n /**\n * Maximum number of documents to export\n */\n maxDocs: number\n /**\n * The Payload request object\n */\n req: PayloadRequest\n /**\n * Starting page for pagination (default: 1)\n */\n startPage?: number\n /** Total number of docs available (used to compute totalBatches for hooks) */\n totalDocs?: number\n /**\n * Transform function to apply to each document\n */\n transformDoc: (doc: TDoc) => Record<string, unknown>\n}\n\n/**\n * Result from processing an export operation\n */\nexport interface ExportResult {\n /**\n * Discovered column names (for CSV exports)\n */\n columns: string[]\n /**\n * Transformed documents ready for output\n */\n docs: Record<string, unknown>[]\n /**\n * Total number of documents fetched\n */\n fetchedCount: number\n}\n\n/**\n * Creates an export batch processor with the specified options.\n *\n * @param options - Configuration options for the batch processor\n * @returns An object containing the processExport method\n *\n * @example\n * ```ts\n * const processor = createExportBatchProcessor({ batchSize: 100, debug: true })\n *\n * const result = await processor.processExport({\n * collectionSlug: 'posts',\n * findArgs: { collection: 'posts', depth: 1, draft: false, limit: 100, overrideAccess: false },\n * format: 'csv',\n * maxDocs: 1000,\n * req,\n * transformDoc: (doc) => flattenObject({ data: doc }),\n * })\n * ```\n */\nexport function createExportBatchProcessor(options: ExportBatchProcessorOptions = {}) {\n const batchSize = options.batchSize ?? 100\n const debug = options.debug ?? false\n\n const computeTotalBatches = (totalDocs: number | undefined, maxDocs: number): number => {\n const effectiveDocs =\n totalDocs !== undefined\n ? Math.min(totalDocs, maxDocs === Number.POSITIVE_INFINITY ? totalDocs : maxDocs)\n : 0\n return effectiveDocs > 0 ? Math.ceil(effectiveDocs / batchSize) : 1\n }\n\n /**\n * Process an export operation by fetching and transforming documents in batches.\n *\n * @param processOptions - Options for the export operation\n * @returns The export result containing transformed documents and column info\n */\n const processExport = async <TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): Promise<ExportResult> => {\n const {\n exportDoc,\n findArgs,\n format,\n hooks,\n maxDocs,\n req,\n startPage = 1,\n totalDocs,\n transformDoc,\n } = processOptions\n\n const totalBatches = computeTotalBatches(totalDocs, maxDocs)\n\n const docs: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\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 req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing export batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n const batchNumber = currentPage - startPage + 1\n const originalDocs = result.docs as Record<string, unknown>[]\n const batchData = result.docs.map((doc) => transformDoc(doc as TDoc))\n\n const dataToWrite =\n hooks?.before && batchData.length > 0\n ? await hooks.before({\n batchNumber,\n data: batchData,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n : batchData\n\n for (const row of dataToWrite) {\n docs.push(row)\n\n if (format === 'csv') {\n for (const key of Object.keys(row)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n }\n\n if (hooks?.after && dataToWrite.length > 0) {\n await hooks.after({\n batchNumber,\n data: dataToWrite,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n\n return { columns, docs, fetchedCount: fetched }\n }\n\n /**\n * Async generator for streaming export - yields batches instead of collecting all.\n * Useful for streaming exports where you want to process batches as they're fetched.\n *\n * @param processOptions - Options for the export operation\n * @yields Batch results containing transformed documents and discovered columns\n *\n * @example\n * ```ts\n * const processor = createExportBatchProcessor({ batchSize: 100 })\n *\n * for await (const batch of processor.streamExport({ ... })) {\n * // Process each batch as it's yielded\n * console.log(`Got ${batch.docs.length} documents`)\n * }\n * ```\n */\n async function* streamExport<TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): AsyncGenerator<{ columns: string[]; docs: Record<string, unknown>[] }> {\n const {\n exportDoc,\n findArgs,\n format,\n hooks,\n maxDocs,\n req,\n startPage = 1,\n totalDocs,\n transformDoc,\n } = processOptions\n\n const totalBatches = computeTotalBatches(totalDocs, maxDocs)\n\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\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 req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming export batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n const batchNumber = currentPage - startPage + 1\n const originalDocs = result.docs as Record<string, unknown>[]\n const batchData = result.docs.map((doc) => transformDoc(doc as TDoc))\n\n const dataToWrite =\n hooks?.before && batchData.length > 0\n ? await hooks.before({\n batchNumber,\n data: batchData,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n : batchData\n\n for (const row of dataToWrite) {\n if (format === 'csv') {\n for (const key of Object.keys(row)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n }\n\n yield { columns: [...columns], docs: dataToWrite }\n\n if (hooks?.after && dataToWrite.length > 0) {\n await hooks.after({\n batchNumber,\n data: dataToWrite,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n }\n\n /**\n * Discover all columns from the dataset by scanning through all batches.\n * Useful for CSV exports where you need to know all columns before streaming.\n *\n * @param processOptions - Options for the export operation\n * @returns Array of discovered column names\n */\n const discoverColumns = async <TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): Promise<string[]> => {\n const { findArgs, maxDocs, req, startPage = 1, transformDoc } = processOptions\n\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\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 req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Scanning columns from batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n for (const doc of result.docs) {\n const transformedDoc = transformDoc(doc as TDoc)\n\n for (const key of Object.keys(transformedDoc)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${columns.length} columns`)\n }\n\n return columns\n }\n\n return {\n discoverColumns,\n processExport,\n streamExport,\n }\n}\n"],"names":["createExportBatchProcessor","options","batchSize","debug","computeTotalBatches","totalDocs","maxDocs","effectiveDocs","undefined","Math","min","Number","POSITIVE_INFINITY","ceil","processExport","processOptions","exportDoc","findArgs","format","hooks","req","startPage","transformDoc","totalBatches","docs","columnsSet","Set","columns","currentPage","fetched","hasNextPage","remaining","max","result","payload","find","limit","page","logger","length","batchNumber","originalDocs","batchData","map","doc","dataToWrite","before","data","originalData","row","push","key","Object","keys","has","add","after","fetchedCount","streamExport","discoverColumns","transformedDoc"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { PayloadRequest, Sort, Where } from 'payload';
2
+ import type { ExportDoc } from '../types.js';
2
3
  export type Export = {
3
4
  /**
4
5
  * Number of documents to process in each batch during export
@@ -35,6 +36,7 @@ export type CreateExportArgs = {
35
36
  * If true, stream the file instead of saving it
36
37
  */
37
38
  download?: boolean;
39
+ exportDoc: ExportDoc;
38
40
  req: PayloadRequest;
39
41
  } & Export;
40
42
  export declare const createExport: (args: CreateExportArgs) => Promise<Response | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAQ,KAAK,EAAE,MAAM,SAAS,CAAA;AAgBhE,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,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;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,YAAY,GAAU,MAAM,gBAAgB,kCAgmBxD,CAAA"}
1
+ {"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAQ,KAAK,EAAE,MAAM,SAAS,CAAA;AAMhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAY5C,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,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;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCAsmBxD,CAAA"}
@@ -11,7 +11,7 @@ import { getSelect } from '../utilities/getSelect.js';
11
11
  import { validateLimitValue } from '../utilities/validateLimitValue.js';
12
12
  import { createExportBatchProcessor } from './batchProcessor.js';
13
13
  export const createExport = async (args)=>{
14
- const { id, name: nameArg, batchSize = 100, collectionSlug, debug = false, download, drafts: draftsFromInput, exportCollection, fields, format, limit: incomingLimit, maxLimit, locale: localeFromInput, page, req, sort, userCollection, userID, where: whereFromInput = {} } = args;
14
+ const { id, name: nameArg, batchSize = 100, collectionSlug, debug = false, download, drafts: draftsFromInput, exportCollection, exportDoc, fields, format, limit: incomingLimit, maxLimit, locale: localeFromInput, page, req, sort, userCollection, userID, where: whereFromInput = {} } = args;
15
15
  const { locale: localeFromReq, payload } = req;
16
16
  if (debug) {
17
17
  req.payload.logger.debug({
@@ -242,6 +242,7 @@ export const createExport = async (args)=>{
242
242
  batchRowsToWrite = await exportHooks.before({
243
243
  batchNumber: streamBatchNumber,
244
244
  data: batchRows,
245
+ exportDoc,
245
246
  format,
246
247
  originalData: originalDocs,
247
248
  req,
@@ -291,6 +292,7 @@ export const createExport = async (args)=>{
291
292
  await exportHooks.after({
292
293
  batchNumber: streamBatchNumber,
293
294
  data: batchRowsToWrite,
295
+ exportDoc,
294
296
  format,
295
297
  originalData: originalDocs,
296
298
  req,
@@ -314,6 +316,7 @@ export const createExport = async (args)=>{
314
316
  batchRowsToWrite = await exportHooks.before({
315
317
  batchNumber: streamBatchNumber,
316
318
  data: batchRows,
319
+ exportDoc,
317
320
  format,
318
321
  originalData: originalDocs,
319
322
  req,
@@ -331,6 +334,7 @@ export const createExport = async (args)=>{
331
334
  await exportHooks.after({
332
335
  batchNumber: streamBatchNumber,
333
336
  data: batchRowsToWrite,
337
+ exportDoc,
334
338
  format,
335
339
  originalData: originalDocs,
336
340
  req,
@@ -393,6 +397,7 @@ export const createExport = async (args)=>{
393
397
  if (!accessDenied) {
394
398
  exportResult = await processor.processExport({
395
399
  collectionSlug,
400
+ exportDoc,
396
401
  findArgs: findArgs,
397
402
  format,
398
403
  hooks: exportHooks,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, User, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFilename } from '../utilities/getFilename.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { validateLimitValue } from '../utilities/validateLimitValue.js'\nimport { createExportBatchProcessor, type ExportFindArgs } from './batchProcessor.js'\n\nexport type Export = {\n /**\n * Number of documents to process in each batch during export\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n limit?: number\n locale?: string\n /**\n * Maximum number of documents that can be exported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n page?: number\n sort?: Sort\n userCollection?: string\n userID?: number | 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 req: PayloadRequest\n} & Export\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n id,\n name: nameArg,\n batchSize = 100,\n collectionSlug,\n debug = false,\n download,\n drafts: draftsFromInput,\n exportCollection,\n fields,\n format,\n limit: incomingLimit,\n maxLimit,\n locale: localeFromInput,\n page,\n req,\n sort,\n userCollection,\n userID,\n where: whereFromInput = {},\n } = args\n const { locale: localeFromReq, payload } = req\n\n if (debug) {\n req.payload.logger.debug({\n msg: '[createExport] Starting export process',\n exportDocId: id,\n exportName: nameArg,\n collectionSlug,\n exportCollection,\n draft: draftsFromInput,\n fields,\n format,\n })\n }\n\n const locale = localeFromInput ?? localeFromReq\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found.`)\n }\n\n let user: undefined | User\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n })) as User\n }\n\n if (!user && req.user) {\n user = req.user\n }\n\n if (!user) {\n throw new APIError('User authentication is required to create exports.')\n }\n\n const draft = draftsFromInput === 'yes'\n const hasVersions = Boolean(collectionConfig.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = hasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromInput, draft ? {} : publishedWhere],\n }\n\n const baseName = nameArg ?? getFilename()\n const name = `${baseName}-${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({ isCSV, locale, msg: 'Export configuration:', name })\n }\n\n // Determine maximum export documents:\n // 1. If maxLimit is defined, it sets the absolute ceiling\n // 2. User's limit is applied but clamped to maxLimit if it exceeds it\n let maxExportDocuments: number | undefined\n\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n if (typeof incomingLimit === 'number' && incomingLimit > 0) {\n // User provided a limit - clamp it to maxLimit\n maxExportDocuments = Math.min(incomingLimit, maxLimit)\n } else {\n // No user limit - use maxLimit as the ceiling\n maxExportDocuments = maxLimit\n }\n } else {\n // No maxLimit - use user's limit if provided\n maxExportDocuments =\n typeof incomingLimit === 'number' && incomingLimit > 0 ? incomingLimit : undefined\n }\n\n // Try to count documents - if access is denied, treat as 0 documents\n let totalDocs = 0\n let accessDenied = false\n try {\n const countResult = await payload.count({\n collection: collectionSlug,\n user,\n locale,\n overrideAccess: false,\n })\n totalDocs = countResult.totalDocs\n } catch (error) {\n // Access denied - user can't read from this collection\n // We'll create an empty export file\n accessDenied = true\n if (debug) {\n req.payload.logger.debug({\n collectionSlug,\n msg: 'Access denied for collection, creating empty export',\n })\n }\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,\n limit: batchSize,\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({ findArgs, msg: 'Find arguments:' })\n }\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const exportHooks = collectionConfig.custom?.['plugin-import-export']?.exportHooks\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledMatchers = 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 = disabledMatchers.some((matcher) => matcher.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: unknown, parentPath = ''): unknown => {\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, unknown> = {}\n for (const [key, value] of Object.entries(doc as Record<string, unknown>)) {\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 const limitErrorMsg = validateLimitValue(incomingLimit, req.t)\n if (limitErrorMsg) {\n throw new APIError(limitErrorMsg)\n }\n\n // Get schema-based columns first (provides base ordering and handles empty exports)\n let schemaColumns: string[] = []\n if (isCSV) {\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n if (debug) {\n req.payload.logger.debug({\n columnCount: schemaColumns.length,\n msg: 'Schema-based column inference complete',\n })\n }\n }\n\n // allColumns will be finalized after first batch (schema + data columns merged)\n let allColumns: string[] = []\n let columnsFinalized = false\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let currentBatchPage = adjustedPage\n let fetched = 0\n const maxDocs =\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY\n\n const effectiveStreamDocs =\n typeof maxExportDocuments === 'number' ? Math.min(totalDocs, maxExportDocuments) : totalDocs\n const totalBatches = effectiveStreamDocs > 0 ? Math.ceil(effectiveStreamDocs / batchSize) : 1\n let streamBatchNumber = 0\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 // If first batch with no remaining, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n const result = await payload.find({\n ...findArgs,\n page: currentBatchPage,\n limit: Math.min(batchSize, remaining),\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming batch ${currentBatchPage} with ${result.docs.length} docs`,\n )\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n // If first batch with no docs, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n streamBatchNumber++\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(\n flattenObject({\n data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n ),\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n // On first batch, discover additional columns from data and merge with schema\n if (!columnsFinalized) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of batchRowsToWrite) {\n for (const key of Object.keys(row)) {\n if (!seenCols.has(key)) {\n seenCols.add(key)\n dataColumns.push(key)\n }\n }\n }\n // Merge schema columns with data-discovered columns.\n // When a before hook is active and rows exist, restrict to columns actually present\n // in the data so that the hook can remove fields by not returning them.\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n allColumns =\n Boolean(exportHooks?.before) && batchRowsToWrite.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n columnsFinalized = true\n\n if (debug) {\n req.payload.logger.debug({\n dataColumnsCount: dataColumns.length,\n finalColumnsCount: allColumns.length,\n msg: 'Merged schema and data columns',\n })\n }\n }\n\n const paddedRows = batchRowsToWrite.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 bom: isFirstBatch,\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n\n if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map(\n (doc) =>\n filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>,\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRowsToWrite.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 if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n }\n\n fetched += result.docs.length\n isFirstBatch = false\n currentBatchPage += 1\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(Readable.toWeb(stream) as ReadableStream, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv; charset=utf-8' : '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 // Create export batch processor\n const processor = createExportBatchProcessor({ batchSize, debug })\n\n // Transform function based on format\n const transformDoc = (doc: unknown) =>\n isCSV\n ? filterDisabledCSV(\n flattenObject({\n data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n )\n : (filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>)\n\n // Skip fetching if access was denied - we'll create an empty export\n let exportResult = {\n columns: [] as string[],\n docs: [] as Record<string, unknown>[],\n fetchedCount: 0,\n }\n\n if (!accessDenied) {\n exportResult = await processor.processExport({\n collectionSlug,\n findArgs: findArgs as ExportFindArgs,\n format,\n hooks: exportHooks,\n maxDocs:\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY,\n req,\n startPage: adjustedPage,\n totalDocs,\n transformDoc,\n })\n }\n\n const { columns: dataColumns, docs: rows } = exportResult\n const outputData: string[] = []\n\n // Prepare final output\n if (isCSV) {\n // Get schema-based columns for consistent ordering\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n const schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n // Merge schema columns with data-discovered columns\n // Schema provides ordering, data provides additional columns (e.g., array indices > 0)\n // When a before hook is active and rows exist, restrict to columns actually present in the data\n // so that the hook can remove fields by not returning them\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n const finalColumns =\n Boolean(exportHooks?.before) && rows.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of finalColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n // Always output CSV with header, even if empty\n outputData.push(\n stringify(paddedRows, {\n bom: true,\n header: true,\n columns: finalColumns,\n }),\n )\n } else {\n // JSON format\n outputData.push(rows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n // Ensure we always have valid content for the file\n // For JSON, empty exports produce \"[]\"\n // For CSV, if completely empty (no columns, no rows), produce at least a newline to ensure file creation\n const content = format === 'json' ? `[${outputData.join(',')}]` : outputData.join('')\n const buffer = Buffer.from(content.length > 0 ? content : '\\n')\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; charset=utf-8' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug({\n msg: '[createExport] Updating export document with file',\n exportDocId: id,\n exportCollection,\n fileName: name,\n fileSize: buffer.length,\n mimeType: isCSV ? 'text/csv; charset=utf-8' : 'application/json',\n })\n }\n try {\n await req.payload.update({\n id,\n collection: exportCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv; charset=utf-8' : 'application/json',\n size: buffer.length,\n },\n // Override access only here so that we can be sure the export collection itself is updated as expected\n overrideAccess: true,\n req,\n })\n } catch (error) {\n const errorDetails =\n error instanceof Error\n ? {\n message: error.message,\n name: error.name,\n stack: error.stack,\n // @ts-expect-error - data might exist on Payload errors\n data: error.data,\n }\n : error\n req.payload.logger.error({\n msg: '[createExport] Failed to update export document with file',\n err: errorDetails,\n exportDocId: id,\n exportCollection,\n fileName: name,\n })\n throw error\n }\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","applyFieldHooks","buildDisabledFieldRegex","flattenObject","getExportFieldFunctions","getFilename","getSchemaColumns","mergeColumns","getSelect","validateLimitValue","createExportBatchProcessor","createExport","args","id","name","nameArg","batchSize","collectionSlug","debug","download","drafts","draftsFromInput","exportCollection","fields","format","limit","incomingLimit","maxLimit","locale","localeFromInput","page","req","sort","userCollection","userID","where","whereFromInput","localeFromReq","payload","logger","msg","exportDocId","exportName","draft","collectionConfig","config","collections","find","slug","user","findByID","collection","overrideAccess","hasVersions","Boolean","versions","publishedWhere","_status","equals","and","baseName","isCSV","select","Array","isArray","length","undefined","maxExportDocuments","Math","min","totalDocs","accessDenied","countResult","count","error","totalPages","max","ceil","requestedPage","adjustedPage","findArgs","depth","exportFieldHooks","flattenedFields","exportHooks","custom","disabledFields","admin","disabledMatchers","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","matcher","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","limitErrorMsg","t","schemaColumns","localeCodes","localization","columnCount","allColumns","columnsFinalized","encoder","TextEncoder","isFirstBatch","currentBatchPage","fetched","maxDocs","Number","POSITIVE_INFINITY","effectiveStreamDocs","totalBatches","streamBatchNumber","stream","read","remaining","push","encode","result","docs","batchRows","data","originalDocs","batchRowsToWrite","before","batchNumber","originalData","dataColumns","seenCols","Set","keys","has","add","mergedColumns","filter","col","dataColumnsCount","finalColumnsCount","paddedRows","fullRow","csvString","bom","header","columns","after","fieldHooks","operation","type","batchJSON","JSON","join","hasNextPage","Response","toWeb","headers","processor","transformDoc","exportResult","fetchedCount","processExport","hooks","startPage","rows","outputData","finalColumns","content","buffer","Buffer","from","file","mimetype","size","fileName","fileSize","mimeType","update","errorDetails","Error","message","stack","err"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, User, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport type { ExportDoc } from '../types.js'\n\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFilename } from '../utilities/getFilename.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { validateLimitValue } from '../utilities/validateLimitValue.js'\nimport { createExportBatchProcessor, type ExportFindArgs } from './batchProcessor.js'\n\nexport type Export = {\n /**\n * Number of documents to process in each batch during export\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n limit?: number\n locale?: string\n /**\n * Maximum number of documents that can be exported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n page?: number\n sort?: Sort\n userCollection?: string\n userID?: number | 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 exportDoc: ExportDoc\n req: PayloadRequest\n} & Export\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n id,\n name: nameArg,\n batchSize = 100,\n collectionSlug,\n debug = false,\n download,\n drafts: draftsFromInput,\n exportCollection,\n exportDoc,\n fields,\n format,\n limit: incomingLimit,\n maxLimit,\n locale: localeFromInput,\n page,\n req,\n sort,\n userCollection,\n userID,\n where: whereFromInput = {},\n } = args\n const { locale: localeFromReq, payload } = req\n\n if (debug) {\n req.payload.logger.debug({\n msg: '[createExport] Starting export process',\n exportDocId: id,\n exportName: nameArg,\n collectionSlug,\n exportCollection,\n draft: draftsFromInput,\n fields,\n format,\n })\n }\n\n const locale = localeFromInput ?? localeFromReq\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found.`)\n }\n\n let user: undefined | User\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n })) as User\n }\n\n if (!user && req.user) {\n user = req.user\n }\n\n if (!user) {\n throw new APIError('User authentication is required to create exports.')\n }\n\n const draft = draftsFromInput === 'yes'\n const hasVersions = Boolean(collectionConfig.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = hasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromInput, draft ? {} : publishedWhere],\n }\n\n const baseName = nameArg ?? getFilename()\n const name = `${baseName}-${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({ isCSV, locale, msg: 'Export configuration:', name })\n }\n\n // Determine maximum export documents:\n // 1. If maxLimit is defined, it sets the absolute ceiling\n // 2. User's limit is applied but clamped to maxLimit if it exceeds it\n let maxExportDocuments: number | undefined\n\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n if (typeof incomingLimit === 'number' && incomingLimit > 0) {\n // User provided a limit - clamp it to maxLimit\n maxExportDocuments = Math.min(incomingLimit, maxLimit)\n } else {\n // No user limit - use maxLimit as the ceiling\n maxExportDocuments = maxLimit\n }\n } else {\n // No maxLimit - use user's limit if provided\n maxExportDocuments =\n typeof incomingLimit === 'number' && incomingLimit > 0 ? incomingLimit : undefined\n }\n\n // Try to count documents - if access is denied, treat as 0 documents\n let totalDocs = 0\n let accessDenied = false\n try {\n const countResult = await payload.count({\n collection: collectionSlug,\n user,\n locale,\n overrideAccess: false,\n })\n totalDocs = countResult.totalDocs\n } catch (error) {\n // Access denied - user can't read from this collection\n // We'll create an empty export file\n accessDenied = true\n if (debug) {\n req.payload.logger.debug({\n collectionSlug,\n msg: 'Access denied for collection, creating empty export',\n })\n }\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,\n limit: batchSize,\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({ findArgs, msg: 'Find arguments:' })\n }\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const exportHooks = collectionConfig.custom?.['plugin-import-export']?.exportHooks\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledMatchers = 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 = disabledMatchers.some((matcher) => matcher.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: unknown, parentPath = ''): unknown => {\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, unknown> = {}\n for (const [key, value] of Object.entries(doc as Record<string, unknown>)) {\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 const limitErrorMsg = validateLimitValue(incomingLimit, req.t)\n if (limitErrorMsg) {\n throw new APIError(limitErrorMsg)\n }\n\n // Get schema-based columns first (provides base ordering and handles empty exports)\n let schemaColumns: string[] = []\n if (isCSV) {\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n if (debug) {\n req.payload.logger.debug({\n columnCount: schemaColumns.length,\n msg: 'Schema-based column inference complete',\n })\n }\n }\n\n // allColumns will be finalized after first batch (schema + data columns merged)\n let allColumns: string[] = []\n let columnsFinalized = false\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let currentBatchPage = adjustedPage\n let fetched = 0\n const maxDocs =\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY\n\n const effectiveStreamDocs =\n typeof maxExportDocuments === 'number' ? Math.min(totalDocs, maxExportDocuments) : totalDocs\n const totalBatches = effectiveStreamDocs > 0 ? Math.ceil(effectiveStreamDocs / batchSize) : 1\n let streamBatchNumber = 0\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 // If first batch with no remaining, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n const result = await payload.find({\n ...findArgs,\n page: currentBatchPage,\n limit: Math.min(batchSize, remaining),\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming batch ${currentBatchPage} with ${result.docs.length} docs`,\n )\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n // If first batch with no docs, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n streamBatchNumber++\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(\n flattenObject({\n data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n ),\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n // On first batch, discover additional columns from data and merge with schema\n if (!columnsFinalized) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of batchRowsToWrite) {\n for (const key of Object.keys(row)) {\n if (!seenCols.has(key)) {\n seenCols.add(key)\n dataColumns.push(key)\n }\n }\n }\n // Merge schema columns with data-discovered columns.\n // When a before hook is active and rows exist, restrict to columns actually present\n // in the data so that the hook can remove fields by not returning them.\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n allColumns =\n Boolean(exportHooks?.before) && batchRowsToWrite.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n columnsFinalized = true\n\n if (debug) {\n req.payload.logger.debug({\n dataColumnsCount: dataColumns.length,\n finalColumnsCount: allColumns.length,\n msg: 'Merged schema and data columns',\n })\n }\n }\n\n const paddedRows = batchRowsToWrite.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 bom: isFirstBatch,\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n\n if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map(\n (doc) =>\n filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>,\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRowsToWrite.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 if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n }\n\n fetched += result.docs.length\n isFirstBatch = false\n currentBatchPage += 1\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(Readable.toWeb(stream) as ReadableStream, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv; charset=utf-8' : '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 // Create export batch processor\n const processor = createExportBatchProcessor({ batchSize, debug })\n\n // Transform function based on format\n const transformDoc = (doc: unknown) =>\n isCSV\n ? filterDisabledCSV(\n flattenObject({\n data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n )\n : (filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>)\n\n // Skip fetching if access was denied - we'll create an empty export\n let exportResult = {\n columns: [] as string[],\n docs: [] as Record<string, unknown>[],\n fetchedCount: 0,\n }\n\n if (!accessDenied) {\n exportResult = await processor.processExport({\n collectionSlug,\n exportDoc,\n findArgs: findArgs as ExportFindArgs,\n format,\n hooks: exportHooks,\n maxDocs:\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY,\n req,\n startPage: adjustedPage,\n totalDocs,\n transformDoc,\n })\n }\n\n const { columns: dataColumns, docs: rows } = exportResult\n const outputData: string[] = []\n\n // Prepare final output\n if (isCSV) {\n // Get schema-based columns for consistent ordering\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n const schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n // Merge schema columns with data-discovered columns\n // Schema provides ordering, data provides additional columns (e.g., array indices > 0)\n // When a before hook is active and rows exist, restrict to columns actually present in the data\n // so that the hook can remove fields by not returning them\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n const finalColumns =\n Boolean(exportHooks?.before) && rows.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of finalColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n // Always output CSV with header, even if empty\n outputData.push(\n stringify(paddedRows, {\n bom: true,\n header: true,\n columns: finalColumns,\n }),\n )\n } else {\n // JSON format\n outputData.push(rows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n // Ensure we always have valid content for the file\n // For JSON, empty exports produce \"[]\"\n // For CSV, if completely empty (no columns, no rows), produce at least a newline to ensure file creation\n const content = format === 'json' ? `[${outputData.join(',')}]` : outputData.join('')\n const buffer = Buffer.from(content.length > 0 ? content : '\\n')\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; charset=utf-8' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug({\n msg: '[createExport] Updating export document with file',\n exportDocId: id,\n exportCollection,\n fileName: name,\n fileSize: buffer.length,\n mimeType: isCSV ? 'text/csv; charset=utf-8' : 'application/json',\n })\n }\n try {\n await req.payload.update({\n id,\n collection: exportCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv; charset=utf-8' : 'application/json',\n size: buffer.length,\n },\n // Override access only here so that we can be sure the export collection itself is updated as expected\n overrideAccess: true,\n req,\n })\n } catch (error) {\n const errorDetails =\n error instanceof Error\n ? {\n message: error.message,\n name: error.name,\n stack: error.stack,\n // @ts-expect-error - data might exist on Payload errors\n data: error.data,\n }\n : error\n req.payload.logger.error({\n msg: '[createExport] Failed to update export document with file',\n err: errorDetails,\n exportDocId: id,\n exportCollection,\n fileName: name,\n })\n throw error\n }\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","applyFieldHooks","buildDisabledFieldRegex","flattenObject","getExportFieldFunctions","getFilename","getSchemaColumns","mergeColumns","getSelect","validateLimitValue","createExportBatchProcessor","createExport","args","id","name","nameArg","batchSize","collectionSlug","debug","download","drafts","draftsFromInput","exportCollection","exportDoc","fields","format","limit","incomingLimit","maxLimit","locale","localeFromInput","page","req","sort","userCollection","userID","where","whereFromInput","localeFromReq","payload","logger","msg","exportDocId","exportName","draft","collectionConfig","config","collections","find","slug","user","findByID","collection","overrideAccess","hasVersions","Boolean","versions","publishedWhere","_status","equals","and","baseName","isCSV","select","Array","isArray","length","undefined","maxExportDocuments","Math","min","totalDocs","accessDenied","countResult","count","error","totalPages","max","ceil","requestedPage","adjustedPage","findArgs","depth","exportFieldHooks","flattenedFields","exportHooks","custom","disabledFields","admin","disabledMatchers","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","matcher","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","limitErrorMsg","t","schemaColumns","localeCodes","localization","columnCount","allColumns","columnsFinalized","encoder","TextEncoder","isFirstBatch","currentBatchPage","fetched","maxDocs","Number","POSITIVE_INFINITY","effectiveStreamDocs","totalBatches","streamBatchNumber","stream","read","remaining","push","encode","result","docs","batchRows","data","originalDocs","batchRowsToWrite","before","batchNumber","originalData","dataColumns","seenCols","Set","keys","has","add","mergedColumns","filter","col","dataColumnsCount","finalColumnsCount","paddedRows","fullRow","csvString","bom","header","columns","after","fieldHooks","operation","type","batchJSON","JSON","join","hasNextPage","Response","toWeb","headers","processor","transformDoc","exportResult","fetchedCount","processExport","hooks","startPage","rows","outputData","finalColumns","content","buffer","Buffer","from","file","mimetype","size","fileName","fileSize","mimeType","update","errorDetails","Error","message","stack","err"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getCreateExportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/export/getCreateExportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAS,UAAU,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAAA;AAmGV,eAAO,MAAM,6BAA6B,GACxC,QAAQ,MAAM,KACb,UAAU,CAAC;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,CAuBA,CAAA"}
1
+ {"version":3,"file":"getCreateExportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/export/getCreateExportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAS,UAAU,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAAA;AAmGV,eAAO,MAAM,6BAA6B,WAChC,MAAM,KACb,UAAU,CAAC;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,CAoCA,CAAA"}
@@ -115,8 +115,19 @@ export const getCreateCollectionExportTask = (config)=>{
115
115
  output: {}
116
116
  };
117
117
  }
118
+ // The job input omits custom fields, so read the export document once for the hooks.
119
+ const exportDoc = await req.payload.findByID({
120
+ id: input.id,
121
+ collection: input.exportCollection,
122
+ overrideAccess: true,
123
+ req
124
+ });
125
+ if (!exportDoc) {
126
+ throw new Error(`Export document not found: ${input.id}`);
127
+ }
118
128
  await createExport({
119
129
  ...input,
130
+ exportDoc,
120
131
  req
121
132
  });
122
133
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/getCreateExportCollectionTask.ts"],"sourcesContent":["import type { Config, Field, TaskConfig } from 'payload'\n\nimport type { Export } from './createExport.js'\n\nimport { createExport } from './createExport.js'\n\n/**\n * Export input type for job queue serialization.\n * When exports are queued as jobs, the user must be serialized as an ID string or number\n * along with the collection name so it can be rehydrated when the job runs.\n */\nexport type ExportJobInput = {\n user: number | string\n userCollection: string\n} & Export\n\n/**\n * Creates a minimal inputSchema for the job queue task.\n */\nconst getJobInputSchema = (config: Config): Field[] => {\n const allCollectionSlugs = config.collections?.map((c) => c.slug) || []\n\n const collectionOptions = allCollectionSlugs.map((slug) => {\n const collectionConfig = config.collections?.find((c) => c.slug === slug)\n return {\n label: collectionConfig?.labels?.singular || slug,\n value: slug,\n }\n })\n\n return [\n {\n name: 'id',\n type: 'text',\n required: true,\n },\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'collectionSlug',\n type: 'select',\n options: collectionOptions,\n required: true,\n },\n {\n name: 'drafts',\n type: 'select',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n },\n {\n name: 'exportCollection',\n type: 'text',\n required: true,\n },\n {\n name: 'fields',\n type: 'text',\n hasMany: true,\n },\n {\n name: 'format',\n type: 'select',\n options: [\n { label: 'CSV', value: 'csv' },\n { label: 'JSON', value: 'json' },\n ],\n required: true,\n },\n {\n name: 'limit',\n type: 'number',\n },\n {\n name: 'locale',\n type: 'text',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n {\n name: 'page',\n type: 'number',\n },\n {\n name: 'sort',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'where',\n type: 'json',\n },\n ]\n}\n\nexport const getCreateCollectionExportTask = (\n config: Config,\n): TaskConfig<{\n input: ExportJobInput\n output: object\n}> => {\n const inputSchema = getJobInputSchema(config)\n\n return {\n slug: 'createCollectionExport',\n handler: async ({ input, req }) => {\n if (!input) {\n req.payload.logger.error('No input provided to createCollectionExport task')\n\n return { output: {} }\n }\n\n await createExport({\n ...input,\n req,\n })\n\n return {\n output: {},\n }\n },\n inputSchema,\n }\n}\n"],"names":["createExport","getJobInputSchema","config","allCollectionSlugs","collections","map","c","slug","collectionOptions","collectionConfig","find","label","labels","singular","value","name","type","required","options","hasMany","getCreateCollectionExportTask","inputSchema","handler","input","req","payload","logger","error","output"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAYhD;;CAEC,GACD,MAAMC,oBAAoB,CAACC;IACzB,MAAMC,qBAAqBD,OAAOE,WAAW,EAAEC,IAAI,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;IAEvE,MAAMC,oBAAoBL,mBAAmBE,GAAG,CAAC,CAACE;QAChD,MAAME,mBAAmBP,OAAOE,WAAW,EAAEM,KAAK,CAACJ,IAAMA,EAAEC,IAAI,KAAKA;QACpE,OAAO;YACLI,OAAOF,kBAAkBG,QAAQC,YAAYN;YAC7CO,OAAOP;QACT;IACF;IAEA,OAAO;QACL;YACEQ,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;YACNE,SAASV;YACTS,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAMG,OAAO;gBAAK;aAC5B;QACH;QACA;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNG,SAAS;QACX;QACA;YACEJ,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAQG,OAAO;gBAAO;aAChC;YACDG,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;KACD;AACH;AAEA,OAAO,MAAMI,gCAAgC,CAC3ClB;IAKA,MAAMmB,cAAcpB,kBAAkBC;IAEtC,OAAO;QACLK,MAAM;QACNe,SAAS,OAAO,EAAEC,KAAK,EAAEC,GAAG,EAAE;YAC5B,IAAI,CAACD,OAAO;gBACVC,IAAIC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBAEzB,OAAO;oBAAEC,QAAQ,CAAC;gBAAE;YACtB;YAEA,MAAM5B,aAAa;gBACjB,GAAGuB,KAAK;gBACRC;YACF;YAEA,OAAO;gBACLI,QAAQ,CAAC;YACX;QACF;QACAP;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/export/getCreateExportCollectionTask.ts"],"sourcesContent":["import type { Config, Field, TaskConfig } from 'payload'\n\nimport type { Export } from './createExport.js'\n\nimport { createExport } from './createExport.js'\n\n/**\n * Export input type for job queue serialization.\n * When exports are queued as jobs, the user must be serialized as an ID string or number\n * along with the collection name so it can be rehydrated when the job runs.\n */\nexport type ExportJobInput = {\n user: number | string\n userCollection: string\n} & Export\n\n/**\n * Creates a minimal inputSchema for the job queue task.\n */\nconst getJobInputSchema = (config: Config): Field[] => {\n const allCollectionSlugs = config.collections?.map((c) => c.slug) || []\n\n const collectionOptions = allCollectionSlugs.map((slug) => {\n const collectionConfig = config.collections?.find((c) => c.slug === slug)\n return {\n label: collectionConfig?.labels?.singular || slug,\n value: slug,\n }\n })\n\n return [\n {\n name: 'id',\n type: 'text',\n required: true,\n },\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'collectionSlug',\n type: 'select',\n options: collectionOptions,\n required: true,\n },\n {\n name: 'drafts',\n type: 'select',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n },\n {\n name: 'exportCollection',\n type: 'text',\n required: true,\n },\n {\n name: 'fields',\n type: 'text',\n hasMany: true,\n },\n {\n name: 'format',\n type: 'select',\n options: [\n { label: 'CSV', value: 'csv' },\n { label: 'JSON', value: 'json' },\n ],\n required: true,\n },\n {\n name: 'limit',\n type: 'number',\n },\n {\n name: 'locale',\n type: 'text',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n {\n name: 'page',\n type: 'number',\n },\n {\n name: 'sort',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'where',\n type: 'json',\n },\n ]\n}\n\nexport const getCreateCollectionExportTask = (\n config: Config,\n): TaskConfig<{\n input: ExportJobInput\n output: object\n}> => {\n const inputSchema = getJobInputSchema(config)\n\n return {\n slug: 'createCollectionExport',\n handler: async ({ input, req }) => {\n if (!input) {\n req.payload.logger.error('No input provided to createCollectionExport task')\n\n return { output: {} }\n }\n\n // The job input omits custom fields, so read the export document once for the hooks.\n const exportDoc = await req.payload.findByID({\n id: input.id,\n collection: input.exportCollection,\n overrideAccess: true,\n req,\n })\n\n if (!exportDoc) {\n throw new Error(`Export document not found: ${input.id}`)\n }\n\n await createExport({\n ...input,\n exportDoc,\n req,\n })\n\n return {\n output: {},\n }\n },\n inputSchema,\n }\n}\n"],"names":["createExport","getJobInputSchema","config","allCollectionSlugs","collections","map","c","slug","collectionOptions","collectionConfig","find","label","labels","singular","value","name","type","required","options","hasMany","getCreateCollectionExportTask","inputSchema","handler","input","req","payload","logger","error","output","exportDoc","findByID","id","collection","exportCollection","overrideAccess","Error"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAYhD;;CAEC,GACD,MAAMC,oBAAoB,CAACC;IACzB,MAAMC,qBAAqBD,OAAOE,WAAW,EAAEC,IAAI,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;IAEvE,MAAMC,oBAAoBL,mBAAmBE,GAAG,CAAC,CAACE;QAChD,MAAME,mBAAmBP,OAAOE,WAAW,EAAEM,KAAK,CAACJ,IAAMA,EAAEC,IAAI,KAAKA;QACpE,OAAO;YACLI,OAAOF,kBAAkBG,QAAQC,YAAYN;YAC7CO,OAAOP;QACT;IACF;IAEA,OAAO;QACL;YACEQ,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;YACNE,SAASV;YACTS,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAMG,OAAO;gBAAK;aAC5B;QACH;QACA;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNG,SAAS;QACX;QACA;YACEJ,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAQG,OAAO;gBAAO;aAChC;YACDG,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;KACD;AACH;AAEA,OAAO,MAAMI,gCAAgC,CAC3ClB;IAKA,MAAMmB,cAAcpB,kBAAkBC;IAEtC,OAAO;QACLK,MAAM;QACNe,SAAS,OAAO,EAAEC,KAAK,EAAEC,GAAG,EAAE;YAC5B,IAAI,CAACD,OAAO;gBACVC,IAAIC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBAEzB,OAAO;oBAAEC,QAAQ,CAAC;gBAAE;YACtB;YAEA,qFAAqF;YACrF,MAAMC,YAAY,MAAML,IAAIC,OAAO,CAACK,QAAQ,CAAC;gBAC3CC,IAAIR,MAAMQ,EAAE;gBACZC,YAAYT,MAAMU,gBAAgB;gBAClCC,gBAAgB;gBAChBV;YACF;YAEA,IAAI,CAACK,WAAW;gBACd,MAAM,IAAIM,MAAM,CAAC,2BAA2B,EAAEZ,MAAMQ,EAAE,EAAE;YAC1D;YAEA,MAAM/B,aAAa;gBACjB,GAAGuB,KAAK;gBACRM;gBACAL;YACF;YAEA,OAAO;gBACLI,QAAQ,CAAC;YACX;QACF;QACAP;IACF;AACF,EAAC"}