fastify 5.0.0 → 5.2.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.
Files changed (201) hide show
  1. package/.borp.yaml +3 -0
  2. package/.vscode/settings.json +22 -0
  3. package/README.md +12 -7
  4. package/docs/Guides/Database.md +15 -15
  5. package/docs/Guides/Detecting-When-Clients-Abort.md +28 -28
  6. package/docs/Guides/Ecosystem.md +14 -15
  7. package/docs/Guides/Index.md +1 -1
  8. package/docs/Guides/Migration-Guide-V4.md +11 -11
  9. package/docs/Guides/Migration-Guide-V5.md +133 -9
  10. package/docs/Guides/Plugins-Guide.md +1 -1
  11. package/docs/Guides/Prototype-Poisoning.md +3 -3
  12. package/docs/Guides/Recommendations.md +9 -9
  13. package/docs/Guides/Serverless.md +5 -5
  14. package/docs/Guides/Testing.md +58 -57
  15. package/docs/Guides/Write-Plugin.md +2 -2
  16. package/docs/Guides/Write-Type-Provider.md +3 -3
  17. package/docs/Reference/ContentTypeParser.md +4 -4
  18. package/docs/Reference/Decorators.md +2 -2
  19. package/docs/Reference/Errors.md +3 -3
  20. package/docs/Reference/Hooks.md +7 -7
  21. package/docs/Reference/LTS.md +8 -0
  22. package/docs/Reference/Logging.md +5 -4
  23. package/docs/Reference/Reply.md +55 -58
  24. package/docs/Reference/Request.md +49 -42
  25. package/docs/Reference/Routes.md +16 -13
  26. package/docs/Reference/Server.md +32 -28
  27. package/docs/Reference/TypeScript.md +9 -9
  28. package/docs/Reference/Validation-and-Serialization.md +5 -5
  29. package/examples/typescript-server.ts +1 -1
  30. package/fastify.d.ts +14 -5
  31. package/fastify.js +8 -6
  32. package/lib/contentTypeParser.js +9 -7
  33. package/lib/context.js +1 -2
  34. package/lib/error-handler.js +9 -9
  35. package/lib/errors.js +1 -1
  36. package/lib/fourOhFour.js +1 -1
  37. package/lib/hooks.js +4 -1
  38. package/lib/{logger.js → logger-factory.js} +70 -122
  39. package/lib/logger-pino.js +68 -0
  40. package/lib/pluginOverride.js +1 -1
  41. package/lib/pluginUtils.js +2 -2
  42. package/lib/reply.js +4 -5
  43. package/lib/request.js +16 -9
  44. package/lib/route.js +23 -22
  45. package/lib/validation.js +2 -2
  46. package/package.json +13 -15
  47. package/test/404s.test.js +675 -629
  48. package/test/500s.test.js +72 -63
  49. package/test/{allowUnsafeRegex.test.js → allow-unsafe-regex.test.js} +30 -26
  50. package/test/als.test.js +48 -45
  51. package/test/async-await.test.js +148 -134
  52. package/test/async-dispose.test.js +4 -5
  53. package/test/async_hooks.test.js +30 -28
  54. package/test/{bodyLimit.test.js → body-limit.test.js} +61 -58
  55. package/test/buffer.test.js +9 -10
  56. package/test/build/error-serializer.test.js +3 -4
  57. package/test/build/version.test.js +2 -3
  58. package/test/build-certificate.js +1 -1
  59. package/test/bundler/README.md +5 -5
  60. package/test/bundler/esbuild/bundler-test.js +10 -9
  61. package/test/bundler/webpack/bundler-test.js +10 -9
  62. package/test/case-insensitive.test.js +31 -28
  63. package/test/chainable.test.js +4 -5
  64. package/test/check.test.js +8 -10
  65. package/test/{childLoggerFactory.test.js → child-logger-factory.test.js} +56 -19
  66. package/test/client-timeout.test.js +5 -5
  67. package/test/close-pipelining.test.js +6 -8
  68. package/test/conditional-pino.test.js +47 -0
  69. package/test/{connectionTimeout.test.js → connection-timeout.test.js} +10 -11
  70. package/test/constrained-routes.test.js +243 -236
  71. package/test/content-length.test.js +53 -68
  72. package/test/content-parser.test.js +186 -158
  73. package/test/content-type.test.js +8 -9
  74. package/test/context-config.test.js +44 -54
  75. package/test/custom-http-server.test.js +16 -20
  76. package/test/custom-parser.5.test.js +32 -32
  77. package/test/diagnostics-channel/404.test.js +15 -15
  78. package/test/diagnostics-channel/async-delay-request.test.js +25 -25
  79. package/test/diagnostics-channel/async-request.test.js +24 -24
  80. package/test/diagnostics-channel/error-before-handler.test.js +4 -5
  81. package/test/diagnostics-channel/error-request.test.js +19 -19
  82. package/test/diagnostics-channel/error-status.test.js +8 -8
  83. package/test/diagnostics-channel/init.test.js +6 -7
  84. package/test/diagnostics-channel/sync-delay-request.test.js +16 -16
  85. package/test/diagnostics-channel/sync-request-reply.test.js +16 -16
  86. package/test/diagnostics-channel/sync-request.test.js +19 -19
  87. package/test/encapsulated-child-logger-factory.test.js +8 -8
  88. package/test/encapsulated-error-handler.test.js +20 -20
  89. package/test/esm/errorCodes.test.mjs +5 -5
  90. package/test/esm/esm.test.mjs +3 -3
  91. package/test/esm/named-exports.mjs +3 -3
  92. package/test/esm/other.mjs +2 -2
  93. package/test/fastify-instance.test.js +33 -34
  94. package/test/{findRoute.test.js → find-route.test.js} +11 -10
  95. package/test/fluent-schema.test.js +33 -36
  96. package/test/handler-context.test.js +11 -11
  97. package/test/has-route.test.js +12 -15
  98. package/test/header-overflow.test.js +13 -12
  99. package/test/hooks.on-ready.test.js +2 -2
  100. package/test/hooks.test.js +25 -25
  101. package/test/http-methods/copy.test.js +22 -24
  102. package/test/http-methods/custom-http-methods.test.js +24 -21
  103. package/test/http-methods/get.test.js +97 -84
  104. package/test/http-methods/head.test.js +63 -57
  105. package/test/http-methods/lock.test.js +21 -20
  106. package/test/http-methods/mkcalendar.test.js +31 -27
  107. package/test/http-methods/mkcol.test.js +10 -10
  108. package/test/http-methods/move.test.js +11 -11
  109. package/test/http-methods/propfind.test.js +32 -27
  110. package/test/http-methods/proppatch.test.js +21 -19
  111. package/test/http-methods/report.test.js +32 -27
  112. package/test/http-methods/search.test.js +52 -47
  113. package/test/http-methods/trace.test.js +3 -4
  114. package/test/http-methods/unlock.test.js +10 -10
  115. package/test/http2/closing.test.js +50 -58
  116. package/test/http2/constraint.test.js +47 -50
  117. package/test/http2/head.test.js +18 -19
  118. package/test/http2/missing-http2-module.test.js +4 -5
  119. package/test/http2/plain.test.js +31 -31
  120. package/test/http2/secure-with-fallback.test.js +61 -61
  121. package/test/http2/secure.test.js +28 -31
  122. package/test/http2/unknown-http-method.test.js +13 -14
  123. package/test/https/custom-https-server.test.js +6 -7
  124. package/test/https/https.test.js +78 -78
  125. package/test/imports.test.js +5 -6
  126. package/test/internals/all.test.js +8 -11
  127. package/test/internals/{contentTypeParser.test.js → content-type-parser.test.js} +5 -6
  128. package/test/internals/context.test.js +9 -11
  129. package/test/internals/decorator.test.js +20 -21
  130. package/test/internals/errors.test.js +427 -427
  131. package/test/internals/{handleRequest.test.js → handle-request.test.js} +53 -42
  132. package/test/internals/{hookRunner.test.js → hook-runner.test.js} +99 -100
  133. package/test/internals/hooks.test.js +31 -35
  134. package/test/internals/{initialConfig.test.js → initial-config.test.js} +92 -80
  135. package/test/internals/logger.test.js +28 -28
  136. package/test/internals/plugin.test.js +17 -18
  137. package/test/internals/reply-serialize.test.js +106 -106
  138. package/test/internals/reply.test.js +620 -585
  139. package/test/internals/{reqIdGenFactory.test.js → req-id-gen-factory.test.js} +31 -31
  140. package/test/internals/request-validate.test.js +218 -221
  141. package/test/internals/request.test.js +225 -107
  142. package/test/internals/server.test.js +15 -12
  143. package/test/internals/validation.test.js +35 -36
  144. package/test/{keepAliveTimeout.test.js → keep-alive-timeout.test.js} +9 -10
  145. package/test/listen.5.test.js +9 -9
  146. package/test/{maxRequestsPerSocket.test.js → max-requests-per-socket.test.js} +30 -30
  147. package/test/middleware.test.js +4 -5
  148. package/test/noop-set.test.js +5 -5
  149. package/test/post-empty-body.test.js +18 -11
  150. package/test/pretty-print.test.js +59 -49
  151. package/test/proto-poisoning.test.js +42 -37
  152. package/test/reply-code.test.js +34 -32
  153. package/test/{reply-earlyHints.test.js → reply-early-hints.test.js} +21 -19
  154. package/test/request-error.test.js +122 -0
  155. package/test/request-header-host.test.js +339 -0
  156. package/test/request-id.test.js +31 -25
  157. package/test/{requestTimeout.test.js → request-timeout.test.js} +11 -11
  158. package/test/route.1.test.js +79 -72
  159. package/test/route.2.test.js +17 -16
  160. package/test/route.3.test.js +32 -27
  161. package/test/route.4.test.js +21 -25
  162. package/test/route.5.test.js +45 -64
  163. package/test/route.6.test.js +70 -89
  164. package/test/route.7.test.js +61 -65
  165. package/test/route.8.test.js +80 -18
  166. package/test/router-options.test.js +80 -77
  167. package/test/same-shape.test.js +5 -5
  168. package/test/schema-examples.test.js +72 -38
  169. package/test/serialize-response.test.js +9 -10
  170. package/test/server.test.js +75 -78
  171. package/test/set-error-handler.test.js +2 -3
  172. package/test/stream-serializers.test.js +10 -7
  173. package/test/sync-routes.test.js +18 -18
  174. package/test/test-reporter.mjs +68 -0
  175. package/test/trust-proxy.test.js +51 -45
  176. package/test/type-provider.test.js +8 -6
  177. package/test/types/content-type-parser.test-d.ts +1 -1
  178. package/test/types/fastify.test-d.ts +16 -4
  179. package/test/types/hooks.test-d.ts +2 -1
  180. package/test/types/instance.test-d.ts +13 -13
  181. package/test/types/logger.test-d.ts +2 -2
  182. package/test/types/plugin.test-d.ts +17 -9
  183. package/test/types/register.test-d.ts +22 -6
  184. package/test/types/reply.test-d.ts +1 -1
  185. package/test/types/route.test-d.ts +34 -4
  186. package/test/types/serverFactory.test-d.ts +1 -1
  187. package/test/types/type-provider.test-d.ts +1 -1
  188. package/test/url-rewriting.test.js +35 -38
  189. package/test/{useSemicolonDelimiter.test.js → use-semicolon-delimiter.test.js} +30 -30
  190. package/test/validation-error-handling.test.js +259 -285
  191. package/test/versioned-routes.test.js +126 -113
  192. package/test/web-api.test.js +48 -37
  193. package/test/{wrapThenable.test.js → wrap-thenable.test.js} +10 -9
  194. package/types/hooks.d.ts +2 -1
  195. package/types/instance.d.ts +9 -2
  196. package/types/register.d.ts +12 -3
  197. package/types/reply.d.ts +1 -1
  198. package/types/request.d.ts +2 -6
  199. package/types/serverFactory.d.ts +3 -3
  200. package/types/utils.d.ts +13 -5
  201. package/test/types/import.js +0 -2
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const { reqIdGenFactory } = require('../../lib/reqIdGenFactory')
5
5
 
