File tree Expand file tree Collapse file tree 5 files changed +215
-0
lines changed Expand file tree Collapse file tree 5 files changed +215
-0
lines changed Original file line number Diff line number Diff line change 11
11
| [ @intlify/vue-i18n /<wbr >no-deprecated-i18n-component] ( ./no-deprecated-i18n-component.html ) | disallow using deprecated ` <i18n> ` components (in Vue I18n 9.0.0+) | :black_nib : |
12
12
| [ @intlify/vue-i18n /<wbr >no-deprecated-i18n-place-attr] ( ./no-deprecated-i18n-place-attr.html ) | disallow using deprecated ` place ` attribute (Removed in Vue I18n 9.0.0+) | |
13
13
| [ @intlify/vue-i18n /<wbr >no-html-messages] ( ./no-html-messages.html ) | disallow use HTML localization messages | :star : |
14
+ | [ @intlify/vue-i18n /<wbr >no-i18n-t-path-prop] ( ./no-i18n-t-path-prop.html ) | disallow using ` path ` prop with ` <i18n-t> ` | :black_nib : |
14
15
| [ @intlify/vue-i18n /<wbr >no-missing-keys] ( ./no-missing-keys.html ) | disallow missing locale message key at localization methods | :star : |
15
16
| [ @intlify/vue-i18n /<wbr >no-raw-text] ( ./no-raw-text.html ) | disallow to string literal in template or JSX | :star : |
16
17
| [ @intlify/vue-i18n /<wbr >no-v-html] ( ./no-v-html.html ) | disallow use of localization methods on v-html to prevent XSS attack | :star : |
Original file line number Diff line number Diff line change
1
+ ---
2
+ title : ' @intlify/vue-i18n/no-i18n-t-path-prop'
3
+ description : disallow using `path` prop with `<i18n-t>`
4
+ ---
5
+
6
+ # @intlify/vue-i18n /no-i18n-t-path-prop
7
+
8
+ > disallow using ` path ` prop with ` <i18n-t> `
9
+
10
+ - :black_nib : ️ The ` --fix ` option on the [ command line] ( http://eslint.org/docs/user-guide/command-line-interface#fix ) can automatically fix some of the problems reported by this rule.
11
+
12
+ You cannot use ` path ` prop with ` <i18n-t> ` component. Perhaps it's an old habit mistake.
13
+
14
+ ## :book : Rule Details
15
+
16
+ This rule reports use of ` path ` prop with ` <i18n-t> ` component.
17
+
18
+ :-1 : Examples of ** incorrect** code for this rule:
19
+
20
+ <eslint-code-block fix >
21
+
22
+ <!-- eslint-skip -->
23
+
24
+ ``` vue
25
+ <script>
26
+ /* eslint @intlify/vue-i18n/no-i18n-t-path-prop: 'error' */
27
+ </script>
28
+ <template>
29
+ <div class="app">
30
+ <!-- ✗ BAD -->
31
+ <i18n-t path="message.greeting" />
32
+ </div>
33
+ </template>
34
+ ```
35
+
36
+ </eslint-code-block >
37
+
38
+ :+1 : Examples of ** correct** code for this rule:
39
+
40
+ <eslint-code-block fix >
41
+
42
+ <!-- eslint-skip -->
43
+
44
+ ``` vue
45
+ <script>
46
+ /* eslint @intlify/vue-i18n/no-i18n-t-path-prop: 'error' */
47
+ </script>
48
+ <template>
49
+ <div class="app">
50
+ <!-- ✓ GOOD -->
51
+ <i18n-t keypath="message.greeting" />
52
+
53
+ <!-- ✓ GOOD -->
54
+ <i18n path="message.greeting" />
55
+ </div>
56
+ </template>
57
+ ```
58
+
59
+ </eslint-code-block >
60
+
61
+ ## :books : Further reading
62
+
63
+ - [ Vue I18n > Breaking Changes - Rename to ` keypath ` prop from ` path ` prop] ( https://vue-i18n.intlify.dev/guide/migration/breaking.html#rename-to-keypath-prop-from-path-prop )
64
+
65
+ ## :mag : Implementation
66
+
67
+ - [ Rule source] ( https://github.com/intlify/eslint-plugin-vue-i18n/blob/master/lib/rules/no-i18n-t-path-prop.ts )
68
+ - [ Test source] ( https://github.com/intlify/eslint-plugin-vue-i18n/tree/master/tests/lib/rules/no-i18n-t-path-prop.ts )
Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ import noDeprecatedI18nPlaceAttr from './rules/no-deprecated-i18n-place-attr'
5
5
import noDuplicateKeysInLocale from './rules/no-duplicate-keys-in-locale'
6
6
import noDynamicKeys from './rules/no-dynamic-keys'
7
7
import noHtmlMessages from './rules/no-html-messages'
8
+ import noI18nTPathProp from './rules/no-i18n-t-path-prop'
8
9
import noMissingKeysInOtherLocales from './rules/no-missing-keys-in-other-locales'
9
10
import noMissingKeys from './rules/no-missing-keys'
10
11
import noRawText from './rules/no-raw-text'
@@ -20,6 +21,7 @@ export = {
20
21
'no-duplicate-keys-in-locale' : noDuplicateKeysInLocale ,
21
22
'no-dynamic-keys' : noDynamicKeys ,
22
23
'no-html-messages' : noHtmlMessages ,
24
+ 'no-i18n-t-path-prop' : noI18nTPathProp ,
23
25
'no-missing-keys-in-other-locales' : noMissingKeysInOtherLocales ,
24
26
'no-missing-keys' : noMissingKeys ,
25
27
'no-raw-text' : noRawText ,
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @author Yosuke Ota
3
+ */
4
+ import {
5
+ defineTemplateBodyVisitor ,
6
+ getAttribute ,
7
+ getDirective
8
+ } from '../utils/index'
9
+ import type { RuleContext , RuleListener } from '../types'
10
+ import type { AST as VAST } from 'vue-eslint-parser'
11
+
12
+ function create ( context : RuleContext ) : RuleListener {
13
+ return defineTemplateBodyVisitor ( context , {
14
+ VElement ( node : VAST . VElement ) {
15
+ if ( node . name !== 'i18n-t' ) {
16
+ return
17
+ }
18
+ const pathProp =
19
+ getAttribute ( node , 'path' ) || getDirective ( node , 'bind' , 'path' )
20
+ if ( pathProp ) {
21
+ context . report ( {
22
+ node : pathProp . key ,
23
+ messageId : 'disallow' ,
24
+ fix ( fixer ) {
25
+ if ( pathProp . directive ) {
26
+ return fixer . replaceText ( pathProp . key . argument ! , 'keypath' )
27
+ } else {
28
+ return fixer . replaceText ( pathProp . key , 'keypath' )
29
+ }
30
+ }
31
+ } )
32
+ }
33
+ }
34
+ } )
35
+ }
36
+
37
+ export = {
38
+ meta : {
39
+ type : 'problem' ,
40
+ docs : {
41
+ description : 'disallow using `path` prop with `<i18n-t>`' ,
42
+ category : 'Recommended' ,
43
+ recommended : false
44
+ } ,
45
+ fixable : 'code' ,
46
+ schema : [ ] ,
47
+ messages : {
48
+ disallow :
49
+ 'Cannot use `path` prop with `<i18n-t>` component. Use `keypath` prop instead.'
50
+ }
51
+ } ,
52
+ create
53
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @author Yosuke Ota
3
+ */
4
+ import { RuleTester } from 'eslint'
5
+ import rule = require( '../../../lib/rules/no-i18n-t-path-prop' )
6
+
7
+ const tester = new RuleTester ( {
8
+ parser : require . resolve ( 'vue-eslint-parser' ) ,
9
+ parserOptions : { ecmaVersion : 2015 }
10
+ } )
11
+
12
+ tester . run ( 'no-i18n-t-path-prop' , rule as never , {
13
+ valid : [
14
+ {
15
+ code : `
16
+ <template>
17
+ <i18n-t keypath="message.greeting" />
18
+ </template>
19
+ `
20
+ } ,
21
+ {
22
+ code : `
23
+ <template>
24
+ <i18n path="message.greeting" />
25
+ </template>
26
+ `
27
+ }
28
+ ] ,
29
+ invalid : [
30
+ {
31
+ code : `
32
+ <template>
33
+ <i18n-t path="message.greeting" />
34
+ </template>
35
+ ` ,
36
+ output : `
37
+ <template>
38
+ <i18n-t keypath="message.greeting" />
39
+ </template>
40
+ ` ,
41
+ errors : [
42
+ {
43
+ message :
44
+ 'Cannot use `path` prop with `<i18n-t>` component. Use `keypath` prop instead.' ,
45
+ line : 3 ,
46
+ column : 17
47
+ }
48
+ ]
49
+ } ,
50
+ {
51
+ code : `
52
+ <template>
53
+ <i18n-t :path="messageKey" />
54
+ </template>
55
+ ` ,
56
+ output : `
57
+ <template>
58
+ <i18n-t :keypath="messageKey" />
59
+ </template>
60
+ ` ,
61
+ errors : [
62
+ {
63
+ message :
64
+ 'Cannot use `path` prop with `<i18n-t>` component. Use `keypath` prop instead.' ,
65
+ line : 3 ,
66
+ column : 17
67
+ }
68
+ ]
69
+ } ,
70
+ {
71
+ code : `
72
+ <template>
73
+ <i18n-t v-bind:path="messageKey" />
74
+ </template>
75
+ ` ,
76
+ output : `
77
+ <template>
78
+ <i18n-t v-bind:keypath="messageKey" />
79
+ </template>
80
+ ` ,
81
+ errors : [
82
+ {
83
+ message :
84
+ 'Cannot use `path` prop with `<i18n-t>` component. Use `keypath` prop instead.' ,
85
+ line : 3 ,
86
+ column : 17
87
+ }
88
+ ]
89
+ }
90
+ ]
91
+ } )
You can’t perform that action at this time.
0 commit comments