Rules and renaming

Override rules, rename plugin prefixes and target generated configs by name.

You can change rules in four places. Later entries win when they apply to the same file.

1. Integration overrides

Most integrations accept overrides. Those rules are merged into that integration's config, so they keep its files glob:

eslint.config.js
import { vinicuncaESLint } from '@vinicunca/eslint-config';

export default vinicuncaESLint({
  vue: {
    overrides: {
      'vue/max-attributes-per-line': 'off',
    },
  },
  typescript: {
    overrides: {
      'ts/no-explicit-any': 'error',
    },
    overridesTypeAware: {
      'ts/no-unsafe-assignment': 'off',
    },
  },
});

unicorn and unocss accept overrides in the type but ignore them. Put those rules in an extra config instead.

2. rules on the first argument

The factory treats rules (and languageOptions, plugins, settings, …) on the first argument as one extra config after the generated ones and before your extra configs. It applies to every file:

eslint.config.js
export default vinicuncaESLint({
  rules: {
    'no-console': 'off',
  },
});

Do not pass files here — the factory throws. Use a later argument for file-scoped configs.

3. Extra flat configs

Every argument after the options object is appended as-is:

eslint.config.js
export default vinicuncaESLint(
  { vue: true },
  {
    files: ['**/*.ts'],
    rules: {
      'no-console': ['error', { allow: ['warn', 'error', 'info'] }],
    },
  },
);

4. Composer methods

vinicuncaESLint() returns a FlatConfigComposer. Use .override(name, config) to patch a generated config by name, or .overrideRules() to change a rule everywhere it is set:

eslint.config.js
export default vinicuncaESLint()
  .override('vinicunca/stylistic/rules', {
    rules: {
      'style/brace-style': ['error', 'stroustrup', { allowSingleLine: true }],
    },
  })
  .overrideRules({
    'antfu/top-level-function': 'off',
  });

See Composer API for the full method list. Names always start with vinicunca/; inspect them with the config inspector.

Plugin renaming

With autoRenamePlugins: true (the default), prefixes are rewritten in every config, including yours:

FromToExample
@eslint-reactreactreact/no-leaked-conditional-rendering
@next/nextnextnext/no-html-link-for-pages
@stylisticstylestyle/semi
@typescript-eslinttsts/no-unused-vars
import-liteimportimport/first
nnodenode/prefer-global/process
vitesttesttest/consistent-test-it
ymlyamlyaml/sort-keys

Write the short names in your overrides. eslint-plugin-vuejs-accessibility is already registered as vue-a11y, and eslint-plugin-react-refresh as react-refresh — they are not in this map.

eslint.config.js
export default vinicuncaESLint(
  { typescript: true },
  {
    rules: {
      // Use ts/, not @typescript-eslint/
      'ts/consistent-type-definitions': ['error', 'type'],
    },
  },
);

Set autoRenamePlugins: false if you need the original prefixes (for example when composing configs that already use ts/ themselves).