import { Project } from "@atomist/automation-client";
import { Analyzed } from "../../../aspect/AspectRegistry";
import { ProjectAnalysisResult } from "../../ProjectAnalysisResult";
import { ProjectAnalysisResultStore } from "../persist/ProjectAnalysisResultStore";
import { ScmSearchCriteria } from "./ScmSearchCriteria";
import { AnalysisTracking, RepoBeingTracked } from "../../tracking/analysisTracker";
export declare type ProjectAnalysisResultFilter = (pa: ProjectAnalysisResult) => Promise<boolean>;
/**
 * Options for spidering source code hosts
 */
export interface SpiderOptions {
    workspaceId: string;
    persister: ProjectAnalysisResultStore;
    poolSize: number;
    /**
     * Is this record OK or should it be refreshed?
     */
    keepExistingPersisted: ProjectAnalysisResultFilter;
}
export declare type RepoUrl = string;
export declare type PersistenceResult = string;
export interface SpiderFailure {
    repoUrl: string;
    whileTryingTo: string;
    message: string;
    error?: Error;
}
export interface SpiderResult {
    repositoriesDetected: number;
    failed: SpiderFailure[];
    keptExisting: RepoUrl[];
    persistedAnalyses: PersistenceResult[];
    millisTaken?: number;
}
export declare const EmptySpiderResult: SpiderResult;
export interface Timing {
    totalMillis: number;
    extractions: number;
}
/**
 * Aspect type to total time taken to extract it
 */
export declare type TimeRecorder = Record<string, Timing>;
/**
 * Interface for types that can extract fingerprints from projects
 */
export interface Analyzer {
    analyze(p: Project, repoTracking: RepoBeingTracked): Promise<Analyzed>;
    readonly timings: TimeRecorder;
}
export declare function logTimings(recorder: TimeRecorder): void;
/**
 * Spider a data source and progressively persist what we find.
 */
export interface Spider {
    spider(criteria: ScmSearchCriteria, analyzer: Analyzer, analysisTracking: AnalysisTracking, opts: SpiderOptions): Promise<SpiderResult>;
}
//# sourceMappingURL=Spider.d.ts.map