type MochaObj = Mocha.Runnable | Mocha.Suite;
/**
 * Helper for marshalling certain mocha objects between frontend and backend processes.
 *
 * Normally, playwright automatically uses JSON to serialize and deserialize arguments to backend functions exposed via `page.exposeFunction()`.
 * However, we face two problems when trying to pass `Mocha.Runnable` and `Mocha.Suite` instances to the backend:
 *   - These objects have circular references
 *   - JSON round-tripping won't preserve these objects' prototypes, and thus will be missing methods that reporters rely on.
 *
 * This class attempts to solve this by replacing all instances of these classes with "handles" that simply refer to their
 * index in a central "registry" array. Because we serialize and deserialize in the same order, we can re-create this "registry"
 * on the backend as we deserialize.
 */
declare class MochaSerializer {
    private static _registry;
    static createHandle(raw: MochaObj, isPrimary: boolean): {
        ctx: Mocha.Context;
        suites: Mocha.Suite[];
        tests: Mocha.Test[];
        pending: boolean;
        file?: string | undefined;
        root: boolean;
        delayed: boolean;
        parent: Mocha.Suite | undefined;
        title: string;
        on(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        on(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        on(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        on(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        on(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
        on(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
        on(event: "run", listener: () => void): Mocha.Suite;
        on(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        on(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
        on(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        on(event: string, listener: (...args: any[]) => void): Mocha.Suite;
        once(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        once(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        once(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        once(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        once(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
        once(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
        once(event: "run", listener: () => void): Mocha.Suite;
        once(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        once(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
        once(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        once(event: string, listener: (...args: any[]) => void): Mocha.Suite;
        addListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        addListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        addListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        addListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        addListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
        addListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
        addListener(event: "run", listener: () => void): Mocha.Suite;
        addListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        addListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
        addListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        addListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
        removeListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        removeListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        removeListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        removeListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        removeListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
        removeListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
        removeListener(event: "run", listener: () => void): Mocha.Suite;
        removeListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        removeListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
        removeListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        removeListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
        prependListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
        prependListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
        prependListener(event: "run", listener: () => void): Mocha.Suite;
        prependListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        prependListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
        prependListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        prependListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
        prependOnceListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependOnceListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependOnceListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependOnceListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
        prependOnceListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
        prependOnceListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
        prependOnceListener(event: "run", listener: () => void): Mocha.Suite;
        prependOnceListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        prependOnceListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
        prependOnceListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
        prependOnceListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
        emit(name: "beforeAll", hook: Mocha.Hook): boolean;
        emit(name: "afterAll", hook: Mocha.Hook): boolean;
        emit(name: "beforeEach", hook: Mocha.Hook): boolean;
        emit(name: "afterEach", hook: Mocha.Hook): boolean;
        emit(name: "suite", suite: Mocha.Suite): boolean;
        emit(name: "test", test: Mocha.Test): boolean;
        emit(name: "run"): boolean;
        emit(name: "pre-require", context: Mocha.MochaGlobals, file: string, mocha: Mocha): boolean;
        emit(name: "require", module: any, file: string, mocha: Mocha): boolean;
        emit(name: "post-require", context: Mocha.MochaGlobals, file: string, mocha: Mocha): boolean;
        emit(name: string, ...args: any[]): boolean;
        off<K>(eventName: string | symbol, listener: (...args: any[]) => void): Mocha.Suite;
        removeAllListeners(eventName?: string | symbol | undefined): Mocha.Suite;
        setMaxListeners(n: number): Mocha.Suite;
        getMaxListeners(): number;
        listeners<K>(eventName: string | symbol): Function[];
        rawListeners<K>(eventName: string | symbol): Function[];
        listenerCount<K>(eventName: string | symbol, listener?: Function | undefined): number;
        eventNames(): (string | symbol)[];
        [EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
        $$index: number;
        $$typeName: string;
    } | {
        type: "test";
        speed?: "slow" | "medium" | "fast" | undefined;
        err?: Error | undefined;
        id: string;
        title: string;
        fn: Mocha.Func | Mocha.AsyncFunc | undefined;
        body: string;
        async: boolean;
        sync: boolean;
        timedOut: boolean;
        pending: boolean;
        duration?: number | undefined;
        parent?: Mocha.Suite | undefined;
        state?: "failed" | "passed" | "pending" | undefined;
        timer?: any;
        ctx?: Mocha.Context | undefined;
        callback?: Mocha.Done | undefined;
        allowUncaught?: boolean | undefined;
        file?: string | undefined;
        on(event: "error", listener: (error: any) => void): Mocha.Test;
        on(event: string, listener: (...args: any[]) => void): Mocha.Test;
        once(event: "error", listener: (error: any) => void): Mocha.Test;
        once(event: string, listener: (...args: any[]) => void): Mocha.Test;
        addListener(event: "error", listener: (error: any) => void): Mocha.Test;
        addListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
        removeListener(event: "error", listener: (error: any) => void): Mocha.Test;
        removeListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
        prependListener(event: "error", listener: (error: any) => void): Mocha.Test;
        prependListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
        prependOnceListener(event: "error", listener: (error: any) => void): Mocha.Test;
        prependOnceListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
        emit(name: "error", error: any): boolean;
        emit(name: string, ...args: any[]): boolean;
        off<K>(eventName: string | symbol, listener: (...args: any[]) => void): Mocha.Test;
        removeAllListeners(eventName?: string | symbol | undefined): Mocha.Test;
        setMaxListeners(n: number): Mocha.Test;
        getMaxListeners(): number;
        listeners<K>(eventName: string | symbol): Function[];
        rawListeners<K>(eventName: string | symbol): Function[];
        listenerCount<K>(eventName: string | symbol, listener?: Function | undefined): number;
        eventNames(): (string | symbol)[];
        [EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
        $$index: number;
        $$typeName: string;
    } | {
        type: "hook";
        originalTitle?: string | undefined;
        id: string;
        title: string;
        fn: Mocha.Func | Mocha.AsyncFunc | undefined;
        body: string;
        async: boolean;
        sync: boolean;
        timedOut: boolean;
        pending: boolean;
        duration?: number | undefined;
        parent?: Mocha.Suite | undefined;
        state?: "failed" | "passed" | "pending" | undefined;
        timer?: any;
        ctx?: Mocha.Context | undefined;
        callback?: Mocha.Done | undefined;
        allowUncaught?: boolean | undefined;
        file?: string | undefined;
        on(event: "error", listener: (error: any) => void): Mocha.Hook;
        on(event: string, listener: (...args: any[]) => void): Mocha.Hook;
        once(event: "error", listener: (error: any) => void): Mocha.Hook;
        once(event: string, listener: (...args: any[]) => void): Mocha.Hook;
        addListener(event: "error", listener: (error: any) => void): Mocha.Hook;
        addListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
        removeListener(event: "error", listener: (error: any) => void): Mocha.Hook;
        removeListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
        prependListener(event: "error", listener: (error: any) => void): Mocha.Hook;
        prependListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
        prependOnceListener(event: "error", listener: (error: any) => void): Mocha.Hook;
        prependOnceListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
        emit(name: "error", error: any): boolean;
        emit(name: string, ...args: any[]): boolean;
        off<K>(eventName: string | symbol, listener: (...args: any[]) => void): Mocha.Hook;
        removeAllListeners(eventName?: string | symbol | undefined): Mocha.Hook;
        setMaxListeners(n: number): Mocha.Hook;
        getMaxListeners(): number;
        listeners<K>(eventName: string | symbol): Function[];
        rawListeners<K>(eventName: string | symbol): Function[];
        listenerCount<K>(eventName: string | symbol, listener?: Function | undefined): number;
        eventNames(): (string | symbol)[];
        [EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
        $$index: number;
        $$typeName: string;
    } | {
        $$index: number;
        $$typeName: string;
    };
    /**
     * (On the frontend) Serializes a value to JSON string, recursively replacing any MochaObjs with appropriate handles
     * TODO: There are ***surely*** more performant ways to do this...
     *
     * @param root The root object to serialize.  If this is a MochaObj, it will always include all
     *             properties (even if it should already exist in the backend's registry).
     */
    static serialize(root: any): string;
    /**
     * (On the backend) Deserializes a JSON string, replacing any MochaObj handles with their corresponding instances.
     * The first time we encounter a given instance's handle, we'll transform that handle object to serve as the actual instance on the backend.
     */
    static deserialize(txt: string): any;
}
//# sourceMappingURL=MochaSerializer.d.ts.map