Skip to content

Commit 3412011

Browse files
authored
Merge pull request #25 from faissaloux/pnpm-support-all-versions
[pnpm] support all pnpm lockfile versions
2 parents 249d7c9 + f679417 commit 3412011

File tree

13 files changed

+81
-9
lines changed

13 files changed

+81
-9
lines changed

src/interfaces/lock_parser.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export interface LockParser {
22
dependencies(): {[key: string]: any}
3+
lockVersion(): number | null
34
}

src/package_manager/package_managers/javascript.ts

+37-5
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,31 @@ type JavascriptDependenciesLockFile = 'package-lock.json' | 'yarn.lock' | 'pnpm-
99

1010
export class Javascript extends LanguagePackageManager implements PackageManager {
1111
packageManager: JavascriptPackageManager = 'npm';
12+
lockVersion: number | null = null;
1213
locks: {[key in JavascriptPackageManager]: JavascriptDependenciesLockFile} = {
1314
'npm': 'package-lock.json',
1415
'yarn': 'yarn.lock',
1516
'pnpm': 'pnpm-lock.yaml',
1617
'bun': 'bun.lock',
1718
};
18-
startsWith: {[key in JavascriptPackageManager]: string} = {
19+
startsWith: {[key: string]: string | {[version: string | number]: string}} = {
1920
'npm': 'packageName',
2021
'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+
},
2229
'bun': 'packageName',
2330
};
2431

2532
async getInstalled(packageName: string): Promise<any> {
2633
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'];
2937

3038
if (!vscode.workspace.getConfiguration().get(`package-manager-intellisense.${this.packageManager}.enable`)) {
3139
return null;
@@ -53,6 +61,30 @@ export class Javascript extends LanguagePackageManager implements PackageManager
5361
}
5462

5563
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);
5789
}
5890
}

src/package_manager/package_managers/php.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { LanguagePackageManager } from '../language_package_manager';
66

77
export class Php extends LanguagePackageManager implements PackageManager {
88
async getInstalled(packageName: string): Promise<any> {
9-
const installedPackages = new Parser("composer").parse(await this.lockFileContent());
9+
const installedPackages = new Parser("composer").parse(await this.lockFileContent())['dependencies'];
1010

1111
return installedPackages.find((pkg: types.ComposerInstalledPackage) => pkg.name === packageName);
1212
}

src/package_manager/package_managers/ruby.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { LanguagePackageManager } from '../language_package_manager';
55

66
export class Ruby extends LanguagePackageManager implements PackageManager {
77
async getInstalled(packageName: string): Promise<{[key: string]: string}| undefined> {
8-
const installedPackages = new Parser("rubygems").parse(await this.lockFileContent());
8+
const installedPackages = new Parser("rubygems").parse(await this.lockFileContent())['dependencies'];
99

1010
const packageFound = Object.keys(installedPackages.GEM.specs).find((pkg: string) => pkg.startsWith(packageName));
1111

src/parser/BunLock.ts

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ export class BunLock implements LockParser {
1515
return this.content.packages;
1616
}
1717

18+
lockVersion(): null {
19+
return null;
20+
}
21+
1822
removeTrailingCommas(content: string): string {
1923
const regex = /\,(?!\s*?[\{\[\"\'\w])/g;
2024

src/parser/composerLock.ts

+4
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ export class ComposerLock implements LockParser {
1212
dependencies(): {[key: string]: any} {
1313
return this.content.packages;
1414
}
15+
16+
lockVersion(): null {
17+
return null;
18+
}
1519
}

src/parser/gemfileLock.ts

+4
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@ export class GemfileLock implements LockParser {
1313
dependencies(): {[key: string]: any} {
1414
return this.content;
1515
}
16+
17+
lockVersion(): null {
18+
return null;
19+
}
1620
}

src/parser/npmLock.ts

+4
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ export class NpmLock implements LockParser {
2020

2121
return new NpmLockV2(this.content).dependencies();
2222
}
23+
24+
lockVersion(): number {
25+
return this.lockfileVersion;
26+
}
2327
}

src/parser/npmLockV2.ts

+4
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ export class NpmLockV2 implements LockParser {
88
dependencies(): {[key: string]: any} {
99
return this.content.dependencies;
1010
}
11+
12+
lockVersion(): number {
13+
return 2;
14+
}
1115
}

src/parser/npmLockV3.ts

+4
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ export class NpmLockV3 implements LockParser {
1414

1515
return dependencies;
1616
}
17+
18+
lockVersion(): number {
19+
return 3;
20+
}
1721
}

src/parser/parser.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@ export class Parser {
1919
return this;
2020
}
2121

22-
parse(content: string): {[key: string]: any} {
22+
parse(content: string): {'lockVersion': number | null, 'dependencies': any} {
2323
// @ts-ignore
24-
return new this.parsers[this.packageManager](content).dependencies();
24+
const lockParser = new this.parsers[this.packageManager](content);
25+
26+
return {
27+
'lockVersion': lockParser.lockVersion(),
28+
'dependencies': lockParser.dependencies(),
29+
};
2530
}
2631
}

src/parser/pnpmLock.ts

+6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { LockParser } from '../interfaces/lock_parser';
33

44
export class PnpmLock implements LockParser {
55
private content: {[key: string]: any};
6+
private lockfileVersion: number;
67

78
constructor(content: string) {
89
// @ts-ignore
910
this.content = jsYaml.load(content);
11+
this.lockfileVersion = this.content.lockfileVersion;
1012
this.appendVersions();
1113

1214
return this;
@@ -16,6 +18,10 @@ export class PnpmLock implements LockParser {
1618
return this.content.packages;
1719
}
1820

21+
lockVersion(): number {
22+
return this.lockfileVersion;
23+
}
24+
1925
appendVersions(): void {
2026
Object.keys(this.content.packages).map(pkg => {
2127
let version = pkg.match(/\d+(\.\d+)+/);

src/parser/yarnLock.ts

+4
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@ export class YarnLock implements LockParser {
1313
dependencies(): {[key: string]: any} {
1414
return this.content.object;
1515
}
16+
17+
lockVersion(): null {
18+
return null;
19+
}
1620
}

0 commit comments

Comments
 (0)