@vanta-inc/eslint-plugin-vanta
Version:
Custom ESLint rules for Vanta
74 lines (73 loc) • 2.88 kB
JavaScript
;
/**
* @fileoverview Ensure that all GraphQL Connections are Relay compliant.
* https://relay.dev/graphql/connections.htm#sec-Connection-Types
*/
Object.defineProperty(exports, "__esModule", { value: true });
var graphqlutils_1 = require("../utils/graphqlutils");
var rule = {
meta: {
type: "suggestion",
docs: {
// @ts-ignore
description: "All Connection 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/connections-are-relay-compliant.md",
},
},
create: function (context) {
var validateType = function (n) {
var _a, _b;
var node = n.rawNode();
if (!node.name.value.endsWith("Connection")) {
return;
}
var edgesField = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.find(function (f) { return f.name.value === "edges"; });
if (edgesField === undefined) {
context.report({
node: n,
message: "Connections must contain an edge field",
});
return;
}
if (!graphqlutils_1.isListType(edgesField.type)) {
context.report({
node: n,
message: "Edges field must be a list",
});
}
var edgeTypeName = graphqlutils_1.extractNamedType(edgesField.type);
if (!edgeTypeName.name.value.endsWith("Edge")) {
context.report({
node: n,
message: "edge type must have a suffix `Edge`",
});
}
var pageInfoField = (_b = node.fields) === null || _b === void 0 ? void 0 : _b.find(function (f) { return f.name.value === "pageInfo"; });
if (pageInfoField === undefined) {
context.report({
node: n,
message: "Connections must contain a pageInfo field",
});
return;
}
if (pageInfoField.type.kind !== "NonNullType") {
context.report({
node: n,
message: "pageInfo must be non-nullable",
});
return;
}
var pageInfoTypeName = graphqlutils_1.extractNamedType(pageInfoField.type);
if (pageInfoTypeName.name.value !== "PageInfo") {
context.report({
node: n,
message: "pageInfo must be of type PageInfo",
});
}
};
return { ObjectTypeDefinition: validateType };
},
};
module.exports = rule;
exports.default = rule;