fastify 5.0.0-alpha.2 → 5.0.0-alpha.4

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 (290) hide show
  1. package/README.md +2 -2
  2. package/SPONSORS.md +2 -0
  3. package/build/build-validation.js +3 -15
  4. package/docs/Guides/Ecosystem.md +4 -0
  5. package/docs/Guides/Getting-Started.md +0 -2
  6. package/docs/Guides/Migration-Guide-V4.md +48 -0
  7. package/docs/Guides/Recommendations.md +8 -6
  8. package/docs/Reference/Errors.md +0 -2
  9. package/docs/Reference/Hooks.md +5 -9
  10. package/docs/Reference/Logging.md +1 -1
  11. package/docs/Reference/Reply.md +9 -11
  12. package/docs/Reference/Request.md +0 -11
  13. package/docs/Reference/Routes.md +4 -23
  14. package/docs/Reference/Server.md +30 -40
  15. package/docs/Reference/Type-Providers.md +2 -2
  16. package/docs/Reference/TypeScript.md +16 -18
  17. package/docs/Reference/Validation-and-Serialization.md +62 -27
  18. package/docs/Reference/Warnings.md +0 -26
  19. package/eslint.config.js +9 -25
  20. package/fastify.d.ts +10 -23
  21. package/fastify.js +60 -61
  22. package/lib/configValidator.js +130 -182
  23. package/lib/context.js +1 -22
  24. package/lib/decorate.js +2 -2
  25. package/lib/errors.js +0 -6
  26. package/lib/handleRequest.js +5 -5
  27. package/lib/reply.js +34 -74
  28. package/lib/request.js +0 -45
  29. package/lib/route.js +12 -27
  30. package/lib/schemas.js +27 -22
  31. package/lib/server.js +6 -11
  32. package/lib/symbols.js +1 -1
  33. package/lib/validation.js +27 -6
  34. package/lib/warnings.js +1 -92
  35. package/lib/wrapThenable.js +1 -1
  36. package/package.json +14 -15
  37. package/test/decorator.test.js +1 -1
  38. package/test/diagnostics-channel/404.test.js +1 -1
  39. package/test/diagnostics-channel/async-delay-request.test.js +1 -1
  40. package/test/diagnostics-channel/async-request.test.js +1 -1
  41. package/test/diagnostics-channel/error-before-handler.test.js +1 -1
  42. package/test/diagnostics-channel/error-request.test.js +1 -1
  43. package/test/diagnostics-channel/error-status.test.js +1 -1
  44. package/test/diagnostics-channel/init.test.js +2 -2
  45. package/test/diagnostics-channel/sync-delay-request.test.js +1 -1
  46. package/test/diagnostics-channel/sync-request-reply.test.js +1 -1
  47. package/test/diagnostics-channel/sync-request.test.js +1 -1
  48. package/test/{copy.test.js → http-methods/copy.test.js} +2 -1
  49. package/test/http-methods/custom-http-methods.test.js +111 -0
  50. package/test/{get.test.js → http-methods/get.test.js} +1 -1
  51. package/test/{head.test.js → http-methods/head.test.js} +7 -87
  52. package/test/{lock.test.js → http-methods/lock.test.js} +2 -1
  53. package/test/{mkcalendar.test.js → http-methods/mkcalendar.test.js} +2 -1
  54. package/test/{mkcol.test.js → http-methods/mkcol.test.js} +2 -1
  55. package/test/{move.test.js → http-methods/move.test.js} +2 -1
  56. package/test/{propfind.test.js → http-methods/propfind.test.js} +2 -1
  57. package/test/{proppatch.test.js → http-methods/proppatch.test.js} +2 -1
  58. package/test/{report.test.js → http-methods/report.test.js} +2 -1
  59. package/test/{search.test.js → http-methods/search.test.js} +2 -1
  60. package/test/{trace.test.js → http-methods/trace.test.js} +2 -1
  61. package/test/{unlock.test.js → http-methods/unlock.test.js} +2 -1
  62. package/test/internals/all.test.js +3 -3
  63. package/test/internals/decorator.test.js +2 -2
  64. package/test/internals/errors.test.js +7 -17
  65. package/test/internals/initialConfig.test.js +0 -31
  66. package/test/internals/reply-serialize.test.js +25 -10
  67. package/test/internals/reply.test.js +31 -153
  68. package/test/internals/request-validate.test.js +21 -12
  69. package/test/internals/request.test.js +1 -18
  70. package/test/internals/validation.test.js +49 -56
  71. package/test/listen.1.test.js +66 -14
  72. package/test/listen.5.test.js +11 -0
  73. package/test/reply-trailers.test.js +1 -32
  74. package/test/route-shorthand.test.js +3 -1
  75. package/test/route.3.test.js +4 -1
  76. package/test/route.7.test.js +2 -12
  77. package/test/route.8.test.js +34 -5
  78. package/test/router-options.test.js +6 -3
  79. package/test/schema-examples.test.js +15 -6
  80. package/test/schema-feature.test.js +178 -35
  81. package/test/schema-serialization.test.js +125 -21
  82. package/test/schema-validation.test.js +154 -3
  83. package/test/skip-reply-send.test.js +6 -6
  84. package/test/stream-serializers.test.js +37 -0
  85. package/test/throw.test.js +2 -14
  86. package/test/types/errors.test-d.ts +1 -2
  87. package/test/types/fastify.test-d.ts +23 -34
  88. package/test/types/hooks.test-d.ts +56 -56
  89. package/test/types/instance.test-d.ts +3 -3
  90. package/test/types/reply.test-d.ts +7 -8
  91. package/test/types/request.test-d.ts +2 -12
  92. package/test/types/route.test-d.ts +158 -158
  93. package/test/types/schema.test-d.ts +22 -5
  94. package/test/versioned-routes.test.js +0 -90
  95. package/test/web-api.test.js +75 -0
  96. package/types/errors.d.ts +78 -79
  97. package/types/hooks.d.ts +18 -18
  98. package/types/instance.d.ts +1 -1
  99. package/types/logger.d.ts +7 -7
  100. package/types/reply.d.ts +18 -22
  101. package/types/request.d.ts +8 -14
  102. package/types/route.d.ts +5 -6
  103. package/types/type-provider.d.ts +1 -1
  104. package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +0 -241
  105. package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +0 -268
  106. package/.tap/test-results/test/404s.test.js.tap +0 -623
  107. package/.tap/test-results/test/500s.test.js.tap +0 -64
  108. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +0 -36
  109. package/.tap/test-results/test/als.test.js.tap +0 -15
  110. package/.tap/test-results/test/async-await.test.js.tap +0 -184
  111. package/.tap/test-results/test/async-dispose.test.js.tap +0 -8
  112. package/.tap/test-results/test/async_hooks.test.js.tap +0 -10
  113. package/.tap/test-results/test/bodyLimit.test.js.tap +0 -48
  114. package/.tap/test-results/test/buffer.test.js.tap +0 -20
  115. package/.tap/test-results/test/build/error-serializer.test.js.tap +0 -12
  116. package/.tap/test-results/test/build/version.test.js.tap +0 -7
  117. package/.tap/test-results/test/case-insensitive.test.js.tap +0 -36
  118. package/.tap/test-results/test/chainable.test.js.tap +0 -17
  119. package/.tap/test-results/test/check.test.js.tap +0 -10
  120. package/.tap/test-results/test/childLoggerFactory.test.js.tap +0 -23
  121. package/.tap/test-results/test/client-timeout.test.js.tap +0 -7
  122. package/.tap/test-results/test/close-pipelining.test.js.tap +0 -15
  123. package/.tap/test-results/test/close.test.js.tap +0 -172
  124. package/.tap/test-results/test/connectionTimeout.test.js.tap +0 -12
  125. package/.tap/test-results/test/constrained-routes.test.js.tap +0 -173
  126. package/.tap/test-results/test/content-length.test.js.tap +0 -46
  127. package/.tap/test-results/test/content-parser.test.js.tap +0 -266
  128. package/.tap/test-results/test/content-type.test.js.tap +0 -14
  129. package/.tap/test-results/test/context-config.test.js.tap +0 -41
  130. package/.tap/test-results/test/copy.test.js.tap +0 -14
  131. package/.tap/test-results/test/custom-http-server.test.js.tap +0 -30
  132. package/.tap/test-results/test/custom-parser-async.test.js.tap +0 -21
  133. package/.tap/test-results/test/custom-parser.0.test.js.tap +0 -199
  134. package/.tap/test-results/test/custom-parser.1.test.js.tap +0 -90
  135. package/.tap/test-results/test/custom-parser.2.test.js.tap +0 -22
  136. package/.tap/test-results/test/custom-parser.3.test.js.tap +0 -53
  137. package/.tap/test-results/test/custom-parser.4.test.js.tap +0 -45
  138. package/.tap/test-results/test/custom-parser.5.test.js.tap +0 -41
  139. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +0 -46
  140. package/.tap/test-results/test/decorator.test.js.tap +0 -465
  141. package/.tap/test-results/test/delete.test.js.tap +0 -110
  142. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +0 -15
  143. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +0 -25
  144. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +0 -24
  145. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +0 -9
  146. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +0 -20
  147. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +0 -10
  148. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +0 -14
  149. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +0 -16
  150. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +0 -16
  151. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +0 -19
  152. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +0 -18
  153. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +0 -243
  154. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +0 -9
  155. package/.tap/test-results/test/esm/esm.test.mjs.tap +0 -8
  156. package/.tap/test-results/test/esm/index.test.js.tap +0 -8
  157. package/.tap/test-results/test/fastify-instance.test.js.tap +0 -114
  158. package/.tap/test-results/test/findRoute.test.js.tap +0 -37
  159. package/.tap/test-results/test/fluent-schema.test.js.tap +0 -36
  160. package/.tap/test-results/test/genReqId.test.js.tap +0 -106
  161. package/.tap/test-results/test/get.test.js.tap +0 -151
  162. package/.tap/test-results/test/handler-context.test.js.tap +0 -19
  163. package/.tap/test-results/test/has-route.test.js.tap +0 -30
  164. package/.tap/test-results/test/head.test.js.tap +0 -130
  165. package/.tap/test-results/test/header-overflow.test.js.tap +0 -16
  166. package/.tap/test-results/test/hooks-async.test.js.tap +0 -286
  167. package/.tap/test-results/test/hooks.on-listen.test.js.tap +0 -311
  168. package/.tap/test-results/test/hooks.on-ready.test.js.tap +0 -151
  169. package/.tap/test-results/test/hooks.test.js.tap +0 -966
  170. package/.tap/test-results/test/http2/closing.test.js.tap +0 -35
  171. package/.tap/test-results/test/http2/constraint.test.js.tap +0 -32
  172. package/.tap/test-results/test/http2/head.test.js.tap +0 -9
  173. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +0 -8
  174. package/.tap/test-results/test/http2/plain.test.js.tap +0 -22
  175. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +0 -40
  176. package/.tap/test-results/test/http2/secure.test.js.tap +0 -27
  177. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +0 -9
  178. package/.tap/test-results/test/https/custom-https-server.test.js.tap +0 -10
  179. package/.tap/test-results/test/https/https.test.js.tap +0 -45
  180. package/.tap/test-results/test/imports.test.js.tap +0 -14
  181. package/.tap/test-results/test/inject.test.js.tap +0 -165
  182. package/.tap/test-results/test/internals/all.test.js.tap +0 -42
  183. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +0 -14
  184. package/.tap/test-results/test/internals/context.test.js.tap +0 -14
  185. package/.tap/test-results/test/internals/decorator.test.js.tap +0 -51
  186. package/.tap/test-results/test/internals/errors.test.js.tap +0 -1212
  187. package/.tap/test-results/test/internals/handleRequest.test.js.tap +0 -69
  188. package/.tap/test-results/test/internals/hookRunner.test.js.tap +0 -143
  189. package/.tap/test-results/test/internals/hooks.test.js.tap +0 -45
  190. package/.tap/test-results/test/internals/initialConfig.test.js.tap +0 -125
  191. package/.tap/test-results/test/internals/logger.test.js.tap +0 -71
  192. package/.tap/test-results/test/internals/plugin.test.js.tap +0 -48
  193. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +0 -166
  194. package/.tap/test-results/test/internals/reply.test.js.tap +0 -688
  195. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +0 -74
  196. package/.tap/test-results/test/internals/request-validate.test.js.tap +0 -384
  197. package/.tap/test-results/test/internals/request.test.js.tap +0 -163
  198. package/.tap/test-results/test/internals/server.test.js.tap +0 -30
  199. package/.tap/test-results/test/internals/validation.test.js.tap +0 -121
  200. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +0 -12
  201. package/.tap/test-results/test/listen.1.test.js.tap +0 -31
  202. package/.tap/test-results/test/listen.2.test.js.tap +0 -46
  203. package/.tap/test-results/test/listen.3.test.js.tap +0 -25
  204. package/.tap/test-results/test/listen.4.test.js.tap +0 -51
  205. package/.tap/test-results/test/lock.test.js.tap +0 -29
  206. package/.tap/test-results/test/logger/instantiation.test.js.tap +0 -92
  207. package/.tap/test-results/test/logger/logging.test.js.tap +0 -117
  208. package/.tap/test-results/test/logger/options.test.js.tap +0 -165
  209. package/.tap/test-results/test/logger/request.test.js.tap +0 -82
  210. package/.tap/test-results/test/logger/response.test.js.tap +0 -38
  211. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +0 -44
  212. package/.tap/test-results/test/method-missing.test.js.tap +0 -8
  213. package/.tap/test-results/test/middleware.test.js.tap +0 -17
  214. package/.tap/test-results/test/mkcalendar.test.js.tap +0 -43
  215. package/.tap/test-results/test/mkcol.test.js.tap +0 -14
  216. package/.tap/test-results/test/move.test.js.tap +0 -15
  217. package/.tap/test-results/test/noop-set.test.js.tap +0 -8
  218. package/.tap/test-results/test/nullable-validation.test.js.tap +0 -36
  219. package/.tap/test-results/test/options.error-handler.test.js.tap +0 -186
  220. package/.tap/test-results/test/options.test.js.tap +0 -174
  221. package/.tap/test-results/test/output-validation.test.js.tap +0 -66
  222. package/.tap/test-results/test/patch.error-handler.test.js.tap +0 -206
  223. package/.tap/test-results/test/patch.test.js.tap +0 -182
  224. package/.tap/test-results/test/plugin.1.test.js.tap +0 -78
  225. package/.tap/test-results/test/plugin.2.test.js.tap +0 -102
  226. package/.tap/test-results/test/plugin.3.test.js.tap +0 -58
  227. package/.tap/test-results/test/plugin.4.test.js.tap +0 -164
  228. package/.tap/test-results/test/post-empty-body.test.js.tap +0 -8
  229. package/.tap/test-results/test/pretty-print.test.js.tap +0 -82
  230. package/.tap/test-results/test/promises.test.js.tap +0 -46
  231. package/.tap/test-results/test/propfind.test.js.tap +0 -43
  232. package/.tap/test-results/test/proppatch.test.js.tap +0 -29
  233. package/.tap/test-results/test/proto-poisoning.test.js.tap +0 -47
  234. package/.tap/test-results/test/put.error-handler.test.js.tap +0 -206
  235. package/.tap/test-results/test/put.test.js.tap +0 -182
  236. package/.tap/test-results/test/register.test.js.tap +0 -61
  237. package/.tap/test-results/test/reply-code.test.js.tap +0 -40
  238. package/.tap/test-results/test/reply-earlyHints.test.js.tap +0 -22
  239. package/.tap/test-results/test/reply-error.test.js.tap +0 -643
  240. package/.tap/test-results/test/reply-trailers.test.js.tap +0 -176
  241. package/.tap/test-results/test/report.test.js.tap +0 -43
  242. package/.tap/test-results/test/request-error.test.js.tap +0 -98
  243. package/.tap/test-results/test/request-id.test.js.tap +0 -38
  244. package/.tap/test-results/test/request.deprecated.test.js.tap +0 -13
  245. package/.tap/test-results/test/requestTimeout.test.js.tap +0 -21
  246. package/.tap/test-results/test/route-hooks.test.js.tap +0 -498
  247. package/.tap/test-results/test/route-prefix.test.js.tap +0 -195
  248. package/.tap/test-results/test/route-shorthand.test.js.tap +0 -190
  249. package/.tap/test-results/test/route.1.test.js.tap +0 -93
  250. package/.tap/test-results/test/route.2.test.js.tap +0 -28
  251. package/.tap/test-results/test/route.3.test.js.tap +0 -39
  252. package/.tap/test-results/test/route.4.test.js.tap +0 -32
  253. package/.tap/test-results/test/route.5.test.js.tap +0 -54
  254. package/.tap/test-results/test/route.6.test.js.tap +0 -81
  255. package/.tap/test-results/test/route.7.test.js.tap +0 -93
  256. package/.tap/test-results/test/route.8.test.js.tap +0 -38
  257. package/.tap/test-results/test/router-options.test.js.tap +0 -104
  258. package/.tap/test-results/test/same-shape.test.js.tap +0 -22
  259. package/.tap/test-results/test/schema-examples.test.js.tap +0 -85
  260. package/.tap/test-results/test/schema-feature.test.js.tap +0 -445
  261. package/.tap/test-results/test/schema-serialization.test.js.tap +0 -194
  262. package/.tap/test-results/test/schema-special-usage.test.js.tap +0 -186
  263. package/.tap/test-results/test/schema-validation.test.js.tap +0 -199
  264. package/.tap/test-results/test/search.test.js.tap +0 -77
  265. package/.tap/test-results/test/serialize-response.test.js.tap +0 -26
  266. package/.tap/test-results/test/server.test.js.tap +0 -65
  267. package/.tap/test-results/test/set-error-handler.test.js.tap +0 -7
  268. package/.tap/test-results/test/skip-reply-send.test.js.tap +0 -272
  269. package/.tap/test-results/test/stream.1.test.js.tap +0 -36
  270. package/.tap/test-results/test/stream.2.test.js.tap +0 -20
  271. package/.tap/test-results/test/stream.3.test.js.tap +0 -34
  272. package/.tap/test-results/test/stream.4.test.js.tap +0 -40
  273. package/.tap/test-results/test/stream.5.test.js.tap +0 -37
  274. package/.tap/test-results/test/sync-routes.test.js.tap +0 -19
  275. package/.tap/test-results/test/throw.test.js.tap +0 -116
  276. package/.tap/test-results/test/trace.test.js.tap +0 -7
  277. package/.tap/test-results/test/trust-proxy.test.js.tap +0 -109
  278. package/.tap/test-results/test/type-provider.test.js.tap +0 -12
  279. package/.tap/test-results/test/unlock.test.js.tap +0 -14
  280. package/.tap/test-results/test/upgrade.test.js.tap +0 -8
  281. package/.tap/test-results/test/url-rewriting.test.js.tap +0 -39
  282. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +0 -33
  283. package/.tap/test-results/test/validation-error-handling.test.js.tap +0 -180
  284. package/.tap/test-results/test/versioned-routes.test.js.tap +0 -151
  285. package/.tap/test-results/test/web-api.test.js.tap +0 -51
  286. package/.tap/test-results/test/wrapThenable.test.js.tap +0 -11
  287. package/EXPENSE_POLICY.md +0 -105
  288. package/lib/httpMethods.js +0 -40
  289. package/test/method-missing.test.js +0 -24
  290. package/test/request.deprecated.test.js +0 -38
