UNPKG

@vanta-inc/eslint-plugin-vanta

Version:
67 lines (66 loc) 2.58 kB
"use strict"; /** * @fileoverview Ensure that all GraphQL Edges are Relay compliant. * https://relay.dev/graphql/connections.htm#sec-Edge-Types */ Object.defineProperty(exports, "__esModule", { value: true }); var graphqlutils_1 = require("../utils/graphqlutils"); var rule = { meta: { type: "suggestion", docs: { // @ts-ignore description: "All Edge GraphQL types must implement the interface specified by the Relay cursor spec.", category: "Schema", url: "https://github.com/VantaInc/eslint-plugin-vanta/blob/main/docs/rules/edges-are-relay-compliant.md", }, }, create: function (context) { var validateType = function (n) { var _a, _b; var node = n.rawNode(); if (!node.name.value.endsWith("Edge")) { return; } var nodeField = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.find(function (f) { return f.name.value === "node"; }); if (nodeField === undefined) { context.report({ node: n, message: "Edges must contain a node field", }); return; } if (graphqlutils_1.isListType(nodeField.type)) { context.report({ node: n, message: "Node field cannot be a list", }); } var cursorField = (_b = node.fields) === null || _b === void 0 ? void 0 : _b.find(function (f) { return f.name.value === "cursor"; }); if (cursorField === undefined) { context.report({ node: n, message: "Edges must contain a cursor field", }); return; } var isString = function (type) { var namedType = graphqlutils_1.extractNamedType(type); return namedType.name.value === "String"; }; var isCursorFieldSerializable = cursorField.type.kind === "NonNullType" ? isString(cursorField.type.type) : isString(cursorField.type); if (!isCursorFieldSerializable) { context.report({ node: n, message: "Cursor field must be a string or serializable to string", }); return; } }; return { ObjectTypeDefinition: validateType }; }, }; module.exports = rule; exports.default = rule;