import { compile } from '../src' describe('ssr: components', () => { test('basic', () => { expect(compile(``).code).toMatchInlineSnapshot(` "const { resolveComponent } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, { id: \\"a\\", prop: _ctx.b }, null, _parent)) }" `) }) test('dynamic component', () => { expect(compile(``).code) .toMatchInlineSnapshot(` "const { resolveComponent } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, { prop: \\"b\\" }, null, _parent)) }" `) expect(compile(``).code) .toMatchInlineSnapshot(` "const { resolveComponent } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_compoonent = resolveComponent(\\"compoonent\\") _push(_ssrRenderComponent(_component_compoonent, { is: _ctx.foo, prop: \\"b\\" }, null, _parent)) }" `) }) describe('slots', () => { test('implicit default slot', () => { expect(compile(`hello
`).code).toMatchInlineSnapshot(` "const { resolveComponent, createVNode, createTextVNode } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, { default: (_, _push, _parent, _scopeId) => { if (_push) { _push(\`hello
\`) } else { return [ createTextVNode(\\"hello\\"), createVNode(\\"div\\") ] } }, _compiled: true }, _parent)) }" `) }) test('explicit default slot', () => { expect(compile(`{{ msg + outer }}`).code) .toMatchInlineSnapshot(` "const { resolveComponent, createTextVNode } = require(\\"vue\\") const { _ssrRenderComponent, _ssrInterpolate } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, { default: ({ msg }, _push, _parent, _scopeId) => { if (_push) { _push(\`\${_ssrInterpolate(msg + _ctx.outer)}\`) } else { return [ createTextVNode(toDisplayString(msg + _ctx.outer)) ] } }, _compiled: true }, _parent)) }" `) }) test('named slots', () => { expect( compile(` `).code ).toMatchInlineSnapshot(` "const { resolveComponent, createTextVNode } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, { default: (_, _push, _parent, _scopeId) => { if (_push) { _push(\`foo\`) } else { return [ createTextVNode(\\"foo\\") ] } }, named: (_, _push, _parent, _scopeId) => { if (_push) { _push(\`bar\`) } else { return [ createTextVNode(\\"bar\\") ] } }, _compiled: true }, _parent)) }" `) }) test('v-if slot', () => { expect( compile(` `).code ).toMatchInlineSnapshot(` "const { resolveComponent, createTextVNode, createSlots } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, createSlots({ _compiled: true }, [ (_ctx.ok) ? { name: \\"named\\", fn: (_, _push, _parent, _scopeId) => { if (_push) { _push(\`foo\`) } else { return [ createTextVNode(\\"foo\\") ] } } } : undefined ]), _parent)) }" `) }) test('v-for slot', () => { expect( compile(` `).code ).toMatchInlineSnapshot(` "const { resolveComponent, createTextVNode, renderList, createSlots } = require(\\"vue\\") const { _ssrRenderComponent, _ssrInterpolate } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, createSlots({ _compiled: true }, [ renderList(_ctx.names, (key) => { return { name: key, fn: ({ msg }, _push, _parent, _scopeId) => { if (_push) { _push(\`\${_ssrInterpolate(msg + key + _ctx.bar)}\`) } else { return [ createTextVNode(toDisplayString(msg + _ctx.key + _ctx.bar)) ] } } } }) ]), _parent)) }" `) }) test('nested transform scoping in vnode branch', () => { expect( compile(` `).code ).toMatchInlineSnapshot(` "const { resolveComponent, renderList, openBlock, createBlock, Fragment, createVNode, createCommentVNode } = require(\\"vue\\") const { _ssrRenderComponent, _ssrRenderList } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, { foo: ({ list }, _push, _parent, _scopeId) => { if (_push) { if (_ctx.ok) { _push(\`\`) _ssrRenderList(list, (i) => { _push(\`\`) }) _push(\`\`) } else { _push(\`\`) } } else { return [ (openBlock(), (_ctx.ok) ? createBlock(\\"div\\", { key: 0 }, [ (openBlock(false), createBlock(Fragment, null, renderList(list, (i) => { return (openBlock(), createBlock(\\"span\\")) }), 256 /* UNKEYED_FRAGMENT */)) ]) : createCommentVNode(\\"v-if\\", true)) ] } }, bar: ({ ok }, _push, _parent, _scopeId) => { if (_push) { if (ok) { _push(\`\`) _ssrRenderList(_ctx.list, (i) => { _push(\`\`) }) _push(\`\`) } else { _push(\`\`) } } else { return [ (openBlock(), ok ? createBlock(\\"div\\", { key: 0 }, [ (openBlock(false), createBlock(Fragment, null, renderList(_ctx.list, (i) => { return (openBlock(), createBlock(\\"span\\")) }), 256 /* UNKEYED_FRAGMENT */)) ]) : createCommentVNode(\\"v-if\\", true)) ] } }, _compiled: true }, _parent)) }" `) }) test('built-in fallthroughs', () => { // no fragment expect(compile(`
`).code) .toMatchInlineSnapshot(` " return function ssrRender(_ctx, _push, _parent) { _push(\`
\`) }" `) // wrap with fragment expect(compile(`
`).code) .toMatchInlineSnapshot(` " return function ssrRender(_ctx, _push, _parent) { _push(\`
\`) }" `) // no fragment expect(compile(``).code) .toMatchInlineSnapshot(` "const { resolveComponent } = require(\\"vue\\") const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent) { const _component_foo = resolveComponent(\\"foo\\") _push(_ssrRenderComponent(_component_foo, null, null, _parent)) }" `) // wrap with fragment expect(compile(`
`).code) .toMatchInlineSnapshot(` " return function ssrRender(_ctx, _push, _parent) { _push(\`
\`) }" `) }) }) })