Skip to content

Commit e43f976

Browse files
authored
Merge pull request #21 from faissaloux/settings
Allow user to enable/disable package managers
2 parents 6b065bf + 4877b20 commit e43f976

File tree

6 files changed

+71
-14
lines changed

6 files changed

+71
-14
lines changed

package.json

+34
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,39 @@
7575
"@faissaloux/gemfile": "^0.3.0",
7676
"@yarnpkg/lockfile": "^1.1.0",
7777
"js-yaml": "^4.1.0"
78+
},
79+
"contributes": {
80+
"configuration": [
81+
{
82+
"title": "package-manager-intellisense",
83+
"properties": {
84+
"package-manager-intellisense.npm.enable": {
85+
"type": "boolean",
86+
"default": true,
87+
"description": "Enable npm package manager."
88+
},
89+
"package-manager-intellisense.yarn.enable": {
90+
"type": "boolean",
91+
"default": true,
92+
"description": "Enable yarn package manager."
93+
},
94+
"package-manager-intellisense.pnpm.enable": {
95+
"type": "boolean",
96+
"default": true,
97+
"description": "Enable pnpm package manager."
98+
},
99+
"package-manager-intellisense.composer.enable": {
100+
"type": "boolean",
101+
"default": true,
102+
"description": "Enable composer package manager."
103+
},
104+
"package-manager-intellisense.bundler.enable": {
105+
"type": "boolean",
106+
"default": true,
107+
"description": "Enable bundler package manager."
108+
}
109+
}
110+
}
111+
]
78112
}
79113
}

src/decorator/decorator.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ export class Decorator {
5757
version = `v${installedPackage?.version.replace('v', '')}`;
5858
}
5959

60-
decorations.push(this.decoration(version, line));
60+
if (installedPackage !== null) {
61+
decorations.push(this.decoration(version, line));
62+
}
6163
}
6264
}
6365

src/extension.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
import * as vscode from 'vscode';
22
import * as globals from './util/globals';
33
import { Decorator } from './decorator/decorator';
4-
import { PackageManager } from './package_manager/package_manager';
4+
import { DependenciesFile, PackageManager } from './package_manager/package_manager';
55

66
function supportedOpenEditors(): vscode.TextEditor[] {
7+
const packagesFiles: DependenciesFile[] = ['package.json'];
8+
9+
if (vscode.workspace.getConfiguration().get('package-manager-intellisense.composer.enable')) {
10+
packagesFiles.push('composer.json');
11+
}
12+
13+
if (vscode.workspace.getConfiguration().get('package-manager-intellisense.bundler.enable')) {
14+
packagesFiles.push('Gemfile');
15+
}
16+
717
return vscode.window.visibleTextEditors.filter(
8-
editor => editor.document.fileName.endsWith('package.json')
9-
|| editor.document.fileName.endsWith('composer.json')
10-
|| editor.document.fileName.endsWith('Gemfile')
18+
editor => globals.endsWithAny(packagesFiles, editor.document.fileName)
1119
);
1220
}
1321

src/package_manager/package_manager.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@ import { Javascript } from './package_managers/javascript';
33
import { Php } from './package_managers/php';
44
import { Ruby } from './package_managers/ruby';
55
import path = require('path');
6+
import { LanguagePackageManager } from './language_package_manager';
7+
8+
type Language = 'php' | 'javascript' | 'ruby';
9+
export type DependenciesFile = 'composer.json' | 'package.json' | 'Gemfile';
610

711
export class PackageManager {
812
private editorFileName: string;
913
private packageManager: string = '';
10-
private languagesPackagesFiles: {[key: string]: string} = {
14+
private languagesPackagesFiles: {[key in Language]: DependenciesFile} = {
1115
'php': 'composer.json',
1216
'javascript': 'package.json',
1317
'ruby': 'Gemfile',
1418
};
15-
private packageManagers = {
19+
private packageManagers: {[key in Language]: typeof LanguagePackageManager} = {
1620
'php': Php,
1721
'javascript': Javascript,
1822
'ruby': Ruby,

src/package_manager/package_managers/javascript.ts

+14-7
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ import { PackageManager } from '../../interfaces/package_manager';
44
import { LanguagePackageManager } from '../language_package_manager';
55
import { pathJoin } from '../../util/globals';
66

7+
type JavascriptPackageManager = 'npm' | 'yarn' | 'pnpm';
8+
type JavascriptDependenciesLockFile = 'package-lock.json' | 'yarn.lock' | 'pnpm-lock.yaml';
9+
710
export class Javascript extends LanguagePackageManager implements PackageManager {
8-
packageManager: string = 'npm';
9-
locks: {[key: string]: string} = {
11+
packageManager: JavascriptPackageManager = 'npm';
12+
locks: {[key in JavascriptPackageManager]: JavascriptDependenciesLockFile} = {
1013
'npm': 'package-lock.json',
1114
'yarn': 'yarn.lock',
1215
'pnpm': 'pnpm-lock.yaml',
1316
};
14-
startsWith: {[key: string]: string} = {
17+
startsWith: {[key in JavascriptPackageManager]: string} = {
1518
'npm': 'packageName',
1619
'yarn': 'packageName@',
1720
'pnpm': '/packageName/',
@@ -21,6 +24,10 @@ export class Javascript extends LanguagePackageManager implements PackageManager
2124
this.packageManager = await this.getPackageManager();
2225
const installedPackages = new Parser(this.packageManager).parse(await this.lockFileContent());
2326

27+
if (!vscode.workspace.getConfiguration().get(`package-manager-intellisense.${this.packageManager}.enable`)) {
28+
return null;
29+
}
30+
2431
if (this.packageManager === 'pnpm') {
2532
this.appendVersion(installedPackages);
2633
}
@@ -32,18 +39,18 @@ export class Javascript extends LanguagePackageManager implements PackageManager
3239
return pathJoin(this.rootPath, this.locks[this.packageManager]);
3340
}
3441

35-
async getPackageManager(): Promise<string> {
42+
async getPackageManager(): Promise<JavascriptPackageManager> {
3643
for (const lock in this.locks) {
37-
let lockFile = vscode.Uri.file(pathJoin(this.rootPath, this.locks[lock]));
44+
let lockFile = vscode.Uri.file(pathJoin(this.rootPath, this.locks[lock as JavascriptPackageManager]));
3845

3946
try{
4047
await vscode.workspace.fs.readFile(lockFile);
4148

42-
return lock;
49+
return lock as JavascriptPackageManager;
4350
} catch (error) {}
4451
}
4552

46-
return Object.keys(this.locks)[0];
53+
return (Object.keys(this.locks) as JavascriptPackageManager[])[0];
4754
}
4855

4956
lockPackageStartsWith(packageName: string): string {

src/util/globals.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ export const decorationType = vscode.window.createTextEditorDecorationType({
66
});
77

88
export const pathJoin = (...parts: string[]): string => parts.join(path.sep);
9+
10+
export const endsWithAny = (options: string[], string: string): boolean => options.some((option: string) => string.endsWith(option));

0 commit comments

Comments
 (0)