@vue/server-renderer 3.6.0-rc.10 → 3.6.0-rc.12

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-rc.10
2
+ * @vue/server-renderer v3.6.0-rc.12
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -284,6 +284,7 @@ var internal_exports = /* @__PURE__ */ __exportAll({
284
284
  ssrRenderClass: () => ssrRenderClass,
285
285
  ssrRenderComponent: () => ssrRenderComponent,
286
286
  ssrRenderDynamicAttr: () => ssrRenderDynamicAttr,
287
+ ssrRenderDynamicComponent: () => renderDynamicComponent,
287
288
  ssrRenderDynamicModel: () => ssrRenderDynamicModel,
288
289
  ssrRenderList: () => ssrRenderList,
289
290
  ssrRenderSlot: () => ssrRenderSlot,
@@ -401,9 +402,17 @@ function findVaporSlot(children) {
401
402
  }
402
403
  function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
403
404
  const ctx = vnode.ctx;
404
- if (vnode.shapeFlag & 32 && ctx && ctx.type.__vapor) {
405
- const slots = vnode.children;
406
- for (const name in slots) if ((0, _vue_shared.isFunction)(slots[name])) slots[name][rawVaporSlotKey] = slots[name];
405
+ const slots = vnode.children;
406
+ if (vnode.shapeFlag & 32 && ctx && ctx.type.__vapor && slots._) {
407
+ for (const name in slots) {
408
+ const slot = slots[name];
409
+ if ((0, _vue_shared.isFunction)(slot) && !slot[rawVaporSlotKey]) {
410
+ const wrapped = (props, push, parent, scopeId) => push ? slot(props, push, parent, scopeId) : [(0, _vue_runtime_dom.renderSlot)({ [name]: slot }, name, props)];
411
+ slot[rawVaporSlotKey] = wrapped[rawVaporSlotKey] = slot;
412
+ wrapped._n = true;
413
+ slots[name] = wrapped;
414
+ }
415
+ }
407
416
  if (!ctx.appContext.vapor) ctx.appContext.vapor = vaporInterface;
408
417
  }
409
418
  const instance = vnode.component = createComponentInstance(vnode, parentComponent, null);
@@ -414,15 +423,20 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
414
423
  popWarningContext();
415
424
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
416
425
  let prefetches = instance.sp;
417
- if (hasAsyncSetup || prefetches) return Promise.resolve(res).then(() => {
426
+ let p;
427
+ if (hasAsyncSetup || prefetches) p = Promise.resolve(res).then(() => {
418
428
  if (hasAsyncSetup) prefetches = instance.sp;
419
- if (prefetches) return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy)));
420
- }).catch(_vue_shared.NOOP).then(() => renderComponentSubTree(instance, slotScopeId));
429
+ if (prefetches) try {
430
+ return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy))).catch(_vue_shared.NOOP);
431
+ } catch {}
432
+ }).then(() => renderComponentSubTree(instance, slotScopeId));
421
433
  else try {
422
434
  return renderComponentSubTree(instance, slotScopeId);
423
435
  } catch (err) {
424
- return Promise.reject(err);
436
+ p = Promise.reject(err);
425
437
  }
438
+ p.catch(_vue_shared.NOOP);
439
+ return p;
426
440
  }
427
441
  function renderComponentSubTree(instance, slotScopeId) {
428
442
  pushWarningContext(instance.vnode);
@@ -505,8 +519,8 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
505
519
  }
