[Javascript AST] 4. Continue: Report ESLint error

const disallowedMethods = ["log", "info", "warn", "error", "dir"];

module.exports = {
  meta: {
    docs: {
      description: "Disallow use of console",
      category: "Best Practices",
      recommended: true
    }
  },
  create(context) {
    return {
      Identifier(node) {
        
        const isConsoleCall = looksLike(node, {
          name: "console",
          parent: {
            type: "MemberExpression",
            property: {
              name: val => disallowedMethods.includes(val)
            }
          }
        });
        // find the identifier with name 'console'
        if (!isConsoleCall) {
          return;
        }

        context.report({
          node,
          message: "Using {{identifier}} is not allowed",
          data: {
             identifier: node.name // console
          }
        });
      }
    };
  }
};

function looksLike(a, b) {
  return (
    a &&
    b &&
    Object.keys(b).every(bKey => {
      const bVal = b[bKey];
      const aVal = a[bKey];
      if (typeof bVal === "function") {
        return bVal(aVal);
      }
      return isPrimitive(bVal) ? bVal === aVal : looksLike(aVal, bVal);
    })
  );
}

function isPrimitive(val) {
  return val == null || /^[sbn]/.test(typeof val);
}

We can use placeholder for more detail information:

"Using {{identifier}} is not allowed"

The placeholder can be found in data prop:

          data: {
             identifier: node.name // console
          }
原文地址:https://www.cnblogs.com/Answer1215/p/7616029.html