@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
@@ -1,105 +0,0 @@
1
- import { QueryPlan } from '@apollo/gateway';
2
- import { PlanNode } from '../../QueryPlan';
3
- import astSerializer from '../../snapshotSerializers/astSerializer';
4
- import queryPlanSerializer from '../../snapshotSerializers/queryPlanSerializer';
5
- const prettyFormat = require('pretty-format');
6
-
7
- declare global {
8
- namespace jest {
9
- interface Matchers<R, T> {
10
- toCallService(service: string): R;
11
- }
12
- }
13
- }
14
-
15
- // function printNode(node: ExecutionNode) {
16
- // return prettyFormat(
17
- // { nodes: [node], kind: 'QueryPlan' },
18
- // {
19
- // plugins: [queryPlanSerializer, astSerializer],
20
- // },
21
- // );
22
- // }
23
-
24
- const lineEndRegex = /^/gm;
25
- function indentString(string: string, count = 2) {
26
- if (!string) return string;
27
- return string.replace(lineEndRegex, ' '.repeat(count));
28
- }
29
-
30
- function toCallService(
31
- this: jest.MatcherUtils,
32
- queryPlan: QueryPlan,
33
- service: string,
34
- ): { message(): string; pass: boolean } {
35
- // const receivedString = print(received);
36
- // const expectedString = print(expected);
37
-
38
- const printReceived = (string: string) =>
39
- this.utils.RECEIVED_COLOR(indentString(string));
40
- const printExpected = (string: string) =>
41
- this.utils.EXPECTED_COLOR(indentString(string));
42
-
43
- let pass = false;
44
- // let initialServiceCall = null;
45
- // recurse the node, find first match of service name, return
46
- function walkExecutionNode(node?: PlanNode) {
47
- if (!node) return;
48
- if (node.kind === 'Fetch' && node.serviceName === service) {
49
- pass = true;
50
- // initialServiceCall = node;
51
- return;
52
- }
53
- switch (node.kind) {
54
- case 'Flatten':
55
- walkExecutionNode(node.node);
56
- break;
57
- case 'Parallel':
58
- case 'Sequence':
59
- node.nodes.forEach(walkExecutionNode);
60
- break;
61
- default:
62
- return;
63
- }
64
- }
65
-
66
- walkExecutionNode(queryPlan.node);
67
-
68
- const message = pass
69
- ? () =>
70
- this.utils.matcherHint('.not.toCallService') +
71
- '\n\n' +
72
- `Expected query plan to not call service:\n` +
73
- printExpected(service) +
74
- '\n' +
75
- `Received:\n` +
76
- // FIXME print just the node
77
- printReceived(
78
- prettyFormat(queryPlan, {
79
- plugins: [queryPlanSerializer, astSerializer],
80
- }),
81
- )
82
- : () => {
83
- return (
84
- this.utils.matcherHint('.toCallService') +
85
- '\n\n' +
86
- `Expected query plan to call service:\n` +
87
- printExpected(service) +
88
- '\n' +
89
- `Received query plan:\n` +
90
- printReceived(
91
- prettyFormat(queryPlan, {
92
- plugins: [queryPlanSerializer, astSerializer],
93
- }),
94
- )
95
- );
96
- };
97
- return {
98
- message,
99
- pass,
100
- };
101
- }
102
-
103
- expect.extend({
104
- toCallService,
105
- });
@@ -1,40 +0,0 @@
1
- // Make this file a module
2
- // See: https://github.com/microsoft/TypeScript/issues/17736
3
- export {};
4
- declare global {
5
- namespace jest {
6
- interface Matchers<R, T> {
7
- toHaveBeenCalledBefore(spy: SpyInstance): R;
8
- }
9
- }
10
- }
11
-
12
- function toHaveBeenCalledBefore(
13
- this: jest.MatcherUtils,
14
- firstSpy: jest.SpyInstance,
15
- secondSpy: jest.SpyInstance,
16
- ): { message(): string; pass: boolean } {
17
- const firstSpyEarliestCall = Math.min(...firstSpy.mock.invocationCallOrder);
18
- const secondSpyEarliestCall = Math.min(...secondSpy.mock.invocationCallOrder);
19
-
20
- const pass = firstSpyEarliestCall < secondSpyEarliestCall;
21
-
22
- const message = pass
23
- ? () =>
24
- this.utils.matcherHint('.not.toHaveBeenCalledBefore') +
25
- '\n\n' +
26
- `Expected ${firstSpy.getMockName()} not to have been called before ${secondSpy.getMockName()}`
27
- : () =>
28
- this.utils.matcherHint('.toHaveBeenCalledBefore') +
29
- '\n\n' +
30
- `Expected ${firstSpy.getMockName()} to have been called before ${secondSpy.getMockName()}`;
31
-
32
- return {
33
- message,
34
- pass,
35
- };
36
- }
37
-
38
- expect.extend({
39
- toHaveBeenCalledBefore,
40
- });
@@ -1,81 +0,0 @@
1
- import { Request, RequestInit, Headers } from 'apollo-server-env';
2
-
3
- // Make this file a module
4
- // See: https://github.com/microsoft/TypeScript/issues/17736
5
- export {};
6
- declare global {
7
- namespace jest {
8
- interface Matchers<R, T> {
9
- toHaveFetched(spy: SpyInstance): R;
10
- }
11
- }
12
- }
13
-
14
- type ExtendedRequest = RequestInit & { url: string };
15
-
16
- function prepareHttpRequest(request: ExtendedRequest): Request {
17
- const headers = new Headers();
18
- headers.set('Content-Type', 'application/json');
19
- if (request.headers) {
20
- for (let name in request.headers) {
21
- headers.set(name, request.headers[name]);
22
- }
23
- }
24
-
25
- const options: RequestInit = {
26
- method: 'POST',
27
- headers,
28
- body: JSON.stringify(request.body),
29
- };
30
-
31
- return new Request(request.url, options);
32
- }
33
-
34
- function toHaveFetched(
35
- this: jest.MatcherUtils,
36
- fetch: jest.SpyInstance,
37
- request: ExtendedRequest,
38
- ): { message(): string; pass: boolean } {
39
- const httpRequest = prepareHttpRequest(request);
40
- let pass = false;
41
- let message = () => '';
42
- try {
43
- expect(fetch).toBeCalledWith(httpRequest);
44
- pass = true;
45
- } catch (e) {
46
- message = () => e.message;
47
- }
48
-
49
- return {
50
- message,
51
- pass,
52
- };
53
- }
54
-
55
- function toHaveFetchedNth(
56
- this: jest.MatcherUtils,
57
- fetch: jest.SpyInstance,
58
- nthCall: number,
59
- request: ExtendedRequest,
60
- ): { message(): string; pass: boolean } {
61
- const httpRequest = prepareHttpRequest(request);
62
- let pass = false;
63
- let message = () => '';
64
- try {
65
- expect(fetch).toHaveBeenNthCalledWith(nthCall, httpRequest);
66
- pass = true;
67
- } catch (e) {
68
- message = () => e.message;
69
- }
70
-
71
- return {
72
- message,
73
- pass,
74
- };
75
- }
76
-
77
-
78
- expect.extend({
79
- toHaveFetched,
80
- toHaveFetchedNth,
81
- });
@@ -1,64 +0,0 @@
1
- import { print, ASTNode } from 'graphql';
2
- const diff = require('jest-diff');
3
-
4
- declare global {
5
- namespace jest {
6
- interface Matchers<R, T> {
7
- toMatchAST(expected: ASTNode): R;
8
- }
9
- }
10
- }
11
-
12
- const lineEndRegex = /^/gm;
13
- function indentString(string: string, count = 2) {
14
- if (!string) return string;
15
- return string.replace(lineEndRegex, ' '.repeat(count));
16
- }
17
-
18
- function toMatchAST(
19
- this: jest.MatcherUtils,
20
- received: ASTNode,
21
- expected: ASTNode,
22
- ): { message(): string; pass: boolean } {
23
- const receivedString = print(received);
24
- const expectedString = print(expected);
25
-
26
- const printReceived = (string: string) =>
27
- this.utils.RECEIVED_COLOR(indentString(string));
28
- const printExpected = (string: string) =>
29
- this.utils.EXPECTED_COLOR(indentString(string));
30
-
31
- const pass = this.equals(receivedString, expectedString);
32
- const message = pass
33
- ? () =>
34
- this.utils.matcherHint('.not.toMatchAST') +
35
- '\n\n' +
36
- `Expected AST to not equal:\n` +
37
- printExpected(expectedString) +
38
- '\n' +
39
- `Received:\n` +
40
- printReceived(receivedString)
41
- : () => {
42
- const diffString = diff(expectedString, receivedString, {
43
- expand: this.expand,
44
- });
45
- return (
46
- this.utils.matcherHint('.toMatchAST') +
47
- '\n\n' +
48
- `Expected AST to equal:\n` +
49
- printExpected(expectedString) +
50
- '\n' +
51
- `Received:\n` +
52
- printReceived(receivedString) +
53
- (diffString ? `\n\nDifference:\n\n${diffString}` : '')
54
- );
55
- };
56
- return {
57
- message,
58
- pass,
59
- };
60
- }
61
-
62
- expect.extend({
63
- toMatchAST,
64
- });