@hasna/domains 0.0.12 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -7,5 +7,10 @@ export { createAlert, getAlert, listAlerts, deleteAlert, type Alert, type Create
7
7
  export { whoisLookup, checkDnsPropagation, checkSsl, exportZoneFile, importZoneFile, discoverSubdomains, validateDns, exportPortfolio, checkAllDomains, type WhoisResult, type DnsPropagationResult, type SslCheckResult, type ZoneImportResult, type SubdomainResult, type DnsValidationIssue, type DnsValidationResult, type BulkCheckResult, } from "./db/domains.js";
8
8
  export { getDatabase, closeDatabase } from "./db/database.js";
9
9
  export { getProvider, getAvailableProviders, syncAll, autoDetectRegistrar, type RegistrarProvider, type ProviderDnsRecord, type ProviderDomainInfo, type ProviderAvailability, type ProviderInfo, type SyncAllResult, } from "./lib/registrar.js";
10
- export { checkAvailability as r53CheckAvailability, registerDomain as r53RegisterDomain, getRegistrationStatus as r53GetRegistrationStatus, listRegisteredDomains as r53ListRegisteredDomains, createHostedZone as r53CreateHostedZone, listHostedZones as r53ListHostedZones, getHostedZone as r53GetHostedZone, deleteHostedZone as r53DeleteHostedZone, findHostedZoneByDomain as r53FindHostedZoneByDomain, listRecords as r53ListRecords, upsertRecord as r53UpsertRecord, upsertRecords as r53UpsertRecords, deleteRecord as r53DeleteRecord, createRoute53Provider, getConfig as r53GetConfig, type Route53Config, type DomainContactInfo, type DomainAvailability, type RegisteredDomain, type HostedZoneInfo, type Route53Record, type Route53RecordInput, } from "./lib/route53.js";
10
+ export { checkAvailability as r53CheckAvailability, registerDomain as r53RegisterDomain, getRegistrationStatus as r53GetRegistrationStatus, updateNameservers as r53UpdateNameservers, listRegisteredDomains as r53ListRegisteredDomains, createHostedZone as r53CreateHostedZone, listHostedZones as r53ListHostedZones, getHostedZone as r53GetHostedZone, deleteHostedZone as r53DeleteHostedZone, findHostedZoneByDomain as r53FindHostedZoneByDomain, listRecords as r53ListRecords, upsertRecord as r53UpsertRecord, upsertRecords as r53UpsertRecords, deleteRecord as r53DeleteRecord, createRoute53Provider, getConfig as r53GetConfig, type Route53Config, type DomainContactInfo, type DomainAvailability, type RegisteredDomain, type HostedZoneInfo, type Route53Record, type Route53RecordInput, } from "./lib/route53.js";
11
+ export { createZone as cfCreateZone, getZone as cfGetZone, ensureZone as cfEnsureZone, upsertRecord as cfUpsertRecord, type CloudflareZone, } from "./lib/cloudflare.js";
12
+ export { resolveCloudflareConfig, cloudflareAuthHeaders, type CloudflareConfig } from "./lib/cloudflare-auth.js";
13
+ export { delegateDomainToCloudflare, type DelegateResult } from "./lib/delegate.js";
14
+ export { PROVIDER_CAPABILITIES, getCapability, canBuy, selectBuyRegistrar, selectDnsProvider, type ProviderCapability, } from "./lib/capability.js";
15
+ export { classifyRegistrationStatus, pollRegistrationUntilDone, type RegVerdict, type PollResult as RegistrationPollResult, } from "./lib/registration-poll.js";
11
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,KAAK,KAAK,EACV,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,OAAO,EACP,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,iBAAiB,IAAI,oBAAoB,EACzC,cAAc,IAAI,iBAAiB,EACnC,qBAAqB,IAAI,wBAAwB,EACjD,qBAAqB,IAAI,wBAAwB,EACjD,gBAAgB,IAAI,mBAAmB,EACvC,eAAe,IAAI,kBAAkB,EACrC,aAAa,IAAI,gBAAgB,EACjC,gBAAgB,IAAI,mBAAmB,EACvC,sBAAsB,IAAI,yBAAyB,EACnD,WAAW,IAAI,cAAc,EAC7B,YAAY,IAAI,eAAe,EAC/B,aAAa,IAAI,gBAAgB,EACjC,YAAY,IAAI,eAAe,EAC/B,qBAAqB,EACrB,SAAS,IAAI,YAAY,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15823,7 +15823,7 @@ var require_package = __commonJS((exports, module) => {
15823
15823
 
15824
15824
  // node_modules/@aws-sdk/util-user-agent-node/dist-cjs/index.js
15825
15825
  var require_dist_cjs41 = __commonJS((exports) => {
15826
- var __dirname = "/Users/hasna/Workspace/hasna/opensource/open-domains/node_modules/@aws-sdk/util-user-agent-node/dist-cjs";
15826
+ var __dirname = "/home/hasna/workspace/hasna/opensource/open-domains/node_modules/@aws-sdk/util-user-agent-node/dist-cjs";
15827
15827
  var node_os = __require("os");
15828
15828
  var node_process = __require("process");
15829
15829
  var utilConfigProvider = require_dist_cjs33();
@@ -29640,6 +29640,7 @@ var _Ex = "Expiry";
29640
29640
  var _F2 = "Fax";
29641
29641
  var _FC = "FilterCondition";
29642
29642
  var _FCi = "FilterConditions";
29643
+ var _FIAK = "FIAuthKey";
29643
29644
  var _FN = "FirstName";
29644
29645
  var _Fl2 = "Flags";
29645
29646
  var _GDD = "GetDomainDetail";
@@ -29713,6 +29714,9 @@ var _TTD = "TagsToDelete";
29713
29714
  var _Tl = "Tld";
29714
29715
  var _Ty = "Type";
29715
29716
  var _UD = "UpdatedDate";
29717
+ var _UDN = "UpdateDomainNameservers";
29718
+ var _UDNR = "UpdateDomainNameserversRequest";
29719
+ var _UDNRp = "UpdateDomainNameserversResponse";
29716
29720
  var _UTLD = "UnsupportedTLD";
29717
29721
  var _V2 = "Value";
29718
29722
  var _Va = "Values";
@@ -29803,6 +29807,7 @@ var ContactNumber = [0, n02, _CNo2, 8, 0];
29803
29807
  var CountryCode = [0, n02, _CC2, 8, 0];
29804
29808
  var Email = [0, n02, _E, 8, 0];
29805
29809
  var ExtraParamValue = [0, n02, _EPV, 8, 0];
29810
+ var FIAuthKey = [0, n02, _FIAK, 8, 0];
29806
29811
  var State = [0, n02, _S2, 8, 0];
29807
29812
  var ZipCode = [0, n02, _ZC, 8, 0];
29808
29813
  var CheckDomainAvailabilityRequest$ = [
@@ -29999,6 +30004,23 @@ var SortCondition$ = [
29999
30004
  [0, 0],
30000
30005
  2
30001
30006
  ];
30007
+ var UpdateDomainNameserversRequest$ = [
30008
+ 3,
30009
+ n02,
30010
+ _UDNR,
30011
+ 0,
30012
+ [_DN, _Na2, _FIAK],
30013
+ [0, () => NameserverList, [() => FIAuthKey, 0]],
30014
+ 2
30015
+ ];
30016
+ var UpdateDomainNameserversResponse$ = [
30017
+ 3,
30018
+ n02,
30019
+ _UDNRp,
30020
+ 0,
30021
+ [_OI],
30022
+ [0]
30023
+ ];
30002
30024
  var DnssecKeyList = [
30003
30025
  1,
30004
30026
  n02,
@@ -30098,6 +30120,14 @@ var RegisterDomain$ = [
30098
30120
  () => RegisterDomainRequest$,
30099
30121
  () => RegisterDomainResponse$
30100
30122
  ];
30123
+ var UpdateDomainNameservers$ = [
30124
+ 9,
30125
+ n02,
30126
+ _UDN,
30127
+ 0,
30128
+ () => UpdateDomainNameserversRequest$,
30129
+ () => UpdateDomainNameserversResponse$
30130
+ ];
30101
30131
 
30102
30132
  // node_modules/@aws-sdk/client-route-53-domains/dist-es/runtimeConfig.shared.js
30103
30133
  var getRuntimeConfig3 = (config) => {
@@ -30302,6 +30332,14 @@ class RegisterDomainCommand extends import_smithy_client23.Command.classBuilder(
30302
30332
  }).s("Route53Domains_v20140515", "RegisterDomain", {}).n("Route53DomainsClient", "RegisterDomainCommand").sc(RegisterDomain$).build() {
30303
30333
  }
30304
30334
 
30335
+ // node_modules/@aws-sdk/client-route-53-domains/dist-es/commands/UpdateDomainNameserversCommand.js
30336
+ var import_middleware_endpoint15 = __toESM(require_dist_cjs39(), 1);
30337
+ var import_smithy_client24 = __toESM(require_dist_cjs27(), 1);
30338
+ class UpdateDomainNameserversCommand extends import_smithy_client24.Command.classBuilder().ep(commonParams2).m(function(Command, cs, config, o3) {
30339
+ return [import_middleware_endpoint15.getEndpointPlugin(config, Command.getEndpointParameterInstructions())];
30340
+ }).s("Route53Domains_v20140515", "UpdateDomainNameservers", {}).n("Route53DomainsClient", "UpdateDomainNameserversCommand").sc(UpdateDomainNameservers$).build() {
30341
+ }
30342
+
30305
30343
  // src/lib/route53.ts
30306
30344
  function getConfig2() {
30307
30345
  return {
@@ -30401,6 +30439,17 @@ async function getDomainDetail(domain, config) {
30401
30439
  nameservers: (result.Nameservers ?? []).map((ns) => ns.Name ?? "").filter(Boolean)
30402
30440
  };
30403
30441
  }
30442
+ async function updateNameservers(domain, nameservers, config, client) {
30443
+ if (!nameservers.length) {
30444
+ throw new Error("updateNameservers requires at least one nameserver");
30445
+ }
30446
+ const domains = client ?? makeClients(config).domains;
30447
+ const result = await domains.send(new UpdateDomainNameserversCommand({
30448
+ DomainName: domain,
30449
+ Nameservers: nameservers.map((name) => ({ Name: name }))
30450
+ }));
30451
+ return { operationId: result.OperationId ?? "" };
30452
+ }
30404
30453
  async function listRegisteredDomains(config) {
30405
30454
  const { domains } = makeClients(config);
30406
30455
  const all = [];
@@ -30684,17 +30733,38 @@ function createRoute53Provider(config) {
30684
30733
  };
30685
30734
  }
30686
30735
 
30736
+ // src/lib/cloudflare-auth.ts
30737
+ function resolveCloudflareConfig(env = process.env) {
30738
+ const accountId = env["CLOUDFLARE_ACCOUNT_ID"] || env["HASNAXYZ_CLOUDFLARE_LIVE_ACCOUNT_ID"] || undefined;
30739
+ if (env["CLOUDFLARE_API_TOKEN"]) {
30740
+ return { apiToken: env["CLOUDFLARE_API_TOKEN"], accountId };
30741
+ }
30742
+ if (env["CLOUDFLARE_API_KEY"] && env["CLOUDFLARE_EMAIL"]) {
30743
+ return { apiKey: env["CLOUDFLARE_API_KEY"], email: env["CLOUDFLARE_EMAIL"], accountId };
30744
+ }
30745
+ if (env["HASNAXYZ_CLOUDFLARE_LIVE_API_KEY"] && env["HASNAXYZ_CLOUDFLARE_LIVE_EMAIL"]) {
30746
+ return {
30747
+ apiKey: env["HASNAXYZ_CLOUDFLARE_LIVE_API_KEY"],
30748
+ email: env["HASNAXYZ_CLOUDFLARE_LIVE_EMAIL"],
30749
+ accountId
30750
+ };
30751
+ }
30752
+ return accountId ? { accountId } : {};
30753
+ }
30754
+ function cloudflareAuthHeaders(cfg) {
30755
+ if (cfg.apiToken)
30756
+ return { Authorization: `Bearer ${cfg.apiToken}` };
30757
+ if (cfg.apiKey && cfg.email)
30758
+ return { "X-Auth-Key": cfg.apiKey, "X-Auth-Email": cfg.email };
30759
+ throw new Error("Cloudflare credentials not configured. Set CLOUDFLARE_API_TOKEN, or CLOUDFLARE_API_KEY + CLOUDFLARE_EMAIL.");
30760
+ }
30761
+
30687
30762
  // src/lib/cloudflare.ts
30688
30763
  function getConfig3() {
30689
- return {
30690
- apiToken: process.env["CLOUDFLARE_API_TOKEN"],
30691
- accountId: process.env["CLOUDFLARE_ACCOUNT_ID"]
30692
- };
30764
+ return resolveCloudflareConfig();
30693
30765
  }
30694
30766
  function checkCredentials2(cfg) {
30695
- if (!cfg.apiToken) {
30696
- throw new Error("Cloudflare credentials not configured. Set CLOUDFLARE_API_TOKEN environment variable.");
30697
- }
30767
+ cloudflareAuthHeaders(cfg);
30698
30768
  }
30699
30769
  var CF_BASE = "https://api.cloudflare.com/client/v4";
30700
30770
  async function cfFetch(path, opts = {}) {
@@ -30703,7 +30773,7 @@ async function cfFetch(path, opts = {}) {
30703
30773
  const res = await fetch(`${CF_BASE}${path}`, {
30704
30774
  method: opts.method ?? "GET",
30705
30775
  headers: {
30706
- Authorization: `Bearer ${cfg.apiToken}`,
30776
+ ...cloudflareAuthHeaders(cfg),
30707
30777
  "Content-Type": "application/json"
30708
30778
  },
30709
30779
  body: opts.body ? JSON.stringify(opts.body) : undefined
@@ -30722,6 +30792,24 @@ async function getZone(domain, config) {
30722
30792
  const z2 = result[0];
30723
30793
  return { id: z2.id, name: z2.name, status: z2.status, nameservers: z2.name_servers, original_nameservers: z2.original_name_servers };
30724
30794
  }
30795
+ async function createZone(domain, config) {
30796
+ const cfg = config ?? getConfig3();
30797
+ if (!cfg.accountId) {
30798
+ throw new Error("CLOUDFLARE_ACCOUNT_ID is required to create a zone.");
30799
+ }
30800
+ const result = await cfFetch("/zones", { method: "POST", body: { name: domain, account: { id: cfg.accountId }, jump_start: false }, config: cfg });
30801
+ return { id: result.id, name: result.name, status: result.status, nameservers: result.name_servers };
30802
+ }
30803
+ async function ensureZone(domain, config, deps) {
30804
+ const get = deps?.getZone ?? getZone;
30805
+ const create = deps?.createZone ?? createZone;
30806
+ const existing = await get(domain, config);
30807
+ const zone = existing ?? await create(domain, config);
30808
+ if (!zone.nameservers || zone.nameservers.length === 0) {
30809
+ throw new Error(`Cloudflare zone for ${domain} has no nameservers yet`);
30810
+ }
30811
+ return zone;
30812
+ }
30725
30813
  async function listRecords2(zoneId, config) {
30726
30814
  const records = [];
30727
30815
  let page = 1;
@@ -31231,6 +31319,72 @@ function autoDetectRegistrar(domain, getDomainByName2) {
31231
31319
  return "brandsight";
31232
31320
  return null;
31233
31321
  }
31322
+ // src/lib/delegate.ts
31323
+ async function delegateDomainToCloudflare(domain, deps) {
31324
+ const zone = await deps.createCloudflareZone(domain);
31325
+ if (!zone.nameservers || zone.nameservers.length === 0) {
31326
+ throw new Error(`Cloudflare zone for ${domain} returned no nameservers; cannot delegate`);
31327
+ }
31328
+ const { operationId } = await deps.updateNameservers(domain, zone.nameservers);
31329
+ return { zoneId: zone.id, nameservers: zone.nameservers, operationId };
31330
+ }
31331
+ // src/lib/capability.ts
31332
+ var PROVIDER_CAPABILITIES = {
31333
+ route53: { canBuy: true, canDns: true, gated: false, notes: "Full self-serve buy + hosted zones via AWS API; primary buy path." },
31334
+ cloudflare: { canBuy: false, canDns: true, gated: false, notes: "DNS/zone management only; not a registrar. Always our DNS." },
31335
+ namecheap: { canBuy: true, canDns: true, gated: false, notes: "Buy + DNS via API; requires API access + whitelisted IP." },
31336
+ godaddy: { canBuy: true, canDns: true, gated: true, notes: "Domains API gated behind account thresholds (>=10 / Discount Domain Club) since 2024; purchase + DNS writes unreliable." },
31337
+ brandsight: { canBuy: true, canDns: true, gated: true, notes: "GoDaddy Corporate Domains (enterprise/contract-only); credentials issued to onboarded clients, not self-serve." }
31338
+ };
31339
+ var UNKNOWN = { canBuy: false, canDns: false, gated: true, notes: "Unknown provider." };
31340
+ function getCapability(name) {
31341
+ return PROVIDER_CAPABILITIES[name.toLowerCase()] ?? UNKNOWN;
31342
+ }
31343
+ function canBuy(name) {
31344
+ const c3 = getCapability(name);
31345
+ return c3.canBuy && !c3.gated;
31346
+ }
31347
+ function selectBuyRegistrar(preference) {
31348
+ if (preference) {
31349
+ const c3 = getCapability(preference);
31350
+ if (!c3.canBuy)
31351
+ throw new Error(`Registrar '${preference}' cannot buy domains`);
31352
+ if (c3.gated)
31353
+ throw new Error(`Registrar '${preference}' is gated/enterprise-only and not available for automated purchase: ${c3.notes}`);
31354
+ return preference.toLowerCase();
31355
+ }
31356
+ return "route53";
31357
+ }
31358
+ function selectDnsProvider() {
31359
+ return "cloudflare";
31360
+ }
31361
+ // src/lib/registration-poll.ts
31362
+ function classifyRegistrationStatus(status) {
31363
+ const s3 = status.toUpperCase();
31364
+ if (s3 === "SUCCESSFUL")
31365
+ return "success";
31366
+ if (s3 === "ERROR" || s3 === "FAILED")
31367
+ return "failed";
31368
+ return "pending";
31369
+ }
31370
+ async function pollRegistrationUntilDone(operationId, opts) {
31371
+ const maxAttempts = opts.maxAttempts ?? 60;
31372
+ const intervalMs = opts.intervalMs ?? 1e4;
31373
+ const sleep = opts.sleep ?? ((ms) => new Promise((r3) => setTimeout(r3, ms)));
31374
+ let attempts = 0;
31375
+ while (attempts < maxAttempts) {
31376
+ const { status, message } = await opts.getStatus(operationId);
31377
+ attempts++;
31378
+ const verdict = classifyRegistrationStatus(status);
31379
+ if (verdict === "success")
31380
+ return { status: "success", attempts, message };
31381
+ if (verdict === "failed")
31382
+ return { status: "failed", attempts, message };
31383
+ if (attempts < maxAttempts)
31384
+ await sleep(intervalMs);
31385
+ }
31386
+ return { status: "timeout", attempts };
31387
+ }
31234
31388
  export {
31235
31389
  whoisLookup,
31236
31390
  validateDns,
@@ -31238,10 +31392,14 @@ export {
31238
31392
  updateDomain,
31239
31393
  updateDnsRecord,
31240
31394
  syncAll,
31395
+ selectDnsProvider,
31396
+ selectBuyRegistrar,
31241
31397
  searchDomains,
31398
+ resolveCloudflareConfig,
31242
31399
  recordDomainPurchase,
31243
31400
  upsertRecords as r53UpsertRecords,
31244
31401
  upsertRecord as r53UpsertRecord,
31402
+ updateNameservers as r53UpdateNameservers,
31245
31403
  registerDomain as r53RegisterDomain,
31246
31404
  listRegisteredDomains as r53ListRegisteredDomains,
31247
31405
  listRecords as r53ListRecords,
@@ -31254,6 +31412,7 @@ export {
31254
31412
  deleteHostedZone as r53DeleteHostedZone,
31255
31413
  createHostedZone as r53CreateHostedZone,
31256
31414
  checkAvailability3 as r53CheckAvailability,
31415
+ pollRegistrationUntilDone,
31257
31416
  markDomainPremium,
31258
31417
  listSslExpiring,
31259
31418
  listExpiring,
@@ -31274,6 +31433,7 @@ export {
31274
31433
  getDomain,
31275
31434
  getDnsRecord,
31276
31435
  getDatabase,
31436
+ getCapability,
31277
31437
  getByRegistrar,
31278
31438
  getAvailableProviders,
31279
31439
  getAlert,
@@ -31283,17 +31443,26 @@ export {
31283
31443
  deleteDomain,
31284
31444
  deleteDnsRecord,
31285
31445
  deleteAlert,
31446
+ delegateDomainToCloudflare,
31286
31447
  createRoute53Provider,
31287
31448
  createDomainOffer,
31288
31449
  createDomain,
31289
31450
  createDnsRecord,
31290
31451
  createAlert,
31291
31452
  countDomains,
31453
+ cloudflareAuthHeaders,
31292
31454
  closeDatabase,
31455
+ classifyRegistrationStatus,
31293
31456
  checkSsl,
31294
31457
  checkDnsPropagation,
31295
31458
  checkAllDomains,
31459
+ upsertRecord2 as cfUpsertRecord,
31460
+ getZone as cfGetZone,
31461
+ ensureZone as cfEnsureZone,
31462
+ createZone as cfCreateZone,
31463
+ canBuy,
31296
31464
  autoDetectRegistrar,
31465
+ PROVIDER_CAPABILITIES,
31297
31466
  DOMAIN_STATUSES,
31298
31467
  DOMAIN_OFFER_STATUSES,
31299
31468
  DOMAIN_EMAIL_TYPES
@@ -11,9 +11,29 @@
11
11
  */
12
12
  export interface BrandsightConfig {
13
13
  apiKey: string;
14
+ apiSecret?: string;
15
+ customerId?: string;
16
+ shopperId?: string;
14
17
  accountId?: string;
15
18
  baseUrl?: string;
16
19
  }
20
+ /**
21
+ * Resolve Brandsight (GoDaddy Corporate Domains) credentials from env, including
22
+ * the HASNAXYZ vault names which carry the full GoDaddy-style credential set
23
+ * (api_key + api_secret + customer_id + shopper_id). Pure / testable.
24
+ */
25
+ export declare function resolveBrandsightConfig(env?: Record<string, string | undefined>): BrandsightConfig;
26
+ export interface BrandsightCapability {
27
+ configured: boolean;
28
+ gated: boolean;
29
+ notes: string;
30
+ }
31
+ /**
32
+ * Brandsight is GoDaddy Corporate Domains — an enterprise/contract-only
33
+ * registrar. Even with credentials present, automated self-serve purchase is
34
+ * gated, so callers must not attempt it blindly.
35
+ */
36
+ export declare function brandsightCapability(env?: Record<string, string | undefined>): BrandsightCapability;
17
37
  export interface BrandsightDomain {
18
38
  domain: string;
19
39
  status: string;
@@ -1 +1 @@
1
- {"version":3,"file":"brandsight.d.ts","sourceRoot":"","sources":["../../src/lib/brandsight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brandsight.d.ts","sourceRoot":"","sources":["../../src/lib/brandsight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Registrar / DNS provider capability matrix (2026) and auto-selection.
3
+ *
4
+ * Captures what each provider can actually do via API, so callers never attempt
5
+ * a gated path silently. Findings (research, 2026):
6
+ * - Route53 Domains: full self-serve buy API, not volume-gated → primary buy.
7
+ * - GoDaddy retail: Domains API gated behind account thresholds (≥10 / DDC)
8
+ * since 2024; purchase + DNS writes unreliable → gated.
9
+ * - Brandsight / GoDaddy Corporate Domains: enterprise-contract-only → gated.
10
+ * - Cloudflare: DNS only (no registration) → always our DNS.
11
+ * - Namecheap: buy + DNS via API (sandbox/whitelist required) → usable.
12
+ */
13
+ export interface ProviderCapability {
14
+ canBuy: boolean;
15
+ canDns: boolean;
16
+ /** True when the API path exists but requires special access we may not have. */
17
+ gated: boolean;
18
+ notes: string;
19
+ }
20
+ export declare const PROVIDER_CAPABILITIES: Record<string, ProviderCapability>;
21
+ export declare function getCapability(name: string): ProviderCapability;
22
+ export declare function canBuy(name: string): boolean;
23
+ /**
24
+ * Choose the registrar to buy through. Defaults to Route53 (the only reliable
25
+ * self-serve API). An explicit preference is honored only if it is non-gated.
26
+ */
27
+ export declare function selectBuyRegistrar(preference?: string): string;
28
+ /** DNS is always Cloudflare, regardless of where the domain was bought. */
29
+ export declare function selectDnsProvider(): string;
30
+ //# sourceMappingURL=capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/lib/capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAMpE,CAAC;AAIF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAE9D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cloudflare auth resolution for open-domains — supports BOTH a scoped API
3
+ * token and a Global API Key + email (our vault stores the latter:
4
+ * HASNAXYZ_CLOUDFLARE_LIVE_API_KEY / _EMAIL). Pure + testable.
5
+ */
6
+ export interface CloudflareConfig {
7
+ apiToken?: string;
8
+ apiKey?: string;
9
+ email?: string;
10
+ accountId?: string;
11
+ }
12
+ export declare function resolveCloudflareConfig(env?: Record<string, string | undefined>): CloudflareConfig;
13
+ /** The auth headers to send for a given config. */
14
+ export declare function cloudflareAuthHeaders(cfg: CloudflareConfig): Record<string, string>;
15
+ //# sourceMappingURL=cloudflare-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-auth.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare-auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CACrC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,GAC1F,gBAAgB,CAqBlB;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMnF"}
@@ -6,10 +6,8 @@
6
6
  * CLOUDFLARE_ACCOUNT_ID — Account ID (required for zone creation)
7
7
  */
8
8
  import type { DnsProvider } from "./registrar.js";
9
- export interface CloudflareConfig {
10
- apiToken?: string;
11
- accountId?: string;
12
- }
9
+ import { type CloudflareConfig } from "./cloudflare-auth.js";
10
+ export type { CloudflareConfig };
13
11
  export interface CloudflareZone {
14
12
  id: string;
15
13
  name: string;
@@ -30,6 +28,17 @@ export declare function getConfig(): CloudflareConfig;
30
28
  export declare function listZones(config?: CloudflareConfig): Promise<CloudflareZone[]>;
31
29
  export declare function getZone(domain: string, config?: CloudflareConfig): Promise<CloudflareZone | null>;
32
30
  export declare function createZone(domain: string, config?: CloudflareConfig): Promise<CloudflareZone>;
31
+ /**
32
+ * Find-or-create a Cloudflare zone and return its assigned nameservers.
33
+ * Idempotent: reuses an existing zone for the domain if present. The returned
34
+ * nameservers are what the registrar should be delegated to (always-Cloudflare).
35
+ *
36
+ * `deps` is injectable for testing; defaults to the real getZone/createZone.
37
+ */
38
+ export declare function ensureZone(domain: string, config?: CloudflareConfig, deps?: {
39
+ getZone: (d: string, c?: CloudflareConfig) => Promise<CloudflareZone | null>;
40
+ createZone: (d: string, c?: CloudflareConfig) => Promise<CloudflareZone>;
41
+ }): Promise<CloudflareZone>;
33
42
  export declare function deleteZone(zoneId: string, config?: CloudflareConfig): Promise<void>;
34
43
  export declare function listRecords(zoneId: string, config?: CloudflareConfig): Promise<CloudflareRecord[]>;
35
44
  export declare function upsertRecord(zoneId: string, record: CloudflareRecord, config?: CloudflareConfig): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,gBAAgB,CAAC;AAIrE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,SAAS,IAAI,gBAAgB,CAK5C;AAwCD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAkBpF;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQvG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAUnG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAID,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkBxG;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrH;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7G;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjI;AAID,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,WAAW,CA4B/E"}
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAIjC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAqCD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAkBpF;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQvG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAUnG;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB,EACzB,IAAI,CAAC,EAAE;IACL,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7E,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E,GACA,OAAO,CAAC,cAAc,CAAC,CASzB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAID,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkBxG;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrH;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7G;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjI;AAID,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,WAAW,CA4B/E"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Provisioning credential status — reports, per provider, whether usable
3
+ * credentials are present (across all supported auth modes incl. HASNAXYZ vault
4
+ * env names). Pure (env injected) + used by `domains doctor`.
5
+ */
6
+ export interface CredStatus {
7
+ provider: string;
8
+ configured: boolean;
9
+ mode: string;
10
+ detail: string;
11
+ }
12
+ export declare function checkProvisioningCredentials(env?: Record<string, string | undefined>): CredStatus[];
13
+ //# sourceMappingURL=creds-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creds-check.d.ts","sourceRoot":"","sources":["../../src/lib/creds-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,GAC1F,UAAU,EAAE,CAqCd"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Cloudflare delegation — the always-Cloudflare-DNS rule in one place.
3
+ *
4
+ * After a domain is registered with ANY registrar, DNS is managed in Cloudflare:
5
+ * create (or reuse) a Cloudflare zone, then point the registrar's nameservers at
6
+ * the zone's assigned Cloudflare nameservers.
7
+ *
8
+ * Dependency-injected so it is fully unit-testable; the CLI wires the real
9
+ * Cloudflare `createZone` and Route53 `updateNameservers`.
10
+ */
11
+ export interface DelegateDeps {
12
+ /** Create or reuse a Cloudflare zone; returns its id + assigned nameservers. */
13
+ createCloudflareZone: (domain: string) => Promise<{
14
+ id: string;
15
+ nameservers: string[];
16
+ }>;
17
+ /** Point the registrar's nameservers at the given set. */
18
+ updateNameservers: (domain: string, nameservers: string[]) => Promise<{
19
+ operationId: string;
20
+ }>;
21
+ }
22
+ export interface DelegateResult {
23
+ zoneId: string;
24
+ nameservers: string[];
25
+ operationId: string;
26
+ }
27
+ export declare function delegateDomainToCloudflare(domain: string, deps: DelegateDeps): Promise<DelegateResult>;
28
+ //# sourceMappingURL=delegate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/lib/delegate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACzF,0DAA0D;IAC1D,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAOzB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Domain provisioning daemon — reconciles a set of domains toward `ready`.
3
+ *
4
+ * Each tick: gather live signals per domain, derive its lifecycle state, and run
5
+ * the next action (register / create_cf_zone / delegate_ns / check_ns_propagation
6
+ * / verify_dns / finalize). Signals + actions are injected so the loop is fully
7
+ * testable; the CLI wires real Route53/Cloudflare/DNS calls. State is derived
8
+ * live (no separate persistence needed), so a restart simply re-derives.
9
+ */
10
+ import { type DomainSignals, type DomainProvAction } from "./provision-state.js";
11
+ export interface DomainReconcileDeps {
12
+ gatherSignals: (domain: string) => Promise<DomainSignals>;
13
+ runAction: (domain: string, action: DomainProvAction) => Promise<void>;
14
+ log?: (event: string, detail: Record<string, unknown>) => void;
15
+ }
16
+ export interface DomainReconcileSummary {
17
+ processed: number;
18
+ advanced: number;
19
+ ready: number;
20
+ errors: number;
21
+ }
22
+ export declare function reconcileDomainTick(domains: string[], deps: DomainReconcileDeps): Promise<DomainReconcileSummary>;
23
+ export interface DomainDaemonOptions extends DomainReconcileDeps {
24
+ intervalSec?: number;
25
+ maxTicks?: number;
26
+ shouldStop?: () => boolean;
27
+ sleep?: (ms: number) => Promise<void>;
28
+ }
29
+ export declare function runDomainDaemon(domains: () => Promise<string[]>, opts: DomainDaemonOptions): Promise<DomainReconcileSummary>;
30
+ //# sourceMappingURL=domain-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-daemon.d.ts","sourceRoot":"","sources":["../../src/lib/domain-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAyBjC;AAED,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAiBjC"}
@@ -66,5 +66,17 @@ export declare function syncToLocalDb(dbFns: {
66
66
  createDomain: (input: CreateDomainInput) => Domain;
67
67
  updateDomain: (id: string, input: UpdateDomainInput) => Domain | null;
68
68
  }): Promise<GoDaddySyncResult>;
69
+ export interface GodaddyCapability {
70
+ configured: boolean;
71
+ gated: boolean;
72
+ notes: string;
73
+ }
74
+ /**
75
+ * GoDaddy retail Domains API capability. Since 2024 GoDaddy gated the Domains
76
+ * API behind account thresholds (>=10 domains / Discount Domain Club): the
77
+ * availability endpoint often still works, but production purchase and DNS
78
+ * writes require a qualifying account. We therefore treat purchase/DNS as gated.
79
+ */
80
+ export declare function godaddyCapability(env?: Record<string, string | undefined>): GodaddyCapability;
69
81
  export {};
70
82
  //# sourceMappingURL=godaddy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"godaddy.d.ts","sourceRoot":"","sources":["../../src/lib/godaddy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"godaddy.d.ts","sourceRoot":"","sources":["../../src/lib/godaddy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * NS drift reconciler — enforces the always-Cloudflare-DNS invariant across the
3
+ * portfolio: every domain's nameservers must point to Cloudflare. Detects drift
4
+ * (registrar NS not Cloudflare) and can re-delegate. Pure detection + an
5
+ * injected reconcile loop, so it is fully testable.
6
+ */
7
+ export declare function isCloudflareNs(ns: string[]): boolean;
8
+ export interface NsDriftVerdict {
9
+ domain: string;
10
+ drifted: boolean;
11
+ reason: string;
12
+ }
13
+ export declare function classifyNsDrift(domain: string, registrarNs: string[]): NsDriftVerdict;
14
+ export interface NsReconcileDeps {
15
+ getRegistrarNs: (domain: string) => Promise<string[]>;
16
+ getCloudflareNs: (domain: string) => Promise<string[]>;
17
+ setRegistrarNs: (domain: string, ns: string[]) => Promise<void>;
18
+ log?: (event: string, detail: Record<string, unknown>) => void;
19
+ }
20
+ export interface NsReconcileSummary {
21
+ checked: number;
22
+ drifted: NsDriftVerdict[];
23
+ fixed: string[];
24
+ errors: number;
25
+ }
26
+ export declare function reconcileNsDrift(domains: string[], deps: NsReconcileDeps, opts?: {
27
+ fix?: boolean;
28
+ }): Promise<NsReconcileSummary>;
29
+ //# sourceMappingURL=ns-drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns-drift.d.ts","sourceRoot":"","sources":["../../src/lib/ns-drift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpD;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,CAIrF;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,eAAe,EACrB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAwB7B"}