Skip to content

Commit fbb58b5

Browse files
committed
enhance(utils/mergeIncrementalResults): remove dset\ dependency
1 parent 13d2609 commit fbb58b5

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

.changeset/fine-jobs-strive.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@graphql-tools/utils': patch
3+
---
4+
5+
Remove \`dset\` dependency

packages/utils/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
"@graphql-typed-document-node/core": "^3.1.1",
4141
"@whatwg-node/promise-helpers": "^1.0.0",
4242
"cross-inspect": "1.0.1",
43-
"dset": "^3.1.4",
4443
"tslib": "^2.4.0"
4544
},
4645
"devDependencies": {

packages/utils/src/mergeIncrementalResult.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { dset } from 'dset/merge';
21
import { GraphQLError } from 'graphql';
32
import { ExecutionResult } from './Interfaces.js';
3+
import { mergeDeep } from './mergeDeep.js';
44

55
export function mergeIncrementalResult({
66
incrementalResult,
@@ -13,14 +13,14 @@ export function mergeIncrementalResult({
1313

1414
if (incrementalResult.items) {
1515
for (const item of incrementalResult.items) {
16-
dset(executionResult, path, item);
16+
setObjectKeyPath(executionResult, path, item);
1717
// Increment the last path segment (the array index) to merge the next item at the next index
1818
(path[path.length - 1] as number)++;
1919
}
2020
}
2121

2222
if (incrementalResult.data) {
23-
dset(executionResult, path, incrementalResult.data);
23+
setObjectKeyPath(executionResult, path, incrementalResult.data);
2424
}
2525

2626
if (incrementalResult.errors) {
@@ -29,7 +29,7 @@ export function mergeIncrementalResult({
2929
}
3030

3131
if (incrementalResult.extensions) {
32-
dset(executionResult, 'extensions', incrementalResult.extensions);
32+
setObjectKeyPath(executionResult, ['extensions'], incrementalResult.extensions);
3333
}
3434

3535
if (incrementalResult.incremental) {
@@ -41,3 +41,25 @@ export function mergeIncrementalResult({
4141
});
4242
}
4343
}
44+
45+
function setObjectKeyPath(obj: Record<string, any>, keyPath: (string | number)[], value: any) {
46+
let current = obj;
47+
let i: number;
48+
for (i = 0; i < keyPath.length - 1; i++) {
49+
const key = keyPath[i];
50+
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
51+
return;
52+
}
53+
if (current[key] == null) {
54+
// Determine if the next key is a number to create an array, otherwise create an object
55+
current[key] = typeof keyPath[i + 1] === 'number' ? [] : {};
56+
}
57+
current = current[key];
58+
}
59+
const finalKey = keyPath[i];
60+
if (finalKey === '__proto__' || finalKey === 'constructor' || finalKey === 'prototype') {
61+
return;
62+
}
63+
const existingValue = current[finalKey];
64+
current[finalKey] = existingValue != null ? mergeDeep([existingValue, value]) : value;
65+
}

0 commit comments

Comments
 (0)