@apollo/gateway 2.0.0-alpha.0 → 2.0.0-alpha.4

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 (154) hide show
  1. package/README.md +1 -1
  2. package/dist/__generated__/graphqlTypes.d.ts +13 -11
  3. package/dist/__generated__/graphqlTypes.d.ts.map +1 -1
  4. package/dist/__generated__/graphqlTypes.js.map +1 -1
  5. package/dist/config.d.ts +45 -24
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +30 -31
  8. package/dist/config.js.map +1 -1
  9. package/dist/datasources/LocalGraphQLDataSource.js.map +1 -1
  10. package/dist/datasources/RemoteGraphQLDataSource.d.ts.map +1 -1
  11. package/dist/datasources/RemoteGraphQLDataSource.js +4 -1
  12. package/dist/datasources/RemoteGraphQLDataSource.js.map +1 -1
  13. package/dist/datasources/types.d.ts +1 -1
  14. package/dist/datasources/types.d.ts.map +1 -1
  15. package/dist/executeQueryPlan.d.ts.map +1 -1
  16. package/dist/executeQueryPlan.js +6 -6
  17. package/dist/executeQueryPlan.js.map +1 -1
  18. package/dist/index.d.ts +36 -23
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +197 -297
  21. package/dist/index.js.map +1 -1
  22. package/dist/operationContext.js +0 -1
  23. package/dist/operationContext.js.map +1 -1
  24. package/dist/schema-helper/addResolversToSchema.d.ts +4 -0
  25. package/dist/schema-helper/addResolversToSchema.d.ts.map +1 -0
  26. package/dist/schema-helper/addResolversToSchema.js +62 -0
  27. package/dist/schema-helper/addResolversToSchema.js.map +1 -0
  28. package/dist/schema-helper/error.d.ts +6 -0
  29. package/dist/schema-helper/error.d.ts.map +1 -0
  30. package/dist/schema-helper/error.js +14 -0
  31. package/dist/schema-helper/error.js.map +1 -0
  32. package/dist/schema-helper/index.d.ts +4 -0
  33. package/dist/schema-helper/index.d.ts.map +1 -0
  34. package/dist/schema-helper/index.js +16 -0
  35. package/dist/schema-helper/index.js.map +1 -0
  36. package/dist/schema-helper/resolverMap.d.ts +16 -0
  37. package/dist/schema-helper/resolverMap.d.ts.map +1 -0
  38. package/dist/schema-helper/resolverMap.js +3 -0
  39. package/dist/schema-helper/resolverMap.js.map +1 -0
  40. package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts +31 -0
  41. package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts.map +1 -0
  42. package/dist/supergraphManagers/IntrospectAndCompose/index.js +112 -0
  43. package/dist/supergraphManagers/IntrospectAndCompose/index.js.map +1 -0
  44. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts +12 -0
  45. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts.map +1 -0
  46. package/dist/{loadServicesFromRemoteEndpoint.js → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js} +6 -6
  47. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js.map +1 -0
  48. package/dist/supergraphManagers/LegacyFetcher/index.d.ts +33 -0
  49. package/dist/supergraphManagers/LegacyFetcher/index.d.ts.map +1 -0
  50. package/dist/supergraphManagers/LegacyFetcher/index.js +149 -0
  51. package/dist/supergraphManagers/LegacyFetcher/index.js.map +1 -0
  52. package/dist/supergraphManagers/LocalCompose/index.d.ts +19 -0
  53. package/dist/supergraphManagers/LocalCompose/index.d.ts.map +1 -0
  54. package/dist/supergraphManagers/LocalCompose/index.js +55 -0
  55. package/dist/supergraphManagers/LocalCompose/index.js.map +1 -0
  56. package/dist/supergraphManagers/UplinkFetcher/index.d.ts +32 -0
  57. package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -0
  58. package/dist/supergraphManagers/UplinkFetcher/index.js +96 -0
  59. package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -0
  60. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts +21 -0
  61. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -0
  62. package/dist/{loadSupergraphSdlFromStorage.js → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js} +41 -10
  63. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -0
  64. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts +13 -0
  65. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +1 -0
  66. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js +85 -0
  67. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +1 -0
  68. package/dist/supergraphManagers/index.d.ts +5 -0
  69. package/dist/supergraphManagers/index.d.ts.map +1 -0
  70. package/dist/supergraphManagers/index.js +12 -0
  71. package/dist/supergraphManagers/index.js.map +1 -0
  72. package/dist/utilities/array.js +1 -1
  73. package/dist/utilities/array.js.map +1 -1
  74. package/dist/utilities/createHash.d.ts +2 -0
  75. package/dist/utilities/createHash.d.ts.map +1 -0
  76. package/dist/utilities/createHash.js +15 -0
  77. package/dist/utilities/createHash.js.map +1 -0
  78. package/dist/utilities/isNodeLike.d.ts +3 -0
  79. package/dist/utilities/isNodeLike.d.ts.map +1 -0
  80. package/dist/utilities/isNodeLike.js +8 -0
  81. package/dist/utilities/isNodeLike.js.map +1 -0
  82. package/package.json +9 -9
  83. package/src/__generated__/graphqlTypes.ts +13 -11
  84. package/src/__mocks__/make-fetch-happen-fetcher.ts +3 -1
  85. package/src/__tests__/buildQueryPlan.test.ts +1 -1
  86. package/src/__tests__/executeQueryPlan.test.ts +1171 -77
  87. package/src/__tests__/execution-utils.ts +5 -7
  88. package/src/__tests__/gateway/buildService.test.ts +3 -3
  89. package/src/__tests__/gateway/endToEnd.test.ts +1 -1
  90. package/src/__tests__/gateway/executor.test.ts +3 -1
  91. package/src/__tests__/gateway/lifecycle-hooks.test.ts +59 -121
  92. package/src/__tests__/gateway/opentelemetry.test.ts +8 -3
  93. package/src/__tests__/gateway/queryPlanCache.test.ts +25 -9
  94. package/src/__tests__/gateway/reporting.test.ts +42 -13
  95. package/src/__tests__/gateway/supergraphSdl.test.ts +397 -0
  96. package/src/__tests__/integration/aliases.test.ts +9 -3
  97. package/src/__tests__/integration/configuration.test.ts +140 -21
  98. package/src/__tests__/integration/logger.test.ts +2 -2
  99. package/src/__tests__/integration/networkRequests.test.ts +126 -149
  100. package/src/__tests__/integration/nockMocks.ts +57 -16
  101. package/src/__tests__/nockAssertions.ts +20 -0
  102. package/src/config.ts +153 -77
  103. package/src/core/__tests__/core.test.ts +6 -6
  104. package/src/datasources/LocalGraphQLDataSource.ts +1 -1
  105. package/src/datasources/RemoteGraphQLDataSource.ts +8 -2
  106. package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +1 -1
  107. package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +4 -4
  108. package/src/datasources/types.ts +1 -1
  109. package/src/executeQueryPlan.ts +18 -9
  110. package/src/index.ts +323 -481
  111. package/src/make-fetch-happen.d.ts +1 -1
  112. package/src/operationContext.ts +2 -2
  113. package/src/schema-helper/addResolversToSchema.ts +83 -0
  114. package/src/schema-helper/error.ts +11 -0
  115. package/src/schema-helper/index.ts +3 -0
  116. package/src/schema-helper/resolverMap.ts +23 -0
  117. package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +370 -0
  118. package/src/{__tests__ → supergraphManagers/IntrospectAndCompose/__tests__}/loadServicesFromRemoteEndpoint.test.ts +7 -7
  119. package/src/supergraphManagers/IntrospectAndCompose/__tests__/tsconfig.json +8 -0
  120. package/src/supergraphManagers/IntrospectAndCompose/index.ts +160 -0
  121. package/src/{loadServicesFromRemoteEndpoint.ts → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.ts} +7 -7
  122. package/src/supergraphManagers/LegacyFetcher/index.ts +226 -0
  123. package/src/supergraphManagers/LocalCompose/index.ts +79 -0
  124. package/src/supergraphManagers/UplinkFetcher/__tests__/loadSupergraphSdlFromStorage.test.ts +343 -0
  125. package/src/supergraphManagers/UplinkFetcher/__tests__/tsconfig.json +8 -0
  126. package/src/supergraphManagers/UplinkFetcher/index.ts +128 -0
  127. package/src/{loadSupergraphSdlFromStorage.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts} +63 -14
  128. package/src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts +126 -0
  129. package/src/supergraphManagers/index.ts +4 -0
  130. package/src/utilities/__tests__/cleanErrorOfInaccessibleElements.test.ts +13 -10
  131. package/src/utilities/array.ts +1 -1
  132. package/src/utilities/createHash.ts +10 -0
  133. package/src/utilities/isNodeLike.ts +11 -0
  134. package/CHANGELOG.md +0 -452
  135. package/dist/legacyLoadServicesFromStorage.d.ts +0 -20
  136. package/dist/legacyLoadServicesFromStorage.d.ts.map +0 -1
  137. package/dist/legacyLoadServicesFromStorage.js +0 -62
  138. package/dist/legacyLoadServicesFromStorage.js.map +0 -1
  139. package/dist/loadServicesFromRemoteEndpoint.d.ts +0 -13
  140. package/dist/loadServicesFromRemoteEndpoint.d.ts.map +0 -1
  141. package/dist/loadServicesFromRemoteEndpoint.js.map +0 -1
  142. package/dist/loadSupergraphSdlFromStorage.d.ts +0 -12
  143. package/dist/loadSupergraphSdlFromStorage.d.ts.map +0 -1
  144. package/dist/loadSupergraphSdlFromStorage.js.map +0 -1
  145. package/dist/outOfBandReporter.d.ts +0 -15
  146. package/dist/outOfBandReporter.d.ts.map +0 -1
  147. package/dist/outOfBandReporter.js +0 -88
  148. package/dist/outOfBandReporter.js.map +0 -1
  149. package/src/__tests__/gateway/composedSdl.test.ts +0 -44
  150. package/src/__tests__/integration/legacyNetworkRequests.test.ts +0 -279
  151. package/src/__tests__/integration/legacyNockMocks.ts +0 -113
  152. package/src/__tests__/loadSupergraphSdlFromStorage.test.ts +0 -664
  153. package/src/legacyLoadServicesFromStorage.ts +0 -170
  154. package/src/outOfBandReporter.ts +0 -128
