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
JavaScript
;
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();