Better handle resolving dependencies when there are conflicts

This commit is contained in:
Eric Allam
2024-05-15 13:25:56 +01:00
parent b39f79f0ab
commit 21c8b847e5
3 changed files with 138 additions and 9 deletions
+1 -1
View File
@@ -96,7 +96,7 @@
"dotenv": "^16.4.4",
"esbuild": "^0.19.11",
"evt": "^2.4.13",
"execa": "^8.0.0",
"execa": "^9.1.0",
"find-up": "^7.0.0",
"glob": "^10.3.10",
"gradient-string": "^2.0.2",
@@ -1,4 +1,4 @@
import { $ } from "execa";
import { $, ExecaError } from "execa";
import { join } from "node:path";
import { readJSONFileSync } from "./fileSystem";
import { logger } from "./logger";
@@ -269,8 +269,7 @@ class PNPMCommands implements PackageManagerCommands {
packageNames: string[],
options: PackageManagerOptions
): Promise<Record<string, string>> {
const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageNames} -r --json`;
const result = JSON.parse(stdout) as PnpmList;
const result = await this.#listDependencies(packageNames, options);
logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`);
@@ -289,6 +288,21 @@ class PNPMCommands implements PackageManagerCommands {
return results;
}
async #listDependencies(packageNames: string[], options: PackageManagerOptions) {
const childProcess = await $({
cwd: options.cwd,
reject: false,
})`${this.cmd} list ${packageNames} -r --json`;
if (childProcess.failed) {
logger.debug("Failed to list dependencies, using stdout anyway...", {
error: childProcess.stderr,
});
}
return JSON.parse(childProcess.stdout) as PnpmList;
}
}
type NpmDependency = {
@@ -331,8 +345,7 @@ class NPMCommands implements PackageManagerCommands {
packageNames: string[],
options: PackageManagerOptions
): Promise<Record<string, string>> {
const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageNames} --json`;
const output = JSON.parse(stdout) as NpmListOutput;
const output = await this.#listDependencies(packageNames, options);
logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`, { output });
@@ -349,6 +362,21 @@ class NPMCommands implements PackageManagerCommands {
return results;
}
async #listDependencies(packageNames: string[], options: PackageManagerOptions) {
const childProcess = await $({
cwd: options.cwd,
reject: false,
})`${this.cmd} list ${packageNames} --json`;
if (childProcess.failed) {
logger.debug("Failed to list dependencies, using stdout anyway...", {
error: childProcess.stderr,
});
}
return JSON.parse(childProcess.stdout) as NpmListOutput;
}
#recursivelySearchDependencies(
dependencies: Record<string, NpmDependency>,
packageName: string
@@ -404,7 +432,7 @@ class YarnCommands implements PackageManagerCommands {
packageNames: string[],
options: PackageManagerOptions
): Promise<Record<string, string>> {
const { stdout } = await $({ cwd: options.cwd })`${this.cmd} info ${packageNames} --json`;
const stdout = await this.#listDependencies(packageNames, options);
const lines = stdout.split("\n");
@@ -425,6 +453,21 @@ class YarnCommands implements PackageManagerCommands {
return results;
}
async #listDependencies(packageNames: string[], options: PackageManagerOptions) {
const childProcess = await $({
cwd: options.cwd,
reject: false,
})`${this.cmd} info ${packageNames} --json`;
if (childProcess.failed) {
logger.debug("Failed to list dependencies, using stdout anyway...", {
error: childProcess.stderr,
});
}
return childProcess.stdout;
}
// The "value" when doing yarn info is formatted like this:
// "package-name@npm:version" or "package-name@workspace:version"
// This function will parse the value into just the package name.
+88 -2
View File
@@ -1559,8 +1559,8 @@ importers:
specifier: ^2.4.13
version: 2.4.13
execa:
specifier: ^8.0.0
version: 8.0.1
specifier: ^9.1.0
version: 9.1.0
find-up:
specifier: ^7.0.0
version: 7.0.0
@@ -13748,6 +13748,10 @@ packages:
/@rushstack/eslint-patch@1.2.0:
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
/@sec-ant/readable-stream@0.4.1:
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
dev: false
/@selderee/plugin-htmlparser2@0.10.0:
resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==}
dependencies:
@@ -13869,6 +13873,11 @@ packages:
engines: {node: '>=14.16'}
dev: false
/@sindresorhus/merge-streams@4.0.0:
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
dev: false
/@sindresorhus/slugify@2.2.1:
resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==}
engines: {node: '>=12'}
@@ -21759,6 +21768,24 @@ packages:
signal-exit: 4.1.0
strip-final-newline: 3.0.0
/execa@9.1.0:
resolution: {integrity: sha512-lSgHc4Elo2m6bUDhc3Hl/VxvUDJdQWI40RZ4KMY9bKRc+hgMOT7II/JjbNDhI8VnMtrCb7U/fhpJIkLORZozWw==}
engines: {node: '>=18'}
dependencies:
'@sindresorhus/merge-streams': 4.0.0
cross-spawn: 7.0.3
figures: 6.1.0
get-stream: 9.0.1
human-signals: 7.0.0
is-plain-obj: 4.1.0
is-stream: 4.0.1
npm-run-path: 5.3.0
pretty-ms: 9.0.0
signal-exit: 4.1.0
strip-final-newline: 4.0.0
yoctocolors: 2.0.0
dev: false
/exit-hook@2.2.1:
resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==}
engines: {node: '>=6'}
@@ -22116,6 +22143,13 @@ packages:
is-unicode-supported: 1.3.0
dev: false
/figures@6.1.0:
resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
engines: {node: '>=18'}
dependencies:
is-unicode-supported: 2.0.0
dev: false
/file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -22590,6 +22624,14 @@ packages:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
/get-stream@9.0.1:
resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
engines: {node: '>=18'}
dependencies:
'@sec-ant/readable-stream': 0.4.1
is-stream: 4.0.1
dev: false
/get-symbol-description@1.0.0:
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
engines: {node: '>= 0.4'}
@@ -23391,6 +23433,11 @@ packages:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
/human-signals@7.0.0:
resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==}
engines: {node: '>=18.18.0'}
dev: false
/humanize-duration@3.27.3:
resolution: {integrity: sha512-iimHkHPfIAQ8zCDQLgn08pRqSVioyWvnGfaQ8gond2wf7Jq2jJ+24ykmnRyiz3fIldcn4oUuQXpjqKLhSVR7lw==}
dev: false
@@ -24092,6 +24139,11 @@ packages:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
/is-stream@4.0.1:
resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
engines: {node: '>=18'}
dev: false
/is-string@1.0.7:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
engines: {node: '>= 0.4'}
@@ -24133,6 +24185,11 @@ packages:
resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
engines: {node: '>=12'}
/is-unicode-supported@2.0.0:
resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==}
engines: {node: '>=18'}
dev: false
/is-upper-case@2.0.2:
resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==}
dependencies:
@@ -27475,6 +27532,13 @@ packages:
dependencies:
path-key: 4.0.0
/npm-run-path@5.3.0:
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
path-key: 4.0.0
dev: false
/npmlog@6.0.2:
resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -28182,6 +28246,11 @@ packages:
engines: {node: '>=6'}
dev: true
/parse-ms@4.0.0:
resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
engines: {node: '>=18'}
dev: false
/parse5-htmlparser2-tree-adapter@6.0.1:
resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
dependencies:
@@ -29219,6 +29288,13 @@ packages:
parse-ms: 2.1.0
dev: true
/pretty-ms@9.0.0:
resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==}
engines: {node: '>=18'}
dependencies:
parse-ms: 4.0.0
dev: false
/pretty@2.0.0:
resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==}
engines: {node: '>=0.10.0'}
@@ -32005,6 +32081,11 @@ packages:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
/strip-final-newline@4.0.0:
resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
engines: {node: '>=18'}
dev: false
/strip-indent@3.0.0:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
@@ -35606,6 +35687,11 @@ packages:
resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
engines: {node: '>=12.20'}
/yoctocolors@2.0.0:
resolution: {integrity: sha512-esbDnt0Z1zI1KgvOZU90hJbL6BkoUbrP9yy7ArNZ6TmxBxydMJTYMf9FZjmwwcA8ZgEQzriQ3hwZ0NYXhlFo8Q==}
engines: {node: '>=18'}
dev: false
/yoga-wasm-web@0.3.3:
resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==}
dev: false