const TIERS = ["atoms", "molecules", "organisms", "templates", "pages"]; function tierOf(filepath) { for (let i = 0; i < TIERS.length; i++) { const tier = TIERS[i]; if (filepath.includes(`/${tier}/`) || filepath.includes(`\\${tier}\\`)) { return { name: tier, index: i }; } } return null; } /** @type {import("eslint").Rule.RuleModule} */ export default { meta: { type: "problem", docs: { description: "Atomic-design tier imports respect direction: atoms ← molecules ← organisms ← templates ← pages.", }, schema: [], messages: { wrongDirection: "{{fromTier}} cannot import from {{toTier}} ({{importPath}}). Tier direction: atoms ← molecules ← organisms ← templates ← pages.", }, }, create(context) { const filename = context.filename; const from = tierOf(filename); if (!from) return {}; return { ImportDeclaration(node) { const source = node.source.value; if (typeof source !== "string") return; const to = tierOf(source); if (!to) return; if (to.index > from.index) { context.report({ node, messageId: "wrongDirection", data: { fromTier: from.name, toTier: to.name, importPath: source }, }); } }, }; }, };