eslint-plugin-fsd-rule
v0.0.1
Published
ESLint plugin for Feature-Sliced Design (FSD) architecture rules
Maintainers
Readme
eslint-plugin-fsd-rules
ESLint plugin for Feature-Sliced Design (FSD) architecture rules.
Install
npm install --save-dev eslint-plugin-fsd-rulesUsage
In eslint.config.js (flat config):
import fsd from 'eslint-plugin-fsd-rules';
export default [
{
plugins: { fsd },
rules: {
'fsd/layer-imports': 'error',
'fsd/no-cross-slice-imports': 'error',
'fsd/public-api-only': 'error',
},
},
];Rules
fsd/layer-imports
Enforces FSD layer import direction. Higher layers can only import from layers below them.
Layer order (high → low): app > pages > widgets > features > entities > shared
// ❌ features importing from pages
import { Foo } from '@/pages/home';
// ✅ features importing from entities
import { Bar } from '@/entities/user';Options:
alias(string, default"@") — path alias prefixignoreLayers(string[]) — layers to skip
fsd/no-cross-slice-imports
Prevents same-layer slices from importing each other directly. Cross-slice access must go through the @x segment.
// ❌ features/auth importing from features/profile directly
import { x } from '@/features/profile';
// ✅ via @x (file name must match the importing slice)
import { x } from '@/features/profile/@x/auth';
// ✅ type-only imports are always allowed
import type { Foo } from '@/features/profile';Options:
alias(string, default"@") — path alias prefix
fsd/public-api-only
Enforces that external consumers import only from a slice's public API (index file), not internal files.
// ❌ bypasses public API
import { store } from '@/features/auth/model/store';
// ✅ public API
import { useLogin } from '@/features/auth';
// ✅ @x cross-slice public API
import { AuthUser } from '@/entities/user/@x/auth';Options:
alias(string, default"@") — path alias prefixlayers(string[]) — layers to enforce (default: all sliced layers)
