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

140 lines 6.57 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const parsers_1 = require("./parsers"); const core_1 = require("./core"); const generators_1 = require("./generators"); const program = new commander_1.Command(); program .name("a11y-test") .description("CLI-Tool für automatische Accessibility-Tests basierend auf Sitemap") .version("1.0.0"); program .argument("<sitemap-url>", "URL zur sitemap.xml") .option("-m, --max-pages <number>", "Maximale Anzahl zu testender Seiten", "20") .option("-t, --timeout <number>", "Timeout in Millisekunden", "10000") .option("-w, --wait-until <string>", "Warten bis (domcontentloaded|load|networkidle)", "domcontentloaded") .option("-f, --filter <patterns>", "Auszuschließende URL-Muster (kommagetrennt)", "[...slug],[category],/demo/") .option("-i, --include <patterns>", "Einzuschließende URL-Muster (kommagetrennt)") .option("-v, --verbose", "Detaillierte Ausgabe") .option("--standard <standard>", "Accessibility Standard (WCAG2A|WCAG2AA|WCAG2AAA|Section508)", "WCAG2AA") .option("--include-details", "Detaillierte Informationen in Output-Datei") .option("--include-pa11y", "pa11y-Issues in Output-Datei einschließen") .option("--summary-only", "Nur Zusammenfassung ohne Seiten-Details") .action(async (sitemapUrl, options) => { const spinner = (0, ora_1.default)("Initialisiere Accessibility-Tests...").start(); try { // Parser initialisieren const parser = new parsers_1.SitemapParser(); spinner.text = "Lade Sitemap..."; // Sitemap parsen const urls = await parser.parseSitemap(sitemapUrl); spinner.text = `Sitemap geladen: ${urls.length} URLs gefunden`; // URLs filtern const filterPatterns = options.filter ? options.filter.split(",") : ["[...slug]", "[category]", "/demo/"]; const includePatterns = options.include ? options.include.split(",") : undefined; const filteredUrls = parser.filterUrls(urls, { filterPatterns, includePatterns, }); spinner.text = `URLs gefiltert: ${filteredUrls.length} URLs zum Testen`; // URLs zu lokalen URLs konvertieren (falls nötig) const baseUrl = new URL(sitemapUrl).origin; const localUrls = parser.convertToLocalUrls(filteredUrls, baseUrl); // Accessibility-Checker initialisieren const checker = new core_1.AccessibilityChecker(); await checker.initialize(); spinner.text = "Führe Accessibility-Tests aus..."; // Tests ausführen const testOptions = { maxPages: parseInt(options.maxPages), timeout: parseInt(options.timeout), waitUntil: options.waitUntil, verbose: options.verbose, pa11yStandard: options.standard, }; const results = await checker.testMultiplePages(localUrls.map((url) => url.loc), testOptions); // Zusammenfassung erstellen const summary = { totalPages: localUrls.length, testedPages: results.length, passedPages: results.filter((r) => r.passed).length, failedPages: results.filter((r) => !r.passed).length, totalErrors: results.reduce((sum, r) => sum + r.errors.length, 0), totalWarnings: results.reduce((sum, r) => sum + r.warnings.length, 0), totalDuration: results.reduce((sum, r) => sum + r.duration, 0), results, }; await checker.cleanup(); // Ergebnisse ausgeben spinner.succeed("Tests abgeschlossen!"); // Output-Datei generieren falls gewünscht if (options.output && options.output !== 'console') { spinner.text = 'Generiere Output-Datei...'; const outputGenerator = new generators_1.OutputGenerator(); const outputOptions = { format: options.output, outputFile: options.outputFile, includeDetails: options.includeDetails, includePa11yIssues: options.includePa11y, summaryOnly: options.summaryOnly }; try { const outputPath = await outputGenerator.generateOutput(summary, outputOptions); spinner.succeed(`Output-Datei erstellt: ${outputPath}`); } catch (error) { spinner.warn(`Fehler beim Erstellen der Output-Datei: ${error}`); } } displayResults(summary, options); } catch (error) { spinner.fail(`Fehler: ${error}`); process.exit(1); } }); function displayResults(summary, options) { console.log("\n" + chalk_1.default.bold.blue("🎯 Accessibility Test Zusammenfassung")); console.log(chalk_1.default.gray("─".repeat(50))); console.log(`📄 Gesamtseiten: ${summary.totalPages}`); console.log(`🧪 Getestete Seiten: ${summary.testedPages}`); console.log(`✅ Bestanden: ${chalk_1.default.green(summary.passedPages)}`); console.log(`❌ Fehlgeschlagen: ${chalk_1.default.red(summary.failedPages)}`); console.log(`⚠️ Warnungen: ${chalk_1.default.yellow(summary.totalWarnings)}`); console.log(`⏱️ Gesamtdauer: ${summary.totalDuration}ms`); if (options.verbose) { console.log("\n" + chalk_1.default.bold("📋 Detaillierte Ergebnisse:")); summary.results.forEach((result) => { const status = result.passed ? chalk_1.default.green("✅") : chalk_1.default.red("❌"); console.log(`${status} ${result.url}`); console.log(` Titel: ${result.title}`); console.log(` Dauer: ${result.duration}ms`); if (result.warnings.length > 0) { result.warnings.forEach((warning) => { console.log(` ⚠️ ${warning}`); }); } if (result.errors.length > 0) { result.errors.forEach((error) => { console.log(` ❌ ${error}`); }); } }); } if (summary.failedPages > 0) { process.exit(1); } } program.parse(); //# sourceMappingURL=index.js.map