/**
 * AWS Route 53 provider — domain registration, hosted zones, and DNS management
 *
 * Supports:
 *   - Domain availability check + purchase via Route 53 Domains
 *   - Hosted zone CRUD via Route 53
 *   - DNS record management (list, upsert, delete)
 *
 * Env vars:
 *   AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION (optional, defaults to us-east-1)
 */
import type { fromTemporaryCredentials } from "@aws-sdk/credential-providers";
import type { FullProvider } from "./registrar.js";
export interface Route53Config {
    region?: string;
    accessKeyId?: string;
    secretAccessKey?: string;
    sessionToken?: string;
    profile?: string;
    credentials?: ReturnType<typeof fromTemporaryCredentials>;
}
export interface DomainContactInfo {
    first_name: string;
    last_name: string;
    email: string;
    phone: string;
    address_line_1: string;
    address_line_2?: string;
    city: string;
    state?: string;
    country_code: string;
    zip_code: string;
    organization_name?: string;
}
export interface DomainAvailability {
    domain: string;
    available: boolean;
    availability: string;
    price?: string;
    renewal_price?: string;
    transfer_price?: string;
    currency?: string;
}
export interface Route53TldPrice {
    tld: string;
    registration_price?: string;
    renewal_price?: string;
    transfer_price?: string;
    currency?: string;
}
export interface RegisteredDomain {
    domain: string;
    expiry: string;
    auto_renew: boolean;
    transfer_lock: boolean;
}
export interface Route53RegistrarOptions {
    privacy_protected?: boolean;
    nameservers?: string[];
}
export interface Route53OperationStatus {
    status: string;
    domain?: string;
    message?: string;
}
export interface Route53TransferOutAuthCode {
    auth_code: string;
    transfer_lock_disabled: boolean;
    transfer_lock_operation_id: string | null;
}
export interface HostedZoneInfo {
    id: string;
    name: string;
    record_count: number;
    comment?: string;
    name_servers?: string[];
    private_zone?: boolean;
}
export interface Route53Record {
    name: string;
    type: string;
    ttl: number;
    values: string[];
    /** Present when this is an alias record — values will be [] and ttl will be 0 */
    alias_target?: Route53AliasTarget;
}
export interface Route53AliasTarget {
    /** Hosted zone ID of the alias target (e.g. Z2FDTNDATAQYW2 for CloudFront) */
    hosted_zone_id: string;
    /** DNS name of the alias target (e.g. d1234.cloudfront.net) */
    dns_name: string;
}
export interface Route53RecordInput {
    name: string;
    type: string;
    ttl?: number;
    values: string[];
    /** When set, creates an alias record instead of a standard record. TTL and values are ignored. */
    alias_target?: Route53AliasTarget;
}
export interface Route53ChangeResult {
    changeId: string | null;
}
export interface Route53ChangeOptions {
    comment?: string;
}
export declare function getConfig(): Route53Config;
export declare function checkAvailability(domain: string, config?: Route53Config): Promise<DomainAvailability>;
export declare function getTldPrice(tld: string, config?: Route53Config): Promise<Route53TldPrice | null>;
export declare function listTldPrices(config?: Route53Config): Promise<Route53TldPrice[]>;
export declare function registerDomain(domain: string, contact: DomainContactInfo, durationYears?: number, autoRenew?: boolean, config?: Route53Config, options?: Route53RegistrarOptions): Promise<{
    operationId: string;
}>;
export declare function transferDomain(domain: string, authCode: string, contact: DomainContactInfo, durationYears?: number, autoRenew?: boolean, config?: Route53Config, options?: Route53RegistrarOptions): Promise<{
    operationId: string;
}>;
export declare function getRegistrationStatus(operationId: string, config?: Route53Config): Promise<Route53OperationStatus>;
export interface DomainDetail {
    domain: string;
    expiry: string;
    auto_renew: boolean | null;
    transfer_lock: boolean | null;
    created: string;
    updated: string;
    nameservers: string[];
    status_list: string[];
    registrar_name?: string;
    privacy_protected: boolean | null;
}
export declare function getRegistrationContactFromDomain(domain: string, config?: Route53Config): Promise<DomainContactInfo>;
/** Absence is a completed ListDomains inventory, never an error-message match. */
export declare function findRegisteredDomainDetail(domain: string, config?: Route53Config): Promise<DomainDetail | null>;
export declare function getDomainDetail(domain: string, config?: Route53Config): Promise<DomainDetail>;
export declare function requestTransferOutAuthCode(domain: string, config?: Route53Config): Promise<Route53TransferOutAuthCode>;
/** Minimal Route53 Domains client surface — lets tests inject a fake `send`. */
type Route53DomainsSend = {
    send: (cmd: unknown) => Promise<{
        OperationId?: string;
    }>;
};
/**
 * Point a domain's nameservers at a new set (the Cloudflare zone NS).
 *
 * Point a Route 53-registered domain at the chosen DNS provider's nameservers.
 * Returns the async operation id (poll getOperationDetail).
 */
export declare function updateNameservers(domain: string, nameservers: string[], config?: Route53Config, client?: Route53DomainsSend): Promise<{
    operationId: string;
}>;
export declare function listRegisteredDomains(config?: Route53Config): Promise<RegisteredDomain[]>;
export declare function createHostedZone(domain: string, comment?: string, config?: Route53Config, options?: {
    callerReference?: string;
}): Promise<HostedZoneInfo>;
export declare function listHostedZones(config?: Route53Config): Promise<HostedZoneInfo[]>;
export declare function getHostedZone(hostedZoneId: string, config?: Route53Config): Promise<HostedZoneInfo & {
    name_servers: string[];
}>;
export declare function deleteHostedZone(hostedZoneId: string, config?: Route53Config): Promise<void>;
export declare function listHostedZonesByDomain(domain: string, config?: Route53Config): Promise<HostedZoneInfo[]>;
export interface DefaultHostedZoneDeleteResult {
    deleted: boolean;
    reason?: string;
}
/**
 * Delete only an exact, empty Route 53 default zone. This never deletes record
 * sets. The final DeleteHostedZone call is the TOCTOU guard: if any record is
 * added after inspection, Route 53 rejects the delete as HostedZoneNotEmpty.
 */
export declare function deleteDefaultHostedZone(hostedZoneId: string, domain: string, delegatedNameservers: string[], config?: Route53Config): Promise<DefaultHostedZoneDeleteResult>;
export declare function findHostedZoneByDomain(domain: string, config?: Route53Config): Promise<HostedZoneInfo | null>;
export declare function findHostedZoneByNameservers(domain: string, nameservers: string[], config?: Route53Config): Promise<HostedZoneInfo | null>;
export declare function listRecords(hostedZoneId: string, config?: Route53Config, options?: {
    requireSimpleRouting?: boolean;
}): Promise<Route53Record[]>;
export declare function upsertRecord(hostedZoneId: string, record: Route53RecordInput, config?: Route53Config, options?: Route53ChangeOptions): Promise<Route53ChangeResult>;
export declare function deleteRecord(hostedZoneId: string, record: Route53RecordInput, config?: Route53Config, options?: Route53ChangeOptions): Promise<Route53ChangeResult>;
export declare function upsertRecords(hostedZoneId: string, records: Route53RecordInput[], config?: Route53Config, options?: Route53ChangeOptions): Promise<Route53ChangeResult>;
export declare function createRoute53Provider(config?: Route53Config): FullProvider;
export {};
//# sourceMappingURL=route53.d.ts.map