Skip to content

Commit ed3d0ae

Browse files
committed
sub-fields on a mutation operation will now process synchronously
1 parent 3595ea9 commit ed3d0ae

File tree

2 files changed

+105
-1
lines changed

2 files changed

+105
-1
lines changed

src/execution/__tests__/mutations-test.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,40 @@ const numberHolderType = new GraphQLObjectType({
5858
},
5959
name: 'NumberHolder',
6060
});
61+
const subFieldType = new GraphQLObjectType({
62+
name: 'subFieldMutation',
63+
fields: {
64+
immediatelyChangeTheNumber: {
65+
type: numberHolderType,
66+
args: { newNumber: { type: GraphQLInt } },
67+
resolve(obj, { newNumber }) {
68+
return obj.immediatelyChangeTheNumber(newNumber);
69+
},
70+
},
71+
promiseToChangeTheNumber: {
72+
type: numberHolderType,
73+
args: { newNumber: { type: GraphQLInt } },
74+
resolve(obj, { newNumber }) {
75+
return obj.promiseToChangeTheNumber(newNumber);
76+
},
77+
},
78+
failToChangeTheNumber: {
79+
type: numberHolderType,
80+
args: { newNumber: { type: GraphQLInt } },
81+
resolve(obj, { newNumber }) {
82+
return obj.failToChangeTheNumber(newNumber);
83+
},
84+
},
85+
promiseAndFailToChangeTheNumber: {
86+
type: numberHolderType,
87+
args: { newNumber: { type: GraphQLInt } },
88+
resolve(obj, { newNumber }) {
89+
return obj.promiseAndFailToChangeTheNumber(newNumber);
90+
},
91+
},
92+
},
93+
});
94+
6195
const schema = new GraphQLSchema({
6296
query: new GraphQLObjectType({
6397
fields: {
@@ -67,6 +101,12 @@ const schema = new GraphQLSchema({
67101
}),
68102
mutation: new GraphQLObjectType({
69103
fields: {
104+
subField: {
105+
type: subFieldType,
106+
resolve(obj) {
107+
return obj;
108+
},
109+
},
70110
immediatelyChangeTheNumber: {
71111
type: numberHolderType,
72112
args: { newNumber: { type: GraphQLInt } },
@@ -118,6 +158,23 @@ describe('Execute: Handles mutation execution ordering', () => {
118158
fifth: immediatelyChangeTheNumber(newNumber: 5) {
119159
theNumber
120160
}
161+
subField {
162+
first: immediatelyChangeTheNumber(newNumber: 6) {
163+
theNumber
164+
},
165+
second: promiseToChangeTheNumber(newNumber: 7) {
166+
theNumber
167+
},
168+
third: immediatelyChangeTheNumber(newNumber: 8) {
169+
theNumber
170+
}
171+
fourth: promiseToChangeTheNumber(newNumber: 9) {
172+
theNumber
173+
},
174+
fifth: immediatelyChangeTheNumber(newNumber: 10) {
175+
theNumber
176+
}
177+
}
121178
}`;
122179

123180
const mutationResult = await execute(schema, parse(doc), new Root(6));
@@ -129,6 +186,13 @@ describe('Execute: Handles mutation execution ordering', () => {
129186
third: { theNumber: 3 },
130187
fourth: { theNumber: 4 },
131188
fifth: { theNumber: 5 },
189+
subField: {
190+
first: { theNumber: 6 },
191+
second: { theNumber: 7 },
192+
third: { theNumber: 8 },
193+
fourth: { theNumber: 9 },
194+
fifth: { theNumber: 10 },
195+
},
132196
},
133197
});
134198
});
@@ -153,6 +217,26 @@ describe('Execute: Handles mutation execution ordering', () => {
153217
sixth: promiseAndFailToChangeTheNumber(newNumber: 6) {
154218
theNumber
155219
}
220+
subField {
221+
first: immediatelyChangeTheNumber(newNumber: 7) {
222+
theNumber
223+
},
224+
second: promiseToChangeTheNumber(newNumber: 8) {
225+
theNumber
226+
},
227+
third: failToChangeTheNumber(newNumber: 9) {
228+
theNumber
229+
}
230+
fourth: promiseToChangeTheNumber(newNumber: 10) {
231+
theNumber
232+
},
233+
fifth: immediatelyChangeTheNumber(newNumber: 11) {
234+
theNumber
235+
}
236+
sixth: promiseAndFailToChangeTheNumber(newNumber: 12) {
237+
theNumber
238+
}
239+
}
156240
}`;
157241

158242
const result = await execute(schema, parse(doc), new Root(6));
@@ -165,6 +249,14 @@ describe('Execute: Handles mutation execution ordering', () => {
165249
fourth: { theNumber: 4 },
166250
fifth: { theNumber: 5 },
167251
sixth: null,
252+
subField: {
253+
first: { theNumber: 7 },
254+
second: { theNumber: 8 },
255+
third: null,
256+
fourth: { theNumber: 10 },
257+
fifth: { theNumber: 11 },
258+
sixth: null,
259+
},
168260
},
169261
errors: [
170262
{
@@ -177,6 +269,16 @@ describe('Execute: Handles mutation execution ordering', () => {
177269
locations: [{ line: 17, column: 7 }],
178270
path: ['sixth'],
179271
},
272+
{
273+
message: 'Cannot change the number',
274+
locations: [{ line: 27, column: 9 }],
275+
path: ['subField', 'third'],
276+
},
277+
{
278+
message: 'Cannot change the number',
279+
locations: [{ line: 36, column: 9 }],
280+
path: ['subField', 'sixth'],
281+
},
180282
],
181283
});
182284
});

src/execution/execute.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,9 @@ function collectAndExecuteSubfields(
11301130
): MaybePromise<ObjMap<mixed>> {
11311131
// Collect sub-fields to execute to complete this value.
11321132
const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes);
1133-
return executeFields(exeContext, returnType, result, path, subFieldNodes);
1133+
return exeContext.operation.operation === 'mutation'
1134+
? executeFieldsSerially(exeContext, returnType, result, path, subFieldNodes)
1135+
: executeFields(exeContext, returnType, result, path, subFieldNodes);
11341136
}
11351137

11361138
/**

0 commit comments

Comments
 (0)