fastify 4.27.0 → 5.0.0-alpha.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/.markdownlint-cli2.yaml +1 -1
- package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +241 -0
- package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +268 -0
- package/.tap/test-results/test/404s.test.js.tap +623 -0
- package/.tap/test-results/test/500s.test.js.tap +64 -0
- package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +36 -0
- package/.tap/test-results/test/als.test.js.tap +15 -0
- package/.tap/test-results/test/async-await.test.js.tap +184 -0
- package/.tap/test-results/test/async-dispose.test.js.tap +8 -0
- package/.tap/test-results/test/async_hooks.test.js.tap +10 -0
- package/.tap/test-results/test/bodyLimit.test.js.tap +48 -0
- package/.tap/test-results/test/buffer.test.js.tap +20 -0
- package/.tap/test-results/test/build/error-serializer.test.js.tap +12 -0
- package/.tap/test-results/test/build/version.test.js.tap +7 -0
- package/.tap/test-results/test/case-insensitive.test.js.tap +36 -0
- package/.tap/test-results/test/chainable.test.js.tap +17 -0
- package/.tap/test-results/test/check.test.js.tap +10 -0
- package/.tap/test-results/test/childLoggerFactory.test.js.tap +23 -0
- package/.tap/test-results/test/client-timeout.test.js.tap +7 -0
- package/.tap/test-results/test/close-pipelining.test.js.tap +15 -0
- package/.tap/test-results/test/close.test.js.tap +172 -0
- package/.tap/test-results/test/connectionTimeout.test.js.tap +12 -0
- package/.tap/test-results/test/constrained-routes.test.js.tap +173 -0
- package/.tap/test-results/test/content-length.test.js.tap +46 -0
- package/.tap/test-results/test/content-parser.test.js.tap +266 -0
- package/.tap/test-results/test/content-type.test.js.tap +14 -0
- package/.tap/test-results/test/context-config.test.js.tap +41 -0
- package/.tap/test-results/test/copy.test.js.tap +14 -0
- package/.tap/test-results/test/custom-http-server.test.js.tap +30 -0
- package/.tap/test-results/test/custom-parser-async.test.js.tap +21 -0
- package/.tap/test-results/test/custom-parser.0.test.js.tap +199 -0
- package/.tap/test-results/test/custom-parser.1.test.js.tap +90 -0
- package/.tap/test-results/test/custom-parser.2.test.js.tap +22 -0
- package/.tap/test-results/test/custom-parser.3.test.js.tap +53 -0
- package/.tap/test-results/test/custom-parser.4.test.js.tap +45 -0
- package/.tap/test-results/test/custom-parser.5.test.js.tap +41 -0
- package/.tap/test-results/test/custom-querystring-parser.test.js.tap +46 -0
- package/.tap/test-results/test/decorator.test.js.tap +465 -0
- package/.tap/test-results/test/delete.test.js.tap +110 -0
- package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +15 -0
- package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +25 -0
- package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +24 -0
- package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +9 -0
- package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +20 -0
- package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +10 -0
- package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +14 -0
- package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +16 -0
- package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +16 -0
- package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +19 -0
- package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +18 -0
- package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +243 -0
- package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +9 -0
- package/.tap/test-results/test/esm/esm.test.mjs.tap +8 -0
- package/.tap/test-results/test/esm/index.test.js.tap +8 -0
- package/.tap/test-results/test/fastify-instance.test.js.tap +114 -0
- package/.tap/test-results/test/findRoute.test.js.tap +37 -0
- package/.tap/test-results/test/fluent-schema.test.js.tap +36 -0
- package/.tap/test-results/test/genReqId.test.js.tap +106 -0
- package/.tap/test-results/test/get.test.js.tap +151 -0
- package/.tap/test-results/test/handler-context.test.js.tap +19 -0
- package/.tap/test-results/test/has-route.test.js.tap +30 -0
- package/.tap/test-results/test/head.test.js.tap +130 -0
- package/.tap/test-results/test/header-overflow.test.js.tap +16 -0
- package/.tap/test-results/test/hooks-async.test.js.tap +286 -0
- package/.tap/test-results/test/hooks.on-listen.test.js.tap +311 -0
- package/.tap/test-results/test/hooks.on-ready.test.js.tap +151 -0
- package/.tap/test-results/test/hooks.test.js.tap +966 -0
- package/.tap/test-results/test/http2/closing.test.js.tap +35 -0
- package/.tap/test-results/test/http2/constraint.test.js.tap +32 -0
- package/.tap/test-results/test/http2/head.test.js.tap +9 -0
- package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +8 -0
- package/.tap/test-results/test/http2/plain.test.js.tap +22 -0
- package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +40 -0
- package/.tap/test-results/test/http2/secure.test.js.tap +27 -0
- package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +9 -0
- package/.tap/test-results/test/https/custom-https-server.test.js.tap +10 -0
- package/.tap/test-results/test/https/https.test.js.tap +45 -0
- package/.tap/test-results/test/imports.test.js.tap +14 -0
- package/.tap/test-results/test/inject.test.js.tap +165 -0
- package/.tap/test-results/test/internals/all.test.js.tap +42 -0
- package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +14 -0
- package/.tap/test-results/test/internals/context.test.js.tap +14 -0
- package/.tap/test-results/test/internals/decorator.test.js.tap +51 -0
- package/.tap/test-results/test/internals/errors.test.js.tap +1212 -0
- package/.tap/test-results/test/internals/handleRequest.test.js.tap +69 -0
- package/.tap/test-results/test/internals/hookRunner.test.js.tap +143 -0
- package/.tap/test-results/test/internals/hooks.test.js.tap +45 -0
- package/.tap/test-results/test/internals/initialConfig.test.js.tap +125 -0
- package/.tap/test-results/test/internals/logger.test.js.tap +71 -0
- package/.tap/test-results/test/internals/plugin.test.js.tap +48 -0
- package/.tap/test-results/test/internals/reply-serialize.test.js.tap +166 -0
- package/.tap/test-results/test/internals/reply.test.js.tap +688 -0
- package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +74 -0
- package/.tap/test-results/test/internals/request-validate.test.js.tap +384 -0
- package/.tap/test-results/test/internals/request.test.js.tap +163 -0
- package/.tap/test-results/test/internals/server.test.js.tap +30 -0
- package/.tap/test-results/test/internals/validation.test.js.tap +121 -0
- package/.tap/test-results/test/keepAliveTimeout.test.js.tap +12 -0
- package/.tap/test-results/test/listen.1.test.js.tap +31 -0
- package/.tap/test-results/test/listen.2.test.js.tap +46 -0
- package/.tap/test-results/test/listen.3.test.js.tap +25 -0
- package/.tap/test-results/test/listen.4.test.js.tap +51 -0
- package/.tap/test-results/test/lock.test.js.tap +29 -0
- package/.tap/test-results/test/logger/instantiation.test.js.tap +92 -0
- package/.tap/test-results/test/logger/logging.test.js.tap +117 -0
- package/.tap/test-results/test/logger/options.test.js.tap +165 -0
- package/.tap/test-results/test/logger/request.test.js.tap +82 -0
- package/.tap/test-results/test/logger/response.test.js.tap +38 -0
- package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +44 -0
- package/.tap/test-results/test/method-missing.test.js.tap +8 -0
- package/.tap/test-results/test/middleware.test.js.tap +17 -0
- package/.tap/test-results/test/mkcalendar.test.js.tap +43 -0
- package/.tap/test-results/test/mkcol.test.js.tap +14 -0
- package/.tap/test-results/test/move.test.js.tap +15 -0
- package/.tap/test-results/test/noop-set.test.js.tap +8 -0
- package/.tap/test-results/test/nullable-validation.test.js.tap +36 -0
- package/.tap/test-results/test/options.error-handler.test.js.tap +186 -0
- package/.tap/test-results/test/options.test.js.tap +174 -0
- package/.tap/test-results/test/output-validation.test.js.tap +66 -0
- package/.tap/test-results/test/patch.error-handler.test.js.tap +206 -0
- package/.tap/test-results/test/patch.test.js.tap +182 -0
- package/.tap/test-results/test/plugin.1.test.js.tap +78 -0
- package/.tap/test-results/test/plugin.2.test.js.tap +102 -0
- package/.tap/test-results/test/plugin.3.test.js.tap +58 -0
- package/.tap/test-results/test/plugin.4.test.js.tap +164 -0
- package/.tap/test-results/test/post-empty-body.test.js.tap +8 -0
- package/.tap/test-results/test/pretty-print.test.js.tap +82 -0
- package/.tap/test-results/test/promises.test.js.tap +46 -0
- package/.tap/test-results/test/propfind.test.js.tap +43 -0
- package/.tap/test-results/test/proppatch.test.js.tap +29 -0
- package/.tap/test-results/test/proto-poisoning.test.js.tap +47 -0
- package/.tap/test-results/test/put.error-handler.test.js.tap +206 -0
- package/.tap/test-results/test/put.test.js.tap +182 -0
- package/.tap/test-results/test/register.test.js.tap +61 -0
- package/.tap/test-results/test/reply-code.test.js.tap +40 -0
- package/.tap/test-results/test/reply-earlyHints.test.js.tap +22 -0
- package/.tap/test-results/test/reply-error.test.js.tap +643 -0
- package/.tap/test-results/test/reply-trailers.test.js.tap +176 -0
- package/.tap/test-results/test/report.test.js.tap +43 -0
- package/.tap/test-results/test/request-error.test.js.tap +98 -0
- package/.tap/test-results/test/request-id.test.js.tap +38 -0
- package/.tap/test-results/test/request.deprecated.test.js.tap +13 -0
- package/.tap/test-results/test/requestTimeout.test.js.tap +21 -0
- package/.tap/test-results/test/route-hooks.test.js.tap +498 -0
- package/.tap/test-results/test/route-prefix.test.js.tap +195 -0
- package/.tap/test-results/test/route-shorthand.test.js.tap +190 -0
- package/.tap/test-results/test/route.1.test.js.tap +93 -0
- package/.tap/test-results/test/route.2.test.js.tap +28 -0
- package/.tap/test-results/test/route.3.test.js.tap +39 -0
- package/.tap/test-results/test/route.4.test.js.tap +32 -0
- package/.tap/test-results/test/route.5.test.js.tap +54 -0
- package/.tap/test-results/test/route.6.test.js.tap +81 -0
- package/.tap/test-results/test/route.7.test.js.tap +93 -0
- package/.tap/test-results/test/route.8.test.js.tap +38 -0
- package/.tap/test-results/test/router-options.test.js.tap +104 -0
- package/.tap/test-results/test/same-shape.test.js.tap +22 -0
- package/.tap/test-results/test/schema-examples.test.js.tap +85 -0
- package/.tap/test-results/test/schema-feature.test.js.tap +445 -0
- package/.tap/test-results/test/schema-serialization.test.js.tap +194 -0
- package/.tap/test-results/test/schema-special-usage.test.js.tap +186 -0
- package/.tap/test-results/test/schema-validation.test.js.tap +199 -0
- package/.tap/test-results/test/search.test.js.tap +77 -0
- package/.tap/test-results/test/serialize-response.test.js.tap +26 -0
- package/.tap/test-results/test/server.test.js.tap +65 -0
- package/.tap/test-results/test/set-error-handler.test.js.tap +7 -0
- package/.tap/test-results/test/skip-reply-send.test.js.tap +272 -0
- package/.tap/test-results/test/stream.1.test.js.tap +36 -0
- package/.tap/test-results/test/stream.2.test.js.tap +20 -0
- package/.tap/test-results/test/stream.3.test.js.tap +34 -0
- package/.tap/test-results/test/stream.4.test.js.tap +40 -0
- package/.tap/test-results/test/stream.5.test.js.tap +37 -0
- package/.tap/test-results/test/sync-routes.test.js.tap +19 -0
- package/.tap/test-results/test/throw.test.js.tap +116 -0
- package/.tap/test-results/test/trace.test.js.tap +7 -0
- package/.tap/test-results/test/trust-proxy.test.js.tap +109 -0
- package/.tap/test-results/test/type-provider.test.js.tap +12 -0
- package/.tap/test-results/test/unlock.test.js.tap +14 -0
- package/.tap/test-results/test/upgrade.test.js.tap +8 -0
- package/.tap/test-results/test/url-rewriting.test.js.tap +39 -0
- package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +33 -0
- package/.tap/test-results/test/validation-error-handling.test.js.tap +180 -0
- package/.tap/test-results/test/versioned-routes.test.js.tap +151 -0
- package/.tap/test-results/test/web-api.test.js.tap +51 -0
- package/.tap/test-results/test/wrapThenable.test.js.tap +11 -0
- package/.taprc +4 -8
- package/README.md +3 -6
- package/build/build-error-serializer.js +4 -1
- package/build/build-validation.js +5 -4
- package/docs/Guides/Database.md +1 -1
- package/docs/Guides/Delay-Accepting-Requests.md +3 -3
- package/docs/Guides/Ecosystem.md +2 -0
- package/docs/Guides/Migration-Guide-V5.md +20 -0
- package/docs/Guides/Write-Type-Provider.md +4 -2
- package/docs/Reference/ContentTypeParser.md +30 -1
- package/docs/Reference/Decorators.md +42 -16
- package/docs/Reference/Errors.md +10 -2
- package/docs/Reference/Hooks.md +48 -14
- package/docs/Reference/Logging.md +5 -5
- package/docs/Reference/Reply.md +29 -24
- package/docs/Reference/Request.md +5 -1
- package/docs/Reference/Routes.md +24 -28
- package/docs/Reference/Server.md +14 -53
- package/docs/Reference/Type-Providers.md +21 -26
- package/docs/Reference/TypeScript.md +46 -29
- package/docs/Reference/Warnings.md +2 -8
- package/eslint.config.js +27 -0
- package/examples/typescript-server.ts +14 -14
- package/fastify.d.ts +15 -14
- package/fastify.js +41 -15
- package/lib/configValidator.js +94 -76
- package/lib/contentTypeParser.js +54 -88
- package/lib/decorate.js +3 -7
- package/lib/error-serializer.js +77 -19
- package/lib/errors.js +31 -6
- package/lib/handleRequest.js +70 -39
- package/lib/httpMethods.js +34 -18
- package/lib/logger.js +24 -6
- package/lib/pluginUtils.js +5 -5
- package/lib/reply.js +16 -13
- package/lib/request.js +37 -19
- package/lib/route.js +7 -31
- package/lib/server.js +62 -123
- package/lib/warnings.js +28 -27
- package/lib/wrapThenable.js +46 -22
- package/package.json +38 -58
- package/test/404s.test.js +8 -12
- package/test/async-await.test.js +46 -2
- package/test/build/error-serializer.test.js +4 -2
- package/test/check.test.js +225 -0
- package/test/close-pipelining.test.js +2 -34
- package/test/close.test.js +1 -41
- package/test/content-parser.test.js +69 -117
- package/test/custom-parser.1.test.js +40 -1
- package/test/decorator-namespace.test._js_ +31 -0
- package/test/decorator.test.js +92 -43
- package/test/delete.test.js +21 -1
- package/test/diagnostics-channel/404.test.js +57 -0
- package/test/diagnostics-channel/async-delay-request.test.js +74 -0
- package/test/diagnostics-channel/async-request.test.js +72 -0
- package/test/diagnostics-channel/error-before-handler.test.js +36 -0
- package/test/diagnostics-channel/error-request.test.js +61 -0
- package/test/diagnostics-channel/error-status.test.js +39 -0
- package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
- package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
- package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
- package/test/diagnostics-channel/sync-request.test.js +61 -0
- package/test/encapsulated-error-handler.test.js +201 -14
- package/test/esm/index.test.js +2 -12
- package/test/findRoute.test.js +16 -0
- package/test/genReqId.test.js +9 -0
- package/test/get.test.js +28 -0
- package/test/has-route.test.js +18 -2
- package/test/helper.js +1 -5
- package/test/hooks.test.js +0 -4
- package/test/http2/constraint.test.js +22 -1
- package/test/http2/plain.test.js +21 -6
- package/test/http2/secure.test.js +12 -1
- package/test/https/https.test.js +57 -0
- package/test/inject.test.js +1 -2
- package/test/internals/decorator.test.js +0 -2
- package/test/internals/errors.test.js +57 -17
- package/test/internals/handleRequest.test.js +5 -1
- package/test/internals/initialConfig.test.js +5 -5
- package/test/internals/logger.test.js +31 -2
- package/test/internals/reply.test.js +38 -80
- package/test/internals/request.test.js +13 -11
- package/test/listen.1.test.js +5 -15
- package/test/listen.5.test.js +88 -0
- package/test/logger/instantiation.test.js +8 -8
- package/test/logger/logging.test.js +4 -4
- package/test/logger/options.test.js +102 -21
- package/test/logger/response.test.js +6 -6
- package/test/maxRequestsPerSocket.test.js +2 -5
- package/test/method-missing.test.js +24 -0
- package/test/plugin.1.test.js +2 -4
- package/test/plugin.2.test.js +0 -2
- package/test/plugin.3.test.js +0 -2
- package/test/plugin.4.test.js +92 -56
- package/test/register.test.js +2 -4
- package/test/reply-earlyHints.test.js +98 -0
- package/test/reply-error.test.js +0 -2
- package/test/route-hooks.test.js +0 -1
- package/test/route-shorthand.test.js +60 -0
- package/test/schema-special-usage.test.js +1 -1
- package/test/server.test.js +17 -2
- package/test/stream.2.test.js +1 -1
- package/test/stream.4.test.js +0 -42
- package/test/stream.5.test.js +2 -2
- package/test/trust-proxy.test.js +33 -27
- package/test/types/errors.test-d.ts +0 -2
- package/test/types/fastify.test-d.ts +14 -12
- package/test/types/hooks.test-d.ts +1 -0
- package/test/types/import.ts +1 -0
- package/test/types/instance.test-d.ts +10 -51
- package/test/types/logger.test-d.ts +43 -6
- package/test/types/plugin.test-d.ts +5 -2
- package/test/types/register.test-d.ts +2 -2
- package/test/types/reply.test-d.ts +13 -12
- package/test/types/request.test-d.ts +19 -8
- package/test/types/route.test-d.ts +30 -2
- package/test/types/schema.test-d.ts +2 -2
- package/test/types/serverFactory.test-d.ts +1 -1
- package/test/types/type-provider.test-d.ts +60 -13
- package/test/types/using.test-d.ts +4 -1
- package/test/url-rewriting.test.js +3 -2
- package/test/useSemicolonDelimiter.test.js +3 -6
- package/test/versioned-routes.test.js +1 -1
- package/test/web-api.test.js +0 -6
- package/types/content-type-parser.d.ts +3 -3
- package/types/context.d.ts +0 -1
- package/types/errors.d.ts +1 -0
- package/types/hooks.d.ts +6 -6
- package/types/instance.d.ts +28 -41
- package/types/logger.d.ts +3 -3
- package/types/plugin.d.ts +3 -3
- package/types/reply.d.ts +13 -14
- package/types/request.d.ts +5 -3
- package/types/route.d.ts +29 -29
- package/types/schema.d.ts +3 -3
- package/types/serverFactory.d.ts +2 -2
- package/types/type-provider.d.ts +22 -12
- package/types/utils.d.ts +18 -18
- package/.c8rc.json +0 -8
- package/.eslintrc +0 -4
- package/test/default-route.test.js +0 -88
- package/test/listen.deprecated.test.js +0 -229
- package/test/unsupported-httpversion.test.js +0 -31
- package/types/.eslintrc.json +0 -48
package/lib/warnings.js
CHANGED
|
@@ -2,16 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
const { createDeprecation, createWarning } = require('process-warning')
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Deprecation codes:
|
|
7
|
+
* - FSTDEP005
|
|
8
|
+
* - FSTDEP007
|
|
9
|
+
* - FSTDEP008
|
|
10
|
+
* - FSTDEP009
|
|
11
|
+
* - FSTDEP010
|
|
12
|
+
* - FSTDEP012
|
|
13
|
+
* - FSTDEP013
|
|
14
|
+
* - FSTDEP015
|
|
15
|
+
* - FSTDEP016
|
|
16
|
+
* - FSTDEP017
|
|
17
|
+
* - FSTDEP018
|
|
18
|
+
* - FSTDEP019
|
|
19
|
+
* - FSTDEP021
|
|
20
|
+
* - FSTWRN001
|
|
21
|
+
* - FSTSEC001
|
|
22
|
+
*/
|
|
23
|
+
|
|
5
24
|
const FSTDEP005 = createDeprecation({
|
|
6
25
|
code: 'FSTDEP005',
|
|
7
26
|
message: 'You are accessing the deprecated "request.connection" property. Use "request.socket" instead.'
|
|
8
27
|
})
|
|
9
28
|
|
|
10
|
-
const FSTDEP006 = createDeprecation({
|
|
11
|
-
code: 'FSTDEP006',
|
|
12
|
-
message: 'You are decorating Request/Reply with a reference type. This reference is shared amongst all requests. Use onRequest hook instead. Property: %s'
|
|
13
|
-
})
|
|
14
|
-
|
|
15
29
|
const FSTDEP007 = createDeprecation({
|
|
16
30
|
code: 'FSTDEP007',
|
|
17
31
|
message: 'You are trying to set a HEAD route using "exposeHeadRoute" route flag when a sibling route is already set. See documentation for more info.'
|
|
@@ -32,11 +46,6 @@ const FSTDEP010 = createDeprecation({
|
|
|
32
46
|
message: 'Modifying the "reply.sent" property is deprecated. Use the "reply.hijack()" method instead.'
|
|
33
47
|
})
|
|
34
48
|
|
|
35
|
-
const FSTDEP011 = createDeprecation({
|
|
36
|
-
code: 'FSTDEP011',
|
|
37
|
-
message: 'Variadic listen method is deprecated. Please use ".listen(optionsObject)" instead. The variadic signature will be removed in `fastify@5`.'
|
|
38
|
-
})
|
|
39
|
-
|
|
40
49
|
const FSTDEP012 = createDeprecation({
|
|
41
50
|
code: 'FSTDEP012',
|
|
42
51
|
message: 'request.context property access is deprecated. Please use "request.routeOptions.config" or "request.routeOptions.schema" instead for accessing Route settings. The "request.context" will be removed in `fastify@5`.'
|
|
@@ -47,11 +56,6 @@ const FSTDEP013 = createDeprecation({
|
|
|
47
56
|
message: 'Direct return of "trailers" function is deprecated. Please use "callback" or "async-await" for return value. The support of direct return will removed in `fastify@5`.'
|
|
48
57
|
})
|
|
49
58
|
|
|
50
|
-
const FSTDEP014 = createDeprecation({
|
|
51
|
-
code: 'FSTDEP014',
|
|
52
|
-
message: 'You are trying to set/access the default route. This property is deprecated. Please, use setNotFoundHandler if you want to custom a 404 handler or the wildcard (*) to match all routes.'
|
|
53
|
-
})
|
|
54
|
-
|
|
55
59
|
const FSTDEP015 = createDeprecation({
|
|
56
60
|
code: 'FSTDEP015',
|
|
57
61
|
message: 'You are accessing the deprecated "request.routeSchema" property. Use "request.routeOptions.schema" instead. Property "req.routeSchema" will be removed in `fastify@5`.'
|
|
@@ -77,9 +81,9 @@ const FSTDEP019 = createDeprecation({
|
|
|
77
81
|
message: 'reply.context property access is deprecated. Please use "request.routeOptions.config" or "request.routeOptions.schema" instead for accessing Route settings. The "reply.context" will be removed in `fastify@5`.'
|
|
78
82
|
})
|
|
79
83
|
|
|
80
|
-
const
|
|
81
|
-
code: '
|
|
82
|
-
message: '
|
|
84
|
+
const FSTDEP021 = createDeprecation({
|
|
85
|
+
code: 'FSTDEP021',
|
|
86
|
+
message: 'The `reply.redirect()` method has a new signature: `reply.redirect(url: string, code?: number)`. It will be enforced in `fastify@v5`'
|
|
83
87
|
})
|
|
84
88
|
|
|
85
89
|
const FSTWRN001 = createWarning({
|
|
@@ -89,30 +93,27 @@ const FSTWRN001 = createWarning({
|
|
|
89
93
|
unlimited: true
|
|
90
94
|
})
|
|
91
95
|
|
|
92
|
-
const
|
|
93
|
-
name: '
|
|
94
|
-
code: '
|
|
95
|
-
message: '
|
|
96
|
+
const FSTSEC001 = createWarning({
|
|
97
|
+
name: 'FastifySecurity',
|
|
98
|
+
code: 'FSTSEC001',
|
|
99
|
+
message: 'You are using /%s/ Content-Type which may be vulnerable to CORS attack. Please make sure your RegExp start with "^" or include ";?" to proper detection of the essence MIME type.',
|
|
96
100
|
unlimited: true
|
|
97
101
|
})
|
|
98
102
|
|
|
99
103
|
module.exports = {
|
|
100
104
|
FSTDEP005,
|
|
101
|
-
FSTDEP006,
|
|
102
105
|
FSTDEP007,
|
|
103
106
|
FSTDEP008,
|
|
104
107
|
FSTDEP009,
|
|
105
108
|
FSTDEP010,
|
|
106
|
-
FSTDEP011,
|
|
107
109
|
FSTDEP012,
|
|
108
110
|
FSTDEP013,
|
|
109
|
-
FSTDEP014,
|
|
110
111
|
FSTDEP015,
|
|
111
112
|
FSTDEP016,
|
|
112
113
|
FSTDEP017,
|
|
113
114
|
FSTDEP018,
|
|
114
115
|
FSTDEP019,
|
|
115
|
-
|
|
116
|
+
FSTDEP021,
|
|
116
117
|
FSTWRN001,
|
|
117
|
-
|
|
118
|
+
FSTSEC001
|
|
118
119
|
}
|
package/lib/wrapThenable.js
CHANGED
|
@@ -5,44 +5,68 @@ const {
|
|
|
5
5
|
kReplyHijacked
|
|
6
6
|
} = require('./symbols')
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const diagnostics = require('dc-polyfill')
|
|
9
|
+
const channels = diagnostics.tracingChannel('fastify.request.handler')
|
|
10
|
+
|
|
11
|
+
function wrapThenable (thenable, reply, store) {
|
|
12
|
+
if (store) store.async = true
|
|
9
13
|
thenable.then(function (payload) {
|
|
10
14
|
if (reply[kReplyHijacked] === true) {
|
|
11
15
|
return
|
|
12
16
|
}
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
if (store) {
|
|
19
|
+
channels.asyncStart.publish(store)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
// this is for async functions that are using reply.send directly
|
|
24
|
+
//
|
|
25
|
+
// since wrap-thenable will be called when using reply.send directly
|
|
26
|
+
// without actual return. the response can be sent already or
|
|
27
|
+
// the request may be terminated during the reply. in this situation,
|
|
28
|
+
// it require an extra checking of request.aborted to see whether
|
|
29
|
+
// the request is killed by client.
|
|
30
|
+
if (payload !== undefined || (reply.sent === false && reply.raw.headersSent === false && reply.request.raw.aborted === false)) {
|
|
31
|
+
// we use a try-catch internally to avoid adding a catch to another
|
|
32
|
+
// promise, increase promise perf by 10%
|
|
33
|
+
try {
|
|
34
|
+
reply.send(payload)
|
|
35
|
+
} catch (err) {
|
|
36
|
+
reply[kReplyIsError] = true
|
|
37
|
+
reply.send(err)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
} finally {
|
|
41
|
+
if (store) {
|
|
42
|
+
channels.asyncEnd.publish(store)
|
|
29
43
|
}
|
|
30
44
|
}
|
|
31
45
|
}, function (err) {
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
|
|
46
|
+
if (store) {
|
|
47
|
+
store.error = err
|
|
48
|
+
channels.error.publish(store) // note that error happens before asyncStart
|
|
49
|
+
channels.asyncStart.publish(store)
|
|
35
50
|
}
|
|
36
51
|
|
|
37
|
-
reply[kReplyIsError] = true
|
|
38
|
-
|
|
39
|
-
// try-catch allow to re-throw error in error handler for async handler
|
|
40
52
|
try {
|
|
53
|
+
if (reply.sent === true) {
|
|
54
|
+
reply.log.error({ err }, 'Promise errored, but reply.sent = true was set')
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
reply[kReplyIsError] = true
|
|
59
|
+
|
|
41
60
|
reply.send(err)
|
|
42
61
|
// The following should not happen
|
|
43
62
|
/* c8 ignore next 3 */
|
|
44
63
|
} catch (err) {
|
|
64
|
+
// try-catch allow to re-throw error in error handler for async handler
|
|
45
65
|
reply.send(err)
|
|
66
|
+
} finally {
|
|
67
|
+
if (store) {
|
|
68
|
+
channels.asyncEnd.publish(store)
|
|
69
|
+
}
|
|
46
70
|
}
|
|
47
71
|
})
|
|
48
72
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fastify",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-alpha.2",
|
|
4
4
|
"description": "Fast and low overhead web framework, for Node.js",
|
|
5
5
|
"main": "fastify.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -11,24 +11,22 @@
|
|
|
11
11
|
"benchmark:parser": "concurrently -k -s first \"node ./examples/benchmark/parser.js\" \"autocannon -c 100 -d 30 -p 10 -i ./examples/benchmark/body.json -H \"content-type:application/jsoff\" -m POST localhost:3000/\"",
|
|
12
12
|
"build:validation": "node build/build-error-serializer.js && node build/build-validation.js",
|
|
13
13
|
"coverage": "npm run unit -- --coverage-report=html",
|
|
14
|
-
"coverage:ci": "
|
|
15
|
-
"coverage:ci-check-coverage": "
|
|
16
|
-
"lint": "npm run lint:
|
|
17
|
-
"lint:fix": "
|
|
14
|
+
"coverage:ci": "tap --coverage-report=html --coverage-report=lcov --allow-incomplete-coverage",
|
|
15
|
+
"coverage:ci-check-coverage": "tap replay",
|
|
16
|
+
"lint": "npm run lint:eslint",
|
|
17
|
+
"lint:fix": "eslint --fix",
|
|
18
18
|
"lint:markdown": "markdownlint-cli2",
|
|
19
|
-
"lint:
|
|
20
|
-
"
|
|
21
|
-
"lint:typescript:fix": "npm run lint:typescript -- --fix",
|
|
22
|
-
"prepublishOnly": "cross-env PREPUBLISH=true tap --no-check-coverage test/build/**.test.js && npm run test:validator:integrity",
|
|
19
|
+
"lint:eslint": "eslint",
|
|
20
|
+
"prepublishOnly": "cross-env PREPUBLISH=true tap --allow-incomplete-coverage test/build/**.test.js && npm run test:validator:integrity",
|
|
23
21
|
"test": "npm run lint && npm run unit && npm run test:typescript",
|
|
24
|
-
"test:ci": "npm run unit -- --
|
|
22
|
+
"test:ci": "npm run unit -- --coverage-report=lcovonly && npm run test:typescript",
|
|
25
23
|
"test:report": "npm run lint && npm run unit:report && npm run test:typescript",
|
|
26
24
|
"test:validator:integrity": "npm run build:validation && git diff --quiet --ignore-all-space --ignore-blank-lines --ignore-cr-at-eol lib/error-serializer.js && git diff --quiet --ignore-all-space --ignore-blank-lines --ignore-cr-at-eol lib/configValidator.js",
|
|
27
25
|
"test:typescript": "tsc test/types/import.ts && tsd",
|
|
28
|
-
"test:watch": "npm run unit -- --watch --
|
|
29
|
-
"unit": "
|
|
26
|
+
"test:watch": "npm run unit -- --watch --coverage-report=none --reporter=terse",
|
|
27
|
+
"unit": "tap",
|
|
30
28
|
"unit:junit": "tap-mocha-reporter xunit < out.tap > test/junit-testresults.xml",
|
|
31
|
-
"unit:report": "tap --
|
|
29
|
+
"unit:report": "tap --coverage-report=html --coverage-report=cobertura | tee out.tap",
|
|
32
30
|
"citgm": "tap --jobs=1 --timeout=120"
|
|
33
31
|
},
|
|
34
32
|
"repository": {
|
|
@@ -153,79 +151,61 @@
|
|
|
153
151
|
}
|
|
154
152
|
],
|
|
155
153
|
"devDependencies": {
|
|
156
|
-
"@fastify/pre-commit": "^2.0
|
|
157
|
-
"@sinclair/typebox": "^0.
|
|
158
|
-
"@sinonjs/fake-timers": "^11.
|
|
159
|
-
"@
|
|
160
|
-
"@
|
|
161
|
-
"@
|
|
154
|
+
"@fastify/pre-commit": "^2.1.0",
|
|
155
|
+
"@sinclair/typebox": "^0.32.22",
|
|
156
|
+
"@sinonjs/fake-timers": "^11.2.2",
|
|
157
|
+
"@stylistic/eslint-plugin": "^2.1.0",
|
|
158
|
+
"@stylistic/eslint-plugin-js": "^2.1.0",
|
|
159
|
+
"@types/node": "^20.12.7",
|
|
162
160
|
"ajv": "^8.12.0",
|
|
163
161
|
"ajv-errors": "^3.0.0",
|
|
164
|
-
"ajv-formats": "^
|
|
162
|
+
"ajv-formats": "^3.0.1",
|
|
165
163
|
"ajv-i18n": "^4.2.0",
|
|
166
164
|
"ajv-merge-patch": "^5.0.1",
|
|
167
|
-
"autocannon": "^7.
|
|
165
|
+
"autocannon": "^7.15.0",
|
|
168
166
|
"branch-comparer": "^1.1.0",
|
|
169
|
-
"c8": "^8.0.1",
|
|
170
167
|
"concurrently": "^8.2.2",
|
|
171
168
|
"cross-env": "^7.0.3",
|
|
172
|
-
"eslint": "^
|
|
173
|
-
"eslint-config-standard": "^17.1.0",
|
|
174
|
-
"eslint-import-resolver-node": "^0.3.9",
|
|
175
|
-
"eslint-plugin-import": "^2.28.1",
|
|
176
|
-
"eslint-plugin-n": "^16.2.0",
|
|
177
|
-
"eslint-plugin-promise": "^6.1.1",
|
|
169
|
+
"eslint": "^9.0.0",
|
|
178
170
|
"fast-json-body": "^1.1.0",
|
|
179
171
|
"fastify-plugin": "^4.5.1",
|
|
180
|
-
"fluent-json-schema": "^4.1
|
|
181
|
-
"form-data": "^4.0.0",
|
|
172
|
+
"fluent-json-schema": "^4.2.1",
|
|
182
173
|
"h2url": "^0.2.0",
|
|
183
174
|
"http-errors": "^2.0.0",
|
|
184
|
-
"joi": "^17.
|
|
185
|
-
"json-schema-to-ts": "^
|
|
175
|
+
"joi": "^17.12.3",
|
|
176
|
+
"json-schema-to-ts": "^3.0.1",
|
|
186
177
|
"JSONStream": "^1.3.5",
|
|
187
|
-
"markdownlint-cli2": "^0.
|
|
178
|
+
"markdownlint-cli2": "^0.13.0",
|
|
179
|
+
"neostandard": "^0.7.0",
|
|
188
180
|
"node-forge": "^1.3.1",
|
|
189
181
|
"proxyquire": "^2.1.3",
|
|
190
182
|
"send": "^0.18.0",
|
|
191
183
|
"simple-get": "^4.0.1",
|
|
192
|
-
"snazzy": "^9.0.0",
|
|
193
184
|
"split2": "^4.2.0",
|
|
194
|
-
"
|
|
195
|
-
"
|
|
196
|
-
"
|
|
197
|
-
"
|
|
198
|
-
"undici": "^5.26.0",
|
|
185
|
+
"tap": "^19.0.0",
|
|
186
|
+
"tsd": "^0.31.0",
|
|
187
|
+
"typescript": "^5.4.5",
|
|
188
|
+
"undici": "^6.13.0",
|
|
199
189
|
"vary": "^1.1.2",
|
|
200
|
-
"yup": "^1.
|
|
190
|
+
"yup": "^1.4.0"
|
|
201
191
|
},
|
|
202
192
|
"dependencies": {
|
|
203
193
|
"@fastify/ajv-compiler": "^3.5.0",
|
|
204
|
-
"@fastify/error": "^3.4.
|
|
194
|
+
"@fastify/error": "^3.4.1",
|
|
205
195
|
"@fastify/fast-json-stringify-compiler": "^4.3.0",
|
|
206
196
|
"abstract-logging": "^2.0.1",
|
|
207
197
|
"avvio": "^8.3.0",
|
|
208
|
-
"
|
|
209
|
-
"fast-json-stringify": "^5.
|
|
210
|
-
"find-my-way": "^8.
|
|
211
|
-
"light-my-request": "^5.
|
|
198
|
+
"dc-polyfill": "^0.1.6",
|
|
199
|
+
"fast-json-stringify": "^5.14.1",
|
|
200
|
+
"find-my-way": "^8.1.0",
|
|
201
|
+
"light-my-request": "^5.13.0",
|
|
212
202
|
"pino": "^9.0.0",
|
|
213
203
|
"process-warning": "^3.0.0",
|
|
214
204
|
"proxy-addr": "^2.0.7",
|
|
215
|
-
"rfdc": "^1.3.
|
|
205
|
+
"rfdc": "^1.3.1",
|
|
216
206
|
"secure-json-parse": "^2.7.0",
|
|
217
|
-
"semver": "^7.
|
|
218
|
-
"toad-cache": "^3.
|
|
219
|
-
},
|
|
220
|
-
"standard": {
|
|
221
|
-
"ignore": [
|
|
222
|
-
"lib/configValidator.js",
|
|
223
|
-
"lib/error-serializer.js",
|
|
224
|
-
"fastify.d.ts",
|
|
225
|
-
"types/*",
|
|
226
|
-
"test/types/*",
|
|
227
|
-
"test/same-shape.test.js"
|
|
228
|
-
]
|
|
207
|
+
"semver": "^7.6.0",
|
|
208
|
+
"toad-cache": "^3.7.0"
|
|
229
209
|
},
|
|
230
210
|
"tsd": {
|
|
231
211
|
"directory": "test/types"
|
package/test/404s.test.js
CHANGED
|
@@ -6,7 +6,6 @@ const fp = require('fastify-plugin')
|
|
|
6
6
|
const sget = require('simple-get').concat
|
|
7
7
|
const errors = require('http-errors')
|
|
8
8
|
const split = require('split2')
|
|
9
|
-
const FormData = require('form-data')
|
|
10
9
|
const Fastify = require('..')
|
|
11
10
|
const { getServerUrl } = require('./helper')
|
|
12
11
|
|
|
@@ -68,21 +67,18 @@ test('default 404', t => {
|
|
|
68
67
|
})
|
|
69
68
|
})
|
|
70
69
|
|
|
71
|
-
test('using post method and multipart/formdata', t => {
|
|
70
|
+
test('using post method and multipart/formdata', async t => {
|
|
72
71
|
t.plan(3)
|
|
73
|
-
const form = FormData()
|
|
74
|
-
form.
|
|
72
|
+
const form = new FormData()
|
|
73
|
+
form.set('test-field', 'just some field')
|
|
75
74
|
|
|
76
|
-
|
|
75
|
+
const response = await fetch(getServerUrl(fastify) + '/notSupported', {
|
|
77
76
|
method: 'POST',
|
|
78
|
-
|
|
79
|
-
body: form,
|
|
80
|
-
json: false
|
|
81
|
-
}, (err, response, body) => {
|
|
82
|
-
t.error(err)
|
|
83
|
-
t.equal(response.statusCode, 404)
|
|
84
|
-
t.equal(response.headers['content-type'], 'application/json; charset=utf-8')
|
|
77
|
+
body: form
|
|
85
78
|
})
|
|
79
|
+
t.equal(response.status, 404)
|
|
80
|
+
t.equal(response.statusText, 'Not Found')
|
|
81
|
+
t.equal(response.headers.get('content-type'), 'application/json; charset=utf-8')
|
|
86
82
|
})
|
|
87
83
|
})
|
|
88
84
|
})
|
package/test/async-await.test.js
CHANGED
|
@@ -24,8 +24,28 @@ const opts = {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
const optsWithHostnameAndPort = {
|
|
28
|
+
schema: {
|
|
29
|
+
response: {
|
|
30
|
+
'2xx': {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
hello: {
|
|
34
|
+
type: 'string'
|
|
35
|
+
},
|
|
36
|
+
hostname: {
|
|
37
|
+
type: 'string'
|
|
38
|
+
},
|
|
39
|
+
port: {
|
|
40
|
+
type: 'string'
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
27
47
|
test('async await', t => {
|
|
28
|
-
t.plan(
|
|
48
|
+
t.plan(13)
|
|
29
49
|
const fastify = Fastify()
|
|
30
50
|
try {
|
|
31
51
|
fastify.get('/', opts, async function awaitMyFunc (req, reply) {
|
|
@@ -46,6 +66,16 @@ test('async await', t => {
|
|
|
46
66
|
t.fail()
|
|
47
67
|
}
|
|
48
68
|
|
|
69
|
+
try {
|
|
70
|
+
fastify.get('/await/hostname_port', optsWithHostnameAndPort, async function awaitMyFunc (req, reply) {
|
|
71
|
+
await sleep(200)
|
|
72
|
+
return { hello: 'world', hostname: req.hostname, port: req.port }
|
|
73
|
+
})
|
|
74
|
+
t.pass()
|
|
75
|
+
} catch (e) {
|
|
76
|
+
t.fail()
|
|
77
|
+
}
|
|
78
|
+
|
|
49
79
|
fastify.listen({ port: 0 }, err => {
|
|
50
80
|
t.error(err)
|
|
51
81
|
t.teardown(() => { fastify.close() })
|
|
@@ -69,6 +99,20 @@ test('async await', t => {
|
|
|
69
99
|
t.equal(response.headers['content-length'], '' + body.length)
|
|
70
100
|
t.same(JSON.parse(body), { hello: 'world' })
|
|
71
101
|
})
|
|
102
|
+
|
|
103
|
+
t.test('test for hostname and port in request', t => {
|
|
104
|
+
t.plan(4)
|
|
105
|
+
sget({
|
|
106
|
+
method: 'GET',
|
|
107
|
+
url: 'http://localhost:' + fastify.server.address().port + '/await/hostname_port'
|
|
108
|
+
}, (err, response, body) => {
|
|
109
|
+
t.error(err)
|
|
110
|
+
t.equal(response.statusCode, 200)
|
|
111
|
+
const parsedBody = JSON.parse(body)
|
|
112
|
+
t.equal(parsedBody.hostname, 'localhost')
|
|
113
|
+
t.equal(parseInt(parsedBody.port), fastify.server.address().port)
|
|
114
|
+
})
|
|
115
|
+
})
|
|
72
116
|
})
|
|
73
117
|
})
|
|
74
118
|
|
|
@@ -135,7 +179,7 @@ test('server logs an error if reply.send is called and a value is returned via a
|
|
|
135
179
|
const logger = pino(splitStream)
|
|
136
180
|
|
|
137
181
|
const fastify = Fastify({
|
|
138
|
-
logger
|
|
182
|
+
loggerInstance: logger
|
|
139
183
|
})
|
|
140
184
|
|
|
141
185
|
fastify.get('/', async (req, reply) => {
|
|
@@ -4,6 +4,7 @@ const t = require('tap')
|
|
|
4
4
|
const test = t.test
|
|
5
5
|
const fs = require('node:fs')
|
|
6
6
|
const path = require('node:path')
|
|
7
|
+
const { loadESLint } = require('eslint')
|
|
7
8
|
|
|
8
9
|
const { code } = require('../../build/build-error-serializer')
|
|
9
10
|
|
|
@@ -15,8 +16,9 @@ test('check generated code syntax', async (t) => {
|
|
|
15
16
|
t.plan(1)
|
|
16
17
|
|
|
17
18
|
// standard is a esm, we import it like this
|
|
18
|
-
const {
|
|
19
|
-
const
|
|
19
|
+
const Eslint = await loadESLint({ useFlatConfig: true })
|
|
20
|
+
const eslint = new Eslint()
|
|
21
|
+
const result = await eslint.lintText(code)
|
|
20
22
|
|
|
21
23
|
// if there are any invalid syntax
|
|
22
24
|
// fatal count will be greater than 0
|