wrap-regex.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * @fileoverview Rule to flag when regex literals are not wrapped in parens
  3. * @author Matt DuVall <http://www.mattduvall.com>
  4. * @deprecated in ESLint v8.53.0
  5. */
  6. "use strict";
  7. //------------------------------------------------------------------------------
  8. // Rule Definition
  9. //------------------------------------------------------------------------------
  10. /** @type {import('../types').Rule.RuleModule} */
  11. module.exports = {
  12. meta: {
  13. deprecated: {
  14. message: "Formatting rules are being moved out of ESLint core.",
  15. url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
  16. deprecatedSince: "8.53.0",
  17. availableUntil: "11.0.0",
  18. replacedBy: [
  19. {
  20. message:
  21. "ESLint Stylistic now maintains deprecated stylistic core rules.",
  22. url: "https://eslint.style/guide/migration",
  23. plugin: {
  24. name: "@stylistic/eslint-plugin",
  25. url: "https://eslint.style",
  26. },
  27. rule: {
  28. name: "wrap-regex",
  29. url: "https://eslint.style/rules/wrap-regex",
  30. },
  31. },
  32. ],
  33. },
  34. type: "layout",
  35. docs: {
  36. description: "Require parenthesis around regex literals",
  37. recommended: false,
  38. url: "https://eslint.org/docs/latest/rules/wrap-regex",
  39. },
  40. schema: [],
  41. fixable: "code",
  42. messages: {
  43. requireParens:
  44. "Wrap the regexp literal in parens to disambiguate the slash.",
  45. },
  46. },
  47. create(context) {
  48. const sourceCode = context.sourceCode;
  49. return {
  50. Literal(node) {
  51. const token = sourceCode.getFirstToken(node),
  52. nodeType = token.type;
  53. if (nodeType === "RegularExpression") {
  54. const beforeToken = sourceCode.getTokenBefore(node);
  55. const afterToken = sourceCode.getTokenAfter(node);
  56. const { parent } = node;
  57. if (
  58. parent.type === "MemberExpression" &&
  59. parent.object === node &&
  60. !(
  61. beforeToken &&
  62. beforeToken.value === "(" &&
  63. afterToken &&
  64. afterToken.value === ")"
  65. )
  66. ) {
  67. context.report({
  68. node,
  69. messageId: "requireParens",
  70. fix: fixer =>
  71. fixer.replaceText(
  72. node,
  73. `(${sourceCode.getText(node)})`,
  74. ),
  75. });
  76. }
  77. }
  78. },
  79. };
  80. },
  81. };