项目原始demo,不改动
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 

123 lines
3.9 KiB

  1. /**
  2. * @fileoverview Rule to enforce spacing around embedded expressions of template strings
  3. * @author Toru Nagashima
  4. */
  5. "use strict";
  6. //------------------------------------------------------------------------------
  7. // Requirements
  8. //------------------------------------------------------------------------------
  9. const astUtils = require("../ast-utils");
  10. //------------------------------------------------------------------------------
  11. // Helpers
  12. //------------------------------------------------------------------------------
  13. const OPEN_PAREN = /\$\{$/;
  14. const CLOSE_PAREN = /^\}/;
  15. //------------------------------------------------------------------------------
  16. // Rule Definition
  17. //------------------------------------------------------------------------------
  18. module.exports = {
  19. meta: {
  20. docs: {
  21. description: "require or disallow spacing around embedded expressions of template strings",
  22. category: "ECMAScript 6",
  23. recommended: false,
  24. url: "https://eslint.org/docs/rules/template-curly-spacing"
  25. },
  26. fixable: "whitespace",
  27. schema: [
  28. { enum: ["always", "never"] }
  29. ]
  30. },
  31. create(context) {
  32. const sourceCode = context.getSourceCode();
  33. const always = context.options[0] === "always";
  34. const prefix = always ? "Expected" : "Unexpected";
  35. /**
  36. * Checks spacing before `}` of a given token.
  37. * @param {Token} token - A token to check. This is a Template token.
  38. * @returns {void}
  39. */
  40. function checkSpacingBefore(token) {
  41. const prevToken = sourceCode.getTokenBefore(token);
  42. if (prevToken &&
  43. CLOSE_PAREN.test(token.value) &&
  44. astUtils.isTokenOnSameLine(prevToken, token) &&
  45. sourceCode.isSpaceBetweenTokens(prevToken, token) !== always
  46. ) {
  47. context.report({
  48. loc: token.loc.start,
  49. message: "{{prefix}} space(s) before '}'.",
  50. data: {
  51. prefix
  52. },
  53. fix(fixer) {
  54. if (always) {
  55. return fixer.insertTextBefore(token, " ");
  56. }
  57. return fixer.removeRange([
  58. prevToken.range[1],
  59. token.range[0]
  60. ]);
  61. }
  62. });
  63. }
  64. }
  65. /**
  66. * Checks spacing after `${` of a given token.
  67. * @param {Token} token - A token to check. This is a Template token.
  68. * @returns {void}
  69. */
  70. function checkSpacingAfter(token) {
  71. const nextToken = sourceCode.getTokenAfter(token);
  72. if (nextToken &&
  73. OPEN_PAREN.test(token.value) &&
  74. astUtils.isTokenOnSameLine(token, nextToken) &&
  75. sourceCode.isSpaceBetweenTokens(token, nextToken) !== always
  76. ) {
  77. context.report({
  78. loc: {
  79. line: token.loc.end.line,
  80. column: token.loc.end.column - 2
  81. },
  82. message: "{{prefix}} space(s) after '${'.",
  83. data: {
  84. prefix
  85. },
  86. fix(fixer) {
  87. if (always) {
  88. return fixer.insertTextAfter(token, " ");
  89. }
  90. return fixer.removeRange([
  91. token.range[1],
  92. nextToken.range[0]
  93. ]);
  94. }
  95. });
  96. }
  97. }
  98. return {
  99. TemplateElement(node) {
  100. const token = sourceCode.getFirstToken(node);
  101. checkSpacingBefore(token);
  102. checkSpacingAfter(token);
  103. }
  104. };
  105. }
  106. };