feature-sliced / steiger

Universal file structure and project architecture linter
https://www.npmjs.com/package/steiger
MIT License
18 stars 0 forks source link
architecture folders imports linter naming-conventions

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

steiger ./src

To run in watch mode, add -w/--watch to the command:

steiger ./src --watch

Configuration

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: {
    'no-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.
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.
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