/
mergeIncrementalResult.ts
43 lines (37 loc) · 1.23 KB
/
mergeIncrementalResult.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import { dset } from 'dset/merge';
import { GraphQLError } from 'graphql';
import { ExecutionResult } from './Interfaces.js';
export function mergeIncrementalResult({
incrementalResult,
executionResult,
}: {
incrementalResult: ExecutionResult;
executionResult: ExecutionResult;
}) {
const path = ['data', ...(incrementalResult.path ?? [])];
if (incrementalResult.items) {
for (const item of incrementalResult.items) {
dset(executionResult, path, item);
// Increment the last path segment (the array index) to merge the next item at the next index
(path[path.length - 1] as number)++;
}
}
if (incrementalResult.data) {
dset(executionResult, path, incrementalResult.data);
}
if (incrementalResult.errors) {
executionResult.errors = executionResult.errors || [];
(executionResult.errors as GraphQLError[]).push(...incrementalResult.errors);
}
if (incrementalResult.extensions) {
dset(executionResult, 'extensions', incrementalResult.extensions);
}
if (incrementalResult.incremental) {
incrementalResult.incremental.forEach(incrementalSubResult => {
mergeIncrementalResult({
incrementalResult: incrementalSubResult,
executionResult,
});
});
}
}