UNPKG

@casoon/auditmysite

Version:

Professional website analysis suite with robust accessibility testing, Core Web Vitals performance monitoring, SEO analysis, and content optimization insights. Features isolated browser contexts, retry mechanisms, and comprehensive API endpoints for profe

312 lines 10.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.TestQueue = void 0; const fs = __importStar(require("fs")); class TestQueue { constructor(options = {}) { this.queue = []; this.completed = []; this.failed = []; this.options = { maxRetries: 3, maxConcurrent: 1, saveInterval: 5000, // 5 Sekunden dataFile: './test-queue-data.json', priorityPatterns: [ { pattern: '/home', priority: 1 }, { pattern: '/', priority: 2 }, { pattern: '/about', priority: 3 }, { pattern: '/contact', priority: 3 }, { pattern: '/blog', priority: 4 }, { pattern: '/products', priority: 4 } ], ...options }; this.dataFile = this.options.dataFile; this.loadQueue(); this.startAutoSave(); } /** * URLs zur Queue hinzufügen */ addUrls(urls) { const newUrls = urls.map(url => ({ url, priority: this.calculatePriority(url), status: 'pending', attempts: 0 })); // Duplikate entfernen const existingUrls = new Set(this.queue.map(item => item.url)); const uniqueNewUrls = newUrls.filter(item => !existingUrls.has(item.url)); this.queue.push(...uniqueNewUrls); // Nach Priorität sortieren this.queue.sort((a, b) => a.priority - b.priority); console.log(`📋 Added ${uniqueNewUrls.length} URLs to queue (${this.queue.length} total)`); } /** * Nächste URL aus der Queue holen */ getNextUrl() { const pendingUrl = this.queue.find(item => item.status === 'pending'); if (!pendingUrl) return null; pendingUrl.status = 'in-progress'; pendingUrl.attempts++; pendingUrl.lastAttempt = new Date(); return pendingUrl; } /** * URL als abgeschlossen markieren */ markCompleted(url, result) { const item = this.queue.find(item => item.url === url); if (item) { item.status = 'completed'; item.result = result; this.completed.push(item); this.queue = this.queue.filter(item => item.url !== url); } } /** * URL als fehlgeschlagen markieren */ markFailed(url, error) { const item = this.queue.find(item => item.url === url); if (item) { if (item.attempts >= this.options.maxRetries) { item.status = 'failed'; item.error = error; this.failed.push(item); this.queue = this.queue.filter(item => item.url !== url); console.log(`❌ URL failed permanently: ${url} (${error})`); } else { item.status = 'pending'; item.error = error; console.log(`🔄 URL will be retried: ${url} (attempt ${item.attempts}/${this.options.maxRetries})`); } } } /** * URL überspringen */ markSkipped(url, reason) { const item = this.queue.find(item => item.url === url); if (item) { item.status = 'skipped'; item.error = reason || 'Skipped by user'; this.queue = this.queue.filter(item => item.url !== url); } } /** * Queue-Status abrufen */ getStatus() { const total = this.queue.length + this.completed.length + this.failed.length; const pending = this.queue.filter(item => item.status === 'pending').length; const inProgress = this.queue.filter(item => item.status === 'in-progress').length; const completed = this.completed.length; const failed = this.failed.length; const skipped = this.queue.filter(item => item.status === 'skipped').length; const progress = total > 0 ? ((completed + failed) / total) * 100 : 0; return { total, pending, inProgress, completed, failed, skipped, progress: Math.round(progress) }; } /** * Queue speichern */ saveQueue() { try { const data = { queue: this.queue, completed: this.completed, failed: this.failed, timestamp: new Date().toISOString(), // 🆕 Parameter mit speichern testParameters: this.options.testParameters }; fs.writeFileSync(this.dataFile, JSON.stringify(data, null, 2)); console.log(`💾 Queue saved to ${this.dataFile}`); } catch (error) { console.error(`💥 Failed to save queue: ${error}`); } } /** * Queue laden */ loadQueue() { try { if (fs.existsSync(this.dataFile)) { const data = JSON.parse(fs.readFileSync(this.dataFile, 'utf8')); // 🆕 Parameter-Validierung if (this.options.testParameters && data.testParameters) { const isValid = this.validateParameters(data.testParameters); if (!isValid) { console.log(`⚠️ Queue parameters changed, creating new queue...`); this.clearQueueFile(); return; } } this.queue = data.queue || []; this.completed = data.completed || []; this.failed = data.failed || []; // In-Progress URLs zurücksetzen this.queue.forEach(item => { if (item.status === 'in-progress') { item.status = 'pending'; } }); console.log(`📋 Loaded queue: ${this.queue.length} pending, ${this.completed.length} completed, ${this.failed.length} failed`); } } catch (error) { console.error(`💥 Failed to load queue: ${error}`); } } /** * Parameter validieren */ validateParameters(savedParameters) { if (!this.options.testParameters) return false; const current = this.options.testParameters; const saved = savedParameters; // Kritische Parameter vergleichen return (current.sitemapUrl === saved.sitemapUrl && current.maxPages === saved.maxPages && current.pa11yStandard === saved.pa11yStandard && current.timeout === saved.timeout && current.collectPerformanceMetrics === saved.collectPerformanceMetrics && current.generateDetailedReport === saved.generateDetailedReport && current.generatePerformanceReport === saved.generatePerformanceReport && current.generateSeoReport === saved.generateSeoReport); } /** * Queue-Datei löschen */ clearQueueFile() { try { if (fs.existsSync(this.dataFile)) { fs.unlinkSync(this.dataFile); console.log(`🗑️ Deleted invalid queue file: ${this.dataFile}`); } } catch (error) { console.error(`💥 Failed to delete queue file: ${error}`); } } /** * Auto-Save starten */ startAutoSave() { this.saveTimer = setInterval(() => { this.saveQueue(); }, this.options.saveInterval); } /** * Auto-Save stoppen */ stopAutoSave() { if (this.saveTimer) { clearInterval(this.saveTimer); this.saveTimer = undefined; } } /** * Priorität für URL berechnen */ calculatePriority(url) { const pattern = this.options.priorityPatterns.find(p => url.includes(p.pattern)); return pattern ? pattern.priority : 10; // Standard-Priorität } /** * Queue leeren */ clear() { this.queue = []; this.completed = []; this.failed = []; this.saveQueue(); } /** * Queue-Datei nach erfolgreichem Abschluss löschen */ cleanup() { try { if (fs.existsSync(this.dataFile)) { fs.unlinkSync(this.dataFile); console.log(`🧹 Cleaned up queue file: ${this.dataFile}`); } } catch (error) { console.error(`💥 Failed to cleanup queue file: ${error}`); } } /** * Fehlgeschlagene URLs erneut versuchen */ retryFailed() { const failedUrls = this.failed.map(item => item.url); this.failed = []; this.addUrls(failedUrls); console.log(`🔄 Added ${failedUrls.length} failed URLs back to queue`); } /** * Queue-Statistiken anzeigen */ showStats() { const status = this.getStatus(); console.log(`\n📊 Queue Statistics:`); console.log(` 📋 Total URLs: ${status.total}`); console.log(` ⏳ Pending: ${status.pending}`); console.log(` 🔄 In Progress: ${status.inProgress}`); console.log(` ✅ Completed: ${status.completed}`); console.log(` ❌ Failed: ${status.failed}`); console.log(` ⏭️ Skipped: ${status.skipped}`); console.log(` 📈 Progress: ${status.progress}%`); } } exports.TestQueue = TestQueue; //# sourceMappingURL=test-queue.js.map