@payloadcms/plugin-import-export 4.0.0-internal.38b7f1d → 4.0.0-internal.3b50481
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 +3 -2
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +14 -12
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.css +52 -0
- package/dist/components/ExportPreview/index.d.ts +1 -1
- package/dist/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js +12 -2
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/FieldsToExport/index.d.ts +3 -2
- package/dist/components/FieldsToExport/index.d.ts.map +1 -1
- package/dist/components/FieldsToExport/index.js +18 -15
- package/dist/components/FieldsToExport/index.js.map +1 -1
- package/dist/components/FieldsToExport/reduceFields.d.ts +6 -0
- package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
- package/dist/components/FieldsToExport/reduceFields.js +4 -0
- package/dist/components/FieldsToExport/reduceFields.js.map +1 -1
- package/dist/components/FormatField/index.d.ts +3 -2
- package/dist/components/FormatField/index.d.ts.map +1 -1
- package/dist/components/FormatField/index.js +6 -3
- package/dist/components/FormatField/index.js.map +1 -1
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ImportListMenuItem/index.js +14 -12
- package/dist/components/ImportListMenuItem/index.js.map +1 -1
- package/dist/components/ImportPreview/index.css +45 -0
- package/dist/components/ImportPreview/index.d.ts +1 -1
- package/dist/components/ImportPreview/index.d.ts.map +1 -1
- package/dist/components/ImportPreview/index.js +44 -11
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/components/LimitField/index.d.ts +3 -2
- package/dist/components/LimitField/index.d.ts.map +1 -1
- package/dist/components/LimitField/index.js.map +1 -1
- package/dist/components/LocaleField/index.d.ts +3 -2
- package/dist/components/LocaleField/index.d.ts.map +1 -1
- package/dist/components/LocaleField/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +4 -3
- package/dist/components/Page/index.d.ts.map +1 -1
- package/dist/components/Page/index.js +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts +7 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.js +3 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.js.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.d.ts +43 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.d.ts.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.js +109 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.js.map +1 -0
- package/dist/components/RelationshipCell/index.css +30 -0
- package/dist/components/RelationshipCell/index.d.ts +15 -0
- package/dist/components/RelationshipCell/index.d.ts.map +1 -0
- package/dist/components/RelationshipCell/index.js +57 -0
- package/dist/components/RelationshipCell/index.js.map +1 -0
- package/dist/components/SortBy/index.css +9 -0
- package/dist/components/SortBy/index.d.ts +4 -3
- package/dist/components/SortBy/index.d.ts.map +1 -1
- package/dist/components/SortBy/index.js +1 -2
- package/dist/components/SortBy/index.js.map +1 -1
- package/dist/components/SortOrder/index.css +9 -0
- package/dist/components/SortOrder/index.d.ts +4 -3
- package/dist/components/SortOrder/index.d.ts.map +1 -1
- package/dist/components/SortOrder/index.js +1 -2
- package/dist/components/SortOrder/index.js.map +1 -1
- package/dist/export/batchProcessor.d.ts +4 -3
- package/dist/export/batchProcessor.d.ts.map +1 -1
- package/dist/export/batchProcessor.js +6 -2
- package/dist/export/batchProcessor.js.map +1 -1
- package/dist/export/createExport.d.ts +4 -2
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +7 -2
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +11 -0
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +9 -4
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/handleDownload.d.ts.map +1 -1
- package/dist/export/handleDownload.js +7 -3
- package/dist/export/handleDownload.js.map +1 -1
- package/dist/export/handlePreview.d.ts.map +1 -1
- package/dist/export/handlePreview.js +25 -6
- package/dist/export/handlePreview.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +4 -3
- package/dist/import/batchProcessor.d.ts.map +1 -1
- package/dist/import/batchProcessor.js +15 -8
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/createImport.d.ts +3 -2
- package/dist/import/createImport.d.ts.map +1 -1
- package/dist/import/createImport.js +9 -2
- package/dist/import/createImport.js.map +1 -1
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
- package/dist/import/getCreateImportCollectionTask.js +5 -2
- package/dist/import/getCreateImportCollectionTask.js.map +1 -1
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +6 -4
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/import/handlePreview.d.ts.map +1 -1
- package/dist/import/handlePreview.js +5 -1
- package/dist/import/handlePreview.js.map +1 -1
- package/dist/index.d.ts +2 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -8
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/types.d.ts +17 -33
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/applyFieldHooks.d.ts +1 -2
- package/dist/utilities/applyFieldHooks.d.ts.map +1 -1
- package/dist/utilities/applyFieldHooks.js +2 -3
- package/dist/utilities/applyFieldHooks.js.map +1 -1
- package/dist/utilities/flattenObject.d.ts.map +1 -1
- package/dist/utilities/flattenObject.js +3 -13
- package/dist/utilities/flattenObject.js.map +1 -1
- package/dist/utilities/flattenedFields.d.ts.map +1 -1
- package/dist/utilities/flattenedFields.js +3 -0
- package/dist/utilities/flattenedFields.js.map +1 -1
- package/dist/utilities/getExportFieldFunctions.js +64 -35
- package/dist/utilities/getExportFieldFunctions.js.map +1 -1
- package/dist/utilities/getFileFromDoc.js +3 -3
- package/dist/utilities/getFileFromDoc.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.js +0 -8
- package/dist/utilities/getImportFieldFunctions.js.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts +1 -1
- package/dist/utilities/getSchemaColumns.js +2 -2
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/getSelect.d.ts.map +1 -1
- package/dist/utilities/getSelect.js +11 -3
- package/dist/utilities/getSelect.js.map +1 -1
- package/dist/utilities/getSubmittedFormValues.d.ts +12 -0
- package/dist/utilities/getSubmittedFormValues.d.ts.map +1 -0
- package/dist/utilities/getSubmittedFormValues.js +24 -0
- package/dist/utilities/getSubmittedFormValues.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -1
- package/dist/utilities/processRichTextField.js +7 -0
- package/dist/utilities/processRichTextField.js.map +1 -1
- package/dist/utilities/setNestedValue.d.ts +2 -1
- package/dist/utilities/setNestedValue.d.ts.map +1 -1
- package/dist/utilities/setNestedValue.js +65 -34
- package/dist/utilities/setNestedValue.js.map +1 -1
- package/dist/utilities/sortHelpers.d.ts +1 -1
- package/dist/utilities/unflattenObject.d.ts.map +1 -1
- package/dist/utilities/unflattenObject.js +29 -18
- package/dist/utilities/unflattenObject.js.map +1 -1
- package/dist/utilities/unflattenPostProcess.d.ts.map +1 -1
- package/dist/utilities/unflattenPostProcess.js +39 -13
- package/dist/utilities/unflattenPostProcess.js.map +1 -1
- package/license.md +1 -1
- package/package.json +10 -10
- package/dist/components/ExportPreview/index.scss +0 -48
- package/dist/components/FieldsToExport/index.scss +0 -0
- package/dist/components/FieldsToExport/reduceFields.spec.js +0 -239
- package/dist/components/FieldsToExport/reduceFields.spec.js.map +0 -1
- package/dist/components/ImportPreview/index.scss +0 -41
- package/dist/components/SortBy/index.scss +0 -3
- package/dist/components/SortOrder/index.scss +0 -3
- package/dist/utilities/applyFieldHooks.spec.js +0 -205
- package/dist/utilities/applyFieldHooks.spec.js.map +0 -1
- package/dist/utilities/buildDisabledFieldRegex.spec.js +0 -64
- package/dist/utilities/buildDisabledFieldRegex.spec.js.map +0 -1
- package/dist/utilities/fieldToRegex.spec.js +0 -151
- package/dist/utilities/fieldToRegex.spec.js.map +0 -1
- package/dist/utilities/filterToSelectedFields.spec.js +0 -204
- package/dist/utilities/filterToSelectedFields.spec.js.map +0 -1
- package/dist/utilities/flattenObject.spec.js +0 -158
- package/dist/utilities/flattenObject.spec.js.map +0 -1
- package/dist/utilities/getExportFieldFunctions.spec.js +0 -50
- package/dist/utilities/getExportFieldFunctions.spec.js.map +0 -1
- package/dist/utilities/getImportFieldFunctions.spec.js +0 -167
- package/dist/utilities/getImportFieldFunctions.spec.js.map +0 -1
- package/dist/utilities/getSchemaColumns.spec.js +0 -157
- package/dist/utilities/getSchemaColumns.spec.js.map +0 -1
- package/dist/utilities/legacyHookDispatch.spec.js +0 -227
- package/dist/utilities/legacyHookDispatch.spec.js.map +0 -1
- package/dist/utilities/parseCSV.spec.js +0 -195
- package/dist/utilities/parseCSV.spec.js.map +0 -1
- package/dist/utilities/siblingDoc.spec.js +0 -278
- package/dist/utilities/siblingDoc.spec.js.map +0 -1
- package/dist/utilities/unflattenObject.spec.js +0 -713
- package/dist/utilities/unflattenObject.spec.js.map +0 -1
- /package/dist/components/Page/{index.scss → index.css} +0 -0
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { getSchemaColumns } from './getSchemaColumns.js';
|
|
3
|
-
function createCollectionConfig(flattenedFields, options) {
|
|
4
|
-
return {
|
|
5
|
-
flattenedFields,
|
|
6
|
-
timestamps: options?.timestamps ?? true,
|
|
7
|
-
trash: options?.trash ?? false,
|
|
8
|
-
versions: options?.versions
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
describe('getSchemaColumns', ()=>{
|
|
12
|
-
describe('fields from flattenedFields', ()=>{
|
|
13
|
-
it('should include all fields present in flattenedFields in their natural order', ()=>{
|
|
14
|
-
const flattenedFields = [
|
|
15
|
-
{
|
|
16
|
-
name: 'id',
|
|
17
|
-
type: 'number'
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'title',
|
|
21
|
-
type: 'text'
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: 'createdAt',
|
|
25
|
-
type: 'date'
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: 'updatedAt',
|
|
29
|
-
type: 'date'
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
const collectionConfig = createCollectionConfig(flattenedFields);
|
|
33
|
-
const result = getSchemaColumns({
|
|
34
|
-
collectionConfig
|
|
35
|
-
});
|
|
36
|
-
expect(result).toEqual([
|
|
37
|
-
'id',
|
|
38
|
-
'title',
|
|
39
|
-
'createdAt',
|
|
40
|
-
'updatedAt'
|
|
41
|
-
]);
|
|
42
|
-
});
|
|
43
|
-
it('should include custom id field when defined in flattenedFields', ()=>{
|
|
44
|
-
const flattenedFields = [
|
|
45
|
-
{
|
|
46
|
-
name: 'id',
|
|
47
|
-
type: 'text'
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: 'title',
|
|
51
|
-
type: 'text'
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
name: 'createdAt',
|
|
55
|
-
type: 'date'
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
name: 'updatedAt',
|
|
59
|
-
type: 'date'
|
|
60
|
-
}
|
|
61
|
-
];
|
|
62
|
-
const collectionConfig = createCollectionConfig(flattenedFields);
|
|
63
|
-
const result = getSchemaColumns({
|
|
64
|
-
collectionConfig
|
|
65
|
-
});
|
|
66
|
-
expect(result).toContain('id');
|
|
67
|
-
});
|
|
68
|
-
it('should not include createdAt or updatedAt when timestamps disabled (not in flattenedFields)', ()=>{
|
|
69
|
-
const flattenedFields = [
|
|
70
|
-
{
|
|
71
|
-
name: 'id',
|
|
72
|
-
type: 'number'
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
name: 'title',
|
|
76
|
-
type: 'text'
|
|
77
|
-
}
|
|
78
|
-
];
|
|
79
|
-
const collectionConfig = createCollectionConfig(flattenedFields, {
|
|
80
|
-
timestamps: false
|
|
81
|
-
});
|
|
82
|
-
const result = getSchemaColumns({
|
|
83
|
-
collectionConfig
|
|
84
|
-
});
|
|
85
|
-
expect(result).toContain('id');
|
|
86
|
-
expect(result).toContain('title');
|
|
87
|
-
expect(result).not.toContain('createdAt');
|
|
88
|
-
expect(result).not.toContain('updatedAt');
|
|
89
|
-
});
|
|
90
|
-
it('should include deletedAt when present in flattenedFields (trash enabled)', ()=>{
|
|
91
|
-
const flattenedFields = [
|
|
92
|
-
{
|
|
93
|
-
name: 'id',
|
|
94
|
-
type: 'number'
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
name: 'title',
|
|
98
|
-
type: 'text'
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
name: 'createdAt',
|
|
102
|
-
type: 'date'
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
name: 'updatedAt',
|
|
106
|
-
type: 'date'
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
name: 'deletedAt',
|
|
110
|
-
type: 'date'
|
|
111
|
-
}
|
|
112
|
-
];
|
|
113
|
-
const collectionConfig = createCollectionConfig(flattenedFields);
|
|
114
|
-
const result = getSchemaColumns({
|
|
115
|
-
collectionConfig
|
|
116
|
-
});
|
|
117
|
-
expect(result).toContain('deletedAt');
|
|
118
|
-
});
|
|
119
|
-
it('should add id when missing from flattenedFields (Payload core limitation)', ()=>{
|
|
120
|
-
const flattenedFields = [
|
|
121
|
-
{
|
|
122
|
-
name: 'title',
|
|
123
|
-
type: 'text'
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
name: 'excerpt',
|
|
127
|
-
type: 'textarea'
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
name: 'createdAt',
|
|
131
|
-
type: 'date'
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
name: 'updatedAt',
|
|
135
|
-
type: 'date'
|
|
136
|
-
}
|
|
137
|
-
];
|
|
138
|
-
const collectionConfig = createCollectionConfig(flattenedFields);
|
|
139
|
-
const result = getSchemaColumns({
|
|
140
|
-
collectionConfig
|
|
141
|
-
});
|
|
142
|
-
// id is added because Payload core doesn't add it to flattenedFields
|
|
143
|
-
// but it exists on every document
|
|
144
|
-
expect(result).toContain('id');
|
|
145
|
-
expect(result[0]).toBe('id');
|
|
146
|
-
expect(result).toEqual([
|
|
147
|
-
'id',
|
|
148
|
-
'title',
|
|
149
|
-
'excerpt',
|
|
150
|
-
'createdAt',
|
|
151
|
-
'updatedAt'
|
|
152
|
-
]);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
//# sourceMappingURL=getSchemaColumns.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getSchemaColumns.spec.ts"],"sourcesContent":["import type { FlattenedField, SanitizedCollectionConfig } from 'payload'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { getSchemaColumns } from './getSchemaColumns.js'\n\nfunction createCollectionConfig(\n flattenedFields: FlattenedField[],\n options?: { timestamps?: boolean; trash?: boolean; versions?: unknown },\n): SanitizedCollectionConfig {\n return {\n flattenedFields,\n timestamps: options?.timestamps ?? true,\n trash: options?.trash ?? false,\n versions: options?.versions,\n } as SanitizedCollectionConfig\n}\n\ndescribe('getSchemaColumns', () => {\n describe('fields from flattenedFields', () => {\n it('should include all fields present in flattenedFields in their natural order', () => {\n const flattenedFields: FlattenedField[] = [\n { name: 'id', type: 'number' },\n { name: 'title', type: 'text' },\n { name: 'createdAt', type: 'date' },\n { name: 'updatedAt', type: 'date' },\n ]\n\n const collectionConfig = createCollectionConfig(flattenedFields)\n const result = getSchemaColumns({ collectionConfig })\n\n expect(result).toEqual(['id', 'title', 'createdAt', 'updatedAt'])\n })\n\n it('should include custom id field when defined in flattenedFields', () => {\n const flattenedFields: FlattenedField[] = [\n { name: 'id', type: 'text' },\n { name: 'title', type: 'text' },\n { name: 'createdAt', type: 'date' },\n { name: 'updatedAt', type: 'date' },\n ]\n\n const collectionConfig = createCollectionConfig(flattenedFields)\n const result = getSchemaColumns({ collectionConfig })\n\n expect(result).toContain('id')\n })\n\n it('should not include createdAt or updatedAt when timestamps disabled (not in flattenedFields)', () => {\n const flattenedFields: FlattenedField[] = [\n { name: 'id', type: 'number' },\n { name: 'title', type: 'text' },\n ]\n\n const collectionConfig = createCollectionConfig(flattenedFields, { timestamps: false })\n const result = getSchemaColumns({ collectionConfig })\n\n expect(result).toContain('id')\n expect(result).toContain('title')\n expect(result).not.toContain('createdAt')\n expect(result).not.toContain('updatedAt')\n })\n\n it('should include deletedAt when present in flattenedFields (trash enabled)', () => {\n const flattenedFields: FlattenedField[] = [\n { name: 'id', type: 'number' },\n { name: 'title', type: 'text' },\n { name: 'createdAt', type: 'date' },\n { name: 'updatedAt', type: 'date' },\n { name: 'deletedAt', type: 'date' },\n ]\n\n const collectionConfig = createCollectionConfig(flattenedFields)\n const result = getSchemaColumns({ collectionConfig })\n\n expect(result).toContain('deletedAt')\n })\n\n it('should add id when missing from flattenedFields (Payload core limitation)', () => {\n const flattenedFields: FlattenedField[] = [\n { name: 'title', type: 'text' },\n { name: 'excerpt', type: 'textarea' },\n { name: 'createdAt', type: 'date' },\n { name: 'updatedAt', type: 'date' },\n ]\n\n const collectionConfig = createCollectionConfig(flattenedFields)\n const result = getSchemaColumns({ collectionConfig })\n\n // id is added because Payload core doesn't add it to flattenedFields\n // but it exists on every document\n expect(result).toContain('id')\n expect(result[0]).toBe('id')\n expect(result).toEqual(['id', 'title', 'excerpt', 'createdAt', 'updatedAt'])\n })\n })\n})\n"],"names":["describe","expect","it","getSchemaColumns","createCollectionConfig","flattenedFields","options","timestamps","trash","versions","name","type","collectionConfig","result","toEqual","toContain","not","toBe"],"mappings":"AAEA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,gBAAgB,QAAQ,wBAAuB;AAExD,SAASC,uBACPC,eAAiC,EACjCC,OAAuE;IAEvE,OAAO;QACLD;QACAE,YAAYD,SAASC,cAAc;QACnCC,OAAOF,SAASE,SAAS;QACzBC,UAAUH,SAASG;IACrB;AACF;AAEAT,SAAS,oBAAoB;IAC3BA,SAAS,+BAA+B;QACtCE,GAAG,+EAA+E;YAChF,MAAMG,kBAAoC;gBACxC;oBAAEK,MAAM;oBAAMC,MAAM;gBAAS;gBAC7B;oBAAED,MAAM;oBAASC,MAAM;gBAAO;gBAC9B;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;gBAClC;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;aACnC;YAED,MAAMC,mBAAmBR,uBAAuBC;YAChD,MAAMQ,SAASV,iBAAiB;gBAAES;YAAiB;YAEnDX,OAAOY,QAAQC,OAAO,CAAC;gBAAC;gBAAM;gBAAS;gBAAa;aAAY;QAClE;QAEAZ,GAAG,kEAAkE;YACnE,MAAMG,kBAAoC;gBACxC;oBAAEK,MAAM;oBAAMC,MAAM;gBAAO;gBAC3B;oBAAED,MAAM;oBAASC,MAAM;gBAAO;gBAC9B;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;gBAClC;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;aACnC;YAED,MAAMC,mBAAmBR,uBAAuBC;YAChD,MAAMQ,SAASV,iBAAiB;gBAAES;YAAiB;YAEnDX,OAAOY,QAAQE,SAAS,CAAC;QAC3B;QAEAb,GAAG,+FAA+F;YAChG,MAAMG,kBAAoC;gBACxC;oBAAEK,MAAM;oBAAMC,MAAM;gBAAS;gBAC7B;oBAAED,MAAM;oBAASC,MAAM;gBAAO;aAC/B;YAED,MAAMC,mBAAmBR,uBAAuBC,iBAAiB;gBAAEE,YAAY;YAAM;YACrF,MAAMM,SAASV,iBAAiB;gBAAES;YAAiB;YAEnDX,OAAOY,QAAQE,SAAS,CAAC;YACzBd,OAAOY,QAAQE,SAAS,CAAC;YACzBd,OAAOY,QAAQG,GAAG,CAACD,SAAS,CAAC;YAC7Bd,OAAOY,QAAQG,GAAG,CAACD,SAAS,CAAC;QAC/B;QAEAb,GAAG,4EAA4E;YAC7E,MAAMG,kBAAoC;gBACxC;oBAAEK,MAAM;oBAAMC,MAAM;gBAAS;gBAC7B;oBAAED,MAAM;oBAASC,MAAM;gBAAO;gBAC9B;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;gBAClC;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;gBAClC;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;aACnC;YAED,MAAMC,mBAAmBR,uBAAuBC;YAChD,MAAMQ,SAASV,iBAAiB;gBAAES;YAAiB;YAEnDX,OAAOY,QAAQE,SAAS,CAAC;QAC3B;QAEAb,GAAG,6EAA6E;YAC9E,MAAMG,kBAAoC;gBACxC;oBAAEK,MAAM;oBAASC,MAAM;gBAAO;gBAC9B;oBAAED,MAAM;oBAAWC,MAAM;gBAAW;gBACpC;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;gBAClC;oBAAED,MAAM;oBAAaC,MAAM;gBAAO;aACnC;YAED,MAAMC,mBAAmBR,uBAAuBC;YAChD,MAAMQ,SAASV,iBAAiB;gBAAES;YAAiB;YAEnD,qEAAqE;YACrE,kCAAkC;YAClCX,OAAOY,QAAQE,SAAS,CAAC;YACzBd,OAAOY,MAAM,CAAC,EAAE,EAAEI,IAAI,CAAC;YACvBhB,OAAOY,QAAQC,OAAO,CAAC;gBAAC;gBAAM;gBAAS;gBAAW;gBAAa;aAAY;QAC7E;IACF;AACF"}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { flattenObject } from './flattenObject.js';
|
|
2
|
-
import { getExportFieldFunctions } from './getExportFieldFunctions.js';
|
|
3
|
-
import { getImportFieldFunctions } from './getImportFieldFunctions.js';
|
|
4
|
-
import { unflattenObject } from './unflattenObject.js';
|
|
5
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
6
|
-
const mockReq = {
|
|
7
|
-
payload: {
|
|
8
|
-
logger: {
|
|
9
|
-
error: vi.fn()
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
describe('legacy toCSV / fromCSV argument shape', ()=>{
|
|
14
|
-
describe('toCSV receives { columnName, data, doc, row, siblingDoc, value }', ()=>{
|
|
15
|
-
it('should pass row as flat row accumulator, doc as top-level doc, and siblingDoc as source doc', ()=>{
|
|
16
|
-
const received = [];
|
|
17
|
-
const fields = [
|
|
18
|
-
{
|
|
19
|
-
name: 'legacy',
|
|
20
|
-
type: 'text',
|
|
21
|
-
custom: {
|
|
22
|
-
'plugin-import-export': {
|
|
23
|
-
toCSV: (args)=>{
|
|
24
|
-
received.push(args);
|
|
25
|
-
args.row[`${args.columnName}_extra`] = 'added';
|
|
26
|
-
return String(args.value) + '_transformed';
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
const exportFieldHooks = getExportFieldFunctions({
|
|
33
|
-
fields
|
|
34
|
-
});
|
|
35
|
-
const doc = {
|
|
36
|
-
legacy: 'hello',
|
|
37
|
-
title: 'Top'
|
|
38
|
-
};
|
|
39
|
-
const result = flattenObject({
|
|
40
|
-
data: doc,
|
|
41
|
-
exportFieldHooks,
|
|
42
|
-
format: 'csv',
|
|
43
|
-
req: mockReq
|
|
44
|
-
});
|
|
45
|
-
expect(received).toHaveLength(1);
|
|
46
|
-
const args = received[0];
|
|
47
|
-
expect(args.columnName).toBe('legacy');
|
|
48
|
-
expect(args.value).toBe('hello');
|
|
49
|
-
// doc should be the top-level document
|
|
50
|
-
expect(args.doc).toBe(doc);
|
|
51
|
-
// siblingDoc should be the source doc at the current nesting level (top-level == doc)
|
|
52
|
-
expect(args.siblingDoc).toBe(doc);
|
|
53
|
-
// row should be the flat row accumulator (a different object from doc)
|
|
54
|
-
expect(args.row).not.toBe(doc);
|
|
55
|
-
// data is kept as alias for row to avoid breaking legacy usage
|
|
56
|
-
expect(args.data).toBe(args.row);
|
|
57
|
-
expect(result.legacy).toBe('hello_transformed');
|
|
58
|
-
expect(result.legacy_extra).toBe('added');
|
|
59
|
-
});
|
|
60
|
-
it('should not pass legacy args to hooks.beforeExport', ()=>{
|
|
61
|
-
const received = [];
|
|
62
|
-
const fields = [
|
|
63
|
-
{
|
|
64
|
-
name: 'modern',
|
|
65
|
-
type: 'text',
|
|
66
|
-
custom: {
|
|
67
|
-
'plugin-import-export': {
|
|
68
|
-
hooks: {
|
|
69
|
-
beforeExport: (args)=>{
|
|
70
|
-
received.push(args);
|
|
71
|
-
return String(args.value) + '_modern';
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
];
|
|
78
|
-
const exportFieldHooks = getExportFieldFunctions({
|
|
79
|
-
fields
|
|
80
|
-
});
|
|
81
|
-
const doc = {
|
|
82
|
-
modern: 'v',
|
|
83
|
-
title: 'Top'
|
|
84
|
-
};
|
|
85
|
-
flattenObject({
|
|
86
|
-
data: doc,
|
|
87
|
-
exportFieldHooks,
|
|
88
|
-
format: 'csv',
|
|
89
|
-
req: mockReq
|
|
90
|
-
});
|
|
91
|
-
expect(received).toHaveLength(1);
|
|
92
|
-
const args = received[0];
|
|
93
|
-
// Modern signature: data === top-level doc
|
|
94
|
-
expect(args.data).toBe(doc);
|
|
95
|
-
// Modern signature: siblingData === flat row accumulator (not source doc)
|
|
96
|
-
expect(args.siblingData).not.toBe(doc);
|
|
97
|
-
expect(args.format).toBe('csv');
|
|
98
|
-
// Legacy-only args should not be present
|
|
99
|
-
expect(args.doc).toBeUndefined();
|
|
100
|
-
expect(args.row).toBeUndefined();
|
|
101
|
-
// `siblingDoc` is part of the modern signature too (read-only source view)
|
|
102
|
-
expect(args.siblingDoc).toBeDefined();
|
|
103
|
-
});
|
|
104
|
-
it('should prefer hooks.beforeExport when both are defined on a field', ()=>{
|
|
105
|
-
const legacyCalls = [];
|
|
106
|
-
const modernCalls = [];
|
|
107
|
-
const fields = [
|
|
108
|
-
{
|
|
109
|
-
name: 'both',
|
|
110
|
-
type: 'text',
|
|
111
|
-
custom: {
|
|
112
|
-
'plugin-import-export': {
|
|
113
|
-
hooks: {
|
|
114
|
-
beforeExport: ({ value })=>{
|
|
115
|
-
modernCalls.push(String(value));
|
|
116
|
-
return `${value}_modern`;
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
toCSV: ({ value })=>{
|
|
120
|
-
legacyCalls.push(String(value));
|
|
121
|
-
return `${value}_legacy`;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
];
|
|
127
|
-
const exportFieldHooks = getExportFieldFunctions({
|
|
128
|
-
fields
|
|
129
|
-
});
|
|
130
|
-
const result = flattenObject({
|
|
131
|
-
data: {
|
|
132
|
-
both: 'x'
|
|
133
|
-
},
|
|
134
|
-
exportFieldHooks,
|
|
135
|
-
format: 'csv',
|
|
136
|
-
req: mockReq
|
|
137
|
-
});
|
|
138
|
-
expect(modernCalls).toEqual([
|
|
139
|
-
'x'
|
|
140
|
-
]);
|
|
141
|
-
expect(legacyCalls).toEqual([]);
|
|
142
|
-
expect(result.both).toBe('x_modern');
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
describe('fromCSV receives { columnName, data, value } with data as full flat row', ()=>{
|
|
146
|
-
it('should pass the full flat row as data', ()=>{
|
|
147
|
-
const received = [];
|
|
148
|
-
const fields = [
|
|
149
|
-
{
|
|
150
|
-
name: 'legacy',
|
|
151
|
-
type: 'text',
|
|
152
|
-
custom: {
|
|
153
|
-
'plugin-import-export': {
|
|
154
|
-
fromCSV: (args)=>{
|
|
155
|
-
received.push(args);
|
|
156
|
-
return String(args.value) + '_imported';
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
];
|
|
162
|
-
const importFieldHooks = getImportFieldFunctions({
|
|
163
|
-
fields
|
|
164
|
-
});
|
|
165
|
-
const flatRow = {
|
|
166
|
-
legacy: 'incoming',
|
|
167
|
-
title: 'Top'
|
|
168
|
-
};
|
|
169
|
-
const result = unflattenObject({
|
|
170
|
-
data: flatRow,
|
|
171
|
-
fields,
|
|
172
|
-
format: 'csv',
|
|
173
|
-
importFieldHooks,
|
|
174
|
-
req: mockReq
|
|
175
|
-
});
|
|
176
|
-
expect(received).toHaveLength(1);
|
|
177
|
-
expect(received[0].columnName).toBe('legacy');
|
|
178
|
-
expect(received[0].value).toBe('incoming');
|
|
179
|
-
// data should be the full flat row
|
|
180
|
-
expect(received[0].data).toBe(flatRow);
|
|
181
|
-
expect(result.legacy).toBe('incoming_imported');
|
|
182
|
-
});
|
|
183
|
-
it('should prefer hooks.beforeImport when both are defined on a field', ()=>{
|
|
184
|
-
const legacyCalls = [];
|
|
185
|
-
const modernCalls = [];
|
|
186
|
-
const fields = [
|
|
187
|
-
{
|
|
188
|
-
name: 'both',
|
|
189
|
-
type: 'text',
|
|
190
|
-
custom: {
|
|
191
|
-
'plugin-import-export': {
|
|
192
|
-
fromCSV: ({ value })=>{
|
|
193
|
-
legacyCalls.push(String(value));
|
|
194
|
-
return `${value}_legacy`;
|
|
195
|
-
},
|
|
196
|
-
hooks: {
|
|
197
|
-
beforeImport: ({ value })=>{
|
|
198
|
-
modernCalls.push(String(value));
|
|
199
|
-
return `${value}_modern`;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
];
|
|
206
|
-
const importFieldHooks = getImportFieldFunctions({
|
|
207
|
-
fields
|
|
208
|
-
});
|
|
209
|
-
const result = unflattenObject({
|
|
210
|
-
data: {
|
|
211
|
-
both: 'x'
|
|
212
|
-
},
|
|
213
|
-
fields,
|
|
214
|
-
format: 'csv',
|
|
215
|
-
importFieldHooks,
|
|
216
|
-
req: mockReq
|
|
217
|
-
});
|
|
218
|
-
expect(modernCalls).toEqual([
|
|
219
|
-
'x'
|
|
220
|
-
]);
|
|
221
|
-
expect(legacyCalls).toEqual([]);
|
|
222
|
-
expect(result.both).toBe('x_modern');
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
//# sourceMappingURL=legacyHookDispatch.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/legacyHookDispatch.spec.ts"],"sourcesContent":["import { FlattenedField, PayloadRequest } from 'payload'\n\nimport type { FromCSVFunction, ToCSVFunction } from '../types.js'\n\nimport { flattenObject } from './flattenObject.js'\nimport { getExportFieldFunctions } from './getExportFieldFunctions.js'\nimport { getImportFieldFunctions } from './getImportFieldFunctions.js'\nimport { unflattenObject } from './unflattenObject.js'\n\nimport { describe, expect, it, vi } from 'vitest'\n\nconst mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n} as unknown as PayloadRequest\n\ndescribe('legacy toCSV / fromCSV argument shape', () => {\n describe('toCSV receives { columnName, data, doc, row, siblingDoc, value }', () => {\n it('should pass row as flat row accumulator, doc as top-level doc, and siblingDoc as source doc', () => {\n const received: Parameters<ToCSVFunction>[0][] = []\n\n const fields: FlattenedField[] = [\n {\n name: 'legacy',\n type: 'text',\n custom: {\n 'plugin-import-export': {\n toCSV: ((args) => {\n received.push(args)\n args.row[`${args.columnName}_extra`] = 'added'\n return String(args.value) + '_transformed'\n }) satisfies ToCSVFunction,\n },\n },\n } as FlattenedField,\n ]\n\n const exportFieldHooks = getExportFieldFunctions({ fields })\n\n const doc = { legacy: 'hello', title: 'Top' }\n const result = flattenObject({\n data: doc,\n exportFieldHooks,\n format: 'csv',\n req: mockReq,\n })\n\n expect(received).toHaveLength(1)\n const args = received[0]!\n expect(args.columnName).toBe('legacy')\n expect(args.value).toBe('hello')\n // doc should be the top-level document\n expect(args.doc).toBe(doc)\n // siblingDoc should be the source doc at the current nesting level (top-level == doc)\n expect(args.siblingDoc).toBe(doc)\n // row should be the flat row accumulator (a different object from doc)\n expect(args.row).not.toBe(doc)\n // data is kept as alias for row to avoid breaking legacy usage\n expect(args.data).toBe(args.row)\n\n expect(result.legacy).toBe('hello_transformed')\n expect(result.legacy_extra).toBe('added')\n })\n\n it('should not pass legacy args to hooks.beforeExport', () => {\n const received: Array<Record<string, unknown>> = []\n\n const fields: FlattenedField[] = [\n {\n name: 'modern',\n type: 'text',\n custom: {\n 'plugin-import-export': {\n hooks: {\n beforeExport: (args) => {\n received.push(args as unknown as Record<string, unknown>)\n return String(args.value) + '_modern'\n },\n },\n },\n },\n } as FlattenedField,\n ]\n\n const exportFieldHooks = getExportFieldFunctions({ fields })\n\n const doc = { modern: 'v', title: 'Top' }\n flattenObject({ data: doc, exportFieldHooks, format: 'csv', req: mockReq })\n\n expect(received).toHaveLength(1)\n const args = received[0]!\n // Modern signature: data === top-level doc\n expect(args.data).toBe(doc)\n // Modern signature: siblingData === flat row accumulator (not source doc)\n expect(args.siblingData).not.toBe(doc)\n expect(args.format).toBe('csv')\n // Legacy-only args should not be present\n expect(args.doc).toBeUndefined()\n expect(args.row).toBeUndefined()\n // `siblingDoc` is part of the modern signature too (read-only source view)\n expect(args.siblingDoc).toBeDefined()\n })\n\n it('should prefer hooks.beforeExport when both are defined on a field', () => {\n const legacyCalls: string[] = []\n const modernCalls: string[] = []\n\n const fields: FlattenedField[] = [\n {\n name: 'both',\n type: 'text',\n custom: {\n 'plugin-import-export': {\n hooks: {\n beforeExport: ({ value }) => {\n modernCalls.push(String(value))\n return `${value}_modern`\n },\n },\n toCSV: ({ value }: { value: unknown }) => {\n legacyCalls.push(String(value))\n return `${value}_legacy`\n },\n },\n },\n } as FlattenedField,\n ]\n\n const exportFieldHooks = getExportFieldFunctions({ fields })\n const result = flattenObject({\n data: { both: 'x' },\n exportFieldHooks,\n format: 'csv',\n req: mockReq,\n })\n\n expect(modernCalls).toEqual(['x'])\n expect(legacyCalls).toEqual([])\n expect(result.both).toBe('x_modern')\n })\n })\n\n describe('fromCSV receives { columnName, data, value } with data as full flat row', () => {\n it('should pass the full flat row as data', () => {\n const received: Parameters<FromCSVFunction>[0][] = []\n\n const fields: FlattenedField[] = [\n {\n name: 'legacy',\n type: 'text',\n custom: {\n 'plugin-import-export': {\n fromCSV: ((args) => {\n received.push(args)\n return String(args.value) + '_imported'\n }) satisfies FromCSVFunction,\n },\n },\n } as FlattenedField,\n ]\n\n const importFieldHooks = getImportFieldFunctions({ fields })\n\n const flatRow = { legacy: 'incoming', title: 'Top' }\n const result = unflattenObject({\n data: flatRow,\n fields,\n format: 'csv',\n importFieldHooks,\n req: mockReq,\n })\n\n expect(received).toHaveLength(1)\n expect(received[0]!.columnName).toBe('legacy')\n expect(received[0]!.value).toBe('incoming')\n // data should be the full flat row\n expect(received[0]!.data).toBe(flatRow)\n\n expect(result.legacy).toBe('incoming_imported')\n })\n\n it('should prefer hooks.beforeImport when both are defined on a field', () => {\n const legacyCalls: string[] = []\n const modernCalls: string[] = []\n\n const fields: FlattenedField[] = [\n {\n name: 'both',\n type: 'text',\n custom: {\n 'plugin-import-export': {\n fromCSV: ({ value }: { value: unknown }) => {\n legacyCalls.push(String(value))\n return `${value}_legacy`\n },\n hooks: {\n beforeImport: ({ value }) => {\n modernCalls.push(String(value))\n return `${value}_modern`\n },\n },\n },\n },\n } as FlattenedField,\n ]\n\n const importFieldHooks = getImportFieldFunctions({ fields })\n const result = unflattenObject({\n data: { both: 'x' },\n fields,\n format: 'csv',\n importFieldHooks,\n req: mockReq,\n })\n\n expect(modernCalls).toEqual(['x'])\n expect(legacyCalls).toEqual([])\n expect(result.both).toBe('x_modern')\n })\n })\n})\n"],"names":["flattenObject","getExportFieldFunctions","getImportFieldFunctions","unflattenObject","describe","expect","it","vi","mockReq","payload","logger","error","fn","received","fields","name","type","custom","toCSV","args","push","row","columnName","String","value","exportFieldHooks","doc","legacy","title","result","data","format","req","toHaveLength","toBe","siblingDoc","not","legacy_extra","hooks","beforeExport","modern","siblingData","toBeUndefined","toBeDefined","legacyCalls","modernCalls","both","toEqual","fromCSV","importFieldHooks","flatRow","beforeImport"],"mappings":"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"}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { parseCSV } from './parseCSV.js';
|
|
2
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
3
|
-
describe('parseCSV', ()=>{
|
|
4
|
-
const mockReq = {
|
|
5
|
-
payload: {
|
|
6
|
-
logger: {
|
|
7
|
-
error: vi.fn()
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
describe('cast function behavior', ()=>{
|
|
12
|
-
it('should preserve comma-separated values as strings', async ()=>{
|
|
13
|
-
const csvData = Buffer.from('numbers,ids\n"1,2,3,5,8","id1,id2,id3"');
|
|
14
|
-
const result = await parseCSV({
|
|
15
|
-
data: csvData,
|
|
16
|
-
req: mockReq
|
|
17
|
-
});
|
|
18
|
-
expect(result).toEqual([
|
|
19
|
-
{
|
|
20
|
-
numbers: '1,2,3,5,8',
|
|
21
|
-
ids: 'id1,id2,id3'
|
|
22
|
-
}
|
|
23
|
-
]);
|
|
24
|
-
});
|
|
25
|
-
it('should convert single numbers to numbers', async ()=>{
|
|
26
|
-
const csvData = Buffer.from('single,decimal\n"42","3.14"');
|
|
27
|
-
const result = await parseCSV({
|
|
28
|
-
data: csvData,
|
|
29
|
-
req: mockReq
|
|
30
|
-
});
|
|
31
|
-
expect(result).toEqual([
|
|
32
|
-
{
|
|
33
|
-
single: 42,
|
|
34
|
-
decimal: 3.14
|
|
35
|
-
}
|
|
36
|
-
]);
|
|
37
|
-
});
|
|
38
|
-
it('should handle booleans correctly', async ()=>{
|
|
39
|
-
const csvData = Buffer.from('bool1,bool2,notBool\n"true","false","True"');
|
|
40
|
-
const result = await parseCSV({
|
|
41
|
-
data: csvData,
|
|
42
|
-
req: mockReq
|
|
43
|
-
});
|
|
44
|
-
expect(result).toEqual([
|
|
45
|
-
{
|
|
46
|
-
bool1: true,
|
|
47
|
-
bool2: false,
|
|
48
|
-
notBool: 'True'
|
|
49
|
-
}
|
|
50
|
-
]);
|
|
51
|
-
});
|
|
52
|
-
it('should convert empty strings to undefined', async ()=>{
|
|
53
|
-
const csvData = Buffer.from('field1,field2\n"","value"');
|
|
54
|
-
const result = await parseCSV({
|
|
55
|
-
data: csvData,
|
|
56
|
-
req: mockReq
|
|
57
|
-
});
|
|
58
|
-
expect(result).toEqual([
|
|
59
|
-
{
|
|
60
|
-
// field1 is undefined (not present) - empty cells don't update fields
|
|
61
|
-
field2: 'value'
|
|
62
|
-
}
|
|
63
|
-
]);
|
|
64
|
-
});
|
|
65
|
-
it('should handle null strings', async ()=>{
|
|
66
|
-
const csvData = Buffer.from('field1,field2,field3\n"null","NULL","Null"');
|
|
67
|
-
const result = await parseCSV({
|
|
68
|
-
data: csvData,
|
|
69
|
-
req: mockReq
|
|
70
|
-
});
|
|
71
|
-
expect(result).toEqual([
|
|
72
|
-
{
|
|
73
|
-
field1: null,
|
|
74
|
-
field2: null,
|
|
75
|
-
field3: 'Null'
|
|
76
|
-
}
|
|
77
|
-
]);
|
|
78
|
-
});
|
|
79
|
-
it('should preserve spaces in comma-separated values', async ()=>{
|
|
80
|
-
const csvData = Buffer.from('numbers\n" 10 , 20 , 30 "');
|
|
81
|
-
const result = await parseCSV({
|
|
82
|
-
data: csvData,
|
|
83
|
-
req: mockReq
|
|
84
|
-
});
|
|
85
|
-
expect(result).toEqual([
|
|
86
|
-
{
|
|
87
|
-
numbers: ' 10 , 20 , 30 '
|
|
88
|
-
}
|
|
89
|
-
]);
|
|
90
|
-
});
|
|
91
|
-
it('should handle mixed comma-separated values with empty entries', async ()=>{
|
|
92
|
-
const csvData = Buffer.from('mixed\n"1,,3,,5"');
|
|
93
|
-
const result = await parseCSV({
|
|
94
|
-
data: csvData,
|
|
95
|
-
req: mockReq
|
|
96
|
-
});
|
|
97
|
-
expect(result).toEqual([
|
|
98
|
-
{
|
|
99
|
-
mixed: '1,,3,,5'
|
|
100
|
-
}
|
|
101
|
-
]);
|
|
102
|
-
});
|
|
103
|
-
it('should handle MongoDB ObjectIds as strings', async ()=>{
|
|
104
|
-
const csvData = Buffer.from('id\n"507f1f77bcf86cd799439011"');
|
|
105
|
-
const result = await parseCSV({
|
|
106
|
-
data: csvData,
|
|
107
|
-
req: mockReq
|
|
108
|
-
});
|
|
109
|
-
expect(result).toEqual([
|
|
110
|
-
{
|
|
111
|
-
id: '507f1f77bcf86cd799439011'
|
|
112
|
-
}
|
|
113
|
-
]);
|
|
114
|
-
});
|
|
115
|
-
it('should handle multiple rows with various data types', async ()=>{
|
|
116
|
-
const csvData = Buffer.from('title,count,tags,active\n' + '"Item 1","5","tag1,tag2,tag3","true"\n' + '"Item 2","","","false"\n' + '"Item 3","10","single",""\n');
|
|
117
|
-
const result = await parseCSV({
|
|
118
|
-
data: csvData,
|
|
119
|
-
req: mockReq
|
|
120
|
-
});
|
|
121
|
-
expect(result).toEqual([
|
|
122
|
-
{
|
|
123
|
-
title: 'Item 1',
|
|
124
|
-
count: 5,
|
|
125
|
-
tags: 'tag1,tag2,tag3',
|
|
126
|
-
active: true
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
title: 'Item 2',
|
|
130
|
-
// count is undefined (empty cell - field not updated)
|
|
131
|
-
// tags is undefined (empty cell - field not updated)
|
|
132
|
-
active: false
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
title: 'Item 3',
|
|
136
|
-
count: 10,
|
|
137
|
-
tags: 'single'
|
|
138
|
-
}
|
|
139
|
-
]);
|
|
140
|
-
});
|
|
141
|
-
it('should skip empty lines', async ()=>{
|
|
142
|
-
const csvData = Buffer.from('field\n"value1"\n\n"value2"\n\n');
|
|
143
|
-
const result = await parseCSV({
|
|
144
|
-
data: csvData,
|
|
145
|
-
req: mockReq
|
|
146
|
-
});
|
|
147
|
-
expect(result).toEqual([
|
|
148
|
-
{
|
|
149
|
-
field: 'value1'
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
field: 'value2'
|
|
153
|
-
}
|
|
154
|
-
]);
|
|
155
|
-
});
|
|
156
|
-
it('should strip UTF-8 BOM from column names', async ()=>{
|
|
157
|
-
// UTF-8 BOM is 0xEF 0xBB 0xBF
|
|
158
|
-
const bomBytes = Buffer.from([
|
|
159
|
-
0xef,
|
|
160
|
-
0xbb,
|
|
161
|
-
0xbf
|
|
162
|
-
]);
|
|
163
|
-
const csvContent = Buffer.from('id,title,createdAt\ntesssst,test,2026-02-11T21:03:39.020Z');
|
|
164
|
-
const csvWithBOM = Buffer.concat([
|
|
165
|
-
bomBytes,
|
|
166
|
-
csvContent
|
|
167
|
-
]);
|
|
168
|
-
const result = await parseCSV({
|
|
169
|
-
data: csvWithBOM,
|
|
170
|
-
req: mockReq
|
|
171
|
-
});
|
|
172
|
-
expect(result).toEqual([
|
|
173
|
-
{
|
|
174
|
-
id: 'tesssst',
|
|
175
|
-
title: 'test',
|
|
176
|
-
createdAt: '2026-02-11T21:03:39.020Z'
|
|
177
|
-
}
|
|
178
|
-
]);
|
|
179
|
-
// Verify the column name is exactly "id" without BOM character
|
|
180
|
-
expect(Object.keys(result[0])[0]).toBe('id');
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
describe('error handling', ()=>{
|
|
184
|
-
it('should handle parsing errors', async ()=>{
|
|
185
|
-
const invalidCsv = Buffer.from('field1,field2\n"value1');
|
|
186
|
-
await expect(parseCSV({
|
|
187
|
-
data: invalidCsv,
|
|
188
|
-
req: mockReq
|
|
189
|
-
})).rejects.toThrow();
|
|
190
|
-
expect(mockReq.payload.logger.error).toHaveBeenCalled();
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
//# sourceMappingURL=parseCSV.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/parseCSV.spec.ts"],"sourcesContent":["import { PayloadRequest } from 'payload'\n\nimport { parseCSV } from './parseCSV.js'\nimport { describe, it, expect, vi } from 'vitest'\n\ndescribe('parseCSV', () => {\n const mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n } as unknown as PayloadRequest\n\n describe('cast function behavior', () => {\n it('should preserve comma-separated values as strings', async () => {\n const csvData = Buffer.from('numbers,ids\\n\"1,2,3,5,8\",\"id1,id2,id3\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n numbers: '1,2,3,5,8',\n ids: 'id1,id2,id3',\n },\n ])\n })\n\n it('should convert single numbers to numbers', async () => {\n const csvData = Buffer.from('single,decimal\\n\"42\",\"3.14\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n single: 42,\n decimal: 3.14,\n },\n ])\n })\n\n it('should handle booleans correctly', async () => {\n const csvData = Buffer.from('bool1,bool2,notBool\\n\"true\",\"false\",\"True\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n bool1: true,\n bool2: false,\n notBool: 'True', // Case-sensitive\n },\n ])\n })\n\n it('should convert empty strings to undefined', async () => {\n const csvData = Buffer.from('field1,field2\\n\"\",\"value\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n // field1 is undefined (not present) - empty cells don't update fields\n field2: 'value',\n },\n ])\n })\n\n it('should handle null strings', async () => {\n const csvData = Buffer.from('field1,field2,field3\\n\"null\",\"NULL\",\"Null\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n field1: null,\n field2: null,\n field3: 'Null', // Case-sensitive for mixed case\n },\n ])\n })\n\n it('should preserve spaces in comma-separated values', async () => {\n const csvData = Buffer.from('numbers\\n\" 10 , 20 , 30 \"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n numbers: ' 10 , 20 , 30 ', // CSV parser trims outer quotes but preserves the content\n },\n ])\n })\n\n it('should handle mixed comma-separated values with empty entries', async () => {\n const csvData = Buffer.from('mixed\\n\"1,,3,,5\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n mixed: '1,,3,,5',\n },\n ])\n })\n\n it('should handle MongoDB ObjectIds as strings', async () => {\n const csvData = Buffer.from('id\\n\"507f1f77bcf86cd799439011\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n id: '507f1f77bcf86cd799439011',\n },\n ])\n })\n\n it('should handle multiple rows with various data types', async () => {\n const csvData = Buffer.from(\n 'title,count,tags,active\\n' +\n '\"Item 1\",\"5\",\"tag1,tag2,tag3\",\"true\"\\n' +\n '\"Item 2\",\"\",\"\",\"false\"\\n' +\n '\"Item 3\",\"10\",\"single\",\"\"\\n',\n )\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n title: 'Item 1',\n count: 5,\n tags: 'tag1,tag2,tag3',\n active: true,\n },\n {\n title: 'Item 2',\n // count is undefined (empty cell - field not updated)\n // tags is undefined (empty cell - field not updated)\n active: false,\n },\n {\n title: 'Item 3',\n count: 10,\n tags: 'single',\n // active is undefined (empty cell - field not updated)\n },\n ])\n })\n\n it('should skip empty lines', async () => {\n const csvData = Buffer.from('field\\n\"value1\"\\n\\n\"value2\"\\n\\n')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([{ field: 'value1' }, { field: 'value2' }])\n })\n\n it('should strip UTF-8 BOM from column names', async () => {\n // UTF-8 BOM is 0xEF 0xBB 0xBF\n const bomBytes = Buffer.from([0xef, 0xbb, 0xbf])\n const csvContent = Buffer.from('id,title,createdAt\\ntesssst,test,2026-02-11T21:03:39.020Z')\n const csvWithBOM = Buffer.concat([bomBytes, csvContent])\n\n const result = await parseCSV({ data: csvWithBOM, req: mockReq })\n\n expect(result).toEqual([\n {\n id: 'tesssst',\n title: 'test',\n createdAt: '2026-02-11T21:03:39.020Z',\n },\n ])\n\n // Verify the column name is exactly \"id\" without BOM character\n expect(Object.keys(result[0])[0]).toBe('id')\n })\n })\n\n describe('error handling', () => {\n it('should handle parsing errors', async () => {\n const invalidCsv = Buffer.from('field1,field2\\n\"value1')\n\n await expect(parseCSV({ data: invalidCsv, req: mockReq })).rejects.toThrow()\n expect(mockReq.payload.logger.error).toHaveBeenCalled()\n })\n })\n})\n"],"names":["parseCSV","describe","it","expect","vi","mockReq","payload","logger","error","fn","csvData","Buffer","from","result","data","req","toEqual","numbers","ids","single","decimal","bool1","bool2","notBool","field2","field1","field3","mixed","id","title","count","tags","active","field","bomBytes","csvContent","csvWithBOM","concat","createdAt","Object","keys","toBe","invalidCsv","rejects","toThrow","toHaveBeenCalled"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,SAASC,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAEjDH,SAAS,YAAY;IACnB,MAAMI,UAAU;QACdC,SAAS;YACPC,QAAQ;gBACNC,OAAOJ,GAAGK,EAAE;YACd;QACF;IACF;IAEAR,SAAS,0BAA0B;QACjCC,GAAG,qDAAqD;YACtD,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEC,SAAS;oBACTC,KAAK;gBACP;aACD;QACH;QAEAhB,GAAG,4CAA4C;YAC7C,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEG,QAAQ;oBACRC,SAAS;gBACX;aACD;QACH;QAEAlB,GAAG,oCAAoC;YACrC,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEK,OAAO;oBACPC,OAAO;oBACPC,SAAS;gBACX;aACD;QACH;QAEArB,GAAG,6CAA6C;YAC9C,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACE,sEAAsE;oBACtEQ,QAAQ;gBACV;aACD;QACH;QAEAtB,GAAG,8BAA8B;YAC/B,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACES,QAAQ;oBACRD,QAAQ;oBACRE,QAAQ;gBACV;aACD;QACH;QAEAxB,GAAG,oDAAoD;YACrD,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEC,SAAS;gBACX;aACD;QACH;QAEAf,GAAG,iEAAiE;YAClE,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEW,OAAO;gBACT;aACD;QACH;QAEAzB,GAAG,8CAA8C;YAC/C,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEY,IAAI;gBACN;aACD;QACH;QAEA1B,GAAG,uDAAuD;YACxD,MAAMQ,UAAUC,OAAOC,IAAI,CACzB,8BACE,2CACA,6BACA;YAEJ,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEa,OAAO;oBACPC,OAAO;oBACPC,MAAM;oBACNC,QAAQ;gBACV;gBACA;oBACEH,OAAO;oBACP,sDAAsD;oBACtD,qDAAqD;oBACrDG,QAAQ;gBACV;gBACA;oBACEH,OAAO;oBACPC,OAAO;oBACPC,MAAM;gBAER;aACD;QACH;QAEA7B,GAAG,2BAA2B;YAC5B,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBAAC;oBAAEiB,OAAO;gBAAS;gBAAG;oBAAEA,OAAO;gBAAS;aAAE;QACnE;QAEA/B,GAAG,4CAA4C;YAC7C,8BAA8B;YAC9B,MAAMgC,WAAWvB,OAAOC,IAAI,CAAC;gBAAC;gBAAM;gBAAM;aAAK;YAC/C,MAAMuB,aAAaxB,OAAOC,IAAI,CAAC;YAC/B,MAAMwB,aAAazB,OAAO0B,MAAM,CAAC;gBAACH;gBAAUC;aAAW;YAEvD,MAAMtB,SAAS,MAAMb,SAAS;gBAAEc,MAAMsB;gBAAYrB,KAAKV;YAAQ;YAE/DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEY,IAAI;oBACJC,OAAO;oBACPS,WAAW;gBACb;aACD;YAED,+DAA+D;YAC/DnC,OAAOoC,OAAOC,IAAI,CAAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE4B,IAAI,CAAC;QACzC;IACF;IAEAxC,SAAS,kBAAkB;QACzBC,GAAG,gCAAgC;YACjC,MAAMwC,aAAa/B,OAAOC,IAAI,CAAC;YAE/B,MAAMT,OAAOH,SAAS;gBAAEc,MAAM4B;gBAAY3B,KAAKV;YAAQ,IAAIsC,OAAO,CAACC,OAAO;YAC1EzC,OAAOE,QAAQC,OAAO,CAACC,MAAM,CAACC,KAAK,EAAEqC,gBAAgB;QACvD;IACF;AACF"}
|