@@ -3,7 +3,8 @@
3
3
  const t = require('tap')
4
4
  const sget = require('simple-get').concat
5
5
  const test = t.test
6
- const fastify = require('..')()
6
+ const fastify = require('../../fastify')()
7
+ fastify.addHttpMethod('SEARCH', { hasBody: true })
7
8
 
8
9
  const schema = {
9
10
  response: {
@@ -2,7 +2,8 @@
2
2
 
3
3
  const t = require('tap')
4
4
  const test = t.test
5
- const fastify = require('..')()
5
+ const fastify = require('../../fastify')()
6
+ fastify.addHttpMethod('TRACE')
6
7
 
7
8
  test('shorthand - trace', t => {
8
9
  t.plan(1)
@@ -3,7 +3,8 @@
3
3
  const t = require('tap')
4
4
  const test = t.test
5
5
  const sget = require('simple-get').concat
6
- const fastify = require('..')()
6
+ const fastify = require('../../fastify')()
7
+ fastify.addHttpMethod('UNLOCK')
7
8
 
8
9
  test('can be created - unlock', t => {
9
10
  t.plan(1)
@@ -3,19 +3,19 @@
3
3
  const t = require('tap')
4
4
  const test = t.test
5
5
  const Fastify = require('../..')
6
- const { supportedMethods } = require('../../lib/httpMethods')
7
6
 
8
7
  test('fastify.all should add all the methods to the same url', t => {
8
+ const fastify = Fastify()
9
+
9
10
  const requirePayload = [
10
11
  'POST',
11
12
  'PUT',
12
13
  'PATCH'
13
14
  ]
14
15
 
16
+ const supportedMethods = fastify.supportedMethods
15
17
  t.plan(supportedMethods.length * 2)
16
18
 
17
- const fastify = Fastify()
18
-
19
19
  fastify.all('/', (req, reply) => {
20
20
  reply.send({ method: req.raw.method })
21
21
  })
@@ -136,7 +136,7 @@ test('decorate should recognize getter/setter objects', t => {
136
136
  this._a = val
137
137
  }
138
138
  })
139
- t.equal(Object.prototype.hasOwnProperty.call(one, 'foo'), true)
139
+ t.equal(Object.hasOwn(one, 'foo'), true)
140
140
  t.equal(one.foo, undefined)
141
141
  one.foo = 'a'
142
142
  t.equal(one.foo, 'a')
@@ -152,6 +152,6 @@ test('decorate should recognize getter/setter objects', t => {
152
152
  decorator.add.call(two, 'foo', {
153
153
  getter: () => 'a getter'
154
154
  })
155
- t.equal(Object.prototype.hasOwnProperty.call(two, 'foo'), true)
155
+ t.equal(Object.hasOwn(two, 'foo'), true)
156
156
  t.equal(two.foo, 'a getter')
157
157
  })
@@ -5,7 +5,7 @@ const errors = require('../../lib/errors')
5
5
  const { readFileSync } = require('node:fs')
6
6
  const { resolve } = require('node:path')
7
7
 
8
- test('should expose 84 errors', t => {
8
+ test('should expose 83 errors', t => {
9
9
  t.plan(1)
10
10
  const exportedKeys = Object.keys(errors)
11
11
  let counter = 0
@@ -14,11 +14,11 @@ test('should expose 84 errors', t => {
14
14
  counter++
15
15
  }
16
16
  }
17
- t.equal(counter, 84)
17
+ t.equal(counter, 83)
18
18
  })
19
19
 
20
20
  test('ensure name and codes of Errors are identical', t => {
21
- t.plan(84)
21
+ t.plan(83)
22
22
  const exportedKeys = Object.keys(errors)
23
23
  for (const key of exportedKeys) {
24
24
  if (errors[key].name === 'FastifyError') {
@@ -97,16 +97,6 @@ test('FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_ARR', t => {
97
97
  t.ok(error instanceof TypeError)
98
98
  })
99
99
 
100
- test('FST_ERR_VERSION_CONSTRAINT_NOT_STR', t => {
101
- t.plan(5)
102
- const error = new errors.FST_ERR_VERSION_CONSTRAINT_NOT_STR()
103
- t.equal(error.name, 'FastifyError')
104
- t.equal(error.code, 'FST_ERR_VERSION_CONSTRAINT_NOT_STR')
105
- t.equal(error.message, 'Version constraint should be a string.')
106
- t.equal(error.statusCode, 500)
107
- t.ok(error instanceof TypeError)
108
- })
109
-
110
100
  test('FST_ERR_CTP_ALREADY_PRESENT', t => {
111
101
  t.plan(5)
112
102
  const error = new errors.FST_ERR_CTP_ALREADY_PRESENT()
@@ -878,7 +868,7 @@ test('FST_ERR_ERROR_HANDLER_NOT_FN', t => {
878
868
  })
879
869
 
880
870
  test('Ensure that all errors are in Errors.md TOC', t => {
881
- t.plan(84)
871
+ t.plan(83)
882
872
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
883
873
 
884
874
  const exportedKeys = Object.keys(errors)
@@ -890,7 +880,7 @@ test('Ensure that all errors are in Errors.md TOC', t => {
890
880
  })
891
881
 
892
882
  test('Ensure that non-existing errors are not in Errors.md TOC', t => {
893
- t.plan(84)
883
+ t.plan(83)
894
884
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
895
885
 
896
886
  const matchRE = / {4}- \[([A-Z0-9_]+)\]\(#[a-z0-9_]+\)/g
@@ -903,7 +893,7 @@ test('Ensure that non-existing errors are not in Errors.md TOC', t => {
903
893
  })
904
894
 
905
895
  test('Ensure that all errors are in Errors.md documented', t => {
906
- t.plan(84)
896
+ t.plan(83)
907
897
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
908
898
 
909
899
  const exportedKeys = Object.keys(errors)
@@ -915,7 +905,7 @@ test('Ensure that all errors are in Errors.md documented', t => {
915
905
  })
916
906
 
917
907
  test('Ensure that non-existing errors are not in Errors.md documented', t => {
918
- t.plan(84)
908
+ t.plan(83)
919
909
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
920
910
 
921
911
  const matchRE = /<a id="[0-9a-zA-Z_]+">([0-9a-zA-Z_]+)<\/a>/g
@@ -38,7 +38,6 @@ test('without options passed to Fastify, initialConfig should expose default val
38
38
  caseSensitive: true,
39
39
  allowUnsafeRegex: false,
40
40
  disableRequestLogging: false,
41
- jsonShorthand: true,
42
41
  ignoreTrailingSlash: false,
43
42
  ignoreDuplicateSlashes: false,
44
43
  maxParamLength: 100,
@@ -278,7 +277,6 @@ test('Should not have issues when passing stream options to Pino.js', t => {
278
277
  caseSensitive: true,
279
278
  allowUnsafeRegex: false,
280
279
  disableRequestLogging: false,
281
- jsonShorthand: true,
282
280
  ignoreTrailingSlash: true,
283
281
  ignoreDuplicateSlashes: false,
284
282
  maxParamLength: 100,
@@ -362,35 +360,6 @@ test('deepFreezeObject() should not throw on TypedArray', t => {
362
360
  }
363
361
  })
364
362
 
365
- test('Fastify.initialConfig should accept the deprecated versioning option', t => {
366
- t.plan(1)
367
-
368
- function onWarning (warning) {
369
- t.equal(warning.code, 'FSTDEP009')
370
- }
371
-
372
- process.on('warning', onWarning)
373
-
374
- const versioning = {
375
- storage: function () {
376
- const versions = {}
377
- return {
378
- get: (version) => { return versions[version] || null },
379
- set: (version, store) => { versions[version] = store }
380
- }
381
- },
382
- deriveVersion: (req, ctx) => {
383
- return req.headers.accept
384
- }
385
- }
386
-
387
- Fastify({ versioning })
388
- setImmediate(function () {
389
- process.removeListener('warning', onWarning)
390
- t.end()
391
- })
392
- })
393
-
394
363
  test('pluginTimeout should be parsed correctly', t => {
395
364
  const withDisabledTimeout = Fastify({ pluginTimeout: '0' })
396
365
  t.equal(withDisabledTimeout.initialConfig.pluginTimeout, 0)
@@ -50,8 +50,11 @@ function getResponseSchema () {
50
50
  content: {
51
51
  'application/json': {
52
52
  schema: {
53
- fullName: { type: 'string' },
54
- phone: { type: 'number' }
53
+ type: 'object',
54
+ properties: {
55
+ fullName: { type: 'string' },
56
+ phone: { type: 'number' }
57
+ }
55
58
  }
56
59
  }
57
60
  }
@@ -264,8 +267,11 @@ test('Reply#getSerializationFunction', t => {
264
267
  '/:id',
265
268
  {
266
269
  params: {
267
- id: {
268
- type: 'integer'
270
+ type: 'object',
271
+ properites: {
272
+ id: {
273
+ type: 'integer'
274
+ }
269
275
  }
270
276
  },
271
277
  schema: {
@@ -356,8 +362,11 @@ test('Reply#getSerializationFunction', t => {
356
362
  '/:id',
357
363
  {
358
364
  params: {
359
- id: {
360
- type: 'integer'
365
+ type: 'object',
366
+ properites: {
367
+ id: {
368
+ type: 'integer'
369
+ }
361
370
  }
362
371
  }
363
372
  },
@@ -465,8 +474,11 @@ test('Reply#serializeInput', t => {
465
474
  content: {
466
475
  'application/json': {
467
476
  schema: {
468
- fullName: { type: 'string' },
469
- phone: { type: 'number' }
477
+ type: 'object',
478
+ properites: {
479
+ fullName: { type: 'string' },
480
+ phone: { type: 'number' }
481
+ }
470
482
  }
471
483
  }
472
484
  }
@@ -525,8 +537,11 @@ test('Reply#serializeInput', t => {
525
537
  '/',
526
538
  {
527
539
  params: {
528
- id: {
529
- type: 'integer'
540
+ type: 'object',
541
+ properites: {
542
+ id: {
543
+ type: 'integer'
544
+ }
530
545
  }
531
546
  },
532
547
  schema: {
@@ -5,6 +5,7 @@ const test = t.test
5
5
  const sget = require('simple-get').concat
6
6
  const http = require('node:http')
7
7
  const NotFound = require('http-errors').NotFound
8
+ const Request = require('../../lib/request')
8
9
  const Reply = require('../../lib/reply')
9
10
  const Fastify = require('../..')
10
11
  const { Readable, Writable } = require('node:stream')
@@ -14,12 +15,10 @@ const {
14
15
  kReplySerializer,
15
16
  kReplyIsError,
16
17
  kReplySerializerDefault,
17
- kRouteContext,
18
- kPublicRouteContext
18
+ kRouteContext
19
19
  } = require('../../lib/symbols')
20
20
  const fs = require('node:fs')
21
21
  const path = require('node:path')
22
- const { FSTDEP010, FSTDEP019, FSTDEP021 } = require('../../lib/warnings')
23
22
 
24
23
  const agent = new http.Agent({ keepAlive: false })
25
24
 
@@ -38,8 +37,8 @@ const doGet = function (url) {
38
37
  test('Once called, Reply should return an object with methods', t => {
39
38
  t.plan(15)
40
39
  const response = { res: 'res' }
41
- const context = { config: { onSend: [] }, schema: {} }
42
- const request = { [kRouteContext]: context, [kPublicRouteContext]: { config: context.config, schema: context.schema } }
40
+ const context = { config: { onSend: [] }, schema: {}, _parserOptions: {}, server: { hasConstraintStrategy: () => false, initialConfig: {} } }
41
+ const request = new Request(null, null, null, null, null, context)
43
42
  const reply = new Reply(response, request)
44
43
  t.equal(typeof reply, 'object')
45
44
  t.equal(typeof reply[kReplyIsError], 'boolean')
@@ -52,8 +51,8 @@ test('Once called, Reply should return an object with methods', t => {
52
51
  t.equal(typeof reply[kReplyHeaders], 'object')
53
52
  t.same(reply.raw, response)
54
53
  t.equal(reply[kRouteContext], context)
55
- t.equal(reply[kPublicRouteContext].config, context.config)
56
- t.equal(reply[kPublicRouteContext].schema, context.schema)
54
+ t.equal(reply.routeOptions.config, context.config)
55
+ t.equal(reply.routeOptions.schema, context.schema)
57
56
  t.equal(reply.request, request)
58
57
  // Aim to not bad property keys (including Symbols)
59
58
  t.notOk('undefined' in reply)
@@ -63,7 +62,7 @@ test('reply.send will logStream error and destroy the stream', t => {
63
62
  t.plan(1)
64
63
  let destroyCalled
65
64
  const payload = new Readable({
66
- read () {},
65
+ read () { },
67
66
  destroy (err, cb) {
68
67
  destroyCalled = true
69
68
  cb(err)
@@ -72,16 +71,16 @@ test('reply.send will logStream error and destroy the stream', t => {
72
71
 
73
72
  const response = new Writable()
74
73
  Object.assign(response, {
75
- setHeader: () => {},
74
+ setHeader: () => { },
76
75
  hasHeader: () => false,
77
76
  getHeader: () => undefined,
78
- writeHead: () => {},
79
- write: () => {},
77
+ writeHead: () => { },
78
+ write: () => { },
80
79
  headersSent: true
81
80
  })
82
81
 
83
82
  const log = {
84
- warn: () => {}
83
+ warn: () => { }
85
84
  }
86
85
 
87
86
  const reply = new Reply(response, { [kRouteContext]: { onSend: null } }, log)
@@ -94,12 +93,12 @@ test('reply.send will logStream error and destroy the stream', t => {
94
93
  test('reply.send throw with circular JSON', t => {
95
94
  t.plan(1)
96
95
  const response = {
97
- setHeader: () => {},
96
+ setHeader: () => { },
98
97
  hasHeader: () => false,
99
98
  getHeader: () => undefined,
100
- writeHead: () => {},
101
- write: () => {},
102
- end: () => {}
99
+ writeHead: () => { },
100
+ write: () => { },
101
+ end: () => { }
103
102
  }
104
103
  const reply = new Reply(response, { [kRouteContext]: { onSend: [] } })
105
104
  t.throws(() => {
@@ -112,12 +111,12 @@ test('reply.send throw with circular JSON', t => {
112
111
  test('reply.send returns itself', t => {
113
112
  t.plan(1)
114
113
  const response = {
115
- setHeader: () => {},
114
+ setHeader: () => { },
116
115
  hasHeader: () => false,
117
116
  getHeader: () => undefined,
118
- writeHead: () => {},
119
- write: () => {},
120
- end: () => {}
117
+ writeHead: () => { },
118
+ write: () => { },
119
+ end: () => { }
121
120
  }
122
121
  const reply = new Reply(response, { [kRouteContext]: { onSend: [] } })
123
122
  t.equal(reply.send('hello'), reply)
@@ -1119,7 +1118,7 @@ test('reply.hasHeader returns correct values', t => {
1119
1118
  sget({
1120
1119
  method: 'GET',
1121
1120
  url: 'http://127.0.0.1:' + fastify.server.address().port + '/headers'
1122
- }, () => {})
1121
+ }, () => { })
1123
1122
  })
1124
1123
  })
1125
1124
 
@@ -1151,18 +1150,18 @@ test('reply.getHeader returns correct values', t => {
1151
1150
  sget({
1152
1151
  method: 'GET',
1153
1152
  url: 'http://127.0.0.1:' + fastify.server.address().port + '/headers'
1154
- }, () => {})
1153
+ }, () => { })
1155
1154
  })
1156
1155
  })
1157
1156
 
1158
1157
  test('reply.getHeader returns raw header if there is not in the reply headers', t => {
1159
1158
  t.plan(1)
1160
1159
  const response = {
1161
- setHeader: () => {},
1160
+ setHeader: () => { },
1162
1161
  hasHeader: () => true,
1163
1162
  getHeader: () => 'bar',
1164
- writeHead: () => {},
1165
- end: () => {}
1163
+ writeHead: () => { },
1164
+ end: () => { }
1166
1165
  }
1167
1166
  const reply = new Reply(response, { onSend: [] }, null)
1168
1167
  t.equal(reply.getHeader('foo'), 'bar')
@@ -1461,108 +1460,17 @@ test('reply.header setting multiple cookies as multiple Set-Cookie headers', t =
1461
1460
  })
1462
1461
  })
1463
1462
 
1464
- test('should emit deprecation warning when trying to modify the reply.sent property', t => {
1465
- t.plan(4)
1466
- const fastify = Fastify()
1467
-
1468
- FSTDEP010.emitted = false
1469
-
1470
- process.removeAllListeners('warning')
1471
- process.on('warning', onWarning)
1472
- function onWarning (warning) {
1473
- t.equal(warning.name, 'DeprecationWarning')
1474
- t.equal(warning.code, FSTDEP010.code)
1475
- }
1476
-
1477
- fastify.get('/', (req, reply) => {
1478
- reply.sent = true
1479
-
1480
- reply.raw.end()
1481
- })
1482
-
1483
- fastify.inject('/', (err, res) => {
1484
- t.error(err)
1485
- t.pass()
1486
-
1487
- process.removeListener('warning', onWarning)
1488
- })
1489
- })
1490
-
1491
- test('should emit deprecation warning when trying to use the reply.context.config property', t => {
1492
- t.plan(4)
1493
- const fastify = Fastify()
1494
-
1495
- FSTDEP019.emitted = false
1496
-
1497
- process.removeAllListeners('warning')
1498
- process.on('warning', onWarning)
1499
- function onWarning (warning) {
1500
- t.equal(warning.name, 'DeprecationWarning')
1501
- t.equal(warning.code, FSTDEP019.code)
1502
- }
1503
-
1504
- fastify.get('/', (req, reply) => {
1505
- req.log(reply.context.config)
1506
- })
1507
-
1508
- fastify.inject('/', (err, res) => {
1509
- t.error(err)
1510
- t.pass()
1511
-
1512
- process.removeListener('warning', onWarning)
1513
- })
1514
- })
1515
-
1516
- test('should throw error when passing falsy value to reply.sent', t => {
1517
- t.plan(4)
1518
- const fastify = Fastify()
1519
-
1520
- fastify.get('/', function (req, reply) {
1521
- try {
1522
- reply.sent = false
1523
- } catch (err) {
1524
- t.equal(err.code, 'FST_ERR_REP_SENT_VALUE')
1525
- t.equal(err.message, 'The only possible value for reply.sent is true.')
1526
- reply.send()
1527
- }
1528
- })
1529
-
1530
- fastify.inject('/', (err, res) => {
1531
- t.error(err)
1532
- t.pass()
1533
- })
1534
- })
1535
-
1536
- test('should throw error when attempting to set reply.sent more than once', t => {
1463
+ test('should throw when trying to modify the reply.sent property', t => {
1537
1464
  t.plan(3)
1538
1465
  const fastify = Fastify()
1539
1466
 
1540
1467
  fastify.get('/', function (req, reply) {
1541
- reply.sent = true
1542
1468
  try {
1543
1469
  reply.sent = true
1544
- t.fail('must throw')
1545
1470
  } catch (err) {
1546
- t.equal(err.code, 'FST_ERR_REP_ALREADY_SENT')
1471
+ t.ok(err)
1472
+ reply.send()
1547
1473
  }
1548
- reply.raw.end()
1549
- })
1550
-
1551
- fastify.inject('/', (err, res) => {
1552
- t.error(err)
1553
- t.pass()
1554
- })
1555
- })
1556
-
1557
- test('should not throw error when attempting to set reply.sent if the underlining request was sent', t => {
1558
- t.plan(3)
1559
- const fastify = Fastify()
1560
-
1561
- fastify.get('/', function (req, reply) {
1562
- reply.raw.end()
1563
- t.doesNotThrow(() => {
1564
- reply.sent = true
1565
- })
1566
1474
  })
1567
1475
 
1568
1476
  fastify.inject('/', (err, res) => {
@@ -1843,7 +1751,7 @@ test('cannot set the replySerializer when the server is running', t => {
1843
1751
  fastify.listen({ port: 0 }, err => {
1844
1752
  t.error(err)
1845
1753
  try {
1846
- fastify.setReplySerializer(() => {})
1754
+ fastify.setReplySerializer(() => { })
1847
1755
  t.fail('this serializer should not be setup')
1848
1756
  } catch (e) {
1849
1757
  t.equal(e.code, 'FST_ERR_INSTANCE_ALREADY_LISTENING')
@@ -1893,7 +1801,7 @@ test('reply should not call the custom serializer for errors and not found', t =
1893
1801
  test('reply.then', t => {
1894
1802
  t.plan(4)
1895
1803
 
1896
- function request () {}
1804
+ function request () { }
1897
1805
 
1898
1806
  t.test('without an error', t => {
1899
1807
  t.plan(1)
@@ -2022,36 +1930,6 @@ test('redirect to an invalid URL should not crash the server', async t => {
2022
1930
  await fastify.close()
2023
1931
  })
2024
1932
 
2025
- test('redirect with deprecated signature should warn', t => {
2026
- t.plan(4)
2027
-
2028
- process.removeAllListeners('warning')
2029
- process.on('warning', onWarning)
2030
- function onWarning (warning) {
2031
- t.equal(warning.name, 'DeprecationWarning')
2032
- t.equal(warning.code, FSTDEP021.code)
2033
- }
2034
-
2035
- const fastify = Fastify()
2036
-
2037
- fastify.get('/', (req, reply) => {
2038
- reply.redirect(302, '/new')
2039
- })
2040
-
2041
- fastify.get('/new', (req, reply) => {
2042
- reply.send('new')
2043
- })
2044
-
2045
- fastify.inject({ method: 'GET', url: '/' }, (err, res) => {
2046
- t.error(err)
2047
- t.pass()
2048
-
2049
- process.removeListener('warning', onWarning)
2050
- })
2051
-
2052
- FSTDEP021.emitted = false
2053
- })
2054
-
2055
1933
  test('invalid response headers should not crash the server', async t => {
2056
1934
  const fastify = Fastify()
2057
1935
  fastify.route({
@@ -2153,7 +2031,7 @@ test('reply.send will intercept ERR_HTTP_HEADERS_SENT and log an error message',
2153
2031
 
2154
2032
  const response = new Writable()
2155
2033
  Object.assign(response, {
2156
- setHeader: () => {},
2034
+ setHeader: () => { },
2157
2035
  hasHeader: () => false,
2158
2036
  getHeader: () => undefined,
2159
2037
  writeHead: () => {
@@ -2161,7 +2039,7 @@ test('reply.send will intercept ERR_HTTP_HEADERS_SENT and log an error message',
2161
2039
  err.code = 'ERR_HTTP_HEADERS_SENT'
2162
2040
  throw err
2163
2041
  },
2164
- write: () => {},
2042
+ write: () => { },
2165
2043
  headersSent: true
2166
2044
  })
2167
2045
 
@@ -16,21 +16,30 @@ const defaultSchema = {
16
16
 
17
17
  const requestSchema = {
18
18
  params: {
19
- id: {
20
- type: 'integer',
21
- minimum: 1
19
+ type: 'object',
20
+ properties: {
21
+ id: {
22
+ type: 'integer',
23
+ minimum: 1
24
+ }
22
25
  }
23
26
  },
24
27
  querystring: {
25
- foo: {
26
- type: 'string',
27
- enum: ['bar']
28
+ type: 'object',
29
+ properties: {
30
+ foo: {
31
+ type: 'string',
32
+ enum: ['bar']
33
+ }
28
34
  }
29
35
  },
30
36
  body: defaultSchema,
31
37
  headers: {
32
- 'x-foo': {
33
- type: 'string'
38
+ type: 'object',
39
+ properties: {
40
+ 'x-foo': {
41
+ type: 'string'
42
+ }
34
43
  }
35
44
  }
36
45
  }
@@ -68,7 +77,7 @@ test('#compileValidationSchema', subtest => {
68
77
  const validate = req.compileValidationSchema(defaultSchema)
69
78
 
70
79
  t.ok(validate({ hello: 'world' }))
71
- t.ok(Object.prototype.hasOwnProperty.call(validate, 'errors'))
80
+ t.ok(Object.hasOwn(validate, 'errors'))
72
81
  t.equal(validate.errors, null)
73
82
 
74
83
  reply.send({ hello: 'world' })
@@ -89,7 +98,7 @@ test('#compileValidationSchema', subtest => {
89
98
  const validate = req.compileValidationSchema(defaultSchema)
90
99
 
91
100
  t.notOk(validate({ world: 'foo' }))
92
- t.ok(Object.prototype.hasOwnProperty.call(validate, 'errors'))
101
+ t.ok(Object.hasOwn(validate, 'errors'))
93
102
  t.ok(Array.isArray(validate.errors))
94
103
  t.ok(validate.errors.length > 0)
95
104
 
@@ -281,7 +290,7 @@ test('#getValidationFunction', subtest => {
281
290
  const validate = req.getValidationFunction(defaultSchema)
282
291
 
283
292
  t.ok(validate({ hello: 'world' }))
284
- t.ok(Object.prototype.hasOwnProperty.call(validate, 'errors'))
293
+ t.ok(Object.hasOwn(validate, 'errors'))
285
294
  t.equal(validate.errors, null)
286
295
 
287
296
  reply.send({ hello: 'world' })
@@ -303,7 +312,7 @@ test('#getValidationFunction', subtest => {
303
312
  const validate = req.getValidationFunction(defaultSchema)
304
313
 
305
314
  t.notOk(validate({ world: 'foo' }))
306
- t.ok(Object.prototype.hasOwnProperty.call(validate, 'errors'))
315
+ t.ok(Object.hasOwn(validate, 'errors'))
307
316
  t.ok(Array.isArray(validate.errors))
308
317
  t.ok(validate.errors.length > 0)
309
318