payload 3.0.0-beta.130 → 3.0.0-beta.131

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 (92) hide show
  1. package/dist/admin/elements/Cell.d.ts +16 -3
  2. package/dist/admin/elements/Cell.d.ts.map +1 -1
  3. package/dist/admin/elements/Cell.js.map +1 -1
  4. package/dist/admin/elements/Tab.d.ts +3 -3
  5. package/dist/admin/elements/Tab.d.ts.map +1 -1
  6. package/dist/admin/elements/Tab.js.map +1 -1
  7. package/dist/admin/fields/Hidden.d.ts +2 -5
  8. package/dist/admin/fields/Hidden.d.ts.map +1 -1
  9. package/dist/admin/fields/Hidden.js.map +1 -1
  10. package/dist/admin/forms/Field.d.ts +2 -2
  11. package/dist/admin/forms/Field.d.ts.map +1 -1
  12. package/dist/admin/forms/Field.js.map +1 -1
  13. package/dist/admin/forms/Form.d.ts +2 -2
  14. package/dist/admin/forms/Form.d.ts.map +1 -1
  15. package/dist/admin/forms/Form.js.map +1 -1
  16. package/dist/admin/types.d.ts +1 -1
  17. package/dist/admin/types.d.ts.map +1 -1
  18. package/dist/admin/types.js.map +1 -1
  19. package/dist/admin/views/types.d.ts +2 -2
  20. package/dist/admin/views/types.d.ts.map +1 -1
  21. package/dist/admin/views/types.js.map +1 -1
  22. package/dist/auth/getAccessResults.d.ts +2 -2
  23. package/dist/auth/getAccessResults.d.ts.map +1 -1
  24. package/dist/auth/getAccessResults.js +2 -1
  25. package/dist/auth/getAccessResults.js.map +1 -1
  26. package/dist/auth/operations/access.d.ts +2 -2
  27. package/dist/auth/operations/access.d.ts.map +1 -1
  28. package/dist/auth/operations/access.js.map +1 -1
  29. package/dist/auth/operations/auth.d.ts +2 -3
  30. package/dist/auth/operations/auth.d.ts.map +1 -1
  31. package/dist/auth/operations/auth.js.map +1 -1
  32. package/dist/auth/types.d.ts +66 -4
  33. package/dist/auth/types.d.ts.map +1 -1
  34. package/dist/auth/types.js.map +1 -1
  35. package/dist/collections/config/client.d.ts +1 -2
  36. package/dist/collections/config/client.d.ts.map +1 -1
  37. package/dist/collections/config/client.js +6 -4
  38. package/dist/collections/config/client.js.map +1 -1
  39. package/dist/collections/config/types.d.ts +2 -1
  40. package/dist/collections/config/types.d.ts.map +1 -1
  41. package/dist/collections/config/types.js.map +1 -1
  42. package/dist/config/client.d.ts +2 -1
  43. package/dist/config/client.d.ts.map +1 -1
  44. package/dist/config/client.js +4 -1
  45. package/dist/config/client.js.map +1 -1
  46. package/dist/config/types.d.ts +2 -2
  47. package/dist/config/types.d.ts.map +1 -1
  48. package/dist/config/types.js.map +1 -1
  49. package/dist/database/types.d.ts +29 -16
  50. package/dist/database/types.d.ts.map +1 -1
  51. package/dist/database/types.js.map +1 -1
  52. package/dist/fields/config/client.d.ts.map +1 -1
  53. package/dist/fields/config/client.js +14 -10
  54. package/dist/fields/config/client.js.map +1 -1
  55. package/dist/globals/config/client.js +1 -1
  56. package/dist/globals/config/client.js.map +1 -1
  57. package/dist/globals/config/types.d.ts +2 -1
  58. package/dist/globals/config/types.d.ts.map +1 -1
  59. package/dist/globals/config/types.js.map +1 -1
  60. package/dist/index.d.ts +8 -2
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +1 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/preferences/preferencesCollection.d.ts.map +1 -1
  65. package/dist/preferences/preferencesCollection.js +5 -2
  66. package/dist/preferences/preferencesCollection.js.map +1 -1
  67. package/dist/utilities/deepCopyObject.d.ts +1 -1
  68. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  69. package/dist/utilities/deepCopyObject.js +6 -3
  70. package/dist/utilities/deepCopyObject.js.map +1 -1
  71. package/dist/utilities/deepMerge.d.ts +1 -1
  72. package/dist/utilities/deepMerge.d.ts.map +1 -1
  73. package/dist/utilities/deepMerge.js +3 -2
  74. package/dist/utilities/deepMerge.js.map +1 -1
  75. package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
  76. package/dist/utilities/getEntityPolicies.js +5 -1
  77. package/dist/utilities/getEntityPolicies.js.map +1 -1
  78. package/dist/utilities/removeUndefined.d.ts +2 -0
  79. package/dist/utilities/removeUndefined.d.ts.map +1 -0
  80. package/dist/utilities/removeUndefined.js +5 -0
  81. package/dist/utilities/removeUndefined.js.map +1 -0
  82. package/dist/utilities/sanitizePermissions.d.ts +14 -0
  83. package/dist/utilities/sanitizePermissions.d.ts.map +1 -0
  84. package/dist/utilities/sanitizePermissions.js +153 -0
  85. package/dist/utilities/sanitizePermissions.js.map +1 -0
  86. package/dist/utilities/sanitizePermissions.spec.js +428 -0
  87. package/dist/utilities/sanitizePermissions.spec.js.map +1 -0
  88. package/dist/utilities/traverseFields.d.ts +3 -1
  89. package/dist/utilities/traverseFields.d.ts.map +1 -1
  90. package/dist/utilities/traverseFields.js +67 -27
  91. package/dist/utilities/traverseFields.js.map +1 -1
  92. package/package.json +2 -2
