@graphql-eslint/eslint-plugin
Version:
GraphQL plugin for ESLint
91 lines (88 loc) • 2.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.rule = exports.checkNode = void 0;
const path_1 = require("path");
const graphql_1 = require("graphql");
const utils_js_1 = require("../utils.js");
const RULE_ID = 'unique-fragment-name';
const checkNode = (context, node, ruleId) => {
const documentName = node.name.value;
const siblings = (0, utils_js_1.requireSiblingsOperations)(ruleId, context);
const siblingDocuments = node.kind === graphql_1.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 = (0, utils_js_1.normalizePath)(f.filePath) === (0, utils_js_1.normalizePath)(filepath);
return isSameName && !isSamePath;
});
if (conflictingDocuments.length > 0) {
context.report({
messageId: ruleId,
data: {
documentName,
summary: conflictingDocuments
.map(f => `\t${(0, path_1.relative)(utils_js_1.CWD, f.filePath.replace(utils_js_1.VIRTUAL_DOCUMENT_REGEX, ''))}`)
.join('\n'),
},
node: node.name,
});
}
};
exports.checkNode = checkNode;
exports.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) {
(0, exports.checkNode)(context, node, RULE_ID);
},
};
},
};