@payloadcms/plugin-import-export 3.49.0-canary.6 → 3.49.0-canary.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,yBAuKnB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,yBA8KnB,CAAA"}
@@ -55,6 +55,7 @@ export const Preview = ()=>{
55
55
  collectionSlug,
56
56
  draft,
57
57
  fields,
58
+ format,
58
59
  limit,
59
60
  locale,
60
61
  sort,
@@ -88,10 +89,10 @@ export const Preview = ()=>{
88
89
  const regex = fieldToRegex(field);
89
90
  return allKeys.filter((key)=>regex.test(key) && !disabledFieldRegexes.some((disabledRegex)=>disabledRegex.test(key)));
90
91
  }) : allKeys.filter((key)=>!defaultMetaFields.includes(key) && !disabledFieldRegexes.some((regex)=>regex.test(key)));
91
- const fieldKeys = Array.isArray(fields) && fields.length > 0 ? selectedKeys // strictly only what was selected
92
+ const fieldKeys = Array.isArray(fields) && fields.length > 0 ? selectedKeys // strictly use selected fields only
92
93
  : [
93
94
  ...selectedKeys,
94
- ...defaultMetaFields.filter((key)=>allKeys.includes(key))
95
+ ...defaultMetaFields.filter((key)=>allKeys.includes(key) && !selectedKeys.includes(key))
95
96
  ];
96
97
  // Build columns based on flattened keys
