import { Scanner, ScanResult, Severity, ScannerOptions } from '../types'; export interface PackageMetadata { name: string; ageInDays: number; weeklyDownloads: number; maintainerCount: number; } export interface ContextScore { originalSeverity: Severity; adjustedSeverity: Severity; reason: string; } /** TLDs that collide with common file extensions. */ export declare const RISKY_TLDS: Set; /** Well-known agent convention filenames that are squattable domains. */ export declare const KNOWN_CONVENTION_FILES: string[]; /** * Check if a filename (e.g. "README.md") could be interpreted as a valid * domain by checking its extension against risky TLDs. */ export declare function isTLDCollision(filename: string): boolean; /** * Resolve a domain via DNS. Returns true if any A/AAAA record exists. * Wrapped for testability – callers can override via the resolver param. */ export declare function domainResolves(domain: string, resolver?: (hostname: string) => Promise): Promise; /** * Fetch package metadata from npm registry. * Returns null if package doesn't exist or API fails. */ export declare function fetchPackageMetadata(packageName: string, fetcher?: (url: string) => Promise): Promise; /** * Calculate context score and adjust severity based on package metadata. * * Scoring rules: * - Age < 30 days: keep severity * - Age < 365 days && downloads < 1000/week: keep severity * - Age >= 365 days && downloads >= 10000/week && maintainers >= 3: downgrade by 2 levels * - Age >= 365 days && downloads >= 1000/week: downgrade by 1 level */ export declare function calculateContextScore(originalSeverity: Severity, metadata: PackageMetadata | null): ContextScore; export declare class ConventionSquattingScanner implements Scanner { name: string; description: string; /** Injected resolver for testing. */ private resolver; /** Whether to perform live DNS checks. */ private dnsCheck; /** Whether to enable context scoring. */ private enableContextScoring; /** Injected fetcher for testing. */ private fetcher; /** * Scan depth for node_modules: * 0 = skip node_modules (default) * 1 = direct deps only * -1 = unlimited */ private nodeModulesDepth; /** Maximum number of unique packages to query from npm registry per scan. */ private maxPackageQueries; constructor(opts?: { resolver?: (hostname: string) => Promise; dnsCheck?: boolean; enableContextScoring?: boolean; fetcher?: (url: string) => Promise; nodeModulesDepth?: number; maxPackageQueries?: number; }); scan(targetDir: string, options?: ScannerOptions): Promise; /** * Scan node_modules directory up to specified depth. * depth: 1 = direct deps only, -1 = unlimited */ private scanNodeModules; } //# sourceMappingURL=convention-squatting-scanner.d.ts.map