steiger
v0.5.1
Published
Universal file structure and project architecture linter
Downloads
8,701
Readme
Steiger
Universal file structure and project architecture linter.
[!NOTE] The project is in beta and in active development. Some APIs may change.
[!NOTE] Version 0.5.0 introduced a new config file format. We have a codemod to automatically update your config, see the migration guide.
Features
- Built-in set of rules to validate adherence to Feature-Sliced Design
- Watch mode
- Rule configurability
Installation
npm i -D steiger
Usage
npx steiger ./src
To run in watch mode, add -w
/--watch
to the command:
npx steiger ./src --watch
Configuration
Steiger is zero-config! If you don't want to disable certain rules, you can safely skip this section.
Steiger is configurable via cosmiconfig
. That means that you can create a steiger.config.ts
or steiger.config.js
file in the root of your project to configure the rules. Import { defineConfig } from "steiger"
to get autocompletion.
The config file shape is highly inspired by ESLint's config file, so if you have configured ESLint before, you'll find it easy to configure Steiger.
Example
// ./steiger.config.js
import { defineConfig } from 'steiger'
import fsd from '@feature-sliced/steiger-plugin'
export default defineConfig([
...fsd.configs.recommended,
{
// disable the `public-api` rule for files in the Shared layer
files: ['./src/shared/**'],
rules: {
'fsd/public-api': 'off',
},
},
])
[!TIP] If you want Steiger to ignore certain files, add an object like this to the config array:
defineConfig([, /* … */ { ignores: ['**/__mocks__/**'] }])
// ./steiger.config.ts
import { defineConfig } from 'steiger'
import fsd from '@feature-sliced/steiger-plugin'
export default defineConfig([
...fsd.configs.recommended,
{
// ignore all mock files for all rules
ignores: ['**/__mocks__/**'],
},
{
files: ['./src/shared/**'],
rules: {
// disable public-api rule for files in /shared folder
'fsd/public-api': 'off',
},
},
{
files: ['./src/widgets/**'],
ignores: ['**/discount-offers/**'],
rules: {
// disable no-segmentless-slices rule for all widgets except /discount-offers
'fsd/no-segmentless-slices': 'off',
},
},
])
You can see more examples here
Migration from 0.4.0
Version 0.5.0 introduced a new config file format. Follow the instructions to migrate your config file.
Rules
Currently, Steiger is not extendable with more rules, though that will change in the near future. The built-in rules check for the project's adherence to Feature-Sliced Design.
Contribution
Feel free to report an issue or open a discussion. Ensure you read our Code of Conduct first though :)
To get started with the codebase, see our Contributing guide.
Legal info
Project licensed under MIT License. Here's what it means