import type { Simplify } from "type-fest";
import type { Dependency, DependencyVersion, Payload as NodesecurePayload } from "../types.ts";
type MergeDeep<T extends unknown[]> = T extends [a: infer A, ...rest: infer R] ? A & MergeDeep<R> : {};
export type ExtractProbeResult<T extends ProbeExtractor<any>[]> = {
    [K in keyof T]: T[K] extends ProbeExtractor<any> ? ReturnType<T[K]["done"]> : never;
};
export type MergedExtractProbeResult<T extends ProbeExtractor<any>[]> = Simplify<MergeDeep<ExtractProbeResult<T>>>;
export type ProbeExtractorLevel = "packument" | "manifest";
export type ProbeExtractorManifestParent = {
    name: string;
    dependency: Dependency;
};
export type PackumentProbeNextCallback = (name: string, dependency: Dependency) => void;
export type ManifestProbeNextCallback = (spec: string, dependencyVersion: DependencyVersion, parent: ProbeExtractorManifestParent) => void;
export interface ProbeExtractor<Defs> {
    level: ProbeExtractorLevel;
    next(...args: any[]): void;
    done(): Defs;
}
export interface PackumentProbeExtractor<Defs> extends ProbeExtractor<Defs> {
    level: "packument";
    next: PackumentProbeNextCallback;
}
export interface ManifestProbeExtractor<Defs> extends ProbeExtractor<Defs> {
    level: "manifest";
    next: ManifestProbeNextCallback;
}
export declare class Payload<T extends ProbeExtractor<any>[]> extends EventTarget {
    #private;
    private dependencies;
    private probes;
    private cachedResult;
    constructor(data: NodesecurePayload | NodesecurePayload["dependencies"], probes: [...T]);
    extract(): ExtractProbeResult<T>;
    extractAndMerge(): MergedExtractProbeResult<T>;
    on<T extends ProbeExtractorLevel>(e: T, listener: ExtractorListener<T>): this;
    on(e: "error", listener: ErrorListener): this;
}
export declare const Callbacks: {
    readonly packument: (callback: PackumentProbeNextCallback) => PackumentProbeExtractor<void>;
    readonly manifest: (callback: ManifestProbeNextCallback) => ManifestProbeExtractor<void>;
};
type ExtractorCallback<T extends ProbeExtractorLevel> = Parameters<(typeof Callbacks)[T]>[0];
export type ExtractorCallbackParams<T extends ProbeExtractorLevel> = Parameters<ExtractorCallback<T>>;
export type ExtractorListener<T extends ProbeExtractorLevel> = (...events: CustomEvent<ExtractorCallbackParams<T>>["detail"]) => void;
type ErrorListener = (e: Error) => void;
export {};
//# sourceMappingURL=payload.d.ts.map