UNPKG

1.83 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 }
11 catch (error) {
12 return [];
13 }
14 return getFragmentDependenciesForAST(parsedOperation, fragmentDefinitions);
15};
16export const getFragmentDependenciesForAST = (parsedOperation, fragmentDefinitions) => {
17 if (!fragmentDefinitions) {
18 return [];
19 }
20 const existingFrags = new Map();
21 const referencedFragNames = new Set();
22 visit(parsedOperation, {
23 FragmentDefinition(node) {
24 existingFrags.set(node.name.value, true);
25 },
26 FragmentSpread(node) {
27 if (!referencedFragNames.has(node.name.value)) {
28 referencedFragNames.add(node.name.value);
29 }
30 },
31 });
32 const asts = new Set();
33 referencedFragNames.forEach(name => {
34 if (!existingFrags.has(name) && fragmentDefinitions.has(name)) {
35 asts.add(nullthrows(fragmentDefinitions.get(name)));
36 }
37 });
38 const referencedFragments = [];
39 asts.forEach(ast => {
40 visit(ast, {
41 FragmentSpread(node) {
42 if (!referencedFragNames.has(node.name.value) &&
43 fragmentDefinitions.get(node.name.value)) {
44 asts.add(nullthrows(fragmentDefinitions.get(node.name.value)));
45 referencedFragNames.add(node.name.value);
46 }
47 },
48 });
49 if (!existingFrags.has(ast.name.value)) {
50 referencedFragments.push(ast);
51 }
52 });
53 return referencedFragments;
54};
55//# sourceMappingURL=fragmentDependencies.js.map
\No newline at end of file