@apollo/gateway 0.300.0-alpha.2 → 2.0.0-alpha.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.
Files changed (198) hide show
  1. package/LICENSE +95 -0
  2. package/README.md +1 -1
  3. package/dist/__generated__/graphqlTypes.d.ts +130 -0
  4. package/dist/__generated__/graphqlTypes.d.ts.map +1 -0
  5. package/dist/__generated__/graphqlTypes.js +25 -0
  6. package/dist/__generated__/graphqlTypes.js.map +1 -0
  7. package/dist/config.d.ts +104 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +47 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/datasources/LocalGraphQLDataSource.d.ts +3 -3
  12. package/dist/datasources/LocalGraphQLDataSource.d.ts.map +1 -1
  13. package/dist/datasources/LocalGraphQLDataSource.js +5 -5
  14. package/dist/datasources/LocalGraphQLDataSource.js.map +1 -1
  15. package/dist/datasources/RemoteGraphQLDataSource.d.ts +6 -4
  16. package/dist/datasources/RemoteGraphQLDataSource.d.ts.map +1 -1
  17. package/dist/datasources/RemoteGraphQLDataSource.js +60 -17
  18. package/dist/datasources/RemoteGraphQLDataSource.js.map +1 -1
  19. package/dist/datasources/index.d.ts +1 -1
  20. package/dist/datasources/index.d.ts.map +1 -1
  21. package/dist/datasources/index.js +1 -0
  22. package/dist/datasources/index.js.map +1 -1
  23. package/dist/datasources/parseCacheControlHeader.d.ts +2 -0
  24. package/dist/datasources/parseCacheControlHeader.d.ts.map +1 -0
  25. package/dist/datasources/parseCacheControlHeader.js +16 -0
  26. package/dist/datasources/parseCacheControlHeader.js.map +1 -0
  27. package/dist/datasources/types.d.ts +16 -1
  28. package/dist/datasources/types.d.ts.map +1 -1
  29. package/dist/datasources/types.js +7 -0
  30. package/dist/datasources/types.js.map +1 -1
  31. package/dist/executeQueryPlan.d.ts +2 -1
  32. package/dist/executeQueryPlan.d.ts.map +1 -1
  33. package/dist/executeQueryPlan.js +199 -112
  34. package/dist/executeQueryPlan.js.map +1 -1
  35. package/dist/index.d.ts +62 -80
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +543 -234
  38. package/dist/index.js.map +1 -1
  39. package/dist/loadServicesFromRemoteEndpoint.d.ts +9 -9
  40. package/dist/loadServicesFromRemoteEndpoint.d.ts.map +1 -1
  41. package/dist/loadServicesFromRemoteEndpoint.js +13 -8
  42. package/dist/loadServicesFromRemoteEndpoint.js.map +1 -1
  43. package/dist/loadSupergraphSdlFromStorage.d.ts +13 -0
  44. package/dist/loadSupergraphSdlFromStorage.d.ts.map +1 -0
  45. package/dist/loadSupergraphSdlFromStorage.js +101 -0
  46. package/dist/loadSupergraphSdlFromStorage.js.map +1 -0
  47. package/dist/operationContext.d.ts +17 -0
  48. package/dist/operationContext.d.ts.map +1 -0
  49. package/dist/operationContext.js +42 -0
  50. package/dist/operationContext.js.map +1 -0
  51. package/dist/outOfBandReporter.d.ts +15 -0
  52. package/dist/outOfBandReporter.d.ts.map +1 -0
  53. package/dist/outOfBandReporter.js +88 -0
  54. package/dist/outOfBandReporter.js.map +1 -0
  55. package/dist/utilities/array.d.ts +1 -2
  56. package/dist/utilities/array.d.ts.map +1 -1
  57. package/dist/utilities/array.js +7 -14
  58. package/dist/utilities/array.js.map +1 -1
  59. package/dist/utilities/assert.d.ts +2 -0
  60. package/dist/utilities/assert.d.ts.map +1 -0
  61. package/dist/utilities/assert.js +10 -0
  62. package/dist/utilities/assert.js.map +1 -0
  63. package/dist/utilities/cleanErrorOfInaccessibleNames.d.ts +3 -0
  64. package/dist/utilities/cleanErrorOfInaccessibleNames.d.ts.map +1 -0
  65. package/dist/utilities/cleanErrorOfInaccessibleNames.js +27 -0
  66. package/dist/utilities/cleanErrorOfInaccessibleNames.js.map +1 -0
  67. package/dist/utilities/deepMerge.js +2 -2
  68. package/dist/utilities/deepMerge.js.map +1 -1
  69. package/dist/utilities/graphql.d.ts +1 -4
  70. package/dist/utilities/graphql.d.ts.map +1 -1
  71. package/dist/utilities/graphql.js +3 -36
  72. package/dist/utilities/graphql.js.map +1 -1
  73. package/dist/utilities/opentelemetry.d.ts +10 -0
  74. package/dist/utilities/opentelemetry.d.ts.map +1 -0
  75. package/dist/utilities/opentelemetry.js +19 -0
  76. package/dist/utilities/opentelemetry.js.map +1 -0
  77. package/package.json +30 -21
  78. package/src/__generated__/graphqlTypes.ts +140 -0
  79. package/src/__mocks__/apollo-server-env.ts +56 -0
  80. package/src/__mocks__/make-fetch-happen-fetcher.ts +55 -0
  81. package/src/__mocks__/tsconfig.json +7 -0
  82. package/src/__tests__/build-query-plan.feature +40 -311
  83. package/src/__tests__/buildQueryPlan.test.ts +246 -426
  84. package/src/__tests__/executeQueryPlan.test.ts +1691 -194
  85. package/src/__tests__/execution-utils.ts +33 -26
  86. package/src/__tests__/gateway/__snapshots__/opentelemetry.test.ts.snap +195 -0
  87. package/src/__tests__/gateway/buildService.test.ts +16 -19
  88. package/src/__tests__/gateway/composedSdl.test.ts +44 -0
  89. package/src/__tests__/gateway/endToEnd.test.ts +166 -0
  90. package/src/__tests__/gateway/executor.test.ts +49 -43
  91. package/src/__tests__/gateway/lifecycle-hooks.test.ts +58 -29
  92. package/src/__tests__/gateway/opentelemetry.test.ts +123 -0
  93. package/src/__tests__/gateway/queryPlanCache.test.ts +19 -20
  94. package/src/__tests__/gateway/reporting.test.ts +76 -55
  95. package/src/__tests__/integration/abstract-types.test.ts +1086 -22
  96. package/src/__tests__/integration/aliases.test.ts +5 -6
  97. package/src/__tests__/integration/boolean.test.ts +40 -38
  98. package/src/__tests__/integration/complex-key.test.ts +41 -56
  99. package/src/__tests__/integration/configuration.test.ts +321 -0
  100. package/src/__tests__/integration/custom-directives.test.ts +61 -46
  101. package/src/__tests__/integration/fragments.test.ts +8 -2
  102. package/src/__tests__/integration/list-key.test.ts +2 -2
  103. package/src/__tests__/integration/logger.test.ts +2 -2
  104. package/src/__tests__/integration/multiple-key.test.ts +11 -12
  105. package/src/__tests__/integration/mutations.test.ts +8 -5
  106. package/src/__tests__/integration/networkRequests.test.ts +447 -289
  107. package/src/__tests__/integration/nockMocks.ts +95 -66
  108. package/src/__tests__/integration/provides.test.ts +9 -6
  109. package/src/__tests__/integration/requires.test.ts +17 -15
  110. package/src/__tests__/integration/scope.test.ts +557 -0
  111. package/src/__tests__/integration/unions.test.ts +1 -1
  112. package/src/__tests__/integration/value-types.test.ts +35 -32
  113. package/src/__tests__/integration/variables.test.ts +8 -2
  114. package/src/__tests__/loadServicesFromRemoteEndpoint.test.ts +6 -2
  115. package/src/__tests__/loadSupergraphSdlFromStorage.test.ts +694 -0
  116. package/src/__tests__/queryPlanCucumber.test.ts +11 -61
  117. package/src/__tests__/testSetup.ts +1 -4
  118. package/src/__tests__/tsconfig.json +2 -1
  119. package/src/config.ts +225 -0
  120. package/src/core/__tests__/core.test.ts +412 -0
  121. package/src/datasources/LocalGraphQLDataSource.ts +9 -10
  122. package/src/datasources/RemoteGraphQLDataSource.ts +117 -43
  123. package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +11 -4
  124. package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +148 -79
  125. package/src/datasources/__tests__/tsconfig.json +4 -2
  126. package/src/datasources/index.ts +1 -1
  127. package/src/datasources/parseCacheControlHeader.ts +43 -0
  128. package/src/datasources/types.ts +47 -2
  129. package/src/executeQueryPlan.ts +264 -153
  130. package/src/index.ts +925 -480
  131. package/src/loadServicesFromRemoteEndpoint.ts +24 -17
  132. package/src/loadSupergraphSdlFromStorage.ts +140 -0
  133. package/src/make-fetch-happen.d.ts +2 -2
  134. package/src/operationContext.ts +70 -0
  135. package/src/outOfBandReporter.ts +128 -0
  136. package/src/utilities/__tests__/cleanErrorOfInaccessibleElements.test.ts +104 -0
  137. package/src/utilities/__tests__/tsconfig.json +8 -0
  138. package/src/utilities/array.ts +6 -28
  139. package/src/utilities/assert.ts +14 -0
  140. package/src/utilities/cleanErrorOfInaccessibleNames.ts +29 -0
  141. package/src/utilities/graphql.ts +0 -64
  142. package/src/utilities/opentelemetry.ts +13 -0
  143. package/CHANGELOG.md +0 -226
  144. package/LICENSE.md +0 -20
  145. package/dist/FieldSet.d.ts +0 -18
  146. package/dist/FieldSet.d.ts.map +0 -1
  147. package/dist/FieldSet.js +0 -96
  148. package/dist/FieldSet.js.map +0 -1
  149. package/dist/QueryPlan.d.ts +0 -41
  150. package/dist/QueryPlan.d.ts.map +0 -1
  151. package/dist/QueryPlan.js +0 -15
  152. package/dist/QueryPlan.js.map +0 -1
  153. package/dist/buildQueryPlan.d.ts +0 -44
  154. package/dist/buildQueryPlan.d.ts.map +0 -1
  155. package/dist/buildQueryPlan.js +0 -670
  156. package/dist/buildQueryPlan.js.map +0 -1
  157. package/dist/loadServicesFromStorage.d.ts +0 -21
  158. package/dist/loadServicesFromStorage.d.ts.map +0 -1
  159. package/dist/loadServicesFromStorage.js +0 -64
  160. package/dist/loadServicesFromStorage.js.map +0 -1
  161. package/dist/snapshotSerializers/astSerializer.d.ts +0 -3
  162. package/dist/snapshotSerializers/astSerializer.d.ts.map +0 -1
  163. package/dist/snapshotSerializers/astSerializer.js +0 -14
  164. package/dist/snapshotSerializers/astSerializer.js.map +0 -1
  165. package/dist/snapshotSerializers/index.d.ts +0 -13
  166. package/dist/snapshotSerializers/index.d.ts.map +0 -1
  167. package/dist/snapshotSerializers/index.js +0 -15
  168. package/dist/snapshotSerializers/index.js.map +0 -1
  169. package/dist/snapshotSerializers/queryPlanSerializer.d.ts +0 -3
  170. package/dist/snapshotSerializers/queryPlanSerializer.d.ts.map +0 -1
  171. package/dist/snapshotSerializers/queryPlanSerializer.js +0 -78
  172. package/dist/snapshotSerializers/queryPlanSerializer.js.map +0 -1
  173. package/dist/snapshotSerializers/selectionSetSerializer.d.ts +0 -3
  174. package/dist/snapshotSerializers/selectionSetSerializer.d.ts.map +0 -1
  175. package/dist/snapshotSerializers/selectionSetSerializer.js +0 -12
  176. package/dist/snapshotSerializers/selectionSetSerializer.js.map +0 -1
  177. package/dist/snapshotSerializers/typeSerializer.d.ts +0 -3
  178. package/dist/snapshotSerializers/typeSerializer.d.ts.map +0 -1
  179. package/dist/snapshotSerializers/typeSerializer.js +0 -12
  180. package/dist/snapshotSerializers/typeSerializer.js.map +0 -1
  181. package/dist/utilities/MultiMap.d.ts +0 -4
  182. package/dist/utilities/MultiMap.d.ts.map +0 -1
  183. package/dist/utilities/MultiMap.js +0 -17
  184. package/dist/utilities/MultiMap.js.map +0 -1
  185. package/src/FieldSet.ts +0 -169
  186. package/src/QueryPlan.ts +0 -57
  187. package/src/__tests__/matchers/toCallService.ts +0 -105
  188. package/src/__tests__/matchers/toHaveBeenCalledBefore.ts +0 -40
  189. package/src/__tests__/matchers/toHaveFetched.ts +0 -81
  190. package/src/__tests__/matchers/toMatchAST.ts +0 -64
  191. package/src/buildQueryPlan.ts +0 -1190
  192. package/src/loadServicesFromStorage.ts +0 -170
  193. package/src/snapshotSerializers/astSerializer.ts +0 -21
  194. package/src/snapshotSerializers/index.ts +0 -21
  195. package/src/snapshotSerializers/queryPlanSerializer.ts +0 -144
  196. package/src/snapshotSerializers/selectionSetSerializer.ts +0 -13
  197. package/src/snapshotSerializers/typeSerializer.ts +0 -11
  198. package/src/utilities/MultiMap.ts +0 -11
