Skip to content

DaveMBush/eslint-plugin-rxjs

Repository files navigation

eslint-plugin-rxjs

NPM Version License: MIT CI

An upgrade of eslint-plugin-rxjs to support modern TypeScript and ESLint. ie, Flat Config as well as legacy config.

Since some rules have better implementations in other more generic ESLint packages, they have been removed and noted here as to the appropriate replacements.

The tests have been upgraded to use standard TypeScript and ESLint test helpers.

All existing unit tests pass.

This plugin now works with both Flat Config and Legacy Config. Pay attention to the example below.

Install

Install the ESLint TypeScript parser using npm:

npm install @typescript-eslint/parser --save-dev

Install the package using npm:

npm install @smarttools/eslint-plugin-rxjs --save-dev

Configure the parser and the parserOptions for ESLint. Here, I use a .eslintrc.js file for the configuration:

Flat Config

const rxjs = require('@smarttools/eslint-plugin-rxjs');

module.exports = [{
  files: ['**/*'],
  plugins: {
    rxjs,
  },
},{
  files: ['**/*.ts'],
  // languageOptions here
  rules: {
    'rxjs/no-async-subscribe': 'error',
    ...etc.
  },
}];

Legacy Config

const { join } = require("path");
module.exports = {
  parser: "@typescript-eslint/parser",
  // parserOptions here
  plugins: ["@smarttools/rxjs"],
  extends: [],
  rules: {
    "@smarttools/rxjs/no-async-subscribe": "error",
    ...etc.
  }
};

Or, using the recommended configuration:

Note: The recommended configuration uses rules that require type checking. You will need to supply the parsing options as specified in the TypeScript ESLint documentation.

Flat Config

const rxjs = require('@smarttools/eslint-plugin-rxjs');

module.exports = [
  rxjs.configs.recommended,
  {
    files: ['**/*.ts'],
    plugins: {
      rxjs,
    },
  },
  // additional rules
];

Legacy Config

const { join } = require("path");
module.exports = {
  parser: "@typescript-eslint/parser",
  // parserOptions here
  extends: ["plugin:@smarttools/rxjs/recommended-legacy"],
};

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 Use @typescript-eslint/no-unnecessary-type-arguments instead.
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.