Skip to content

Commit 368e0cb

Browse files
authored
Fixtures for HMR & HDR test (#14403)
* wip * wip * wip * wip * wip * wip
1 parent 1e707c4 commit 368e0cb

File tree

4 files changed

+371
-225
lines changed

4 files changed

+371
-225
lines changed

integration/helpers/express.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import tsx from "dedent";
2+
3+
export function server() {
4+
return tsx`
5+
import { createRequestHandler } from "@react-router/express";
6+
import express from "express";
7+
8+
const port = process.env.PORT ?? 3000
9+
const hmrPort = process.env.HMR_PORT ?? 3001
10+
11+
const app = express();
12+
13+
const getLoadContext = () => ({});
14+
15+
if (process.env.NODE_ENV === "production") {
16+
app.use(
17+
"/assets",
18+
express.static("build/client/assets", { immutable: true, maxAge: "1y" })
19+
);
20+
app.use(express.static("build/client", { maxAge: "1h" }));
21+
app.all("*", createRequestHandler({
22+
build: await import("./build/index.js"),
23+
getLoadContext,
24+
}));
25+
} else {
26+
const viteDevServer = await import("vite").then(
27+
(vite) => vite.createServer({
28+
server: {
29+
middlewareMode: true,
30+
hmr: { port: hmrPort },
31+
},
32+
})
33+
);
34+
app.use(viteDevServer.middlewares);
35+
app.all("*", createRequestHandler({
36+
build:() => viteDevServer.ssrLoadModule("virtual:react-router/server-build"),
37+
getLoadContext,
38+
}));
39+
}
40+
41+
app.listen(port, () => console.log('http://localhost:' + port));
42+
`;
43+
}
44+
45+
export function rsc() {
46+
return tsx`
47+
import { createRequestListener } from "@mjackson/node-fetch-server";
48+
import express from "express";
49+
50+
const port = process.env.PORT ?? 3000
51+
const hmrPort = process.env.HMR_PORT ?? 3001
52+
53+
const app = express();
54+
55+
if (process.env.NODE_ENV === "production") {
56+
app.use(
57+
"/assets",
58+
express.static("build/client/assets", { immutable: true, maxAge: "1y" })
59+
);
60+
app.all("*", createRequestListener((await import("./build/server/index.js")).default));
61+
} else {
62+
const viteDevServer = await import("vite").then(
63+
(vite) => vite.createServer({
64+
server: {
65+
middlewareMode: true,
66+
hmr: { port: hmrPort },
67+
},
68+
})
69+
);
70+
app.use(viteDevServer.middlewares);
71+
}
72+
73+
app.listen(port, () => console.log('http://localhost:' + port));
74+
`;
75+
}

integration/helpers/stream.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { Readable } from "node:stream";
2+
3+
export async function match(
4+
stream: Readable,
5+
pattern: string | RegExp,
6+
options: {
7+
/** Measured in ms */
8+
timeout?: number;
9+
} = {},
10+
): Promise<RegExpMatchArray> {
11+
// Prepare error outside of promise so that stacktrace points to caller of `matchLine`
12+
const timeoutError = new Error(
13+
`Timed out - Could not find pattern: ${pattern}`,
14+
);
15+
return new Promise(async (resolve, reject) => {
16+
const timeout = setTimeout(
17+
() => reject(timeoutError),
18+
options.timeout ?? 10_000,
19+
);
20+
stream.on("data", (data) => {
21+
const line: string = data.toString();
22+
const matches = line.match(pattern);
23+
if (matches) {
24+
resolve(matches);
25+
clearTimeout(timeout);
26+
}
27+
});
28+
});
29+
}

integration/helpers/templates.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const templates = [
2+
// Vite Major templates
3+
{ name: "vite-5-template", displayName: "Vite 5" },
4+
{ name: "vite-6-template", displayName: "Vite 6" },
5+
{ name: "vite-7-beta-template", displayName: "Vite 7 Beta" },
6+
{ name: "vite-rolldown-template", displayName: "Vite Rolldown" },
7+
8+
// RSC templates
9+
{ name: "rsc-vite", displayName: "RSC (Vite)" },
10+
{ name: "rsc-parcel", displayName: "RSC (Parcel)" },
11+
{ name: "rsc-vite-framework", displayName: "RSC Framework" },
12+
13+
// Cloudflare
14+
// { name: "cloudflare-dev-proxy-template", displayName: "Cloudflare Dev Proxy" },
15+
{ name: "vite-plugin-cloudflare-template", displayName: "Cloudflare" },
16+
] as const;
17+
18+
export type Template = (typeof templates)[number];
19+
20+
export function getTemplates(names?: Array<Template["name"]>) {
21+
if (names === undefined) return templates;
22+
return templates.filter(({ name }) => names.includes(name));
23+
}
24+
25+
export const viteMajorTemplates = getTemplates([
26+
"vite-5-template",
27+
"vite-6-template",
28+
"vite-7-beta-template",
29+
"vite-rolldown-template",
30+
]);

0 commit comments

Comments
 (0)