@vue/server-renderer 3.6.0-beta.8 → 3.6.0-rc.1

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,5 +1,5 @@
1
1
  /**
2
- * @vue/server-renderer v3.6.0-beta.8
2
+ * @vue/server-renderer v3.6.0-rc.1
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -38,8 +38,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
38
38
  enumerable: true
39
39
  }) : target, mod));
40
40
  //#endregion
41
- let vue = require("vue");
42
- vue = __toESM(vue);
41
+ let _vue_runtime_dom = require("@vue/runtime-dom");
42
+ _vue_runtime_dom = __toESM(_vue_runtime_dom);
43
43
  let _vue_shared = require("@vue/shared");
44
44
  let _vue_compiler_ssr = require("@vue/compiler-ssr");
45
45
  //#region packages/server-renderer/src/helpers/ssrRenderAttrs.ts
@@ -92,11 +92,16 @@ function ssrResetCssVars(raw) {
92
92
  //#endregion
93
93
  //#region packages/server-renderer/src/helpers/ssrRenderComponent.ts
94
94
  function ssrRenderComponent(comp, props = null, children = null, parentComponent = null, slotScopeId) {
95
- return renderComponentVNode((0, vue.createVNode)(comp, props, children), parentComponent, slotScopeId);
95
+ if ((0, _vue_shared.isString)(comp)) {
96
+ const { getBuffer, push } = createBuffer();
97
+ renderVNode(push, (0, _vue_runtime_dom.createVNode)(comp, props, children), parentComponent, slotScopeId);
98
+ return getBuffer();
99
+ }
100
+ return renderComponentVNode((0, _vue_runtime_dom.createVNode)(comp, props, children), parentComponent, slotScopeId);
96
101
  }
97
102
  //#endregion
98
103
  //#region packages/server-renderer/src/helpers/ssrRenderSlot.ts
99
- const { ensureValidVNode } = vue.ssrUtils;
104
+ const { ensureValidVNode } = _vue_runtime_dom.ssrUtils;
100
105
  function ssrRenderSlot(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId) {
101
106
  push(`<!--[-->`);
102
107
  ssrRenderSlotInner(slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId);
@@ -149,7 +154,7 @@ function isComment(item) {
149
154
  //#region packages/server-renderer/src/helpers/ssrRenderTeleport.ts
150
155
  function ssrRenderTeleport(parentPush, contentRenderFn, target, disabled, parentComponent) {
151
156
  parentPush("<!--teleport start-->");
152
- const context = parentComponent.appContext.provides[vue.ssrContextKey];
157
+ const context = parentComponent.appContext.provides[_vue_runtime_dom.ssrContextKey];
153
158
  const teleportBuffers = context.__teleportBuffers || (context.__teleportBuffers = {});
154
159
  const targetBuffer = teleportBuffers[target] || (teleportBuffers[target] = []);
155
160
  const bufferIndex = targetBuffer.length;
@@ -165,6 +170,7 @@ function ssrRenderTeleport(parentPush, contentRenderFn, target, disabled, parent
165
170
  teleportContent = getBuffer();
166
171
  }
167
172
  targetBuffer.splice(bufferIndex, 0, teleportContent);
173
+ if ((0, _vue_shared.isPromise)(teleportContent) || (0, _vue_shared.isArray)(teleportContent) && teleportContent.hasAsync) targetBuffer.hasAsync = true;
168
174
  parentPush("<!--teleport end-->");
169
175
  }
170
176
  //#endregion
@@ -178,8 +184,8 @@ function ssrRenderList(source, renderItem) {
178
184
  if ((0, _vue_shared.isArray)(source) || (0, _vue_shared.isString)(source)) for (let i = 0, l = source.length; i < l; i++) renderItem(source[i], i);
179
185
  else if (typeof source === "number") for (let i = 0; i < source; i++) renderItem(i + 1, i);
180
186
  else if ((0, _vue_shared.isObject)(source)) if (source[Symbol.iterator]) {
181
- const arr = Array.from(source);
182
- for (let i = 0, l = arr.length; i < l; i++) renderItem(arr[i], i);
187
+ let i = 0;
188
+ for (const item of source) renderItem(item, i++);
183
189
  } else {
184
190
  const keys = Object.keys(source);
185
191
  for (let i = 0, l = keys.length; i < l; i++) {
@@ -190,7 +196,7 @@ function ssrRenderList(source, renderItem) {
190
196
  }
191
197
  //#endregion
192
198
  //#region packages/server-renderer/src/helpers/ssrRenderSuspense.ts
193
- async function ssrRenderSuspense(push, { default: renderContent }) {
199
+ function ssrRenderSuspense(push, { default: renderContent }) {
194
200
  if (renderContent) renderContent();
195
201
  else push(`<!---->`);
196
202
  }
@@ -199,7 +205,7 @@ async function ssrRenderSuspense(push, { default: renderContent }) {
199
205
  function ssrGetDirectiveProps(instance, dir, value, arg, modifiers = {}) {
200
206
  if (typeof dir !== "function" && dir.getSSRProps) return dir.getSSRProps({
201
207
  dir,
202
- instance: vue.ssrUtils.getComponentPublicInstance(instance.$),
208
+ instance: _vue_runtime_dom.ssrUtils.getComponentPublicInstance(instance.$),
203
209
  value,
204
210
  oldValue: void 0,
205
211
  arg,
@@ -277,7 +283,7 @@ function ssrCompile(template, instance) {
277
283
  };
278
284
  const { code } = (0, _vue_compiler_ssr.compile)(template, finalCompilerOptions);
279
285
  const requireMap = {
280
- vue,
286
+ vue: _vue_runtime_dom,
281
287
  "vue/server-renderer": internal_exports
282
288
  };
283
289
  const fakeRequire = (id) => requireMap[id];
@@ -285,7 +291,27 @@ function ssrCompile(template, instance) {
285
291
  }
286
292
  //#endregion
287
293
  //#region packages/server-renderer/src/render.ts
288
- const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, normalizeVNode, pushWarningContext, popWarningContext } = vue.ssrUtils;
294
+ const { createComponentInstance, setCurrentRenderingInstance, setupComponent, renderComponentRoot, normalizeVNode, pushWarningContext, popWarningContext } = _vue_runtime_dom.ssrUtils;
295
+ function cleanupContext(context) {
296
+ let firstError;
297
+ if (context.__watcherHandles) {
298
+ for (const unwatch of context.__watcherHandles) try {
299
+ unwatch();
300
+ } catch (err) {
301
+ if (firstError === void 0) firstError = err;
302
+ }
303
+ context.__watcherHandles.length = 0;
304
+ }
305
+ if (context.__instanceScopes) {
306
+ for (const scope of context.__instanceScopes) try {
307
+ scope.stop();
308
+ } catch (err) {
309
+ if (firstError === void 0) firstError = err;
310
+ }
311
+ context.__instanceScopes.length = 0;
312
+ }
313
+ if (firstError !== void 0) throw firstError;
314
+ }
289
315
  function createBuffer() {
290
316
  let appendable = false;
291
317
  const buffer = [];
@@ -307,6 +333,8 @@ function createBuffer() {
307
333
  }
308
334
  function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
309
335
  const instance = vnode.component = createComponentInstance(vnode, parentComponent, null);
336
+ const context = instance.appContext.provides[_vue_runtime_dom.ssrContextKey];
337
+ if (context) (context.__instanceScopes || (context.__instanceScopes = [])).push(instance.scope);
310
338
  const res = setupComponent(instance, true);
311
339
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
312
340
  let prefetches = instance.sp;
@@ -314,7 +342,11 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
314
342
  if (hasAsyncSetup) prefetches = instance.sp;
315
343
  if (prefetches) return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy)));
316
344
  }).catch(_vue_shared.NOOP).then(() => renderComponentSubTree(instance, slotScopeId));
317
- else return renderComponentSubTree(instance, slotScopeId);
345
+ else try {
346
+ return renderComponentSubTree(instance, slotScopeId);
347
+ } catch (err) {
348
+ return Promise.reject(err);
349
+ }
318
350
  }
319
351
  function renderComponentSubTree(instance, slotScopeId) {
320
352
  const comp = instance.type;
@@ -353,12 +385,14 @@ function renderComponentSubTree(instance, slotScopeId) {
353
385
  const prev = setCurrentRenderingInstance(instance);
354
386
  try {
355
387
  ssrRender(instance.proxy, push, instance, attrs, instance.props, instance.setupState, instance.data, instance.ctx);
388
+ } catch (err) {
389
+ (0, _vue_runtime_dom.handleError)(err, instance, 1);
356
390
  } finally {
357
391
  setCurrentRenderingInstance(prev);
358
392
  }
359
393
  } else if (instance.render && instance.render !== _vue_shared.NOOP) renderVNode(push, instance.subTree = renderComponentRoot(instance), instance, slotScopeId);
360
394
  else {
361
- (0, vue.warn)(`Component ${comp.name || comp.__file || `<Anonymous>`} is missing template or render function.`);
395
+ (0, _vue_runtime_dom.warn)(`Component ${comp.name || comp.__file || `<Anonymous>`} is missing template or render function.`);
362
396
  push(`<!---->`);
363
397
  }
364
398
  }
@@ -368,16 +402,16 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
368
402
  const { type, shapeFlag, children, dirs, props } = vnode;
369
403
  if (dirs) vnode.props = applySSRDirectives(vnode, props, dirs);
370
404
  switch (type) {
371
- case vue.Text:
405
+ case _vue_runtime_dom.Text:
372
406
  push((0, _vue_shared.escapeHtml)(children));
373
407
  break;
374
- case vue.Comment:
408
+ case _vue_runtime_dom.Comment:
375
409
  push(children ? `<!--${(0, _vue_shared.escapeHtmlComment)(children)}-->` : `<!---->`);
376
410
  break;
377
- case vue.Static:
411
+ case _vue_runtime_dom.Static:
378
412
  push(children);
379
413
  break;
380
- case vue.Fragment:
414
+ case _vue_runtime_dom.Fragment:
381
415
  if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
382
416
  push(`<!--[-->`);
383
417
  renderVNodeChildren(push, children, parentComponent, slotScopeId);
@@ -387,7 +421,7 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
387
421
  else if (shapeFlag & 6) push(renderComponentVNode(vnode, parentComponent, slotScopeId));
388
422
  else if (shapeFlag & 64) renderTeleportVNode(push, vnode, parentComponent, slotScopeId);
389
423
  else if (shapeFlag & 128) renderVNode(push, vnode.ssContent, parentComponent, slotScopeId);
390
- else (0, vue.warn)("[@vue/server-renderer] Invalid VNode type:", type, `(${typeof type})`);
424
+ else (0, _vue_runtime_dom.warn)("[@vue/server-renderer] Invalid VNode type:", type, `(${typeof type})`);
391
425
  }
392
426
  }
393
427
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
@@ -398,15 +432,25 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
398
432
  let { props, children, shapeFlag, scopeId } = vnode;
399
433
  let openTag = `<${tag}`;
400
434
  if (props) openTag += ssrRenderAttrs(props, tag);
401
- if (scopeId) openTag += ` ${scopeId}`;
435
+ const renderedScopeIds = [];
436
+ const appendScopeId = (id) => {
437
+ if (id && (!props || !(0, _vue_shared.hasOwn)(props, id)) && !renderedScopeIds.includes(id)) {
438
+ openTag += ` ${id}`;
439
+ renderedScopeIds.push(id);
440
+ }
441
+ };
442
+ if (scopeId) appendScopeId(scopeId);
402
443
  let curParent = parentComponent;
403
444
  let curVnode = vnode;
404
445
  while (curParent && curVnode === curParent.subTree) {
405
446
  curVnode = curParent.vnode;
406
- if (curVnode.scopeId) openTag += ` ${curVnode.scopeId}`;
447
+ if (curVnode.scopeId) appendScopeId(curVnode.scopeId);
407
448
  curParent = curParent.parent;
408
449
  }
409
- if (slotScopeId) openTag += ` ${slotScopeId}`;
450
+ if (slotScopeId) {
451
+ const slotScopeIdList = slotScopeId.trim().split(" ");
452
+ for (let i = 0; i < slotScopeIdList.length; i++) appendScopeId(slotScopeIdList[i]);
453
+ }
410
454
  push(openTag + `>`);
411
455
  if (!(0, _vue_shared.isVoidTag)(tag)) {
412
456
  let hasChildrenOverride = false;
@@ -439,17 +483,17 @@ function applySSRDirectives(vnode, rawProps, dirs) {
439
483
  if (props) toMerge.push(props);
440
484
  }
441
485
  }
442
- return (0, vue.mergeProps)(rawProps || {}, ...toMerge);
486
+ return (0, _vue_runtime_dom.mergeProps)(rawProps || {}, ...toMerge);
443
487
  }
444
488
  function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
445
489
  const target = vnode.props && vnode.props.to;
446
490
  const disabled = vnode.props && vnode.props.disabled;
447
491
  if (!target) {
448
- if (!disabled) (0, vue.warn)(`[@vue/server-renderer] Teleport is missing target prop.`);
492
+ if (!disabled) (0, _vue_runtime_dom.warn)(`[@vue/server-renderer] Teleport is missing target prop.`);
449
493
  return [];
450
494
  }
451
495
  if (!(0, _vue_shared.isString)(target)) {
452
- (0, vue.warn)(`[@vue/server-renderer] Teleport target must be a query selector string.`);
496
+ (0, _vue_runtime_dom.warn)(`[@vue/server-renderer] Teleport target must be a query selector string.`);
453
497
  return [];
454
498
  }
455
499
  ssrRenderTeleport(push, (push) => {
@@ -458,7 +502,7 @@ function renderTeleportVNode(push, vnode, parentComponent, slotScopeId) {
458
502
  }
459
503
  //#endregion
460
504
  //#region packages/server-renderer/src/renderToString.ts
461
- const { isVNode: isVNode$1 } = vue.ssrUtils;
505
+ const { isVNode: isVNode$1 } = _vue_runtime_dom.ssrUtils;
462
506
  function nestedUnrollBuffer(buffer, parentRet, startIndex) {
463
507
  if (!buffer.hasAsync) return parentRet + unrollBufferSync$1(buffer);
464
508
  let ret = parentRet;
@@ -494,24 +538,27 @@ function unrollBufferSync$1(buffer) {
494
538
  return ret;
495
539
  }
496
540
  async function renderToString(input, context = {}) {
497
- if (isVNode$1(input)) return renderToString((0, vue.createApp)({ render: () => input }), context);
498
- const vnode = (0, vue.createVNode)(input._component, input._props);
541
+ if (isVNode$1(input)) return renderToString((0, _vue_runtime_dom.createApp)({ render: () => input }), context);
542
+ const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
499
543
  vnode.appContext = input._context;
500
- input.provide(vue.ssrContextKey, context);
501
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
502
- await resolveTeleports(context);
503
- if (context.__watcherHandles) for (const unwatch of context.__watcherHandles) unwatch();
504
- return result;
544
+ input.provide(_vue_runtime_dom.ssrContextKey, context);
545
+ try {
546
+ const result = await unrollBuffer$1(await renderComponentVNode(vnode));
547
+ await resolveTeleports(context);
548
+ return result;
549
+ } finally {
550
+ cleanupContext(context);
551
+ }
505
552
  }
506
553
  async function resolveTeleports(context) {
507
554
  if (context.__teleportBuffers) {
508
555
  context.teleports = context.teleports || {};
509
- for (const key in context.__teleportBuffers) context.teleports[key] = await unrollBuffer$1(await Promise.all([context.__teleportBuffers[key]]));
556
+ for (const key in context.__teleportBuffers) context.teleports[key] = await unrollBuffer$1(context.__teleportBuffers[key]);
510
557
  }
511
558
  }
512
559
  //#endregion
513
560
  //#region packages/server-renderer/src/renderToStream.ts
514
- const { isVNode } = vue.ssrUtils;
561
+ const { isVNode } = _vue_runtime_dom.ssrUtils;
515
562
  async function unrollBuffer(buffer, stream) {
516
563
  if (buffer.hasAsync) for (let i = 0; i < buffer.length; i++) {
517
564
  let item = buffer[i];
@@ -523,19 +570,29 @@ async function unrollBuffer(buffer, stream) {
523
570
  }
524
571
  function unrollBufferSync(buffer, stream) {
525
572
  for (let i = 0; i < buffer.length; i++) {
526
- let item = buffer[i];
573
+ const item = buffer[i];
527
574
  if ((0, _vue_shared.isString)(item)) stream.push(item);
528
575
  else unrollBufferSync(item, stream);
529
576
  }
530
577
  }
531
578
  function renderToSimpleStream(input, context, stream) {
532
- if (isVNode(input)) return renderToSimpleStream((0, vue.createApp)({ render: () => input }), context, stream);
533
- const vnode = (0, vue.createVNode)(input._component, input._props);
579
+ if (isVNode(input)) return renderToSimpleStream((0, _vue_runtime_dom.createApp)({ render: () => input }), context, stream);
580
+ const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
534
581
  vnode.appContext = input._context;
535
- input.provide(vue.ssrContextKey, context);
536
- Promise.resolve(renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
537
- if (context.__watcherHandles) for (const unwatch of context.__watcherHandles) unwatch();
538
- }).then(() => stream.push(null)).catch((error) => {
582
+ input.provide(_vue_runtime_dom.ssrContextKey, context);
583
+ let cleaned = false;
584
+ const finalize = () => {
585
+ if (cleaned) return;
586
+ cleaned = true;
587
+ cleanupContext(context);
588
+ };
589
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
590
+ finalize();
591
+ return stream.push(null);
592
+ }).catch((error) => {
593
+ try {
594
+ finalize();
595
+ } catch {}
539
596
  stream.destroy(error);
540
597
  });
541
598
  return stream;
@@ -606,7 +663,7 @@ function pipeToWebWritable(input, context = {}, writable) {
606
663
  }
607
664
  //#endregion
608
665
  //#region packages/server-renderer/src/index.ts
609
- (0, vue.initDirectivesForSSR)();
666
+ (0, _vue_runtime_dom.initDirectivesForSSR)();
610
667
  //#endregion
611
668
  exports.pipeToNodeWritable = pipeToNodeWritable;
612
669
  exports.pipeToWebWritable = pipeToWebWritable;
@@ -1,4 +1,4 @@
1
- import { App, Component, ComponentInternalInstance, ComponentPublicInstance, Directive, Slots, VNode } from "vue";
1
+ import { App, Component, ComponentInternalInstance, ComponentPublicInstance, Directive, Slots, VNode } from "@vue/runtime-dom";
2
2
  import { Readable, Writable } from "node:stream";
3
3
  import { includeBooleanAttr as ssrIncludeBooleanAttr } from "@vue/shared";
4
4
 
@@ -40,7 +40,7 @@ export declare function ssrRenderSlot(slots: Slots | SSRSlots, slotName: string,
40
40
  export declare function ssrRenderSlotInner(slots: Slots | SSRSlots, slotName: string, slotProps: Props, fallbackRenderFn: (() => void) | null, push: PushFn, parentComponent: ComponentInternalInstance, slotScopeId?: string, transition?: boolean): void;
41
41
  //#endregion
42
42
  //#region temp/packages/server-renderer/src/helpers/ssrRenderComponent.d.ts
43
- export declare function ssrRenderComponent(comp: Component, props?: Props | null, children?: Slots | SSRSlots | null, parentComponent?: ComponentInternalInstance | null, slotScopeId?: string): SSRBuffer | Promise<SSRBuffer>;
43
+ export declare function ssrRenderComponent(comp: Component | string, props?: Props | null, children?: Slots | SSRSlots | null, parentComponent?: ComponentInternalInstance | null, slotScopeId?: string): SSRBuffer | Promise<SSRBuffer>;
44
44
  //#endregion
45
45
  //#region temp/packages/server-renderer/src/helpers/ssrRenderTeleport.d.ts
46
46
  export declare function ssrRenderTeleport(parentPush: PushFn, contentRenderFn: (push: PushFn) => void, target: string, disabled: boolean, parentComponent: ComponentInternalInstance): void;
@@ -61,7 +61,7 @@ export declare function ssrRenderList(source: unknown, renderItem: (value: unkno
61
61
  //#region temp/packages/server-renderer/src/helpers/ssrRenderSuspense.d.ts
62
62
  export declare function ssrRenderSuspense(push: PushFn, {
63
63
  default: renderContent
64
- }: Record<string, (() => void) | undefined>): Promise<void>;
64
+ }: Record<string, (() => void) | undefined>): void;
65
65
  //#endregion
66
66
  //#region temp/packages/server-renderer/src/helpers/ssrGetDirectiveProps.d.ts
67
67
  export declare function ssrGetDirectiveProps(instance: ComponentPublicInstance, dir: Directive, value?: any, arg?: string, modifiers?: Record<string, boolean>): Record<string, any>;