@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
256 lines โข 13.4 kB
JavaScript
;
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.StandardPipeline = void 0;
const parsers_1 = require("../parsers");
const accessibility_1 = require("../accessibility");
const path = __importStar(require("path"));
const fs = __importStar(require("fs"));
class StandardPipeline {
/**
* Runs the standard pipeline and creates AI-friendly output files
*/
async run(options) {
const outputDir = options.outputDir || './reports';
const dateOnly = new Date().toISOString().split('T')[0]; // Date only, no timestamp
// Initialize parser
const parser = new parsers_1.SitemapParser();
// Parse sitemap
const urls = await parser.parseSitemap(options.sitemapUrl);
console.log(`๐ Sitemap loaded: ${urls.length} URLs found`);
// Filter URLs
const filterPatterns = ['[...slug]', '[category]', '/demo/'];
const filteredUrls = parser.filterUrls(urls, { filterPatterns });
console.log(`๐ URLs filtered: ${filteredUrls.length} URLs to test`);
// Convert URLs to local URLs
const baseUrl = new URL(options.sitemapUrl).origin;
const localUrls = parser.convertToLocalUrls(filteredUrls, baseUrl);
// IMPORTANT: Limit URLs to maxPages
const maxPages = options.maxPages || 20;
const limitedUrls = localUrls.slice(0, maxPages);
console.log(`๐ URLs limited to ${maxPages}: ${limitedUrls.length} URLs will be tested`);
// Initialize Accessibility Checker (with enhanced analysis if requested)
let checker;
let enhancedChecker = null;
if (options.useEnhancedAnalysis) {
console.log('๐ Initializing Enhanced Accessibility Checker...');
const { EnhancedAccessibilityChecker } = require('../accessibility/enhanced-accessibility-checker');
const { BrowserManager } = require('../browser');
enhancedChecker = new EnhancedAccessibilityChecker();
const browserManager = new BrowserManager({ headless: true, port: 9222 });
await browserManager.initialize();
await enhancedChecker.initialize(browserManager);
checker = enhancedChecker; // Use enhanced checker as the main checker
}
else {
// Create BrowserPoolManager for AccessibilityChecker
const { BrowserPoolManager } = require('../browser/browser-pool-manager');
const poolManager = new BrowserPoolManager({
maxInstances: 3,
acquireTimeout: 30000,
destroyTimeout: 5000,
headless: true
});
await poolManager.initialize();
// Create AccessibilityChecker with comprehensive analysis enabled by default
// This ensures all analysis features (Performance, SEO, Content Weight, Mobile) are available
checker = new accessibility_1.AccessibilityChecker({
poolManager,
enableComprehensiveAnalysis: true,
qualityAnalysisOptions: {
verbose: false, // Keep console output clean for CLI
includeResourceAnalysis: true,
includeSocialAnalysis: true,
includeReadabilityAnalysis: true,
includeTechnicalSEO: true,
includeMobileFriendliness: true,
analysisTimeout: 30000
}
});
await checker.initialize();
}
console.log('๐คช Running accessibility tests...');
console.log('โ๏ธ Configuration:');
if (options.useEnhancedAnalysis) {
console.log(' ๐ Enhanced Analysis Mode:');
console.log(` ๐ฆ Content Weight Analysis: ${options.contentWeightAnalysis !== false ? 'Yes' : 'No'}`);
console.log(` โก Enhanced Performance: ${options.enhancedPerformanceAnalysis !== false ? 'Yes' : 'No'}`);
console.log(` ๐ Enhanced SEO: ${options.enhancedSeoAnalysis !== false ? 'Yes' : 'No'}`);
console.log(` ๐ง Semantic Analysis: Yes`);
}
else {
console.log(' Default mode:');
console.log(' ๐ Collect performance metrics');
console.log(' ๐งช Run accessibility tests (pa11y)');
console.log(' ๐ Parallel processing');
}
console.log(' Expert mode (use --expert):');
console.log(` ๐ธ Capture screenshots: ${options.captureScreenshots ? 'Yes' : 'No'} (--screenshots)`);
console.log(` โจ๏ธ Test keyboard navigation: ${options.testKeyboardNavigation ? 'Yes' : 'No'} (--keyboard)`);
console.log(` ๐จ Test color contrast: ${options.testColorContrast ? 'Yes' : 'No'} (--contrast)`);
console.log(` ๐ฏ Test focus management: ${options.testFocusManagement ? 'Yes' : 'No'} (--focus)`);
if (options.useSequentialTesting) {
console.log(` ๐ Sequential mode: Yes (--sequential)`);
}
else {
console.log(` ๐ง Workers: ${options.maxConcurrent || 3} | Retries: ${options.maxRetries || 3} | Delay: ${options.retryDelay || 2000}ms`);
}
// Execute tests using modern AccessibilityChecker API
const pageTestOptions = {
maxPages: maxPages,
timeout: options.timeout || 10000,
pa11yStandard: options.pa11yStandard || 'WCAG2AA',
hideElements: options.hideElements,
includeNotices: options.includeNotices,
includeWarnings: options.includeWarnings,
wait: options.wait,
maxConcurrent: options.maxConcurrent
};
const multiResult = await checker.testMultiplePages(limitedUrls.map((url) => url.loc), pageTestOptions);
// Map PageTestResult[] to AccessibilityResult[] for legacy consumers
const results = multiResult.results.map(r => r.accessibilityResult);
console.log('\n๐ Creating test summary...');
// Create summary
const summary = {
totalPages: limitedUrls.length,
testedPages: results.length,
passedPages: results.filter(r => r.passed).length,
failedPages: results.filter(r => !r.passed && !r.crashed).length,
crashedPages: results.filter(r => r.crashed === true).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
};
// ๐ Create DetailedIssue array and generate Markdown report
const { DetailedIssueCollector } = require('../accessibility');
const { DetailedIssueMarkdownReport } = require('../../reports/index.js');
const detailedIssues = (DetailedIssueCollector.collectAll(results) || []);
const detailedMd = DetailedIssueMarkdownReport.generate(detailedIssues || []);
const detailedMdPath = path.join(outputDir, `detailed-issues-${dateOnly}.md`);
fs.writeFileSync(detailedMdPath, detailedMd, 'utf8');
// Cleanup checkers
if (enhancedChecker) {
await enhancedChecker.cleanup();
}
await checker.cleanup();
console.log('๐ Generating output files...');
// Generate output files
const outputFiles = [];
// Fix: Always add detailed-issues.md to output files list first
outputFiles.push(detailedMdPath);
// Collect issues for reports
const { PerformanceIssueCollector } = require('../performance');
let allIssues = [];
allIssues = allIssues.concat(DetailedIssueCollector.collectAll(results) || []);
allIssues = allIssues.concat(PerformanceIssueCollector.collectAll(summary) || []);
// Choose between Markdown and HTML output
if (options.outputFormat === 'html') {
console.log(' ๐ Generating HTML report...');
const { HTMLGenerator } = require('../../generators/html-generator');
const generator = new HTMLGenerator();
// Prepare audit data structure (similar to CLI format)
const auditData = {
metadata: {
version: '1.0.0',
timestamp: new Date().toISOString(),
sitemapUrl: options.sitemapUrl,
toolVersion: '2.0.0-alpha.1',
duration: summary.totalDuration
},
summary: {
totalPages: summary.totalPages,
testedPages: summary.testedPages,
passedPages: summary.passedPages,
failedPages: summary.failedPages,
crashedPages: summary.crashedPages,
totalErrors: summary.totalErrors,
totalWarnings: summary.totalWarnings
},
pages: summary.results.map(result => ({
url: result.url,
title: result.title,
status: result.passed ? 'passed' : (result.crashed ? 'crashed' : 'failed'),
duration: result.duration || 0,
accessibility: {
score: result.pa11yScore || 0,
errors: result.errors || [],
warnings: result.warnings || [],
notices: result.pa11yIssues?.filter(issue => issue.type === 'notice') || []
},
// Enhanced analysis placeholders (will be populated when enhanced analysis is enabled)
performance: result.performanceMetrics ? {
score: 75,
coreWebVitals: {
largestContentfulPaint: result.performanceMetrics.largestContentfulPaint || 0,
firstContentfulPaint: result.performanceMetrics.firstContentfulPaint || 0,
cumulativeLayoutShift: result.performanceMetrics.cumulativeLayoutShift || 0,
timeToFirstByte: result.performanceMetrics.timeToFirstByte || 0
}
} : undefined,
// Note: SEO and mobile data will be available when enhanced analysis is used
seo: undefined,
mobileFriendliness: undefined
}))
};
const htmlContent = await generator.generate(auditData);
const htmlPath = path.join(outputDir, `accessibility-report-${dateOnly}.html`);
fs.writeFileSync(htmlPath, htmlContent, 'utf8');
outputFiles.push(htmlPath);
}
else {
// Generate Markdown reports (default)
const { OutputGenerator } = require('../../generators/index.js');
const { generateMarkdownReport } = require('../../generators/index.js');
const outputGenerator = new OutputGenerator();
// Main accessibility report
const timestamp = new Date().toISOString();
const { prepareOutputData } = require('../../generators/output-generator');
const mdData = prepareOutputData(summary, timestamp, { includeDetails: true, summaryOnly: false });
const qualityMd = generateMarkdownReport(mdData);
const qualityMdPath = path.join(outputDir, `accessibility-quality-report-${dateOnly}.md`);
fs.writeFileSync(qualityMdPath, qualityMd, 'utf8');
outputFiles.push(qualityMdPath);
}
// Performance data is now integrated into HTML reports
// No separate markdown files needed
return {
summary,
outputFiles
};
}
}
exports.StandardPipeline = StandardPipeline;
//# sourceMappingURL=standard-pipeline.js.map