UNPKG

worm-sign

Version:

A prescient scanner to detect and banish Shai Hulud malware from your dependencies.

122 lines (121 loc) 4.38 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const yaml = __importStar(require("js-yaml")); function detectFromPackageManagerField(fieldValue) { if (!fieldValue) return false; return fieldValue.startsWith('pnpm'); } function cleanupVersion(raw) { if (!raw) return 'unknown'; return raw.split('_')[0].split('(')[0].trim(); } function parsePnpmLock(content) { const packages = new Map(); const integrity = new Map(); let parsed; try { parsed = yaml.load(content); } catch (e) { const msg = e instanceof Error ? e.message : String(e); throw new Error(`YAML parse error: ${msg}`); } if (!parsed || !parsed.packages) { return { packages, integrity }; } for (const [key, info] of Object.entries(parsed.packages)) { let name, version; const cleanKey = key.startsWith('/') ? key.slice(1) : key; const lastSlash = cleanKey.lastIndexOf('/'); if (lastSlash === -1) { name = cleanKey; version = 'unknown'; } else { name = cleanKey.slice(0, lastSlash); version = cleanupVersion(cleanKey.slice(lastSlash + 1)); } if (name && version) { const set = packages.get(name) ?? new Set(); set.add(version); packages.set(name, set); if (info.resolution && info.resolution.integrity) { const pkgIntegrity = integrity.get(name) ?? new Map(); pkgIntegrity.set(version, info.resolution.integrity); integrity.set(name, pkgIntegrity); } } } return { packages, integrity }; } function loadLockPackages(lockPath) { const warnings = []; let packages = new Map(); if (!fs.existsSync(lockPath)) { warnings.push(`Lockfile not found at ${lockPath}`); return { packages, warnings, success: false }; } try { const content = fs.readFileSync(lockPath, 'utf8'); const result = parsePnpmLock(content); packages = result.packages; if (packages.size === 0) { warnings.push(`No packages parsed from ${path.basename(lockPath)}; check format.`); } return { packages, packageIntegrity: result.integrity, warnings, success: true }; } catch (err) { const msg = err instanceof Error ? err.message : String(err); warnings.push(`Unable to read ${path.basename(lockPath)}: ${msg}`); return { packages, warnings, success: false }; } } const pnpmHandler = { id: 'pnpm', label: 'pnpm', lockFiles: ['pnpm-lock.yaml'], detectFromPackageManagerField, findLockFile: (repoRoot) => { const candidate = path.join(repoRoot, 'pnpm-lock.yaml'); return fs.existsSync(candidate) ? candidate : null; }, loadLockPackages, }; exports.default = pnpmHandler;