Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/shy-rivers-punch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solidjs/start": patch
---

get ssr working for tanstack router example
1 change: 0 additions & 1 deletion examples/with-tanstack-router/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" })]
}
Expand Down
19 changes: 2 additions & 17 deletions examples/with-tanstack-router/src/app.tsx
Original file line number Diff line number Diff line change
@@ -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) => <div>{err.error.stack}</div>,
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 <RouterProvider router={router} />;
}
4 changes: 2 additions & 2 deletions examples/with-tanstack-router/src/entry-client.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// @refresh reload
import { mount, StartClient } from "@solidjs/start/client";
import { mount, StartClientTanstack } from "@solidjs/start/client";

mount(() => <StartClient />, document.getElementById("app")!);
mount(() => <StartClientTanstack />, document.getElementById("app")!);
57 changes: 38 additions & 19 deletions examples/with-tanstack-router/src/entry-server.tsx
Original file line number Diff line number Diff line change
@@ -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(() => (
<StartServer
document={({ assets, children, scripts }) => (
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
{assets}
</head>
<body>
<div id="app">{children}</div>
{scripts}
</body>
</html>
)}
/>
));
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(
() => (
<StartServer
document={({ assets, children, scripts }) => (
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
{assets}
</head>
<body>
<div id="app">{children}</div>
{scripts}
</body>
</html>
)}
/>
),
undefined,
routerLoad
);
22 changes: 22 additions & 0 deletions examples/with-tanstack-router/src/router.tsx
Original file line number Diff line number Diff line change
@@ -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 => <div>{err.error.stack}</div>,
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<typeof createRouter>;
}
}
10 changes: 10 additions & 0 deletions packages/start/src/client/StartClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,13 @@ export function StartClient() {
</Dummy>
);
}

export function StartClientTanstack() {
Comment thread
brenelz marked this conversation as resolved.
return (
<Dummy>
<ErrorBoundary>
<App />
</ErrorBoundary>
</Dummy>
);
}
2 changes: 1 addition & 1 deletion packages/start/src/client/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// @refresh skip
import "vinxi/client";
export { StartClient } from "./StartClient";
export { StartClient, StartClientTanstack } from "./StartClient";
export { mount } from "./mount";

2 changes: 1 addition & 1 deletion packages/start/src/client/spa/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ export function mount(fn: () => JSX.Element, el: MountableElement) {
render(fn, el);
}

export { StartClient } from "../StartClient";
export { StartClient, StartClientTanstack } from "../StartClient";
16 changes: 12 additions & 4 deletions packages/start/src/server/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,24 @@ export function getExpectedRedirectStatus(response: ResponseStub): number {
export function createBaseHandler(
fn: (context: PageEvent) => unknown,
createPageEvent: (event: FetchEvent) => Promise<PageEvent>,
options: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>) = {}
options: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>) = {},
routerLoad?: (event: FetchEvent) => Promise<void>
) {
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 };
Expand All @@ -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;
Expand Down Expand Up @@ -130,7 +137,8 @@ function handleStreamCompleteRedirect(context: PageEvent) {
*/
export function createHandler(
fn: (context: PageEvent) => unknown,
options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>)
options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>),
routerLoad?: (event: FetchEvent) => Promise<void>
) {
return createBaseHandler(fn, createPageEvent, options);
return createBaseHandler(fn, createPageEvent, options, routerLoad);
}
5 changes: 3 additions & 2 deletions packages/start/src/server/spa/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<void>
) {
return createBaseHandler(fn, createPageEvent, options);
return createBaseHandler(fn, createPageEvent, options, routerLoad);
}

export async function createPageEvent(ctx: FetchEvent) {
Expand Down