@apollo/gateway 2.0.0-preview.1 → 2.0.0-preview.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.
- package/dist/__generated__/graphqlTypes.d.ts +1 -0
- package/dist/__generated__/graphqlTypes.d.ts.map +1 -1
- package/dist/config.d.ts +7 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/datasources/types.d.ts +1 -1
- package/dist/datasources/types.d.ts.map +1 -1
- package/dist/executeQueryPlan.d.ts +2 -3
- package/dist/executeQueryPlan.d.ts.map +1 -1
- package/dist/executeQueryPlan.js +10 -34
- package/dist/executeQueryPlan.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -50
- package/dist/index.js.map +1 -1
- package/dist/operationContext.js +0 -1
- package/dist/operationContext.js.map +1 -1
- package/dist/schema-helper/resolverMap.d.ts +2 -2
- package/dist/schema-helper/resolverMap.d.ts.map +1 -1
- package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts.map +1 -1
- package/dist/supergraphManagers/IntrospectAndCompose/index.js +3 -3
- package/dist/supergraphManagers/IntrospectAndCompose/index.js.map +1 -1
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts.map +1 -1
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js.map +1 -1
- package/dist/supergraphManagers/LegacyFetcher/index.d.ts.map +1 -1
- package/dist/supergraphManagers/LegacyFetcher/index.js +3 -3
- package/dist/supergraphManagers/LegacyFetcher/index.js.map +1 -1
- package/dist/supergraphManagers/LocalCompose/index.d.ts +1 -1
- package/dist/supergraphManagers/LocalCompose/index.d.ts.map +1 -1
- package/dist/supergraphManagers/LocalCompose/index.js +4 -4
- package/dist/supergraphManagers/LocalCompose/index.js.map +1 -1
- package/dist/supergraphManagers/UplinkFetcher/index.d.ts +3 -1
- package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -1
- package/dist/supergraphManagers/UplinkFetcher/index.js +20 -4
- package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -1
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts +3 -2
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -1
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js +9 -3
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -1
- package/dist/utilities/array.js +1 -1
- package/dist/utilities/array.js.map +1 -1
- package/package.json +4 -4
- package/src/__generated__/graphqlTypes.ts +1 -1
- package/src/__tests__/gateway/lifecycle-hooks.test.ts +3 -3
- package/src/__tests__/integration/configuration.test.ts +0 -11
- package/src/config.ts +11 -6
- package/src/index.ts +12 -6
- package/src/supergraphManagers/UplinkFetcher/__tests__/loadSupergraphSdlFromStorage.test.ts +41 -0
- package/src/supergraphManagers/UplinkFetcher/index.ts +37 -18
- package/src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts +9 -1
- package/dist/core/index.d.ts +0 -13
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -43
- package/dist/core/index.js.map +0 -1
|
@@ -12,6 +12,8 @@ class UplinkFetcher {
|
|
|
12
12
|
this.timerRef = null;
|
|
13
13
|
this.errorReportingEndpoint = (_a = process.env.APOLLO_OUT_OF_BAND_REPORTER_ENDPOINT) !== null && _a !== void 0 ? _a : undefined;
|
|
14
14
|
this.fetchCount = 0;
|
|
15
|
+
this.minDelayMs = null;
|
|
16
|
+
this.earliestFetchTime = null;
|
|
15
17
|
this.config = options;
|
|
16
18
|
this.state = { phase: 'initialized' };
|
|
17
19
|
}
|
|
@@ -22,7 +24,12 @@ class UplinkFetcher {
|
|
|
22
24
|
}
|
|
23
25
|
let initialSupergraphSdl = null;
|
|
24
26
|
try {
|
|
25
|
-
|
|
27
|
+
const result = await this.updateSupergraphSdl();
|
|
28
|
+
initialSupergraphSdl = (result === null || result === void 0 ? void 0 : result.supergraphSdl) || null;
|
|
29
|
+
if (result === null || result === void 0 ? void 0 : result.minDelaySeconds) {
|
|
30
|
+
this.minDelayMs = 1000 * (result === null || result === void 0 ? void 0 : result.minDelaySeconds);
|
|
31
|
+
this.earliestFetchTime = new Date(Date.now() + this.minDelayMs);
|
|
32
|
+
}
|
|
26
33
|
}
|
|
27
34
|
catch (e) {
|
|
28
35
|
this.logUpdateFailure(e);
|
|
@@ -54,6 +61,7 @@ class UplinkFetcher {
|
|
|
54
61
|
compositionId: (_a = this.compositionId) !== null && _a !== void 0 ? _a : null,
|
|
55
62
|
maxRetries: this.config.maxRetries,
|
|
56
63
|
roundRobinSeed: this.fetchCount++,
|
|
64
|
+
earliestFetchTime: this.earliestFetchTime,
|
|
57
65
|
});
|
|
58
66
|
if (!result) {
|
|
59
67
|
return null;
|
|
@@ -61,7 +69,8 @@ class UplinkFetcher {
|
|
|
61
69
|
else {
|
|
62
70
|
this.compositionId = result.id;
|
|
63
71
|
await ((_b = this.healthCheck) === null || _b === void 0 ? void 0 : _b.call(this, result.supergraphSdl));
|
|
64
|
-
|
|
72
|
+
const { supergraphSdl, minDelaySeconds } = result;
|
|
73
|
+
return { supergraphSdl, minDelaySeconds };
|
|
65
74
|
}
|
|
66
75
|
}
|
|
67
76
|
beginPolling() {
|
|
@@ -75,7 +84,12 @@ class UplinkFetcher {
|
|
|
75
84
|
const pollingPromise = (0, resolvable_1.default)();
|
|
76
85
|
this.state.pollingPromise = pollingPromise;
|
|
77
86
|
try {
|
|
78
|
-
const
|
|
87
|
+
const result = await this.updateSupergraphSdl();
|
|
88
|
+
const maybeNewSupergraphSdl = (result === null || result === void 0 ? void 0 : result.supergraphSdl) || null;
|
|
89
|
+
if (result === null || result === void 0 ? void 0 : result.minDelaySeconds) {
|
|
90
|
+
this.minDelayMs = 1000 * (result === null || result === void 0 ? void 0 : result.minDelaySeconds);
|
|
91
|
+
this.earliestFetchTime = new Date(Date.now() + this.minDelayMs);
|
|
92
|
+
}
|
|
79
93
|
if (maybeNewSupergraphSdl) {
|
|
80
94
|
(_a = this.update) === null || _a === void 0 ? void 0 : _a.call(this, maybeNewSupergraphSdl);
|
|
81
95
|
}
|
|
@@ -86,7 +100,9 @@ class UplinkFetcher {
|
|
|
86
100
|
pollingPromise.resolve();
|
|
87
101
|
}
|
|
88
102
|
this.poll();
|
|
89
|
-
}, this.
|
|
103
|
+
}, this.minDelayMs
|
|
104
|
+
? Math.max(this.minDelayMs, this.config.fallbackPollIntervalInMs)
|
|
105
|
+
: this.config.fallbackPollIntervalInMs);
|
|
90
106
|
}
|
|
91
107
|
logUpdateFailure(e) {
|
|
92
108
|
var _a, _b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/index.ts"],"names":[],"mappings":";;;;;;AAEA,qEAA6C;AAG7C,iFAA8E;AAkB9E,MAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { fetch } from 'apollo-server-env';
|
|
2
2
|
import { SupergraphSdlUpdate } from '../../config';
|
|
3
|
-
export declare const SUPERGRAPH_SDL_QUERY = "#graphql\n query SupergraphSdl($apiKey: String!, $ref: String!, $ifAfterId: ID) {\n routerConfig(ref: $ref, apiKey: $apiKey, ifAfterId: $ifAfterId) {\n __typename\n ... on RouterConfigResult {\n id\n supergraphSdl: supergraphSDL\n }\n ... on FetchError {\n code\n message\n }\n }\n }\n";
|
|
3
|
+
export declare const SUPERGRAPH_SDL_QUERY = "#graphql\n query SupergraphSdl($apiKey: String!, $ref: String!, $ifAfterId: ID) {\n routerConfig(ref: $ref, apiKey: $apiKey, ifAfterId: $ifAfterId) {\n __typename\n ... on RouterConfigResult {\n id\n supergraphSdl: supergraphSDL\n minDelaySeconds\n }\n ... on FetchError {\n code\n message\n }\n }\n }\n";
|
|
4
4
|
export declare class UplinkFetcherError extends Error {
|
|
5
5
|
constructor(message: string);
|
|
6
6
|
}
|
|
7
|
-
export declare function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, errorReportingEndpoint, fetcher, compositionId, maxRetries, roundRobinSeed, }: {
|
|
7
|
+
export declare function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, errorReportingEndpoint, fetcher, compositionId, maxRetries, roundRobinSeed, earliestFetchTime, }: {
|
|
8
8
|
graphRef: string;
|
|
9
9
|
apiKey: string;
|
|
10
10
|
endpoints: string[];
|
|
@@ -13,6 +13,7 @@ export declare function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoin
|
|
|
13
13
|
compositionId: string | null;
|
|
14
14
|
maxRetries: number;
|
|
15
15
|
roundRobinSeed: number;
|
|
16
|
+
earliestFetchTime: Date | null;
|
|
16
17
|
}): Promise<SupergraphSdlUpdate | null>;
|
|
17
18
|
export declare function loadSupergraphSdlFromStorage({ graphRef, apiKey, endpoint, errorReportingEndpoint, fetcher, compositionId, }: {
|
|
18
19
|
graphRef: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadSupergraphSdlFromStorage.d.ts","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAKnD,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"loadSupergraphSdlFromStorage.d.ts","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAKnD,eAAO,MAAM,oBAAoB,wXAehC,CAAC;AAoBF,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,4BAA4B,CAAC,EACjD,QAAQ,EACR,MAAM,EACN,SAAS,EACT,sBAAsB,EACtB,OAAO,EACP,aAAa,EACb,UAAU,EACV,cAAc,EACd,iBAAiB,GAClB,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,IAAI,GAAG,IAAI,CAAA;CAC/B,GAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAuBvC;AAED,wBAAsB,4BAA4B,CAAC,EACjD,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,sBAAsB,EACtB,OAAO,EACP,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAyFvC"}
|
|
@@ -14,6 +14,7 @@ exports.SUPERGRAPH_SDL_QUERY = `#graphql
|
|
|
14
14
|
... on RouterConfigResult {
|
|
15
15
|
id
|
|
16
16
|
supergraphSdl: supergraphSDL
|
|
17
|
+
minDelaySeconds
|
|
17
18
|
}
|
|
18
19
|
... on FetchError {
|
|
19
20
|
code
|
|
@@ -31,7 +32,7 @@ class UplinkFetcherError extends Error {
|
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
exports.UplinkFetcherError = UplinkFetcherError;
|
|
34
|
-
async function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, errorReportingEndpoint, fetcher, compositionId, maxRetries, roundRobinSeed, }) {
|
|
35
|
+
async function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, errorReportingEndpoint, fetcher, compositionId, maxRetries, roundRobinSeed, earliestFetchTime, }) {
|
|
35
36
|
return (0, async_retry_1.default)(() => loadSupergraphSdlFromStorage({
|
|
36
37
|
graphRef,
|
|
37
38
|
apiKey,
|
|
@@ -41,6 +42,11 @@ async function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, error
|
|
|
41
42
|
compositionId,
|
|
42
43
|
}), {
|
|
43
44
|
retries: maxRetries,
|
|
45
|
+
onRetry: async () => {
|
|
46
|
+
const delayMS = earliestFetchTime ? earliestFetchTime.getTime() - Date.now() : 0;
|
|
47
|
+
if (delayMS > 0)
|
|
48
|
+
await new Promise(resolve => setTimeout(resolve, delayMS));
|
|
49
|
+
}
|
|
44
50
|
});
|
|
45
51
|
}
|
|
46
52
|
exports.loadSupergraphSdlFromUplinks = loadSupergraphSdlFromUplinks;
|
|
@@ -108,8 +114,8 @@ async function loadSupergraphSdlFromStorage({ graphRef, apiKey, endpoint, errorR
|
|
|
108
114
|
}
|
|
109
115
|
const { routerConfig } = response.data;
|
|
110
116
|
if (routerConfig.__typename === 'RouterConfigResult') {
|
|
111
|
-
const { id, supergraphSdl, } = routerConfig;
|
|
112
|
-
return { id, supergraphSdl: supergraphSdl };
|
|
117
|
+
const { id, supergraphSdl, minDelaySeconds, } = routerConfig;
|
|
118
|
+
return { id, supergraphSdl: supergraphSdl, minDelaySeconds };
|
|
113
119
|
}
|
|
114
120
|
else if (routerConfig.__typename === 'FetchError') {
|
|
115
121
|
const { code, message } = routerConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadSupergraphSdlFromStorage.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":";;;;;;AAAA,yDAA6D;AAE7D,8DAAgC;AAEhC,2DAAwE;AAI3D,QAAA,oBAAoB,GAAgB
|
|
1
|
+
{"version":3,"file":"loadSupergraphSdlFromStorage.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"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"}
|
package/dist/utilities/array.js
CHANGED
|
@@ -19,7 +19,7 @@ function findAndExtract(array, predicate) {
|
|
|
19
19
|
const index = array.findIndex(predicate);
|
|
20
20
|
if (index === -1)
|
|
21
21
|
return [undefined, array];
|
|
22
|
-
|
|
22
|
+
const remaining = array.slice(0, index);
|
|
23
23
|
if (index < array.length - 1) {
|
|
24
24
|
remaining.push(...array.slice(index + 1));
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/utilities/array.ts"],"names":[],"mappings":";;;AAAA,SAAgB,oBAAoB,CAClC,KAA2B;IAE3B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC;AACxD,CAAC;AAJD,oDAIC;AAED,SAAgB,UAAU,CACxB,KAAU,EACV,UAAyE;IAEzE,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE;YAChC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC1B;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,EACD,EAAS,CACV,CAAC;AACJ,CAAC;AAdD,gCAcC;AAED,SAAgB,cAAc,CAC5B,KAAU,EACV,SAA6D;IAE7D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE5C,
|
|
1
|
+
{"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/utilities/array.ts"],"names":[],"mappings":";;;AAAA,SAAgB,oBAAoB,CAClC,KAA2B;IAE3B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC;AACxD,CAAC;AAJD,oDAIC;AAED,SAAgB,UAAU,CACxB,KAAU,EACV,UAAyE;IAEzE,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE;YAChC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC1B;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,EACD,EAAS,CACV,CAAC;AACJ,CAAC;AAdD,gCAcC;AAED,SAAgB,cAAc,CAC5B,KAAU,EACV,SAA6D;IAE7D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QAC5B,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;KAC3C;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAbD,wCAaC;AAED,SAAgB,OAAO,CAAO,WAA8B;IAC1D,OAAO,CAAC,QAAqB,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QAEjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,KAAK,EAAE;gBACT,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACrB;iBAAM;gBACL,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;aAC5B;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAjBD,0BAiBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apollo/gateway",
|
|
3
|
-
"version": "2.0.0-preview.
|
|
3
|
+
"version": "2.0.0-preview.4",
|
|
4
4
|
"description": "Apollo Gateway",
|
|
5
5
|
"author": "Apollo <packages@apollographql.com>",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@apollo/composition": "^2.0.0-preview.
|
|
28
|
+
"@apollo/composition": "^2.0.0-preview.4",
|
|
29
29
|
"@apollo/core-schema": "^0.2.2",
|
|
30
|
-
"@apollo/query-planner": "^2.0.0-preview.
|
|
30
|
+
"@apollo/query-planner": "^2.0.0-preview.4",
|
|
31
31
|
"@josephg/resolvable": "^1.0.1",
|
|
32
32
|
"@opentelemetry/api": "^1.0.1",
|
|
33
33
|
"@types/node-fetch": "2.6.1",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"graphql": "^16.0.0"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "1ab3c3b872dade5ca564bd3ba3ac723a99ad4960"
|
|
51
51
|
}
|
|
@@ -139,7 +139,7 @@ export type SupergraphSdlQueryVariables = Exact<{
|
|
|
139
139
|
}>;
|
|
140
140
|
|
|
141
141
|
|
|
142
|
-
export type SupergraphSdlQuery = { __typename?: 'Query', routerConfig: { __typename: 'FetchError', code: FetchErrorCode, message: string } | { __typename: 'RouterConfigResult', id: string, supergraphSdl: string } | { __typename: 'Unchanged' } };
|
|
142
|
+
export type SupergraphSdlQuery = { __typename?: 'Query', routerConfig: { __typename: 'FetchError', code: FetchErrorCode, message: string } | { __typename: 'RouterConfigResult', id: string, minDelaySeconds: number, supergraphSdl: string } | { __typename: 'Unchanged' } };
|
|
143
143
|
|
|
144
144
|
export type OobReportMutationVariables = Exact<{
|
|
145
145
|
input?: InputMaybe<ApiMonitoringReport>;
|
|
@@ -137,7 +137,7 @@ describe('lifecycle hooks', () => {
|
|
|
137
137
|
|
|
138
138
|
const [firstCall, secondCall] = mockDidUpdate.mock.calls;
|
|
139
139
|
|
|
140
|
-
// Note that we've composing our usual test fixtures here
|
|
140
|
+
// Note that we've composing our usual test fixtures here
|
|
141
141
|
const expectedFirstId = createHash('sha256').update(getTestingSupergraphSdl()).digest('hex');
|
|
142
142
|
expect(firstCall[0]!.compositionId).toEqual(expectedFirstId);
|
|
143
143
|
// first call should have no second "previous" argument
|
|
@@ -145,7 +145,7 @@ describe('lifecycle hooks', () => {
|
|
|
145
145
|
|
|
146
146
|
// Note that this assertion is a tad fragile in that every time we modify
|
|
147
147
|
// the supergraph (even just formatting differences), this ID will change
|
|
148
|
-
// and this test will have to updated.
|
|
148
|
+
// and this test will have to updated.
|
|
149
149
|
expect(secondCall[0]!.compositionId).toEqual(
|
|
150
150
|
'3ca7f295b11b070d1e1b56a698cbfabb70cb2b5912a4ff0ecae2fb91e8709838',
|
|
151
151
|
);
|
|
@@ -183,7 +183,7 @@ describe('lifecycle hooks', () => {
|
|
|
183
183
|
);
|
|
184
184
|
});
|
|
185
185
|
|
|
186
|
-
it('registers schema change callbacks when
|
|
186
|
+
it('registers schema change callbacks when pollIntervalInMs is set for unmanaged configs', async () => {
|
|
187
187
|
const experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions =
|
|
188
188
|
jest.fn(async (_config) => {
|
|
189
189
|
return { serviceDefinitions, isNewSchema: true };
|
|
@@ -444,15 +444,4 @@ describe('deprecation warnings', () => {
|
|
|
444
444
|
'The `schemaConfigDeliveryEndpoint` option is deprecated and will be removed in a future version of `@apollo/gateway`. Please migrate to the equivalent (array form) `uplinkEndpoints` configuration option.',
|
|
445
445
|
);
|
|
446
446
|
});
|
|
447
|
-
|
|
448
|
-
it('warns with `experimental_pollInterval` option set', async () => {
|
|
449
|
-
new ApolloGateway({
|
|
450
|
-
experimental_pollInterval: 10000,
|
|
451
|
-
logger,
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
expect(logger.warn).toHaveBeenCalledWith(
|
|
455
|
-
'The `experimental_pollInterval` option is deprecated and will be removed in a future version of `@apollo/gateway`. Please migrate to the equivalent `pollIntervalInMs` configuration option.',
|
|
456
|
-
);
|
|
457
|
-
});
|
|
458
447
|
});
|
package/src/config.ts
CHANGED
|
@@ -81,6 +81,7 @@ export interface ServiceDefinitionUpdate {
|
|
|
81
81
|
export interface SupergraphSdlUpdate {
|
|
82
82
|
id: string;
|
|
83
83
|
supergraphSdl: string;
|
|
84
|
+
minDelaySeconds?: number;
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
export function isSupergraphSdlUpdate(
|
|
@@ -125,11 +126,6 @@ interface GatewayConfigBase {
|
|
|
125
126
|
// experimental observability callbacks
|
|
126
127
|
experimental_didResolveQueryPlan?: Experimental_DidResolveQueryPlanCallback;
|
|
127
128
|
experimental_didUpdateSupergraph?: Experimental_DidUpdateSupergraphCallback;
|
|
128
|
-
/**
|
|
129
|
-
* @deprecated use `pollIntervalInMs` instead
|
|
130
|
-
*/
|
|
131
|
-
experimental_pollInterval?: number;
|
|
132
|
-
pollIntervalInMs?: number;
|
|
133
129
|
experimental_approximateQueryPlanStoreMiB?: number;
|
|
134
130
|
experimental_autoFragmentization?: boolean;
|
|
135
131
|
fetcher?: typeof fetch;
|
|
@@ -150,6 +146,7 @@ export interface ServiceListGatewayConfig extends GatewayConfigBase {
|
|
|
150
146
|
| ((
|
|
151
147
|
service: ServiceEndpointDefinition,
|
|
152
148
|
) => Promise<HeadersInit> | HeadersInit);
|
|
149
|
+
pollIntervalInMs?: number;
|
|
153
150
|
}
|
|
154
151
|
|
|
155
152
|
export interface ManagedGatewayConfig extends GatewayConfigBase {
|
|
@@ -168,6 +165,11 @@ export interface ManagedGatewayConfig extends GatewayConfigBase {
|
|
|
168
165
|
*/
|
|
169
166
|
uplinkEndpoints?: string[];
|
|
170
167
|
uplinkMaxRetries?: number;
|
|
168
|
+
/**
|
|
169
|
+
* @deprecated use `fallbackPollIntervalInMs` instead
|
|
170
|
+
*/
|
|
171
|
+
pollIntervalInMs?: number;
|
|
172
|
+
fallbackPollIntervalInMs?: number;
|
|
171
173
|
}
|
|
172
174
|
|
|
173
175
|
// TODO(trevor:removeServiceList): migrate users to `supergraphSdl` function option
|
|
@@ -176,6 +178,7 @@ interface ManuallyManagedServiceDefsGatewayConfig extends GatewayConfigBase {
|
|
|
176
178
|
* @deprecated: use `supergraphSdl` instead (either as a `SupergraphSdlHook` or `SupergraphManager`)
|
|
177
179
|
*/
|
|
178
180
|
experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions;
|
|
181
|
+
pollIntervalInMs?: number;
|
|
179
182
|
}
|
|
180
183
|
|
|
181
184
|
// TODO(trevor:removeServiceList): migrate users to `supergraphSdl` function option
|
|
@@ -185,6 +188,7 @@ interface ExperimentalManuallyManagedSupergraphSdlGatewayConfig
|
|
|
185
188
|
* @deprecated: use `supergraphSdl` instead (either as a `SupergraphSdlHook` or `SupergraphManager`)
|
|
186
189
|
*/
|
|
187
190
|
experimental_updateSupergraphSdl: Experimental_UpdateSupergraphSdl;
|
|
191
|
+
pollIntervalInMs?: number;
|
|
188
192
|
}
|
|
189
193
|
|
|
190
194
|
export function isManuallyManagedSupergraphSdlGatewayConfig(
|
|
@@ -238,7 +242,7 @@ type ManuallyManagedGatewayConfig =
|
|
|
238
242
|
| ManuallyManagedServiceDefsGatewayConfig
|
|
239
243
|
| ExperimentalManuallyManagedSupergraphSdlGatewayConfig
|
|
240
244
|
| ManuallyManagedSupergraphSdlGatewayConfig
|
|
241
|
-
// TODO(trevor:removeServiceList
|
|
245
|
+
// TODO(trevor:removeServiceList)
|
|
242
246
|
| ServiceListGatewayConfig;
|
|
243
247
|
|
|
244
248
|
// TODO(trevor:removeServiceList)
|
|
@@ -322,6 +326,7 @@ export function isManagedConfig(
|
|
|
322
326
|
return (
|
|
323
327
|
'schemaConfigDeliveryEndpoint' in config ||
|
|
324
328
|
'uplinkEndpoints' in config ||
|
|
329
|
+
'fallbackPollIntervalInMs' in config ||
|
|
325
330
|
(!isLocalConfig(config) &&
|
|
326
331
|
!isStaticSupergraphSdlConfig(config) &&
|
|
327
332
|
!isManuallyManagedConfig(config))
|
package/src/index.ts
CHANGED
|
@@ -200,8 +200,12 @@ export class ApolloGateway implements GraphQLService {
|
|
|
200
200
|
this.experimental_didUpdateSupergraph =
|
|
201
201
|
config?.experimental_didUpdateSupergraph;
|
|
202
202
|
|
|
203
|
-
this.
|
|
204
|
-
|
|
203
|
+
if (isManagedConfig(this.config)) {
|
|
204
|
+
this.pollIntervalInMs =
|
|
205
|
+
this.config.fallbackPollIntervalInMs ?? this.config.pollIntervalInMs;
|
|
206
|
+
} else if (isServiceListConfig(this.config)) {
|
|
207
|
+
this.pollIntervalInMs = this.config?.pollIntervalInMs;
|
|
208
|
+
}
|
|
205
209
|
|
|
206
210
|
this.issueConfigurationWarningsIfApplicable();
|
|
207
211
|
|
|
@@ -252,7 +256,7 @@ export class ApolloGateway implements GraphQLService {
|
|
|
252
256
|
'Polling Apollo services at a frequency of less than once per 10 ' +
|
|
253
257
|
'seconds (10000) is disallowed. Instead, the minimum allowed ' +
|
|
254
258
|
'pollInterval of 10000 will be used. Please reconfigure your ' +
|
|
255
|
-
'`
|
|
259
|
+
'`fallbackPollIntervalInMs` accordingly. If this is problematic for ' +
|
|
256
260
|
'your team, please contact support.',
|
|
257
261
|
);
|
|
258
262
|
}
|
|
@@ -286,9 +290,11 @@ export class ApolloGateway implements GraphQLService {
|
|
|
286
290
|
);
|
|
287
291
|
}
|
|
288
292
|
|
|
289
|
-
if ('
|
|
293
|
+
if (isManagedConfig(this.config) && 'pollIntervalInMs' in this.config) {
|
|
290
294
|
this.logger.warn(
|
|
291
|
-
'The `
|
|
295
|
+
'The `pollIntervalInMs` option is deprecated and will be removed in a future version of `@apollo/gateway`. ' +
|
|
296
|
+
'Please migrate to the equivalent `fallbackPollIntervalInMs` configuration option. ' +
|
|
297
|
+
'The poll interval is now defined by Uplink, this option will only be used if it is greater than the value defined by Uplink or as a fallback.',
|
|
292
298
|
);
|
|
293
299
|
}
|
|
294
300
|
}
|
|
@@ -406,7 +412,7 @@ export class ApolloGateway implements GraphQLService {
|
|
|
406
412
|
subgraphHealthCheck: this.config.serviceHealthCheck,
|
|
407
413
|
fetcher: this.fetcher,
|
|
408
414
|
logger: this.logger,
|
|
409
|
-
|
|
415
|
+
fallbackPollIntervalInMs: this.pollIntervalInMs ?? 10000,
|
|
410
416
|
}),
|
|
411
417
|
);
|
|
412
418
|
}
|
|
@@ -65,6 +65,7 @@ describe('loadSupergraphSdlFromStorage', () => {
|
|
|
65
65
|
compositionId: "originalId-1234",
|
|
66
66
|
maxRetries: 1,
|
|
67
67
|
roundRobinSeed: 0,
|
|
68
|
+
earliestFetchTime: null,
|
|
68
69
|
});
|
|
69
70
|
|
|
70
71
|
expect(result).toMatchObject({
|
|
@@ -88,6 +89,7 @@ describe('loadSupergraphSdlFromStorage', () => {
|
|
|
88
89
|
compositionId: "originalId-1234",
|
|
89
90
|
maxRetries: 1,
|
|
90
91
|
roundRobinSeed: 0,
|
|
92
|
+
earliestFetchTime: null,
|
|
91
93
|
}),
|
|
92
94
|
).rejects.toThrowError(
|
|
93
95
|
new UplinkFetcherError(
|
|
@@ -388,10 +390,49 @@ describe("loadSupergraphSdlFromUplinks", () => {
|
|
|
388
390
|
compositionId: "id-1234",
|
|
389
391
|
maxRetries: 5,
|
|
390
392
|
roundRobinSeed: 0,
|
|
393
|
+
earliestFetchTime: null,
|
|
391
394
|
});
|
|
392
395
|
|
|
393
396
|
expect(result).toBeNull();
|
|
394
397
|
expect(fetcher).toHaveBeenCalledTimes(1);
|
|
395
398
|
});
|
|
399
|
+
|
|
400
|
+
it("Waits the correct time before retrying", async () => {
|
|
401
|
+
const timeoutSpy = jest.spyOn(global, 'setTimeout');
|
|
402
|
+
|
|
403
|
+
mockSupergraphSdlRequest('originalId-1234', mockCloudConfigUrl1).reply(500);
|
|
404
|
+
mockSupergraphSdlRequestIfAfter('originalId-1234', mockCloudConfigUrl2).reply(
|
|
405
|
+
200,
|
|
406
|
+
JSON.stringify({
|
|
407
|
+
data: {
|
|
408
|
+
routerConfig: {
|
|
409
|
+
__typename: 'RouterConfigResult',
|
|
410
|
+
id: 'originalId-1234',
|
|
411
|
+
supergraphSdl: getTestingSupergraphSdl()
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
}),
|
|
415
|
+
);
|
|
416
|
+
const fetcher = getDefaultFetcher();
|
|
417
|
+
|
|
418
|
+
await loadSupergraphSdlFromUplinks({
|
|
419
|
+
graphRef,
|
|
420
|
+
apiKey,
|
|
421
|
+
endpoints: [mockCloudConfigUrl1, mockCloudConfigUrl2],
|
|
422
|
+
errorReportingEndpoint: undefined,
|
|
423
|
+
fetcher: fetcher,
|
|
424
|
+
compositionId: "originalId-1234",
|
|
425
|
+
maxRetries: 1,
|
|
426
|
+
roundRobinSeed: 0,
|
|
427
|
+
earliestFetchTime: new Date(Date.now() + 1000),
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
// test if setTimeout was called with a value in range to deal with time jitter
|
|
431
|
+
const setTimeoutCall = timeoutSpy.mock.calls[1][1];
|
|
432
|
+
expect(setTimeoutCall).toBeLessThanOrEqual(1000);
|
|
433
|
+
expect(setTimeoutCall).toBeGreaterThanOrEqual(900);
|
|
434
|
+
|
|
435
|
+
timeoutSpy.mockRestore();
|
|
436
|
+
});
|
|
396
437
|
});
|
|
397
438
|
|
|
@@ -6,7 +6,7 @@ import { SubgraphHealthCheckFunction, SupergraphSdlUpdateFunction } from '../..'
|
|
|
6
6
|
import { loadSupergraphSdlFromUplinks } from './loadSupergraphSdlFromStorage';
|
|
7
7
|
|
|
8
8
|
export interface UplinkFetcherOptions {
|
|
9
|
-
|
|
9
|
+
fallbackPollIntervalInMs: number;
|
|
10
10
|
subgraphHealthCheck?: boolean;
|
|
11
11
|
graphRef: string;
|
|
12
12
|
apiKey: string;
|
|
@@ -31,6 +31,8 @@ export class UplinkFetcher implements SupergraphManager {
|
|
|
31
31
|
process.env.APOLLO_OUT_OF_BAND_REPORTER_ENDPOINT ?? undefined;
|
|
32
32
|
private compositionId?: string;
|
|
33
33
|
private fetchCount: number = 0;
|
|
34
|
+
private minDelayMs: number | null = null;
|
|
35
|
+
private earliestFetchTime: Date | null = null;
|
|
34
36
|
|
|
35
37
|
constructor(options: UplinkFetcherOptions) {
|
|
36
38
|
this.config = options;
|
|
@@ -46,7 +48,12 @@ export class UplinkFetcher implements SupergraphManager {
|
|
|
46
48
|
|
|
47
49
|
let initialSupergraphSdl: string | null = null;
|
|
48
50
|
try {
|
|
49
|
-
|
|
51
|
+
const result = await this.updateSupergraphSdl();
|
|
52
|
+
initialSupergraphSdl = result?.supergraphSdl || null;
|
|
53
|
+
if (result?.minDelaySeconds) {
|
|
54
|
+
this.minDelayMs = 1000 * result?.minDelaySeconds;
|
|
55
|
+
this.earliestFetchTime = new Date(Date.now() + this.minDelayMs);
|
|
56
|
+
}
|
|
50
57
|
} catch (e) {
|
|
51
58
|
this.logUpdateFailure(e);
|
|
52
59
|
throw e;
|
|
@@ -83,6 +90,7 @@ export class UplinkFetcher implements SupergraphManager {
|
|
|
83
90
|
compositionId: this.compositionId ?? null,
|
|
84
91
|
maxRetries: this.config.maxRetries,
|
|
85
92
|
roundRobinSeed: this.fetchCount++,
|
|
93
|
+
earliestFetchTime: this.earliestFetchTime,
|
|
86
94
|
});
|
|
87
95
|
|
|
88
96
|
if (!result) {
|
|
@@ -91,7 +99,8 @@ export class UplinkFetcher implements SupergraphManager {
|
|
|
91
99
|
this.compositionId = result.id;
|
|
92
100
|
// the healthCheck fn is only assigned if it's enabled in the config
|
|
93
101
|
await this.healthCheck?.(result.supergraphSdl);
|
|
94
|
-
|
|
102
|
+
const { supergraphSdl, minDelaySeconds } = result;
|
|
103
|
+
return { supergraphSdl, minDelaySeconds };
|
|
95
104
|
}
|
|
96
105
|
}
|
|
97
106
|
|
|
@@ -101,24 +110,34 @@ export class UplinkFetcher implements SupergraphManager {
|
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
private poll() {
|
|
104
|
-
this.timerRef = setTimeout(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
this.timerRef = setTimeout(
|
|
114
|
+
async () => {
|
|
115
|
+
if (this.state.phase === 'polling') {
|
|
116
|
+
const pollingPromise = resolvable();
|
|
117
|
+
|
|
118
|
+
this.state.pollingPromise = pollingPromise;
|
|
119
|
+
try {
|
|
120
|
+
const result = await this.updateSupergraphSdl();
|
|
121
|
+
const maybeNewSupergraphSdl = result?.supergraphSdl || null;
|
|
122
|
+
if (result?.minDelaySeconds) {
|
|
123
|
+
this.minDelayMs = 1000 * result?.minDelaySeconds;
|
|
124
|
+
this.earliestFetchTime = new Date(Date.now() + this.minDelayMs);
|
|
125
|
+
}
|
|
126
|
+
if (maybeNewSupergraphSdl) {
|
|
127
|
+
this.update?.(maybeNewSupergraphSdl);
|
|
128
|
+
}
|
|
129
|
+
} catch (e) {
|
|
130
|
+
this.logUpdateFailure(e);
|
|
113
131
|
}
|
|
114
|
-
|
|
115
|
-
this.logUpdateFailure(e);
|
|
132
|
+
pollingPromise.resolve();
|
|
116
133
|
}
|
|
117
|
-
pollingPromise.resolve();
|
|
118
|
-
}
|
|
119
134
|
|
|
120
|
-
|
|
121
|
-
|
|
135
|
+
this.poll();
|
|
136
|
+
},
|
|
137
|
+
this.minDelayMs
|
|
138
|
+
? Math.max(this.minDelayMs, this.config.fallbackPollIntervalInMs)
|
|
139
|
+
: this.config.fallbackPollIntervalInMs,
|
|
140
|
+
);
|
|
122
141
|
}
|
|
123
142
|
|
|
124
143
|
private logUpdateFailure(e: any) {
|
|
@@ -13,6 +13,7 @@ export const SUPERGRAPH_SDL_QUERY = /* GraphQL */`#graphql
|
|
|
13
13
|
... on RouterConfigResult {
|
|
14
14
|
id
|
|
15
15
|
supergraphSdl: supergraphSDL
|
|
16
|
+
minDelaySeconds
|
|
16
17
|
}
|
|
17
18
|
... on FetchError {
|
|
18
19
|
code
|
|
@@ -56,6 +57,7 @@ export async function loadSupergraphSdlFromUplinks({
|
|
|
56
57
|
compositionId,
|
|
57
58
|
maxRetries,
|
|
58
59
|
roundRobinSeed,
|
|
60
|
+
earliestFetchTime,
|
|
59
61
|
}: {
|
|
60
62
|
graphRef: string;
|
|
61
63
|
apiKey: string;
|
|
@@ -65,6 +67,7 @@ export async function loadSupergraphSdlFromUplinks({
|
|
|
65
67
|
compositionId: string | null;
|
|
66
68
|
maxRetries: number,
|
|
67
69
|
roundRobinSeed: number,
|
|
70
|
+
earliestFetchTime: Date | null
|
|
68
71
|
}) : Promise<SupergraphSdlUpdate | null> {
|
|
69
72
|
// This Promise resolves with either an updated supergraph or null if no change.
|
|
70
73
|
// This Promise can reject in the case that none of the retries are successful,
|
|
@@ -81,6 +84,10 @@ export async function loadSupergraphSdlFromUplinks({
|
|
|
81
84
|
}),
|
|
82
85
|
{
|
|
83
86
|
retries: maxRetries,
|
|
87
|
+
onRetry: async () => {
|
|
88
|
+
const delayMS = earliestFetchTime ? earliestFetchTime.getTime() - Date.now(): 0;
|
|
89
|
+
if (delayMS > 0) await new Promise(resolve => setTimeout(resolve, delayMS));
|
|
90
|
+
}
|
|
84
91
|
},
|
|
85
92
|
);
|
|
86
93
|
|
|
@@ -176,9 +183,10 @@ export async function loadSupergraphSdlFromStorage({
|
|
|
176
183
|
const {
|
|
177
184
|
id,
|
|
178
185
|
supergraphSdl,
|
|
186
|
+
minDelaySeconds,
|
|
179
187
|
// messages,
|
|
180
188
|
} = routerConfig;
|
|
181
|
-
return { id, supergraphSdl: supergraphSdl
|
|
189
|
+
return { id, supergraphSdl: supergraphSdl!, minDelaySeconds };
|
|
182
190
|
} else if (routerConfig.__typename === 'FetchError') {
|
|
183
191
|
// FetchError case
|
|
184
192
|
const { code, message } = routerConfig;
|
package/dist/core/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { CoreSchemaContext, Feature } from '@apollo/core-schema';
|
|
2
|
-
export declare const ErrUnsupportedFeature: (feature: Feature) => import("@apollo/core-schema/dist/error").GraphQLErrorExt<"UnsupportedFeature"> & {
|
|
3
|
-
message: string;
|
|
4
|
-
feature: Feature;
|
|
5
|
-
nodes: import("graphql").DirectiveNode[];
|
|
6
|
-
};
|
|
7
|
-
export declare const ErrForUnsupported: (core: Feature, ...features: readonly Feature[]) => import("@apollo/core-schema/dist/error").GraphQLErrorExt<"ForUnsupported"> & {
|
|
8
|
-
message: string;
|
|
9
|
-
features: readonly Feature[];
|
|
10
|
-
nodes: import("graphql").DirectiveNode[];
|
|
11
|
-
};
|
|
12
|
-
export declare function featureSupport(this: CoreSchemaContext): void;
|
|
13
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAO,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAUtE,eAAO,MAAM,qBAAqB,YAAa,OAAO;;;;CAKlD,CAAC;AAEL,eAAO,MAAM,iBAAiB,SAAU,OAAO,eAAe,SAAS,OAAO,EAAE;;;;CAO5E,CAAC;AAEL,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,QAwBrD"}
|