@payloadcms/plugin-import-export 3.91.0-internal.c1569dc → 4.0.0-beta.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.
Files changed (180) hide show
  1. package/README.md +2 -2
  2. package/dist/components/CollectionField/index.d.ts +3 -2
  3. package/dist/components/CollectionField/index.d.ts.map +1 -1
  4. package/dist/components/CollectionField/index.js.map +1 -1
  5. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
  6. package/dist/components/ExportListMenuItem/index.js +14 -12
  7. package/dist/components/ExportListMenuItem/index.js.map +1 -1
  8. package/dist/components/ExportPreview/index.css +52 -0
  9. package/dist/components/ExportPreview/index.d.ts +1 -1
  10. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  11. package/dist/components/ExportPreview/index.js +12 -2
  12. package/dist/components/ExportPreview/index.js.map +1 -1
  13. package/dist/components/FieldsToExport/index.d.ts +3 -2
  14. package/dist/components/FieldsToExport/index.d.ts.map +1 -1
  15. package/dist/components/FieldsToExport/index.js +18 -15
  16. package/dist/components/FieldsToExport/index.js.map +1 -1
  17. package/dist/components/FieldsToExport/reduceFields.d.ts +6 -0
  18. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
  19. package/dist/components/FieldsToExport/reduceFields.js +4 -0
  20. package/dist/components/FieldsToExport/reduceFields.js.map +1 -1
  21. package/dist/components/FormatField/index.d.ts +3 -2
  22. package/dist/components/FormatField/index.d.ts.map +1 -1
  23. package/dist/components/FormatField/index.js +6 -3
  24. package/dist/components/FormatField/index.js.map +1 -1
  25. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -1
  26. package/dist/components/ImportListMenuItem/index.js +14 -12
  27. package/dist/components/ImportListMenuItem/index.js.map +1 -1
  28. package/dist/components/ImportPreview/index.css +45 -0
  29. package/dist/components/ImportPreview/index.d.ts +1 -1
  30. package/dist/components/ImportPreview/index.d.ts.map +1 -1
  31. package/dist/components/ImportPreview/index.js +44 -11
  32. package/dist/components/ImportPreview/index.js.map +1 -1
  33. package/dist/components/LimitField/index.d.ts +3 -2
  34. package/dist/components/LimitField/index.d.ts.map +1 -1
  35. package/dist/components/LimitField/index.js.map +1 -1
  36. package/dist/components/LocaleField/index.d.ts +3 -2
  37. package/dist/components/LocaleField/index.d.ts.map +1 -1
  38. package/dist/components/LocaleField/index.js.map +1 -1
  39. package/dist/components/Page/index.d.ts +4 -3
  40. package/dist/components/Page/index.d.ts.map +1 -1
  41. package/dist/components/Page/index.js +1 -1
  42. package/dist/components/Page/index.js.map +1 -1
  43. package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts +7 -0
  44. package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts.map +1 -0
  45. package/dist/components/RelationshipCell/getRelationshipGroupKey.js +3 -0
  46. package/dist/components/RelationshipCell/getRelationshipGroupKey.js.map +1 -0
  47. package/dist/components/RelationshipCell/getRelationshipGroups.d.ts +43 -0
  48. package/dist/components/RelationshipCell/getRelationshipGroups.d.ts.map +1 -0
  49. package/dist/components/RelationshipCell/getRelationshipGroups.js +109 -0
  50. package/dist/components/RelationshipCell/getRelationshipGroups.js.map +1 -0
  51. package/dist/components/RelationshipCell/index.css +30 -0
  52. package/dist/components/RelationshipCell/index.d.ts +15 -0
  53. package/dist/components/RelationshipCell/index.d.ts.map +1 -0
  54. package/dist/components/RelationshipCell/index.js +57 -0
  55. package/dist/components/RelationshipCell/index.js.map +1 -0
  56. package/dist/components/SortBy/index.css +9 -0
  57. package/dist/components/SortBy/index.d.ts +4 -3
  58. package/dist/components/SortBy/index.d.ts.map +1 -1
  59. package/dist/components/SortBy/index.js +1 -2
  60. package/dist/components/SortBy/index.js.map +1 -1
  61. package/dist/components/SortOrder/index.css +9 -0
  62. package/dist/components/SortOrder/index.d.ts +4 -3
  63. package/dist/components/SortOrder/index.d.ts.map +1 -1
  64. package/dist/components/SortOrder/index.js +1 -2
  65. package/dist/components/SortOrder/index.js.map +1 -1
  66. package/dist/export/batchProcessor.d.ts +4 -3
  67. package/dist/export/batchProcessor.d.ts.map +1 -1
  68. package/dist/export/batchProcessor.js +6 -2
  69. package/dist/export/batchProcessor.js.map +1 -1
  70. package/dist/export/createExport.d.ts +4 -2
  71. package/dist/export/createExport.d.ts.map +1 -1
  72. package/dist/export/createExport.js +7 -2
  73. package/dist/export/createExport.js.map +1 -1
  74. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  75. package/dist/export/getCreateExportCollectionTask.js +11 -0
  76. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  77. package/dist/export/getExportCollection.d.ts.map +1 -1
  78. package/dist/export/getExportCollection.js +9 -4
  79. package/dist/export/getExportCollection.js.map +1 -1
  80. package/dist/export/handleDownload.d.ts.map +1 -1
  81. package/dist/export/handleDownload.js +7 -3
  82. package/dist/export/handleDownload.js.map +1 -1
  83. package/dist/export/handlePreview.d.ts.map +1 -1
  84. package/dist/export/handlePreview.js +24 -5
  85. package/dist/export/handlePreview.js.map +1 -1
  86. package/dist/exports/types.d.ts +1 -1
  87. package/dist/exports/types.d.ts.map +1 -1
  88. package/dist/exports/types.js.map +1 -1
  89. package/dist/import/batchProcessor.d.ts +4 -3
  90. package/dist/import/batchProcessor.d.ts.map +1 -1
  91. package/dist/import/batchProcessor.js +15 -8
  92. package/dist/import/batchProcessor.js.map +1 -1
  93. package/dist/import/createImport.d.ts +3 -2
  94. package/dist/import/createImport.d.ts.map +1 -1
  95. package/dist/import/createImport.js +9 -2
  96. package/dist/import/createImport.js.map +1 -1
  97. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  98. package/dist/import/getCreateImportCollectionTask.js +5 -2
  99. package/dist/import/getCreateImportCollectionTask.js.map +1 -1
  100. package/dist/import/getImportCollection.d.ts.map +1 -1
  101. package/dist/import/getImportCollection.js +6 -4
  102. package/dist/import/getImportCollection.js.map +1 -1
  103. package/dist/import/handlePreview.d.ts.map +1 -1
  104. package/dist/import/handlePreview.js +5 -1
  105. package/dist/import/handlePreview.js.map +1 -1
  106. package/dist/index.d.ts +2 -13
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +19 -8
  109. package/dist/index.js.map +1 -1
  110. package/dist/translations/languages/en.d.ts.map +1 -1
  111. package/dist/types.d.ts +17 -33
  112. package/dist/types.d.ts.map +1 -1
  113. package/dist/types.js.map +1 -1
  114. package/dist/utilities/applyFieldHooks.d.ts +1 -2
  115. package/dist/utilities/applyFieldHooks.d.ts.map +1 -1
  116. package/dist/utilities/applyFieldHooks.js +2 -3
  117. package/dist/utilities/applyFieldHooks.js.map +1 -1
  118. package/dist/utilities/flattenObject.d.ts.map +1 -1
  119. package/dist/utilities/flattenObject.js +3 -13
  120. package/dist/utilities/flattenObject.js.map +1 -1
  121. package/dist/utilities/flattenedFields.d.ts.map +1 -1
  122. package/dist/utilities/flattenedFields.js +3 -0
  123. package/dist/utilities/flattenedFields.js.map +1 -1
  124. package/dist/utilities/getExportFieldFunctions.js +64 -35
  125. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  126. package/dist/utilities/getFileFromDoc.js +3 -3
  127. package/dist/utilities/getFileFromDoc.js.map +1 -1
  128. package/dist/utilities/getImportFieldFunctions.js +0 -8
  129. package/dist/utilities/getImportFieldFunctions.js.map +1 -1
  130. package/dist/utilities/getSchemaColumns.d.ts +1 -1
  131. package/dist/utilities/getSchemaColumns.js +2 -2
  132. package/dist/utilities/getSchemaColumns.js.map +1 -1
  133. package/dist/utilities/getSubmittedFormValues.d.ts +12 -0
  134. package/dist/utilities/getSubmittedFormValues.d.ts.map +1 -0
  135. package/dist/utilities/getSubmittedFormValues.js +24 -0
  136. package/dist/utilities/getSubmittedFormValues.js.map +1 -0
  137. package/dist/utilities/sortHelpers.d.ts +1 -1
  138. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  139. package/dist/utilities/unflattenObject.js +8 -16
  140. package/dist/utilities/unflattenObject.js.map +1 -1
  141. package/license.md +1 -1
  142. package/package.json +9 -9
  143. package/dist/components/ExportPreview/index.scss +0 -48
  144. package/dist/components/FieldsToExport/index.scss +0 -0
  145. package/dist/components/FieldsToExport/reduceFields.spec.js +0 -239
  146. package/dist/components/FieldsToExport/reduceFields.spec.js.map +0 -1
  147. package/dist/components/ImportPreview/index.scss +0 -41
  148. package/dist/components/SortBy/index.scss +0 -3
  149. package/dist/components/SortOrder/index.scss +0 -3
  150. package/dist/utilities/applyFieldHooks.spec.js +0 -205
  151. package/dist/utilities/applyFieldHooks.spec.js.map +0 -1
  152. package/dist/utilities/buildDisabledFieldRegex.spec.js +0 -64
  153. package/dist/utilities/buildDisabledFieldRegex.spec.js.map +0 -1
  154. package/dist/utilities/fieldToRegex.spec.js +0 -151
  155. package/dist/utilities/fieldToRegex.spec.js.map +0 -1
  156. package/dist/utilities/filterToSelectedFields.spec.js +0 -204
  157. package/dist/utilities/filterToSelectedFields.spec.js.map +0 -1
  158. package/dist/utilities/flattenObject.spec.js +0 -158
  159. package/dist/utilities/flattenObject.spec.js.map +0 -1
  160. package/dist/utilities/getExportFieldFunctions.spec.js +0 -50
  161. package/dist/utilities/getExportFieldFunctions.spec.js.map +0 -1
  162. package/dist/utilities/getImportFieldFunctions.spec.js +0 -167
  163. package/dist/utilities/getImportFieldFunctions.spec.js.map +0 -1
  164. package/dist/utilities/getSchemaColumns.spec.js +0 -157
  165. package/dist/utilities/getSchemaColumns.spec.js.map +0 -1
  166. package/dist/utilities/getSelect.spec.js +0 -57
  167. package/dist/utilities/getSelect.spec.js.map +0 -1
  168. package/dist/utilities/legacyHookDispatch.spec.js +0 -227
  169. package/dist/utilities/legacyHookDispatch.spec.js.map +0 -1
  170. package/dist/utilities/parseCSV.spec.js +0 -195
  171. package/dist/utilities/parseCSV.spec.js.map +0 -1
  172. package/dist/utilities/processRichTextField.spec.js +0 -308
  173. package/dist/utilities/processRichTextField.spec.js.map +0 -1
  174. package/dist/utilities/setNestedValue.spec.js +0 -214
  175. package/dist/utilities/setNestedValue.spec.js.map +0 -1
  176. package/dist/utilities/siblingDoc.spec.js +0 -278
  177. package/dist/utilities/siblingDoc.spec.js.map +0 -1
  178. package/dist/utilities/unflattenObject.spec.js +0 -819
  179. package/dist/utilities/unflattenObject.spec.js.map +0 -1
  180. /package/dist/components/Page/{index.scss → index.css} +0 -0
