awesome-free-apps/validate.js
2024-12-16 18:06:15 +06:00

81 lines
2.4 KiB
JavaScript

const fs = require('fs');
const http = require('http');
const https = require('https');
const RED = "\x1b[31m";
const GREEN = "\x1b[32m";
const RESET = "\x1b[0m";
function extractLinks(markdown) {
const linkRegex = /\[.*?\]\((https?:\/\/.*?)\)/g;
const links = [];
let match;
while ((match = linkRegex.exec(markdown)) !== null) {
links.push(match[1]);
}
return links;
}
function checkLink(url) {
return new Promise((resolve) => {
const client = url.startsWith('https') ? https : http;
client
.get(url, (res) => {
resolve({ url, statusCode: res.statusCode });
})
.on('error', () => {
resolve({ url, statusCode: 404 });
});
});
}
async function main() {
try {
const markdown = fs.readFileSync('README.md', 'utf-8');
const links = extractLinks(markdown);
console.log(`Found ${links.length} links in README.md.`);
const failedLinks = [];
for (const link of links) {
const { url, statusCode } = await checkLink(link);
if (statusCode === 404) {
console.log(`${RED}404 Not Found:${RESET} ${url}`);
failedLinks.push(url);
} else {
console.log(`${GREEN}200 OK:${RESET} ${url}`);
}
}
if (failedLinks.length > 0) {
console.log("\n-----------------------------\n");
console.log("Double-checking failed links...");
const doubleCheckedFailedLinks = [];
for (const link of failedLinks) {
const { url, statusCode } = await checkLink(link);
if (statusCode === 404) {
doubleCheckedFailedLinks.push(url);
} else {
console.log(`${GREEN}200 OK (after retry):${RESET} ${url}`);
}
}
if (doubleCheckedFailedLinks.length > 0) {
console.log("\n-----------------------------\n");
console.log("The following links failed after double-checking:");
doubleCheckedFailedLinks.forEach((url) => {
console.log(`${RED}${url}${RESET}`);
});
} else {
console.log("\nAll links are working!");
}
}
} catch (err) {
console.error('Error:', err.message);
}
}
main();