mocha-multiple-sessions-detailed-runner
Version:
High-level API for multi-session Mocha tests with detailed reporting
1 lines • 80.6 kB
Source Map (JSON)
{"version":3,"file":"multi-session-detailed-runner.mjs","sources":["../../src/impl/repositories/session-meta-repository.ts","../../src/impl/repositories/report-repository.ts","../../src/impl/events/unified-event-bus.ts","../../src/impl/infrastructure/mocha-integration.ts","../../src/impl/services/report-service.ts","../../src/impl/use-cases/runner-use-cases.ts","../../src/impl/multi-session-detailed-runner.ts","../../src/impl/factory.ts"],"sourcesContent":["import type { ISessionMetaRepository, ExecutionSummary } from '../../interfaces/repositories/session-meta-repository';\r\nimport type { SessionMeta, SessionState } from '../../interfaces/core/types';\r\n\r\nexport class SessionMetaRepository implements ISessionMetaRepository {\r\n private sessions = new Map<string, SessionMeta>();\r\n\r\n save(sessionMeta: SessionMeta): void {\r\n this.sessions.set(sessionMeta.label, sessionMeta);\r\n }\r\n\r\n findByLabel(label: string): SessionMeta | null {\r\n return this.sessions.get(label) || null;\r\n }\r\n\r\n findAll(): SessionMeta[] {\r\n return Array.from(this.sessions.values());\r\n }\r\n\r\n delete(label: string): boolean {\r\n return this.sessions.delete(label);\r\n }\r\n\r\n clear(): void {\r\n this.sessions.clear();\r\n }\r\n\r\n exists(label: string): boolean {\r\n return this.sessions.has(label);\r\n }\r\n\r\n updateState(label: string, state: Partial<SessionState>): void {\r\n const session = this.sessions.get(label);\r\n if (session) {\r\n Object.assign(session, state);\r\n }\r\n }\r\n\r\n getStates(): Record<string, SessionState> {\r\n const states: Record<string, SessionState> = {};\r\n this.sessions.forEach((meta, label) => {\r\n states[label] = {\r\n label: meta.label,\r\n status: meta.status,\r\n ...(meta.timestamp && { timestamp: meta.timestamp }),\r\n ...(meta.duration && { duration: meta.duration })\r\n };\r\n });\r\n return states;\r\n }\r\n\r\n markAsRunning(label: string): void {\r\n this.updateState(label, { status: 'running', timestamp: new Date() });\r\n }\r\n\r\n markAsCompleted(label: string, result: any): void {\r\n this.updateState(label, { \r\n status: 'passed', \r\n timestamp: new Date(),\r\n duration: result.duration\r\n });\r\n }\r\n\r\n markAsFailed(label: string, error: Error): void {\r\n const session = this.sessions.get(label);\r\n if (session) {\r\n session.status = 'failed';\r\n session.error = error;\r\n session.timestamp = new Date();\r\n }\r\n }\r\n\r\n getByStatus(status: SessionState['status']): SessionMeta[] {\r\n return this.findAll().filter(session => session.status === status);\r\n }\r\n\r\n getExecutionSummary(): ExecutionSummary {\r\n const all = this.findAll();\r\n const lastExecutionTime = all.reduce((latest, session) => {\r\n if (session.timestamp && (!latest || session.timestamp > latest)) {\r\n return session.timestamp;\r\n }\r\n return latest;\r\n }, undefined as Date | undefined);\r\n\r\n return {\r\n totalSessions: all.length,\r\n readySessions: all.filter(s => s.status === 'ready').length,\r\n runningSessions: all.filter(s => s.status === 'running').length,\r\n completedSessions: all.filter(s => s.status === 'passed').length,\r\n failedSessions: all.filter(s => s.status === 'failed').length,\r\n ...(lastExecutionTime && { lastExecutionTime })\r\n };\r\n }\r\n}\r\n","import type { IReportRepository, ReportMetadata } from '../../interfaces/repositories/report-repository';\r\n\r\nexport class ReportRepository implements IReportRepository {\r\n private readonly PREFIX = 'mochaSession__';\r\n\r\n generateResultKey(sessionLabel: string): string {\r\n return `${this.PREFIX}${sessionLabel.replace(/\\s+/g, '_').replace(/-/g, '_')}`;\r\n }\r\n\r\n getReportData(resultKey: string): any | null {\r\n return this.getWindowVariable(resultKey);\r\n }\r\n\r\n hasReport(resultKey: string): boolean {\r\n return this.getWindowVariable(resultKey) !== undefined;\r\n }\r\n\r\n clearReport(resultKey: string): void {\r\n this.deleteWindowVariable(resultKey);\r\n }\r\n\r\n getAllReports(): Record<string, any> {\r\n const reports: Record<string, any> = {};\r\n \r\n // Get all window variables that match our prefix\r\n for (const key in window) {\r\n if (key.startsWith(this.PREFIX)) {\r\n const value = this.getWindowVariable(key);\r\n if (value) {\r\n reports[key] = value;\r\n }\r\n }\r\n }\r\n \r\n return reports;\r\n }\r\n\r\n getReportMetadata(resultKey: string): ReportMetadata | null {\r\n const data = this.getReportData(resultKey);\r\n if (!data) return null;\r\n\r\n const sessionLabel = resultKey.replace(this.PREFIX, '').replace(/_/g, '-');\r\n \r\n return {\r\n size: JSON.stringify(data).length,\r\n generatedAt: data.timestamp ? new Date(data.timestamp) : new Date(),\r\n sessionLabel,\r\n stats: data.stats || {},\r\n isValid: this.validateReport(data)\r\n };\r\n }\r\n\r\n async waitForReport(resultKey: string, timeoutMs: number = 30000): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n const startTime = Date.now();\r\n \r\n const checkInterval = setInterval(() => {\r\n const report = this.getReportData(resultKey);\r\n \r\n if (report) {\r\n clearInterval(checkInterval);\r\n resolve(report);\r\n return;\r\n }\r\n \r\n if (Date.now() - startTime > timeoutMs) {\r\n clearInterval(checkInterval);\r\n reject(new Error(`Timeout waiting for report: ${resultKey}`));\r\n }\r\n }, 100);\r\n });\r\n }\r\n\r\n watchReport(resultKey: string, callback: (report: any) => void): () => void {\r\n let isWatching = true;\r\n \r\n const checkInterval = setInterval(() => {\r\n if (!isWatching) {\r\n clearInterval(checkInterval);\r\n return;\r\n }\r\n \r\n const report = this.getReportData(resultKey);\r\n if (report) {\r\n callback(report);\r\n clearInterval(checkInterval);\r\n isWatching = false;\r\n }\r\n }, 100);\r\n \r\n // Return cleanup function\r\n return () => {\r\n isWatching = false;\r\n clearInterval(checkInterval);\r\n };\r\n }\r\n\r\n getWindowVariable(key: string): any {\r\n return (window as any)[key];\r\n }\r\n\r\n setWindowVariable(key: string, value: any): void {\r\n (window as any)[key] = value;\r\n }\r\n\r\n deleteWindowVariable(key: string): void {\r\n delete (window as any)[key];\r\n }\r\n\r\n getReportSize(resultKey: string): number {\r\n const data = this.getReportData(resultKey);\r\n return data ? JSON.stringify(data).length : 0;\r\n }\r\n\r\n validateReport(reportData: any): boolean {\r\n if (!reportData || typeof reportData !== 'object') return false;\r\n \r\n // Basic validation - check for required properties\r\n return !!(\r\n reportData.stats &&\r\n typeof reportData.stats === 'object' &&\r\n typeof reportData.stats.tests === 'number'\r\n );\r\n }\r\n}\r\n","import type { IUnifiedEventBus, EventFilter } from '../../interfaces/events/unified-event-bus';\r\nimport type { RunnerEvent, RunnerEventType } from '../../interfaces/events/runner-events';\r\nimport type { SessionEvent, SessionEventType } from '../../interfaces/events/session-events';\r\n\r\nexport class UnifiedEventBus implements IUnifiedEventBus {\r\n private runnerListeners = new Map<RunnerEventType, Set<(event: RunnerEvent) => void>>();\r\n private sessionListeners = new Map<SessionEventType, Set<(event: SessionEvent) => void>>();\r\n private anyEventListeners = new Set<(event: RunnerEvent | SessionEvent) => void>();\r\n private eventHistory: (RunnerEvent | SessionEvent)[] = [];\r\n private readonly maxHistorySize = 1000;\r\n\r\n emitRunnerEvent(event: RunnerEvent): void {\r\n // Add to history\r\n this.addToHistory(event);\r\n \r\n // Emit to specific listeners\r\n const listeners = this.runnerListeners.get(event.type);\r\n if (listeners) {\r\n listeners.forEach(callback => {\r\n try {\r\n callback(event);\r\n } catch (error) {\r\n console.error('Error in runner event listener:', error);\r\n }\r\n });\r\n }\r\n \r\n // Emit to universal listeners\r\n this.anyEventListeners.forEach(callback => {\r\n try {\r\n callback(event);\r\n } catch (error) {\r\n console.error('Error in universal event listener:', error);\r\n }\r\n });\r\n }\r\n\r\n onRunnerEvent(eventType: RunnerEventType, callback: (event: RunnerEvent) => void): () => void {\r\n if (!this.runnerListeners.has(eventType)) {\r\n this.runnerListeners.set(eventType, new Set());\r\n }\r\n \r\n this.runnerListeners.get(eventType)!.add(callback);\r\n \r\n // Return unsubscribe function\r\n return () => {\r\n const listeners = this.runnerListeners.get(eventType);\r\n if (listeners) {\r\n listeners.delete(callback);\r\n if (listeners.size === 0) {\r\n this.runnerListeners.delete(eventType);\r\n }\r\n }\r\n };\r\n }\r\n\r\n emitSessionEvent(event: SessionEvent): void {\r\n // Add to history\r\n this.addToHistory(event);\r\n \r\n // Emit to specific listeners\r\n const listeners = this.sessionListeners.get(event.type);\r\n if (listeners) {\r\n listeners.forEach(callback => {\r\n try {\r\n callback(event);\r\n } catch (error) {\r\n console.error('Error in session event listener:', error);\r\n }\r\n });\r\n }\r\n \r\n // Emit to universal listeners\r\n this.anyEventListeners.forEach(callback => {\r\n try {\r\n callback(event);\r\n } catch (error) {\r\n console.error('Error in universal event listener:', error);\r\n }\r\n });\r\n }\r\n\r\n onSessionEvent(eventType: SessionEventType, callback: (event: SessionEvent) => void): () => void {\r\n if (!this.sessionListeners.has(eventType)) {\r\n this.sessionListeners.set(eventType, new Set());\r\n }\r\n \r\n this.sessionListeners.get(eventType)!.add(callback);\r\n \r\n // Return unsubscribe function\r\n return () => {\r\n const listeners = this.sessionListeners.get(eventType);\r\n if (listeners) {\r\n listeners.delete(callback);\r\n if (listeners.size === 0) {\r\n this.sessionListeners.delete(eventType);\r\n }\r\n }\r\n };\r\n }\r\n\r\n onAnyEvent(callback: (event: RunnerEvent | SessionEvent) => void): () => void {\r\n this.anyEventListeners.add(callback);\r\n \r\n // Return unsubscribe function\r\n return () => {\r\n this.anyEventListeners.delete(callback);\r\n };\r\n }\r\n\r\n getEventHistory(filter?: EventFilter): (RunnerEvent | SessionEvent)[] {\r\n let filtered = [...this.eventHistory];\r\n \r\n if (filter) {\r\n if (filter.eventTypes) {\r\n filtered = filtered.filter(event => filter.eventTypes!.includes(event.type as any));\r\n }\r\n \r\n if (filter.sessionLabel) {\r\n filtered = filtered.filter(event => \r\n 'sessionLabel' in event && event.sessionLabel === filter.sessionLabel\r\n );\r\n }\r\n \r\n if (filter.timeRange) {\r\n filtered = filtered.filter(event => {\r\n const eventTime = new Date(event.timestamp);\r\n return eventTime >= filter.timeRange!.start && eventTime <= filter.timeRange!.end;\r\n });\r\n }\r\n \r\n if (filter.maxEvents) {\r\n filtered = filtered.slice(-filter.maxEvents);\r\n }\r\n }\r\n \r\n return filtered;\r\n }\r\n\r\n clearEventHistory(): void {\r\n this.eventHistory = [];\r\n }\r\n\r\n hasListeners(eventType?: RunnerEventType | SessionEventType): boolean {\r\n if (!eventType) {\r\n return this.runnerListeners.size > 0 || \r\n this.sessionListeners.size > 0 || \r\n this.anyEventListeners.size > 0;\r\n }\r\n \r\n return (this.runnerListeners.get(eventType as RunnerEventType)?.size || 0) > 0 ||\r\n (this.sessionListeners.get(eventType as SessionEventType)?.size || 0) > 0;\r\n }\r\n\r\n getListenerCount(eventType?: RunnerEventType | SessionEventType): number {\r\n if (!eventType) {\r\n let total = this.anyEventListeners.size;\r\n this.runnerListeners.forEach(listeners => total += listeners.size);\r\n this.sessionListeners.forEach(listeners => total += listeners.size);\r\n return total;\r\n }\r\n \r\n const runnerCount = this.runnerListeners.get(eventType as RunnerEventType)?.size || 0;\r\n const sessionCount = this.sessionListeners.get(eventType as SessionEventType)?.size || 0;\r\n return runnerCount + sessionCount;\r\n }\r\n\r\n destroy(): void {\r\n this.runnerListeners.clear();\r\n this.sessionListeners.clear();\r\n this.anyEventListeners.clear();\r\n this.eventHistory = [];\r\n }\r\n\r\n private addToHistory(event: RunnerEvent | SessionEvent): void {\r\n this.eventHistory.push(event);\r\n \r\n // Trim history if it gets too large\r\n if (this.eventHistory.length > this.maxHistorySize) {\r\n this.eventHistory = this.eventHistory.slice(-this.maxHistorySize);\r\n }\r\n }\r\n}\r\n","import type { IMochaIntegration, EnvironmentValidation, DependencyCheck } from '../../interfaces/infrastructure/mocha-integration';\r\nimport type { MultiSessionConfig } from '../../interfaces/core/types';\r\n\r\ndeclare global {\r\n interface Window {\r\n // Mocha Multiple Sessions Library - Complete interface\r\n MochaMultipleSessions?: {\r\n testSessionSetup: (config: any) => void;\r\n onAnySessionEvent: (callback: (event: any) => void) => () => void;\r\n testSession: (label: string, setupFn: () => void, options?: any) => Promise<string>;\r\n runSession: (label: string) => Promise<any>;\r\n runAllSessions: () => Promise<any[]>;\r\n };\r\n \r\n // Mocha Detailed Reporter\r\n MochaDetailedReporter?: {\r\n DetailedJsonReporter: any;\r\n };\r\n \r\n // Basic dependencies\r\n Mocha?: any;\r\n mocha?: any;\r\n chai?: any;\r\n }\r\n}\r\n\r\nexport class MochaIntegration implements IMochaIntegration {\r\n private isConfiguredFlag = false;\r\n private currentConfig: any = null;\r\n\r\n setupTestEnvironment(config: MultiSessionConfig): void {\r\n this.validateEnvironment();\r\n \r\n const defaultConfig = {\r\n createMochaInstance: (sessionLabel: string) => {\r\n const resultKey = config.windowVariablePrefix + sessionLabel.replace(/\\s+/g, '_').replace(/-/g, '_');\r\n \r\n if (!window.MochaDetailedReporter) {\r\n throw new Error('MochaDetailedReporter not available');\r\n }\r\n \r\n return new window.Mocha!({\r\n ui: 'bdd',\r\n reporter: window.MochaDetailedReporter.DetailedJsonReporter,\r\n reporterOptions: {\r\n outputToWindow: 'true',\r\n windowVariableName: resultKey,\r\n captureConsoleLog: config.captureConsoleLog ? 'true' : 'false',\r\n sourceCode: config.sourceCode ? 'true' : 'false',\r\n attachStats: config.attachStats ? 'true' : 'false'\r\n }\r\n });\r\n },\r\n \r\n injectGlobals: (mochaInstance: any) => {\r\n mochaInstance.suite.emit('pre-require', window, null, mochaInstance);\r\n if (window.chai) {\r\n (window as any).expect = window.chai.expect;\r\n }\r\n }\r\n };\r\n\r\n // Use provided config or defaults\r\n const finalConfig = {\r\n createMochaInstance: config.createMochaInstance || defaultConfig.createMochaInstance,\r\n injectGlobals: config.injectGlobals || defaultConfig.injectGlobals\r\n };\r\n \r\n // Setup with mocha-multiple-sessions\r\n if (window.MochaMultipleSessions?.testSessionSetup) {\r\n window.MochaMultipleSessions.testSessionSetup(finalConfig);\r\n this.currentConfig = finalConfig;\r\n this.isConfiguredFlag = true;\r\n } else {\r\n throw new Error('MochaMultipleSessions library not available');\r\n }\r\n }\r\n\r\n isConfigured(): boolean {\r\n return this.isConfiguredFlag;\r\n }\r\n\r\n getConfiguration(): any {\r\n return this.currentConfig;\r\n }\r\n\r\n integrateWithExistingLibrary(): void {\r\n if (!window.MochaMultipleSessions) {\r\n throw new Error('MochaMultipleSessions library not found');\r\n }\r\n \r\n // Integration is handled in setupTestEnvironment\r\n }\r\n\r\n setupDefaultReporter(sessionLabel: string): any {\r\n const resultKey = `mochaSession__${sessionLabel.replace(/\\s+/g, '_').replace(/-/g, '_')}`;\r\n \r\n if (!window.MochaDetailedReporter) {\r\n throw new Error('MochaDetailedReporter not available');\r\n }\r\n \r\n return new window.Mocha!({\r\n ui: 'bdd',\r\n reporter: window.MochaDetailedReporter.DetailedJsonReporter,\r\n reporterOptions: {\r\n outputToWindow: 'true',\r\n windowVariableName: resultKey,\r\n captureConsoleLog: 'true',\r\n sourceCode: 'true',\r\n attachStats: 'true'\r\n }\r\n });\r\n }\r\n\r\n bridgeSessionEvents(): void {\r\n // This would be implemented if we need to bridge events\r\n // For now, the existing library handles events\r\n }\r\n\r\n validateEnvironment(): EnvironmentValidation {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const missing: string[] = [];\r\n\r\n const deps = this.checkDependencies();\r\n \r\n if (!deps.mocha) {\r\n errors.push('Mocha library not found');\r\n missing.push('mocha');\r\n }\r\n \r\n if (!deps.chai) {\r\n warnings.push('Chai library not found - tests may not work properly');\r\n missing.push('chai');\r\n }\r\n \r\n if (!deps.detailedReporter) {\r\n errors.push('MochaDetailedReporter not found');\r\n missing.push('mocha-detailed-json-reporter');\r\n }\r\n \r\n if (!deps.multipleSessionsLibrary) {\r\n errors.push('MochaMultipleSessions library not found');\r\n missing.push('mocha-multiple-sessions-ts');\r\n }\r\n\r\n const validation: EnvironmentValidation = {\r\n isValid: errors.length === 0,\r\n errors,\r\n warnings,\r\n missingDependencies: missing\r\n };\r\n\r\n if (!validation.isValid) {\r\n throw new Error(`Environment validation failed: ${errors.join(', ')}`);\r\n }\r\n\r\n return validation;\r\n }\r\n\r\n checkDependencies(): DependencyCheck {\r\n return {\r\n mocha: typeof window.Mocha !== 'undefined' && typeof window.mocha !== 'undefined',\r\n chai: typeof window.chai !== 'undefined',\r\n detailedReporter: typeof window.MochaDetailedReporter !== 'undefined',\r\n multipleSessionsLibrary: typeof window.MochaMultipleSessions !== 'undefined',\r\n reporterUI: typeof (window as any).MochaDetailedReporterUI !== 'undefined'\r\n };\r\n }\r\n}\r\n","import type { IReportService } from '../../interfaces/services/report-service';\r\nimport type { DetailedReport, CombinedReport } from '../../interfaces/core/types';\r\nimport type { ReportSummary } from '../../interfaces/use-cases/report-use-cases';\r\nimport type { IReportRepository } from '../../interfaces/repositories/report-repository';\r\nimport type { ISessionMetaRepository } from '../../interfaces/repositories/session-meta-repository';\r\nimport type { IUnifiedEventBus } from '../../interfaces/events/unified-event-bus';\r\n\r\nexport class ReportService implements IReportService {\r\n constructor(\r\n private reportRepository: IReportRepository,\r\n private sessionRepository: ISessionMetaRepository,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n getSessionReport(label: string): DetailedReport | null {\r\n const sessionMeta = this.sessionRepository.findByLabel(label);\r\n if (!sessionMeta) return null;\r\n\r\n const reportData = this.reportRepository.getReportData(sessionMeta.resultKey);\r\n if (!reportData) return null;\r\n\r\n const detailedReport: DetailedReport = {\r\n data: reportData,\r\n stats: reportData.stats || { tests: 0, passes: 0, failures: 0, pending: 0 },\r\n timestamp: reportData.timestamp ? new Date(reportData.timestamp) : new Date(),\r\n sessionLabel: label,\r\n size: JSON.stringify(reportData).length\r\n };\r\n\r\n return detailedReport;\r\n }\r\n\r\n async waitForSessionReport(label: string, timeoutMs: number = 30000): Promise<DetailedReport> {\r\n const sessionMeta = this.sessionRepository.findByLabel(label);\r\n if (!sessionMeta) {\r\n throw new Error(`Session '${label}' not found`);\r\n }\r\n\r\n const reportData = await this.reportRepository.waitForReport(sessionMeta.resultKey, timeoutMs);\r\n \r\n return {\r\n data: reportData,\r\n stats: reportData.stats || { tests: 0, passes: 0, failures: 0, pending: 0 },\r\n timestamp: reportData.timestamp ? new Date(reportData.timestamp) : new Date(),\r\n sessionLabel: label,\r\n size: JSON.stringify(reportData).length\r\n };\r\n }\r\n\r\n hasSessionReport(label: string): boolean {\r\n const sessionMeta = this.sessionRepository.findByLabel(label);\r\n if (!sessionMeta) return false;\r\n\r\n return this.reportRepository.hasReport(sessionMeta.resultKey);\r\n }\r\n\r\n generateCombinedReport(): CombinedReport {\r\n const allSessions = this.sessionRepository.findAll();\r\n const sessions: Record<string, DetailedReport> = {};\r\n \r\n let totalTests = 0;\r\n let totalPasses = 0;\r\n let totalFailures = 0;\r\n let totalPending = 0;\r\n let successfulSessions = 0;\r\n let failedSessions = 0;\r\n\r\n for (const sessionMeta of allSessions) {\r\n const report = this.getSessionReport(sessionMeta.label);\r\n if (report) {\r\n sessions[sessionMeta.label] = report;\r\n \r\n totalTests += report.stats.tests;\r\n totalPasses += report.stats.passes;\r\n totalFailures += report.stats.failures;\r\n totalPending += report.stats.pending;\r\n \r\n if (report.stats.failures === 0) {\r\n successfulSessions++;\r\n } else {\r\n failedSessions++;\r\n }\r\n }\r\n }\r\n\r\n const combinedReport: CombinedReport = {\r\n generatedAt: new Date().toISOString(),\r\n summary: {\r\n totalTests,\r\n totalPasses,\r\n totalFailures,\r\n totalPending,\r\n totalSessions: allSessions.length,\r\n successfulSessions,\r\n failedSessions\r\n },\r\n sessions\r\n };\r\n\r\n // Emit report generated event\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:combined-report-generated',\r\n timestamp: new Date(),\r\n data: {\r\n reportType: 'combined',\r\n totalSessions: allSessions.length,\r\n reportSize: JSON.stringify(combinedReport).length,\r\n generatedAt: new Date(),\r\n summary: combinedReport.summary\r\n }\r\n });\r\n\r\n return combinedReport;\r\n }\r\n\r\n async getCombinedReportAsync(): Promise<CombinedReport> {\r\n // For now, just return the sync version\r\n // In the future, this could wait for all reports to be ready\r\n return this.generateCombinedReport();\r\n }\r\n\r\n watchSessionReport(label: string, callback: (report: DetailedReport) => void): () => void {\r\n const sessionMeta = this.sessionRepository.findByLabel(label);\r\n if (!sessionMeta) {\r\n throw new Error(`Session '${label}' not found`);\r\n }\r\n\r\n return this.reportRepository.watchReport(sessionMeta.resultKey, (reportData: any) => {\r\n const detailedReport: DetailedReport = {\r\n data: reportData,\r\n stats: reportData.stats || { tests: 0, passes: 0, failures: 0, pending: 0 },\r\n timestamp: reportData.timestamp ? new Date(reportData.timestamp) : new Date(),\r\n sessionLabel: label,\r\n size: JSON.stringify(reportData).length\r\n };\r\n\r\n callback(detailedReport);\r\n });\r\n }\r\n\r\n watchAllReports(callback: (sessionLabel: string, report: DetailedReport) => void): () => void {\r\n const unsubscribeFunctions: (() => void)[] = [];\r\n \r\n const allSessions = this.sessionRepository.findAll();\r\n \r\n for (const sessionMeta of allSessions) {\r\n const unsubscribe = this.watchSessionReport(sessionMeta.label, (report) => {\r\n callback(sessionMeta.label, report);\r\n });\r\n unsubscribeFunctions.push(unsubscribe);\r\n }\r\n\r\n // Return function to unsubscribe from all\r\n return () => {\r\n unsubscribeFunctions.forEach(fn => fn());\r\n };\r\n }\r\n\r\n getReportSummary(): ReportSummary {\r\n const allSessions = this.sessionRepository.findAll();\r\n const reportSizes: Record<string, number> = {};\r\n \r\n let totalReports = 0;\r\n let totalTests = 0;\r\n let totalPasses = 0;\r\n let totalFailures = 0;\r\n let oldestReport: Date | undefined;\r\n let newestReport: Date | undefined;\r\n\r\n for (const sessionMeta of allSessions) {\r\n const report = this.getSessionReport(sessionMeta.label);\r\n if (report) {\r\n totalReports++;\r\n totalTests += report.stats.tests;\r\n totalPasses += report.stats.passes;\r\n totalFailures += report.stats.failures;\r\n reportSizes[sessionMeta.label] = report.size || 0;\r\n\r\n if (!oldestReport || report.timestamp < oldestReport) {\r\n oldestReport = report.timestamp;\r\n }\r\n if (!newestReport || report.timestamp > newestReport) {\r\n newestReport = report.timestamp;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n totalReports,\r\n totalTests,\r\n totalPasses,\r\n totalFailures,\r\n reportSizes,\r\n ...(oldestReport && { oldestReport }),\r\n ...(newestReport && { newestReport })\r\n };\r\n }\r\n\r\n async exportReports(format: 'json' | 'html'): Promise<string> {\r\n const combinedReport = this.generateCombinedReport();\r\n \r\n if (format === 'json') {\r\n return JSON.stringify(combinedReport, null, 2);\r\n } else {\r\n // Basic HTML export - could be enhanced\r\n return `\r\n <html>\r\n <head><title>Test Report</title></head>\r\n <body>\r\n <h1>Combined Test Report</h1>\r\n <p>Generated: ${combinedReport.generatedAt}</p>\r\n <h2>Summary</h2>\r\n <pre>${JSON.stringify(combinedReport.summary, null, 2)}</pre>\r\n <h2>Sessions</h2>\r\n <pre>${JSON.stringify(combinedReport.sessions, null, 2)}</pre>\r\n </body>\r\n </html>\r\n `;\r\n }\r\n }\r\n\r\n clearAllReports(): void {\r\n const allSessions = this.sessionRepository.findAll();\r\n \r\n for (const sessionMeta of allSessions) {\r\n if (this.reportRepository.hasReport(sessionMeta.resultKey)) {\r\n this.reportRepository.clearReport(sessionMeta.resultKey);\r\n }\r\n }\r\n }\r\n\r\n validateSessionReport(sessionLabel: string): boolean {\r\n const report = this.getSessionReport(sessionLabel);\r\n return report !== null && this.reportRepository.validateReport(report.data);\r\n }\r\n\r\n getReportValidationErrors(sessionLabel: string): string[] {\r\n const errors: string[] = [];\r\n const report = this.getSessionReport(sessionLabel);\r\n \r\n if (!report) {\r\n errors.push('Report not found');\r\n return errors;\r\n }\r\n\r\n if (!report.data) {\r\n errors.push('Report data is missing');\r\n }\r\n\r\n if (!report.stats) {\r\n errors.push('Report stats are missing');\r\n } else {\r\n if (typeof report.stats.tests !== 'number') {\r\n errors.push('Invalid test count');\r\n }\r\n if (typeof report.stats.passes !== 'number') {\r\n errors.push('Invalid pass count');\r\n }\r\n if (typeof report.stats.failures !== 'number') {\r\n errors.push('Invalid failure count');\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n}\r\n","import type { \r\n IInitializeRunnerUseCase,\r\n IDefineSessionUseCase,\r\n IRunSingleSessionUseCase,\r\n IRunAllSessionsUseCase,\r\n IClearAllSessionsUseCase,\r\n IDestroyRunnerUseCase\r\n} from '../../interfaces/use-cases/runner-use-cases';\r\nimport type { MultiSessionConfig, SessionResult, SessionMeta } from '../../interfaces/core/types';\r\nimport type { BatchExecutionOptions } from '../../interfaces/core/batch-execution';\r\nimport type { ISessionMetaRepository } from '../../interfaces/repositories/session-meta-repository';\r\nimport type { IReportRepository } from '../../interfaces/repositories/report-repository';\r\nimport type { IUnifiedEventBus } from '../../interfaces/events/unified-event-bus';\r\nimport type { IMochaIntegration } from '../../interfaces/infrastructure/mocha-integration';\r\n\r\n// Use the global interface from mocha-integration.ts\r\ndeclare global {\r\n interface Window {\r\n MochaMultipleSessions?: {\r\n testSessionSetup: (config: any) => void;\r\n onAnySessionEvent: (callback: (event: any) => void) => () => void;\r\n testSession: (label: string, setupFn: () => void, options?: any) => Promise<string>;\r\n runSession: (label: string) => Promise<any>;\r\n runAllSessions: () => Promise<any[]>;\r\n };\r\n }\r\n}\r\n\r\nexport class InitializeRunnerUseCase implements IInitializeRunnerUseCase {\r\n constructor(\r\n private mochaIntegration: IMochaIntegration,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n execute(config?: Partial<MultiSessionConfig>): void {\r\n const finalConfig: MultiSessionConfig = {\r\n windowVariablePrefix: 'mochaSession__',\r\n autoInit: true,\r\n captureConsoleLog: true,\r\n sourceCode: true,\r\n attachStats: true,\r\n ...config\r\n };\r\n\r\n try {\r\n this.mochaIntegration.setupTestEnvironment(finalConfig);\r\n \r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:initialized',\r\n timestamp: new Date(),\r\n data: {\r\n configUsed: finalConfig,\r\n sessionCount: 0,\r\n timestamp: new Date()\r\n }\r\n });\r\n \r\n } catch (error) {\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:config-updated',\r\n timestamp: new Date(),\r\n data: {\r\n oldConfig: {},\r\n newConfig: finalConfig,\r\n changes: ['initialization_failed']\r\n }\r\n });\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\nexport class DefineSessionUseCase implements IDefineSessionUseCase {\r\n constructor(\r\n private sessionRepository: ISessionMetaRepository,\r\n private reportRepository: IReportRepository,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n execute(label: string, setupFn: () => void): void {\r\n const resultKey = this.reportRepository.generateResultKey(label);\r\n \r\n const sessionMeta: SessionMeta = {\r\n label,\r\n resultKey,\r\n setupFn,\r\n status: 'ready',\r\n timestamp: new Date()\r\n };\r\n\r\n this.sessionRepository.save(sessionMeta);\r\n \r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:session-defined',\r\n timestamp: new Date(),\r\n data: {\r\n sessionLabel: label,\r\n sessionMeta,\r\n totalSessions: this.sessionRepository.findAll().length\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport class RunSingleSessionUseCase implements IRunSingleSessionUseCase {\r\n constructor(\r\n private sessionRepository: ISessionMetaRepository,\r\n private reportRepository: IReportRepository,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n async execute(label: string): Promise<SessionResult> {\r\n const sessionMeta = this.sessionRepository.findByLabel(label);\r\n if (!sessionMeta) {\r\n throw new Error(`Session '${label}' not found`);\r\n }\r\n\r\n try {\r\n // Mark as running\r\n this.sessionRepository.markAsRunning(label);\r\n \r\n // Use the existing mocha-multiple-sessions library\r\n if (!window.MochaMultipleSessions) {\r\n throw new Error('MochaMultipleSessions library not available');\r\n }\r\n\r\n // Create the session first with better error handling\r\n try {\r\n await window.MochaMultipleSessions.testSession(label, sessionMeta.setupFn);\r\n console.log(`Session '${label}' created successfully`);\r\n } catch (sessionCreationError) {\r\n console.error(`Failed to create session '${label}':`, sessionCreationError);\r\n throw new Error(`Session creation failed for '${label}': ${sessionCreationError}`);\r\n }\r\n \r\n // Run the session with better error handling\r\n let result;\r\n try {\r\n result = await window.MochaMultipleSessions.runSession(label);\r\n console.log(`Session '${label}' execution completed:`, result);\r\n } catch (sessionRunError) {\r\n console.error(`Failed to run session '${label}':`, sessionRunError);\r\n throw new Error(`Session execution failed for '${label}': ${sessionRunError}`);\r\n }\r\n \r\n // Wait for detailed report to be available\r\n try {\r\n await this.reportRepository.waitForReport(sessionMeta.resultKey, 5000);\r\n console.log(`Detailed report available for '${label}'`);\r\n } catch (waitError) {\r\n console.warn(`Timeout waiting for detailed report for ${label}:`, waitError);\r\n // Don't throw here, continue with basic result\r\n }\r\n\r\n // Mark as completed\r\n this.sessionRepository.markAsCompleted(label, result);\r\n\r\n const sessionResult: SessionResult = {\r\n label,\r\n status: result.success ? 'passed' : 'failed',\r\n success: result.success,\r\n timestamp: new Date(),\r\n duration: result.duration,\r\n stats: result.stats\r\n };\r\n\r\n console.log(`Session '${label}' result:`, sessionResult);\r\n return sessionResult;\r\n\r\n } catch (error) {\r\n console.error(`Error in session '${label}':`, error);\r\n this.sessionRepository.markAsFailed(label, error as Error);\r\n \r\n const sessionResult: SessionResult = {\r\n label,\r\n status: 'failed',\r\n success: false,\r\n timestamp: new Date(),\r\n error: error as Error\r\n };\r\n\r\n return sessionResult;\r\n }\r\n }\r\n}\r\n\r\nexport class RunAllSessionsUseCase implements IRunAllSessionsUseCase {\r\n constructor(\r\n private sessionRepository: ISessionMetaRepository,\r\n private runSingleSessionUseCase: IRunSingleSessionUseCase,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n async execute(options?: BatchExecutionOptions): Promise<Record<string, SessionResult>> {\r\n const allSessions = this.sessionRepository.findAll();\r\n \r\n if (allSessions.length === 0) {\r\n throw new Error('No sessions defined');\r\n }\r\n\r\n const sessionLabels = allSessions.map(s => s.label);\r\n const startTime = Date.now();\r\n\r\n // Emit batch start event\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:batch-started',\r\n timestamp: new Date(),\r\n data: {\r\n sessionLabels,\r\n totalSessions: sessionLabels.length,\r\n executionMode: options?.mode || 'sequential',\r\n options\r\n }\r\n });\r\n\r\n const results: Record<string, SessionResult> = {};\r\n let completed = 0;\r\n\r\n try {\r\n if (options?.mode === 'parallel') {\r\n // Run in parallel\r\n const promises = sessionLabels.map(async (label: string) => {\r\n const result = await this.runSingleSessionUseCase.execute(label);\r\n results[label] = result;\r\n completed++;\r\n \r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:batch-progress',\r\n timestamp: new Date(),\r\n data: {\r\n completed,\r\n total: sessionLabels.length,\r\n currentSession: label,\r\n completedSessions: Object.keys(results),\r\n failedSessions: Object.keys(results).filter((l: string) => !results[l]?.success),\r\n progress: Math.round((completed / sessionLabels.length) * 100)\r\n }\r\n });\r\n \r\n return result;\r\n });\r\n\r\n await Promise.all(promises);\r\n } else {\r\n // Run sequentially\r\n for (const label of sessionLabels) {\r\n if (options?.stopOnFirstFailure && completed > 0) {\r\n const hasFailures = Object.values(results).some((r: SessionResult) => !r.success);\r\n if (hasFailures) break;\r\n }\r\n\r\n const result = await this.runSingleSessionUseCase.execute(label);\r\n results[label] = result;\r\n completed++;\r\n\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:batch-progress',\r\n timestamp: new Date(),\r\n data: {\r\n completed,\r\n total: sessionLabels.length,\r\n currentSession: label,\r\n completedSessions: Object.keys(results),\r\n failedSessions: Object.keys(results).filter((l: string) => !results[l]?.success),\r\n progress: Math.round((completed / sessionLabels.length) * 100)\r\n }\r\n });\r\n }\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n const successfulSessions = Object.values(results).filter(r => r.success).length;\r\n const failedSessions = Object.values(results).filter(r => !r.success).length;\r\n\r\n // Emit completion event\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:batch-completed',\r\n timestamp: new Date(),\r\n data: {\r\n totalSessions: sessionLabels.length,\r\n successfulSessions,\r\n failedSessions,\r\n duration,\r\n sessionResults: results,\r\n overallSuccess: failedSessions === 0\r\n }\r\n });\r\n\r\n return results;\r\n\r\n } catch (error) {\r\n // Emit failure event\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:batch-failed',\r\n timestamp: new Date(),\r\n data: {\r\n error: error as Error,\r\n completedSessions: Object.keys(results),\r\n partialResults: results\r\n }\r\n });\r\n\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\nexport class ClearAllSessionsUseCase implements IClearAllSessionsUseCase {\r\n constructor(\r\n private sessionRepository: ISessionMetaRepository,\r\n private reportRepository: IReportRepository,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n async execute(): Promise<void> {\r\n const allSessions = this.sessionRepository.findAll();\r\n const clearedSessions = allSessions.map(s => s.label);\r\n const clearedReports: string[] = [];\r\n\r\n // Clear all reports\r\n for (const session of allSessions) {\r\n if (this.reportRepository.hasReport(session.resultKey)) {\r\n this.reportRepository.clearReport(session.resultKey);\r\n clearedReports.push(session.resultKey);\r\n }\r\n }\r\n\r\n // Clear session repository\r\n this.sessionRepository.clear();\r\n\r\n // Emit cleared event\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:cleared',\r\n timestamp: new Date(),\r\n data: {\r\n clearedSessions,\r\n clearedReports\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport class DestroyRunnerUseCase implements IDestroyRunnerUseCase {\r\n constructor(\r\n private clearAllSessionsUseCase: IClearAllSessionsUseCase,\r\n private eventBus: IUnifiedEventBus\r\n ) {}\r\n\r\n async execute(): Promise<void> {\r\n // Clear all sessions first\r\n await this.clearAllSessionsUseCase.execute();\r\n\r\n // Emit destroy event\r\n this.eventBus.emitRunnerEvent({\r\n type: 'runner:destroyed',\r\n timestamp: new Date()\r\n });\r\n\r\n // Destroy event bus\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import type { IMultiSessionDetailedRunner } from '../interfaces/core/IMultiSessionDetailedRunner';\r\nimport type { SessionState, SessionResult, DetailedReport, CombinedReport, MultiSessionConfig } from '../interfaces/core/types';\r\nimport type { RunnerEventType, RunnerEvent } from '../interfaces/events/runner-events';\r\nimport type { SessionEventType, SessionEvent } from '../interfaces/events/session-events';\r\nimport type { BatchExecutionOptions } from '../interfaces/core/batch-execution';\r\n\r\n// Implementation imports\r\nimport { SessionMetaRepository } from './repositories/session-meta-repository';\r\nimport { ReportRepository } from './repositories/report-repository';\r\nimport { UnifiedEventBus } from './events/unified-event-bus';\r\nimport { MochaIntegration } from './infrastructure/mocha-integration';\r\nimport { ReportService } from './services/report-service';\r\n\r\n// Use case imports\r\nimport { \r\n InitializeRunnerUseCase,\r\n DefineSessionUseCase,\r\n RunSingleSessionUseCase,\r\n RunAllSessionsUseCase,\r\n ClearAllSessionsUseCase,\r\n DestroyRunnerUseCase\r\n} from './use-cases/runner-use-cases';\r\n\r\nexport class MultiSessionDetailedRunner implements IMultiSessionDetailedRunner {\r\n // Dependencies\r\n private sessionRepository: SessionMetaRepository;\r\n private reportRepository: ReportRepository;\r\n private eventBus: UnifiedEventBus;\r\n private mochaIntegration: MochaIntegration;\r\n private reportService: ReportService;\r\n\r\n // Use cases\r\n private initializeUseCase: InitializeRunnerUseCase;\r\n private defineSessionUseCase: DefineSessionUseCase;\r\n private runSingleSessionUseCase: RunSingleSessionUseCase;\r\n private runAllSessionsUseCase: RunAllSessionsUseCase;\r\n private clearAllSessionsUseCase: ClearAllSessionsUseCase;\r\n private destroyRunnerUseCase: DestroyRunnerUseCase;\r\n\r\n // State\r\n private initialized = false;\r\n private destroyed = false;\r\n\r\n constructor() {\r\n // Initialize dependencies\r\n this.sessionRepository = new SessionMetaRepository();\r\n this.reportRepository = new ReportRepository();\r\n this.eventBus = new UnifiedEventBus();\r\n this.mochaIntegration = new MochaIntegration();\r\n this.reportService = new ReportService(\r\n this.reportRepository,\r\n this.sessionRepository,\r\n this.eventBus\r\n );\r\n\r\n // Initialize use cases\r\n this.initializeUseCase = new InitializeRunnerUseCase(\r\n this.mochaIntegration,\r\n this.eventBus\r\n );\r\n \r\n this.defineSessionUseCase = new DefineSessionUseCase(\r\n this.sessionRepository,\r\n this.reportRepository,\r\n this.eventBus\r\n );\r\n\r\n this.runSingleSessionUseCase = new RunSingleSessionUseCase(\r\n this.sessionRepository,\r\n this.reportRepository,\r\n this.eventBus\r\n );\r\n\r\n this.runAllSessionsUseCase = new RunAllSessionsUseCase(\r\n this.sessionRepository,\r\n this.runSingleSessionUseCase,\r\n this.eventBus\r\n );\r\n\r\n this.clearAllSessionsUseCase = new ClearAllSessionsUseCase(\r\n this.sessionRepository,\r\n this.reportRepository,\r\n this.eventBus\r\n );\r\n\r\n this.destroyRunnerUseCase = new DestroyRunnerUseCase(\r\n this.clearAllSessionsUseCase,\r\n this.eventBus\r\n );\r\n\r\n // Bridge session events from the existing library\r\n this.bridgeExistingSessionEvents();\r\n }\r\n\r\n // Core Management\r\n init(config?: Partial<MultiSessionConfig>): void {\r\n if (this.destroyed) {\r\n throw new Error('Runner has been destroyed');\r\n }\r\n\r\n // Set initialized flag before calling use case to avoid timing issues\r\n this.initialized = true;\r\n \r\n try {\r\n this.initializeUseCase.execute(config);\r\n } catch (error) {\r\n // Reset initialized flag on error\r\n this.initialized = false;\r\n throw error;\r\n }\r\n }\r\n\r\n define(label: string, setupFn: () => void): void {\r\n this.ensureInitialized();\r\n this.defineSessionUseCase.execute(label, setupFn);\r\n }\r\n\r\n async run(label: string): Promise<SessionResult> {\r\n this.ensureInitialized();\r\n return this.runSingleSessionUseCase.execute(label);\r\n }\r\n\r\n async runAll(options?: BatchExecutionOptions): Promise<Record<string, SessionResult>> {\r\n this.ensureInitialized();\r\n return this.runAllSessionsUseCase.execute(options);\r\n }\r\n\r\n // Report Access\r\n getReport(label: string): DetailedReport | null {\r\n this.ensureInitialized();\r\n return this.reportService.getSessionReport(label);\r\n }\r\n\r\n getSessionStates(): Record<string, SessionState> {\r\n this.ensureInitialized();\r\n return this.sessionRepository.getStates();\r\n }\r\n\r\n getCombinedReport(): CombinedReport {\r\n this.ensureInitialized();\r\n return this.reportService.generateCombinedReport();\r\n }\r\n\r\n // Event System\r\n onRunnerEvent(eventType: RunnerEventType, callback: (event: RunnerEvent) => void): () => void {\r\n return this.eventBus.onRunnerEvent(eventType, callback);\r\n }\r\n\r\n onSessionEvent(eventType: SessionEventType, callback: (event: SessionEvent) => void): () => void {\r\n return this.eventBus.onSessionEvent(eventType, callback);\r\n }\r\n\r\n onAnyEvent(callback: (event: RunnerEvent | SessionEvent) => void): () => void {\r\n return this.eventBus.onAnyEvent(callback);\r\n }\r\n\r\n // State Queries\r\n isInitialized(): boolean {\r\n return this.initialized && !this.destroyed;\r\n }\r\n\r\n hasSession(label: string): boolean {\r\n return this.sessionRepository.exists(label);\r\n }\r\n\r\n getSessionCount(): number {\r\n return this.sessionRepository.findAll().length;\r\n }\r\n\r\n // Utility\r\n async clear(): Promise<void> {\r\n this.ensureInitialized();\r\n await this.clearAllSessionsUseCase.execute();\r\n }\r\n\r\n async destroy(): Promise<void> {\r\n if (this.destroyed) return;\r\n \r\n await this.destroyRunnerUseCase.execute();\r\n this.destroyed = true;\r\n this.initialized = false;\r\n }\r\n\r\n // Private helper methods\r\n private ensureInitialized(): void {\r\n if (this.destroyed) {\r\n throw new Error('Runner has been destroyed');\r\n }\r\n if (!this.initialized) {\r\n throw new Error('Runner not initialized. Call init() first.');\r\n }\r\n }\r\n\r\n private bridgeExistingSessionEvents(): void {\r\n // Bridge events from the existing mocha-multiple-sessions library\r\n if (typeof window !== 'undefined' && window.MochaMultipleSessions?.onAnySessionEvent) {\r\n window.MochaMultipleSessions.onAnySessionEvent((event: any) => {\r\n // Convert and forward the event\r\n const sessionEvent: SessionEvent = {\r\n type: event.type,\r\n sessionLabel: event.sessionLabel,\r\n timestamp: event.timestamp || new Date(),\r\n data: event.data,\r\n source: 'mocha-multiple-sessions'\r\n };\r\n\r\n this.eventBus.emitSessionEvent(sessionEvent);\r\n });\r\n }\r\n }\r\n}\r\n","import type { IMultiSessionDetailedRunner } from '../interfaces/core/IMultiSessionDetailedRunner';\r\nimport type { MultiSessionConfig } from '../interfaces/core/types';\r\nimport { MultiSessionDetailedRunner } from './multi-session-detailed-runner';\r\n\r\nexport function createMultiSessionDetailedRunner(\r\n config?: Partial<MultiSessionConfig>\r\n): IMultiSessionDetailedRunner {\r\n const runner = new MultiSessionDetailedRunner();\r\n \r\n // Auto-initialize if autoInit is not explicitly false\r\n if (config?.autoInit !== false) {\r\n runner.init(config);\r\n }\r\n \r\n return runner;\r\n}\r\n\r\n// Default export for convenience\r\nexport default createMultiSessionDetailedRunner;\r\n"],"names":[],"mappings":"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"}