/** * ESLint 规则:no-inner-html * * 禁止在 WSX 代码中使用 innerHTML * WSX 框架鼓励使用声明式 JSX 而不是手动 DOM 操作 */ import { Rule } from "eslint"; import { WSXRuleModule } from "../types"; export const noInnerHTML: WSXRuleModule = { meta: { type: "problem", docs: { description: "disallow use of innerHTML in WSX code", category: "Best Practices", recommended: true, }, messages: { noInnerHTML: "Do not use innerHTML. Use JSX and WSX's declarative rendering instead. If you need to parse HTML strings, use parseHTMLToNodes() utility function.", }, schema: [], // 无配置选项 }, create(context: Rule.RuleContext) { return { // 检测 innerHTML 赋值:element.innerHTML = "..." // eslint-disable-next-line @typescript-eslint/no-explicit-any AssignmentExpression(node: any) { if ( node.left && node.left.type === "MemberExpression" && node.left.property && node.left.property.type === "Identifier" && node.left.property.name === "innerHTML" ) { context.report({ node, messageId: "noInnerHTML", }); } }, // 检测 innerHTML 读取:const html = element.innerHTML // eslint-disable-next-line @typescript-eslint/no-explicit-any MemberExpression(node: any) { if ( node.property && node.property.type === "Identifier" && node.property.name === "innerHTML" && node.parent && node.parent.type !== "AssignmentExpression" ) { // 只报告读取操作(赋值已在上面处理) // 但允许在特定上下文中读取(如调试或工具函数) // 这里我们仍然报告,但用户可以通过注释禁用 context.report({ node, messageId: "noInnerHTML", }); } }, }; }, };