Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fix(parser): allow multiple slots with new syntax (#9785)
* fix(#9781): non greedy `dynamicArgAttribute` RegExp 

* test(parser): add test case for multiple dynamic slot names

* test: add test with value

Co-authored-by: Eduardo San Martin Morote <posva13@gmail.com>
  • Loading branch information
shasharoman and posva committed Sep 21, 2020
1 parent abb5ef3 commit 67825c2
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/compiler/parser/html-parser.js
Expand Up @@ -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}`)
Expand Down
20 changes: 20 additions & 0 deletions test/unit/modules/compiler/parser.spec.js
Expand Up @@ -569,6 +569,26 @@ describe('parser', () => {
})
})

// #9781
it('multiple dynamic slot names without warning', () => {
const ast = parse(`<my-component>
<template #[foo]>foo</template>
<template #[data]="scope">scope</template>
<template #[bar]>bar</template>
</my-component>`, 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('<video muted></video>', baseOptions)
Expand Down

0 comments on commit 67825c2

Please sign in to comment.