@@ -49,7 +49,7 @@ describe('ssr: components', () => {
49
49
describe ( 'slots' , ( ) => {
50
50
test ( 'implicit default slot' , ( ) => {
51
51
expect ( compile ( `<foo>hello<div/></foo>` ) . code ) . toMatchInlineSnapshot ( `
52
- "const { resolveComponent } = require(\\"vue\\")
52
+ "const { resolveComponent, createVNode, createTextVNode } = require(\\"vue\\")
53
53
const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\")
54
54
55
55
return function ssrRender(_ctx, _push, _parent) {
@@ -75,7 +75,7 @@ describe('ssr: components', () => {
75
75
test ( 'explicit default slot' , ( ) => {
76
76
expect ( compile ( `<foo v-slot="{ msg }">{{ msg + outer }}</foo>` ) . code )
77
77
. toMatchInlineSnapshot ( `
78
- "const { resolveComponent } = require(\\"vue\\")
78
+ "const { resolveComponent, createTextVNode } = require(\\"vue\\")
79
79
const { _ssrRenderComponent, _ssrInterpolate } = require(\\"@vue/server-renderer\\")
80
80
81
81
return function ssrRender(_ctx, _push, _parent) {
@@ -87,7 +87,7 @@ describe('ssr: components', () => {
87
87
_push(\`\${_ssrInterpolate(msg + _ctx.outer)}\`)
88
88
} else {
89
89
return [
90
- createTextVNode(toDisplayString(_ctx. msg + _ctx.outer))
90
+ createTextVNode(toDisplayString(msg + _ctx.outer))
91
91
]
92
92
}
93
93
},
@@ -104,7 +104,7 @@ describe('ssr: components', () => {
104
104
<template v-slot:named>bar</template>
105
105
</foo>` ) . code
106
106
) . toMatchInlineSnapshot ( `
107
- "const { resolveComponent } = require(\\"vue\\")
107
+ "const { resolveComponent, createTextVNode } = require(\\"vue\\")
108
108
const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\")
109
109
110
110
return function ssrRender(_ctx, _push, _parent) {
@@ -141,7 +141,7 @@ describe('ssr: components', () => {
141
141
<template v-slot:named v-if="ok">foo</template>
142
142
</foo>` ) . code
143
143
) . toMatchInlineSnapshot ( `
144
- "const { resolveComponent, createSlots } = require(\\"vue\\")
144
+ "const { resolveComponent, createTextVNode, createSlots } = require(\\"vue\\")
145
145
const { _ssrRenderComponent } = require(\\"@vue/server-renderer\\")
146
146
147
147
return function ssrRender(_ctx, _push, _parent) {
@@ -173,7 +173,7 @@ describe('ssr: components', () => {
173
173
<template v-for="key in names" v-slot:[key]="{ msg }">{{ msg + key + bar }}</template>
174
174
</foo>` ) . code
175
175
) . toMatchInlineSnapshot ( `
176
- "const { resolveComponent, renderList, createSlots } = require(\\"vue\\")
176
+ "const { resolveComponent, createTextVNode, renderList, createSlots } = require(\\"vue\\")
177
177
const { _ssrRenderComponent, _ssrInterpolate } = require(\\"@vue/server-renderer\\")
178
178
179
179
return function ssrRender(_ctx, _push, _parent) {
@@ -184,7 +184,13 @@ describe('ssr: components', () => {
184
184
return {
185
185
name: key,
186
186
fn: ({ msg }, _push, _parent, _scopeId) => {
187
- _push(\`\${_ssrInterpolate(msg + key + _ctx.bar)}\`)
187
+ if (_push) {
188
+ _push(\`\${_ssrInterpolate(msg + key + _ctx.bar)}\`)
189
+ } else {
190
+ return [
191
+ createTextVNode(toDisplayString(msg + _ctx.key + _ctx.bar))
192
+ ]
193
+ }
188
194
}
189
195
}
190
196
})
@@ -193,6 +199,80 @@ describe('ssr: components', () => {
193
199
` )
194
200
} )
195
201
202
+ test ( 'nested transform scoping in vnode branch' , ( ) => {
203
+ expect (
204
+ compile ( `<foo>
205
+ <template v-slot:foo="{ list }">
206
+ <div v-if="ok">
207
+ <span v-for="i in list"></span>
208
+ </div>
209
+ </template>
210
+ <template v-slot:bar="{ ok }">
211
+ <div v-if="ok">
212
+ <span v-for="i in list"></span>
213
+ </div>
214
+ </template>
215
+ </foo>` ) . code
216
+ ) . toMatchInlineSnapshot ( `
217
+ "const { resolveComponent, renderList, openBlock, createBlock, Fragment, createVNode, createCommentVNode } = require(\\"vue\\")
218
+ const { _ssrRenderComponent, _ssrRenderList } = require(\\"@vue/server-renderer\\")
219
+
220
+ return function ssrRender(_ctx, _push, _parent) {
221
+ const _component_foo = resolveComponent(\\"foo\\")
222
+
223
+ _push(_ssrRenderComponent(_component_foo, null, {
224
+ foo: ({ list }, _push, _parent, _scopeId) => {
225
+ if (_push) {
226
+ if (_ctx.ok) {
227
+ _push(\`<div\${_scopeId}><!---->\`)
228
+ _ssrRenderList(list, (i) => {
229
+ _push(\`<span\${_scopeId}></span>\`)
230
+ })
231
+ _push(\`<!----></div>\`)
232
+ } else {
233
+ _push(\`<!---->\`)
234
+ }
235
+ } else {
236
+ return [
237
+ (openBlock(), (_ctx.ok)
238
+ ? createBlock(\\"div\\", { key: 0 }, [
239
+ (openBlock(false), createBlock(Fragment, null, renderList(list, (i) => {
240
+ return (openBlock(), createBlock(\\"span\\"))
241
+ }), 256 /* UNKEYED_FRAGMENT */))
242
+ ])
243
+ : createCommentVNode(\\"v-if\\", true))
244
+ ]
245
+ }
246
+ },
247
+ bar: ({ ok }, _push, _parent, _scopeId) => {
248
+ if (_push) {
249
+ if (ok) {
250
+ _push(\`<div\${_scopeId}><!---->\`)
251
+ _ssrRenderList(_ctx.list, (i) => {
252
+ _push(\`<span\${_scopeId}></span>\`)
253
+ })
254
+ _push(\`<!----></div>\`)
255
+ } else {
256
+ _push(\`<!---->\`)
257
+ }
258
+ } else {
259
+ return [
260
+ (openBlock(), ok
261
+ ? createBlock(\\"div\\", { key: 0 }, [
262
+ (openBlock(false), createBlock(Fragment, null, renderList(_ctx.list, (i) => {
263
+ return (openBlock(), createBlock(\\"span\\"))
264
+ }), 256 /* UNKEYED_FRAGMENT */))
265
+ ])
266
+ : createCommentVNode(\\"v-if\\", true))
267
+ ]
268
+ }
269
+ },
270
+ _compiled: true
271
+ }, _parent))
272
+ }"
273
+ ` )
274
+ } )
275
+
196
276
test ( 'built-in fallthroughs' , ( ) => {
197
277
// no fragment
198
278
expect ( compile ( `<transition><div/></transition>` ) . code )
0 commit comments