Rules and renaming
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:
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:
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:
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:
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:
| From | To | Example |
|---|---|---|
@eslint-react | react | react/no-leaked-conditional-rendering |
@next/next | next | next/no-html-link-for-pages |
@stylistic | style | style/semi |
@typescript-eslint | ts | ts/no-unused-vars |
import-lite | import | import/first |
n | node | node/prefer-global/process |
vitest | test | test/consistent-test-it |
yml | yaml | yaml/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.
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).