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 来代替。