@absolutejs/absolute 0.19.0-beta.430 → 0.19.0-beta.432

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.
package/dist/vue/index.js CHANGED
@@ -499,7 +499,7 @@ var init_resolveConvention = __esm(() => {
499
499
  // src/vue/pageHandler.ts
500
500
  import { readdir } from "fs/promises";
501
501
  import { basename as basename2, dirname } from "path";
502
- var ssrDirty = false, hydrateSlotPreamble = "window.__ABS_SLOT_HYDRATION_PENDING__=true;", injectSlotPreamble = (headTag) => headTag.includes("</head>") ? headTag.replace("</head>", `<script>${hydrateSlotPreamble}</script></head>`) : `${headTag}<script>${hydrateSlotPreamble}</script>`, isRecord = (value) => typeof value === "object" && value !== null, isGenericVueComponent = (value) => typeof value === "function" || isRecord(value), readHasIslands = (value) => {
502
+ var ssrDirty = false, isRecord = (value) => typeof value === "object" && value !== null, isGenericVueComponent = (value) => typeof value === "function" || isRecord(value), readHasIslands = (value) => {
503
503
  if (!isRecord(value))
504
504
  return false;
505
505
  const hasIslands = value["__ABSOLUTE_PAGE_HAS_ISLANDS__"];
@@ -521,9 +521,8 @@ var ssrDirty = false, hydrateSlotPreamble = "window.__ABS_SLOT_HYDRATION_PENDING
521
521
  }
522
522
  }, buildDirtyResponse = (headTag, indexPath, maybeProps) => {
523
523
  const propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})};`;
524
- const hydratedHead = injectSlotPreamble(headTag);
525
524
  const dirtyFlag = "window.__SSR_DIRTY__=true;";
526
- const html = `<!DOCTYPE html><html>${hydratedHead}<body><div id="root"></div>` + `<script>${propsScript}${dirtyFlag}</script>` + `<script type="module" src="${indexPath}"></script>` + `</body></html>`;
525
+ const html = `<!DOCTYPE html><html>${headTag}<body><div id="root"></div>` + `<script>${propsScript}${dirtyFlag}</script>` + `<script type="module" src="${indexPath}"></script>` + `</body></html>`;
527
526
  return new Response(html, {
528
527
  headers: { "Content-Type": "text/html" }
529
528
  });
@@ -559,7 +558,7 @@ var ssrDirty = false, hydrateSlotPreamble = "window.__ABS_SLOT_HYDRATION_PENDING
559
558
  render: () => h3(resolvedPage.component, maybeProps ?? null)
560
559
  });
561
560
  const bodyStream = renderToWebStream(app);
562
- const head = `<!DOCTYPE html><html>${injectSlotPreamble(headTag)}<body><div id="root">`;
561
+ const head = `<!DOCTYPE html><html>${headTag}<body><div id="root">`;
563
562
  const tail = `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})}</script><script type="module" src="${indexPath}"></script></body></html>`;
564
563
  const stream = new ReadableStream({
565
564
  start(controller) {
@@ -1745,7 +1744,9 @@ var Image_default = "../Image-0pe96k20.vue";
1745
1744
  // src/vue/components/SuspenseSlot.ts
1746
1745
  import {
1747
1746
  defineComponent,
1748
- h
1747
+ h,
1748
+ onMounted,
1749
+ ref
1749
1750
  } from "vue";
1750
1751
  var renderVueNodesToHtml = async (nodes) => {
1751
1752
  const { createSSRApp, h: createVNode } = await import("vue");
@@ -1775,6 +1776,9 @@ var SuspenseSlot = defineComponent({
1775
1776
  timeoutMs: { default: undefined, type: Number }
1776
1777
  },
1777
1778
  setup(props, { slots }) {
1779
+ const isResolved = ref(false);
1780
+ const resolvedValue = ref(undefined);
1781
+ const hasError = ref(false);
1778
1782
  const usesFrameworkSlots = hasFrameworkSlots(slots.default, slots.fallback, slots.error, props.promise);
1779
1783
  if (typeof window === "undefined") {
1780
1784
  if (!usesFrameworkSlots && props.resolve) {
@@ -1791,8 +1795,11 @@ var SuspenseSlot = defineComponent({
1791
1795
  resolve: async () => {
1792
1796
  try {
1793
1797
  const value = props.resolve !== undefined ? await props.resolve() : props.promise !== undefined ? await props.promise : undefined;
1794
- const nodes = slots.default?.({ value }) ?? [];
1795
- return renderVueNodesToHtml(nodes);
1798
+ return {
1799
+ html: "",
1800
+ kind: "vue-suspense",
1801
+ value
1802
+ };
1796
1803
  } catch (error) {
1797
1804
  const errorNodes = slots.error?.({ error });
1798
1805
  if (errorNodes !== undefined) {
@@ -1808,6 +1815,26 @@ var SuspenseSlot = defineComponent({
1808
1815
  });
1809
1816
  }
1810
1817
  }
1818
+ if (typeof window !== "undefined" && usesFrameworkSlots) {
1819
+ const consumers = window.__ABS_SLOT_CONSUMERS__ = window.__ABS_SLOT_CONSUMERS__ ?? {};
1820
+ let runtimeReady = false;
1821
+ consumers[props.id] = (payload) => {
1822
+ if (!runtimeReady)
1823
+ return false;
1824
+ if (!payload || typeof payload !== "object" || payload.kind !== "vue-suspense") {
1825
+ return false;
1826
+ }
1827
+ const candidate = payload;
1828
+ hasError.value = candidate.state === "error";
1829
+ resolvedValue.value = candidate.value;
1830
+ isResolved.value = candidate.state !== "error";
1831
+ return true;
1832
+ };
1833
+ onMounted(() => {
1834
+ runtimeReady = true;
1835
+ window.__ABS_SLOT_FLUSH__?.();
1836
+ });
1837
+ }
1811
1838
  return () => {
1812
1839
  if (!usesFrameworkSlots) {
1813
1840
  return h("div", {
@@ -1821,7 +1848,7 @@ var SuspenseSlot = defineComponent({
1821
1848
  class: props.className,
1822
1849
  "data-absolute-slot": "true",
1823
1850
  id: `slot-${props.id}`
1824
- }, slots.fallback?.() ?? undefined);
1851
+ }, hasError.value ? slots.error?.({ error: undefined }) ?? slots.fallback?.() ?? undefined : isResolved.value ? slots.default?.({ value: resolvedValue.value }) ?? undefined : slots.fallback?.() ?? undefined);
1825
1852
  };
1826
1853
  }
1827
1854
  });
@@ -1874,6 +1901,11 @@ var streamSwapRuntime = () => {
1874
1901
  return false;
1875
1902
  return payload.kind === "angular-defer";
1876
1903
  };
1904
+ const isVueSuspensePayload = (payload) => {
1905
+ if (!payload || typeof payload !== "object")
1906
+ return false;
1907
+ return payload.kind === "vue-suspense";
1908
+ };
1877
1909
  const resolveHtml = (payload) => {
1878
1910
  if (!payload || typeof payload !== "object") {
1879
1911
  return typeof payload === "string" ? payload : "";
@@ -1897,7 +1929,7 @@ var streamSwapRuntime = () => {
1897
1929
  return;
1898
1930
  }
1899
1931
  }
1900
- if (isAngularDeferPayload(payload)) {
1932
+ if (isAngularDeferPayload(payload) || isVueSuspensePayload(payload)) {
1901
1933
  pending[id] = payload;
1902
1934
  return;
1903
1935
  }
@@ -2802,5 +2834,5 @@ export {
2802
2834
  Image_default as Image
2803
2835
  };
2804
2836
 
2805
- //# debugId=A91C5F90D282768164756E2164756E21
2837
+ //# debugId=5E472DCDD9E5F0DA64756E2164756E21
2806
2838
  //# sourceMappingURL=index.js.map