@@ -1,167 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { getImportFieldFunctions } from './getImportFieldFunctions.js';
3
- const mockReq = {
4
- payload: {
5
- logger: {
6
- error: vi.fn()
7
- }
8
- }
9
- };
10
- const callHook = (hooks, key, value)=>{
11
- const entry = hooks[key];
12
- if (!entry || entry.type !== 'beforeImport') {
13
- throw new Error(`Expected beforeImport hook for ${key}`);
14
- }
15
- return entry.fn({
16
- columnName: key,
17
- data: {},
18
- format: 'csv',
19
- operation: 'create',
20
- req: mockReq,
21
- siblingData: {},
22
- siblingDoc: {},
23
- value
24
- });
25
- };
26
- describe('getImportFieldFunctions empty-cell guards', ()=>{
27
- describe('checkbox', ()=>{
28
- const fields = [
29
- {
30
- name: 'flag',
31
- type: 'checkbox'
32
- }
33
- ];
34
- it('should return undefined for empty string instead of false', ()=>{
35
- const hooks = getImportFieldFunctions({
36
- fields
37
- });
38
- expect(callHook(hooks, 'flag', '')).toBeUndefined();
39
- });
40
- it('should return undefined for null', ()=>{
41
- const hooks = getImportFieldFunctions({
42
- fields
43
- });
44
- expect(callHook(hooks, 'flag', null)).toBeUndefined();
45
- });
46
- it('should return undefined for undefined', ()=>{
47
- const hooks = getImportFieldFunctions({
48
- fields
49
- });
50
- expect(callHook(hooks, 'flag', undefined)).toBeUndefined();
51
- });
52
- it('should still parse "true" as true', ()=>{
53
- const hooks = getImportFieldFunctions({
54
- fields
55
- });
56
- expect(callHook(hooks, 'flag', 'true')).toBe(true);
57
- });
58
- it('should still parse "false" as false', ()=>{
59
- const hooks = getImportFieldFunctions({
60
- fields
61
- });
62
- expect(callHook(hooks, 'flag', 'false')).toBe(false);
63
- });
64
- it('should still pass through real booleans', ()=>{
65
- const hooks = getImportFieldFunctions({
66
- fields
67
- });
68
- expect(callHook(hooks, 'flag', true)).toBe(true);
69
- expect(callHook(hooks, 'flag', false)).toBe(false);
70
- });
71
- });
72
- describe('number (without hasMany)', ()=>{
73
- const fields = [
74
- {
75
- name: 'count',
76
- type: 'number'
77
- }
78
- ];
79
- it('should return undefined for empty string instead of 0', ()=>{
80
- const hooks = getImportFieldFunctions({
81
- fields
82
- });
83
- expect(callHook(hooks, 'count', '')).toBeUndefined();
84
- });
85
- it('should return undefined for null', ()=>{
86
- const hooks = getImportFieldFunctions({
87
- fields
88
- });
89
- expect(callHook(hooks, 'count', null)).toBeUndefined();
90
- });
91
- it('should return undefined for undefined', ()=>{
92
- const hooks = getImportFieldFunctions({
93
- fields
94
- });
95
- expect(callHook(hooks, 'count', undefined)).toBeUndefined();
96
- });
97
- it('should still parse a numeric string', ()=>{
98
- const hooks = getImportFieldFunctions({
99
- fields
100
- });
101
- expect(callHook(hooks, 'count', '42')).toBe(42);
102
- });
103
- it('should still pass through a real number', ()=>{
104
- const hooks = getImportFieldFunctions({
105
- fields
106
- });
107
- expect(callHook(hooks, 'count', 7)).toBe(7);
108
- });
109
- });
110
- describe('date', ()=>{
111
- const fields = [
112
- {
113
- name: 'when',
114
- type: 'date'
115
- }
116
- ];
117
- it('should return undefined for empty string', ()=>{
118
- const hooks = getImportFieldFunctions({
119
- fields
120
- });
121
- expect(callHook(hooks, 'when', '')).toBeUndefined();
122
- });
123
- it('should return undefined for null', ()=>{
124
- const hooks = getImportFieldFunctions({
125
- fields
126
- });
127
- expect(callHook(hooks, 'when', null)).toBeUndefined();
128
- });
129
- it('should still parse a valid ISO date', ()=>{
130
- const hooks = getImportFieldFunctions({
131
- fields
132
- });
133
- const iso = '2026-05-06T00:00:00.000Z';
134
- expect(callHook(hooks, 'when', iso)).toBe(iso);
135
- });
136
- });
137
- describe('json', ()=>{
138
- const fields = [
139
- {
140
- name: 'meta',
141
- type: 'json'
142
- }
143
- ];
144
- it('should return undefined for empty string', ()=>{
145
- const hooks = getImportFieldFunctions({
146
- fields
147
- });
148
- expect(callHook(hooks, 'meta', '')).toBeUndefined();
149
- });
150
- it('should return undefined for null', ()=>{
151
- const hooks = getImportFieldFunctions({
152
- fields
153
- });
154
- expect(callHook(hooks, 'meta', null)).toBeUndefined();
155
- });
156
- it('should still parse a valid JSON string', ()=>{
157
- const hooks = getImportFieldFunctions({
158
- fields
159
- });
160
- expect(callHook(hooks, 'meta', '{"a":1}')).toEqual({
161
- a: 1
162
- });
163
- });
164
- });
165
- });
166
-
167
- //# sourceMappingURL=getImportFieldFunctions.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/getImportFieldFunctions.spec.ts"],"sourcesContent":["import { FlattenedField, PayloadRequest } from 'payload'\n\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { getImportFieldFunctions } from './getImportFieldFunctions.js'\n\nconst mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n} as unknown as PayloadRequest\n\nconst callHook = (\n hooks: ReturnType<typeof getImportFieldFunctions>,\n key: string,\n value: unknown,\n) => {\n const entry = hooks[key]\n if (!entry || entry.type !== 'beforeImport') {\n throw new Error(`Expected beforeImport hook for ${key}`)\n }\n return entry.fn({\n columnName: key,\n data: {},\n format: 'csv',\n operation: 'create',\n req: mockReq,\n siblingData: {},\n siblingDoc: {},\n value,\n })\n}\n\ndescribe('getImportFieldFunctions empty-cell guards', () => {\n describe('checkbox', () => {\n const fields: FlattenedField[] = [{ name: 'flag', type: 'checkbox' } as FlattenedField]\n\n it('should return undefined for empty string instead of false', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', null)).toBeUndefined()\n })\n\n it('should return undefined for undefined', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', undefined)).toBeUndefined()\n })\n\n it('should still parse \"true\" as true', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', 'true')).toBe(true)\n })\n\n it('should still parse \"false\" as false', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', 'false')).toBe(false)\n })\n\n it('should still pass through real booleans', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', true)).toBe(true)\n expect(callHook(hooks, 'flag', false)).toBe(false)\n })\n })\n\n describe('number (without hasMany)', () => {\n const fields: FlattenedField[] = [{ name: 'count', type: 'number' } as FlattenedField]\n\n it('should return undefined for empty string instead of 0', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', null)).toBeUndefined()\n })\n\n it('should return undefined for undefined', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', undefined)).toBeUndefined()\n })\n\n it('should still parse a numeric string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', '42')).toBe(42)\n })\n\n it('should still pass through a real number', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', 7)).toBe(7)\n })\n })\n\n describe('date', () => {\n const fields: FlattenedField[] = [{ name: 'when', type: 'date' } as FlattenedField]\n\n it('should return undefined for empty string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'when', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'when', null)).toBeUndefined()\n })\n\n it('should still parse a valid ISO date', () => {\n const hooks = getImportFieldFunctions({ fields })\n const iso = '2026-05-06T00:00:00.000Z'\n expect(callHook(hooks, 'when', iso)).toBe(iso)\n })\n })\n\n describe('json', () => {\n const fields: FlattenedField[] = [{ name: 'meta', type: 'json' } as FlattenedField]\n\n it('should return undefined for empty string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'meta', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'meta', null)).toBeUndefined()\n })\n\n it('should still parse a valid JSON string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'meta', '{\"a\":1}')).toEqual({ a: 1 })\n })\n })\n})\n"],"names":["describe","expect","it","vi","getImportFieldFunctions","mockReq","payload","logger","error","fn","callHook","hooks","key","value","entry","type","Error","columnName","data","format","operation","req","siblingData","siblingDoc","fields","name","toBeUndefined","undefined","toBe","iso","toEqual","a"],"mappings":"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"}
@@ -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,57 +0,0 @@
1
- import { APIError } from 'payload';
2
- import { describe, expect, it } from 'vitest';
3
- import { getSelect } from './getSelect.js';
4
- describe('getSelect', ()=>{
5
- it.each([
6
- '__proto__.field',
7
- 'group.__proto__.field',
8
- 'group.__proto__'
9
- ])('should reject invalid field path %s', (path)=>{
10
- const objectPrototypeBefore = Object.getOwnPropertyDescriptors(Object.prototype);
11
- try {
12
- getSelect([
13
- path
14
- ]);
15
- expect.fail('Expected getSelect to reject the invalid field path');
16
- } catch (error) {
17
- expect(error).toBeInstanceOf(APIError);
18
- if (error instanceof APIError) {
19
- expect(error.status).toBe(400);
20
- expect(error.isPublic).toBe(true);
21
- }
22
- }
23
- expect(Object.getOwnPropertyDescriptors(Object.prototype)).toEqual(objectPrototypeBefore);
24
- });
25
- it('should build select objects with compatible field names', ()=>{
26
- const objectPrototypeBefore = Object.getOwnPropertyDescriptors(Object.prototype);
27
- const select = getSelect([
28
- 'id',
29
- 'group.title',
30
- 'group.description',
31
- 'constructor.prototype.value',
32
- 'prototype.value'
33
- ]);
34
- expect(Object.hasOwn(select, 'constructor')).toBe(true);
35
- expect(Object.hasOwn(select, 'prototype')).toBe(true);
36
- expect(select).toEqual({
37
- constructor: {
38
- prototype: {
39
- value: true
40
- }
41
- },
42
- group: {
43
- description: true,
44
- title: true
45
- },
46
- id: true,
47
- prototype: {
48
- value: true
49
- }
50
- });
51
- expect(Object.getPrototypeOf(select)).toBeNull();
52
- expect(Object.getPrototypeOf(select.group)).toBeNull();
53
- expect(Object.getOwnPropertyDescriptors(Object.prototype)).toEqual(objectPrototypeBefore);
54
- });
55
- });
56
-
57
- //# sourceMappingURL=getSelect.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/getSelect.spec.ts"],"sourcesContent":["import { APIError } from 'payload'\nimport { describe, expect, it } from 'vitest'\n\nimport { getSelect } from './getSelect.js'\n\ndescribe('getSelect', () => {\n it.each(['__proto__.field', 'group.__proto__.field', 'group.__proto__'])(\n 'should reject invalid field path %s',\n (path) => {\n const objectPrototypeBefore = Object.getOwnPropertyDescriptors(Object.prototype)\n\n try {\n getSelect([path])\n expect.fail('Expected getSelect to reject the invalid field path')\n } catch (error) {\n expect(error).toBeInstanceOf(APIError)\n\n if (error instanceof APIError) {\n expect(error.status).toBe(400)\n expect(error.isPublic).toBe(true)\n }\n }\n\n expect(Object.getOwnPropertyDescriptors(Object.prototype)).toEqual(objectPrototypeBefore)\n },\n )\n\n it('should build select objects with compatible field names', () => {\n const objectPrototypeBefore = Object.getOwnPropertyDescriptors(Object.prototype)\n const select = getSelect([\n 'id',\n 'group.title',\n 'group.description',\n 'constructor.prototype.value',\n 'prototype.value',\n ])\n\n expect(Object.hasOwn(select, 'constructor')).toBe(true)\n expect(Object.hasOwn(select, 'prototype')).toBe(true)\n expect(select).toEqual({\n constructor: {\n prototype: {\n value: true,\n },\n },\n group: {\n description: true,\n title: true,\n },\n id: true,\n prototype: {\n value: true,\n },\n })\n expect(Object.getPrototypeOf(select)).toBeNull()\n expect(Object.getPrototypeOf(select.group)).toBeNull()\n expect(Object.getOwnPropertyDescriptors(Object.prototype)).toEqual(objectPrototypeBefore)\n })\n})\n"],"names":["APIError","describe","expect","it","getSelect","each","path","objectPrototypeBefore","Object","getOwnPropertyDescriptors","prototype","fail","error","toBeInstanceOf","status","toBe","isPublic","toEqual","select","hasOwn","value","group","description","title","id","getPrototypeOf","toBeNull"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,UAAS;AAClC,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,SAAS,QAAQ,iBAAgB;AAE1CH,SAAS,aAAa;IACpBE,GAAGE,IAAI,CAAC;QAAC;QAAmB;QAAyB;KAAkB,EACrE,uCACA,CAACC;QACC,MAAMC,wBAAwBC,OAAOC,yBAAyB,CAACD,OAAOE,SAAS;QAE/E,IAAI;YACFN,UAAU;gBAACE;aAAK;YAChBJ,OAAOS,IAAI,CAAC;QACd,EAAE,OAAOC,OAAO;YACdV,OAAOU,OAAOC,cAAc,CAACb;YAE7B,IAAIY,iBAAiBZ,UAAU;gBAC7BE,OAAOU,MAAME,MAAM,EAAEC,IAAI,CAAC;gBAC1Bb,OAAOU,MAAMI,QAAQ,EAAED,IAAI,CAAC;YAC9B;QACF;QAEAb,OAAOM,OAAOC,yBAAyB,CAACD,OAAOE,SAAS,GAAGO,OAAO,CAACV;IACrE;IAGFJ,GAAG,2DAA2D;QAC5D,MAAMI,wBAAwBC,OAAOC,yBAAyB,CAACD,OAAOE,SAAS;QAC/E,MAAMQ,SAASd,UAAU;YACvB;YACA;YACA;YACA;YACA;SACD;QAEDF,OAAOM,OAAOW,MAAM,CAACD,QAAQ,gBAAgBH,IAAI,CAAC;QAClDb,OAAOM,OAAOW,MAAM,CAACD,QAAQ,cAAcH,IAAI,CAAC;QAChDb,OAAOgB,QAAQD,OAAO,CAAC;YACrB,aAAa;gBACXP,WAAW;oBACTU,OAAO;gBACT;YACF;YACAC,OAAO;gBACLC,aAAa;gBACbC,OAAO;YACT;YACAC,IAAI;YACJd,WAAW;gBACTU,OAAO;YACT;QACF;QACAlB,OAAOM,OAAOiB,cAAc,CAACP,SAASQ,QAAQ;QAC9CxB,OAAOM,OAAOiB,cAAc,CAACP,OAAOG,KAAK,GAAGK,QAAQ;QACpDxB,OAAOM,OAAOC,yBAAyB,CAACD,OAAOE,SAAS,GAAGO,OAAO,CAACV;IACrE;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