Skip to content

manbearwiz/eslint-plugin-rxjs

 
 

Repository files navigation

@rxlint/eslint-plugin

GitHub License NPM version Downloads GitHub Actions Workflow Status

This package is a fork of the package cartant/eslint-plugin-rxjs with trimmed and updated dependencies to work with both eslint 8 and 9. Angular-specific rules are in @rxlint/eslint-plugin-angular.

Some rules are opinionated and not included in the recommended configuration. Developers can enable them as needed. Most rules require the TypeScript parser for ESLint but there is a config provided to disable those.

Installation

Install the required packages:

npm install --save-dev eslint typescript @typescript-eslint/parser @rxlint/eslint-plugin
# or
yarn add --dev eslint typescript @typescript-eslint/parser @rxlint/eslint-plugin

Configuration

This plugin works with ESLint v8 (eslintrc) and v9 (eslint.config.js) configuration formats.

ESLint v8 Configuration

Add @rxlint/recommended to your extends array:

.eslintrc.js

module.exports = {
  files: ["**/*.ts"],
  extends: [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended-type-checked",
    "plugin:@typescript-eslint/stylistic-type-checked",
    "plugin:@rxlint/recommended",
  ],
  parser: "@typescript-eslint/parser",
  parserOptions: {
    ecmaVersion: "latest",
    project: true,
    sourceType: "module",
  },
  rules: {
    "@rxlint/no-async-subscribe": "error",
    "@rxlint/no-ignored-observable": "error",
    "@rxlint/no-ignored-subscription": "error",
    "@rxlint/no-nested-subscribe": "error",
    "@rxlint/no-unbound-methods": "error",
    "@rxlint/throw-error": "error",
  },
};

ESLint v9 Configuration

Import the plugin and add it to the extends array:

eslint.config.js

const rxjs = require("@rxlint/eslint-plugin");

module.exports = [
  {
    files: ["**/*.ts"],
    extends: [
      eslint.configs.recommended,
      tseslint.configs.recommendedTypeChecked,
      tseslint.configs.stylisticTypeChecked,
      rxjs.configs.recommendedTypeChecked,
    ],
  },
];

Disable Type-Aware Linting

Use the disable-type-checked config to turn off type-aware linting for specific file subsets.

ESLint v8

Add @rxlint/disable-type-checked-classic to your extends array:

.eslintrc.js

module.exports = {
  files: ['**/*.{config,test,spec}.{js,ts}'],
  extends: [
    "plugin:@typescript-eslint/disable-type-checked",
    "plugin:@rxlint/disable-type-checked",
  ],
};

ESLint v9

Import the plugin and add rxjs.config.disableTypeChecked to the extends array:

eslint.config.js

module.exports = {
  files: ['**/*.{config,test,spec}.{js,ts}'],
  extends: [
    tseslint.configs.disableTypeChecked,
    rxjs.config.disableTypeChecked,
  ],
};

Rules

The package includes the following rules.

Rules marked with ✅ are recommended and rules marked with 🔧 have fixers.

Rule Description
ban-observables Forbids the use of banned observables.
ban-operators Forbids the use of banned operators.
finnish Enforces the use of Finnish notation.
just Enforces the use of a just alias for of. 🔧
no-async-subscribe Forbids passing async functions to subscribe.
no-compat Forbids importation from locations that depend upon rxjs-compat.
no-connectable Forbids operators that return connectable observables.
no-create Forbids the calling of Observable.create.
no-cyclic-action Forbids effects and epics that re-emit filtered actions.
no-explicit-generics Forbids explicit generic type arguments.
no-exposed-subjects Forbids exposed (i.e. non-private) subjects.
no-finnish Forbids the use of Finnish notation.
no-ignored-error Forbids the calling of subscribe without specifying an error handler.
no-ignored-notifier Forbids observables not composed from the repeatWhen or retryWhen notifier.
no-ignored-observable Forbids the ignoring of observables returned by functions.
no-ignored-replay-buffer Forbids using ReplaySubject, publishReplay or shareReplay without specifying the buffer size.
no-ignored-subscribe Forbids the calling of subscribe without specifying arguments.
no-ignored-subscription Forbids ignoring the subscription returned by subscribe.
no-ignored-takewhile-value Forbids ignoring the value within takeWhile.
no-implicit-any-catch Like the no-implicit-any-catch rule in @typescript-eslint/eslint-plugin, but for the catchError operator instead of catch clauses. 🔧
no-index Forbids the importation from index modules - for the reason, see this issue.
no-internal Forbids the importation of internals. 🔧
no-nested-subscribe Forbids the calling of subscribe within a subscribe callback.
no-redundant-notify Forbids redundant notifications from completed or errored observables.
no-sharereplay Forbids using the shareReplay operator.
no-subclass Forbids subclassing RxJS classes.
no-subject-unsubscribe Forbids calling the unsubscribe method of a subject instance.
no-subject-value Forbids accessing the value property of a BehaviorSubject instance.
no-subscribe-handlers Forbids the passing of handlers to subscribe.
no-topromise Forbids the use of the toPromise method.
no-unbound-methods Forbids the passing of unbound methods.
no-unsafe-catch Forbids unsafe catchError usage in effects and epics.
no-unsafe-first Forbids unsafe first/take usage in effects and epics.
no-unsafe-subject-next Forbids unsafe optional next calls.
no-unsafe-switchmap Forbids unsafe switchMap usage in effects and epics.
no-unsafe-takeuntil Forbids the application of operators after takeUntil.
prefer-observer Forbids the passing separate handlers to subscribe and tap. 🔧
suffix-subjects Enforces the use of a suffix in subject identifiers.
throw-error Enforces the passing of Error values to error notifications.

About

ESLint rules for RxJS

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 100.0%