no-whitespace-before-property.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. * @fileoverview Rule to disallow whitespace before properties
  3. * @author Kai Cataldo
  4. * @deprecated in ESLint v8.53.0
  5. */
  6. "use strict";
  7. //------------------------------------------------------------------------------
  8. // Requirements
  9. //------------------------------------------------------------------------------
  10. const astUtils = require("./utils/ast-utils");
  11. //------------------------------------------------------------------------------
  12. // Rule Definition
  13. //------------------------------------------------------------------------------
  14. /** @type {import('../types').Rule.RuleModule} */
  15. module.exports = {
  16. meta: {
  17. deprecated: {
  18. message: "Formatting rules are being moved out of ESLint core.",
  19. url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
  20. deprecatedSince: "8.53.0",
  21. availableUntil: "11.0.0",
  22. replacedBy: [
  23. {
  24. message:
  25. "ESLint Stylistic now maintains deprecated stylistic core rules.",
  26. url: "https://eslint.style/guide/migration",
  27. plugin: {
  28. name: "@stylistic/eslint-plugin",
  29. url: "https://eslint.style",
  30. },
  31. rule: {
  32. name: "no-whitespace-before-property",
  33. url: "https://eslint.style/rules/no-whitespace-before-property",
  34. },
  35. },
  36. ],
  37. },
  38. type: "layout",
  39. docs: {
  40. description: "Disallow whitespace before properties",
  41. recommended: false,
  42. url: "https://eslint.org/docs/latest/rules/no-whitespace-before-property",
  43. },
  44. fixable: "whitespace",
  45. schema: [],
  46. messages: {
  47. unexpectedWhitespace:
  48. "Unexpected whitespace before property {{propName}}.",
  49. },
  50. },
  51. create(context) {
  52. const sourceCode = context.sourceCode;
  53. //--------------------------------------------------------------------------
  54. // Helpers
  55. //--------------------------------------------------------------------------
  56. /**
  57. * Reports whitespace before property token
  58. * @param {ASTNode} node the node to report in the event of an error
  59. * @param {Token} leftToken the left token
  60. * @param {Token} rightToken the right token
  61. * @returns {void}
  62. * @private
  63. */
  64. function reportError(node, leftToken, rightToken) {
  65. context.report({
  66. node,
  67. messageId: "unexpectedWhitespace",
  68. data: {
  69. propName: sourceCode.getText(node.property),
  70. },
  71. fix(fixer) {
  72. let replacementText = "";
  73. if (
  74. !node.computed &&
  75. !node.optional &&
  76. astUtils.isDecimalInteger(node.object)
  77. ) {
  78. /*
  79. * If the object is a number literal, fixing it to something like 5.toString() would cause a SyntaxError.
  80. * Don't fix this case.
  81. */
  82. return null;
  83. }
  84. // Don't fix if comments exist.
  85. if (
  86. sourceCode.commentsExistBetween(leftToken, rightToken)
  87. ) {
  88. return null;
  89. }
  90. if (node.optional) {
  91. replacementText = "?.";
  92. } else if (!node.computed) {
  93. replacementText = ".";
  94. }
  95. return fixer.replaceTextRange(
  96. [leftToken.range[1], rightToken.range[0]],
  97. replacementText,
  98. );
  99. },
  100. });
  101. }
  102. //--------------------------------------------------------------------------
  103. // Public
  104. //--------------------------------------------------------------------------
  105. return {
  106. MemberExpression(node) {
  107. let rightToken;
  108. let leftToken;
  109. if (!astUtils.isTokenOnSameLine(node.object, node.property)) {
  110. return;
  111. }
  112. if (node.computed) {
  113. rightToken = sourceCode.getTokenBefore(
  114. node.property,
  115. astUtils.isOpeningBracketToken,
  116. );
  117. leftToken = sourceCode.getTokenBefore(
  118. rightToken,
  119. node.optional ? 1 : 0,
  120. );
  121. } else {
  122. rightToken = sourceCode.getFirstToken(node.property);
  123. leftToken = sourceCode.getTokenBefore(rightToken, 1);
  124. }
  125. if (sourceCode.isSpaceBetweenTokens(leftToken, rightToken)) {
  126. reportError(node, leftToken, rightToken);
  127. }
  128. },
  129. };
  130. },
  131. };