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
 
5
5
  const Request = require('../../lib/request')
6
6
  const Context = require('../../lib/context')
@@ -42,34 +42,33 @@ test('Regular request', t => {
42
42
  [kRequest]: Request,
43
43
  [kOptions]: {
44
44
  requestIdLogLabel: 'reqId'
45
- }
45
+ },
46
+ server: {}
46
47
  }
47
48
  })
48
49
  req.connection = req.socket
49
50
  const request = new Request('id', 'params', req, 'query', 'log', context)
50
- t.type(request, Request)
51
- t.type(request.validateInput, Function)
52
- t.type(request.getValidationFunction, Function)
53
- t.type(request.compileValidationSchema, Function)
54
- t.equal(request.id, 'id')
55
- t.equal(request.params, 'params')
56
- t.equal(request.raw, req)
57
- t.equal(request.query, 'query')
58
- t.equal(request.headers, headers)
59
- t.equal(request.log, 'log')
60
- t.equal(request.ip, 'ip')
61
- t.equal(request.ips, undefined)
62
- t.equal(request.host, 'hostname')
63
- t.equal(request.body, undefined)
64
- t.equal(request.method, 'GET')
65
- t.equal(request.url, '/')
66
- t.equal(request.originalUrl, '/')
67
- t.equal(request.socket, req.socket)
68
- t.equal(request.protocol, 'http')
51
+ t.assert.ok(request instanceof Request)
52
+ t.assert.ok(request.validateInput instanceof Function)
53
+ t.assert.ok(request.getValidationFunction instanceof Function)
54
+ t.assert.ok(request.compileValidationSchema instanceof Function)
55
+ t.assert.strictEqual(request.id, 'id')
56
+ t.assert.strictEqual(request.params, 'params')
57
+ t.assert.strictEqual(request.raw, req)
58
+ t.assert.strictEqual(request.query, 'query')
59
+ t.assert.strictEqual(request.headers, headers)
60
+ t.assert.strictEqual(request.log, 'log')
61
+ t.assert.strictEqual(request.ip, 'ip')
62
+ t.assert.strictEqual(request.ips, undefined)
63
+ t.assert.strictEqual(request.host, 'hostname')
64
+ t.assert.strictEqual(request.body, undefined)
65
+ t.assert.strictEqual(request.method, 'GET')
66
+ t.assert.strictEqual(request.url, '/')
67
+ t.assert.strictEqual(request.originalUrl, '/')
68
+ t.assert.strictEqual(request.socket, req.socket)
69
+ t.assert.strictEqual(request.protocol, 'http')
69
70
  // Aim to not bad property keys (including Symbols)
70
- t.notOk('undefined' in request)
71
-
72
- t.end()
71
+ t.assert.ok(!('undefined' in request))
73
72
  })
74
73
 
75
74
  test('Request with undefined config', t => {
@@ -97,35 +96,34 @@ test('Request with undefined config', t => {
97
96
  [kRequest]: Request,
98
97
  [kOptions]: {
99
98
  requestIdLogLabel: 'reqId'
100
- }
99
+ },
100
+ server: {}
101
101
  }
102
102
  })
103
103
  req.connection = req.socket
104
104
  const request = new Request('id', 'params', req, 'query', 'log', context)
105
- t.type(request, Request)
106
- t.type(request.validateInput, Function)
107
- t.type(request.getValidationFunction, Function)
108
- t.type(request.compileValidationSchema, Function)
109
- t.equal(request.id, 'id')
110
- t.equal(request.params, 'params')
111
- t.equal(request.raw, req)
112
- t.equal(request.query, 'query')
113
- t.equal(request.headers, headers)
114
- t.equal(request.log, 'log')
115
- t.equal(request.ip, 'ip')
116
- t.equal(request.ips, undefined)
117
- t.equal(request.hostname, 'hostname')
118
- t.equal(request.body, undefined)
119
- t.equal(request.method, 'GET')
120
- t.equal(request.url, '/')
121
- t.equal(request.originalUrl, '/')
122
- t.equal(request.socket, req.socket)
123
- t.equal(request.protocol, 'http')
105
+ t.assert.ok(request, Request)
106
+ t.assert.ok(request.validateInput, Function)
107
+ t.assert.ok(request.getValidationFunction, Function)
108
+ t.assert.ok(request.compileValidationSchema, Function)
109
+ t.assert.strictEqual(request.id, 'id')
110
+ t.assert.strictEqual(request.params, 'params')
111
+ t.assert.strictEqual(request.raw, req)
112
+ t.assert.strictEqual(request.query, 'query')
113
+ t.assert.strictEqual(request.headers, headers)
114
+ t.assert.strictEqual(request.log, 'log')
115
+ t.assert.strictEqual(request.ip, 'ip')
116
+ t.assert.strictEqual(request.ips, undefined)
117
+ t.assert.strictEqual(request.hostname, 'hostname')
118
+ t.assert.strictEqual(request.body, undefined)
119
+ t.assert.strictEqual(request.method, 'GET')
120
+ t.assert.strictEqual(request.url, '/')
121
+ t.assert.strictEqual(request.originalUrl, '/')
122
+ t.assert.strictEqual(request.socket, req.socket)
123
+ t.assert.strictEqual(request.protocol, 'http')
124
124
 