@@ -2,14 +2,15 @@ import { gunzipSync } from 'zlib';
2
2
  import nock from 'nock';
3
3
  import { GraphQLSchemaModule } from 'apollo-graphql';
4
4
  import gql from 'graphql-tag';
5
- import { buildFederatedSchema } from '@apollo/federation';
5
+ import { buildSubgraphSchema } from '@apollo/subgraph';
6
6
  import { ApolloServer } from 'apollo-server';
7
+ import { ApolloServerPluginUsageReporting } from 'apollo-server-core';
7
8
  import { execute, toPromise } from 'apollo-link';
8
9
  import { createHttpLink } from 'apollo-link-http';
9
10
  import fetch from 'node-fetch';
10
11
  import { ApolloGateway } from '../..';
11
12
  import { Plugin, Config, Refs } from 'pretty-format';
12
- import { Report } from 'apollo-engine-reporting-protobuf';
13
+ import { Report, Trace } from 'apollo-reporting-protobuf';
13
14
  import { fixtures } from 'apollo-federation-integration-testsuite';
14
15
 
15
16
  // Normalize specific fields that change often (eg timestamps) to static values,
@@ -28,7 +29,7 @@ function replaceFieldValuesSerializer(
28
29
  value &&
29
30
  typeof value === 'object' &&
30
31
  !value[alreadyProcessed] &&
31
- fieldNames.some(n => n in value)
32
+ fieldNames.some((n) => n in value)
32
33
  );
