eslint-plugin-effector
Version:
Enforcing best practices for Effector
107 lines (101 loc) • 2.53 kB
JavaScript
const { ESLintUtils } = require("@typescript-eslint/utils");
function hasType({ node, possibleTypes, context, from }) {
try {
const parserServices = ESLintUtils.getParserServices(context);
const checker = parserServices.program.getTypeChecker();
const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
const type = checker.getTypeAtLocation(
originalNode?.initializer ?? originalNode
);
const symbol = type?.symbol ?? type?.aliasSymbol;
return (
possibleTypes.includes(symbol?.escapedName) &&
Boolean(symbol?.parent?.escapedName?.includes(from))
);
} catch (e) {
return false;
}
}
const nodeTypeIs = {
effect: (opts) =>
hasType({ ...opts, possibleTypes: ["Effect"], from: "effector" }),
store: (opts) =>
hasType({
...opts,
possibleTypes: ["Store", "StoreWritable"],
from: "effector",
}),
event: (opts) =>
hasType({
...opts,
possibleTypes: ["Event", "EventCallable"],
from: "effector",
}),
unit: (opts) =>
hasType({
...opts,
possibleTypes: [
"Effect",
"Store",
"Event",
"EventCallable",
"StoreWritable",
],
from: "effector",
}),
gate: (opts) =>
hasType({ ...opts, possibleTypes: ["Gate"], from: "effector-react" }),
effectorReactHook: (opts) =>
hasType({
...opts,
possibleTypes: opts.hook
? [].concat(opts.hook)
: [
"useStore",
"useStoreMap",
"useList",
"useEvent",
"useGate",
"useUnit",
],
from: "effector-react",
}),
not: {
effect: (opts) =>
!hasType({
...opts,
possibleTypes: ["Effect"],
from: "effector",
}),
store: (opts) =>
!hasType({
...opts,
possibleTypes: ["Store", "StoreWritable"],
from: "effector",
}),
event: (opts) =>
!hasType({
...opts,
possibleTypes: ["Event", "EventCallable"],
from: "effector",
}),
unit: (opts) =>
!hasType({
...opts,
possibleTypes: [
"Effect",
"Store",
"Event",
"EventCallable",
"StoreWritable",
],
from: "effector",
}),
gate: (opts) =>
!hasType({ ...opts, possibleTypes: ["Gate"], from: "effector-react" }),
effectorReactHook: (opts) => !nodeTypeIs.effectorReactHook(opts),
},
};
module.exports = {
nodeTypeIs,
};