dr1*_*1ce 6 javascript typescript eslint
我想强制执行没有大括号的一行 if 语句。例如:
// incorrect
if(foo) {
bar()
}
// correct
if(foo) bar()
Run Code Online (Sandbox Code Playgroud)
但如果我有 else/else if,我仍然想保留大括号:
// incorrect
if(foo) bar()
else(baz) qux()
// correct
if(foo) {
bar()
} else(baz) {
qux()
}
Run Code Online (Sandbox Code Playgroud)
我能够创建一个像这样的插件:
module.exports = {
meta: {
type: "layout",
fixable: "whitespace",
messages: {
noSingleLineIfsAsBlock: "Don't use braces with one line if statements",
useBlocksWithElseCases: "Use braces when there are else ifs and/or elses"
}
},
create(context) {
return {
IfStatement(node) {
if(node.alternate === null && node.parent.type !== "IfStatement") {
if(node.consequent.type === "BlockStatement" && node.consequent.body.length > 0) {
// assumes that blank lines are removed by other eslint rules, so at most three lines for a if block with one line inside
if(node.consequent.loc.end.line - node.consequent.loc.start.line + 1 <= 3) {
context.report({
node: node,
messageId: "noSingleLineIfsAsBlock",
fix(fixer) {
const sourceCode = context.getSourceCode();
const openingBrace = sourceCode.getFirstToken(node.consequent);
const closingBrace = sourceCode.getLastToken(node.consequent);
const firstValueToken = sourceCode.getFirstToken(node.consequent.body[0]);
const lastValueToken = sourceCode.getLastToken(node.consequent.body[0]);
return [
fixer.removeRange([openingBrace.range[0], firstValueToken.range[0]]),
fixer.removeRange([lastValueToken.range[1], closingBrace.range[1]])
];
}
})
}
}
} else if(node.alternate || node.parent.type === "IfStatement") {
if(node.consequent.type !== "BlockStatement") {
context.report({
node: node,
messageId: "useBlocksWithElseCases",
fix(fixer) {
// assumes that other eslint rules will fix brace styling
const sourceCode = context.getSourceCode();
const firstValueToken = sourceCode.getFirstToken(node.consequent);
const lastValueToken = sourceCode.getLastToken(node.consequent);
return [
fixer.insertTextBefore(firstValueToken, "{"),
fixer.insertTextAfter(lastValueToken, "}")
];
}
})
}
if(node.alternate && node.alternate.type !== "IfStatement" && node.alternate.type !== "BlockStatement") {
context.report({
node: node,
messageId: "useBlocksWithElseCases",
fix(fixer) {
// assumes that other eslint rules will fix brace styling
const sourceCode = context.getSourceCode();
const firstValueToken = sourceCode.getFirstToken(node.alternate);
const lastValueToken = sourceCode.getLastToken(node.alternate);
return [
fixer.insertTextBefore(firstValueToken, "{"),
fixer.insertTextAfter(lastValueToken, "}")
];
}
})
}
}
}
};
}
};
Run Code Online (Sandbox Code Playgroud)
但我想知道是否已经有我可以使用的现有实现,这样我就不必将其存储在我的项目中。
我浏览了与 eslint 相关的 npm 包并搜索了诸如“eslint if 语句格式”之类的内容,但我找不到任何内容。我也很确定 eslint 没有内置的规则。
我发现的最相关的问题是this,但它询问如何避免我试图实现的样式,并且我没有使用 prettier。
有没有类似的 eslint 插件可以解决我的问题?