6
6
  test('should create incremental ids deterministically', t => {
@@ -9,18 +9,18 @@ test('should create incremental ids deterministically', t => {
9
9
 
10
10
  for (let i = 1; i < 1e4; ++i) {
11
11
  if (reqIdGen() !== 'req-' + i.toString(36)) {
12
- t.fail()
12
+ t.assert.fail()
13
13
  break
14
14
  }
15
15
  }
16
- t.pass()
16
+ t.assert.ok(true)
17
17
  })
18
18
 
19
19
  test('should have prefix "req-"', t => {
20
20
  t.plan(1)
21
21
  const reqIdGen = reqIdGenFactory()
22
22
 
23
- t.ok(reqIdGen().startsWith('req-'))
23
+ t.assert.ok(reqIdGen().startsWith('req-'))
24
24
  })
25
25
 
26
26
  test('different id generator functions should have separate internal counters', t => {
@@ -28,18 +28,18 @@ test('different id generator functions should have separate internal counters',
28
28
  const reqIdGenA = reqIdGenFactory()
29
29
  const reqIdGenB = reqIdGenFactory()
30
30
 
31
- t.equal(reqIdGenA(), 'req-1')
32
- t.equal(reqIdGenA(), 'req-2')
33
- t.equal(reqIdGenB(), 'req-1')
34
- t.equal(reqIdGenA(), 'req-3')
35
- t.equal(reqIdGenB(), 'req-2')
31
+ t.assert.strictEqual(reqIdGenA(), 'req-1')
32
+ t.assert.strictEqual(reqIdGenA(), 'req-2')
33
+ t.assert.strictEqual(reqIdGenB(), 'req-1')
34
+ t.assert.strictEqual(reqIdGenA(), 'req-3')
35
+ t.assert.strictEqual(reqIdGenB(), 'req-2')
36
36
  })
37
37
 
38
38
  test('should start counting with 1', t => {
39
39
  t.plan(1)
40
40
  const reqIdGen = reqIdGenFactory()
41
41
 
42
- t.equal(reqIdGen(), 'req-1')
42
+ t.assert.strictEqual(reqIdGen(), 'req-1')
43
43
  })
44
44
 
45
45
  test('should handle requestIdHeader and return provided id in header', t => {
@@ -47,7 +47,7 @@ test('should handle requestIdHeader and return provided id in header', t => {
47
47
 
48
48
  const reqIdGen = reqIdGenFactory('id')
49
49
 
50
- t.equal(reqIdGen({ headers: { id: '1337' } }), '1337')
50
+ t.assert.strictEqual(reqIdGen({ headers: { id: '1337' } }), '1337')
51
51
  })
52
52
 
53
53
  test('should handle requestIdHeader and fallback if id is not provided in header', t => {
@@ -55,7 +55,7 @@ test('should handle requestIdHeader and fallback if id is not provided in header
55
55
 
56
56
  const reqIdGen = reqIdGenFactory('id')
57
57
 
58
- t.equal(reqIdGen({ headers: { notId: '1337' } }), 'req-1')
58
+ t.assert.strictEqual(reqIdGen({ headers: { notId: '1337' } }), 'req-1')
59
59
  })
60
60
 
61
61
  test('should handle requestIdHeader and increment internal counter if no header was provided', t => {
@@ -63,10 +63,10 @@ test('should handle requestIdHeader and increment internal counter if no header
63
63
 
64
64
  const reqIdGen = reqIdGenFactory('id')
65
65
 
66
- t.equal(reqIdGen({ headers: {} }), 'req-1')
67
- t.equal(reqIdGen({ headers: {} }), 'req-2')
68
- t.equal(reqIdGen({ headers: { id: '1337' } }), '1337')
69
- t.equal(reqIdGen({ headers: {} }), 'req-3')
66
+ t.assert.strictEqual(reqIdGen({ headers: {} }), 'req-1')
67
+ t.assert.strictEqual(reqIdGen({ headers: {} }), 'req-2')
68
+ t.assert.strictEqual(reqIdGen({ headers: { id: '1337' } }), '1337')
69
+ t.assert.strictEqual(reqIdGen({ headers: {} }), 'req-3')
70
70
  })
71
71
 
72
72
  test('should use optGenReqId to generate ids', t => {
@@ -80,10 +80,10 @@ test('should use optGenReqId to generate ids', t => {
80
80
  }
81
81
  const reqIdGen = reqIdGenFactory(undefined, optGenReqId)
82
82
 
83
- t.equal(gotCalled, false)
84
- t.equal(reqIdGen(), '1')
85
- t.equal(gotCalled, true)
86
- t.equal(reqIdGen(), '2')
83
+ t.assert.strictEqual(gotCalled, false)
84
+ t.assert.strictEqual(reqIdGen(), '1')
85
+ t.assert.strictEqual(gotCalled, true)
86
+ t.assert.strictEqual(reqIdGen(), '2')
87
87
  })
88
88
 
89
89
  test('should use optGenReqId to generate ids if requestIdHeader is used but not provided', t => {
@@ -97,22 +97,22 @@ test('should use optGenReqId to generate ids if requestIdHeader is used but not
97
97
  }
98
98
  const reqIdGen = reqIdGenFactory('reqId', optGenReqId)
99
99
 
100
- t.equal(gotCalled, false)
101
- t.equal(reqIdGen({ headers: {} }), '1')
102
- t.equal(gotCalled, true)
103
- t.equal(reqIdGen({ headers: {} }), '2')
100
+ t.assert.strictEqual(gotCalled, false)
101
+ t.assert.strictEqual(reqIdGen({ headers: {} }), '1')
102
+ t.assert.strictEqual(gotCalled, true)
103
+ t.assert.strictEqual(reqIdGen({ headers: {} }), '2')
104
104
  })
105
105
 
106
106
  test('should not use optGenReqId to generate ids if requestIdHeader is used and provided', t => {
107
107
  t.plan(2)
108
108
 
109
109
  function optGenReqId () {
110
- t.fail()
110
+ t.assert.fail()
111
111
  }
112
112
  const reqIdGen = reqIdGenFactory('reqId', optGenReqId)
113
113
 
114
- t.equal(reqIdGen({ headers: { reqId: 'r1' } }), 'r1')
115
- t.equal(reqIdGen({ headers: { reqId: 'r2' } }), 'r2')
114
+ t.assert.strictEqual(reqIdGen({ headers: { reqId: 'r1' } }), 'r1')
115
+ t.assert.strictEqual(reqIdGen({ headers: { reqId: 'r2' } }), 'r2')
116
116
  })
117
117
 
118
118
  test('should fallback to use optGenReqId to generate ids if requestIdHeader is sometimes provided', t => {
@@ -126,8 +126,8 @@ test('should fallback to use optGenReqId to generate ids if requestIdHeader is s
126
126
  }
127
127
  const reqIdGen = reqIdGenFactory('reqId', optGenReqId)
128
128
 
129
- t.equal(reqIdGen({ headers: { reqId: 'r1' } }), 'r1')
130
- t.equal(gotCalled, false)
131
- t.equal(reqIdGen({ headers: {} }), '1')
132
- t.equal(gotCalled, true)
129
+ t.assert.strictEqual(reqIdGen({ headers: { reqId: 'r1' } }), 'r1')
130
+ t.assert.strictEqual(gotCalled, false)
131
+ t.assert.strictEqual(reqIdGen({ headers: {} }), '1')
132
+ t.assert.strictEqual(gotCalled, true)
133
133
  })