81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import findWorkspaceRoot = require('../node_modules/find-yarn-workspace-root');
|
|
import findUp = require('find-up');
|
|
import * as path from 'path';
|
|
import whichPM = require('which-pm');
|
|
import { Uri, workspace } from 'vscode';
|
|
|
|
async function pathExists(filePath: string) {
|
|
try {
|
|
await workspace.fs.stat(Uri.file(filePath));
|
|
} catch {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
async function isPNPMPreferred(pkgPath: string) {
|
|
if (await pathExists(path.join(pkgPath, 'pnpm-lock.yaml'))) {
|
|
return true;
|
|
}
|
|
if (await pathExists(path.join(pkgPath, 'shrinkwrap.yaml'))) {
|
|
return true;
|
|
}
|
|
if (await findUp('pnpm-lock.yaml', { cwd: pkgPath })) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
async function isYarnPreferred(pkgPath: string) {
|
|
if (await pathExists(path.join(pkgPath, 'yarn.lock'))) {
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
if (typeof findWorkspaceRoot(pkgPath) === 'string') {
|
|
return true;
|
|
}
|
|
} catch (err) { }
|
|
|
|
return false;
|
|
}
|
|
|
|
const isNPMPreferred = (pkgPath: string) => {
|
|
return pathExists(path.join(pkgPath, 'package-lock.json'));
|
|
};
|
|
|
|
export async function findPreferredPM(pkgPath: string): Promise<{ name: string, multiplePMDetected: boolean }> {
|
|
const detectedPackageManagers: string[] = [];
|
|
|
|
if (await isNPMPreferred(pkgPath)) {
|
|
detectedPackageManagers.push('npm');
|
|
}
|
|
|
|
if (await isYarnPreferred(pkgPath)) {
|
|
detectedPackageManagers.push('yarn');
|
|
}
|
|
|
|
if (await isPNPMPreferred(pkgPath)) {
|
|
detectedPackageManagers.push('pnpm');
|
|
}
|
|
|
|
const pmUsedForInstallation: { name: string } | null = await whichPM(pkgPath);
|
|
|
|
if (pmUsedForInstallation && !detectedPackageManagers.includes(pmUsedForInstallation.name)) {
|
|
detectedPackageManagers.push(pmUsedForInstallation.name);
|
|
}
|
|
|
|
const multiplePMDetected = detectedPackageManagers.length > 1;
|
|
|
|
return {
|
|
name: detectedPackageManagers[0] || 'npm',
|
|
multiplePMDetected
|
|
};
|
|
}
|