no-property-shorthands.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /**
  2. * @author Toru Nagashima <https://github.com/mysticatea>
  3. * See LICENSE file in root directory for full license.
  4. */
  5. "use strict"
  6. const { isOpeningBracketToken, isClosingBracketToken } = require("eslint-utils")
  7. module.exports = {
  8. meta: {
  9. docs: {
  10. description: "disallow property shorthands.",
  11. category: "ES2015",
  12. recommended: false,
  13. url:
  14. "http://mysticatea.github.io/eslint-plugin-es/rules/no-property-shorthands.html",
  15. },
  16. fixable: "code",
  17. schema: [],
  18. messages: {
  19. forbidden: "ES2015 property shorthands are forbidden.",
  20. },
  21. },
  22. create(context) {
  23. const sourceCode = context.getSourceCode()
  24. /**
  25. * Fixes a FunctionExpression node by making it into a longform property.
  26. * @param {SourceCodeFixer} fixer The fixer object
  27. * @param {ASTNode} node A `Property` node that has a `FunctionExpression` as its value
  28. * @returns {object} A fix for this node
  29. */
  30. function makeFunctionLongform(fixer, node) {
  31. const firstKeyToken = node.computed
  32. ? sourceCode.getTokenBefore(node.key, isOpeningBracketToken)
  33. : sourceCode.getFirstToken(node.key)
  34. const lastKeyToken = node.computed
  35. ? sourceCode.getTokenAfter(node.key, isClosingBracketToken)
  36. : sourceCode.getLastToken(node.key)
  37. const keyText = sourceCode.text.slice(
  38. firstKeyToken.range[0],
  39. lastKeyToken.range[1]
  40. )
  41. let functionHeader = "function"
  42. if (node.value.async) {
  43. functionHeader = `async ${functionHeader}`
  44. }
  45. if (node.value.generator) {
  46. functionHeader = `${functionHeader}*`
  47. }
  48. return fixer.replaceTextRange(
  49. [node.range[0], lastKeyToken.range[1]],
  50. `${keyText}: ${functionHeader}`
  51. )
  52. }
  53. return {
  54. "ObjectExpression > :matches(Property[method=true], Property[shorthand=true])"(
  55. node
  56. ) {
  57. context.report({
  58. node,
  59. messageId: "forbidden",
  60. fix: node.method
  61. ? fixer => makeFunctionLongform(fixer, node)
  62. : fixer =>
  63. fixer.insertTextAfter(
  64. node.key,
  65. `: ${node.key.name}`
  66. ),
  67. })
  68. },
  69. }
  70. },
  71. }