@graphql-mesh/utils
Version:
52 lines (51 loc) • 2.21 kB
JavaScript
import { valueFromASTUntyped } from 'graphql';
import { getArgumentValues } from '@graphql-tools/utils';
export function getDefDirectives(schema, { astNode, extensions }, subgraph) {
const directiveAnnotations = [];
if (astNode != null && 'directives' in astNode) {
astNode.directives?.forEach(directiveNode => {
const directiveName = directiveNode.name.value;
const schemaDirective = schema.getDirective(directiveName);
const directiveAnnotation = {
name: directiveNode.name.value,
args: schemaDirective
? getArgumentValues(schemaDirective, directiveNode)
: (directiveNode.arguments?.reduce((acc, arg) => {
acc[arg.name.value] = valueFromASTUntyped(arg.value);
return acc;
}, {}) ?? {}),
};
if (subgraph &&
directiveAnnotation.args.subgraph &&
directiveAnnotation.args.subgraph !== subgraph)
return;
directiveAnnotations.push(directiveAnnotation);
});
}
if (extensions?.directives != null) {
for (const directiveName in extensions.directives) {
const directiveExt = extensions.directives[directiveName];
if (directiveExt != null) {
if (Array.isArray(directiveExt)) {
directiveExt.forEach(directive => {
if (subgraph && directive.subgraph && directive.subgraph !== subgraph)
return;
directiveAnnotations.push({
name: directiveName,
args: directive,
});
});
}
else {
if (subgraph && directiveExt.subgraph && directiveExt.subgraph !== subgraph)
continue;
directiveAnnotations.push({
name: directiveName,
args: directiveExt,
});
}
}
}
}
return directiveAnnotations;
}