])
}
}
- const { container, vnode } = mountWithHydration('<!--[--><!--]-->', () => h(Comp))
+ const { container, vnode } = mountWithHydration('<!--[--><!--]-->', () =>
+ h(Comp)
+ )
expect(container.childNodes.length).toBe(3)
const text = container.childNodes[1]
expect(text.nodeType).toBe(3)
expect((vnode as any).component?.subTree.children[0].el).toBe(text)
})
+ test('app.unmount()', async () => {
+ const container = document.createElement('DIV')
+ container.innerHTML = '<button></button>'
+ const App = defineComponent({
+ setup(_, { expose }) {
+ const count = ref(0)
+
+ expose({ count })
+
+ return () =>
+ h('button', {
+ onClick: () => count.value++
+ })
+ }
+ })
+
+ const app = createSSRApp(App)
+ const vm = app.mount(container)
+ await nextTick()
+ expect((container as any)._vnode).toBeDefined()
+ // @ts-expect-error - expose()'d properties are not available on vm type
+ expect(vm.count).toBe(0)
+
+ app.unmount()
+ expect((container as any)._vnode).toBe(null)
+ })
+
describe('mismatch handling', () => {
test('text node', () => {
const { container } = mountWithHydration(`foo`, () => 'bar')
export type RootHydrateFunction = (
vnode: VNode<Node, Element>,
- container: Element | ShadowRoot
+ container: (Element | ShadowRoot) & { _vnode?: VNode }
) => void
const enum DOMNodeTypes {
)
patch(null, vnode, container)
flushPostFlushCbs()
+ container._vnode = vnode
return
}
hasMismatch = false
hydrateNode(container.firstChild!, vnode, null, null, null)
flushPostFlushCbs()
+ container._vnode = vnode
if (hasMismatch && !__TEST__) {
// this error should show up in production
console.error(`Hydration completed but contains mismatches.`)