From 036079a4ef95a30ab9d74425cdf4f0b3d3f49697 Mon Sep 17 00:00:00 2001 From: ota Date: Wed, 3 Jun 2020 22:24:38 +0900 Subject: [PATCH] Improved to not report that a value is required when parsing error, for `vue/valid-v-bind-sync`, `vue/valid-v-bind`, `vue/valid-v-else-if`, `vue/valid-v-for`, `vue/valid-v-html`, `vue/valid-v-if`, `vue/valid-v-model`, `vue/valid-v-on`, `vue/valid-v-show`, `vue/valid-v-slot` and `vue/valid-v-text` rules. --- lib/rules/valid-v-bind-sync.js | 45 +++++++++-------- lib/rules/valid-v-bind.js | 2 +- lib/rules/valid-v-else-if.js | 2 +- lib/rules/valid-v-else.js | 2 +- lib/rules/valid-v-for.js | 2 +- lib/rules/valid-v-html.js | 2 +- lib/rules/valid-v-if.js | 2 +- lib/rules/valid-v-model.js | 52 ++++++++++---------- lib/rules/valid-v-on.js | 30 ++++++++---- lib/rules/valid-v-show.js | 2 +- lib/rules/valid-v-slot.js | 4 +- lib/rules/valid-v-text.js | 2 +- lib/utils/index.js | 73 +++++++++++++++++++++++++--- tests/lib/rules/valid-v-bind-sync.js | 15 ++++++ tests/lib/rules/valid-v-bind.js | 16 ++++++ tests/lib/rules/valid-v-cloak.js | 18 +++++++ tests/lib/rules/valid-v-else-if.js | 19 ++++++++ tests/lib/rules/valid-v-else.js | 19 ++++++++ tests/lib/rules/valid-v-for.js | 27 +++++++--- tests/lib/rules/valid-v-html.js | 16 ++++++ tests/lib/rules/valid-v-if.js | 16 ++++++ tests/lib/rules/valid-v-model.js | 16 ++++++ tests/lib/rules/valid-v-on.js | 35 +++++++++++++ tests/lib/rules/valid-v-once.js | 18 +++++++ tests/lib/rules/valid-v-pre.js | 18 +++++++ tests/lib/rules/valid-v-show.js | 13 ++++- tests/lib/rules/valid-v-slot.js | 28 ++++++++++- tests/lib/rules/valid-v-text.js | 16 ++++++ 28 files changed, 426 insertions(+), 84 deletions(-) diff --git a/lib/rules/valid-v-bind-sync.js b/lib/rules/valid-v-bind-sync.js index 9d24442ac..6b9225308 100644 --- a/lib/rules/valid-v-bind-sync.js +++ b/lib/rules/valid-v-bind-sync.js @@ -37,10 +37,7 @@ function isValidElement(node) { * @returns {boolean} `true` if the node can be LHS. */ function isLhs(node) { - return ( - Boolean(node) && - (node.type === 'Identifier' || node.type === 'MemberExpression') - ) + return node.type === 'Identifier' || node.type === 'MemberExpression' } // ------------------------------------------------------------------------------ @@ -85,30 +82,32 @@ module.exports = { }) } - if (node.value) { - if (!isLhs(node.value.expression)) { + if (!node.value || !node.value.expression) { + return + } + + if (!isLhs(node.value.expression)) { + context.report({ + node, + loc: node.loc, + messageId: 'unexpectedNonLhsExpression' + }) + } + + for (const reference of node.value.references) { + const id = reference.id + if (id.parent.type !== 'VExpressionContainer') { + continue + } + const variable = reference.variable + if (variable) { context.report({ node, loc: node.loc, - messageId: 'unexpectedNonLhsExpression' + messageId: 'unexpectedUpdateIterationVariable', + data: { varName: id.name } }) } - - for (const reference of node.value.references) { - const id = reference.id - if (id.parent.type !== 'VExpressionContainer') { - continue - } - const variable = reference.variable - if (variable) { - context.report({ - node, - loc: node.loc, - messageId: 'unexpectedUpdateIterationVariable', - data: { varName: id.name } - }) - } - } } } }) diff --git a/lib/rules/valid-v-bind.js b/lib/rules/valid-v-bind.js index dfb1f97e2..7d88bad38 100644 --- a/lib/rules/valid-v-bind.js +++ b/lib/rules/valid-v-bind.js @@ -48,7 +48,7 @@ module.exports = { } } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-else-if.js b/lib/rules/valid-v-else-if.js index b68caa746..59252855b 100644 --- a/lib/rules/valid-v-else-if.js +++ b/lib/rules/valid-v-else-if.js @@ -70,7 +70,7 @@ module.exports = { message: "'v-else-if' directives require no modifier." }) } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-else.js b/lib/rules/valid-v-else.js index 3379fa326..2479f467e 100644 --- a/lib/rules/valid-v-else.js +++ b/lib/rules/valid-v-else.js @@ -70,7 +70,7 @@ module.exports = { message: "'v-else' directives require no modifier." }) } - if (utils.hasAttributeValue(node)) { + if (node.value) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-for.js b/lib/rules/valid-v-for.js index 681a5dcf1..443afc2d0 100644 --- a/lib/rules/valid-v-for.js +++ b/lib/rules/valid-v-for.js @@ -137,7 +137,7 @@ module.exports = { message: "'v-for' directives require no modifier." }) } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-html.js b/lib/rules/valid-v-html.js index 1bc1fcb2b..575939a2a 100644 --- a/lib/rules/valid-v-html.js +++ b/lib/rules/valid-v-html.js @@ -44,7 +44,7 @@ module.exports = { message: "'v-html' directives require no modifier." }) } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-if.js b/lib/rules/valid-v-if.js index 6c24cabc9..c07ae2c81 100644 --- a/lib/rules/valid-v-if.js +++ b/lib/rules/valid-v-if.js @@ -62,7 +62,7 @@ module.exports = { message: "'v-if' directives require no modifier." }) } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-model.js b/lib/rules/valid-v-model.js index 7dc22a4d7..0c7431c05 100644 --- a/lib/rules/valid-v-model.js +++ b/lib/rules/valid-v-model.js @@ -42,10 +42,7 @@ function isValidElement(node) { * @returns {boolean} `true` if the node can be LHS. */ function isLhs(node) { - return ( - node != null && - (node.type === 'Identifier' || node.type === 'MemberExpression') - ) + return node.type === 'Identifier' || node.type === 'MemberExpression' } /** @@ -133,40 +130,43 @@ module.exports = { } } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, message: "'v-model' directives require that attribute value." }) + return + } + if (!node.value.expression) { + // Parsing error + return } - if (node.value) { - if (!isLhs(node.value.expression)) { + if (!isLhs(node.value.expression)) { + context.report({ + node, + loc: node.loc, + message: + "'v-model' directives require the attribute value which is valid as LHS." + }) + } + + for (const reference of node.value.references) { + const id = reference.id + if (id.parent.type !== 'VExpressionContainer') { + continue + } + + const variable = getVariable(id.name, element) + if (variable != null) { context.report({ node, loc: node.loc, message: - "'v-model' directives require the attribute value which is valid as LHS." + "'v-model' directives cannot update the iteration variable '{{varName}}' itself.", + data: { varName: id.name } }) } - - for (const reference of node.value.references) { - const id = reference.id - if (id.parent.type !== 'VExpressionContainer') { - continue - } - - const variable = getVariable(id.name, element) - if (variable != null) { - context.report({ - node, - loc: node.loc, - message: - "'v-model' directives cannot update the iteration variable '{{varName}}' itself.", - data: { varName: id.name } - }) - } - } } } }) diff --git a/lib/rules/valid-v-on.js b/lib/rules/valid-v-on.js index 4e014e00c..bcdb76db0 100644 --- a/lib/rules/valid-v-on.js +++ b/lib/rules/valid-v-on.js @@ -108,20 +108,30 @@ module.exports = { } if ( - !utils.hasAttributeValue(node) && + (!node.value || !node.value.expression) && !node.key.modifiers.some((modifier) => VERB_MODIFIERS.has(modifier.name) ) ) { - if (node.value && sourceCode.getText(node.value.expression)) { - const value = sourceCode.getText(node.value) - context.report({ - node, - loc: node.loc, - message: - 'Avoid using JavaScript keyword as "v-on" value: {{value}}.', - data: { value } - }) + if (node.value && !utils.isEmptyValueDirective(node, context)) { + const valueText = sourceCode.getText(node.value) + let innerText = valueText + if ( + (valueText[0] === '"' || valueText[0] === "'") && + valueText[0] === valueText[valueText.length - 1] + ) { + // quoted + innerText = valueText.slice(1, -1) + } + if (/^\w+$/.test(innerText)) { + context.report({ + node, + loc: node.loc, + message: + 'Avoid using JavaScript keyword as "v-on" value: {{value}}.', + data: { value: valueText } + }) + } } else { context.report({ node, diff --git a/lib/rules/valid-v-show.js b/lib/rules/valid-v-show.js index 51e4014fd..71553722c 100644 --- a/lib/rules/valid-v-show.js +++ b/lib/rules/valid-v-show.js @@ -44,7 +44,7 @@ module.exports = { message: "'v-show' directives require no modifier." }) } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/rules/valid-v-slot.js b/lib/rules/valid-v-slot.js index 79b052269..118dc8463 100644 --- a/lib/rules/valid-v-slot.js +++ b/lib/rules/valid-v-slot.js @@ -264,7 +264,9 @@ module.exports = { if ( ownerElement === element && isDefaultSlot && - !utils.hasAttributeValue(node) + (!node.value || + utils.isEmptyValueDirective(node, context) || + utils.isEmptyExpressionValueDirective(node, context)) ) { context.report({ node, diff --git a/lib/rules/valid-v-text.js b/lib/rules/valid-v-text.js index 2e1881ce3..f0a3f09fa 100644 --- a/lib/rules/valid-v-text.js +++ b/lib/rules/valid-v-text.js @@ -44,7 +44,7 @@ module.exports = { message: "'v-text' directives require no modifier." }) } - if (!utils.hasAttributeValue(node)) { + if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, loc: node.loc, diff --git a/lib/utils/index.js b/lib/utils/index.js index 43c919f88..b61b52926 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -290,16 +290,73 @@ module.exports = { }, /** - * Check whether the given attribute has their attribute value. - * @param {ASTNode} node The attribute node to check. - * @returns {boolean} `true` if the attribute has their value. + * Check whether the given directive attribute has their empty value (`=""`). + * @param {ASTNode} node The directive attribute node to check. + * @param {RuleContext} context The rule context to use parser services. + * @returns {boolean} `true` if the directive attribute has their empty value (`=""`). */ - hasAttributeValue (node) { + isEmptyValueDirective (node, context) { assert(node && node.type === 'VAttribute') - return ( - node.value != null && - (node.value.expression != null || node.value.syntaxError != null) - ) + if (node.value == null) { + return false + } + if (node.value.expression != null) { + return false + } + + let valueText = context.getSourceCode().getText(node.value) + if ((valueText[0] === '"' || valueText[0] === "'") && valueText[0] === valueText[valueText.length - 1]) { + // quoted + valueText = valueText.slice(1, -1) + } + if (!valueText) { + // empty + return true + } + return false + }, + + /** + * Check whether the given directive attribute has their empty expression value (e.g. `=" "`, `="/* */"`). + * @param {ASTNode} node The directive attribute node to check. + * @param {RuleContext} context The rule context to use parser services. + * @returns {boolean} `true` if the directive attribute has their empty expression value. + */ + isEmptyExpressionValueDirective (node, context) { + assert(node && node.type === 'VAttribute') + if (node.value == null) { + return false + } + if (node.value.expression != null) { + return false + } + + const valueNode = node.value + const tokenStore = context.parserServices.getTemplateBodyTokenStore() + let quote1 = null + let quote2 = null + // `node.value` may be only comments, so cannot get the correct tokens with `tokenStore.getTokens(node.value)`. + for (const token of tokenStore.getTokens(node)) { + if (token.range[1] <= valueNode.range[0]) { + continue + } + if (valueNode.range[1] <= token.range[0]) { + // empty + return true + } + if (!quote1 && token.type === 'Punctuator' && (token.value === '"' || token.value === "'")) { + quote1 = token + continue + } + if (!quote2 && quote1 && token.type === 'Punctuator' && (token.value === quote1.value)) { + quote2 = token + continue + } + // not empty + return false + } + // empty + return true }, /** diff --git a/tests/lib/rules/valid-v-bind-sync.js b/tests/lib/rules/valid-v-bind-sync.js index 385f5d991..ea8bdf333 100644 --- a/tests/lib/rules/valid-v-bind-sync.js +++ b/tests/lib/rules/valid-v-bind-sync.js @@ -130,6 +130,21 @@ tester.run('valid-v-bind-sync', rule, { { filename: 'test.vue', code: '' + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' + }, + // empty value (valid-v-bind) + { + filename: 'empty-value.vue', + code: '' } ], invalid: [ diff --git a/tests/lib/rules/valid-v-bind.js b/tests/lib/rules/valid-v-bind.js index d98ff34d7..b5e71af7c 100644 --- a/tests/lib/rules/valid-v-bind.js +++ b/tests/lib/rules/valid-v-bind.js @@ -74,6 +74,16 @@ tester.run('valid-v-bind', rule, { { filename: 'test.vue', code: "" + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' } ], invalid: [ @@ -91,6 +101,12 @@ tester.run('valid-v-bind', rule, { filename: 'test.vue', code: "", errors: ["'v-bind' directives don't support the modifier 'unknown'."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-bind' directives require an attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-cloak.js b/tests/lib/rules/valid-v-cloak.js index 8a8a0acad..abecacba4 100644 --- a/tests/lib/rules/valid-v-cloak.js +++ b/tests/lib/rules/valid-v-cloak.js @@ -47,6 +47,24 @@ tester.run('valid-v-cloak', rule, { filename: 'test.vue', code: '', errors: ["'v-cloak' directives require no attribute value."] + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '', + errors: ["'v-cloak' directives require no attribute value."] + }, + // comment value + { + filename: 'comment-value.vue', + code: '', + errors: ["'v-cloak' directives require no attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-cloak' directives require no attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-else-if.js b/tests/lib/rules/valid-v-else-if.js index 778d07339..e9f05d1e2 100644 --- a/tests/lib/rules/valid-v-else-if.js +++ b/tests/lib/rules/valid-v-else-if.js @@ -40,6 +40,18 @@ tester.run('valid-v-else-if', rule, { { filename: 'test.vue', code: `` + }, + // parsing error + { + filename: 'parsing-error.vue', + code: + '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: + '' } ], invalid: [ @@ -122,6 +134,13 @@ tester.run('valid-v-else-if', rule, { code: '', errors: ["'v-else-if' directives require that attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: + '', + errors: ["'v-else-if' directives require that attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-else.js b/tests/lib/rules/valid-v-else.js index 1e235f9b5..31b067861 100644 --- a/tests/lib/rules/valid-v-else.js +++ b/tests/lib/rules/valid-v-else.js @@ -120,6 +120,25 @@ tester.run('valid-v-else', rule, { code: '', errors: ["'v-else' directives require no attribute value."] + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '', + errors: ["'v-else' directives require no attribute value."] + }, + // comment value + { + filename: 'comment-value.vue', + code: + '', + errors: ["'v-else' directives require no attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-else' directives require no attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-for.js b/tests/lib/rules/valid-v-for.js index 74a1ea614..94fa43467 100644 --- a/tests/lib/rules/valid-v-for.js +++ b/tests/lib/rules/valid-v-for.js @@ -127,6 +127,21 @@ tester.run('valid-v-for', rule, { ` + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + { + filename: 'test.vue', + code: + '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' } ], invalid: [ @@ -245,12 +260,6 @@ tester.run('valid-v-for', rule, { '', errors: ["Custom elements in iteration require 'v-bind:key' directives."] }, - { - filename: 'test.vue', - code: - '', - errors: ["'v-for' directives require that attribute value."] - }, { filename: 'test.vue', code: @@ -309,6 +318,12 @@ tester.run('valid-v-for', rule, { ` + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-for' directives require that attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-html.js b/tests/lib/rules/valid-v-html.js index 9a30bcf48..afb312f74 100644 --- a/tests/lib/rules/valid-v-html.js +++ b/tests/lib/rules/valid-v-html.js @@ -30,6 +30,16 @@ tester.run('valid-v-html', rule, { { filename: 'test.vue', code: '' + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' } ], invalid: [ @@ -47,6 +57,12 @@ tester.run('valid-v-html', rule, { filename: 'test.vue', code: '', errors: ["'v-html' directives require that attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-html' directives require that attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-if.js b/tests/lib/rules/valid-v-if.js index effe04836..d3afe5780 100644 --- a/tests/lib/rules/valid-v-if.js +++ b/tests/lib/rules/valid-v-if.js @@ -30,6 +30,16 @@ tester.run('valid-v-if', rule, { { filename: 'test.vue', code: '' + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' } ], invalid: [ @@ -62,6 +72,12 @@ tester.run('valid-v-if', rule, { filename: 'test.vue', code: '', errors: ["'v-if' directives require that attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-if' directives require that attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-model.js b/tests/lib/rules/valid-v-model.js index c9c28585a..9e78ef47a 100644 --- a/tests/lib/rules/valid-v-model.js +++ b/tests/lib/rules/valid-v-model.js @@ -150,6 +150,16 @@ tester.run('valid-v-model', rule, { filename: 'test.vue', code: '' + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' } ], invalid: [ @@ -216,6 +226,12 @@ tester.run('valid-v-model', rule, { errors: [ "'v-model' directives cannot update the iteration variable 'e' itself." ] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-model' directives require that attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-on.js b/tests/lib/rules/valid-v-on.js index 911039ea5..6f162e1df 100644 --- a/tests/lib/rules/valid-v-on.js +++ b/tests/lib/rules/valid-v-on.js @@ -96,6 +96,33 @@ tester.run('valid-v-on', rule, { filename: 'test.vue', code: '', options: [{ modifiers: ['bar', 'aaa'] }] + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (valid) + { + filename: 'comment-value.vue', + code: '' + }, + { + filename: 'comment-value.vue', + code: '' + }, + { + filename: 'comment-value.vue', + code: '' + }, + { + filename: 'comment-value.vue', + code: '' + }, + // empty value + { + filename: 'empty-value.vue', + code: '' } ], invalid: [ @@ -139,6 +166,14 @@ tester.run('valid-v-on', rule, { filename: 'test.vue', code: '', errors: ['Avoid using JavaScript keyword as "v-on" value: "delete".'] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: [ + "'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')." + ] } ] }) diff --git a/tests/lib/rules/valid-v-once.js b/tests/lib/rules/valid-v-once.js index 0c6a71a20..c9f3750c3 100644 --- a/tests/lib/rules/valid-v-once.js +++ b/tests/lib/rules/valid-v-once.js @@ -47,6 +47,24 @@ tester.run('valid-v-once', rule, { filename: 'test.vue', code: '', errors: ["'v-once' directives require no attribute value."] + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '', + errors: ["'v-once' directives require no attribute value."] + }, + // comment value + { + filename: 'comment-value.vue', + code: '', + errors: ["'v-once' directives require no attribute value."] + }, + // empty value + { + filename: 'comment-value.vue', + code: '', + errors: ["'v-once' directives require no attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-pre.js b/tests/lib/rules/valid-v-pre.js index ae9d38e6f..3d9c9d883 100644 --- a/tests/lib/rules/valid-v-pre.js +++ b/tests/lib/rules/valid-v-pre.js @@ -47,6 +47,24 @@ tester.run('valid-v-pre', rule, { filename: 'test.vue', code: '', errors: ["'v-pre' directives require no attribute value."] + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '', + errors: ["'v-pre' directives require no attribute value."] + }, + // comment value + { + filename: 'comment-value.vue', + code: '', + errors: ["'v-pre' directives require no attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-pre' directives require no attribute value."] } ] }) diff --git a/tests/lib/rules/valid-v-show.js b/tests/lib/rules/valid-v-show.js index 0471ccd9f..4220e8749 100644 --- a/tests/lib/rules/valid-v-show.js +++ b/tests/lib/rules/valid-v-show.js @@ -30,6 +30,16 @@ tester.run('valid-v-show', rule, { { filename: 'test.vue', code: '' + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'comment-value.vue', + code: '' } ], invalid: [ @@ -48,8 +58,9 @@ tester.run('valid-v-show', rule, { code: '', errors: ["'v-show' directives require that attribute value."] }, + // empty value { - filename: 'test.vue', + filename: 'empty-value.vue', code: '', errors: ["'v-show' directives require that attribute value."] } diff --git a/tests/lib/rules/valid-v-slot.js b/tests/lib/rules/valid-v-slot.js index ab8307fed..0043756f1 100644 --- a/tests/lib/rules/valid-v-slot.js +++ b/tests/lib/rules/valid-v-slot.js @@ -83,7 +83,13 @@ tester.run('valid-v-slot', rule, { - ` + `, + // parsing error + { + filename: 'parsing-error.vue', + code: + '' + } ], invalid: [ // Verify location. @@ -294,6 +300,26 @@ tester.run('valid-v-slot', rule, { `, errors: [{ messageId: 'requireAttributeValue' }] + }, + // comment value + { + filename: 'comment-value1.vue', + code: + '', + errors: [{ messageId: 'requireAttributeValue' }] + }, + { + filename: 'comment-value2.vue', + code: + '', + errors: [{ messageId: 'requireAttributeValue' }] + }, + // empty value + { + filename: 'empty-value.vue', + code: + '', + errors: [{ messageId: 'requireAttributeValue' }] } ] }) diff --git a/tests/lib/rules/valid-v-text.js b/tests/lib/rules/valid-v-text.js index 3956462ce..611b1a31a 100644 --- a/tests/lib/rules/valid-v-text.js +++ b/tests/lib/rules/valid-v-text.js @@ -34,6 +34,16 @@ tester.run('valid-v-text', rule, { { filename: 'test.vue', code: '' + }, + // parsing error + { + filename: 'parsing-error.vue', + code: '' + }, + // comment value (parsing error) + { + filename: 'parsing-error.vue', + code: '' } ], invalid: [ @@ -51,6 +61,12 @@ tester.run('valid-v-text', rule, { filename: 'test.vue', code: '', errors: ["'v-text' directives require that attribute value."] + }, + // empty value + { + filename: 'empty-value.vue', + code: '', + errors: ["'v-text' directives require that attribute value."] } ] })