Skip to content

Commit 964475a

Browse files
Rename to require-name-property, remove literal value assertion, add docs
1 parent 9ca878f commit 964475a

File tree

3 files changed

+76
-34
lines changed

3 files changed

+76
-34
lines changed

Diff for: docs/rules/require-name-property.md

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
---
2+
pageClass: rule-details
3+
sidebarDepth: 0
4+
title: vue/require-name-property
5+
description: require a component name property
6+
---
7+
# vue/require-name-property
8+
> require a component name property
9+
10+
## :book: Rule Details
11+
12+
This rule requires a `name` property to be set on components.
13+
14+
<eslint-code-block :rules="{'vue/require-name-property': ['error']}">
15+
16+
```vue
17+
<script>
18+
/* ✓ GOOD */
19+
export default {
20+
name: 'OurButton'
21+
}
22+
23+
/* ✗ BAD */
24+
export default {
25+
}
26+
27+
/* ✗ BAD */
28+
export default {
29+
notName: 'OurButton'
30+
}
31+
</script>
32+
```
33+
34+
</eslint-code-block>
35+
36+
## :wrench: Options
37+
38+
Nothing.
39+
40+
## :mag: Implementation
41+
42+
- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/require-name-property.js)
43+
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/require-name-property.js)

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

+6-13
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
const utils = require('../utils')
88

99
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
10+
return node.type === 'Property' &&
11+
node.key.name === 'name' &&
12+
!node.computed
1513
}
1614

1715
module.exports = {
@@ -20,24 +18,19 @@ module.exports = {
2018
docs: {
2119
description: 'require a name property in Vue components',
2220
category: undefined,
23-
url: 'https://eslint.vuejs.org/rules/name-property-required.html'
21+
url: 'https://eslint.vuejs.org/rules/require-name-property.html'
2422
},
2523
fixable: null,
2624
schema: []
2725
},
2826

2927
create (context) {
3028
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
29+
if (component.properties.some(isNameProperty)) return
3730

3831
context.report({
3932
node: component,
40-
message: 'Required name property is undefined.'
33+
message: 'Required name property is not set.'
4134
})
4235
})
4336
}

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

+27-21
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55
'use strict'
66

7-
const rule = require('../../../lib/rules/name-property-required')
7+
const rule = require('../../../lib/rules/require-name-property')
88
const RuleTester = require('eslint').RuleTester
99

1010
const parserOptions = {
@@ -13,8 +13,7 @@ const parserOptions = {
1313
}
1414

1515
const ruleTester = new RuleTester()
16-
ruleTester.run('name-property-required', rule, {
17-
16+
ruleTester.run('require-name-property', rule, {
1817
valid: [
1918
{
2019
filename: 'ValidComponent.vue',
@@ -24,71 +23,78 @@ ruleTester.run('name-property-required', rule, {
2423
}
2524
`,
2625
parserOptions
27-
}
28-
],
29-
30-
invalid: [
26+
},
3127
{
32-
filename: 'InvalidComponent.vue',
28+
filename: 'ValidComponent.vue',
3329
code: `
3430
export default {
31+
name: undefined
3532
}
3633
`,
37-
parserOptions,
38-
errors: [{
39-
message: 'Required name property is undefined.',
40-
type: 'ObjectExpression'
41-
}]
34+
parserOptions
4235
},
36+
{
37+
filename: 'ValidComponent.vue',
38+
code: `
39+
export default {
40+
name: ''
41+
}
42+
`,
43+
parserOptions
44+
}
45+
],
46+
47+
invalid: [
4348
{
4449
filename: 'InvalidComponent.vue',
4550
code: `
4651
export default {
47-
nameNot: 'IssaNameNot'
4852
}
4953
`,
5054
parserOptions,
5155
errors: [{
52-
message: 'Required name property is undefined.',
56+
message: 'Required name property is not set.',
5357
type: 'ObjectExpression'
5458
}]
5559
},
5660
{
5761
filename: 'InvalidComponent.vue',
5862
code: `
5963
export default {
60-
name: ''
64+
nameNot: 'IssaNameNot'
6165
}
6266
`,
6367
parserOptions,
6468
errors: [{
65-
message: 'Required name property is undefined.',
69+
message: 'Required name property is not set.',
6670
type: 'ObjectExpression'
6771
}]
6872
},
6973
{
7074
filename: 'InvalidComponent.vue',
7175
code: `
7276
export default {
73-
name: undefined
77+
computed: {
78+
name() { return 'name' }
79+
}
7480
}
7581
`,
7682
parserOptions,
7783
errors: [{
78-
message: 'Required name property is undefined.',
84+
message: 'Required name property is not set.',
7985
type: 'ObjectExpression'
8086
}]
8187
},
8288
{
8389
filename: 'InvalidComponent.vue',
8490
code: `
8591
export default {
86-
name: null
92+
[name]: 'IssaName'
8793
}
8894
`,
8995
parserOptions,
9096
errors: [{
91-
message: 'Required name property is undefined.',
97+
message: 'Required name property is not set.',
9298
type: 'ObjectExpression'
9399
}]
94100
}

0 commit comments

Comments
 (0)