Skip to main content

only-export-name

Restrict exports to configured names.

Targeted pattern scope​

This rule enforces an allow-list of export names.

It checks:

  • ExportDefaultDeclaration as name default
  • ExportNamedDeclaration names from specifiers, class/function declarations, and variable declaration identifiers

For export { local as publicName }, the rule validates publicName.

What this rule reports​

This rule reports exports whose names are not included in names.

Why this rule exists​

This rule is useful for defining strict module contracts (for example, default-only modules or curated public names).

❌ Incorrect​

export const value = 1;

with default options (["default"]).

✅ Correct​

export default 1;

or:

export const value = 1;

with options:

{
names: ["value"];
}

Behavior and migration notes​

This rule reports only and does not provide an autofix.

Default allow-list is ['default'], so named exports are blocked unless explicitly allowed.

Options​

type Options = {
names?: string[];
};

Default:

{ "names": ["default"] }

Additional examples​

// config: { names: ["createClient", "default"] }
export function createClient() {}
export default createClient;
// ✅ valid

export const version = "1.0.0";
// ❌ reported unless "version" is added to names

export { buildClient as client };
// checks "client" (exported name), not "buildClient"

ESLint flat config example​

import etcMisc from "eslint-plugin-etc-misc";

export default [
{
plugins: { "etc-misc": etcMisc },
rules: {
"etc-misc/only-export-name": ["error", { names: ["value"] }],
},
},
];

When not to use it​

Disable this rule if exported symbol names do not need to be constrained.

Package documentation​

Rule catalog ID: R074

Further reading​

Adoption resources​

  • Start at warning level in CI, then move to error after cleanup.
  • Use focused codemods/autofix batches per package or directory.