@vue/server-renderer 3.6.0-rc.11 → 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.11
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,
@@ -422,15 +423,20 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
422
423
  popWarningContext();
423
424
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
424
425
  let prefetches = instance.sp;
425
- if (hasAsyncSetup || prefetches) return Promise.resolve(res).then(() => {
426
+ let p;
427
+ if (hasAsyncSetup || prefetches) p = Promise.resolve(res).then(() => {
426
428
  if (hasAsyncSetup) prefetches = instance.sp;
427
- if (prefetches) return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy)));
428
- }).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));
429
433
  else try {
430
434
  return renderComponentSubTree(instance, slotScopeId);
431
435
  } catch (err) {
432
- return Promise.reject(err);
436
+ p = Promise.reject(err);
433
437
  }
438
+ p.catch(_vue_shared.NOOP);
439
+ return p;
434
440
  }
435
441
  function renderComponentSubTree(instance, slotScopeId) {
436
442
  pushWarningContext(instance.vnode);
@@ -513,8 +519,8 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
513
519
  }
514
520
  case VaporSlot: {
515
521
  if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
516
- const { slot, outlets } = vnode.vs;
517
- 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);
518
524
  break;
519
525
  }
520
526
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
@@ -532,7 +538,13 @@ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScope
532
538
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
533
539
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
534
540
  }
