@authuser/nest 1.0.0 → 1.1.0
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/CHANGELOG.md +26 -0
- package/README.md +19 -0
- package/dist/configure-http-app.d.ts.map +1 -1
- package/dist/configure-http-app.js +24 -3
- package/dist/configure-http-app.js.map +1 -1
- package/dist/create-app.d.ts.map +1 -1
- package/dist/create-app.js +15 -0
- package/dist/create-app.js.map +1 -1
- package/dist/http-exception.filter.d.ts +3 -0
- package/dist/http-exception.filter.d.ts.map +1 -1
- package/dist/http-exception.filter.js +28 -1
- package/dist/http-exception.filter.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/options.d.ts +5 -1
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +180 -4
- package/dist/options.js.map +1 -1
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/configuration.md +22 -0
- package/docs/performance.md +5 -5
- package/docs/security.md +6 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,32 @@ This project uses [Semantic Versioning](https://semver.org/).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [1.1.0] - 2026-09-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Add optional RFC 9457 Problem Details responses through
|
|
13
|
+
`errors.format: 'problem-details'`.
|
|
14
|
+
- Allow applications to disable the built-in exception filter or supply their own
|
|
15
|
+
`ExceptionFilter` without giving up the remaining HTTP defaults.
|
|
16
|
+
- Detect repeated `configureHttpApp` calls and non-Fastify Nest applications with
|
|
17
|
+
actionable errors.
|
|
18
|
+
|
|
19
|
+
### Security
|
|
20
|
+
|
|
21
|
+
- Validate configuration at runtime for JavaScript and dynamically loaded settings,
|
|
22
|
+
including presets, callbacks, logger formats, compression encodings and booleans.
|
|
23
|
+
- Reject missing readiness checks, dynamic internal route patterns, control
|
|
24
|
+
characters in application names and reserved correlation-response headers.
|
|
25
|
+
- Validate root modules, network objects and trusted-proxy values before bootstrap.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Append the application duration to an existing `Server-Timing` header instead of
|
|
30
|
+
overwriting timings produced by controllers or other instrumentation.
|
|
31
|
+
- Clarify that browser preflight is installed only when CORS is explicitly enabled.
|
|
32
|
+
- Make the example shutdown smoke test distinguish exit codes from signal exits.
|
|
33
|
+
|
|
8
34
|
## [1.0.0] - 2026-09-03
|
|
9
35
|
|
|
10
36
|
### Added
|
package/README.md
CHANGED
|
@@ -35,6 +35,8 @@ intact while removing repetitive bootstrap code.
|
|
|
35
35
|
- JSON logging by default, with an optional standard Nest console format.
|
|
36
36
|
- Correlated request IDs are validated and returned in `x-request-id`.
|
|
37
37
|
- Dynamic liveness and readiness checks fail closed with HTTP 503.
|
|
38
|
+
- Safe errors support the package contract, RFC 9457 Problem Details, or an
|
|
39
|
+
application-provided exception filter.
|
|
38
40
|
- OpenAPI is optional at runtime. Its code is dynamically imported only when enabled.
|
|
39
41
|
- HTTP QUERY (RFC 10008) passes through Nest 12/Fastify 5 and is included in CORS defaults.
|
|
40
42
|
- Native ESM, strict declarations and a TypeScript 7 toolchain.
|
|
@@ -164,6 +166,22 @@ health: {
|
|
|
164
166
|
A thrown health check is logged internally and returned as a generic HTTP 503. Do
|
|
165
167
|
not include credentials, topology or personal data in successful health responses.
|
|
166
168
|
|
|
169
|
+
### Error responses
|
|
170
|
+
|
|
171
|
+
The built-in error contract hides all 5xx details and includes the request ID. RFC
|
|
172
|
+
9457 Problem Details is available without replacing the filter:
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
const app = await createApp({
|
|
176
|
+
rootModule: AppModule,
|
|
177
|
+
errors: { format: 'problem-details' },
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Applications with an established contract can use `errors: false` to keep their
|
|
182
|
+
existing global filters, or `errors: { filter }` to install a custom Nest
|
|
183
|
+
`ExceptionFilter`.
|
|
184
|
+
|
|
167
185
|
## Configuration examples
|
|
168
186
|
|
|
169
187
|
### CORS allowlist
|
|
@@ -215,6 +233,7 @@ network limits remain adapter responsibilities; `createApp` configures those saf
|
|
|
215
233
|
- `Public()` and `Roles(...roles)` — metadata helpers for your own guards.
|
|
216
234
|
- `HttpExceptionFilter` — the default safe JSON exception filter.
|
|
217
235
|
- Public TypeScript contracts for configuration, health checks and error responses.
|
|
236
|
+
- Optional `HttpErrorResponse` and RFC 9457 `ProblemDetailsResponse` contracts.
|
|
218
237
|
|
|
219
238
|
The decorators intentionally do not provide authentication. Authentication policy
|
|
220
239
|
belongs to the consuming application; pretending otherwise would create a dangerous
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure-http-app.d.ts","sourceRoot":"","sources":["../src/configure-http-app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAKvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"configure-http-app.d.ts","sourceRoot":"","sources":["../src/configure-http-app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAKvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAK1D,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,KAAK,GAAE,uBAA4B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CA+FjC"}
|
|
@@ -2,9 +2,19 @@ import { ValidationPipe, VersioningType } from '@nestjs/common';
|
|
|
2
2
|
import { HttpExceptionFilter } from './http-exception.filter.js';
|
|
3
3
|
import { registerOpenApi } from './openapi.js';
|
|
4
4
|
import { resolveOptions } from './options.js';
|
|
5
|
+
const CONFIGURED = Symbol.for('@authuser/nest:configured');
|
|
5
6
|
export async function configureHttpApp(app, input = {}) {
|
|
7
|
+
const state = app;
|
|
8
|
+
if (state[CONFIGURED]) {
|
|
9
|
+
throw new Error('This Nest application has already been configured by @authuser/nest');
|
|
10
|
+
}
|
|
11
|
+
const adapter = app.getHttpAdapter();
|
|
12
|
+
if (adapter.getType() !== 'fastify') {
|
|
13
|
+
throw new TypeError('@authuser/nest requires a Nest application using FastifyAdapter');
|
|
14
|
+
}
|
|
6
15
|
const options = resolveOptions(input);
|
|
7
|
-
|
|
16
|
+
Object.defineProperty(state, CONFIGURED, { value: true });
|
|
17
|
+
const fastify = adapter.getInstance();
|
|
8
18
|
if (options.security.helmet) {
|
|
9
19
|
const { default: helmet } = await import('@fastify/helmet');
|
|
10
20
|
await fastify.register(helmet, {
|
|
@@ -37,7 +47,9 @@ export async function configureHttpApp(app, input = {}) {
|
|
|
37
47
|
}
|
|
38
48
|
if (options.validation !== false)
|
|
39
49
|
app.useGlobalPipes(new ValidationPipe(options.validation));
|
|
40
|
-
|
|
50
|
+
if (options.errors !== false) {
|
|
51
|
+
app.useGlobalFilters(options.errors.filter ?? new HttpExceptionFilter(options.errors.format));
|
|
52
|
+
}
|
|
41
53
|
if (options.shutdownHooks)
|
|
42
54
|
app.enableShutdownHooks();
|
|
43
55
|
if (options.observability.responseTimeHeader) {
|
|
@@ -48,7 +60,7 @@ export async function configureHttpApp(app, input = {}) {
|
|
|
48
60
|
fastify.addHook('onSend', async (request, reply, payload) => {
|
|
49
61
|
const start = startTimes.get(request);
|
|
50
62
|
if (typeof start === 'bigint') {
|
|
51
|
-
reply
|
|
63
|
+
appendHeader(reply, 'server-timing', `app;dur=${(Number(process.hrtime.bigint() - start) / 1e6).toFixed(2)}`);
|
|
52
64
|
}
|
|
53
65
|
return payload;
|
|
54
66
|
});
|
|
@@ -75,6 +87,15 @@ export async function configureHttpApp(app, input = {}) {
|
|
|
75
87
|
await registerOpenApi(app, fastify, options.openApi);
|
|
76
88
|
return app;
|
|
77
89
|
}
|
|
90
|
+
function appendHeader(reply, name, value) {
|
|
91
|
+
const current = reply.getHeader(name);
|
|
92
|
+
if (current === undefined) {
|
|
93
|
+
reply.header(name, value);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const existing = Array.isArray(current) ? current.join(', ') : String(current);
|
|
97
|
+
reply.header(name, `${existing}, ${value}`);
|
|
98
|
+
}
|
|
78
99
|
function healthHandler(check, fallback) {
|
|
79
100
|
return async (request, reply) => {
|
|
80
101
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure-http-app.js","sourceRoot":"","sources":["../src/configure-http-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAA2B,EAC3B,KAAK,GAA4B,EAAE;IAEnC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"configure-http-app.js","sourceRoot":"","sources":["../src/configure-http-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAA2B,EAC3B,KAAK,GAA4B,EAAE;IAEnC,MAAM,KAAK,GAAG,GAA0D,CAAC;IACzE,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,iEAAiE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAqB,CAAC;IAEzD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC7B,MAAM,EAAE,IAAI;YACZ,qBAAqB,EAAE,OAAO,CAAC,QAAQ,CAAC,qBAAqB;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACpC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC/E,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC9E,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAChE,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAC/B,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;YACxC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;SACzC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,SAAS;QAAE,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI;YAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,EAAE;YAC9B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK;QAAE,GAAG,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,OAAO,CAAC,aAAa;QAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC;IAErD,IAAI,OAAO,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,OAAO,EAAkB,CAAC;QACjD,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7C,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,YAAY,CACV,KAAK,EACL,eAAe,EACf,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACxE,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,CAAC,uBAAuB,KAAK,KAAK,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,uBAAuB,CAAC;QAC7D,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACpD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;YAC/B,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;YAC5B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;YAC1B,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;YAC5B,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,KAAmB,EAAE,IAAY,EAAE,KAAa;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/E,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CACpB,KAA8B,EAC9B,QAA2C;IAE3C,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/create-app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkD1F"}
|
package/dist/create-app.js
CHANGED
|
@@ -8,6 +8,14 @@ import { resolveOptions } from './options.js';
|
|
|
8
8
|
const SAFE_REQUEST_ID = /^[A-Za-z0-9._:-]{1,128}$/;
|
|
9
9
|
export async function createApp(options) {
|
|
10
10
|
const resolved = resolveOptions(options);
|
|
11
|
+
if (typeof options.rootModule !== 'function') {
|
|
12
|
+
throw new TypeError('rootModule must be a Nest module class');
|
|
13
|
+
}
|
|
14
|
+
if (options.network !== undefined && (typeof options.network !== 'object'
|
|
15
|
+
|| options.network === null
|
|
16
|
+
|| Array.isArray(options.network))) {
|
|
17
|
+
throw new TypeError('network must be an object');
|
|
18
|
+
}
|
|
11
19
|
const network = options.network ?? {};
|
|
12
20
|
validateNetworkOptions(network);
|
|
13
21
|
const loggerOptions = resolved.observability.loggerFormat === 'nest'
|
|
@@ -39,6 +47,13 @@ export async function createApp(options) {
|
|
|
39
47
|
return configureHttpApp(app, options);
|
|
40
48
|
}
|
|
41
49
|
function validateNetworkOptions(network) {
|
|
50
|
+
const trustProxy = network.trustProxy;
|
|
51
|
+
if (trustProxy !== undefined
|
|
52
|
+
&& typeof trustProxy !== 'boolean'
|
|
53
|
+
&& typeof trustProxy !== 'string'
|
|
54
|
+
&& (!Array.isArray(trustProxy) || trustProxy.some((entry) => typeof entry !== 'string'))) {
|
|
55
|
+
throw new TypeError('Network option trustProxy must be a boolean, string, or string array');
|
|
56
|
+
}
|
|
42
57
|
const values = {
|
|
43
58
|
bodyLimit: network.bodyLimit,
|
|
44
59
|
maxParamLength: network.maxParamLength,
|
package/dist/create-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-app.js","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-app.js","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ArgumentsHost, type ExceptionFilter } from '@nestjs/common';
|
|
2
|
+
import type { ErrorResponseFormat } from './types.js';
|
|
2
3
|
export declare class HttpExceptionFilter implements ExceptionFilter {
|
|
4
|
+
private readonly format;
|
|
5
|
+
constructor(format?: ErrorResponseFormat);
|
|
3
6
|
catch(exception: unknown, host: ArgumentsHost): void;
|
|
4
7
|
}
|
|
5
8
|
//# sourceMappingURL=http-exception.filter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-exception.filter.d.ts","sourceRoot":"","sources":["../src/http-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAIb,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-exception.filter.d.ts","sourceRoot":"","sources":["../src/http-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAIb,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,mBAAoB,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,GAAE,mBAAgC,EAIpE;IAED,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAuCnD;CACF"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { Catch, HttpException, HttpStatus, } from '@nestjs/common';
|
|
2
2
|
export class HttpExceptionFilter {
|
|
3
|
+
format;
|
|
4
|
+
constructor(format = 'authuser') {
|
|
5
|
+
this.format = format;
|
|
6
|
+
if (format !== 'authuser' && format !== 'problem-details') {
|
|
7
|
+
throw new TypeError('Error response format must be authuser or problem-details');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
3
10
|
catch(exception, host) {
|
|
4
11
|
const context = host.switchToHttp();
|
|
5
12
|
const reply = context.getResponse();
|
|
@@ -15,12 +22,26 @@ export class HttpExceptionFilter {
|
|
|
15
22
|
: getMessage(details) ?? 'Request failed';
|
|
16
23
|
if (status >= 500)
|
|
17
24
|
request.log.error({ err: exception }, 'Unhandled request error');
|
|
25
|
+
const path = request.url.split('?', 1)[0] ?? request.url;
|
|
26
|
+
if (this.format === 'problem-details') {
|
|
27
|
+
const body = {
|
|
28
|
+
type: 'about:blank',
|
|
29
|
+
title: statusTitle(status),
|
|
30
|
+
status,
|
|
31
|
+
detail: typeof message === 'string' ? message : 'Request validation failed',
|
|
32
|
+
instance: path,
|
|
33
|
+
requestId: request.id,
|
|
34
|
+
...(status < 500 && typeof message !== 'string' ? { errors: message } : {}),
|
|
35
|
+
};
|
|
36
|
+
void reply.status(status).type('application/problem+json').send(body);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
18
39
|
const body = {
|
|
19
40
|
statusCode: status,
|
|
20
41
|
error: HttpStatus[status] ?? 'Error',
|
|
21
42
|
message,
|
|
22
43
|
requestId: request.id,
|
|
23
|
-
path
|
|
44
|
+
path,
|
|
24
45
|
};
|
|
25
46
|
void reply.status(status).send(body);
|
|
26
47
|
}
|
|
@@ -52,4 +73,10 @@ function getHttpException(exception) {
|
|
|
52
73
|
function isHttpErrorStatus(value) {
|
|
53
74
|
return typeof value === 'number' && Number.isInteger(value) && value >= 400 && value <= 599;
|
|
54
75
|
}
|
|
76
|
+
function statusTitle(status) {
|
|
77
|
+
const name = HttpStatus[status];
|
|
78
|
+
if (typeof name !== 'string')
|
|
79
|
+
return 'Error';
|
|
80
|
+
return name.toLowerCase().replaceAll('_', ' ').replace(/\b\w/g, (letter) => letter.toUpperCase());
|
|
81
|
+
}
|
|
55
82
|
//# sourceMappingURL=http-exception.filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-exception.filter.js","sourceRoot":"","sources":["../src/http-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,aAAa,EACb,UAAU,GAEX,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-exception.filter.js","sourceRoot":"","sources":["../src/http-exception.filter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export { configureHttpApp } from './configure-http-app.js';
|
|
|
3
3
|
export { createApp } from './create-app.js';
|
|
4
4
|
export { Public, Roles, IS_PUBLIC_KEY, ROLES_KEY } from './decorators.js';
|
|
5
5
|
export { HttpExceptionFilter } from './http-exception.filter.js';
|
|
6
|
-
export type { CompressionOptions, ConfigureHttpAppOptions, CorsOptions, CreateAppOptions, HealthCheck, HealthOptions, HttpErrorResponse, NetworkOptions, ObservabilityOptions, OpenApiOptions, RateLimitOptions, ReadinessOptions, SecurityOptions, SecurityPreset, } from './types.js';
|
|
6
|
+
export type { CompressionOptions, ConfigureHttpAppOptions, CorsOptions, CreateAppOptions, ErrorOptions, ErrorResponseFormat, HealthCheck, HealthOptions, HttpErrorResponse, NetworkOptions, ObservabilityOptions, OpenApiOptions, ProblemDetailsResponse, RateLimitOptions, ReadinessOptions, SecurityOptions, SecurityPreset, } from './types.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/options.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CompressionOptions, ConfigureHttpAppOptions, CorsOptions, HealthOptions, HealthCheck, OpenApiOptions, RateLimitOptions, SecurityPreset } from './types.js';
|
|
1
|
+
import type { CompressionOptions, ConfigureHttpAppOptions, CorsOptions, ErrorOptions, ErrorResponseFormat, HealthOptions, HealthCheck, OpenApiOptions, RateLimitOptions, SecurityPreset } from './types.js';
|
|
2
2
|
export interface ResolvedOptions {
|
|
3
3
|
appName: string;
|
|
4
4
|
preset: SecurityPreset;
|
|
@@ -26,6 +26,10 @@ export interface ResolvedOptions {
|
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
28
|
observability: Required<NonNullable<ConfigureHttpAppOptions['observability']>>;
|
|
29
|
+
errors: false | {
|
|
30
|
+
format: ErrorResponseFormat;
|
|
31
|
+
filter?: ErrorOptions['filter'];
|
|
32
|
+
};
|
|
29
33
|
shutdownHooks: boolean;
|
|
30
34
|
}
|
|
31
35
|
export declare function resolveOptions(options: ConfigureHttpAppOptions): ResolvedOptions;
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAClD,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAClD,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;QAChB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,IAAI,EAAE,KAAK,GAAG,WAAW,CAAC;QAC1B,SAAS,EAAE,KAAK,IAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC,GAAG,gBAAgB,CAAA,CAAC;KAClH,CAAC;IACF,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC1C,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3F,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACzC,SAAS,EAAE,KAAK,GAAG;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,WAAW,CAAC;YACnB,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;SAC1C,CAAC;KACH,CAAC;IACF,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAClD,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAClD,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;QAChB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,IAAI,EAAE,KAAK,GAAG,WAAW,CAAC;QAC1B,SAAS,EAAE,KAAK,IAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC,GAAG,gBAAgB,CAAA,CAAC;KAClH,CAAC;IACF,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC1C,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3F,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACzC,SAAS,EAAE,KAAK,GAAG;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,WAAW,CAAC;YACnB,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;SAC1C,CAAC;KACH,CAAC;IACF,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,KAAK,GAAG;QACd,MAAM,EAAE,mBAAmB,CAAC;QAC5B,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;KACjC,CAAC;IACF,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,eAAe,CA4GhF"}
|
package/dist/options.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export function resolveOptions(options) {
|
|
2
|
+
validateInputOptions(options);
|
|
2
3
|
const preset = options.preset ?? 'secure';
|
|
3
4
|
const isSecure = preset !== 'minimal';
|
|
4
5
|
const isFull = preset === 'full';
|
|
@@ -11,6 +12,7 @@ export function resolveOptions(options) {
|
|
|
11
12
|
? false
|
|
12
13
|
: healthInput.readiness;
|
|
13
14
|
const includeQueryString = options.observability?.includeQueryString ?? false;
|
|
15
|
+
const errorsInput = options.errors === false ? false : options.errors ?? {};
|
|
14
16
|
const openApiEnabled = typeof options.openApi === 'boolean'
|
|
15
17
|
? options.openApi
|
|
16
18
|
: openApiInput.enabled ?? openApiInput.ui ?? isFull;
|
|
@@ -91,6 +93,12 @@ export function resolveOptions(options) {
|
|
|
91
93
|
requestIdResponseHeader: options.observability?.requestIdResponseHeader ?? 'x-request-id',
|
|
92
94
|
responseTimeHeader: options.observability?.responseTimeHeader ?? false,
|
|
93
95
|
},
|
|
96
|
+
errors: errorsInput === false
|
|
97
|
+
? false
|
|
98
|
+
: {
|
|
99
|
+
format: errorsInput.format ?? 'authuser',
|
|
100
|
+
...(errorsInput.filter ? { filter: errorsInput.filter } : {}),
|
|
101
|
+
},
|
|
94
102
|
shutdownHooks: options.shutdownHooks ?? true,
|
|
95
103
|
};
|
|
96
104
|
if (options.apiPrefix !== undefined)
|
|
@@ -133,14 +141,152 @@ function resolveLogger(logger, includeQueryString) {
|
|
|
133
141
|
},
|
|
134
142
|
};
|
|
135
143
|
}
|
|
144
|
+
function validateInputOptions(options) {
|
|
145
|
+
if (!isRecord(options))
|
|
146
|
+
throw new TypeError('Options must be an object');
|
|
147
|
+
assertOptionalString(options, 'appName', 'appName');
|
|
148
|
+
assertOptionalString(options, 'apiPrefix', 'apiPrefix');
|
|
149
|
+
assertOptionalEnum(options, 'preset', ['minimal', 'secure', 'full'], 'preset');
|
|
150
|
+
assertOptionalBoolean(options, 'shutdownHooks', 'shutdownHooks');
|
|
151
|
+
assertFalseOrObject(options, 'validation', 'validation');
|
|
152
|
+
assertBooleanOrObject(options, 'versioning', 'versioning');
|
|
153
|
+
const security = optionalObject(options, 'security', 'security');
|
|
154
|
+
if (security) {
|
|
155
|
+
assertOptionalBoolean(security, 'helmet', 'security.helmet');
|
|
156
|
+
assertOptionalBoolean(security, 'contentSecurityPolicy', 'security.contentSecurityPolicy');
|
|
157
|
+
assertFalseOrObject(security, 'cors', 'security.cors');
|
|
158
|
+
assertFalseOrObject(security, 'rateLimit', 'security.rateLimit');
|
|
159
|
+
const rateLimit = optionalObjectUnlessFalse(security.rateLimit);
|
|
160
|
+
if (rateLimit)
|
|
161
|
+
assertOptionalBoolean(rateLimit, 'enabled', 'security.rateLimit.enabled');
|
|
162
|
+
}
|
|
163
|
+
const compression = booleanOrObject(options.compression, 'compression');
|
|
164
|
+
if (compression) {
|
|
165
|
+
assertOptionalBoolean(compression, 'enabled', 'compression.enabled');
|
|
166
|
+
if (compression.encodings !== undefined) {
|
|
167
|
+
if (!Array.isArray(compression.encodings) || compression.encodings.some((encoding) => (!['br', 'gzip', 'deflate', 'identity'].includes(String(encoding))))) {
|
|
168
|
+
throw new TypeError('compression.encodings contains an unsupported encoding');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const openApi = booleanOrObject(options.openApi, 'openApi');
|
|
173
|
+
if (openApi) {
|
|
174
|
+
for (const key of ['enabled', 'json', 'ui', 'bearerAuth']) {
|
|
175
|
+
assertOptionalBoolean(openApi, key, `openApi.${key}`);
|
|
176
|
+
}
|
|
177
|
+
for (const key of ['title', 'description', 'version', 'jsonPath', 'uiPath']) {
|
|
178
|
+
assertOptionalString(openApi, key, `openApi.${key}`);
|
|
179
|
+
}
|
|
180
|
+
assertOptionalFunction(openApi, 'preHandler', 'openApi.preHandler');
|
|
181
|
+
}
|
|
182
|
+
const health = booleanOrObject(options.health, 'health');
|
|
183
|
+
if (health) {
|
|
184
|
+
assertOptionalBoolean(health, 'enabled', 'health.enabled');
|
|
185
|
+
assertOptionalString(health, 'path', 'health.path');
|
|
186
|
+
assertOptionalFunction(health, 'check', 'health.check');
|
|
187
|
+
assertOptionalFunction(health, 'preHandler', 'health.preHandler');
|
|
188
|
+
if (health.readiness !== undefined && health.readiness !== false) {
|
|
189
|
+
if (!isRecord(health.readiness))
|
|
190
|
+
throw new TypeError('health.readiness must be false or an object');
|
|
191
|
+
assertOptionalString(health.readiness, 'path', 'health.readiness.path');
|
|
192
|
+
if (typeof health.readiness.check !== 'function') {
|
|
193
|
+
throw new TypeError('health.readiness.check must be a function');
|
|
194
|
+
}
|
|
195
|
+
assertOptionalFunction(health.readiness, 'preHandler', 'health.readiness.preHandler');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const observability = optionalObject(options, 'observability', 'observability');
|
|
199
|
+
if (observability) {
|
|
200
|
+
for (const key of ['requestLogging', 'includeQueryString', 'responseTimeHeader']) {
|
|
201
|
+
assertOptionalBoolean(observability, key, `observability.${key}`);
|
|
202
|
+
}
|
|
203
|
+
assertOptionalEnum(observability, 'loggerFormat', ['json', 'nest'], 'observability.loggerFormat');
|
|
204
|
+
if (observability.logger !== undefined
|
|
205
|
+
&& typeof observability.logger !== 'boolean'
|
|
206
|
+
&& !isRecord(observability.logger)) {
|
|
207
|
+
throw new TypeError('observability.logger must be a boolean or an object');
|
|
208
|
+
}
|
|
209
|
+
if (observability.requestIdResponseHeader !== undefined
|
|
210
|
+
&& observability.requestIdResponseHeader !== false
|
|
211
|
+
&& typeof observability.requestIdResponseHeader !== 'string') {
|
|
212
|
+
throw new TypeError('observability.requestIdResponseHeader must be false or a string');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (options.errors !== undefined && options.errors !== false) {
|
|
216
|
+
if (!isRecord(options.errors))
|
|
217
|
+
throw new TypeError('errors must be false or an object');
|
|
218
|
+
assertOptionalEnum(options.errors, 'format', ['authuser', 'problem-details'], 'errors.format');
|
|
219
|
+
if (options.errors.filter !== undefined
|
|
220
|
+
&& (!isRecord(options.errors.filter) || typeof options.errors.filter.catch !== 'function')) {
|
|
221
|
+
throw new TypeError('errors.filter must implement ExceptionFilter');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function booleanOrObject(value, name) {
|
|
226
|
+
if (value === undefined || typeof value === 'boolean')
|
|
227
|
+
return undefined;
|
|
228
|
+
if (!isRecord(value))
|
|
229
|
+
throw new TypeError(`${name} must be a boolean or an object`);
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
function assertBooleanOrObject(record, key, name) {
|
|
233
|
+
const value = record[key];
|
|
234
|
+
if (value !== undefined && typeof value !== 'boolean' && !isRecord(value)) {
|
|
235
|
+
throw new TypeError(`${name} must be a boolean or an object`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function assertFalseOrObject(record, key, name) {
|
|
239
|
+
const value = record[key];
|
|
240
|
+
if (value !== undefined && value !== false && !isRecord(value)) {
|
|
241
|
+
throw new TypeError(`${name} must be false or an object`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function optionalObject(record, key, name) {
|
|
245
|
+
const value = record[key];
|
|
246
|
+
if (value === undefined)
|
|
247
|
+
return undefined;
|
|
248
|
+
if (!isRecord(value))
|
|
249
|
+
throw new TypeError(`${name} must be an object`);
|
|
250
|
+
return value;
|
|
251
|
+
}
|
|
252
|
+
function optionalObjectUnlessFalse(value) {
|
|
253
|
+
return value === undefined || value === false ? undefined : value;
|
|
254
|
+
}
|
|
255
|
+
function assertOptionalBoolean(record, key, name) {
|
|
256
|
+
if (record[key] !== undefined && typeof record[key] !== 'boolean') {
|
|
257
|
+
throw new TypeError(`${name} must be a boolean`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function assertOptionalString(record, key, name) {
|
|
261
|
+
if (record[key] !== undefined && typeof record[key] !== 'string') {
|
|
262
|
+
throw new TypeError(`${name} must be a string`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function assertOptionalFunction(record, key, name) {
|
|
266
|
+
if (record[key] !== undefined && typeof record[key] !== 'function') {
|
|
267
|
+
throw new TypeError(`${name} must be a function`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function assertOptionalEnum(record, key, values, name) {
|
|
271
|
+
const value = record[key];
|
|
272
|
+
if (value !== undefined && (typeof value !== 'string' || !values.includes(value))) {
|
|
273
|
+
throw new TypeError(`${name} must be one of: ${values.join(', ')}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function isRecord(value) {
|
|
277
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
278
|
+
}
|
|
136
279
|
function validateResolvedOptions(options) {
|
|
137
|
-
if (options.appName.trim().length === 0
|
|
138
|
-
|
|
280
|
+
if (options.appName.trim().length === 0
|
|
281
|
+
|| options.appName.length > 128
|
|
282
|
+
|| /[\u0000-\u001f\u007f]/.test(options.appName)) {
|
|
283
|
+
throw new TypeError('Application name must contain 1 to 128 characters without control characters');
|
|
139
284
|
}
|
|
140
285
|
if (options.apiPrefix !== undefined && (options.apiPrefix.length > 1_024
|
|
141
286
|
|| options.apiPrefix.includes('?')
|
|
142
287
|
|| options.apiPrefix.includes('#')
|
|
143
|
-
|| options.apiPrefix.includes('\0')
|
|
288
|
+
|| options.apiPrefix.includes('\0')
|
|
289
|
+
|| hasUnsafeRoutePattern(`/${options.apiPrefix}`))) {
|
|
144
290
|
throw new TypeError('API prefix must be a valid URL path prefix');
|
|
145
291
|
}
|
|
146
292
|
if (!Number.isSafeInteger(options.compression.threshold) || options.compression.threshold < 0) {
|
|
@@ -165,17 +311,47 @@ function validateResolvedOptions(options) {
|
|
|
165
311
|
if (requestIdHeader !== false && !/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(requestIdHeader)) {
|
|
166
312
|
throw new TypeError('Request ID response header must be a valid HTTP header name');
|
|
167
313
|
}
|
|
314
|
+
if (requestIdHeader !== false && RESERVED_RESPONSE_HEADERS.has(requestIdHeader.toLowerCase())) {
|
|
315
|
+
throw new TypeError(`Request ID response header is reserved: ${requestIdHeader}`);
|
|
316
|
+
}
|
|
168
317
|
const rateLimit = options.security.rateLimit;
|
|
169
318
|
if (rateLimit !== false && typeof rateLimit.max === 'number' && (!Number.isFinite(rateLimit.max) || rateLimit.max <= 0)) {
|
|
170
319
|
throw new TypeError('Rate limit max must be a positive number');
|
|
171
320
|
}
|
|
172
321
|
}
|
|
173
322
|
function validateInternalPath(path) {
|
|
174
|
-
if (path.length > 2_048
|
|
323
|
+
if (path.length > 2_048
|
|
324
|
+
|| path.includes('?')
|
|
325
|
+
|| path.includes('#')
|
|
326
|
+
|| path.includes('\0')
|
|
327
|
+
|| hasUnsafeRoutePattern(path)) {
|
|
175
328
|
throw new TypeError(`Invalid internal route path: ${path}`);
|
|
176
329
|
}
|
|
177
330
|
}
|
|
331
|
+
function hasUnsafeRoutePattern(path) {
|
|
332
|
+
const segments = path.split('/');
|
|
333
|
+
return /[\u0000-\u001f\u007f\\*:{}]/.test(path)
|
|
334
|
+
|| segments.includes('.')
|
|
335
|
+
|| segments.includes('..');
|
|
336
|
+
}
|
|
178
337
|
function safePath(url, includeQueryString) {
|
|
179
338
|
return includeQueryString ? url : url.split('?', 1)[0] ?? '';
|
|
180
339
|
}
|
|
340
|
+
const RESERVED_RESPONSE_HEADERS = new Set([
|
|
341
|
+
'connection',
|
|
342
|
+
'content-encoding',
|
|
343
|
+
'content-length',
|
|
344
|
+
'content-type',
|
|
345
|
+
'date',
|
|
346
|
+
'keep-alive',
|
|
347
|
+
'set-cookie',
|
|
348
|
+
'te',
|
|
349
|
+
'trailer',
|
|
350
|
+
'transfer-encoding',
|
|
351
|
+
'upgrade',
|
|
352
|
+
'www-authenticate',
|
|
353
|
+
'proxy-authenticate',
|
|
354
|
+
'traceparent',
|
|
355
|
+
'tracestate',
|
|
356
|
+
]);
|
|
181
357
|
//# sourceMappingURL=options.js.map
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LoggerOptions } from 'pino';
|
|
2
2
|
import type rateLimit from '@fastify/rate-limit';
|
|
3
|
-
import type { Type, ValidationPipeOptions, VersioningOptions } from '@nestjs/common';
|
|
3
|
+
import type { ExceptionFilter, Type, ValidationPipeOptions, VersioningOptions } from '@nestjs/common';
|
|
4
4
|
import type { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface';
|
|
5
5
|
import type { FastifyRequest, preHandlerHookHandler } from 'fastify';
|
|
6
6
|
export type SecurityPreset = 'minimal' | 'secure' | 'full';
|
|
@@ -75,6 +75,13 @@ export interface ObservabilityOptions {
|
|
|
75
75
|
requestIdResponseHeader?: string | false;
|
|
76
76
|
responseTimeHeader?: boolean;
|
|
77
77
|
}
|
|
78
|
+
export type ErrorResponseFormat = 'authuser' | 'problem-details';
|
|
79
|
+
export interface ErrorOptions {
|
|
80
|
+
/** Response contract used by the built-in exception filter. */
|
|
81
|
+
format?: ErrorResponseFormat;
|
|
82
|
+
/** Replaces the built-in exception filter when supplied. */
|
|
83
|
+
filter?: ExceptionFilter;
|
|
84
|
+
}
|
|
78
85
|
export interface HttpErrorResponse {
|
|
79
86
|
statusCode: number;
|
|
80
87
|
error: string;
|
|
@@ -82,6 +89,17 @@ export interface HttpErrorResponse {
|
|
|
82
89
|
requestId: string;
|
|
83
90
|
path: string;
|
|
84
91
|
}
|
|
92
|
+
/** RFC 9457 problem details with a correlation ID extension. */
|
|
93
|
+
export interface ProblemDetailsResponse {
|
|
94
|
+
type: string;
|
|
95
|
+
title: string;
|
|
96
|
+
status: number;
|
|
97
|
+
detail: string;
|
|
98
|
+
instance: string;
|
|
99
|
+
requestId: string;
|
|
100
|
+
/** Original structured client-error messages, such as DTO validation errors. */
|
|
101
|
+
errors?: unknown;
|
|
102
|
+
}
|
|
85
103
|
export interface NetworkOptions {
|
|
86
104
|
trustProxy?: boolean | string | string[];
|
|
87
105
|
bodyLimit?: number;
|
|
@@ -103,6 +121,8 @@ export interface ConfigureHttpAppOptions {
|
|
|
103
121
|
compression?: boolean | CompressionOptions;
|
|
104
122
|
openApi?: boolean | OpenApiOptions;
|
|
105
123
|
health?: boolean | HealthOptions;
|
|
124
|
+
/** Safe built-in error responses by default. False preserves application filters. */
|
|
125
|
+
errors?: false | ErrorOptions;
|
|
106
126
|
observability?: ObservabilityOptions;
|
|
107
127
|
shutdownHooks?: boolean;
|
|
108
128
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/docs/configuration.md
CHANGED
|
@@ -13,6 +13,7 @@ All settings are optional except `rootModule` when using `createApp`.
|
|
|
13
13
|
| `versioning` | `false` | `true` for URI versioning, or Nest versioning options. |
|
|
14
14
|
| `shutdownHooks` | `true` | Enable Nest shutdown signal hooks. |
|
|
15
15
|
| `validation` | strict defaults | `false` or Nest `ValidationPipeOptions`. |
|
|
16
|
+
| `errors` | `{ format: 'authuser' }` | Built-in safe errors, `false`, or error options. |
|
|
16
17
|
| `nest` | `{}` | Native `NestApplicationOptions`, including its independent logger. |
|
|
17
18
|
|
|
18
19
|
Default validation uses `whitelist: true`, `forbidNonWhitelisted: true`, and
|
|
@@ -43,6 +44,8 @@ CORS remains disabled unless an explicit configuration is supplied.
|
|
|
43
44
|
When enabled, the default advertised methods are GET, HEAD, POST, PUT, PATCH,
|
|
44
45
|
DELETE, OPTIONS and QUERY. Successful browser preflights return HTTP 204 by default;
|
|
45
46
|
`optionsSuccessStatus` can change this for a legacy client that requires 200.
|
|
47
|
+
Without a CORS configuration, the module does not install a catch-all OPTIONS route;
|
|
48
|
+
an OPTIONS request then requires an application route of its own.
|
|
46
49
|
|
|
47
50
|
Rate-limit defaults are 100 requests per minute per client IP. Available settings
|
|
48
51
|
include the complete `@fastify/rate-limit` plugin surface: `max`, `timeWindow`,
|
|
@@ -124,3 +127,22 @@ Client-visible errors use the exported `HttpErrorResponse` shape: `statusCode`,
|
|
|
124
127
|
`error`, `message`, `requestId`, and `path`. Query strings never appear in `path`.
|
|
125
128
|
Every status from 500 through 599 receives the generic message `Internal server
|
|
126
129
|
error`; the original exception is available only in server logs.
|
|
130
|
+
|
|
131
|
+
Use the standardized [RFC 9457 Problem Details](https://www.rfc-editor.org/rfc/rfc9457)
|
|
132
|
+
shape as an opt-in:
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
errors: { format: 'problem-details' }
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
It responds with `application/problem+json` and the fields `type`, `title`, `status`,
|
|
139
|
+
`detail`, `instance`, and `requestId`. Structured client validation messages are
|
|
140
|
+
preserved in the `errors` extension, while server details remain hidden.
|
|
141
|
+
|
|
142
|
+
Set `errors: false` to preserve an existing application's filters, or pass
|
|
143
|
+
`errors: { filter: customExceptionFilter }` to install a replacement. Call
|
|
144
|
+
`configureHttpApp` exactly once and before `app.init()` or `app.listen()`.
|
|
145
|
+
|
|
146
|
+
Configuration is validated at runtime as well as by TypeScript. Invalid presets,
|
|
147
|
+
callbacks, route patterns, encodings, header names and unsafe network values fail
|
|
148
|
+
early during bootstrap.
|
package/docs/performance.md
CHANGED
|
@@ -34,16 +34,16 @@ Change duration and concurrency with `BENCHMARK_DURATION_MS` and
|
|
|
34
34
|
minimal preset and the secure preset. Treat them as a regression signal rather than
|
|
35
35
|
a production capacity promise.
|
|
36
36
|
|
|
37
|
-
The 1.
|
|
37
|
+
The 1.1.0 release check on Node 22.14 with 100 local connections produced this
|
|
38
38
|
single-run baseline:
|
|
39
39
|
|
|
40
40
|
| Scenario | Requests/s | p50 | p99 | Errors |
|
|
41
41
|
| --- | ---: | ---: | ---: | ---: |
|
|
42
|
-
| Fastify raw |
|
|
43
|
-
| `@authuser/nest` minimal | 26,
|
|
44
|
-
| `@authuser/nest` secure | 19,
|
|
42
|
+
| Fastify raw | 28,859 | 3.22 ms | 3.92 ms | 0 |
|
|
43
|
+
| `@authuser/nest` minimal | 26,507 | 3.69 ms | 4.60 ms | 0 |
|
|
44
|
+
| `@authuser/nest` secure | 19,818 | 4.96 ms | 5.59 ms | 0 |
|
|
45
45
|
|
|
46
|
-
That run retained about
|
|
46
|
+
That run retained about 92% of raw Fastify throughput in `minimal` and 69% in
|
|
47
47
|
`secure`. It is a local regression reference, not a service capacity guarantee.
|
|
48
48
|
|
|
49
49
|
## Choosing a lower-level stack
|
package/docs/security.md
CHANGED
|
@@ -11,12 +11,15 @@ The secure preset establishes a baseline, not a complete application security mo
|
|
|
11
11
|
- Rate limiting by client IP.
|
|
12
12
|
- `createApp` request IDs restricted to 128 safe characters before log propagation.
|
|
13
13
|
- Correlation IDs returned to clients in a configurable response header.
|
|
14
|
+
- Reserved HTTP framing, connection and authentication headers cannot be reused as
|
|
15
|
+
the correlation-response header.
|
|
14
16
|
- Generic 5xx errors; unexpected exceptions are logged server-side only.
|
|
15
17
|
- CORS disabled until an allowlist is configured.
|
|
16
18
|
- Sensitive authentication and cookie log fields redacted by default.
|
|
17
19
|
- Query strings excluded from default request logs and error response paths.
|
|
18
20
|
- Optional pre-handler protection for documentation and health routes.
|
|
19
21
|
- Dynamic readiness checks that fail closed without exposing dependency errors.
|
|
22
|
+
- Runtime configuration validation for JavaScript and environment-derived options.
|
|
20
23
|
|
|
21
24
|
## Application responsibilities
|
|
22
25
|
|
|
@@ -37,6 +40,9 @@ The secure preset establishes a baseline, not a complete application security mo
|
|
|
37
40
|
`Public()` and `Roles()` only attach metadata. They do nothing until an application
|
|
38
41
|
guard reads that metadata and enforces the intended policy.
|
|
39
42
|
|
|
43
|
+
Setting `errors: false` or providing a custom filter transfers responsibility for
|
|
44
|
+
5xx redaction and safe error contracts to the consuming application.
|
|
45
|
+
|
|
40
46
|
## Reporting
|
|
41
47
|
|
|
42
48
|
Follow the private disclosure instructions in [SECURITY.md](../SECURITY.md).
|