UNPKG

@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
"use strict"; 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