Add rushx support too

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
James McMeeking 2026-05-01 17:04:28 +01:00
parent 5cf2ffe201
commit 98a1ba7d10
No known key found for this signature in database
GPG key ID: C69A11061EE15228
16 changed files with 101 additions and 27 deletions

View file

@ -14,6 +14,7 @@ import { createUvPackageManager } from "./uv/createUvPackageManager.js";
import { createPoetryPackageManager } from "./poetry/createPoetryPackageManager.js";
import { createPipXPackageManager } from "./pipx/createPipXPackageManager.js";
import { createRushPackageManager } from "./rush/createRushPackageManager.js";
import { createRushxPackageManager } from "./rushx/createRushxPackageManager.js";
import { createUvxPackageManager } from "./uvx/createUvxPackageManager.js";
/**
@ -70,6 +71,8 @@ export function initializePackageManager(packageManagerName, context) {
state.packageManagerName = createPipXPackageManager();
} else if (packageManagerName === "rush") {
state.packageManagerName = createRushPackageManager();
} else if (packageManagerName === "rushx") {
state.packageManagerName = createRushxPackageManager();
} else {
throw new Error("Unsupported package manager: " + packageManagerName);
}

View file

@ -6,7 +6,7 @@ import { resolvePackageVersion } from "../../api/npmApi.js";
*/
export function createRushPackageManager() {
return {
runCommand: runRushCommand,
runCommand: (args) => runRushCommand("rush", args),
// We pre-scan rush add commands and rely on MITM for install/update flows.
isSupportedCommand: (args) => getRushCommand(args) === "add",
getDependencyUpdatesForCommand: scanRushAddCommand,

View file

@ -3,23 +3,24 @@ import { safeSpawn } from "../../utils/safeSpawn.js";
import { reportCommandExecutionFailure } from "../_shared/commandErrors.js";
/**
* @param {"rush" | "rushx"} executableName
* @param {string[]} args
* @returns {Promise<{status: number}>}
*/
export async function runRushCommand(args) {
export async function runRushCommand(executableName, args) {
try {
const env = normalizeProxyEnvironmentVariables(
mergeSafeChainProxyEnvironmentVariables(process.env),
);
const result = await safeSpawn("rush", args, {
const result = await safeSpawn(executableName, args, {
stdio: "inherit",
env,
});
return { status: result.status };
} catch (/** @type any */ error) {
return reportCommandExecutionFailure(error, "rush");
return reportCommandExecutionFailure(error, executableName);
}
}

View file

@ -64,7 +64,7 @@ describe("runRushCommand", () => {
});
it("spawns rush with merged proxy env", async () => {
const res = await runRushCommand(["install"]);
const res = await runRushCommand("rush", ["install"]);
assert.strictEqual(res.status, 0);
assert.strictEqual(safeSpawnMock.mock.calls.length, 1);
@ -88,7 +88,7 @@ describe("runRushCommand", () => {
it("returns spawn result status", async () => {
nextSpawnStatus = 7;
const res = await runRushCommand(["update"]);
const res = await runRushCommand("rush", ["update"]);
assert.strictEqual(res.status, 7);
});
@ -98,7 +98,7 @@ describe("runRushCommand", () => {
code: "ENOENT",
});
const res = await runRushCommand(["install"]);
const res = await runRushCommand("rush", ["install"]);
assert.strictEqual(res.status, 1);
});
@ -108,7 +108,7 @@ describe("runRushCommand", () => {
HTTPS_PROXY: "http://localhost:8080",
};
await runRushCommand(["install"]);
await runRushCommand("rush", ["install"]);
assert.deepStrictEqual(mergeResultEnv, {
HTTPS_PROXY: "http://localhost:8080",

View file

@ -0,0 +1,18 @@
import { runRushCommand } from "../rush/runRushCommand.js";
/**
* @returns {import("../currentPackageManager.js").PackageManager}
*/
export function createRushxPackageManager() {
return {
/**
* @param {string[]} args
*/
runCommand: (args) => {
return runRushCommand("rushx", args);
},
// For rushx, rely solely on MITM.
isSupportedCommand: () => false,
getDependencyUpdatesForCommand: () => [],
};
}

View file

@ -0,0 +1,14 @@
import { test } from "node:test";
import assert from "node:assert";
import { createRushxPackageManager } from "./createRushxPackageManager.js";
test("createRushxPackageManager returns valid package manager interface", () => {
const pm = createRushxPackageManager();
assert.ok(pm);
assert.strictEqual(typeof pm.runCommand, "function");
assert.strictEqual(typeof pm.isSupportedCommand, "function");
assert.strictEqual(typeof pm.getDependencyUpdatesForCommand, "function");
assert.strictEqual(pm.isSupportedCommand(), false);
assert.deepStrictEqual(pm.getDependencyUpdatesForCommand(), []);
});