506
520
  case VaporSlot: {
507
521
  if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
508
- const { slot, outlets } = vnode.vs;
509
- renderVaporOutlet(push, slot, vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
522
+ const { slot, outlets, props } = vnode.vs;
523
+ renderVaporOutlet(push, slot, props || vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
510
524
  break;
511
525
  }
512
526
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
@@ -524,7 +538,13 @@ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScope
524
538
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
525
539
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
526
540
  }
527
- function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
541
+ function renderDynamicComponent(push, type, props, slots, parentComponent, slotScopeId) {
542
+ if ((0, _vue_shared.isString)(type) && type) {
543
+ const slot = slots && slots.default;
544
+ renderElementVNode(push, (0, _vue_runtime_dom.createVNode)(type, props), parentComponent, slotScopeId, slot && (() => slot(void 0, push, parentComponent, slotScopeId || "")));
545
+ } else renderVNode(push, (0, _vue_runtime_dom.createVNode)(type, props, slots), parentComponent, slotScopeId);
546
+ }
547
+ function renderElementVNode(push, vnode, parentComponent, slotScopeId, renderChildren) {
528
548
  const tag = vnode.type;
529
549
  let { props, children, shapeFlag, scopeId } = vnode;
530
550
  let openTag = `<${tag}`;
@@ -552,19 +572,20 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
552
572
  if (!(0, _vue_shared.isVoidTag)(tag)) {
553
573
  let hasChildrenOverride = false;
554
574
  if (props) {
555
- if (props.innerHTML) {
575
+ if (props.innerHTML != null) {
556
576
  hasChildrenOverride = true;
557
- push(props.innerHTML);
558
- } else if (props.textContent) {
577
+ push(String(props.innerHTML));
578
+ } else if (props.textContent != null) {
559
579
  hasChildrenOverride = true;
560
580
  push((0, _vue_shared.escapeHtml)(props.textContent));
561
- } else if (tag === "textarea" && props.value) {
581
+ } else if (tag === "textarea" && props.value != null) {
562
582
  hasChildrenOverride = true;
563
583
  push((0, _vue_shared.escapeHtml)(props.value));
564
584
  }
565
585
  }
566
586
  if (!hasChildrenOverride) {
567
- if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
587
+ if (renderChildren) renderChildren();
588
+ else if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
568
589
  else if (shapeFlag & 16) renderVNodeChildren(push, children, parentComponent, slotScopeId);
569
590
  }
570
591
  push(`</${tag}>`);
@@ -639,13 +660,41 @@ async function renderToString(input, context = {}) {
639
660
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
640
661
  vnode.appContext = input._context;
641
662
  input.provide(_vue_runtime_dom.ssrContextKey, context);
663
+ let buffer;
664
+ let result;
642
665
  try {
643
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
666
+ buffer = await renderComponentVNode(vnode);
667
+ result = await unrollBuffer$1(buffer);
644
668
  await resolveTeleports(context);
645
- return result;
646
- } finally {
647
- cleanupContext(context);
669
+ } catch (err) {
670
+ cleanupFailedRender(buffer, context);
671
+ throw err;
648
672
  }
673
+ cleanupContext(context);
674
+ return result;
675
+ }
676
+ /**
677
+ * Stops watchers without masking the render error. Components after the
678
+ * failure point are still in flight and can register watchers once the render
679
+ * has settled, so those are stopped when they finish.
680
+ * Cleanup errors here have already been reported by the watcher.
681
+ */
682
+ function cleanupFailedRender(buffer, context) {
683
+ try {
684
+ cleanupContext(context);
685
+ } catch {}
686
+ (async () => {
687
+ if (buffer) await settleBuffer(buffer);
688
+ for (const key in context.__teleportBuffers) await settleBuffer(context.__teleportBuffers[key]);
689
+ cleanupContext(context);
690
+ })().catch(_vue_shared.NOOP);
691
+ }
692
+ async function settleBuffer(buffer) {
693
+ if (!buffer.hasAsync) return;
694
+ for (let item of buffer) try {
695
+ if ((0, _vue_shared.isPromise)(item)) item = await item;
696
+ if (!(0, _vue_shared.isString)(item)) await settleBuffer(item);
697
+ } catch {}
649
698
  }
650
699
  async function resolveTeleports(context) {
651
700
  if (context.__teleportBuffers) {
@@ -677,19 +726,12 @@ function renderToSimpleStream(input, context, stream) {
677
726
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
678
727
  vnode.appContext = input._context;
679
728
  input.provide(_vue_runtime_dom.ssrContextKey, context);
680
- let cleaned = false;
681
- const finalize = () => {
682
- if (cleaned) return;
683
- cleaned = true;
729
+ let buffer;
730
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((b) => unrollBuffer(buffer = b, stream)).then(() => resolveTeleports(context)).then(() => {
684
731
  cleanupContext(context);
685
- };
686
- Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
687
- finalize();
688
732
  return stream.push(null);
689
733
  }).catch((error) => {
690
- try {
691
- finalize();
692
- } catch {}
734
+ cleanupFailedRender(buffer, context);
693
735
  stream.destroy(error);
694
736
  });
695
737
  return stream;
@@ -780,6 +822,7 @@ exports.ssrRenderAttrs = ssrRenderAttrs;
780
822
  exports.ssrRenderClass = ssrRenderClass;
781
823
  exports.ssrRenderComponent = ssrRenderComponent;
782
824
  exports.ssrRenderDynamicAttr = ssrRenderDynamicAttr;
825
+ exports.ssrRenderDynamicComponent = renderDynamicComponent;
783
826
  exports.ssrRenderDynamicModel = ssrRenderDynamicModel;
784
827
  exports.ssrRenderList = ssrRenderList;
785
828
  exports.ssrRenderSlot = ssrRenderSlot;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @vue/server-renderer v3.6.0-rc.10
2
+ * @vue/server-renderer v3.6.0-rc.12
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -211,8 +211,10 @@ function ssrInterpolate(value) {
211
211
  //#region packages/server-renderer/src/helpers/ssrRenderList.ts
212
212
  function ssrRenderList(source, renderItem) {
213
213
  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);
214
- else if (typeof source === "number") for (let i = 0; i < source; i++) renderItem(i + 1, i);
215
- else if ((0, _vue_shared.isObject)(source)) {
214
+ else if (typeof source === "number") {
215
+ if (!Number.isInteger(source) || source < 0) return;
216
+ for (let i = 0; i < source; i++) renderItem(i + 1, i);
217
+ } else if ((0, _vue_shared.isObject)(source)) {
216
218
  if (source[Symbol.iterator]) {
217
219
  let i = 0;
218
220
  for (const item of source) renderItem(item, i++);
@@ -279,6 +281,7 @@ var internal_exports = /* @__PURE__ */ __exportAll({
279
281
  ssrRenderClass: () => ssrRenderClass,
280
282
  ssrRenderComponent: () => ssrRenderComponent,
281
283
  ssrRenderDynamicAttr: () => ssrRenderDynamicAttr,
284
+ ssrRenderDynamicComponent: () => renderDynamicComponent,
282
285
  ssrRenderDynamicModel: () => ssrRenderDynamicModel,
283
286
  ssrRenderList: () => ssrRenderList,
284
287
  ssrRenderSlot: () => ssrRenderSlot,
@@ -392,9 +395,17 @@ function findVaporSlot(children) {
392
395
  }
393
396
  function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
394
397
  const ctx = vnode.ctx;
395
- if (vnode.shapeFlag & 32 && ctx && ctx.type.__vapor) {
396
- const slots = vnode.children;
397
- for (const name in slots) if ((0, _vue_shared.isFunction)(slots[name])) slots[name][rawVaporSlotKey] = slots[name];
398
+ const slots = vnode.children;
399
+ if (vnode.shapeFlag & 32 && ctx && ctx.type.__vapor && slots._) {
400
+ for (const name in slots) {
401
+ const slot = slots[name];
402
+ if ((0, _vue_shared.isFunction)(slot) && !slot[rawVaporSlotKey]) {
403
+ const wrapped = (props, push, parent, scopeId) => push ? slot(props, push, parent, scopeId) : [(0, _vue_runtime_dom.renderSlot)({ [name]: slot }, name, props)];
404
+ slot[rawVaporSlotKey] = wrapped[rawVaporSlotKey] = slot;
405
+ wrapped._n = true;
406
+ slots[name] = wrapped;
407
+ }
408
+ }
398
409
  if (!ctx.appContext.vapor) ctx.appContext.vapor = vaporInterface;
399
410
  }
400
411
  const instance = vnode.component = createComponentInstance(vnode, parentComponent, null);
@@ -403,15 +414,20 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
403
414
  const res = setupComponent(instance, true);
404
415
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
405
416
  let prefetches = instance.sp;
406
- if (hasAsyncSetup || prefetches) return Promise.resolve(res).then(() => {
417
+ let p;
418
+ if (hasAsyncSetup || prefetches) p = Promise.resolve(res).then(() => {
407
419
  if (hasAsyncSetup) prefetches = instance.sp;
408
- if (prefetches) return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy)));
409
- }).catch(_vue_shared.NOOP).then(() => renderComponentSubTree(instance, slotScopeId));
420
+ if (prefetches) try {
421
+ return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy))).catch(_vue_shared.NOOP);
422
+ } catch {}
423
+ }).then(() => renderComponentSubTree(instance, slotScopeId));
410
424
  else try {
411
425
  return renderComponentSubTree(instance, slotScopeId);
412
426
  } catch (err) {
413
- return Promise.reject(err);
427
+ p = Promise.reject(err);
414
428
  }
429
+ p.catch(_vue_shared.NOOP);
430
+ return p;
415
431
  }
416
432
  function renderComponentSubTree(instance, slotScopeId) {
417
433
  const comp = instance.type;
@@ -492,8 +508,8 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
492
508
  }
493
509
  case VaporSlot: {
494
510
  if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
495
- const { slot, outlets } = vnode.vs;
496
- renderVaporOutlet(push, slot, vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
511
+ const { slot, outlets, props } = vnode.vs;
512
+ renderVaporOutlet(push, slot, props || vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
497
513
  break;
498
514
  }
499
515
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
@@ -511,7 +527,13 @@ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScope
511
527
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
512
528
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
513
529
  }
514
- function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
530
+ function renderDynamicComponent(push, type, props, slots, parentComponent, slotScopeId) {
531
+ if ((0, _vue_shared.isString)(type) && type) {
532
+ const slot = slots && slots.default;
533
+ renderElementVNode(push, (0, _vue_runtime_dom.createVNode)(type, props), parentComponent, slotScopeId, slot && (() => slot(void 0, push, parentComponent, slotScopeId || "")));
534
+ } else renderVNode(push, (0, _vue_runtime_dom.createVNode)(type, props, slots), parentComponent, slotScopeId);
535
+ }
536
+ function renderElementVNode(push, vnode, parentComponent, slotScopeId, renderChildren) {
515
537
  const tag = vnode.type;
516
538
  let { props, children, shapeFlag, scopeId } = vnode;
517
539
  let openTag = `<${tag}`;
@@ -539,19 +561,20 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
539
561
  if (!(0, _vue_shared.isVoidTag)(tag)) {
540
562
  let hasChildrenOverride = false;
541
563
  if (props) {
542
- if (props.innerHTML) {
564
+ if (props.innerHTML != null) {
543
565
  hasChildrenOverride = true;
544
- push(props.innerHTML);
545
- } else if (props.textContent) {
566
+ push(String(props.innerHTML));
567
+ } else if (props.textContent != null) {
546
568
  hasChildrenOverride = true;
547
569
  push((0, _vue_shared.escapeHtml)(props.textContent));
548
- } else if (tag === "textarea" && props.value) {
570
+ } else if (tag === "textarea" && props.value != null) {
549
571
  hasChildrenOverride = true;
550
572
  push((0, _vue_shared.escapeHtml)(props.value));
551
573
  }
552
574
  }
553
575
  if (!hasChildrenOverride) {
554
- if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
576
+ if (renderChildren) renderChildren();
577
+ else if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
555
578
  else if (shapeFlag & 16) renderVNodeChildren(push, children, parentComponent, slotScopeId);
556
579
  }
557
580
  push(`</${tag}>`);
@@ -626,13 +649,41 @@ async function renderToString(input, context = {}) {
626
649
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
627
650
  vnode.appContext = input._context;
628
651
  input.provide(_vue_runtime_dom.ssrContextKey, context);
652
+ let buffer;
653
+ let result;
629
654
  try {
630
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
655
+ buffer = await renderComponentVNode(vnode);
656
+ result = await unrollBuffer$1(buffer);
631
657
  await resolveTeleports(context);
632
- return result;
633
- } finally {
634
- cleanupContext(context);
658
+ } catch (err) {
659
+ cleanupFailedRender(buffer, context);
660
+ throw err;
635
661
  }
662
+ cleanupContext(context);
663
+ return result;
664
+ }
665
+ /**
666
+ * Stops watchers without masking the render error. Components after the
667
+ * failure point are still in flight and can register watchers once the render
668
+ * has settled, so those are stopped when they finish.
669
+ * Cleanup errors here have already been reported by the watcher.
670
+ */
671
+ function cleanupFailedRender(buffer, context) {
672
+ try {
673
+ cleanupContext(context);
674
+ } catch {}
675
+ (async () => {
676
+ if (buffer) await settleBuffer(buffer);
677
+ for (const key in context.__teleportBuffers) await settleBuffer(context.__teleportBuffers[key]);
678
+ cleanupContext(context);
679
+ })().catch(_vue_shared.NOOP);
680
+ }
681
+ async function settleBuffer(buffer) {
682
+ if (!buffer.hasAsync) return;
683
+ for (let item of buffer) try {
684
+ if ((0, _vue_shared.isPromise)(item)) item = await item;
685
+ if (!(0, _vue_shared.isString)(item)) await settleBuffer(item);
686
+ } catch {}
636
687
  }
637
688
  async function resolveTeleports(context) {
638
689
  if (context.__teleportBuffers) {
@@ -664,19 +715,12 @@ function renderToSimpleStream(input, context, stream) {
664
715
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
665
716
  vnode.appContext = input._context;
666
717
  input.provide(_vue_runtime_dom.ssrContextKey, context);
667
- let cleaned = false;
668
- const finalize = () => {
669
- if (cleaned) return;
670
- cleaned = true;
718
+ let buffer;
719
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((b) => unrollBuffer(buffer = b, stream)).then(() => resolveTeleports(context)).then(() => {
671
720
  cleanupContext(context);
672
- };
673
- Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
674
- finalize();
675
721
  return stream.push(null);
676
722
  }).catch((error) => {
677
- try {
678
- finalize();
679
- } catch {}
723
+ cleanupFailedRender(buffer, context);
680
724
  stream.destroy(error);
681
725
  });
682
726
  return stream;
@@ -767,6 +811,7 @@ exports.ssrRenderAttrs = ssrRenderAttrs;
767
811
  exports.ssrRenderClass = ssrRenderClass;
768
812
  exports.ssrRenderComponent = ssrRenderComponent;
769
813
  exports.ssrRenderDynamicAttr = ssrRenderDynamicAttr;
814
+ exports.ssrRenderDynamicComponent = renderDynamicComponent;
770
815
  exports.ssrRenderDynamicModel = ssrRenderDynamicModel;
771
816
  exports.ssrRenderList = ssrRenderList;
772
817
  exports.ssrRenderSlot = ssrRenderSlot;
@@ -1,4 +1,4 @@
1
- import { App, Component, ComponentInternalInstance, ComponentPublicInstance, Directive, Slots, VNode } from "@vue/runtime-dom";
1
+ import { App, Component, ComponentInternalInstance, ComponentPublicInstance, Directive, Slots, VNode, VNodeTypes } from "@vue/runtime-dom";
2
2
  import { Readable, Writable } from "node:stream";
3
3
  import { includeBooleanAttr as ssrIncludeBooleanAttr } from "@vue/shared";
4
4
  //#region temp/packages/server-renderer/src/render.d.ts
@@ -13,6 +13,7 @@ export type SSRContext = {
13
13
  teleports?: Record<string, string>;
14
14
  };
15
15
  export declare function renderVNode(push: PushFn, vnode: VNode, parentComponent: ComponentInternalInstance, slotScopeId?: string): void;
16
+ export declare function renderDynamicComponent(push: PushFn, type: VNodeTypes, props: Props | null, slots: Record<string, any> | null, parentComponent: ComponentInternalInstance, slotScopeId?: string): void;
16
17
  //#endregion
17
18
  //#region temp/packages/server-renderer/src/renderToString.d.ts
18
19
  export declare function renderToString(input: App | VNode, context?: SSRContext): Promise<string>;
@@ -73,4 +74,4 @@ export declare function ssrGetDynamicModelProps(existingProps: any | undefined,
73
74
  value: any;
74
75
  } | null;
75
76
  //#endregion
76
- export { ssrIncludeBooleanAttr, renderVNode as ssrRenderVNode };
77
+ export { ssrIncludeBooleanAttr, renderDynamicComponent as ssrRenderDynamicComponent, renderVNode as ssrRenderVNode };