/**
 * @fileoverview Repository factory for dependency injection
 *
 * This factory provides a centralized way to create repository instances
 * with their required dependencies, following the dependency injection pattern.
 */
import { DeepSourceClient } from '../../deepsource.js';
import { ProjectsClient } from '../../client/projects-client.js';
import { IProjectRepository } from '../../domain/aggregates/project/project.repository.js';
import { IAnalysisRunRepository } from '../../domain/aggregates/analysis-run/analysis-run.repository.js';
import { IQualityMetricsRepository } from '../../domain/aggregates/quality-metrics/quality-metrics.repository.js';
import { IComplianceReportRepository } from '../../domain/aggregates/compliance-report/compliance-report.repository.js';
/**
 * Configuration for repository creation
 */
export interface RepositoryConfig {
    apiKey: string;
    baseUrl?: string;
}
/**
 * Repository instances container
 */
export interface RepositoryInstances {
    projectRepository: IProjectRepository;
    analysisRunRepository: IAnalysisRunRepository;
    qualityMetricsRepository: IQualityMetricsRepository;
    complianceReportRepository: IComplianceReportRepository;
}
/**
 * Factory for creating repository instances with dependency injection
 *
 * This factory ensures that all repositories are created with the proper
 * dependencies and configuration. It provides a single point of configuration
 * for all repository instances.
 *
 * @example
 * ```typescript
 * const factory = new RepositoryFactory({ apiKey: 'your-api-key' });
 * const repositories = factory.createRepositories();
 *
 * // Use repositories
 * const project = await repositories.projectRepository.findByKey(projectKey);
 * ```
 */
export declare class RepositoryFactory {
    private readonly config;
    private cachedInstances;
    constructor(config: RepositoryConfig);
    /**
     * Creates all repository instances
     *
     * This method creates instances of all repositories with their required
     * dependencies. The instances are cached for subsequent calls.
     *
     * @returns Container with all repository instances
     */
    createRepositories(): RepositoryInstances;
    /**
     * Creates a DeepSource client instance
     */
    private createDeepSourceClient;
    /**
     * Creates a Projects client instance
     */
    private createProjectsClient;
    /**
     * Creates a Project repository instance
     */
    createProjectRepository(client?: ProjectsClient): IProjectRepository;
    /**
     * Creates an AnalysisRun repository instance
     */
    createAnalysisRunRepository(client?: DeepSourceClient): IAnalysisRunRepository;
    /**
     * Creates a QualityMetrics repository instance
     */
    createQualityMetricsRepository(client?: DeepSourceClient): IQualityMetricsRepository;
    /**
     * Creates a ComplianceReport repository instance
     */
    createComplianceReportRepository(client?: DeepSourceClient): IComplianceReportRepository;
    /**
     * Clears cached instances
     *
     * This method is useful for testing or when you need to force
     * recreation of repository instances.
     */
    clearCache(): void;
    /**
     * Gets the current configuration
     */
    getConfig(): Readonly<RepositoryConfig>;
}
/**
 * Creates a repository factory with the given configuration
 *
 * This is a convenience function for creating a factory instance.
 *
 * @param config - Repository configuration
 * @returns A new repository factory instance
 */
export declare function createRepositoryFactory(config: RepositoryConfig): RepositoryFactory;
/**
 * Creates all repositories with the given configuration
 *
 * This is a convenience function that creates a factory and immediately
 * returns all repository instances.
 *
 * @param config - Repository configuration
 * @returns Container with all repository instances
 */
export declare function createRepositories(config: RepositoryConfig): RepositoryInstances;
