import { createApp, h, mergeProps, withCtx } from 'vue' import { renderToString } from '../src/renderToString' import { ssrRenderAttrs, ssrRenderComponent, ssrRenderSlot } from '../src' describe('ssr: scopedId runtime behavior', () => { test('id on component root', async () => { const Child = { ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { push(``) }, } const Comp = { __scopeId: 'parent', ssrRender: (ctx: any, push: any, parent: any) => { push(ssrRenderComponent(Child), null, null, parent) }, } const result = await renderToString(createApp(Comp)) expect(result).toBe(`
`) }) test('id and :slotted on component root', async () => { const Child = { //
ssrRender: (_: any, push: any, _parent: any, attrs: any) => { push(``) }, } const Wrapper = { __scopeId: 'wrapper', ssrRender: (ctx: any, push: any, parent: any) => { // ssrRenderSlot( ctx.$slots, 'default', {}, null, push, parent, 'wrapper-s', ) }, } const Comp = { __scopeId: 'parent', ssrRender: (_: any, push: any, parent: any) => { // push( ssrRenderComponent( Wrapper, null, { default: withCtx( (_: any, push: any, parent: any, scopeId: string) => { push(ssrRenderComponent(Child, null, null, parent, scopeId)) }, ), _: 1, } as any, parent, ), ) }, } const result = await renderToString(createApp(Comp)) expect(result).toBe(`
`) }) // #2892 test(':slotted on forwarded slots', async () => { const Wrapper = { __scopeId: 'wrapper', ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { //
push( ``, ) ssrRenderSlot( ctx.$slots, 'default', {}, null, push, parent, 'wrapper-s', ) push(``) }, } const Slotted = { __scopeId: 'slotted', ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { // push( ssrRenderComponent( Wrapper, attrs, { default: withCtx( (_: any, push: any, parent: any, scopeId: string) => { ssrRenderSlot( ctx.$slots, 'default', {}, null, push, parent, 'slotted-s' + scopeId, ) }, ), _: 1, } as any, parent, ), ) }, } const Root = { __scopeId: 'root', //
ssrRender: (_: any, push: any, parent: any, attrs: any) => { push( ssrRenderComponent( Slotted, attrs, { default: withCtx( (_: any, push: any, parent: any, scopeId: string) => { push(`
`) }, ), _: 1, } as any, parent, ), ) }, } const result = await renderToString(createApp(Root)) expect(result).toBe( `
` + `
` + `
`, ) }) // #3513 test('scopeId inheritance across ssr-compiled and on-ssr compiled parent chain', async () => { const Child = { ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { push(``) }, } const Middle = { render() { return h(Child) }, } const Comp = { __scopeId: 'parent', ssrRender: (ctx: any, push: any, parent: any) => { push(ssrRenderComponent(Middle, null, null, parent)) }, } const result = await renderToString(createApp(Comp)) // output: `
` expect(result).toBe(`
`) }) // #6093 test(':slotted on forwarded slots on component', async () => { const Wrapper = { __scopeId: 'wrapper', ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { //
push( ``, ) ssrRenderSlot( ctx.$slots, 'default', {}, null, push, parent, 'wrapper-s', ) push(``) }, } const Slotted = { __scopeId: 'slotted', ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { // push( ssrRenderComponent( Wrapper, attrs, { default: withCtx( (_: any, push: any, parent: any, scopeId: string) => { ssrRenderSlot( ctx.$slots, 'default', {}, null, push, parent, 'slotted-s' + scopeId, ) }, ), _: 1, } as any, parent, ), ) }, } const Child = { ssrRender: (ctx: any, push: any, parent: any, attrs: any) => { push(``) }, } const Root = { __scopeId: 'root', // ssrRender: (_: any, push: any, parent: any, attrs: any) => { push( ssrRenderComponent( Slotted, attrs, { default: withCtx( (_: any, push: any, parent: any, scopeId: string) => { push(ssrRenderComponent(Child, null, null, parent, scopeId)) }, ), _: 1, } as any, parent, ), ) }, } const result = await renderToString(createApp(Root)) expect(result).toBe( `
` + `
` + `
`, ) }) })