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

View file

@ -27,10 +27,10 @@ function setup(tools) {
const startupFile = execAndGetOutput(startupFileCommand, executableName); const startupFile = execAndGetOutput(startupFileCommand, executableName);
teardown(); teardown();
for (const tool of tools) { for (const { tool, aikidoCommand } of tools) {
addLineToFile( addLineToFile(
startupFile, 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", () => { describe("setup", () => {
it("should add aliases for all provided tools", () => { 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); const result = bash.setup(tools);
assert.strictEqual(result, true); assert.strictEqual(result, true);
@ -85,7 +89,7 @@ describe("Bash shell integration", () => {
"utf-8" "utf-8"
); );
const tools = ["npm"]; const tools = [{ tool: "npm", aikidoCommand: "aikido-npm" }];
bash.setup(tools); bash.setup(tools);
const content = fs.readFileSync(mockStartupFile, "utf-8"); const content = fs.readFileSync(mockStartupFile, "utf-8");
@ -171,7 +175,10 @@ describe("Bash shell integration", () => {
describe("integration tests", () => { describe("integration tests", () => {
it("should handle complete setup and teardown cycle", () => { 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 // Setup
bash.setup(tools); bash.setup(tools);
@ -187,7 +194,7 @@ describe("Bash shell integration", () => {
}); });
it("should handle multiple setup calls", () => { it("should handle multiple setup calls", () => {
const tools = ["npm"]; const tools = [{ tool: "npm", aikidoCommand: "aikido-npm" }];
bash.setup(tools); bash.setup(tools);
bash.setup(tools); bash.setup(tools);

View file

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