| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | /** * @fileoverview Reject multiple calls to document.l10n.formatValue in the same * code block. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */"use strict";function isIdentifier(node, id) {  return node && node.type === "Identifier" && node.name === id;}/** * As we enter blocks new sets are pushed onto this stack and then popped when * we exit the block. */const BlockStack = [];module.exports = {  meta: {    docs: {      description: "disallow multiple document.l10n.formatValue calls",      url:        "https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/prefer-formatValues.html",    },    type: "problem",  },  create(context) {    function enterBlock() {      BlockStack.push(new Set());    }    function exitBlock() {      let calls = BlockStack.pop();      if (calls.size > 1) {        for (let callNode of calls) {          context.report(            callNode,            "prefer to use a single document.l10n.formatValues call instead " +              "of multiple calls to document.l10n.formatValue or document.l10n.formatValues"          );        }      }    }    return {      Program: enterBlock,      "Program:exit": exitBlock,      BlockStatement: enterBlock,      "BlockStatement:exit": exitBlock,      CallExpression(node) {        if (!BlockStack.length) {          context.report(node, "call expression found outside of known block");        }        let callee = node.callee;        if (callee.type !== "MemberExpression") {          return;        }        if (          !isIdentifier(callee.property, "formatValue") &&          !isIdentifier(callee.property, "formatValues")        ) {          return;        }        if (callee.object.type !== "MemberExpression") {          return;        }        if (          !isIdentifier(callee.object.object, "document") ||          !isIdentifier(callee.object.property, "l10n")        ) {          return;        }        let calls = BlockStack[BlockStack.length - 1];        calls.add(node);      },    };  },};
 |