Commit cc94666
authored
fix(graphql): generate valid operations against large schemas (UsefulSoftwareCo#1146) (UsefulSoftwareCo#1173)
* fix(graphql): generate valid operations against large schemas
The selection-set builder emitted composite fields with no sub-selection
(when it hit the depth cap or cycle guard) and selected nested fields whose
required arguments it could not fill. Against a rich schema like GitLab's,
every generated tool over a non-trivial return type failed server-side
validation.
buildSelectionSet now skips nested fields with a required argument it cannot
supply, and drops composite fields whose sub-selection comes back empty
instead of printing them bare. Adds a regression test that drives the plugin
end to end against a GitLab-shaped graphql-js server.
Fixes UsefulSoftwareCo#1146
* refactor(graphql): scalar-leaf default selection + caller-controlled `select`
Replaces the baked-in recursive selection with two pieces:
- Default selection is now scalar/enum leaves of the return type only. This is
always valid (leaves need no sub-selection) and small enough to stay under a
server's query-complexity budget. Composite fields, and fields whose required
arguments cannot be synthesized, are no longer emitted bare or argument-less.
- Tools expose an optional `select` input carrying a GraphQL selection set,
spliced into the operation at invoke time, so callers request nested/list data
(and supply nested required arguments) per call instead of inheriting one
frozen, arbitrarily-bounded selection.
The old depth cap and first-12-fields truncation are gone: depth/breadth are now
the caller's choice via `select`, bounded by the server's own complexity limits.
* feat(graphql): validate a caller-supplied `select` locally before invoking
graphql-js is already a runtime dependency, so parse-check the assembled
operation when a `select` is provided and fail fast with a
`graphql_invalid_selection` error instead of building a request. This rejects a
malformed selection (and any attempt to break out of the field's selection set)
with a precise local error, and never reaches the network for those.
Field- and argument-level validity stays with the upstream server (which returns
verbatim errors): a local GraphQLSchema would need a full introspection
snapshot, but the stored snapshot is the plugin's reduced shape, which
buildClientSchema cannot consume.
The select-to-operation assembly is extracted to a shared
`effectiveOperationString` so the validated string and the sent string are
identical.1 parent c67ae4b commit cc94666
7 files changed
Lines changed: 394 additions & 36 deletions
File tree
- .changeset
- packages/plugins/graphql/src
- sdk
- testing
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
24 | 43 | | |
25 | 44 | | |
26 | 45 | | |
| |||
71 | 90 | | |
72 | 91 | | |
73 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
74 | 98 | | |
75 | 99 | | |
76 | 100 | | |
77 | | - | |
| 101 | + | |
78 | 102 | | |
79 | 103 | | |
80 | 104 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
| |||
885 | 886 | | |
886 | 887 | | |
887 | 888 | | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
| 929 | + | |
| 930 | + | |
| 931 | + | |
| 932 | + | |
| 933 | + | |
| 934 | + | |
| 935 | + | |
| 936 | + | |
| 937 | + | |
| 938 | + | |
| 939 | + | |
| 940 | + | |
| 941 | + | |
| 942 | + | |
| 943 | + | |
| 944 | + | |
| 945 | + | |
| 946 | + | |
| 947 | + | |
| 948 | + | |
| 949 | + | |
| 950 | + | |
| 951 | + | |
| 952 | + | |
| 953 | + | |
| 954 | + | |
| 955 | + | |
| 956 | + | |
| 957 | + | |
| 958 | + | |
| 959 | + | |
| 960 | + | |
| 961 | + | |
| 962 | + | |
| 963 | + | |
| 964 | + | |
| 965 | + | |
| 966 | + | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
0 commit comments