UNPKG

@graphql-tools/utils

Version:

Common package containing utils and types for GraphQL tools

87 lines (86 loc) 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mergeIncrementalResult = void 0; const tslib_1 = require("tslib"); const dlv_1 = tslib_1.__importDefault(require("dlv")); const merge_1 = require("dset/merge"); const pathsMap = new WeakMap(); function mergeIncrementalResult({ incrementalResult, executionResult, }) { let path = [ 'data', ...(incrementalResult.path ?? []), ]; for (const result of [executionResult, incrementalResult]) { if (result.pending) { let paths = pathsMap.get(executionResult); if (paths === undefined) { paths = new Map(); pathsMap.set(executionResult, paths); } for (const { id, path } of result.pending) { paths.set(id, ['data', ...path]); } } } const items = incrementalResult.items; if (items) { const id = incrementalResult.id; if (id) { path = pathsMap.get(executionResult)?.get(id); if (path === undefined) { throw new Error('Invalid incremental delivery format.'); } const list = (0, dlv_1.default)(executionResult, path); list.push(...items); } else { const path = ['data', ...(incrementalResult.path ?? [])]; for (const item of items) { (0, merge_1.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]++; } } } const data = incrementalResult.data; if (data) { const id = incrementalResult.id; if (id) { path = pathsMap.get(executionResult)?.get(id); if (path === undefined) { throw new Error('Invalid incremental delivery format.'); } const subPath = incrementalResult.subPath; if (subPath !== undefined) { path = [...path, ...subPath]; } } (0, merge_1.dset)(executionResult, path, data); } if (incrementalResult.errors) { executionResult.errors = executionResult.errors || []; executionResult.errors.push(...incrementalResult.errors); } if (incrementalResult.extensions) { (0, merge_1.dset)(executionResult, 'extensions', incrementalResult.extensions); } if (incrementalResult.incremental) { incrementalResult.incremental.forEach(incrementalSubResult => { mergeIncrementalResult({ incrementalResult: incrementalSubResult, executionResult, }); }); } if (incrementalResult.completed) { // Remove tracking and add additional errors for (const { id, errors } of incrementalResult.completed) { pathsMap.get(executionResult)?.delete(id); if (errors) { executionResult.errors = executionResult.errors || []; executionResult.errors.push(...errors); } } } } exports.mergeIncrementalResult = mergeIncrementalResult;