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

256 lines โ€ข 13.4 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.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