diff --git a/src/compiler/parser/html-parser.js b/src/compiler/parser/html-parser.js index dbc59146331..37c1fa24d58 100644 --- a/src/compiler/parser/html-parser.js +++ b/src/compiler/parser/html-parser.js @@ -15,7 +15,7 @@ import { unicodeRegExp } from 'core/util/lang' // Regular Expressions for parsing tags and attributes const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/ -const dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/ +const dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/ const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z${unicodeRegExp.source}]*` const qnameCapture = `((?:${ncname}\\:)?${ncname})` const startTagOpen = new RegExp(`^<${qnameCapture}`) diff --git a/test/unit/modules/compiler/parser.spec.js b/test/unit/modules/compiler/parser.spec.js index d6521bbf625..360bc11bbb6 100644 --- a/test/unit/modules/compiler/parser.spec.js +++ b/test/unit/modules/compiler/parser.spec.js @@ -569,6 +569,26 @@ describe('parser', () => { }) }) + // #9781 + it('multiple dynamic slot names without warning', () => { + const ast = parse(` + + + + `, baseOptions) + + expect(`Invalid dynamic argument expression`).not.toHaveBeenWarned() + expect(ast.scopedSlots.foo).not.toBeUndefined() + expect(ast.scopedSlots.data).not.toBeUndefined() + expect(ast.scopedSlots.bar).not.toBeUndefined() + expect(ast.scopedSlots.foo.type).toBe(1) + expect(ast.scopedSlots.data.type).toBe(1) + expect(ast.scopedSlots.bar.type).toBe(1) + expect(ast.scopedSlots.foo.attrsMap['#[foo]']).toBe('') + expect(ast.scopedSlots.bar.attrsMap['#[bar]']).toBe('') + expect(ast.scopedSlots.data.attrsMap['#[data]']).toBe('scope') + }) + // #6887 it('special case static attribute that must be props', () => { const ast = parse('', baseOptions)