Skip to content

feature-sliced/steiger

Repository files navigation

Steiger

NPM Version

Universal file structure and project architecture linter.

Note

The project is in beta and in active development. Some APIs may change.

Features

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.

import { defineConfig } from 'steiger'

export default defineConfig({
  rules: {
    'public-api': 'off',
  },
})

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.

Rule Description
ambiguous-slice-names Forbid slice names that that match some segment’s name in the Shared layer.
excessive-slicing Forbid having too many ungrouped slices or too many slices in a group.
forbidden-imports Forbid imports from higher layers and cross-imports between slices on the same layer.
inconsistent-naming Ensure that all entities are named consistently in terms of pluralization.
insignificant-slice Detect slices that have just one reference or no references to them at all.
no-layer-public-api Forbid index files on the layer level.
no-public-api-sidestep Forbid going around the public API of a slice to import directly from an internal module in a slice.
no-reserved-folder-names Forbid subfolders in segments that have the same name as other conventional segments.
no-segmentless-slices Forbid slices that don't have any segments.
no-segments-on-sliced-layers Forbid segments (like ui, lib, api ...) that appear directly in sliced layer folders (entities, features, ...)
no-ui-in-app Forbid having the ui segment on the App layer.
public-api Require slices (and segments on sliceless layers like Shared) to have a public API definition.
repetitive-naming Ensure that all entities are named consistently in terms of pluralization.
segments-by-purpose Discourage the use of segment names that group code by its essence, and instead encourage grouping by purpose
shared-lib-grouping Forbid having too many ungrouped modules in shared/lib.
typo-in-layer-name Ensure that all layers are named without any typos.
no-processes Discourage the use of the deprecated Processes layer.
import-locality Require that imports from the same slice be relative and imports from one slice to another be absolute.

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