"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
},
],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
},
],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
},
],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
},
],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
"ns": 0,
"props": Array [],
"tag": "template",
- "tagType": 3,
+ "tagType": 0,
"type": 1,
},
],
tagType: ElementTypes.ELEMENT,
codegenNode: undefined,
props: [],
-
isSelfClosing: false,
children: [],
loc: {
})
})
+ test('template element with directives', () => {
+ const ast = baseParse('<template v-if="ok"></template>')
+ const element = ast.children[0]
+ expect(element).toMatchObject({
+ type: NodeTypes.ELEMENT,
+ tagType: ElementTypes.TEMPLATE
+ })
+ })
+
+ test('template element without directives', () => {
+ const ast = baseParse('<template></template>')
+ const element = ast.children[0]
+ expect(element).toMatchObject({
+ type: NodeTypes.ELEMENT,
+ tagType: ElementTypes.ELEMENT
+ })
+ })
+
test('native element with `isNativeTag`', () => {
const ast = baseParse('<div></div><comp></comp><Comp></Comp>', {
isNativeTag: tag => tag === 'div'
import { ParserOptions } from './options'
-import { NO, isArray } from '@vue/shared'
+import { NO, isArray, makeMap } from '@vue/shared'
import { ErrorCodes, createCompilerError, defaultOnError } from './errors'
import {
assert,
End
}
+const isSpecialTemplateDirective = /*#__PURE__*/ makeMap(
+ `if,else,else-if,for,slot`
+)
+
/**
* Parse a tag (E.g. `<div id=a>`) with that type (start tag or end tag).
*/
if (tag === 'slot') {
tagType = ElementTypes.SLOT
- } else if (tag === 'template') {
+ } else if (
+ tag === 'template' &&
+ props.some(p => {
+ return (
+ p.type === NodeTypes.DIRECTIVE && isSpecialTemplateDirective(p.name)
+ )
+ })
+ ) {
tagType = ElementTypes.TEMPLATE
}
}
} from '../runtimeHelpers'
import {
getInnerRange,
- isVSlot,
toValidAssetId,
findProp,
isCoreComponent
// generate a JavaScript AST for this element's codegen
export const transformElement: NodeTransform = (node, context) => {
if (
- node.type !== NodeTypes.ELEMENT ||
- // handled by transformSlotOutlet
- node.tagType === ElementTypes.SLOT ||
- // <template v-if/v-for> should have already been replaced
- // <template v-slot> is handled by buildSlots
- (node.tagType === ElementTypes.TEMPLATE && node.props.some(isVSlot))
+ !(
+ node.type === NodeTypes.ELEMENT &&
+ (node.tagType === ElementTypes.ELEMENT ||
+ node.tagType === ElementTypes.COMPONENT)
+ )
) {
return
}