@lenne.tech/nest-server 11.41.5 → 11.41.6

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.
@@ -680,6 +680,22 @@ copy: its models' `securityCheck()` **records its own invocation** (`checkedFor`
680
680
  narrowing fields, so "the response looks redacted" — which a `@Restricted` rule, `prepareOutput` or
681
681
  a typo in the fixture would produce too — becomes "the hook ran, with this user, on this object".
682
682
 
683
+ ## Mail: one real SMTP round trip
684
+
685
+ Every other mail test runs on `jsonTransport`, so the mail library could change its wire behaviour and
686
+ every suite would stay green. That stopped being acceptable when 11.41.5 moved nodemailer across a
687
+ major (9 → 10, a TypeScript rewrite) with no test that had ever sent a message through a real
688
+ handshake. `tests/unit/email-smtp-roundtrip.spec.ts` closes that: an in-process `smtp-server`
689
+ (devDependency, no Docker, hence the unit runner) on 127.0.0.1 with STARTTLS and AUTH-over-TLS-only,
690
+ and `EmailService.sendMail()` against it — delivered, upgraded, authenticated, attachment intact,
691
+ paired with refusals (wrong password; `requireTLS` against a server that cannot do STARTTLS).
692
+
693
+ One trap worth knowing before you extend it: `smtp-server`'s `hideSTARTTLS` only removes the
694
+ capability from the EHLO reply — the command still works, and nodemailer with `requireTLS` issues it
695
+ anyway and upgrades. So `hideSTARTTLS` simulates a STRIPPED capability line (and the spec asserts the
696
+ upgrade there), while a server that genuinely cannot encrypt needs `disabledCommands: ['STARTTLS']`.
697
+ A refusal test written against `hideSTARTTLS` fails for the right reason: the mail went out encrypted.
698
+
683
699
  ## Structural invariants over `src/`
684
700
 
685
701
  Some properties cannot be observed by running the code, only by reading it — and a runtime guard
package/FRAMEWORK-API.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @lenne.tech/nest-server — Framework API Reference
2
2
 
3
- > Auto-generated from source code as of 2026-10-01 (v11.41.5)
3
+ > Auto-generated from source code as of 2026-10-02 (v11.41.6)
4
4
  > File: `FRAMEWORK-API.md` — compact, machine-readable API surface for Claude Code
5
5
 
6
6
  ## CoreModule.forRoot()