97
98
  const newColumns = fieldKeys.map((key)=>({
@@ -129,6 +130,7 @@ export const Preview = ()=>{
129
130
  disabledFieldRegexes,
130
131
  draft,
131
132
  fields,
133
+ format,
132
134
  i18n,
133
135
  limit,
134
136
  locale,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Preview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Table,\n Translation,\n useConfig,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { buildDisabledFieldRegex } from '../../utilities/buildDisabledFieldRegex.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'preview'\n\nexport const Preview = () => {\n const { collection } = useImportExport()\n const { config } = useConfig()\n const { value: where } = useField({ path: 'where' })\n const { value: limit } = useField<number>({ path: 'limit' })\n const { value: fields } = useField<string[]>({ path: 'fields' })\n const { value: sort } = useField({ path: 'sort' })\n const { value: draft } = useField({ path: 'drafts' })\n const { value: locale } = useField({ path: 'locale' })\n const { value: format } = useField({ path: 'format' })\n const [dataToRender, setDataToRender] = React.useState<any[]>([])\n const [resultCount, setResultCount] = React.useState<any>('')\n const [columns, setColumns] = React.useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const collectionSlug = typeof collection === 'string' && collection\n const collectionConfig = config.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n const disabledFieldRegexes: RegExp[] = React.useMemo(() => {\n const disabledFieldPaths =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n return disabledFieldPaths.map(buildDisabledFieldRegex)\n }, [collectionConfig])\n\n const isCSV = format === 'csv'\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!collectionSlug || !collectionConfig) {\n return\n }\n\n try {\n const res = await fetch('/api/preview-data', {\n body: JSON.stringify({\n collectionSlug,\n draft,\n fields,\n limit,\n locale,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n\n if (!res.ok) {\n return\n }\n\n const { docs, totalDocs }: { docs: Record<string, unknown>[]; totalDocs: number } =\n await res.json()\n\n setResultCount(limit && limit < totalDocs ? limit : totalDocs)\n\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n const defaultMetaFields = ['createdAt', 'updatedAt', '_status', 'id']\n\n // Match CSV column ordering by building keys based on fields and regex\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n return new RegExp(`^${parts.join('_')}`)\n }\n\n // Construct final list of field keys to match field order + meta order\n const selectedKeys =\n Array.isArray(fields) && fields.length > 0\n ? fields.flatMap((field) => {\n const regex = fieldToRegex(field)\n return allKeys.filter(\n (key) =>\n regex.test(key) &&\n !disabledFieldRegexes.some((disabledRegex) => disabledRegex.test(key)),\n )\n })\n : allKeys.filter(\n (key) =>\n !defaultMetaFields.includes(key) &&\n !disabledFieldRegexes.some((regex) => regex.test(key)),\n )\n\n const fieldKeys =\n Array.isArray(fields) && fields.length > 0\n ? selectedKeys // strictly only what was selected\n : [...selectedKeys, ...defaultMetaFields.filter((key) => allKeys.includes(key))]\n\n // Build columns based on flattened keys\n const newColumns: Column[] = fieldKeys.map((key) => ({\n accessor: key,\n active: true,\n field: { name: key } as ClientField,\n Heading: getTranslation(key, i18n),\n renderedCells: docs.map((doc: Record<string, unknown>) => {\n const val = doc[key]\n\n if (val === undefined || val === null) {\n return null\n }\n\n // Avoid ESLint warning by type-checking before calling String()\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\n return String(val)\n }\n\n if (Array.isArray(val)) {\n return val.map(String).join(', ')\n }\n\n return JSON.stringify(val)\n }),\n }))\n\n setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n void fetchData()\n }, [\n collectionConfig,\n collectionSlug,\n disabledFieldRegexes,\n draft,\n fields,\n i18n,\n limit,\n locale,\n sort,\n where,\n ])\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {resultCount && (\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:totalDocumentsCount\"\n t={t}\n variables={{\n count: resultCount,\n }}\n />\n )}\n </div>\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Table","Translation","useConfig","useField","useTranslation","React","buildDisabledFieldRegex","useImportExport","baseClass","Preview","collection","config","value","where","path","limit","fields","sort","draft","locale","format","dataToRender","setDataToRender","useState","resultCount","setResultCount","columns","setColumns","i18n","t","collectionSlug","collectionConfig","collections","find","slug","disabledFieldRegexes","useMemo","disabledFieldPaths","admin","custom","disabledFields","map","isCSV","useEffect","fetchData","res","fetch","body","JSON","stringify","credentials","headers","method","ok","docs","totalDocs","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","defaultMetaFields","fieldToRegex","field","parts","split","part","RegExp","join","selectedKeys","isArray","length","regex","filter","key","test","some","disabledRegex","includes","fieldKeys","newColumns","accessor","active","name","Heading","renderedCells","val","undefined","String","error","console","div","className","h3","i18nKey","variables","count","data","language","readOnly"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/Preview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Table,\n Translation,\n useConfig,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { buildDisabledFieldRegex } from '../../utilities/buildDisabledFieldRegex.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'preview'\n\nexport const Preview = () => {\n const { collection } = useImportExport()\n const { config } = useConfig()\n const { value: where } = useField({ path: 'where' })\n const { value: limit } = useField<number>({ path: 'limit' })\n const { value: fields } = useField<string[]>({ path: 'fields' })\n const { value: sort } = useField({ path: 'sort' })\n const { value: draft } = useField({ path: 'drafts' })\n const { value: locale } = useField({ path: 'locale' })\n const { value: format } = useField({ path: 'format' })\n const [dataToRender, setDataToRender] = React.useState<any[]>([])\n const [resultCount, setResultCount] = React.useState<any>('')\n const [columns, setColumns] = React.useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const collectionSlug = typeof collection === 'string' && collection\n const collectionConfig = config.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n const disabledFieldRegexes: RegExp[] = React.useMemo(() => {\n const disabledFieldPaths =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n return disabledFieldPaths.map(buildDisabledFieldRegex)\n }, [collectionConfig])\n\n const isCSV = format === 'csv'\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!collectionSlug || !collectionConfig) {\n return\n }\n\n try {\n const res = await fetch('/api/preview-data', {\n body: JSON.stringify({\n collectionSlug,\n draft,\n fields,\n format,\n limit,\n locale,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n\n if (!res.ok) {\n return\n }\n\n const { docs, totalDocs }: { docs: Record<string, unknown>[]; totalDocs: number } =\n await res.json()\n\n setResultCount(limit && limit < totalDocs ? limit : totalDocs)\n\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n const defaultMetaFields = ['createdAt', 'updatedAt', '_status', 'id']\n\n // Match CSV column ordering by building keys based on fields and regex\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n return new RegExp(`^${parts.join('_')}`)\n }\n\n // Construct final list of field keys to match field order + meta order\n const selectedKeys =\n Array.isArray(fields) && fields.length > 0\n ? fields.flatMap((field) => {\n const regex = fieldToRegex(field)\n return allKeys.filter(\n (key) =>\n regex.test(key) &&\n !disabledFieldRegexes.some((disabledRegex) => disabledRegex.test(key)),\n )\n })\n : allKeys.filter(\n (key) =>\n !defaultMetaFields.includes(key) &&\n !disabledFieldRegexes.some((regex) => regex.test(key)),\n )\n\n const fieldKeys =\n Array.isArray(fields) && fields.length > 0\n ? selectedKeys // strictly use selected fields only\n : [\n ...selectedKeys,\n ...defaultMetaFields.filter(\n (key) => allKeys.includes(key) && !selectedKeys.includes(key),\n ),\n ]\n\n // Build columns based on flattened keys\n const newColumns: Column[] = fieldKeys.map((key) => ({\n accessor: key,\n active: true,\n field: { name: key } as ClientField,\n Heading: getTranslation(key, i18n),\n renderedCells: docs.map((doc: Record<string, unknown>) => {\n const val = doc[key]\n\n if (val === undefined || val === null) {\n return null\n }\n\n // Avoid ESLint warning by type-checking before calling String()\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\n return String(val)\n }\n\n if (Array.isArray(val)) {\n return val.map(String).join(', ')\n }\n\n return JSON.stringify(val)\n }),\n }))\n\n setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n void fetchData()\n }, [\n collectionConfig,\n collectionSlug,\n disabledFieldRegexes,\n draft,\n fields,\n format,\n i18n,\n limit,\n locale,\n sort,\n where,\n ])\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {resultCount && (\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:totalDocumentsCount\"\n t={t}\n variables={{\n count: resultCount,\n }}\n />\n )}\n </div>\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Table","Translation","useConfig","useField","useTranslation","React","buildDisabledFieldRegex","useImportExport","baseClass","Preview","collection","config","value","where","path","limit","fields","sort","draft","locale","format","dataToRender","setDataToRender","useState","resultCount","setResultCount","columns","setColumns","i18n","t","collectionSlug","collectionConfig","collections","find","slug","disabledFieldRegexes","useMemo","disabledFieldPaths","admin","custom","disabledFields","map","isCSV","useEffect","fetchData","res","fetch","body","JSON","stringify","credentials","headers","method","ok","docs","totalDocs","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","defaultMetaFields","fieldToRegex","field","parts","split","part","RegExp","join","selectedKeys","isArray","length","regex","filter","key","test","some","disabledRegex","includes","fieldKeys","newColumns","accessor","active","name","Heading","renderedCells","val","undefined","String","error","console","div","className","h3","i18nKey","variables","count","data","language","readOnly"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAYrE,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCAgRxD,CAAA"}
1
+ {"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAYrE,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCAkUxD,CAAA"}
@@ -57,7 +57,7 @@ export const createExport = async (args)=>{
57
57
  });
58
58
  const disabledFields = collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? [];
59
59
  const disabledRegexes = disabledFields.map(buildDisabledFieldRegex);
60
- const filterDisabled = (row)=>{
60
+ const filterDisabledCSV = (row)=>{
61
61
  const filtered = {};
62
62
  for (const [key, value] of Object.entries(row)){
63
63
  const isDisabled = disabledRegexes.some((regex)=>regex.test(key));
@@ -67,37 +67,57 @@ export const createExport = async (args)=>{
67
67
  }
68
68
  return filtered;
69
69
  };
70
+ const filterDisabledJSON = (doc, parentPath = '')=>{
71
+ if (Array.isArray(doc)) {
72
+ return doc.map((item)=>filterDisabledJSON(item, parentPath));
73
+ }
74
+ if (typeof doc !== 'object' || doc === null) {
75
+ return doc;
76
+ }
77
+ const filtered = {};
78
+ for (const [key, value] of Object.entries(doc)){
79
+ const currentPath = parentPath ? `${parentPath}.${key}` : key;
80
+ // Only remove if this exact path is disabled
81
+ const isDisabled = disabledFields.includes(currentPath);
82
+ if (!isDisabled) {
83
+ filtered[key] = filterDisabledJSON(value, currentPath);
84
+ }
85
+ }
86
+ return filtered;
87
+ };
70
88
  if (download) {
71
89
  if (debug) {
72
90
  req.payload.logger.debug('Pre-scanning all columns before streaming');
73
91
  }
74
- const allColumnsSet = new Set();
75
92
  const allColumns = [];
76
- let scanPage = 1;
77
- let hasMore = true;
78
- while(hasMore){
79
- const result = await payload.find({
80
- ...findArgs,
81
- page: scanPage
82
- });
83
- result.docs.forEach((doc)=>{
84
- const flat = filterDisabled(flattenObject({
85
- doc,
86
- fields,
87
- toCSVFunctions
88
- }));
89
- Object.keys(flat).forEach((key)=>{
90
- if (!allColumnsSet.has(key)) {
91
- allColumnsSet.add(key);
92
- allColumns.push(key);
93
- }
93
+ if (isCSV) {
94
+ const allColumnsSet = new Set();
95
+ let scanPage = 1;
96
+ let hasMore = true;
97
+ while(hasMore){
98
+ const result = await payload.find({
99
+ ...findArgs,
100
+ page: scanPage
94
101
  });
95
- });
96
- hasMore = result.hasNextPage;
97
- scanPage += 1;
98
- }
99
- if (debug) {
100
- req.payload.logger.debug(`Discovered ${allColumns.length} columns`);
102
+ result.docs.forEach((doc)=>{
103
+ const flat = filterDisabledCSV(flattenObject({
104
+ doc,
105
+ fields,
106
+ toCSVFunctions
107
+ }));
108
+ Object.keys(flat).forEach((key)=>{
109
+ if (!allColumnsSet.has(key)) {
110
+ allColumnsSet.add(key);
111
+ allColumns.push(key);
112
+ }
113
+ });
114
+ });
115
+ hasMore = result.hasNextPage;
116
+ scanPage += 1;
117
+ }
118
+ if (debug) {
119
+ req.payload.logger.debug(`Discovered ${allColumns.length} columns`);
120
+ }
101
121
  }
102
122
  const encoder = new TextEncoder();
103
123
  let isFirstBatch = true;
@@ -112,32 +132,52 @@ export const createExport = async (args)=>{
112
132
  req.payload.logger.debug(`Streaming batch ${streamPage} with ${result.docs.length} docs`);
113
133
  }
114
134
  if (result.docs.length === 0) {
135
+ // Close JSON array properly if JSON
136
+ if (!isCSV) {
137
+ this.push(encoder.encode(']'));
138
+ }
115
139
  this.push(null);
116
140
  return;
117
141
  }
118
- const batchRows = result.docs.map((doc)=>filterDisabled(flattenObject({
119
- doc,
120
- fields,
121
- toCSVFunctions
122
- })));
123
- const paddedRows = batchRows.map((row)=>{
124
- const fullRow = {};
125
- for (const col of allColumns){
126
- fullRow[col] = row[col] ?? '';
142
+ if (isCSV) {
143
+ // --- CSV Streaming ---
144
+ const batchRows = result.docs.map((doc)=>filterDisabledCSV(flattenObject({
145
+ doc,
146
+ fields,
147
+ toCSVFunctions
148
+ })));
149
+ const paddedRows = batchRows.map((row)=>{
150
+ const fullRow = {};
151
+ for (const col of allColumns){
152
+ fullRow[col] = row[col] ?? '';
153
+ }
154
+ return fullRow;
155
+ });
156
+ const csvString = stringify(paddedRows, {
157
+ header: isFirstBatch,
158
+ columns: allColumns
159
+ });
160
+ this.push(encoder.encode(csvString));
161
+ } else {
162
+ // --- JSON Streaming ---
163
+ const batchRows = result.docs.map((doc)=>filterDisabledJSON(doc));
164
+ // Convert each filtered/flattened row into JSON string
165
+ const batchJSON = batchRows.map((row)=>JSON.stringify(row)).join(',');
166
+ if (isFirstBatch) {
167
+ this.push(encoder.encode('[' + batchJSON));
168
+ } else {
169
+ this.push(encoder.encode(',' + batchJSON));
127
170
  }
128
- return fullRow;
129
- });
130
- const csvString = stringify(paddedRows, {
131
- header: isFirstBatch,
132
- columns: allColumns
133
- });
134
- this.push(encoder.encode(csvString));
171
+ }
135
172
  isFirstBatch = false;
136
173
  streamPage += 1;
137
174
  if (!result.hasNextPage) {
138
175
  if (debug) {
139
176
  req.payload.logger.debug('Stream complete - no more pages');
140
177
  }
178
+ if (!isCSV) {
179
+ this.push(encoder.encode(']'));
180
+ }
141
181
  this.push(null) // End the stream
142
182
  ;
143
183
  }
@@ -169,7 +209,7 @@ export const createExport = async (args)=>{
169
209
  req.payload.logger.debug(`Processing batch ${findArgs.page} with ${result.docs.length} documents`);
170
210
  }
171
211
  if (isCSV) {
172
- const batchRows = result.docs.map((doc)=>filterDisabled(flattenObject({
212
+ const batchRows = result.docs.map((doc)=>filterDisabledCSV(flattenObject({
173
213
  doc,
174
214
  fields,
175
215
  toCSVFunctions
@@ -185,8 +225,8 @@ export const createExport = async (args)=>{
185
225
  });
186
226
  rows.push(...batchRows);
187
227
  } else {
188
- const jsonInput = result.docs.map((doc)=>JSON.stringify(doc));
189
- outputData.push(jsonInput.join(',\n'));
228
+ const batchRows = result.docs.map((doc)=>filterDisabledJSON(doc));
229
+ outputData.push(batchRows.map((doc)=>JSON.stringify(doc)).join(',\n'));
190
230
  }
191
231
  hasNextPage = result.hasNextPage;
192
232
  page += 1;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, TypedUser, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from './flattenObject.js'\nimport { getCustomFieldFunctions } from './getCustomFieldFunctions.js'\nimport { getFilename } from './getFilename.js'\nimport { getSelect } from './getSelect.js'\n\nexport type Export = {\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportsCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n locale?: string\n name: string\n slug: string\n sort: Sort\n user: string\n userCollection: string\n where?: Where\n}\n\nexport type CreateExportArgs = {\n /**\n * If true, stream the file instead of saving it\n */\n download?: boolean\n input: Export\n req: PayloadRequest\n user?: TypedUser\n}\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n download,\n input: {\n id,\n name: nameArg,\n collectionSlug,\n debug = false,\n drafts,\n exportsCollection,\n fields,\n format,\n locale: localeInput,\n sort,\n user,\n where,\n },\n req: { locale: localeArg, payload },\n req,\n } = args\n\n if (debug) {\n req.payload.logger.debug({\n message: 'Starting export process with args:',\n collectionSlug,\n drafts,\n fields,\n format,\n })\n }\n\n const locale = localeInput ?? localeArg\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found`)\n }\n\n const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}`\n const isCSV = format === 'csv'\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n if (debug) {\n req.payload.logger.debug({ message: 'Export configuration:', name, isCSV, locale })\n }\n\n const findArgs = {\n collection: collectionSlug,\n depth: 1,\n draft: drafts === 'yes',\n limit: 100,\n locale,\n overrideAccess: false,\n page: 0,\n select,\n sort,\n user,\n where,\n }\n\n if (debug) {\n req.payload.logger.debug({ message: 'Find arguments:', findArgs })\n }\n\n const toCSVFunctions = getCustomFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledRegexes: RegExp[] = disabledFields.map(buildDisabledFieldRegex)\n\n const filterDisabled = (row: Record<string, unknown>): Record<string, unknown> => {\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n const isDisabled = disabledRegexes.some((regex) => regex.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n if (download) {\n if (debug) {\n req.payload.logger.debug('Pre-scanning all columns before streaming')\n }\n\n const allColumnsSet = new Set<string>()\n const allColumns: string[] = []\n let scanPage = 1\n let hasMore = true\n\n while (hasMore) {\n const result = await payload.find({ ...findArgs, page: scanPage })\n\n result.docs.forEach((doc) => {\n const flat = filterDisabled(flattenObject({ doc, fields, toCSVFunctions }))\n Object.keys(flat).forEach((key) => {\n if (!allColumnsSet.has(key)) {\n allColumnsSet.add(key)\n allColumns.push(key)\n }\n })\n })\n\n hasMore = result.hasNextPage\n scanPage += 1\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${allColumns.length} columns`)\n }\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let streamPage = 1\n\n const stream = new Readable({\n async read() {\n const result = await payload.find({ ...findArgs, page: streamPage })\n\n if (debug) {\n req.payload.logger.debug(`Streaming batch ${streamPage} with ${result.docs.length} docs`)\n }\n\n if (result.docs.length === 0) {\n this.push(null)\n return\n }\n\n const batchRows = result.docs.map((doc) =>\n filterDisabled(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n const paddedRows = batchRows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of allColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n const csvString = stringify(paddedRows, {\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n isFirstBatch = false\n streamPage += 1\n\n if (!result.hasNextPage) {\n if (debug) {\n req.payload.logger.debug('Stream complete - no more pages')\n }\n this.push(null) // End the stream\n }\n },\n })\n\n return new Response(stream as any, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv' : 'application/json',\n },\n })\n }\n\n // Non-download path (buffered export)\n if (debug) {\n req.payload.logger.debug('Starting file generation')\n }\n\n const outputData: string[] = []\n const rows: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n let page = 1\n let hasNextPage = true\n\n while (hasNextPage) {\n const result = await payload.find({\n ...findArgs,\n page,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing batch ${findArgs.page} with ${result.docs.length} documents`,\n )\n }\n\n if (isCSV) {\n const batchRows = result.docs.map((doc) =>\n filterDisabled(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n // Track discovered column keys\n batchRows.forEach((row) => {\n Object.keys(row).forEach((key) => {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n })\n })\n\n rows.push(...batchRows)\n } else {\n const jsonInput = result.docs.map((doc) => JSON.stringify(doc))\n outputData.push(jsonInput.join(',\\n'))\n }\n\n hasNextPage = result.hasNextPage\n page += 1\n }\n\n if (isCSV) {\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of columns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n outputData.push(\n stringify(paddedRows, {\n header: true,\n columns,\n }),\n )\n }\n\n const buffer = Buffer.from(format === 'json' ? `[${outputData.join(',')}]` : outputData.join(''))\n if (debug) {\n req.payload.logger.debug(`${format} file generation complete`)\n }\n\n if (!id) {\n if (debug) {\n req.payload.logger.debug('Creating new export file')\n }\n req.file = {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug(`Updating existing export with id: ${id}`)\n }\n await req.payload.update({\n id,\n collection: exportsCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n },\n user,\n })\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","buildDisabledFieldRegex","flattenObject","getCustomFieldFunctions","getFilename","getSelect","createExport","args","download","input","id","name","nameArg","collectionSlug","debug","drafts","exportsCollection","fields","format","locale","localeInput","sort","user","where","req","localeArg","payload","logger","message","collectionConfig","config","collections","find","slug","isCSV","select","Array","isArray","length","undefined","findArgs","collection","depth","draft","limit","overrideAccess","page","toCSVFunctions","flattenedFields","disabledFields","admin","custom","disabledRegexes","map","filterDisabled","row","filtered","key","value","Object","entries","isDisabled","some","regex","test","allColumnsSet","Set","allColumns","scanPage","hasMore","result","docs","forEach","doc","flat","keys","has","add","push","hasNextPage","encoder","TextEncoder","isFirstBatch","streamPage","stream","read","batchRows","paddedRows","fullRow","col","csvString","header","columns","encode","Response","headers","outputData","rows","columnsSet","jsonInput","JSON","join","buffer","Buffer","from","file","data","mimetype","size","update"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, TypedUser, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from './flattenObject.js'\nimport { getCustomFieldFunctions } from './getCustomFieldFunctions.js'\nimport { getFilename } from './getFilename.js'\nimport { getSelect } from './getSelect.js'\n\nexport type Export = {\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportsCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n locale?: string\n name: string\n slug: string\n sort: Sort\n user: string\n userCollection: string\n where?: Where\n}\n\nexport type CreateExportArgs = {\n /**\n * If true, stream the file instead of saving it\n */\n download?: boolean\n input: Export\n req: PayloadRequest\n user?: TypedUser\n}\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n download,\n input: {\n id,\n name: nameArg,\n collectionSlug,\n debug = false,\n drafts,\n exportsCollection,\n fields,\n format,\n locale: localeInput,\n sort,\n user,\n where,\n },\n req: { locale: localeArg, payload },\n req,\n } = args\n\n if (debug) {\n req.payload.logger.debug({\n message: 'Starting export process with args:',\n collectionSlug,\n drafts,\n fields,\n format,\n })\n }\n\n const locale = localeInput ?? localeArg\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found`)\n }\n\n const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}`\n const isCSV = format === 'csv'\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n if (debug) {\n req.payload.logger.debug({ message: 'Export configuration:', name, isCSV, locale })\n }\n\n const findArgs = {\n collection: collectionSlug,\n depth: 1,\n draft: drafts === 'yes',\n limit: 100,\n locale,\n overrideAccess: false,\n page: 0,\n select,\n sort,\n user,\n where,\n }\n\n if (debug) {\n req.payload.logger.debug({ message: 'Find arguments:', findArgs })\n }\n\n const toCSVFunctions = getCustomFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledRegexes: RegExp[] = disabledFields.map(buildDisabledFieldRegex)\n\n const filterDisabledCSV = (row: Record<string, unknown>): Record<string, unknown> => {\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n const isDisabled = disabledRegexes.some((regex) => regex.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: any, parentPath = ''): any => {\n if (Array.isArray(doc)) {\n return doc.map((item) => filterDisabledJSON(item, parentPath))\n }\n\n if (typeof doc !== 'object' || doc === null) {\n return doc\n }\n\n const filtered: Record<string, any> = {}\n for (const [key, value] of Object.entries(doc)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Only remove if this exact path is disabled\n const isDisabled = disabledFields.includes(currentPath)\n\n if (!isDisabled) {\n filtered[key] = filterDisabledJSON(value, currentPath)\n }\n }\n\n return filtered\n }\n\n if (download) {\n if (debug) {\n req.payload.logger.debug('Pre-scanning all columns before streaming')\n }\n\n const allColumns: string[] = []\n\n if (isCSV) {\n const allColumnsSet = new Set<string>()\n let scanPage = 1\n let hasMore = true\n\n while (hasMore) {\n const result = await payload.find({ ...findArgs, page: scanPage })\n\n result.docs.forEach((doc) => {\n const flat = filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions }))\n Object.keys(flat).forEach((key) => {\n if (!allColumnsSet.has(key)) {\n allColumnsSet.add(key)\n allColumns.push(key)\n }\n })\n })\n\n hasMore = result.hasNextPage\n scanPage += 1\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${allColumns.length} columns`)\n }\n }\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let streamPage = 1\n\n const stream = new Readable({\n async read() {\n const result = await payload.find({ ...findArgs, page: streamPage })\n\n if (debug) {\n req.payload.logger.debug(`Streaming batch ${streamPage} with ${result.docs.length} docs`)\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null)\n return\n }\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n const paddedRows = batchRows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of allColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n const csvString = stringify(paddedRows, {\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRows.map((row) => JSON.stringify(row)).join(',')\n\n if (isFirstBatch) {\n this.push(encoder.encode('[' + batchJSON))\n } else {\n this.push(encoder.encode(',' + batchJSON))\n }\n }\n\n isFirstBatch = false\n streamPage += 1\n\n if (!result.hasNextPage) {\n if (debug) {\n req.payload.logger.debug('Stream complete - no more pages')\n }\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null) // End the stream\n }\n },\n })\n\n return new Response(stream as any, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv' : 'application/json',\n },\n })\n }\n\n // Non-download path (buffered export)\n if (debug) {\n req.payload.logger.debug('Starting file generation')\n }\n\n const outputData: string[] = []\n const rows: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n let page = 1\n let hasNextPage = true\n\n while (hasNextPage) {\n const result = await payload.find({\n ...findArgs,\n page,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing batch ${findArgs.page} with ${result.docs.length} documents`,\n )\n }\n\n if (isCSV) {\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n // Track discovered column keys\n batchRows.forEach((row) => {\n Object.keys(row).forEach((key) => {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n })\n })\n\n rows.push(...batchRows)\n } else {\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n outputData.push(batchRows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n hasNextPage = result.hasNextPage\n page += 1\n }\n\n if (isCSV) {\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of columns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n outputData.push(\n stringify(paddedRows, {\n header: true,\n columns,\n }),\n )\n }\n\n const buffer = Buffer.from(format === 'json' ? `[${outputData.join(',')}]` : outputData.join(''))\n if (debug) {\n req.payload.logger.debug(`${format} file generation complete`)\n }\n\n if (!id) {\n if (debug) {\n req.payload.logger.debug('Creating new export file')\n }\n req.file = {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug(`Updating existing export with id: ${id}`)\n }\n await req.payload.update({\n id,\n collection: exportsCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n },\n user,\n })\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","buildDisabledFieldRegex","flattenObject","getCustomFieldFunctions","getFilename","getSelect","createExport","args","download","input","id","name","nameArg","collectionSlug","debug","drafts","exportsCollection","fields","format","locale","localeInput","sort","user","where","req","localeArg","payload","logger","message","collectionConfig","config","collections","find","slug","isCSV","select","Array","isArray","length","undefined","findArgs","collection","depth","draft","limit","overrideAccess","page","toCSVFunctions","flattenedFields","disabledFields","admin","custom","disabledRegexes","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","regex","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","allColumns","allColumnsSet","Set","scanPage","hasMore","result","docs","forEach","flat","keys","has","add","push","hasNextPage","encoder","TextEncoder","isFirstBatch","streamPage","stream","read","encode","batchRows","paddedRows","fullRow","col","csvString","header","columns","batchJSON","JSON","join","Response","headers","outputData","rows","columnsSet","buffer","Buffer","from","file","data","mimetype","size","update"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,9 @@ declare module 'payload' {
12
12
  * @default false
13
13
  */
14
14
  disabled?: boolean;
15
+ /**
16
+ * Custom function used to modify the outgoing csv data by manipulating the data, siblingData or by returning the desired value
17
+ */
15
18
  toCSV?: ToCSVFunction;
16
19
  };
17
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,SAAS,CAAA;AAKrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAWzE,eAAO,MAAM,kBAAkB,iBACd,wBAAwB,cAC9B,MAAM,KAAG,MA0JjB,CAAA;AAEH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,WAAW;QAC1B,sBAAsB,CAAC,EAAE;YACvB;;;;;;eAMG;YACH,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB,KAAK,CAAC,EAAE,aAAa,CAAA;SACtB,CAAA;KACF;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,SAAS,CAAA;AAKrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAczE,eAAO,MAAM,kBAAkB,iBACd,wBAAwB,cAC9B,MAAM,KAAG,MAwLjB,CAAA;AAEH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,WAAW;QAC1B,sBAAsB,CAAC,EAAE;YACvB;;;;;;eAMG;YACH,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB;;eAEG;YACH,KAAK,CAAC,EAAE,aAAa,CAAA;SACtB,CAAA;KACF;CACF"}
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ import { getExportCollection } from './getExportCollection.js';
7
7
  import { translations } from './translations/index.js';
8
8
  import { collectDisabledFieldPaths } from './utilities/collectDisabledFieldPaths.js';
9
9
  import { getFlattenedFieldKeys } from './utilities/getFlattenedFieldKeys.js';
10
+ import { getValueAtPath } from './utilities/getvalueAtPath.js';
11
+ import { removeDisabledFields } from './utilities/removeDisabledFields.js';
12
+ import { setNestedValue } from './utilities/setNestedValue.js';
10
13
  export const importExportPlugin = (pluginConfig)=>(config)=>{
11
14
  const exportCollection = getExportCollection({
12
15
  config,
@@ -93,24 +96,47 @@ export const importExportPlugin = (pluginConfig)=>(config)=>{
93
96
  sort,
94
97
  where
95
98
  });
99
+ const isCSV = req?.data?.format === 'csv';
96
100
  const docs = result.docs;
97
- const toCSVFunctions = getCustomFieldFunctions({
98
- fields: collection.config.fields
99
- });
100
- const possibleKeys = getFlattenedFieldKeys(collection.config.fields);
101
- const transformed = docs.map((doc)=>{
102
- const row = flattenObject({
103
- doc,
104
- fields,
105
- toCSVFunctions
101
+ let transformed = [];
102
+ if (isCSV) {
103
+ const toCSVFunctions = getCustomFieldFunctions({
104
+ fields: collection.config.fields
106
105
  });
107
- for (const key of possibleKeys){
108
- if (!(key in row)) {
109
- row[key] = null;
106
+ const possibleKeys = getFlattenedFieldKeys(collection.config.fields);
107
+ transformed = docs.map((doc)=>{
108
+ const row = flattenObject({
109
+ doc,
110
+ fields,
111
+ toCSVFunctions
112
+ });
113
+ for (const key of possibleKeys){
114
+ if (!(key in row)) {
115
+ row[key] = null;
116
+ }
110
117
  }
111
- }
112
- return row;
113
- });
118
+ return row;
119
+ });
120
+ } else {
121
+ const disabledFields = collection.config.admin.custom?.['plugin-import-export']?.disabledFields;
122
+ transformed = docs.map((doc)=>{
123
+ let output = {
124
+ ...doc
125
+ };
126
+ // Remove disabled fields first
127
+ output = removeDisabledFields(output, disabledFields);
128
+ // Then trim to selected fields only (if fields are provided)
129
+ if (Array.isArray(fields) && fields.length > 0) {
130
+ const trimmed = {};
131
+ for (const key of fields){
132
+ const value = getValueAtPath(output, key);
133
+ setNestedValue(trimmed, key, value ?? null);
134
+ }
135
+ output = trimmed;
136
+ }
137
+ return output;
138
+ });
139
+ }
114
140
  return Response.json({
115
141
  docs: transformed,
116
142
  totalDocs: result.totalDocs
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, FlattenedField } from 'payload'\n\nimport { addDataAndFileToRequest, deepMergeSimple } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { ImportExportPluginConfig, ToCSVFunction } from './types.js'\n\nimport { flattenObject } from './export/flattenObject.js'\nimport { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js'\nimport { getCustomFieldFunctions } from './export/getCustomFieldFunctions.js'\nimport { getSelect } from './export/getSelect.js'\nimport { getExportCollection } from './getExportCollection.js'\nimport { translations } from './translations/index.js'\nimport { collectDisabledFieldPaths } from './utilities/collectDisabledFieldPaths.js'\nimport { getFlattenedFieldKeys } from './utilities/getFlattenedFieldKeys.js'\n\nexport const importExportPlugin =\n (pluginConfig: ImportExportPluginConfig) =>\n (config: Config): Config => {\n const exportCollection = getExportCollection({ config, pluginConfig })\n if (config.collections) {\n config.collections.push(exportCollection)\n } else {\n config.collections = [exportCollection]\n }\n\n // inject custom import export provider\n config.admin = config.admin || {}\n config.admin.components = config.admin.components || {}\n config.admin.components.providers = config.admin.components.providers || []\n config.admin.components.providers.push(\n '@payloadcms/plugin-import-export/rsc#ImportExportProvider',\n )\n\n // inject the createExport job into the config\n ;((config.jobs ??= {}).tasks ??= []).push(getCreateCollectionExportTask(config, pluginConfig))\n\n let collectionsToUpdate = config.collections\n\n const usePluginCollections = pluginConfig.collections && pluginConfig.collections?.length > 0\n\n if (usePluginCollections) {\n collectionsToUpdate = config.collections?.filter((collection) => {\n return pluginConfig.collections?.includes(collection.slug)\n })\n }\n\n collectionsToUpdate.forEach((collection) => {\n if (!collection.admin) {\n collection.admin = { components: { listMenuItems: [] } }\n }\n const components = collection.admin.components || {}\n if (!components.listMenuItems) {\n components.listMenuItems = []\n }\n components.listMenuItems.push({\n clientProps: {\n exportCollectionSlug: exportCollection.slug,\n },\n path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem',\n })\n\n // // Find fields explicitly marked as disabled for import/export\n const disabledFieldAccessors = collectDisabledFieldPaths(collection.fields)\n\n // Store disabled field accessors in the admin config for use in the UI\n collection.admin.custom = {\n ...(collection.admin.custom || {}),\n 'plugin-import-export': {\n ...(collection.admin.custom?.['plugin-import-export'] || {}),\n disabledFields: disabledFieldAccessors,\n },\n }\n\n collection.admin.components = components\n })\n\n if (!config.i18n) {\n config.i18n = {}\n }\n\n // config.i18n.translations = deepMergeSimple(translations, config.i18n?.translations ?? {})\n\n // Inject custom REST endpoints into the config\n config.endpoints = config.endpoints || []\n config.endpoints.push({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const { collectionSlug, draft, fields, limit, locale, sort, where } = req.data as {\n collectionSlug: string\n draft?: 'no' | 'yes'\n fields?: string[]\n limit?: number\n locale?: string\n sort?: any\n where?: any\n }\n\n const collection = req.payload.collections[collectionSlug]\n if (!collection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n draft: draft === 'yes',\n limit: limit && limit > 10 ? 10 : limit,\n locale,\n overrideAccess: false,\n req,\n select,\n sort,\n where,\n })\n\n const docs = result.docs\n\n const toCSVFunctions = getCustomFieldFunctions({\n fields: collection.config.fields as FlattenedField[],\n })\n\n const possibleKeys = getFlattenedFieldKeys(collection.config.fields as FlattenedField[])\n\n const transformed = docs.map((doc) => {\n const row = flattenObject({\n doc,\n fields,\n toCSVFunctions,\n })\n\n for (const key of possibleKeys) {\n if (!(key in row)) {\n row[key] = null\n }\n }\n\n return row\n })\n\n return Response.json({\n docs: transformed,\n totalDocs: result.totalDocs,\n })\n },\n method: 'post',\n path: '/preview-data',\n })\n\n /**\n * Merge plugin translations\n */\n const simplifiedTranslations = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n acc[key] = value.translations\n return acc\n },\n {} as Record<string, PluginDefaultTranslationsObject>,\n )\n\n config.i18n = {\n ...config.i18n,\n translations: deepMergeSimple(simplifiedTranslations, config.i18n?.translations ?? {}),\n }\n\n return config\n }\n\ndeclare module 'payload' {\n export interface FieldCustom {\n 'plugin-import-export'?: {\n /**\n * When `true` the field is **completely excluded** from the import-export plugin:\n * - It will not appear in the “Fields to export” selector.\n * - It is hidden from the preview list when no specific fields are chosen.\n * - Its data is omitted from the final CSV / JSON export.\n * @default false\n */\n disabled?: boolean\n toCSV?: ToCSVFunction\n }\n }\n}\n"],"names":["addDataAndFileToRequest","deepMergeSimple","flattenObject","getCreateCollectionExportTask","getCustomFieldFunctions","getSelect","getExportCollection","translations","collectDisabledFieldPaths","getFlattenedFieldKeys","importExportPlugin","pluginConfig","config","exportCollection","collections","push","admin","components","providers","jobs","tasks","collectionsToUpdate","usePluginCollections","length","filter","collection","includes","slug","forEach","listMenuItems","clientProps","exportCollectionSlug","path","disabledFieldAccessors","fields","custom","disabledFields","i18n","endpoints","handler","req","collectionSlug","draft","limit","locale","sort","where","data","payload","Response","json","error","status","select","Array","isArray","undefined","result","find","depth","overrideAccess","docs","toCSVFunctions","possibleKeys","transformed","map","doc","row","key","totalDocs","method","simplifiedTranslations","Object","entries","reduce","acc","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, FlattenedField } from 'payload'\n\nimport { addDataAndFileToRequest, deepMergeSimple } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { ImportExportPluginConfig, ToCSVFunction } from './types.js'\n\nimport { flattenObject } from './export/flattenObject.js'\nimport { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js'\nimport { getCustomFieldFunctions } from './export/getCustomFieldFunctions.js'\nimport { getSelect } from './export/getSelect.js'\nimport { getExportCollection } from './getExportCollection.js'\nimport { translations } from './translations/index.js'\nimport { collectDisabledFieldPaths } from './utilities/collectDisabledFieldPaths.js'\nimport { getFlattenedFieldKeys } from './utilities/getFlattenedFieldKeys.js'\nimport { getValueAtPath } from './utilities/getvalueAtPath.js'\nimport { removeDisabledFields } from './utilities/removeDisabledFields.js'\nimport { setNestedValue } from './utilities/setNestedValue.js'\n\nexport const importExportPlugin =\n (pluginConfig: ImportExportPluginConfig) =>\n (config: Config): Config => {\n const exportCollection = getExportCollection({ config, pluginConfig })\n if (config.collections) {\n config.collections.push(exportCollection)\n } else {\n config.collections = [exportCollection]\n }\n\n // inject custom import export provider\n config.admin = config.admin || {}\n config.admin.components = config.admin.components || {}\n config.admin.components.providers = config.admin.components.providers || []\n config.admin.components.providers.push(\n '@payloadcms/plugin-import-export/rsc#ImportExportProvider',\n )\n\n // inject the createExport job into the config\n ;((config.jobs ??= {}).tasks ??= []).push(getCreateCollectionExportTask(config, pluginConfig))\n\n let collectionsToUpdate = config.collections\n\n const usePluginCollections = pluginConfig.collections && pluginConfig.collections?.length > 0\n\n if (usePluginCollections) {\n collectionsToUpdate = config.collections?.filter((collection) => {\n return pluginConfig.collections?.includes(collection.slug)\n })\n }\n\n collectionsToUpdate.forEach((collection) => {\n if (!collection.admin) {\n collection.admin = { components: { listMenuItems: [] } }\n }\n const components = collection.admin.components || {}\n if (!components.listMenuItems) {\n components.listMenuItems = []\n }\n components.listMenuItems.push({\n clientProps: {\n exportCollectionSlug: exportCollection.slug,\n },\n path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem',\n })\n\n // // Find fields explicitly marked as disabled for import/export\n const disabledFieldAccessors = collectDisabledFieldPaths(collection.fields)\n\n // Store disabled field accessors in the admin config for use in the UI\n collection.admin.custom = {\n ...(collection.admin.custom || {}),\n 'plugin-import-export': {\n ...(collection.admin.custom?.['plugin-import-export'] || {}),\n disabledFields: disabledFieldAccessors,\n },\n }\n\n collection.admin.components = components\n })\n\n if (!config.i18n) {\n config.i18n = {}\n }\n\n // config.i18n.translations = deepMergeSimple(translations, config.i18n?.translations ?? {})\n\n // Inject custom REST endpoints into the config\n config.endpoints = config.endpoints || []\n config.endpoints.push({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const { collectionSlug, draft, fields, limit, locale, sort, where } = req.data as {\n collectionSlug: string\n draft?: 'no' | 'yes'\n fields?: string[]\n format?: 'csv' | 'json'\n limit?: number\n locale?: string\n sort?: any\n where?: any\n }\n\n const collection = req.payload.collections[collectionSlug]\n if (!collection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n draft: draft === 'yes',\n limit: limit && limit > 10 ? 10 : limit,\n locale,\n overrideAccess: false,\n req,\n select,\n sort,\n where,\n })\n\n const isCSV = req?.data?.format === 'csv'\n const docs = result.docs\n\n let transformed: Record<string, unknown>[] = []\n\n if (isCSV) {\n const toCSVFunctions = getCustomFieldFunctions({\n fields: collection.config.fields as FlattenedField[],\n })\n\n const possibleKeys = getFlattenedFieldKeys(collection.config.fields as FlattenedField[])\n\n transformed = docs.map((doc) => {\n const row = flattenObject({\n doc,\n fields,\n toCSVFunctions,\n })\n\n for (const key of possibleKeys) {\n if (!(key in row)) {\n row[key] = null\n }\n }\n\n return row\n })\n } else {\n const disabledFields =\n collection.config.admin.custom?.['plugin-import-export']?.disabledFields\n\n transformed = docs.map((doc) => {\n let output: Record<string, unknown> = { ...doc }\n\n // Remove disabled fields first\n output = removeDisabledFields(output, disabledFields)\n\n // Then trim to selected fields only (if fields are provided)\n if (Array.isArray(fields) && fields.length > 0) {\n const trimmed: Record<string, unknown> = {}\n\n for (const key of fields) {\n const value = getValueAtPath(output, key)\n setNestedValue(trimmed, key, value ?? null)\n }\n\n output = trimmed\n }\n\n return output\n })\n }\n\n return Response.json({\n docs: transformed,\n totalDocs: result.totalDocs,\n })\n },\n method: 'post',\n path: '/preview-data',\n })\n\n /**\n * Merge plugin translations\n */\n const simplifiedTranslations = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n acc[key] = value.translations\n return acc\n },\n {} as Record<string, PluginDefaultTranslationsObject>,\n )\n\n config.i18n = {\n ...config.i18n,\n translations: deepMergeSimple(simplifiedTranslations, config.i18n?.translations ?? {}),\n }\n\n return config\n }\n\ndeclare module 'payload' {\n export interface FieldCustom {\n 'plugin-import-export'?: {\n /**\n * When `true` the field is **completely excluded** from the import-export plugin:\n * - It will not appear in the “Fields to export” selector.\n * - It is hidden from the preview list when no specific fields are chosen.\n * - Its data is omitted from the final CSV / JSON export.\n * @default false\n */\n disabled?: boolean\n /**\n * Custom function used to modify the outgoing csv data by manipulating the data, siblingData or by returning the desired value\n */\n toCSV?: ToCSVFunction\n }\n }\n}\n"],"names":["addDataAndFileToRequest","deepMergeSimple","flattenObject","getCreateCollectionExportTask","getCustomFieldFunctions","getSelect","getExportCollection","translations","collectDisabledFieldPaths","getFlattenedFieldKeys","getValueAtPath","removeDisabledFields","setNestedValue","importExportPlugin","pluginConfig","config","exportCollection","collections","push","admin","components","providers","jobs","tasks","collectionsToUpdate","usePluginCollections","length","filter","collection","includes","slug","forEach","listMenuItems","clientProps","exportCollectionSlug","path","disabledFieldAccessors","fields","custom","disabledFields","i18n","endpoints","handler","req","collectionSlug","draft","limit","locale","sort","where","data","payload","Response","json","error","status","select","Array","isArray","undefined","result","find","depth","overrideAccess","isCSV","format","docs","transformed","toCSVFunctions","possibleKeys","map","doc","row","key","output","trimmed","value","totalDocs","method","simplifiedTranslations","Object","entries","reduce","acc"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFlattenedFieldKeys.d.ts","sourceRoot":"","sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,KAAK,uBAAuB,GACxB;IACE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;IACH,IAAI,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC,GACD,cAAc,CAAA;AAElB,eAAO,MAAM,qBAAqB,WAAY,uBAAuB,EAAE,sBAAgB,MAAM,EA+E5F,CAAA"}
1
+ {"version":3,"file":"getFlattenedFieldKeys.d.ts","sourceRoot":"","sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,KAAK,uBAAuB,GACxB;IACE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;IACH,IAAI,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC,GACD,cAAc,CAAA;AAElB,eAAO,MAAM,qBAAqB,WAAY,uBAAuB,EAAE,sBAAgB,MAAM,EAyE5F,CAAA"}
@@ -2,21 +2,19 @@ export const getFlattenedFieldKeys = (fields, prefix = '')=>{
2
2
  const keys = [];
3
3
  fields.forEach((field)=>{
4
4
  const fieldHasToCSVFunction = 'custom' in field && typeof field.custom === 'object' && 'plugin-import-export' in field.custom && field.custom['plugin-import-export']?.toCSV;
5
- if (!('name' in field) || typeof field.name !== 'string' || fieldHasToCSVFunction) {
6
- return;
7
- }
8
- const name = prefix ? `${prefix}_${field.name}` : field.name;
5
+ const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined;
6
+ const fullKey = name && prefix ? `${prefix}_${name}` : name ?? prefix;
9
7
  switch(field.type){
10
8
  case 'array':
11
9
  {
12
- const subKeys = getFlattenedFieldKeys(field.fields, `${name}_0`);
10
+ const subKeys = getFlattenedFieldKeys(field.fields, `${fullKey}_0`);
13
11
  keys.push(...subKeys);
14
12
  break;
15
13
  }
16
14
  case 'blocks':
17
15
  {
18
16
  field.blocks.forEach((block)=>{
19
- const blockPrefix = `${name}_0_${block.slug}`;
17
+ const blockPrefix = `${fullKey}_0_${block.slug}`;
20
18
  keys.push(`${blockPrefix}_blockType`);
21
19
  keys.push(`${blockPrefix}_id`);
22
20
  keys.push(...getFlattenedFieldKeys(block.fields, blockPrefix));
@@ -26,45 +24,42 @@ export const getFlattenedFieldKeys = (fields, prefix = '')=>{
26
24
  case 'collapsible':
27
25
  case 'group':
28
26
  case 'row':
29
- keys.push(...getFlattenedFieldKeys(field.fields, name));
27
+ keys.push(...getFlattenedFieldKeys(field.fields, fullKey));
30
28
  break;
31
29
  case 'relationship':
32
30
  if (field.hasMany) {
33
31
  if (Array.isArray(field.relationTo)) {
34
32
  // hasMany polymorphic
35
- keys.push(`${name}_0_relationTo`, `${name}_0_id`);
33
+ keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`);
36
34
  } else {
37
35
  // hasMany monomorphic
38
- keys.push(`${name}_0`);
36
+ keys.push(`${fullKey}_0`);
39
37
  }
40
38
  } else {
41
39
  if (Array.isArray(field.relationTo)) {
42
40
  // hasOne polymorphic
43
- keys.push(`${name}_relationTo`, `${name}_id`);
41
+ keys.push(`${fullKey}_relationTo`, `${fullKey}_id`);
44
42
  } else {
45
43
  // hasOne monomorphic
46
- keys.push(name);
44
+ keys.push(fullKey);
47
45
  }
48
46
  }
49
47
  break;
50
48
  case 'tabs':
51
- if (field.tabs) {
52
- field.tabs.forEach((tab)=>{
53
- if (tab.name) {
54
- const tabPrefix = prefix ? `${prefix}_${tab.name}` : tab.name;
55
- keys.push(...getFlattenedFieldKeys(tab.fields, tabPrefix));
56
- } else {
57
- keys.push(...getFlattenedFieldKeys(tab.fields, prefix));
58
- }
59
- });
60
- }
49
+ field.tabs?.forEach((tab)=>{
50
+ const tabPrefix = tab.name ? `${fullKey}_${tab.name}` : fullKey;
51
+ keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix));
52
+ });
61
53
  break;
62
54
  default:
55
+ if (!name || fieldHasToCSVFunction) {
56
+ break;
57
+ }
63
58
  if ('hasMany' in field && field.hasMany) {
64
59
  // Push placeholder for first index
65
- keys.push(`${name}_0`);
60
+ keys.push(`${fullKey}_0`);
66
61
  } else {
67
- keys.push(name);
62
+ keys.push(fullKey);
68
63
  }
69
64
  break;
70
65
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"sourcesContent":["import { type FlattenedField } from 'payload'\n\ntype FieldWithPresentational =\n | {\n fields?: FlattenedField[]\n name?: string\n tabs?: {\n fields: FlattenedField[]\n name?: string\n }[]\n type: 'collapsible' | 'row' | 'tabs'\n }\n | FlattenedField\n\nexport const getFlattenedFieldKeys = (fields: FieldWithPresentational[], prefix = ''): string[] => {\n const keys: string[] = []\n\n fields.forEach((field) => {\n const fieldHasToCSVFunction =\n 'custom' in field &&\n typeof field.custom === 'object' &&\n 'plugin-import-export' in field.custom &&\n field.custom['plugin-import-export']?.toCSV\n\n if (!('name' in field) || typeof field.name !== 'string' || fieldHasToCSVFunction) {\n return\n }\n\n const name = prefix ? `${prefix}_${field.name}` : field.name\n\n switch (field.type) {\n case 'array': {\n const subKeys = getFlattenedFieldKeys(field.fields as FlattenedField[], `${name}_0`)\n keys.push(...subKeys)\n break\n }\n case 'blocks': {\n field.blocks.forEach((block) => {\n const blockPrefix = `${name}_0_${block.slug}`\n keys.push(`${blockPrefix}_blockType`)\n keys.push(`${blockPrefix}_id`)\n keys.push(...getFlattenedFieldKeys(block.fields as FlattenedField[], blockPrefix))\n })\n break\n }\n case 'collapsible':\n case 'group':\n case 'row':\n keys.push(...getFlattenedFieldKeys(field.fields as FlattenedField[], name))\n break\n case 'relationship':\n if (field.hasMany) {\n if (Array.isArray(field.relationTo)) {\n // hasMany polymorphic\n keys.push(`${name}_0_relationTo`, `${name}_0_id`)\n } else {\n // hasMany monomorphic\n keys.push(`${name}_0`)\n }\n } else {\n if (Array.isArray(field.relationTo)) {\n // hasOne polymorphic\n keys.push(`${name}_relationTo`, `${name}_id`)\n } else {\n // hasOne monomorphic\n keys.push(name)\n }\n }\n break\n case 'tabs':\n if (field.tabs) {\n field.tabs.forEach((tab) => {\n if (tab.name) {\n const tabPrefix = prefix ? `${prefix}_${tab.name}` : tab.name\n keys.push(...getFlattenedFieldKeys(tab.fields, tabPrefix))\n } else {\n keys.push(...getFlattenedFieldKeys(tab.fields, prefix))\n }\n })\n }\n break\n default:\n if ('hasMany' in field && field.hasMany) {\n // Push placeholder for first index\n keys.push(`${name}_0`)\n } else {\n keys.push(name)\n }\n break\n }\n })\n\n return keys\n}\n"],"names":["getFlattenedFieldKeys","fields","prefix","keys","forEach","field","fieldHasToCSVFunction","custom","toCSV","name","type","subKeys","push","blocks","block","blockPrefix","slug","hasMany","Array","isArray","relationTo","tabs","tab","tabPrefix"],"mappings":"AAcA,OAAO,MAAMA,wBAAwB,CAACC,QAAmCC,SAAS,EAAE;IAClF,MAAMC,OAAiB,EAAE;IAEzBF,OAAOG,OAAO,CAAC,CAACC;QACd,MAAMC,wBACJ,YAAYD,SACZ,OAAOA,MAAME,MAAM,KAAK,YACxB,0BAA0BF,MAAME,MAAM,IACtCF,MAAME,MAAM,CAAC,uBAAuB,EAAEC;QAExC,IAAI,CAAE,CAAA,UAAUH,KAAI,KAAM,OAAOA,MAAMI,IAAI,KAAK,YAAYH,uBAAuB;YACjF;QACF;QAEA,MAAMG,OAAOP,SAAS,GAAGA,OAAO,CAAC,EAAEG,MAAMI,IAAI,EAAE,GAAGJ,MAAMI,IAAI;QAE5D,OAAQJ,MAAMK,IAAI;YAChB,KAAK;gBAAS;oBACZ,MAAMC,UAAUX,sBAAsBK,MAAMJ,MAAM,EAAsB,GAAGQ,KAAK,EAAE,CAAC;oBACnFN,KAAKS,IAAI,IAAID;oBACb;gBACF;YACA,KAAK;gBAAU;oBACbN,MAAMQ,MAAM,CAACT,OAAO,CAAC,CAACU;wBACpB,MAAMC,cAAc,GAAGN,KAAK,GAAG,EAAEK,MAAME,IAAI,EAAE;wBAC7Cb,KAAKS,IAAI,CAAC,GAAGG,YAAY,UAAU,CAAC;wBACpCZ,KAAKS,IAAI,CAAC,GAAGG,YAAY,GAAG,CAAC;wBAC7BZ,KAAKS,IAAI,IAAIZ,sBAAsBc,MAAMb,MAAM,EAAsBc;oBACvE;oBACA;gBACF;YACA,KAAK;YACL,KAAK;YACL,KAAK;gBACHZ,KAAKS,IAAI,IAAIZ,sBAAsBK,MAAMJ,MAAM,EAAsBQ;gBACrE;YACF,KAAK;gBACH,IAAIJ,MAAMY,OAAO,EAAE;oBACjB,IAAIC,MAAMC,OAAO,CAACd,MAAMe,UAAU,GAAG;wBACnC,sBAAsB;wBACtBjB,KAAKS,IAAI,CAAC,GAAGH,KAAK,aAAa,CAAC,EAAE,GAAGA,KAAK,KAAK,CAAC;oBAClD,OAAO;wBACL,sBAAsB;wBACtBN,KAAKS,IAAI,CAAC,GAAGH,KAAK,EAAE,CAAC;oBACvB;gBACF,OAAO;oBACL,IAAIS,MAAMC,OAAO,CAACd,MAAMe,UAAU,GAAG;wBACnC,qBAAqB;wBACrBjB,KAAKS,IAAI,CAAC,GAAGH,KAAK,WAAW,CAAC,EAAE,GAAGA,KAAK,GAAG,CAAC;oBAC9C,OAAO;wBACL,qBAAqB;wBACrBN,KAAKS,IAAI,CAACH;oBACZ;gBACF;gBACA;YACF,KAAK;gBACH,IAAIJ,MAAMgB,IAAI,EAAE;oBACdhB,MAAMgB,IAAI,CAACjB,OAAO,CAAC,CAACkB;wBAClB,IAAIA,IAAIb,IAAI,EAAE;4BACZ,MAAMc,YAAYrB,SAAS,GAAGA,OAAO,CAAC,EAAEoB,IAAIb,IAAI,EAAE,GAAGa,IAAIb,IAAI;4BAC7DN,KAAKS,IAAI,IAAIZ,sBAAsBsB,IAAIrB,MAAM,EAAEsB;wBACjD,OAAO;4BACLpB,KAAKS,IAAI,IAAIZ,sBAAsBsB,IAAIrB,MAAM,EAAEC;wBACjD;oBACF;gBACF;gBACA;YACF;gBACE,IAAI,aAAaG,SAASA,MAAMY,OAAO,EAAE;oBACvC,mCAAmC;oBACnCd,KAAKS,IAAI,CAAC,GAAGH,KAAK,EAAE,CAAC;gBACvB,OAAO;oBACLN,KAAKS,IAAI,CAACH;gBACZ;gBACA;QACJ;IACF;IAEA,OAAON;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"sourcesContent":["import { type FlattenedField } from 'payload'\n\ntype FieldWithPresentational =\n | {\n fields?: FlattenedField[]\n name?: string\n tabs?: {\n fields: FlattenedField[]\n name?: string\n }[]\n type: 'collapsible' | 'row' | 'tabs'\n }\n | FlattenedField\n\nexport const getFlattenedFieldKeys = (fields: FieldWithPresentational[], prefix = ''): string[] => {\n const keys: string[] = []\n\n fields.forEach((field) => {\n const fieldHasToCSVFunction =\n 'custom' in field &&\n typeof field.custom === 'object' &&\n 'plugin-import-export' in field.custom &&\n field.custom['plugin-import-export']?.toCSV\n\n const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined\n const fullKey = name && prefix ? `${prefix}_${name}` : (name ?? prefix)\n\n switch (field.type) {\n case 'array': {\n const subKeys = getFlattenedFieldKeys(field.fields as FlattenedField[], `${fullKey}_0`)\n keys.push(...subKeys)\n break\n }\n case 'blocks': {\n field.blocks.forEach((block) => {\n const blockPrefix = `${fullKey}_0_${block.slug}`\n keys.push(`${blockPrefix}_blockType`)\n keys.push(`${blockPrefix}_id`)\n keys.push(...getFlattenedFieldKeys(block.fields as FlattenedField[], blockPrefix))\n })\n break\n }\n case 'collapsible':\n case 'group':\n case 'row':\n keys.push(...getFlattenedFieldKeys(field.fields as FlattenedField[], fullKey))\n break\n case 'relationship':\n if (field.hasMany) {\n if (Array.isArray(field.relationTo)) {\n // hasMany polymorphic\n keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`)\n } else {\n // hasMany monomorphic\n keys.push(`${fullKey}_0`)\n }\n } else {\n if (Array.isArray(field.relationTo)) {\n // hasOne polymorphic\n keys.push(`${fullKey}_relationTo`, `${fullKey}_id`)\n } else {\n // hasOne monomorphic\n keys.push(fullKey)\n }\n }\n break\n case 'tabs':\n field.tabs?.forEach((tab) => {\n const tabPrefix = tab.name ? `${fullKey}_${tab.name}` : fullKey\n keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix))\n })\n break\n default:\n if (!name || fieldHasToCSVFunction) {\n break\n }\n if ('hasMany' in field && field.hasMany) {\n // Push placeholder for first index\n keys.push(`${fullKey}_0`)\n } else {\n keys.push(fullKey)\n }\n break\n }\n })\n\n return keys\n}\n"],"names":["getFlattenedFieldKeys","fields","prefix","keys","forEach","field","fieldHasToCSVFunction","custom","toCSV","name","undefined","fullKey","type","subKeys","push","blocks","block","blockPrefix","slug","hasMany","Array","isArray","relationTo","tabs","tab","tabPrefix"],"mappings":"AAcA,OAAO,MAAMA,wBAAwB,CAACC,QAAmCC,SAAS,EAAE;IAClF,MAAMC,OAAiB,EAAE;IAEzBF,OAAOG,OAAO,CAAC,CAACC;QACd,MAAMC,wBACJ,YAAYD,SACZ,OAAOA,MAAME,MAAM,KAAK,YACxB,0BAA0BF,MAAME,MAAM,IACtCF,MAAME,MAAM,CAAC,uBAAuB,EAAEC;QAExC,MAAMC,OAAO,UAAUJ,SAAS,OAAOA,MAAMI,IAAI,KAAK,WAAWJ,MAAMI,IAAI,GAAGC;QAC9E,MAAMC,UAAUF,QAAQP,SAAS,GAAGA,OAAO,CAAC,EAAEO,MAAM,GAAIA,QAAQP;QAEhE,OAAQG,MAAMO,IAAI;YAChB,KAAK;gBAAS;oBACZ,MAAMC,UAAUb,sBAAsBK,MAAMJ,MAAM,EAAsB,GAAGU,QAAQ,EAAE,CAAC;oBACtFR,KAAKW,IAAI,IAAID;oBACb;gBACF;YACA,KAAK;gBAAU;oBACbR,MAAMU,MAAM,CAACX,OAAO,CAAC,CAACY;wBACpB,MAAMC,cAAc,GAAGN,QAAQ,GAAG,EAAEK,MAAME,IAAI,EAAE;wBAChDf,KAAKW,IAAI,CAAC,GAAGG,YAAY,UAAU,CAAC;wBACpCd,KAAKW,IAAI,CAAC,GAAGG,YAAY,GAAG,CAAC;wBAC7Bd,KAAKW,IAAI,IAAId,sBAAsBgB,MAAMf,MAAM,EAAsBgB;oBACvE;oBACA;gBACF;YACA,KAAK;YACL,KAAK;YACL,KAAK;gBACHd,KAAKW,IAAI,IAAId,sBAAsBK,MAAMJ,MAAM,EAAsBU;gBACrE;YACF,KAAK;gBACH,IAAIN,MAAMc,OAAO,EAAE;oBACjB,IAAIC,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,GAAG;wBACnC,sBAAsB;wBACtBnB,KAAKW,IAAI,CAAC,GAAGH,QAAQ,aAAa,CAAC,EAAE,GAAGA,QAAQ,KAAK,CAAC;oBACxD,OAAO;wBACL,sBAAsB;wBACtBR,KAAKW,IAAI,CAAC,GAAGH,QAAQ,EAAE,CAAC;oBAC1B;gBACF,OAAO;oBACL,IAAIS,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,GAAG;wBACnC,qBAAqB;wBACrBnB,KAAKW,IAAI,CAAC,GAAGH,QAAQ,WAAW,CAAC,EAAE,GAAGA,QAAQ,GAAG,CAAC;oBACpD,OAAO;wBACL,qBAAqB;wBACrBR,KAAKW,IAAI,CAACH;oBACZ;gBACF;gBACA;YACF,KAAK;gBACHN,MAAMkB,IAAI,EAAEnB,QAAQ,CAACoB;oBACnB,MAAMC,YAAYD,IAAIf,IAAI,GAAG,GAAGE,QAAQ,CAAC,EAAEa,IAAIf,IAAI,EAAE,GAAGE;oBACxDR,KAAKW,IAAI,IAAId,sBAAsBwB,IAAIvB,MAAM,IAAI,EAAE,EAAEwB;gBACvD;gBACA;YACF;gBACE,IAAI,CAAChB,QAAQH,uBAAuB;oBAClC;gBACF;gBACA,IAAI,aAAaD,SAASA,MAAMc,OAAO,EAAE;oBACvC,mCAAmC;oBACnChB,KAAKW,IAAI,CAAC,GAAGH,QAAQ,EAAE,CAAC;gBAC1B,OAAO;oBACLR,KAAKW,IAAI,CAACH;gBACZ;gBACA;QACJ;IACF;IAEA,OAAOR;AACT,EAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Safely retrieves a deeply nested value from an object using a dot-notation path.
3
+ *
4
+ * Supports:
5
+ * - Indexed array access (e.g., "array.0.field1")
6
+ * - Polymorphic blocks or keyed unions (e.g., "blocks.0.hero.title"), where the block key
7
+ * (e.g., "hero") maps to a nested object inside the block item.
8
+ *
9
+ *
10
+ * @param obj - The input object to traverse.
11
+ * @param path - A dot-separated string representing the path to retrieve.
12
+ * @returns The value at the specified path, or undefined if not found.
13
+ */
14
+ export declare const getValueAtPath: (obj: unknown, path: string) => unknown;
15
+ //# sourceMappingURL=getvalueAtPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getvalueAtPath.d.ts","sourceRoot":"","sources":["../../src/utilities/getvalueAtPath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,QAAS,OAAO,QAAQ,MAAM,KAAG,OA6C3D,CAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Safely retrieves a deeply nested value from an object using a dot-notation path.
3
+ *
4
+ * Supports:
5
+ * - Indexed array access (e.g., "array.0.field1")
6
+ * - Polymorphic blocks or keyed unions (e.g., "blocks.0.hero.title"), where the block key
7
+ * (e.g., "hero") maps to a nested object inside the block item.
8
+ *
9
+ *
10
+ * @param obj - The input object to traverse.
11
+ * @param path - A dot-separated string representing the path to retrieve.
12
+ * @returns The value at the specified path, or undefined if not found.
13
+ */ export const getValueAtPath = (obj, path)=>{
14
+ if (!obj || typeof obj !== 'object') {
15
+ return undefined;
16
+ }
17
+ const parts = path.split('.');
18
+ let current = obj;
19
+ for (const part of parts){
20
+ if (current == null) {
21
+ return undefined;
22
+ }
23
+ // If the path part is a number, treat it as an array index
24
+ if (!isNaN(Number(part))) {
25
+ current = current[Number(part)];
26
+ continue;
27
+ }
28
+ // Special case: if current is an array of blocks like [{ hero: { title: '...' } }]
29
+ // and the path is "blocks.0.hero.title", then `part` would be "hero"
30
+ if (Array.isArray(current)) {
31
+ const idx = Number(parts[parts.indexOf(part) - 1]);
32
+ const blockItem = current[idx];
33
+ if (typeof blockItem === 'object') {
34
+ const keys = Object.keys(blockItem);
35
+ // Find the key (e.g., "hero") that maps to an object
36
+ const matchingBlock = keys.find((key)=>blockItem[key] && typeof blockItem[key] === 'object');
37
+ if (matchingBlock && part === matchingBlock) {
38
+ current = blockItem[matchingBlock];
39
+ continue;
40
+ }
41
+ }
42
+ }
43
+ // Fallback to plain object key access
44
+ current = current[part];
45
+ }
46
+ return current;
47
+ };
48
+
49
+ //# sourceMappingURL=getvalueAtPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getvalueAtPath.ts"],"sourcesContent":["/**\n * Safely retrieves a deeply nested value from an object using a dot-notation path.\n *\n * Supports:\n * - Indexed array access (e.g., \"array.0.field1\")\n * - Polymorphic blocks or keyed unions (e.g., \"blocks.0.hero.title\"), where the block key\n * (e.g., \"hero\") maps to a nested object inside the block item.\n *\n *\n * @param obj - The input object to traverse.\n * @param path - A dot-separated string representing the path to retrieve.\n * @returns The value at the specified path, or undefined if not found.\n */\nexport const getValueAtPath = (obj: unknown, path: string): unknown => {\n if (!obj || typeof obj !== 'object') {\n return undefined\n }\n\n const parts = path.split('.')\n let current: any = obj\n\n for (const part of parts) {\n if (current == null) {\n return undefined\n }\n\n // If the path part is a number, treat it as an array index\n if (!isNaN(Number(part))) {\n current = current[Number(part)]\n continue\n }\n\n // Special case: if current is an array of blocks like [{ hero: { title: '...' } }]\n // and the path is \"blocks.0.hero.title\", then `part` would be \"hero\"\n if (Array.isArray(current)) {\n const idx = Number(parts[parts.indexOf(part) - 1])\n const blockItem = current[idx]\n\n if (typeof blockItem === 'object') {\n const keys = Object.keys(blockItem)\n\n // Find the key (e.g., \"hero\") that maps to an object\n const matchingBlock = keys.find(\n (key) => blockItem[key] && typeof blockItem[key] === 'object',\n )\n\n if (matchingBlock && part === matchingBlock) {\n current = blockItem[matchingBlock]\n continue\n }\n }\n }\n\n // Fallback to plain object key access\n current = current[part]\n }\n\n return current\n}\n"],"names":["getValueAtPath","obj","path","undefined","parts","split","current","part","isNaN","Number","Array","isArray","idx","indexOf","blockItem","keys","Object","matchingBlock","find","key"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMA,iBAAiB,CAACC,KAAcC;IAC3C,IAAI,CAACD,OAAO,OAAOA,QAAQ,UAAU;QACnC,OAAOE;IACT;IAEA,MAAMC,QAAQF,KAAKG,KAAK,CAAC;IACzB,IAAIC,UAAeL;IAEnB,KAAK,MAAMM,QAAQH,MAAO;QACxB,IAAIE,WAAW,MAAM;YACnB,OAAOH;QACT;QAEA,2DAA2D;QAC3D,IAAI,CAACK,MAAMC,OAAOF,QAAQ;YACxBD,UAAUA,OAAO,CAACG,OAAOF,MAAM;YAC/B;QACF;QAEA,mFAAmF;QACnF,qEAAqE;QACrE,IAAIG,MAAMC,OAAO,CAACL,UAAU;YAC1B,MAAMM,MAAMH,OAAOL,KAAK,CAACA,MAAMS,OAAO,CAACN,QAAQ,EAAE;YACjD,MAAMO,YAAYR,OAAO,CAACM,IAAI;YAE9B,IAAI,OAAOE,cAAc,UAAU;gBACjC,MAAMC,OAAOC,OAAOD,IAAI,CAACD;gBAEzB,qDAAqD;gBACrD,MAAMG,gBAAgBF,KAAKG,IAAI,CAC7B,CAACC,MAAQL,SAAS,CAACK,IAAI,IAAI,OAAOL,SAAS,CAACK,IAAI,KAAK;gBAGvD,IAAIF,iBAAiBV,SAASU,eAAe;oBAC3CX,UAAUQ,SAAS,CAACG,cAAc;oBAClC;gBACF;YACF;QACF;QAEA,sCAAsC;QACtCX,UAAUA,OAAO,CAACC,KAAK;IACzB;IAEA,OAAOD;AACT,EAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Recursively removes fields from a deeply nested object based on dot-notation paths.
3
+ *
4
+ * This utility supports removing:
5
+ * - Nested fields in plain objects (e.g., "group.value")
6
+ * - Fields inside arrays of objects (e.g., "group.array.field1")
7
+ *
8
+ * It safely traverses both object and array structures and avoids mutating the original input.
9
+ *
10
+ * @param obj - The original object to clean.
11
+ * @param disabled - An array of dot-separated paths indicating which fields to remove.
12
+ * @returns A deep clone of the original object with specified fields removed.
13
+ */
14
+ export declare const removeDisabledFields: (obj: Record<string, unknown>, disabled?: string[]) => Record<string, unknown>;
15
+ //# sourceMappingURL=removeDisabledFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeDisabledFields.d.ts","sourceRoot":"","sources":["../../src/utilities/removeDisabledFields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,oBAAoB,QAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAClB,MAAM,EAAE,KACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CA8DxB,CAAA"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Recursively removes fields from a deeply nested object based on dot-notation paths.
3
+ *
4
+ * This utility supports removing:
5
+ * - Nested fields in plain objects (e.g., "group.value")
6
+ * - Fields inside arrays of objects (e.g., "group.array.field1")
7
+ *
8
+ * It safely traverses both object and array structures and avoids mutating the original input.
9
+ *
10
+ * @param obj - The original object to clean.
11
+ * @param disabled - An array of dot-separated paths indicating which fields to remove.
12
+ * @returns A deep clone of the original object with specified fields removed.
13
+ */ export const removeDisabledFields = (obj, disabled = [])=>{
14
+ if (!disabled.length) {
15
+ return obj;
16
+ }
17
+ const clone = structuredClone(obj);
18
+ // Process each disabled path independently
19
+ for (const path of disabled){
20
+ const parts = path.split('.');
21
+ /**
22
+ * Recursively walks the object tree according to the dot path,
23
+ * and deletes the field once the full path is reached.
24
+ *
25
+ * @param target - The current object or array being traversed
26
+ * @param i - The index of the current path part
27
+ */ const removeRecursively = (target, i = 0)=>{
28
+ if (target == null) {
29
+ return;
30
+ }
31
+ const key = parts[i];
32
+ // If at the final part of the path, perform the deletion
33
+ if (i === parts.length - 1) {
34
+ // If the current level is an array, delete the key from each item
35
+ if (Array.isArray(target)) {
36
+ for (const item of target){
37
+ if (item && typeof item === 'object' && key !== undefined) {
38
+ delete item[key];
39
+ }
40
+ }
41
+ } else if (typeof target === 'object' && key !== undefined) {
42
+ delete target[key];
43
+ }
44
+ return;
45
+ }
46
+ if (key === undefined) {
47
+ return;
48
+ }
49
+ // Traverse to the next level in the path
50
+ const next = target[key];
51
+ if (Array.isArray(next)) {
52
+ // If the next value is an array, recurse into each item
53
+ for (const item of next){
54
+ removeRecursively(item, i + 1);
55
+ }
56
+ } else {
57
+ // Otherwise, continue down the object path
58
+ removeRecursively(next, i + 1);
59
+ }
60
+ };
61
+ removeRecursively(clone);
62
+ }
63
+ return clone;
64
+ };
65
+
66
+ //# sourceMappingURL=removeDisabledFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/removeDisabledFields.ts"],"sourcesContent":["/**\n * Recursively removes fields from a deeply nested object based on dot-notation paths.\n *\n * This utility supports removing:\n * - Nested fields in plain objects (e.g., \"group.value\")\n * - Fields inside arrays of objects (e.g., \"group.array.field1\")\n *\n * It safely traverses both object and array structures and avoids mutating the original input.\n *\n * @param obj - The original object to clean.\n * @param disabled - An array of dot-separated paths indicating which fields to remove.\n * @returns A deep clone of the original object with specified fields removed.\n */\n\nexport const removeDisabledFields = (\n obj: Record<string, unknown>,\n disabled: string[] = [],\n): Record<string, unknown> => {\n if (!disabled.length) {\n return obj\n }\n\n const clone = structuredClone(obj)\n\n // Process each disabled path independently\n for (const path of disabled) {\n const parts = path.split('.')\n\n /**\n * Recursively walks the object tree according to the dot path,\n * and deletes the field once the full path is reached.\n *\n * @param target - The current object or array being traversed\n * @param i - The index of the current path part\n */\n const removeRecursively = (target: any, i = 0): void => {\n if (target == null) {\n return\n }\n\n const key = parts[i]\n\n // If at the final part of the path, perform the deletion\n if (i === parts.length - 1) {\n // If the current level is an array, delete the key from each item\n if (Array.isArray(target)) {\n for (const item of target) {\n if (item && typeof item === 'object' && key !== undefined) {\n delete item[key as keyof typeof item]\n }\n }\n } else if (typeof target === 'object' && key !== undefined) {\n delete target[key]\n }\n return\n }\n\n if (key === undefined) {\n return\n }\n\n // Traverse to the next level in the path\n const next = target[key]\n\n if (Array.isArray(next)) {\n // If the next value is an array, recurse into each item\n for (const item of next) {\n removeRecursively(item, i + 1)\n }\n } else {\n // Otherwise, continue down the object path\n removeRecursively(next, i + 1)\n }\n }\n\n removeRecursively(clone)\n }\n\n return clone\n}\n"],"names":["removeDisabledFields","obj","disabled","length","clone","structuredClone","path","parts","split","removeRecursively","target","i","key","Array","isArray","item","undefined","next"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GAED,OAAO,MAAMA,uBAAuB,CAClCC,KACAC,WAAqB,EAAE;IAEvB,IAAI,CAACA,SAASC,MAAM,EAAE;QACpB,OAAOF;IACT;IAEA,MAAMG,QAAQC,gBAAgBJ;IAE9B,2CAA2C;IAC3C,KAAK,MAAMK,QAAQJ,SAAU;QAC3B,MAAMK,QAAQD,KAAKE,KAAK,CAAC;QAEzB;;;;;;KAMC,GACD,MAAMC,oBAAoB,CAACC,QAAaC,IAAI,CAAC;YAC3C,IAAID,UAAU,MAAM;gBAClB;YACF;YAEA,MAAME,MAAML,KAAK,CAACI,EAAE;YAEpB,yDAAyD;YACzD,IAAIA,MAAMJ,MAAMJ,MAAM,GAAG,GAAG;gBAC1B,kEAAkE;gBAClE,IAAIU,MAAMC,OAAO,CAACJ,SAAS;oBACzB,KAAK,MAAMK,QAAQL,OAAQ;wBACzB,IAAIK,QAAQ,OAAOA,SAAS,YAAYH,QAAQI,WAAW;4BACzD,OAAOD,IAAI,CAACH,IAAyB;wBACvC;oBACF;gBACF,OAAO,IAAI,OAAOF,WAAW,YAAYE,QAAQI,WAAW;oBAC1D,OAAON,MAAM,CAACE,IAAI;gBACpB;gBACA;YACF;YAEA,IAAIA,QAAQI,WAAW;gBACrB;YACF;YAEA,yCAAyC;YACzC,MAAMC,OAAOP,MAAM,CAACE,IAAI;YAExB,IAAIC,MAAMC,OAAO,CAACG,OAAO;gBACvB,wDAAwD;gBACxD,KAAK,MAAMF,QAAQE,KAAM;oBACvBR,kBAAkBM,MAAMJ,IAAI;gBAC9B;YACF,OAAO;gBACL,2CAA2C;gBAC3CF,kBAAkBQ,MAAMN,IAAI;YAC9B;QACF;QAEAF,kBAAkBL;IACpB;IAEA,OAAOA;AACT,EAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Sets a value deeply into a nested object or array, based on a dot-notation path.
3
+ *
4
+ * This function:
5
+ * - Supports array indexing (e.g., "array.0.field1")
6
+ * - Creates intermediate arrays/objects as needed
7
+ * - Mutates the target object directly
8
+ *
9
+ * @example
10
+ * const obj = {}
11
+ * setNestedValue(obj, 'group.array.0.field1', 'hello')
12
+ * // Result: { group: { array: [ { field1: 'hello' } ] } }
13
+ *
14
+ * @param obj - The target object to mutate.
15
+ * @param path - A dot-separated string path indicating where to assign the value.
16
+ * @param value - The value to set at the specified path.
17
+ */
18
+ export declare const setNestedValue: (obj: Record<string, unknown>, path: string, value: unknown) => void;
19
+ //# sourceMappingURL=setNestedValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setNestedValue.d.ts","sourceRoot":"","sources":["../../src/utilities/setNestedValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,cAAc,QACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,SACL,OAAO,KACb,IA0CF,CAAA"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Sets a value deeply into a nested object or array, based on a dot-notation path.
3
+ *
4
+ * This function:
5
+ * - Supports array indexing (e.g., "array.0.field1")
6
+ * - Creates intermediate arrays/objects as needed
7
+ * - Mutates the target object directly
8
+ *
9
+ * @example
10
+ * const obj = {}
11
+ * setNestedValue(obj, 'group.array.0.field1', 'hello')
12
+ * // Result: { group: { array: [ { field1: 'hello' } ] } }
13
+ *
14
+ * @param obj - The target object to mutate.
15
+ * @param path - A dot-separated string path indicating where to assign the value.
16
+ * @param value - The value to set at the specified path.
17
+ */ export const setNestedValue = (obj, path, value)=>{
18
+ const parts = path.split('.');
19
+ let current = obj;
20
+ for(let i = 0; i < parts.length; i++){
21
+ const part = parts[i];
22
+ const isLast = i === parts.length - 1;
23
+ const isIndex = !Number.isNaN(Number(part));
24
+ if (isIndex) {
25
+ const index = Number(part);
26
+ // Ensure the current target is an array
27
+ if (!Array.isArray(current)) {
28
+ current = [];
29
+ }
30
+ // Ensure the array slot is initialized
31
+ if (!current[index]) {
32
+ current[index] = {};
33
+ }
34
+ if (isLast) {
35
+ current[index] = value;
36
+ } else {
37
+ current = current[index];
38
+ }
39
+ } else {
40
+ // Ensure the object key exists
41
+ if (isLast) {
42
+ if (typeof part === 'string') {
43
+ current[part] = value;
44
+ }
45
+ } else {
46
+ if (typeof current[part] !== 'object' || current[part] === null) {
47
+ current[part] = {};
48
+ }
49
+ current = current[part];
50
+ }
51
+ }
52
+ }
53
+ };
54
+
55
+ //# sourceMappingURL=setNestedValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/setNestedValue.ts"],"sourcesContent":["/**\n * Sets a value deeply into a nested object or array, based on a dot-notation path.\n *\n * This function:\n * - Supports array indexing (e.g., \"array.0.field1\")\n * - Creates intermediate arrays/objects as needed\n * - Mutates the target object directly\n *\n * @example\n * const obj = {}\n * setNestedValue(obj, 'group.array.0.field1', 'hello')\n * // Result: { group: { array: [ { field1: 'hello' } ] } }\n *\n * @param obj - The target object to mutate.\n * @param path - A dot-separated string path indicating where to assign the value.\n * @param value - The value to set at the specified path.\n */\n\nexport const setNestedValue = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void => {\n const parts = path.split('.')\n let current: any = obj\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n const isLast = i === parts.length - 1\n const isIndex = !Number.isNaN(Number(part))\n\n if (isIndex) {\n const index = Number(part)\n\n // Ensure the current target is an array\n if (!Array.isArray(current)) {\n current = []\n }\n\n // Ensure the array slot is initialized\n if (!current[index]) {\n current[index] = {}\n }\n\n if (isLast) {\n current[index] = value\n } else {\n current = current[index] as Record<string, unknown>\n }\n } else {\n // Ensure the object key exists\n if (isLast) {\n if (typeof part === 'string') {\n current[part] = value\n }\n } else {\n if (typeof current[part as string] !== 'object' || current[part as string] === null) {\n current[part as string] = {}\n }\n\n current = current[part as string] as Record<string, unknown>\n }\n }\n }\n}\n"],"names":["setNestedValue","obj","path","value","parts","split","current","i","length","part","isLast","isIndex","Number","isNaN","index","Array","isArray"],"mappings":"AAAA;;;;;;;;;;;;;;;;CAgBC,GAED,OAAO,MAAMA,iBAAiB,CAC5BC,KACAC,MACAC;IAEA,MAAMC,QAAQF,KAAKG,KAAK,CAAC;IACzB,IAAIC,UAAeL;IAEnB,IAAK,IAAIM,IAAI,GAAGA,IAAIH,MAAMI,MAAM,EAAED,IAAK;QACrC,MAAME,OAAOL,KAAK,CAACG,EAAE;QACrB,MAAMG,SAASH,MAAMH,MAAMI,MAAM,GAAG;QACpC,MAAMG,UAAU,CAACC,OAAOC,KAAK,CAACD,OAAOH;QAErC,IAAIE,SAAS;YACX,MAAMG,QAAQF,OAAOH;YAErB,wCAAwC;YACxC,IAAI,CAACM,MAAMC,OAAO,CAACV,UAAU;gBAC3BA,UAAU,EAAE;YACd;YAEA,uCAAuC;YACvC,IAAI,CAACA,OAAO,CAACQ,MAAM,EAAE;gBACnBR,OAAO,CAACQ,MAAM,GAAG,CAAC;YACpB;YAEA,IAAIJ,QAAQ;gBACVJ,OAAO,CAACQ,MAAM,GAAGX;YACnB,OAAO;gBACLG,UAAUA,OAAO,CAACQ,MAAM;YAC1B;QACF,OAAO;YACL,+BAA+B;YAC/B,IAAIJ,QAAQ;gBACV,IAAI,OAAOD,SAAS,UAAU;oBAC5BH,OAAO,CAACG,KAAK,GAAGN;gBAClB;YACF,OAAO;gBACL,IAAI,OAAOG,OAAO,CAACG,KAAe,KAAK,YAAYH,OAAO,CAACG,KAAe,KAAK,MAAM;oBACnFH,OAAO,CAACG,KAAe,GAAG,CAAC;gBAC7B;gBAEAH,UAAUA,OAAO,CAACG,KAAe;YACnC;QACF;IACF;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-import-export",
3
- "version": "3.49.0-canary.6",
3
+ "version": "3.49.0-canary.8",
4
4
  "description": "Import-Export plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -64,17 +64,17 @@
64
64
  "csv-parse": "^5.6.0",
65
65
  "csv-stringify": "^6.5.2",
66
66
  "qs-esm": "7.0.2",
67
- "@payloadcms/translations": "3.49.0-canary.6",
68
- "@payloadcms/ui": "3.49.0-canary.6"
67
+ "@payloadcms/translations": "3.49.0-canary.8",
68
+ "@payloadcms/ui": "3.49.0-canary.8"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@payloadcms/eslint-config": "3.28.0",
72
- "payload": "3.49.0-canary.6",
73
- "@payloadcms/ui": "3.49.0-canary.6"
72
+ "@payloadcms/ui": "3.49.0-canary.8",
73
+ "payload": "3.49.0-canary.8"
74
74
  },
75
75
  "peerDependencies": {
76
- "payload": "3.49.0-canary.6",
77
- "@payloadcms/ui": "3.49.0-canary.6"
76
+ "@payloadcms/ui": "3.49.0-canary.8",
77
+ "payload": "3.49.0-canary.8"
78
78
  },
79
79
  "homepage:": "https://payloadcms.com",
80
80
  "scripts": {