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 +1 -1
- package/dist/authjs.js +1 -1
- package/dist/better-auth.d.ts +1 -1
- package/dist/better-auth.js +1 -1
- package/dist/{chunk-RLIF6XKO.js → chunk-ZH3KZR7I.js} +187 -112
- package/dist/clerk.d.ts +1 -1
- package/dist/clerk.js +1 -1
- package/dist/{client-Btlt7wMg.d.ts → client-B9Pa_09D.d.ts} +32 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +1 -1
- package/dist/payload.d.ts +1 -1
- package/dist/payload.js +1 -1
- package/package.json +3 -3
package/dist/authjs.d.ts
CHANGED
package/dist/authjs.js
CHANGED
package/dist/better-auth.d.ts
CHANGED
package/dist/better-auth.js
CHANGED
|
@@ -301,8 +301,183 @@ function createCloudflareProvider(options) {
|
|
|
301
301
|
};
|
|
302
302
|
}
|
|
303
303
|
|
|
304
|
-
// src/dns/
|
|
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
|
|
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 =
|
|
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
|
-
|
|
475
|
-
|
|
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:
|
|
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
package/dist/clerk.js
CHANGED
|
@@ -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
|
|
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-
|
|
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
|
|
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
package/dist/payload.d.ts
CHANGED
package/dist/payload.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "groundmail",
|
|
3
|
-
"version": "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.
|
|
92
|
+
"groundmail-nodemailer": "0.15.17"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
95
|
"@types/nodemailer": "^8.0.1",
|
|
96
|
-
"nodemailer": "^
|
|
96
|
+
"nodemailer": "^10.2.1",
|
|
97
97
|
"tsup": "^8.5.0",
|
|
98
98
|
"typescript": "^5",
|
|
99
99
|
"vitest": "^3.2.4"
|