@@ -6,36 +6,44 @@ import dedent from "dedent";
66
77import {
88 reactRouterConfig ,
9+ viteConfig ,
910 test ,
1011 type TemplateName ,
1112 type Files ,
1213} from "./helpers/vite.js" ;
1314
1415const 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+
1635test . 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