@theguild/federation-composition
Version:
Open Source Composition library for Apollo Federation
55 lines (54 loc) • 1.83 kB
JavaScript
import { isTypeDefinitionNode, Kind, parse, } from 'graphql';
import { sdl as authenticatedSdl } from '../specifications/authenticated.js';
import { sdl as costSdl } from '../specifications/cost.js';
import { getLatestFederationVersion } from '../specifications/federation.js';
import { sdl as inaccessibleSdl } from '../specifications/inaccessible.js';
import { sdl as joinSdl } from '../specifications/join.js';
import { sdl as linkSdl } from '../specifications/link.js';
import { sdl as policySdl } from '../specifications/policy.js';
import { sdl as requiresSdl } from '../specifications/requires-scopes.js';
import { sdl as tagSdl } from '../specifications/tag.js';
let supergraphSpecNodes = null;
export const extraFederationTypeNames = new Set([
'_FieldSet',
'join__DirectiveArguments',
]);
export const extraFederationDirectiveNames = new Set([
'core',
'join__owner',
'join__directive',
'context',
]);
export function getSupergraphSpecNodes() {
if (supergraphSpecNodes !== null) {
return supergraphSpecNodes;
}
const latestVersion = getLatestFederationVersion();
supergraphSpecNodes = [
authenticatedSdl,
costSdl({
cost: 'cost',
listSize: 'listSize',
}),
inaccessibleSdl,
joinSdl(latestVersion),
linkSdl,
policySdl,
requiresSdl,
tagSdl,
]
.map(sdl => parse(sdl, { noLocation: true })
.definitions.filter(isDefinitionNode)
.map(d => ({
name: d.name.value,
kind: d.kind,
})))
.flat();
return supergraphSpecNodes;
}
function isDirectiveDefinitionNode(node) {
return node.kind === Kind.DIRECTIVE_DEFINITION;
}
function isDefinitionNode(node) {
return isDirectiveDefinitionNode(node) || isTypeDefinitionNode(node);
}