UNPKG

eslint-plugin-next-route-params

Version:

eslint rule to enforce correct route parameters for Next.js

65 lines (64 loc) 3.07 kB
"use strict"; 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); }