groundmail 0.27.0 → 0.28.0

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/authjs.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { G as Groundmail } from './client-Btlt7wMg.js';
1
+ import { G as Groundmail } from './client-DdtHUMEu.js';
2
2
 
3
3
  /** Subset of Auth.js theme used for the default magic-link email. */
4
4
  type AuthjsTheme = {
package/dist/authjs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_API_BASE_URL,
3
3
  Groundmail
4
- } from "./chunk-RLIF6XKO.js";
4
+ } from "./chunk-POS35D4J.js";
5
5
 
6
6
  // src/authjs.ts
7
7
  function escapeHtml(value) {
@@ -1,4 +1,4 @@
1
- import { S as SendEmailResult, G as Groundmail } from './client-Btlt7wMg.js';
1
+ import { S as SendEmailResult, G as Groundmail } from './client-DdtHUMEu.js';
2
2
 
3
3
  type BetterAuthEmailUser = {
4
4
  email: string;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_API_BASE_URL,
3
3
  Groundmail
4
- } from "./chunk-RLIF6XKO.js";
4
+ } from "./chunk-POS35D4J.js";
5
5
 
6
6
  // src/better-auth.ts
7
7
  function linkHtml(label, url) {
@@ -301,8 +301,183 @@ function createCloudflareProvider(options) {
301
301
  };
302
302
  }
303
303
 
