UNPKG

@graphql-eslint/eslint-plugin

Version:
88 lines (85 loc) 2.82 kB
import { relative } from 'path'; import { Kind } from 'graphql'; import { normalizePath, requireSiblingsOperations, VIRTUAL_DOCUMENT_REGEX, CWD } from '../utils.js'; const RULE_ID = 'unique-fragment-name'; export const checkNode = (context, node, ruleId) => { const documentName = node.name.value; const siblings = requireSiblingsOperations(ruleId, context); const siblingDocuments = node.kind === Kind.FRAGMENT_DEFINITION ? siblings.getFragment(documentName) : siblings.getOperation(documentName); const filepath = context.getFilename(); const conflictingDocuments = siblingDocuments.filter(f => { var _a; const isSameName = ((_a = f.document.name) === null || _a === void 0 ? void 0 : _a.value) === documentName; const isSamePath = normalizePath(f.filePath) === normalizePath(filepath); return isSameName && !isSamePath; }); if (conflictingDocuments.length > 0) { context.report({ messageId: ruleId, data: { documentName, summary: conflictingDocuments .map(f => `\t${relative(CWD, f.filePath.replace(VIRTUAL_DOCUMENT_REGEX, ''))}`) .join('\n'), }, // @ts-expect-error name will exist node: node.name, }); } }; export const rule = { meta: { type: 'suggestion', docs: { category: 'Operations', description: 'Enforce unique fragment names across your project.', url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID}.md`, requiresSiblings: true, examples: [ { title: 'Incorrect', code: /* GraphQL */ ` # user.fragment.graphql fragment UserFields on User { id name fullName } # user-fields.graphql fragment UserFields on User { id } `, }, { title: 'Correct', code: /* GraphQL */ ` # user.fragment.graphql fragment AllUserFields on User { id name fullName } # user-fields.graphql fragment UserFields on User { id } `, }, ], }, messages: { [RULE_ID]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}', }, schema: [], }, create(context) { return { FragmentDefinition(node) { checkNode(context, node, RULE_ID); }, }; }, };