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.
Files changed (249) hide show
  1. package/AGENTS.md +33 -0
  2. package/CHANGELOG.md +82 -41
  3. package/README.md +89 -960
  4. package/dist/adapters/bun.js +1 -1
  5. package/dist/adapters/cf.js +2 -2
  6. package/dist/adapters/cf.js.map +2 -2
  7. package/dist/adapters/deno.js +1 -1
  8. package/dist/adapters/node.js +1 -1
  9. package/dist/auth/oauth2.js +2 -2
  10. package/dist/auth/oauth2.js.map +1 -1
  11. package/dist/chunk-0gqy32pe.js +4 -0
  12. package/dist/{chunk-n5dan5bz.js.map → chunk-0gqy32pe.js.map} +2 -2
  13. package/dist/{chunk-z62q7kqr.js → chunk-0qxws3kj.js} +2 -2
  14. package/dist/{chunk-z62q7kqr.js.map → chunk-0qxws3kj.js.map} +1 -1
  15. package/dist/chunk-29z7fkzy.js +4 -0
  16. package/dist/{chunk-wsymfbkn.js.map → chunk-29z7fkzy.js.map} +2 -2
  17. package/dist/chunk-5915vbcj.js +4 -0
  18. package/dist/chunk-5915vbcj.js.map +10 -0
  19. package/dist/{chunk-nbmq8ejv.js → chunk-6npp3x3c.js} +2 -2
  20. package/dist/{chunk-nbmq8ejv.js.map → chunk-6npp3x3c.js.map} +1 -1
  21. package/dist/chunk-7gy2q9sh.js +4 -0
  22. package/dist/chunk-7gy2q9sh.js.map +10 -0
  23. package/dist/{chunk-zst8an2p.js → chunk-8dty8c4p.js} +2 -2
  24. package/dist/{chunk-zst8an2p.js.map → chunk-8dty8c4p.js.map} +2 -2
  25. package/dist/{chunk-f3dz43cy.js → chunk-8njyga62.js} +2 -2
  26. package/dist/{chunk-f3dz43cy.js.map → chunk-8njyga62.js.map} +1 -1
  27. package/dist/chunk-93vqxxj2.js +4 -0
  28. package/dist/{chunk-qh90yr6d.js.map → chunk-93vqxxj2.js.map} +2 -2
  29. package/dist/chunk-b602dhck.js +4 -0
  30. package/dist/{chunk-wbvhaqcp.js.map → chunk-b602dhck.js.map} +2 -2
  31. package/dist/{chunk-9zkv5azm.js → chunk-gp4fwrs8.js} +2 -2
  32. package/dist/{chunk-9zkv5azm.js.map → chunk-gp4fwrs8.js.map} +1 -1
  33. package/dist/chunk-n0qeyzqm.js +13 -0
  34. package/dist/{chunk-8phpsns1.js.map → chunk-n0qeyzqm.js.map} +2 -2
  35. package/dist/chunk-qtkd5bak.js +4 -0
  36. package/dist/chunk-qtkd5bak.js.map +11 -0
  37. package/dist/chunk-skqhj0rm.js +4 -0
  38. package/dist/{chunk-vhxzhx8b.js.map → chunk-skqhj0rm.js.map} +2 -2
  39. package/dist/{chunk-6bkj4y4r.js → chunk-tamww15j.js} +2 -2
  40. package/dist/{chunk-6bkj4y4r.js.map → chunk-tamww15j.js.map} +1 -1
  41. package/dist/chunk-vjpds2pf.js +3 -0
  42. package/dist/{chunk-m07smapm.js.map → chunk-vjpds2pf.js.map} +2 -2
  43. package/dist/chunk-yp311efr.js +4 -0
  44. package/dist/chunk-yp311efr.js.map +10 -0
  45. package/dist/chunk-ywq6s10g.js +5 -0
  46. package/dist/{chunk-5scdgffb.js.map → chunk-ywq6s10g.js.map} +3 -3
  47. package/dist/core/base64.d.ts +10 -0
  48. package/dist/core/errors.js +2 -2
  49. package/dist/core/errors.js.map +1 -1
  50. package/dist/core/hooks.d.ts +14 -0
  51. package/dist/core/plugin.d.ts +7 -7
  52. package/dist/core/push-endpoint.d.ts +29 -0
  53. package/dist/core/push-types.d.ts +98 -0
  54. package/dist/core/sms-types.d.ts +76 -0
  55. package/dist/core/smtp.js +2 -2
  56. package/dist/core/smtp.js.map +1 -1
  57. package/dist/core/whatsapp-types.d.ts +116 -0
  58. package/dist/detect.js +2 -2
  59. package/dist/detect.js.map +1 -1
  60. package/dist/dkim.js +2 -2
  61. package/dist/dkim.js.map +2 -2
  62. package/dist/idempotency.js +2 -2
  63. package/dist/idempotency.js.map +1 -1
  64. package/dist/index.d.ts +5 -32
  65. package/dist/index.js +0 -35
  66. package/dist/mailer.js +2 -2
  67. package/dist/mailer.js.map +1 -1
  68. package/dist/observability/console.js +1 -1
  69. package/dist/plugins/react.js +2 -2
  70. package/dist/plugins/react.js.map +2 -2
  71. package/dist/plugins/template.js +1 -1
  72. package/dist/pool/pool.js +2 -2
  73. package/dist/pool/pool.js.map +1 -1
  74. package/dist/push.d.ts +26 -0
  75. package/dist/push.js +3 -0
  76. package/dist/push.js.map +10 -0
  77. package/dist/sms.d.ts +26 -0
  78. package/dist/sms.js +3 -0
  79. package/dist/sms.js.map +10 -0
  80. package/dist/smtp-mailer.js +2 -2
  81. package/dist/smtp-mailer.js.map +2 -2
  82. package/dist/transports/brevo.js +2 -2
  83. package/dist/transports/brevo.js.map +2 -2
  84. package/dist/transports/cloudflare-email.js +2 -2
  85. package/dist/transports/cloudflare-email.js.map +2 -2
  86. package/dist/transports/fallback.js +2 -2
  87. package/dist/transports/fallback.js.map +1 -1
  88. package/dist/transports/loops.js +2 -2
  89. package/dist/transports/loops.js.map +2 -2
  90. package/dist/transports/mailersend.js +2 -2
  91. package/dist/transports/mailersend.js.map +2 -2
  92. package/dist/transports/mailgun.js +2 -2
  93. package/dist/transports/mailgun.js.map +2 -2
  94. package/dist/transports/mailtrap.js +2 -2
  95. package/dist/transports/mailtrap.js.map +2 -2
  96. package/dist/transports/msegat.d.ts +132 -0
  97. package/dist/transports/msegat.js +3 -0
  98. package/dist/transports/msegat.js.map +10 -0
  99. package/dist/transports/plunk.js +2 -2
  100. package/dist/transports/plunk.js.map +2 -2
  101. package/dist/transports/postmark.js +2 -2
  102. package/dist/transports/postmark.js.map +2 -2
  103. package/dist/transports/preview.js +2 -2
  104. package/dist/transports/preview.js.map +2 -2
  105. package/dist/transports/resend.js +2 -2
  106. package/dist/transports/resend.js.map +2 -2
  107. package/dist/transports/retry.js +2 -2
  108. package/dist/transports/retry.js.map +2 -2
  109. package/dist/transports/sendgrid.js +2 -2
  110. package/dist/transports/sendgrid.js.map +2 -2
  111. package/dist/transports/ses.js +2 -2
  112. package/dist/transports/ses.js.map +2 -2
  113. package/dist/transports/smtp.js +2 -2
  114. package/dist/transports/smtp.js.map +1 -1
  115. package/dist/transports/sndr.d.ts +41 -0
  116. package/dist/transports/sndr.js +3 -0
  117. package/dist/transports/sndr.js.map +10 -0
  118. package/dist/transports/sparkpost.js +2 -2
  119. package/dist/transports/sparkpost.js.map +2 -2
  120. package/dist/transports/taqnyat-mail.d.ts +33 -0
  121. package/dist/transports/taqnyat-mail.js +3 -0
  122. package/dist/transports/taqnyat-mail.js.map +10 -0
  123. package/dist/transports/taqnyat-phone.d.ts +4 -0
  124. package/dist/transports/taqnyat-sms.d.ts +131 -0
  125. package/dist/transports/taqnyat-sms.js +3 -0
  126. package/dist/transports/taqnyat-sms.js.map +10 -0
  127. package/dist/transports/taqnyat-whatsapp.d.ts +51 -0
  128. package/dist/transports/taqnyat-whatsapp.js +3 -0
  129. package/dist/transports/taqnyat-whatsapp.js.map +10 -0
  130. package/dist/transports/twilio-sms.d.ts +66 -0
  131. package/dist/transports/twilio-sms.js +3 -0
  132. package/dist/transports/twilio-sms.js.map +10 -0
  133. package/dist/transports/webpush.d.ts +46 -0
  134. package/dist/transports/webpush.js +3 -0
  135. package/dist/transports/webpush.js.map +10 -0
  136. package/dist/transports/weighted-fallback.js +2 -2
  137. package/dist/transports/weighted-fallback.js.map +1 -1
  138. package/dist/transports/whatsapp-cloud.d.ts +56 -0
  139. package/dist/transports/whatsapp-cloud.js +3 -0
  140. package/dist/transports/whatsapp-cloud.js.map +10 -0
  141. package/dist/webhooks/brevo.js +1 -1
  142. package/dist/webhooks/mailgun.js +1 -1
  143. package/dist/webhooks/postmark.js +1 -1
  144. package/dist/webhooks/resend.js +1 -1
  145. package/dist/webhooks/sendgrid.js +1 -1
  146. package/dist/webhooks/ses.js +1 -1
  147. package/dist/webhooks/sndr.d.ts +16 -0
  148. package/dist/webhooks/sndr.js +3 -0
  149. package/dist/webhooks/sndr.js.map +10 -0
  150. package/dist/webhooks/timing-safe-equal.js +1 -1
  151. package/dist/webhooks.d.ts +9 -2
  152. package/dist/webhooks.js +4 -0
  153. package/dist/whatsapp.d.ts +26 -0
  154. package/dist/whatsapp.js +3 -0
  155. package/dist/whatsapp.js.map +10 -0
  156. package/package.json +85 -4
  157. package/site/README.md +26 -0
  158. package/site/content/docs/ai/index.mdx +13 -0
  159. package/site/content/docs/ai/llms-txt.mdx +12 -0
  160. package/site/content/docs/ai/mcp.mdx +16 -0
  161. package/site/content/docs/ai/meta.json +9 -0
  162. package/site/content/docs/channels/email.mdx +100 -0
  163. package/site/content/docs/channels/hooks.mdx +87 -0
  164. package/site/content/docs/channels/index.mdx +81 -0
  165. package/site/content/docs/channels/meta.json +12 -0
  166. package/site/content/docs/channels/push.mdx +92 -0
  167. package/site/content/docs/channels/sms.mdx +88 -0
  168. package/site/content/docs/channels/whatsapp.mdx +95 -0
  169. package/site/content/docs/decorators/fallback.mdx +34 -0
  170. package/site/content/docs/decorators/idempotency.mdx +34 -0
  171. package/site/content/docs/decorators/index.mdx +50 -0
  172. package/site/content/docs/decorators/meta.json +12 -0
  173. package/site/content/docs/decorators/preview.mdx +34 -0
  174. package/site/content/docs/decorators/retry.mdx +34 -0
  175. package/site/content/docs/decorators/weighted-fallback.mdx +34 -0
  176. package/site/content/docs/get-started/entrypoints.mdx +114 -0
  177. package/site/content/docs/get-started/index.mdx +14 -0
  178. package/site/content/docs/get-started/installation.mdx +78 -0
  179. package/site/content/docs/get-started/introduction.mdx +77 -0
  180. package/site/content/docs/get-started/meta.json +12 -0
  181. package/site/content/docs/get-started/migrate-nodemailer.mdx +23 -0
  182. package/site/content/docs/get-started/runtimes.mdx +17 -0
  183. package/site/content/docs/guides/adapters.mdx +26 -0
  184. package/site/content/docs/guides/attachments.mdx +19 -0
  185. package/site/content/docs/guides/bundle-size.mdx +78 -0
  186. package/site/content/docs/guides/dkim.mdx +26 -0
  187. package/site/content/docs/guides/index.mdx +15 -0
  188. package/site/content/docs/guides/meta.json +21 -0
  189. package/site/content/docs/guides/oauth2.mdx +23 -0
  190. package/site/content/docs/guides/observability.mdx +16 -0
  191. package/site/content/docs/guides/plugins-template.mdx +22 -0
  192. package/site/content/docs/guides/pool.mdx +24 -0
  193. package/site/content/docs/guides/react-email.mdx +20 -0
  194. package/site/content/docs/guides/security.mdx +17 -0
  195. package/site/content/docs/guides/send-bulk.mdx +18 -0
  196. package/site/content/docs/guides/vendor-extras-otp.mdx +18 -0
  197. package/site/content/docs/guides/webhooks.mdx +120 -0
  198. package/site/content/docs/guides/webpush-interop.mdx +18 -0
  199. package/site/content/docs/index.mdx +15 -0
  200. package/site/content/docs/meta.json +15 -0
  201. package/site/content/docs/quick-start/email.mdx +40 -0
  202. package/site/content/docs/quick-start/index.mdx +15 -0
  203. package/site/content/docs/quick-start/meta.json +5 -0
  204. package/site/content/docs/quick-start/push.mdx +36 -0
  205. package/site/content/docs/quick-start/sms.mdx +36 -0
  206. package/site/content/docs/quick-start/whatsapp.mdx +38 -0
  207. package/site/content/docs/reference/errors.mdx +22 -0
  208. package/site/content/docs/reference/exports.mdx +83 -0
  209. package/site/content/docs/reference/index.mdx +15 -0
  210. package/site/content/docs/reference/mail-options.mdx +22 -0
  211. package/site/content/docs/reference/meta.json +15 -0
  212. package/site/content/docs/reference/push-options.mdx +20 -0
  213. package/site/content/docs/reference/sms-options.mdx +17 -0
  214. package/site/content/docs/reference/transport-contracts.mdx +17 -0
  215. package/site/content/docs/reference/webhook-events.mdx +70 -0
  216. package/site/content/docs/reference/whatsapp-options.mdx +15 -0
  217. package/site/content/docs/transports/brevo.mdx +40 -0
  218. package/site/content/docs/transports/cloudflare-email.mdx +40 -0
  219. package/site/content/docs/transports/index.mdx +105 -0
  220. package/site/content/docs/transports/loops.mdx +41 -0
  221. package/site/content/docs/transports/mailersend.mdx +40 -0
  222. package/site/content/docs/transports/mailgun.mdx +42 -0
  223. package/site/content/docs/transports/mailtrap.mdx +42 -0
  224. package/site/content/docs/transports/meta.json +32 -0
  225. package/site/content/docs/transports/msegat.mdx +42 -0
  226. package/site/content/docs/transports/plunk.mdx +40 -0
  227. package/site/content/docs/transports/postmark.mdx +40 -0
  228. package/site/content/docs/transports/resend.mdx +43 -0
  229. package/site/content/docs/transports/sendgrid.mdx +40 -0
  230. package/site/content/docs/transports/ses.mdx +44 -0
  231. package/site/content/docs/transports/smtp.mdx +47 -0
  232. package/site/content/docs/transports/sndr.mdx +144 -0
  233. package/site/content/docs/transports/sparkpost.mdx +41 -0
  234. package/site/content/docs/transports/taqnyat-mail.mdx +41 -0
  235. package/site/content/docs/transports/taqnyat-sms.mdx +41 -0
  236. package/site/content/docs/transports/taqnyat-whatsapp.mdx +40 -0
  237. package/site/content/docs/transports/twilio-sms.mdx +128 -0
  238. package/site/content/docs/transports/webpush.mdx +43 -0
  239. package/site/content/docs/transports/whatsapp-cloud.mdx +42 -0
  240. package/dist/chunk-5scdgffb.js +0 -5
  241. package/dist/chunk-8phpsns1.js +0 -13
  242. package/dist/chunk-m07smapm.js +0 -3
  243. package/dist/chunk-n5dan5bz.js +0 -4
  244. package/dist/chunk-qh90yr6d.js +0 -4
  245. package/dist/chunk-vhxzhx8b.js +0 -4
  246. package/dist/chunk-wbvhaqcp.js +0 -4
  247. package/dist/chunk-wsymfbkn.js +0 -4
  248. package/dist/chunk-yr56b0ts.js +0 -4
  249. 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
- Initial release.
434
+ ### ✨ Added
435
+
436
+ - Initial release.