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
75 changes: 75 additions & 0 deletions integration/helpers/express.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import tsx from "dedent";

export function server() {
return tsx`
import { createRequestHandler } from "@react-router/express";
import express from "express";

const port = process.env.PORT ?? 3000
const hmrPort = process.env.HMR_PORT ?? 3001

const app = express();

const getLoadContext = () => ({});

if (process.env.NODE_ENV === "production") {
app.use(
"/assets",
express.static("build/client/assets", { immutable: true, maxAge: "1y" })
);
app.use(express.static("build/client", { maxAge: "1h" }));
app.all("*", createRequestHandler({
build: await import("./build/index.js"),
getLoadContext,
}));
} else {
const viteDevServer = await import("vite").then(
(vite) => vite.createServer({
server: {
middlewareMode: true,
hmr: { port: hmrPort },
},
})
);
app.use(viteDevServer.middlewares);
app.all("*", createRequestHandler({
build:() => viteDevServer.ssrLoadModule("virtual:react-router/server-build"),
getLoadContext,
}));
}

app.listen(port, () => console.log('http://localhost:' + port));
`;
}

export function rsc() {
return tsx`
import { createRequestListener } from "@mjackson/node-fetch-server";
import express from "express";

const port = process.env.PORT ?? 3000
const hmrPort = process.env.HMR_PORT ?? 3001

const app = express();

if (process.env.NODE_ENV === "production") {
app.use(
"/assets",
express.static("build/client/assets", { immutable: true, maxAge: "1y" })
);
app.all("*", createRequestListener((await import("./build/server/index.js")).default));
} else {
const viteDevServer = await import("vite").then(
(vite) => vite.createServer({
server: {
middlewareMode: true,
hmr: { port: hmrPort },
},
})
);
app.use(viteDevServer.middlewares);
}

app.listen(port, () => console.log('http://localhost:' + port));
`;
}
29 changes: 29 additions & 0 deletions integration/helpers/stream.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import type { Readable } from "node:stream";

export async function match(
stream: Readable,
pattern: string | RegExp,
options: {
/** Measured in ms */
timeout?: number;
} = {},
): Promise<RegExpMatchArray> {
// Prepare error outside of promise so that stacktrace points to caller of `matchLine`
const timeoutError = new Error(
`Timed out - Could not find pattern: ${pattern}`,
);
return new Promise(async (resolve, reject) => {
const timeout = setTimeout(
() => reject(timeoutError),
options.timeout ?? 10_000,
);
stream.on("data", (data) => {
const line: string = data.toString();
const matches = line.match(pattern);
if (matches) {
resolve(matches);
clearTimeout(timeout);
}
});
});
}
30 changes: 30 additions & 0 deletions integration/helpers/templates.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const templates = [
// Vite Major templates
{ name: "vite-5-template", displayName: "Vite 5" },
{ name: "vite-6-template", displayName: "Vite 6" },
{ name: "vite-7-beta-template", displayName: "Vite 7 Beta" },
{ name: "vite-rolldown-template", displayName: "Vite Rolldown" },

// RSC templates
{ name: "rsc-vite", displayName: "RSC (Vite)" },
{ name: "rsc-parcel", displayName: "RSC (Parcel)" },
{ name: "rsc-vite-framework", displayName: "RSC Framework" },

// Cloudflare
// { name: "cloudflare-dev-proxy-template", displayName: "Cloudflare Dev Proxy" },
{ name: "vite-plugin-cloudflare-template", displayName: "Cloudflare" },
] as const;

export type Template = (typeof templates)[number];

export function getTemplates(names?: Array<Template["name"]>) {
if (names === undefined) return templates;
return templates.filter(({ name }) => names.includes(name));
}

export const viteMajorTemplates = getTemplates([
"vite-5-template",
"vite-6-template",
"vite-7-beta-template",
"vite-rolldown-template",
]);
Loading