33
34
  },
34
35
 
@@ -45,7 +46,7 @@ function replaceFieldValuesSerializer(
45
46
  // don't reprocess it ourselves.
46
47
  const newValue = { ...value };
47
48
  Object.defineProperty(newValue, alreadyProcessed, { value: true });
48
- fieldNames.forEach(fn => {
49
+ fieldNames.forEach((fn) => {
49
50
  if (fn in value) {
50
51
  const replacement = replacements[fn];
51
52
  if (typeof replacement === 'function') {
@@ -77,7 +78,7 @@ expect.addSnapshotSerializer(
77
78
  );
78
79
 
79
80
  async function startFederatedServer(modules: GraphQLSchemaModule[]) {
80
- const schema = buildFederatedSchema(modules);
81
+ const schema = buildSubgraphSchema(modules);
81
82
  const server = new ApolloServer({ schema });
82
83
  const { url } = await server.listen({ port: 0 });
83
84
  return { url, server };
@@ -92,11 +93,11 @@ describe('reporting', () => {
92
93
 
93
94
  beforeEach(async () => {
94
95
  let reportResolver: (report: any) => void;
95
- reportPromise = new Promise<any>(resolve => {
96
+ reportPromise = new Promise<any>((resolve) => {
96
97
  reportResolver = resolve;
97
98
  });
98
99
 
99
- nockScope = nock('https://engine-report.apollodata.com')
100
+ nockScope = nock('https://usage-reporting.api.apollographql.com')
100
101
  .post('/api/ingress/traces')
101
102
  .reply(200, (_: any, requestBody: string) => {
102
103
  reportResolver(requestBody);
@@ -116,10 +117,15 @@ describe('reporting', () => {
116
117
  gatewayServer = new ApolloServer({
117
118
  schema,
118
119
  executor,
119
- engine: {
120
- apiKey: 'service:foo:bar',
121
- sendReportsImmediately: true,
120
+ apollo: {
121
+ key: 'service:foo:bar',
122
+ graphRef: 'foo@current',
122
123
  },
124
+ plugins: [
125
+ ApolloServerPluginUsageReporting({
126
+ sendReportsImmediately: true,
127
+ }),
128
+ ],
123
129
  });
124
130
  ({ url: gatewayUrl } = await gatewayServer.listen({ port: 0 }));
125
131
  });
@@ -138,7 +144,10 @@ describe('reporting', () => {
138
144
  const query = gql`
139
145
  query {
140
146
  me {
141
- name
147
+ name {
148
+ first
149
+ last
150
+ }
142
151
  }
143
152
  topProducts {
144
153
  name
@@ -152,31 +161,34 @@ describe('reporting', () => {
152
161
  }),
153
162
  );
154
163
  expect(result).toMatchInlineSnapshot(`
155
- Object {
156
- "data": Object {
157
- "me": Object {
158
- "name": "Ada Lovelace",
159
- },
160
- "topProducts": Array [
161
- Object {
162
- "name": "Table",
163
- },
164
- Object {
165
- "name": "Couch",
166
- },
167
- Object {
168
- "name": "Chair",
169
- },
170
- Object {
171
- "name": "Structure and Interpretation of Computer Programs (1996)",
172
- },
173
- Object {
174
- "name": "Object Oriented Software Construction (1997)",
175
- },
176
- ],
177
- },
178
- }
179
- `);
164
+ Object {
165
+ "data": Object {
166
+ "me": Object {
167
+ "name": Object {
168
+ "first": "Ada",
169
+ "last": "Lovelace",
170
+ },
171
+ },
172
+ "topProducts": Array [
173
+ Object {
174
+ "name": "Table",
175
+ },
176
+ Object {
177
+ "name": "Couch",
178
+ },
179
+ Object {
180
+ "name": "Chair",
181
+ },
182
+ Object {
183
+ "name": "Structure and Interpretation of Computer Programs (1996)",
184
+ },
185
+ Object {
186
+ "name": "Object Oriented Software Construction (1997)",
187
+ },
188
+ ],
189
+ },
190
+ }
191
+ `);
180
192
  const reportBody = await reportPromise;
181
193
  // nock returns binary bodies as hex strings
182
194
  const gzipReportBuffer = Buffer.from(reportBody, 'hex');
@@ -184,10 +196,10 @@ describe('reporting', () => {
184
196
  const report = Report.decode(reportBuffer);
185
197
 
186
198
  // Some handwritten tests to capture salient properties.
187
- const statsReportKey = '# -\n{me{name}topProducts{name}}';
199
+ const statsReportKey = '# -\n{me{name{first last}}topProducts{name}}';
188
200
  expect(Object.keys(report.tracesPerQuery)).toStrictEqual([statsReportKey]);
189
201
  expect(report.tracesPerQuery[statsReportKey]!.trace!.length).toBe(1);
190
- const trace = report.tracesPerQuery[statsReportKey]!.trace![0]!;
202
+ const trace = report.tracesPerQuery[statsReportKey]!.trace![0]! as Trace;
191
203
  // In the gateway, the root trace is just an empty node (unless there are errors).
192
204
  expect(trace.root!.child).toStrictEqual([]);
193
205
  // The query plan has (among other things) a fetch against 'accounts' and a
@@ -211,13 +223,20 @@ describe('reporting', () => {
211
223
 
212
224
  expect(report).toMatchInlineSnapshot(`
213
225
  Object {
214
- "endTime": null,
226
+ "endTime": Object {
227
+ "nanos": 123000000,
228
+ "seconds": "1562203363",
229
+ },
215
230
  "header": "<HEADER>",
216
231
  "tracesPerQuery": Object {
217
232
  "# -
218
- {me{name}topProducts{name}}": Object {
233
+ {me{name{first last}}topProducts{name}}": Object {
219
234
  "trace": Array [
220
235
  Object {
236
+ "cachePolicy": Object {
237
+ "maxAgeNs": "30000000000",
238
+ "scope": "PRIVATE",
239
+ },
221
240
  "clientName": "",
222
241
  "clientReferenceId": "",
223
242
  "clientVersion": "",
@@ -258,11 +277,27 @@ describe('reporting', () => {
258
277
  Object {
259
278
  "child": Array [
260
279
  Object {
280
+ "child": Array [
281
+ Object {
282
+ "endTime": "45678",
283
+ "parentType": "Name",
284
+ "responseName": "first",
285
+ "startTime": "34567",
286
+ "type": "String",
287
+ },
288
+ Object {
289
+ "endTime": "45678",
290
+ "parentType": "Name",
291
+ "responseName": "last",
292
+ "startTime": "34567",
293
+ "type": "String",
294
+ },
295
+ ],
261
296
  "endTime": "45678",
262
297
  "parentType": "User",
263
298
  "responseName": "name",
264
299
  "startTime": "34567",
265
- "type": "String",
300
+ "type": "Name",
266
301
  },
267
302
  ],
268
303
  "endTime": "45678",
@@ -409,13 +444,6 @@ describe('reporting', () => {
409
444
  "child": Array [
410
445
  Object {
411
446
  "child": Array [
412
- Object {
413
- "endTime": "45678",
414
- "parentType": "Book",
415
- "responseName": "isbn",
416
- "startTime": "34567",
417
- "type": "String!",
418
- },
419
447
  Object {
420
448
  "endTime": "45678",
421
449
  "parentType": "Book",
@@ -435,13 +463,6 @@ describe('reporting', () => {
435
463
  },
436
464
  Object {
437
465
  "child": Array [
438
- Object {
439
- "endTime": "45678",
440
- "parentType": "Book",
441
- "responseName": "isbn",
442
- "startTime": "34567",
443
- "type": "String!",
444
- },
445
466
  Object {
446
467
  "endTime": "45678",
447
468
  "parentType": "Book",