sently 0.7.2 → 0.9.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.
Files changed (270) hide show
  1. package/AGENTS.md +34 -0
  2. package/CHANGELOG.md +49 -1
  3. package/README.md +89 -776
  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-0gqy32pe.js.map +10 -0
  13. package/dist/{chunk-kebhy657.js → chunk-0qxws3kj.js} +2 -2
  14. package/dist/{chunk-kebhy657.js.map → chunk-0qxws3kj.js.map} +1 -1
  15. package/dist/chunk-29z7fkzy.js +4 -0
  16. package/dist/{chunk-74rha3ac.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-keksa6fx.js → chunk-6npp3x3c.js} +2 -2
  20. package/dist/{chunk-keksa6fx.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-gkkv7yqm.js → chunk-8dty8c4p.js} +3 -3
  24. package/dist/{chunk-gkkv7yqm.js.map → chunk-8dty8c4p.js.map} +2 -2
  25. package/dist/{chunk-qp4y0kp2.js → chunk-8njyga62.js} +2 -2
  26. package/dist/{chunk-qp4y0kp2.js.map → chunk-8njyga62.js.map} +1 -1
  27. package/dist/{chunk-gh5n759p.js → chunk-93vqxxj2.js} +3 -3
  28. package/dist/{chunk-gh5n759p.js.map → chunk-93vqxxj2.js.map} +1 -1
  29. package/dist/chunk-b602dhck.js +4 -0
  30. package/dist/{chunk-rm78s1ek.js.map → chunk-b602dhck.js.map} +2 -2
  31. package/dist/chunk-gp4fwrs8.js +4 -0
  32. package/dist/chunk-gp4fwrs8.js.map +10 -0
  33. package/dist/chunk-n0qeyzqm.js +13 -0
  34. package/dist/{chunk-cvrbfke9.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-r7ee9tk7.js.map → chunk-skqhj0rm.js.map} +2 -2
  39. package/dist/{chunk-a1c87hn1.js → chunk-tamww15j.js} +2 -2
  40. package/dist/{chunk-a1c87hn1.js.map → chunk-tamww15j.js.map} +1 -1
  41. package/dist/chunk-vjpds2pf.js +3 -0
  42. package/dist/chunk-vjpds2pf.js.map +10 -0
  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-d5rwm3br.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/provider-label.d.ts +6 -0
  53. package/dist/core/push-endpoint.d.ts +29 -0
  54. package/dist/core/push-types.d.ts +98 -0
  55. package/dist/core/sms-types.d.ts +76 -0
  56. package/dist/core/smtp.js +2 -2
  57. package/dist/core/smtp.js.map +1 -1
  58. package/dist/core/types.d.ts +27 -4
  59. package/dist/core/whatsapp-types.d.ts +116 -0
  60. package/dist/detect.js +2 -2
  61. package/dist/detect.js.map +1 -1
  62. package/dist/dkim.js +2 -2
  63. package/dist/dkim.js.map +2 -2
  64. package/dist/idempotency.d.ts +1 -0
  65. package/dist/idempotency.js +2 -2
  66. package/dist/idempotency.js.map +3 -3
  67. package/dist/index.d.ts +24 -2
  68. package/dist/index.js +23 -0
  69. package/dist/mailer.js +2 -2
  70. package/dist/mailer.js.map +1 -1
  71. package/dist/observability/console.d.ts +12 -0
  72. package/dist/observability/console.js +3 -0
  73. package/dist/observability/console.js.map +10 -0
  74. package/dist/plugins/react.js +2 -2
  75. package/dist/plugins/react.js.map +2 -2
  76. package/dist/plugins/template.js +1 -1
  77. package/dist/pool/pool.js +2 -2
  78. package/dist/pool/pool.js.map +1 -1
  79. package/dist/push.d.ts +26 -0
  80. package/dist/push.js +3 -0
  81. package/dist/push.js.map +10 -0
  82. package/dist/sms.d.ts +26 -0
  83. package/dist/sms.js +3 -0
  84. package/dist/sms.js.map +10 -0
  85. package/dist/smtp-mailer.js +2 -2
  86. package/dist/smtp-mailer.js.map +2 -2
  87. package/dist/transports/brevo.d.ts +1 -0
  88. package/dist/transports/brevo.js +2 -2
  89. package/dist/transports/brevo.js.map +3 -3
  90. package/dist/transports/cloudflare-email.d.ts +58 -0
  91. package/dist/transports/cloudflare-email.js +3 -0
  92. package/dist/transports/cloudflare-email.js.map +10 -0
  93. package/dist/transports/fallback.d.ts +100 -0
  94. package/dist/transports/fallback.js +3 -0
  95. package/dist/transports/fallback.js.map +9 -0
  96. package/dist/transports/loops.d.ts +32 -0
  97. package/dist/transports/loops.js +3 -0
  98. package/dist/transports/loops.js.map +10 -0
  99. package/dist/transports/mailersend.d.ts +27 -0
  100. package/dist/transports/mailersend.js +3 -0
  101. package/dist/transports/mailersend.js.map +10 -0
  102. package/dist/transports/mailgun.d.ts +1 -0
  103. package/dist/transports/mailgun.js +2 -2
  104. package/dist/transports/mailgun.js.map +3 -3
  105. package/dist/transports/mailtrap.d.ts +36 -0
  106. package/dist/transports/mailtrap.js +3 -0
  107. package/dist/transports/mailtrap.js.map +10 -0
  108. package/dist/transports/msegat.d.ts +132 -0
  109. package/dist/transports/msegat.js +3 -0
  110. package/dist/transports/msegat.js.map +10 -0
  111. package/dist/transports/plunk.d.ts +29 -0
  112. package/dist/transports/plunk.js +3 -0
  113. package/dist/transports/plunk.js.map +10 -0
  114. package/dist/transports/postmark.d.ts +1 -0
  115. package/dist/transports/postmark.js +2 -2
  116. package/dist/transports/postmark.js.map +3 -3
  117. package/dist/transports/preview.d.ts +1 -0
  118. package/dist/transports/preview.js +2 -2
  119. package/dist/transports/preview.js.map +3 -3
  120. package/dist/transports/resend.d.ts +1 -0
  121. package/dist/transports/resend.js +2 -2
  122. package/dist/transports/resend.js.map +3 -3
  123. package/dist/transports/retry.d.ts +1 -0
  124. package/dist/transports/retry.js +2 -2
  125. package/dist/transports/retry.js.map +3 -3
  126. package/dist/transports/sendgrid.d.ts +1 -0
  127. package/dist/transports/sendgrid.js +2 -2
  128. package/dist/transports/sendgrid.js.map +3 -3
  129. package/dist/transports/ses.d.ts +1 -0
  130. package/dist/transports/ses.js +3 -3
  131. package/dist/transports/ses.js.map +3 -3
  132. package/dist/transports/smtp.d.ts +1 -0
  133. package/dist/transports/smtp.js +2 -2
  134. package/dist/transports/smtp.js.map +1 -1
  135. package/dist/transports/sndr.d.ts +41 -0
  136. package/dist/transports/sndr.js +3 -0
  137. package/dist/transports/sndr.js.map +10 -0
  138. package/dist/transports/sparkpost.d.ts +30 -0
  139. package/dist/transports/sparkpost.js +3 -0
  140. package/dist/transports/sparkpost.js.map +10 -0
  141. package/dist/transports/taqnyat-mail.d.ts +33 -0
  142. package/dist/transports/taqnyat-mail.js +3 -0
  143. package/dist/transports/taqnyat-mail.js.map +10 -0
  144. package/dist/transports/taqnyat-phone.d.ts +4 -0
  145. package/dist/transports/taqnyat-sms.d.ts +131 -0
  146. package/dist/transports/taqnyat-sms.js +3 -0
  147. package/dist/transports/taqnyat-sms.js.map +10 -0
  148. package/dist/transports/taqnyat-whatsapp.d.ts +51 -0
  149. package/dist/transports/taqnyat-whatsapp.js +3 -0
  150. package/dist/transports/taqnyat-whatsapp.js.map +10 -0
  151. package/dist/transports/twilio-sms.d.ts +66 -0
  152. package/dist/transports/twilio-sms.js +3 -0
  153. package/dist/transports/twilio-sms.js.map +10 -0
  154. package/dist/transports/webpush.d.ts +46 -0
  155. package/dist/transports/webpush.js +3 -0
  156. package/dist/transports/webpush.js.map +10 -0
  157. package/dist/transports/weighted-fallback.d.ts +65 -0
  158. package/dist/transports/weighted-fallback.js +3 -0
  159. package/dist/transports/weighted-fallback.js.map +10 -0
  160. package/dist/transports/whatsapp-cloud.d.ts +56 -0
  161. package/dist/transports/whatsapp-cloud.js +3 -0
  162. package/dist/transports/whatsapp-cloud.js.map +10 -0
  163. package/dist/webhooks/brevo.js +1 -1
  164. package/dist/webhooks/mailgun.js +1 -1
  165. package/dist/webhooks/postmark.js +1 -1
  166. package/dist/webhooks/resend.js +1 -1
  167. package/dist/webhooks/sendgrid.js +1 -1
  168. package/dist/webhooks/ses.js +1 -1
  169. package/dist/webhooks/sndr.d.ts +16 -0
  170. package/dist/webhooks/sndr.js +3 -0
  171. package/dist/webhooks/sndr.js.map +10 -0
  172. package/dist/webhooks/timing-safe-equal.js +1 -1
  173. package/dist/webhooks.d.ts +9 -2
  174. package/dist/webhooks.js +4 -0
  175. package/dist/whatsapp.d.ts +26 -0
  176. package/dist/whatsapp.js +3 -0
  177. package/dist/whatsapp.js.map +10 -0
  178. package/package.json +121 -4
  179. package/site/README.md +26 -0
  180. package/site/content/docs/ai/index.mdx +13 -0
  181. package/site/content/docs/ai/llms-txt.mdx +12 -0
  182. package/site/content/docs/ai/mcp.mdx +16 -0
  183. package/site/content/docs/ai/meta.json +9 -0
  184. package/site/content/docs/channels/email.mdx +100 -0
  185. package/site/content/docs/channels/hooks.mdx +87 -0
  186. package/site/content/docs/channels/index.mdx +81 -0
  187. package/site/content/docs/channels/meta.json +12 -0
  188. package/site/content/docs/channels/push.mdx +92 -0
  189. package/site/content/docs/channels/sms.mdx +88 -0
  190. package/site/content/docs/channels/whatsapp.mdx +95 -0
  191. package/site/content/docs/decorators/fallback.mdx +34 -0
  192. package/site/content/docs/decorators/idempotency.mdx +34 -0
  193. package/site/content/docs/decorators/index.mdx +50 -0
  194. package/site/content/docs/decorators/meta.json +12 -0
  195. package/site/content/docs/decorators/preview.mdx +34 -0
  196. package/site/content/docs/decorators/retry.mdx +34 -0
  197. package/site/content/docs/decorators/weighted-fallback.mdx +34 -0
  198. package/site/content/docs/get-started/entrypoints.mdx +114 -0
  199. package/site/content/docs/get-started/index.mdx +14 -0
  200. package/site/content/docs/get-started/installation.mdx +78 -0
  201. package/site/content/docs/get-started/introduction.mdx +77 -0
  202. package/site/content/docs/get-started/meta.json +12 -0
  203. package/site/content/docs/get-started/migrate-nodemailer.mdx +23 -0
  204. package/site/content/docs/get-started/runtimes.mdx +17 -0
  205. package/site/content/docs/guides/adapters.mdx +26 -0
  206. package/site/content/docs/guides/attachments.mdx +19 -0
  207. package/site/content/docs/guides/bundle-size.mdx +78 -0
  208. package/site/content/docs/guides/dkim.mdx +26 -0
  209. package/site/content/docs/guides/index.mdx +15 -0
  210. package/site/content/docs/guides/meta.json +21 -0
  211. package/site/content/docs/guides/oauth2.mdx +23 -0
  212. package/site/content/docs/guides/observability.mdx +16 -0
  213. package/site/content/docs/guides/plugins-template.mdx +22 -0
  214. package/site/content/docs/guides/pool.mdx +24 -0
  215. package/site/content/docs/guides/react-email.mdx +20 -0
  216. package/site/content/docs/guides/security.mdx +17 -0
  217. package/site/content/docs/guides/send-bulk.mdx +18 -0
  218. package/site/content/docs/guides/vendor-extras-otp.mdx +18 -0
  219. package/site/content/docs/guides/webhooks.mdx +120 -0
  220. package/site/content/docs/guides/webpush-interop.mdx +18 -0
  221. package/site/content/docs/index.mdx +15 -0
  222. package/site/content/docs/meta.json +15 -0
  223. package/site/content/docs/quick-start/email.mdx +40 -0
  224. package/site/content/docs/quick-start/index.mdx +15 -0
  225. package/site/content/docs/quick-start/meta.json +5 -0
  226. package/site/content/docs/quick-start/push.mdx +36 -0
  227. package/site/content/docs/quick-start/sms.mdx +36 -0
  228. package/site/content/docs/quick-start/whatsapp.mdx +38 -0
  229. package/site/content/docs/reference/errors.mdx +22 -0
  230. package/site/content/docs/reference/exports.mdx +83 -0
  231. package/site/content/docs/reference/index.mdx +15 -0
  232. package/site/content/docs/reference/mail-options.mdx +22 -0
  233. package/site/content/docs/reference/meta.json +15 -0
  234. package/site/content/docs/reference/push-options.mdx +20 -0
  235. package/site/content/docs/reference/sms-options.mdx +17 -0
  236. package/site/content/docs/reference/transport-contracts.mdx +17 -0
  237. package/site/content/docs/reference/webhook-events.mdx +70 -0
  238. package/site/content/docs/reference/whatsapp-options.mdx +15 -0
  239. package/site/content/docs/transports/brevo.mdx +40 -0
  240. package/site/content/docs/transports/cloudflare-email.mdx +40 -0
  241. package/site/content/docs/transports/index.mdx +105 -0
  242. package/site/content/docs/transports/loops.mdx +41 -0
  243. package/site/content/docs/transports/mailersend.mdx +40 -0
  244. package/site/content/docs/transports/mailgun.mdx +42 -0
  245. package/site/content/docs/transports/mailtrap.mdx +42 -0
  246. package/site/content/docs/transports/meta.json +32 -0
  247. package/site/content/docs/transports/msegat.mdx +42 -0
  248. package/site/content/docs/transports/plunk.mdx +40 -0
  249. package/site/content/docs/transports/postmark.mdx +40 -0
  250. package/site/content/docs/transports/resend.mdx +43 -0
  251. package/site/content/docs/transports/sendgrid.mdx +40 -0
  252. package/site/content/docs/transports/ses.mdx +44 -0
  253. package/site/content/docs/transports/smtp.mdx +47 -0
  254. package/site/content/docs/transports/sndr.mdx +144 -0
  255. package/site/content/docs/transports/sparkpost.mdx +41 -0
  256. package/site/content/docs/transports/taqnyat-mail.mdx +41 -0
  257. package/site/content/docs/transports/taqnyat-sms.mdx +41 -0
  258. package/site/content/docs/transports/taqnyat-whatsapp.mdx +40 -0
  259. package/site/content/docs/transports/twilio-sms.mdx +128 -0
  260. package/site/content/docs/transports/webpush.mdx +43 -0
  261. package/site/content/docs/transports/whatsapp-cloud.mdx +42 -0
  262. package/dist/chunk-4mvp3b85.js +0 -3
  263. package/dist/chunk-4mvp3b85.js.map +0 -10
  264. package/dist/chunk-74rha3ac.js +0 -4
  265. package/dist/chunk-cvrbfke9.js +0 -13
  266. package/dist/chunk-d5rwm3br.js +0 -5
  267. package/dist/chunk-ka6t8g77.js +0 -4
  268. package/dist/chunk-ka6t8g77.js.map +0 -11
  269. package/dist/chunk-r7ee9tk7.js +0 -4
  270. package/dist/chunk-rm78s1ek.js +0 -4
