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