@@ -6,7 +6,7 @@ import Debug from 'debug'
66
77const debug = Debug ( 'checkly:cli:testing:fixture-sandbox' )
88
9- import { detectNearestPackageJson , detectPackageManager , PackageManager } from '../services/check-parser/package-files/package-manager'
9+ import { detectNearestPackageJson } from '../services/check-parser/package-files/package-manager'
1010
1111export interface CreateFixtureSandboxOptions {
1212 /**
@@ -24,13 +24,6 @@ export interface CreateFixtureSandboxOptions {
2424 */
2525 root ?: string
2626
27- /**
28- * The package manager used to manage the fixture.
29- *
30- * If not provided, the package manager is detected automatically.
31- */
32- packageManager ?: PackageManager
33-
3427 /**
3528 * Whether to install packages using the package manager.
3629 *
@@ -48,34 +41,34 @@ export interface CreateFixtureSandboxOptions {
4841}
4942
5043interface FixtureSandboxOptions {
51- packageManager : PackageManager
5244 root : string
5345}
5446
5547export class FixtureSandbox {
5648 #root: string
57- #packageManager: PackageManager
5849
59- private constructor ( { root, packageManager } : FixtureSandboxOptions ) {
50+ static installer : any
51+
52+ private constructor ( { root } : FixtureSandboxOptions ) {
6053 this . #root = root
61- this . #packageManager = packageManager
6254 }
6355
6456 get root ( ) : string {
6557 return this . #root
6658 }
6759
68- get packageManager ( ) : PackageManager {
69- return this . #packageManager
70- }
71-
7260 static async create ( options : CreateFixtureSandboxOptions ) : Promise < FixtureSandbox > {
73- const { execa } = await import ( 'execa' )
61+ // @ts -expect-error Not a TypeScript module.
62+ const { createInstaller, fileHashSha256 } = await import ( 'dependency-layer-installer' )
63+
64+ const installer = FixtureSandbox . installer ?? await createInstaller ( {
65+ archiveDir : path . join ( tmpdir ( ) , 'fixture-sandbox-installer-archive' ) ,
66+ extractDir : path . join ( tmpdir ( ) , 'fixture-sandbox-installer-extracted' ) ,
67+ } )
7468
7569 const {
7670 source,
7771 root : maybeRoot ,
78- packageManager : maybePackageManager ,
7972 installPackages = true ,
8073 injectPackedSelf = true ,
8174 } = options
@@ -92,41 +85,7 @@ export class FixtureSandbox {
9285 recursive : true ,
9386 } )
9487
95- const packageManager = maybePackageManager
96- ?? await detectPackageManager ( root )
97-
98- debug ( `Detected package manager ${ packageManager . name } ` )
99-
10088 if ( installPackages ) {
101- const { executable, args, unsafeDisplayCommand } = packageManager . installCommand ( )
102-
103- debug ( `Installing packages via ${ unsafeDisplayCommand } ` )
104-
105- await execa ( executable , args , {
106- cwd : root ,
107- } )
108- }
109-
110- if ( installPackages && injectPackedSelf ) {
111- debug ( 'Injecting containing package' )
112-
113- const lockfile = packageManager . representativeLockfile
114-
115- // Take a backup of the original package.json so that we can restore
116- // it later.
117- await fs . cp (
118- path . join ( root , 'package.json' ) ,
119- path . join ( root , 'package.json.backup' ) ,
120- )
121-
122- // Same for the lockfile.
123- if ( lockfile ) {
124- await fs . cp (
125- path . join ( root , lockfile ) ,
126- path . join ( root , `${ lockfile } .backup` ) ,
127- )
128- }
129-
13089 const packageJson = await detectNearestPackageJson ( __dirname )
13190
13291 const sourcePath = path . join (
@@ -137,30 +96,22 @@ export class FixtureSandbox {
13796 // Make sure the archive exists.
13897 await fs . access ( sourcePath , fs . constants . R_OK )
13998
140- const { executable, args } = packageManager . installCommand ( )
99+ await installer . install ( root , async ( plan : any ) => {
100+ await plan . installDependencies ( )
141101
142- await execa ( executable , [ ...args , '--save-dev' , `file:${ sourcePath } ` ] , {
143- cwd : root ,
144- } )
102+ if ( injectPackedSelf ) {
103+ await plan . injectPackedDependency ( packageJson . name , {
104+ file : sourcePath ,
105+ key : await fileHashSha256 ( packageJson . meta . filePath ) ,
106+ } )
107+ }
145108
146- // Restore original package.json.
147- await fs . rename (
148- path . join ( root , 'package.json.backup' ) ,
149- path . join ( root , 'package.json' ) ,
150- )
151-
152- // Restore original lockfile.
153- if ( lockfile ) {
154- await fs . rename (
155- path . join ( root , `${ lockfile } .backup` ) ,
156- path . join ( root , lockfile ) ,
157- )
158- }
109+ await plan . updateLockfile ( )
110+ } )
159111 }
160112
161113 return new FixtureSandbox ( {
162114 root,
163- packageManager,
164115 } )
165116 }
166117
0 commit comments