From 0c56c3d1f91534f28ff447fde84a4fda63430f62 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 29 Jul 2025 11:09:49 +0200 Subject: [PATCH 01/20] Basic e2e test --- .github/workflows/e2e.yml | 37 +++++++ package.json | 1 + test/e2e/Dockerfile | 32 ++++++ test/e2e/setup.e2e.spec.js | 195 +++++++++++++++++++++++++++++++++++++ 4 files changed, 265 insertions(+) create mode 100644 .github/workflows/e2e.yml create mode 100644 test/e2e/Dockerfile create mode 100644 test/e2e/setup.e2e.spec.js diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000..5fa8d3f --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,37 @@ +name: E2E Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + e2e-tests: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run unit tests + run: npm test + + - name: Run E2E tests + run: npm run test:e2e + + - name: Clean up Docker resources + if: always() + run: | + # Clean up any remaining containers and images + docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f + docker images -q safe-chain-e2e-test | xargs -r docker rmi -f \ No newline at end of file diff --git a/package.json b/package.json index 4ab4c95..8049b02 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "scripts": { "test": "node --test --experimental-test-module-mocks **/*.spec.js", "test:watch": "node --test --watch --experimental-test-module-mocks **/*.spec.js", + "test:e2e": "node --test test/e2e/**/*.e2e.spec.js", "lint": "eslint ." }, "repository": { diff --git a/test/e2e/Dockerfile b/test/e2e/Dockerfile new file mode 100644 index 0000000..0b9e24d --- /dev/null +++ b/test/e2e/Dockerfile @@ -0,0 +1,32 @@ +FROM node:18-alpine + +# Install bash and basic utilities (Alpine uses apk, not apt-get) +RUN apk add --no-cache bash curl + +# Create a test user to simulate real user environment (Alpine syntax) +RUN addgroup -S testuser && adduser -S testuser -G testuser -s /bin/bash + +# Set working directory +WORKDIR /app + +# Copy package files first for better caching +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy the rest of the application +COPY . . + +# Switch to test user +USER testuser + +# Create home directory structure that bash expects +RUN mkdir -p /home/testuser + +# Set environment variables for testing +ENV HOME=/home/testuser +ENV SHELL=/bin/bash + +# Default command runs our test +CMD ["bash", "test/e2e/test-setup.sh"] \ No newline at end of file diff --git a/test/e2e/setup.e2e.spec.js b/test/e2e/setup.e2e.spec.js new file mode 100644 index 0000000..7c4d905 --- /dev/null +++ b/test/e2e/setup.e2e.spec.js @@ -0,0 +1,195 @@ +import { describe, it, before, after } from "node:test"; +import assert from "node:assert"; +import { execSync, spawn } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectRoot = path.resolve(__dirname, "../.."); + +describe("E2E: safe-chain setup command", () => { + const imageName = "safe-chain-e2e-test"; + const containerName = "safe-chain-e2e-test-container"; + + before(async () => { + console.log("Building Docker image for e2e tests..."); + try { + execSync(`docker build -t ${imageName} -f test/e2e/Dockerfile .`, { + cwd: projectRoot, + stdio: "inherit", + }); + console.log("Docker image built successfully"); + } catch (error) { + throw new Error(`Failed to build Docker image: ${error.message}`); + } + }); + + after(async () => { + // Clean up: remove container and image + try { + execSync(`docker rm -f ${containerName}`, { stdio: "ignore" }); + } catch { + // Container might not exist, ignore + } + + try { + execSync(`docker rmi ${imageName}`, { stdio: "ignore" }); + } catch { + // Image might be in use, ignore + } + }); + + it("should successfully run safe-chain setup and create aliases", async () => { + // Run the container and capture output + const result = await runDockerTest([ + "node", "bin/safe-chain.js", "setup" + ]); + + // Verify setup completed successfully + assert.ok( + result.stdout.includes("Setup successful"), + "Setup should report success" + ); + + assert.strictEqual( + result.exitCode, + 0, + `Setup should exit with code 0, got ${result.exitCode}` + ); + }); + + it("should create correct aliases in .bashrc", async () => { + // Run setup and then check .bashrc contents + const result = await runDockerTest([ + "bash", "-c", ` + node bin/safe-chain.js setup && + echo "=== BASHRC CONTENTS ===" && + cat /home/testuser/.bashrc + ` + ]); + + assert.strictEqual(result.exitCode, 0, "Commands should succeed"); + + const bashrcContent = result.stdout; + + // Check for all expected aliases + const expectedAliases = [ + 'alias npm="aikido-npm" # Safe-chain alias for npm', + 'alias npx="aikido-npx" # Safe-chain alias for npx', + 'alias yarn="aikido-yarn" # Safe-chain alias for yarn', + 'alias pnpm="aikido-pnpm" # Safe-chain alias for pnpm', + 'alias pnpx="aikido-pnpx" # Safe-chain alias for pnpx' + ]; + + for (const expectedAlias of expectedAliases) { + assert.ok( + bashrcContent.includes(expectedAlias), + `Should contain alias: ${expectedAlias}` + ); + } + }); + + it("should be idempotent (not create duplicate aliases)", async () => { + // Run setup twice and check for duplicates + const result = await runDockerTest([ + "bash", "-c", ` + node bin/safe-chain.js setup && + node bin/safe-chain.js setup && + echo "=== ALIAS COUNT ===" && + grep -c 'alias npm="aikido-npm"' /home/testuser/.bashrc || echo 0 + ` + ]); + + assert.strictEqual(result.exitCode, 0, "Commands should succeed"); + + // Extract the count from output + const lines = result.stdout.split('\n'); + const countLine = lines.find(line => line.match(/^\d+$/)); + const aliasCount = parseInt(countLine || '0'); + + assert.strictEqual( + aliasCount, + 1, + `Should have exactly 1 npm alias, found ${aliasCount}` + ); + }); + + it("should work with fresh .bashrc file", async () => { + // Ensure no .bashrc exists initially + const result = await runDockerTest([ + "bash", "-c", ` + rm -f /home/testuser/.bashrc && + node bin/safe-chain.js setup && + test -f /home/testuser/.bashrc && echo "BASHRC_CREATED" || + echo "BASHRC_NOT_CREATED" + ` + ]); + + assert.strictEqual(result.exitCode, 0, "Commands should succeed"); + assert.ok( + result.stdout.includes("BASHRC_CREATED"), + ".bashrc should be created if it doesn't exist" + ); + }); + + it("should detect bash shell correctly", async () => { + const result = await runDockerTest([ + "node", "bin/safe-chain.js", "setup" + ]); + + assert.strictEqual(result.exitCode, 0, "Setup should succeed"); + assert.ok( + result.stdout.includes("Detected") && result.stdout.includes("Bash"), + "Should detect Bash shell" + ); + }); + + /** + * Helper function to run a command in Docker container and return result + */ + async function runDockerTest(command) { + return new Promise((resolve, reject) => { + const dockerArgs = [ + "run", "--rm", + "--name", containerName, + imageName, + ...command + ]; + + const child = spawn("docker", dockerArgs, { + cwd: projectRoot, + stdio: ["pipe", "pipe", "pipe"] + }); + + let stdout = ""; + let stderr = ""; + + child.stdout.on("data", (data) => { + stdout += data.toString(); + }); + + child.stderr.on("data", (data) => { + stderr += data.toString(); + }); + + child.on("close", (code) => { + resolve({ + exitCode: code, + stdout, + stderr + }); + }); + + child.on("error", (error) => { + reject(new Error(`Docker command failed: ${error.message}`)); + }); + + // Set timeout to prevent hanging tests + setTimeout(() => { + child.kill(); + reject(new Error("Test timed out after 60 seconds")); + }, 60000); + }); + } +}); \ No newline at end of file From 73b209a5f63e10f97e5a20dc838fc01a1bd704da Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 29 Jul 2025 11:12:09 +0200 Subject: [PATCH 02/20] bump node version --- .github/workflows/e2e.yml | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 5fa8d3f..47c4d6f 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -2,36 +2,36 @@ name: E2E Tests on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] jobs: e2e-tests: runs-on: ubuntu-latest - + steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '18' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Run unit tests - run: npm test - - - name: Run E2E tests - run: npm run test:e2e - - - name: Clean up Docker resources - if: always() - run: | - # Clean up any remaining containers and images - docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f - docker images -q safe-chain-e2e-test | xargs -r docker rmi -f \ No newline at end of file + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Run unit tests + run: npm test + + - name: Run E2E tests + run: npm run test:e2e + + - name: Clean up Docker resources + if: always() + run: | + # Clean up any remaining containers and images + docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f + docker images -q safe-chain-e2e-test | xargs -r docker rmi -f From 05ebb3f19ee50c71ff3daa69bccea4ef084aafe4 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:10:46 +0200 Subject: [PATCH 03/20] First setup and teardown tests --- package-lock.json | 17 +++ package.json | 1 + test/e2e/DockerTestContainer.js | 113 +++++++++++++++++ test/e2e/Dockerfile | 31 ++--- test/e2e/parseShellOutput.js | 100 +++++++++++++++ test/e2e/setup.e2e.spec.js | 208 +++++++------------------------- 6 files changed, 292 insertions(+), 178 deletions(-) create mode 100644 test/e2e/DockerTestContainer.js create mode 100644 test/e2e/parseShellOutput.js diff --git a/package-lock.json b/package-lock.json index 260ee8b..747aedb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@inquirer/prompts": "^7.4.1", "abbrev": "^3.0.1", "chalk": "^5.4.1", + "node-pty": "^1.0.0", "npm-registry-fetch": "^18.0.2", "ora": "^8.2.0", "semver": "^7.7.2" @@ -3905,6 +3906,12 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", + "license": "MIT" + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3921,6 +3928,16 @@ "node": ">= 0.6" } }, + "node_modules/node-pty": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", + "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.17.0" + } + }, "node_modules/npm-package-arg": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", diff --git a/package.json b/package.json index 8049b02..eceeef9 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@inquirer/prompts": "^7.4.1", "abbrev": "^3.0.1", "chalk": "^5.4.1", + "node-pty": "^1.0.0", "npm-registry-fetch": "^18.0.2", "ora": "^8.2.0", "semver": "^7.7.2" diff --git a/test/e2e/DockerTestContainer.js b/test/e2e/DockerTestContainer.js new file mode 100644 index 0000000..3351c08 --- /dev/null +++ b/test/e2e/DockerTestContainer.js @@ -0,0 +1,113 @@ +import { execSync } from "node:child_process"; +import * as pty from "node-pty"; +import { parseShellOutput } from "./parseShellOutput.js"; + +export class DockerTestContainer { + constructor(imageName, containerName) { + this.imageName = imageName; + this.containerName = containerName; + this.isRunning = false; + } + + async start() { + if (this.isRunning) { + throw new Error("Container is already running"); + } + + try { + // Start a long-running container that we can exec commands into + execSync( + `docker run -d --name ${this.containerName} ${this.imageName} sleep infinity`, + { stdio: "ignore" } + ); + this.isRunning = true; + } catch (error) { + throw new Error(`Failed to start container: ${error.message}`); + } + } + + async openShell(shell) { + let ptyProcess = pty.spawn( + "docker", + ["exec", "-it", this.containerName, shell], + { + name: "xterm-color", + cols: 80, + rows: 30, + } + ); + + await new Promise((resolve, reject) => { + ptyProcess.on("data", (data) => { + if (data.includes("\u001b[?2004h")) { + // This indicates that the shell is ready + resolve(); + } + }); + + ptyProcess.on("error", (err) => { + reject(err); + }); + }); + + function runCommand(command) { + if (!ptyProcess) { + throw new Error("Shell is not running"); + } + + return new Promise((resolve) => { + let allData = []; + + ptyProcess.on("data", handleInput); + + const timeout = setTimeout(() => { + // Fallback in case the command doesn't finish in a reasonable time + resolve({ allData, output: parseShellOutput(allData), command }); + ptyProcess.removeListener("data", handleInput); + }, 10000); + + function handleInput(data) { + allData.push(data); + + if (data.includes("\u001b[?2004h")) { + // This indicates that the command has finished executing + resolve({ allData, output: parseShellOutput(allData), command }); + ptyProcess.removeListener("data", handleInput); + clearTimeout(timeout); + } + } + + ptyProcess.write(`${command}\n`); + }); + } + + return { runCommand }; + } + + async stop() { + if (!this.isRunning) { + return; // Already stopped + } + + try { + // Force stop and remove the container + execSync(`docker kill ${this.containerName}`, { + stdio: "ignore", + timeout: 10000, + }); + } catch { + // Container might already be stopped + } + + try { + execSync(`docker rm -f ${this.containerName}`, { + stdio: "ignore", + timeout: 5000, + }); + } catch { + // Container might already be removed + } + + this.isRunning = false; + } +} diff --git a/test/e2e/Dockerfile b/test/e2e/Dockerfile index 0b9e24d..8518957 100644 --- a/test/e2e/Dockerfile +++ b/test/e2e/Dockerfile @@ -1,10 +1,6 @@ -FROM node:18-alpine +FROM node:24 as builder -# Install bash and basic utilities (Alpine uses apk, not apt-get) -RUN apk add --no-cache bash curl - -# Create a test user to simulate real user environment (Alpine syntax) -RUN addgroup -S testuser && adduser -S testuser -G testuser -s /bin/bash +ENV CI=true # Set working directory WORKDIR /app @@ -18,15 +14,20 @@ RUN npm install # Copy the rest of the application COPY . . -# Switch to test user -USER testuser +# Build the application +RUN npm --no-git-tag-version version 1.0.0 --allow-same-version +RUN npm pack -# Create home directory structure that bash expects -RUN mkdir -p /home/testuser +FROM mcr.microsoft.com/devcontainers/javascript-node as runner -# Set environment variables for testing -ENV HOME=/home/testuser -ENV SHELL=/bin/bash +WORKDIR /app -# Default command runs our test -CMD ["bash", "test/e2e/test-setup.sh"] \ No newline at end of file +COPY --from=builder /app/*.tgz /app/ + +# # Install the application package globally +RUN npm install -g /app/*.tgz + +RUN mkdir /testapp +RUN cd /testapp && npm init -y + +# ENV SHELL=/bin/bash diff --git a/test/e2e/parseShellOutput.js b/test/e2e/parseShellOutput.js new file mode 100644 index 0000000..29a581b --- /dev/null +++ b/test/e2e/parseShellOutput.js @@ -0,0 +1,100 @@ +const escapeChar = "\u001b"; +const startMarker = `${escapeChar}[?2004l`; +const endMarker = `${escapeChar}[?2004h`; + +export function parseShellOutput(rawData) { + const stringData = rawData.join(""); + + let output = getDataBetweenStartAndEndMarkers(stringData); + output = processBackspaces(output); + output = processEraseCommands(output); + output = removeOscSequences(output); + output = removeAnsiSgrSequences(output); + output = removeRemainingEscapeSequences(output); + + return output.trim(); +} + +function getDataBetweenStartAndEndMarkers(data) { + if (!data.includes(startMarker) || !data.includes(endMarker)) { + return data; + } + + const startIndex = data.indexOf(startMarker); + const endIndex = data.indexOf(endMarker, startIndex + startMarker.length); + + if (startIndex === -1 || endIndex === -1) { + return ""; + } + + return data.slice(startIndex + startMarker.length, endIndex); +} + +function processBackspaces(data) { + const result = []; + + for (let i = 0; i < data.length; i++) { + const char = data[i]; + + if (char === "\b") { + // Backspace: remove the previous character if it exists + if (result.length > 0) { + result.pop(); + } + } else { + result.push(char); + } + } + + return result.join(""); +} + +function removeOscSequences(data) { + return data.replace(/\u001b\][0-9]*;[^\u0007\u001b]*(\u0007|\u001b\\)/g, ""); +} + +function removeAnsiSgrSequences(data) { + return data.replace(/\u001b\[[0-9;]*m/g, ""); +} + +function processEraseCommands(data) { + const lines = data.split("\n"); + const result = []; + + for (let line of lines) { + // Process erase in line commands + line = line.replace(/\u001b\[K/g, ""); // Erase to end of line + line = line.replace(/\u001b\[0K/g, ""); // Erase to end of line + line = line.replace(/\u001b\[1K/g, ""); // Erase from start of line to cursor + line = line.replace(/\u001b\[2K/g, ""); // Erase entire line - remove the whole line + + // Skip lines that were completely erased + if (line.includes("\u001b[2K")) { + continue; + } + + result.push(line); + } + + // Process erase in display commands + let output = result.join("\n"); + output = output.replace(/\u001b\[J/g, ""); // Erase to end of display + output = output.replace(/\u001b\[0J/g, ""); // Erase to end of display + output = output.replace(/\u001b\[1J/g, ""); // Erase from start to cursor + output = output.replace(/\u001b\[2J/g, ""); // Erase entire display + + return output; +} + +function removeRemainingEscapeSequences(data) { + // Remove mode setting sequences like \u001b[?1h, \u001b[?1l + data = data.replace(/\u001b\[\?[0-9]+[hl]/g, ""); + + // Remove any other CSI sequences we haven't handled + data = data.replace(/\u001b\[[0-9;?]*[A-Za-z]/g, ""); + + // Remove incomplete or malformed escape sequences + data = data.replace(/\u001b[^\u001b]*/g, ""); + + return data; +} diff --git a/test/e2e/setup.e2e.spec.js b/test/e2e/setup.e2e.spec.js index 7c4d905..16b2669 100644 --- a/test/e2e/setup.e2e.spec.js +++ b/test/e2e/setup.e2e.spec.js @@ -1,8 +1,9 @@ -import { describe, it, before, after } from "node:test"; -import assert from "node:assert"; -import { execSync, spawn } from "node:child_process"; +import { describe, it, before, beforeEach, afterEach } from "node:test"; +import { execSync } from "node:child_process"; import path from "node:path"; import { fileURLToPath } from "node:url"; +import { DockerTestContainer } from "./DockerTestContainer.js"; +import assert from "node:assert"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -11,185 +12,66 @@ const projectRoot = path.resolve(__dirname, "../.."); describe("E2E: safe-chain setup command", () => { const imageName = "safe-chain-e2e-test"; const containerName = "safe-chain-e2e-test-container"; + let container; before(async () => { - console.log("Building Docker image for e2e tests..."); + // Build the Docker image for the test environment try { execSync(`docker build -t ${imageName} -f test/e2e/Dockerfile .`, { cwd: projectRoot, - stdio: "inherit", + stdio: "ignore", }); - console.log("Docker image built successfully"); } catch (error) { - throw new Error(`Failed to build Docker image: ${error.message}`); + throw new Error(`Failed to setup test environment: ${error.message}`); } }); - after(async () => { - // Clean up: remove container and image - try { - execSync(`docker rm -f ${containerName}`, { stdio: "ignore" }); - } catch { - // Container might not exist, ignore - } - - try { - execSync(`docker rmi ${imageName}`, { stdio: "ignore" }); - } catch { - // Image might be in use, ignore + beforeEach(async () => { + // Run a new Docker container for each test + container = new DockerTestContainer(imageName, containerName); + + await container.start(); + }); + + afterEach(async () => { + // Stop and clean up the container after each test + if (container) { + await container.stop(); + container = null; } }); - it("should successfully run safe-chain setup and create aliases", async () => { - // Run the container and capture output - const result = await runDockerTest([ - "node", "bin/safe-chain.js", "setup" - ]); + for (let shell of ["bash", "zsh"]) { + it(`safe-chain setup wraps npm command after installation for ${shell}`, async () => { + // setting up the container + const installationShell = await container.openShell(shell); + await installationShell.runCommand("safe-chain setup"); - // Verify setup completed successfully - assert.ok( - result.stdout.includes("Setup successful"), - "Setup should report success" - ); - - assert.strictEqual( - result.exitCode, - 0, - `Setup should exit with code 0, got ${result.exitCode}` - ); - }); + const projectShell = await container.openShell(shell); + await projectShell.runCommand("cd /testapp"); + const result = await projectShell.runCommand("npm i axios"); - it("should create correct aliases in .bashrc", async () => { - // Run setup and then check .bashrc contents - const result = await runDockerTest([ - "bash", "-c", ` - node bin/safe-chain.js setup && - echo "=== BASHRC CONTENTS ===" && - cat /home/testuser/.bashrc - ` - ]); - - assert.strictEqual(result.exitCode, 0, "Commands should succeed"); - - const bashrcContent = result.stdout; - - // Check for all expected aliases - const expectedAliases = [ - 'alias npm="aikido-npm" # Safe-chain alias for npm', - 'alias npx="aikido-npx" # Safe-chain alias for npx', - 'alias yarn="aikido-yarn" # Safe-chain alias for yarn', - 'alias pnpm="aikido-pnpm" # Safe-chain alias for pnpm', - 'alias pnpx="aikido-pnpx" # Safe-chain alias for pnpx' - ]; - - for (const expectedAlias of expectedAliases) { assert.ok( - bashrcContent.includes(expectedAlias), - `Should contain alias: ${expectedAlias}` + result.output.includes("Scanning for malicious packages..."), + "Expected npm command to be wrapped by safe-chain" ); - } - }); + }); - it("should be idempotent (not create duplicate aliases)", async () => { - // Run setup twice and check for duplicates - const result = await runDockerTest([ - "bash", "-c", ` - node bin/safe-chain.js setup && - node bin/safe-chain.js setup && - echo "=== ALIAS COUNT ===" && - grep -c 'alias npm="aikido-npm"' /home/testuser/.bashrc || echo 0 - ` - ]); + it(`safe-chain teardown unwraps npm command after uninstallation for ${shell}`, async () => { + // setting up the container + const installationShell = await container.openShell(shell); + await installationShell.runCommand("safe-chain setup"); + await installationShell.runCommand("safe-chain teardown"); - assert.strictEqual(result.exitCode, 0, "Commands should succeed"); - - // Extract the count from output - const lines = result.stdout.split('\n'); - const countLine = lines.find(line => line.match(/^\d+$/)); - const aliasCount = parseInt(countLine || '0'); - - assert.strictEqual( - aliasCount, - 1, - `Should have exactly 1 npm alias, found ${aliasCount}` - ); - }); + const projectShell = await container.openShell(shell); + await projectShell.runCommand("cd /testapp"); + await projectShell.runCommand("npm i axios"); + const result = await projectShell.runCommand("npm i axios"); - it("should work with fresh .bashrc file", async () => { - // Ensure no .bashrc exists initially - const result = await runDockerTest([ - "bash", "-c", ` - rm -f /home/testuser/.bashrc && - node bin/safe-chain.js setup && - test -f /home/testuser/.bashrc && echo "BASHRC_CREATED" || - echo "BASHRC_NOT_CREATED" - ` - ]); - - assert.strictEqual(result.exitCode, 0, "Commands should succeed"); - assert.ok( - result.stdout.includes("BASHRC_CREATED"), - ".bashrc should be created if it doesn't exist" - ); - }); - - it("should detect bash shell correctly", async () => { - const result = await runDockerTest([ - "node", "bin/safe-chain.js", "setup" - ]); - - assert.strictEqual(result.exitCode, 0, "Setup should succeed"); - assert.ok( - result.stdout.includes("Detected") && result.stdout.includes("Bash"), - "Should detect Bash shell" - ); - }); - - /** - * Helper function to run a command in Docker container and return result - */ - async function runDockerTest(command) { - return new Promise((resolve, reject) => { - const dockerArgs = [ - "run", "--rm", - "--name", containerName, - imageName, - ...command - ]; - - const child = spawn("docker", dockerArgs, { - cwd: projectRoot, - stdio: ["pipe", "pipe", "pipe"] - }); - - let stdout = ""; - let stderr = ""; - - child.stdout.on("data", (data) => { - stdout += data.toString(); - }); - - child.stderr.on("data", (data) => { - stderr += data.toString(); - }); - - child.on("close", (code) => { - resolve({ - exitCode: code, - stdout, - stderr - }); - }); - - child.on("error", (error) => { - reject(new Error(`Docker command failed: ${error.message}`)); - }); - - // Set timeout to prevent hanging tests - setTimeout(() => { - child.kill(); - reject(new Error("Test timed out after 60 seconds")); - }, 60000); + assert.ok( + !result.output.includes("Scanning for malicious packages..."), + "Expected npm command to not be wrapped by safe-chain after teardown" + ); }); } -}); \ No newline at end of file +}); From 9ad90d8073fc1dec2f493fe0d913e03aeddc3555 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:19:14 +0200 Subject: [PATCH 04/20] Fix linting errors --- test/e2e/parseShellOutput.js | 4 ++++ test/e2e/{setup.e2e.spec.js => setup.teardown.e2e.spec.js} | 0 2 files changed, 4 insertions(+) rename test/e2e/{setup.e2e.spec.js => setup.teardown.e2e.spec.js} (100%) diff --git a/test/e2e/parseShellOutput.js b/test/e2e/parseShellOutput.js index 29a581b..4c2d998 100644 --- a/test/e2e/parseShellOutput.js +++ b/test/e2e/parseShellOutput.js @@ -2,6 +2,10 @@ const escapeChar = "\u001b"; const startMarker = `${escapeChar}[?2004l`; const endMarker = `${escapeChar}[?2004h`; +/* eslint-disable no-control-regex */ +// This module removes control characters and escape sequences from shell output. +// So it is allowed to use control characters in the regex patterns here. + export function parseShellOutput(rawData) { const stringData = rawData.join(""); diff --git a/test/e2e/setup.e2e.spec.js b/test/e2e/setup.teardown.e2e.spec.js similarity index 100% rename from test/e2e/setup.e2e.spec.js rename to test/e2e/setup.teardown.e2e.spec.js From dc3a7bf6e26cd037d7c088e05fa9415ef4d66039 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:21:05 +0200 Subject: [PATCH 05/20] Cleanup comments --- test/e2e/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/test/e2e/Dockerfile b/test/e2e/Dockerfile index 8518957..1e5a3df 100644 --- a/test/e2e/Dockerfile +++ b/test/e2e/Dockerfile @@ -30,4 +30,3 @@ RUN npm install -g /app/*.tgz RUN mkdir /testapp RUN cd /testapp && npm init -y -# ENV SHELL=/bin/bash From b1ca2d2dc584f04510fde8e6291849a627b0a2c7 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:37:37 +0200 Subject: [PATCH 06/20] Move project to separate folder --- .github/workflows/test-on-pr.yml | 5 ++++- {bin => safe-chain/bin}/aikido-npm.js | 0 {bin => safe-chain/bin}/aikido-npx.js | 0 {bin => safe-chain/bin}/aikido-pnpm.js | 0 {bin => safe-chain/bin}/aikido-pnpx.js | 0 {bin => safe-chain/bin}/aikido-yarn.js | 0 {bin => safe-chain/bin}/safe-chain.js | 0 package-lock.json => safe-chain/package-lock.json | 0 package.json => safe-chain/package.json | 0 {src => safe-chain/src}/api/aikido.js | 0 {src => safe-chain/src}/api/npmApi.js | 0 {src => safe-chain/src}/config/configFile.js | 0 {src => safe-chain/src}/environment/environment.js | 0 {src => safe-chain/src}/environment/userInteraction.js | 0 {src => safe-chain/src}/main.js | 0 .../src}/packagemanager/_shared/matchesCommand.js | 0 .../src}/packagemanager/currentPackageManager.js | 0 .../src}/packagemanager/npm/createPackageManager.js | 0 .../npm/dependencyScanner/commandArgumentScanner.js | 0 .../packagemanager/npm/dependencyScanner/dryRunScanner.js | 0 .../src}/packagemanager/npm/dependencyScanner/nullScanner.js | 0 .../npm/parsing/parseNpmInstallDryRunOutput.js | 0 .../npm/parsing/parseNpmInstallDryRunOutput.spec.js | 0 .../npm/parsing/parsePackagesFromInstallArgs.js | 0 .../npm/parsing/parsePackagesFromInstallArgs.spec.js | 0 {src => safe-chain/src}/packagemanager/npm/runNpmCommand.js | 0 {src => safe-chain/src}/packagemanager/npm/utils/cmd-list.js | 0 .../src}/packagemanager/npm/utils/npmCommands.js | 0 .../src}/packagemanager/npx/createPackageManager.js | 0 .../npx/dependencyScanner/commandArgumentScanner.js | 0 .../packagemanager/npx/parsing/parsePackagesFromArguments.js | 0 .../npx/parsing/parsePackagesFromArguments.spec.js | 0 {src => safe-chain/src}/packagemanager/npx/runNpxCommand.js | 0 .../src}/packagemanager/pnpm/createPackageManager.js | 0 .../pnpm/dependencyScanner/commandArgumentScanner.js | 0 .../pnpm/parsing/parsePackagesFromArguments.js | 0 .../pnpm/parsing/parsePackagesFromArguments.spec.js | 0 .../src}/packagemanager/pnpm/runPnpmCommand.js | 0 .../src}/packagemanager/yarn/createPackageManager.js | 0 .../yarn/dependencyScanner/commandArgumentScanner.js | 0 .../yarn/parsing/parsePackagesFromArguments.js | 0 .../yarn/parsing/parsePackagesFromArguments.spec.js | 0 .../src}/packagemanager/yarn/runYarnCommand.js | 0 {src => safe-chain/src}/scanning/audit/index.js | 0 {src => safe-chain/src}/scanning/index.js | 0 {src => safe-chain/src}/scanning/index.scanCommand.spec.js | 0 .../src}/scanning/index.shouldScanCommand.spec.js | 0 {src => safe-chain/src}/scanning/malwareDatabase.js | 0 {src => safe-chain/src}/shell-integration/helpers.js | 0 {src => safe-chain/src}/shell-integration/setup.js | 0 {src => safe-chain/src}/shell-integration/shellDetection.js | 0 .../src}/shell-integration/supported-shells/bash.js | 0 .../src}/shell-integration/supported-shells/bash.spec.js | 0 .../src}/shell-integration/supported-shells/fish.js | 0 .../src}/shell-integration/supported-shells/fish.spec.js | 0 .../src}/shell-integration/supported-shells/powershell.js | 0 .../shell-integration/supported-shells/powershell.spec.js | 0 .../shell-integration/supported-shells/windowsPowershell.js | 0 .../supported-shells/windowsPowershell.spec.js | 0 .../src}/shell-integration/supported-shells/zsh.js | 0 .../src}/shell-integration/supported-shells/zsh.spec.js | 0 {src => safe-chain/src}/shell-integration/teardown.js | 0 62 files changed, 4 insertions(+), 1 deletion(-) rename {bin => safe-chain/bin}/aikido-npm.js (100%) rename {bin => safe-chain/bin}/aikido-npx.js (100%) rename {bin => safe-chain/bin}/aikido-pnpm.js (100%) rename {bin => safe-chain/bin}/aikido-pnpx.js (100%) rename {bin => safe-chain/bin}/aikido-yarn.js (100%) rename {bin => safe-chain/bin}/safe-chain.js (100%) rename package-lock.json => safe-chain/package-lock.json (100%) rename package.json => safe-chain/package.json (100%) rename {src => safe-chain/src}/api/aikido.js (100%) rename {src => safe-chain/src}/api/npmApi.js (100%) rename {src => safe-chain/src}/config/configFile.js (100%) rename {src => safe-chain/src}/environment/environment.js (100%) rename {src => safe-chain/src}/environment/userInteraction.js (100%) rename {src => safe-chain/src}/main.js (100%) rename {src => safe-chain/src}/packagemanager/_shared/matchesCommand.js (100%) rename {src => safe-chain/src}/packagemanager/currentPackageManager.js (100%) rename {src => safe-chain/src}/packagemanager/npm/createPackageManager.js (100%) rename {src => safe-chain/src}/packagemanager/npm/dependencyScanner/commandArgumentScanner.js (100%) rename {src => safe-chain/src}/packagemanager/npm/dependencyScanner/dryRunScanner.js (100%) rename {src => safe-chain/src}/packagemanager/npm/dependencyScanner/nullScanner.js (100%) rename {src => safe-chain/src}/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js (100%) rename {src => safe-chain/src}/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js (100%) rename {src => safe-chain/src}/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js (100%) rename {src => safe-chain/src}/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js (100%) rename {src => safe-chain/src}/packagemanager/npm/runNpmCommand.js (100%) rename {src => safe-chain/src}/packagemanager/npm/utils/cmd-list.js (100%) rename {src => safe-chain/src}/packagemanager/npm/utils/npmCommands.js (100%) rename {src => safe-chain/src}/packagemanager/npx/createPackageManager.js (100%) rename {src => safe-chain/src}/packagemanager/npx/dependencyScanner/commandArgumentScanner.js (100%) rename {src => safe-chain/src}/packagemanager/npx/parsing/parsePackagesFromArguments.js (100%) rename {src => safe-chain/src}/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js (100%) rename {src => safe-chain/src}/packagemanager/npx/runNpxCommand.js (100%) rename {src => safe-chain/src}/packagemanager/pnpm/createPackageManager.js (100%) rename {src => safe-chain/src}/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js (100%) rename {src => safe-chain/src}/packagemanager/pnpm/parsing/parsePackagesFromArguments.js (100%) rename {src => safe-chain/src}/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js (100%) rename {src => safe-chain/src}/packagemanager/pnpm/runPnpmCommand.js (100%) rename {src => safe-chain/src}/packagemanager/yarn/createPackageManager.js (100%) rename {src => safe-chain/src}/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js (100%) rename {src => safe-chain/src}/packagemanager/yarn/parsing/parsePackagesFromArguments.js (100%) rename {src => safe-chain/src}/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js (100%) rename {src => safe-chain/src}/packagemanager/yarn/runYarnCommand.js (100%) rename {src => safe-chain/src}/scanning/audit/index.js (100%) rename {src => safe-chain/src}/scanning/index.js (100%) rename {src => safe-chain/src}/scanning/index.scanCommand.spec.js (100%) rename {src => safe-chain/src}/scanning/index.shouldScanCommand.spec.js (100%) rename {src => safe-chain/src}/scanning/malwareDatabase.js (100%) rename {src => safe-chain/src}/shell-integration/helpers.js (100%) rename {src => safe-chain/src}/shell-integration/setup.js (100%) rename {src => safe-chain/src}/shell-integration/shellDetection.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/bash.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/bash.spec.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/fish.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/fish.spec.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/powershell.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/powershell.spec.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/windowsPowershell.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/windowsPowershell.spec.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/zsh.js (100%) rename {src => safe-chain/src}/shell-integration/supported-shells/zsh.spec.js (100%) rename {src => safe-chain/src}/shell-integration/teardown.js (100%) diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index b726376..881d93e 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -18,10 +18,13 @@ jobs: with: node-version: "lts/*" + - name: Go to safe-chain directory + run: cd safe-chain + - name: Install dependencies run: npm ci - - name: Run tests + - name: Run unit tests run: npm test - name: Run ESLint diff --git a/bin/aikido-npm.js b/safe-chain/bin/aikido-npm.js similarity index 100% rename from bin/aikido-npm.js rename to safe-chain/bin/aikido-npm.js diff --git a/bin/aikido-npx.js b/safe-chain/bin/aikido-npx.js similarity index 100% rename from bin/aikido-npx.js rename to safe-chain/bin/aikido-npx.js diff --git a/bin/aikido-pnpm.js b/safe-chain/bin/aikido-pnpm.js similarity index 100% rename from bin/aikido-pnpm.js rename to safe-chain/bin/aikido-pnpm.js diff --git a/bin/aikido-pnpx.js b/safe-chain/bin/aikido-pnpx.js similarity index 100% rename from bin/aikido-pnpx.js rename to safe-chain/bin/aikido-pnpx.js diff --git a/bin/aikido-yarn.js b/safe-chain/bin/aikido-yarn.js similarity index 100% rename from bin/aikido-yarn.js rename to safe-chain/bin/aikido-yarn.js diff --git a/bin/safe-chain.js b/safe-chain/bin/safe-chain.js similarity index 100% rename from bin/safe-chain.js rename to safe-chain/bin/safe-chain.js diff --git a/package-lock.json b/safe-chain/package-lock.json similarity index 100% rename from package-lock.json rename to safe-chain/package-lock.json diff --git a/package.json b/safe-chain/package.json similarity index 100% rename from package.json rename to safe-chain/package.json diff --git a/src/api/aikido.js b/safe-chain/src/api/aikido.js similarity index 100% rename from src/api/aikido.js rename to safe-chain/src/api/aikido.js diff --git a/src/api/npmApi.js b/safe-chain/src/api/npmApi.js similarity index 100% rename from src/api/npmApi.js rename to safe-chain/src/api/npmApi.js diff --git a/src/config/configFile.js b/safe-chain/src/config/configFile.js similarity index 100% rename from src/config/configFile.js rename to safe-chain/src/config/configFile.js diff --git a/src/environment/environment.js b/safe-chain/src/environment/environment.js similarity index 100% rename from src/environment/environment.js rename to safe-chain/src/environment/environment.js diff --git a/src/environment/userInteraction.js b/safe-chain/src/environment/userInteraction.js similarity index 100% rename from src/environment/userInteraction.js rename to safe-chain/src/environment/userInteraction.js diff --git a/src/main.js b/safe-chain/src/main.js similarity index 100% rename from src/main.js rename to safe-chain/src/main.js diff --git a/src/packagemanager/_shared/matchesCommand.js b/safe-chain/src/packagemanager/_shared/matchesCommand.js similarity index 100% rename from src/packagemanager/_shared/matchesCommand.js rename to safe-chain/src/packagemanager/_shared/matchesCommand.js diff --git a/src/packagemanager/currentPackageManager.js b/safe-chain/src/packagemanager/currentPackageManager.js similarity index 100% rename from src/packagemanager/currentPackageManager.js rename to safe-chain/src/packagemanager/currentPackageManager.js diff --git a/src/packagemanager/npm/createPackageManager.js b/safe-chain/src/packagemanager/npm/createPackageManager.js similarity index 100% rename from src/packagemanager/npm/createPackageManager.js rename to safe-chain/src/packagemanager/npm/createPackageManager.js diff --git a/src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js b/safe-chain/src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js rename to safe-chain/src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js diff --git a/src/packagemanager/npm/dependencyScanner/dryRunScanner.js b/safe-chain/src/packagemanager/npm/dependencyScanner/dryRunScanner.js similarity index 100% rename from src/packagemanager/npm/dependencyScanner/dryRunScanner.js rename to safe-chain/src/packagemanager/npm/dependencyScanner/dryRunScanner.js diff --git a/src/packagemanager/npm/dependencyScanner/nullScanner.js b/safe-chain/src/packagemanager/npm/dependencyScanner/nullScanner.js similarity index 100% rename from src/packagemanager/npm/dependencyScanner/nullScanner.js rename to safe-chain/src/packagemanager/npm/dependencyScanner/nullScanner.js diff --git a/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js b/safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js similarity index 100% rename from src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js rename to safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js diff --git a/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js b/safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js similarity index 100% rename from src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js rename to safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js diff --git a/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js b/safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js similarity index 100% rename from src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js rename to safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js diff --git a/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js b/safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js similarity index 100% rename from src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js rename to safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js diff --git a/src/packagemanager/npm/runNpmCommand.js b/safe-chain/src/packagemanager/npm/runNpmCommand.js similarity index 100% rename from src/packagemanager/npm/runNpmCommand.js rename to safe-chain/src/packagemanager/npm/runNpmCommand.js diff --git a/src/packagemanager/npm/utils/cmd-list.js b/safe-chain/src/packagemanager/npm/utils/cmd-list.js similarity index 100% rename from src/packagemanager/npm/utils/cmd-list.js rename to safe-chain/src/packagemanager/npm/utils/cmd-list.js diff --git a/src/packagemanager/npm/utils/npmCommands.js b/safe-chain/src/packagemanager/npm/utils/npmCommands.js similarity index 100% rename from src/packagemanager/npm/utils/npmCommands.js rename to safe-chain/src/packagemanager/npm/utils/npmCommands.js diff --git a/src/packagemanager/npx/createPackageManager.js b/safe-chain/src/packagemanager/npx/createPackageManager.js similarity index 100% rename from src/packagemanager/npx/createPackageManager.js rename to safe-chain/src/packagemanager/npx/createPackageManager.js diff --git a/src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js b/safe-chain/src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js rename to safe-chain/src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js diff --git a/src/packagemanager/npx/parsing/parsePackagesFromArguments.js b/safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.js similarity index 100% rename from src/packagemanager/npx/parsing/parsePackagesFromArguments.js rename to safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.js diff --git a/src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js b/safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js similarity index 100% rename from src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js rename to safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js diff --git a/src/packagemanager/npx/runNpxCommand.js b/safe-chain/src/packagemanager/npx/runNpxCommand.js similarity index 100% rename from src/packagemanager/npx/runNpxCommand.js rename to safe-chain/src/packagemanager/npx/runNpxCommand.js diff --git a/src/packagemanager/pnpm/createPackageManager.js b/safe-chain/src/packagemanager/pnpm/createPackageManager.js similarity index 100% rename from src/packagemanager/pnpm/createPackageManager.js rename to safe-chain/src/packagemanager/pnpm/createPackageManager.js diff --git a/src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js b/safe-chain/src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js rename to safe-chain/src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js diff --git a/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js b/safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js similarity index 100% rename from src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js rename to safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js diff --git a/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js b/safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js similarity index 100% rename from src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js rename to safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js diff --git a/src/packagemanager/pnpm/runPnpmCommand.js b/safe-chain/src/packagemanager/pnpm/runPnpmCommand.js similarity index 100% rename from src/packagemanager/pnpm/runPnpmCommand.js rename to safe-chain/src/packagemanager/pnpm/runPnpmCommand.js diff --git a/src/packagemanager/yarn/createPackageManager.js b/safe-chain/src/packagemanager/yarn/createPackageManager.js similarity index 100% rename from src/packagemanager/yarn/createPackageManager.js rename to safe-chain/src/packagemanager/yarn/createPackageManager.js diff --git a/src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js b/safe-chain/src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js rename to safe-chain/src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js diff --git a/src/packagemanager/yarn/parsing/parsePackagesFromArguments.js b/safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.js similarity index 100% rename from src/packagemanager/yarn/parsing/parsePackagesFromArguments.js rename to safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.js diff --git a/src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js b/safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js similarity index 100% rename from src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js rename to safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js diff --git a/src/packagemanager/yarn/runYarnCommand.js b/safe-chain/src/packagemanager/yarn/runYarnCommand.js similarity index 100% rename from src/packagemanager/yarn/runYarnCommand.js rename to safe-chain/src/packagemanager/yarn/runYarnCommand.js diff --git a/src/scanning/audit/index.js b/safe-chain/src/scanning/audit/index.js similarity index 100% rename from src/scanning/audit/index.js rename to safe-chain/src/scanning/audit/index.js diff --git a/src/scanning/index.js b/safe-chain/src/scanning/index.js similarity index 100% rename from src/scanning/index.js rename to safe-chain/src/scanning/index.js diff --git a/src/scanning/index.scanCommand.spec.js b/safe-chain/src/scanning/index.scanCommand.spec.js similarity index 100% rename from src/scanning/index.scanCommand.spec.js rename to safe-chain/src/scanning/index.scanCommand.spec.js diff --git a/src/scanning/index.shouldScanCommand.spec.js b/safe-chain/src/scanning/index.shouldScanCommand.spec.js similarity index 100% rename from src/scanning/index.shouldScanCommand.spec.js rename to safe-chain/src/scanning/index.shouldScanCommand.spec.js diff --git a/src/scanning/malwareDatabase.js b/safe-chain/src/scanning/malwareDatabase.js similarity index 100% rename from src/scanning/malwareDatabase.js rename to safe-chain/src/scanning/malwareDatabase.js diff --git a/src/shell-integration/helpers.js b/safe-chain/src/shell-integration/helpers.js similarity index 100% rename from src/shell-integration/helpers.js rename to safe-chain/src/shell-integration/helpers.js diff --git a/src/shell-integration/setup.js b/safe-chain/src/shell-integration/setup.js similarity index 100% rename from src/shell-integration/setup.js rename to safe-chain/src/shell-integration/setup.js diff --git a/src/shell-integration/shellDetection.js b/safe-chain/src/shell-integration/shellDetection.js similarity index 100% rename from src/shell-integration/shellDetection.js rename to safe-chain/src/shell-integration/shellDetection.js diff --git a/src/shell-integration/supported-shells/bash.js b/safe-chain/src/shell-integration/supported-shells/bash.js similarity index 100% rename from src/shell-integration/supported-shells/bash.js rename to safe-chain/src/shell-integration/supported-shells/bash.js diff --git a/src/shell-integration/supported-shells/bash.spec.js b/safe-chain/src/shell-integration/supported-shells/bash.spec.js similarity index 100% rename from src/shell-integration/supported-shells/bash.spec.js rename to safe-chain/src/shell-integration/supported-shells/bash.spec.js diff --git a/src/shell-integration/supported-shells/fish.js b/safe-chain/src/shell-integration/supported-shells/fish.js similarity index 100% rename from src/shell-integration/supported-shells/fish.js rename to safe-chain/src/shell-integration/supported-shells/fish.js diff --git a/src/shell-integration/supported-shells/fish.spec.js b/safe-chain/src/shell-integration/supported-shells/fish.spec.js similarity index 100% rename from src/shell-integration/supported-shells/fish.spec.js rename to safe-chain/src/shell-integration/supported-shells/fish.spec.js diff --git a/src/shell-integration/supported-shells/powershell.js b/safe-chain/src/shell-integration/supported-shells/powershell.js similarity index 100% rename from src/shell-integration/supported-shells/powershell.js rename to safe-chain/src/shell-integration/supported-shells/powershell.js diff --git a/src/shell-integration/supported-shells/powershell.spec.js b/safe-chain/src/shell-integration/supported-shells/powershell.spec.js similarity index 100% rename from src/shell-integration/supported-shells/powershell.spec.js rename to safe-chain/src/shell-integration/supported-shells/powershell.spec.js diff --git a/src/shell-integration/supported-shells/windowsPowershell.js b/safe-chain/src/shell-integration/supported-shells/windowsPowershell.js similarity index 100% rename from src/shell-integration/supported-shells/windowsPowershell.js rename to safe-chain/src/shell-integration/supported-shells/windowsPowershell.js diff --git a/src/shell-integration/supported-shells/windowsPowershell.spec.js b/safe-chain/src/shell-integration/supported-shells/windowsPowershell.spec.js similarity index 100% rename from src/shell-integration/supported-shells/windowsPowershell.spec.js rename to safe-chain/src/shell-integration/supported-shells/windowsPowershell.spec.js diff --git a/src/shell-integration/supported-shells/zsh.js b/safe-chain/src/shell-integration/supported-shells/zsh.js similarity index 100% rename from src/shell-integration/supported-shells/zsh.js rename to safe-chain/src/shell-integration/supported-shells/zsh.js diff --git a/src/shell-integration/supported-shells/zsh.spec.js b/safe-chain/src/shell-integration/supported-shells/zsh.spec.js similarity index 100% rename from src/shell-integration/supported-shells/zsh.spec.js rename to safe-chain/src/shell-integration/supported-shells/zsh.spec.js diff --git a/src/shell-integration/teardown.js b/safe-chain/src/shell-integration/teardown.js similarity index 100% rename from src/shell-integration/teardown.js rename to safe-chain/src/shell-integration/teardown.js From 822e734a4ef55f768d8726778ea563543f28d927 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:39:33 +0200 Subject: [PATCH 07/20] Set working directory for unit tests --- .github/workflows/test-on-pr.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index 881d93e..fb4d87c 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -8,6 +8,9 @@ on: jobs: test: runs-on: ubuntu-latest + defaults: + run: + working-directory: safe-chain steps: - name: Checkout code @@ -18,9 +21,6 @@ jobs: with: node-version: "lts/*" - - name: Go to safe-chain directory - run: cd safe-chain - - name: Install dependencies run: npm ci From cc58c48c9b37280e8252e17d5878682e46cdbc03 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:41:01 +0200 Subject: [PATCH 08/20] Move linter file --- .github/workflows/test-on-pr.yml | 6 ++++-- eslint.config.js => safe-chain/eslint.config.js | 0 2 files changed, 4 insertions(+), 2 deletions(-) rename eslint.config.js => safe-chain/eslint.config.js (100%) diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index fb4d87c..8744a19 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -1,4 +1,4 @@ -name: Run Unit Tests +name: Run tests on: pull_request: @@ -6,7 +6,9 @@ on: - main jobs: - test: + unit-test: + name: Run unit tests and linting + runs-on: ubuntu-latest defaults: run: diff --git a/eslint.config.js b/safe-chain/eslint.config.js similarity index 100% rename from eslint.config.js rename to safe-chain/eslint.config.js From c966660a098b17ae00351d30726c8203dee3e4b5 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:43:11 +0200 Subject: [PATCH 09/20] Remove e2e workflow --- .github/workflows/e2e.yml | 37 -------------------------------- .github/workflows/test-on-pr.yml | 32 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 37 deletions(-) delete mode 100644 .github/workflows/e2e.yml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index 47c4d6f..0000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: E2E Tests - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - e2e-tests: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: "24" - cache: "npm" - - - name: Install dependencies - run: npm ci - - - name: Run unit tests - run: npm test - - - name: Run E2E tests - run: npm run test:e2e - - - name: Clean up Docker resources - if: always() - run: | - # Clean up any remaining containers and images - docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f - docker images -q safe-chain-e2e-test | xargs -r docker rmi -f diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index 8744a19..a68c07b 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -31,3 +31,35 @@ jobs: - name: Run ESLint run: npm run lint + + e2e-tests: + runs-on: ubuntu-latest + defaults: + run: + working-directory: test/e2e + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "npm" + + # - name: Install dependencies + # run: npm ci + + # - name: Run unit tests + # run: npm test + + # - name: Run E2E tests + # run: npm run test:e2e + + # - name: Clean up Docker resources + # if: always() + # run: | + # # Clean up any remaining containers and images + # docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f + # docker images -q safe-chain-e2e-test | xargs -r docker rmi -f From af53a8fbb86248baceebd3f3bc69865bf92932b8 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:54:57 +0200 Subject: [PATCH 10/20] Run e2e tests on PR check --- .github/workflows/test-on-pr.yml | 24 +++++++++++----------- safe-chain/package.json | 1 - test/e2e/package-lock.json | 32 +++++++++++++++++++++++++++++ test/e2e/package.json | 15 ++++++++++++++ test/e2e/setup.teardown.e2e.spec.js | 5 ++--- 5 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 test/e2e/package-lock.json create mode 100644 test/e2e/package.json diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index a68c07b..c9302e9 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -48,18 +48,18 @@ jobs: node-version: "24" cache: "npm" - # - name: Install dependencies - # run: npm ci + - name: Install dependencies + run: npm ci - # - name: Run unit tests - # run: npm test + - name: Run unit tests + run: npm test - # - name: Run E2E tests - # run: npm run test:e2e + - name: Run E2E tests + run: npm run test:e2e - # - name: Clean up Docker resources - # if: always() - # run: | - # # Clean up any remaining containers and images - # docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f - # docker images -q safe-chain-e2e-test | xargs -r docker rmi -f + - name: Clean up Docker resources + if: always() + run: | + # Clean up any remaining containers and images + docker ps -aq --filter "name=safe-chain-e2e-test" | xargs -r docker rm -f + docker images -q safe-chain-e2e-test | xargs -r docker rmi -f diff --git a/safe-chain/package.json b/safe-chain/package.json index eceeef9..1fb7788 100644 --- a/safe-chain/package.json +++ b/safe-chain/package.json @@ -4,7 +4,6 @@ "scripts": { "test": "node --test --experimental-test-module-mocks **/*.spec.js", "test:watch": "node --test --watch --experimental-test-module-mocks **/*.spec.js", - "test:e2e": "node --test test/e2e/**/*.e2e.spec.js", "lint": "eslint ." }, "repository": { diff --git a/test/e2e/package-lock.json b/test/e2e/package-lock.json new file mode 100644 index 0000000..55aabb7 --- /dev/null +++ b/test/e2e/package-lock.json @@ -0,0 +1,32 @@ +{ + "name": "@aikidosec/safe-chain-e2e-tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@aikidosec/safe-chain-e2e-tests", + "version": "1.0.0", + "license": "AGPL-3.0-or-later", + "dependencies": { + "node-pty": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", + "license": "MIT" + }, + "node_modules/node-pty": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", + "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.17.0" + } + } + } +} diff --git a/test/e2e/package.json b/test/e2e/package.json new file mode 100644 index 0000000..4748762 --- /dev/null +++ b/test/e2e/package.json @@ -0,0 +1,15 @@ +{ + "name": "@aikidosec/safe-chain-e2e-tests", + "version": "1.0.0", + "description": "End-to-end tests for the Aikido Safe Chain", + "scripts": { + "test": "node --test **/*.spec.js" + }, + "keywords": [], + "author": "Aikido Security", + "license": "AGPL-3.0-or-later", + "type": "module", + "dependencies": { + "node-pty": "^1.0.0" + } +} diff --git a/test/e2e/setup.teardown.e2e.spec.js b/test/e2e/setup.teardown.e2e.spec.js index 16b2669..ad3f264 100644 --- a/test/e2e/setup.teardown.e2e.spec.js +++ b/test/e2e/setup.teardown.e2e.spec.js @@ -7,7 +7,6 @@ import assert from "node:assert"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const projectRoot = path.resolve(__dirname, "../.."); describe("E2E: safe-chain setup command", () => { const imageName = "safe-chain-e2e-test"; @@ -17,8 +16,8 @@ describe("E2E: safe-chain setup command", () => { before(async () => { // Build the Docker image for the test environment try { - execSync(`docker build -t ${imageName} -f test/e2e/Dockerfile .`, { - cwd: projectRoot, + execSync(`docker build -t ${imageName} -f Dockerfile ../../safe-chain`, { + cwd: __dirname, stdio: "ignore", }); } catch (error) { From e7aadc42a3ebcf6fda7957edbc837e404e975e6d Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 16:58:51 +0200 Subject: [PATCH 11/20] Add jobname to e2e tests --- .github/workflows/test-on-pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index c9302e9..cff72dd 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -33,6 +33,7 @@ jobs: run: npm run lint e2e-tests: + name: Run E2E tests runs-on: ubuntu-latest defaults: run: From 1bbfb5425df1f4c237edacf04f33ffb36819694c Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 17:03:17 +0200 Subject: [PATCH 12/20] Remove test package --- .github/workflows/test-on-pr.yml | 9 +++------ safe-chain/package-lock.json | 17 ----------------- safe-chain/package.json | 1 - 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index cff72dd..475a3ad 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -34,10 +34,11 @@ jobs: e2e-tests: name: Run E2E tests + runs-on: ubuntu-latest defaults: run: - working-directory: test/e2e + working-directory: "test/e2e" steps: - name: Checkout code @@ -46,8 +47,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: "24" - cache: "npm" + node-version: "lts/*" - name: Install dependencies run: npm ci @@ -55,9 +55,6 @@ jobs: - name: Run unit tests run: npm test - - name: Run E2E tests - run: npm run test:e2e - - name: Clean up Docker resources if: always() run: | diff --git a/safe-chain/package-lock.json b/safe-chain/package-lock.json index 747aedb..260ee8b 100644 --- a/safe-chain/package-lock.json +++ b/safe-chain/package-lock.json @@ -12,7 +12,6 @@ "@inquirer/prompts": "^7.4.1", "abbrev": "^3.0.1", "chalk": "^5.4.1", - "node-pty": "^1.0.0", "npm-registry-fetch": "^18.0.2", "ora": "^8.2.0", "semver": "^7.7.2" @@ -3906,12 +3905,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/nan": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", - "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3928,16 +3921,6 @@ "node": ">= 0.6" } }, - "node_modules/node-pty": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", - "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "nan": "^2.17.0" - } - }, "node_modules/npm-package-arg": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", diff --git a/safe-chain/package.json b/safe-chain/package.json index 1fb7788..4ab4c95 100644 --- a/safe-chain/package.json +++ b/safe-chain/package.json @@ -27,7 +27,6 @@ "@inquirer/prompts": "^7.4.1", "abbrev": "^3.0.1", "chalk": "^5.4.1", - "node-pty": "^1.0.0", "npm-registry-fetch": "^18.0.2", "ora": "^8.2.0", "semver": "^7.7.2" From 733887744d10609d62d312a8994537a2839731e3 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 17:08:25 +0200 Subject: [PATCH 13/20] Add docs to npm package --- .github/workflows/build-and-release.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 455ccd6..cb24501 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -8,6 +8,9 @@ on: jobs: build: runs-on: ubuntu-latest + defaults: + run: + working-directory: safe-chain steps: - name: Checkout code @@ -27,6 +30,12 @@ jobs: version="${{ github.ref_name }}" echo "tag=$version" >> $GITHUB_OUTPUT + - name: Add docs + run: | + cp ../README.md ./README.md + cp ../LICENSE ./LICENSE + cp -r ../docs ./docs + - name: Set the version run: npm --no-git-tag-version version ${{ steps.get_version.outputs.tag }} From 9f5380b7a8247697e5c7d9439eecf028a6b7b48b Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Wed, 30 Jul 2025 17:21:13 +0200 Subject: [PATCH 14/20] Pin docker images --- test/e2e/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/Dockerfile b/test/e2e/Dockerfile index 1e5a3df..4d919ef 100644 --- a/test/e2e/Dockerfile +++ b/test/e2e/Dockerfile @@ -1,4 +1,4 @@ -FROM node:24 as builder +FROM node:24-bookworm as builder ENV CI=true @@ -18,7 +18,7 @@ COPY . . RUN npm --no-git-tag-version version 1.0.0 --allow-same-version RUN npm pack -FROM mcr.microsoft.com/devcontainers/javascript-node as runner +FROM mcr.microsoft.com/devcontainers/javascript-node:22-bookworm as runner WORKDIR /app From b29bc2e6dce750f884cf59c59d9ca3c6fb601f72 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 5 Aug 2025 11:50:08 +0200 Subject: [PATCH 15/20] Move merged scripts to correct location --- .../src}/shell-integration/startup-scripts/init-fish.fish | 0 .../src}/shell-integration/startup-scripts/init-posix.sh | 0 .../src}/shell-integration/startup-scripts/init-pwsh.ps1 | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {src => safe-chain/src}/shell-integration/startup-scripts/init-fish.fish (100%) rename {src => safe-chain/src}/shell-integration/startup-scripts/init-posix.sh (100%) rename {src => safe-chain/src}/shell-integration/startup-scripts/init-pwsh.ps1 (100%) diff --git a/src/shell-integration/startup-scripts/init-fish.fish b/safe-chain/src/shell-integration/startup-scripts/init-fish.fish similarity index 100% rename from src/shell-integration/startup-scripts/init-fish.fish rename to safe-chain/src/shell-integration/startup-scripts/init-fish.fish diff --git a/src/shell-integration/startup-scripts/init-posix.sh b/safe-chain/src/shell-integration/startup-scripts/init-posix.sh similarity index 100% rename from src/shell-integration/startup-scripts/init-posix.sh rename to safe-chain/src/shell-integration/startup-scripts/init-posix.sh diff --git a/src/shell-integration/startup-scripts/init-pwsh.ps1 b/safe-chain/src/shell-integration/startup-scripts/init-pwsh.ps1 similarity index 100% rename from src/shell-integration/startup-scripts/init-pwsh.ps1 rename to safe-chain/src/shell-integration/startup-scripts/init-pwsh.ps1 From 8fe228c4761f73849c75ee90e02fdfda71c962b7 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 5 Aug 2025 13:35:40 +0200 Subject: [PATCH 16/20] Undo move of files to safe-chain --- .github/workflows/build-and-release.yml | 9 --------- .npmignore | 5 +++++ {safe-chain/bin => bin}/aikido-npm.js | 0 {safe-chain/bin => bin}/aikido-npx.js | 0 {safe-chain/bin => bin}/aikido-pnpm.js | 0 {safe-chain/bin => bin}/aikido-pnpx.js | 0 {safe-chain/bin => bin}/aikido-yarn.js | 0 {safe-chain/bin => bin}/safe-chain.js | 0 safe-chain/eslint.config.js => eslint.config.js | 0 safe-chain/package-lock.json => package-lock.json | 0 safe-chain/package.json => package.json | 0 {safe-chain/src => src}/api/aikido.js | 0 {safe-chain/src => src}/api/npmApi.js | 0 {safe-chain/src => src}/config/configFile.js | 0 {safe-chain/src => src}/environment/environment.js | 0 {safe-chain/src => src}/environment/userInteraction.js | 0 {safe-chain/src => src}/main.js | 0 .../src => src}/packagemanager/_shared/matchesCommand.js | 0 .../src => src}/packagemanager/currentPackageManager.js | 0 .../packagemanager/npm/createPackageManager.js | 0 .../npm/dependencyScanner/commandArgumentScanner.js | 0 .../npm/dependencyScanner/dryRunScanner.js | 0 .../packagemanager/npm/dependencyScanner/nullScanner.js | 0 .../npm/parsing/parseNpmInstallDryRunOutput.js | 0 .../npm/parsing/parseNpmInstallDryRunOutput.spec.js | 0 .../npm/parsing/parsePackagesFromInstallArgs.js | 0 .../npm/parsing/parsePackagesFromInstallArgs.spec.js | 0 .../src => src}/packagemanager/npm/runNpmCommand.js | 0 .../src => src}/packagemanager/npm/utils/cmd-list.js | 0 .../src => src}/packagemanager/npm/utils/npmCommands.js | 0 .../packagemanager/npx/createPackageManager.js | 0 .../npx/dependencyScanner/commandArgumentScanner.js | 0 .../npx/parsing/parsePackagesFromArguments.js | 0 .../npx/parsing/parsePackagesFromArguments.spec.js | 0 .../src => src}/packagemanager/npx/runNpxCommand.js | 0 .../packagemanager/pnpm/createPackageManager.js | 0 .../pnpm/dependencyScanner/commandArgumentScanner.js | 0 .../pnpm/parsing/parsePackagesFromArguments.js | 0 .../pnpm/parsing/parsePackagesFromArguments.spec.js | 0 .../src => src}/packagemanager/pnpm/runPnpmCommand.js | 0 .../packagemanager/yarn/createPackageManager.js | 0 .../yarn/dependencyScanner/commandArgumentScanner.js | 0 .../yarn/parsing/parsePackagesFromArguments.js | 0 .../yarn/parsing/parsePackagesFromArguments.spec.js | 0 .../src => src}/packagemanager/yarn/runYarnCommand.js | 0 {safe-chain/src => src}/scanning/audit/index.js | 0 {safe-chain/src => src}/scanning/index.js | 0 .../src => src}/scanning/index.scanCommand.spec.js | 0 .../src => src}/scanning/index.shouldScanCommand.spec.js | 0 {safe-chain/src => src}/scanning/malwareDatabase.js | 0 {safe-chain/src => src}/shell-integration/helpers.js | 0 {safe-chain/src => src}/shell-integration/setup.js | 0 .../src => src}/shell-integration/shellDetection.js | 0 .../shell-integration/startup-scripts/init-fish.fish | 0 .../shell-integration/startup-scripts/init-posix.sh | 0 .../shell-integration/startup-scripts/init-pwsh.ps1 | 0 .../shell-integration/supported-shells/bash.js | 0 .../shell-integration/supported-shells/bash.spec.js | 0 .../shell-integration/supported-shells/fish.js | 0 .../shell-integration/supported-shells/fish.spec.js | 0 .../shell-integration/supported-shells/powershell.js | 0 .../supported-shells/powershell.spec.js | 0 .../supported-shells/windowsPowershell.js | 0 .../supported-shells/windowsPowershell.spec.js | 0 .../shell-integration/supported-shells/zsh.js | 0 .../shell-integration/supported-shells/zsh.spec.js | 0 {safe-chain/src => src}/shell-integration/teardown.js | 0 test/e2e/setup.teardown.e2e.spec.js | 3 ++- 68 files changed, 7 insertions(+), 10 deletions(-) create mode 100644 .npmignore rename {safe-chain/bin => bin}/aikido-npm.js (100%) rename {safe-chain/bin => bin}/aikido-npx.js (100%) rename {safe-chain/bin => bin}/aikido-pnpm.js (100%) rename {safe-chain/bin => bin}/aikido-pnpx.js (100%) rename {safe-chain/bin => bin}/aikido-yarn.js (100%) rename {safe-chain/bin => bin}/safe-chain.js (100%) rename safe-chain/eslint.config.js => eslint.config.js (100%) rename safe-chain/package-lock.json => package-lock.json (100%) rename safe-chain/package.json => package.json (100%) rename {safe-chain/src => src}/api/aikido.js (100%) rename {safe-chain/src => src}/api/npmApi.js (100%) rename {safe-chain/src => src}/config/configFile.js (100%) rename {safe-chain/src => src}/environment/environment.js (100%) rename {safe-chain/src => src}/environment/userInteraction.js (100%) rename {safe-chain/src => src}/main.js (100%) rename {safe-chain/src => src}/packagemanager/_shared/matchesCommand.js (100%) rename {safe-chain/src => src}/packagemanager/currentPackageManager.js (100%) rename {safe-chain/src => src}/packagemanager/npm/createPackageManager.js (100%) rename {safe-chain/src => src}/packagemanager/npm/dependencyScanner/commandArgumentScanner.js (100%) rename {safe-chain/src => src}/packagemanager/npm/dependencyScanner/dryRunScanner.js (100%) rename {safe-chain/src => src}/packagemanager/npm/dependencyScanner/nullScanner.js (100%) rename {safe-chain/src => src}/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js (100%) rename {safe-chain/src => src}/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js (100%) rename {safe-chain/src => src}/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js (100%) rename {safe-chain/src => src}/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js (100%) rename {safe-chain/src => src}/packagemanager/npm/runNpmCommand.js (100%) rename {safe-chain/src => src}/packagemanager/npm/utils/cmd-list.js (100%) rename {safe-chain/src => src}/packagemanager/npm/utils/npmCommands.js (100%) rename {safe-chain/src => src}/packagemanager/npx/createPackageManager.js (100%) rename {safe-chain/src => src}/packagemanager/npx/dependencyScanner/commandArgumentScanner.js (100%) rename {safe-chain/src => src}/packagemanager/npx/parsing/parsePackagesFromArguments.js (100%) rename {safe-chain/src => src}/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js (100%) rename {safe-chain/src => src}/packagemanager/npx/runNpxCommand.js (100%) rename {safe-chain/src => src}/packagemanager/pnpm/createPackageManager.js (100%) rename {safe-chain/src => src}/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js (100%) rename {safe-chain/src => src}/packagemanager/pnpm/parsing/parsePackagesFromArguments.js (100%) rename {safe-chain/src => src}/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js (100%) rename {safe-chain/src => src}/packagemanager/pnpm/runPnpmCommand.js (100%) rename {safe-chain/src => src}/packagemanager/yarn/createPackageManager.js (100%) rename {safe-chain/src => src}/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js (100%) rename {safe-chain/src => src}/packagemanager/yarn/parsing/parsePackagesFromArguments.js (100%) rename {safe-chain/src => src}/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js (100%) rename {safe-chain/src => src}/packagemanager/yarn/runYarnCommand.js (100%) rename {safe-chain/src => src}/scanning/audit/index.js (100%) rename {safe-chain/src => src}/scanning/index.js (100%) rename {safe-chain/src => src}/scanning/index.scanCommand.spec.js (100%) rename {safe-chain/src => src}/scanning/index.shouldScanCommand.spec.js (100%) rename {safe-chain/src => src}/scanning/malwareDatabase.js (100%) rename {safe-chain/src => src}/shell-integration/helpers.js (100%) rename {safe-chain/src => src}/shell-integration/setup.js (100%) rename {safe-chain/src => src}/shell-integration/shellDetection.js (100%) rename {safe-chain/src => src}/shell-integration/startup-scripts/init-fish.fish (100%) rename {safe-chain/src => src}/shell-integration/startup-scripts/init-posix.sh (100%) rename {safe-chain/src => src}/shell-integration/startup-scripts/init-pwsh.ps1 (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/bash.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/bash.spec.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/fish.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/fish.spec.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/powershell.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/powershell.spec.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/windowsPowershell.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/windowsPowershell.spec.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/zsh.js (100%) rename {safe-chain/src => src}/shell-integration/supported-shells/zsh.spec.js (100%) rename {safe-chain/src => src}/shell-integration/teardown.js (100%) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index cb24501..455ccd6 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -8,9 +8,6 @@ on: jobs: build: runs-on: ubuntu-latest - defaults: - run: - working-directory: safe-chain steps: - name: Checkout code @@ -30,12 +27,6 @@ jobs: version="${{ github.ref_name }}" echo "tag=$version" >> $GITHUB_OUTPUT - - name: Add docs - run: | - cp ../README.md ./README.md - cp ../LICENSE ./LICENSE - cp -r ../docs ./docs - - name: Set the version run: npm --no-git-tag-version version ${{ steps.get_version.outputs.tag }} diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..72f297f --- /dev/null +++ b/.npmignore @@ -0,0 +1,5 @@ + +.github +.claude +test/e2e + diff --git a/safe-chain/bin/aikido-npm.js b/bin/aikido-npm.js similarity index 100% rename from safe-chain/bin/aikido-npm.js rename to bin/aikido-npm.js diff --git a/safe-chain/bin/aikido-npx.js b/bin/aikido-npx.js similarity index 100% rename from safe-chain/bin/aikido-npx.js rename to bin/aikido-npx.js diff --git a/safe-chain/bin/aikido-pnpm.js b/bin/aikido-pnpm.js similarity index 100% rename from safe-chain/bin/aikido-pnpm.js rename to bin/aikido-pnpm.js diff --git a/safe-chain/bin/aikido-pnpx.js b/bin/aikido-pnpx.js similarity index 100% rename from safe-chain/bin/aikido-pnpx.js rename to bin/aikido-pnpx.js diff --git a/safe-chain/bin/aikido-yarn.js b/bin/aikido-yarn.js similarity index 100% rename from safe-chain/bin/aikido-yarn.js rename to bin/aikido-yarn.js diff --git a/safe-chain/bin/safe-chain.js b/bin/safe-chain.js similarity index 100% rename from safe-chain/bin/safe-chain.js rename to bin/safe-chain.js diff --git a/safe-chain/eslint.config.js b/eslint.config.js similarity index 100% rename from safe-chain/eslint.config.js rename to eslint.config.js diff --git a/safe-chain/package-lock.json b/package-lock.json similarity index 100% rename from safe-chain/package-lock.json rename to package-lock.json diff --git a/safe-chain/package.json b/package.json similarity index 100% rename from safe-chain/package.json rename to package.json diff --git a/safe-chain/src/api/aikido.js b/src/api/aikido.js similarity index 100% rename from safe-chain/src/api/aikido.js rename to src/api/aikido.js diff --git a/safe-chain/src/api/npmApi.js b/src/api/npmApi.js similarity index 100% rename from safe-chain/src/api/npmApi.js rename to src/api/npmApi.js diff --git a/safe-chain/src/config/configFile.js b/src/config/configFile.js similarity index 100% rename from safe-chain/src/config/configFile.js rename to src/config/configFile.js diff --git a/safe-chain/src/environment/environment.js b/src/environment/environment.js similarity index 100% rename from safe-chain/src/environment/environment.js rename to src/environment/environment.js diff --git a/safe-chain/src/environment/userInteraction.js b/src/environment/userInteraction.js similarity index 100% rename from safe-chain/src/environment/userInteraction.js rename to src/environment/userInteraction.js diff --git a/safe-chain/src/main.js b/src/main.js similarity index 100% rename from safe-chain/src/main.js rename to src/main.js diff --git a/safe-chain/src/packagemanager/_shared/matchesCommand.js b/src/packagemanager/_shared/matchesCommand.js similarity index 100% rename from safe-chain/src/packagemanager/_shared/matchesCommand.js rename to src/packagemanager/_shared/matchesCommand.js diff --git a/safe-chain/src/packagemanager/currentPackageManager.js b/src/packagemanager/currentPackageManager.js similarity index 100% rename from safe-chain/src/packagemanager/currentPackageManager.js rename to src/packagemanager/currentPackageManager.js diff --git a/safe-chain/src/packagemanager/npm/createPackageManager.js b/src/packagemanager/npm/createPackageManager.js similarity index 100% rename from safe-chain/src/packagemanager/npm/createPackageManager.js rename to src/packagemanager/npm/createPackageManager.js diff --git a/safe-chain/src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js b/src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from safe-chain/src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js rename to src/packagemanager/npm/dependencyScanner/commandArgumentScanner.js diff --git a/safe-chain/src/packagemanager/npm/dependencyScanner/dryRunScanner.js b/src/packagemanager/npm/dependencyScanner/dryRunScanner.js similarity index 100% rename from safe-chain/src/packagemanager/npm/dependencyScanner/dryRunScanner.js rename to src/packagemanager/npm/dependencyScanner/dryRunScanner.js diff --git a/safe-chain/src/packagemanager/npm/dependencyScanner/nullScanner.js b/src/packagemanager/npm/dependencyScanner/nullScanner.js similarity index 100% rename from safe-chain/src/packagemanager/npm/dependencyScanner/nullScanner.js rename to src/packagemanager/npm/dependencyScanner/nullScanner.js diff --git a/safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js b/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js similarity index 100% rename from safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js rename to src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.js diff --git a/safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js b/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js similarity index 100% rename from safe-chain/src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js rename to src/packagemanager/npm/parsing/parseNpmInstallDryRunOutput.spec.js diff --git a/safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js b/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js similarity index 100% rename from safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js rename to src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.js diff --git a/safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js b/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js similarity index 100% rename from safe-chain/src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js rename to src/packagemanager/npm/parsing/parsePackagesFromInstallArgs.spec.js diff --git a/safe-chain/src/packagemanager/npm/runNpmCommand.js b/src/packagemanager/npm/runNpmCommand.js similarity index 100% rename from safe-chain/src/packagemanager/npm/runNpmCommand.js rename to src/packagemanager/npm/runNpmCommand.js diff --git a/safe-chain/src/packagemanager/npm/utils/cmd-list.js b/src/packagemanager/npm/utils/cmd-list.js similarity index 100% rename from safe-chain/src/packagemanager/npm/utils/cmd-list.js rename to src/packagemanager/npm/utils/cmd-list.js diff --git a/safe-chain/src/packagemanager/npm/utils/npmCommands.js b/src/packagemanager/npm/utils/npmCommands.js similarity index 100% rename from safe-chain/src/packagemanager/npm/utils/npmCommands.js rename to src/packagemanager/npm/utils/npmCommands.js diff --git a/safe-chain/src/packagemanager/npx/createPackageManager.js b/src/packagemanager/npx/createPackageManager.js similarity index 100% rename from safe-chain/src/packagemanager/npx/createPackageManager.js rename to src/packagemanager/npx/createPackageManager.js diff --git a/safe-chain/src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js b/src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from safe-chain/src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js rename to src/packagemanager/npx/dependencyScanner/commandArgumentScanner.js diff --git a/safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.js b/src/packagemanager/npx/parsing/parsePackagesFromArguments.js similarity index 100% rename from safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.js rename to src/packagemanager/npx/parsing/parsePackagesFromArguments.js diff --git a/safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js b/src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js similarity index 100% rename from safe-chain/src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js rename to src/packagemanager/npx/parsing/parsePackagesFromArguments.spec.js diff --git a/safe-chain/src/packagemanager/npx/runNpxCommand.js b/src/packagemanager/npx/runNpxCommand.js similarity index 100% rename from safe-chain/src/packagemanager/npx/runNpxCommand.js rename to src/packagemanager/npx/runNpxCommand.js diff --git a/safe-chain/src/packagemanager/pnpm/createPackageManager.js b/src/packagemanager/pnpm/createPackageManager.js similarity index 100% rename from safe-chain/src/packagemanager/pnpm/createPackageManager.js rename to src/packagemanager/pnpm/createPackageManager.js diff --git a/safe-chain/src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js b/src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from safe-chain/src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js rename to src/packagemanager/pnpm/dependencyScanner/commandArgumentScanner.js diff --git a/safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js b/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js similarity index 100% rename from safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js rename to src/packagemanager/pnpm/parsing/parsePackagesFromArguments.js diff --git a/safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js b/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js similarity index 100% rename from safe-chain/src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js rename to src/packagemanager/pnpm/parsing/parsePackagesFromArguments.spec.js diff --git a/safe-chain/src/packagemanager/pnpm/runPnpmCommand.js b/src/packagemanager/pnpm/runPnpmCommand.js similarity index 100% rename from safe-chain/src/packagemanager/pnpm/runPnpmCommand.js rename to src/packagemanager/pnpm/runPnpmCommand.js diff --git a/safe-chain/src/packagemanager/yarn/createPackageManager.js b/src/packagemanager/yarn/createPackageManager.js similarity index 100% rename from safe-chain/src/packagemanager/yarn/createPackageManager.js rename to src/packagemanager/yarn/createPackageManager.js diff --git a/safe-chain/src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js b/src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js similarity index 100% rename from safe-chain/src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js rename to src/packagemanager/yarn/dependencyScanner/commandArgumentScanner.js diff --git a/safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.js b/src/packagemanager/yarn/parsing/parsePackagesFromArguments.js similarity index 100% rename from safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.js rename to src/packagemanager/yarn/parsing/parsePackagesFromArguments.js diff --git a/safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js b/src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js similarity index 100% rename from safe-chain/src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js rename to src/packagemanager/yarn/parsing/parsePackagesFromArguments.spec.js diff --git a/safe-chain/src/packagemanager/yarn/runYarnCommand.js b/src/packagemanager/yarn/runYarnCommand.js similarity index 100% rename from safe-chain/src/packagemanager/yarn/runYarnCommand.js rename to src/packagemanager/yarn/runYarnCommand.js diff --git a/safe-chain/src/scanning/audit/index.js b/src/scanning/audit/index.js similarity index 100% rename from safe-chain/src/scanning/audit/index.js rename to src/scanning/audit/index.js diff --git a/safe-chain/src/scanning/index.js b/src/scanning/index.js similarity index 100% rename from safe-chain/src/scanning/index.js rename to src/scanning/index.js diff --git a/safe-chain/src/scanning/index.scanCommand.spec.js b/src/scanning/index.scanCommand.spec.js similarity index 100% rename from safe-chain/src/scanning/index.scanCommand.spec.js rename to src/scanning/index.scanCommand.spec.js diff --git a/safe-chain/src/scanning/index.shouldScanCommand.spec.js b/src/scanning/index.shouldScanCommand.spec.js similarity index 100% rename from safe-chain/src/scanning/index.shouldScanCommand.spec.js rename to src/scanning/index.shouldScanCommand.spec.js diff --git a/safe-chain/src/scanning/malwareDatabase.js b/src/scanning/malwareDatabase.js similarity index 100% rename from safe-chain/src/scanning/malwareDatabase.js rename to src/scanning/malwareDatabase.js diff --git a/safe-chain/src/shell-integration/helpers.js b/src/shell-integration/helpers.js similarity index 100% rename from safe-chain/src/shell-integration/helpers.js rename to src/shell-integration/helpers.js diff --git a/safe-chain/src/shell-integration/setup.js b/src/shell-integration/setup.js similarity index 100% rename from safe-chain/src/shell-integration/setup.js rename to src/shell-integration/setup.js diff --git a/safe-chain/src/shell-integration/shellDetection.js b/src/shell-integration/shellDetection.js similarity index 100% rename from safe-chain/src/shell-integration/shellDetection.js rename to src/shell-integration/shellDetection.js diff --git a/safe-chain/src/shell-integration/startup-scripts/init-fish.fish b/src/shell-integration/startup-scripts/init-fish.fish similarity index 100% rename from safe-chain/src/shell-integration/startup-scripts/init-fish.fish rename to src/shell-integration/startup-scripts/init-fish.fish diff --git a/safe-chain/src/shell-integration/startup-scripts/init-posix.sh b/src/shell-integration/startup-scripts/init-posix.sh similarity index 100% rename from safe-chain/src/shell-integration/startup-scripts/init-posix.sh rename to src/shell-integration/startup-scripts/init-posix.sh diff --git a/safe-chain/src/shell-integration/startup-scripts/init-pwsh.ps1 b/src/shell-integration/startup-scripts/init-pwsh.ps1 similarity index 100% rename from safe-chain/src/shell-integration/startup-scripts/init-pwsh.ps1 rename to src/shell-integration/startup-scripts/init-pwsh.ps1 diff --git a/safe-chain/src/shell-integration/supported-shells/bash.js b/src/shell-integration/supported-shells/bash.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/bash.js rename to src/shell-integration/supported-shells/bash.js diff --git a/safe-chain/src/shell-integration/supported-shells/bash.spec.js b/src/shell-integration/supported-shells/bash.spec.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/bash.spec.js rename to src/shell-integration/supported-shells/bash.spec.js diff --git a/safe-chain/src/shell-integration/supported-shells/fish.js b/src/shell-integration/supported-shells/fish.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/fish.js rename to src/shell-integration/supported-shells/fish.js diff --git a/safe-chain/src/shell-integration/supported-shells/fish.spec.js b/src/shell-integration/supported-shells/fish.spec.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/fish.spec.js rename to src/shell-integration/supported-shells/fish.spec.js diff --git a/safe-chain/src/shell-integration/supported-shells/powershell.js b/src/shell-integration/supported-shells/powershell.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/powershell.js rename to src/shell-integration/supported-shells/powershell.js diff --git a/safe-chain/src/shell-integration/supported-shells/powershell.spec.js b/src/shell-integration/supported-shells/powershell.spec.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/powershell.spec.js rename to src/shell-integration/supported-shells/powershell.spec.js diff --git a/safe-chain/src/shell-integration/supported-shells/windowsPowershell.js b/src/shell-integration/supported-shells/windowsPowershell.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/windowsPowershell.js rename to src/shell-integration/supported-shells/windowsPowershell.js diff --git a/safe-chain/src/shell-integration/supported-shells/windowsPowershell.spec.js b/src/shell-integration/supported-shells/windowsPowershell.spec.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/windowsPowershell.spec.js rename to src/shell-integration/supported-shells/windowsPowershell.spec.js diff --git a/safe-chain/src/shell-integration/supported-shells/zsh.js b/src/shell-integration/supported-shells/zsh.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/zsh.js rename to src/shell-integration/supported-shells/zsh.js diff --git a/safe-chain/src/shell-integration/supported-shells/zsh.spec.js b/src/shell-integration/supported-shells/zsh.spec.js similarity index 100% rename from safe-chain/src/shell-integration/supported-shells/zsh.spec.js rename to src/shell-integration/supported-shells/zsh.spec.js diff --git a/safe-chain/src/shell-integration/teardown.js b/src/shell-integration/teardown.js similarity index 100% rename from safe-chain/src/shell-integration/teardown.js rename to src/shell-integration/teardown.js diff --git a/test/e2e/setup.teardown.e2e.spec.js b/test/e2e/setup.teardown.e2e.spec.js index ad3f264..804bf29 100644 --- a/test/e2e/setup.teardown.e2e.spec.js +++ b/test/e2e/setup.teardown.e2e.spec.js @@ -16,7 +16,8 @@ describe("E2E: safe-chain setup command", () => { before(async () => { // Build the Docker image for the test environment try { - execSync(`docker build -t ${imageName} -f Dockerfile ../../safe-chain`, { + const sourceDir = path.join(__dirname, "../.."); + execSync(`docker build -t ${imageName} -f Dockerfile ${sourceDir}`, { cwd: __dirname, stdio: "ignore", }); From 7dd93d490eb46eb93311ed318221ff1fdf1bf77c Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 5 Aug 2025 13:37:47 +0200 Subject: [PATCH 17/20] Fix unit tests --- .github/workflows/test-on-pr.yml | 3 --- package.json | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-on-pr.yml b/.github/workflows/test-on-pr.yml index 475a3ad..e291a50 100644 --- a/.github/workflows/test-on-pr.yml +++ b/.github/workflows/test-on-pr.yml @@ -10,9 +10,6 @@ jobs: name: Run unit tests and linting runs-on: ubuntu-latest - defaults: - run: - working-directory: safe-chain steps: - name: Checkout code diff --git a/package.json b/package.json index 4ab4c95..ab5cf00 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "@aikidosec/safe-chain", "version": "1.0.0", "scripts": { - "test": "node --test --experimental-test-module-mocks **/*.spec.js", - "test:watch": "node --test --watch --experimental-test-module-mocks **/*.spec.js", + "test": "node --test --experimental-test-module-mocks src/**/*.spec.js", + "test:watch": "node --test --watch --experimental-test-module-mocks src/**/*.spec.js", "lint": "eslint ." }, "repository": { From 24a9cd94e5c027f94df4feced70ca92fefbe2ba7 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 5 Aug 2025 13:39:09 +0200 Subject: [PATCH 18/20] Fix linter --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab5cf00..89c7277 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "test": "node --test --experimental-test-module-mocks src/**/*.spec.js", "test:watch": "node --test --watch --experimental-test-module-mocks src/**/*.spec.js", - "lint": "eslint ." + "lint": "eslint src" }, "repository": { "type": "git", From 956acc477547822da28442e0220f9c1565fa0c93 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 5 Aug 2025 13:43:27 +0200 Subject: [PATCH 19/20] Make sure all tests are run --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 89c7277..c269bf7 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "@aikidosec/safe-chain", "version": "1.0.0", "scripts": { - "test": "node --test --experimental-test-module-mocks src/**/*.spec.js", - "test:watch": "node --test --watch --experimental-test-module-mocks src/**/*.spec.js", + "test": "node --test --experimental-test-module-mocks 'src/**/*.spec.js'", + "test:watch": "node --test --watch --experimental-test-module-mocks 'src/**/*.spec.js'", "lint": "eslint src" }, "repository": { From 35f43f6787be0dfe614477fd930040f989ba9274 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Tue, 5 Aug 2025 13:51:39 +0200 Subject: [PATCH 20/20] Exclude test/e2e from default linter --- eslint.config.js | 3 ++- package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 27f6599..b210b69 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,5 +1,5 @@ import js from "@eslint/js"; -import { defineConfig } from "@eslint/config-helpers"; +import { defineConfig, globalIgnores } from "@eslint/config-helpers"; import globals from "globals"; import importPlugin from "eslint-plugin-import"; @@ -22,4 +22,5 @@ export default defineConfig([ }, rules: {}, }, + globalIgnores(['test/e2e']), ]); diff --git a/package.json b/package.json index c269bf7..20278fa 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "test": "node --test --experimental-test-module-mocks 'src/**/*.spec.js'", "test:watch": "node --test --watch --experimental-test-module-mocks 'src/**/*.spec.js'", - "lint": "eslint src" + "lint": "eslint ." }, "repository": { "type": "git",