UNPKG

1.94 kBJavaScriptView Raw
1import { parse, visit } from 'graphql';
2import nullthrows from 'nullthrows';
3export const getFragmentDependencies = (operationString, fragmentDefinitions) => {
4 if (!fragmentDefinitions) {
5 return [];
6 }
7 let parsedOperation;
8 try {
9 parsedOperation = parse(operationString, {
10 allowLegacySDLImplementsInterfaces: true,
11 allowLegacySDLEmptyFields: true,
12 });
13 }
14 catch (error) {
15 return [];
16 }
17 return getFragmentDependenciesForAST(parsedOperation, fragmentDefinitions);
18};
19export const getFragmentDependenciesForAST = (parsedOperation, fragmentDefinitions) => {
20 if (!fragmentDefinitions) {
21 return [];
22 }
23 const existingFrags = new Map();
24 const referencedFragNames = new Set();
25 visit(parsedOperation, {
26 FragmentDefinition(node) {
27 existingFrags.set(node.name.value, true);
28 },
29 FragmentSpread(node) {
30 if (!referencedFragNames.has(node.name.value)) {
31 referencedFragNames.add(node.name.value);
32 }
33 },
34 });
35 const asts = new Set();
36 referencedFragNames.forEach(name => {
37 if (!existingFrags.has(name) && fragmentDefinitions.has(name)) {
38 asts.add(nullthrows(fragmentDefinitions.get(name)));
39 }
40 });
41 const referencedFragments = [];
42 asts.forEach(ast => {
43 visit(ast, {
44 FragmentSpread(node) {
45 if (!referencedFragNames.has(node.name.value) &&
46 fragmentDefinitions.get(node.name.value)) {
47 asts.add(nullthrows(fragmentDefinitions.get(node.name.value)));
48 referencedFragNames.add(node.name.value);
49 }
50 },
51 });
52 if (!existingFrags.has(ast.name.value)) {
53 referencedFragments.push(ast);
54 }
55 });
56 return referencedFragments;
57};
58//# sourceMappingURL=fragmentDependencies.js.map
\No newline at end of file