From 085d188379af98e9f482d7e2009ebfd771bd7ca5 Mon Sep 17 00:00:00 2001 From: "X.L" Date: Thu, 25 Apr 2019 11:17:39 +0800 Subject: [PATCH] fix(compiler): Remove the warning for valid v-slot value (#9917) --- src/compiler/error-detector.js | 15 +++++++++++++++ src/compiler/parser/index.js | 4 ++-- .../component/component-scoped-slot.spec.js | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/compiler/error-detector.js b/src/compiler/error-detector.js index 22c3b75d3aa..9893aa4a47a 100644 --- a/src/compiler/error-detector.js +++ b/src/compiler/error-detector.js @@ -36,6 +36,8 @@ function checkNode (node: ASTNode, warn: Function) { const range = node.rawAttrsMap[name] if (name === 'v-for') { checkFor(node, `v-for="${value}"`, warn, range) + } else if (name === 'v-slot' || name[0] === '#') { + checkFunctionParameterExpression(value, `${name}="${value}"`, warn, range) } else if (onRE.test(name)) { checkEvent(value, `${name}="${value}"`, warn, range) } else { @@ -111,3 +113,16 @@ function checkExpression (exp: string, text: string, warn: Function, range?: Ran } } } + +function checkFunctionParameterExpression (exp: string, text: string, warn: Function, range?: Range) { + try { + new Function(exp, '') + } catch (e) { + warn( + `invalid function parameter expression: ${e.message} in\n\n` + + ` ${exp}\n\n` + + ` Raw expression: ${text.trim()}\n`, + range + ) + } +} diff --git a/src/compiler/parser/index.js b/src/compiler/parser/index.js index fb258752179..cdeb257eda4 100644 --- a/src/compiler/parser/index.js +++ b/src/compiler/parser/index.js @@ -23,8 +23,8 @@ import { export const onRE = /^@|^v-on:/ export const dirRE = process.env.VBIND_PROP_SHORTHAND - ? /^v-|^@|^:|^\./ - : /^v-|^@|^:/ + ? /^v-|^@|^:|^\.|^#/ + : /^v-|^@|^:|^#/ export const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/ export const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/ const stripParensRE = /^\(|\)$/g diff --git a/test/unit/features/component/component-scoped-slot.spec.js b/test/unit/features/component/component-scoped-slot.spec.js index f8a0f11b7fa..28369814f48 100644 --- a/test/unit/features/component/component-scoped-slot.spec.js +++ b/test/unit/features/component/component-scoped-slot.spec.js @@ -759,6 +759,22 @@ describe('Component scoped slot', () => { }).$mount() expect(`Unexpected mixed usage of different slot syntaxes`).toHaveBeenWarned() }) + + it('should warn invalid parameter expression', () => { + new Vue({ + template: ``, + components: { Foo } + }).$mount(); + expect('invalid function parameter expression').toHaveBeenWarned() + }) + + it('should allow destructuring props with default value', () => { + new Vue({ + template: ``, + components: { Foo } + }).$mount(); + expect('invalid function parameter expression').not.toHaveBeenWarned() + }) } // run tests for both full syntax and shorthand