@@ -0,0 +1,126 @@
1
+ import { fetch, Response, Request } from 'apollo-server-env';
2
+ import { GraphQLError } from 'graphql';
3
+ import {
4
+ ErrorCode,
5
+ OobReportMutation,
6
+ OobReportMutationVariables,
7
+ } from '../../__generated__/graphqlTypes';
8
+
9
+ // Magic /* GraphQL */ comment below is for codegen, do not remove
10
+ export const OUT_OF_BAND_REPORTER_QUERY = /* GraphQL */`#graphql
11
+ mutation OOBReport($input: APIMonitoringReport) {
12
+ reportError(report: $input)
13
+ }
14
+ `;
15
+
16
+ const { name, version } = require('../../../package.json');
17
+
18
+ type OobReportMutationResult =
19
+ | OobReportMutationSuccess
20
+ | OobReportMutationFailure;
21
+
22
+ interface OobReportMutationSuccess {
23
+ data: OobReportMutation;
24
+ }
25
+
26
+ interface OobReportMutationFailure {
27
+ data?: OobReportMutation;
28
+ errors: GraphQLError[];
29
+ }
30
+
31
+ export async function submitOutOfBandReportIfConfigured({
32
+ error,
33
+ request,
34
+ endpoint,
35
+ response,
36
+ startedAt,
37
+ endedAt,
38
+ tags,
39
+ fetcher,
40
+ }: {
41
+ error: Error;
42
+ request: Request;
43
+ endpoint: string | undefined;
44
+ response?: Response;
45
+ startedAt: Date;
46
+ endedAt: Date;
47
+ tags?: string[];
48
+ fetcher: typeof fetch;
49
+ }) {
50
+ // don't send report if the endpoint url is not configured
51
+ if (!endpoint) {
52
+ return;
53
+ }
54
+
55
+ let errorCode: ErrorCode;
56
+ if (!response) {
57
+ errorCode = ErrorCode.ConnectionFailed;
58
+ } else {
59
+ // possible error situations to check against
60
+ switch (response.status) {
61
+ case 400:
62
+ case 413:
63
+ case 422:
64
+ errorCode = ErrorCode.InvalidBody;
65
+ break;
66
+ case 408:
67
+ case 504:
68
+ errorCode = ErrorCode.Timeout;
69
+ break;
70
+ case 502:
71
+ case 503:
72
+ errorCode = ErrorCode.ConnectionFailed;
73
+ break;
74
+ default:
75
+ errorCode = ErrorCode.Other;
76
+ }
77
+ }
78
+
79
+ const responseBody: string | undefined = await response?.text();
80
+
81
+ const variables: OobReportMutationVariables = {
82
+ input: {
83
+ error: {
84
+ code: errorCode,
85
+ message: error.message,
86
+ },
87
+ request: {
88
+ url: request.url,
89
+ body: await request.text(),
90
+ },
91
+ response: response
92
+ ? {
93
+ httpStatusCode: response.status,
94
+ body: responseBody,
95
+ }
96
+ : null,
97
+ startedAt: startedAt.toISOString(),
98
+ endedAt: endedAt.toISOString(),
99
+ tags: tags,
100
+ },
101
+ };
102
+
103
+ try {
104
+ const oobResponse = await fetcher(endpoint, {
105
+ method: 'POST',
106
+ body: JSON.stringify({
107
+ query: OUT_OF_BAND_REPORTER_QUERY,
108
+ variables,
109
+ }),
110
+ headers: {
111
+ 'apollographql-client-name': name,
112
+ 'apollographql-client-version': version,
113
+ 'user-agent': `${name}/${version}`,
114
+ 'content-type': 'application/json',
115
+ },
116
+ });
117
+ const parsedResponse: OobReportMutationResult = await oobResponse.json();
118
+ if (!parsedResponse?.data?.reportError) {
119
+ throw new Error(
120
+ `Out-of-band error reporting failed: ${oobResponse.status} ${oobResponse.statusText}`,
121
+ );
122
+ }
123
+ } catch (e) {
124
+ throw new Error(`Out-of-band error reporting failed: ${e.message ?? e}`);
125
+ }
126
+ }
@@ -0,0 +1,4 @@
1
+ export { LocalCompose } from './LocalCompose';
2
+ export { LegacyFetcher } from './LegacyFetcher';
3
+ export { IntrospectAndCompose } from './IntrospectAndCompose';
4
+ export { UplinkFetcher } from './UplinkFetcher';
@@ -1,6 +1,6 @@
1
- import { execute, GraphQLError, parse } from "graphql";
2
- import { cleanErrorOfInaccessibleNames } from "../cleanErrorOfInaccessibleNames";
3
- import { buildSchema } from "@apollo/federation-internals";
1
+ import { execute, GraphQLError, parse } from 'graphql';
2
+ import { cleanErrorOfInaccessibleNames } from '../cleanErrorOfInaccessibleNames';
3
+ import { buildSchema } from '@apollo/federation-internals';
4
4
 
