@@ -6,7 +6,6 @@ import url from "node:url";
6
6
import { createRequire } from "node:module" ;
7
7
import { platform } from "node:os" ;
8
8
import fse from "fs-extra" ;
9
- import stripIndent from "strip-indent" ;
10
9
import waitOn from "wait-on" ;
11
10
import getPort from "get-port" ;
12
11
import shell from "shelljs" ;
@@ -15,13 +14,12 @@ import dedent from "dedent";
15
14
import type { Page } from "@playwright/test" ;
16
15
import { test as base , expect } from "@playwright/test" ;
17
16
import type { Config } from "@react-router/dev/config" ;
17
+ import { createTestDirectory , writeTestFiles } from "./filesystem" ;
18
18
19
19
const require = createRequire ( import . meta. url ) ;
20
20
21
21
const reactRouterBin = "node_modules/@react-router/dev/bin.js" ;
22
22
const __dirname = url . fileURLToPath ( new URL ( "." , import . meta. url ) ) ;
23
- const root = path . resolve ( __dirname , "../.." ) ;
24
- const TMP_DIR = path . join ( root , ".tmp/integration" ) ;
25
23
26
24
export const reactRouterConfig = ( {
27
25
ssr,
@@ -157,26 +155,50 @@ export async function createProject(
157
155
files : Record < string , string > = { } ,
158
156
templateName : TemplateName = "vite-5-template"
159
157
) {
160
- let projectName = `rr-${ Math . random ( ) . toString ( 32 ) . slice ( 2 ) } ` ;
161
- let projectDir = path . join ( TMP_DIR , projectName ) ;
162
- await fse . ensureDir ( projectDir ) ;
158
+ let projectDir = await createTestDirectory ( ) ;
163
159
164
160
// base template
165
161
let templateDir = path . resolve ( __dirname , templateName ) ;
166
162
await fse . copy ( templateDir , projectDir , { errorOnExist : true } ) ;
167
163
168
164
// user-defined files
169
- await Promise . all (
170
- Object . entries ( files ) . map ( async ( [ filename , contents ] ) => {
171
- let filepath = path . join ( projectDir , filename ) ;
172
- await fse . ensureDir ( path . dirname ( filepath ) ) ;
173
- await fse . writeFile ( filepath , stripIndent ( contents ) ) ;
174
- } )
175
- ) ;
165
+ await writeTestFiles ( files , projectDir ) ;
176
166
177
167
return projectDir ;
178
168
}
179
169
170
+ type WorkspaceFileCreatorFn = (
171
+ libDir : string ,
172
+ appDir : string
173
+ ) => { appFiles ?: Record < string , string > ; libFiles ?: Record < string , string > } ;
174
+
175
+ export async function createWorkspaceProject ( files : WorkspaceFileCreatorFn ) {
176
+ const workspaceDir = await createTestDirectory ( ) ;
177
+
178
+ const workspaceTemplateDir = path . resolve (
179
+ __dirname ,
180
+ "workspace-routes-template"
181
+ ) ;
182
+ await fse . copy ( workspaceTemplateDir , workspaceDir , { errorOnExist : true } ) ;
183
+
184
+ const appProjectDir = path . resolve ( workspaceDir , "apps" , "test-app" ) ;
185
+ const libProjectDir = path . resolve ( workspaceDir , "libs" , "test-lib" ) ;
186
+
187
+ const userFiles = files ( libProjectDir , appProjectDir ) ;
188
+ if ( userFiles . libFiles ) {
189
+ await writeTestFiles ( userFiles . libFiles , libProjectDir ) ;
190
+ }
191
+ if ( userFiles . appFiles ) {
192
+ await writeTestFiles ( userFiles . appFiles , appProjectDir ) ;
193
+ }
194
+
195
+ return {
196
+ appProjectDir,
197
+ libProjectDir,
198
+ workspaceDir,
199
+ } ;
200
+ }
201
+
180
202
// Avoid "Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env
181
203
// being set" in vite-ecosystem-ci which breaks empty stderr assertions. To fix
182
204
// this we always ensure that only NO_COLOR is set after spreading process.env.
0 commit comments