Skip to content

Commit 21c8b84

Browse files
committed
Better handle resolving dependencies when there are conflicts
1 parent b39f79f commit 21c8b84

File tree

3 files changed

+138
-9
lines changed

3 files changed

+138
-9
lines changed

packages/cli-v3/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
"dotenv": "^16.4.4",
9797
"esbuild": "^0.19.11",
9898
"evt": "^2.4.13",
99-
"execa": "^8.0.0",
99+
"execa": "^9.1.0",
100100
"find-up": "^7.0.0",
101101
"glob": "^10.3.10",
102102
"gradient-string": "^2.0.2",

packages/cli-v3/src/utilities/javascriptProject.ts

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { $ } from "execa";
1+
import { $, ExecaError } from "execa";
22
import { join } from "node:path";
33
import { readJSONFileSync } from "./fileSystem";
44
import { logger } from "./logger";
@@ -269,8 +269,7 @@ class PNPMCommands implements PackageManagerCommands {
269269
packageNames: string[],
270270
options: PackageManagerOptions
271271
): Promise<Record<string, string>> {
272-
const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageNames} -r --json`;
273-
const result = JSON.parse(stdout) as PnpmList;
272+
const result = await this.#listDependencies(packageNames, options);
274273

275274
logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`);
276275

@@ -289,6 +288,21 @@ class PNPMCommands implements PackageManagerCommands {
289288

290289
return results;
291290
}
291+
292+
async #listDependencies(packageNames: string[], options: PackageManagerOptions) {
293+
const childProcess = await $({
294+
cwd: options.cwd,
295+
reject: false,
296+
})`${this.cmd} list ${packageNames} -r --json`;
297+
298+
if (childProcess.failed) {
299+
logger.debug("Failed to list dependencies, using stdout anyway...", {
300+
error: childProcess.stderr,
301+
});
302+
}
303+
304+
return JSON.parse(childProcess.stdout) as PnpmList;
305+
}
292306
}
293307

294308
type NpmDependency = {
@@ -331,8 +345,7 @@ class NPMCommands implements PackageManagerCommands {
331345
packageNames: string[],
332346
options: PackageManagerOptions
333347
): Promise<Record<string, string>> {
334-
const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageNames} --json`;
335-
const output = JSON.parse(stdout) as NpmListOutput;
348+
const output = await this.#listDependencies(packageNames, options);
336349

337350
logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`, { output });
338351

@@ -349,6 +362,21 @@ class NPMCommands implements PackageManagerCommands {
349362
return results;
350363
}
351364

365+
async #listDependencies(packageNames: string[], options: PackageManagerOptions) {
366+
const childProcess = await $({
367+
cwd: options.cwd,
368+
reject: false,
369+
})`${this.cmd} list ${packageNames} --json`;
370+
371+
if (childProcess.failed) {
372+
logger.debug("Failed to list dependencies, using stdout anyway...", {
373+
error: childProcess.stderr,
374+
});
375+
}
376+
377+
return JSON.parse(childProcess.stdout) as NpmListOutput;
378+
}
379+
352380
#recursivelySearchDependencies(
353381
dependencies: Record<string, NpmDependency>,
354382
packageName: string
@@ -404,7 +432,7 @@ class YarnCommands implements PackageManagerCommands {
404432
packageNames: string[],
405433
options: PackageManagerOptions
406434
): Promise<Record<string, string>> {
407-
const { stdout } = await $({ cwd: options.cwd })`${this.cmd} info ${packageNames} --json`;
435+
const stdout = await this.#listDependencies(packageNames, options);
408436

409437
const lines = stdout.split("\n");
410438

@@ -425,6 +453,21 @@ class YarnCommands implements PackageManagerCommands {
425453
return results;
426454
}
427455

456+
async #listDependencies(packageNames: string[], options: PackageManagerOptions) {
457+
const childProcess = await $({
458+
cwd: options.cwd,
459+
reject: false,
460+
})`${this.cmd} info ${packageNames} --json`;
461+
462+
if (childProcess.failed) {
463+
logger.debug("Failed to list dependencies, using stdout anyway...", {
464+
error: childProcess.stderr,
465+
});
466+
}
467+
468+
return childProcess.stdout;
469+
}
470+
428471
// The "value" when doing yarn info is formatted like this:
429472
// "package-name@npm:version" or "package-name@workspace:version"
430473
// This function will parse the value into just the package name.

pnpm-lock.yaml

Lines changed: 88 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)