@apollo/gateway 2.4.5 → 2.4.6

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.
Files changed (64) hide show
  1. package/dist/__generated__/graphqlTypes.d.ts +19 -1
  2. package/dist/__generated__/graphqlTypes.d.ts.map +1 -1
  3. package/dist/__generated__/graphqlTypes.js +1 -0
  4. package/dist/__generated__/graphqlTypes.js.map +1 -1
  5. package/package.json +4 -4
  6. package/src/__generated__/graphqlTypes.ts +33 -2
  7. package/src/__mocks__/tsconfig.json +0 -7
  8. package/src/__tests__/.gitkeep +0 -0
  9. package/src/__tests__/CucumberREADME.md +0 -96
  10. package/src/__tests__/build-query-plan.feature +0 -1471
  11. package/src/__tests__/buildQueryPlan.test.ts +0 -1225
  12. package/src/__tests__/executeQueryPlan.conditions.test.ts +0 -1488
  13. package/src/__tests__/executeQueryPlan.introspection.test.ts +0 -140
  14. package/src/__tests__/executeQueryPlan.test.ts +0 -6140
  15. package/src/__tests__/execution-utils.ts +0 -124
  16. package/src/__tests__/gateway/__snapshots__/opentelemetry.test.ts.snap +0 -195
  17. package/src/__tests__/gateway/buildService.test.ts +0 -249
  18. package/src/__tests__/gateway/endToEnd.test.ts +0 -486
  19. package/src/__tests__/gateway/executor.test.ts +0 -96
  20. package/src/__tests__/gateway/extensions.test.ts +0 -37
  21. package/src/__tests__/gateway/lifecycle-hooks.test.ts +0 -239
  22. package/src/__tests__/gateway/opentelemetry.test.ts +0 -123
  23. package/src/__tests__/gateway/queryPlanCache.test.ts +0 -231
  24. package/src/__tests__/gateway/queryPlannerConfig.test.ts +0 -101
  25. package/src/__tests__/gateway/reporting.test.ts +0 -616
  26. package/src/__tests__/gateway/supergraphSdl.test.ts +0 -396
  27. package/src/__tests__/gateway/testUtils.ts +0 -89
  28. package/src/__tests__/integration/abstract-types.test.ts +0 -1861
  29. package/src/__tests__/integration/aliases.test.ts +0 -180
  30. package/src/__tests__/integration/boolean.test.ts +0 -279
  31. package/src/__tests__/integration/complex-key.test.ts +0 -197
  32. package/src/__tests__/integration/configuration.test.ts +0 -404
  33. package/src/__tests__/integration/custom-directives.test.ts +0 -174
  34. package/src/__tests__/integration/execution-style.test.ts +0 -35
  35. package/src/__tests__/integration/fragments.test.ts +0 -237
  36. package/src/__tests__/integration/list-key.test.ts +0 -128
  37. package/src/__tests__/integration/logger.test.ts +0 -122
  38. package/src/__tests__/integration/managed.test.ts +0 -319
  39. package/src/__tests__/integration/merge-arrays.test.ts +0 -34
  40. package/src/__tests__/integration/multiple-key.test.ts +0 -327
  41. package/src/__tests__/integration/mutations.test.ts +0 -287
  42. package/src/__tests__/integration/networkRequests.test.ts +0 -542
  43. package/src/__tests__/integration/nockMocks.ts +0 -157
  44. package/src/__tests__/integration/provides.test.ts +0 -77
  45. package/src/__tests__/integration/requires.test.ts +0 -359
  46. package/src/__tests__/integration/scope.test.ts +0 -557
  47. package/src/__tests__/integration/single-service.test.ts +0 -119
  48. package/src/__tests__/integration/unions.test.ts +0 -79
  49. package/src/__tests__/integration/value-types.test.ts +0 -382
  50. package/src/__tests__/integration/variables.test.ts +0 -120
  51. package/src/__tests__/nockAssertions.ts +0 -20
  52. package/src/__tests__/queryPlanCucumber.test.ts +0 -55
  53. package/src/__tests__/resultShaping.test.ts +0 -605
  54. package/src/__tests__/testSetup.ts +0 -1
  55. package/src/__tests__/tsconfig.json +0 -8
  56. package/src/core/__tests__/core.test.ts +0 -412
  57. package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +0 -51
  58. package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +0 -574
  59. package/src/schema-helper/__tests__/addExtensions.test.ts +0 -70
  60. package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +0 -364
  61. package/src/supergraphManagers/IntrospectAndCompose/__tests__/loadServicesFromRemoteEndpoint.test.ts +0 -40
  62. package/src/supergraphManagers/UplinkSupergraphManager/__tests__/UplinkSupergraphManager.test.ts +0 -65
  63. package/src/supergraphManagers/UplinkSupergraphManager/__tests__/loadSupergraphSdlFromStorage.test.ts +0 -511
  64. package/src/utilities/__tests__/deepMerge.test.ts +0 -77
