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