import type { Rule } from "eslint" interface RuleOptions { /** * The maximum number of times a relative path import can go to the parent directory. */ maxDepth?: number } const rule: Rule.RuleModule = { meta: { type: "suggestion", docs: { description: "Bans relative path imports that go to the parent directory too many times", category: "Best Practices", recommended: true, }, fixable: "code", schema: [ { type: "object", properties: { maxDepth: { type: "integer", minimum: 1, }, }, additionalProperties: false, }, ], }, create(context) { const { maxDepth = 3 } = (context.options[0] || {}) as RuleOptions const errorMessage = `Relative path imports cannot go to the parent directory more than ${maxDepth} levels` return { ImportDeclaration(node) { const { source } = node if ( source.type === "Literal" && typeof source.value === "string" && source.value.startsWith("..") ) { const depth = source.value.match(/\.\.\//g)?.length ?? 0 if (depth > maxDepth) { context.report({ node: source, message: errorMessage, fix(fixer) { const newValue = (source.value as string)!.replace(/\.\.\//g, "") return fixer.replaceText(source, `'${newValue}'`) }, }) } } }, } }, } export default rule