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.
- package/AGENTS.md +0 -1
- package/CHANGELOG.md +52 -43
- package/package.json +1 -1
package/AGENTS.md
CHANGED
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.
|
|
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,
|