valid-v-if.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * @author Toru Nagashima
  3. * @copyright 2017 Toru Nagashima. All rights reserved.
  4. * See LICENSE file in root directory for full license.
  5. */
  6. 'use strict'
  7. // ------------------------------------------------------------------------------
  8. // Requirements
  9. // ------------------------------------------------------------------------------
  10. const utils = require('../utils')
  11. // ------------------------------------------------------------------------------
  12. // Rule Definition
  13. // ------------------------------------------------------------------------------
  14. module.exports = {
  15. meta: {
  16. type: 'problem',
  17. docs: {
  18. description: 'enforce valid `v-if` directives',
  19. categories: ['vue3-essential', 'essential'],
  20. url: 'https://eslint.vuejs.org/rules/valid-v-if.html'
  21. },
  22. fixable: null,
  23. schema: [],
  24. messages: {
  25. withVElse:
  26. "'v-if' and 'v-else' directives can't exist on the same element. You may want 'v-else-if' directives.",
  27. withVElseIf:
  28. "'v-if' and 'v-else-if' directives can't exist on the same element.",
  29. unexpectedArgument: "'v-if' directives require no argument.",
  30. unexpectedModifier: "'v-if' directives require no modifier.",
  31. expectedValue: "'v-if' directives require that attribute value."
  32. }
  33. },
  34. /** @param {RuleContext} context */
  35. create(context) {
  36. return utils.defineTemplateBodyVisitor(context, {
  37. /** @param {VDirective} node */
  38. "VAttribute[directive=true][key.name.name='if']"(node) {
  39. const element = node.parent.parent
  40. if (utils.hasDirective(element, 'else')) {
  41. context.report({
  42. node,
  43. messageId: 'withVElse'
  44. })
  45. }
  46. if (utils.hasDirective(element, 'else-if')) {
  47. context.report({
  48. node,
  49. messageId: 'withVElseIf'
  50. })
  51. }
  52. if (node.key.argument) {
  53. context.report({
  54. node: node.key.argument,
  55. messageId: 'unexpectedArgument'
  56. })
  57. }
  58. if (node.key.modifiers.length > 0) {
  59. context.report({
  60. node,
  61. loc: {
  62. start: node.key.modifiers[0].loc.start,
  63. end: node.key.modifiers[node.key.modifiers.length - 1].loc.end
  64. },
  65. messageId: 'unexpectedModifier'
  66. })
  67. }
  68. if (!node.value || utils.isEmptyValueDirective(node, context)) {
  69. context.report({
  70. node,
  71. messageId: 'expectedValue'
  72. })
  73. }
  74. }
  75. })
  76. }
  77. }