| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | /** * @fileoverview Rule to prevent throwing bare Cr.ERRORs. * * 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 isCr(object) {  return object.type === "Identifier" && object.name === "Cr";}function isComponentsResults(object) {  return (    object.type === "MemberExpression" &&    object.object.type === "Identifier" &&    object.object.name === "Components" &&    object.property.type === "Identifier" &&    object.property.name === "results"  );}function isNewError(argument) {  return (    argument.type === "NewExpression" &&    argument.callee.type === "Identifier" &&    argument.callee.name === "Error" &&    argument.arguments.length === 1  );}function fixT(context, node, argument, fixer) {  const sourceText = context.getSourceCode().getText(argument);  return fixer.replaceText(node, `Components.Exception("", ${sourceText})`);}module.exports = {  meta: {    docs: {      url:        "https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/no-throw-cr-literal.html",    },    fixable: "code",    messages: {      bareCR: "Do not throw bare Cr.ERRORs, use Components.Exception instead",      bareComponentsResults:        "Do not throw bare Components.results.ERRORs, use Components.Exception instead",      newErrorCR:        "Do not pass Cr.ERRORs to new Error(), use Components.Exception instead",      newErrorComponentsResults:        "Do not pass Components.results.ERRORs to new Error(), use Components.Exception instead",    },    type: "problem",  },  create(context) {    return {      ThrowStatement(node) {        if (node.argument.type === "MemberExpression") {          const fix = fixT.bind(null, context, node.argument, node.argument);          if (isCr(node.argument.object)) {            context.report({              node,              messageId: "bareCR",              fix,            });          } else if (isComponentsResults(node.argument.object)) {            context.report({              node,              messageId: "bareComponentsResults",              fix,            });          }        } else if (isNewError(node.argument)) {          const argument = node.argument.arguments[0];          if (argument.type === "MemberExpression") {            const fix = fixT.bind(null, context, node.argument, argument);            if (isCr(argument.object)) {              context.report({                node,                messageId: "newErrorCR",                fix,              });            } else if (isComponentsResults(argument.object)) {              context.report({                node,                messageId: "newErrorComponentsResults",                fix,              });            }          }        }      },    };  },};
 |