@graphql-tools/executor 4.1.2-alpha-20261020173910-a605a674247c515b91bf401145ced64cc938b464 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1010,10 +1010,15 @@ function collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, re
1010
1010
  ensureIncrementalCollectState(exeContext);
1011
1011
  const parentDeferUsage = asyncPayloadRecord?.type === 'defer' ? asyncPayloadRecord.deferUsage : undefined;
1012
1012
  const subfieldCache = (exeContext.incrementalSubfieldCache ??= new WeakMap());
1013
- let collected = subfieldCache.get(fieldNodes);
1013
+ let collectedByType = subfieldCache.get(fieldNodes);
1014
+ if (collectedByType == null) {
1015
+ collectedByType = new WeakMap();
1016
+ subfieldCache.set(fieldNodes, collectedByType);
1017
+ }
1018
+ let collected = collectedByType.get(returnType);
1014
1019
  if (collected == null) {
1015
1020
  collected = (0, incrementalCollect_js_1.collectIncrementalSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes, parentDeferUsage, exeContext.deferUsageByFieldNode);
1016
- subfieldCache.set(fieldNodes, collected);
1021
+ collectedByType.set(returnType, collected);
1017
1022
  }
1018
1023
  const { groupedFieldSet } = collected;
1019
1024
  const parentDeferUsages = new Set();
@@ -995,10 +995,15 @@ function collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, re
995
995
  ensureIncrementalCollectState(exeContext);
996
996
  const parentDeferUsage = asyncPayloadRecord?.type === 'defer' ? asyncPayloadRecord.deferUsage : undefined;
997
997
  const subfieldCache = (exeContext.incrementalSubfieldCache ??= new WeakMap());
998
- let collected = subfieldCache.get(fieldNodes);
998
+ let collectedByType = subfieldCache.get(fieldNodes);
999
+ if (collectedByType == null) {
1000
+ collectedByType = new WeakMap();
1001
+ subfieldCache.set(fieldNodes, collectedByType);
1002
+ }
1003
+ let collected = collectedByType.get(returnType);
999
1004
  if (collected == null) {
1000
1005
  collected = collectIncrementalSubfields(exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes, parentDeferUsage, exeContext.deferUsageByFieldNode);
1001
- subfieldCache.set(fieldNodes, collected);
1006
+ collectedByType.set(returnType, collected);
1002
1007
  }
1003
1008
  const { groupedFieldSet } = collected;
1004
1009
  const parentDeferUsages = new Set();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphql-tools/executor",
3
- "version": "4.1.2-alpha-20261020173910-a605a674247c515b91bf401145ced64cc938b464",
3
+ "version": "4.1.2",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "graphql": "^16.0.0 || ^17.0.0"
@@ -69,10 +69,12 @@ export interface ExecutionContext<TVariables = any, TContext = any> {
69
69
  */
70
70
  deferUsagesForFieldNodes?: WeakMap<ReadonlyArray<FieldNode>, DeferUsageSet>;
71
71
  /**
72
- * Memoize incremental subfield collect per fieldNodes array so list
73
- * items reuse the same DeferUsage objects.
72
+ * Memoize incremental subfield collect per fieldNodes array and
73
+ * concrete return type so list items of the same type reuse DeferUsage
74
+ * objects without sharing type-conditioned selections across a
75
+ * heterogeneous interface or union list.
74
76
  */
75
- incrementalSubfieldCache?: WeakMap<ReadonlyArray<FieldNode>, ReturnType<typeof collectIncrementalSubfields>>;
77
+ incrementalSubfieldCache?: WeakMap<ReadonlyArray<FieldNode>, WeakMap<GraphQLObjectType, ReturnType<typeof collectIncrementalSubfields>>>;
76
78
  signal?: AbortSignal;
77
79
  getAbortSignal: () => AbortSignal | undefined;
78
80
  getAsyncHelpers: () => {
@@ -69,10 +69,12 @@ export interface ExecutionContext<TVariables = any, TContext = any> {
69
69
  */
70
70
  deferUsagesForFieldNodes?: WeakMap<ReadonlyArray<FieldNode>, DeferUsageSet>;
71
71
  /**
72
- * Memoize incremental subfield collect per fieldNodes array so list
73
- * items reuse the same DeferUsage objects.
72
+ * Memoize incremental subfield collect per fieldNodes array and
73
+ * concrete return type so list items of the same type reuse DeferUsage
74
+ * objects without sharing type-conditioned selections across a
75
+ * heterogeneous interface or union list.
74
76
  */
75
- incrementalSubfieldCache?: WeakMap<ReadonlyArray<FieldNode>, ReturnType<typeof collectIncrementalSubfields>>;
77
+ incrementalSubfieldCache?: WeakMap<ReadonlyArray<FieldNode>, WeakMap<GraphQLObjectType, ReturnType<typeof collectIncrementalSubfields>>>;
76
78
  signal?: AbortSignal;
77
79
  getAbortSignal: () => AbortSignal | undefined;
78
80
  getAsyncHelpers: () => {