import ServiceFactory, { Service, ServiceProvider, ServiceMap } from '../services/ServiceFactory';
import { InternalUpdateHandler } from '../types/cli.types';
import AbstractFeature, { FeatureDependency } from './AbstractFeature';
import { InstallFeatureOptions, FeatureInstallResponse, FeatureCode, FeatureMap } from './features.types';
export declare class FeatureInstallerImpl implements ServiceProvider, FeatureInstaller {
    cwd: string;
    private featureMap;
    private serviceFactory;
    private featuresMarkedAsSkippedThisRun;
    static startInFlightIntertainmentHandler?: (didUpdateHandler: (handler: (message: string) => void) => void) => void;
    static stopInFlightIntertainmentHandler?: () => void;
    private packagesToInstall;
    private devPackagesToInstall;
    private featuresToMarkAsInstalled;
    private afterPackageInstalls;
    private pendingFeatureInstalls;
    constructor(cwd: string, serviceFactory: ServiceFactory);
    isInSpruceModule(): boolean;
    isInstalled(code: FeatureCode): Promise<boolean>;
    markAsSkippedThisRun(code: FeatureCode): void;
    markAsPermanentlySkipped(code: FeatureCode): void;
    isMarkedAsSkipped(code: FeatureCode): boolean;
    mapFeature<C extends FeatureCode>(code: C, feature: FeatureMap[C]): void;
    getFeature<C extends FeatureCode>(code: C): FeatureMap[C];
    areInstalled(codes: FeatureCode[]): Promise<boolean>;
    getFeatureDependencies<C extends FeatureCode>(featureCode: C): FeatureDependency[];
    private getFeatureDependenciesIncludingSelf;
    private isDependencyInTracker;
    install(options: InstallFeatureOptions): Promise<FeatureInstallResponse>;
    private isInstalledOrPendingInstall;
    private installFeature;
    installPackageDependencies(feature: AbstractFeature, didUpdateHandler?: InternalUpdateHandler): Promise<void>;
    installPackageDependenciesForFeatures(features: AbstractFeature[], didUpdateHandler?: InternalUpdateHandler): Promise<void>;
    private installAllPending;
    private queueInstallPackageDependenciesWithoutEntertainment;
    private getFeatureNameAndDesc;
    private sortFeatures;
    Service<S extends Service>(type: S, cwd?: string): ServiceMap[S];
    getOptionsForFeature(code: FeatureCode): import("@sprucelabs/schema").Schema | import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.SkillFeatureSchema | import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.NodeFeatureOptionsSchema | undefined;
    getAllCodes(): FeatureCode[];
    getInstalledFeatures(): Promise<(import("./schema/SchemaFeature").default | import("./test/TestFeature").default | import("./skill/SkillFeature").default<import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.SkillFeatureSchema> | import("./error/ErrorFeature").default | import("./node/NodeFeature").default<import("@sprucelabs/mercury-types").SpruceSchemas.SpruceCli.v2020_07_22.NodeFeatureOptionsSchema> | import("./dependencies/DependencyFeature").default | import("./cache/CacheFeature").default | import("./conversation/ConversationFeature").default | import("./deploy/DeployFeature").default | import("./event/EventFeature").default | import("./eventContract/EventContractFeature").default | import("./log/LogFeature").default | import("./onboard/OnboardFeature").default | import("./organization/OrganizationFeature").default | import("./permission/PermissionFeature").default | import("./person/PersonFeature").default | import("./polish/PolishFeature").default | import("./sandbox/SandboxFeature").default | import("./store/StoreFeature").default | import("./view/ViewFeature").default | import("./vscode/VsCodeFeature").default | import("./watch/WatchFeature").default)[]>;
}
export default interface FeatureInstaller {
    isInstalled(code: FeatureCode): Promise<boolean>;
    markAsSkippedThisRun(code: FeatureCode): void;
    markAsPermanentlySkipped(code: FeatureCode): void;
    isMarkedAsSkipped(code: FeatureCode): boolean;
    getFeature<C extends FeatureCode>(code: C): FeatureMap[C];
    areInstalled(codes: FeatureCode[]): Promise<boolean>;
    install(options: InstallFeatureOptions): Promise<FeatureInstallResponse>;
    getInstalledFeatures(): Promise<FeatureMap[keyof FeatureMap][]>;
    getFeatureDependencies<C extends FeatureCode>(featureCode: C): FeatureDependency[];
    getAllCodes(): FeatureCode[];
    mapFeature<C extends FeatureCode>(code: C, feature: FeatureMap[C]): void;
    isInSpruceModule(): boolean;
}
