Eslint 规则 运行 多次
Eslint rule is running multiple times
我正在尝试编写一个 eslint 规则,该规则强制确保 name
属性 定义在从其他 Error/Exception 扩展的任何 类 上,命名为 类(并修复它们)。
据我所知,它在 astexplorer.net 中单独工作,但是当我 运行 将它与其他规则结合使用时,它最终会 运行 多次,因此名称 属性 最终在生成的“固定”文件中重复多次。
我能做些什么来防止它被多次运行?我假设正在发生的事情是它正在插入我的 name = 'ClassName';
,然后 prettier 需要重新格式化代码,它确实这样做了,但也许它正在重新 运行 宁我的规则?我不确定。
Rule/fix代码如下所示。我尝试过使用 *fix 和 yield 之类的方法,但这似乎也无济于事(根据 eslint documentation 中的信息,请参阅下面的注释代码)
module.exports = {
meta: {
hasSuggestions: true,
type: 'suggestion',
docs: {},
fixable: 'code',
schema: [], // no options,
},
create: function (context) {
return {
ClassDeclaration: function (node) {
const regex = /.*(Error|Exception)$/;
// If the parent/superClass is has "Error" or "Exception" in the name
if (node.superClass && regex.test(node.superClass.name)) {
let name = null;
const className = node.id.name;
// Test class object name
if (!regex.test(className)) {
context.report({
node: node,
message: 'Error extensions must end with "Error" or "Exception".',
});
}
// Find name ClassProperty
node.body.body.some(function (a) {
if (a.type === 'ClassProperty' && a.key.name === 'name') {
name = a.value.value;
return true;
}
});
// Name property is required
if (!name) {
context.report({
node: node,
message: 'Error extensions should have a descriptive name',
fix(fixer) {
return fixer.replaceTextRange(
[node.body.range[0]+1, node.body.range[0]+1],
`name = '${className}';`
);
},
// *fix(fixer) {
// name = className;
// yield fixer.replaceTextRange(
// [node.body.range[0]+1, node.body.range[0]+1],
// `name = '${className}';`
// );
//
// // extend range of the fix to the range of `node.parent`
// yield fixer.insertTextBefore(node.body, '');
// yield fixer.insertTextAfter(node.body, '');
// },
});
}
}
},
};
},
};
原来我将 AST Explorer 设置为错误的解析器,所以它向我显示了 ClassProperty
节点的错误字符串名称。我应该一直使用 PropertyDefinition
来代替。
我正在尝试编写一个 eslint 规则,该规则强制确保 name
属性 定义在从其他 Error/Exception 扩展的任何 类 上,命名为 类(并修复它们)。
据我所知,它在 astexplorer.net 中单独工作,但是当我 运行 将它与其他规则结合使用时,它最终会 运行 多次,因此名称 属性 最终在生成的“固定”文件中重复多次。
我能做些什么来防止它被多次运行?我假设正在发生的事情是它正在插入我的 name = 'ClassName';
,然后 prettier 需要重新格式化代码,它确实这样做了,但也许它正在重新 运行 宁我的规则?我不确定。
Rule/fix代码如下所示。我尝试过使用 *fix 和 yield 之类的方法,但这似乎也无济于事(根据 eslint documentation 中的信息,请参阅下面的注释代码)
module.exports = {
meta: {
hasSuggestions: true,
type: 'suggestion',
docs: {},
fixable: 'code',
schema: [], // no options,
},
create: function (context) {
return {
ClassDeclaration: function (node) {
const regex = /.*(Error|Exception)$/;
// If the parent/superClass is has "Error" or "Exception" in the name
if (node.superClass && regex.test(node.superClass.name)) {
let name = null;
const className = node.id.name;
// Test class object name
if (!regex.test(className)) {
context.report({
node: node,
message: 'Error extensions must end with "Error" or "Exception".',
});
}
// Find name ClassProperty
node.body.body.some(function (a) {
if (a.type === 'ClassProperty' && a.key.name === 'name') {
name = a.value.value;
return true;
}
});
// Name property is required
if (!name) {
context.report({
node: node,
message: 'Error extensions should have a descriptive name',
fix(fixer) {
return fixer.replaceTextRange(
[node.body.range[0]+1, node.body.range[0]+1],
`name = '${className}';`
);
},
// *fix(fixer) {
// name = className;
// yield fixer.replaceTextRange(
// [node.body.range[0]+1, node.body.range[0]+1],
// `name = '${className}';`
// );
//
// // extend range of the fix to the range of `node.parent`
// yield fixer.insertTextBefore(node.body, '');
// yield fixer.insertTextAfter(node.body, '');
// },
});
}
}
},
};
},
};
原来我将 AST Explorer 设置为错误的解析器,所以它向我显示了 ClassProperty
节点的错误字符串名称。我应该一直使用 PropertyDefinition
来代替。