diff --git a/src/rules/no-exports-from-components.ts b/src/rules/no-exports-from-components.ts index 6c05cc8d..26a09039 100644 --- a/src/rules/no-exports-from-components.ts +++ b/src/rules/no-exports-from-components.ts @@ -2,6 +2,8 @@ import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { getSourceCode } from "../utils/compat" +const ALLOWED_EXPORTS = new Set(["getStaticPath", "prerender"]) + export default createRule("no-exports-from-components", { meta: { docs: { @@ -34,6 +36,20 @@ export default createRule("no-exports-from-components", { if (node.type.startsWith("TS") && !node.type.endsWith("Expression")) { return } + if ( + (node.type === "FunctionDeclaration" && + node.id && + ALLOWED_EXPORTS.has(node.id.name)) || + (node.type === "VariableDeclaration" && + node.declarations.every( + (decl) => + decl.id.type === "Identifier" && + ALLOWED_EXPORTS.has(decl.id.name), + )) + ) { + // Allow specific named exports + return + } context.report({ node, messageId: "disallowExport", @@ -56,10 +72,10 @@ export default createRule("no-exports-from-components", { if (node.exportKind === "type") return verifyDeclaration(node.declaration) for (const spec of node.specifiers) { - if (spec.exportKind === "type") return - if (["getStaticPath", "prerender"].includes(spec.exported.name)) { + if (spec.exportKind === "type") continue + if (ALLOWED_EXPORTS.has(spec.exported.name)) { // Allow specific named exports - return + continue } context.report({ node: spec, diff --git a/tests/fixtures/rules/no-exports-from-components/valid/exceptions-input.astro b/tests/fixtures/rules/no-exports-from-components/valid/exceptions-01-input.astro similarity index 61% rename from tests/fixtures/rules/no-exports-from-components/valid/exceptions-input.astro rename to tests/fixtures/rules/no-exports-from-components/valid/exceptions-01-input.astro index a5d71a63..8bc4256b 100644 --- a/tests/fixtures/rules/no-exports-from-components/valid/exceptions-input.astro +++ b/tests/fixtures/rules/no-exports-from-components/valid/exceptions-01-input.astro @@ -1,9 +1,11 @@ --- // This file is used to test the exceptions for the `no-exports-from-components` rule. // The following exports are allowed as exceptions. -export const getStaticPath = () => { +export const getStaticPath = (): { param: unknown }[] => { // logic here + return [{ param: "value" }] } -export const prerender = true; +export const prerender = true --- +
Hello World
diff --git a/tests/fixtures/rules/no-exports-from-components/valid/exceptions-02-input.astro b/tests/fixtures/rules/no-exports-from-components/valid/exceptions-02-input.astro index 2a03e73d..cabf0957 100644 --- a/tests/fixtures/rules/no-exports-from-components/valid/exceptions-02-input.astro +++ b/tests/fixtures/rules/no-exports-from-components/valid/exceptions-02-input.astro @@ -1,7 +1,9 @@ --- // This file is used to test the exception for the `getStaticPath` function in the `no-exports-from-components` rule. -export async function getStaticPath() { +export async function getStaticPath(): Promise<{ param: unknown }[]> { // logic here + return [] } --- +
Hello World
diff --git a/tests/fixtures/rules/no-exports-from-components/valid/exceptions-03-input.astro b/tests/fixtures/rules/no-exports-from-components/valid/exceptions-03-input.astro new file mode 100644 index 00000000..3cf1d31e --- /dev/null +++ b/tests/fixtures/rules/no-exports-from-components/valid/exceptions-03-input.astro @@ -0,0 +1,13 @@ +--- +// This file is used to test the exceptions for the `no-exports-from-components` rule. +// The following exports are allowed as exceptions. +const getStaticPath = (): { param: unknown }[] => { + // logic here + return [] +} +const prerender = true + +export { getStaticPath, prerender } +--- + +
Hello World