@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.
- package/LICENSE +95 -0
- package/README.md +1 -1
- package/dist/__generated__/graphqlTypes.d.ts +130 -0
- package/dist/__generated__/graphqlTypes.d.ts.map +1 -0
- package/dist/__generated__/graphqlTypes.js +25 -0
- package/dist/__generated__/graphqlTypes.js.map +1 -0
- package/dist/config.d.ts +104 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/datasources/LocalGraphQLDataSource.d.ts +3 -3
- package/dist/datasources/LocalGraphQLDataSource.d.ts.map +1 -1
- package/dist/datasources/LocalGraphQLDataSource.js +5 -5
- package/dist/datasources/LocalGraphQLDataSource.js.map +1 -1
- package/dist/datasources/RemoteGraphQLDataSource.d.ts +6 -4
- package/dist/datasources/RemoteGraphQLDataSource.d.ts.map +1 -1
- package/dist/datasources/RemoteGraphQLDataSource.js +60 -17
- package/dist/datasources/RemoteGraphQLDataSource.js.map +1 -1
- package/dist/datasources/index.d.ts +1 -1
- package/dist/datasources/index.d.ts.map +1 -1
- package/dist/datasources/index.js +1 -0
- package/dist/datasources/index.js.map +1 -1
- package/dist/datasources/parseCacheControlHeader.d.ts +2 -0
- package/dist/datasources/parseCacheControlHeader.d.ts.map +1 -0
- package/dist/datasources/parseCacheControlHeader.js +16 -0
- package/dist/datasources/parseCacheControlHeader.js.map +1 -0
- package/dist/datasources/types.d.ts +16 -1
- package/dist/datasources/types.d.ts.map +1 -1
- package/dist/datasources/types.js +7 -0
- package/dist/datasources/types.js.map +1 -1
- package/dist/executeQueryPlan.d.ts +2 -1
- package/dist/executeQueryPlan.d.ts.map +1 -1
- package/dist/executeQueryPlan.js +199 -112
- package/dist/executeQueryPlan.js.map +1 -1
- package/dist/index.d.ts +62 -80
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +543 -234
- package/dist/index.js.map +1 -1
- package/dist/loadServicesFromRemoteEndpoint.d.ts +9 -9
- package/dist/loadServicesFromRemoteEndpoint.d.ts.map +1 -1
- package/dist/loadServicesFromRemoteEndpoint.js +13 -8
- package/dist/loadServicesFromRemoteEndpoint.js.map +1 -1
- package/dist/loadSupergraphSdlFromStorage.d.ts +13 -0
- package/dist/loadSupergraphSdlFromStorage.d.ts.map +1 -0
- package/dist/loadSupergraphSdlFromStorage.js +101 -0
- package/dist/loadSupergraphSdlFromStorage.js.map +1 -0
- package/dist/operationContext.d.ts +17 -0
- package/dist/operationContext.d.ts.map +1 -0
- package/dist/operationContext.js +42 -0
- package/dist/operationContext.js.map +1 -0
- package/dist/outOfBandReporter.d.ts +15 -0
- package/dist/outOfBandReporter.d.ts.map +1 -0
- package/dist/outOfBandReporter.js +88 -0
- package/dist/outOfBandReporter.js.map +1 -0
- package/dist/utilities/array.d.ts +1 -2
- package/dist/utilities/array.d.ts.map +1 -1
- package/dist/utilities/array.js +7 -14
- package/dist/utilities/array.js.map +1 -1
- package/dist/utilities/assert.d.ts +2 -0
- package/dist/utilities/assert.d.ts.map +1 -0
- package/dist/utilities/assert.js +10 -0
- package/dist/utilities/assert.js.map +1 -0
- package/dist/utilities/cleanErrorOfInaccessibleNames.d.ts +3 -0
- package/dist/utilities/cleanErrorOfInaccessibleNames.d.ts.map +1 -0
- package/dist/utilities/cleanErrorOfInaccessibleNames.js +27 -0
- package/dist/utilities/cleanErrorOfInaccessibleNames.js.map +1 -0
- package/dist/utilities/deepMerge.js +2 -2
- package/dist/utilities/deepMerge.js.map +1 -1
- package/dist/utilities/graphql.d.ts +1 -4
- package/dist/utilities/graphql.d.ts.map +1 -1
- package/dist/utilities/graphql.js +3 -36
- package/dist/utilities/graphql.js.map +1 -1
- package/dist/utilities/opentelemetry.d.ts +10 -0
- package/dist/utilities/opentelemetry.d.ts.map +1 -0
- package/dist/utilities/opentelemetry.js +19 -0
- package/dist/utilities/opentelemetry.js.map +1 -0
- package/package.json +30 -21
- package/src/__generated__/graphqlTypes.ts +140 -0
- package/src/__mocks__/apollo-server-env.ts +56 -0
- package/src/__mocks__/make-fetch-happen-fetcher.ts +55 -0
- package/src/__mocks__/tsconfig.json +7 -0
- package/src/__tests__/build-query-plan.feature +40 -311
- package/src/__tests__/buildQueryPlan.test.ts +246 -426
- package/src/__tests__/executeQueryPlan.test.ts +1691 -194
- package/src/__tests__/execution-utils.ts +33 -26
- package/src/__tests__/gateway/__snapshots__/opentelemetry.test.ts.snap +195 -0
- package/src/__tests__/gateway/buildService.test.ts +16 -19
- package/src/__tests__/gateway/composedSdl.test.ts +44 -0
- package/src/__tests__/gateway/endToEnd.test.ts +166 -0
- package/src/__tests__/gateway/executor.test.ts +49 -43
- package/src/__tests__/gateway/lifecycle-hooks.test.ts +58 -29
- package/src/__tests__/gateway/opentelemetry.test.ts +123 -0
- package/src/__tests__/gateway/queryPlanCache.test.ts +19 -20
- package/src/__tests__/gateway/reporting.test.ts +76 -55
- package/src/__tests__/integration/abstract-types.test.ts +1086 -22
- package/src/__tests__/integration/aliases.test.ts +5 -6
- package/src/__tests__/integration/boolean.test.ts +40 -38
- package/src/__tests__/integration/complex-key.test.ts +41 -56
- package/src/__tests__/integration/configuration.test.ts +321 -0
- package/src/__tests__/integration/custom-directives.test.ts +61 -46
- package/src/__tests__/integration/fragments.test.ts +8 -2
- package/src/__tests__/integration/list-key.test.ts +2 -2
- package/src/__tests__/integration/logger.test.ts +2 -2
- package/src/__tests__/integration/multiple-key.test.ts +11 -12
- package/src/__tests__/integration/mutations.test.ts +8 -5
- package/src/__tests__/integration/networkRequests.test.ts +447 -289
- package/src/__tests__/integration/nockMocks.ts +95 -66
- package/src/__tests__/integration/provides.test.ts +9 -6
- package/src/__tests__/integration/requires.test.ts +17 -15
- package/src/__tests__/integration/scope.test.ts +557 -0
- package/src/__tests__/integration/unions.test.ts +1 -1
- package/src/__tests__/integration/value-types.test.ts +35 -32
- package/src/__tests__/integration/variables.test.ts +8 -2
- package/src/__tests__/loadServicesFromRemoteEndpoint.test.ts +6 -2
- package/src/__tests__/loadSupergraphSdlFromStorage.test.ts +694 -0
- package/src/__tests__/queryPlanCucumber.test.ts +11 -61
- package/src/__tests__/testSetup.ts +1 -4
- package/src/__tests__/tsconfig.json +2 -1
- package/src/config.ts +225 -0
- package/src/core/__tests__/core.test.ts +412 -0
- package/src/datasources/LocalGraphQLDataSource.ts +9 -10
- package/src/datasources/RemoteGraphQLDataSource.ts +117 -43
- package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +11 -4
- package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +148 -79
- package/src/datasources/__tests__/tsconfig.json +4 -2
- package/src/datasources/index.ts +1 -1
- package/src/datasources/parseCacheControlHeader.ts +43 -0
- package/src/datasources/types.ts +47 -2
- package/src/executeQueryPlan.ts +264 -153
- package/src/index.ts +925 -480
- package/src/loadServicesFromRemoteEndpoint.ts +24 -17
- package/src/loadSupergraphSdlFromStorage.ts +140 -0
- package/src/make-fetch-happen.d.ts +2 -2
- package/src/operationContext.ts +70 -0
- package/src/outOfBandReporter.ts +128 -0
- package/src/utilities/__tests__/cleanErrorOfInaccessibleElements.test.ts +104 -0
- package/src/utilities/__tests__/tsconfig.json +8 -0
- package/src/utilities/array.ts +6 -28
- package/src/utilities/assert.ts +14 -0
- package/src/utilities/cleanErrorOfInaccessibleNames.ts +29 -0
- package/src/utilities/graphql.ts +0 -64
- package/src/utilities/opentelemetry.ts +13 -0
- package/CHANGELOG.md +0 -226
- package/LICENSE.md +0 -20
- package/dist/FieldSet.d.ts +0 -18
- package/dist/FieldSet.d.ts.map +0 -1
- package/dist/FieldSet.js +0 -96
- package/dist/FieldSet.js.map +0 -1
- package/dist/QueryPlan.d.ts +0 -41
- package/dist/QueryPlan.d.ts.map +0 -1
- package/dist/QueryPlan.js +0 -15
- package/dist/QueryPlan.js.map +0 -1
- package/dist/buildQueryPlan.d.ts +0 -44
- package/dist/buildQueryPlan.d.ts.map +0 -1
- package/dist/buildQueryPlan.js +0 -670
- package/dist/buildQueryPlan.js.map +0 -1
- package/dist/loadServicesFromStorage.d.ts +0 -21
- package/dist/loadServicesFromStorage.d.ts.map +0 -1
- package/dist/loadServicesFromStorage.js +0 -64
- package/dist/loadServicesFromStorage.js.map +0 -1
- package/dist/snapshotSerializers/astSerializer.d.ts +0 -3
- package/dist/snapshotSerializers/astSerializer.d.ts.map +0 -1
- package/dist/snapshotSerializers/astSerializer.js +0 -14
- package/dist/snapshotSerializers/astSerializer.js.map +0 -1
- package/dist/snapshotSerializers/index.d.ts +0 -13
- package/dist/snapshotSerializers/index.d.ts.map +0 -1
- package/dist/snapshotSerializers/index.js +0 -15
- package/dist/snapshotSerializers/index.js.map +0 -1
- package/dist/snapshotSerializers/queryPlanSerializer.d.ts +0 -3
- package/dist/snapshotSerializers/queryPlanSerializer.d.ts.map +0 -1
- package/dist/snapshotSerializers/queryPlanSerializer.js +0 -78
- package/dist/snapshotSerializers/queryPlanSerializer.js.map +0 -1
- package/dist/snapshotSerializers/selectionSetSerializer.d.ts +0 -3
- package/dist/snapshotSerializers/selectionSetSerializer.d.ts.map +0 -1
- package/dist/snapshotSerializers/selectionSetSerializer.js +0 -12
- package/dist/snapshotSerializers/selectionSetSerializer.js.map +0 -1
- package/dist/snapshotSerializers/typeSerializer.d.ts +0 -3
- package/dist/snapshotSerializers/typeSerializer.d.ts.map +0 -1
- package/dist/snapshotSerializers/typeSerializer.js +0 -12
- package/dist/snapshotSerializers/typeSerializer.js.map +0 -1
- package/dist/utilities/MultiMap.d.ts +0 -4
- package/dist/utilities/MultiMap.d.ts.map +0 -1
- package/dist/utilities/MultiMap.js +0 -17
- package/dist/utilities/MultiMap.js.map +0 -1
- package/src/FieldSet.ts +0 -169
- package/src/QueryPlan.ts +0 -57
- package/src/__tests__/matchers/toCallService.ts +0 -105
- package/src/__tests__/matchers/toHaveBeenCalledBefore.ts +0 -40
- package/src/__tests__/matchers/toHaveFetched.ts +0 -81
- package/src/__tests__/matchers/toMatchAST.ts +0 -64
- package/src/buildQueryPlan.ts +0 -1190
- package/src/loadServicesFromStorage.ts +0 -170
- package/src/snapshotSerializers/astSerializer.ts +0 -21
- package/src/snapshotSerializers/index.ts +0 -21
- package/src/snapshotSerializers/queryPlanSerializer.ts +0 -144
- package/src/snapshotSerializers/selectionSetSerializer.ts +0 -13
- package/src/snapshotSerializers/typeSerializer.ts +0 -11
- 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 {
|
|
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-
|
|
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 =
|
|
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://
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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":
|
|
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": "
|
|
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",
|