535
- 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) {
536
548
  const tag = vnode.type;
537
549
  let { props, children, shapeFlag, scopeId } = vnode;
538
550
  let openTag = `<${tag}`;
@@ -560,19 +572,20 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
560
572
  if (!(0, _vue_shared.isVoidTag)(tag)) {
561
573
  let hasChildrenOverride = false;
562
574
  if (props) {
563
- if (props.innerHTML) {
575
+ if (props.innerHTML != null) {
564
576
  hasChildrenOverride = true;
565
- push(props.innerHTML);
566
- } else if (props.textContent) {
577
+ push(String(props.innerHTML));
578
+ } else if (props.textContent != null) {
567
579
  hasChildrenOverride = true;
568
580
  push((0, _vue_shared.escapeHtml)(props.textContent));
569
- } else if (tag === "textarea" && props.value) {
581
+ } else if (tag === "textarea" && props.value != null) {
570
582
  hasChildrenOverride = true;
571
583
  push((0, _vue_shared.escapeHtml)(props.value));
572
584
  }
573
585
  }
574
586
  if (!hasChildrenOverride) {
575
- if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
587
+ if (renderChildren) renderChildren();
588
+ else if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
576
589
  else if (shapeFlag & 16) renderVNodeChildren(push, children, parentComponent, slotScopeId);
577
590
  }
578
591
  push(`</${tag}>`);
@@ -647,13 +660,41 @@ async function renderToString(input, context = {}) {
647
660
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
648
661
  vnode.appContext = input._context;
649
662
  input.provide(_vue_runtime_dom.ssrContextKey, context);
663
+ let buffer;
664
+ let result;
650
665
  try {
651
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
666
+ buffer = await renderComponentVNode(vnode);
667
+ result = await unrollBuffer$1(buffer);
652
668
  await resolveTeleports(context);
653
- return result;
654
- } finally {
655
- cleanupContext(context);
669
+ } catch (err) {
670
+ cleanupFailedRender(buffer, context);
671
+ throw err;
656
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 {}
657
698
  }
658
699
  async function resolveTeleports(context) {
659
700
  if (context.__teleportBuffers) {
@@ -685,19 +726,12 @@ function renderToSimpleStream(input, context, stream) {
685
726
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
686
727
  vnode.appContext = input._context;
687
728
  input.provide(_vue_runtime_dom.ssrContextKey, context);
688
- let cleaned = false;
689
- const finalize = () => {
690
- if (cleaned) return;
691
- cleaned = true;
729
+ let buffer;
730
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((b) => unrollBuffer(buffer = b, stream)).then(() => resolveTeleports(context)).then(() => {
692
731
  cleanupContext(context);
693
- };
694
- Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
695
- finalize();
696
732
  return stream.push(null);
697
733
  }).catch((error) => {
698
- try {
699
- finalize();
700
- } catch {}
734
+ cleanupFailedRender(buffer, context);
701
735
  stream.destroy(error);
702
736
  });
703
737
  return stream;
@@ -788,6 +822,7 @@ exports.ssrRenderAttrs = ssrRenderAttrs;
788
822
  exports.ssrRenderClass = ssrRenderClass;
789
823
  exports.ssrRenderComponent = ssrRenderComponent;
790
824
  exports.ssrRenderDynamicAttr = ssrRenderDynamicAttr;
825
+ exports.ssrRenderDynamicComponent = renderDynamicComponent;
791
826
  exports.ssrRenderDynamicModel = ssrRenderDynamicModel;
792
827
  exports.ssrRenderList = ssrRenderList;
793
828
  exports.ssrRenderSlot = ssrRenderSlot;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @vue/server-renderer v3.6.0-rc.11
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,
@@ -411,15 +414,20 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
411
414
  const res = setupComponent(instance, true);
412
415
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
413
416
  let prefetches = instance.sp;
414
- if (hasAsyncSetup || prefetches) return Promise.resolve(res).then(() => {
417
+ let p;
418
+ if (hasAsyncSetup || prefetches) p = Promise.resolve(res).then(() => {
415
419
  if (hasAsyncSetup) prefetches = instance.sp;
416
- if (prefetches) return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy)));
417
- }).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));
418
424
  else try {
419
425
  return renderComponentSubTree(instance, slotScopeId);
420
426
  } catch (err) {
421
- return Promise.reject(err);
427
+ p = Promise.reject(err);
422
428
  }
429
+ p.catch(_vue_shared.NOOP);
430
+ return p;
423
431
  }
424
432
  function renderComponentSubTree(instance, slotScopeId) {
425
433
  const comp = instance.type;
@@ -500,8 +508,8 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
500
508
  }
501
509
  case VaporSlot: {
502
510
  if (vnode.slotScopeIds) slotScopeId = (slotScopeId ? slotScopeId + " " : "") + vnode.slotScopeIds.join(" ");
503
- const { slot, outlets } = vnode.vs;
504
- 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);
505
513
  break;
506
514
  }
507
515
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
@@ -519,7 +527,13 @@ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScope
519
527
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
520
528
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
521
529
  }
522
- 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) {
523
537
  const tag = vnode.type;
524
538
  let { props, children, shapeFlag, scopeId } = vnode;
525
539
  let openTag = `<${tag}`;
@@ -547,19 +561,20 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
547
561
  if (!(0, _vue_shared.isVoidTag)(tag)) {
548
562
  let hasChildrenOverride = false;
549
563
  if (props) {
550
- if (props.innerHTML) {
564
+ if (props.innerHTML != null) {
551
565
  hasChildrenOverride = true;
552
- push(props.innerHTML);
553
- } else if (props.textContent) {
566
+ push(String(props.innerHTML));
567
+ } else if (props.textContent != null) {
554
568
  hasChildrenOverride = true;
555
569
  push((0, _vue_shared.escapeHtml)(props.textContent));
556
- } else if (tag === "textarea" && props.value) {
570
+ } else if (tag === "textarea" && props.value != null) {
557
571
  hasChildrenOverride = true;
558
572
  push((0, _vue_shared.escapeHtml)(props.value));
559
573
  }
560
574
  }
561
575
  if (!hasChildrenOverride) {
562
- if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
576
+ if (renderChildren) renderChildren();
577
+ else if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
563
578
  else if (shapeFlag & 16) renderVNodeChildren(push, children, parentComponent, slotScopeId);
564
579
  }
565
580
  push(`</${tag}>`);
@@ -634,13 +649,41 @@ async function renderToString(input, context = {}) {
634
649
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
635
650
  vnode.appContext = input._context;
636
651
  input.provide(_vue_runtime_dom.ssrContextKey, context);
652
+ let buffer;
653
+ let result;
637
654
  try {
638
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
655
+ buffer = await renderComponentVNode(vnode);
656
+ result = await unrollBuffer$1(buffer);
639
657
  await resolveTeleports(context);
640
- return result;
641
- } finally {
642
- cleanupContext(context);
658
+ } catch (err) {
659
+ cleanupFailedRender(buffer, context);
660
+ throw err;
643
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 {}
644
687
  }
645
688
  async function resolveTeleports(context) {
646
689
  if (context.__teleportBuffers) {
@@ -672,19 +715,12 @@ function renderToSimpleStream(input, context, stream) {
672
715
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
673
716
  vnode.appContext = input._context;
674
717
  input.provide(_vue_runtime_dom.ssrContextKey, context);
675
- let cleaned = false;
676
- const finalize = () => {
677
- if (cleaned) return;
678
- cleaned = true;
718
+ let buffer;
719
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((b) => unrollBuffer(buffer = b, stream)).then(() => resolveTeleports(context)).then(() => {
679
720
  cleanupContext(context);
680
- };
681
- Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
682
- finalize();
683
721
  return stream.push(null);
684
722
  }).catch((error) => {
685
- try {
686
- finalize();
687
- } catch {}
723
+ cleanupFailedRender(buffer, context);
688
724
  stream.destroy(error);
689
725
  });
690
726
  return stream;
@@ -775,6 +811,7 @@ exports.ssrRenderAttrs = ssrRenderAttrs;
775
811
  exports.ssrRenderClass = ssrRenderClass;
776
812
  exports.ssrRenderComponent = ssrRenderComponent;
777
813
  exports.ssrRenderDynamicAttr = ssrRenderDynamicAttr;
814
+ exports.ssrRenderDynamicComponent = renderDynamicComponent;
778
815
  exports.ssrRenderDynamicModel = ssrRenderDynamicModel;
779
816
  exports.ssrRenderList = ssrRenderList;
780
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 };