1
1
import { execa , execaNode } from "execa" ;
2
- import { readFileSync } from "node:fs" ;
2
+ import { existsSync , readFileSync } from "node:fs" ;
3
3
import { mkdir , rename , rm } from "node:fs/promises" ;
4
4
import { join , resolve } from "node:path" ;
5
5
6
6
import { typecheckProject } from "../src/commands/deploy" ;
7
7
import { readConfig , ReadConfigFileResult } from "../src/utilities/configFiles" ;
8
- import { PackageManager } from "../src/utilities/getUserPackageManager" ;
8
+ import {
9
+ detectPackageManagerFromArtifacts ,
10
+ LOCKFILES ,
11
+ PackageManager ,
12
+ } from "../src/utilities/getUserPackageManager" ;
9
13
import { logger } from "../src/utilities/logger" ;
10
14
import { compile } from "./compile" ;
11
15
import { createContainerFile } from "./createContainerFile" ;
12
16
import { createDeployHash } from "./createDeployHash" ;
13
17
import { handleDependencies } from "./handleDependencies" ;
14
- import { Loglevel , LogLevelSchema , PackageManagerSchema } from "./schemas" ;
18
+ import { E2EOptions , E2EOptionsSchema } from "./schemas" ;
15
19
import allTestCases from "./testCases.json" ;
16
20
17
21
type TestCase = {
@@ -31,36 +35,36 @@ const testCases: TestCase[] = process.env.MOD
31
35
? allTestCases . filter ( ( { name } ) => process . env . MOD === name )
32
36
: allTestCases ;
33
37
34
- let logLevel : Loglevel = "log" ;
35
- let packageManager : PackageManager = "npm" ;
38
+ let options : E2EOptions ;
36
39
37
40
try {
38
- logLevel = LogLevelSchema . parse ( process . env . LOG ) ;
41
+ options = E2EOptionsSchema . parse ( {
42
+ logLevel : process . env . LOG ,
43
+ packageManager : process . env . PM ,
44
+ } ) ;
39
45
} catch ( e ) {
40
- console . error ( e ) ;
41
- console . log ( "Using default log level 'log'" ) ;
46
+ options = {
47
+ logLevel : "log" ,
48
+ } ;
42
49
}
43
50
44
- logger . loggerLevel = logLevel ;
45
-
46
- try {
47
- packageManager = PackageManagerSchema . parse ( process . env . PM ) ;
48
- } catch ( e ) {
49
- console . error ( e ) ;
50
- console . log ( "Using default package manager 'npm'" ) ;
51
- }
51
+ logger . loggerLevel = options . logLevel ;
52
52
53
53
if ( testCases . length > 0 ) {
54
- console . log ( `Using ${ packageManager } ` ) ;
55
-
56
- describe . concurrent ( "bundling" , ( ) => {
54
+ describe . concurrent ( "bundling" , async ( ) => {
57
55
beforeAll ( async ( ) => {
58
56
for ( let testCase of testCases ) {
59
57
const { name } = testCase ;
60
58
const fixtureDir = resolve ( join ( process . cwd ( ) , "e2e/fixtures" , name ) ) ;
61
59
await rm ( resolve ( join ( fixtureDir , ".trigger" ) ) , { force : true , recursive : true } ) ;
62
60
await rm ( resolve ( join ( fixtureDir , "node_modules" ) ) , { force : true , recursive : true } ) ;
63
- if ( packageManager === "npm" ) {
61
+ const packageManager : PackageManager = await parsepackageManager ( options , fixtureDir ) ;
62
+
63
+ if (
64
+ packageManager === "npm" &&
65
+ ( existsSync ( resolve ( join ( fixtureDir , "yarn.lock" ) ) ) ||
66
+ existsSync ( resolve ( join ( fixtureDir , "yarn.lock.copy" ) ) ) )
67
+ ) {
64
68
// `npm ci` & `npm install` will update an existing yarn.lock
65
69
try {
66
70
await rename (
@@ -90,10 +94,12 @@ if (testCases.length > 0) {
90
94
} ) ;
91
95
92
96
afterAll ( async ( ) => {
93
- if ( packageManager === "npm" ) {
94
- for ( let testCase of testCases ) {
95
- const { name } = testCase ;
96
- const fixtureDir = resolve ( join ( process . cwd ( ) , "e2e/fixtures" , name ) ) ;
97
+ for ( let testCase of testCases ) {
98
+ const { name } = testCase ;
99
+ const fixtureDir = resolve ( join ( process . cwd ( ) , "e2e/fixtures" , name ) ) ;
100
+ const packageManager : PackageManager = await parsepackageManager ( options , fixtureDir ) ;
101
+
102
+ if ( packageManager === "npm" ) {
97
103
try {
98
104
await rename (
99
105
resolve ( join ( fixtureDir , "yarn.lock.copy" ) ) ,
@@ -116,8 +122,13 @@ if (testCases.length > 0) {
116
122
wantInstallationError,
117
123
} = testCase ;
118
124
const fixtureDir = resolve ( join ( process . cwd ( ) , "e2e/fixtures" , name ) ) ;
125
+ let shouldSkipFixture : boolean = false ;
126
+ const packageManager : PackageManager = await parsepackageManager ( options , fixtureDir ) ;
119
127
120
- test (
128
+ if ( options . packageManager )
129
+ shouldSkipFixture = ! existsSync ( resolve ( fixtureDir , LOCKFILES [ options . packageManager ] ) ) ;
130
+
131
+ test . skipIf ( shouldSkipFixture ) (
121
132
`fixture '${ name } '` ,
122
133
async ( ) => {
123
134
await expect (
@@ -316,3 +327,18 @@ function installArgs(packageManager: string) {
316
327
throw new Error ( `Unknown package manager '${ packageManager } '` ) ;
317
328
}
318
329
}
330
+
331
+ async function parsepackageManager (
332
+ options : E2EOptions ,
333
+ fixtureDir : string
334
+ ) : Promise < PackageManager > {
335
+ let packageManager : PackageManager ;
336
+
337
+ if ( options . packageManager ) {
338
+ packageManager = options . packageManager ;
339
+ } else {
340
+ packageManager = await detectPackageManagerFromArtifacts ( fixtureDir ) ;
341
+ }
342
+
343
+ return packageManager ;
344
+ }
0 commit comments