@@ -0,0 +1,105 @@
1
+ # Migration Guide: 11.41.5 → 11.41.6
2
+
3
+ ## Overview
4
+
5
+ | Category | Details |
6
+ | --------------------- | ----------------------------------------------------------------------------------------- |
7
+ | **Breaking Changes** | None |
8
+ | **Dependencies** | `@types/nodemailer` dropped (nodemailer 10 ships its own declarations) |
9
+ | **Security** | Two critical advisories in the SWC dev tooling (`piscina`, `@xhmikosr/decompress`) (§2) |
10
+ | **Migration Effort** | No code changes; a lockfile refresh, and one override key to widen in starter-based projects |
11
+
12
+ ## Quick Migration
13
+
14
+ ```bash
15
+ pnpm update @lenne.tech/nest-server
16
+ pnpm update piscina --depth Infinity # only if `pnpm audit` reports GHSA-67c8-pqhq-4rmx (§2)
17
+ # starter-based projects: widen the @xhmikosr/decompress override key (§2)
18
+ pnpm run build && pnpm test
19
+ ```
20
+
21
+ Vendor-mode projects have nothing to pick up from `src/core/` in this release.
22
+
23
+ ## What's New in 11.41.6
24
+
25
+ ### 1. `@types/nodemailer` is gone
26
+
27
+ nodemailer 10 (since 11.41.5) is a TypeScript rewrite that ships its own declarations, so the
28
+ separate `@types/nodemailer` package is no longer read. This repository dropped it from its
29
+ devDependencies. If your project lists it, you can remove it as well:
30
+
31
+ ```bash
32
+ pnpm remove @types/nodemailer
33
+ ```
34
+
35
+ Keeping it does no harm — TypeScript resolves the declarations bundled with `nodemailer` first —
36
+ but it is a package to keep updated that nothing uses.
37
+
38
+ ### 2. Two critical advisories in the SWC dev tooling — fix them in YOUR project
39
+
40
+ Both reach a project through `@swc/cli` (which `@nestjs/cli` uses for SWC builds), and neither
41
+ can be fixed from here: this repository's lockfile and overrides do not reach your project.
42
+
43
+ #### `piscina`
44
+
45
+ `piscina` < 4.9.4 is covered by **GHSA-67c8-pqhq-4rmx** (critical, prototype-pollution gadget in
46
+ `ThreadPool.options`). `@swc/cli` depends on `piscina@^4.3.1`, and the fixed 4.9.4 is inside
47
+ that range, so no override is needed — only a lockfile refresh:
48
+
49
+ ```bash
50
+ pnpm update piscina --depth Infinity
51
+ pnpm audit
52
+ ```
53
+
54
+ nest-server-starter 11.41.6 already resolves 4.9.4.
55
+
56
+ #### `@xhmikosr/decompress`
57
+
58
+ **GHSA-hrh2-vp3x-79xf** (critical, path traversal via a symlink chain) covers
59
+ `@xhmikosr/decompress >= 11.0.0, <= 11.1.3`; 11.1.4 is fixed. Projects created from
60
+ nest-server-starter carry this override in `pnpm-workspace.yaml`:
61
+
62
+ ```yaml
63
+ '@xhmikosr/decompress@>=11.0.0 <11.1.3': 11.1.4
64
+ ```
65
+
66
+ Its key stops one patch short: 11.1.3 is vulnerable too, and a project that resolves it is not
67
+ caught. Widen the key and refresh:
68
+
69
+ ```yaml
70
+ '@xhmikosr/decompress@>=11.0.0 <11.1.4': 11.1.4
71
+ ```
72
+
73
+ ```bash
74
+ pnpm install
75
+ pnpm audit
76
+ ```
77
+
78
+ nest-server-starter 11.41.6 ships the widened key.
79
+
80
+ ### 3. Under the hood
81
+
82
+ `EmailService` is now covered by a test that sends through a real SMTP handshake (STARTTLS,
83
+ authentication, attachment, `requireTLS` refusing a server without STARTTLS) instead of only
84
+ `jsonTransport`. No behaviour changed.
85
+
86
+ ## Compatibility Notes
87
+
88
+ | Pattern | Status |
89
+ | ------- | ------ |
90
+ | `@types/nodemailer` in your devDependencies | Unused; safe to remove |
91
+ | Code typing `nodemailer/lib/…` transports as `X.default` (11.41.5) | Unchanged |
92
+ | A lockfile resolving `piscina@4.9.3` | Vulnerable — refresh it (§2) |
93
+ | Override `'@xhmikosr/decompress@>=11.0.0 <11.1.3': 11.1.4` | Misses 11.1.3 — widen the key to `<11.1.4` (§2) |
94
+
95
+ ## Troubleshooting
96
+
97
+ | Symptom | Cause | Fix |
98
+ | ------- | ----- | --- |
99
+ | `pnpm audit` reports GHSA-67c8-pqhq-4rmx (`piscina`) | Lockfile still resolves 4.9.3 | `pnpm update piscina --depth Infinity` |
100
+ | `pnpm update piscina` changes nothing | An override pins `piscina` | Raise or remove the override to `4.9.4` |
101
+ | `pnpm audit` reports GHSA-hrh2-vp3x-79xf (`@xhmikosr/decompress`) | Override key `<11.1.3` misses 11.1.3 | Widen the key to `<11.1.4` |
102
+
103
+ ## Module Documentation
104
+
105
+ - [Migration guide 11.41.4 → 11.41.5](./11.41.4-to-11.41.5.md) — the nodemailer 10 upgrade this release builds on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lenne.tech/nest-server",
3
- "version": "11.41.5",
3
+ "version": "11.41.6",
4
4
  "description": "Modern, fast, powerful Node.js web framework in TypeScript based on Nest with a GraphQL API and a connection to MongoDB (or other databases).",
5
5
  "keywords": [
6
6
  "node",
@@ -196,7 +196,6 @@
196
196
  "@types/lodash": "4.17.25",
197
197
  "@types/multer": "2.3.0",
198
198
  "@types/node": "26.6.3",
199
- "@types/nodemailer": "8.0.2",
200
199
  "@types/passport": "1.0.17",
201
200
  "@vitest/coverage-v8": "4.1.11",
202
201
  "ansi-colors": "4.1.3",
@@ -212,6 +211,7 @@
212
211
  "oxfmt": "0.71.0",
213
212
  "oxlint": "1.86.0",
214
213
  "rimraf": "6.1.3",
214
+ "smtp-server": "3.19.16",
215
215
  "ts-node": "10.9.2",
216
216
  "tsconfig-paths": "4.2.0",
217
217
  "tsx": "4.23.15",