Merge branch 'improved-shell-integration' into zsh-safe-chain-detection

This commit is contained in:
Sander Declerck 2025-07-18 09:22:36 +02:00
commit e12faf6f45
No known key found for this signature in database
5 changed files with 32 additions and 16 deletions

View file

@ -1,4 +1,4 @@
import { execSync } from "child_process";
import { execSync, spawnSync } from "child_process";
import * as os from "os";
import fs from "fs";
@ -13,11 +13,12 @@ export const knownAikidoTools = [
export function doesExecutableExistOnSystem(executableName) {
try {
if (os.platform() === "win32") {
execSync(`where ${executableName}`, { stdio: "ignore" });
const result = spawnSync("where", [executableName], { stdio: "ignore" });
return result.status === 0;
} else {
execSync(`which ${executableName}`, { stdio: "ignore" });
const result = spawnSync("which", [executableName], { stdio: "ignore" });
return result.status === 0;
}
return true;
} catch {
return false;
}
@ -46,6 +47,7 @@ export function addLineToFile(filePath, line) {
if (!fs.existsSync(filePath)) {
fs.writeFileSync(filePath, "", "utf-8");
}
const fileContent = fs.readFileSync(filePath, "utf-8");
const updatedContent = fileContent + os.EOL + line;
fs.writeFileSync(filePath, updatedContent, "utf-8");

View file

@ -27,10 +27,10 @@ function setup(tools) {
const startupFile = execAndGetOutput(startupFileCommand, executableName);
teardown();
for (const tool of tools) {
for (const { tool, aikidoCommand } of tools) {
addLineToFile(
startupFile,
`alias ${tool}="aikido-${tool}" # Safe-chain alias for ${tool}`
`alias ${tool}="${aikidoCommand}" # Safe-chain alias for ${tool}`
);
}

View file

@ -60,7 +60,11 @@ describe("Bash shell integration", () => {
describe("setup", () => {
it("should add aliases for all provided tools", () => {
const tools = ["npm", "npx", "yarn"];
const tools = [
{ tool: "npm", aikidoCommand: "aikido-npm" },
{ tool: "npx", aikidoCommand: "aikido-npx" },
{ tool: "yarn", aikidoCommand: "aikido-yarn" }
];
const result = bash.setup(tools);
assert.strictEqual(result, true);
@ -85,7 +89,7 @@ describe("Bash shell integration", () => {
"utf-8"
);
const tools = ["npm"];
const tools = [{ tool: "npm", aikidoCommand: "aikido-npm" }];
bash.setup(tools);
const content = fs.readFileSync(mockStartupFile, "utf-8");
@ -171,7 +175,10 @@ describe("Bash shell integration", () => {
describe("integration tests", () => {
it("should handle complete setup and teardown cycle", () => {
const tools = ["npm", "yarn"];
const tools = [
{ tool: "npm", aikidoCommand: "aikido-npm" },
{ tool: "yarn", aikidoCommand: "aikido-yarn" }
];
// Setup
bash.setup(tools);
@ -187,7 +194,7 @@ describe("Bash shell integration", () => {
});
it("should handle multiple setup calls", () => {
const tools = ["npm"];
const tools = [{ tool: "npm", aikidoCommand: "aikido-npm" }];
bash.setup(tools);
bash.setup(tools);

View file

@ -27,10 +27,10 @@ function setup(tools) {
const startupFile = execAndGetOutput(startupFileCommand, executableName);
teardown();
for (const tool of tools) {
for (const { tool, aikidoCommand } of tools) {
addLineToFile(
startupFile,
`alias ${tool} "aikido-${tool}" # Safe-chain alias for ${tool}`
`alias ${tool} "${aikidoCommand}" # Safe-chain alias for ${tool}`
);
}

View file

@ -60,7 +60,11 @@ describe("Fish shell integration", () => {
describe("setup", () => {
it("should add aliases for all provided tools", () => {
const tools = ["npm", "npx", "yarn"];
const tools = [
{ tool: "npm", aikidoCommand: "aikido-npm" },
{ tool: "npx", aikidoCommand: "aikido-npx" },
{ tool: "yarn", aikidoCommand: "aikido-yarn" }
];
const result = fish.setup(tools);
assert.strictEqual(result, true);
@ -75,7 +79,7 @@ describe("Fish shell integration", () => {
// Pre-populate file with existing aliases
fs.writeFileSync(mockStartupFile, 'alias npm "old-npm"\nalias npx "old-npx"\n', "utf-8");
const tools = ["npm"];
const tools = [{ tool: "npm", aikidoCommand: "aikido-npm" }];
fish.setup(tools);
const content = fs.readFileSync(mockStartupFile, "utf-8");
@ -161,7 +165,10 @@ describe("Fish shell integration", () => {
describe("integration tests", () => {
it("should handle complete setup and teardown cycle", () => {
const tools = ["npm", "yarn"];
const tools = [
{ tool: "npm", aikidoCommand: "aikido-npm" },
{ tool: "yarn", aikidoCommand: "aikido-yarn" }
];
// Setup
fish.setup(tools);
@ -177,7 +184,7 @@ describe("Fish shell integration", () => {
});
it("should handle multiple setup calls", () => {
const tools = ["npm"];
const tools = [{ tool: "npm", aikidoCommand: "aikido-npm" }];
fish.setup(tools);
fish.setup(tools);