-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathderive-package-manager.ts
More file actions
80 lines (73 loc) · 2.43 KB
/
derive-package-manager.ts
File metadata and controls
80 lines (73 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { readFile } from 'node:fs/promises';
import path from 'node:path';
import { fileExists, logger } from '@code-pushup/utils';
import type { PackageManagerId } from '../config.js';
import { formatMetaLog } from '../format.js';
import { deriveYarnVersion } from './derive-yarn.js';
import { packageManagers } from './package-managers.js';
export async function derivePackageManagerInPackageJson(
currentDir = process.cwd(),
) {
if (await fileExists(path.join(currentDir, 'package.json'))) {
const content = JSON.parse(
(await readFile(path.join('package.json'))).toString(),
) as { packageManager?: string };
const { packageManager: packageManagerData = '' } = content;
const [manager = '', version = ''] = packageManagerData.split('@');
if (manager === 'npm') {
return manager;
}
if (manager === 'pnpm') {
return manager;
}
if (manager === 'yarn') {
const majorVersion = Number(version.split('.')[0]);
return majorVersion > 1 ? 'yarn-modern' : 'yarn-classic';
}
}
return false;
}
export async function derivePackageManager(
currentDir = process.cwd(),
): Promise<PackageManagerId> {
const pkgManagerFromPackageJson =
await derivePackageManagerInPackageJson(currentDir);
if (pkgManagerFromPackageJson) {
logDerivedPackageManager(
pkgManagerFromPackageJson,
'packageManager field in package.json',
);
return pkgManagerFromPackageJson;
}
// Check for lock files
if (await fileExists(path.join(currentDir, 'package-lock.json'))) {
logDerivedPackageManager('npm', 'existence of package-lock.json file');
return 'npm';
} else if (await fileExists(path.join(currentDir, 'pnpm-lock.yaml'))) {
logDerivedPackageManager('pnpm', 'existence of pnpm-lock.yaml file');
return 'pnpm';
} else if (await fileExists(path.join(currentDir, 'yarn.lock'))) {
const yarnVersion = await deriveYarnVersion();
if (yarnVersion) {
logDerivedPackageManager(
yarnVersion,
'existence of yarn.lock file and yarn -v command',
);
return yarnVersion;
}
}
throw new Error(
'Could not detect package manager. Please provide it in the js-packages plugin config.',
);
}
function logDerivedPackageManager(
id: PackageManagerId,
sourceDescription: string,
): void {
const pm = packageManagers[id];
logger.info(
formatMetaLog(
`Inferred ${pm.name} package manager from ${sourceDescription}`,
),
);
}