groundmail 0.27.0 → 0.29.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-B9Pa_09D.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-ZH3KZR7I.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-B9Pa_09D.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-ZH3KZR7I.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,
@@ -1681,6 +1755,7 @@ var ReceivedEmailsResource = class {
1681
1755
  if (params.limit != null) search.set("limit", String(params.limit));
1682
1756
  if (params.cursor) search.set("cursor", params.cursor);
1683
1757
  if (params.domain) search.set("domain", params.domain);
1758
+ if (params.inReplyToEmail) search.set("in_reply_to_email", params.inReplyToEmail);
1684
1759
  const query = search.toString();
1685
1760
  return this.client.request(
1686
1761
  `/received-emails${query ? `?${query}` : ""}`,
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-B9Pa_09D.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-ZH3KZR7I.js";
5
5
 
6
6
  // src/clerk.ts
7
7
  function resolveApiKey(options) {
@@ -195,6 +195,26 @@ type ReceivedEmailAttachmentMeta = {
195
195
  type ReceivedEmailAttachment = ReceivedEmailAttachmentMeta & {
196
196
  data?: string;
197
197
  };
198
+ /**
199
+ * The email you sent through Groundmail that a received email replies to, as it was
200
+ * when the reply arrived (so it outlives your plan's data retention for the sent email).
201
+ */
202
+ type InReplyToEmail = {
203
+ /** The sent email's id (`msg_…`). */
204
+ id: string;
205
+ subject: string;
206
+ from: string;
207
+ to: string[];
208
+ /** When it was sent (ISO 8601). */
209
+ sent_at: string;
210
+ /** The email's tags as sent (`[]` when it had none). */
211
+ tags: Array<{
212
+ name: string;
213
+ value: string;
214
+ }>;
215
+ /** The tenant's external id when it was sent as a tenant, else null. */
216
+ tenant: string | null;
217
+ };
198
218
  type ReceivedEmail = {
199
219
  id: string;
200
220
  domain_id: string;
@@ -215,6 +235,11 @@ type ReceivedEmail = {
215
235
  message_id: string | null;
216
236
  in_reply_to: string | null;
217
237
  references: string[];
238
+ /**
239
+ * The email you sent through Groundmail that this one replies to, matched by its
240
+ * In-Reply-To, then References. Null when it replies to none of your sent emails.
241
+ */
242
+ in_reply_to_email: InReplyToEmail | null;
218
243
  attachment_count: number;
219
244
  attachments: ReceivedEmailAttachment[];
220
245
  text_body: string | null;
@@ -227,6 +252,8 @@ type ListReceivedEmailsParams = {
227
252
  limit?: number;
228
253
  cursor?: string;
229
254
  domain?: string;
255
+ /** Only replies to this sent email (`msg_…`). */
256
+ inReplyToEmail?: string;
230
257
  };
231
258
  type ListReceivedEmailsResult = {
232
259
  received_emails: ReceivedEmail[];
@@ -1020,7 +1047,8 @@ type RemoteApplyDnsCredentials = {
1020
1047
  zoneId?: string;
1021
1048
  cloudflareApiToken?: string;
1022
1049
  cloudflareZoneId?: string;
1023
- /** GoDaddy one-time credentials. */
1050
+ /** GoDaddy one-time credentials: a Personal Access Token in apiToken, or the classic key and secret. */
1051
+ godaddyApiToken?: string;
1024
1052
  apiKey?: string;
1025
1053
  apiSecret?: string;
1026
1054
  godaddyApiKey?: string;
@@ -1041,6 +1069,8 @@ type ApplyDnsParams = {
1041
1069
  idOrName: string;
1042
1070
  cloudflareApiToken?: string;
1043
1071
  cloudflareZoneId?: string;
1072
+ /** GoDaddy Personal Access Token (preferred over the key and secret). */
1073
+ godaddyApiToken?: string;
1044
1074
  godaddyApiKey?: string;
1045
1075
  godaddyApiSecret?: string;
1046
1076
  vercelApiToken?: string;
@@ -1925,4 +1955,4 @@ declare function normalizeAccessToken(value: GroundmailAccessToken | null | unde
1925
1955
  expiresAt: number | null;
1926
1956
  };
1927
1957
 
1928
- export { type DmarcStatus as $, type ApiErrorBody as A, type BatchSendEmailResult as B, type CategoryOptOut as C, type DnsRecord as D, type CreateDomainResult as E, type CreateMigrationParams as F, Groundmail as G, type CreateSuppressionParams as H, type CreateTemplateParams as I, type CreateTenantParams as J, type CreateWebhookParams as K, DEFAULT_API_BASE_URL as L, type DailyRampLimitErrorDetails as M, type DeleteTenantResult as N, type DeliverabilityBucket as O, type DeliverabilityDomainInsight as P, type DeliverabilityInsightsResult as Q, type DeliverabilityMailServerRelay as R, type SendEmailResult as S, type DeliverabilityWindow as T, type DmarcDailyPoint as U, type DmarcMonitoring as V, type DmarcMonitoringDisabled as W, type DmarcReadiness as X, type DmarcReadinessVerdict as Y, type DmarcSource as Z, type DmarcSourceStatus as _, type ApiErrorCode as a, type RemoveCategoryOptOutOptions as a$, type DnsProviderName as a0, type Domain as a1, type DomainBimiAnalysis as a2, type DomainDetailResult as a3, type DomainDmarcAnalysis as a4, type DomainDnsAnalysis as a5, type DomainStatus as a6, type DomainTlsMode as a7, type DomainTrackingDns as a8, type DomainTrackingStatus as a9, type ListReceivedEmailsResult as aA, type ListSuppressionsParams as aB, type ListSuppressionsResult as aC, type ListTemplatesParams as aD, type ListTemplatesResult as aE, type ListTenantDomainsResult as aF, type ListTenantsParams as aG, type ListTenantsResult as aH, type ListTestInboxEmailsParams as aI, type ListTestInboxEmailsResult as aJ, type MailServerSigningStatus as aK, type MailStream as aL, type Migration as aM, type MigrationDnsChange as aN, type MigrationDnsPlan as aO, type MigrationDomainItem as aP, type MigrationItemStatus as aQ, type MigrationProvider as aR, type MigrationResource as aS, type MigrationSummary as aT, type MigrationTemplateItem as aU, type MigrationTotals as aV, type MigrationWebhookItem as aW, type ReceivedEmail as aX, type ReceivedEmailAttachment as aY, type ReceivedEmailAttachmentMeta as aZ, type RemoteApplyDnsCredentials as a_, type EmailListItem as aa, type EmailWebhookEventPayload as ab, type EmailWebhookEventType as ac, type EnableDmarcParams as ad, type EnableDmarcResult as ae, type EnrollmentSkip as af, type EventRecord as ag, type GroundmailAccessToken as ah, type GroundmailOptions as ai, type GroundmailTokenOptions as aj, type GroundmailTokenProvider as ak, type HeldBackErrorDetails as al, type HeldBackReason as am, type HeldBackRecipient as an, type ListApiKeysParams as ao, type ListApiKeysResult as ap, type ListAutomationRunsParams as aq, type ListAutomationRunsResult as ar, type ListAutomationsResult as as, type ListCategoryOptOutsParams as at, type ListCategoryOptOutsResult as au, type ListDomainsParams as av, type ListDomainsResult as aw, type ListEmailsParams as ax, type ListEmailsResult as ay, type ListReceivedEmailsParams as az, type ApiKey as b, type RunMigrationOptions as b0, type SendEmailParams as b1, type StreamDeliverability as b2, type SuppressedErrorDetails as b3, type Suppression as b4, TEST_INBOX_WAIT_DEFAULT_MS as b5, TEST_INBOX_WAIT_MAX_SECONDS as b6, type Template as b7, type TemplateFormat as b8, type TemplateLintWarning as b9, type UpdateTemplateParams as bA, type UpdateTenantParams as bB, type UpdateWebhookParams as bC, type ValidateEmailResult as bD, type ValidationReason as bE, type ValidationVerdict as bF, type VerifyDomainResult as bG, type WaitForTestEmailParams as bH, type WebhookEmailTag as bI, type WebhookEndpoint as bJ, type WebhookEndpointWithSecret as bK, type WebhookEventType as bL, mergeMigrations as bM, normalizeAccessToken as bN, type TemplateStarter as ba, type TemplateStatus as bb, type TemplateVersion as bc, type Tenant as bd, type TenantPauseSource as be, type TenantRamp as bf, type TenantStats as bg, type TenantStatsResult as bh, type TenantStatus as bi, type TenantStreamPolicy as bj, type TestEmailWebhookParams as bk, type TestEmailWebhookResult as bl, type TestInbox as bm, type TestInboxAddressOptions as bn, type TestInboxEmail as bo, type TestInboxEmailDetail as bp, type TestInboxHeader as bq, TestInboxResource as br, type TestInboxUsage as bs, type TriggerEventParams as bt, type TriggerEventResult as bu, type TwilioIntegrationResponse as bv, type TwilioIntegrationStatus as bw, type UpdateAutomationParams as bx, type UpdateDomainParams as by, type UpdateEmailParams as bz, type ApiKeyScope as c, type ApplyDnsParams as d, type ApplyDnsRecordResult as e, type ApplyDnsResult as f, type Asset as g, type Automation as h, type AutomationResult as i, type AutomationRun as j, type AutomationRunResponse as k, type AutomationRunStatus as l, type AutomationRunStep as m, type AutomationRunStepStatus as n, type AutomationStatus as o, type AutomationStep as p, type AutomationTrigger as q, type BounceType as r, type CategoryOptOutCategory as s, type CategoryUnsubscribedErrorDetails as t, type ConnectTwilioParams as u, type ContactWebhookEventPayload as v, type CreateApiKeyParams as w, type CreateApiKeyResult as x, type CreateAutomationParams as y, type CreateDomainParams as z };
1958
+ export { type DmarcStatus as $, type ApiErrorBody as A, type BatchSendEmailResult as B, type CategoryOptOut as C, type DnsRecord as D, type CreateDomainResult as E, type CreateMigrationParams as F, Groundmail as G, type CreateSuppressionParams as H, type CreateTemplateParams as I, type CreateTenantParams as J, type CreateWebhookParams as K, DEFAULT_API_BASE_URL as L, type DailyRampLimitErrorDetails as M, type DeleteTenantResult as N, type DeliverabilityBucket as O, type DeliverabilityDomainInsight as P, type DeliverabilityInsightsResult as Q, type DeliverabilityMailServerRelay as R, type SendEmailResult as S, type DeliverabilityWindow as T, type DmarcDailyPoint as U, type DmarcMonitoring as V, type DmarcMonitoringDisabled as W, type DmarcReadiness as X, type DmarcReadinessVerdict as Y, type DmarcSource as Z, type DmarcSourceStatus as _, type ApiErrorCode as a, type RemoteApplyDnsCredentials as a$, type DnsProviderName as a0, type Domain as a1, type DomainBimiAnalysis as a2, type DomainDetailResult as a3, type DomainDmarcAnalysis as a4, type DomainDnsAnalysis as a5, type DomainStatus as a6, type DomainTlsMode as a7, type DomainTrackingDns as a8, type DomainTrackingStatus as a9, type ListReceivedEmailsParams as aA, type ListReceivedEmailsResult as aB, type ListSuppressionsParams as aC, type ListSuppressionsResult as aD, type ListTemplatesParams as aE, type ListTemplatesResult as aF, type ListTenantDomainsResult as aG, type ListTenantsParams as aH, type ListTenantsResult as aI, type ListTestInboxEmailsParams as aJ, type ListTestInboxEmailsResult as aK, type MailServerSigningStatus as aL, type MailStream as aM, type Migration as aN, type MigrationDnsChange as aO, type MigrationDnsPlan as aP, type MigrationDomainItem as aQ, type MigrationItemStatus as aR, type MigrationProvider as aS, type MigrationResource as aT, type MigrationSummary as aU, type MigrationTemplateItem as aV, type MigrationTotals as aW, type MigrationWebhookItem as aX, type ReceivedEmail as aY, type ReceivedEmailAttachment as aZ, type ReceivedEmailAttachmentMeta as a_, type EmailListItem as aa, type EmailWebhookEventPayload as ab, type EmailWebhookEventType as ac, type EnableDmarcParams as ad, type EnableDmarcResult as ae, type EnrollmentSkip as af, type EventRecord as ag, type GroundmailAccessToken as ah, type GroundmailOptions as ai, type GroundmailTokenOptions as aj, type GroundmailTokenProvider as ak, type HeldBackErrorDetails as al, type HeldBackReason as am, type HeldBackRecipient as an, type InReplyToEmail as ao, type ListApiKeysParams as ap, type ListApiKeysResult as aq, type ListAutomationRunsParams as ar, type ListAutomationRunsResult as as, type ListAutomationsResult as at, type ListCategoryOptOutsParams as au, type ListCategoryOptOutsResult as av, type ListDomainsParams as aw, type ListDomainsResult as ax, type ListEmailsParams as ay, type ListEmailsResult as az, type ApiKey as b, type RemoveCategoryOptOutOptions as b0, type RunMigrationOptions as b1, type SendEmailParams as b2, type StreamDeliverability as b3, type SuppressedErrorDetails as b4, type Suppression as b5, TEST_INBOX_WAIT_DEFAULT_MS as b6, TEST_INBOX_WAIT_MAX_SECONDS as b7, type Template as b8, type TemplateFormat as b9, type UpdateEmailParams as bA, type UpdateTemplateParams as bB, type UpdateTenantParams as bC, type UpdateWebhookParams as bD, type ValidateEmailResult as bE, type ValidationReason as bF, type ValidationVerdict as bG, type VerifyDomainResult as bH, type WaitForTestEmailParams as bI, type WebhookEmailTag as bJ, type WebhookEndpoint as bK, type WebhookEndpointWithSecret as bL, type WebhookEventType as bM, mergeMigrations as bN, normalizeAccessToken as bO, type TemplateLintWarning as ba, type TemplateStarter as bb, type TemplateStatus as bc, type TemplateVersion as bd, type Tenant as be, type TenantPauseSource as bf, type TenantRamp as bg, type TenantStats as bh, type TenantStatsResult as bi, type TenantStatus as bj, type TenantStreamPolicy as bk, type TestEmailWebhookParams as bl, type TestEmailWebhookResult as bm, type TestInbox as bn, type TestInboxAddressOptions as bo, type TestInboxEmail as bp, type TestInboxEmailDetail as bq, type TestInboxHeader as br, TestInboxResource as bs, type TestInboxUsage as bt, type TriggerEventParams as bu, type TriggerEventResult as bv, type TwilioIntegrationResponse as bw, type TwilioIntegrationStatus as bx, type UpdateAutomationParams as by, type UpdateDomainParams as bz, type ApiKeyScope as c, type ApplyDnsParams as d, type ApplyDnsRecordResult as e, type ApplyDnsResult as f, type Asset as g, type Automation as h, type AutomationResult as i, type AutomationRun as j, type AutomationRunResponse as k, type AutomationRunStatus as l, type AutomationRunStep as m, type AutomationRunStepStatus as n, type AutomationStatus as o, type AutomationStep as p, type AutomationTrigger as q, type BounceType as r, type CategoryOptOutCategory as s, type CategoryUnsubscribedErrorDetails as t, type ConnectTwilioParams as u, type ContactWebhookEventPayload as v, type CreateApiKeyParams as w, type CreateApiKeyResult as x, type CreateAutomationParams as y, type CreateDomainParams as z };
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-B9Pa_09D.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 InReplyToEmail, ap as ListApiKeysParams, aq as ListApiKeysResult, ar as ListAutomationRunsParams, as as ListAutomationRunsResult, at as ListAutomationsResult, au as ListCategoryOptOutsParams, av as ListCategoryOptOutsResult, aw as ListDomainsParams, ax as ListDomainsResult, ay as ListEmailsParams, az as ListEmailsResult, aA as ListReceivedEmailsParams, aB as ListReceivedEmailsResult, aC as ListSuppressionsParams, aD as ListSuppressionsResult, aE as ListTemplatesParams, aF as ListTemplatesResult, aG as ListTenantDomainsResult, aH as ListTenantsParams, aI as ListTenantsResult, aJ as ListTestInboxEmailsParams, aK as ListTestInboxEmailsResult, aL as MailServerSigningStatus, aM as MailStream, aN as Migration, aO as MigrationDnsChange, aP as MigrationDnsPlan, aQ as MigrationDomainItem, aR as MigrationItemStatus, aS as MigrationProvider, aT as MigrationResource, aU as MigrationSummary, aV as MigrationTemplateItem, aW as MigrationTotals, aX as MigrationWebhookItem, aY as ReceivedEmail, aZ as ReceivedEmailAttachment, a_ as ReceivedEmailAttachmentMeta, a$ as RemoteApplyDnsCredentials, b0 as RemoveCategoryOptOutOptions, b1 as RunMigrationOptions, b2 as SendEmailParams, S as SendEmailResult, b3 as StreamDeliverability, b4 as SuppressedErrorDetails, b5 as Suppression, b6 as TEST_INBOX_WAIT_DEFAULT_MS, b7 as TEST_INBOX_WAIT_MAX_SECONDS, b8 as Template, b9 as TemplateFormat, ba as TemplateLintWarning, bb as TemplateStarter, bc as TemplateStatus, bd as TemplateVersion, be as Tenant, bf as TenantPauseSource, bg as TenantRamp, bh as TenantStats, bi as TenantStatsResult, bj as TenantStatus, bk as TenantStreamPolicy, bl as TestEmailWebhookParams, bm as TestEmailWebhookResult, bn as TestInbox, bo as TestInboxAddressOptions, bp as TestInboxEmail, bq as TestInboxEmailDetail, br as TestInboxHeader, bs as TestInboxResource, bt as TestInboxUsage, bu as TriggerEventParams, bv as TriggerEventResult, bw as TwilioIntegrationResponse, bx as TwilioIntegrationStatus, by as UpdateAutomationParams, bz as UpdateDomainParams, bA as UpdateEmailParams, bB as UpdateTemplateParams, bC as UpdateTenantParams, bD as UpdateWebhookParams, bE as ValidateEmailResult, bF as ValidationReason, bG as ValidationVerdict, bH as VerifyDomainResult, bI as WaitForTestEmailParams, bJ as WebhookEmailTag, bK as WebhookEndpoint, bL as WebhookEndpointWithSecret, bM as WebhookEventType, bN as mergeMigrations, bO as normalizeAccessToken } from './client-B9Pa_09D.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-ZH3KZR7I.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-B9Pa_09D.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-ZH3KZR7I.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.29.0",
4
4
  "description": "Groundmail transactional email API client",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -89,11 +89,11 @@
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.17"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@types/nodemailer": "^8.0.1",
96
- "nodemailer": "^9.0.3",
96
+ "nodemailer": "^10.2.1",
97
97
  "tsup": "^8.5.0",
98
98
  "typescript": "^5",
99
99
  "vitest": "^3.2.4"