status-checker
Version:
A lean, dependency-free URL status checker library
197 lines (194 loc) • 6.72 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const index_1 = require("./index");
const logger = new index_1.Logger('info');
/**
* Print usage information
*/
function printUsage() {
console.log(`
Status Checker - A lean, dependency-free URL status checker
Usage:
status-checker [options] <config-file>
status-checker --url <url> [options]
Options:
--url <url> Check a single URL instead of using a config file
--timeout <ms> Timeout in milliseconds (default: 5000)
--header <name:value> Add a custom header (can be used multiple times)
--success <code> Add a success status code (can be used multiple times)
--sync Run checks synchronously
--quiet Suppress output except for errors
--help Show this help message
--version Show version information
Examples:
status-checker config.json
status-checker --url https://example.com --timeout 10000
status-checker --url https://api.github.com/users/Sharma-IT --header "User-Agent:StatusChecker/1.0" --success 200 --success 403
`);
}
/**
* Print version information
*/
function printVersion() {
try {
const packageJsonPath = path_1.default.resolve(__dirname, '../package.json');
const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
console.log(`Status Checker v${packageJson.version}`);
}
catch (error) {
console.log('Status Checker (version unknown)');
}
}
/**
* Parse command line arguments
* @returns Parsed arguments
*/
function parseArgs() {
const args = process.argv.slice(2);
const result = {
headers: {},
successCodes: []
};
for (let i = 0; i < args.length; i++) {
const arg = args[i];
switch (arg) {
case '--url':
result.url = args[++i];
break;
case '--timeout':
result.timeout = parseInt(args[++i], 10);
break;
case '--header':
const headerValue = args[++i];
const colonIndex = headerValue.indexOf(':');
if (colonIndex > 0) {
const name = headerValue.substring(0, colonIndex).trim();
const value = headerValue.substring(colonIndex + 1).trim();
result.headers[name] = value;
}
else {
logger.warn(`Invalid header format: ${headerValue}. Expected format: "Name:Value"`);
}
break;
case '--success':
const code = parseInt(args[++i], 10);
if (!isNaN(code)) {
result.successCodes.push(code);
}
else {
logger.warn(`Invalid status code: ${args[i]}`);
}
break;
case '--sync':
result.sync = true;
break;
case '--quiet':
result.quiet = true;
break;
case '--help':
result.help = true;
break;
case '--version':
result.version = true;
break;
default:
if (!arg.startsWith('--') && !result.configFile) {
result.configFile = arg;
}
break;
}
}
// Clean up empty arrays/objects
if (Object.keys(result.headers).length === 0) {
delete result.headers;
}
if (result.successCodes.length === 0) {
delete result.successCodes;
}
return result;
}
/**
* Main CLI function
*/
async function main() {
try {
const args = parseArgs();
// Handle help and version flags
if (args.help) {
printUsage();
process.exit(0);
}
if (args.version) {
printVersion();
process.exit(0);
}
// Check arguments
if (!args.configFile && !args.url) {
logger.error('Error: No configuration file or URL specified');
printUsage();
process.exit(1);
}
// Set up options
const options = {
async: !args.sync,
log: !args.quiet
};
// Run checks
if (args.url) {
logger.info(`Checking URL: ${args.url}`);
// Create a config object for the single URL check
const config = {
urls: [{
url: args.url,
timeout: args.timeout || 5000,
headers: args.headers,
successCodes: args.successCodes
}],
globalSuccessCodes: args.successCodes || [200]
};
// Use the StatusChecker directly for more control
const { StatusChecker } = await import('./checker.js');
const checker = new StatusChecker(config, { log: !args.quiet });
const results = await checker.checkAll();
const result = results[0];
if (result.success) {
logger.info(`✅ ${args.url} - Status: ${result.statusCode} - Response time: ${result.responseTime}ms`);
process.exit(0);
}
else {
logger.error(`❌ ${args.url} - Error: ${result.error} - Response time: ${result.responseTime}ms`);
process.exit(1);
}
}
else {
logger.info(`Checking URLs from configuration: ${args.configFile}`);
const results = await (0, index_1.checkUrls)(args.configFile, options);
const failedChecks = results.filter(result => !result.success);
if (failedChecks.length > 0) {
logger.error(`${failedChecks.length} of ${results.length} checks failed`);
process.exit(1);
}
else {
logger.info(`All ${results.length} checks passed`);
process.exit(0);
}
}
}
catch (error) {
const message = error instanceof Error ? error.message : String(error);
logger.error(`Error: ${message}`);
process.exit(1);
}
}
// Run the CLI
main().catch(error => {
console.error(`Unhandled error: ${error}`);
process.exit(1);
});
//# sourceMappingURL=cli.js.map