@@ -7,15 +7,21 @@ import getPort, { makeRange } from "get-port";
7
7
8
8
import { createFixtureProject , css , js , json } from "./helpers/create-fixture" ;
9
9
10
- let fixture = ( options : { port : number ; appServerPort : number } ) => ( {
10
+ test . setTimeout ( 120_000 ) ;
11
+
12
+ let fixture = ( options : {
13
+ appServerPort : number ;
14
+ httpPort : number ;
15
+ webSocketPort : number ;
16
+ } ) => ( {
11
17
files : {
12
18
"remix.config.js" : js `
13
19
module.exports = {
14
20
tailwind: true,
15
21
future: {
16
22
unstable_dev: {
17
- port : ${ options . port } ,
18
- appServerPort : ${ options . appServerPort } ,
23
+ httpPort : ${ options . httpPort } ,
24
+ webSocketPort : ${ options . webSocketPort } ,
19
25
},
20
26
v2_routeConvention: true,
21
27
v2_errorBoundary: true,
@@ -28,8 +34,7 @@ let fixture = (options: { port: number; appServerPort: number }) => ({
28
34
private : true ,
29
35
sideEffects : false ,
30
36
scripts : {
31
- "dev:remix" : `cross-env NODE_ENV=development node ./node_modules/@remix-run/dev/dist/cli.js dev` ,
32
- "dev:app" : `cross-env NODE_ENV=development nodemon --watch build/ ./server.js` ,
37
+ dev : `cross-env NODE_ENV=development node ./node_modules/@remix-run/dev/dist/cli.js dev -c "node ./server.js"` ,
33
38
} ,
34
39
dependencies : {
35
40
"@remix-run/css-bundle" : "0.0.0-local-version" ,
@@ -38,7 +43,6 @@ let fixture = (options: { port: number; appServerPort: number }) => ({
38
43
"cross-env" : "0.0.0-local-version" ,
39
44
express : "0.0.0-local-version" ,
40
45
isbot : "0.0.0-local-version" ,
41
- nodemon : "0.0.0-local-version" ,
42
46
react : "0.0.0-local-version" ,
43
47
"react-dom" : "0.0.0-local-version" ,
44
48
tailwindcss : "0.0.0-local-version" ,
@@ -58,6 +62,7 @@ let fixture = (options: { port: number; appServerPort: number }) => ({
58
62
let path = require("path");
59
63
let express = require("express");
60
64
let { createRequestHandler } = require("@remix-run/express");
65
+ let { ping } = require("@remix-run/dev");
61
66
62
67
const app = express();
63
68
app.use(express.static("public", { immutable: true, maxAge: "1y" }));
@@ -75,8 +80,11 @@ let fixture = (options: { port: number; appServerPort: number }) => ({
75
80
76
81
let port = ${ options . appServerPort } ;
77
82
app.listen(port, () => {
78
- require(BUILD_DIR);
83
+ let build = require(BUILD_DIR);
79
84
console.log('✅ app ready: http://localhost:' + port);
85
+ if (process.env.NODE_ENV === 'development') {
86
+ ping(build);
87
+ }
80
88
});
81
89
` ,
82
90
@@ -204,43 +212,34 @@ let bufferize = (stream: Readable): (() => string) => {
204
212
return ( ) => buffer ;
205
213
} ;
206
214
215
+ let HMR_TIMEOUT_MS = 10_000 ;
216
+
207
217
test ( "HMR" , async ( { page } ) => {
208
218
// uncomment for debugging
209
219
// page.on("console", (msg) => console.log(msg.text()));
210
220
page . on ( "pageerror" , ( err ) => console . log ( err . message ) ) ;
211
221
212
- let appServerPort = await getPort ( { port : makeRange ( 3080 , 3089 ) } ) ;
213
- let port = await getPort ( { port : makeRange ( 3090 , 3099 ) } ) ;
214
- let projectDir = await createFixtureProject ( fixture ( { port, appServerPort } ) ) ;
222
+ let portRange = makeRange ( 3080 , 3099 ) ;
223
+ let appServerPort = await getPort ( { port : portRange } ) ;
224
+ let httpPort = await getPort ( { port : portRange } ) ;
225
+ let webSocketPort = await getPort ( { port : portRange } ) ;
226
+ let projectDir = await createFixtureProject (
227
+ fixture ( { appServerPort, httpPort, webSocketPort } )
228
+ ) ;
215
229
216
230
// spin up dev server
217
- let dev = execa ( "npm" , [ "run" , "dev:remix " ] , { cwd : projectDir } ) ;
231
+ let dev = execa ( "npm" , [ "run" , "dev" ] , { cwd : projectDir } ) ;
218
232
let devStdout = bufferize ( dev . stdout ! ) ;
219
233
let devStderr = bufferize ( dev . stderr ! ) ;
220
234
await wait (
221
235
( ) => {
222
236
let stderr = devStderr ( ) ;
223
237
if ( stderr . length > 0 ) throw Error ( stderr ) ;
224
- return / 💿 B u i l t i n / . test ( devStdout ( ) ) ;
238
+ return / ✅ a p p r e a d y : / . test ( devStdout ( ) ) ;
225
239
} ,
226
240
{ timeoutMs : 10_000 }
227
241
) ;
228
242
229
- // spin up app server
230
- let app = execa ( "npm" , [ "run" , "dev:app" ] , { cwd : projectDir } ) ;
231
- let appStdout = bufferize ( app . stdout ! ) ;
232
- let appStderr = bufferize ( app . stderr ! ) ;
233
- await wait (
234
- ( ) => {
235
- let stderr = appStderr ( ) ;
236
- if ( stderr . length > 0 ) throw Error ( stderr ) ;
237
- return / ✅ a p p r e a d y : / . test ( appStdout ( ) ) ;
238
- } ,
239
- {
240
- timeoutMs : 10_000 ,
241
- }
242
- ) ;
243
-
244
243
try {
245
244
await page . goto ( `http://localhost:${ appServerPort } ` , {
246
245
waitUntil : "networkidle" ,
@@ -290,7 +289,7 @@ test("HMR", async ({ page }) => {
290
289
// detect HMR'd content and style changes
291
290
await page . waitForLoadState ( "networkidle" ) ;
292
291
let h1 = page . getByText ( "Changed" ) ;
293
- await h1 . waitFor ( { timeout : 2000 } ) ;
292
+ await h1 . waitFor ( { timeout : HMR_TIMEOUT_MS } ) ;
294
293
expect ( h1 ) . toHaveCSS ( "color" , "rgb(255, 255, 255)" ) ;
295
294
expect ( h1 ) . toHaveCSS ( "background-color" , "rgb(0, 0, 0)" ) ;
296
295
@@ -301,7 +300,7 @@ test("HMR", async ({ page }) => {
301
300
// undo change
302
301
fs . writeFileSync ( indexPath , originalIndex ) ;
303
302
fs . writeFileSync ( cssModulePath , originalCssModule ) ;
304
- await page . getByText ( "Index Title" ) . waitFor ( { timeout : 2000 } ) ;
303
+ await page . getByText ( "Index Title" ) . waitFor ( { timeout : HMR_TIMEOUT_MS } ) ;
305
304
expect ( await page . getByLabel ( "Root Input" ) . inputValue ( ) ) . toBe ( "asdfasdf" ) ;
306
305
await page . waitForSelector ( `#root-counter:has-text("inc 1")` ) ;
307
306
@@ -322,7 +321,7 @@ test("HMR", async ({ page }) => {
322
321
}
323
322
` ;
324
323
fs . writeFileSync ( indexPath , withLoader1 ) ;
325
- await page . getByText ( "Hello, world" ) . waitFor ( { timeout : 2000 } ) ;
324
+ await page . getByText ( "Hello, world" ) . waitFor ( { timeout : HMR_TIMEOUT_MS } ) ;
326
325
expect ( await page . getByLabel ( "Root Input" ) . inputValue ( ) ) . toBe ( "asdfasdf" ) ;
327
326
await page . waitForSelector ( `#root-counter:has-text("inc 1")` ) ;
328
327
@@ -344,7 +343,7 @@ test("HMR", async ({ page }) => {
344
343
}
345
344
` ;
346
345
fs . writeFileSync ( indexPath , withLoader2 ) ;
347
- await page . getByText ( "Hello, planet" ) . waitFor ( { timeout : 2000 } ) ;
346
+ await page . getByText ( "Hello, planet" ) . waitFor ( { timeout : HMR_TIMEOUT_MS } ) ;
348
347
expect ( await page . getByLabel ( "Root Input" ) . inputValue ( ) ) . toBe ( "asdfasdf" ) ;
349
348
await page . waitForSelector ( `#root-counter:has-text("inc 1")` ) ;
350
349
@@ -388,10 +387,16 @@ test("HMR", async ({ page }) => {
388
387
aboutCounter = await page . waitForSelector (
389
388
`#about-counter:has-text("inc 0")`
390
389
) ;
390
+ } catch ( e ) {
391
+ console . log ( "stdout begin -----------------------" ) ;
392
+ console . log ( devStdout ( ) ) ;
393
+ console . log ( "stdout end -------------------------" ) ;
394
+
395
+ console . log ( "stderr begin -----------------------" ) ;
396
+ console . log ( devStderr ( ) ) ;
397
+ console . log ( "stderr end -------------------------" ) ;
398
+ throw e ;
391
399
} finally {
392
400
dev . kill ( ) ;
393
- app . kill ( ) ;
394
- console . log ( devStderr ( ) ) ;
395
- console . log ( appStderr ( ) ) ;
396
401
}
397
402
} ) ;
0 commit comments