-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathserver.tsx
88 lines (72 loc) · 2.36 KB
/
server.tsx
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
import { serve } from "https://deno.land/std@0.153.0/http/server.ts";
import { createServer, StatusCode } from "ultra/server.ts";
import App from "./src/app.tsx";
// Twind
import "./src/twind/twind.ts";
// React Helmet Async
import { HelmetProvider } from "react-helmet-async";
import useServerInsertedHTML from "ultra/hooks/use-server-inserted-html.js";
// React Query
import { QueryClientProvider } from "@tanstack/react-query";
import { useDehydrateReactQuery } from "./src/react-query/useDehydrateReactQuery.tsx";
import { queryClient } from "./src/react-query/query-client.ts";
import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
import { appRouter } from "./src/server/router.ts";
import { trpc } from "./src/trpc/trpc.ts";
import { trpcClient } from "./src/trpc/client.ts";
const server = await createServer({
importMapPath: Deno.env.get("ULTRA_MODE") === "development"
? import.meta.resolve("./importMap.dev.json")
: import.meta.resolve("./importMap.json"),
browserEntrypoint: import.meta.resolve("./client.tsx"),
});
// deno-lint-ignore no-explicit-any
const helmetContext: Record<string, any> = {};
function ServerApp({ context }: any) {
useServerInsertedHTML(() => {
const { helmet } = helmetContext;
return (
<>
{helmet.title.toComponent()}
{helmet.priority.toComponent()}
{helmet.meta.toComponent()}
{helmet.link.toComponent()}
{helmet.script.toComponent()}
</>
);
});
useDehydrateReactQuery(queryClient);
const requestUrl = new URL(context.req.url);
return (
<HelmetProvider context={helmetContext}>
<trpc.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</trpc.Provider>
</HelmetProvider>
);
}
server.all("/api/trpc/:path", (context) => {
return fetchRequestHandler({
endpoint: "/api/trpc",
req: context.req as Request,
router: appRouter,
createContext: () => ({}),
});
});
server.get("*", async (context) => {
// clear query cache
queryClient.clear();
/**
* Render the request
*/
const result = await server.render(<ServerApp context={context} />);
return context.body(result, 200, {
"content-type": "text/html; charset=utf-8",
});
});
if (import.meta.main) {
serve(server.fetch);
}
export default server;