Spaces:
Running
Running
import { GraphQLError } from '../../error/GraphQLError.mjs'; | |
/** | |
* No unused fragments | |
* | |
* A GraphQL document is only valid if all fragment definitions are spread | |
* within operations, or spread within other fragments spread within operations. | |
* | |
* See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used | |
*/ | |
export function NoUnusedFragmentsRule(context) { | |
const operationDefs = []; | |
const fragmentDefs = []; | |
return { | |
OperationDefinition(node) { | |
operationDefs.push(node); | |
return false; | |
}, | |
FragmentDefinition(node) { | |
fragmentDefs.push(node); | |
return false; | |
}, | |
Document: { | |
leave() { | |
const fragmentNameUsed = Object.create(null); | |
for (const operation of operationDefs) { | |
for (const fragment of context.getRecursivelyReferencedFragments( | |
operation, | |
)) { | |
fragmentNameUsed[fragment.name.value] = true; | |
} | |
} | |
for (const fragmentDef of fragmentDefs) { | |
const fragName = fragmentDef.name.value; | |
if (fragmentNameUsed[fragName] !== true) { | |
context.reportError( | |
new GraphQLError(`Fragment "${fragName}" is never used.`, { | |
nodes: fragmentDef, | |
}), | |
); | |
} | |
} | |
}, | |
}, | |
}; | |
} | |