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