@graphql-eslint/eslint-plugin
Version:
GraphQL plugin for ESLint
73 lines (70 loc) • 2.57 kB
JavaScript
Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _graphql = require('graphql');
var _utilsjs = require('../../utils.js');
const rule = {
meta: {
type: "suggestion",
hasSuggestions: true,
docs: {
url: "https://the-guild.dev/graphql/eslint/rules/unique-enum-value-names",
category: "Schema",
recommended: true,
description: `A GraphQL enum type is only valid if all its values are uniquely named.
> This rule disallows case-insensitive enum values duplicates too.`,
examples: [
{
title: "Incorrect",
code: (
/* GraphQL */
`
enum MyEnum {
Value
VALUE
ValuE
}
`
)
},
{
title: "Correct",
code: (
/* GraphQL */
`
enum MyEnum {
Value1
Value2
Value3
}
`
)
}
]
},
schema: []
},
create(context) {
const selector = [_graphql.Kind.ENUM_TYPE_DEFINITION, _graphql.Kind.ENUM_TYPE_EXTENSION].join(",");
return {
[selector](node) {
const duplicates = _optionalChain([node, 'access', _ => _.values, 'optionalAccess', _2 => _2.filter, 'call', _3 => _3(
(item, index, array) => array.findIndex((v) => v.name.value.toLowerCase() === item.name.value.toLowerCase()) !== index
)]);
for (const duplicate of duplicates || []) {
const enumName = duplicate.name.value;
context.report({
node: duplicate.name,
message: `Unexpected case-insensitive enum values duplicates for ${_utilsjs.getNodeName.call(void 0,
duplicate
)}`,
suggest: [
{
desc: `Remove \`${enumName}\` enum value`,
fix: (fixer) => fixer.remove(duplicate)
}
]
});
}
}
};
}
};
exports.rule = rule;
;