@rxlint/eslint-plugin
v1.3.12
Published
ESLint rules for RxJS
Readme
@rxlint/eslint-plugin
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-pluginConfiguration
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. | | |
