Files
twenty/packages/eslint-plugin-twenty/src/rules/no-state-useref.ts
gitstart-twenty 0c79217ba0 Add an ESLint rule to prevent the usage of useRef other than for HTML elements. (#2014)
* Add an ESLint rule to prevent the usage of useRef other than for HTML elements

Co-authored-by: v1b3m <vibenjamin6@gmail.com>

* Bump eslint version and rewrite rule

* Fix

---------

Co-authored-by: v1b3m <vibenjamin6@gmail.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
2023-10-14 11:32:46 +02:00

69 lines
1.6 KiB
TypeScript

import { ESLintUtils } from "@typescript-eslint/utils";
const createRule = ESLintUtils.RuleCreator(() => `https://docs.twenty.com`);
const noStateUseRef = createRule({
create: (context) => {
return {
CallExpression: (node) => {
if (
node.callee.type !== "Identifier" ||
node.callee.name !== "useRef"
) {
return;
}
if (!node.typeArguments || !node.typeArguments.params?.length) {
context.report({
node,
messageId: "noStateUseRef",
});
return;
}
const typeParam = node.typeArguments.params[0];
if (typeParam.type !== "TSTypeReference") {
context.report({
node,
messageId: "noStateUseRef",
});
return;
}
if (typeParam.typeName.type !== "Identifier") {
context.report({
node,
messageId: "noStateUseRef",
});
return;
}
if (!typeParam.typeName.name.match(/^(HTML.*Element|Element)$/)) {
context.report({
node,
messageId: "test",
});
}
},
};
},
name: "no-state-useref",
meta: {
docs: {
description: "Don't use useRef for state management",
},
messages: {
test: "test",
noStateUseRef:
"Don't use useRef for state management. See https://docs.twenty.com/developer/frontend/best-practices#do-not-use-useref-to-store-state for more details.",
},
type: "suggestion",
schema: [],
},
defaultOptions: [],
});
module.exports = noStateUseRef;
export default noStateUseRef;