5
5
  describe('cleanErrorOfInaccessibleNames', () => {
6
6
  const coreSchema = buildSchema(`
@@ -49,19 +49,22 @@ describe('cleanErrorOfInaccessibleNames', () => {
49
49
  const schema = coreSchema.toAPISchema().toGraphQLJSSchema();
50
50
 
51
51
  it('removes inaccessible type names from error messages', async () => {
52
- const result = await execute(schema, parse('{fooField{someField}}'), {
53
- fooField: {
54
- __typename: 'Bar',
55
- someField: 'test',
52
+ const result = await execute({
53
+ schema,
54
+ document: parse('{fooField{someField}}'),
55
+ rootValue: {
56
+ fooField: {
57
+ __typename: 'Bar',
58
+ someField: 'test',
59
+ },
56
60
  },
57
61
  });
58
62
 
59
- const cleaned = cleanErrorOfInaccessibleNames(schema, result.errors?.[0]!);
63
+ const cleaned = cleanErrorOfInaccessibleNames(schema, result.errors![0]!);
60
64
  expect(cleaned.message).toMatchInlineSnapshot(
61
- `"Abstract type \\"Foo\\" was resolve to a type [inaccessible type] that does not exist inside schema."`,
65
+ `"Abstract type \\"Foo\\" was resolved to a type [inaccessible type] that does not exist inside the schema."`,
62
66
  );
63
67
  });
64
-
65
68
  it('removes multiple/repeated inaccessible type names from error messages', async () => {
66
69
  const contrivedError = new GraphQLError(
67
70
  `Something something "Bar" and "Bar" again, as well as "Bar2".`,
@@ -27,7 +27,7 @@ export function findAndExtract<T>(
27
27
  const index = array.findIndex(predicate);
28
28
  if (index === -1) return [undefined, array];
29
29
 
30
- let remaining = array.slice(0, index);
30
+ const remaining = array.slice(0, index);
31
31
  if (index < array.length - 1) {
32
32
  remaining.push(...array.slice(index + 1));
33
33
  }
@@ -0,0 +1,10 @@
1
+ import isNodeLike from './isNodeLike';
2
+
3
+ export function createHash (kind: string): import('crypto').Hash {
4
+ if (isNodeLike) {
5
+ // Use module.require instead of just require to avoid bundling whatever
6
+ // crypto polyfills a non-Node bundler might fall back to.
7
+ return module.require('crypto').createHash(kind);
8
+ }
9
+ return require('sha.js')(kind);
10
+ }
@@ -0,0 +1,11 @@
1
+ export default typeof process === 'object' &&
2
+ process &&
3
+ // We used to check `process.release.name === "node"`, however that doesn't
4
+ // account for certain forks of Node.js which are otherwise identical to
5
+ // Node.js. For example, NodeSource's N|Solid reports itself as "nsolid",
6
+ // though it's mostly the same build of Node.js with an extra addon.
7
+ process.release &&
8
+ process.versions &&
9
+ // The one thing which is present on both Node.js and N|Solid (a fork of
10
+ // Node.js), is `process.versions.node` being defined.
11
+ typeof process.versions.node === 'string';