Skip to content

Commit 9ce8943

Browse files
committed
refactor(plugin-js-packages): extract silent package manager detection
1 parent 4addd10 commit 9ce8943

2 files changed

Lines changed: 40 additions & 34 deletions

File tree

packages/plugin-js-packages/src/lib/binding.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@ import {
1212
fileExists,
1313
singleQuote,
1414
} from '@code-pushup/utils';
15-
import type { PackageManagerId } from './config.js';
1615
import {
1716
DEFAULT_CHECKS,
1817
DEFAULT_DEPENDENCY_GROUPS,
1918
JS_PACKAGES_PLUGIN_SLUG,
2019
JS_PACKAGES_PLUGIN_TITLE,
2120
} from './constants.js';
22-
import { derivePackageManager } from './package-managers/derive-package-manager.js';
21+
import { detectPackageManager } from './package-managers/derive-package-manager.js';
2322

2423
const { name: PACKAGE_NAME } = createRequire(import.meta.url)(
2524
'../../package.json',
@@ -73,7 +72,9 @@ export const jsPackagesSetupBinding = {
7372
packageName: PACKAGE_NAME,
7473
isRecommended,
7574
prompts: async (targetDir: string) => {
76-
const packageManager = await detectPackageManager(targetDir);
75+
const packageManager = await detectPackageManager(targetDir).catch(
76+
() => DEFAULT_PACKAGE_MANAGER,
77+
);
7778
return [
7879
{
7980
key: 'js-packages.packageManager',
@@ -175,13 +176,3 @@ function createCategories({
175176
async function isRecommended(targetDir: string): Promise<boolean> {
176177
return fileExists(path.join(targetDir, 'package.json'));
177178
}
178-
179-
async function detectPackageManager(
180-
targetDir: string,
181-
): Promise<PackageManagerId> {
182-
try {
183-
return await derivePackageManager(targetDir);
184-
} catch {
185-
return DEFAULT_PACKAGE_MANAGER;
186-
}
187-
}

packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.ts

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,41 @@ export async function derivePackageManagerInPackageJson(
3131
return false;
3232
}
3333

34-
export async function derivePackageManager(
35-
currentDir = process.cwd(),
36-
): Promise<PackageManagerId> {
34+
type DetectionResult = {
35+
id: PackageManagerId;
36+
sourceDescription: string;
37+
};
38+
39+
async function resolvePackageManager(
40+
currentDir: string,
41+
): Promise<DetectionResult> {
3742
const pkgManagerFromPackageJson =
3843
await derivePackageManagerInPackageJson(currentDir);
3944
if (pkgManagerFromPackageJson) {
40-
logDerivedPackageManager(
41-
pkgManagerFromPackageJson,
42-
'packageManager field in package.json',
43-
);
44-
return pkgManagerFromPackageJson;
45+
return {
46+
id: pkgManagerFromPackageJson,
47+
sourceDescription: 'packageManager field in package.json',
48+
};
4549
}
4650

4751
// Check for lock files
4852
if (await fileExists(path.join(currentDir, 'package-lock.json'))) {
49-
logDerivedPackageManager('npm', 'existence of package-lock.json file');
50-
return 'npm';
53+
return {
54+
id: 'npm',
55+
sourceDescription: 'existence of package-lock.json file',
56+
};
5157
} else if (await fileExists(path.join(currentDir, 'pnpm-lock.yaml'))) {
52-
logDerivedPackageManager('pnpm', 'existence of pnpm-lock.yaml file');
53-
return 'pnpm';
58+
return {
59+
id: 'pnpm',
60+
sourceDescription: 'existence of pnpm-lock.yaml file',
61+
};
5462
} else if (await fileExists(path.join(currentDir, 'yarn.lock'))) {
5563
const yarnVersion = await deriveYarnVersion();
5664
if (yarnVersion) {
57-
logDerivedPackageManager(
58-
yarnVersion,
59-
'existence of yarn.lock file and yarn -v command',
60-
);
61-
return yarnVersion;
65+
return {
66+
id: yarnVersion,
67+
sourceDescription: 'existence of yarn.lock file and yarn -v command',
68+
};
6269
}
6370
}
6471

@@ -67,14 +74,22 @@ export async function derivePackageManager(
6774
);
6875
}
6976

70-
function logDerivedPackageManager(
71-
id: PackageManagerId,
72-
sourceDescription: string,
73-
): void {
77+
export async function detectPackageManager(
78+
currentDir = process.cwd(),
79+
): Promise<PackageManagerId> {
80+
const { id } = await resolvePackageManager(currentDir);
81+
return id;
82+
}
83+
84+
export async function derivePackageManager(
85+
currentDir = process.cwd(),
86+
): Promise<PackageManagerId> {
87+
const { id, sourceDescription } = await resolvePackageManager(currentDir);
7488
const pm = packageManagers[id];
7589
logger.info(
7690
formatMetaLog(
7791
`Inferred ${pm.name} package manager from ${sourceDescription}`,
7892
),
7993
);
94+
return id;
8095
}

0 commit comments

Comments
 (0)