UNPKG

@hasna/domains

Version:

Domain portfolio, registrar, marketplace, and DNS management for AI agents — CLI + MCP + HTTP API + SDK, shared account API and PostgreSQL

149 lines • 5.43 kB
/** * Unified registrar provider system * * Wraps Namecheap and GoDaddy into a common RegistrarProvider interface. */ import type { Domain, CreateDomainInput, UpdateDomainInput } from "../db/domains.js"; export interface ProviderDnsRecord { type: string; name: string; value: string; ttl: number; priority?: number; proxied?: boolean; } export interface ProviderDomainInfo { domain: string; registrar: string; created: string; expires: string; nameservers: string[]; status: string; auto_renew: boolean; } export interface ProviderRenewResult { domain: string; success: boolean; orderId?: string; chargedAmount?: string; } export interface ProviderRegistrationContact { first_name: string; last_name: string; email: string; phone: string; address_line_1: string; city: string; state: string; country_code: string; zip_code: string; organization_name?: string; } export interface ProviderRegistrationOptions { years?: number; autoRenew?: boolean; premiumPrice?: number; nameservers?: string[]; metadata?: Record<string, unknown>; privacy?: boolean; } export interface ProviderRegistrationResult { domain: string; success: boolean; orderId?: string; operationId?: string; chargedAmount?: string; } export interface ProviderNameserverUpdateResult { domain: string; success: boolean; operationId?: string; } export interface ProviderSyncResult { synced: number; created: number; updated: number; errors: string[]; } export interface ProviderAvailability { domain: string; available: boolean; is_premium?: boolean; premium_price?: number; standard_price?: number; currency?: string; } export type DbFunctions = { getDomainByName: (name: string) => Promise<Domain | null>; createDomain: (input: CreateDomainInput) => Promise<Domain>; updateDomain: (id: string, input: UpdateDomainInput) => Promise<Domain | null>; }; /** Handles domain inventory discovery and sync into the local portfolio. */ export interface DomainInventoryProvider { name: string; listDomains(): Promise<ProviderDomainInfo[]>; syncToLocalDb(dbFns: DbFunctions): Promise<ProviderSyncResult>; } /** Handles domain registration, renewal, and availability checks */ export interface RegistrarProvider extends DomainInventoryProvider { getDomainInfo(domain: string): Promise<ProviderDomainInfo>; renewDomain(domain: string, years?: number): Promise<ProviderRenewResult>; checkAvailability(domain: string): Promise<ProviderAvailability>; registerDomain?(domain: string, contact: ProviderRegistrationContact, options?: ProviderRegistrationOptions): Promise<ProviderRegistrationResult>; updateNameservers?(domain: string, nameservers: string[]): Promise<ProviderNameserverUpdateResult>; } /** Handles DNS zone and record management */ export type DnsWriteScope = "full-zone" | "changed-groups"; export interface DnsProvider { name: string; /** Omission is conservative: setDnsRecords receives the complete desired zone. */ dnsWriteScope?: DnsWriteScope; getDnsRecords(domain: string): Promise<ProviderDnsRecord[]>; setDnsRecords(domain: string, records: ProviderDnsRecord[]): Promise<boolean>; /** * Delete the EXACT live records matching the given records. * * Omission is conservative: `dns apply` refuses a delete plan * (`delete-apply-unsupported`) unless the provider can converge on deletes through * this route, so a non-deletable provider is never written into a partial state. */ deleteDnsRecords?(domain: string, records: ProviderDnsRecord[]): Promise<boolean>; } /** A provider that does both — e.g. Route 53 */ export type FullProvider = RegistrarProvider & DnsProvider; export interface ProviderInfo { name: string; type: "registrar" | "dns" | "full" | "marketplace"; configured: boolean; inventory?: boolean; envVars: string[]; } export interface SyncAllResult { providers: { name: string; result: ProviderSyncResult; }[]; totalSynced: number; totalErrors: string[]; } interface RegistryEntry { info: ProviderInfo; createInventory?: () => DomainInventoryProvider; createRegistrar?: () => RegistrarProvider; createDns?: () => DnsProvider; } export declare function registerProvider(entry: RegistryEntry): void; export declare function getAvailableProviders(): ProviderInfo[]; export declare function getProviderInfo(name: string): ProviderInfo | null; export declare function providerHasRegistrar(name: string): boolean; export declare function providerHasDns(name: string): boolean; export declare function providerHasInventory(name: string): boolean; export declare function getDomainInventoryProvider(name: string): DomainInventoryProvider; export declare function getRegistrarProvider(name: string): RegistrarProvider; export declare function getDnsProvider(name: string): DnsProvider; /** @deprecated Use getRegistrarProvider() */ export declare function getProvider(name: string): RegistrarProvider; export declare function syncAll(dbFns: DbFunctions): Promise<SyncAllResult>; export declare function autoDetectRegistrar(domain: string, getDomainByName: (name: string) => Promise<Domain | null>): Promise<string | null>; export {}; //# sourceMappingURL=registrar.d.ts.map