304
- // src/dns/godaddy.ts
304
+ // src/dns/record-store.ts
305
+ function zoneNameCandidates2(domain) {
306
+ const labels = domain.replace(/\.$/, "").toLowerCase().split(".").filter(Boolean);
307
+ const candidates = [];
308
+ for (let i = 0; i <= labels.length - 2; i++) {
309
+ candidates.push(labels.slice(i).join("."));
310
+ }
311
+ return candidates;
312
+ }
305
313
  function relativeName2(fqdn2, zone) {
314
+ const domain = zone.replace(/\.$/, "").toLowerCase();
315
+ const host = fqdn2.replace(/\.$/, "").toLowerCase();
316
+ if (host === domain) return "";
317
+ if (host.endsWith(`.${domain}`)) return host.slice(0, -(domain.length + 1));
318
+ return host;
319
+ }
320
+ function fqdn(name, zone) {
321
+ return name ? `${name}.${zone}` : zone;
322
+ }
323
+ function normalizeValue(type, value) {
324
+ const trimmed = value.trim();
325
+ if (type === "TXT") return trimmed.replace(/^"([\s\S]*)"$/, "$1").replace(/"\s+"/g, "");
326
+ return trimmed.replace(/\.$/, "").toLowerCase();
327
+ }
328
+ function ownedTxt(purpose, value) {
329
+ const lower = value.toLowerCase();
330
+ if (purpose === "Domain ownership") return lower.includes("groundmail-verify=");
331
+ if (purpose === "DKIM") return lower.includes("v=dkim1");
332
+ if (purpose === "DMARC") return lower.includes("v=dmarc1");
333
+ return false;
334
+ }
335
+ async function applyToRecordStore(zone, records, store) {
336
+ const results = [];
337
+ let cached = await store.list();
338
+ const at = (type, name) => cached.filter((row) => row.type.toUpperCase() === type && row.name === name);
339
+ for (const record of records) {
340
+ const type = record.type.toUpperCase();
341
+ const name = relativeName2(record.host, zone);
342
+ const value = normalizeValue(type, record.value);
343
+ const done = (action, detail) => results.push({ purpose: record.purpose, host: record.host, action, ...detail ? { detail } : {} });
344
+ if (type === "CNAME") {
345
+ const existing = at("CNAME", name)[0];
346
+ if (existing && normalizeValue(type, existing.value) === value) {
347
+ done("unchanged");
348
+ continue;
349
+ }
350
+ if (existing) {
351
+ await store.update(existing, { name, type, value });
352
+ done("updated");
353
+ } else {
354
+ await store.create({ name, type, value });
355
+ done("created");
356
+ }
357
+ } else if (type === "MX") {
358
+ const priority = record.priority ?? 10;
359
+ const sameName = at("MX", name);
360
+ if (sameName.some((row) => normalizeValue(type, row.value) === value && (row.priority ?? 10) === priority)) {
361
+ done("unchanged");
362
+ continue;
363
+ }
364
+ await store.create({ name, type, value, priority });
365
+ done(sameName.length > 0 ? "merged" : "created");
366
+ } else if (type !== "TXT") {
367
+ done("unchanged", `Skipped unsupported type ${record.type}`);
368
+ continue;
369
+ } else if (record.purpose === "SPF") {
370
+ const existing = at("TXT", name).find((row) => isSpfRecord(normalizeValue(type, row.value)));
371
+ const includeHost = record.value.match(/include:([^\s"]+)/i)?.[1] || "spf.groundmail.dev";
372
+ const current = existing ? normalizeValue(type, existing.value) : void 0;
373
+ const merged = mergeSpfInclude(current, includeHost);
374
+ if (existing && current?.trim() === merged.trim()) {
375
+ done("unchanged", "SPF already includes Groundmail");
376
+ continue;
377
+ }
378
+ if (existing) {
379
+ await store.update(existing, { name, type, value: merged });
380
+ done("merged", merged);
381
+ } else {
382
+ await store.create({ name, type, value: merged });
383
+ done("created", merged);
384
+ }
385
+ } else {
386
+ const sameName = at("TXT", name);
387
+ if (sameName.some((row) => normalizeValue(type, row.value) === value)) {
388
+ done("unchanged");
389
+ continue;
390
+ }
391
+ const replaceable = sameName.find((row) => ownedTxt(record.purpose, normalizeValue(type, row.value)));
392
+ if (replaceable) {
393
+ await store.update(replaceable, { name, type, value });
394
+ done("updated");
395
+ } else {
396
+ await store.create({ name, type, value });
397
+ done("created");
398
+ }
399
+ }
400
+ cached = await store.list();
401
+ }
402
+ return results;
403
+ }
404
+ async function resolveZone(domain, hostLabel, lookup) {
405
+ for (const candidate of zoneNameCandidates2(domain)) {
406
+ const info = await lookup(candidate);
407
+ if (info !== null) return { zone: candidate, info };
408
+ }
409
+ throw new Error(`No ${hostLabel} DNS zone found for ${domain}. The domain must use ${hostLabel} nameservers.`);
410
+ }
411
+
412
+ // src/dns/godaddy-token.ts
413
+ function createGoDaddyTokenProvider(options) {
414
+ const fetchImpl = options.fetchImpl || fetch;
415
+ async function godaddy(path, init) {
416
+ const response = await fetchImpl(`https://api.godaddy.com/v3/domains${path}`, {
417
+ ...init,
418
+ headers: {
419
+ Authorization: `Bearer ${options.apiToken}`,
420
+ "Content-Type": "application/json",
421
+ Accept: "application/json",
422
+ ...init?.headers || {}
423
+ }
424
+ });
425
+ const body = response.status === 204 ? {} : await response.json().catch(() => ({}));
426
+ if (!response.ok && response.status !== 404) {
427
+ if (response.status === 401 || response.status === 403) {
428
+ throw new Error(
429
+ "GoDaddy refused the token. Create a Personal Access Token with the domains.domain:read and domains.dns:update scopes."
430
+ );
431
+ }
432
+ throw new Error(body.message || body.code || `GoDaddy HTTP ${response.status}`);
433
+ }
434
+ return { status: response.status, body };
435
+ }
436
+ return {
437
+ name: "godaddy",
438
+ async apply(domain, records) {
439
+ const { zone } = await resolveZone(domain, "GoDaddy", async (candidate) => {
440
+ const { status } = await godaddy(`/zones/${encodeURIComponent(candidate)}/dns-records?pageSize=1`);
441
+ return status === 404 ? null : true;
442
+ });
443
+ const path = `/zones/${encodeURIComponent(zone)}/dns-records`;
444
+ const body = (record) => ({
445
+ name: record.name || "@",
446
+ type: record.type,
447
+ data: record.value,
448
+ ttl: 600,
449
+ ...record.priority != null ? { priority: record.priority } : {}
450
+ });
451
+ const write = async (method, suffix, record) => {
452
+ const { status } = await godaddy(`${path}${suffix}`, { method, body: JSON.stringify(body(record)) });
453
+ if (status === 404) throw new Error(`GoDaddy lost the ${zone} zone mid-update`);
454
+ };
455
+ return applyToRecordStore(zone, records, {
456
+ async list() {
457
+ const rows = [];
458
+ for (let page = 1; page <= 20; page++) {
459
+ const { body: list } = await godaddy(`${path}?page=${page}&pageSize=100`);
460
+ const items = list.items || [];
461
+ rows.push(...items);
462
+ if (items.length < 100 || !list.links?.some((link) => link.rel === "next")) break;
463
+ }
464
+ return rows.map((row) => ({
465
+ id: row.recordId,
466
+ name: row.name === "@" ? "" : row.name.toLowerCase(),
467
+ type: row.type,
468
+ value: row.data,
469
+ priority: row.priority ?? void 0
470
+ }));
471
+ },
472
+ create: (record) => write("POST", "", record),
473
+ update: (existing, record) => write("PUT", `/${encodeURIComponent(existing.id)}`, record)
474
+ });
475
+ }
476
+ };
477
+ }
478
+
479
+ // src/dns/godaddy.ts
480
+ function relativeName3(fqdn2, zone) {
306
481
  const domain = zone.replace(/\.$/, "").toLowerCase();
307
482
  const host = fqdn2.replace(/\.$/, "").toLowerCase();
308
483
  if (host === domain) return "@";
@@ -318,7 +493,7 @@ function serializeGoDaddyMxRecords(name, rows) {
318
493
  ttl: Math.max(row.ttl || 600, 600)
319
494
  }));
320
495
  }
321
- function createGoDaddyProvider(options) {
496
+ function createGoDaddyKeyProvider(options) {
322
497
  const fetchImpl = options.fetchImpl || fetch;
323
498
  const headers = {
324
499
  Authorization: `sso-key ${options.apiKey}:${options.apiSecret}`,
@@ -345,7 +520,7 @@ function createGoDaddyProvider(options) {
345
520
  const results = [];
346
521
  for (const record of records) {
347
522
  const recordType = record.type.toUpperCase();
348
- const name = relativeName2(record.host, zone);
523
+ const name = relativeName3(record.host, zone);
349
524
  if (recordType === "CNAME") {
350
525
  const target = record.value.replace(/\.$/, "");
351
526
  const existing2 = await gd(
@@ -470,113 +645,9 @@ function createGoDaddyProvider(options) {
470
645
  }
471
646
  };
472
647
  }
473
-
474
- // src/dns/record-store.ts
475
- function zoneNameCandidates2(domain) {
476
- const labels = domain.replace(/\.$/, "").toLowerCase().split(".").filter(Boolean);
477
- const candidates = [];
478
- for (let i = 0; i <= labels.length - 2; i++) {
479
- candidates.push(labels.slice(i).join("."));
480
- }
481
- return candidates;
482
- }
483
- function relativeName3(fqdn2, zone) {
484
- const domain = zone.replace(/\.$/, "").toLowerCase();
485
- const host = fqdn2.replace(/\.$/, "").toLowerCase();
486
- if (host === domain) return "";
487
- if (host.endsWith(`.${domain}`)) return host.slice(0, -(domain.length + 1));
488
- return host;
489
- }
490
- function fqdn(name, zone) {
491
- return name ? `${name}.${zone}` : zone;
492
- }
493
- function normalizeValue(type, value) {
494
- const trimmed = value.trim();
495
- if (type === "TXT") return trimmed.replace(/^"([\s\S]*)"$/, "$1").replace(/"\s+"/g, "");
496
- return trimmed.replace(/\.$/, "").toLowerCase();
497
- }
498
- function ownedTxt(purpose, value) {
499
- const lower = value.toLowerCase();
500
- if (purpose === "Domain ownership") return lower.includes("groundmail-verify=");
501
- if (purpose === "DKIM") return lower.includes("v=dkim1");
502
- if (purpose === "DMARC") return lower.includes("v=dmarc1");
503
- return false;
504
- }
505
- async function applyToRecordStore(zone, records, store) {
506
- const results = [];
507
- let cached = await store.list();
508
- const at = (type, name) => cached.filter((row) => row.type.toUpperCase() === type && row.name === name);
509
- for (const record of records) {
510
- const type = record.type.toUpperCase();
511
- const name = relativeName3(record.host, zone);
512
- const value = normalizeValue(type, record.value);
513
- const done = (action, detail) => results.push({ purpose: record.purpose, host: record.host, action, ...detail ? { detail } : {} });
514
- if (type === "CNAME") {
515
- const existing = at("CNAME", name)[0];
516
- if (existing && normalizeValue(type, existing.value) === value) {
517
- done("unchanged");
518
- continue;
519
- }
520
- if (existing) {
521
- await store.update(existing, { name, type, value });
522
- done("updated");
523
- } else {
524
- await store.create({ name, type, value });
525
- done("created");
526
- }
527
- } else if (type === "MX") {
528
- const priority = record.priority ?? 10;
529
- const sameName = at("MX", name);
530
- if (sameName.some((row) => normalizeValue(type, row.value) === value && (row.priority ?? 10) === priority)) {
531
- done("unchanged");
532
- continue;
533
- }
534
- await store.create({ name, type, value, priority });
535
- done(sameName.length > 0 ? "merged" : "created");
536
- } else if (type !== "TXT") {
537
- done("unchanged", `Skipped unsupported type ${record.type}`);
538
- continue;
539
- } else if (record.purpose === "SPF") {
540
- const existing = at("TXT", name).find((row) => isSpfRecord(normalizeValue(type, row.value)));
541
- const includeHost = record.value.match(/include:([^\s"]+)/i)?.[1] || "spf.groundmail.dev";
542
- const current = existing ? normalizeValue(type, existing.value) : void 0;
543
- const merged = mergeSpfInclude(current, includeHost);
544
- if (existing && current?.trim() === merged.trim()) {
545
- done("unchanged", "SPF already includes Groundmail");
546
- continue;
547
- }
548
- if (existing) {
549
- await store.update(existing, { name, type, value: merged });
550
- done("merged", merged);
551
- } else {
552
- await store.create({ name, type, value: merged });
553
- done("created", merged);
554
- }
555
- } else {
556
- const sameName = at("TXT", name);
557
- if (sameName.some((row) => normalizeValue(type, row.value) === value)) {
558
- done("unchanged");
559
- continue;
560
- }
561
- const replaceable = sameName.find((row) => ownedTxt(record.purpose, normalizeValue(type, row.value)));
562
- if (replaceable) {
563
- await store.update(replaceable, { name, type, value });
564
- done("updated");
565
- } else {
566
- await store.create({ name, type, value });
567
- done("created");
568
- }
569
- }
570
- cached = await store.list();
571
- }
572
- return results;
573
- }
574
- async function resolveZone(domain, hostLabel, lookup) {
575
- for (const candidate of zoneNameCandidates2(domain)) {
576
- const info = await lookup(candidate);
577
- if (info !== null) return { zone: candidate, info };
578
- }
579
- throw new Error(`No ${hostLabel} DNS zone found for ${domain}. The domain must use ${hostLabel} nameservers.`);
648
+ function createGoDaddyProvider(options) {
649
+ if ("apiToken" in options) return createGoDaddyTokenProvider({ apiToken: options.apiToken, fetchImpl: options.fetchImpl });
650
+ return createGoDaddyKeyProvider(options);
580
651
  }
581
652
 
582
653
  // src/dns/digitalocean.ts
@@ -734,7 +805,7 @@ function createNetlifyProvider(options) {
734
805
  const rows = await netlify(`/dns_zones/${info.id}/dns_records`);
735
806
  return rows.filter((row) => !row.managed).map((row) => ({
736
807
  id: row.id,
737
- name: relativeName3(row.hostname, zone),
808
+ name: relativeName2(row.hostname, zone),
738
809
  type: row.type,
739
810
  value: row.value,
740
811
  priority: row.priority ?? void 0
@@ -993,11 +1064,13 @@ function createDnsProvider(provider, credentials, fetchImpl) {
993
1064
  });
994
1065
  }
995
1066
  if (provider === "godaddy") {
1067
+ const apiToken = credentials.godaddyApiToken;
1068
+ if (apiToken) return createGoDaddyProvider({ apiToken, fetchImpl });
996
1069
  const apiKey = credentials.godaddyApiKey;
997
1070
  const apiSecret = credentials.godaddyApiSecret;
998
1071
  if (!apiKey || !apiSecret) {
999
1072
  throw new Error(
1000
- "Missing GoDaddy credentials. Set GODADDY_API_KEY and GODADDY_API_SECRET."
1073
+ "Missing GoDaddy credentials. Set GODADDY_PAT (a Personal Access Token), or GODADDY_API_KEY and GODADDY_API_SECRET."
1001
1074
  );
1002
1075
  }
1003
1076
  return createGoDaddyProvider({ apiKey, apiSecret, fetchImpl });
@@ -1395,6 +1468,7 @@ var DomainsResource = class {
1395
1468
  credentials: {
1396
1469
  cloudflareApiToken: params.cloudflareApiToken,
1397
1470
  cloudflareZoneId: params.cloudflareZoneId,
1471
+ godaddyApiToken: params.godaddyApiToken,
1398
1472
  godaddyApiKey: params.godaddyApiKey,
1399
1473
  godaddyApiSecret: params.godaddyApiSecret,
1400
1474
  vercelApiToken: params.vercelApiToken,
package/dist/clerk.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { G as Groundmail, S as SendEmailResult } from './client-Btlt7wMg.js';
1
+ import { G as Groundmail, S as SendEmailResult } from './client-DdtHUMEu.js';
2
2
 
3
3
  /**
4
4
  * Subset of Clerk `email.created` webhook `data` used for delivery.
package/dist/clerk.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_API_BASE_URL,
3
3
  Groundmail
4
- } from "./chunk-RLIF6XKO.js";
4
+ } from "./chunk-POS35D4J.js";
5
5
 
6
6
  // src/clerk.ts
7
7
  function resolveApiKey(options) {
@@ -1020,7 +1020,8 @@ type RemoteApplyDnsCredentials = {
1020
1020
  zoneId?: string;
1021
1021
  cloudflareApiToken?: string;
1022
1022
  cloudflareZoneId?: string;
1023
- /** GoDaddy one-time credentials. */
1023
+ /** GoDaddy one-time credentials: a Personal Access Token in apiToken, or the classic key and secret. */
1024
+ godaddyApiToken?: string;
1024
1025
  apiKey?: string;
1025
1026
  apiSecret?: string;
1026
1027
  godaddyApiKey?: string;
@@ -1041,6 +1042,8 @@ type ApplyDnsParams = {
1041
1042
  idOrName: string;
1042
1043
  cloudflareApiToken?: string;
1043
1044
  cloudflareZoneId?: string;
1045
+ /** GoDaddy Personal Access Token (preferred over the key and secret). */
1046
+ godaddyApiToken?: string;
1044
1047
  godaddyApiKey?: string;
1045
1048
  godaddyApiSecret?: string;
1046
1049
  vercelApiToken?: string;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as ApiErrorBody, D as DnsRecord } from './client-Btlt7wMg.js';
2
- export { a as ApiErrorCode, b as ApiKey, c as ApiKeyScope, d as ApplyDnsParams, e as ApplyDnsRecordResult, f as ApplyDnsResult, g as Asset, h as Automation, i as AutomationResult, j as AutomationRun, k as AutomationRunResponse, l as AutomationRunStatus, m as AutomationRunStep, n as AutomationRunStepStatus, o as AutomationStatus, p as AutomationStep, q as AutomationTrigger, B as BatchSendEmailResult, r as BounceType, C as CategoryOptOut, s as CategoryOptOutCategory, t as CategoryUnsubscribedErrorDetails, u as ConnectTwilioParams, v as ContactWebhookEventPayload, w as CreateApiKeyParams, x as CreateApiKeyResult, y as CreateAutomationParams, z as CreateDomainParams, E as CreateDomainResult, F as CreateMigrationParams, H as CreateSuppressionParams, I as CreateTemplateParams, J as CreateTenantParams, K as CreateWebhookParams, L as DEFAULT_API_BASE_URL, M as DailyRampLimitErrorDetails, N as DeleteTenantResult, O as DeliverabilityBucket, P as DeliverabilityDomainInsight, Q as DeliverabilityInsightsResult, R as DeliverabilityMailServerRelay, T as DeliverabilityWindow, U as DmarcDailyPoint, V as DmarcMonitoring, W as DmarcMonitoringDisabled, X as DmarcReadiness, Y as DmarcReadinessVerdict, Z as DmarcSource, _ as DmarcSourceStatus, $ as DmarcStatus, a0 as DnsProviderName, a1 as Domain, a2 as DomainBimiAnalysis, a3 as DomainDetailResult, a4 as DomainDmarcAnalysis, a5 as DomainDnsAnalysis, a6 as DomainStatus, a7 as DomainTlsMode, a8 as DomainTrackingDns, a9 as DomainTrackingStatus, aa as EmailListItem, ab as EmailWebhookEventPayload, ac as EmailWebhookEventType, ad as EnableDmarcParams, ae as EnableDmarcResult, af as EnrollmentSkip, ag as EventRecord, G as Groundmail, ah as GroundmailAccessToken, ai as GroundmailOptions, aj as GroundmailTokenOptions, ak as GroundmailTokenProvider, al as HeldBackErrorDetails, am as HeldBackReason, an as HeldBackRecipient, ao as ListApiKeysParams, ap as ListApiKeysResult, aq as ListAutomationRunsParams, ar as ListAutomationRunsResult, as as ListAutomationsResult, at as ListCategoryOptOutsParams, au as ListCategoryOptOutsResult, av as ListDomainsParams, aw as ListDomainsResult, ax as ListEmailsParams, ay as ListEmailsResult, az as ListReceivedEmailsParams, aA as ListReceivedEmailsResult, aB as ListSuppressionsParams, aC as ListSuppressionsResult, aD as ListTemplatesParams, aE as ListTemplatesResult, aF as ListTenantDomainsResult, aG as ListTenantsParams, aH as ListTenantsResult, aI as ListTestInboxEmailsParams, aJ as ListTestInboxEmailsResult, aK as MailServerSigningStatus, aL as MailStream, aM as Migration, aN as MigrationDnsChange, aO as MigrationDnsPlan, aP as MigrationDomainItem, aQ as MigrationItemStatus, aR as MigrationProvider, aS as MigrationResource, aT as MigrationSummary, aU as MigrationTemplateItem, aV as MigrationTotals, aW as MigrationWebhookItem, aX as ReceivedEmail, aY as ReceivedEmailAttachment, aZ as ReceivedEmailAttachmentMeta, a_ as RemoteApplyDnsCredentials, a$ as RemoveCategoryOptOutOptions, b0 as RunMigrationOptions, b1 as SendEmailParams, S as SendEmailResult, b2 as StreamDeliverability, b3 as SuppressedErrorDetails, b4 as Suppression, b5 as TEST_INBOX_WAIT_DEFAULT_MS, b6 as TEST_INBOX_WAIT_MAX_SECONDS, b7 as Template, b8 as TemplateFormat, b9 as TemplateLintWarning, ba as TemplateStarter, bb as TemplateStatus, bc as TemplateVersion, bd as Tenant, be as TenantPauseSource, bf as TenantRamp, bg as TenantStats, bh as TenantStatsResult, bi as TenantStatus, bj as TenantStreamPolicy, bk as TestEmailWebhookParams, bl as TestEmailWebhookResult, bm as TestInbox, bn as TestInboxAddressOptions, bo as TestInboxEmail, bp as TestInboxEmailDetail, bq as TestInboxHeader, br as TestInboxResource, bs as TestInboxUsage, bt as TriggerEventParams, bu as TriggerEventResult, bv as TwilioIntegrationResponse, bw as TwilioIntegrationStatus, bx as UpdateAutomationParams, by as UpdateDomainParams, bz as UpdateEmailParams, bA as UpdateTemplateParams, bB as UpdateTenantParams, bC as UpdateWebhookParams, bD as ValidateEmailResult, bE as ValidationReason, bF as ValidationVerdict, bG as VerifyDomainResult, bH as WaitForTestEmailParams, bI as WebhookEmailTag, bJ as WebhookEndpoint, bK as WebhookEndpointWithSecret, bL as WebhookEventType, bM as mergeMigrations, bN as normalizeAccessToken } from './client-Btlt7wMg.js';
1
+ import { A as ApiErrorBody, D as DnsRecord } from './client-DdtHUMEu.js';
2
+ export { a as ApiErrorCode, b as ApiKey, c as ApiKeyScope, d as ApplyDnsParams, e as ApplyDnsRecordResult, f as ApplyDnsResult, g as Asset, h as Automation, i as AutomationResult, j as AutomationRun, k as AutomationRunResponse, l as AutomationRunStatus, m as AutomationRunStep, n as AutomationRunStepStatus, o as AutomationStatus, p as AutomationStep, q as AutomationTrigger, B as BatchSendEmailResult, r as BounceType, C as CategoryOptOut, s as CategoryOptOutCategory, t as CategoryUnsubscribedErrorDetails, u as ConnectTwilioParams, v as ContactWebhookEventPayload, w as CreateApiKeyParams, x as CreateApiKeyResult, y as CreateAutomationParams, z as CreateDomainParams, E as CreateDomainResult, F as CreateMigrationParams, H as CreateSuppressionParams, I as CreateTemplateParams, J as CreateTenantParams, K as CreateWebhookParams, L as DEFAULT_API_BASE_URL, M as DailyRampLimitErrorDetails, N as DeleteTenantResult, O as DeliverabilityBucket, P as DeliverabilityDomainInsight, Q as DeliverabilityInsightsResult, R as DeliverabilityMailServerRelay, T as DeliverabilityWindow, U as DmarcDailyPoint, V as DmarcMonitoring, W as DmarcMonitoringDisabled, X as DmarcReadiness, Y as DmarcReadinessVerdict, Z as DmarcSource, _ as DmarcSourceStatus, $ as DmarcStatus, a0 as DnsProviderName, a1 as Domain, a2 as DomainBimiAnalysis, a3 as DomainDetailResult, a4 as DomainDmarcAnalysis, a5 as DomainDnsAnalysis, a6 as DomainStatus, a7 as DomainTlsMode, a8 as DomainTrackingDns, a9 as DomainTrackingStatus, aa as EmailListItem, ab as EmailWebhookEventPayload, ac as EmailWebhookEventType, ad as EnableDmarcParams, ae as EnableDmarcResult, af as EnrollmentSkip, ag as EventRecord, G as Groundmail, ah as GroundmailAccessToken, ai as GroundmailOptions, aj as GroundmailTokenOptions, ak as GroundmailTokenProvider, al as HeldBackErrorDetails, am as HeldBackReason, an as HeldBackRecipient, ao as ListApiKeysParams, ap as ListApiKeysResult, aq as ListAutomationRunsParams, ar as ListAutomationRunsResult, as as ListAutomationsResult, at as ListCategoryOptOutsParams, au as ListCategoryOptOutsResult, av as ListDomainsParams, aw as ListDomainsResult, ax as ListEmailsParams, ay as ListEmailsResult, az as ListReceivedEmailsParams, aA as ListReceivedEmailsResult, aB as ListSuppressionsParams, aC as ListSuppressionsResult, aD as ListTemplatesParams, aE as ListTemplatesResult, aF as ListTenantDomainsResult, aG as ListTenantsParams, aH as ListTenantsResult, aI as ListTestInboxEmailsParams, aJ as ListTestInboxEmailsResult, aK as MailServerSigningStatus, aL as MailStream, aM as Migration, aN as MigrationDnsChange, aO as MigrationDnsPlan, aP as MigrationDomainItem, aQ as MigrationItemStatus, aR as MigrationProvider, aS as MigrationResource, aT as MigrationSummary, aU as MigrationTemplateItem, aV as MigrationTotals, aW as MigrationWebhookItem, aX as ReceivedEmail, aY as ReceivedEmailAttachment, aZ as ReceivedEmailAttachmentMeta, a_ as RemoteApplyDnsCredentials, a$ as RemoveCategoryOptOutOptions, b0 as RunMigrationOptions, b1 as SendEmailParams, S as SendEmailResult, b2 as StreamDeliverability, b3 as SuppressedErrorDetails, b4 as Suppression, b5 as TEST_INBOX_WAIT_DEFAULT_MS, b6 as TEST_INBOX_WAIT_MAX_SECONDS, b7 as Template, b8 as TemplateFormat, b9 as TemplateLintWarning, ba as TemplateStarter, bb as TemplateStatus, bc as TemplateVersion, bd as Tenant, be as TenantPauseSource, bf as TenantRamp, bg as TenantStats, bh as TenantStatsResult, bi as TenantStatus, bj as TenantStreamPolicy, bk as TestEmailWebhookParams, bl as TestEmailWebhookResult, bm as TestInbox, bn as TestInboxAddressOptions, bo as TestInboxEmail, bp as TestInboxEmailDetail, bq as TestInboxHeader, br as TestInboxResource, bs as TestInboxUsage, bt as TriggerEventParams, bu as TriggerEventResult, bv as TwilioIntegrationResponse, bw as TwilioIntegrationStatus, bx as UpdateAutomationParams, by as UpdateDomainParams, bz as UpdateEmailParams, bA as UpdateTemplateParams, bB as UpdateTenantParams, bC as UpdateWebhookParams, bD as ValidateEmailResult, bE as ValidationReason, bF as ValidationVerdict, bG as VerifyDomainResult, bH as WaitForTestEmailParams, bI as WebhookEmailTag, bJ as WebhookEndpoint, bK as WebhookEndpointWithSecret, bL as WebhookEventType, bM as mergeMigrations, bN as normalizeAccessToken } from './client-DdtHUMEu.js';
3
3
 
4
4
  type GroundmailErrorOptions = {
5
5
  code?: string;
@@ -95,6 +95,8 @@ type ApplyDnsResult = {
95
95
  type ApplyDnsCredentials = {
96
96
  cloudflareApiToken?: string;
97
97
  cloudflareZoneId?: string;
98
+ /** GoDaddy Personal Access Token (preferred over the key and secret). */
99
+ godaddyApiToken?: string;
98
100
  godaddyApiKey?: string;
99
101
  godaddyApiSecret?: string;
100
102
  vercelApiToken?: string;
package/dist/index.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  normalizeAccessToken,
13
13
  signWebhookPayload,
14
14
  verifyWebhookSignature
15
- } from "./chunk-RLIF6XKO.js";
15
+ } from "./chunk-POS35D4J.js";
16
16
 
17
17
  // src/simulator.ts
18
18
  var SIMULATOR_DOMAIN = "simulator.groundmail.dev";
package/dist/payload.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { G as Groundmail } from './client-Btlt7wMg.js';
1
+ import { G as Groundmail } from './client-DdtHUMEu.js';
2
2
 
3
3
  /**
4
4
  * Minimal Payload `SendEmailOptions` / address shapes used by this adapter.
package/dist/payload.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_API_BASE_URL,
3
3
  Groundmail
4
- } from "./chunk-RLIF6XKO.js";
4
+ } from "./chunk-POS35D4J.js";
5
5
 
6
6
  // src/payload.ts
7
7
  function resolveApiKey(args) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groundmail",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "Groundmail transactional email API client",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -89,7 +89,7 @@
89
89
  "prepublishOnly": "npm run build && npm run build:nodemailer-bridge"
90
90
  },
91
91
  "dependencies": {
92
- "groundmail-nodemailer": "0.15.15"
92
+ "groundmail-nodemailer": "0.15.16"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@types/nodemailer": "^8.0.1",