arda-site-scan
Version:
A standalone CLI tool for comprehensive website analysis including screenshots, SEO, and accessibility testing using Playwright
189 lines • 8.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SessionManager = void 0;
const fs_1 = require("fs");
const path_1 = __importDefault(require("path"));
const validation_js_1 = require("./validation.js");
const test_output_handler_js_1 = require("./test-output-handler.js");
const test_output_types_js_1 = require("../types/test-output-types.js");
class SessionManager {
outputDir = 'arda-site-scan-sessions';
outputHandler;
constructor() {
this.outputHandler = new test_output_handler_js_1.StandardTestOutputHandler(this.outputDir);
}
createSessionId() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
return `${month}-${day}-${year}_${hours}-${minutes}`;
}
async createSessionDirectory(sessionId) {
const sessionPath = path_1.default.join(this.outputDir, sessionId);
await fs_1.promises.mkdir(sessionPath, { recursive: true });
}
async createPageDirectory(sessionId, pageName) {
const pagePath = path_1.default.join(this.outputDir, sessionId, pageName);
await fs_1.promises.mkdir(pagePath, { recursive: true });
// Create subdirectories for different test types
await fs_1.promises.mkdir(path_1.default.join(pagePath, 'screenshots'), { recursive: true });
await fs_1.promises.mkdir(path_1.default.join(pagePath, 'scans'), { recursive: true });
return pagePath;
}
getPageName(url) {
return (0, validation_js_1.sanitizePageName)(url);
}
getPagePath(sessionId, pageName) {
return path_1.default.join(this.outputDir, sessionId, pageName);
}
getScreenshotPath(sessionId, pageName, viewportName) {
return path_1.default.join(this.outputDir, sessionId, pageName, 'screenshots', `${pageName}-${viewportName}.png`);
}
getScanPath(sessionId, pageName, scanType) {
return path_1.default.join(this.outputDir, sessionId, pageName, 'scans', `${pageName}-${scanType}.md`);
}
async savePageSummary(sessionId, pageResult) {
const pagePath = await this.createPageDirectory(sessionId, pageResult.pageName);
const summaryPath = path_1.default.join(pagePath, `${pageResult.pageName}-summary.md`);
const summaryContent = this.generatePageSummaryMarkdown(pageResult);
await fs_1.promises.writeFile(summaryPath, summaryContent, 'utf8');
}
async generateSessionSummary(summary, pageResults) {
const sessionPath = path_1.default.join(this.outputDir, summary.sessionId);
const summaryPath = path_1.default.join(sessionPath, 'session-summary.md');
const summaryContent = this.generateSessionSummaryMarkdown(summary, pageResults);
await fs_1.promises.writeFile(summaryPath, summaryContent, 'utf8');
}
generatePageSummaryMarkdown(pageResult) {
const successCount = pageResult.tests.filter(t => t.status === 'success').length;
const failCount = pageResult.tests.filter(t => t.status === 'failed').length;
let markdown = `# Page Test Summary: ${pageResult.pageName}\n\n`;
markdown += `**URL:** ${pageResult.url}\n`;
markdown += `**Tests Completed:** ${pageResult.tests.length}\n`;
markdown += `**Successful:** ${successCount}\n`;
markdown += `**Failed:** ${failCount}\n\n`;
markdown += `## Test Results\n\n`;
for (const test of pageResult.tests) {
const status = test.status === 'success' ? '✅' : '❌';
const duration = test.endTime && test.startTime
? Math.round((test.endTime.getTime() - test.startTime.getTime()) / 1000)
: 0;
markdown += `### ${status} ${test.testType}\n`;
markdown += `- **Status:** ${test.status}\n`;
markdown += `- **Duration:** ${duration}s\n`;
if (test.outputPath) {
markdown += `- **Output:** [${path_1.default.basename(test.outputPath)}](${test.outputPath})\n`;
}
if (test.error) {
markdown += `- **Error:** ${test.error}\n`;
}
markdown += '\n';
}
return markdown;
}
generateSessionSummaryMarkdown(summary, pageResults) {
const duration = summary.endTime
? Math.round((summary.endTime.getTime() - summary.startTime.getTime()) / 1000)
: 0;
let markdown = `# Test Session Summary\n\n`;
markdown += `**Session ID:** ${summary.sessionId}\n`;
markdown += `**URL:** ${summary.url}\n`;
markdown += `**Start Time:** ${summary.startTime.toISOString()}\n`;
markdown += `**End Time:** ${summary.endTime?.toISOString() || 'N/A'}\n`;
markdown += `**Duration:** ${duration}s\n\n`;
markdown += `## Overview\n\n`;
markdown += `- **Pages Tested:** ${summary.totalPages}\n`;
markdown += `- **Total Tests:** ${summary.testsRun}\n`;
markdown += `- **Successful Tests:** ${summary.testsSucceeded}\n`;
markdown += `- **Failed Tests:** ${summary.testsFailed}\n`;
markdown += `- **Success Rate:** ${summary.testsRun > 0 ? Math.round((summary.testsSucceeded / summary.testsRun) * 100) : 0}%\n\n`;
if (summary.errors.length > 0) {
markdown += `## Errors\n\n`;
for (const error of summary.errors) {
markdown += `- ${error}\n`;
}
markdown += '\n';
}
markdown += `## Page Results\n\n`;
for (const pageResult of pageResults) {
const successCount = pageResult.tests.filter(t => t.status === 'success').length;
const failCount = pageResult.tests.filter(t => t.status === 'failed').length;
const status = failCount === 0 ? '✅' : '❌';
markdown += `### ${status} ${pageResult.pageName}\n`;
markdown += `- **URL:** ${pageResult.url}\n`;
markdown += `- **Tests:** ${pageResult.tests.length} (${successCount} passed, ${failCount} failed)\n`;
markdown += `- **Details:** [${pageResult.pageName}-summary.md](${pageResult.pageName}/${pageResult.pageName}-summary.md)\n\n`;
}
return markdown;
}
/**
* Generate standardized output path for a test using the new output system
*/
generateOutputPath(sessionId, testType, context) {
const config = test_output_types_js_1.OUTPUT_CONFIGURATIONS[testType];
if (!config) {
throw new Error(`No output configuration found for test type: ${testType}`);
}
return this.outputHandler.generateOutputPath(sessionId, testType, config, context);
}
/**
* Save test output using the standardized output handler
*/
async saveTestOutput(content, sessionId, testType, context) {
const config = test_output_types_js_1.OUTPUT_CONFIGURATIONS[testType];
if (!config) {
return {
success: false,
error: `No output configuration found for test type: ${testType}`
};
}
const outputPath = this.generateOutputPath(sessionId, testType, context);
const result = await this.outputHandler.saveOutput(content, outputPath, config);
return {
success: result.success,
outputPath: result.outputPath,
error: result.error
};
}
/**
* Get the output handler for direct access when needed
*/
getOutputHandler() {
return this.outputHandler;
}
/**
* Create a standardized test result using the output system
*/
createStandardTestResult(testType, status = 'pending', outputPath, error) {
const config = test_output_types_js_1.OUTPUT_CONFIGURATIONS[testType];
return {
testType,
status,
startTime: new Date(),
endTime: status !== 'pending' ? new Date() : undefined,
outputPath,
outputType: config?.type,
error
};
}
/**
* Filter test results by output type for better organization
*/
filterTestResultsByOutputType(results, outputType) {
return test_output_handler_js_1.StandardTestOutputHandler.filterResultsByOutputType(results, outputType);
}
/**
* Group per-page test results by page for organized reporting
*/
groupPerPageResultsByPage(results) {
return test_output_handler_js_1.StandardTestOutputHandler.groupPerPageResultsByPage(results);
}
}
exports.SessionManager = SessionManager;
//# sourceMappingURL=session-manager.js.map