@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.
- package/dist/components/Preview/index.d.ts.map +1 -1
- package/dist/components/Preview/index.js +4 -2
- package/dist/components/Preview/index.js.map +1 -1
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +85 -45
- package/dist/export/createExport.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -15
- package/dist/index.js.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.js +18 -23
- package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
- package/dist/utilities/getvalueAtPath.d.ts +15 -0
- package/dist/utilities/getvalueAtPath.d.ts.map +1 -0
- package/dist/utilities/getvalueAtPath.js +49 -0
- package/dist/utilities/getvalueAtPath.js.map +1 -0
- package/dist/utilities/removeDisabledFields.d.ts +15 -0
- package/dist/utilities/removeDisabledFields.d.ts.map +1 -0
- package/dist/utilities/removeDisabledFields.js +66 -0
- package/dist/utilities/removeDisabledFields.js.map +1 -0
- package/dist/utilities/setNestedValue.d.ts +19 -0
- package/dist/utilities/setNestedValue.d.ts.map +1 -0
- package/dist/utilities/setNestedValue.js +55 -0
- package/dist/utilities/setNestedValue.js.map +1 -0
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,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
|
|
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,
|
|
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
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
fullRow
|
|
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
|
-
|
|
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)=>
|
|
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
|
|
189
|
-
outputData.push(
|
|
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
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
6
|
-
|
|
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, `${
|
|
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 = `${
|
|
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,
|
|
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(`${
|
|
33
|
+
keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`);
|
|
36
34
|
} else {
|
|
37
35
|
// hasMany monomorphic
|
|
38
|
-
keys.push(`${
|
|
36
|
+
keys.push(`${fullKey}_0`);
|
|
39
37
|
}
|
|
40
38
|
} else {
|
|
41
39
|
if (Array.isArray(field.relationTo)) {
|
|
42
40
|
// hasOne polymorphic
|
|
43
|
-
keys.push(`${
|
|
41
|
+
keys.push(`${fullKey}_relationTo`, `${fullKey}_id`);
|
|
44
42
|
} else {
|
|
45
43
|
// hasOne monomorphic
|
|
46
|
-
keys.push(
|
|
44
|
+
keys.push(fullKey);
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
break;
|
|
50
48
|
case 'tabs':
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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(`${
|
|
60
|
+
keys.push(`${fullKey}_0`);
|
|
66
61
|
} else {
|
|
67
|
-
keys.push(
|
|
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
|
|
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.
|
|
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.
|
|
68
|
-
"@payloadcms/ui": "3.49.0-canary.
|
|
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
|
-
"
|
|
73
|
-
"
|
|
72
|
+
"@payloadcms/ui": "3.49.0-canary.8",
|
|
73
|
+
"payload": "3.49.0-canary.8"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
|
-
"
|
|
77
|
-
"
|
|
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": {
|