项目原始demo,不改动
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
Ce dépôt est archivé. Vous pouvez voir les fichiers et le cloner, mais vous ne pouvez pas pousser ni ouvrir de ticket/demande d'ajout.
 
 
 
 

159 lignes
5.0 KiB

  1. /**
  2. * @fileoverview Rule to define spacing before/after arrow function's arrow.
  3. * @author Jxck
  4. */
  5. "use strict";
  6. //------------------------------------------------------------------------------
  7. // Requirements
  8. //------------------------------------------------------------------------------
  9. const astUtils = require("../ast-utils");
  10. //------------------------------------------------------------------------------
  11. // Rule Definition
  12. //------------------------------------------------------------------------------
  13. module.exports = {
  14. meta: {
  15. docs: {
  16. description: "enforce consistent spacing before and after the arrow in arrow functions",
  17. category: "ECMAScript 6",
  18. recommended: false,
  19. url: "https://eslint.org/docs/rules/arrow-spacing"
  20. },
  21. fixable: "whitespace",
  22. schema: [
  23. {
  24. type: "object",
  25. properties: {
  26. before: {
  27. type: "boolean"
  28. },
  29. after: {
  30. type: "boolean"
  31. }
  32. },
  33. additionalProperties: false
  34. }
  35. ],
  36. messages: {
  37. expectedBefore: "Missing space before =>.",
  38. unexpectedBefore: "Unexpected space before =>.",
  39. expectedAfter: "Missing space after =>.",
  40. unexpectedAfter: "Unexpected space after =>."
  41. }
  42. },
  43. create(context) {
  44. // merge rules with default
  45. const rule = { before: true, after: true },
  46. option = context.options[0] || {};
  47. rule.before = option.before !== false;
  48. rule.after = option.after !== false;
  49. const sourceCode = context.getSourceCode();
  50. /**
  51. * Get tokens of arrow(`=>`) and before/after arrow.
  52. * @param {ASTNode} node The arrow function node.
  53. * @returns {Object} Tokens of arrow and before/after arrow.
  54. */
  55. function getTokens(node) {
  56. const arrow = sourceCode.getTokenBefore(node.body, astUtils.isArrowToken);
  57. return {
  58. before: sourceCode.getTokenBefore(arrow),
  59. arrow,
  60. after: sourceCode.getTokenAfter(arrow)
  61. };
  62. }
  63. /**
  64. * Count spaces before/after arrow(`=>`) token.
  65. * @param {Object} tokens Tokens before/after arrow.
  66. * @returns {Object} count of space before/after arrow.
  67. */
  68. function countSpaces(tokens) {
  69. const before = tokens.arrow.range[0] - tokens.before.range[1];
  70. const after = tokens.after.range[0] - tokens.arrow.range[1];
  71. return { before, after };
  72. }
  73. /**
  74. * Determines whether space(s) before after arrow(`=>`) is satisfy rule.
  75. * if before/after value is `true`, there should be space(s).
  76. * if before/after value is `false`, there should be no space.
  77. * @param {ASTNode} node The arrow function node.
  78. * @returns {void}
  79. */
  80. function spaces(node) {
  81. const tokens = getTokens(node);
  82. const countSpace = countSpaces(tokens);
  83. if (rule.before) {
  84. // should be space(s) before arrow
  85. if (countSpace.before === 0) {
  86. context.report({
  87. node: tokens.before,
  88. messageId: "expectedBefore",
  89. fix(fixer) {
  90. return fixer.insertTextBefore(tokens.arrow, " ");
  91. }
  92. });
  93. }
  94. } else {
  95. // should be no space before arrow
  96. if (countSpace.before > 0) {
  97. context.report({
  98. node: tokens.before,
  99. messageId: "unexpectedBefore",
  100. fix(fixer) {
  101. return fixer.removeRange([tokens.before.range[1], tokens.arrow.range[0]]);
  102. }
  103. });
  104. }
  105. }
  106. if (rule.after) {
  107. // should be space(s) after arrow
  108. if (countSpace.after === 0) {
  109. context.report({
  110. node: tokens.after,
  111. messageId: "expectedAfter",
  112. fix(fixer) {
  113. return fixer.insertTextAfter(tokens.arrow, " ");
  114. }
  115. });
  116. }
  117. } else {
  118. // should be no space after arrow
  119. if (countSpace.after > 0) {
  120. context.report({
  121. node: tokens.after,
  122. messageId: "unexpectedAfter",
  123. fix(fixer) {
  124. return fixer.removeRange([tokens.arrow.range[1], tokens.after.range[0]]);
  125. }
  126. });
  127. }
  128. }
  129. }
  130. return {
  131. ArrowFunctionExpression: spaces
  132. };
  133. }
  134. };