Skip to content

Commit

Permalink
Rename to require-name-property, remove literal value assertion, ad…
Browse files Browse the repository at this point in the history
…d docs
  • Loading branch information
lbennett-stacki committed Sep 4, 2019
1 parent 9ca878f commit 2669078
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 34 deletions.
44 changes: 44 additions & 0 deletions docs/rules/require-name-property.md
@@ -0,0 +1,44 @@
---
pageClass: rule-details
sidebarDepth: 0
title: vue/require-name-property
description: require a component name property
---
# vue/require-name-property
> require a component name property
## :book: Rule Details

This rule requires a `name` property to be set on components.

<eslint-code-block :rules="{'vue/require-name-property': ['error']}">

```vue
<script>
/* ✓ GOOD */
export default {
name: 'OurButton'
}
/* ✗ BAD */
export default {
name: 'OurButton'
}
/* ✗ BAD */
export default {
notName: 'OurButton'
}
</script>
```

</eslint-code-block>

## :wrench: Options

Nothing.

## :mag: Implementation

- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/require-name-property.js)
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/require-name-property.js)
Expand Up @@ -7,11 +7,9 @@
const utils = require('../utils')

function isNameProperty (node) {
return node.type === 'Property' && node.key.name === 'name'
}

function hasTruthyLiteralValue (node) {
return node.value.type === 'Literal' && node.value.value
return node.type === 'Property' &&
node.key.name === 'name' &&
!node.computed
}

module.exports = {
Expand All @@ -20,24 +18,19 @@ module.exports = {
docs: {
description: 'require a name property in Vue components',
category: undefined,
url: 'https://eslint.vuejs.org/rules/name-property-required.html'
url: 'https://eslint.vuejs.org/rules/require-name-property.html'
},
fixable: null,
schema: []
},

create (context) {
return utils.executeOnVue(context, component => {
const isValid = component.properties.some(property => {
return isNameProperty(property) &&
hasTruthyLiteralValue(property)
})

if (isValid) return
if (component.properties.some(isNameProperty)) return

context.report({
node: component,
message: 'Required name property is undefined.'
message: 'Required name property is not set.'
})
})
}
Expand Down
Expand Up @@ -4,7 +4,7 @@
*/
'use strict'

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

const parserOptions = {
Expand All @@ -13,8 +13,7 @@ const parserOptions = {
}

const ruleTester = new RuleTester()
ruleTester.run('name-property-required', rule, {

ruleTester.run('require-name-property', rule, {
valid: [
{
filename: 'ValidComponent.vue',
Expand All @@ -24,71 +23,78 @@ ruleTester.run('name-property-required', rule, {
}
`,
parserOptions
}
],

invalid: [
},
{
filename: 'InvalidComponent.vue',
filename: 'ValidComponent.vue',
code: `
export default {
name: undefined
}
`,
parserOptions,
errors: [{
message: 'Required name property is undefined.',
type: 'ObjectExpression'
}]
parserOptions
},
{
filename: 'ValidComponent.vue',
code: `
export default {
name: ''
}
`,
parserOptions
}
],

invalid: [
{
filename: 'InvalidComponent.vue',
code: `
export default {
nameNot: 'IssaNameNot'
}
`,
parserOptions,
errors: [{
message: 'Required name property is undefined.',
message: 'Required name property is not set.',
type: 'ObjectExpression'
}]
},
{
filename: 'InvalidComponent.vue',
code: `
export default {
name: ''
nameNot: 'IssaNameNot'
}
`,
parserOptions,
errors: [{
message: 'Required name property is undefined.',
message: 'Required name property is not set.',
type: 'ObjectExpression'
}]
},
{
filename: 'InvalidComponent.vue',
code: `
export default {
name: undefined
computed: {
name() { return 'name' }
}
}
`,
parserOptions,
errors: [{
message: 'Required name property is undefined.',
message: 'Required name property is not set.',
type: 'ObjectExpression'
}]
},
{
filename: 'InvalidComponent.vue',
code: `
export default {
name: null
[name]: 'IssaName'
}
`,
parserOptions,
errors: [{
message: 'Required name property is undefined.',
message: 'Required name property is not set.',
type: 'ObjectExpression'
}]
}
Expand Down

0 comments on commit 2669078

Please sign in to comment.