All files / apps/web/src/entry server.tsx

81.81% Statements 18/22
50% Branches 6/12
60% Functions 3/5
85.71% Lines 18/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101                                              6x 6x           6x 6x           6x 24x 52x 52x 52x 52x       52x                 6x         987x             42x       42x               987x                 987x                 6x      
/// <reference types="vite/client" />
import "./prelude";
import { createElement } from "react";
 
import * as Sentry from "@sentry/tanstackstart-react";
import type { AnyRouter } from "@tanstack/react-router";
import {
	createSsrStreamResponse,
	transformReadableStreamWithRouter,
} from "@tanstack/react-router/ssr/server";
import type { HandlerCallback } from "@tanstack/react-router/ssr/server";
import { StartServer } from "@tanstack/react-start-server";
import { createStartHandler, getRequest } from "@tanstack/react-start/server";
import { createServerEntry } from "@tanstack/react-start/server-entry";
import type { ReadableStream as NodeReadableStream } from "node:stream/web";
import ReactDOMServer from "react-dom/server";
import { keys } from "remeda";
 
import { encryptTag } from "~utils/server/tag";
import { env } from "~web/utils/env";
 
import type { TreeRouter } from "./router";
 
const sentryDsn = import.meta.env.VITE_SENTRY_DSN;
if (sentryDsn) {
	Sentry.init({ dsn: sentryDsn, tracesSampleRate: 1 });
}
 
/* oxlint-disable no-console */
 
Eif (env.PLAYWRIGHT) {
	const consoleLogMethods = {
		log: console.log,
		info: console.info,
		warn: console.warn,
		error: console.error,
	};
	for (const method of keys(consoleLogMethods)) {
		console[method] = (...args) => {
			let testId = "unknown";
			try {
				const request = getRequest();
				testId = request.headers.get("x-test-id") ?? "no-test-id";
			} catch {
				/* empty */
			}
			consoleLogMethods[method].apply(console, [encryptTag(testId), ...args]);
		};
	}
}
/* oxlint-enable no-console */
 
// Adapted from TanStack's renderRouterToStream, logging only the error message
// instead of React's ~100 line component stack:
// https://github.com/TanStack/router/blob/main/packages/react-router/src/ssr/renderRouterToStream.tsx
const renderServerStream: HandlerCallback<AnyRouter> = async ({
	request,
	router,
	responseHeaders,
}) => {
	const stream = await ReactDOMServer.renderToReadableStream(
		createElement(StartServer, { router }),
		{
			signal: request.signal,
			nonce: router.options.ssr?.nonce,
			progressiveChunkSize: Number.POSITIVE_INFINITY,
			onError: (error) => {
				Iif (error instanceof Error && error.name === "AbortError") {
					return;
				}
				// oxlint-disable-next-line no-console
				console.error(
					`Error in renderToReadableStream: ${
						error instanceof Error ? error.message : String(error)
					}`,
				);
			},
		},
	);
	const responseStream = transformReadableStreamWithRouter(
		router,
		stream as unknown as NodeReadableStream,
		{
			onAbort: () => {
				stream.cancel().catch(() => undefined);
			},
		},
	);
	return createSsrStreamResponse(
		router,
		new Response(responseStream as unknown as BodyInit, {
			status: router.stores.statusCode.get(),
			headers: responseHeaders,
		}),
	);
};
 
const fetch = createStartHandler<TreeRouter>(renderServerStream);
 
export default createServerEntry({ fetch });