Skip to content

Commit 47e1271

Browse files
feat(no-ignored-observable): put back old rule
Too many existing projects manually enable this rule, so removing it is more impactful than the other proposed changes during prerelease. This rule will be kept as-is and maybe removed in v2.
1 parent c6da3f6 commit 47e1271

File tree

5 files changed

+130
-0
lines changed

5 files changed

+130
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ The package includes the following rules.
9292
| [no-ignored-default-value](docs/rules/no-ignored-default-value.md) | Disallow using `firstValueFrom`, `lastValueFrom`, `first`, and `last` without specifying a default value. | 🔒 | | | 💭 | |
9393
| [no-ignored-error](docs/rules/no-ignored-error.md) | Disallow calling `subscribe` without specifying an error handler. | 🔒 | | | 💭 | |
9494
| [no-ignored-notifier](docs/rules/no-ignored-notifier.md) | Disallow observables not composed from the `repeatWhen` or `retryWhen` notifier. | ✅ 🔒 | | | 💭 | |
95+
| [no-ignored-observable](docs/rules/no-ignored-observable.md) | Disallow ignoring observables returned by functions. | | | | 💭 ||
9596
| [no-ignored-replay-buffer](docs/rules/no-ignored-replay-buffer.md) | Disallow using `ReplaySubject`, `publishReplay` or `shareReplay` without specifying the buffer size. | ✅ 🔒 | | | | |
9697
| [no-ignored-subscribe](docs/rules/no-ignored-subscribe.md) | Disallow calling `subscribe` without specifying arguments. | | | | 💭 | |
9798
| [no-ignored-subscription](docs/rules/no-ignored-subscription.md) | Disallow ignoring the subscription returned by `subscribe`. | | | | 💭 | |
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Disallow ignoring observables returned by functions (`rxjs-x/no-ignored-observable`)
2+
3+
❌ This rule is deprecated. It was replaced by [`rxjs-x/no-floating-observables`](no-floating-observables.md).
4+
5+
💭 This rule requires [type information](https://typescript-eslint.io/linting/typed-linting).
6+
7+
<!-- end auto-generated rule header -->
8+
9+
The effects failures if an observable returned by a function is neither assigned to a variable or property or passed to a function.
10+
11+
> [!WARNING]
12+
> This rule is being replaced by `no-floating-observables`.
13+
> The new rule has been expanded to handle more expression types.
14+
>
15+
> The current rule `no-ignored-observable` will be removed in a future major version.
16+
17+
## Rule details
18+
19+
Examples of **incorrect** code for this rule:
20+
21+
```ts
22+
import { of } from "rxjs";
23+
of(42, 54);
24+
```
25+
26+
Examples of **correct** code for this rule:
27+
28+
```ts
29+
import { of } from "rxjs";
30+
const answers = of(42, 54);
31+
```

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { noFloatingObservablesRule } from './rules/no-floating-observables';
2020
import { noIgnoredDefaultValueRule } from './rules/no-ignored-default-value';
2121
import { noIgnoredErrorRule } from './rules/no-ignored-error';
2222
import { noIgnoredNotifierRule } from './rules/no-ignored-notifier';
23+
import { noIgnoredObservableRule } from './rules/no-ignored-observable';
2324
import { noIgnoredReplayBufferRule } from './rules/no-ignored-replay-buffer';
2425
import { noIgnoredSubscribeRule } from './rules/no-ignored-subscribe';
2526
import { noIgnoredSubscriptionRule } from './rules/no-ignored-subscription';
@@ -67,6 +68,7 @@ const plugin = {
6768
'no-ignored-default-value': noIgnoredDefaultValueRule,
6869
'no-ignored-error': noIgnoredErrorRule,
6970
'no-ignored-notifier': noIgnoredNotifierRule,
71+
'no-ignored-observable': noIgnoredObservableRule,
7072
'no-ignored-replay-buffer': noIgnoredReplayBufferRule,
7173
'no-ignored-subscribe': noIgnoredSubscribeRule,
7274
'no-ignored-subscription': noIgnoredSubscriptionRule,

src/rules/no-ignored-observable.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { TSESTree as es } from '@typescript-eslint/utils';
2+
import { getTypeServices } from '../etc';
3+
import { ruleCreator } from '../utils';
4+
5+
export const noIgnoredObservableRule = ruleCreator({
6+
defaultOptions: [],
7+
meta: {
8+
deprecated: true,
9+
replacedBy: ['no-floating-observables'],
10+
docs: {
11+
description: 'Disallow ignoring observables returned by functions.',
12+
requiresTypeChecking: true,
13+
},
14+
messages: {
15+
forbidden: 'Ignoring a returned Observable is forbidden.',
16+
},
17+
schema: [],
18+
type: 'problem',
19+
},
20+
name: 'no-ignored-observable',
21+
create: (context) => {
22+
const { couldBeObservable } = getTypeServices(context);
23+
24+
return {
25+
'ExpressionStatement > CallExpression': (node: es.CallExpression) => {
26+
if (couldBeObservable(node)) {
27+
context.report({
28+
messageId: 'forbidden',
29+
node,
30+
});
31+
}
32+
},
33+
};
34+
},
35+
});
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { stripIndent } from 'common-tags';
2+
import { noIgnoredObservableRule } from '../../src/rules/no-ignored-observable';
3+
import { fromFixture } from '../etc';
4+
import { ruleTester } from '../rule-tester';
5+
6+
ruleTester({ types: true }).run('no-ignored-observable', noIgnoredObservableRule, {
7+
valid: [
8+
stripIndent`
9+
// not ignored
10+
import { Observable, of } from "rxjs";
11+
12+
function functionSource() {
13+
return of(42);
14+
}
15+
16+
function sink(source: Observable<number>) {
17+
}
18+
19+
const a = functionSource();
20+
sink(functionSource());
21+
`,
22+
stripIndent`
23+
// not ignored arrow
24+
import { Observable, of } from "rxjs";
25+
26+
const arrowSource = () => of(42);
27+
28+
function sink(source: Observable<number>) {
29+
}
30+
31+
const a = arrowSource();
32+
sink(arrowSource());
33+
`,
34+
],
35+
invalid: [
36+
fromFixture(
37+
stripIndent`
38+
// ignored
39+
import { Observable, of } from "rxjs";
40+
41+
function functionSource() {
42+
return of(42);
43+
}
44+
45+
functionSource();
46+
~~~~~~~~~~~~~~~~ [forbidden]
47+
`,
48+
),
49+
fromFixture(
50+
stripIndent`
51+
// ignored arrow
52+
import { Observable, of } from "rxjs";
53+
54+
const arrowSource = () => of(42);
55+
56+
arrowSource();
57+
~~~~~~~~~~~~~ [forbidden]
58+
`,
59+
),
60+
],
61+
});

0 commit comments

Comments
 (0)