import { EventEmitter } from 'events'; import { Request, RequestHandler } from 'express'; export interface ABTestConfig { name: string; enabled?: boolean; variants: VariantConfig[]; defaultVariant?: string; cookieName?: string; headerName?: string; userIdExtractor?: (req: Request) => string | undefined; stickySession?: boolean; metrics?: MetricsConfig; segmentation?: SegmentationRule[]; startDate?: Date; endDate?: Date; } export interface VariantConfig { name: string; weight: number; handler?: RequestHandler; metadata?: Record; } export interface MetricsConfig { trackPageViews?: boolean; trackConversions?: boolean; trackCustomEvents?: boolean; customMetrics?: string[]; } export interface SegmentationRule { name: string; condition: (req: Request) => boolean; variants: Array<{ name: string; weight: number; }>; } export interface ABTestMetrics { testName: string; variant: string; pageViews: number; conversions: number; conversionRate: number; customEvents: Record; avgResponseTime: number; errors: number; startTime: Date; lastUpdate: Date; } export interface ABTestResults { testName: string; status: 'active' | 'completed' | 'paused'; startDate: Date; endDate?: Date; variants: Record; winner?: string; confidence?: number; sampleSize: number; } export declare class ABTestingMiddleware extends EventEmitter { private tests; private assignments; private metrics; private config; constructor(config?: { defaultCookieName?: string; defaultHeaderName?: string; persistAssignments?: boolean; metricsInterval?: number; }); createTest(config: ABTestConfig): void; removeTest(testName: string): void; toggleTest(testName: string, enabled: boolean): void; private getVariantAssignment; private selectVariantByWeight; private storeAssignment; trackEvent(testName: string, variant: string, eventType: 'pageView' | 'conversion' | 'error' | 'custom', eventName?: string, value?: number): void; middleware(testName: string): RequestHandler; getTestResults(testName: string): ABTestResults | null; getAllResults(): ABTestResults[]; calculateRequiredSampleSize(testName: string, baselineConversionRate: number, minimumDetectableEffect: number, power?: number, significance?: number): number; destroy(): void; } export declare function createABTestingMiddleware(config?: { defaultCookieName?: string; defaultHeaderName?: string; persistAssignments?: boolean; metricsInterval?: number; }): ABTestingMiddleware; //# sourceMappingURL=ab-testing-middleware.d.ts.map