Skip to content

Commit 28b7d9c

Browse files
ota-meshimysticatea
authored andcommitted
Fix: fix for computed property names (fixes #776) (#791)
1 parent b1699ce commit 28b7d9c

File tree

5 files changed

+92
-4
lines changed

5 files changed

+92
-4
lines changed

lib/rules/require-default-prop.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,13 @@ module.exports = {
141141
const propsToReport = excludeBooleanProps(propsWithoutDefault)
142142

143143
for (const prop of propsToReport) {
144+
const propName = prop.propName != null ? prop.propName : `[${context.getSourceCode().getText(prop.key)}]`
145+
144146
context.report({
145147
node: prop.node,
146148
message: `Prop '{{propName}}' requires default value to be set.`,
147149
data: {
148-
propName: prop.key.name
150+
propName
149151
}
150152
})
151153
}

lib/rules/require-valid-default-prop.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,12 @@ module.exports = {
109109
const defType = getValueType(def.value)
110110
if (!defType || typeNames.has(defType)) continue
111111

112+
const propName = prop.propName != null ? prop.propName : `[${context.getSourceCode().getText(prop.key)}]`
112113
context.report({
113114
node: def,
114115
message: "Type of the default value for '{{name}}' prop must be a {{types}}.",
115116
data: {
116-
name: prop.key.name,
117+
name: propName,
117118
types: Array.from(typeNames).join(' or ').toLowerCase()
118119
}
119120
})

lib/utils/index.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -485,13 +485,16 @@ module.exports = {
485485
props = propsNode.value.properties
486486
.filter(prop => prop.type === 'Property')
487487
.map(prop => {
488-
return { key: prop.key, value: this.unwrapTypes(prop.value), node: prop }
488+
return {
489+
key: prop.key, value: this.unwrapTypes(prop.value), node: prop,
490+
propName: this.getStaticPropertyName(prop)
491+
}
489492
})
490493
} else {
491494
props = propsNode.value.elements
492495
.map(prop => {
493496
const key = prop.type === 'Literal' && typeof prop.value === 'string' ? prop : null
494-
return { key, value: null, node: prop }
497+
return { key, value: null, node: prop, propName: key != null ? prop.value : null }
495498
})
496499
}
497500

tests/lib/rules/require-default-prop.js

+51
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,57 @@ ruleTester.run('require-default-prop', rule, {
231231
message: `Prop 'a' requires default value to be set.`,
232232
line: 4
233233
}]
234+
},
235+
236+
// computed propertys
237+
{
238+
filename: 'test.vue',
239+
code: `
240+
export default {
241+
props: {
242+
a: String,
243+
'b': String,
244+
['c']: String,
245+
[\`d\`]: String,
246+
}
247+
};
248+
`,
249+
errors: [{
250+
message: `Prop 'a' requires default value to be set.`,
251+
line: 4
252+
}, {
253+
message: `Prop 'b' requires default value to be set.`,
254+
line: 5
255+
}, {
256+
message: `Prop 'c' requires default value to be set.`,
257+
line: 6
258+
}, {
259+
message: `Prop 'd' requires default value to be set.`,
260+
line: 7
261+
}]
262+
},
263+
// unknown static name
264+
{
265+
filename: 'test.vue',
266+
code: `
267+
export default {
268+
props: {
269+
[foo]: String,
270+
[bar()]: String,
271+
[baz.baz]: String,
272+
}
273+
};
274+
`,
275+
errors: [{
276+
message: `Prop '[foo]' requires default value to be set.`,
277+
line: 4
278+
}, {
279+
message: `Prop '[bar()]' requires default value to be set.`,
280+
line: 5
281+
}, {
282+
message: `Prop '[baz.baz]' requires default value to be set.`,
283+
line: 6
284+
}]
234285
}
235286
]
236287
})

tests/lib/rules/require-valid-default-prop.js

+31
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,37 @@ ruleTester.run('require-valid-default-prop', rule, {
444444
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
445445
parser: 'typescript-eslint-parser',
446446
errors: errorMessage('function or number')
447+
},
448+
449+
{
450+
filename: 'test.vue',
451+
code: `export default {
452+
props: {
453+
'foo': {
454+
type: Object,
455+
default: ''
456+
},
457+
['bar']: {
458+
type: Object,
459+
default: ''
460+
},
461+
[baz]: {
462+
type: Object,
463+
default: ''
464+
}
465+
}
466+
}`,
467+
parserOptions,
468+
errors: [{
469+
message: `Type of the default value for 'foo' prop must be a function.`,
470+
line: 5
471+
}, {
472+
message: `Type of the default value for 'bar' prop must be a function.`,
473+
line: 9
474+
}, {
475+
message: `Type of the default value for '[baz]' prop must be a function.`,
476+
line: 13
477+
}]
447478
}
448479
]
449480
})

0 commit comments

Comments
 (0)