@@ -0,0 +1,428 @@
1
+ import { recursivelySanitizePermissions, sanitizePermissions } from './sanitizePermissions.js';
2
+ /* eslint-disable perfectionist/sort-objects */ describe('recursivelySanitizePermissions', ()=>{
3
+ it('should sanitize a basic collection', ()=>{
4
+ const permissions = {
5
+ fields: {
6
+ text: {
7
+ create: {
8
+ permission: true
9
+ },
10
+ read: {
11
+ permission: true
12
+ },
13
+ update: {
14
+ permission: true
15
+ }
16
+ }
17
+ },
18
+ create: {
19
+ permission: true
20
+ },
21
+ read: {
22
+ permission: true
23
+ },
24
+ update: {
25
+ permission: true
26
+ },
27
+ delete: {
28
+ permission: false
29
+ },
30
+ readVersions: {
31
+ permission: true
32
+ }
33
+ };
34
+ recursivelySanitizePermissions(permissions);
35
+ expect(permissions).toStrictEqual({
36
+ fields: true,
37
+ create: true,
38
+ read: true,
39
+ update: true,
40
+ readVersions: true
41
+ });
42
+ });
43
+ it('should sanitize a collection with where queries', ()=>{
44
+ const permissions = {
45
+ fields: {},
46
+ create: {
47
+ permission: true,
48
+ where: {
49
+ user: {
50
+ equals: 2
51
+ }
52
+ }
53
+ },
54
+ read: {
55
+ permission: true
56
+ },
57
+ update: {
58
+ permission: true
59
+ },
60
+ delete: {
61
+ permission: false
62
+ },
63
+ readVersions: {
64
+ permission: true,
65
+ where: {
66
+ user: {
67
+ equals: 1
68
+ }
69
+ }
70
+ }
71
+ };
72
+ recursivelySanitizePermissions(permissions);
73
+ expect(permissions).toStrictEqual({
74
+ create: {
75
+ permission: true,
76
+ where: {
77
+ user: {
78
+ equals: 2
79
+ }
80
+ }
81
+ },
82
+ read: true,
83
+ update: true,
84
+ readVersions: {
85
+ permission: true,
86
+ where: {
87
+ user: {
88
+ equals: 1
89
+ }
90
+ }
91
+ }
92
+ });
93
+ });
94
+ it('should sanitize a collection with nested fields in blocks', ()=>{
95
+ const permissions = {
96
+ create: {
97
+ permission: true
98
+ },
99
+ delete: {
100
+ permission: true
101
+ },
102
+ read: {
103
+ permission: true
104
+ },
105
+ update: {
106
+ permission: true
107
+ },
108
+ fields: {
109
+ layout: {
110
+ create: {
111
+ permission: true
112
+ },
113
+ blocks: {
114
+ blockWithTitle: {
115
+ fields: {
116
+ blockTitle: {
117
+ create: {
118
+ permission: true
119
+ },
120
+ read: {
121
+ permission: true
122
+ },
123
+ update: {
124
+ permission: true
125
+ }
126
+ },
127
+ id: {
128
+ create: {
129
+ permission: true
130
+ },
131
+ read: {
132
+ permission: true
133
+ },
134
+ update: {
135
+ permission: true
136
+ }
137
+ },
138
+ blockName: {
139
+ create: {
140
+ permission: true
141
+ },
142
+ read: {
143
+ permission: true
144
+ },
145
+ update: {
146
+ permission: true
147
+ }
148
+ }
149
+ }
150
+ }
151
+ },
152
+ read: {
153
+ permission: true
154
+ },
155
+ update: {
156
+ permission: true
157
+ }
158
+ }
159
+ }
160
+ };
161
+ recursivelySanitizePermissions(permissions);
162
+ expect(permissions).toStrictEqual({
163
+ create: true,
164
+ delete: true,
165
+ fields: true,
166
+ read: true,
167
+ update: true
168
+ });
169
+ });
170
+ it('should sanitize a collection with nested fields in blocks without truncating', ()=>{
171
+ const permissions = {
172
+ create: {
173
+ permission: true
174
+ },
175
+ delete: {
176
+ permission: true
177
+ },
178
+ read: {
179
+ permission: true
180
+ },
181
+ update: {
182
+ permission: true
183
+ },
184
+ fields: {
185
+ layout: {
186
+ create: {
187
+ permission: true
188
+ },
189
+ blocks: {
190
+ blockWithTitle: {
191
+ fields: {
192
+ blockTitle: {
193
+ create: {
194
+ permission: true
195
+ },
196
+ read: {
197
+ permission: true
198
+ },
199
+ update: {
200
+ permission: true
201
+ }
202
+ },
203
+ id: {
204
+ create: {
205
+ permission: true
206
+ },
207
+ read: {
208
+ permission: true
209
+ },
210
+ update: {
211
+ permission: true
212
+ }
213
+ },
214
+ blockName: {
215
+ create: {
216
+ permission: false
217
+ },
218
+ read: {
219
+ permission: true
220
+ },
221
+ update: {
222
+ permission: false
223
+ }
224
+ }
225
+ }
226
+ }
227
+ },
228
+ read: {
229
+ permission: true
230
+ },
231
+ update: {
232
+ permission: true
233
+ }
234
+ }
235
+ }
236
+ };
237
+ recursivelySanitizePermissions(permissions);
238
+ expect(permissions).toStrictEqual({
239
+ create: true,
240
+ delete: true,
241
+ read: true,
242
+ update: true,
243
+ fields: {
244
+ layout: {
245
+ create: true,
246
+ blocks: {
247
+ blockWithTitle: {
248
+ fields: {
249
+ blockTitle: true,
250
+ id: true,
251
+ blockName: {
252
+ read: true
253
+ }
254
+ }
255
+ }
256
+ },
257
+ read: true,
258
+ update: true
259
+ }
260
+ }
261
+ });
262
+ });
263
+ it('should sanitize a collection with nested fields in arrays', ()=>{
264
+ const permissions = {
265
+ fields: {
266
+ arrayOfText: {
267
+ create: {
268
+ permission: true
269
+ },
270
+ fields: {
271
+ text: {
272
+ create: {
273
+ permission: true
274
+ },
275
+ read: {
276
+ permission: true
277
+ },
278
+ update: {
279
+ permission: true
280
+ }
281
+ },
282
+ hiddenText: {
283
+ create: {
284
+ permission: true
285
+ },
286
+ read: {
287
+ permission: false
288
+ },
289
+ update: {
290
+ permission: true
291
+ }
292
+ },
293
+ id: {
294
+ create: {
295
+ permission: true
296
+ },
297
+ read: {
298
+ permission: true
299
+ },
300
+ update: {
301
+ permission: true
302
+ }
303
+ }
304
+ },
305
+ read: {
306
+ permission: true
307
+ },
308
+ update: {
309
+ permission: true
310
+ }
311
+ }
312
+ }
313
+ };
314
+ recursivelySanitizePermissions(permissions);
315
+ expect(permissions).toStrictEqual({
316
+ fields: {
317
+ arrayOfText: {
318
+ create: true,
319
+ fields: {
320
+ text: true,
321
+ hiddenText: {
322
+ create: true,
323
+ update: true
324
+ },
325
+ id: true
326
+ },
327
+ read: true,
328
+ update: true
329
+ }
330
+ }
331
+ });
332
+ });
333
+ it('should sanitize a collection with nested fields in richText', ()=>{
334
+ const permissions = {
335
+ fields: {
336
+ text: {
337
+ create: {
338
+ permission: true
339
+ },
340
+ read: {
341
+ permission: true
342
+ },
343
+ update: {
344
+ permission: true
345
+ }
346
+ },
347
+ richText: {
348
+ create: {
349
+ permission: true
350
+ },
351
+ read: {
352
+ permission: true
353
+ },
354
+ update: {
355
+ permission: true
356
+ }
357
+ }
358
+ }
359
+ };
360
+ recursivelySanitizePermissions(permissions);
361
+ expect(permissions).toStrictEqual({
362
+ fields: true
363
+ });
364
+ });
365
+ });
366
+ describe('sanitizePermissions', ()=>{
367
+ it('should return nothing for unauthenticated user', ()=>{
368
+ const permissions = {
369
+ canAccessAdmin: false,
370
+ collections: {
371
+ 'payload-preferences': {
372
+ fields: {
373
+ user: {
374
+ create: {
375
+ permission: false
376
+ },
377
+ read: {
378
+ permission: false
379
+ },
380
+ update: {
381
+ permission: false
382
+ }
383
+ }
384
+ },
385
+ create: {
386
+ permission: false
387
+ },
388
+ read: {
389
+ permission: false
390
+ },
391
+ update: {
392
+ permission: false
393
+ },
394
+ delete: {
395
+ permission: false
396
+ }
397
+ }
398
+ },
399
+ globals: {
400
+ menu: {
401
+ fields: {
402
+ globalText: {
403
+ create: {
404
+ permission: false
405
+ },
406
+ read: {
407
+ permission: false
408
+ },
409
+ update: {
410
+ permission: false
411
+ }
412
+ }
413
+ },
414
+ read: {
415
+ permission: false
416
+ },
417
+ update: {
418
+ permission: false
419
+ }
420
+ }
421
+ }
422
+ };
423
+ const sanitizedPermissions = sanitizePermissions(permissions);
424
+ expect(sanitizedPermissions).toStrictEqual({});
425
+ });
426
+ });
427
+
428
+ //# sourceMappingURL=sanitizePermissions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/sanitizePermissions.spec.ts"],"sourcesContent":["import type { CollectionPermission, Permissions } from '../auth/types.js'\n\nimport { recursivelySanitizePermissions, sanitizePermissions } from './sanitizePermissions.js'\n\n/* eslint-disable perfectionist/sort-objects */\ndescribe('recursivelySanitizePermissions', () => {\n it('should sanitize a basic collection', () => {\n const permissions: CollectionPermission = {\n fields: {\n text: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n delete: {\n permission: false,\n },\n readVersions: {\n permission: true,\n },\n }\n\n recursivelySanitizePermissions(permissions)\n\n expect(permissions).toStrictEqual({\n fields: true,\n create: true,\n read: true,\n update: true,\n readVersions: true,\n })\n })\n\n it('should sanitize a collection with where queries', () => {\n const permissions: CollectionPermission = {\n fields: {},\n create: {\n permission: true,\n where: {\n user: {\n equals: 2,\n },\n },\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n delete: {\n permission: false,\n },\n readVersions: {\n permission: true,\n where: {\n user: {\n equals: 1,\n },\n },\n },\n }\n\n recursivelySanitizePermissions(permissions)\n\n expect(permissions).toStrictEqual({\n create: {\n permission: true,\n where: {\n user: {\n equals: 2,\n },\n },\n },\n read: true,\n update: true,\n readVersions: {\n permission: true,\n where: {\n user: {\n equals: 1,\n },\n },\n },\n })\n })\n\n it('should sanitize a collection with nested fields in blocks', () => {\n const permissions: CollectionPermission = {\n create: {\n permission: true,\n },\n delete: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n fields: {\n layout: {\n create: {\n permission: true,\n },\n blocks: {\n blockWithTitle: {\n fields: {\n blockTitle: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n id: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n blockName: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n },\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n }\n\n recursivelySanitizePermissions(permissions)\n\n expect(permissions).toStrictEqual({\n create: true,\n delete: true,\n fields: true,\n read: true,\n update: true,\n })\n })\n\n it('should sanitize a collection with nested fields in blocks without truncating', () => {\n const permissions: CollectionPermission = {\n create: {\n permission: true,\n },\n delete: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n fields: {\n layout: {\n create: {\n permission: true,\n },\n blocks: {\n blockWithTitle: {\n fields: {\n blockTitle: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n id: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n blockName: {\n create: {\n permission: false,\n },\n read: {\n permission: true,\n },\n update: {\n permission: false,\n },\n },\n },\n },\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n }\n\n recursivelySanitizePermissions(permissions)\n\n expect(permissions).toStrictEqual({\n create: true,\n delete: true,\n read: true,\n update: true,\n fields: {\n layout: {\n create: true,\n blocks: {\n blockWithTitle: {\n fields: {\n blockTitle: true,\n id: true,\n blockName: {\n read: true,\n },\n },\n },\n },\n read: true,\n update: true,\n },\n },\n })\n })\n\n it('should sanitize a collection with nested fields in arrays', () => {\n const permissions: Partial<CollectionPermission> = {\n fields: {\n arrayOfText: {\n create: {\n permission: true,\n },\n fields: {\n text: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n hiddenText: {\n create: {\n permission: true,\n },\n read: {\n permission: false,\n },\n update: {\n permission: true,\n },\n },\n id: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n }\n\n recursivelySanitizePermissions(permissions)\n\n expect(permissions).toStrictEqual({\n fields: {\n arrayOfText: {\n create: true,\n fields: {\n text: true,\n hiddenText: {\n create: true,\n update: true,\n },\n id: true,\n },\n read: true,\n update: true,\n },\n },\n })\n })\n\n it('should sanitize a collection with nested fields in richText', () => {\n const permissions: Partial<CollectionPermission> = {\n fields: {\n text: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n richText: {\n create: {\n permission: true,\n },\n read: {\n permission: true,\n },\n update: {\n permission: true,\n },\n },\n },\n }\n\n recursivelySanitizePermissions(permissions)\n\n expect(permissions).toStrictEqual({\n fields: true,\n })\n })\n})\n\ndescribe('sanitizePermissions', () => {\n it('should return nothing for unauthenticated user', () => {\n const permissions: Permissions = {\n canAccessAdmin: false,\n collections: {\n 'payload-preferences': {\n fields: {\n user: {\n create: {\n permission: false,\n },\n read: {\n permission: false,\n },\n update: {\n permission: false,\n },\n },\n },\n create: {\n permission: false,\n },\n read: {\n permission: false,\n },\n update: {\n permission: false,\n },\n delete: {\n permission: false,\n },\n },\n },\n globals: {\n menu: {\n fields: {\n globalText: {\n create: {\n permission: false,\n },\n read: {\n permission: false,\n },\n update: {\n permission: false,\n },\n },\n },\n read: {\n permission: false,\n },\n update: {\n permission: false,\n },\n },\n },\n }\n\n const sanitizedPermissions = sanitizePermissions(permissions)\n\n expect(sanitizedPermissions).toStrictEqual({})\n })\n})\n"],"names":["recursivelySanitizePermissions","sanitizePermissions","describe","it","permissions","fields","text","create","permission","read","update","delete","readVersions","expect","toStrictEqual","where","user","equals","layout","blocks","blockWithTitle","blockTitle","id","blockName","arrayOfText","hiddenText","richText","canAccessAdmin","collections","globals","menu","globalText","sanitizedPermissions"],"mappings":"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"}
@@ -20,6 +20,8 @@ export type TraverseFieldsCallback = (args: {
20
20
  type TraverseFieldsArgs = {
21
21
  callback: TraverseFieldsCallback;
22
22
  fields: (Field | TabAsField)[];
23
+ /** fill empty properties to use this without data */
24
+ fillEmpty?: boolean;
23
25
  parentRef?: Record<string, unknown> | unknown;
24
26
  ref?: Record<string, unknown> | unknown;
25
27
  };
@@ -31,6 +33,6 @@ type TraverseFieldsArgs = {
31
33
  * @param ref
32
34
  * @param parentRef
33
35
  */
34
- export declare const traverseFields: ({ callback, fields, parentRef, ref, }: TraverseFieldsArgs) => void;
36
+ export declare const traverseFields: ({ callback, fields, fillEmpty, parentRef, ref, }: TraverseFieldsArgs) => void;
35
37
  export {};
36
38
  //# sourceMappingURL=traverseFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA8B3F,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,0CAKxB,kBAAkB,KAAG,IAyEvB,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA8B3F,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qDAMxB,kBAAkB,KAAG,IAsIvB,CAAA"}
@@ -25,7 +25,7 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
25
25
  * @param callback callback called for each field, discontinue looping if callback returns truthy
26
26
  * @param ref
27
27
  * @param parentRef
28
- */ export const traverseFields = ({ callback, fields, parentRef = {}, ref = {} })=>{
28
+ */ export const traverseFields = ({ callback, fields, fillEmpty = true, parentRef = {}, ref = {} })=>{
29
29
  fields.some((field)=>{
30
30
  let skip = false;
31
31
  const next = ()=>{
@@ -42,13 +42,34 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
42
42
  if (skip) {
43
43
  return false;
44
44
  }
45
+ // avoid mutation of ref for all fields
46
+ let currentRef = ref;
47
+ let currentParentRef = parentRef;
45
48
  if (field.type === 'tabs' && 'tabs' in field) {
46
- field.tabs.forEach((tab)=>{
49
+ for (const tab of field.tabs){
47
50
  if ('name' in tab && tab.name) {
48
- if (typeof ref[tab.name] === 'undefined') {
49
- ref[tab.name] = {};
51
+ if (!ref[tab.name] || typeof ref[tab.name] !== 'object') {
52
+ if (fillEmpty) {
53
+ ref[tab.name] = {};
54
+ } else {
55
+ continue;
56
+ }
57
+ }
58
+ parentRef = ref;
59
+ currentRef = ref[tab.name];
60
+ if (tab.localized) {
61
+ for(const key in currentRef){
62
+ if (currentRef[key] && typeof currentRef[key] === 'object') {
63
+ traverseFields({
64
+ callback,
65
+ fields: tab.fields,
66
+ parentRef,
67
+ ref: currentRef[key]
68
+ });
69
+ }
70
+ }
71
+ continue;
50
72
  }
51
- ref = ref[tab.name];
52
73
  }
53
74
  if (callback && callback({
54
75
  field: {
@@ -57,7 +78,7 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
57
78
  },
58
79
  next,
59
80
  parentRef,
60
- ref
81
+ ref: currentRef
61
82
  })) {
62
83
  return true;
63
84
  }
@@ -65,32 +86,51 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
65
86
  callback,
66
87
  fields: tab.fields,
67
88
  parentRef,
68
- ref
89
+ ref: currentRef
69
90
  });
70
- });
91
+ }
71
92
  return;
72
93
  }
73
94
  if (field.type !== 'tab' && (fieldHasSubFields(field) || field.type === 'blocks')) {
74
- const parentRef = ref;
75
95
  if ('name' in field && field.name) {
76
- if (typeof ref[field.name] === 'undefined') {
77
- if (field.type === 'array' || field.type === 'blocks') {
78
- if (field.localized) {
96
+ currentParentRef = currentRef;
97
+ if (!ref[field.name]) {
98
+ if (fillEmpty) {
99
+ if (field.type === 'group') {
79
100
  ref[field.name] = {};
80
- } else {
81
- ref[field.name] = [];
101
+ } else if (field.type === 'array' || field.type === 'blocks') {
102
+ if (field.localized) {
103
+ ref[field.name] = {};
104
+ } else {
105
+ ref[field.name] = [];
106
+ }
82
107
  }
108
+ } else {
109
+ return;
83
110
  }
84
- if (field.type === 'group') {
85
- ref[field.name] = {};
111
+ }
112
+ currentRef = ref[field.name];
113
+ }
114
+ if (field.type === 'group' && field.localized && currentRef && typeof currentRef === 'object') {
115
+ for(const key in currentRef){
116
+ if (currentRef[key]) {
117
+ traverseFields({
118
+ callback,
119
+ fields: field.fields,
120
+ parentRef: currentParentRef,
121
+ ref: currentRef[key]
122
+ });
86
123
  }
87
124
  }
88
- ref = ref[field.name];
125
+ return;
89
126
  }
90
- if (field.type === 'blocks' || field.type === 'array') {
127
+ if ((field.type === 'blocks' || field.type === 'array') && currentRef && typeof currentRef === 'object') {
91
128
  if (field.localized) {
92
- for(const key in ref ?? {}){
93
- const localeData = ref[key];
129
+ if (Array.isArray(currentRef)) {
130
+ return;
131
+ }
132
+ for(const key in currentRef){
133
+ const localeData = currentRef[key];
94
134
  if (!Array.isArray(localeData)) {
95
135
  continue;
96
136
  }
@@ -98,23 +138,23 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
98
138
  callback,
99
139
  data: localeData,
100
140
  field,
101
- parentRef
141
+ parentRef: currentParentRef
102
142
  });
103
143
  }
104
- } else if (Array.isArray(ref)) {
144
+ } else if (Array.isArray(currentRef)) {
105
145
  traverseArrayOrBlocksField({
106
146
  callback,
107
- data: ref,
147
+ data: currentRef,
108
148
  field,
109
- parentRef
149
+ parentRef: currentParentRef
110
150
  });
111
151
  }
112
- } else {
152
+ } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {
113
153
  traverseFields({
114
154
  callback,
115
155
  fields: field.fields,
116
- parentRef,
117
- ref
156
+ parentRef: currentParentRef,
157
+ ref: currentRef
118
158
  });
119
159
  }
120
160
  }