UNPKG

eol-check

Version:

CLI tool to check End-of-Life (EOL) status of Node.js, package managers, operating systems, dependencies, and databases. Supports HTML reports and GitHub Actions.

166 lines (165 loc) • 7.51 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 scannerEngine_1 = require("./scanners/scannerEngine"); const endoflifeApi_1 = require("./core/endoflifeApi"); const evaluator_1 = require("./core/evaluator"); const dependencyScanner_1 = require("./scanners/dependencyScanner"); const productMapper_1 = require("./core/productMapper"); const htmlReporter_1 = require("./reporters/htmlReporter"); const fs = __importStar(require("fs")); // GitHub Actions helper functions function getInput(name) { return process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; } function setOutput(name, value) { console.log(`::set-output name=${name}::${value}`); } function setFailed(message) { console.log(`::error::${message}`); process.exit(1); } async function run() { try { // Read inputs const failOnEol = getInput('fail-on-eol') === 'true'; const generateHtml = getInput('generate-html') === 'true'; const htmlFilename = getInput('html-filename') || 'eol-report.html'; const verbose = getInput('verbose') === 'true'; const workingDirectory = getInput('working-directory') || '.'; // Change to working directory if (workingDirectory !== '.') { process.chdir(workingDirectory); } if (verbose) { console.log('šŸ” Scanning environment...'); } const scanResult = (0, scannerEngine_1.scanEnvironment)(); const results = []; // Check Node.js if (scanResult.nodeVersion) { if (verbose) console.log(`Checking Node.js ${scanResult.nodeVersion}...`); const nodeData = await (0, endoflifeApi_1.fetchEolData)('nodejs', false); results.push((0, evaluator_1.evaluateVersion)('Node.js', scanResult.nodeVersion, nodeData)); } // Check OS if (scanResult.os && scanResult.os !== 'Unknown') { const osLower = scanResult.os.toLowerCase(); let product = ''; if (osLower.includes('ubuntu')) product = 'ubuntu'; else if (osLower.includes('alpine')) product = 'alpine'; else if (osLower.includes('debian')) product = 'debian'; if (product) { if (verbose) console.log(`Checking OS ${scanResult.os} (mapped to ${product})...`); const osData = await (0, endoflifeApi_1.fetchEolData)(product, false); const versionMatch = scanResult.os.match(/(\d+(\.\d+)?)/); if (versionMatch) { results.push((0, evaluator_1.evaluateVersion)(scanResult.os, versionMatch[0], osData)); } } } // Check dependencies if (verbose) console.log('Scanning project dependencies...'); const dependencies = (0, dependencyScanner_1.scanDependencies)(process.cwd()); for (const dep of dependencies) { const productSlug = (0, productMapper_1.mapPackageToProduct)(dep.name); if (productSlug) { if (verbose) console.log(`Checking dependency ${dep.name} (${dep.version})...`); const cleanVer = (0, dependencyScanner_1.cleanVersion)(dep.version); const eolData = await (0, endoflifeApi_1.fetchEolData)(productSlug, false); if (eolData && eolData.length > 0) { results.push((0, evaluator_1.evaluateVersion)(dep.name, cleanVer, eolData)); } } } // Calculate summary statistics const stats = { total: results.length, ok: results.filter((r) => r.status === evaluator_1.Status.OK).length, warn: results.filter((r) => r.status === evaluator_1.Status.WARN).length, err: results.filter((r) => r.status === evaluator_1.Status.ERR).length, }; const hasEol = stats.err > 0; // Set outputs setOutput('results', JSON.stringify(results)); setOutput('has-eol', String(hasEol)); setOutput('summary', JSON.stringify(stats)); // Generate HTML report if requested if (generateHtml) { try { (0, htmlReporter_1.generateHtmlReport)(results, htmlFilename); console.log(`āœ“ HTML report generated: ${htmlFilename}`); // Add job summary if (fs.existsSync(htmlFilename)) { const summaryFile = process.env.GITHUB_STEP_SUMMARY; if (summaryFile) { fs.appendFileSync(summaryFile, `\n## EOL Check Results\n\n`); fs.appendFileSync(summaryFile, `- **Total Checks**: ${stats.total}\n`); fs.appendFileSync(summaryFile, `- **Supported**: ${stats.ok}\n`); fs.appendFileSync(summaryFile, `- **Warnings**: ${stats.warn}\n`); fs.appendFileSync(summaryFile, `- **EOL/Errors**: ${stats.err}\n\n`); fs.appendFileSync(summaryFile, `šŸ“„ [View Full HTML Report](${htmlFilename})\n`); } } } catch (error) { console.error(`Failed to generate HTML report: ${error}`); } } // Print results console.log('\nšŸ“Š EOL Check Results:\n'); results.forEach((res) => { const emoji = res.status === evaluator_1.Status.OK ? 'āœ…' : res.status === evaluator_1.Status.WARN ? 'āš ļø' : 'āŒ'; console.log(`${emoji} [${res.status}] ${res.component} ${res.version} - ${res.message}`); }); console.log('\nšŸ“ˆ Summary:'); console.log(` Total: ${stats.total} | OK: ${stats.ok} | WARN: ${stats.warn} | ERR: ${stats.err}`); // Fail if requested and EOL components found if (failOnEol && hasEol) { setFailed(`Found ${stats.err} EOL component(s)`); } } catch (error) { setFailed(`EOL Check failed: ${error}`); } } run();