blob: 2f76ff4b7647d1dd793e0ca9b114ebc999b9988b [file] [log] [blame]
const CWD = process.cwd();
const path = require('path');
const fs = require('fs');
const docsDir = path.join(CWD, '../', 'docs');
test('markdown doc links', async () => {
const docsDir = path.join(CWD, '../', 'docs');
const pages = new Set();
// collect all doc pages
fs.readdirSync(docsDir).forEach(file => {
if (file.endsWith('.md')) {
pages.add(file);
}
});
const mdBrokenLinks = []
pages.forEach(page => {
const pageFile = path.join(docsDir, page)
const mdLinks = getPageMDLinks(pageFile);
const brokenLinks = []
new Set(mdLinks).forEach(link => {
if (!pages.has(link)) {
brokenLinks.push(link);
}
})
if (brokenLinks.length > 0) {
mdBrokenLinks.push({page: page, brokenLinks: brokenLinks})
}
})
// did we find some broken links?
if (mdBrokenLinks.length > 0) {
const brokenLinksJson = JSON.stringify(mdBrokenLinks, null, 2);
const errorMessage = `Found the following broken links in docs pages:\n${brokenLinksJson}`
console.log(errorMessage);
expect(mdBrokenLinks.length).toBe(0)
}
})
function getPageMDLinks(file) {
if (!fs.existsSync(file)) {
return [];
}
const content = fs.readFileSync(file, 'utf8');
const mdLinks = [];
// find any inline-style links to markdown files
const linkRegex = /(?:\]\()(?:\.\/)?([^'")\]\s>]+\.md)/g;
let linkMatch = linkRegex.exec(content);
while (linkMatch !== null) {
const link = linkMatch[1]
// we are only checking links to other docs in this test
if (!link.startsWith('http')) {
mdLinks.push(linkMatch[1]);
}
linkMatch = linkRegex.exec(content);
}
return mdLinks;
}