@@ -1,77 +0,0 @@
1
- import { execute, overrideResolversInService } from '../execution-utils';
2
- import { fixtures } from 'apollo-federation-integration-testsuite';
3
-
4
- it('does not have to go to another service when field is given', async () => {
5
- const query = `#graphql
6
- query GetReviewers {
7
- topReviews {
8
- author {
9
- username
10
- }
11
- }
12
- }
13
- `;
14
-
15
- const { data, queryPlan } = await execute( {
16
- query,
17
- });
18
-
19
- expect(data).toEqual({
20
- topReviews: [
21
- { author: { username: '@ada' } },
22
- { author: { username: '@ada' } },
23
- { author: { username: '@complete' } },
24
- { author: { username: '@complete' } },
25
- { author: { username: '@complete' } },
26
- ],
27
- });
28
-
29
- expect(queryPlan).not.toCallService('accounts');
30
- expect(queryPlan).toCallService('reviews');
31
- });
32
-
33
- it('does not load fields provided even when going to other service', async () => {
34
- const [accounts, ...restFixtures] = fixtures;
35
-
36
- const username = jest.fn();
37
- const localAccounts = overrideResolversInService(accounts, {
38
- User: {
39
- username,
40
- },
41
- });
42
-
43
- const query = `#graphql
44
- query GetReviewers {
45
- topReviews {
46
- author {
47
- username
48
- name {
49
- first
50
- last
51
- }
52
- }
53
- }
54
- }
55
- `;
56
-
57
- const { data, queryPlan } = await execute(
58
- {
59
- query,
60
- },
61
- [localAccounts, ...restFixtures],
62
- );
63
-
64
- expect(data).toEqual({
65
- topReviews: [
66
- { author: { username: '@ada', name: { first: 'Ada', last: 'Lovelace' } } },
67
- { author: { username: '@ada', name: { first: 'Ada', last: 'Lovelace' } } },
68
- { author: { username: '@complete', name: { first: 'Alan', last: 'Turing' } } },
69
- { author: { username: '@complete', name: { first: 'Alan', last: 'Turing' } } },
70
- { author: { username: '@complete', name: { first: 'Alan', last: 'Turing' } } },
71
- ],
72
- });
73
-
74
- expect(username).not.toHaveBeenCalled();
75
- expect(queryPlan).toCallService('accounts');
76
- expect(queryPlan).toCallService('reviews');
77
- });
@@ -1,359 +0,0 @@
1
- import gql from 'graphql-tag';
2
- import { execute } from '../execution-utils';
3
- import { astSerializer, queryPlanSerializer } from 'apollo-federation-integration-testsuite';
4
-
5
- expect.addSnapshotSerializer(astSerializer);
6
- expect.addSnapshotSerializer(queryPlanSerializer);
7
- it('supports passing additional fields defined by a requires', async () => {
8
- const query = `#graphql
9
- query GetReviwedBookNames {
10
- me {
11
- reviews {
12
- product {
13
- ... on Book {
14
- name
15
- }
16
- }
17
- }
18
- }
19
- }
20
- `;
21
-
22
- const { data, queryPlan } = await execute({
23
- query,
24
- });
25
-
26
- expect(data).toEqual({
27
- me: {
28
- reviews: [
29
- { product: {} },
30
- { product: {} },
31
- {
32
- product: {
33
- name: 'Design Patterns (1995)',
34
- },
35
- },
36
- ],
37
- },
38
- });
39
-
40
- expect(queryPlan).toCallService('accounts');
41
- expect(queryPlan).toCallService('reviews');
42
- expect(queryPlan).toCallService('product');
43
- expect(queryPlan).toCallService('books');
44
- });
45
-
46
- const serviceA = {
47
- name: 'a',
48
- typeDefs: gql`
49
- type Query {
50
- user: User
51
- }
52
-
53
- type User @key(fields: "id") {
54
- id: ID!
55
- preferences: Preferences
56
- }
57
-
58
- type Preferences {
59
- favorites: Things
60
- }
61
-
62
- type Things {
63
- color: String
64
- animal: String
65
- }
66
- `,
67
- resolvers: {
68
- Query: {
69
- user() {
70
- return {
71
- id: '1',
72
- preferences: {
73
- favorites: { color: 'limegreen', animal: 'platypus' },
74
- },
75
- };
76
- },
77
- },
78
- },
79
- };
80
-
81
- const serviceB = {
82
- name: 'b',
83
- typeDefs: gql`
84
- extend type User @key(fields: "id") {
85
- id: ID! @external
86
- preferences: Preferences @external
87
- favoriteColor: String
88
- @requires(fields: "preferences { favorites { color } }")
89
- favoriteAnimal: String
90
- @requires(fields: "preferences { favorites { animal } }")
91
- }
92
-
93
- extend type Preferences {
94
- favorites: Things @external
95
- }
96
-
97
- extend type Things {
98
- color: String @external
99
- animal: String @external
100
- }
101
- `,
102
- resolvers: {
103
- User: {
104
- favoriteColor(user: any) {
105
- return user.preferences.favorites.color;
106
- },
107
- favoriteAnimal(user: any) {
108
- return user.preferences.favorites.animal;
109
- },
110
- },
111
- },
112
- };
113
-
114
- it('collapses nested requires', async () => {
115
- const query = `#graphql
116
- query UserFavorites {
117
- user {
118
- favoriteColor
119
- favoriteAnimal
120
- }
121
- }
122
- `;
123
-
124
- const { data, errors, queryPlan } = await execute(
125
- {
126
- query,
127
- },
128
- [serviceA, serviceB],
129
- );
130
-
131
- expect(errors).toEqual(undefined);
132
-
133
- expect(queryPlan).toMatchInlineSnapshot(`
134
- QueryPlan {
135
- Sequence {
136
- Fetch(service: "a") {
137
- {
138
- user {
139
- __typename
140
- id
141
- preferences {
142
- favorites {
143
- animal
144
- color
145
- }
146
- }
147
- }
148
- }
149
- },
150
- Flatten(path: "user") {
151
- Fetch(service: "b") {
152
- {
153
- ... on User {
154
- __typename
155
- id
156
- preferences {
157
- favorites {
158
- animal
159
- color
160
- }
161
- }
162
- }
163
- } =>
164
- {
165
- ... on User {
166
- favoriteColor
167
- favoriteAnimal
168
- }
169
- }
170
- },
171
- },
172
- },
173
- }
174
- `);
175
-
176
- expect(data).toEqual({
177
- user: {
178
- favoriteAnimal: 'platypus',
179
- favoriteColor: 'limegreen',
180
- },
181
- });
182
-
183
- expect(queryPlan).toCallService('a');
184
- expect(queryPlan).toCallService('b');
185
- });
186
-
187
- it('collapses nested requires with user-defined fragments', async () => {
188
- const query = `#graphql
189
- query UserFavorites {
190
- user {
191
- favoriteAnimal
192
- ...favoriteColor
193
- }
194
- }
195
-
196
- fragment favoriteColor on User {
197
- preferences {
198
- favorites {
199
- color
200
- }
201
- }
202
- }
203
- `;
204
-
205
- const { data, errors, queryPlan } = await execute(
206
- {
207
- query,
208
- },
209
- [serviceA, serviceB],
210
- );
211
-
212
- expect(errors).toEqual(undefined);
213
-
214
- expect(queryPlan).toMatchInlineSnapshot(`
215
- QueryPlan {
216
- Sequence {
217
- Fetch(service: "a") {
218
- {
219
- user {
220
- __typename
221
- preferences {
222
- favorites {
223
- color
224
- animal
225
- }
226
- }
227
- id
228
- }
229
- }
230
- },
231
- Flatten(path: "user") {
232
- Fetch(service: "b") {
233
- {
234
- ... on User {
235
- __typename
236
- id
237
- preferences {
238
- favorites {
239
- animal
240
- }
241
- }
242
- }
243
- } =>
244
- {
245
- ... on User {
246
- favoriteAnimal
247
- }
248
- }
249
- },
250
- },
251
- },
252
- }
253
- `);
254
-
255
- expect(data).toEqual({
256
- user: {
257
- favoriteAnimal: 'platypus',
258
- preferences: {
259
- favorites: {
260
- color: 'limegreen',
261
- },
262
- },
263
- },
264
- });
265
-
266
- expect(queryPlan).toCallService('a');
267
- expect(queryPlan).toCallService('b');
268
- });
269
-
270
- it('passes null values correctly', async () => {
271
- const serviceA = {
272
- name: 'a',
273
- typeDefs: gql`
274
- type Query {
275
- user: User
276
- }
277
-
278
- type User @key(fields: "id") {
279
- id: ID!
280
- favorite: Color
281
- dislikes: [Color]
282
- }
283
-
284
- type Color {
285
- name: String!
286
- }
287
- `,
288
- resolvers: {
289
- Query: {
290
- user() {
291
- return {
292
- id: '1',
293
- favorite: null,
294
- dislikes: [null],
295
- };
296
- },
297
- },
298
- },
299
- };
300
-
301
- const serviceB = {
302
- name: 'b',
303
- typeDefs: gql`
304
- extend type User @key(fields: "id") {
305
- id: ID! @external
306
- favorite: Color @external
307
- dislikes: [Color] @external
308
- favoriteColor: String @requires(fields: "favorite { name }")
309
- dislikedColors: String @requires(fields: "dislikes { name }")
310
- }
311
-
312
- extend type Color {
313
- name: String! @external
314
- }
315
- `,
316
- resolvers: {
317
- User: {
318
- favoriteColor(user: any) {
319
- if (user.favorite !== null) {
320
- throw Error(
321
- 'Favorite color should be null. Instead, got: ' +
322
- JSON.stringify(user.favorite),
323
- );
324
- }
325
- return 'unknown';
326
- },
327
- dislikedColors(user: any) {
328
- const color = user.dislikes[0];
329
- if (color !== null) {
330
- throw Error(
331
- 'Disliked colors should be null. Instead, got: ' +
332
- JSON.stringify(user.dislikes),
333
- );
334
- }
335
- return 'unknown';
336
- },
337
- },
338
- },
339
- };
340
-
341
- const query = `#graphql
342
- query UserFavorites {
343
- user {
344
- favoriteColor
345
- dislikedColors
346
- }
347
- }
348
- `;
349
-
350
- const { data, errors } = await execute({ query }, [serviceA, serviceB]);
351
-
352
- expect(errors).toEqual(undefined);
353
- expect(data).toEqual({
354
- user: {
355
- favoriteColor: 'unknown',
356
- dislikedColors: 'unknown',
357
- },
358
- });
359
- });