|
|
- /**
- * @fileoverview Rule to disallow calls to the `Object` constructor without an argument
- * @author Francesco Trotta
- */
-
- "use strict";
-
- //------------------------------------------------------------------------------
- // Requirements
- //------------------------------------------------------------------------------
-
- const {
- getVariableByName,
- isArrowToken,
- isStartOfExpressionStatement,
- needsPrecedingSemicolon
- } = require("./utils/ast-utils");
-
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
-
- /** @type {import('../shared/types').Rule} */
- module.exports = {
- meta: {
- type: "suggestion",
-
- docs: {
- description: "Disallow calls to the `Object` constructor without an argument",
- recommended: false,
- url: "https://eslint.org/docs/latest/rules/no-object-constructor"
- },
-
- hasSuggestions: true,
-
- schema: [],
-
- messages: {
- preferLiteral: "The object literal notation {} is preferable.",
- useLiteral: "Replace with '{{replacement}}'.",
- useLiteralAfterSemicolon: "Replace with '{{replacement}}', add preceding semicolon."
- }
- },
-
- create(context) {
-
- const sourceCode = context.sourceCode;
-
- /**
- * Determines whether or not an object literal that replaces a specified node needs to be enclosed in parentheses.
- * @param {ASTNode} node The node to be replaced.
- * @returns {boolean} Whether or not parentheses around the object literal are required.
- */
- function needsParentheses(node) {
- if (isStartOfExpressionStatement(node)) {
- return true;
- }
-
- const prevToken = sourceCode.getTokenBefore(node);
-
- if (prevToken && isArrowToken(prevToken)) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Reports on nodes where the `Object` constructor is called without arguments.
- * @param {ASTNode} node The node to evaluate.
- * @returns {void}
- */
- function check(node) {
- if (node.callee.type !== "Identifier" || node.callee.name !== "Object" || node.arguments.length) {
- return;
- }
-
- const variable = getVariableByName(sourceCode.getScope(node), "Object");
-
- if (variable && variable.identifiers.length === 0) {
- let replacement;
- let fixText;
- let messageId = "useLiteral";
-
- if (needsParentheses(node)) {
- replacement = "({})";
- if (needsPrecedingSemicolon(sourceCode, node)) {
- fixText = ";({})";
- messageId = "useLiteralAfterSemicolon";
- } else {
- fixText = "({})";
- }
- } else {
- replacement = fixText = "{}";
- }
-
- context.report({
- node,
- messageId: "preferLiteral",
- suggest: [
- {
- messageId,
- data: { replacement },
- fix: fixer => fixer.replaceText(node, fixText)
- }
- ]
- });
- }
- }
-
- return {
- CallExpression: check,
- NewExpression: check
- };
-
- }
- };
|