@casoon/auditmysite
Version:
A comprehensive command-line tool for automated accessibility, security, performance, and SEO testing using Playwright and pa11y, based on sitemap URLs
91 lines • 3.46 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SitemapParser = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const node_fetch_1 = __importDefault(require("node-fetch"));
const fast_xml_parser_1 = require("fast-xml-parser");
class SitemapParser {
constructor() {
this.parser = new fast_xml_parser_1.XMLParser({
ignoreAttributes: false,
attributeNamePrefix: "@_",
});
}
async parseSitemap(sitemapUrl) {
let xml;
// Lade XML von URL oder Datei
if (sitemapUrl.startsWith("http")) {
const response = await (0, node_fetch_1.default)(sitemapUrl);
if (!response.ok) {
throw new Error(`Failed to fetch sitemap: ${response.statusText}`);
}
xml = await response.text();
}
else {
xml = fs_1.default.readFileSync(path_1.default.resolve(sitemapUrl), "utf-8");
}
const parsed = this.parser.parse(xml);
const urls = [];
// Fall 1: Standard sitemap.xml Struktur
if (parsed.urlset && parsed.urlset.url) {
if (Array.isArray(parsed.urlset.url)) {
urls.push(...parsed.urlset.url.map((u) => ({
loc: u.loc,
lastmod: u.lastmod,
changefreq: u.changefreq,
priority: u.priority,
})));
}
else {
urls.push({
loc: parsed.urlset.url.loc,
lastmod: parsed.urlset.url.lastmod,
changefreq: parsed.urlset.url.changefreq,
priority: parsed.urlset.url.priority,
});
}
}
// Fall 2: Falls die URLs im #text Feld sind (wie bei Astro)
if (urls.length === 0 && parsed.urlset && parsed.urlset["#text"]) {
const textContent = parsed.urlset["#text"];
const urlMatches = textContent.match(/<loc>(.*?)<\/loc>/g);
if (urlMatches) {
urls.push(...urlMatches.map((match) => ({
loc: match.replace(/<\/?loc>/g, ""),
})));
}
}
return urls;
}
filterUrls(urls, options) {
let filtered = urls;
// Filtere nach Ausschluss-Mustern
if (options.filterPatterns) {
filtered = filtered.filter((url) => !options.filterPatterns.some((pattern) => url.loc.includes(pattern)));
}
// Filtere nach Einschluss-Mustern
if (options.includePatterns) {
filtered = filtered.filter((url) => options.includePatterns.some((pattern) => url.loc.includes(pattern)));
}
return filtered;
}
convertToLocalUrls(urls, baseUrl) {
return urls.map((url) => ({
...url,
loc: this.convertUrlToLocal(url.loc, baseUrl),
}));
}
convertUrlToLocal(url, baseUrl) {
// Extrahiere Domain aus der URL
const urlObj = new URL(url);
const domain = urlObj.origin;
// Ersetze Domain durch baseUrl
return url.replace(domain, baseUrl);
}
}
exports.SitemapParser = SitemapParser;
//# sourceMappingURL=sitemap-parser.js.map