UNPKG

@graphql-eslint/eslint-plugin

Version:
84 lines (83 loc) 2.68 kB
import { ARRAY_DEFAULT_OPTIONS, requireGraphQLSchemaFromContext, truthy } from '../utils.js'; const schema = { type: 'array', minItems: 1, maxItems: 1, items: { type: 'object', additionalProperties: false, required: ['disallow'], properties: { disallow: { ...ARRAY_DEFAULT_OPTIONS, items: { enum: ['mutation', 'subscription'], }, }, }, }, }; export const rule = { meta: { type: 'suggestion', hasSuggestions: true, docs: { category: 'Schema', description: 'Disallow using root types `mutation` and/or `subscription`.', url: 'https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/no-root-type.md', requiresSchema: true, isDisabledForAllConfig: true, examples: [ { title: 'Incorrect', usage: [{ disallow: ['mutation', 'subscription'] }], code: /* GraphQL */ ` type Mutation { createUser(input: CreateUserInput!): User! } `, }, { title: 'Correct', usage: [{ disallow: ['mutation', 'subscription'] }], code: /* GraphQL */ ` type Query { users: [User!]! } `, }, ], }, schema, }, create(context) { const schema = requireGraphQLSchemaFromContext('no-root-type', context); const disallow = new Set(context.options[0].disallow); const rootTypeNames = [ disallow.has('mutation') && schema.getMutationType(), disallow.has('subscription') && schema.getSubscriptionType(), ] .filter(truthy) .map(type => type.name) .join('|'); if (!rootTypeNames) { return {}; } const selector = `:matches(ObjectTypeDefinition, ObjectTypeExtension) > .name[value=/^(${rootTypeNames})$/]`; return { [selector](node) { const typeName = node.value; context.report({ node, message: `Root type \`${typeName}\` is forbidden.`, suggest: [ { desc: `Remove \`${typeName}\` type`, fix: fixer => fixer.remove(node.parent), }, ], }); }, }; }, };