package/AGENTS.md ADDED
@@ -0,0 +1,34 @@
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
+ - Dev notes: `CLAUDE.md`
23
+
24
+ ## Commands
25
+
26
+ ```sh
27
+ bun install
28
+ bun test
29
+ bun run site:dev
30
+ bun run site:build
31
+ bun run verify
32
+ ```
33
+
34
+ Do not invent APIs. Prefer imports from published subpaths (`sently/mailer`, `sently/sms`, `sently/transports/*`).
package/CHANGELOG.md CHANGED
@@ -2,6 +2,52 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.0] — 2026-08-01
6
+
7
+ ### Added
8
+
9
+ - **Channel senders** — `createSmsSender` (`sently/sms`), `createWhatsAppSender`
10
+ (`sently/whatsapp`), `createPushSender` (`sently/push`) alongside email; each
11
+ sender supports plugins and lifecycle hooks
12
+ - **SMS transports** — Twilio, Taqnyat SMS, Msegat (`sently/transports/twilio-sms`,
13
+ `taqnyat-sms`, `msegat`); vendor OTP helpers stay on the transport class
14
+ - **WhatsApp transports** — WhatsApp Cloud API, Taqnyat WhatsApp
15
+ (`sently/transports/whatsapp-cloud`, `taqnyat-whatsapp`)
16
+ - **Web Push transport** — VAPID Web Push (`sently/transports/webpush`)
17
+ - **Email transports** — Sndr, Taqnyat Mail (`sently/transports/sndr`,
18
+ `taqnyat-mail`)
19
+ - **Sndr webhooks** — `parseSndrWebhook` / `verifySndrSignature`
20
+ (`sently/webhooks/sndr`, also via `sently/webhooks`)
21
+ - **Per-provider webhook subpaths** — `sently/webhooks/{brevo,mailgun,postmark,
22
+ resend,sendgrid,ses,sndr}` for tree-shakeable imports
23
+ - **Docs site** — Next.js + Fumadocs handbook under `site/` (`bun run site:dev`)
24
+ - **Web Push interop example** — `examples/webpush-interop`
25
+ - **`AGENTS.md`** — agent contract for the sently-first provider model (replaces
26
+ `CLAUDE.md`; published with the package)
27
+
28
+ ### Changed
29
+
30
+ - **Library scope** — channel-first messaging (email, SMS, WhatsApp, push), not
31
+ email-only; package description and README updated accordingly
32
+ - **Docs site branding** — real sently wordmark / mark in the header, homepage,
33
+ 404, favicon, Apple touch icon, and docs OG images; README shows the logo
34
+
35
+ ## [0.8.0] — 2026-06-07
36
+
37
+ ### Added
38
+
39
+ - **`FallbackTransport`** (`sently/transports/fallback`) — provider failover through an ordered transport list; composes with `RetryTransport`; `FallbackError.attempts` records `{ provider, error }` per failed attempt
40
+ - **Five HTTP providers:** MailerSend, Plunk, SparkPost, Mailtrap, Loops (`sently/transports/mailersend`, `plunk`, `sparkpost`, `mailtrap`, `loops`)
41
+ - **`SendResult.provider`** and **`SendResult.providerIndex`** — set by `FallbackTransport` to identify which provider handled the send
42
+ - **`durationMs`** optional third argument on `onSuccess` / `onError` mailer hooks (backward compatible)
43
+ - **`consoleObserver`** (`sently/observability`) — ready-made console logging hooks; also exported from main `"sently"` barrel
44
+ - **Mailer `onFallback` hook** — `onFallback(ctx, failedProvider, nextProvider, error)` on `MailerHooks`; wired automatically when using `FallbackTransport` or `WeightedFallbackTransport`
45
+ - **Provider cooldowns** — `FallbackTransport(transports, { cooldownMs })` skips unhealthy providers until cooldown expires; shared across `WeightedFallbackTransport` sends
46
+ - **`verifyAll()`** on `FallbackTransport` / `WeightedFallbackTransport` — per-provider `{ ok, providers: [{ provider, ok, message? }] }` result; `verify()` still returns the first healthy provider
47
+ - **`WeightedFallbackTransport`** (`sently/transports/weighted-fallback`) — weighted-random primary provider with failover through remaining providers
48
+ - **`Transport.provider`** — stable provider identifier on every transport class; `getProviderLabel()` prefers it over `constructor.name` inference
49
+ - **`CloudflareEmailTransport`** (`sently/transports/cloudflare-email`) — Workers `send_email` binding transport (not fetch HTTP)
50
+
5
51
  ## [0.7.2] — 2026-05-31
6
52
 
7
53
  ### Fixed
@@ -376,4 +422,6 @@ Remaining gaps (SOCKS proxy, iCal) are out of scope by design.
376
422
 
377
423
  ## [0.1.0] — 2026-05-29
378
424
 
379
- Initial release.
425
+ ### Added
426
+
427
+ - Initial release.