From 3c59cd06e8e57095c67444f57516bdde021ec2af Mon Sep 17 00:00:00 2001 From: ota Date: Thu, 31 Jan 2019 12:59:10 +0900 Subject: [PATCH] fix(require-default-prop, require-valid-default-prop): resolve the property name Fixed #776 --- lib/rules/require-default-prop.js | 4 +- lib/rules/require-valid-default-prop.js | 3 +- lib/utils/index.js | 7 ++- tests/lib/rules/require-default-prop.js | 51 +++++++++++++++++++ tests/lib/rules/require-valid-default-prop.js | 31 +++++++++++ 5 files changed, 92 insertions(+), 4 deletions(-) diff --git a/lib/rules/require-default-prop.js b/lib/rules/require-default-prop.js index 6520f5fd2..91dd90840 100644 --- a/lib/rules/require-default-prop.js +++ b/lib/rules/require-default-prop.js @@ -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 } }) } diff --git a/lib/rules/require-valid-default-prop.js b/lib/rules/require-valid-default-prop.js index 4880c3a6f..b1b938d6c 100644 --- a/lib/rules/require-valid-default-prop.js +++ b/lib/rules/require-valid-default-prop.js @@ -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() } }) diff --git a/lib/utils/index.js b/lib/utils/index.js index e2af0257f..870a24939 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -484,13 +484,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 } }) } diff --git a/tests/lib/rules/require-default-prop.js b/tests/lib/rules/require-default-prop.js index 43d88ed58..84aca170e 100644 --- a/tests/lib/rules/require-default-prop.js +++ b/tests/lib/rules/require-default-prop.js @@ -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 + }] } ] }) diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js index 4d434f2a8..dd9931cbe 100644 --- a/tests/lib/rules/require-valid-default-prop.js +++ b/tests/lib/rules/require-valid-default-prop.js @@ -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 + }] } ] })