eslint-plugin-next-route-params
Version:
eslint rule to enforce correct route parameters for Next.js
65 lines (64 loc) • 3.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleFunctionParameters = handleFunctionParameters;
exports.reportWrongParameterIssue = reportWrongParameterIssue;
const utils_1 = require("@typescript-eslint/utils");
const validateSearchParams_1 = require("./validation/validateSearchParams");
const validateParams_1 = require("./validation/validateParams");
const findReferencedType_1 = require("./validation/findReferencedType");
function handleFunctionParameters({ props, context, options, }) {
// no type annotation => could mean that is not using noImplicitAny
if (!props || !("typeAnnotation" in props)) {
return;
}
const innerTypeAnnotation = props.typeAnnotation?.typeAnnotation;
switch (innerTypeAnnotation?.type) {
case utils_1.AST_NODE_TYPES.TSTypeLiteral:
validateFirstParameter(innerTypeAnnotation, context, options);
break;
case utils_1.AST_NODE_TYPES.TSTypeReference:
const referencedTSTypeLiteral = (0, findReferencedType_1.findReferencedType)(innerTypeAnnotation, context);
if (referencedTSTypeLiteral != null) {
validateFirstParameter(referencedTSTypeLiteral, context, options);
}
}
}
function reportWrongParameterIssue(context, paramsTypeNode, wrongTypeRange, data) {
context.ruleContext.report({
loc: paramsTypeNode.loc,
messageId: "issue:isWrongParameterType",
data,
fix: (fixer) => fixer.replaceTextRange(wrongTypeRange, data.type),
});
}
function validateFirstParameter(propsType, context, options) {
propsType.members
.filter((member) => member.type === utils_1.AST_NODE_TYPES.TSPropertySignature &&
member.key.type === utils_1.AST_NODE_TYPES.Identifier &&
!context.customContext.allowedPropsForFileNameType?.includes(member.key.name))
.forEach((member) => {
context.ruleContext.report({
loc: member.loc,
messageId: "issue:forbiddenPropertyKey",
data: { key: member.key.name },
fix: (fixer) => {
const sourceCode = context.ruleContext.sourceCode;
const tokenBefore = sourceCode.getTokenBefore(member);
const tokenAfter = sourceCode.getTokenAfter(member);
// Check if there's a trailing comma or a leading comma for handling commas in lists
let rangeToRemove = member.range;
if (tokenAfter && tokenAfter.value === ",") {
rangeToRemove = [member.range[0], tokenAfter.range[1]];
}
else if (tokenBefore && tokenBefore.value === ",") {
rangeToRemove = [tokenBefore.range[0], member.range[1]];
}
return fixer.removeRange(rangeToRemove);
},
});
});
if (options[0].searchParams) {
(0, validateSearchParams_1.validateSearchParams)(propsType, context);
}
(0, validateParams_1.validateParams)(propsType, context);
}