【问题标题】:How to analyze JS Literals/Identifiers using ESLint Custom Rules如何使用 ESLint 自定义规则分析 JS 文字/标识符
【发布时间】:2021-01-11 19:46:23
【问题描述】:

我会用一个例子来解释这个场景。

假设我有以下 JS 代码:

$.ajax({
    url: '/Department/GetAllUsers',
    type: "POST",
    data: data,
    success: function (result) {
        //Some Code
    },
    error: function () {
        //Some Code
    }
});

我想限制对控制器该操作的调用。所以我为此编写了以下自定义 ES Lint 规则:

module.exports = {
    meta: {
        type: "problem",
        docs: {
            description: "Prohibited Method",
            category: "Method",
            recommended: true,
            url: ""
        },
        messages: {
            messageDefault: "This method is Prohibited to use"
        },
        fixable: "code",
        schema: [] // no options
    },
    create: function (context) {
        return {
            Literal(node) {
                var literalValue = node.value.toString();
                var cont = literalValue.split("/").filter(x => x.length > 1);
                {
                    if (cont[0] === 'Department' && cont[1] === 'GetAllUsers') {

                        context.report({
                            node: node,
                            messageId: "messageDefault",
                        });
                    }
                }
            }
        };
    }
};

所以我在这里限制使用 'Department/GetAllUsers' ,这很好用。当我拆分字符串或将字符串分配给变量时,就会出现问题。例如

var controller = "Department";
var action = "GetAllUsers";
$.ajax({
    url: "/" + controller + "/" + action,  
    //or '/Department/' + 'GetAllUsers'
    type: "POST",
    data: data,
    success: function (result) {
        //Some Code
    },
    error: function () {
        //Some Code
    }
});

这里的限制不起作用,有没有办法可以解决 url 上的变量值?这甚至可以使用 ESLint 吗?

简而言之,我想要在 Roslyn 中用于 C# 代码分析的 context.SemanticModel.GetSymbolInfo(node) 之类的东西。

谢谢

【问题讨论】:

    标签: javascript eslint static-analysis eslintrc typescript-eslint


    【解决方案1】:

    你可以使用 ESLint 的范围管理器 https://eslint.org/docs/developer-guide/scope-manager-interface

    在 ESLint 自己的代码库中有很多使用范围管理器的例子: https://github.com/eslint/eslint/search?q=getScope

    使用此 API,您可以跟踪变量引用并检查其分配。

    请注意,这有一些限制。例如,您将无法跨模块边界或函数边界跟踪值。

    【讨论】:

    • 如何检查var urls = { main: '/Department/GetAllUsers' };
    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多