Skip to content

Commit 44cb8b1

Browse files
wmertensgioboa
andcommitted
qwik: add entry.server
untested because nitro fails to fallback to our server Co-authored-by: Giorgio Boa <[email protected]>
1 parent f6c06f4 commit 44cb8b1

File tree

7 files changed

+154
-9
lines changed

7 files changed

+154
-9
lines changed

examples/qwik/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"scripts": {
66
"build": "qwik build",
77
"build.client": "vite build",
8-
"build.preview": "vite build --ssr src/entry.preview.tsx",
8+
"build.preview": "vite build --ssr",
99
"build.types": "tsc --incremental --noEmit",
1010
"dev": "vite --open --mode ssr",
1111
"preview": "qwik build preview && cp -r ./dist/* ./.output/public/ && vite preview --open",

examples/qwik/routes/test.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

examples/qwik/server.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

examples/qwik/src/entry.server.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { createQwikRouter } from "./qwik-fetch-adapter";
2+
import render from "./entry.ssr";
3+
4+
const { router, notFound } = createQwikRouter({ render });
5+
6+
export default {
7+
fetch: async (req: Request) => {
8+
console.log(`[${req.method}] ${req.url}`);
9+
const qwikRouterResponse = await router(req);
10+
if (qwikRouterResponse) {
11+
return qwikRouterResponse;
12+
}
13+
14+
// Path not found
15+
return notFound(req);
16+
},
17+
};
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import { setServerPlatform } from "@qwik.dev/core/server";
2+
import type {
3+
ClientConn,
4+
ServerRenderOptions,
5+
ServerRequestEvent,
6+
} from "@qwik.dev/router/middleware/request-handler";
7+
import {
8+
getNotFound,
9+
isStaticPath,
10+
mergeHeadersCookies,
11+
requestHandler,
12+
} from "@qwik.dev/router/middleware/request-handler";
13+
14+
/** @public */
15+
export interface NetAddr {
16+
transport: "tcp" | "udp";
17+
hostname: string;
18+
port: number;
19+
}
20+
21+
/** @public */
22+
export function createQwikRouter(opts: QwikRouterFetchOptions) {
23+
if (opts.manifest) {
24+
setServerPlatform(opts.manifest);
25+
}
26+
async function router(request: Request) {
27+
try {
28+
const url = new URL(request.url);
29+
30+
const serverRequestEv: ServerRequestEvent<Response> = {
31+
mode: "server",
32+
locale: undefined,
33+
url,
34+
env: { get: (p: string) => process.env[p] },
35+
request,
36+
getWritableStream: (status, headers, cookies, resolve) => {
37+
const { readable, writable } = new TransformStream<Uint8Array>();
38+
const response = new Response(readable, {
39+
status,
40+
headers: mergeHeadersCookies(headers, cookies),
41+
});
42+
resolve(response);
43+
return writable;
44+
},
45+
platform: {
46+
ssr: true,
47+
},
48+
getClientConn: () => {
49+
return opts.getClientConn ? opts.getClientConn(request) : {};
50+
},
51+
};
52+
53+
// send request to qwik router request handler
54+
const handledResponse = await requestHandler(serverRequestEv, opts);
55+
if (handledResponse) {
56+
handledResponse.completion.then((v) => {
57+
if (v) {
58+
console.error(v);
59+
}
60+
});
61+
const response = await handledResponse.response;
62+
if (response) {
63+
return response;
64+
}
65+
}
66+
67+
// qwik router did not have a route for this request
68+
return null;
69+
} catch (e: any) {
70+
console.error(e);
71+
return new Response(String(e || "Error"), {
72+
status: 500,
73+
headers: {
74+
"Content-Type": "text/plain; charset=utf-8",
75+
},
76+
});
77+
}
78+
}
79+
80+
const notFound = async (request: Request) => {
81+
try {
82+
const url = new URL(request.url);
83+
84+
// In the development server, we replace the getNotFound function
85+
// For static paths, we assign a static "Not Found" message.
86+
// This ensures consistency between development and production environments for specific URLs.
87+
const notFoundHtml =
88+
!request.headers.get("accept")?.includes("text/html") ||
89+
isStaticPath(request.method || "GET", url)
90+
? "Not Found"
91+
: getNotFound(url.pathname);
92+
return new Response(notFoundHtml, {
93+
status: 404,
94+
headers: {
95+
"Content-Type": "text/html; charset=utf-8",
96+
"X-Not-Found": url.pathname,
97+
},
98+
});
99+
} catch (e) {
100+
console.error(e);
101+
return new Response(String(e || "Error"), {
102+
status: 500,
103+
headers: {
104+
"Content-Type": "text/plain; charset=utf-8",
105+
},
106+
});
107+
}
108+
};
109+
110+
return {
111+
router,
112+
notFound,
113+
};
114+
}
115+
116+
/**
117+
* @deprecated Use `createQwikRouter` instead. Will be removed in V3
118+
* @public
119+
*/
120+
export const createQwikCity = createQwikRouter;
121+
122+
/** @public */
123+
export interface QwikRouterFetchOptions
124+
extends Omit<ServerRenderOptions, "qwikCityPlan"> {
125+
getClientConn?: (request: Request) => ClientConn;
126+
}

examples/qwik/vite.config.mts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import { nitro } from "nitro/vite";
66

77
export default defineConfig(() => {
88
return {
9-
plugins: [qwikRouter(), qwikVite(), tsconfigPaths({ root: "." }), nitro()],
9+
plugins: [
10+
qwikRouter({ devSsrServer: false }),
11+
qwikVite({ ssr: { input: "src/entry.server" } }),
12+
tsconfigPaths({ root: "." }),
13+
nitro(),
14+
],
1015
build: { rollupOptions: { external: [/^node/] } },
1116
};
1217
});

pnpm-workspace.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
packages:
2-
- "./examples/**"
2+
- ./examples/**
3+
4+
overrides:
5+
vite: ^7.1.0

0 commit comments

Comments
 (0)