eslint-config
eslint-config copied to clipboard
LINT: (Public API) Add `semantic-imports` rule
Glossary
- "External module" -
entity/foo <-> entity/bar,entity/foo <-> shared/ui/button - "Internal module" -
entity/foo <-> entity/foo/ui,entity/foo/ui/smth <-> entitiy/foo/lib
Description
- [ ] Restrict relative imports for external modules (enforce for internalmodules)
- [ ] Restrict absolute imports for internalmodules (enforce for external modules)
Example
// Fail 👎
// @path features/baz/model/index.ts
import { ... } from "../../bar" // Sibling feature-slice
import { ... } from "@/features/baz/model/smth" // Invalid access to internal resource as external module
// Pass 👍
// @path features/baz/model/index.ts
import { ... } from "../lib" // Import of internal module as internal resource - no illegal
import { ... } from "../entities/foo" // Lower layer slice - no illegal
import { ... } from "@entities/foo" // Import as external module
import { ... } from "shared/ui/button" // Import as external module
Reference
https://github.com/feature-sliced/documentation/discussions/52#discussioncomment-477443
I built something a bit similar for my company's custom eslint-plugin, mine is a typescript specific plugin but you can probably adapt the code to build this check. https://github.com/tablecheck/tablecheck-react-system/blob/refactor-to-vite-and-typescript/packages/eslint-plugin/src/shortestImport.ts
@SimeonC Thanks! ❤️