import { InterpreterFrom } from "xstate";
import { Language } from "@cdktf/provider-generator";
export { init, Project, InitArgs } from "./init";
export { get, GetStatus } from "./get";
import { SynthesizedStack } from "./synth-stack";
import { projectExecutionMachine } from "./project-execution";
import { DeployingResource, TerraformPlan } from "./models/terraform";
import { NestedTerraformOutputs } from "./output";
export { SynthesizedStack, Language };
export declare enum Status {
    STARTING = "starting",
    SYNTHESIZING = "synthesizing",
    SYNTHESIZED = "synthesized",
    INITIALIZING = "initializing",
    PLANNING = "planning",
    PLANNED = "planned",
    DEPLOYING = "deploying",
    DEPLOYED = "deployed",
    DESTROYING = "destroying",
    DESTROYED = "destroyed",
    OUTPUTS_FETCHED = "output fetched",
    ERROR = "error",
    WAITING_FOR_APPROVAL = "waiting for approval"
}
export declare type ProjectUpdate = {
    type: "synthesizing";
} | {
    type: "synthesized";
    stacks: SynthesizedStack[];
    errorMessage?: string;
} | {
    type: "planning";
    stackName: string;
} | {
    type: "planned";
    stackName: string;
    plan: TerraformPlan;
} | {
    type: "waiting for approval";
    stackName: string;
    plan: TerraformPlan;
    approve: () => void;
    reject: () => void;
} | {
    type: "deploying";
    stackName: string;
} | {
    type: "deploy update";
    stackName: string;
    deployOutput: string;
    resources: DeployingResource[];
} | {
    type: "deployed";
    stackName: string;
    outputsByConstructId: Record<string, any>;
    outputs: Record<string, any>;
} | {
    type: "destroying";
    stackName: string;
} | {
    type: "destroy update";
    stackName: string;
    destroyOutput: string;
    resources: DeployingResource[];
} | {
    type: "destroyed";
    stackName: string;
};
export declare class CdktfProject {
    stateMachine: InterpreterFrom<typeof projectExecutionMachine>;
    stackName?: string;
    currentPlan?: TerraformPlan;
    stacks?: SynthesizedStack[];
    outputs?: Record<string, any>;
    outputsByConstructId?: NestedTerraformOutputs;
    deployingResources?: DeployingResource[];
    constructor({ synthCommand, outDir, onUpdate, autoApprove, workingDirectory, }: {
        synthCommand: string;
        outDir: string;
        onUpdate: (update: ProjectUpdate) => void;
        autoApprove?: boolean;
        workingDirectory?: string;
    });
    get currentState(): string;
    private waitOnMachineDone;
    synth(): Promise<void>;
    diff(stackName?: string): Promise<void>;
    deploy(stackName?: string): Promise<void>;
    destroy(stackName?: string): Promise<void>;
    fetchOutputs(stackName?: string): Promise<Record<string, any> | undefined>;
}
