Skip to content

Commit f8b9575

Browse files
Run vite-dev integration test in RSC Framework Mode (#14193)
1 parent 246f836 commit f8b9575

File tree

1 file changed

+109
-60
lines changed

1 file changed

+109
-60
lines changed

integration/vite-dev-test.ts

Lines changed: 109 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,44 @@ import dedent from "dedent";
66

77
import {
88
reactRouterConfig,
9+
viteConfig,
910
test,
1011
type TemplateName,
1112
type Files,
1213
} from "./helpers/vite.js";
1314

1415
const tsx = dedent;
1516

17+
const fixtures = [
18+
{
19+
templateName: "vite-5-template",
20+
viteEnvironmentApi: false,
21+
},
22+
{
23+
templateName: "vite-6-template",
24+
viteEnvironmentApi: true,
25+
},
26+
{
27+
templateName: "rsc-vite-framework",
28+
viteEnvironmentApi: true,
29+
},
30+
] as const satisfies ReadonlyArray<{
31+
templateName: TemplateName;
32+
viteEnvironmentApi: boolean;
33+
}>;
34+
1635
test.describe("Vite dev", () => {
17-
[false, true].forEach((viteEnvironmentApi) => {
18-
test.describe(`viteEnvironmentApi: ${viteEnvironmentApi}`, () => {
36+
for (const { templateName, viteEnvironmentApi } of fixtures) {
37+
test.describe(`template: ${templateName} viteEnvironmentApi: ${viteEnvironmentApi}`, () => {
1938
const files: Files = async ({ port }) => ({
2039
"react-router.config.ts": reactRouterConfig({
2140
viteEnvironmentApi,
2241
}),
23-
"vite.config.ts": tsx`
24-
import { defineConfig } from "vite";
25-
import { reactRouter } from "@react-router/dev/vite";
26-
import mdx from "@mdx-js/rollup";
27-
28-
export default defineConfig({
29-
server: {
30-
port: ${port},
31-
strictPort: true,
32-
},
33-
plugins: [
34-
mdx(),
35-
reactRouter(),
36-
],
37-
});
38-
`,
42+
"vite.config.ts": await viteConfig.basic({
43+
port,
44+
templateName,
45+
mdx: true,
46+
}),
3947
"app/root.tsx": tsx`
4048
import { Links, Meta, Outlet, Scripts } from "react-router";
4149
@@ -58,6 +66,17 @@ test.describe("Vite dev", () => {
5866
}
5967
`,
6068
"app/routes/_index.tsx": tsx`
69+
export default function IndexRoute() {
70+
return (
71+
<div id="index">
72+
<h2 data-title>Index</h2>
73+
<input />
74+
<p data-hmr>HMR updated: no</p>
75+
</div>
76+
);
77+
}
78+
`,
79+
"app/routes/deferred-loader-data.tsx": tsx`
6180
import { Suspense } from "react";
6281
import { Await, useLoaderData } from "react-router";
6382
@@ -73,9 +92,6 @@ test.describe("Vite dev", () => {
7392
7493
return (
7594
<div id="index">
76-
<h2 data-title>Index</h2>
77-
<input />
78-
<p data-hmr>HMR updated: no</p>
7995
<Suspense fallback={<p data-defer>Defer finished: no</p>}>
8096
<Await resolve={deferred}>{() => <p data-defer>Defer finished: yes</p>}</Await>
8197
</Suspense>
@@ -159,37 +175,41 @@ test.describe("Vite dev", () => {
159175
160176
<MdxComponent />
161177
`,
162-
".env": `
163-
ENV_VAR_FROM_DOTENV_FILE=Content from .env file
164-
`,
165-
"app/routes/dotenv.tsx": tsx`
166-
import { useState, useEffect } from "react";
167-
import { useLoaderData } from "react-router";
168-
169-
export const loader = () => {
170-
return {
171-
loaderContent: process.env.ENV_VAR_FROM_DOTENV_FILE,
178+
...(!templateName.includes("rsc")
179+
? {
180+
".env": `
181+
ENV_VAR_FROM_DOTENV_FILE=Content from .env file
182+
`,
183+
"app/routes/dotenv.tsx": tsx`
184+
import { useState, useEffect } from "react";
185+
import { useLoaderData } from "react-router";
186+
187+
export const loader = () => {
188+
return {
189+
loaderContent: process.env.ENV_VAR_FROM_DOTENV_FILE,
190+
}
191+
}
192+
193+
export default function DotenvRoute() {
194+
const { loaderContent } = useLoaderData();
195+
196+
const [clientContent, setClientContent] = useState('');
197+
useEffect(() => {
198+
try {
199+
setClientContent("process.env.ENV_VAR_FROM_DOTENV_FILE shouldn't be available on the client, found: " + process.env.ENV_VAR_FROM_DOTENV_FILE);
200+
} catch (err) {
201+
setClientContent("process.env.ENV_VAR_FROM_DOTENV_FILE not available on the client, which is a good thing");
202+
}
203+
}, []);
204+
205+
return <>
206+
<div data-dotenv-route-loader-content>{loaderContent}</div>
207+
<div data-dotenv-route-client-content>{clientContent}</div>
208+
</>
209+
}
210+
`,
172211
}
173-
}
174-
175-
export default function DotenvRoute() {
176-
const { loaderContent } = useLoaderData();
177-
178-
const [clientContent, setClientContent] = useState('');
179-
useEffect(() => {
180-
try {
181-
setClientContent("process.env.ENV_VAR_FROM_DOTENV_FILE shouldn't be available on the client, found: " + process.env.ENV_VAR_FROM_DOTENV_FILE);
182-
} catch (err) {
183-
setClientContent("process.env.ENV_VAR_FROM_DOTENV_FILE not available on the client, which is a good thing");
184-
}
185-
}, []);
186-
187-
return <>
188-
<div data-dotenv-route-loader-content>{loaderContent}</div>
189-
<div data-dotenv-route-client-content>{clientContent}</div>
190-
</>
191-
}
192-
`,
212+
: {}),
193213
"app/routes/error-stacktrace.tsx": tsx`
194214
import { Link, useLocation, type LoaderFunction, type MetaFunction } from "react-router";
195215
@@ -254,11 +274,7 @@ test.describe("Vite dev", () => {
254274
`,
255275
});
256276

257-
const templateName: TemplateName = viteEnvironmentApi
258-
? "vite-6-template"
259-
: "vite-5-template";
260-
261-
test("renders matching routes", async ({ dev, page }) => {
277+
test("renders matching routes with HMR", async ({ dev, page }) => {
262278
const { cwd, port } = await dev(files, templateName);
263279

264280
await page.goto(`http://localhost:${port}/`, {
@@ -269,9 +285,6 @@ test.describe("Vite dev", () => {
269285
expect(page.errors).toEqual([]);
270286

271287
await expect(page.locator("#index [data-title]")).toHaveText("Index");
272-
await expect(page.locator("#index [data-defer]")).toHaveText(
273-
"Defer finished: yes",
274-
);
275288

276289
let hmrStatus = page.locator("#index [data-hmr]");
277290
await expect(hmrStatus).toHaveText("HMR updated: no");
@@ -297,6 +310,27 @@ test.describe("Vite dev", () => {
297310
expect(page.errors).toEqual([]);
298311
});
299312

313+
test("deferred loader data", async ({ dev, page }) => {
314+
test.fixme(
315+
templateName.includes("rsc"),
316+
"RSC doesn't support Await component",
317+
);
318+
319+
const { port } = await dev(files, templateName);
320+
await page.goto(`http://localhost:${port}/deferred-loader-data`, {
321+
waitUntil: "networkidle",
322+
});
323+
324+
// Ensure no errors on page load
325+
expect(page.errors).toEqual([]);
326+
327+
await expect(page.locator("#index [data-defer]")).toHaveText(
328+
"Defer finished: yes",
329+
);
330+
// Ensure no errors after deferred rendering
331+
expect(page.errors).toEqual([]);
332+
});
333+
300334
test("handles multiple set-cookie headers", async ({ dev, page }) => {
301335
const { port } = await dev(files, templateName);
302336

@@ -357,6 +391,11 @@ test.describe("Vite dev", () => {
357391
});
358392

359393
test("loads .env file", async ({ dev, page }) => {
394+
test.fixme(
395+
templateName.includes("rsc"),
396+
"RSC Framework Mode doesn't load .env files",
397+
);
398+
360399
const { port } = await dev(files, templateName);
361400

362401
await page.goto(`http://localhost:${port}/dotenv`, {
@@ -379,6 +418,11 @@ test.describe("Vite dev", () => {
379418
dev,
380419
page,
381420
}) => {
421+
test.fixme(
422+
templateName.includes("rsc"),
423+
"Investigate this for RSC Framework Mode",
424+
);
425+
382426
const { port } = await dev(files, templateName);
383427

384428
await page.goto(
@@ -401,6 +445,11 @@ test.describe("Vite dev", () => {
401445
});
402446

403447
test("handle known route exports with HMR", async ({ dev, page }) => {
448+
test.fixme(
449+
templateName.includes("rsc"),
450+
"Investigate why this is failing in RSC Framework Mode",
451+
);
452+
404453
const { cwd, port } = await dev(files, templateName);
405454

406455
await page.goto(`http://localhost:${port}/known-route-exports`, {
@@ -450,5 +499,5 @@ test.describe("Vite dev", () => {
450499
expect(page.errors).toEqual([]);
451500
});
452501
});
453-
});
502+
}
454503
});

0 commit comments

Comments
 (0)