Skip to content

Commit 9ca878f

Browse files
New: Add vue/name-property-required rule
1 parent 0faf4c7 commit 9ca878f

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

Diff for: lib/rules/name-property-required.js

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* @fileoverview Require a name property in Vue components
3+
* @author LukeeeeBennett
4+
*/
5+
'use strict'
6+
7+
const utils = require('../utils')
8+
9+
function isNameProperty (node) {
10+
return node.type === 'Property' && node.key.name === 'name'
11+
}
12+
13+
function hasTruthyLiteralValue (node) {
14+
return node.value.type === 'Literal' && node.value.value
15+
}
16+
17+
module.exports = {
18+
meta: {
19+
type: 'suggestion',
20+
docs: {
21+
description: 'require a name property in Vue components',
22+
category: undefined,
23+
url: 'https://eslint.vuejs.org/rules/name-property-required.html'
24+
},
25+
fixable: null,
26+
schema: []
27+
},
28+
29+
create (context) {
30+
return utils.executeOnVue(context, component => {
31+
const isValid = component.properties.some(property => {
32+
return isNameProperty(property) &&
33+
hasTruthyLiteralValue(property)
34+
})
35+
36+
if (isValid) return
37+
38+
context.report({
39+
node: component,
40+
message: 'Required name property is undefined.'
41+
})
42+
})
43+
}
44+
}

Diff for: tests/lib/rules/name-property-required.js

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/**
2+
* @fileoverview Require a name property in Vue components
3+
* @author LukeeeeBennett
4+
*/
5+
'use strict'
6+
7+
const rule = require('../../../lib/rules/name-property-required')
8+
const RuleTester = require('eslint').RuleTester
9+
10+
const parserOptions = {
11+
ecmaVersion: 2018,
12+
sourceType: 'module'
13+
}
14+
15+
const ruleTester = new RuleTester()
16+
ruleTester.run('name-property-required', rule, {
17+
18+
valid: [
19+
{
20+
filename: 'ValidComponent.vue',
21+
code: `
22+
export default {
23+
name: 'IssaName'
24+
}
25+
`,
26+
parserOptions
27+
}
28+
],
29+
30+
invalid: [
31+
{
32+
filename: 'InvalidComponent.vue',
33+
code: `
34+
export default {
35+
}
36+
`,
37+
parserOptions,
38+
errors: [{
39+
message: 'Required name property is undefined.',
40+
type: 'ObjectExpression'
41+
}]
42+
},
43+
{
44+
filename: 'InvalidComponent.vue',
45+
code: `
46+
export default {
47+
nameNot: 'IssaNameNot'
48+
}
49+
`,
50+
parserOptions,
51+
errors: [{
52+
message: 'Required name property is undefined.',
53+
type: 'ObjectExpression'
54+
}]
55+
},
56+
{
57+
filename: 'InvalidComponent.vue',
58+
code: `
59+
export default {
60+
name: ''
61+
}
62+
`,
63+
parserOptions,
64+
errors: [{
65+
message: 'Required name property is undefined.',
66+
type: 'ObjectExpression'
67+
}]
68+
},
69+
{
70+
filename: 'InvalidComponent.vue',
71+
code: `
72+
export default {
73+
name: undefined
74+
}
75+
`,
76+
parserOptions,
77+
errors: [{
78+
message: 'Required name property is undefined.',
79+
type: 'ObjectExpression'
80+
}]
81+
},
82+
{
83+
filename: 'InvalidComponent.vue',
84+
code: `
85+
export default {
86+
name: null
87+
}
88+
`,
89+
parserOptions,
90+
errors: [{
91+
message: 'Required name property is undefined.',
92+
type: 'ObjectExpression'
93+
}]
94+
}
95+
]
96+
})

0 commit comments

Comments
 (0)