Fix type check issues

This commit is contained in:
Reinier Criel 2025-11-03 07:13:36 -08:00
parent 3d98bb5084
commit a2fb94d0f0
8 changed files with 60 additions and 4 deletions

View file

@ -16,4 +16,4 @@ setEcoSystem(ECOSYSTEM_PY);
initializePackageManager(packageManagerName); initializePackageManager(packageManagerName);
const exitCode = await main(argv); const exitCode = await main(argv);
process.exit(exitCode); process.exit(typeof exitCode === 'number' ? exitCode : 1);

View file

@ -16,4 +16,4 @@ setEcoSystem(ECOSYSTEM_PY);
initializePackageManager(packageManagerName); initializePackageManager(packageManagerName);
const exitCode = await main(argv); const exitCode = await main(argv);
process.exit(exitCode); process.exit(typeof exitCode === 'number' ? exitCode : 1);

View file

@ -7,7 +7,13 @@ import {
pipWheelCommand, pipWheelCommand,
} from "./utils/pipCommands.js"; } from "./utils/pipCommands.js";
/**
* @param {string} [command]
*/
export function createPipPackageManager(command = "pip") { export function createPipPackageManager(command = "pip") {
/**
* @param {string[]} args
*/
function isSupportedCommand(args) { function isSupportedCommand(args) {
const scanner = findDependencyScannerForCommand( const scanner = findDependencyScannerForCommand(
commandScannerMapping, commandScannerMapping,
@ -16,6 +22,9 @@ export function createPipPackageManager(command = "pip") {
return scanner.shouldScan(args); return scanner.shouldScan(args);
} }
/**
* @param {string[]} args
*/
function getDependencyUpdatesForCommand(args) { function getDependencyUpdatesForCommand(args) {
const scanner = findDependencyScannerForCommand( const scanner = findDependencyScannerForCommand(
commandScannerMapping, commandScannerMapping,
@ -25,7 +34,7 @@ export function createPipPackageManager(command = "pip") {
} }
return { return {
runCommand: (args) => runPip(command, args), runCommand: /** @param {string[]} args */ (args) => runPip(command, args),
isSupportedCommand, isSupportedCommand,
getDependencyUpdatesForCommand, getDependencyUpdatesForCommand,
}; };
@ -43,6 +52,10 @@ const NULL_SCANNER = {
scan: () => [], scan: () => [],
}; };
/**
* @param {Record<string, any>} scanners
* @param {string[]} args
*/
function findDependencyScannerForCommand(scanners, args) { function findDependencyScannerForCommand(scanners, args) {
const command = getPipCommandForArgs(args); const command = getPipCommandForArgs(args);
if (!command) { if (!command) {

View file

@ -1,13 +1,22 @@
import { parsePackagesFromInstallArgs } from "../parsing/parsePackagesFromInstallArgs.js"; import { parsePackagesFromInstallArgs } from "../parsing/parsePackagesFromInstallArgs.js";
import { hasDryRunArg } from "../utils/pipCommands.js"; import { hasDryRunArg } from "../utils/pipCommands.js";
/**
* @param {{ ignoreDryRun?: boolean }} [options]
*/
export function commandArgumentScanner(options = {}) { export function commandArgumentScanner(options = {}) {
const { ignoreDryRun = false } = options; const { ignoreDryRun = false } = options;
/**
* @param {string[]} args
*/
function shouldScan(args) { function shouldScan(args) {
return shouldScanDependencies(args, ignoreDryRun); return shouldScanDependencies(args, ignoreDryRun);
} }
/**
* @param {string[]} args
*/
function scan(args) { function scan(args) {
return scanDependencies(args); return scanDependencies(args);
} }
@ -18,14 +27,24 @@ export function commandArgumentScanner(options = {}) {
}; };
} }
/**
* @param {string[]} args
* @param {boolean} ignoreDryRun
*/
function shouldScanDependencies(args, ignoreDryRun) { function shouldScanDependencies(args, ignoreDryRun) {
return ignoreDryRun || !hasDryRunArg(args); return ignoreDryRun || !hasDryRunArg(args);
} }
/**
* @param {string[]} args
*/
function scanDependencies(args) { function scanDependencies(args) {
return checkChangesFromArgs(args); return checkChangesFromArgs(args);
} }
/**
* @param {string[]} args
*/
export function checkChangesFromArgs(args) { export function checkChangesFromArgs(args) {
const packageUpdates = parsePackagesFromInstallArgs(args); const packageUpdates = parsePackagesFromInstallArgs(args);

View file

@ -14,6 +14,9 @@
* - git+https://... (VCS URLs - returned without version) * - git+https://... (VCS URLs - returned without version)
* - -r requirements.txt (handled by flag skipping) * - -r requirements.txt (handled by flag skipping)
*/ */
/**
* @param {string[]} args
*/
export function parsePackagesFromInstallArgs(args) { export function parsePackagesFromInstallArgs(args) {
const packages = []; const packages = [];
let skipNext = false; let skipNext = false;
@ -48,6 +51,9 @@ export function parsePackagesFromInstallArgs(args) {
return packages; return packages;
} }
/**
* @param {string} arg
*/
function isPipOptionWithParameter(arg) { function isPipOptionWithParameter(arg) {
// Check if a pip flag takes a parameter // Check if a pip flag takes a parameter
@ -100,6 +106,9 @@ function isPipOptionWithParameter(arg) {
return optionsWithParameters.includes(arg); return optionsWithParameters.includes(arg);
} }
/**
* @param {string} spec
*/
function parsePipSpec(spec) { function parsePipSpec(spec) {
// Ignore obvious URLs and paths, rely on mitm scanner // Ignore obvious URLs and paths, rely on mitm scanner
const lower = spec.toLowerCase(); const lower = spec.toLowerCase();

View file

@ -2,6 +2,9 @@ export const pipInstallCommand = "install";
export const pipDownloadCommand = "download"; export const pipDownloadCommand = "download";
export const pipWheelCommand = "wheel"; export const pipWheelCommand = "wheel";
/**
* @param {string[]} args
*/
export function getPipCommandForArgs(args) { export function getPipCommandForArgs(args) {
if (!args || args.length === 0) { if (!args || args.length === 0) {
return null; return null;
@ -17,6 +20,9 @@ export function getPipCommandForArgs(args) {
return null; return null;
} }
/**
* @param {string[]} args
*/
export function hasDryRunArg(args) { export function hasDryRunArg(args) {
return args.some((arg) => arg === "--dry-run"); return args.some(/** @param {string} arg */ (arg) => arg === "--dry-run");
} }

View file

@ -32,6 +32,10 @@ export function parsePackageFromUrl(url) {
return { packageName: undefined, version: undefined }; return { packageName: undefined, version: undefined };
} }
/**
* @param {string} url
* @param {string} registry
*/
function parseJsPackageFromUrl(url, registry) { function parseJsPackageFromUrl(url, registry) {
let packageName, version; let packageName, version;
if (!registry || !url.endsWith(".tgz")) { if (!registry || !url.endsWith(".tgz")) {
@ -71,6 +75,10 @@ function parseJsPackageFromUrl(url, registry) {
return { packageName, version }; return { packageName, version };
} }
/**
* @param {string} url
* @param {string} registry
*/
function parsePipPackageFromUrl(url, registry) { function parsePipPackageFromUrl(url, registry) {
let packageName, version let packageName, version

View file

@ -22,6 +22,7 @@ let cachedMalwareDatabase = null;
* Normalize package name for comparison. * Normalize package name for comparison.
* For Python packages (PEP-503): lowercase and replace _, -, . with - * For Python packages (PEP-503): lowercase and replace _, -, . with -
* For js packages: keep as-is (case-sensitive) * For js packages: keep as-is (case-sensitive)
* @param {string} name
*/ */
function normalizePackageName(name) { function normalizePackageName(name) {
const ecosystem = getEcoSystem(); const ecosystem = getEcoSystem();