-
Notifications
You must be signed in to change notification settings - Fork 16
/
prefer-sample-over-forward-with-mapping.js
97 lines (85 loc) · 2.49 KB
/
prefer-sample-over-forward-with-mapping.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
const {
extractImportedFromEffector,
} = require("../../utils/extract-imported-from-effector");
const {
traverseNestedObjectNode,
} = require("../../utils/traverse-nested-object-node");
const { createLinkToRule } = require("../../utils/create-link-to-rule");
module.exports = {
meta: {
type: "problem",
docs: {
description: "Prefer `sample` over `forward` with `.map`/`.prepend`",
category: "Quality",
recommended: true,
url: createLinkToRule("prefer-sample-over-forward-with-mapping"),
},
messages: {
overMap:
"Instead of `forward` with `{{ eventName }}.map` you can use `sample`",
overPrepend:
"Instead of `forward` with `{{ eventName }}.prepend` you can use `sample`",
},
schema: [],
},
create(context) {
const importedFromEffector = new Map();
return {
ImportDeclaration(node) {
extractImportedFromEffector(importedFromEffector, node);
},
CallExpression(node) {
const localMethod = importedFromEffector.get("forward");
if (!localMethod) {
return;
}
const isEffectorMethod = node?.callee?.name === localMethod;
if (!isEffectorMethod) {
return;
}
const forwardConfig = {
from: node.arguments?.[0]?.properties.find(
(n) => n.key?.name === "from"
),
to: node.arguments?.[0]?.properties.find((n) => n.key?.name === "to"),
};
if (!forwardConfig.from || !forwardConfig.to) {
return;
}
function checkForMapping({ paramNode, methodName, messageId }) {
if (paramNode.value?.type !== "CallExpression") {
return;
}
if (paramNode.value?.callee?.property?.name !== methodName) {
return;
}
const eventNode = traverseNestedObjectNode(
paramNode.value?.callee?.object
);
const eventName = eventNode?.name;
if (!eventName) {
return;
}
// console.log(eventName);
context.report({
node,
messageId,
data: {
eventName,
},
});
}
checkForMapping({
paramNode: forwardConfig.from,
methodName: "map",
messageId: "overMap",
});
checkForMapping({
paramNode: forwardConfig.to,
methodName: "prepend",
messageId: "overPrepend",
});
},
};
},
};