@bob-obringer/eslint-plugin
Version:
ESLint plugin for Bob Obringer's projects
53 lines (52 loc) • 1.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const nextJsDefaultExports = [
/page\.tsx$/,
/layout\.tsx$/,
/error\.tsx$/,
/loading\.tsx$/,
/not-found\.tsx$/,
/pages\/api\//,
/manifest\.ts/,
/opengraph-image\.tsx$/,
/twitter-image\.tsx$/,
/sitemap\.ts$/,
/robots\.ts$/,
/tailwind\.config\.ts$/,
];
const rule = {
defaultOptions: [],
meta: {
type: "suggestion",
docs: {
description: `Prefer named exports over default exports in TypeScript files. Named exports
are more explicit and can help avoid confusion when importing modules or refactoring code.
This can make your code easier to read and maintain.
However, some Next.js conventions require default exports, and this rule allows for those
exceptions.`,
},
schema: [],
messages: {
preferNamedExports: "Prefer named exports",
},
},
create(context) {
const fn = context.filename || "";
return {
ExportDefaultDeclaration(node) {
// if the file is a nextjs default export, ignore
if (nextJsDefaultExports.some((f) => fn.match(f)))
return;
const { declaration } = node;
const isIdentifier = declaration.type === "Identifier" && declaration.name === "App";
if (!isIdentifier) {
context.report({
node,
messageId: "preferNamedExports",
});
}
},
};
},
};
module.exports = rule;