[Javascript AST] 3. Continue: Write ESLint rule

The rule we want to write is show warning if user using console method:

// valid
foo.console()
console()
info()
console.baz()

// invalid
console.log()
console.info()
console.warn()

Rule:

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 console is not allowed"
        });
      }
    };
  }
};

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);
}

'looksLike' & isPrimitive is pretty handy, you can save as until lib.

原文地址:https://www.cnblogs.com/Answer1215/p/7594742.html