@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 +5 -37
- package/dist/index.cjs +10 -29
- package/dist/index.js +10 -29
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,44 +1,12 @@
|
|
|
1
1
|
# @graphql-tools/federation
|
|
2
2
|
|
|
3
|
-
## 4.4.4
|
|
3
|
+
## 4.4.4
|
|
4
4
|
### Patch Changes
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
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
|
|
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
|
-
|
|
810
|
-
|
|
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
|
|
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
|
-
|
|
808
|
-
|
|
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
|
|
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
|
|
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
|
|
46
|
+
"@graphql-tools/stitch": "^10.1.20",
|
|
47
47
|
"@graphql-tools/utils": "^11.0.0",
|
|
48
|
-
"@graphql-tools/wrap": "11.1.16
|
|
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",
|