@graphql-tools/federation 4.4.4-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb → 4.4.4

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.
package/CHANGELOG.md CHANGED
@@ -1,44 +1,12 @@
1
1
  # @graphql-tools/federation
2
2
 
3
- ## 4.4.4-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb
3
+ ## 4.4.4
4
4
  ### Patch Changes
5
5
 
6
-
7
-
8
- - [#2351](https://github.com/graphql-hive/gateway/pull/2351) [`96a4674`](https://github.com/graphql-hive/gateway/commit/96a4674a514e93d69c299c07916e06f49feed477) Thanks [@ardatan](https://github.com/ardatan)! - Fix `@provides` so the gateway only requests the provided fields the client actually selected, and stops delegating to the owner subgraph when `@provides` already covers the request.
9
-
10
- Previously, when a subgraph declared `@provides(fields: "...")` on a field, the gateway would still:
11
-
12
- 1. Forward **every** field listed in `@provides` to that subgraph, even when the client never asked for them.
13
- 2. After receiving the response, plan additional delegations to the owner subgraph for `@provides`-covered fields whenever the providing subgraph declared them as `@external`, even though the data was already returned.
14
-
15
- For example with:
16
-
17
- ```graphql
18
- # subgraph B (provider)
19
- type Query {
20
- entity: Entity @provides(fields: "name description")
21
- }
22
-
23
- type Entity @key(fields: "id") {
24
- id: ID!
25
- name: String! @external
26
- description: String! @external
27
- }
28
- ```
29
-
30
- a client query of `{ entity { id name } }` would still cause the gateway to ask subgraph B for `description` *and* fetch `name` again from subgraph A (the owner of `Entity`).
31
-
32
- After this fix:
33
-
34
- - Only the `@provides` fields the client actually selected are forwarded to the providing subgraph (request side).
35
- - The delegation planner now recognises `@provides` declarations at every nested level (e.g. `@provides(fields: "categories { id name subCategories { id name } }")`) and `@provides` declarations made via inline fragments on union/interface members (e.g. `@provides(fields: "... on Book { title }")`), so the gateway no longer round-trips to the owner subgraph for fields that the providing subgraph has already returned.
36
-
37
- Aliases, fragments, fragment spreads, `@include`/`@skip` directives wrapping a `@provides` field, and nested `@provides` selections are preserved.
38
- - Updated dependencies [[`96a4674`](https://github.com/graphql-hive/gateway/commit/96a4674a514e93d69c299c07916e06f49feed477)]:
39
- - @graphql-tools/delegate@12.0.17-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb
40
- - @graphql-tools/stitch@10.1.20-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb
41
- - @graphql-tools/wrap@11.1.16-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb
6
+ - Updated dependencies [[`3e774e0`](https://github.com/graphql-hive/gateway/commit/3e774e050bc2d3c33e0f36a258ab6a8d94bf0750)]:
7
+ - @graphql-tools/delegate@12.0.17
8
+ - @graphql-tools/stitch@10.1.20
9
+ - @graphql-tools/wrap@11.1.16
42
10
 
43
11
  ## 4.4.3
44
12
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -713,28 +713,7 @@ function getStitchingOptionsFromSupergraphSdl(opts) {
713
713
  (argumentNode) => argumentNode.name.value === "provides"
714
714
  );
715
715
  if (providedExtraField?.value?.kind === graphql.Kind.STRING) {
716
- let registerProvidedSelectionForField2 = function(parentTypeName, fieldName, selectionSet) {
717
- let fieldMap = typeNameFieldProvidedSelectionMap.get(parentTypeName);
718
- if (!fieldMap) {
719
- fieldMap = /* @__PURE__ */ new Map();
720
- typeNameFieldProvidedSelectionMap.set(
721
- parentTypeName,
722
- fieldMap
723
- );
724
- }
725
- const existing = fieldMap.get(fieldName);
726
- if (existing) {
727
- fieldMap.set(fieldName, {
728
- kind: graphql.Kind.SELECTION_SET,
729
- selections: [
730
- ...existing.selections,
731
- ...selectionSet.selections
732
- ]
733
- });
734
- } else {
735
- fieldMap.set(fieldName, selectionSet);
736
- }
737
- }, handleSelection2 = function(fieldNodeTypeName2, selection) {
716
+ let handleSelection2 = function(fieldNodeTypeName2, selection) {
738
717
  switch (selection.kind) {
739
718
  case graphql.Kind.FIELD:
740
719
  {
@@ -763,11 +742,6 @@ function getStitchingOptionsFromSupergraphSdl(opts) {
763
742
  }
764
743
  providedFields.add(selection.name.value);
765
744
  if (selection.selectionSet) {
766
- registerProvidedSelectionForField2(
767
- fieldNodeTypeName2,
768
- selection.name.value,
769
- selection.selectionSet
770
- );
771
745
  const extraFieldNodeNamedType = getNamedTypeNode(
772
746
  extraFieldNodeInType.type
773
747
  );
@@ -806,8 +780,15 @@ function getStitchingOptionsFromSupergraphSdl(opts) {
806
780
  typeNameFieldProvidedSelectionMap
807
781
  );
808
782
  }
809
- registerProvidedSelectionForField2(
810
- typeNode.name.value,
783
+ let fieldProvidedSelectionMap = typeNameFieldProvidedSelectionMap.get(typeNode.name.value);
784
+ if (!fieldProvidedSelectionMap) {
785
+ fieldProvidedSelectionMap = /* @__PURE__ */ new Map();
786
+ typeNameFieldProvidedSelectionMap.set(
787
+ typeNode.name.value,
788
+ fieldProvidedSelectionMap
789
+ );
790
+ }
791
+ fieldProvidedSelectionMap.set(
811
792
  fieldNode.name.value,
812
793
  providesSelectionSet
813
794
  );
package/dist/index.js CHANGED
@@ -711,28 +711,7 @@ function getStitchingOptionsFromSupergraphSdl(opts) {
711
711
  (argumentNode) => argumentNode.name.value === "provides"
712
712
  );
713
713
  if (providedExtraField?.value?.kind === Kind.STRING) {
714
- let registerProvidedSelectionForField2 = function(parentTypeName, fieldName, selectionSet) {
715
- let fieldMap = typeNameFieldProvidedSelectionMap.get(parentTypeName);
716
- if (!fieldMap) {
717
- fieldMap = /* @__PURE__ */ new Map();
718
- typeNameFieldProvidedSelectionMap.set(
719
- parentTypeName,
720
- fieldMap
721
- );
722
- }
723
- const existing = fieldMap.get(fieldName);
724
- if (existing) {
725
- fieldMap.set(fieldName, {
726
- kind: Kind.SELECTION_SET,
727
- selections: [
728
- ...existing.selections,
729
- ...selectionSet.selections
730
- ]
731
- });
732
- } else {
733
- fieldMap.set(fieldName, selectionSet);
734
- }
735
- }, handleSelection2 = function(fieldNodeTypeName2, selection) {
714
+ let handleSelection2 = function(fieldNodeTypeName2, selection) {
736
715
  switch (selection.kind) {
737
716
  case Kind.FIELD:
738
717
  {
@@ -761,11 +740,6 @@ function getStitchingOptionsFromSupergraphSdl(opts) {
761
740
  }
762
741
  providedFields.add(selection.name.value);
763
742
  if (selection.selectionSet) {
764
- registerProvidedSelectionForField2(
765
- fieldNodeTypeName2,
766
- selection.name.value,
767
- selection.selectionSet
768
- );
769
743
  const extraFieldNodeNamedType = getNamedTypeNode(
770
744
  extraFieldNodeInType.type
771
745
  );
@@ -804,8 +778,15 @@ function getStitchingOptionsFromSupergraphSdl(opts) {
804
778
  typeNameFieldProvidedSelectionMap
805
779
  );
806
780
  }
807
- registerProvidedSelectionForField2(
808
- typeNode.name.value,
781
+ let fieldProvidedSelectionMap = typeNameFieldProvidedSelectionMap.get(typeNode.name.value);
782
+ if (!fieldProvidedSelectionMap) {
783
+ fieldProvidedSelectionMap = /* @__PURE__ */ new Map();
784
+ typeNameFieldProvidedSelectionMap.set(
785
+ typeNode.name.value,
786
+ fieldProvidedSelectionMap
787
+ );
788
+ }
789
+ fieldProvidedSelectionMap.set(
809
790
  fieldNode.name.value,
810
791
  providesSelectionSet
811
792
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphql-tools/federation",
3
- "version": "4.4.4-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb",
3
+ "version": "4.4.4",
4
4
  "type": "module",
5
5
  "description": "Useful tools to create and manipulate GraphQL schemas.",
6
6
  "repository": {
@@ -38,14 +38,14 @@
38
38
  "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
39
39
  },
40
40
  "dependencies": {
41
- "@graphql-tools/delegate": "12.0.17-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb",
41
+ "@graphql-tools/delegate": "^12.0.17",
42
42
  "@graphql-tools/executor": "^1.4.13",
43
43
  "@graphql-tools/executor-http": "^3.3.0",
44
44
  "@graphql-tools/merge": "^9.1.5",
45
45
  "@graphql-tools/schema": "^10.0.29",
46
- "@graphql-tools/stitch": "10.1.20-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb",
46
+ "@graphql-tools/stitch": "^10.1.20",
47
47
  "@graphql-tools/utils": "^11.0.0",
48
- "@graphql-tools/wrap": "11.1.16-alpha-cc6e877dd43c47e20e00638efc161a0bed4e2ccb",
48
+ "@graphql-tools/wrap": "^11.1.16",
49
49
  "@graphql-yoga/typed-event-target": "^3.0.2",
50
50
  "@whatwg-node/disposablestack": "^0.0.6",
51
51
  "@whatwg-node/events": "^0.1.2",