@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
JavaScript
"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