no-barrel-files
Oppdag og forby barrel-filer — index.ts-filer som kun inneholder re-eksporter og ingen logikk.
Regeldetaljer
Section titled “Regeldetaljer”Barrel-filer (re-eksport-bare index.ts) tilslører hvor koden faktisk befinner seg, forringer tree-shaking, skaper risiko for sirkulære avhengigheter og gjør IDE-navigasjon tregere. Denne regelen bruker en tilpasset analysefunksjon for å avgjøre om en index.ts-fil er en ren re-eksport-barrel ved å inspisere hver ikke-kommentar-, ikke-tom linje.
Eksempler på feil kode
Section titled “Eksempler på feil kode”export { logInfo, logError } from "./log";export { resolvePaths } from "./paths";export type { PathConfig } from "./paths";En fil som kun re-eksporterer symboler fra andre moduler er en barrel-fil.
Eksempler på riktig kode
Section titled “Eksempler på riktig kode”export { logInfo, logError } from "./log";export { resolvePaths } from "./paths";
// This file has its own logic, so it is not a barrelexport function getHelperVersion(): string { return "1.0.0";}Eller enda bedre — slett index.ts helt og importer direkte:
import { logInfo } from "./helpers/log";import { resolvePaths } from "./helpers/paths";Regelimplementasjon
Section titled “Regelimplementasjon”/// <reference path="../rules.d.ts" />
function isBarrelFile(content: string): boolean { const lines = content .split("\n") .map((l) => l.trim()) .filter( (l) => l !== "" && !l.startsWith("//") && !l.startsWith("/*") && !l.startsWith("*") );
if (lines.length === 0) return false;
return lines.every( (line) => line.startsWith("export ") || line.startsWith("export{") || line.startsWith("import ") || line.startsWith("} from") || line.startsWith("type ") || /^[A-Za-z_$,\s]+$/.test(line) || line === "}" || line === "};" );}
export default { rules: { "no-barrel-files": { description: "index.ts files must not be pure re-export barrels", async check(ctx) { const indexFiles = ctx.scopedFiles.filter((f) => f.endsWith("/index.ts") );
const checks = indexFiles.map(async (file) => { const content = await ctx.readFile(file); if (isBarrelFile(content)) { ctx.report.violation({ message: `Barrel file detected: ${file} contains only re-exports and no logic.`, file, fix: "Delete this barrel file and update imports to point directly to the source module", }); } });
await Promise.all(checks); }, }, },} satisfies RuleSet;Når bør du bruke den
Section titled “Når bør du bruke den”Når du vil kreve direkte importer og unngå omveien som barrel-filer introduserer. Spesielt verdifullt i store kodebaser der barrel-filer forårsaker treg IDE-ytelse og gjør avhengighetsgrafer vanskeligere å forstå.
Når bør du ikke bruke den
Section titled “Når bør du ikke bruke den”Når prosjektet ditt med vilje bruker barrel-filer som en offentlig API-grense (f.eks. et bibliotek som eksporterer en kuratert API fra index.ts).