}"
`)
+ // should inject attrs if root with coomments
+ expect(compile(`<!--root--><transition><div/></transition>`).code)
+ .toMatchInlineSnapshot(`
+ "const { ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
+
+ return function ssrRender(_ctx, _push, _parent, _attrs) {
+ _push(\`<!--[--><!--root--><div\${_ssrRenderAttrs(_attrs)}></div><!--]-->\`)
+ }"
+ `)
+
+ // should not inject attrs if not root
+ expect(compile(`<div/><transition><div/></transition>`).code)
+ .toMatchInlineSnapshot(`
+ "
+ return function ssrRender(_ctx, _push, _parent, _attrs) {
+ _push(\`<!--[--><div></div><div></div><!--]-->\`)
+ }"
+ `)
+
expect(compile(`<keep-alive><foo/></keep-alive>`).code)
.toMatchInlineSnapshot(`
"const { resolveComponent: _resolveComponent } = require(\\"vue\\")
isBuiltInType
} from '@vue/compiler-dom'
+const filterChild = (node: ParentNode) =>
+ node.children.filter(n => n.type !== NodeTypes.COMMENT)
+
const hasSingleChild = (node: ParentNode): boolean =>
- node.children.filter(n => n.type !== NodeTypes.COMMENT).length === 1
+ filterChild(node).length === 1
export const ssrInjectFallthroughAttrs: NodeTransform = (node, context) => {
// _attrs is provided as a function argument.
(isBuiltInType(node.tag, 'Transition') ||
isBuiltInType(node.tag, 'KeepAlive'))
) {
- if (hasSingleChild(node)) {
- injectFallthroughAttrs(node.children[0])
+ const rootChildren = filterChild(context.root)
+ if (rootChildren.length === 1 && rootChildren[0] === node) {
+ if (hasSingleChild(node)) {
+ injectFallthroughAttrs(node.children[0])
+ }
+ return
}
- return
}
const parent = context.parent