import type { DnsProvider } from '../dns/types';
import { CloudFormationClient } from '../aws/cloudformation';
import { CloudFrontClient } from '../aws/cloudfront';
import { STSClient } from '../aws/sts';
export interface ExistingStaticFullStackOptions {
    name: string;
    slug: string;
    imageUri: string;
    distributionId: string;
    expectedAlias: string;
    stackName?: string;
    region?: string;
    profile?: string;
    pathPattern?: string;
    originId?: string;
    originDomain?: string;
    certificateArn?: string;
    originVerifySecret?: string;
    desiredCount?: number;
    database?: boolean;
    cache?: boolean;
    queue?: boolean;
    apply?: boolean;
    confirm?: string;
    skipHealthCheck?: boolean;
}
export interface ExistingStaticFullStackPlan {
    mode: 'plan' | 'apply';
    accountId: string;
    stack: {
        name: string;
        existed: boolean;
        status?: string;
        templateSha256: string;
        resourceCount: number;
        resourceTypes: Record<string, number>;
    };
    distribution: {
        id: string;
        alias: string;
        domainName: string;
        status: string;
        pathPattern: string;
        originId: string;
    };
    artifact: {
        imageUri: string;
        digest: string;
    };
    services: {
        database: boolean;
        cache: boolean;
        queue: boolean;
        mail: 'ses';
        desiredCount: number;
    };
    outputs?: Record<string, string>;
    health?: {
        url: string;
        status: number;
        latencyMs: number;
        body: unknown;
    };
    cloudFrontApplied: boolean;
    dnsApplied: boolean;
    applied: boolean;
    rollback: string[];
}
export interface ExistingStaticFullStackDependencies {
    cloudformation: Pick<CloudFormationClient, 'describeStacks' | 'createStack' | 'updateStack' | 'waitForStack'>;
    cloudfront: Pick<CloudFrontClient, 'getDistribution' | 'upsertExistingDistributionOrigin'>;
    sts: Pick<STSClient, 'getCallerIdentity'>;
    dns?: Pick<DnsProvider, 'upsertRecord'>;
    fetch: typeof fetch;
    sleep: (milliseconds: number) => Promise<void>;
}
export declare function createExistingStaticFullStackDependencies(options: Pick<ExistingStaticFullStackOptions, 'region' | 'profile'>): ExistingStaticFullStackDependencies;
export declare function generateExistingStaticFullStackTemplate(options: ExistingStaticFullStackOptions): Record<string, any>;
export declare function deployExistingStaticFullStack(options: ExistingStaticFullStackOptions, injected?: ExistingStaticFullStackDependencies): Promise<ExistingStaticFullStackPlan>;
export declare function estimateExistingStaticFullStackMonthlyCost(options?: {
    desiredCount?: number;
    multiAzDatabase?: boolean;
}): {
    monthlyUsd: number;
    components: Record<string, number>;
    assumptions: string[];
};
