@vue/server-renderer 3.6.0-rc.11 → 3.6.0-rc.13

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.13
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,
@@ -412,7 +413,10 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
412
413
  slots[name] = wrapped;
413
414
  }
414
415
  }
415
- if (!ctx.appContext.vapor) ctx.appContext.vapor = vaporInterface;
416
+ if (!ctx.appContext.vapor) {
417
+ ctx.appContext.vapor = vaporInterface;
418
+ (0, _vue_runtime_dom.setVaporInteropEnabled)();
419
+ }
416
420
  }
417
421
  const instance = vnode.component = createComponentInstance(vnode, parentComponent, null);
418
422
  const context = instance.appContext.provides[_vue_runtime_dom.ssrContextKey];
@@ -422,15 +426,20 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
422
426
  popWarningContext();
423
427
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
424
428
  let prefetches = instance.sp;
425
- if (hasAsyncSetup || prefetches) return Promise.resolve(res).then(() => {
429
+ let p;
430
+ if (hasAsyncSetup || prefetches) p = Promise.resolve(res).then(() => {
426
431
  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));
432
+ if (prefetches) try {
433
+ return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy))).catch(_vue_shared.NOOP);
434
+ } catch {}
435
+ }).then(() => renderComponentSubTree(instance, slotScopeId));
429
436
  else try {
430
437
  return renderComponentSubTree(instance, slotScopeId);
431
438
  } catch (err) {
432
- return Promise.reject(err);
439
+ p = Promise.reject(err);
433
440
  }
441
+ p.catch(_vue_shared.NOOP);
442
+ return p;
434
443
  }
435
444
  function renderComponentSubTree(instance, slotScopeId) {
436
445
  pushWarningContext(instance.vnode);
@@ -513,8 +522,8 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
513
522
  }
514
523
  case VaporSlot: {
515
524
  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);
525
+ const { slot, outlets, props } = vnode.vs;
526
+ renderVaporOutlet(push, slot, props || vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
518
527
  break;
519
528
  }
520
529
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
@@ -532,7 +541,13 @@ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScope
532
541
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
533
542
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
534
543
  }
