Skip to content

Commit 0ab0fff

Browse files
fix: takeUntil can be before shareReplay
1 parent 103d925 commit 0ab0fff

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

src/rules/no-sharereplay-before-takeuntil.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { TSESTree as es } from '@typescript-eslint/utils';
2-
import { isCallExpression, isIdentifier, isLiteral, isMemberExpression, isObjectExpression, isProperty } from '../etc';
3-
import { ruleCreator } from '../utils';
2+
import { DEFAULT_VALID_POST_COMPLETION_OPERATORS } from '../constants';
3+
import { isIdentifier, isLiteral, isMemberExpression, isObjectExpression, isProperty } from '../etc';
4+
import { findIsLastOperatorOrderValid, ruleCreator } from '../utils';
45

56
export const noSharereplayBeforeTakeuntilRule = ruleCreator({
67
defaultOptions: [],
@@ -27,18 +28,18 @@ export const noSharereplayBeforeTakeuntilRule = ruleCreator({
2728
return;
2829
}
2930

30-
const takeUntilIndex = pipeCallExpression.arguments.findIndex(arg =>
31-
isCallExpression(arg)
32-
&& (
33-
(isIdentifier(arg.callee)
34-
&& arg.callee.name === 'takeUntil')
35-
|| (isMemberExpression(arg.callee)
36-
&& isIdentifier(arg.callee.property)
37-
&& arg.callee.property.name === 'takeUntil')
38-
),
31+
const { isOrderValid, operatorNode: takeUntilNode } = findIsLastOperatorOrderValid(
32+
pipeCallExpression,
33+
/^takeUntil$/,
34+
DEFAULT_VALID_POST_COMPLETION_OPERATORS,
3935
);
36+
if (!isOrderValid || !takeUntilNode) {
37+
// takeUntil is not present or in an unsafe position itself.
38+
return;
39+
}
4040

41-
if (takeUntilIndex === -1) {
41+
if (takeUntilNode.range[0] < node.range[0]) {
42+
// takeUntil is before shareReplay.
4243
return;
4344
}
4445

tests/rules/no-sharereplay-before-takeuntil.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@ ruleTester({ types: false }).run('no-sharereplay-before-takeuntil', noSharerepla
4444
const sr = shareReplay({ refCount: false });
4545
a.pipe(sr, takeUntil(b));
4646
`,
47+
stripIndent`
48+
// shareReplay after takeUntil
49+
import { of, takeUntil, shareReplay } from "rxjs";
50+
51+
const a = of("a");
52+
const b = of("b");
53+
54+
a.pipe(takeUntil(b), shareReplay({ refCount: false }));
55+
`,
4756
stripIndent`
4857
// unrelated
4958
import { of, takeUntil, toArray } from "rxjs";

0 commit comments

Comments
 (0)