125
125
  // Aim to not bad property keys (including Symbols)
126
- t.notOk('undefined' in request)
127
-
128
- t.end()
126
+ t.assert.ok(!('undefined' in request))
129
127
  })
130
128
 
131
129
  test('Regular request - hostname from authority', t => {
@@ -139,11 +137,35 @@ test('Regular request - hostname from authority', t => {
139
137
  socket: { remoteAddress: 'ip' },
140
138
  headers
141
139
  }
140
+ const context = new Context({
141
+ schema: {
142
+ body: {
143
+ type: 'object',
144
+ required: ['hello'],
145
+ properties: {
146
+ hello: { type: 'string' }
147
+ }
148
+ }
149
+ },
150
+ config: {
151
+ some: 'config',
152
+ url: req.url,
153
+ method: req.method
154
+ },
155
+ server: {
156
+ [kReply]: {},
157
+ [kRequest]: Request,
158
+ [kOptions]: {
159
+ requestIdLogLabel: 'reqId'
160
+ },
161
+ server: {}
162
+ }
163
+ })
142
164
 
143
- const request = new Request('id', 'params', req, 'query', 'log')
144
- t.type(request, Request)
145
- t.equal(request.host, 'authority')
146
- t.equal(request.port, null)
165
+ const request = new Request('id', 'params', req, 'query', 'log', context)
166
+ t.assert.ok(request instanceof Request)
167
+ t.assert.strictEqual(request.host, 'authority')
168
+ t.assert.strictEqual(request.port, null)
147
169
  })
148
170
 
149
171
  test('Regular request - host header has precedence over authority', t => {
@@ -158,10 +180,34 @@ test('Regular request - host header has precedence over authority', t => {
158
180
  socket: { remoteAddress: 'ip' },
159
181
  headers
160
182
  }
161
- const request = new Request('id', 'params', req, 'query', 'log')
162
- t.type(request, Request)
163
- t.equal(request.host, 'hostname')
164
- t.equal(request.port, null)
183
+ const context = new Context({
184
+ schema: {
185
+ body: {
186
+ type: 'object',
187
+ required: ['hello'],
188
+ properties: {
189
+ hello: { type: 'string' }
190
+ }
191
+ }
192
+ },
193
+ config: {
194
+ some: 'config',
195
+ url: req.url,
196
+ method: req.method
197
+ },
198
+ server: {
199
+ [kReply]: {},
200
+ [kRequest]: Request,
201
+ [kOptions]: {
202
+ requestIdLogLabel: 'reqId'
203
+ },
204
+ server: {}
205
+ }
206
+ })
207
+ const request = new Request('id', 'params', req, 'query', 'log', context)
208
+ t.assert.ok(request instanceof Request)
209
+ t.assert.strictEqual(request.host, 'hostname')
210
+ t.assert.strictEqual(request.port, null)
165
211
  })
166
212
 
167
213
  test('Request with trust proxy', t => {
@@ -202,24 +248,24 @@ test('Request with trust proxy', t => {
202
248
 
203
249
  const TpRequest = Request.buildRequest(Request, true)
204
250
  const request = new TpRequest('id', 'params', req, 'query', 'log', context)
205
- t.type(request, TpRequest)
206
- t.equal(request.id, 'id')
207
- t.equal(request.params, 'params')
208
- t.same(request.raw, req)
209
- t.equal(request.query, 'query')
210
- t.equal(request.headers, headers)
211
- t.equal(request.log, 'log')
212
- t.equal(request.ip, '2.2.2.2')
213
- t.same(request.ips, ['ip', '1.1.1.1', '2.2.2.2'])
214
- t.equal(request.host, 'example.com')
215
- t.equal(request.body, undefined)
216
- t.equal(request.method, 'GET')
217
- t.equal(request.url, '/')
218
- t.equal(request.socket, req.socket)
219
- t.equal(request.protocol, 'http')
220
- t.type(request.validateInput, Function)
221
- t.type(request.getValidationFunction, Function)
222
- t.type(request.compileValidationSchema, Function)
251
+ t.assert.ok(request instanceof TpRequest)
252
+ t.assert.strictEqual(request.id, 'id')
253
+ t.assert.strictEqual(request.params, 'params')
254
+ t.assert.deepStrictEqual(request.raw, req)
255
+ t.assert.strictEqual(request.query, 'query')
256
+ t.assert.strictEqual(request.headers, headers)
257
+ t.assert.strictEqual(request.log, 'log')
258
+ t.assert.strictEqual(request.ip, '2.2.2.2')
259
+ t.assert.deepStrictEqual(request.ips, ['ip', '1.1.1.1', '2.2.2.2'])
260
+ t.assert.strictEqual(request.host, 'example.com')
261
+ t.assert.strictEqual(request.body, undefined)
262
+ t.assert.strictEqual(request.method, 'GET')
263
+ t.assert.strictEqual(request.url, '/')
264
+ t.assert.strictEqual(request.socket, req.socket)
265
+ t.assert.strictEqual(request.protocol, 'http')
266
+ t.assert.ok(request.validateInput instanceof Function)
267
+ t.assert.ok(request.getValidationFunction instanceof Function)
268
+ t.assert.ok(request.compileValidationSchema instanceof Function)
223
269
  })
224
270
 
225
271
  test('Request with trust proxy, encrypted', t => {
@@ -237,8 +283,8 @@ test('Request with trust proxy, encrypted', t => {
237
283
 
238
284
  const TpRequest = Request.buildRequest(Request, true)
239
285
  const request = new TpRequest('id', 'params', req, 'query', 'log')
240
- t.type(request, TpRequest)
241
- t.equal(request.protocol, 'https')
286
+ t.assert.ok(request instanceof TpRequest)
287
+ t.assert.strictEqual(request.protocol, 'https')
242
288
  })
243
289
 
244
290
  test('Request with trust proxy - no x-forwarded-host header', t => {
@@ -253,11 +299,35 @@ test('Request with trust proxy - no x-forwarded-host header', t => {
253
299
  socket: { remoteAddress: 'ip' },
254
300
  headers
255
301
  }
302
+ const context = new Context({
303
+ schema: {
304
+ body: {
305
+ type: 'object',
306
+ required: ['hello'],
307
+ properties: {
308
+ hello: { type: 'string' }
309
+ }
310
+ }
311
+ },
312
+ config: {
313
+ some: 'config',
314
+ url: req.url,
315
+ method: req.method
316
+ },
317
+ server: {
318
+ [kReply]: {},
319
+ [kRequest]: Request,
320
+ [kOptions]: {
321
+ requestIdLogLabel: 'reqId'
322
+ },
323
+ server: {}
324
+ }
325
+ })
256
326
 
257
327
  const TpRequest = Request.buildRequest(Request, true)
258
- const request = new TpRequest('id', 'params', req, 'query', 'log')
259
- t.type(request, TpRequest)
260
- t.equal(request.host, 'hostname')
328
+ const request = new TpRequest('id', 'params', req, 'query', 'log', context)
329
+ t.assert.ok(request instanceof TpRequest)
330
+ t.assert.strictEqual(request.host, 'hostname')
261
331
  })
262
332
 
263
333
  test('Request with trust proxy - no x-forwarded-host header and fallback to authority', t => {
@@ -272,11 +342,35 @@ test('Request with trust proxy - no x-forwarded-host header and fallback to auth
272
342
  socket: { remoteAddress: 'ip' },
273
343
  headers
274
344
  }
345
+ const context = new Context({
346
+ schema: {
347
+ body: {
348
+ type: 'object',
349
+ required: ['hello'],
350
+ properties: {
351
+ hello: { type: 'string' }
352
+ }
353
+ }
354
+ },
355
+ config: {
356
+ some: 'config',
357
+ url: req.url,
358
+ method: req.method
359
+ },
360
+ server: {
361
+ [kReply]: {},
362
+ [kRequest]: Request,
363
+ [kOptions]: {
364
+ requestIdLogLabel: 'reqId'
365
+ },
366
+ server: {}
367
+ }
368
+ })
275
369
 
276
370
  const TpRequest = Request.buildRequest(Request, true)
277
- const request = new TpRequest('id', 'params', req, 'query', 'log')
278
- t.type(request, TpRequest)
279
- t.equal(request.host, 'authority')
371
+ const request = new TpRequest('id', 'params', req, 'query', 'log', context)
372
+ t.assert.ok(request instanceof TpRequest)
373
+ t.assert.strictEqual(request.host, 'authority')
280
374
  })
281
375
 
282
376
  test('Request with trust proxy - x-forwarded-host header has precedence over host', t => {
@@ -295,8 +389,8 @@ test('Request with trust proxy - x-forwarded-host header has precedence over hos
295
389
 
296
390
  const TpRequest = Request.buildRequest(Request, true)
297
391
  const request = new TpRequest('id', 'params', req, 'query', 'log')
298
- t.type(request, TpRequest)
299
- t.equal(request.host, 'example.com')
392
+ t.assert.ok(request instanceof TpRequest)
393
+ t.assert.strictEqual(request.host, 'example.com')
300
394
  })
301
395
 
302
396
  test('Request with trust proxy - handles multiple entries in x-forwarded-host/proto', t => {
@@ -314,9 +408,9 @@ test('Request with trust proxy - handles multiple entries in x-forwarded-host/pr
314
408
 
315
409
  const TpRequest = Request.buildRequest(Request, true)
316
410
  const request = new TpRequest('id', 'params', req, 'query', 'log')
317
- t.type(request, TpRequest)
318
- t.equal(request.host, 'example.com')
319
- t.equal(request.protocol, 'https')
411
+ t.assert.ok(request instanceof TpRequest)
412
+ t.assert.strictEqual(request.host, 'example.com')
413
+ t.assert.strictEqual(request.protocol, 'https')
320
414
  })
321
415
 
322
416
  test('Request with trust proxy - plain', t => {
@@ -334,7 +428,7 @@ test('Request with trust proxy - plain', t => {
334
428
 
335
429
  const TpRequest = Request.buildRequest(Request, true)
336
430
  const request = new TpRequest('id', 'params', req, 'query', 'log')
337
- t.same(request.protocol, 'http')
431
+ t.assert.deepStrictEqual(request.protocol, 'http')
338
432
  })
339
433
 
340
434
  test('Request with undefined socket', t => {
@@ -348,25 +442,49 @@ test('Request with undefined socket', t => {
348
442
  socket: undefined,
349
443
  headers
350
444
  }
351
- const request = new Request('id', 'params', req, 'query', 'log')
352
- t.type(request, Request)
353
- t.equal(request.id, 'id')
354
- t.equal(request.params, 'params')
355
- t.same(request.raw, req)
356
- t.equal(request.query, 'query')
357
- t.equal(request.headers, headers)
358
- t.equal(request.log, 'log')
359
- t.equal(request.ip, undefined)
360
- t.equal(request.ips, undefined)
361
- t.equal(request.host, 'hostname')
362
- t.same(request.body, null)
363
- t.equal(request.method, 'GET')
364
- t.equal(request.url, '/')
365
- t.equal(request.protocol, undefined)
366
- t.same(request.socket, req.socket)
367
- t.type(request.validateInput, Function)
368
- t.type(request.getValidationFunction, Function)
369
- t.type(request.compileValidationSchema, Function)
445
+ const context = new Context({
446
+ schema: {
447
+ body: {
448
+ type: 'object',
449
+ required: ['hello'],
450
+ properties: {
451
+ hello: { type: 'string' }
452
+ }
453
+ }
454
+ },
455
+ config: {
456
+ some: 'config',
457
+ url: req.url,
458
+ method: req.method
459
+ },
460
+ server: {
461
+ [kReply]: {},
462
+ [kRequest]: Request,
463
+ [kOptions]: {
464
+ requestIdLogLabel: 'reqId'
465
+ },
466
+ server: {}
467
+ }
468
+ })
469
+ const request = new Request('id', 'params', req, 'query', 'log', context)
470
+ t.assert.ok(request instanceof Request)
471
+ t.assert.strictEqual(request.id, 'id')
472
+ t.assert.strictEqual(request.params, 'params')
473
+ t.assert.deepStrictEqual(request.raw, req)
474
+ t.assert.strictEqual(request.query, 'query')
475
+ t.assert.strictEqual(request.headers, headers)
476
+ t.assert.strictEqual(request.log, 'log')
477
+ t.assert.strictEqual(request.ip, undefined)
478
+ t.assert.strictEqual(request.ips, undefined)
479
+ t.assert.strictEqual(request.host, 'hostname')
480
+ t.assert.deepStrictEqual(request.body, undefined)
481
+ t.assert.strictEqual(request.method, 'GET')
482
+ t.assert.strictEqual(request.url, '/')
483
+ t.assert.strictEqual(request.protocol, undefined)
484
+ t.assert.deepStrictEqual(request.socket, req.socket)
485
+ t.assert.ok(request.validateInput instanceof Function)
486
+ t.assert.ok(request.getValidationFunction instanceof Function)
487
+ t.assert.ok(request.compileValidationSchema instanceof Function)
370
488
  })
371
489
 
372
490
  test('Request with trust proxy and undefined socket', t => {
@@ -384,5 +502,5 @@ test('Request with trust proxy and undefined socket', t => {
384
502
 
385
503
  const TpRequest = Request.buildRequest(Request, true)
386
504
  const request = new TpRequest('id', 'params', req, 'query', 'log')
387
- t.same(request.protocol, undefined)
505
+ t.assert.deepStrictEqual(request.protocol, undefined)
388
506
  })
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const proxyquire = require('proxyquire')
5
5
 
6
6
  const Fastify = require('../../fastify')
@@ -15,7 +15,7 @@ test('start listening', async t => {
15
15
  const { server, listen } = createServer({}, handler)
16
16
  await listen.call(Fastify(), { port: 0, host: 'localhost' })
17
17
  server.close()
18
- t.pass('server started')
18
+ t.assert.ok(true, 'server started')
19
19
  })
20
20
 
21
21
  test('DNS errors does not stop the main server on localhost - promise interface', async t => {
@@ -29,10 +29,10 @@ test('DNS errors does not stop the main server on localhost - promise interface'
29
29
  const { server, listen } = createServer({}, handler)
30
30
  await listen.call(Fastify(), { port: 0, host: 'localhost' })
31
31
  server.close()
32
- t.pass('server started')
32
+ t.assert.ok(true, 'server started')
33
33
  })
34
34
 
35
- test('DNS errors does not stop the main server on localhost - callback interface', t => {
35
+ test('DNS errors does not stop the main server on localhost - callback interface', (t, done) => {
36
36
  t.plan(2)
37
37
  const { createServer } = proxyquire('../../lib/server', {
38
38
  'node:dns': {
@@ -43,13 +43,14 @@ test('DNS errors does not stop the main server on localhost - callback interface
43
43
  })
44
44
  const { server, listen } = createServer({}, handler)
45
45
  listen.call(Fastify(), { port: 0, host: 'localhost' }, (err) => {
46
- t.error(err)
46
+ t.assert.ifError(err)
47
47
  server.close()
48
- t.pass('server started')
48
+ t.assert.ok(true, 'server started')
49
+ done()
49
50
  })
50
51
  })
51
52
 
52
- test('DNS returns empty binding', t => {
53
+ test('DNS returns empty binding', (t, done) => {
53
54
  t.plan(2)
54
55
  const { createServer } = proxyquire('../../lib/server', {
55
56
  'node:dns': {
@@ -60,13 +61,14 @@ test('DNS returns empty binding', t => {
60
61
  })
61
62
  const { server, listen } = createServer({}, handler)
62
63
  listen.call(Fastify(), { port: 0, host: 'localhost' }, (err) => {
63
- t.error(err)
64
+ t.assert.ifError(err)
64
65
  server.close()
65
- t.pass('server started')
66
+ t.assert.ok(true, 'server started')
67
+ done()
66
68
  })
67
69
  })
68
70
 
69
- test('DNS returns more than two binding', t => {
71
+ test('DNS returns more than two binding', (t, done) => {
70
72
  t.plan(2)
71
73
  const { createServer } = proxyquire('../../lib/server', {
72
74
  'node:dns': {
@@ -81,8 +83,9 @@ test('DNS returns more than two binding', t => {
81
83
  })
82
84
  const { server, listen } = createServer({}, handler)
83
85
  listen.call(Fastify(), { port: 0, host: 'localhost' }, (err) => {
84
- t.error(err)
86
+ t.assert.ifError(err)
85
87
  server.close()
86
- t.pass('server started')
88
+ t.assert.ok(true, 'server started')
89
+ done()
87
90
  })
88
91
  })