@payloadcms/plugin-import-export 3.71.0-internal.e36f916 → 3.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js +8 -3
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/ExportListMenuItem/index.d.ts +0 -1
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +0 -1
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.d.ts +4 -0
- package/dist/components/ExportPreview/index.d.ts.map +1 -0
- package/dist/components/ExportPreview/index.js +252 -0
- package/dist/components/ExportPreview/index.js.map +1 -0
- package/dist/components/ExportPreview/index.scss +36 -0
- package/dist/components/ImportCollectionField/index.d.ts +3 -0
- package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
- package/dist/components/ImportCollectionField/index.js +17 -0
- package/dist/components/ImportCollectionField/index.js.map +1 -0
- package/dist/components/ImportListMenuItem/index.d.ts +6 -0
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
- package/dist/components/ImportListMenuItem/index.js +48 -0
- package/dist/components/ImportListMenuItem/index.js.map +1 -0
- package/dist/components/ImportPreview/index.d.ts +4 -0
- package/dist/components/ImportPreview/index.d.ts.map +1 -0
- package/dist/components/ImportPreview/index.js +624 -0
- package/dist/components/ImportPreview/index.js.map +1 -0
- package/dist/components/ImportPreview/index.scss +41 -0
- package/dist/components/ImportSaveButton/index.d.ts +2 -0
- package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
- package/dist/components/ImportSaveButton/index.js +18 -0
- package/dist/components/ImportSaveButton/index.js.map +1 -0
- package/dist/components/Page/index.scss +4 -2
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/export/batchProcessor.d.ts +107 -0
- package/dist/export/batchProcessor.d.ts.map +1 -0
- package/dist/export/batchProcessor.js +187 -0
- package/dist/export/batchProcessor.js.map +1 -0
- package/dist/export/createExport.d.ts +9 -4
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +163 -111
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts +1 -2
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +10 -18
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts +8 -0
- package/dist/export/getExportCollection.d.ts.map +1 -0
- package/dist/export/getExportCollection.js +100 -0
- package/dist/export/getExportCollection.js.map +1 -0
- package/dist/export/getFields.d.ts +8 -2
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +7 -9
- package/dist/export/getFields.js.map +1 -1
- package/dist/export/handleDownload.d.ts +3 -0
- package/dist/export/handleDownload.d.ts.map +1 -0
- package/dist/export/handleDownload.js +42 -0
- package/dist/export/handleDownload.js.map +1 -0
- package/dist/export/handlePreview.d.ts +3 -0
- package/dist/export/handlePreview.d.ts.map +1 -0
- package/dist/export/handlePreview.js +163 -0
- package/dist/export/handlePreview.js.map +1 -0
- package/dist/exports/rsc.d.ts +5 -1
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +5 -1
- package/dist/exports/rsc.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +46 -0
- package/dist/import/batchProcessor.d.ts.map +1 -0
- package/dist/import/batchProcessor.js +529 -0
- package/dist/import/batchProcessor.js.map +1 -0
- package/dist/import/createImport.d.ts +45 -0
- package/dist/import/createImport.d.ts.map +1 -0
- package/dist/import/createImport.js +175 -0
- package/dist/import/createImport.js.map +1 -0
- package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
- package/dist/import/getCreateImportCollectionTask.js +81 -0
- package/dist/import/getCreateImportCollectionTask.js.map +1 -0
- package/dist/import/getFields.d.ts +7 -0
- package/dist/import/getFields.d.ts.map +1 -0
- package/dist/import/getFields.js +150 -0
- package/dist/import/getFields.js.map +1 -0
- package/dist/import/getImportCollection.d.ts +8 -0
- package/dist/import/getImportCollection.d.ts.map +1 -0
- package/dist/import/getImportCollection.js +258 -0
- package/dist/import/getImportCollection.js.map +1 -0
- package/dist/import/handlePreview.d.ts +3 -0
- package/dist/import/handlePreview.d.ts.map +1 -0
- package/dist/import/handlePreview.js +94 -0
- package/dist/import/handlePreview.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -110
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +21 -1
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +21 -1
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +21 -1
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/bnBd.d.ts +4 -0
- package/dist/translations/languages/bnBd.d.ts.map +1 -0
- package/dist/translations/languages/bnBd.js +48 -0
- package/dist/translations/languages/bnBd.js.map +1 -0
- package/dist/translations/languages/bnIn.d.ts +4 -0
- package/dist/translations/languages/bnIn.d.ts.map +1 -0
- package/dist/translations/languages/bnIn.js +48 -0
- package/dist/translations/languages/bnIn.js.map +1 -0
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +21 -1
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +21 -1
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +21 -1
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +21 -1
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +20 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +21 -1
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +21 -1
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +21 -1
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +21 -1
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +21 -1
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +21 -1
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +21 -1
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +21 -1
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +21 -1
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/id.d.ts +4 -0
- package/dist/translations/languages/id.d.ts.map +1 -0
- package/dist/translations/languages/id.js +48 -0
- package/dist/translations/languages/id.js.map +1 -0
- package/dist/translations/languages/is.d.ts.map +1 -1
- package/dist/translations/languages/is.js +21 -1
- package/dist/translations/languages/is.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +21 -1
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +21 -1
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +21 -1
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +21 -1
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +26 -6
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +21 -1
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +21 -1
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +21 -1
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +21 -1
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +21 -1
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +21 -1
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +21 -1
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +21 -1
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +21 -1
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +21 -1
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +21 -1
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +21 -1
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/ta.d.ts.map +1 -1
- package/dist/translations/languages/ta.js +21 -1
- package/dist/translations/languages/ta.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +21 -1
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +21 -1
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +21 -1
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +21 -1
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +21 -1
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +21 -1
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/translations/types.d.ts +13 -0
- package/dist/translations/types.d.ts.map +1 -1
- package/dist/translations/types.js.map +1 -1
- package/dist/types.d.ts +166 -22
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/flattenObject.d.ts +11 -0
- package/dist/utilities/flattenObject.d.ts.map +1 -0
- package/dist/utilities/flattenObject.js +129 -0
- package/dist/utilities/flattenObject.js.map +1 -0
- package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getExportFieldFunctions.js +102 -0
- package/dist/utilities/getExportFieldFunctions.js.map +1 -0
- package/dist/utilities/getFilename.d.ts +6 -0
- package/dist/utilities/getFilename.d.ts.map +1 -0
- package/dist/utilities/getFilename.js +13 -0
- package/dist/utilities/getFilename.js.map +1 -0
- package/dist/utilities/getFlattenedFieldKeys.d.ts +12 -1
- package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.js +35 -10
- package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getImportFieldFunctions.js +130 -0
- package/dist/utilities/getImportFieldFunctions.js.map +1 -0
- package/dist/utilities/getPluginCollections.d.ts +39 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -0
- package/dist/utilities/getPluginCollections.js +102 -0
- package/dist/utilities/getPluginCollections.js.map +1 -0
- package/dist/utilities/getSchemaColumns.d.ts +43 -0
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
- package/dist/utilities/getSchemaColumns.js +163 -0
- package/dist/utilities/getSchemaColumns.js.map +1 -0
- package/dist/utilities/getSelect.d.ts +11 -0
- package/dist/utilities/getSelect.d.ts.map +1 -0
- package/dist/utilities/getSelect.js +27 -0
- package/dist/utilities/getSelect.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts +11 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -0
- package/dist/utilities/parseCSV.js +67 -0
- package/dist/utilities/parseCSV.js.map +1 -0
- package/dist/utilities/parseCSV.spec.js +169 -0
- package/dist/utilities/parseCSV.spec.js.map +1 -0
- package/dist/utilities/parseJSON.d.ts +11 -0
- package/dist/utilities/parseJSON.d.ts.map +1 -0
- package/dist/utilities/parseJSON.js +25 -0
- package/dist/utilities/parseJSON.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts +6 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -0
- package/dist/utilities/processRichTextField.js +45 -0
- package/dist/utilities/processRichTextField.js.map +1 -0
- package/dist/utilities/unflattenObject.d.ts +11 -0
- package/dist/utilities/unflattenObject.d.ts.map +1 -0
- package/dist/utilities/unflattenObject.js +431 -0
- package/dist/utilities/unflattenObject.js.map +1 -0
- package/dist/utilities/unflattenObject.spec.js +680 -0
- package/dist/utilities/unflattenObject.spec.js.map +1 -0
- package/dist/utilities/useBatchProcessor.d.ts +103 -0
- package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
- package/dist/utilities/useBatchProcessor.js +88 -0
- package/dist/utilities/useBatchProcessor.js.map +1 -0
- package/dist/utilities/validateLimitValue.d.ts +1 -1
- package/dist/utilities/validateLimitValue.d.ts.map +1 -1
- package/dist/utilities/validateLimitValue.js +1 -4
- package/dist/utilities/validateLimitValue.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
export const flattenObject = ({ doc, fields, prefix, toCSVFunctions })=>{
|
|
2
|
+
const row = {};
|
|
3
|
+
// Helper to get toCSV function by full path or base field name
|
|
4
|
+
// This allows functions registered for field names (e.g., 'richText') to work
|
|
5
|
+
// even when the field is nested in arrays/blocks (e.g., 'blocks_0_content_richText')
|
|
6
|
+
const getToCSVFunction = (fullPath, baseFieldName)=>{
|
|
7
|
+
return toCSVFunctions?.[fullPath] ?? toCSVFunctions?.[baseFieldName];
|
|
8
|
+
};
|
|
9
|
+
const flatten = (siblingDoc, prefix)=>{
|
|
10
|
+
Object.entries(siblingDoc).forEach(([key, value])=>{
|
|
11
|
+
const newKey = prefix ? `${prefix}_${key}` : key;
|
|
12
|
+
const toCSVFn = getToCSVFunction(newKey, key);
|
|
13
|
+
if (Array.isArray(value)) {
|
|
14
|
+
// If a custom toCSV function exists for this array field, run it first.
|
|
15
|
+
// If it produces output, skip per-item handling; otherwise, fall back.
|
|
16
|
+
if (toCSVFn) {
|
|
17
|
+
try {
|
|
18
|
+
const result = toCSVFn({
|
|
19
|
+
columnName: newKey,
|
|
20
|
+
data: row,
|
|
21
|
+
doc,
|
|
22
|
+
row,
|
|
23
|
+
siblingDoc,
|
|
24
|
+
value
|
|
25
|
+
});
|
|
26
|
+
if (typeof result !== 'undefined') {
|
|
27
|
+
// Custom function returned a single value for this array field.
|
|
28
|
+
row[newKey] = result;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// If the custom function wrote any keys for this field, consider it handled.
|
|
32
|
+
for(const k in row){
|
|
33
|
+
if (k === newKey || k.startsWith(`${newKey}_`)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Otherwise, fall through to per-item handling.
|
|
38
|
+
} catch (error) {
|
|
39
|
+
throw new Error(`Error in toCSVFunction for array "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
value.forEach((item, index)=>{
|
|
43
|
+
if (typeof item === 'object' && item !== null) {
|
|
44
|
+
const blockType = typeof item.blockType === 'string' ? item.blockType : undefined;
|
|
45
|
+
const itemPrefix = blockType ? `${newKey}_${index}_${blockType}` : `${newKey}_${index}`;
|
|
46
|
+
// Case: hasMany polymorphic relationships
|
|
47
|
+
if ('relationTo' in item && 'value' in item && typeof item.value === 'object' && item.value !== null) {
|
|
48
|
+
row[`${itemPrefix}_relationTo`] = item.relationTo;
|
|
49
|
+
row[`${itemPrefix}_id`] = item.value.id;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Fallback: deep-flatten nested objects
|
|
53
|
+
flatten(item, itemPrefix);
|
|
54
|
+
} else {
|
|
55
|
+
// Primitive array item.
|
|
56
|
+
row[`${newKey}_${index}`] = item;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
} else if (typeof value === 'object' && value !== null) {
|
|
60
|
+
// Object field: use custom toCSV if present, else recurse.
|
|
61
|
+
if (!toCSVFn) {
|
|
62
|
+
flatten(value, newKey);
|
|
63
|
+
} else {
|
|
64
|
+
try {
|
|
65
|
+
const result = toCSVFn({
|
|
66
|
+
columnName: newKey,
|
|
67
|
+
data: row,
|
|
68
|
+
doc,
|
|
69
|
+
row,
|
|
70
|
+
siblingDoc,
|
|
71
|
+
value
|
|
72
|
+
});
|
|
73
|
+
if (typeof result !== 'undefined') {
|
|
74
|
+
row[newKey] = result;
|
|
75
|
+
}
|
|
76
|
+
} catch (error) {
|
|
77
|
+
throw new Error(`Error in toCSVFunction for nested object "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
if (toCSVFn) {
|
|
82
|
+
try {
|
|
83
|
+
const result = toCSVFn({
|
|
84
|
+
columnName: newKey,
|
|
85
|
+
data: row,
|
|
86
|
+
doc,
|
|
87
|
+
row,
|
|
88
|
+
siblingDoc,
|
|
89
|
+
value
|
|
90
|
+
});
|
|
91
|
+
if (typeof result !== 'undefined') {
|
|
92
|
+
row[newKey] = result;
|
|
93
|
+
}
|
|
94
|
+
} catch (error) {
|
|
95
|
+
throw new Error(`Error in toCSVFunction for field "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
row[newKey] = value;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
flatten(doc, prefix);
|
|
104
|
+
if (Array.isArray(fields) && fields.length > 0) {
|
|
105
|
+
const orderedResult = {};
|
|
106
|
+
const fieldToRegex = (field)=>{
|
|
107
|
+
const parts = field.split('.').map((part)=>`${part}(?:_\\d+)?`);
|
|
108
|
+
const pattern = `^${parts.join('_')}`;
|
|
109
|
+
return new RegExp(pattern);
|
|
110
|
+
};
|
|
111
|
+
fields.forEach((field)=>{
|
|
112
|
+
if (row[field.replace(/\./g, '_')]) {
|
|
113
|
+
const sanitizedField = field.replace(/\./g, '_');
|
|
114
|
+
orderedResult[sanitizedField] = row[sanitizedField];
|
|
115
|
+
} else {
|
|
116
|
+
const regex = fieldToRegex(field);
|
|
117
|
+
Object.keys(row).forEach((key)=>{
|
|
118
|
+
if (regex.test(key)) {
|
|
119
|
+
orderedResult[key] = row[key];
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return orderedResult;
|
|
125
|
+
}
|
|
126
|
+
return row;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=flattenObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/flattenObject.ts"],"sourcesContent":["import type { Document } from 'payload'\n\nimport type { ToCSVFunction } from '../types.js'\n\ntype Args = {\n doc: Document\n fields?: string[]\n prefix?: string\n toCSVFunctions: Record<string, ToCSVFunction>\n}\n\nexport const flattenObject = ({\n doc,\n fields,\n prefix,\n toCSVFunctions,\n}: Args): Record<string, unknown> => {\n const row: Record<string, unknown> = {}\n\n // Helper to get toCSV function by full path or base field name\n // This allows functions registered for field names (e.g., 'richText') to work\n // even when the field is nested in arrays/blocks (e.g., 'blocks_0_content_richText')\n const getToCSVFunction = (fullPath: string, baseFieldName: string): ToCSVFunction | undefined => {\n return toCSVFunctions?.[fullPath] ?? toCSVFunctions?.[baseFieldName]\n }\n\n const flatten = (siblingDoc: Document, prefix?: string) => {\n Object.entries(siblingDoc).forEach(([key, value]) => {\n const newKey = prefix ? `${prefix}_${key}` : key\n const toCSVFn = getToCSVFunction(newKey, key)\n\n if (Array.isArray(value)) {\n // If a custom toCSV function exists for this array field, run it first.\n // If it produces output, skip per-item handling; otherwise, fall back.\n if (toCSVFn) {\n try {\n const result = toCSVFn({\n columnName: newKey,\n data: row,\n doc,\n row,\n siblingDoc,\n value, // whole array\n })\n\n if (typeof result !== 'undefined') {\n // Custom function returned a single value for this array field.\n row[newKey] = result\n return\n }\n\n // If the custom function wrote any keys for this field, consider it handled.\n for (const k in row) {\n if (k === newKey || k.startsWith(`${newKey}_`)) {\n return\n }\n }\n // Otherwise, fall through to per-item handling.\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for array \"${newKey}\": ${JSON.stringify(value)}\\n${\n (error as Error).message\n }`,\n )\n }\n }\n\n value.forEach((item, index) => {\n if (typeof item === 'object' && item !== null) {\n const blockType = typeof item.blockType === 'string' ? item.blockType : undefined\n const itemPrefix = blockType ? `${newKey}_${index}_${blockType}` : `${newKey}_${index}`\n\n // Case: hasMany polymorphic relationships\n if (\n 'relationTo' in item &&\n 'value' in item &&\n typeof item.value === 'object' &&\n item.value !== null\n ) {\n row[`${itemPrefix}_relationTo`] = item.relationTo\n row[`${itemPrefix}_id`] = item.value.id\n return\n }\n\n // Fallback: deep-flatten nested objects\n flatten(item, itemPrefix)\n } else {\n // Primitive array item.\n row[`${newKey}_${index}`] = item\n }\n })\n } else if (typeof value === 'object' && value !== null) {\n // Object field: use custom toCSV if present, else recurse.\n if (!toCSVFn) {\n flatten(value, newKey)\n } else {\n try {\n const result = toCSVFn({\n columnName: newKey,\n data: row,\n doc,\n row,\n siblingDoc,\n value,\n })\n if (typeof result !== 'undefined') {\n row[newKey] = result\n }\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for nested object \"${newKey}\": ${JSON.stringify(value)}\\n${\n (error as Error).message\n }`,\n )\n }\n }\n } else {\n if (toCSVFn) {\n try {\n const result = toCSVFn({\n columnName: newKey,\n data: row,\n doc,\n row,\n siblingDoc,\n value,\n })\n if (typeof result !== 'undefined') {\n row[newKey] = result\n }\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for field \"${newKey}\": ${JSON.stringify(value)}\\n${\n (error as Error).message\n }`,\n )\n }\n } else {\n row[newKey] = value\n }\n }\n })\n }\n\n flatten(doc, prefix)\n\n if (Array.isArray(fields) && fields.length > 0) {\n const orderedResult: Record<string, unknown> = {}\n\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n const pattern = `^${parts.join('_')}`\n return new RegExp(pattern)\n }\n\n fields.forEach((field) => {\n if (row[field.replace(/\\./g, '_')]) {\n const sanitizedField = field.replace(/\\./g, '_')\n orderedResult[sanitizedField] = row[sanitizedField]\n } else {\n const regex = fieldToRegex(field)\n Object.keys(row).forEach((key) => {\n if (regex.test(key)) {\n orderedResult[key] = row[key]\n }\n })\n }\n })\n\n return orderedResult\n }\n\n return row\n}\n"],"names":["flattenObject","doc","fields","prefix","toCSVFunctions","row","getToCSVFunction","fullPath","baseFieldName","flatten","siblingDoc","Object","entries","forEach","key","value","newKey","toCSVFn","Array","isArray","result","columnName","data","k","startsWith","error","Error","JSON","stringify","message","item","index","blockType","undefined","itemPrefix","relationTo","id","length","orderedResult","fieldToRegex","field","parts","split","map","part","pattern","join","RegExp","replace","sanitizedField","regex","keys","test"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type FlattenedField } from 'payload';
|
|
2
|
+
import type { ToCSVFunction } from '../types.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
fields: FlattenedField[];
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Gets custom toCSV field functions for export.
|
|
8
|
+
* These functions transform field values when flattening documents for CSV export.
|
|
9
|
+
*/
|
|
10
|
+
export declare const getExportFieldFunctions: ({ fields }: Args) => Record<string, ToCSVFunction>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=getExportFieldFunctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getExportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getExportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA+C,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CA6GtF,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { traverseFields } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Gets custom toCSV field functions for export.
|
|
4
|
+
* These functions transform field values when flattening documents for CSV export.
|
|
5
|
+
*/ export const getExportFieldFunctions = ({ fields })=>{
|
|
6
|
+
const result = {};
|
|
7
|
+
const buildCustomFunctions = ({ field, parentRef, ref })=>{
|
|
8
|
+
// @ts-expect-error ref is untyped
|
|
9
|
+
ref.prefix = parentRef.prefix || '';
|
|
10
|
+
if (field.type === 'group' || field.type === 'tab') {
|
|
11
|
+
// @ts-expect-error ref is untyped
|
|
12
|
+
const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : '';
|
|
13
|
+
// @ts-expect-error ref is untyped
|
|
14
|
+
ref.prefix = `${parentPrefix}${field.name}_`;
|
|
15
|
+
}
|
|
16
|
+
if (typeof field.custom?.['plugin-import-export']?.toCSV === 'function') {
|
|
17
|
+
// @ts-expect-error ref is untyped
|
|
18
|
+
result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.toCSV;
|
|
19
|
+
} else if (field.type === 'json' || field.type === 'richText') {
|
|
20
|
+
// Serialize JSON and richText fields as JSON strings in a single column
|
|
21
|
+
// This prevents them from being flattened into multiple columns
|
|
22
|
+
// @ts-expect-error ref is untyped
|
|
23
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
24
|
+
if (value === null || value === undefined) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
if (typeof value === 'object') {
|
|
28
|
+
return JSON.stringify(value);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
};
|
|
32
|
+
} else if (field.type === 'relationship' || field.type === 'upload') {
|
|
33
|
+
if (field.hasMany !== true) {
|
|
34
|
+
if (!Array.isArray(field.relationTo)) {
|
|
35
|
+
// monomorphic single
|
|
36
|
+
// @ts-expect-error ref is untyped
|
|
37
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>typeof value === 'object' && value && 'id' in value ? value.id : value;
|
|
38
|
+
} else {
|
|
39
|
+
// polymorphic single
|
|
40
|
+
// @ts-expect-error ref is untyped
|
|
41
|
+
result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
|
|
42
|
+
if (value && typeof value === 'object' && 'relationTo' in value && 'value' in value) {
|
|
43
|
+
const relationTo = value.relationTo;
|
|
44
|
+
const relatedDoc = value.value;
|
|
45
|
+
if (relatedDoc && typeof relatedDoc === 'object') {
|
|
46
|
+
// @ts-expect-error ref is untyped
|
|
47
|
+
data[`${ref.prefix}${field.name}_id`] = relatedDoc.id;
|
|
48
|
+
// @ts-expect-error ref is untyped
|
|
49
|
+
data[`${ref.prefix}${field.name}_relationTo`] = relationTo;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined // prevents further flattening
|
|
53
|
+
;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
if (!Array.isArray(field.relationTo)) {
|
|
58
|
+
// monomorphic many
|
|
59
|
+
// @ts-expect-error ref is untyped
|
|
60
|
+
result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
|
|
61
|
+
if (Array.isArray(value)) {
|
|
62
|
+
value.forEach((val, i)=>{
|
|
63
|
+
const id = typeof val === 'object' && val ? val.id : val;
|
|
64
|
+
// @ts-expect-error ref is untyped
|
|
65
|
+
data[`${ref.prefix}${field.name}_${i}_id`] = id;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return undefined // prevents further flattening
|
|
69
|
+
;
|
|
70
|
+
};
|
|
71
|
+
} else {
|
|
72
|
+
// polymorphic many
|
|
73
|
+
// @ts-expect-error ref is untyped
|
|
74
|
+
result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
|
|
75
|
+
if (Array.isArray(value)) {
|
|
76
|
+
value.forEach((val, i)=>{
|
|
77
|
+
if (val && typeof val === 'object') {
|
|
78
|
+
const relationTo = val.relationTo;
|
|
79
|
+
const relatedDoc = val.value;
|
|
80
|
+
if (relationTo && relatedDoc && typeof relatedDoc === 'object') {
|
|
81
|
+
// @ts-expect-error ref is untyped
|
|
82
|
+
data[`${ref.prefix}${field.name}_${i}_id`] = relatedDoc.id;
|
|
83
|
+
// @ts-expect-error ref is untyped
|
|
84
|
+
data[`${ref.prefix}${field.name}_${i}_relationTo`] = relationTo;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
traverseFields({
|
|
96
|
+
callback: buildCustomFunctions,
|
|
97
|
+
fields
|
|
98
|
+
});
|
|
99
|
+
return result;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=getExportFieldFunctions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getExportFieldFunctions.ts"],"sourcesContent":["import { type FlattenedField, traverseFields, type TraverseFieldsCallback } from 'payload'\n\nimport type { ToCSVFunction } from '../types.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Gets custom toCSV field functions for export.\n * These functions transform field values when flattening documents for CSV export.\n */\nexport const getExportFieldFunctions = ({ fields }: Args): Record<string, ToCSVFunction> => {\n const result: Record<string, ToCSVFunction> = {}\n\n const buildCustomFunctions: TraverseFieldsCallback = ({ field, parentRef, ref }) => {\n // @ts-expect-error ref is untyped\n ref.prefix = parentRef.prefix || ''\n if (field.type === 'group' || field.type === 'tab') {\n // @ts-expect-error ref is untyped\n const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : ''\n // @ts-expect-error ref is untyped\n ref.prefix = `${parentPrefix}${field.name}_`\n }\n\n if (typeof field.custom?.['plugin-import-export']?.toCSV === 'function') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.toCSV\n } else if (field.type === 'json' || field.type === 'richText') {\n // Serialize JSON and richText fields as JSON strings in a single column\n // This prevents them from being flattened into multiple columns\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (value === null || value === undefined) {\n return value\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return value\n }\n } else if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic single\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) =>\n typeof value === 'object' && value && 'id' in value ? value.id : value\n } else {\n // polymorphic single\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ data, value }) => {\n if (value && typeof value === 'object' && 'relationTo' in value && 'value' in value) {\n const relationTo = (value as { relationTo: string; value: { id: number | string } })\n .relationTo\n const relatedDoc = (value as { relationTo: string; value: { id: number | string } })\n .value\n if (relatedDoc && typeof relatedDoc === 'object') {\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_id`] = relatedDoc.id\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_relationTo`] = relationTo\n }\n }\n return undefined // prevents further flattening\n }\n }\n } else {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic many\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({\n data,\n value,\n }: {\n data: Record<string, unknown>\n value: Array<number | Record<string, any> | string> | undefined\n }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n const id = typeof val === 'object' && val ? val.id : val\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_${i}_id`] = id\n })\n }\n return undefined // prevents further flattening\n }\n } else {\n // polymorphic many\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({\n data,\n value,\n }: {\n data: Record<string, unknown>\n value: Array<Record<string, any>> | undefined\n }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n if (val && typeof val === 'object') {\n const relationTo = val.relationTo\n const relatedDoc = val.value\n if (relationTo && relatedDoc && typeof relatedDoc === 'object') {\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_${i}_id`] = relatedDoc.id\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_${i}_relationTo`] = relationTo\n }\n }\n })\n }\n return undefined\n }\n }\n }\n }\n }\n\n traverseFields({ callback: buildCustomFunctions, fields })\n\n return result\n}\n"],"names":["traverseFields","getExportFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","toCSV","value","undefined","JSON","stringify","hasMany","Array","isArray","relationTo","id","data","relatedDoc","forEach","val","i","callback"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFilename.d.ts","sourceRoot":"","sources":["../../src/utilities/getFilename.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,WAAW,cAMvB,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a filename based on current date and time.
|
|
3
|
+
* Format: "YYYY-MM-DD HH:MM:SS"
|
|
4
|
+
*/ export const getFilename = ()=>{
|
|
5
|
+
const now = new Date();
|
|
6
|
+
const yyymmdd = now.toISOString().split('T')[0] // "YYYY-MM-DD"
|
|
7
|
+
;
|
|
8
|
+
const hhmmss = now.toTimeString().split(' ')[0] // "HH:MM:SS"
|
|
9
|
+
;
|
|
10
|
+
return `${yyymmdd} ${hhmmss}`;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=getFilename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getFilename.ts"],"sourcesContent":["/**\n * Generates a filename based on current date and time.\n * Format: \"YYYY-MM-DD HH:MM:SS\"\n */\nexport const getFilename = () => {\n const now = new Date()\n const yyymmdd = now.toISOString().split('T')[0] // \"YYYY-MM-DD\"\n const hhmmss = now.toTimeString().split(' ')[0] // \"HH:MM:SS\"\n\n return `${yyymmdd} ${hhmmss}`\n}\n"],"names":["getFilename","now","Date","yyymmdd","toISOString","split","hhmmss","toTimeString"],"mappings":"AAAA;;;CAGC,GACD,OAAO,MAAMA,cAAc;IACzB,MAAMC,MAAM,IAAIC;IAChB,MAAMC,UAAUF,IAAIG,WAAW,GAAGC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe;;IAC/D,MAAMC,SAASL,IAAIM,YAAY,GAAGF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa;;IAE7D,OAAO,GAAGF,QAAQ,CAAC,EAAEG,QAAQ;AAC/B,EAAC"}
|
|
@@ -8,6 +8,17 @@ type FieldWithPresentational = {
|
|
|
8
8
|
}[];
|
|
9
9
|
type: 'collapsible' | 'row' | 'tabs';
|
|
10
10
|
} | FlattenedField;
|
|
11
|
-
export
|
|
11
|
+
export type GetFlattenedFieldKeysOptions = {
|
|
12
|
+
/**
|
|
13
|
+
* When provided, localized fields will be expanded to include locale suffixes.
|
|
14
|
+
* e.g., 'title' (localized) -> ['title_en', 'title_es']
|
|
15
|
+
*/
|
|
16
|
+
localeCodes?: string[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Recursively traverses fields and generates flattened CSV column keys.
|
|
20
|
+
* This is schema-based - it derives columns from field definitions, not data.
|
|
21
|
+
*/
|
|
22
|
+
export declare const getFlattenedFieldKeys: (fields: FieldWithPresentational[], prefix?: string, options?: GetFlattenedFieldKeysOptions) => string[];
|
|
12
23
|
export {};
|
|
13
24
|
//# sourceMappingURL=getFlattenedFieldKeys.d.ts.map
|
|
@@ -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,
|
|
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,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,WACxB,uBAAuB,EAAE,6BAExB,4BAA4B,KACpC,MAAM,EAuGR,CAAA"}
|
|
@@ -1,39 +1,64 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Recursively traverses fields and generates flattened CSV column keys.
|
|
3
|
+
* This is schema-based - it derives columns from field definitions, not data.
|
|
4
|
+
*/ export const getFlattenedFieldKeys = (fields, prefix = '', options = {})=>{
|
|
5
|
+
const { localeCodes } = options;
|
|
2
6
|
const keys = [];
|
|
3
7
|
fields.forEach((field)=>{
|
|
4
|
-
|
|
8
|
+
// Skip disabled fields
|
|
9
|
+
const isDisabled = 'custom' in field && typeof field.custom === 'object' && field.custom?.['plugin-import-export']?.disabled === true;
|
|
10
|
+
if (isDisabled) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
5
13
|
const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined;
|
|
6
14
|
const fullKey = name && prefix ? `${prefix}_${name}` : name ?? prefix;
|
|
15
|
+
// Check if field is localized
|
|
16
|
+
const isLocalized = 'localized' in field && field.localized === true;
|
|
17
|
+
// Helper to add keys with locale expansion if needed
|
|
18
|
+
const addKey = (key, fieldIsLocalized)=>{
|
|
19
|
+
if (fieldIsLocalized && localeCodes && localeCodes.length > 0) {
|
|
20
|
+
// Expand to locale-specific keys
|
|
21
|
+
for (const locale of localeCodes){
|
|
22
|
+
keys.push(`${key}_${locale}`);
|
|
23
|
+
}
|
|
24
|
+
} else {
|
|
25
|
+
keys.push(key);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
7
28
|
switch(field.type){
|
|
8
29
|
case 'array':
|
|
9
30
|
{
|
|
10
|
-
const subKeys = getFlattenedFieldKeys(field.fields, `${fullKey}_0
|
|
31
|
+
const subKeys = getFlattenedFieldKeys(field.fields, `${fullKey}_0`, options);
|
|
11
32
|
keys.push(...subKeys);
|
|
12
33
|
break;
|
|
13
34
|
}
|
|
14
35
|
case 'blocks':
|
|
15
36
|
{
|
|
16
37
|
field.blocks.forEach((block)=>{
|
|
38
|
+
if (typeof block === 'string') {
|
|
39
|
+
return; // Skip block references
|
|
40
|
+
}
|
|
17
41
|
const blockPrefix = `${fullKey}_0_${block.slug}`;
|
|
18
42
|
keys.push(`${blockPrefix}_blockType`);
|
|
19
43
|
keys.push(`${blockPrefix}_id`);
|
|
20
|
-
keys.push(...getFlattenedFieldKeys(block.fields, blockPrefix));
|
|
44
|
+
keys.push(...getFlattenedFieldKeys(block.flattenedFields ?? block.fields, blockPrefix, options));
|
|
21
45
|
});
|
|
22
46
|
break;
|
|
23
47
|
}
|
|
24
48
|
case 'collapsible':
|
|
25
49
|
case 'group':
|
|
26
50
|
case 'row':
|
|
27
|
-
keys.push(...getFlattenedFieldKeys(field.fields, fullKey));
|
|
51
|
+
keys.push(...getFlattenedFieldKeys(field.fields, fullKey, options));
|
|
28
52
|
break;
|
|
29
53
|
case 'relationship':
|
|
54
|
+
case 'upload':
|
|
30
55
|
if (field.hasMany) {
|
|
31
56
|
if (Array.isArray(field.relationTo)) {
|
|
32
57
|
// hasMany polymorphic
|
|
33
58
|
keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`);
|
|
34
59
|
} else {
|
|
35
60
|
// hasMany monomorphic
|
|
36
|
-
keys.push(`${fullKey}
|
|
61
|
+
keys.push(`${fullKey}_0`);
|
|
37
62
|
}
|
|
38
63
|
} else {
|
|
39
64
|
if (Array.isArray(field.relationTo)) {
|
|
@@ -41,25 +66,25 @@ export const getFlattenedFieldKeys = (fields, prefix = '')=>{
|
|
|
41
66
|
keys.push(`${fullKey}_relationTo`, `${fullKey}_id`);
|
|
42
67
|
} else {
|
|
43
68
|
// hasOne monomorphic
|
|
44
|
-
|
|
69
|
+
addKey(fullKey, isLocalized);
|
|
45
70
|
}
|
|
46
71
|
}
|
|
47
72
|
break;
|
|
48
73
|
case 'tabs':
|
|
49
74
|
field.tabs?.forEach((tab)=>{
|
|
50
75
|
const tabPrefix = tab.name ? `${fullKey}_${tab.name}` : fullKey;
|
|
51
|
-
keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix));
|
|
76
|
+
keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix, options));
|
|
52
77
|
});
|
|
53
78
|
break;
|
|
54
79
|
default:
|
|
55
|
-
if (!name
|
|
80
|
+
if (!name) {
|
|
56
81
|
break;
|
|
57
82
|
}
|
|
58
83
|
if ('hasMany' in field && field.hasMany) {
|
|
59
84
|
// Push placeholder for first index
|
|
60
85
|
keys.push(`${fullKey}_0`);
|
|
61
86
|
} else {
|
|
62
|
-
|
|
87
|
+
addKey(fullKey, isLocalized);
|
|
63
88
|
}
|
|
64
89
|
break;
|
|
65
90
|
}
|
|
@@ -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[]
|
|
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 type GetFlattenedFieldKeysOptions = {\n /**\n * When provided, localized fields will be expanded to include locale suffixes.\n * e.g., 'title' (localized) -> ['title_en', 'title_es']\n */\n localeCodes?: string[]\n}\n\n/**\n * Recursively traverses fields and generates flattened CSV column keys.\n * This is schema-based - it derives columns from field definitions, not data.\n */\nexport const getFlattenedFieldKeys = (\n fields: FieldWithPresentational[],\n prefix = '',\n options: GetFlattenedFieldKeysOptions = {},\n): string[] => {\n const { localeCodes } = options\n const keys: string[] = []\n\n fields.forEach((field) => {\n // Skip disabled fields\n const isDisabled =\n 'custom' in field &&\n typeof field.custom === 'object' &&\n field.custom?.['plugin-import-export']?.disabled === true\n\n if (isDisabled) {\n return\n }\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 // Check if field is localized\n const isLocalized = 'localized' in field && field.localized === true\n\n // Helper to add keys with locale expansion if needed\n const addKey = (key: string, fieldIsLocalized: boolean) => {\n if (fieldIsLocalized && localeCodes && localeCodes.length > 0) {\n // Expand to locale-specific keys\n for (const locale of localeCodes) {\n keys.push(`${key}_${locale}`)\n }\n } else {\n keys.push(key)\n }\n }\n\n switch (field.type) {\n case 'array': {\n const subKeys = getFlattenedFieldKeys(\n field.fields as FlattenedField[],\n `${fullKey}_0`,\n options,\n )\n keys.push(...subKeys)\n break\n }\n case 'blocks': {\n field.blocks.forEach((block) => {\n if (typeof block === 'string') {\n return // Skip block references\n }\n const blockPrefix = `${fullKey}_0_${block.slug}`\n keys.push(`${blockPrefix}_blockType`)\n keys.push(`${blockPrefix}_id`)\n keys.push(\n ...getFlattenedFieldKeys(block.flattenedFields ?? block.fields, blockPrefix, options),\n )\n })\n break\n }\n case 'collapsible':\n case 'group':\n case 'row':\n keys.push(...getFlattenedFieldKeys(field.fields as FlattenedField[], fullKey, options))\n break\n case 'relationship':\n case 'upload':\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 addKey(fullKey, isLocalized)\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, options))\n })\n break\n default:\n if (!name) {\n break\n }\n if ('hasMany' in field && field.hasMany) {\n // Push placeholder for first index\n keys.push(`${fullKey}_0`)\n } else {\n addKey(fullKey, isLocalized)\n }\n break\n }\n })\n\n return keys\n}\n"],"names":["getFlattenedFieldKeys","fields","prefix","options","localeCodes","keys","forEach","field","isDisabled","custom","disabled","name","undefined","fullKey","isLocalized","localized","addKey","key","fieldIsLocalized","length","locale","push","type","subKeys","blocks","block","blockPrefix","slug","flattenedFields","hasMany","Array","isArray","relationTo","tabs","tab","tabPrefix"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type FlattenedField } from 'payload';
|
|
2
|
+
import type { FromCSVFunction } from '../types.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
fields: FlattenedField[];
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Gets custom fromCSV field functions for import.
|
|
8
|
+
* These functions transform field values when unflattening CSV data for import.
|
|
9
|
+
*/
|
|
10
|
+
export declare const getImportFieldFunctions: ({ fields }: Args) => Record<string, FromCSVFunction>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=getImportFieldFunctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getImportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getImportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA+C,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CA4HxF,CAAA"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { traverseFields } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Gets custom fromCSV field functions for import.
|
|
4
|
+
* These functions transform field values when unflattening CSV data for import.
|
|
5
|
+
*/ export const getImportFieldFunctions = ({ fields })=>{
|
|
6
|
+
const result = {};
|
|
7
|
+
const buildCustomFunctions = ({ field, parentRef, ref })=>{
|
|
8
|
+
// @ts-expect-error ref is untyped
|
|
9
|
+
ref.prefix = parentRef.prefix || '';
|
|
10
|
+
if (field.type === 'group' || field.type === 'tab') {
|
|
11
|
+
// @ts-expect-error ref is untyped
|
|
12
|
+
const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : '';
|
|
13
|
+
// @ts-expect-error ref is untyped
|
|
14
|
+
ref.prefix = `${parentPrefix}${field.name}_`;
|
|
15
|
+
}
|
|
16
|
+
if (typeof field.custom?.['plugin-import-export']?.fromCSV === 'function') {
|
|
17
|
+
// @ts-expect-error ref is untyped
|
|
18
|
+
result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.fromCSV;
|
|
19
|
+
} else if (field.type === 'relationship' || field.type === 'upload') {
|
|
20
|
+
if (field.hasMany !== true) {
|
|
21
|
+
if (!Array.isArray(field.relationTo)) {
|
|
22
|
+
// monomorphic single relationship - simple ID to value conversion
|
|
23
|
+
// @ts-expect-error ref is untyped
|
|
24
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
25
|
+
// If it's already an object (from JSON import), return as-is
|
|
26
|
+
if (typeof value === 'object' && value !== null) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
// Convert string/number ID to relationship value
|
|
30
|
+
return value;
|
|
31
|
+
};
|
|
32
|
+
} else {
|
|
33
|
+
// polymorphic single relationship - needs special handling
|
|
34
|
+
// The CSV has field_id and field_relationTo columns
|
|
35
|
+
// We need to combine them back into { relationTo, value } format
|
|
36
|
+
// This is handled in unflattenObject, so we don't need a fromCSV here
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
if (!Array.isArray(field.relationTo)) {
|
|
40
|
+
// @ts-expect-error ref is untyped
|
|
41
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
42
|
+
// If it's already an array (from JSON import), return as-is
|
|
43
|
+
if (Array.isArray(value)) {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
// For CSV, this is handled by array unflattening in unflattenObject
|
|
47
|
+
return value;
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
// polymorphic many relationships
|
|
51
|
+
// Similar to polymorphic single, handled in unflattenObject
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
} else if (field.type === 'number') {
|
|
55
|
+
// For hasMany number fields, preserve comma-separated strings for later processing
|
|
56
|
+
if (field.hasMany) {
|
|
57
|
+
// Don't convert - let unflattenObject handle comma-separated values
|
|
58
|
+
// @ts-expect-error ref is untyped
|
|
59
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>value;
|
|
60
|
+
} else {
|
|
61
|
+
// Ensure single numbers are parsed correctly from CSV strings
|
|
62
|
+
// @ts-expect-error ref is untyped
|
|
63
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
64
|
+
if (typeof value === 'number') {
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
if (typeof value === 'string') {
|
|
68
|
+
const parsed = parseFloat(value);
|
|
69
|
+
return isNaN(parsed) ? 0 : parsed;
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
} else if (field.type === 'checkbox') {
|
|
75
|
+
// Convert string boolean values to actual booleans
|
|
76
|
+
// @ts-expect-error ref is untyped
|
|
77
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
78
|
+
if (typeof value === 'boolean') {
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
if (typeof value === 'string') {
|
|
82
|
+
return value.toLowerCase() === 'true' || value === '1';
|
|
83
|
+
}
|
|
84
|
+
return Boolean(value);
|
|
85
|
+
};
|
|
86
|
+
} else if (field.type === 'date') {
|
|
87
|
+
// Ensure dates are in proper format
|
|
88
|
+
// @ts-expect-error ref is untyped
|
|
89
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
90
|
+
if (!value) {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
// If it's already a valid date string, return as-is
|
|
94
|
+
if (typeof value === 'string' && !isNaN(Date.parse(value))) {
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
// Try to parse and format
|
|
98
|
+
try {
|
|
99
|
+
const date = new Date(value);
|
|
100
|
+
return isNaN(date.getTime()) ? value : date.toISOString();
|
|
101
|
+
} catch {
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
} else if (field.type === 'json' || field.type === 'richText') {
|
|
106
|
+
// Parse JSON strings back to objects (both json and richText fields)
|
|
107
|
+
// @ts-expect-error ref is untyped
|
|
108
|
+
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
109
|
+
if (typeof value === 'object') {
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
if (typeof value === 'string') {
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(value);
|
|
115
|
+
} catch {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return value;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
traverseFields({
|
|
124
|
+
callback: buildCustomFunctions,
|
|
125
|
+
fields
|
|
126
|
+
});
|
|
127
|
+
return result;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=getImportFieldFunctions.js.map
|