feat(sfc): allow sfcs to recursively self-reference in template via name inferred from filename

e.g. A file named `FooBar.vue` can refer to itself as `<FooBar/>`. This gets rid of the need for the `name` option.
This commit is contained in:
Evan You
2020-11-30 12:30:35 -05:00
parent 29d256c39d
commit 67d1aac6ae
8 changed files with 54 additions and 24 deletions

View File

@@ -33,7 +33,7 @@ export interface SFCBlock {
export interface SFCTemplateBlock extends SFCBlock {
type: 'template'
functional?: boolean
ast: ElementNode
}
export interface SFCScriptBlock extends SFCBlock {
@@ -79,7 +79,7 @@ export function parse(
source: string,
{
sourceMap = true,
filename = 'component.vue',
filename = 'anonymous.vue',
sourceRoot = '',
pad = false,
compiler = CompilerDOM
@@ -143,31 +143,32 @@ export function parse(
switch (node.tag) {
case 'template':
if (!descriptor.template) {
descriptor.template = createBlock(
const templateBlock = (descriptor.template = createBlock(
node,
source,
false
) as SFCTemplateBlock
) as SFCTemplateBlock)
templateBlock.ast = node
} else {
errors.push(createDuplicateBlockError(node))
}
break
case 'script':
const block = createBlock(node, source, pad) as SFCScriptBlock
const isSetup = !!block.attrs.setup
const scriptBlock = createBlock(node, source, pad) as SFCScriptBlock
const isSetup = !!scriptBlock.attrs.setup
if (isSetup && !descriptor.scriptSetup) {
descriptor.scriptSetup = block
descriptor.scriptSetup = scriptBlock
break
}
if (!isSetup && !descriptor.script) {
descriptor.script = block
descriptor.script = scriptBlock
break
}
errors.push(createDuplicateBlockError(node, isSetup))
break
case 'style':
const style = createBlock(node, source, pad) as SFCStyleBlock
if (style.attrs.vars) {
const styleBlock = createBlock(node, source, pad) as SFCStyleBlock
if (styleBlock.attrs.vars) {
errors.push(
new SyntaxError(
`<style vars> has been replaced by a new proposal: ` +
@@ -175,7 +176,7 @@ export function parse(
)
)
}
descriptor.styles.push(style)
descriptor.styles.push(styleBlock)
break
default:
descriptor.customBlocks.push(createBlock(node, source, pad))
@@ -290,8 +291,6 @@ function createBlock(
} else if (p.name === 'module') {
;(block as SFCStyleBlock).module = attrs[p.name]
}
} else if (type === 'template' && p.name === 'functional') {
;(block as SFCTemplateBlock).functional = true
} else if (type === 'script' && p.name === 'setup') {
;(block as SFCScriptBlock).setup = attrs.setup
}