@payloadcms/plugin-import-export 3.77.0-canary.0 → 3.77.0-canary.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,319 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { collectTimezoneCompanionFields } from './collectTimezoneCompanionFields.js';
3
- describe('collectTimezoneCompanionFields', ()=>{
4
- it('should return empty set for fields without date timezone', ()=>{
5
- const fields = [
6
- {
7
- name: 'title',
8
- type: 'text'
9
- },
10
- {
11
- name: 'description',
12
- type: 'textarea'
13
- }
14
- ];
15
- const result = collectTimezoneCompanionFields(fields);
16
- expect(result.size).toBe(0);
17
- });
18
- it('should return empty set for date fields without timezone enabled', ()=>{
19
- const fields = [
20
- {
21
- name: 'publishedAt',
22
- type: 'date'
23
- },
24
- {
25
- name: 'createdAt',
26
- type: 'date'
27
- }
28
- ];
29
- const result = collectTimezoneCompanionFields(fields);
30
- expect(result.size).toBe(0);
31
- });
32
- it('should collect timezone companion from the next select field after date with timezone', ()=>{
33
- // Simulates sanitized fields where Payload inserts the companion right after the date
34
- const fields = [
35
- {
36
- name: 'publishedAt',
37
- type: 'date',
38
- timezone: true
39
- },
40
- {
41
- name: 'publishedAt_tz',
42
- type: 'select',
43
- options: []
44
- }
45
- ];
46
- const result = collectTimezoneCompanionFields(fields);
47
- expect(result.size).toBe(1);
48
- expect(result.has('publishedAt_tz')).toBe(true);
49
- });
50
- it('should handle overridden timezone field names', ()=>{
51
- // User overrode the timezone field name via timezone.override
52
- const fields = [
53
- {
54
- name: 'publishedAt',
55
- type: 'date',
56
- timezone: true
57
- },
58
- {
59
- name: 'pub_timezone',
60
- type: 'select',
61
- options: []
62
- }
63
- ];
64
- const result = collectTimezoneCompanionFields(fields);
65
- expect(result.size).toBe(1);
66
- expect(result.has('pub_timezone')).toBe(true);
67
- expect(result.has('publishedAt_tz')).toBe(false);
68
- });
69
- it('should collect multiple timezone companions', ()=>{
70
- const fields = [
71
- {
72
- name: 'publishedAt',
73
- type: 'date',
74
- timezone: true
75
- },
76
- {
77
- name: 'publishedAt_tz',
78
- type: 'select',
79
- options: []
80
- },
81
- {
82
- name: 'title',
83
- type: 'text'
84
- },
85
- {
86
- name: 'scheduledAt',
87
- type: 'date',
88
- timezone: true
89
- },
90
- {
91
- name: 'scheduledAt_tz',
92
- type: 'select',
93
- options: []
94
- }
95
- ];
96
- const result = collectTimezoneCompanionFields(fields);
97
- expect(result.size).toBe(2);
98
- expect(result.has('publishedAt_tz')).toBe(true);
99
- expect(result.has('scheduledAt_tz')).toBe(true);
100
- });
101
- it('should handle date fields in groups', ()=>{
102
- const fields = [
103
- {
104
- name: 'meta',
105
- type: 'group',
106
- fields: [
107
- {
108
- name: 'publishedAt',
109
- type: 'date',
110
- timezone: true
111
- },
112
- {
113
- name: 'publishedAt_tz',
114
- type: 'select',
115
- options: []
116
- }
117
- ]
118
- }
119
- ];
120
- const result = collectTimezoneCompanionFields(fields);
121
- expect(result.size).toBe(1);
122
- expect(result.has('meta_publishedAt_tz')).toBe(true);
123
- });
124
- it('should handle date fields in arrays', ()=>{
125
- const fields = [
126
- {
127
- name: 'events',
128
- type: 'array',
129
- fields: [
130
- {
131
- name: 'startTime',
132
- type: 'date',
133
- timezone: true
134
- },
135
- {
136
- name: 'startTime_tz',
137
- type: 'select',
138
- options: []
139
- }
140
- ]
141
- }
142
- ];
143
- const result = collectTimezoneCompanionFields(fields);
144
- expect(result.size).toBe(1);
145
- expect(result.has('events_startTime_tz')).toBe(true);
146
- });
147
- it('should handle date fields in blocks', ()=>{
148
- const fields = [
149
- {
150
- name: 'layout',
151
- type: 'blocks',
152
- blocks: [
153
- {
154
- slug: 'event',
155
- fields: [
156
- {
157
- name: 'eventDate',
158
- type: 'date',
159
- timezone: true
160
- },
161
- {
162
- name: 'eventDate_tz',
163
- type: 'select',
164
- options: []
165
- }
166
- ]
167
- }
168
- ]
169
- }
170
- ];
171
- const result = collectTimezoneCompanionFields(fields);
172
- expect(result.size).toBe(1);
173
- expect(result.has('layout_event_eventDate_tz')).toBe(true);
174
- });
175
- it('should handle deeply nested date fields', ()=>{
176
- const fields = [
177
- {
178
- name: 'content',
179
- type: 'group',
180
- fields: [
181
- {
182
- name: 'schedule',
183
- type: 'array',
184
- fields: [
185
- {
186
- name: 'time',
187
- type: 'date',
188
- timezone: true
189
- },
190
- {
191
- name: 'time_tz',
192
- type: 'select',
193
- options: []
194
- }
195
- ]
196
- }
197
- ]
198
- }
199
- ];
200
- const result = collectTimezoneCompanionFields(fields);
201
- expect(result.size).toBe(1);
202
- expect(result.has('content_schedule_time_tz')).toBe(true);
203
- });
204
- it('should handle tabs', ()=>{
205
- const fields = [
206
- {
207
- type: 'tabs',
208
- tabs: [
209
- {
210
- name: 'scheduling',
211
- fields: [
212
- {
213
- name: 'publishAt',
214
- type: 'date',
215
- timezone: true
216
- },
217
- {
218
- name: 'publishAt_tz',
219
- type: 'select',
220
- options: []
221
- }
222
- ]
223
- }
224
- ]
225
- }
226
- ];
227
- const result = collectTimezoneCompanionFields(fields);
228
- expect(result.size).toBe(1);
229
- expect(result.has('scheduling_publishAt_tz')).toBe(true);
230
- });
231
- it('should handle unnamed tabs (no prefix added)', ()=>{
232
- const fields = [
233
- {
234
- type: 'tabs',
235
- tabs: [
236
- {
237
- fields: [
238
- {
239
- name: 'publishAt',
240
- type: 'date',
241
- timezone: true
242
- },
243
- {
244
- name: 'publishAt_tz',
245
- type: 'select',
246
- options: []
247
- }
248
- ]
249
- }
250
- ]
251
- }
252
- ];
253
- const result = collectTimezoneCompanionFields(fields);
254
- expect(result.size).toBe(1);
255
- expect(result.has('publishAt_tz')).toBe(true);
256
- });
257
- it('should not include user-defined fields ending with _tz', ()=>{
258
- const fields = [
259
- {
260
- name: 'my_tz',
261
- type: 'text'
262
- },
263
- {
264
- name: 'timezone_tz',
265
- type: 'select',
266
- options: []
267
- },
268
- {
269
- name: 'publishedAt',
270
- type: 'date',
271
- timezone: true
272
- },
273
- {
274
- name: 'publishedAt_tz',
275
- type: 'select',
276
- options: []
277
- }
278
- ];
279
- const result = collectTimezoneCompanionFields(fields);
280
- // Only the auto-generated timezone companion should be included
281
- expect(result.size).toBe(1);
282
- expect(result.has('publishedAt_tz')).toBe(true);
283
- expect(result.has('my_tz')).toBe(false);
284
- expect(result.has('timezone_tz')).toBe(false);
285
- });
286
- it('should not collect companion if next field is not a select', ()=>{
287
- // Edge case: date with timezone but next field is not a select
288
- const fields = [
289
- {
290
- name: 'publishedAt',
291
- type: 'date',
292
- timezone: true
293
- },
294
- {
295
- name: 'title',
296
- type: 'text'
297
- }
298
- ];
299
- const result = collectTimezoneCompanionFields(fields);
300
- expect(result.size).toBe(0);
301
- });
302
- it('should not collect companion if date is last field', ()=>{
303
- const fields = [
304
- {
305
- name: 'title',
306
- type: 'text'
307
- },
308
- {
309
- name: 'publishedAt',
310
- type: 'date',
311
- timezone: true
312
- }
313
- ];
314
- const result = collectTimezoneCompanionFields(fields);
315
- expect(result.size).toBe(0);
316
- });
317
- });
318
-
319
- //# sourceMappingURL=collectTimezoneCompanionFields.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/collectTimezoneCompanionFields.spec.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { collectTimezoneCompanionFields } from './collectTimezoneCompanionFields.js'\n\ndescribe('collectTimezoneCompanionFields', () => {\n it('should return empty set for fields without date timezone', () => {\n const fields: FlattenedField[] = [\n { name: 'title', type: 'text' },\n { name: 'description', type: 'textarea' },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n\n it('should return empty set for date fields without timezone enabled', () => {\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date' },\n { name: 'createdAt', type: 'date' },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n\n it('should collect timezone companion from the next select field after date with timezone', () => {\n // Simulates sanitized fields where Payload inserts the companion right after the date\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] }, // auto-generated companion\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('publishedAt_tz')).toBe(true)\n })\n\n it('should handle overridden timezone field names', () => {\n // User overrode the timezone field name via timezone.override\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'pub_timezone', type: 'select', options: [] }, // overridden name\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('pub_timezone')).toBe(true)\n expect(result.has('publishedAt_tz')).toBe(false)\n })\n\n it('should collect multiple timezone companions', () => {\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] },\n { name: 'title', type: 'text' },\n { name: 'scheduledAt', type: 'date', timezone: true },\n { name: 'scheduledAt_tz', type: 'select', options: [] },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(2)\n expect(result.has('publishedAt_tz')).toBe(true)\n expect(result.has('scheduledAt_tz')).toBe(true)\n })\n\n it('should handle date fields in groups', () => {\n const fields: FlattenedField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('meta_publishedAt_tz')).toBe(true)\n })\n\n it('should handle date fields in arrays', () => {\n const fields: FlattenedField[] = [\n {\n name: 'events',\n type: 'array',\n fields: [\n { name: 'startTime', type: 'date', timezone: true },\n { name: 'startTime_tz', type: 'select', options: [] },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('events_startTime_tz')).toBe(true)\n })\n\n it('should handle date fields in blocks', () => {\n const fields: FlattenedField[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'event',\n fields: [\n { name: 'eventDate', type: 'date', timezone: true },\n { name: 'eventDate_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('layout_event_eventDate_tz')).toBe(true)\n })\n\n it('should handle deeply nested date fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'content',\n type: 'group',\n fields: [\n {\n name: 'schedule',\n type: 'array',\n fields: [\n { name: 'time', type: 'date', timezone: true },\n { name: 'time_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('content_schedule_time_tz')).toBe(true)\n })\n\n it('should handle tabs', () => {\n const fields: FlattenedField[] = [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'scheduling',\n fields: [\n { name: 'publishAt', type: 'date', timezone: true },\n { name: 'publishAt_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('scheduling_publishAt_tz')).toBe(true)\n })\n\n it('should handle unnamed tabs (no prefix added)', () => {\n const fields: FlattenedField[] = [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n { name: 'publishAt', type: 'date', timezone: true },\n { name: 'publishAt_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('publishAt_tz')).toBe(true)\n })\n\n it('should not include user-defined fields ending with _tz', () => {\n const fields: FlattenedField[] = [\n { name: 'my_tz', type: 'text' },\n { name: 'timezone_tz', type: 'select', options: [] },\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] }, // actual companion\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n // Only the auto-generated timezone companion should be included\n expect(result.size).toBe(1)\n expect(result.has('publishedAt_tz')).toBe(true)\n expect(result.has('my_tz')).toBe(false)\n expect(result.has('timezone_tz')).toBe(false)\n })\n\n it('should not collect companion if next field is not a select', () => {\n // Edge case: date with timezone but next field is not a select\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'title', type: 'text' }, // not a select, so not a companion\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n\n it('should not collect companion if date is last field', () => {\n const fields: FlattenedField[] = [\n { name: 'title', type: 'text' },\n { name: 'publishedAt', type: 'date', timezone: true },\n // no next field\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n})\n"],"names":["describe","expect","it","collectTimezoneCompanionFields","fields","name","type","result","size","toBe","timezone","options","has","blocks","slug","tabs"],"mappings":"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"}