535
- function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
544
+ function renderDynamicComponent(push, type, props, slots, parentComponent, slotScopeId) {
545
+ if ((0, _vue_shared.isString)(type) && type) {
546
+ const slot = slots && slots.default;
547
+ renderElementVNode(push, (0, _vue_runtime_dom.createVNode)(type, props), parentComponent, slotScopeId, slot && (() => slot(void 0, push, parentComponent, slotScopeId || "")));
548
+ } else renderVNode(push, (0, _vue_runtime_dom.createVNode)(type, props, slots), parentComponent, slotScopeId);
549
+ }
550
+ function renderElementVNode(push, vnode, parentComponent, slotScopeId, renderChildren) {
536
551
  const tag = vnode.type;
537
552
  let { props, children, shapeFlag, scopeId } = vnode;
538
553
  let openTag = `<${tag}`;
@@ -560,19 +575,20 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
560
575
  if (!(0, _vue_shared.isVoidTag)(tag)) {
561
576
  let hasChildrenOverride = false;
562
577
  if (props) {
563
- if (props.innerHTML) {
578
+ if (props.innerHTML != null) {
564
579
  hasChildrenOverride = true;
565
- push(props.innerHTML);
566
- } else if (props.textContent) {
580
+ push(String(props.innerHTML));
581
+ } else if (props.textContent != null) {
567
582
  hasChildrenOverride = true;
568
583
  push((0, _vue_shared.escapeHtml)(props.textContent));
569
- } else if (tag === "textarea" && props.value) {
584
+ } else if (tag === "textarea" && props.value != null) {
570
585
  hasChildrenOverride = true;
571
586
  push((0, _vue_shared.escapeHtml)(props.value));
572
587
  }
573
588
  }
574
589
  if (!hasChildrenOverride) {
575
- if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
590
+ if (renderChildren) renderChildren();
591
+ else if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
576
592
  else if (shapeFlag & 16) renderVNodeChildren(push, children, parentComponent, slotScopeId);
577
593
  }
578
594
  push(`</${tag}>`);
@@ -647,13 +663,41 @@ async function renderToString(input, context = {}) {
647
663
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
648
664
  vnode.appContext = input._context;
649
665
  input.provide(_vue_runtime_dom.ssrContextKey, context);
666
+ let buffer;
667
+ let result;
650
668
  try {
651
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
669
+ buffer = await renderComponentVNode(vnode);
670
+ result = await unrollBuffer$1(buffer);
652
671
  await resolveTeleports(context);
653
- return result;
654
- } finally {
655
- cleanupContext(context);
672
+ } catch (err) {
673
+ cleanupFailedRender(buffer, context);
674
+ throw err;
656
675
  }
676
+ cleanupContext(context);
677
+ return result;
678
+ }
679
+ /**
680
+ * Stops watchers without masking the render error. Components after the
681
+ * failure point are still in flight and can register watchers once the render
682
+ * has settled, so those are stopped when they finish.
683
+ * Cleanup errors here have already been reported by the watcher.
684
+ */
685
+ function cleanupFailedRender(buffer, context) {
686
+ try {
687
+ cleanupContext(context);
688
+ } catch {}
689
+ (async () => {
690
+ if (buffer) await settleBuffer(buffer);
691
+ for (const key in context.__teleportBuffers) await settleBuffer(context.__teleportBuffers[key]);
692
+ cleanupContext(context);
693
+ })().catch(_vue_shared.NOOP);
694
+ }
695
+ async function settleBuffer(buffer) {
696
+ if (!buffer.hasAsync) return;
697
+ for (let item of buffer) try {
698
+ if ((0, _vue_shared.isPromise)(item)) item = await item;
699
+ if (!(0, _vue_shared.isString)(item)) await settleBuffer(item);
700
+ } catch {}
657
701
  }
658
702
  async function resolveTeleports(context) {
659
703
  if (context.__teleportBuffers) {
@@ -685,19 +729,12 @@ function renderToSimpleStream(input, context, stream) {
685
729
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
686
730
  vnode.appContext = input._context;
687
731
  input.provide(_vue_runtime_dom.ssrContextKey, context);
688
- let cleaned = false;
689
- const finalize = () => {
690
- if (cleaned) return;
691
- cleaned = true;
732
+ let buffer;
733
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((b) => unrollBuffer(buffer = b, stream)).then(() => resolveTeleports(context)).then(() => {
692
734
  cleanupContext(context);
693
- };
694
- Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
695
- finalize();
696
735
  return stream.push(null);
697
736
  }).catch((error) => {
698
- try {
699
- finalize();
700
- } catch {}
737
+ cleanupFailedRender(buffer, context);
701
738
  stream.destroy(error);
702
739
  });
703
740
  return stream;
@@ -788,6 +825,7 @@ exports.ssrRenderAttrs = ssrRenderAttrs;
788
825
  exports.ssrRenderClass = ssrRenderClass;
789
826
  exports.ssrRenderComponent = ssrRenderComponent;
790
827
  exports.ssrRenderDynamicAttr = ssrRenderDynamicAttr;
828
+ exports.ssrRenderDynamicComponent = renderDynamicComponent;
791
829
  exports.ssrRenderDynamicModel = ssrRenderDynamicModel;
792
830
  exports.ssrRenderList = ssrRenderList;
793
831
  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.13
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,
@@ -403,7 +406,10 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
403
406
  slots[name] = wrapped;
404
407
  }
405
408
  }
406
- if (!ctx.appContext.vapor) ctx.appContext.vapor = vaporInterface;
409
+ if (!ctx.appContext.vapor) {
410
+ ctx.appContext.vapor = vaporInterface;
411
+ (0, _vue_runtime_dom.setVaporInteropEnabled)();
412
+ }
407
413
  }
408
414
  const instance = vnode.component = createComponentInstance(vnode, parentComponent, null);
409
415
  const context = instance.appContext.provides[_vue_runtime_dom.ssrContextKey];
@@ -411,15 +417,20 @@ function renderComponentVNode(vnode, parentComponent = null, slotScopeId) {
411
417
  const res = setupComponent(instance, true);
412
418
  const hasAsyncSetup = (0, _vue_shared.isPromise)(res);
413
419
  let prefetches = instance.sp;
414
- if (hasAsyncSetup || prefetches) return Promise.resolve(res).then(() => {
420
+ let p;
421
+ if (hasAsyncSetup || prefetches) p = Promise.resolve(res).then(() => {
415
422
  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));
423
+ if (prefetches) try {
424
+ return Promise.all(prefetches.map((prefetch) => prefetch.call(instance.proxy))).catch(_vue_shared.NOOP);
425
+ } catch {}
426
+ }).then(() => renderComponentSubTree(instance, slotScopeId));
418
427
  else try {
419
428
  return renderComponentSubTree(instance, slotScopeId);
420
429
  } catch (err) {
421
- return Promise.reject(err);
430
+ p = Promise.reject(err);
422
431
  }
432
+ p.catch(_vue_shared.NOOP);
433
+ return p;
423
434
  }
424
435
  function renderComponentSubTree(instance, slotScopeId) {
425
436
  const comp = instance.type;
@@ -500,8 +511,8 @@ function renderVNode(push, vnode, parentComponent, slotScopeId) {
500
511
  }
501
512
  case VaporSlot: {
502
513
  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);
514
+ const { slot, outlets, props } = vnode.vs;
515
+ renderVaporOutlet(push, slot, props || vnode.props, outlets && outlets[0], parentComponent, slotScopeId);
505
516
  break;
506
517
  }
507
518
  default: if (shapeFlag & 1) renderElementVNode(push, vnode, parentComponent, slotScopeId);
@@ -519,7 +530,13 @@ function renderVaporOutlet(push, slot, props, outlet, parentComponent, slotScope
519
530
  function renderVNodeChildren(push, children, parentComponent, slotScopeId) {
520
531
  for (let i = 0; i < children.length; i++) renderVNode(push, normalizeVNode(children[i]), parentComponent, slotScopeId);
521
532
  }
522
- function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
533
+ function renderDynamicComponent(push, type, props, slots, parentComponent, slotScopeId) {
534
+ if ((0, _vue_shared.isString)(type) && type) {
535
+ const slot = slots && slots.default;
536
+ renderElementVNode(push, (0, _vue_runtime_dom.createVNode)(type, props), parentComponent, slotScopeId, slot && (() => slot(void 0, push, parentComponent, slotScopeId || "")));
537
+ } else renderVNode(push, (0, _vue_runtime_dom.createVNode)(type, props, slots), parentComponent, slotScopeId);
538
+ }
539
+ function renderElementVNode(push, vnode, parentComponent, slotScopeId, renderChildren) {
523
540
  const tag = vnode.type;
524
541
  let { props, children, shapeFlag, scopeId } = vnode;
525
542
  let openTag = `<${tag}`;
@@ -547,19 +564,20 @@ function renderElementVNode(push, vnode, parentComponent, slotScopeId) {
547
564
  if (!(0, _vue_shared.isVoidTag)(tag)) {
548
565
  let hasChildrenOverride = false;
549
566
  if (props) {
550
- if (props.innerHTML) {
567
+ if (props.innerHTML != null) {
551
568
  hasChildrenOverride = true;
552
- push(props.innerHTML);
553
- } else if (props.textContent) {
569
+ push(String(props.innerHTML));
570
+ } else if (props.textContent != null) {
554
571
  hasChildrenOverride = true;
555
572
  push((0, _vue_shared.escapeHtml)(props.textContent));
556
- } else if (tag === "textarea" && props.value) {
573
+ } else if (tag === "textarea" && props.value != null) {
557
574
  hasChildrenOverride = true;
558
575
  push((0, _vue_shared.escapeHtml)(props.value));
559
576
  }
560
577
  }
561
578
  if (!hasChildrenOverride) {
562
- if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
579
+ if (renderChildren) renderChildren();
580
+ else if (shapeFlag & 8) push((0, _vue_shared.escapeHtml)(children));
563
581
  else if (shapeFlag & 16) renderVNodeChildren(push, children, parentComponent, slotScopeId);
564
582
  }
565
583
  push(`</${tag}>`);
@@ -634,13 +652,41 @@ async function renderToString(input, context = {}) {
634
652
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
635
653
  vnode.appContext = input._context;
636
654
  input.provide(_vue_runtime_dom.ssrContextKey, context);
655
+ let buffer;
656
+ let result;
637
657
  try {
638
- const result = await unrollBuffer$1(await renderComponentVNode(vnode));
658
+ buffer = await renderComponentVNode(vnode);
659
+ result = await unrollBuffer$1(buffer);
639
660
  await resolveTeleports(context);
640
- return result;
641
- } finally {
642
- cleanupContext(context);
661
+ } catch (err) {
662
+ cleanupFailedRender(buffer, context);
663
+ throw err;
643
664
  }
665
+ cleanupContext(context);
666
+ return result;
667
+ }
668
+ /**
669
+ * Stops watchers without masking the render error. Components after the
670
+ * failure point are still in flight and can register watchers once the render
671
+ * has settled, so those are stopped when they finish.
672
+ * Cleanup errors here have already been reported by the watcher.
673
+ */
674
+ function cleanupFailedRender(buffer, context) {
675
+ try {
676
+ cleanupContext(context);
677
+ } catch {}
678
+ (async () => {
679
+ if (buffer) await settleBuffer(buffer);
680
+ for (const key in context.__teleportBuffers) await settleBuffer(context.__teleportBuffers[key]);
681
+ cleanupContext(context);
682
+ })().catch(_vue_shared.NOOP);
683
+ }
684
+ async function settleBuffer(buffer) {
685
+ if (!buffer.hasAsync) return;
686
+ for (let item of buffer) try {
687
+ if ((0, _vue_shared.isPromise)(item)) item = await item;
688
+ if (!(0, _vue_shared.isString)(item)) await settleBuffer(item);
689
+ } catch {}
644
690
  }
645
691
  async function resolveTeleports(context) {
646
692
  if (context.__teleportBuffers) {
@@ -672,19 +718,12 @@ function renderToSimpleStream(input, context, stream) {
672
718
  const vnode = (0, _vue_runtime_dom.createVNode)(input._component, input._props);
673
719
  vnode.appContext = input._context;
674
720
  input.provide(_vue_runtime_dom.ssrContextKey, context);
675
- let cleaned = false;
676
- const finalize = () => {
677
- if (cleaned) return;
678
- cleaned = true;
721
+ let buffer;
722
+ Promise.resolve().then(() => renderComponentVNode(vnode)).then((b) => unrollBuffer(buffer = b, stream)).then(() => resolveTeleports(context)).then(() => {
679
723
  cleanupContext(context);
680
- };
681
- Promise.resolve().then(() => renderComponentVNode(vnode)).then((buffer) => unrollBuffer(buffer, stream)).then(() => resolveTeleports(context)).then(() => {
682
- finalize();
683
724
  return stream.push(null);
684
725
  }).catch((error) => {
685
- try {
686
- finalize();
687
- } catch {}
726
+ cleanupFailedRender(buffer, context);
688
727
  stream.destroy(error);
689
728
  });
690
729
  return stream;
@@ -775,6 +814,7 @@ exports.ssrRenderAttrs = ssrRenderAttrs;
775
814
  exports.ssrRenderClass = ssrRenderClass;
776
815
  exports.ssrRenderComponent = ssrRenderComponent;
777
816
  exports.ssrRenderDynamicAttr = ssrRenderDynamicAttr;
817
+ exports.ssrRenderDynamicComponent = renderDynamicComponent;
778
818
  exports.ssrRenderDynamicModel = ssrRenderDynamicModel;
779
819
  exports.ssrRenderList = ssrRenderList;
780
820
  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 };