Gå til innholdet

no-barrel-files

Oppdag og forby barrel-filer — index.ts-filer som kun inneholder re-eksporter og ingen logikk.

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.

src/helpers/index.ts
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.

src/helpers/index.ts
export { logInfo, logError } from "./log";
export { resolvePaths } from "./paths";
// This file has its own logic, so it is not a barrel
export 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";
/// <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 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 prosjektet ditt med vilje bruker barrel-filer som en offentlig API-grense (f.eks. et bibliotek som eksporterer en kuratert API fra index.ts).