@@ -9,23 +9,31 @@ type JavascriptDependenciesLockFile = 'package-lock.json' | 'yarn.lock' | 'pnpm-
9
9
10
10
export class Javascript extends LanguagePackageManager implements PackageManager {
11
11
packageManager : JavascriptPackageManager = 'npm' ;
12
+ lockVersion : number | null = null ;
12
13
locks : { [ key in JavascriptPackageManager ] : JavascriptDependenciesLockFile } = {
13
14
'npm' : 'package-lock.json' ,
14
15
'yarn' : 'yarn.lock' ,
15
16
'pnpm' : 'pnpm-lock.yaml' ,
16
17
'bun' : 'bun.lock' ,
17
18
} ;
18
- startsWith : { [ key in JavascriptPackageManager ] : string } = {
19
+ startsWith : { [ key : string ] : string | { [ version : string | number ] : string } } = {
19
20
'npm' : 'packageName' ,
20
21
'yarn' : 'packageName@' ,
21
- 'pnpm' : '/packageName/' ,
22
+ 'pnpm' : {
23
+ /* eslint-disable @typescript-eslint/naming-convention */
24
+ '5.3' : '/packageName/' ,
25
+ '6' : '/packageName@' ,
26
+ '9' : 'packageName@' ,
27
+ /* eslint-enable */
28
+ } ,
22
29
'bun' : 'packageName' ,
23
30
} ;
24
31
25
32
async getInstalled ( packageName : string ) : Promise < any > {
26
33
this . packageManager = await this . getPackageManager ( ) ;
27
-
28
- const installedPackages = new Parser ( this . packageManager ) . parse ( await this . lockFileContent ( ) ) ;
34
+ const lockFileParsed = new Parser ( this . packageManager ) . parse ( await this . lockFileContent ( ) ) ;
35
+ const installedPackages = lockFileParsed [ 'dependencies' ] ;
36
+ this . lockVersion = lockFileParsed [ 'lockVersion' ] ;
29
37
30
38
if ( ! vscode . workspace . getConfiguration ( ) . get ( `package-manager-intellisense.${ this . packageManager } .enable` ) ) {
31
39
return null ;
@@ -53,6 +61,30 @@ export class Javascript extends LanguagePackageManager implements PackageManager
53
61
}
54
62
55
63
lockPackageStartsWith ( packageName : string ) : string {
56
- return this . startsWith [ this . packageManager ] . replace ( 'packageName' , packageName ) ;
64
+ const pattern = this . startsWith [ this . packageManager ] ;
65
+
66
+ if ( typeof pattern === 'object' && this . lockVersion ) {
67
+ const lockVersion = Number ( this . lockVersion ) ;
68
+
69
+ if ( pattern [ lockVersion ] ) {
70
+ return pattern [ lockVersion ] . replace ( 'packageName' , packageName ) ;
71
+ }
72
+
73
+ let lastVersion = Object . keys ( pattern ) . sort ( ) . at ( 0 ) ;
74
+
75
+ if ( lastVersion !== undefined ) {
76
+ for ( const version of Object . keys ( pattern ) . sort ( ) ) {
77
+ if ( Number ( version ) > lockVersion ) {
78
+ return pattern [ lastVersion ] . replace ( 'packageName' , packageName ) ;
79
+ }
80
+
81
+ lastVersion = version ;
82
+ }
83
+
84
+ return pattern [ lastVersion ] . replace ( 'packageName' , packageName ) ;
85
+ }
86
+ }
87
+
88
+ return ( pattern as string ) . replace ( 'packageName' , packageName ) ;
57
89
}
58
90
}
0 commit comments