diff --git a/.changeset/shy-rivers-punch.md b/.changeset/shy-rivers-punch.md
new file mode 100644
index 000000000..cc79bb7e4
--- /dev/null
+++ b/.changeset/shy-rivers-punch.md
@@ -0,0 +1,5 @@
+---
+"@solidjs/start": patch
+---
+
+get ssr working for tanstack router example
diff --git a/examples/with-tanstack-router/app.config.ts b/examples/with-tanstack-router/app.config.ts
index 8a3cbfcf3..ffb1ca742 100644
--- a/examples/with-tanstack-router/app.config.ts
+++ b/examples/with-tanstack-router/app.config.ts
@@ -2,7 +2,6 @@ import { defineConfig } from "@solidjs/start/config";
import { TanStackRouterVite } from "@tanstack/router-plugin/vite";
export default defineConfig({
- ssr: false,
vite: {
plugins: [TanStackRouterVite({ target: "solid" })]
}
diff --git a/examples/with-tanstack-router/src/app.tsx b/examples/with-tanstack-router/src/app.tsx
index c56fe1f91..1f66fb04d 100644
--- a/examples/with-tanstack-router/src/app.tsx
+++ b/examples/with-tanstack-router/src/app.tsx
@@ -1,23 +1,8 @@
-import { RouterProvider, createRouter } from "@tanstack/solid-router";
-import { routeTree } from "./routeTree.gen";
+import { router } from "./router";
+import { RouterProvider } from "@tanstack/solid-router";
import "./app.css";
-const router = createRouter({
- defaultErrorComponent: (err) =>
{err.error.stack}
,
- routeTree,
- defaultPreload: "intent",
- defaultStaleTime: 5000,
- scrollRestoration: true
-});
-
-// Register things for typesafety
-declare module "@tanstack/solid-router" {
- interface Register {
- router: typeof router;
- }
-}
-
export default function App() {
return ;
}
diff --git a/examples/with-tanstack-router/src/entry-client.tsx b/examples/with-tanstack-router/src/entry-client.tsx
index 0ca4e3c30..bbf80ec15 100644
--- a/examples/with-tanstack-router/src/entry-client.tsx
+++ b/examples/with-tanstack-router/src/entry-client.tsx
@@ -1,4 +1,4 @@
// @refresh reload
-import { mount, StartClient } from "@solidjs/start/client";
+import { mount, StartClientTanstack } from "@solidjs/start/client";
-mount(() => , document.getElementById("app")!);
+mount(() => , document.getElementById("app")!);
diff --git a/examples/with-tanstack-router/src/entry-server.tsx b/examples/with-tanstack-router/src/entry-server.tsx
index 401eff83f..e1f708bcd 100644
--- a/examples/with-tanstack-router/src/entry-server.tsx
+++ b/examples/with-tanstack-router/src/entry-server.tsx
@@ -1,21 +1,40 @@
// @refresh reload
-import { createHandler, StartServer } from "@solidjs/start/server";
+import { createHandler, FetchEvent, StartServer } from "@solidjs/start/server";
+import { createMemoryHistory } from "@tanstack/solid-router";
+import { router } from "./router";
-export default createHandler(() => (
- (
-
-
-
-
-
- {assets}
-
-
- {children}
- {scripts}
-
-
- )}
- />
-));
+const routerLoad = async (event: FetchEvent) => {
+ const url = new URL(event.request.url);
+ const path = url.href.replace(url.origin, "");
+
+ router.update({
+ history: createMemoryHistory({
+ initialEntries: [path]
+ })
+ });
+
+ await router.load();
+};
+
+export default createHandler(
+ () => (
+ (
+
+
+
+
+
+ {assets}
+
+
+ {children}
+ {scripts}
+
+
+ )}
+ />
+ ),
+ undefined,
+ routerLoad
+);
diff --git a/examples/with-tanstack-router/src/router.tsx b/examples/with-tanstack-router/src/router.tsx
new file mode 100644
index 000000000..7aed452a7
--- /dev/null
+++ b/examples/with-tanstack-router/src/router.tsx
@@ -0,0 +1,22 @@
+import { createRouter as createTanstackSolidRouter } from "@tanstack/solid-router";
+import { routeTree } from "./routeTree.gen";
+
+export function createRouter() {
+ const router = createTanstackSolidRouter({
+ defaultErrorComponent: err => {err.error.stack}
,
+ routeTree,
+ defaultPreload: "intent",
+ defaultStaleTime: 5000,
+ scrollRestoration: true
+ });
+ return router;
+}
+
+export const router = createRouter();
+
+// Register things for typesafety
+declare module "@tanstack/solid-router" {
+ interface Register {
+ router: ReturnType;
+ }
+}
diff --git a/packages/start/src/client/StartClient.tsx b/packages/start/src/client/StartClient.tsx
index 4a3888453..447c7a365 100644
--- a/packages/start/src/client/StartClient.tsx
+++ b/packages/start/src/client/StartClient.tsx
@@ -24,3 +24,13 @@ export function StartClient() {
);
}
+
+export function StartClientTanstack() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/packages/start/src/client/index.tsx b/packages/start/src/client/index.tsx
index dae4ebaf7..d4bf610a6 100644
--- a/packages/start/src/client/index.tsx
+++ b/packages/start/src/client/index.tsx
@@ -1,5 +1,5 @@
// @refresh skip
import "vinxi/client";
-export { StartClient } from "./StartClient";
+export { StartClient, StartClientTanstack } from "./StartClient";
export { mount } from "./mount";
diff --git a/packages/start/src/client/spa/index.tsx b/packages/start/src/client/spa/index.tsx
index 436fe8d19..f18442ff8 100644
--- a/packages/start/src/client/spa/index.tsx
+++ b/packages/start/src/client/spa/index.tsx
@@ -7,4 +7,4 @@ export function mount(fn: () => JSX.Element, el: MountableElement) {
render(fn, el);
}
-export { StartClient } from "../StartClient";
+export { StartClient, StartClientTanstack } from "../StartClient";
diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts
index b068eccb2..effd00735 100644
--- a/packages/start/src/server/handler.ts
+++ b/packages/start/src/server/handler.ts
@@ -31,18 +31,24 @@ export function getExpectedRedirectStatus(response: ResponseStub): number {
export function createBaseHandler(
fn: (context: PageEvent) => unknown,
createPageEvent: (event: FetchEvent) => Promise,
- options: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise) = {}
+ options: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise) = {},
+ routerLoad?: (event: FetchEvent) => Promise
) {
return eventHandler({
handler: (e: HTTPEvent) => {
const event = getFetchEvent(e);
return provideRequestEvent(event, async () => {
+ if (routerLoad) {
+ await routerLoad(event);
+ }
+
// api
const match = matchAPIRoute(new URL(event.request.url).pathname, event.request.method);
if (match) {
const mod = await match.handler.import();
- const fn = event.request.method === "HEAD" ? mod["HEAD"] || mod["GET"] : mod[event.request.method];
+ const fn =
+ event.request.method === "HEAD" ? mod["HEAD"] || mod["GET"] : mod[event.request.method];
(event as APIEvent).params = match.params || {};
// @ts-ignore
sharedConfig.context = { event };
@@ -62,6 +68,7 @@ export function createBaseHandler(
const mode = resolvedOptions.mode || "stream";
// @ts-ignore
if (resolvedOptions.nonce) context.nonce = resolvedOptions.nonce;
+
if (mode === "sync" || !import.meta.env.START_SSR) {
const html = renderToString(() => {
(sharedConfig.context as any).event = context;
@@ -130,7 +137,8 @@ function handleStreamCompleteRedirect(context: PageEvent) {
*/
export function createHandler(
fn: (context: PageEvent) => unknown,
- options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise)
+ options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise),
+ routerLoad?: (event: FetchEvent) => Promise
) {
- return createBaseHandler(fn, createPageEvent, options);
+ return createBaseHandler(fn, createPageEvent, options, routerLoad);
}
diff --git a/packages/start/src/server/spa/handler.ts b/packages/start/src/server/spa/handler.ts
index 94d1f7208..bb0212b58 100644
--- a/packages/start/src/server/spa/handler.ts
+++ b/packages/start/src/server/spa/handler.ts
@@ -7,9 +7,10 @@ import { FetchEvent, HandlerOptions, PageEvent } from "../types";
*/
export function createHandler(
fn: (context: PageEvent) => unknown,
- options?: HandlerOptions | ((context: PageEvent) => HandlerOptions)
+ options?: HandlerOptions | ((context: PageEvent) => HandlerOptions),
+ routerLoad?: (event: FetchEvent) => Promise
) {
- return createBaseHandler(fn, createPageEvent, options);
+ return createBaseHandler(fn, createPageEvent, options, routerLoad);
}
export async function createPageEvent(ctx: FetchEvent) {