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.
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
This plugin works with ESLint v8 (eslintrc
) and v9 (eslint.config.js
) configuration formats.
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",
},
};
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,
],
},
];
Use the disable-type-checked
config to turn off type-aware linting for specific file subsets.
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",
],
};
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,
],
};
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. |