1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | exports.getFragmentDependenciesForAST = exports.getFragmentDependencies = void 0;
|
7 | const graphql_1 = require("graphql");
|
8 | const nullthrows_1 = __importDefault(require("nullthrows"));
|
9 | const getFragmentDependencies = (operationString, fragmentDefinitions) => {
|
10 | if (!fragmentDefinitions) {
|
11 | return [];
|
12 | }
|
13 | let parsedOperation;
|
14 | try {
|
15 | parsedOperation = graphql_1.parse(operationString, {
|
16 | allowLegacySDLImplementsInterfaces: true,
|
17 | allowLegacySDLEmptyFields: true,
|
18 | });
|
19 | }
|
20 | catch (error) {
|
21 | return [];
|
22 | }
|
23 | return exports.getFragmentDependenciesForAST(parsedOperation, fragmentDefinitions);
|
24 | };
|
25 | exports.getFragmentDependencies = getFragmentDependencies;
|
26 | const getFragmentDependenciesForAST = (parsedOperation, fragmentDefinitions) => {
|
27 | if (!fragmentDefinitions) {
|
28 | return [];
|
29 | }
|
30 | const existingFrags = new Map();
|
31 | const referencedFragNames = new Set();
|
32 | graphql_1.visit(parsedOperation, {
|
33 | FragmentDefinition(node) {
|
34 | existingFrags.set(node.name.value, true);
|
35 | },
|
36 | FragmentSpread(node) {
|
37 | if (!referencedFragNames.has(node.name.value)) {
|
38 | referencedFragNames.add(node.name.value);
|
39 | }
|
40 | },
|
41 | });
|
42 | const asts = new Set();
|
43 | referencedFragNames.forEach(name => {
|
44 | if (!existingFrags.has(name) && fragmentDefinitions.has(name)) {
|
45 | asts.add(nullthrows_1.default(fragmentDefinitions.get(name)));
|
46 | }
|
47 | });
|
48 | const referencedFragments = [];
|
49 | asts.forEach(ast => {
|
50 | graphql_1.visit(ast, {
|
51 | FragmentSpread(node) {
|
52 | if (!referencedFragNames.has(node.name.value) &&
|
53 | fragmentDefinitions.get(node.name.value)) {
|
54 | asts.add(nullthrows_1.default(fragmentDefinitions.get(node.name.value)));
|
55 | referencedFragNames.add(node.name.value);
|
56 | }
|
57 | },
|
58 | });
|
59 | if (!existingFrags.has(ast.name.value)) {
|
60 | referencedFragments.push(ast);
|
61 | }
|
62 | });
|
63 | return referencedFragments;
|
64 | };
|
65 | exports.getFragmentDependenciesForAST = getFragmentDependenciesForAST;
|
66 |
|
\ | No newline at end of file |