@vue/server-renderer 3.2.45 → 3.2.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var vue = require('vue');
|
|
3
|
+
var Vue = require('vue');
|
|
6
4
|
var shared = require('@vue/shared');
|
|
7
5
|
var compilerSsr = require('@vue/compiler-ssr');
|
|
8
6
|
|
|
7
|
+
function _interopNamespaceDefault(e) {
|
|
8
|
+
var n = Object.create(null);
|
|
9
|
+
if (e) {
|
|
10
|
+
for (var k in e) {
|
|
11
|
+
n[k] = e[k];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
n.default = e;
|
|
15
|
+
return Object.freeze(n);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
var Vue__namespace = /*#__PURE__*/_interopNamespaceDefault(Vue);
|
|
19
|
+
|
|
9
20
|
// leading comma for empty string ""
|
|
10
21
|
const shouldIgnoreProp = shared.makeMap(`,key,ref,innerHTML,textContent,ref_key,ref_for`);
|
|
11
22
|
function ssrRenderAttrs(props, tag) {
|
|
@@ -77,6 +88,207 @@ function ssrRenderStyle(raw) {
|
|
|
77
88
|
return shared.escapeHtml(shared.stringifyStyle(styles));
|
|
78
89
|
}
|
|
79
90
|
|
|
91
|
+
function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
|
|
92
|
+
return renderComponentVNode(Vue.createVNode(comp, props, children), parentComponent, slotScopeId);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
|
|
96
|
+
// template-compiled slots are always rendered as fragments
|
|
97
|
+
push(`<!--[-->`);
|
|
98
|
+
ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId);
|
|
99
|
+
push(`<!--]-->`);
|
|
100
|
+
}
|
|
101
|
+
function ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId, transition) {
|
|
102
|
+
const slotFn = slots[slotName];
|
|
103
|
+
if (slotFn) {
|
|
104
|
+
const slotBuffer = [];
|
|
105
|
+
const bufferedPush = (item) => {
|
|
106
|
+
slotBuffer.push(item);
|
|
107
|
+
};
|
|
108
|
+
const ret = slotFn(slotProps, bufferedPush, parentComponent, slotScopeId ? ' ' + slotScopeId : '');
|
|
109
|
+
if (shared.isArray(ret)) {
|
|
110
|
+
// normal slot
|
|
111
|
+
renderVNodeChildren(push, ret, parentComponent, slotScopeId);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// ssr slot.
|
|
115
|
+
// check if the slot renders all comments, in which case use the fallback
|
|
116
|
+
let isEmptySlot = true;
|
|
117
|
+
if (transition) {
|
|
118
|
+
isEmptySlot = false;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
for (let i = 0; i < slotBuffer.length; i++) {
|
|
122
|
+
if (!isComment(slotBuffer[i])) {
|
|
123
|
+
isEmptySlot = false;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (isEmptySlot) {
|
|
129
|
+
if (fallbackRenderFn) {
|
|
130
|
+
fallbackRenderFn();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
for (let i = 0; i < slotBuffer.length; i++) {
|
|
135
|
+
push(slotBuffer[i]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (fallbackRenderFn) {
|
|
141
|
+
fallbackRenderFn();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const commentTestRE = /^<!--.*-->$/s;
|
|
145
|
+
const commentRE = /<!--[^]*?-->/gm;
|
|
146
|
+
function isComment(item) {
|
|
147
|
+
if (typeof item !== 'string' || !commentTestRE.test(item))
|
|
148
|
+
return false;
|
|
149
|
+
// if item is '<!---->' or '<!--[-->' or '<!--]-->', return true directly
|
|
150
|
+
if (item.length <= 8)
|
|
151
|
+
return true;
|
|
152
|
+
return !item.replace(commentRE, '').trim();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function ssrRenderTeleport(parentPush, contentRenderFn, target, disabled, parentComponent) {
|
|
156
|
+
parentPush('<!--teleport start-->');
|
|
157
|
+
const context = parentComponent.appContext.provides[Vue.ssrContextKey];
|
|
158
|
+
const teleportBuffers = context.__teleportBuffers || (context.__teleportBuffers = {});
|
|
159
|
+
const targetBuffer = teleportBuffers[target] || (teleportBuffers[target] = []);
|
|
160
|
+
// record current index of the target buffer to handle nested teleports
|
|
161
|
+
// since the parent needs to be rendered before the child
|
|
162
|
+
const bufferIndex = targetBuffer.length;
|
|
163
|
+
let teleportContent;
|
|
164
|
+
if (disabled) {
|
|
165
|
+
contentRenderFn(parentPush);
|
|
166
|
+
teleportContent = `<!--teleport anchor-->`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const { getBuffer, push } = createBuffer();
|
|
170
|
+
contentRenderFn(push);
|
|
171
|
+
push(`<!--teleport anchor-->`);
|
|
172
|
+
teleportContent = getBuffer();
|
|
173
|
+
}
|
|
174
|
+
targetBuffer.splice(bufferIndex, 0, teleportContent);
|
|
175
|
+
parentPush('<!--teleport end-->');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function ssrInterpolate(value) {
|
|
179
|
+
return shared.escapeHtml(shared.toDisplayString(value));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function ssrRenderList(source, renderItem) {
|
|
183
|
+
if (shared.isArray(source) || shared.isString(source)) {
|
|
184
|
+
for (let i = 0, l = source.length; i < l; i++) {
|
|
185
|
+
renderItem(source[i], i);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (typeof source === 'number') {
|
|
189
|
+
for (let i = 0; i < source; i++) {
|
|
190
|
+
renderItem(i + 1, i);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (shared.isObject(source)) {
|
|
194
|
+
if (source[Symbol.iterator]) {
|
|
195
|
+
const arr = Array.from(source);
|
|
196
|
+
for (let i = 0, l = arr.length; i < l; i++) {
|
|
197
|
+
renderItem(arr[i], i);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const keys = Object.keys(source);
|
|
202
|
+
for (let i = 0, l = keys.length; i < l; i++) {
|
|
203
|
+
const key = keys[i];
|
|
204
|
+
renderItem(source[key], key, i);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function ssrRenderSuspense(push, { default: renderContent }) {
|
|
211
|
+
if (renderContent) {
|
|
212
|
+
renderContent();
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
push(`<!---->`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function ssrGetDirectiveProps(instance, dir, value, arg, modifiers = {}) {
|
|
220
|
+
if (typeof dir !== 'function' && dir.getSSRProps) {
|
|
221
|
+
return (dir.getSSRProps({
|
|
222
|
+
dir,
|
|
223
|
+
instance,
|
|
224
|
+
value,
|
|
225
|
+
oldValue: undefined,
|
|
226
|
+
arg,
|
|
227
|
+
modifiers
|
|
228
|
+
}, null) || {});
|
|
229
|
+
}
|
|
230
|
+
return {};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const ssrLooseEqual = shared.looseEqual;
|
|
234
|
+
function ssrLooseContain(arr, value) {
|
|
235
|
+
return shared.looseIndexOf(arr, value) > -1;
|
|
236
|
+
}
|
|
237
|
+
// for <input :type="type" v-model="model" value="value">
|
|
238
|
+
function ssrRenderDynamicModel(type, model, value) {
|
|
239
|
+
switch (type) {
|
|
240
|
+
case 'radio':
|
|
241
|
+
return shared.looseEqual(model, value) ? ' checked' : '';
|
|
242
|
+
case 'checkbox':
|
|
243
|
+
return (shared.isArray(model) ? ssrLooseContain(model, value) : model)
|
|
244
|
+
? ' checked'
|
|
245
|
+
: '';
|
|
246
|
+
default:
|
|
247
|
+
// text types
|
|
248
|
+
return ssrRenderAttr('value', model);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// for <input v-bind="obj" v-model="model">
|
|
252
|
+
function ssrGetDynamicModelProps(existingProps = {}, model) {
|
|
253
|
+
const { type, value } = existingProps;
|
|
254
|
+
switch (type) {
|
|
255
|
+
case 'radio':
|
|
256
|
+
return shared.looseEqual(model, value) ? { checked: true } : null;
|
|
257
|
+
case 'checkbox':
|
|
258
|
+
return (shared.isArray(model) ? ssrLooseContain(model, value) : model)
|
|
259
|
+
? { checked: true }
|
|
260
|
+
: null;
|
|
261
|
+
default:
|
|
262
|
+
// text types
|
|
263
|
+
return { value: model };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// internal runtime helpers
|
|
268
|
+
|
|
269
|
+
var helpers = /*#__PURE__*/Object.freeze({
|
|
270
|
+
__proto__: null,
|
|
271
|
+
ssrGetDirectiveProps: ssrGetDirectiveProps,
|
|
272
|
+
ssrGetDynamicModelProps: ssrGetDynamicModelProps,
|
|
273
|
+
ssrIncludeBooleanAttr: shared.includeBooleanAttr,
|
|
274
|
+
ssrInterpolate: ssrInterpolate,
|
|
275
|
+
ssrLooseContain: ssrLooseContain,
|
|
276
|
+
ssrLooseEqual: ssrLooseEqual,
|
|
277
|
+
ssrRenderAttr: ssrRenderAttr,
|
|
278
|
+
ssrRenderAttrs: ssrRenderAttrs,
|
|
279
|
+
ssrRenderClass: ssrRenderClass,
|
|
280
|
+
ssrRenderComponent: ssrRenderComponent,
|
|
281
|
+
ssrRenderDynamicAttr: ssrRenderDynamicAttr,
|
|
282
|
+
ssrRenderDynamicModel: ssrRenderDynamicModel,
|
|
283
|
+
ssrRenderList: ssrRenderList,
|
|
284
|
+
ssrRenderSlot: ssrRenderSlot,
|
|
285
|
+
ssrRenderSlotInner: ssrRenderSlotInner,
|
|
286
|
+
ssrRenderStyle: ssrRenderStyle,
|
|
287
|
+
ssrRenderSuspense: ssrRenderSuspense,
|
|
288
|
+
ssrRenderTeleport: ssrRenderTeleport,
|
|
289
|
+
ssrRenderVNode: renderVNode
|
|
290
|
+
});
|
|
291
|
+
|
|
80
292
|
const compileCache = Object.create(null);
|
|
81
293
|
function ssrCompile(template, instance) {
|
|
82
294
|
// TODO: This is copied from runtime-core/src/component.ts and should probably be refactored
|
|
@@ -106,33 +318,15 @@ function ssrCompile(template, instance) {
|
|
|
106
318
|
}
|
|
107
319
|
};
|
|
108
320
|
const { code } = compilerSsr.compile(template, finalCompilerOptions);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const teleportBuffers = context.__teleportBuffers || (context.__teleportBuffers = {});
|
|
116
|
-
const targetBuffer = teleportBuffers[target] || (teleportBuffers[target] = []);
|
|
117
|
-
// record current index of the target buffer to handle nested teleports
|
|
118
|
-
// since the parent needs to be rendered before the child
|
|
119
|
-
const bufferIndex = targetBuffer.length;
|
|
120
|
-
let teleportContent;
|
|
121
|
-
if (disabled) {
|
|
122
|
-
contentRenderFn(parentPush);
|
|
123
|
-
teleportContent = `<!--teleport anchor-->`;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
const { getBuffer, push } = createBuffer();
|
|
127
|
-
contentRenderFn(push);
|
|
128
|
-
push(`<!--teleport anchor-->`);
|
|
129
|
-
teleportContent = getBuffer();
|
|
130
|
-
}
|
|
131
|
-
targetBuffer.splice(bufferIndex, 0, teleportContent);
|
|
132
|
-
parentPush('<!--teleport end-->');
|
|
321
|
+
const requireMap = {
|
|
322
|
+
vue: Vue__namespace,
|
|
323
|
+
'vue/server-renderer': helpers
|
|
324
|
+
};
|
|
325
|
+
const fakeRequire = (id) => requireMap[id];
|
|
326
|
+
return (compileCache[cacheKey] = Function('require', code)(fakeRequire));
|
|
133
327
|
}
|
|
134
328
|
|
|
135
|
-
const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, normalizeVNode } =
|
|
329
|
+
const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, normalizeVNode } = Vue.ssrUtils;
|
|
136
330
|
// Each component has a buffer array.
|
|
137
331
|
// A buffer array can contain one of the following:
|
|
138
332
|
// - plain string
|
|
@@ -261,7 +455,7 @@ function renderComponentSubTree(instance, slotScopeId) {
|
|
|
261
455
|
}
|
|
262
456
|
else {
|
|
263
457
|
const componentName = comp.name || comp.__file || `<Anonymous>`;
|
|
264
|
-
|
|
458
|
+
Vue.warn(`Component ${componentName} is missing template or render function.`);
|
|
265
459
|
push(`<!---->`);
|
|
266
460
|
}
|
|
267
461
|
}
|
|
@@ -270,16 +464,16 @@ function renderComponentSubTree(instance, slotScopeId) {
|
|
|
270
464
|
function renderVNode(push, vnode, parentComponent, slotScopeId) {
|
|
271
465
|
const { type, shapeFlag, children } = vnode;
|
|
272
466
|
switch (type) {
|
|
273
|
-
case
|
|
467
|
+
case Vue.Text:
|
|
274
468
|
push(shared.escapeHtml(children));
|
|
275
469
|
break;
|
|
276
|
-
case
|
|
470
|
+
case Vue.Comment:
|
|
277
471
|
push(children ? `<!--${shared.escapeHtmlComment(children)}-->` : `<!---->`);
|
|
278
472
|
break;
|
|
279
|
-
case
|
|
473
|
+
case Vue.Static:
|
|
280
474
|
push(children);
|
|
281
475
|
break;
|
|
282
|
-
case
|
|
476
|
+
case Vue.Fragment:
|
|
283
477
|
if (vnode.slotScopeIds) {
|
|
284
478
|
slotScopeId =
|
|
285
479
|
(slotScopeId ? slotScopeId + ' ' : '') + vnode.slotScopeIds.join(' ');
|
|
@@ -302,7 +496,7 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
|
|
|
302
496
|
renderVNode(push, vnode.ssContent, parentComponent, slotScopeId);
|
|
303
497
|
}
|
|
304
498
|
else {
|
|
305
|
-
|
|
499
|
+
Vue.warn('[@vue/server-renderer] Invalid VNode type:', type, `(${typeof type})`);
|
|
306
500
|
}
|
|
307
501
|
}
|
|
308
502
|
}
|
|
@@ -376,19 +570,19 @@ function applySSRDirectives(vnode, rawProps, dirs) {
|
|
|
376
570
|
toMerge.push(props);
|
|
377
571
|
}
|
|
378
572
|
}
|
|
379
|
-
return
|
|
573
|
+
return Vue.mergeProps(rawProps || {}, ...toMerge);
|
|
380
574
|
}
|
|
381
575
|
function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
|
|
382
576
|
const target = vnode.props && vnode.props.to;
|
|
383
577
|
const disabled = vnode.props && vnode.props.disabled;
|
|
384
578
|
if (!target) {
|
|
385
579
|
if (!disabled) {
|
|
386
|
-
|
|
580
|
+
Vue.warn(`[@vue/server-renderer] Teleport is missing target prop.`);
|
|
387
581
|
}
|
|
388
582
|
return [];
|
|
389
583
|
}
|
|
390
584
|
if (!shared.isString(target)) {
|
|
391
|
-
|
|
585
|
+
Vue.warn(`[@vue/server-renderer] Teleport target must be a query selector string.`);
|
|
392
586
|
return [];
|
|
393
587
|
}
|
|
394
588
|
ssrRenderTeleport(push, push => {
|
|
@@ -396,8 +590,8 @@ function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
|
|
|
396
590
|
}, target, disabled || disabled === '', parentComponent);
|
|
397
591
|
}
|
|
398
592
|
|
|
399
|
-
const { isVNode } =
|
|
400
|
-
async function unrollBuffer(buffer) {
|
|
593
|
+
const { isVNode: isVNode$1 } = Vue.ssrUtils;
|
|
594
|
+
async function unrollBuffer$1(buffer) {
|
|
401
595
|
if (buffer.hasAsync) {
|
|
402
596
|
let ret = '';
|
|
403
597
|
for (let i = 0; i < buffer.length; i++) {
|
|
@@ -409,7 +603,7 @@ async function unrollBuffer(buffer) {
|
|
|
409
603
|
ret += item;
|
|
410
604
|
}
|
|
411
605
|
else {
|
|
412
|
-
ret += await unrollBuffer(item);
|
|
606
|
+
ret += await unrollBuffer$1(item);
|
|
413
607
|
}
|
|
414
608
|
}
|
|
415
609
|
return ret;
|
|
@@ -417,10 +611,10 @@ async function unrollBuffer(buffer) {
|
|
|
417
611
|
else {
|
|
418
612
|
// sync buffer can be more efficiently unrolled without unnecessary await
|
|
419
613
|
// ticks
|
|
420
|
-
return unrollBufferSync(buffer);
|
|
614
|
+
return unrollBufferSync$1(buffer);
|
|
421
615
|
}
|
|
422
616
|
}
|
|
423
|
-
function unrollBufferSync(buffer) {
|
|
617
|
+
function unrollBufferSync$1(buffer) {
|
|
424
618
|
let ret = '';
|
|
425
619
|
for (let i = 0; i < buffer.length; i++) {
|
|
426
620
|
let item = buffer[i];
|
|
@@ -429,23 +623,23 @@ function unrollBufferSync(buffer) {
|
|
|
429
623
|
}
|
|
430
624
|
else {
|
|
431
625
|
// since this is a sync buffer, child buffers are never promises
|
|
432
|
-
ret += unrollBufferSync(item);
|
|
626
|
+
ret += unrollBufferSync$1(item);
|
|
433
627
|
}
|
|
434
628
|
}
|
|
435
629
|
return ret;
|
|
436
630
|
}
|
|
437
631
|
async function renderToString(input, context = {}) {
|
|
438
|
-
if (isVNode(input)) {
|
|
632
|
+
if (isVNode$1(input)) {
|
|
439
633
|
// raw vnode, wrap with app (for context)
|
|
440
|
-
return renderToString(
|
|
634
|
+
return renderToString(Vue.createApp({ render: () => input }), context);
|
|
441
635
|
}
|
|
442
636
|
// rendering an app
|
|
443
|
-
const vnode =
|
|
637
|
+
const vnode = Vue.createVNode(input._component, input._props);
|
|
444
638
|
vnode.appContext = input._context;
|
|
445
639
|
// provide the ssr context to the tree
|
|
446
|
-
input.provide(
|
|
640
|
+
input.provide(Vue.ssrContextKey, context);
|
|
447
641
|
const buffer = await renderComponentVNode(vnode);
|
|
448
|
-
const result = await unrollBuffer(buffer);
|
|
642
|
+
const result = await unrollBuffer$1(buffer);
|
|
449
643
|
await resolveTeleports(context);
|
|
450
644
|
if (context.__watcherHandles) {
|
|
451
645
|
for (const unwatch of context.__watcherHandles) {
|
|
@@ -460,13 +654,13 @@ async function resolveTeleports(context) {
|
|
|
460
654
|
for (const key in context.__teleportBuffers) {
|
|
461
655
|
// note: it's OK to await sequentially here because the Promises were
|
|
462
656
|
// created eagerly in parallel.
|
|
463
|
-
context.teleports[key] = await unrollBuffer(await Promise.all([context.__teleportBuffers[key]]));
|
|
657
|
+
context.teleports[key] = await unrollBuffer$1(await Promise.all([context.__teleportBuffers[key]]));
|
|
464
658
|
}
|
|
465
659
|
}
|
|
466
660
|
}
|
|
467
661
|
|
|
468
|
-
const { isVNode
|
|
469
|
-
async function unrollBuffer
|
|
662
|
+
const { isVNode } = Vue.ssrUtils;
|
|
663
|
+
async function unrollBuffer(buffer, stream) {
|
|
470
664
|
if (buffer.hasAsync) {
|
|
471
665
|
for (let i = 0; i < buffer.length; i++) {
|
|
472
666
|
let item = buffer[i];
|
|
@@ -477,17 +671,17 @@ async function unrollBuffer$1(buffer, stream) {
|
|
|
477
671
|
stream.push(item);
|
|
478
672
|
}
|
|
479
673
|
else {
|
|
480
|
-
await unrollBuffer
|
|
674
|
+
await unrollBuffer(item, stream);
|
|
481
675
|
}
|
|
482
676
|
}
|
|
483
677
|
}
|
|
484
678
|
else {
|
|
485
679
|
// sync buffer can be more efficiently unrolled without unnecessary await
|
|
486
680
|
// ticks
|
|
487
|
-
unrollBufferSync
|
|
681
|
+
unrollBufferSync(buffer, stream);
|
|
488
682
|
}
|
|
489
683
|
}
|
|
490
|
-
function unrollBufferSync
|
|
684
|
+
function unrollBufferSync(buffer, stream) {
|
|
491
685
|
for (let i = 0; i < buffer.length; i++) {
|
|
492
686
|
let item = buffer[i];
|
|
493
687
|
if (shared.isString(item)) {
|
|
@@ -495,22 +689,22 @@ function unrollBufferSync$1(buffer, stream) {
|
|
|
495
689
|
}
|
|
496
690
|
else {
|
|
497
691
|
// since this is a sync buffer, child buffers are never promises
|
|
498
|
-
unrollBufferSync
|
|
692
|
+
unrollBufferSync(item, stream);
|
|
499
693
|
}
|
|
500
694
|
}
|
|
501
695
|
}
|
|
502
696
|
function renderToSimpleStream(input, context, stream) {
|
|
503
|
-
if (isVNode
|
|
697
|
+
if (isVNode(input)) {
|
|
504
698
|
// raw vnode, wrap with app (for context)
|
|
505
|
-
return renderToSimpleStream(
|
|
699
|
+
return renderToSimpleStream(Vue.createApp({ render: () => input }), context, stream);
|
|
506
700
|
}
|
|
507
701
|
// rendering an app
|
|
508
|
-
const vnode =
|
|
702
|
+
const vnode = Vue.createVNode(input._component, input._props);
|
|
509
703
|
vnode.appContext = input._context;
|
|
510
704
|
// provide the ssr context to the tree
|
|
511
|
-
input.provide(
|
|
705
|
+
input.provide(Vue.ssrContextKey, context);
|
|
512
706
|
Promise.resolve(renderComponentVNode(vnode))
|
|
513
|
-
.then(buffer => unrollBuffer
|
|
707
|
+
.then(buffer => unrollBuffer(buffer, stream))
|
|
514
708
|
.then(() => resolveTeleports(context))
|
|
515
709
|
.then(() => {
|
|
516
710
|
if (context.__watcherHandles) {
|
|
@@ -617,160 +811,7 @@ function pipeToWebWritable(input, context = {}, writable) {
|
|
|
617
811
|
});
|
|
618
812
|
}
|
|
619
813
|
|
|
620
|
-
|
|
621
|
-
return renderComponentVNode(vue.createVNode(comp, props, children), parentComponent, slotScopeId);
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
|
|
625
|
-
// template-compiled slots are always rendered as fragments
|
|
626
|
-
push(`<!--[-->`);
|
|
627
|
-
ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId);
|
|
628
|
-
push(`<!--]-->`);
|
|
629
|
-
}
|
|
630
|
-
function ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId, transition) {
|
|
631
|
-
const slotFn = slots[slotName];
|
|
632
|
-
if (slotFn) {
|
|
633
|
-
const slotBuffer = [];
|
|
634
|
-
const bufferedPush = (item) => {
|
|
635
|
-
slotBuffer.push(item);
|
|
636
|
-
};
|
|
637
|
-
const ret = slotFn(slotProps, bufferedPush, parentComponent, slotScopeId ? ' ' + slotScopeId : '');
|
|
638
|
-
if (shared.isArray(ret)) {
|
|
639
|
-
// normal slot
|
|
640
|
-
renderVNodeChildren(push, ret, parentComponent, slotScopeId);
|
|
641
|
-
}
|
|
642
|
-
else {
|
|
643
|
-
// ssr slot.
|
|
644
|
-
// check if the slot renders all comments, in which case use the fallback
|
|
645
|
-
let isEmptySlot = true;
|
|
646
|
-
if (transition) {
|
|
647
|
-
isEmptySlot = false;
|
|
648
|
-
}
|
|
649
|
-
else {
|
|
650
|
-
for (let i = 0; i < slotBuffer.length; i++) {
|
|
651
|
-
if (!isComment(slotBuffer[i])) {
|
|
652
|
-
isEmptySlot = false;
|
|
653
|
-
break;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
if (isEmptySlot) {
|
|
658
|
-
if (fallbackRenderFn) {
|
|
659
|
-
fallbackRenderFn();
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
for (let i = 0; i < slotBuffer.length; i++) {
|
|
664
|
-
push(slotBuffer[i]);
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
else if (fallbackRenderFn) {
|
|
670
|
-
fallbackRenderFn();
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
const commentTestRE = /^<!--.*-->$/s;
|
|
674
|
-
const commentRE = /<!--[^]*?-->/gm;
|
|
675
|
-
function isComment(item) {
|
|
676
|
-
if (typeof item !== 'string' || !commentTestRE.test(item))
|
|
677
|
-
return false;
|
|
678
|
-
// if item is '<!---->' or '<!--[-->' or '<!--]-->', return true directly
|
|
679
|
-
if (item.length <= 8)
|
|
680
|
-
return true;
|
|
681
|
-
return !item.replace(commentRE, '').trim();
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
function ssrInterpolate(value) {
|
|
685
|
-
return shared.escapeHtml(shared.toDisplayString(value));
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
function ssrRenderList(source, renderItem) {
|
|
689
|
-
if (shared.isArray(source) || shared.isString(source)) {
|
|
690
|
-
for (let i = 0, l = source.length; i < l; i++) {
|
|
691
|
-
renderItem(source[i], i);
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
else if (typeof source === 'number') {
|
|
695
|
-
for (let i = 0; i < source; i++) {
|
|
696
|
-
renderItem(i + 1, i);
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
else if (shared.isObject(source)) {
|
|
700
|
-
if (source[Symbol.iterator]) {
|
|
701
|
-
const arr = Array.from(source);
|
|
702
|
-
for (let i = 0, l = arr.length; i < l; i++) {
|
|
703
|
-
renderItem(arr[i], i);
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
else {
|
|
707
|
-
const keys = Object.keys(source);
|
|
708
|
-
for (let i = 0, l = keys.length; i < l; i++) {
|
|
709
|
-
const key = keys[i];
|
|
710
|
-
renderItem(source[key], key, i);
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
async function ssrRenderSuspense(push, { default: renderContent }) {
|
|
717
|
-
if (renderContent) {
|
|
718
|
-
renderContent();
|
|
719
|
-
}
|
|
720
|
-
else {
|
|
721
|
-
push(`<!---->`);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
function ssrGetDirectiveProps(instance, dir, value, arg, modifiers = {}) {
|
|
726
|
-
if (typeof dir !== 'function' && dir.getSSRProps) {
|
|
727
|
-
return (dir.getSSRProps({
|
|
728
|
-
dir,
|
|
729
|
-
instance,
|
|
730
|
-
value,
|
|
731
|
-
oldValue: undefined,
|
|
732
|
-
arg,
|
|
733
|
-
modifiers
|
|
734
|
-
}, null) || {});
|
|
735
|
-
}
|
|
736
|
-
return {};
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
const ssrLooseEqual = shared.looseEqual;
|
|
740
|
-
function ssrLooseContain(arr, value) {
|
|
741
|
-
return shared.looseIndexOf(arr, value) > -1;
|
|
742
|
-
}
|
|
743
|
-
// for <input :type="type" v-model="model" value="value">
|
|
744
|
-
function ssrRenderDynamicModel(type, model, value) {
|
|
745
|
-
switch (type) {
|
|
746
|
-
case 'radio':
|
|
747
|
-
return shared.looseEqual(model, value) ? ' checked' : '';
|
|
748
|
-
case 'checkbox':
|
|
749
|
-
return (shared.isArray(model) ? ssrLooseContain(model, value) : model)
|
|
750
|
-
? ' checked'
|
|
751
|
-
: '';
|
|
752
|
-
default:
|
|
753
|
-
// text types
|
|
754
|
-
return ssrRenderAttr('value', model);
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
// for <input v-bind="obj" v-model="model">
|
|
758
|
-
function ssrGetDynamicModelProps(existingProps = {}, model) {
|
|
759
|
-
const { type, value } = existingProps;
|
|
760
|
-
switch (type) {
|
|
761
|
-
case 'radio':
|
|
762
|
-
return shared.looseEqual(model, value) ? { checked: true } : null;
|
|
763
|
-
case 'checkbox':
|
|
764
|
-
return (shared.isArray(model) ? ssrLooseContain(model, value) : model)
|
|
765
|
-
? { checked: true }
|
|
766
|
-
: null;
|
|
767
|
-
default:
|
|
768
|
-
// text types
|
|
769
|
-
return { value: model };
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
vue.initDirectivesForSSR();
|
|
814
|
+
Vue.initDirectivesForSSR();
|
|
774
815
|
|
|
775
816
|
exports.ssrIncludeBooleanAttr = shared.includeBooleanAttr;
|
|
776
817
|
exports.pipeToNodeWritable = pipeToNodeWritable;
|