@@ -19,11 +19,13 @@ import { handleDependencies } from "./handleDependencies";
19
19
import { E2EOptions , E2EOptionsSchema } from "./schemas" ;
20
20
import { fixturesConfig , TestCase } from "./fixtures.config" ;
21
21
import { Metafile , OutputFile } from "esbuild" ;
22
+ import { findUp , findUpMultiple } from "find-up" ;
22
23
23
24
interface E2EFixtureTest extends TestCase {
24
- dir : string ;
25
+ fixtureDir : string ;
25
26
packageManager : PackageManager ;
26
27
tempDir : string ;
28
+ workspaceDir : string ;
27
29
}
28
30
29
31
const TIMEOUT = 120_000 ;
@@ -49,31 +51,40 @@ logger.loggerLevel = options.logLevel;
49
51
50
52
if ( testCases . length > 0 ) {
51
53
describe . concurrent ( "bundling" , async ( ) => {
52
- beforeEach < E2EFixtureTest > ( async ( { dir , packageManager } ) => {
53
- await rimraf ( join ( dir , "**/node_modules" ) , {
54
+ beforeEach < E2EFixtureTest > ( async ( { fixtureDir , packageManager, workspaceDir } ) => {
55
+ await rimraf ( join ( workspaceDir , "**/node_modules" ) , {
54
56
glob : true ,
55
57
} ) ;
56
- await rimraf ( join ( dir , ".yarn" ) , { glob : true } ) ;
58
+ await rimraf ( join ( workspaceDir , ".yarn" ) , { glob : true } ) ;
57
59
if (
58
60
packageManager === "npm" &&
59
- ( existsSync ( resolve ( join ( dir , "yarn.lock" ) ) ) ||
60
- existsSync ( resolve ( join ( dir , "yarn.lock.copy" ) ) ) )
61
+ ( existsSync ( resolve ( join ( workspaceDir , "yarn.lock" ) ) ) ||
62
+ existsSync ( resolve ( join ( workspaceDir , "yarn.lock.copy" ) ) ) )
61
63
) {
62
64
// `npm ci` & `npm install` will update an existing yarn.lock
63
65
try {
64
- await rename ( resolve ( join ( dir , "yarn.lock" ) ) , resolve ( join ( dir , "yarn.lock.copy" ) ) ) ;
66
+ await rename (
67
+ resolve ( join ( workspaceDir , "yarn.lock" ) ) ,
68
+ resolve ( join ( workspaceDir , "yarn.lock.copy" ) )
69
+ ) ;
65
70
} catch ( e ) {
66
- await rename ( resolve ( join ( dir , "yarn.lock.copy" ) ) , resolve ( join ( dir , "yarn.lock" ) ) ) ;
71
+ await rename (
72
+ resolve ( join ( workspaceDir , "yarn.lock.copy" ) ) ,
73
+ resolve ( join ( workspaceDir , "yarn.lock" ) )
74
+ ) ;
67
75
}
68
76
}
69
77
70
- await installFixtureDeps ( dir , packageManager ) ;
78
+ await installFixtureDeps ( { fixtureDir , packageManager, workspaceDir } ) ;
71
79
} , TIMEOUT ) ;
72
80
73
- afterEach < E2EFixtureTest > ( async ( { dir , packageManager } ) => {
81
+ afterEach < E2EFixtureTest > ( async ( { packageManager , workspaceDir } ) => {
74
82
if ( packageManager === "npm" ) {
75
83
try {
76
- await rename ( resolve ( join ( dir , "yarn.lock.copy" ) ) , resolve ( join ( dir , "yarn.lock" ) ) ) ;
84
+ await rename (
85
+ resolve ( join ( workspaceDir , "yarn.lock.copy" ) ) ,
86
+ resolve ( join ( workspaceDir , "yarn.lock" ) )
87
+ ) ;
77
88
} catch { }
78
89
}
79
90
@@ -83,22 +94,25 @@ if (testCases.length > 0) {
83
94
for ( let testCase of testCases ) {
84
95
test . extend < E2EFixtureTest > ( {
85
96
...testCase ,
86
- dir : async ( { id, rootDir = "" } , use ) =>
87
- await use ( resolve ( join ( process . cwd ( ) , "e2e/fixtures" , id , rootDir ) ) ) ,
88
- packageManager : async ( { dir } , use ) => await use ( await parsePackageManager ( options , dir ) ) ,
89
- tempDir : async ( { dir } , use ) => {
90
- const existingTempDir = resolve ( join ( dir , ".trigger" ) ) ;
97
+ fixtureDir : async ( { id } , use ) =>
98
+ await use ( resolve ( join ( process . cwd ( ) , "e2e/fixtures" , id ) ) ) ,
99
+ workspaceDir : async ( { fixtureDir, workspaceRelativeDir = "" } , use ) =>
100
+ await use ( resolve ( join ( fixtureDir , workspaceRelativeDir ) ) ) ,
101
+ packageManager : async ( { workspaceDir } , use ) =>
102
+ await use ( await parsePackageManager ( options , workspaceDir ) ) ,
103
+ tempDir : async ( { workspaceDir } , use ) => {
104
+ const existingTempDir = resolve ( join ( workspaceDir , ".trigger" ) ) ;
91
105
92
106
if ( existsSync ( existingTempDir ) ) {
93
107
await rm ( existingTempDir , { force : true , recursive : true } ) ;
94
108
}
95
- await use ( ( await mkdir ( join ( dir , ".trigger" ) , { recursive : true } ) ) as string ) ;
109
+ await use ( ( await mkdir ( join ( workspaceDir , ".trigger" ) , { recursive : true } ) ) as string ) ;
96
110
} ,
97
111
} ) (
98
112
`fixture '${ testCase . id } '` ,
99
113
{ timeout : TIMEOUT } ,
100
114
async ( {
101
- dir ,
115
+ fixtureDir ,
102
116
packageManager,
103
117
resolveEnv,
104
118
skip,
@@ -110,18 +124,19 @@ if (testCases.length > 0) {
110
124
wantDependenciesError,
111
125
wantInstallationError,
112
126
wantWorkerError,
127
+ workspaceDir,
113
128
} ) => {
114
- // if (
115
- // options.packageManager &&
116
- // !existsSync(resolve(dir , LOCKFILES[options.packageManager]))
117
- // ) {
118
- // skip();
119
- // }
129
+ if (
130
+ options . packageManager &&
131
+ ! existsSync ( resolve ( fixtureDir , LOCKFILES [ options . packageManager ] ) )
132
+ ) {
133
+ skip ( ) ;
134
+ }
120
135
121
136
let resolvedConfig : ReadConfigResult ;
122
137
const configExpect = expect (
123
138
( async ( ) => {
124
- resolvedConfig = await readConfig ( dir , { cwd : dir } ) ;
139
+ resolvedConfig = await readConfig ( workspaceDir , { cwd : workspaceDir } ) ;
125
140
} ) ( ) ,
126
141
wantConfigNotFoundError || wantConfigInvalidError
127
142
? "does not resolve config"
@@ -289,27 +304,48 @@ function debug(message: string) {
289
304
}
290
305
}
291
306
292
- async function installFixtureDeps ( dir : string , packageManager : PackageManager ) {
307
+ async function installFixtureDeps ( options : {
308
+ fixtureDir : string ;
309
+ packageManager : PackageManager ;
310
+ workspaceDir : string ;
311
+ } ) {
312
+ const { packageManager, workspaceDir } = options ;
293
313
if ( [ "pnpm" , "yarn" ] . includes ( packageManager ) ) {
294
- const buffer = readFileSync ( resolve ( join ( dir , "package.json" ) ) , "utf8" ) ;
295
- const pkgJSON = JSON . parse ( buffer . toString ( ) ) ;
296
- const version = pkgJSON . engines [ packageManager ] ;
314
+ const version = await detectPackageManagerVersion ( options ) ;
297
315
debug ( `Detected ${ packageManager } @${ version } from package.json 'engines' field` ) ;
298
316
const { stdout, stderr } = await execa ( "corepack" , [ "use" , `${ packageManager } @${ version } ` ] , {
299
- cwd : dir ,
317
+ cwd : workspaceDir ,
300
318
} ) ;
301
319
debug ( stdout ) ;
302
320
if ( stderr ) console . error ( stderr ) ;
303
321
} else {
304
322
const { stdout, stderr } = await execa ( packageManager , installArgs ( packageManager ) , {
305
- cwd : dir ,
306
- NODE_PATH : resolve ( join ( dir , "node_modules" ) ) ,
323
+ cwd : workspaceDir ,
324
+ NODE_PATH : resolve ( join ( workspaceDir , "node_modules" ) ) ,
307
325
} ) ;
308
326
debug ( stdout ) ;
309
327
if ( stderr ) console . error ( stderr ) ;
310
328
}
311
329
}
312
330
331
+ async function detectPackageManagerVersion ( options : {
332
+ fixtureDir : string ;
333
+ packageManager : PackageManager ;
334
+ workspaceDir : string ;
335
+ } ) : Promise < string > {
336
+ const { fixtureDir, packageManager, workspaceDir } = options ;
337
+ const pkgPaths = await findUpMultiple ( "package.json" , { cwd : workspaceDir , stopAt : fixtureDir } ) ;
338
+ for ( let pkgPath of pkgPaths ) {
339
+ const buffer = readFileSync ( pkgPath , "utf8" ) ;
340
+ const pkgJSON = JSON . parse ( buffer . toString ( ) ) ;
341
+ if ( ! pkgJSON . engines ) continue ;
342
+ const version = pkgJSON . engines [ packageManager ] ;
343
+ if ( version ) return version ;
344
+ }
345
+
346
+ throw new Error ( `No version found for package manager ${ packageManager } ` ) ;
347
+ }
348
+
313
349
function installArgs ( packageManager : string ) {
314
350
switch ( packageManager ) {
315
351
case "bun" :
0 commit comments