@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
397 lines • 14.9 kB
JavaScript
"use strict";
/**
* 🔧 AuditMySite SDK
*
* Main SDK class providing a fluent, chainable API for programmatic
* accessibility testing. Designed for easy integration into any Node.js application.
*/
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.AuditSDK = void 0;
const events_1 = require("events");
const uuid_1 = require("uuid");
const types_1 = require("./types");
const standard_pipeline_1 = require("../core/pipeline/standard-pipeline");
// Report system imports removed
const config_manager_1 = require("../core/config/config-manager");
const path = __importStar(require("path"));
class AuditSDK extends events_1.EventEmitter {
// Report system removed - using direct generation
constructor(config = {}) {
super();
this.config = this.mergeConfig(config);
this.configManager = new config_manager_1.ConfigManager();
// Report system initialization removed
// Set default max listeners for heavy event usage
this.setMaxListeners(50);
}
/**
* Create a new audit builder for fluent configuration
*/
audit() {
return new FluentAuditBuilder(this);
}
/**
* Quick audit method for simple use cases
*/
async quickAudit(sitemapUrl, options = {}, callbacks) {
const builder = this.audit()
.sitemap(sitemapUrl);
// Apply options
if (options.maxPages)
builder.maxPages(options.maxPages);
if (options.standard)
builder.standard(options.standard);
if (options.formats)
builder.formats(options.formats);
if (options.outputDir)
builder.outputDir(options.outputDir);
if (options.includePerformance)
builder.includePerformance();
if (options.includeSeo)
builder.includeSeo();
if (options.includeSecurity)
builder.includeSecurity();
if (options.viewport) {
builder.viewport(options.viewport.width, options.viewport.height, options.viewport.isMobile);
}
// Apply callbacks
if (callbacks) {
if (callbacks.onStart)
builder.on('audit:start', callbacks.onStart);
if (callbacks.onProgress)
builder.on('audit:progress', callbacks.onProgress);
if (callbacks.onPageStart)
builder.on('audit:page:start', callbacks.onPageStart);
if (callbacks.onPageComplete)
builder.on('audit:page:complete', callbacks.onPageComplete);
if (callbacks.onPageError)
builder.on('audit:page:error', callbacks.onPageError);
if (callbacks.onComplete)
builder.on('audit:complete', callbacks.onComplete);
if (callbacks.onError)
builder.on('audit:error', callbacks.onError);
if (callbacks.onReportStart)
builder.on('report:start', callbacks.onReportStart);
if (callbacks.onReportComplete)
builder.on('report:complete', callbacks.onReportComplete);
}
return builder.run();
}
/**
* Update SDK configuration
*/
configure(config) {
this.config = this.mergeConfig(config);
return this;
}
/**
* Get current SDK configuration
*/
getConfig() {
return { ...this.config };
}
/**
* Get SDK version
*/
getVersion() {
return require('../../package.json').version;
}
/**
* Test connection to sitemap
*/
async testConnection(sitemapUrl) {
try {
const { SitemapDiscovery } = await Promise.resolve().then(() => __importStar(require('../core/parsers/sitemap-discovery')));
const discovery = new SitemapDiscovery();
const result = await discovery.discoverSitemap(sitemapUrl);
return { success: result.found };
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : String(error)
};
}
}
mergeConfig(config) {
return {
timeout: 30000,
maxConcurrency: 3,
defaultOutputDir: './audit-results',
verbose: false,
userAgent: `AuditMySite-SDK/${this.getVersion()}`,
...config
};
}
emitEvent(type, data, sessionId) {
const event = {
type,
timestamp: new Date(),
data,
sessionId
};
this.emit(type, event);
this.emit('event', event);
}
}
exports.AuditSDK = AuditSDK;
/**
* Fluent builder implementation for chainable audit configuration
*/
class FluentAuditBuilder {
constructor(sdk) {
this.sdk = sdk;
this.options = {};
this.sitemapUrl = '';
this.callbacks = new Map();
}
sitemap(url) {
this.validateSitemapUrl(url);
this.sitemapUrl = url;
return this;
}
maxPages(count) {
if (count < 1 || count > 10000) {
throw new types_1.ConfigurationError('maxPages must be between 1 and 10000');
}
this.options.maxPages = count;
return this;
}
standard(standard) {
this.options.standard = standard;
return this;
}
formats(formats) {
if (!Array.isArray(formats) || formats.length === 0) {
throw new types_1.ConfigurationError('formats must be a non-empty array');
}
this.options.formats = formats;
return this;
}
outputDir(dir) {
this.options.outputDir = dir;
return this;
}
includePerformance(include = true) {
this.options.includePerformance = include;
return this;
}
includeSeo(include = true) {
this.options.includeSeo = include;
return this;
}
includeSecurity(include = true) {
this.options.includeSecurity = include;
return this;
}
viewport(width, height, mobile) {
this.options.viewport = {
width,
height,
isMobile: mobile || false
};
return this;
}
timeout(ms) {
if (ms < 1000 || ms > 300000) {
throw new types_1.ConfigurationError('timeout must be between 1000ms and 300000ms');
}
this.sdk.configure({ timeout: ms });
return this;
}
on(event, callback) {
if (!this.callbacks.has(event)) {
this.callbacks.set(event, []);
}
this.callbacks.get(event).push(callback);
return this;
}
async run() {
if (!this.sitemapUrl) {
throw new types_1.ConfigurationError('sitemap URL is required');
}
const sessionId = (0, uuid_1.v4)();
const startTime = new Date();
// Register callbacks
this.callbacks.forEach((callbacks, event) => {
callbacks.forEach(callback => {
this.sdk.on(event, callback);
});
});
try {
// Emit start event
this.sdk.emit('audit:start', {
type: 'audit:start',
timestamp: startTime,
data: { sessionId, sitemapUrl: this.sitemapUrl, options: this.options },
sessionId
});
// Merge options with defaults
const finalOptions = this.mergeWithDefaults();
// Run the audit
const pipeline = new standard_pipeline_1.StandardPipeline();
const pipelineResult = await pipeline.run({
sitemapUrl: this.sitemapUrl,
maxPages: finalOptions.maxPages,
pa11yStandard: finalOptions.standard,
outputDir: finalOptions.outputDir,
generatePerformanceReport: finalOptions.includePerformance,
// generateSeoReport: finalOptions.includeSeo, // Removed for compatibility
// generateSecurityReport: finalOptions.includeSecurity, // Removed - not supported in StandardPipelineOptions
// usePa11y: finalOptions.usePa11y, // Removed - not in StandardPipelineOptions
timeout: this.sdk.getConfig().timeout,
maxConcurrent: this.sdk.getConfig().maxConcurrency,
// verbose: this.sdk.getConfig().verbose, // Not in StandardPipelineOptions
// Modern queue system is default
// timestamp: startTime.toISOString(), // Not in StandardPipelineOptions
// onProgress callback removed - not supported in StandardPipelineOptions
});
// Generate reports if formats specified
const reports = await this.generateReports(pipelineResult, finalOptions, sessionId);
const endTime = new Date();
const result = {
sessionId,
sitemapUrl: this.sitemapUrl,
startTime,
endTime,
duration: endTime.getTime() - startTime.getTime(),
summary: pipelineResult.summary,
results: (pipelineResult.summary.results || []).map((result) => ({
...result,
timestamp: result.timestamp || new Date().toISOString()
})),
reports,
metadata: {
version: this.sdk.getVersion(),
environment: process.env.NODE_ENV || 'development',
userAgent: this.sdk.getConfig().userAgent || '',
configuration: finalOptions
}
};
// Emit complete event
this.sdk.emit('audit:complete', {
type: 'audit:complete',
timestamp: endTime,
data: result,
sessionId
});
return result;
}
catch (error) {
// Emit error event
this.sdk.emit('audit:error', {
type: 'audit:error',
timestamp: new Date(),
data: error,
sessionId
});
throw error instanceof types_1.AuditSDKError ? error : new types_1.AuditSDKError(error instanceof Error ? error.message : String(error), 'AUDIT_FAILED', error);
}
finally {
// Clean up callbacks
this.callbacks.forEach((callbacks, event) => {
callbacks.forEach(callback => {
this.sdk.removeListener(event, callback);
});
});
}
}
validateSitemapUrl(url) {
try {
new URL(url);
}
catch {
throw new types_1.InvalidSitemapError(url, 'Invalid URL format');
}
if (!url.startsWith('http://') && !url.startsWith('https://')) {
throw new types_1.InvalidSitemapError(url, 'URL must use HTTP or HTTPS protocol');
}
}
mergeWithDefaults() {
const config = this.sdk.getConfig();
return {
// Basic options
maxPages: this.options.maxPages || 10,
standard: this.options.standard || 'WCAG2AA',
formats: this.options.formats || ['html'],
outputDir: this.options.outputDir || config.defaultOutputDir || './audit-results',
// Legacy compatibility flags (backward compatibility)
includePerformance: this.options.includePerformance ?? (this.options.performance ?? true),
includeSeo: this.options.includeSeo ?? (this.options.seo ?? true),
includeSecurity: this.options.includeSecurity ?? false,
// New unified feature flags (enhanced methods are default in Standard)
accessibility: this.options.accessibility ?? true,
performance: this.options.performance ?? true,
seo: this.options.seo ?? true,
contentWeight: this.options.contentWeight ?? true,
reduced: this.options.reduced ?? false,
includeRecommendations: this.options.includeRecommendations ?? true,
// Technical options
usePa11y: this.options.usePa11y ?? true,
pa11yOptions: this.options.pa11yOptions || {},
performanceBudget: this.options.performanceBudget || {},
viewport: this.options.viewport || {
width: 1920,
height: 1080,
deviceScaleFactor: 1,
isMobile: false
}
};
}
calculateETA(current, total, startTime) {
if (current === 0)
return 0;
const elapsed = Date.now() - startTime.getTime();
const avgTimePerPage = elapsed / current;
const remaining = total - current;
return Math.round(remaining * avgTimePerPage);
}
async generateReports(pipelineResult, options, sessionId) {
if (!options.formats || options.formats.length === 0) {
return [];
}
// Report generation simplified - using pipeline output directly
// Return pipeline output files as reports
const reports = (pipelineResult.outputFiles || []).map((filePath) => ({
format: path.extname(filePath).slice(1),
path: filePath,
size: 0, // Size calculation can be added later
metadata: {}
}));
return reports;
}
}
//# sourceMappingURL=audit-sdk.js.map