@@ -106,86 +106,51 @@ export class JavascriptProject {
106
106
} ) ;
107
107
108
108
try {
109
- span . end ( ) ;
110
- return await command . extractDirectDependenciesMeta ( {
109
+ const packagesMeta = await command . extractDirectDependenciesMeta ( {
111
110
cwd : this . projectPath ,
112
111
} ) ;
113
- } catch ( error ) {
114
- recordSpanException ( span , error ) ;
115
- span . end ( ) ;
116
-
117
- logger . debug ( `Failed to resolve internal dependencies using ${ command . name } ` , {
118
- error,
119
- } ) ;
120
112
121
- throw error ;
122
- }
123
- }
124
- ) ;
125
- }
126
-
127
- async resolveAll ( packageNames : string [ ] ) : Promise < Record < string , string > > {
128
- return tracer . startActiveSpan ( "JavascriptProject.resolveAll" , async ( span ) => {
129
- const externalPackages = packageNames . filter ( ( packageName ) => ! isBuiltInModule ( packageName ) ) ;
113
+ // Merge the resolved versions with the package.json dependencies
114
+ const missingPackagesMeta = Object . entries ( packagesMeta ) . filter (
115
+ ( [ , { version } ] ) => ! version
116
+ ) ;
117
+ const missingPackageVersions : Record < string , string > = { } ;
130
118
131
- const command = await this . #getCommand( ) ;
132
-
133
- span . setAttributes ( {
134
- externalPackages,
135
- packageManager : command . name ,
136
- } ) ;
119
+ for ( const [ packageName , { external } ] of missingPackagesMeta ) {
120
+ const packageJsonVersion = this . packageJson . dependencies ?. [ packageName ] ;
137
121
138
- try {
139
- const versions = await command . resolveDependencyVersions ( externalPackages , {
140
- cwd : this . projectPath ,
141
- } ) ;
122
+ if ( typeof packageJsonVersion === "string" ) {
123
+ logger . debug ( `Resolved ${ packageName } version using package.json` , {
124
+ packageJsonVersion ,
125
+ } ) ;
142
126
143
- if ( versions ) {
144
- logger . debug ( `Resolved [ ${ externalPackages . join ( ", " ) } ] version using ${ command . name } ` , {
145
- versions ,
146
- } ) ;
127
+ packagesMeta [ packageName ] = { version : packageJsonVersion , external } ;
128
+ missingPackageVersions [ packageName ] = packageJsonVersion ;
129
+ }
130
+ }
147
131
148
132
span . setAttributes ( {
149
- ...flattenAttributes ( versions , "versions" ) ,
133
+ ...flattenAttributes ( missingPackageVersions , "missingPackageVersions" ) ,
134
+ missingPackages : missingPackagesMeta . map (
135
+ ( [ pkgName ] : [ string , DependencyMeta ] ) => pkgName
136
+ ) ,
150
137
} ) ;
151
- }
152
138
153
- // Merge the resolved versions with the package.json dependencies
154
- const missingPackages = externalPackages . filter ( ( packageName ) => ! versions [ packageName ] ) ;
155
- const missingPackageVersions : Record < string , string > = { } ;
139
+ span . end ( ) ;
156
140
157
- for ( const packageName of missingPackages ) {
158
- const packageJsonVersion = this . packageJson . dependencies ?. [ packageName ] ;
141
+ return packagesMeta ;
142
+ } catch ( error ) {
143
+ recordSpanException ( span , error ) ;
144
+ span . end ( ) ;
159
145
160
- if ( typeof packageJsonVersion === "string" ) {
161
- logger . debug ( `Resolved ${ packageName } version using package.json` , {
162
- packageJsonVersion,
163
- } ) ;
146
+ logger . debug ( `Failed to resolve internal dependencies using ${ command . name } ` , {
147
+ error,
148
+ } ) ;
164
149
165
- missingPackageVersions [ packageName ] = packageJsonVersion ;
166
- }
150
+ throw error ;
167
151
}
168
-
169
- span . setAttributes ( {
170
- ...flattenAttributes ( missingPackageVersions , "missingPackageVersions" ) ,
171
- missingPackages,
172
- } ) ;
173
-
174
- span . end ( ) ;
175
-
176
- return { ...versions , ...missingPackageVersions } ;
177
- } catch ( error ) {
178
- recordSpanException ( span , error ) ;
179
- span . end ( ) ;
180
-
181
- logger . debug ( `Failed to resolve dependency versions using ${ command . name } ` , {
182
- packageNames,
183
- error,
184
- } ) ;
185
-
186
- return { } ;
187
152
}
188
- } ) ;
153
+ ) ;
189
154
}
190
155
191
156
async resolve ( packageName : string , options ?: ResolveOptions ) : Promise < string | undefined > {
@@ -292,11 +257,6 @@ interface PackageManagerCommands {
292
257
packageName : string ,
293
258
options : PackageManagerOptions
294
259
) : Promise < string | undefined > ;
295
-
296
- resolveDependencyVersions (
297
- packageNames : string [ ] ,
298
- options : PackageManagerOptions
299
- ) : Promise < Record < string , string > > ;
300
260
}
301
261
302
262
class PNPMCommands implements PackageManagerCommands {
@@ -330,30 +290,6 @@ class PNPMCommands implements PackageManagerCommands {
330
290
}
331
291
}
332
292
333
- async resolveDependencyVersions (
334
- packageNames : string [ ] ,
335
- options : PackageManagerOptions
336
- ) : Promise < Record < string , string > > {
337
- const result = await this . #listDependencies( packageNames , options ) ;
338
-
339
- logger . debug ( `Resolving ${ packageNames . join ( " " ) } version using ${ this . name } ` ) ;
340
-
341
- const results : Record < string , string > = { } ;
342
-
343
- // Return the first dependency version that matches the package name
344
- for ( const dep of result ) {
345
- for ( const packageName of packageNames ) {
346
- const dependency = dep . dependencies ?. [ packageName ] ;
347
-
348
- if ( dependency ) {
349
- results [ packageName ] = dependency . version ;
350
- }
351
- }
352
- }
353
-
354
- return results ;
355
- }
356
-
357
293
async extractDirectDependenciesMeta ( options : PackageManagerOptions ) {
358
294
const result = await this . #listDirectDependencies( options ) ;
359
295
@@ -393,21 +329,6 @@ class PNPMCommands implements PackageManagerCommands {
393
329
394
330
return JSON . parse ( childProcess . stdout ) as PnpmList ;
395
331
}
396
-
397
- async #listDependencies( packageNames : string [ ] , options : PackageManagerOptions ) {
398
- const childProcess = await $ ( {
399
- cwd : options . cwd ,
400
- reject : false ,
401
- } ) `${ this . cmd } list ${ packageNames } -r --json` ;
402
-
403
- if ( childProcess . failed ) {
404
- logger . debug ( "Failed to list dependencies, using stdout anyway..." , {
405
- error : childProcess ,
406
- } ) ;
407
- }
408
-
409
- return JSON . parse ( childProcess . stdout ) as PnpmList ;
410
- }
411
332
}
412
333
413
334
type NpmDependency = {
@@ -446,27 +367,6 @@ class NPMCommands implements PackageManagerCommands {
446
367
return this . #recursivelySearchDependencies( output . dependencies , packageName ) ;
447
368
}
448
369
449
- async resolveDependencyVersions (
450
- packageNames : string [ ] ,
451
- options : PackageManagerOptions
452
- ) : Promise < Record < string , string > > {
453
- const output = await this . #listDependencies( packageNames , options ) ;
454
-
455
- logger . debug ( `Resolving ${ packageNames . join ( " " ) } version using ${ this . name } ` , { output } ) ;
456
-
457
- const results : Record < string , string > = { } ;
458
-
459
- for ( const packageName of packageNames ) {
460
- const version = this . #recursivelySearchDependencies( output . dependencies , packageName ) ;
461
-
462
- if ( version ) {
463
- results [ packageName ] = version ;
464
- }
465
- }
466
-
467
- return results ;
468
- }
469
-
470
370
async extractDirectDependenciesMeta (
471
371
options : PackageManagerOptions
472
372
) : Promise < Record < string , DependencyMeta > > {
@@ -492,21 +392,6 @@ class NPMCommands implements PackageManagerCommands {
492
392
return JSON . parse ( childProcess . stdout ) as NpmListOutput ;
493
393
}
494
394
495
- async #listDependencies( packageNames : string [ ] , options : PackageManagerOptions ) {
496
- const childProcess = await $ ( {
497
- cwd : options . cwd ,
498
- reject : false ,
499
- } ) `${ this . cmd } list ${ packageNames } --json` ;
500
-
501
- if ( childProcess . failed ) {
502
- logger . debug ( "Failed to list dependencies, using stdout anyway..." , {
503
- error : childProcess ,
504
- } ) ;
505
- }
506
-
507
- return JSON . parse ( childProcess . stdout ) as NpmListOutput ;
508
- }
509
-
510
395
#recursivelySearchDependencies(
511
396
dependencies : Record < string , NpmDependency > ,
512
397
packageName : string
@@ -575,31 +460,6 @@ class YarnCommands implements PackageManagerCommands {
575
460
}
576
461
}
577
462
578
- async resolveDependencyVersions (
579
- packageNames : string [ ] ,
580
- options : PackageManagerOptions
581
- ) : Promise < Record < string , string > > {
582
- const stdout = await this . #listDependencies( packageNames , options ) ;
583
-
584
- const lines = stdout . split ( "\n" ) ;
585
-
586
- logger . debug ( `Resolving ${ packageNames . join ( " " ) } version using ${ this . name } ` ) ;
587
-
588
- const results : Record < string , string > = { } ;
589
-
590
- for ( const line of lines ) {
591
- const json = JSON . parse ( line ) ;
592
-
593
- const packageName = this . #parseYarnValueIntoPackageName( json . value ) ;
594
-
595
- if ( packageNames . includes ( packageName ) ) {
596
- results [ packageName ] = json . children . Version ;
597
- }
598
- }
599
-
600
- return results ;
601
- }
602
-
603
463
async extractDirectDependenciesMeta ( options : PackageManagerOptions ) {
604
464
const result = await this . #listDirectDependencies( options ) ;
605
465
@@ -633,37 +493,10 @@ class YarnCommands implements PackageManagerCommands {
633
493
return childProcess . stdout ;
634
494
}
635
495
636
- async #listDependencies( packageNames : string [ ] , options : PackageManagerOptions ) {
637
- const childProcess = await $ ( {
638
- cwd : options . cwd ,
639
- reject : false ,
640
- } ) `${ this . cmd } info ${ packageNames } --json` ;
641
-
642
- if ( childProcess . failed ) {
643
- logger . debug ( "Failed to list dependencies, using stdout anyway..." , {
644
- error : childProcess ,
645
- } ) ;
646
- }
647
-
648
- return childProcess . stdout ;
649
- }
650
-
651
496
// The "value" when doing yarn info is formatted like this:
652
497
// "package-name@npm:version" or "package-name@workspace:version"
653
498
// This function will parse the value into just the package name.
654
499
// This correctly handles scoped packages as well e.g. @scope /package-name@npm:version
655
- #parseYarnValueIntoPackageName( value : string ) : string {
656
- const parts = value . split ( "@" ) ;
657
-
658
- // If the value does not contain an "@" symbol, then it's just the package name
659
- if ( parts . length === 3 ) {
660
- return parts [ 1 ] as string ;
661
- }
662
-
663
- // If the value contains an "@" symbol, then the package name is the first part
664
- return parts [ 0 ] as string ;
665
- }
666
-
667
500
#parseYarnValueIntoDependencyMeta( value : string ) : [ string , DependencyMeta ] {
668
501
const parts = value . split ( "@" ) ;
669
502
let name : string , protocol : string , version : string ;
0 commit comments