declare abstract class BasePlugin {
    protected config: BasePluginConfig;
    report?: (data: ReportData) => void;
    abstract name: string;
    setConfig(config: BasePluginConfig): void;
    setReport(report: (data: ReportData) => void): void;
    abstract init(): void;
    abstract destroy(): void;
}

interface PerformanceConfig {
    enable?: boolean;
    slowResourceTime?: number;
    slowPageLoadTime?: number;
}
interface PerformanceData {
    type: 'performance';
    subType: 'page-load' | 'resource';
    name?: string;
    initiatorType?: string;
    duration?: number;
    transferSize?: number;
    dnsTime?: number;
    tcpTime?: number;
    whiteScreenTime?: number;
    domReadyTime?: number;
    loadTime?: number;
    isTimeout?: boolean;
}

interface ErrorData {
    type: 'error';
    subType: 'javascript' | 'promise';
    message: string;
    filename?: string;
    position?: string;
    stack?: string;
}

interface BehaviorData {
    type: 'behavior';
    subType: 'pv' | 'click';
    url?: string;
    referer?: string;
    path?: string;
}

interface MonitorConfig {
    appId: string;
    userId?: string;
    reportUrl: string;
    plugins?: Array<new () => BasePlugin>;
    enable?: boolean;
    sampling?: number;
    maxCache?: number;
    reportInterval?: number;
    ignoreErrors?: RegExp[];
}
type MockType = 'mock';
type MockSubType = 'test' | `test-${number}`;
type ReportData = (PerformanceData | ErrorData | BehaviorData | {
    type: MockType;
    subType: MockSubType;
}) & {
    timestamp?: number;
};
interface BasePluginConfig {
    enable?: boolean;
    [key: string]: any;
}

declare class Monitor {
    private config;
    private plugins;
    private cache;
    private timer;
    private readonly MAX_CACHE_LENGTH;
    private readonly REPORT_INTERVAL;
    constructor(config: MonitorConfig);
    private init;
    destroy(): void;
    private addCache;
    private report;
}

declare class PerformancePlugin extends BasePlugin {
    name: string;
    private performanceObserver?;
    init(): void;
    destroy(): void;
    private monitorPageLoad;
    private monitorResourceLoad;
}

declare class ErrorPlugin extends BasePlugin {
    name: string;
    private errorHandler;
    private rejectionHandler;
    constructor();
    init(): void;
    destroy(): void;
    private shouldIgnoreError;
    private handleError;
    private handleRejection;
}

declare class BehaviorPlugin extends BasePlugin {
    name: string;
    private clickHandler;
    constructor();
    init(): void;
    destroy(): void;
    private monitorPV;
    private handleClick;
    private getElementPath;
}

export { BehaviorData, BehaviorPlugin, ErrorData, ErrorPlugin, Monitor, MonitorConfig, PerformanceConfig, PerformanceData, PerformancePlugin, ReportData };
