v-for-delimiter-style.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /**
  2. * @fileoverview enforce `v-for` directive's delimiter style
  3. * @author Flo Edelmann
  4. * @copyright 2020 Flo Edelmann. All rights reserved.
  5. * See LICENSE file in root directory for full license.
  6. */
  7. 'use strict'
  8. // ------------------------------------------------------------------------------
  9. // Requirements
  10. // ------------------------------------------------------------------------------
  11. const utils = require('../utils')
  12. // ------------------------------------------------------------------------------
  13. // Rule Definition
  14. // ------------------------------------------------------------------------------
  15. module.exports = {
  16. meta: {
  17. type: 'layout',
  18. docs: {
  19. description: "enforce `v-for` directive's delimiter style",
  20. categories: undefined,
  21. recommended: false,
  22. url: 'https://eslint.vuejs.org/rules/v-for-delimiter-style.html'
  23. },
  24. fixable: 'code',
  25. schema: [{ enum: ['in', 'of'] }]
  26. },
  27. /** @param {RuleContext} context */
  28. create(context) {
  29. const preferredDelimiter =
  30. /** @type {string|undefined} */ (context.options[0]) || 'in'
  31. return utils.defineTemplateBodyVisitor(context, {
  32. /** @param {VForExpression} node */
  33. VForExpression(node) {
  34. const tokenStore =
  35. context.parserServices.getTemplateBodyTokenStore &&
  36. context.parserServices.getTemplateBodyTokenStore()
  37. const delimiterToken = /** @type {Token} */ (tokenStore.getTokenAfter(
  38. node.left.length
  39. ? node.left[node.left.length - 1]
  40. : tokenStore.getFirstToken(node),
  41. (token) => token.type !== 'Punctuator' || token.value !== ')'
  42. ))
  43. if (delimiterToken.value === preferredDelimiter) {
  44. return
  45. }
  46. context.report({
  47. node,
  48. loc: node.loc,
  49. message: `Expected '{{preferredDelimiter}}' instead of '{{usedDelimiter}}' in 'v-for'.`,
  50. data: {
  51. preferredDelimiter,
  52. usedDelimiter: delimiterToken.value
  53. },
  54. *fix(fixer) {
  55. yield fixer.replaceText(delimiterToken, preferredDelimiter)
  56. }
  57. })
  58. }
  59. })
  60. }
  61. }