@truenine/eslint9-config
Version:
ESLint 9 configuration package for Compose Client projects with TypeScript, Vue, and modern JavaScript support
1 lines • 5.26 kB
Source Map (JSON)
{"version":3,"file":"concise-arrow.mjs","names":[],"sources":["../../../src/rules/code-style/concise-arrow.ts"],"sourcesContent":["import type {Rule} from 'eslint' /* eslint-disable ts/no-unsafe-member-access, ts/no-unsafe-argument, ts/no-unsafe-assignment, ts/strict-boolean-expressions */\n\nconst MAX_LINE_LENGTH = 160\n\n/**\n * ESLint rule: prefer-concise-arrow\n * Detects and fixes arrow functions that can be simplified.\n */\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {description: 'Prefer concise arrow function body when possible', recommended: false},\n fixable: 'code',\n schema: [],\n messages: {preferConciseArrow: 'Arrow function body can be simplified to a single expression'}\n },\n create(context) {\n const {sourceCode} = context\n function hasComments(node: Rule.Node): boolean { return sourceCode.getCommentsInside(node).length > 0 }\n function isNodeSingleLine(n: Rule.Node): boolean { return n.loc!.start.line === n.loc!.end.line }\n function normalizeText(t: string): string { return t.split('\\n').map(l => l.trim()).join(' ').replaceAll(/\\s+/g, ' ').trim() }\n function getIndent(node: Rule.Node): string { return ' '.repeat(node.loc?.start.column ?? 0) }\n\n function containsNestedComplexity(node: Rule.Node): boolean { /* 检查表达式是否包含嵌套的箭头函数或复杂结构 */\n let complexity = false\n const skip = new Set(['parent', 'loc', 'range', 'start', 'end', 'tokens', 'comments'])\n const traverse = (n: any): void => {\n if (complexity || n == null || typeof n !== 'object') return\n if (['ArrowFunctionExpression', 'ConditionalExpression', 'LogicalExpression'].includes(n.type as string)) { complexity = true; return }\n Object.keys(n).forEach(k => {\n if (skip.has(k)) return\n\n const v = n[k]\n if (Array.isArray(v)) v.forEach(traverse); else traverse(v)\n })\n }\n traverse(node); return complexity\n }\n\n function needsParens(params: Rule.Node[]): boolean { /* 检查参数是否需要括号 */\n if (params.length !== 1 || params[0].type !== 'Identifier') return true\n return (params[0] as any).typeAnnotation != null\n }\n\n return {\n ArrowFunctionExpression(node) {\n const arrow = node as any\n if (arrow.expression || arrow.body.type !== 'BlockStatement' || arrow.body.body.length !== 1 || hasComments(arrow.body) || isNodeSingleLine(arrow)) return\n const stmt = arrow.body.body[0]\n let expr: Rule.Node | null = null\n if (stmt.type === 'ExpressionStatement') expr = stmt.expression\n else if (stmt.type === 'ReturnStatement') expr = stmt.argument\n if (expr == null || containsNestedComplexity(expr)) return\n\n const paramsText = (arrow.params as any[]).map((p: any) => sourceCode.getText(p)).join(', ')\n const exprText = normalizeText(sourceCode.getText(expr))\n const paramsWrapper = needsParens(arrow.params) ? `(${paramsText})` : paramsText\n const bodyText = expr.type === 'ObjectExpression' ? `(${exprText})` : exprText\n const result = `${arrow.async === true ? 'async ' : ''}${paramsWrapper} => ${bodyText}`\n\n if (getIndent(arrow).length + result.length > MAX_LINE_LENGTH) return\n context.report({node, messageId: 'preferConciseArrow', fix: fixer => fixer.replaceText(node, result)})\n }\n }\n }\n}\n\nexport default rule\n"],"mappings":";AAEA,MAAM,kBAAkB;;;;;AAMxB,MAAM,OAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,MAAM;GAAC,aAAa;GAAoD,aAAa;GAAM;EAC3F,SAAS;EACT,QAAQ,EAAE;EACV,UAAU,EAAC,oBAAoB,gEAA+D;EAC/F;CACD,OAAO,SAAS;EACd,MAAM,EAAC,eAAc;EACrB,SAAS,YAAY,MAA0B;AAAE,UAAO,WAAW,kBAAkB,KAAK,CAAC,SAAS;;EACpG,SAAS,iBAAiB,GAAuB;AAAE,UAAO,EAAE,IAAK,MAAM,SAAS,EAAE,IAAK,IAAI;;EAC3F,SAAS,cAAc,GAAmB;AAAE,UAAO,EAAE,MAAM,KAAK,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,MAAM;;EAC5H,SAAS,UAAU,MAAyB;AAAE,UAAO,IAAI,OAAO,KAAK,KAAK,MAAM,UAAU,EAAE;;EAE5F,SAAS,yBAAyB,MAA0B;GAC1D,IAAI,aAAa;GACjB,MAAM,OAAO,IAAI,IAAI;IAAC;IAAU;IAAO;IAAS;IAAS;IAAO;IAAU;IAAW,CAAC;GACtF,MAAM,YAAY,MAAiB;AACjC,QAAI,cAAc,KAAK,QAAQ,OAAO,MAAM,SAAU;AACtD,QAAI;KAAC;KAA2B;KAAyB;KAAoB,CAAC,SAAS,EAAE,KAAe,EAAE;AAAE,kBAAa;AAAM;;AAC/H,WAAO,KAAK,EAAE,CAAC,SAAQ,MAAK;AAC1B,SAAI,KAAK,IAAI,EAAE,CAAE;KAEjB,MAAM,IAAI,EAAE;AACZ,SAAI,MAAM,QAAQ,EAAE,CAAE,GAAE,QAAQ,SAAS;SAAO,UAAS,EAAE;MAC3D;;AAEJ,YAAS,KAAK;AAAE,UAAO;;EAGzB,SAAS,YAAY,QAA8B;AACjD,OAAI,OAAO,WAAW,KAAK,OAAO,GAAG,SAAS,aAAc,QAAO;AACnE,UAAQ,OAAO,GAAW,kBAAkB;;AAG9C,SAAO,EACL,wBAAwB,MAAM;GAC5B,MAAM,QAAQ;AACd,OAAI,MAAM,cAAc,MAAM,KAAK,SAAS,oBAAoB,MAAM,KAAK,KAAK,WAAW,KAAK,YAAY,MAAM,KAAK,IAAI,iBAAiB,MAAM,CAAE;GACpJ,MAAM,OAAO,MAAM,KAAK,KAAK;GAC7B,IAAI,OAAyB;AAC7B,OAAI,KAAK,SAAS,sBAAuB,QAAO,KAAK;YAC5C,KAAK,SAAS,kBAAmB,QAAO,KAAK;AACtD,OAAI,QAAQ,QAAQ,yBAAyB,KAAK,CAAE;GAEpD,MAAM,aAAc,MAAM,OAAiB,KAAK,MAAW,WAAW,QAAQ,EAAE,CAAC,CAAC,KAAK,KAAK;GAC5F,MAAM,WAAW,cAAc,WAAW,QAAQ,KAAK,CAAC;GACxD,MAAM,gBAAgB,YAAY,MAAM,OAAO,GAAG,IAAI,WAAW,KAAK;GACtE,MAAM,WAAW,KAAK,SAAS,qBAAqB,IAAI,SAAS,KAAK;GACtE,MAAM,SAAS,GAAG,MAAM,UAAU,OAAO,WAAW,KAAK,cAAc,MAAM;AAE7E,OAAI,UAAU,MAAM,CAAC,SAAS,OAAO,SAAS,gBAAiB;AAC/D,WAAQ,OAAO;IAAC;IAAM,WAAW;IAAsB,MAAK,UAAS,MAAM,YAAY,MAAM,OAAO;IAAC,CAAC;KAEzG;;CAEJ"}