Skip to content

Commit 893772e

Browse files
committed
fix: await field hooks recursively
1 parent b987cb8 commit 893772e

File tree

11 files changed

+161
-65
lines changed

11 files changed

+161
-65
lines changed

src/fields/hooks/afterChange/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,17 @@ export const afterChange = async ({
1919
operation,
2020
req,
2121
}: Args): Promise<Record<string, unknown>> => {
22-
const promises = [];
23-
2422
const doc = deepCopyObject(incomingDoc);
2523

26-
traverseFields({
24+
await traverseFields({
2725
data,
2826
doc,
2927
fields: entityConfig.fields,
3028
operation,
31-
promises,
3229
req,
3330
siblingDoc: doc,
3431
siblingData: data,
3532
});
3633

37-
await Promise.all(promises);
38-
3934
return doc;
4035
};

src/fields/hooks/afterChange/promise.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ type Args = {
88
doc: Record<string, unknown>
99
field: Field
1010
operation: 'create' | 'update'
11-
promises: Promise<void>[]
1211
req: PayloadRequest
1312
siblingData: Record<string, unknown>
1413
siblingDoc: Record<string, unknown>
@@ -22,7 +21,6 @@ export const promise = async ({
2221
doc,
2322
field,
2423
operation,
25-
promises,
2624
req,
2725
siblingData,
2826
siblingDoc,
@@ -52,12 +50,11 @@ export const promise = async ({
5250
// Traverse subfields
5351
switch (field.type) {
5452
case 'group': {
55-
traverseFields({
53+
await traverseFields({
5654
data,
5755
doc,
5856
fields: field.fields,
5957
operation,
60-
promises,
6158
req,
6259
siblingData: siblingData[field.name] as Record<string, unknown> || {},
6360
siblingDoc: siblingDoc[field.name] as Record<string, unknown>,
@@ -70,18 +67,19 @@ export const promise = async ({
7067
const rows = siblingDoc[field.name];
7168

7269
if (Array.isArray(rows)) {
70+
const promises = [];
7371
rows.forEach((row, i) => {
74-
traverseFields({
72+
promises.push(traverseFields({
7573
data,
7674
doc,
7775
fields: field.fields,
7876
operation,
79-
promises,
8077
req,
8178
siblingData: siblingData[field.name]?.[i] || {},
8279
siblingDoc: { ...row } || {},
83-
});
80+
}));
8481
});
82+
await Promise.all(promises);
8583
}
8684
break;
8785
}
@@ -90,35 +88,35 @@ export const promise = async ({
9088
const rows = siblingDoc[field.name];
9189

9290
if (Array.isArray(rows)) {
91+
const promises = [];
9392
rows.forEach((row, i) => {
9493
const block = field.blocks.find((blockType) => blockType.slug === row.blockType);
9594

9695
if (block) {
97-
traverseFields({
96+
promises.push(traverseFields({
9897
data,
9998
doc,
10099
fields: block.fields,
101100
operation,
102-
promises,
103101
req,
104102
siblingData: siblingData[field.name]?.[i] || {},
105103
siblingDoc: { ...row } || {},
106-
});
104+
}));
107105
}
108106
});
107+
await Promise.all(promises);
109108
}
110109

111110
break;
112111
}
113112

114113
case 'row':
115114
case 'collapsible': {
116-
traverseFields({
115+
await traverseFields({
117116
data,
118117
doc,
119118
fields: field.fields,
120119
operation,
121-
promises,
122120
req,
123121
siblingData: siblingData || {},
124122
siblingDoc: { ...siblingDoc },
@@ -128,18 +126,19 @@ export const promise = async ({
128126
}
129127

130128
case 'tabs': {
129+
const promises = [];
131130
field.tabs.forEach((tab) => {
132-
traverseFields({
131+
promises.push(traverseFields({
133132
data,
134133
doc,
135134
fields: tab.fields,
136135
operation,
137-
promises,
138136
req,
139137
siblingData: siblingData || {},
140138
siblingDoc: { ...siblingDoc },
141-
});
139+
}));
142140
});
141+
await Promise.all(promises);
143142
break;
144143
}
145144

src/fields/hooks/afterChange/traverseFields.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,33 @@ type Args = {
77
doc: Record<string, unknown>
88
fields: Field[]
99
operation: 'create' | 'update'
10-
promises: Promise<void>[]
1110
req: PayloadRequest
1211
siblingData: Record<string, unknown>
1312
siblingDoc: Record<string, unknown>
1413
}
1514

16-
export const traverseFields = ({
15+
export const traverseFields = async ({
1716
data,
1817
doc,
1918
fields,
2019
operation,
21-
promises,
2220
req,
2321
siblingData,
2422
siblingDoc,
25-
}: Args): void => {
23+
}: Args): Promise<void> => {
24+
const promises = [];
25+
2626
fields.forEach((field) => {
2727
promises.push(promise({
2828
data,
2929
doc,
3030
field,
3131
operation,
32-
promises,
3332
req,
3433
siblingData,
3534
siblingDoc,
3635
}));
3736
});
37+
38+
await Promise.all(promises);
3839
};

src/fields/hooks/beforeChange/index.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export const beforeChange = async ({
2828
skipValidation,
2929
}: Args): Promise<Record<string, unknown>> => {
3030
const data = deepCopyObject(incomingData);
31-
const promises = [];
3231
const mergeLocaleActions = [];
3332
const errors: { message: string, field: string }[] = [];
3433

@@ -49,8 +48,6 @@ export const beforeChange = async ({
4948
skipValidation,
5049
});
5150

52-
await Promise.all(promises);
53-
5451
if (errors.length > 0) {
5552
throw new ValidationError(errors);
5653
}

src/fields/hooks/beforeChange/promise.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,8 @@ export const promise = async ({
196196
case 'array': {
197197
const rows = siblingData[field.name];
198198

199-
const promises = [];
200-
201199
if (Array.isArray(rows)) {
200+
const promises = [];
202201
rows.forEach((row, i) => {
203202
promises.push(traverseFields({
204203
data,
@@ -217,19 +216,19 @@ export const promise = async ({
217216
skipValidation: skipValidationFromHere,
218217
}));
219218
});
219+
220+
await Promise.all(promises);
220221
}
221222

222-
await Promise.all(promises);
223223

224224
break;
225225
}
226226

227227
case 'blocks': {
228228
const rows = siblingData[field.name];
229229

230-
const promises = [];
231-
232230
if (Array.isArray(rows)) {
231+
const promises = [];
233232
rows.forEach((row, i) => {
234233
const block = field.blocks.find((blockType) => blockType.slug === row.blockType);
235234

@@ -252,17 +251,17 @@ export const promise = async ({
252251
}));
253252
}
254253
});
254+
255+
await Promise.all(promises);
255256
}
256257

257-
await Promise.all(promises);
258258

259259
break;
260260
}
261261

262262
case 'row':
263263
case 'collapsible': {
264-
const promises = [];
265-
promises.push(traverseFields({
264+
await traverseFields({
266265
data,
267266
doc,
268267
docWithLocales,
@@ -277,9 +276,7 @@ export const promise = async ({
277276
siblingDoc,
278277
siblingDocWithLocales,
279278
skipValidation: skipValidationFromHere,
280-
}));
281-
282-
await Promise.all(promises);
279+
});
283280

284281
break;
285282
}

src/fields/hooks/beforeValidate/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,19 @@ export const beforeValidate = async ({
2323
overrideAccess,
2424
req,
2525
}: Args): Promise<Record<string, unknown>> => {
26-
const promises = [];
2726
const data = deepCopyObject(incomingData);
2827

29-
traverseFields({
28+
await traverseFields({
3029
data,
3130
doc,
3231
fields: entityConfig.fields,
3332
id,
3433
operation,
3534
overrideAccess,
36-
promises,
3735
req,
3836
siblingData: data,
3937
siblingDoc: doc,
4038
});
4139

42-
await Promise.all(promises);
43-
4440
return data;
4541
};

0 commit comments

Comments
 (0)