@tanstack/vue-router
Version:
Modern and scalable routing for Vue applications
43 lines (42 loc) • 1.87 kB
JavaScript
import * as Vue from "vue";
import { createSsrStreamResponse, getSsrStatus, transformHtmlStringWithRouter, transformReadableStreamWithRouter, waitForRequest } from "@tanstack/router-core/ssr/server";
import { renderToString, renderToWebStream } from "vue/server-renderer";
import { isbot } from "isbot";
//#region src/ssr/renderRouterToStream.tsx
var DOCTYPE = new TextEncoder().encode("<!DOCTYPE html>");
/** The router transport needs `<html>` as the outer root, not a fragment. */
function warnUnlessHtmlRoot(html) {
if (process.env.NODE_ENV !== "production" && !html.startsWith("<html")) console.warn("TanStack Router: the Vue root component must render <html> as its outer element. A fragment or array root breaks streamed hydration scripts.");
}
var renderRouterToStream = async ({ request, router, responseHeaders, App }) => {
const signal = request.signal;
if (signal.aborted) {
router.serverSsr?.cleanup();
throw signal.reason;
}
try {
const app = Vue.createSSRApp(App, { router });
if (isbot(request.headers.get("User-Agent"))) {
let fullHtml = await waitForRequest(renderToString(app), signal);
warnUnlessHtmlRoot(fullHtml);
fullHtml = await transformHtmlStringWithRouter(router, fullHtml, { signal });
return new Response(fullHtml, {
status: getSsrStatus(router),
headers: responseHeaders
});
}
const responseStream = transformReadableStreamWithRouter(router, renderToWebStream(app).pipeThrough(new TransformStream({ start(controller) {
controller.enqueue(DOCTYPE);
} })), { signal });
return createSsrStreamResponse(router, new Response(responseStream, {
status: getSsrStatus(router),
headers: responseHeaders
}));
} catch (error) {
router.serverSsr?.cleanup();
throw error;
}
};
//#endregion
export { renderRouterToStream, warnUnlessHtmlRoot };
//# sourceMappingURL=renderRouterToStream.js.map