From a2fb94d0f05eac9dfd9ae87ca38139842fd5741c Mon Sep 17 00:00:00 2001 From: Reinier Criel Date: Mon, 3 Nov 2025 07:13:36 -0800 Subject: [PATCH] Fix type check issues --- packages/safe-chain/bin/aikido-pip.js | 2 +- packages/safe-chain/bin/aikido-pip3.js | 2 +- .../pip/createPackageManager.js | 15 ++++++++++++++- .../commandArgumentScanner.js | 19 +++++++++++++++++++ .../parsing/parsePackagesFromInstallArgs.js | 9 +++++++++ .../packagemanager/pip/utils/pipCommands.js | 8 +++++++- .../src/registryProxy/parsePackageFromUrl.js | 8 ++++++++ .../src/scanning/malwareDatabase.js | 1 + 8 files changed, 60 insertions(+), 4 deletions(-) diff --git a/packages/safe-chain/bin/aikido-pip.js b/packages/safe-chain/bin/aikido-pip.js index 8d483f3..f5c250e 100755 --- a/packages/safe-chain/bin/aikido-pip.js +++ b/packages/safe-chain/bin/aikido-pip.js @@ -16,4 +16,4 @@ setEcoSystem(ECOSYSTEM_PY); initializePackageManager(packageManagerName); const exitCode = await main(argv); -process.exit(exitCode); +process.exit(typeof exitCode === 'number' ? exitCode : 1); diff --git a/packages/safe-chain/bin/aikido-pip3.js b/packages/safe-chain/bin/aikido-pip3.js index 31da8bd..b056764 100755 --- a/packages/safe-chain/bin/aikido-pip3.js +++ b/packages/safe-chain/bin/aikido-pip3.js @@ -16,4 +16,4 @@ setEcoSystem(ECOSYSTEM_PY); initializePackageManager(packageManagerName); const exitCode = await main(argv); -process.exit(exitCode); +process.exit(typeof exitCode === 'number' ? exitCode : 1); diff --git a/packages/safe-chain/src/packagemanager/pip/createPackageManager.js b/packages/safe-chain/src/packagemanager/pip/createPackageManager.js index 3c0e974..dce00ca 100644 --- a/packages/safe-chain/src/packagemanager/pip/createPackageManager.js +++ b/packages/safe-chain/src/packagemanager/pip/createPackageManager.js @@ -7,7 +7,13 @@ import { pipWheelCommand, } from "./utils/pipCommands.js"; +/** + * @param {string} [command] + */ export function createPipPackageManager(command = "pip") { + /** + * @param {string[]} args + */ function isSupportedCommand(args) { const scanner = findDependencyScannerForCommand( commandScannerMapping, @@ -16,6 +22,9 @@ export function createPipPackageManager(command = "pip") { return scanner.shouldScan(args); } + /** + * @param {string[]} args + */ function getDependencyUpdatesForCommand(args) { const scanner = findDependencyScannerForCommand( commandScannerMapping, @@ -25,7 +34,7 @@ export function createPipPackageManager(command = "pip") { } return { - runCommand: (args) => runPip(command, args), + runCommand: /** @param {string[]} args */ (args) => runPip(command, args), isSupportedCommand, getDependencyUpdatesForCommand, }; @@ -43,6 +52,10 @@ const NULL_SCANNER = { scan: () => [], }; +/** + * @param {Record} scanners + * @param {string[]} args + */ function findDependencyScannerForCommand(scanners, args) { const command = getPipCommandForArgs(args); if (!command) { diff --git a/packages/safe-chain/src/packagemanager/pip/dependencyScanner/commandArgumentScanner.js b/packages/safe-chain/src/packagemanager/pip/dependencyScanner/commandArgumentScanner.js index dbe92d6..5e7031e 100644 --- a/packages/safe-chain/src/packagemanager/pip/dependencyScanner/commandArgumentScanner.js +++ b/packages/safe-chain/src/packagemanager/pip/dependencyScanner/commandArgumentScanner.js @@ -1,13 +1,22 @@ import { parsePackagesFromInstallArgs } from "../parsing/parsePackagesFromInstallArgs.js"; import { hasDryRunArg } from "../utils/pipCommands.js"; +/** + * @param {{ ignoreDryRun?: boolean }} [options] + */ export function commandArgumentScanner(options = {}) { const { ignoreDryRun = false } = options; + /** + * @param {string[]} args + */ function shouldScan(args) { return shouldScanDependencies(args, ignoreDryRun); } + /** + * @param {string[]} args + */ function scan(args) { return scanDependencies(args); } @@ -18,14 +27,24 @@ export function commandArgumentScanner(options = {}) { }; } +/** + * @param {string[]} args + * @param {boolean} ignoreDryRun + */ function shouldScanDependencies(args, ignoreDryRun) { return ignoreDryRun || !hasDryRunArg(args); } +/** + * @param {string[]} args + */ function scanDependencies(args) { return checkChangesFromArgs(args); } +/** + * @param {string[]} args + */ export function checkChangesFromArgs(args) { const packageUpdates = parsePackagesFromInstallArgs(args); diff --git a/packages/safe-chain/src/packagemanager/pip/parsing/parsePackagesFromInstallArgs.js b/packages/safe-chain/src/packagemanager/pip/parsing/parsePackagesFromInstallArgs.js index b0b2f6c..5ec0426 100644 --- a/packages/safe-chain/src/packagemanager/pip/parsing/parsePackagesFromInstallArgs.js +++ b/packages/safe-chain/src/packagemanager/pip/parsing/parsePackagesFromInstallArgs.js @@ -14,6 +14,9 @@ * - git+https://... (VCS URLs - returned without version) * - -r requirements.txt (handled by flag skipping) */ +/** + * @param {string[]} args + */ export function parsePackagesFromInstallArgs(args) { const packages = []; let skipNext = false; @@ -48,6 +51,9 @@ export function parsePackagesFromInstallArgs(args) { return packages; } +/** + * @param {string} arg + */ function isPipOptionWithParameter(arg) { // Check if a pip flag takes a parameter @@ -100,6 +106,9 @@ function isPipOptionWithParameter(arg) { return optionsWithParameters.includes(arg); } +/** + * @param {string} spec + */ function parsePipSpec(spec) { // Ignore obvious URLs and paths, rely on mitm scanner const lower = spec.toLowerCase(); diff --git a/packages/safe-chain/src/packagemanager/pip/utils/pipCommands.js b/packages/safe-chain/src/packagemanager/pip/utils/pipCommands.js index 5db1cc5..5b28b48 100644 --- a/packages/safe-chain/src/packagemanager/pip/utils/pipCommands.js +++ b/packages/safe-chain/src/packagemanager/pip/utils/pipCommands.js @@ -2,6 +2,9 @@ export const pipInstallCommand = "install"; export const pipDownloadCommand = "download"; export const pipWheelCommand = "wheel"; +/** + * @param {string[]} args + */ export function getPipCommandForArgs(args) { if (!args || args.length === 0) { return null; @@ -17,6 +20,9 @@ export function getPipCommandForArgs(args) { return null; } +/** + * @param {string[]} args + */ export function hasDryRunArg(args) { - return args.some((arg) => arg === "--dry-run"); + return args.some(/** @param {string} arg */ (arg) => arg === "--dry-run"); } diff --git a/packages/safe-chain/src/registryProxy/parsePackageFromUrl.js b/packages/safe-chain/src/registryProxy/parsePackageFromUrl.js index 5250b33..64ce99a 100644 --- a/packages/safe-chain/src/registryProxy/parsePackageFromUrl.js +++ b/packages/safe-chain/src/registryProxy/parsePackageFromUrl.js @@ -32,6 +32,10 @@ export function parsePackageFromUrl(url) { return { packageName: undefined, version: undefined }; } +/** + * @param {string} url + * @param {string} registry + */ function parseJsPackageFromUrl(url, registry) { let packageName, version; if (!registry || !url.endsWith(".tgz")) { @@ -71,6 +75,10 @@ function parseJsPackageFromUrl(url, registry) { return { packageName, version }; } +/** + * @param {string} url + * @param {string} registry + */ function parsePipPackageFromUrl(url, registry) { let packageName, version diff --git a/packages/safe-chain/src/scanning/malwareDatabase.js b/packages/safe-chain/src/scanning/malwareDatabase.js index dcd1833..a2e2fb7 100644 --- a/packages/safe-chain/src/scanning/malwareDatabase.js +++ b/packages/safe-chain/src/scanning/malwareDatabase.js @@ -22,6 +22,7 @@ let cachedMalwareDatabase = null; * Normalize package name for comparison. * For Python packages (PEP-503): lowercase and replace _, -, . with - * For js packages: keep as-is (case-sensitive) + * @param {string} name */ function normalizePackageName(name) { const ecosystem = getEcoSystem();