Skip to content

Commit fc92aed

Browse files
committed
refactor: check isUseEffect explicitly in rules
more readable/obvious than doing when getting effect fn and deps
1 parent 74c9a8d commit fc92aed

10 files changed

+25
-16
lines changed

src/no-adjust-state-on-prop-change.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
isImmediateCall,
77
isProp,
88
isStateSetter,
9+
isUseEffect,
910
} from "./util/react.js";
1011

1112
/**
@@ -26,6 +27,7 @@ export default {
2627
},
2728
create: (context) => ({
2829
CallExpression: (node) => {
30+
if (!isUseEffect(node)) return;
2931
const effectFnRefs = getEffectFnRefs(context, node);
3032
const depsRefs = getEffectDepsRefs(context, node);
3133
if (!effectFnRefs || !depsRefs) return;

src/no-chain-state-updates.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
isImmediateCall,
88
isState,
99
isStateSetter,
10+
isUseEffect,
1011
} from "./util/react.js";
1112

1213
/**
@@ -27,10 +28,10 @@ export default {
2728
},
2829
create: (context) => ({
2930
CallExpression: (node) => {
31+
if (!isUseEffect(node) || hasCleanup(node)) return;
3032
const effectFnRefs = getEffectFnRefs(context, node);
3133
const depsRefs = getEffectDepsRefs(context, node);
3234
if (!effectFnRefs || !depsRefs) return;
33-
if (hasCleanup(node)) return;
3435

3536
// TODO: Should filter out setters before checking?
3637
// exhaustive-deps doesn't enforce one way or the other.

src/no-derived-state.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
getUpstreamReactVariables,
99
isState,
1010
hasCleanup,
11+
isUseEffect,
1112
} from "./util/react.js";
1213
import { getCallExpr, getDownstreamRefs } from "./util/ast.js";
1314

@@ -29,10 +30,10 @@ export default {
2930
},
3031
create: (context) => ({
3132
CallExpression: (node) => {
33+
if (!isUseEffect(node) || hasCleanup(node)) return;
3234
const effectFnRefs = getEffectFnRefs(context, node);
3335
const depsRefs = getEffectDepsRefs(context, node);
3436
if (!effectFnRefs || !depsRefs) return;
35-
if (hasCleanup(node)) return;
3637

3738
effectFnRefs
3839
.filter((ref) => isStateSetter(context, ref))

src/no-event-handler.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
getEffectFnRefs,
33
getEffectDepsRefs,
44
hasCleanup,
5+
isUseEffect,
56
} from "./util/react.js";
67
import { findDownstreamNodes, getDownstreamRefs } from "./util/ast.js";
78
import { isState } from "./util/react.js";
@@ -24,10 +25,10 @@ export default {
2425
},
2526
create: (context) => ({
2627
CallExpression: (node) => {
28+
if (!isUseEffect(node) || hasCleanup(node)) return;
2729
const effectFnRefs = getEffectFnRefs(context, node);
2830
const depsRefs = getEffectDepsRefs(context, node);
2931
if (!effectFnRefs || !depsRefs) return;
30-
if (hasCleanup(node)) return;
3132

3233
// TODO: Can we also flag this when the deps are internal, and the body calls internal stuff?
3334
// That'd overlap with other rules though... maybe just useRefs?

src/no-initialize-state.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
getUseStateNode,
66
isImmediateCall,
77
isStateSetter,
8+
isUseEffect,
89
} from "./util/react.js";
910

1011
/**
@@ -24,6 +25,7 @@ export default {
2425
},
2526
create: (context) => ({
2627
CallExpression: (node) => {
28+
if (!isUseEffect(node)) return;
2729
const effectFnRefs = getEffectFnRefs(context, node);
2830
const depsRefs = getEffectDepsRefs(context, node);
2931
if (!effectFnRefs || !depsRefs) return;

src/no-manage-parent.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { getEffectFnRefs, getEffectDepsRefs } from "./util/react.js";
1+
import {
2+
getEffectFnRefs,
3+
getEffectDepsRefs,
4+
isUseEffect,
5+
} from "./util/react.js";
26
import { isProp } from "./util/react.js";
37

48
/**
@@ -18,6 +22,7 @@ export default {
1822
},
1923
create: (context) => ({
2024
CallExpression: (node) => {
25+
if (!isUseEffect(node)) return;
2126
const effectFnRefs = getEffectFnRefs(context, node);
2227
const depsRefs = getEffectDepsRefs(context, node);
2328
if (!effectFnRefs || !depsRefs) return;

src/no-pass-data-to-parent.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
isRef,
77
isProp,
88
hasCleanup,
9+
isUseEffect,
910
} from "./util/react.js";
1011
import { getCallExpr, getDownstreamRefs } from "./util/ast.js";
1112

@@ -27,10 +28,10 @@ export default {
2728
},
2829
create: (context) => ({
2930
CallExpression: (node) => {
31+
if (!isUseEffect(node) || hasCleanup(node)) return;
3032
const effectFnRefs = getEffectFnRefs(context, node);
3133
const depsRefs = getEffectDepsRefs(context, node);
3234
if (!effectFnRefs || !depsRefs) return;
33-
if (hasCleanup(node)) return;
3435

3536
effectFnRefs
3637
.filter((ref) => isPropCallback(context, ref))

src/no-pass-live-state-to-parent.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
isImmediateCall,
55
isPropCallback,
66
isState,
7+
isUseEffect,
78
} from "./util/react.js";
89
import { getCallExpr, getDownstreamRefs } from "./util/ast.js";
910

@@ -26,6 +27,7 @@ export default {
2627
},
2728
create: (context) => ({
2829
CallExpression: (node) => {
30+
if (!isUseEffect(node)) return;
2931
const effectFnRefs = getEffectFnRefs(context, node);
3032
const depsRefs = getEffectDepsRefs(context, node);
3133
if (!effectFnRefs || !depsRefs) return;

src/no-reset-all-state-on-prop-change.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
isReactFunctionalComponent,
1010
isReactFunctionalHOC,
1111
isCustomHook,
12+
isUseEffect,
1213
} from "./util/react.js";
1314

1415
/**
@@ -30,6 +31,7 @@ export default {
3031
},
3132
create: (context) => ({
3233
CallExpression: (node) => {
34+
if (!isUseEffect(node)) return;
3335
const effectFnRefs = getEffectFnRefs(context, node);
3436
const depsRefs = getEffectDepsRefs(context, node);
3537
if (!effectFnRefs || !depsRefs) return;

src/util/react.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,10 @@ export const isUseEffect = (node) =>
9898

9999
// NOTE: When `MemberExpression` (even nested ones), a `Reference` is only the root object, not the function.
100100
export const getEffectFnRefs = (context, node) => {
101-
if (!isUseEffect(node) || node.arguments.length < 1) {
102-
return undefined;
103-
}
104-
105101
const effectFn = node.arguments[0];
106102
if (
107-
effectFn.type !== "ArrowFunctionExpression" &&
108-
effectFn.type !== "FunctionExpression"
103+
effectFn?.type !== "ArrowFunctionExpression" &&
104+
effectFn?.type !== "FunctionExpression"
109105
) {
110106
return undefined;
111107
}
@@ -114,12 +110,8 @@ export const getEffectFnRefs = (context, node) => {
114110
};
115111

116112
export function getEffectDepsRefs(context, node) {
117-
if (!isUseEffect(node) || node.arguments.length < 2) {
118-
return undefined;
119-
}
120-
121113
const depsArr = node.arguments[1];
122-
if (depsArr.type !== "ArrayExpression") {
114+
if (depsArr?.type !== "ArrayExpression") {
123115
return undefined;
124116
}
125117

0 commit comments

Comments
 (0)