@hasna/domains
Version:
Domain portfolio, registrar, marketplace, and DNS management for AI agents — CLI + MCP + HTTP API + SDK, shared account API and PostgreSQL
180 lines • 7.69 kB
TypeScript
/**
* 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