sently 0.8.0 → 0.9.1
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/AGENTS.md +33 -0
- package/CHANGELOG.md +82 -41
- package/README.md +89 -960
- package/dist/adapters/bun.js +1 -1
- package/dist/adapters/cf.js +2 -2
- package/dist/adapters/cf.js.map +2 -2
- package/dist/adapters/deno.js +1 -1
- package/dist/adapters/node.js +1 -1
- package/dist/auth/oauth2.js +2 -2
- package/dist/auth/oauth2.js.map +1 -1
- package/dist/chunk-0gqy32pe.js +4 -0
- package/dist/{chunk-n5dan5bz.js.map → chunk-0gqy32pe.js.map} +2 -2
- package/dist/{chunk-z62q7kqr.js → chunk-0qxws3kj.js} +2 -2
- package/dist/{chunk-z62q7kqr.js.map → chunk-0qxws3kj.js.map} +1 -1
- package/dist/chunk-29z7fkzy.js +4 -0
- package/dist/{chunk-wsymfbkn.js.map → chunk-29z7fkzy.js.map} +2 -2
- package/dist/chunk-5915vbcj.js +4 -0
- package/dist/chunk-5915vbcj.js.map +10 -0
- package/dist/{chunk-nbmq8ejv.js → chunk-6npp3x3c.js} +2 -2
- package/dist/{chunk-nbmq8ejv.js.map → chunk-6npp3x3c.js.map} +1 -1
- package/dist/chunk-7gy2q9sh.js +4 -0
- package/dist/chunk-7gy2q9sh.js.map +10 -0
- package/dist/{chunk-zst8an2p.js → chunk-8dty8c4p.js} +2 -2
- package/dist/{chunk-zst8an2p.js.map → chunk-8dty8c4p.js.map} +2 -2
- package/dist/{chunk-f3dz43cy.js → chunk-8njyga62.js} +2 -2
- package/dist/{chunk-f3dz43cy.js.map → chunk-8njyga62.js.map} +1 -1
- package/dist/chunk-93vqxxj2.js +4 -0
- package/dist/{chunk-qh90yr6d.js.map → chunk-93vqxxj2.js.map} +2 -2
- package/dist/chunk-b602dhck.js +4 -0
- package/dist/{chunk-wbvhaqcp.js.map → chunk-b602dhck.js.map} +2 -2
- package/dist/{chunk-9zkv5azm.js → chunk-gp4fwrs8.js} +2 -2
- package/dist/{chunk-9zkv5azm.js.map → chunk-gp4fwrs8.js.map} +1 -1
- package/dist/chunk-n0qeyzqm.js +13 -0
- package/dist/{chunk-8phpsns1.js.map → chunk-n0qeyzqm.js.map} +2 -2
- package/dist/chunk-qtkd5bak.js +4 -0
- package/dist/chunk-qtkd5bak.js.map +11 -0
- package/dist/chunk-skqhj0rm.js +4 -0
- package/dist/{chunk-vhxzhx8b.js.map → chunk-skqhj0rm.js.map} +2 -2
- package/dist/{chunk-6bkj4y4r.js → chunk-tamww15j.js} +2 -2
- package/dist/{chunk-6bkj4y4r.js.map → chunk-tamww15j.js.map} +1 -1
- package/dist/chunk-vjpds2pf.js +3 -0
- package/dist/{chunk-m07smapm.js.map → chunk-vjpds2pf.js.map} +2 -2
- package/dist/chunk-yp311efr.js +4 -0
- package/dist/chunk-yp311efr.js.map +10 -0
- package/dist/chunk-ywq6s10g.js +5 -0
- package/dist/{chunk-5scdgffb.js.map → chunk-ywq6s10g.js.map} +3 -3
- package/dist/core/base64.d.ts +10 -0
- package/dist/core/errors.js +2 -2
- package/dist/core/errors.js.map +1 -1
- package/dist/core/hooks.d.ts +14 -0
- package/dist/core/plugin.d.ts +7 -7
- package/dist/core/push-endpoint.d.ts +29 -0
- package/dist/core/push-types.d.ts +98 -0
- package/dist/core/sms-types.d.ts +76 -0
- package/dist/core/smtp.js +2 -2
- package/dist/core/smtp.js.map +1 -1
- package/dist/core/whatsapp-types.d.ts +116 -0
- package/dist/detect.js +2 -2
- package/dist/detect.js.map +1 -1
- package/dist/dkim.js +2 -2
- package/dist/dkim.js.map +2 -2
- package/dist/idempotency.js +2 -2
- package/dist/idempotency.js.map +1 -1
- package/dist/index.d.ts +5 -32
- package/dist/index.js +0 -35
- package/dist/mailer.js +2 -2
- package/dist/mailer.js.map +1 -1
- package/dist/observability/console.js +1 -1
- package/dist/plugins/react.js +2 -2
- package/dist/plugins/react.js.map +2 -2
- package/dist/plugins/template.js +1 -1
- package/dist/pool/pool.js +2 -2
- package/dist/pool/pool.js.map +1 -1
- package/dist/push.d.ts +26 -0
- package/dist/push.js +3 -0
- package/dist/push.js.map +10 -0
- package/dist/sms.d.ts +26 -0
- package/dist/sms.js +3 -0
- package/dist/sms.js.map +10 -0
- package/dist/smtp-mailer.js +2 -2
- package/dist/smtp-mailer.js.map +2 -2
- package/dist/transports/brevo.js +2 -2
- package/dist/transports/brevo.js.map +2 -2
- package/dist/transports/cloudflare-email.js +2 -2
- package/dist/transports/cloudflare-email.js.map +2 -2
- package/dist/transports/fallback.js +2 -2
- package/dist/transports/fallback.js.map +1 -1
- package/dist/transports/loops.js +2 -2
- package/dist/transports/loops.js.map +2 -2
- package/dist/transports/mailersend.js +2 -2
- package/dist/transports/mailersend.js.map +2 -2
- package/dist/transports/mailgun.js +2 -2
- package/dist/transports/mailgun.js.map +2 -2
- package/dist/transports/mailtrap.js +2 -2
- package/dist/transports/mailtrap.js.map +2 -2
- package/dist/transports/msegat.d.ts +132 -0
- package/dist/transports/msegat.js +3 -0
- package/dist/transports/msegat.js.map +10 -0
- package/dist/transports/plunk.js +2 -2
- package/dist/transports/plunk.js.map +2 -2
- package/dist/transports/postmark.js +2 -2
- package/dist/transports/postmark.js.map +2 -2
- package/dist/transports/preview.js +2 -2
- package/dist/transports/preview.js.map +2 -2
- package/dist/transports/resend.js +2 -2
- package/dist/transports/resend.js.map +2 -2
- package/dist/transports/retry.js +2 -2
- package/dist/transports/retry.js.map +2 -2
- package/dist/transports/sendgrid.js +2 -2
- package/dist/transports/sendgrid.js.map +2 -2
- package/dist/transports/ses.js +2 -2
- package/dist/transports/ses.js.map +2 -2
- package/dist/transports/smtp.js +2 -2
- package/dist/transports/smtp.js.map +1 -1
- package/dist/transports/sndr.d.ts +41 -0
- package/dist/transports/sndr.js +3 -0
- package/dist/transports/sndr.js.map +10 -0
- package/dist/transports/sparkpost.js +2 -2
- package/dist/transports/sparkpost.js.map +2 -2
- package/dist/transports/taqnyat-mail.d.ts +33 -0
- package/dist/transports/taqnyat-mail.js +3 -0
- package/dist/transports/taqnyat-mail.js.map +10 -0
- package/dist/transports/taqnyat-phone.d.ts +4 -0
- package/dist/transports/taqnyat-sms.d.ts +131 -0
- package/dist/transports/taqnyat-sms.js +3 -0
- package/dist/transports/taqnyat-sms.js.map +10 -0
- package/dist/transports/taqnyat-whatsapp.d.ts +51 -0
- package/dist/transports/taqnyat-whatsapp.js +3 -0
- package/dist/transports/taqnyat-whatsapp.js.map +10 -0
- package/dist/transports/twilio-sms.d.ts +66 -0
- package/dist/transports/twilio-sms.js +3 -0
- package/dist/transports/twilio-sms.js.map +10 -0
- package/dist/transports/webpush.d.ts +46 -0
- package/dist/transports/webpush.js +3 -0
- package/dist/transports/webpush.js.map +10 -0
- package/dist/transports/weighted-fallback.js +2 -2
- package/dist/transports/weighted-fallback.js.map +1 -1
- package/dist/transports/whatsapp-cloud.d.ts +56 -0
- package/dist/transports/whatsapp-cloud.js +3 -0
- package/dist/transports/whatsapp-cloud.js.map +10 -0
- package/dist/webhooks/brevo.js +1 -1
- package/dist/webhooks/mailgun.js +1 -1
- package/dist/webhooks/postmark.js +1 -1
- package/dist/webhooks/resend.js +1 -1
- package/dist/webhooks/sendgrid.js +1 -1
- package/dist/webhooks/ses.js +1 -1
- package/dist/webhooks/sndr.d.ts +16 -0
- package/dist/webhooks/sndr.js +3 -0
- package/dist/webhooks/sndr.js.map +10 -0
- package/dist/webhooks/timing-safe-equal.js +1 -1
- package/dist/webhooks.d.ts +9 -2
- package/dist/webhooks.js +4 -0
- package/dist/whatsapp.d.ts +26 -0
- package/dist/whatsapp.js +3 -0
- package/dist/whatsapp.js.map +10 -0
- package/package.json +85 -4
- package/site/README.md +26 -0
- package/site/content/docs/ai/index.mdx +13 -0
- package/site/content/docs/ai/llms-txt.mdx +12 -0
- package/site/content/docs/ai/mcp.mdx +16 -0
- package/site/content/docs/ai/meta.json +9 -0
- package/site/content/docs/channels/email.mdx +100 -0
- package/site/content/docs/channels/hooks.mdx +87 -0
- package/site/content/docs/channels/index.mdx +81 -0
- package/site/content/docs/channels/meta.json +12 -0
- package/site/content/docs/channels/push.mdx +92 -0
- package/site/content/docs/channels/sms.mdx +88 -0
- package/site/content/docs/channels/whatsapp.mdx +95 -0
- package/site/content/docs/decorators/fallback.mdx +34 -0
- package/site/content/docs/decorators/idempotency.mdx +34 -0
- package/site/content/docs/decorators/index.mdx +50 -0
- package/site/content/docs/decorators/meta.json +12 -0
- package/site/content/docs/decorators/preview.mdx +34 -0
- package/site/content/docs/decorators/retry.mdx +34 -0
- package/site/content/docs/decorators/weighted-fallback.mdx +34 -0
- package/site/content/docs/get-started/entrypoints.mdx +114 -0
- package/site/content/docs/get-started/index.mdx +14 -0
- package/site/content/docs/get-started/installation.mdx +78 -0
- package/site/content/docs/get-started/introduction.mdx +77 -0
- package/site/content/docs/get-started/meta.json +12 -0
- package/site/content/docs/get-started/migrate-nodemailer.mdx +23 -0
- package/site/content/docs/get-started/runtimes.mdx +17 -0
- package/site/content/docs/guides/adapters.mdx +26 -0
- package/site/content/docs/guides/attachments.mdx +19 -0
- package/site/content/docs/guides/bundle-size.mdx +78 -0
- package/site/content/docs/guides/dkim.mdx +26 -0
- package/site/content/docs/guides/index.mdx +15 -0
- package/site/content/docs/guides/meta.json +21 -0
- package/site/content/docs/guides/oauth2.mdx +23 -0
- package/site/content/docs/guides/observability.mdx +16 -0
- package/site/content/docs/guides/plugins-template.mdx +22 -0
- package/site/content/docs/guides/pool.mdx +24 -0
- package/site/content/docs/guides/react-email.mdx +20 -0
- package/site/content/docs/guides/security.mdx +17 -0
- package/site/content/docs/guides/send-bulk.mdx +18 -0
- package/site/content/docs/guides/vendor-extras-otp.mdx +18 -0
- package/site/content/docs/guides/webhooks.mdx +120 -0
- package/site/content/docs/guides/webpush-interop.mdx +18 -0
- package/site/content/docs/index.mdx +15 -0
- package/site/content/docs/meta.json +15 -0
- package/site/content/docs/quick-start/email.mdx +40 -0
- package/site/content/docs/quick-start/index.mdx +15 -0
- package/site/content/docs/quick-start/meta.json +5 -0
- package/site/content/docs/quick-start/push.mdx +36 -0
- package/site/content/docs/quick-start/sms.mdx +36 -0
- package/site/content/docs/quick-start/whatsapp.mdx +38 -0
- package/site/content/docs/reference/errors.mdx +22 -0
- package/site/content/docs/reference/exports.mdx +83 -0
- package/site/content/docs/reference/index.mdx +15 -0
- package/site/content/docs/reference/mail-options.mdx +22 -0
- package/site/content/docs/reference/meta.json +15 -0
- package/site/content/docs/reference/push-options.mdx +20 -0
- package/site/content/docs/reference/sms-options.mdx +17 -0
- package/site/content/docs/reference/transport-contracts.mdx +17 -0
- package/site/content/docs/reference/webhook-events.mdx +70 -0
- package/site/content/docs/reference/whatsapp-options.mdx +15 -0
- package/site/content/docs/transports/brevo.mdx +40 -0
- package/site/content/docs/transports/cloudflare-email.mdx +40 -0
- package/site/content/docs/transports/index.mdx +105 -0
- package/site/content/docs/transports/loops.mdx +41 -0
- package/site/content/docs/transports/mailersend.mdx +40 -0
- package/site/content/docs/transports/mailgun.mdx +42 -0
- package/site/content/docs/transports/mailtrap.mdx +42 -0
- package/site/content/docs/transports/meta.json +32 -0
- package/site/content/docs/transports/msegat.mdx +42 -0
- package/site/content/docs/transports/plunk.mdx +40 -0
- package/site/content/docs/transports/postmark.mdx +40 -0
- package/site/content/docs/transports/resend.mdx +43 -0
- package/site/content/docs/transports/sendgrid.mdx +40 -0
- package/site/content/docs/transports/ses.mdx +44 -0
- package/site/content/docs/transports/smtp.mdx +47 -0
- package/site/content/docs/transports/sndr.mdx +144 -0
- package/site/content/docs/transports/sparkpost.mdx +41 -0
- package/site/content/docs/transports/taqnyat-mail.mdx +41 -0
- package/site/content/docs/transports/taqnyat-sms.mdx +41 -0
- package/site/content/docs/transports/taqnyat-whatsapp.mdx +40 -0
- package/site/content/docs/transports/twilio-sms.mdx +128 -0
- package/site/content/docs/transports/webpush.mdx +43 -0
- package/site/content/docs/transports/whatsapp-cloud.mdx +42 -0
- package/dist/chunk-5scdgffb.js +0 -5
- package/dist/chunk-8phpsns1.js +0 -13
- package/dist/chunk-m07smapm.js +0 -3
- package/dist/chunk-n5dan5bz.js +0 -4
- package/dist/chunk-qh90yr6d.js +0 -4
- package/dist/chunk-vhxzhx8b.js +0 -4
- package/dist/chunk-wbvhaqcp.js +0 -4
- package/dist/chunk-wsymfbkn.js +0 -4
- package/dist/chunk-yr56b0ts.js +0 -4
- package/dist/chunk-yr56b0ts.js.map +0 -11
package/AGENTS.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# sently — agent contract
|
|
2
|
+
|
|
3
|
+
sently is a runtime-agnostic TypeScript messaging library (email, SMS, WhatsApp, Web Push) for Node.js, Bun, Deno, and Cloudflare Workers. ESM-only, zero runtime dependencies.
|
|
4
|
+
|
|
5
|
+
## Sently-first provider model
|
|
6
|
+
|
|
7
|
+
Apps use **channel senders**, not vendor SDKs:
|
|
8
|
+
|
|
9
|
+
| Channel | Sender | Contract |
|
|
10
|
+
|---------|--------|----------|
|
|
11
|
+
| Email | `createMailer` / `createSMTPMailer` | `Transport` |
|
|
12
|
+
| SMS | `createSmsSender` | `SmsTransport` |
|
|
13
|
+
| WhatsApp | `createWhatsAppSender` | `WhatsAppTransport` |
|
|
14
|
+
| Push | `createPushSender` | `PushTransport` |
|
|
15
|
+
|
|
16
|
+
Providers are transports under those senders. Vendor extras (OTP, account utilities) live on the concrete transport class — never on the shared channel contract.
|
|
17
|
+
|
|
18
|
+
## Docs
|
|
19
|
+
|
|
20
|
+
- Handbook: `site/content/docs/` (Fumadocs)
|
|
21
|
+
- Machine index: `/llms.txt` on the docs site
|
|
22
|
+
|
|
23
|
+
## Commands
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
bun install
|
|
27
|
+
bun test
|
|
28
|
+
bun run site:dev
|
|
29
|
+
bun run site:build
|
|
30
|
+
bun run verify
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Do not invent APIs. Prefer imports from published subpaths (`sently/mailer`, `sently/sms`, `sently/transports/*`).
|
package/CHANGELOG.md
CHANGED
|
@@ -2,9 +2,48 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.1] — 2026-08-01
|
|
6
|
+
|
|
7
|
+
### 🐛 Fixed
|
|
8
|
+
|
|
9
|
+
- **SNDR live suite opt-in** — require `SNDR_LIVE=1` (plus credentials) so
|
|
10
|
+
`bun run verify` stays offline-safe when `.env` has keys
|
|
11
|
+
- **Docs header geometry gate** — assert the home brand cell against
|
|
12
|
+
`HeroIntro`'s left-pane width after the hero split moved out of `page.tsx`
|
|
13
|
+
|
|
14
|
+
## [0.9.0] — 2026-08-01
|
|
15
|
+
|
|
16
|
+
### ✨ Added
|
|
17
|
+
|
|
18
|
+
- **Channel senders** — `createSmsSender` (`sently/sms`), `createWhatsAppSender`
|
|
19
|
+
(`sently/whatsapp`), `createPushSender` (`sently/push`) alongside email; each
|
|
20
|
+
sender supports plugins and lifecycle hooks
|
|
21
|
+
- **SMS transports** — Twilio, Taqnyat SMS, Msegat (`sently/transports/twilio-sms`,
|
|
22
|
+
`taqnyat-sms`, `msegat`); vendor OTP helpers stay on the transport class
|
|
23
|
+
- **WhatsApp transports** — WhatsApp Cloud API, Taqnyat WhatsApp
|
|
24
|
+
(`sently/transports/whatsapp-cloud`, `taqnyat-whatsapp`)
|
|
25
|
+
- **Web Push transport** — VAPID Web Push (`sently/transports/webpush`)
|
|
26
|
+
- **Email transports** — Sndr, Taqnyat Mail (`sently/transports/sndr`,
|
|
27
|
+
`taqnyat-mail`)
|
|
28
|
+
- **Sndr webhooks** — `parseSndrWebhook` / `verifySndrSignature`
|
|
29
|
+
(`sently/webhooks/sndr`, also via `sently/webhooks`)
|
|
30
|
+
- **Per-provider webhook subpaths** — `sently/webhooks/{brevo,mailgun,postmark,
|
|
31
|
+
resend,sendgrid,ses,sndr}` for tree-shakeable imports
|
|
32
|
+
- **Docs site** — Next.js + Fumadocs handbook under `site/` (`bun run site:dev`)
|
|
33
|
+
- **Web Push interop example** — `examples/webpush-interop`
|
|
34
|
+
- **`AGENTS.md`** — agent contract for the sently-first provider model (replaces
|
|
35
|
+
`CLAUDE.md`; published with the package)
|
|
36
|
+
|
|
37
|
+
### ♻️ Changed
|
|
38
|
+
|
|
39
|
+
- **Library scope** — channel-first messaging (email, SMS, WhatsApp, push), not
|
|
40
|
+
email-only; package description and README updated accordingly
|
|
41
|
+
- **Docs site branding** — real sently wordmark / mark in the header, homepage,
|
|
42
|
+
404, favicon, Apple touch icon, and docs OG images; README shows the logo
|
|
43
|
+
|
|
5
44
|
## [0.8.0] — 2026-06-07
|
|
6
45
|
|
|
7
|
-
### Added
|
|
46
|
+
### ✨ Added
|
|
8
47
|
|
|
9
48
|
- **`FallbackTransport`** (`sently/transports/fallback`) — provider failover through an ordered transport list; composes with `RetryTransport`; `FallbackError.attempts` records `{ provider, error }` per failed attempt
|
|
10
49
|
- **Five HTTP providers:** MailerSend, Plunk, SparkPost, Mailtrap, Loops (`sently/transports/mailersend`, `plunk`, `sparkpost`, `mailtrap`, `loops`)
|
|
@@ -20,14 +59,14 @@
|
|
|
20
59
|
|
|
21
60
|
## [0.7.2] — 2026-05-31
|
|
22
61
|
|
|
23
|
-
### Fixed
|
|
62
|
+
### 🐛 Fixed
|
|
24
63
|
|
|
25
64
|
- Publish workflow runs `bun run build` before registry steps and publishes **npm before JSR** so a failed npm step does not leave JSR ahead of npm
|
|
26
65
|
- `scripts/publish.ts` `syncVersion()` skips rewriting `jsr.json` when content is unchanged (avoids dirty working tree between CI publish steps)
|
|
27
66
|
|
|
28
67
|
## [0.7.1] — 2026-05-31
|
|
29
68
|
|
|
30
|
-
### Documentation
|
|
69
|
+
### 📚 Documentation
|
|
31
70
|
|
|
32
71
|
- README Nodemailer comparison updated for **v8.0.10** (~58 KB gzip, zero deps, 2026 releases)
|
|
33
72
|
- Bundle size figures refreshed from `bun run measure:size:md` (~6.1 KB HTTP, ~15 KB SMTP, ~2.6 KB `sently/mailer`)
|
|
@@ -35,7 +74,7 @@
|
|
|
35
74
|
|
|
36
75
|
## [0.7.0] — 2026-05-31
|
|
37
76
|
|
|
38
|
-
### Breaking + Migration
|
|
77
|
+
### 💥 Breaking + Migration
|
|
39
78
|
|
|
40
79
|
Summary:
|
|
41
80
|
|
|
@@ -53,13 +92,13 @@ Summary:
|
|
|
53
92
|
transport-only main `createMailer`; v0.5.x bulk-send behavior (native batch, default
|
|
54
93
|
2 req/s throttle, `SendResult.batchError`).
|
|
55
94
|
|
|
56
|
-
### Added
|
|
95
|
+
### ✨ Added
|
|
57
96
|
|
|
58
97
|
- **`INVALID_CONFIG`** stable error code for misconfigured mailer factories
|
|
59
98
|
- **`SMTPMailerOptions`** type for SMTP factory config
|
|
60
99
|
- README decision-tree section and Microsoft 365 OAuth2 example
|
|
61
100
|
|
|
62
|
-
### Changed
|
|
101
|
+
### ♻️ Changed
|
|
63
102
|
|
|
64
103
|
- **`BulkSendOptions.concurrency` TSDoc** — documents default `1` (matches implementation)
|
|
65
104
|
- Bundle size budgets updated for slimmer main entry
|
|
@@ -67,12 +106,12 @@ Summary:
|
|
|
67
106
|
|
|
68
107
|
## [0.6.2] — 2026-05-31
|
|
69
108
|
|
|
70
|
-
### Added
|
|
109
|
+
### ✨ Added
|
|
71
110
|
|
|
72
111
|
- **`sently/smtp`** subpath — SMTP `createMailer` (`host` / `port` / `auth`, pooling,
|
|
73
112
|
adapters) isolated from the main entry for smaller HTTP app bundles
|
|
74
113
|
|
|
75
|
-
### Changed
|
|
114
|
+
### ♻️ Changed
|
|
76
115
|
|
|
77
116
|
- **Breaking:** main `createMailer` from `sently` is transport-only (same as
|
|
78
117
|
`sently/mailer`). SMTP relay apps use `import { createMailer } from "sently/smtp"`
|
|
@@ -88,18 +127,18 @@ Summary:
|
|
|
88
127
|
|
|
89
128
|
## [0.6.1] — 2026-05-31
|
|
90
129
|
|
|
91
|
-
### Fixed
|
|
130
|
+
### 🐛 Fixed
|
|
92
131
|
|
|
93
132
|
- **Build** — emit `dist/core/errors.js` so the main barrel and Node/Deno smoke
|
|
94
133
|
tests resolve `SentlyError` imports after `bun run build`
|
|
95
134
|
|
|
96
|
-
### Changed
|
|
135
|
+
### ♻️ Changed
|
|
97
136
|
|
|
98
137
|
- Bundle size budgets adjusted for minor measurement drift on CI runners
|
|
99
138
|
|
|
100
139
|
## [0.6.0] — 2026-05-31
|
|
101
140
|
|
|
102
|
-
### Added
|
|
141
|
+
### ✨ Added
|
|
103
142
|
|
|
104
143
|
- **`sently/errors`** — unified `SentlyError` base class with stable machine-readable
|
|
105
144
|
codes (`RATE_LIMITED`, `BAD_REQUEST`, `SMTP_AUTH_FAILED`, etc.); all existing
|
|
@@ -112,13 +151,13 @@ Summary:
|
|
|
112
151
|
- **`AUDIT-v0.6.md`** — README capability audit with file/line proof (all claims
|
|
113
152
|
verified implemented, including CRAM-MD5)
|
|
114
153
|
|
|
115
|
-
### Changed
|
|
154
|
+
### ♻️ Changed
|
|
116
155
|
|
|
117
156
|
- Bundle size budgets updated for expanded mailer (hooks) and error hierarchy
|
|
118
157
|
|
|
119
158
|
## [0.5.2] — 2026-05-31
|
|
120
159
|
|
|
121
|
-
### Fixed
|
|
160
|
+
### 🐛 Fixed
|
|
122
161
|
|
|
123
162
|
- **Build** — `dist/webhooks.js` and `dist/react.js` are generated from source instead
|
|
124
163
|
of bundled with code-splitting, fixing `SyntaxError: Export 'k' is not defined` when
|
|
@@ -126,12 +165,12 @@ Summary:
|
|
|
126
165
|
|
|
127
166
|
## [0.5.1] — 2026-05-31
|
|
128
167
|
|
|
129
|
-
### Breaking
|
|
168
|
+
### 💥 Breaking
|
|
130
169
|
|
|
131
170
|
- **Main barrel** — `reactPlugin` and `ReactMailOptions` are no longer exported from
|
|
132
171
|
`"sently"`. Import them from `"sently/react"` instead.
|
|
133
172
|
|
|
134
|
-
### Fixed
|
|
173
|
+
### 🐛 Fixed
|
|
135
174
|
|
|
136
175
|
- **Webhook signatures** — `verifyResendSignature` and `verifyMailgunSignature` now
|
|
137
176
|
compare decoded signature bytes with constant-time `timingSafeEqual` (Web Crypto only)
|
|
@@ -139,7 +178,7 @@ Summary:
|
|
|
139
178
|
- **Batch sendBulk** — per-chunk failure isolation, per-message partial batch errors
|
|
140
179
|
(`SendResult.batchError`), and rate limiting between batch HTTP requests (default 2/s)
|
|
141
180
|
|
|
142
|
-
### Changed
|
|
181
|
+
### ♻️ Changed
|
|
143
182
|
|
|
144
183
|
- `RateLimiter` extracted to `src/core/rate-limiter.ts` (shared by pool and mailer)
|
|
145
184
|
- `Transport.batchMax` on `ResendTransport`; `BulkSendOptions.rateDelta` / `rateLimit`
|
|
@@ -147,7 +186,7 @@ Summary:
|
|
|
147
186
|
|
|
148
187
|
## [0.5.0] — 2026-05-31
|
|
149
188
|
|
|
150
|
-
### Added
|
|
189
|
+
### ✨ Added
|
|
151
190
|
|
|
152
191
|
- **`sently/react`** — React Email integration via `reactPlugin()`; optional peers
|
|
153
192
|
`react` and `@react-email/render`; `options.react` on `MailOptions`
|
|
@@ -163,7 +202,7 @@ Summary:
|
|
|
163
202
|
optional Mailgun HMAC and Resend Svix signature verification helpers
|
|
164
203
|
- **`deduped`** flag on `SendResult` for idempotency cache hits
|
|
165
204
|
|
|
166
|
-
### Changed
|
|
205
|
+
### ♻️ Changed
|
|
167
206
|
|
|
168
207
|
- `sendBulk` uses native batch endpoints when the transport implements
|
|
169
208
|
`sendBatch`; concurrent per-message fallback unchanged for other transports
|
|
@@ -172,7 +211,7 @@ Summary:
|
|
|
172
211
|
|
|
173
212
|
## [0.4.7] — 2026-05-30
|
|
174
213
|
|
|
175
|
-
### Added
|
|
214
|
+
### ✨ Added
|
|
176
215
|
|
|
177
216
|
- **`sently/mailer` entry** — transport-only `createMailer` without SMTP code in the
|
|
178
217
|
bundle (~4.3 KB with HTTP transports vs ~14 KB from the main entry)
|
|
@@ -185,7 +224,7 @@ Summary:
|
|
|
185
224
|
for docs and CI
|
|
186
225
|
- **Deno and Cloudflare adapter smoke tests** in CI
|
|
187
226
|
|
|
188
|
-
### Changed
|
|
227
|
+
### ♻️ Changed
|
|
189
228
|
|
|
190
229
|
- Lazy-load SMTP transport and pool from `createMailer` when using SMTP config
|
|
191
230
|
- Extract `MailerImpl` to `src/mailer.ts`; full `createMailer` in `detect.ts` delegates
|
|
@@ -196,7 +235,7 @@ Summary:
|
|
|
196
235
|
- **Pinned devDependency versions** (Biome 2.4.16, TypeScript 6.0.3, `@types/node`
|
|
197
236
|
25.9.1, MCP SDK 1.29.0)
|
|
198
237
|
|
|
199
|
-
### Documentation
|
|
238
|
+
### 📚 Documentation
|
|
200
239
|
|
|
201
240
|
- README **Bundle Size** section — import-path guide, common stacks, per-subpath
|
|
202
241
|
tables, and HTTP stack breakdown
|
|
@@ -205,7 +244,7 @@ Summary:
|
|
|
205
244
|
|
|
206
245
|
## [0.4.6] — 2026-05-30
|
|
207
246
|
|
|
208
|
-
### Documentation
|
|
247
|
+
### 📚 Documentation
|
|
209
248
|
|
|
210
249
|
- Documented all remaining exported symbols (class members, interface
|
|
211
250
|
properties, and internal helpers) for 100% JSR symbol documentation
|
|
@@ -214,7 +253,7 @@ Summary:
|
|
|
214
253
|
|
|
215
254
|
## [0.4.5] — 2026-05-30
|
|
216
255
|
|
|
217
|
-
### Documentation
|
|
256
|
+
### 📚 Documentation
|
|
218
257
|
|
|
219
258
|
- Added `@module` documentation to the `./pool` entrypoint
|
|
220
259
|
- Documented exported interface properties and public API methods across
|
|
@@ -223,7 +262,7 @@ Summary:
|
|
|
223
262
|
|
|
224
263
|
## [0.4.4] — 2026-05-30
|
|
225
264
|
|
|
226
|
-
### Security
|
|
265
|
+
### 🔒 Security
|
|
227
266
|
|
|
228
267
|
- Fixed SigV4 date format: slice(0,15) not slice(0,16) — all real
|
|
229
268
|
SES requests were producing malformed x-amz-date headers
|
|
@@ -251,7 +290,7 @@ Summary:
|
|
|
251
290
|
|
|
252
291
|
## [0.4.3] — 2026-05-30
|
|
253
292
|
|
|
254
|
-
### Added
|
|
293
|
+
### ✨ Added
|
|
255
294
|
|
|
256
295
|
- `llms.txt` for LLM/agent discovery (install, quick example, subpath
|
|
257
296
|
exports, and when-to-use guidance)
|
|
@@ -260,7 +299,7 @@ Summary:
|
|
|
260
299
|
- `CLAUDE.md` repository map for agents (core entry, adapters,
|
|
261
300
|
transports, tests, build)
|
|
262
301
|
|
|
263
|
-
### Changed
|
|
302
|
+
### ♻️ Changed
|
|
264
303
|
|
|
265
304
|
- README positioning, HTTP transport reference table, plugin docs
|
|
266
305
|
reorder, and tree-shaking callout
|
|
@@ -268,7 +307,7 @@ Summary:
|
|
|
268
307
|
|
|
269
308
|
## [0.4.2] — 2026-05-30
|
|
270
309
|
|
|
271
|
-
### Fixed
|
|
310
|
+
### 🐛 Fixed
|
|
272
311
|
|
|
273
312
|
- CI: replaced node -e dynamic import with scripts/smoke.mjs
|
|
274
313
|
(top-level await ESM) for reliable Node.js smoke testing
|
|
@@ -278,7 +317,7 @@ Summary:
|
|
|
278
317
|
|
|
279
318
|
## [0.4.1] — 2026-05-30
|
|
280
319
|
|
|
281
|
-
### Fixed
|
|
320
|
+
### 🐛 Fixed
|
|
282
321
|
|
|
283
322
|
- CI: use locally installed tsc (node_modules/.bin/tsc) in build.ts
|
|
284
323
|
instead of bunx tsc to avoid runtime npm downloads in CI
|
|
@@ -289,7 +328,7 @@ Summary:
|
|
|
289
328
|
|
|
290
329
|
## [0.4.0] — 2026-05-30
|
|
291
330
|
|
|
292
|
-
### Added
|
|
331
|
+
### ✨ Added
|
|
293
332
|
|
|
294
333
|
- `PreviewTransport` — writes emails to disk as .eml or HTML for local development
|
|
295
334
|
- `RetryTransport` — decorator transport with exponential/linear/fixed backoff
|
|
@@ -302,14 +341,14 @@ Summary:
|
|
|
302
341
|
- `attachment.path` basePath guard (opt-in) in resolveAttachments
|
|
303
342
|
- GitHub Actions CI matrix: unit tests (Bun), smoke test (Node 22), SMTP integration (Mailpit)
|
|
304
343
|
|
|
305
|
-
### Fixed
|
|
344
|
+
### 🐛 Fixed
|
|
306
345
|
|
|
307
346
|
- `detectRuntime()` priority hardened: Bun checked before Node.js process globals
|
|
308
347
|
- Cloudflare Workers detection uses positive signature (caches + UA), not absence of other runtimes
|
|
309
348
|
|
|
310
349
|
## [0.3.4] — 2026-05-30
|
|
311
350
|
|
|
312
|
-
### Fixed
|
|
351
|
+
### 🐛 Fixed
|
|
313
352
|
|
|
314
353
|
- Stale `sendx` references in package.json, build.ts, PROGRESS.md
|
|
315
354
|
- JSR badge URL now matches jsr.json scope exactly
|
|
@@ -319,25 +358,25 @@ Summary:
|
|
|
319
358
|
and uses Promise.allSettled to drain in-flight messages
|
|
320
359
|
- Audited all buildMIME() call sites — await confirmed present
|
|
321
360
|
|
|
322
|
-
### Added
|
|
361
|
+
### ✨ Added
|
|
323
362
|
|
|
324
363
|
- `engines` field in package.json (Node >= 18, Bun >= 1.0)
|
|
325
364
|
|
|
326
365
|
## [0.3.3] — 2026-05-29
|
|
327
366
|
|
|
328
|
-
### Fixed
|
|
367
|
+
### 🐛 Fixed
|
|
329
368
|
|
|
330
369
|
- Corrected JSR package name in README from `@sently/sently` to `@alialnaghmoush/sently`
|
|
331
370
|
|
|
332
371
|
## [0.3.2] — 2026-05-29
|
|
333
372
|
|
|
334
|
-
### Fixed
|
|
373
|
+
### 🐛 Fixed
|
|
335
374
|
|
|
336
375
|
- Biome formatting in MIME header builder (`src/core/mime.ts`) so `bun lint` passes
|
|
337
376
|
|
|
338
377
|
## [0.3.1] — 2026-05-29
|
|
339
378
|
|
|
340
|
-
### Security
|
|
379
|
+
### 🔒 Security
|
|
341
380
|
|
|
342
381
|
- Fixed CRLF header injection: `sanitizeHeaderValue()` strips CR/LF
|
|
343
382
|
from Subject, display names, and custom headers in MIME builder
|
|
@@ -353,7 +392,7 @@ Summary:
|
|
|
353
392
|
|
|
354
393
|
## [0.3.0] — 2026-05-29
|
|
355
394
|
|
|
356
|
-
### Added
|
|
395
|
+
### ✨ Added
|
|
357
396
|
|
|
358
397
|
- Plugin system: `plugins` array in `createMailer()` config
|
|
359
398
|
Plugins are `(options: MailOptions) => MailOptions | Promise<MailOptions>` functions
|
|
@@ -363,14 +402,14 @@ Summary:
|
|
|
363
402
|
- `BrevoTransport` — Brevo (formerly Sendinblue) HTTP API
|
|
364
403
|
- `TLSOptions.minVersion` — set minimum TLS version for legacy SMTP servers
|
|
365
404
|
|
|
366
|
-
### Parity milestone
|
|
405
|
+
### 🏁 Parity milestone
|
|
367
406
|
|
|
368
407
|
sently now covers ~98% of Nodemailer feature parity for modern use cases.
|
|
369
408
|
Remaining gaps (SOCKS proxy, iCal) are out of scope by design.
|
|
370
409
|
|
|
371
410
|
## [0.2.0] — 2026-05-29
|
|
372
411
|
|
|
373
|
-
### Added
|
|
412
|
+
### ✨ Added
|
|
374
413
|
|
|
375
414
|
- DKIM signing (RSA-SHA256 and Ed25519-SHA256) via `SMTPConfig.dkim`
|
|
376
415
|
- OAuth2 / XOAUTH2 authentication via `SMTPAuth.type = 'OAUTH2'`
|
|
@@ -378,7 +417,7 @@ Remaining gaps (SOCKS proxy, iCal) are out of scope by design.
|
|
|
378
417
|
- Rate limiting via `PoolConfig.rateDelta` / `PoolConfig.rateLimit`
|
|
379
418
|
- CRAM-MD5 authentication (pure-JS HMAC-MD5)
|
|
380
419
|
|
|
381
|
-
### Changed
|
|
420
|
+
### ♻️ Changed
|
|
382
421
|
|
|
383
422
|
- npm package name is `sently`; JSR package name is `@sently/sently`
|
|
384
423
|
- `SMTPAuth.pass` is now optional (was required in v0.1)
|
|
@@ -386,10 +425,12 @@ Remaining gaps (SOCKS proxy, iCal) are out of scope by design.
|
|
|
386
425
|
- `selectAuthMethod` priority: XOAUTH2 > CRAM-MD5 > LOGIN > PLAIN
|
|
387
426
|
- `createMailer()` uses `SMTPPool` automatically when `pool: true`
|
|
388
427
|
|
|
389
|
-
### Fixed
|
|
428
|
+
### 🐛 Fixed
|
|
390
429
|
|
|
391
430
|
- CRAM-MD5 stub now fully implemented
|
|
392
431
|
|
|
393
432
|
## [0.1.0] — 2026-05-29
|
|
394
433
|
|
|
395
|
-
|
|
434
|
+
### ✨ Added
|
|
435
|
+
|
|
436
|
+
- Initial release.
|