Skip to content

Commit

Permalink
Fix: fix for computed property names (fixes #776) (#791)
Browse files Browse the repository at this point in the history
  • Loading branch information
ota-meshi authored and mysticatea committed Feb 14, 2019
1 parent b1699ce commit 28b7d9c
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 4 deletions.
4 changes: 3 additions & 1 deletion lib/rules/require-default-prop.js
Expand Up @@ -141,11 +141,13 @@ module.exports = {
const propsToReport = excludeBooleanProps(propsWithoutDefault)

for (const prop of propsToReport) {
const propName = prop.propName != null ? prop.propName : `[${context.getSourceCode().getText(prop.key)}]`

context.report({
node: prop.node,
message: `Prop '{{propName}}' requires default value to be set.`,
data: {
propName: prop.key.name
propName
}
})
}
Expand Down
3 changes: 2 additions & 1 deletion lib/rules/require-valid-default-prop.js
Expand Up @@ -109,11 +109,12 @@ module.exports = {
const defType = getValueType(def.value)
if (!defType || typeNames.has(defType)) continue

const propName = prop.propName != null ? prop.propName : `[${context.getSourceCode().getText(prop.key)}]`
context.report({
node: def,
message: "Type of the default value for '{{name}}' prop must be a {{types}}.",
data: {
name: prop.key.name,
name: propName,
types: Array.from(typeNames).join(' or ').toLowerCase()
}
})
Expand Down
7 changes: 5 additions & 2 deletions lib/utils/index.js
Expand Up @@ -485,13 +485,16 @@ module.exports = {
props = propsNode.value.properties
.filter(prop => prop.type === 'Property')
.map(prop => {
return { key: prop.key, value: this.unwrapTypes(prop.value), node: prop }
return {
key: prop.key, value: this.unwrapTypes(prop.value), node: prop,
propName: this.getStaticPropertyName(prop)
}
})
} else {
props = propsNode.value.elements
.map(prop => {
const key = prop.type === 'Literal' && typeof prop.value === 'string' ? prop : null
return { key, value: null, node: prop }
return { key, value: null, node: prop, propName: key != null ? prop.value : null }
})
}

Expand Down
51 changes: 51 additions & 0 deletions tests/lib/rules/require-default-prop.js
Expand Up @@ -231,6 +231,57 @@ ruleTester.run('require-default-prop', rule, {
message: `Prop 'a' requires default value to be set.`,
line: 4
}]
},

// computed propertys
{
filename: 'test.vue',
code: `
export default {
props: {
a: String,
'b': String,
['c']: String,
[\`d\`]: String,
}
};
`,
errors: [{
message: `Prop 'a' requires default value to be set.`,
line: 4
}, {
message: `Prop 'b' requires default value to be set.`,
line: 5
}, {
message: `Prop 'c' requires default value to be set.`,
line: 6
}, {
message: `Prop 'd' requires default value to be set.`,
line: 7
}]
},
// unknown static name
{
filename: 'test.vue',
code: `
export default {
props: {
[foo]: String,
[bar()]: String,
[baz.baz]: String,
}
};
`,
errors: [{
message: `Prop '[foo]' requires default value to be set.`,
line: 4
}, {
message: `Prop '[bar()]' requires default value to be set.`,
line: 5
}, {
message: `Prop '[baz.baz]' requires default value to be set.`,
line: 6
}]
}
]
})
31 changes: 31 additions & 0 deletions tests/lib/rules/require-valid-default-prop.js
Expand Up @@ -444,6 +444,37 @@ ruleTester.run('require-valid-default-prop', rule, {
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
parser: 'typescript-eslint-parser',
errors: errorMessage('function or number')
},

{
filename: 'test.vue',
code: `export default {
props: {
'foo': {
type: Object,
default: ''
},
['bar']: {
type: Object,
default: ''
},
[baz]: {
type: Object,
default: ''
}
}
}`,
parserOptions,
errors: [{
message: `Type of the default value for 'foo' prop must be a function.`,
line: 5
}, {
message: `Type of the default value for 'bar' prop must be a function.`,
line: 9
}, {
message: `Type of the default value for '[baz]' prop must be a function.`,
line: 13
}]
}
]
})

0 comments on commit 28b7d9c

Please sign in to comment.