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.
Files changed (3) hide show
  1. package/AGENTS.md +0 -1
  2. package/CHANGELOG.md +66 -43
  3. package/package.json +2 -2
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,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.0",
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",