Skip to content

Commit

Permalink
New: Add vue/no-deprecated-v-on-number-modifiers rule (#1079)
Browse files Browse the repository at this point in the history
  • Loading branch information
yoyo930021 committed Apr 21, 2020
1 parent 1ffcd01 commit 335692e
Show file tree
Hide file tree
Showing 7 changed files with 387 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/rules/README.md
Expand Up @@ -44,6 +44,7 @@ Enforce all the rules in this category, as well as all higher priority rules, wi
| [vue/no-deprecated-slot-attribute](./no-deprecated-slot-attribute.md) | disallow deprecated `slot` attribute (in Vue.js 2.6.0+) | :wrench: |
| [vue/no-deprecated-slot-scope-attribute](./no-deprecated-slot-scope-attribute.md) | disallow deprecated `slot-scope` attribute (in Vue.js 2.6.0+) | :wrench: |
| [vue/no-deprecated-v-bind-sync](./no-deprecated-v-bind-sync.md) | disallow use of deprecated `.sync` modifier on `v-bind` directive (in Vue.js 3.0.0+) | :wrench: |
| [vue/no-deprecated-v-on-number-modifiers](./no-deprecated-v-on-number-modifiers.md) | disallow using deprecated number (keycode) modifiers | :wrench: |
| [vue/no-dupe-keys](./no-dupe-keys.md) | disallow duplication of field names | |
| [vue/no-duplicate-attributes](./no-duplicate-attributes.md) | disallow duplication of attributes | |
| [vue/no-lifecycle-after-await](./no-lifecycle-after-await.md) | disallow asynchronously registered lifecycle hooks | |
Expand Down
52 changes: 52 additions & 0 deletions docs/rules/no-deprecated-v-on-number-modifiers.md
@@ -0,0 +1,52 @@
---
pageClass: rule-details
sidebarDepth: 0
title: vue/no-deprecated-v-on-number-modifiers
description: disallow using deprecated number (keycode) modifiers (in Vue.js 3.0.0+)
---
# vue/no-deprecated-v-on-number-modifiers
> disallow using deprecated number (keycode) modifiers (in Vue.js 3.0.0+)
- :gear: This rule is included in all of `"plugin:vue/vue3-essential"`, `"plugin:vue/vue3-strongly-recommended"` and `"plugin:vue/vue3-recommended"`.
- :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule.

## :book: Rule Details

This rule reports use of deprecated `KeyboardEvent.keyCode` modifier on `v-on` directive (in Vue.js 3.0.0+)

<eslint-code-block fix :rules="{'vue/no-deprecated-v-on-number-modifiers': ['error']}">

```vue
<template>
<!-- ✓ GOOD -->
<input v-on:keyup.page-down="onArrowUp">
<input @keyup.page-down="onArrowUp">
<input @keyup.9="onArrowUp"> <!-- 9 is KeyboardEvent.key -->
<!-- ✗ BAD -->
<input v-on:keyup.34="onArrowUp">
<input @keyup.34="onArrowUp">
</template>
```

</eslint-code-block>

## :wrench: Options

Nothing.

## :couple: Related rules

- [valid-v-on]

[valid-v-on]: valid-v-on.md

## :books: Further reading

- [RFC: drop keycode support](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0014-drop-keycode-support.md)

## :mag: Implementation

- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-deprecated-v-on-number-modifiers.js)
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-deprecated-v-on-number-modifiers.js)
1 change: 1 addition & 0 deletions lib/configs/vue3-essential.js
Expand Up @@ -12,6 +12,7 @@ module.exports = {
'vue/no-deprecated-slot-attribute': 'error',
'vue/no-deprecated-slot-scope-attribute': 'error',
'vue/no-deprecated-v-bind-sync': 'error',
'vue/no-deprecated-v-on-number-modifiers': 'error',
'vue/no-dupe-keys': 'error',
'vue/no-duplicate-attributes': 'error',
'vue/no-lifecycle-after-await': 'error',
Expand Down
1 change: 1 addition & 0 deletions lib/index.js
Expand Up @@ -45,6 +45,7 @@ module.exports = {
'no-deprecated-slot-attribute': require('./rules/no-deprecated-slot-attribute'),
'no-deprecated-slot-scope-attribute': require('./rules/no-deprecated-slot-scope-attribute'),
'no-deprecated-v-bind-sync': require('./rules/no-deprecated-v-bind-sync'),
'no-deprecated-v-on-number-modifiers': require('./rules/no-deprecated-v-on-number-modifiers'),
'no-dupe-keys': require('./rules/no-dupe-keys'),
'no-duplicate-attributes': require('./rules/no-duplicate-attributes'),
'no-empty-pattern': require('./rules/no-empty-pattern'),
Expand Down
58 changes: 58 additions & 0 deletions lib/rules/no-deprecated-v-on-number-modifiers.js
@@ -0,0 +1,58 @@
/**
* @fileoverview disallow using deprecated number (keycode) modifiers
* @author yoyo930021
*/
'use strict'

// ------------------------------------------------------------------------------
// Requirements
// ------------------------------------------------------------------------------

const utils = require('../utils')
const keyCodeToKey = require('../utils/keycode-to-key.json')

// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------

module.exports = {
meta: {
type: 'problem',
docs: {
description: 'disallow using deprecated number (keycode) modifiers',
categories: ['vue3-essential'],
url: 'https://eslint.vuejs.org/rules/no-deprecated-v-on-number-modifiers.html'
},
fixable: 'code',
schema: [],
messages: {
numberModifierIsDeprecated: "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead."
}
},

create (context) {
return utils.defineTemplateBodyVisitor(context, {
"VAttribute[directive=true][key.name.name='on']" (node) {
const modifier = node.key.modifiers.find(mod => Number.isInteger(parseInt(mod.name, 10)))
if (!modifier) return

const keyCodes = parseInt(modifier.name, 10)
if (
keyCodes > 9 || keyCodes < 0
) {
context.report({
node,
loc: node.loc,
messageId: 'numberModifierIsDeprecated',
fix: (fixer) => {
const key = keyCodeToKey[keyCodes]
if (!key) return

return fixer.replaceTextRange(modifier.range, `${key}`)
}
})
}
}
})
}
}
100 changes: 100 additions & 0 deletions lib/utils/keycode-to-key.json
@@ -0,0 +1,100 @@
{
"8": "backspace",
"9": "tab",
"13": "enter",
"16": "shift",
"17": "ctrl",
"18": "alt",
"19": "pause-break",
"20": "caps-lock",
"27": "escape",
"33": "page-up",
"34": "page-down",
"35": "end",
"36": "home",
"37": "left-arrow",
"38": "up-arrow",
"39": "right-arrow",
"40": "down-arrow",
"45": "insert",
"46": "delete",
"48": "0",
"49": "1",
"50": "2",
"51": "3",
"52": "4",
"53": "5",
"54": "6",
"55": "7",
"56": "8",
"57": "9",
"65": "a",
"66": "b",
"67": "c",
"68": "d",
"69": "e",
"70": "f",
"71": "g",
"72": "h",
"73": "i",
"74": "j",
"75": "k",
"76": "l",
"77": "m",
"78": "n",
"79": "o",
"80": "p",
"81": "q",
"82": "r",
"83": "s",
"84": "t",
"85": "u",
"86": "v",
"87": "w",
"88": "x",
"89": "y",
"90": "z",
"91": "left-window-key",
"92": "right-window-key",
"93": "select-key",
"96": "numpad-0",
"97": "numpad-1",
"98": "numpad-2",
"99": "numpad-3",
"100": "numpad-4",
"101": "numpad-5",
"102": "numpad-6",
"103": "numpad-7",
"104": "numpad-8",
"105": "numpad-9",
"106": "multiply",
"107": "add",
"109": "subtract",
"110": "decimal-point",
"111": "divide",
"112": "f1",
"113": "f2",
"114": "f3",
"115": "f4",
"116": "f5",
"117": "f6",
"118": "f7",
"119": "f8",
"120": "f9",
"121": "f10",
"122": "f11",
"123": "f12",
"144": "num-lock",
"145": "scroll-lock",
"186": "semi-colon",
"187": "equal-sign",
"188": "comma",
"189": "dash",
"190": "period",
"191": "forward-slash",
"192": "grave-accent",
"219": "open-bracket",
"220": "back-slash",
"221": "close-braket",
"222": "single-quote"
}

0 comments on commit 335692e

Please sign in to comment.