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.
Files changed (328) hide show
  1. package/.markdownlint-cli2.yaml +1 -1
  2. package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +241 -0
  3. package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +268 -0
  4. package/.tap/test-results/test/404s.test.js.tap +623 -0
  5. package/.tap/test-results/test/500s.test.js.tap +64 -0
  6. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +36 -0
  7. package/.tap/test-results/test/als.test.js.tap +15 -0
  8. package/.tap/test-results/test/async-await.test.js.tap +184 -0
  9. package/.tap/test-results/test/async-dispose.test.js.tap +8 -0
  10. package/.tap/test-results/test/async_hooks.test.js.tap +10 -0
  11. package/.tap/test-results/test/bodyLimit.test.js.tap +48 -0
  12. package/.tap/test-results/test/buffer.test.js.tap +20 -0
  13. package/.tap/test-results/test/build/error-serializer.test.js.tap +12 -0
  14. package/.tap/test-results/test/build/version.test.js.tap +7 -0
  15. package/.tap/test-results/test/case-insensitive.test.js.tap +36 -0
  16. package/.tap/test-results/test/chainable.test.js.tap +17 -0
  17. package/.tap/test-results/test/check.test.js.tap +10 -0
  18. package/.tap/test-results/test/childLoggerFactory.test.js.tap +23 -0
  19. package/.tap/test-results/test/client-timeout.test.js.tap +7 -0
  20. package/.tap/test-results/test/close-pipelining.test.js.tap +15 -0
  21. package/.tap/test-results/test/close.test.js.tap +172 -0
  22. package/.tap/test-results/test/connectionTimeout.test.js.tap +12 -0
  23. package/.tap/test-results/test/constrained-routes.test.js.tap +173 -0
  24. package/.tap/test-results/test/content-length.test.js.tap +46 -0
  25. package/.tap/test-results/test/content-parser.test.js.tap +266 -0
  26. package/.tap/test-results/test/content-type.test.js.tap +14 -0
  27. package/.tap/test-results/test/context-config.test.js.tap +41 -0
  28. package/.tap/test-results/test/copy.test.js.tap +14 -0
  29. package/.tap/test-results/test/custom-http-server.test.js.tap +30 -0
  30. package/.tap/test-results/test/custom-parser-async.test.js.tap +21 -0
  31. package/.tap/test-results/test/custom-parser.0.test.js.tap +199 -0
  32. package/.tap/test-results/test/custom-parser.1.test.js.tap +90 -0
  33. package/.tap/test-results/test/custom-parser.2.test.js.tap +22 -0
  34. package/.tap/test-results/test/custom-parser.3.test.js.tap +53 -0
  35. package/.tap/test-results/test/custom-parser.4.test.js.tap +45 -0
  36. package/.tap/test-results/test/custom-parser.5.test.js.tap +41 -0
  37. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +46 -0
  38. package/.tap/test-results/test/decorator.test.js.tap +465 -0
  39. package/.tap/test-results/test/delete.test.js.tap +110 -0
  40. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +15 -0
  41. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +25 -0
  42. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +24 -0
  43. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +9 -0
  44. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +20 -0
  45. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +10 -0
  46. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +14 -0
  47. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +16 -0
  48. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +16 -0
  49. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +19 -0
  50. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +18 -0
  51. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +243 -0
  52. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +9 -0
  53. package/.tap/test-results/test/esm/esm.test.mjs.tap +8 -0
  54. package/.tap/test-results/test/esm/index.test.js.tap +8 -0
  55. package/.tap/test-results/test/fastify-instance.test.js.tap +114 -0
  56. package/.tap/test-results/test/findRoute.test.js.tap +37 -0
  57. package/.tap/test-results/test/fluent-schema.test.js.tap +36 -0
  58. package/.tap/test-results/test/genReqId.test.js.tap +106 -0
  59. package/.tap/test-results/test/get.test.js.tap +151 -0
  60. package/.tap/test-results/test/handler-context.test.js.tap +19 -0
  61. package/.tap/test-results/test/has-route.test.js.tap +30 -0
  62. package/.tap/test-results/test/head.test.js.tap +130 -0
  63. package/.tap/test-results/test/header-overflow.test.js.tap +16 -0
  64. package/.tap/test-results/test/hooks-async.test.js.tap +286 -0
  65. package/.tap/test-results/test/hooks.on-listen.test.js.tap +311 -0
  66. package/.tap/test-results/test/hooks.on-ready.test.js.tap +151 -0
  67. package/.tap/test-results/test/hooks.test.js.tap +966 -0
  68. package/.tap/test-results/test/http2/closing.test.js.tap +35 -0
  69. package/.tap/test-results/test/http2/constraint.test.js.tap +32 -0
  70. package/.tap/test-results/test/http2/head.test.js.tap +9 -0
  71. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +8 -0
  72. package/.tap/test-results/test/http2/plain.test.js.tap +22 -0
  73. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +40 -0
  74. package/.tap/test-results/test/http2/secure.test.js.tap +27 -0
  75. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +9 -0
  76. package/.tap/test-results/test/https/custom-https-server.test.js.tap +10 -0
  77. package/.tap/test-results/test/https/https.test.js.tap +45 -0
  78. package/.tap/test-results/test/imports.test.js.tap +14 -0
  79. package/.tap/test-results/test/inject.test.js.tap +165 -0
  80. package/.tap/test-results/test/internals/all.test.js.tap +42 -0
  81. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +14 -0
  82. package/.tap/test-results/test/internals/context.test.js.tap +14 -0
  83. package/.tap/test-results/test/internals/decorator.test.js.tap +51 -0
  84. package/.tap/test-results/test/internals/errors.test.js.tap +1212 -0
  85. package/.tap/test-results/test/internals/handleRequest.test.js.tap +69 -0
  86. package/.tap/test-results/test/internals/hookRunner.test.js.tap +143 -0
  87. package/.tap/test-results/test/internals/hooks.test.js.tap +45 -0
  88. package/.tap/test-results/test/internals/initialConfig.test.js.tap +125 -0
  89. package/.tap/test-results/test/internals/logger.test.js.tap +71 -0
  90. package/.tap/test-results/test/internals/plugin.test.js.tap +48 -0
  91. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +166 -0
  92. package/.tap/test-results/test/internals/reply.test.js.tap +688 -0
  93. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +74 -0
  94. package/.tap/test-results/test/internals/request-validate.test.js.tap +384 -0
  95. package/.tap/test-results/test/internals/request.test.js.tap +163 -0
  96. package/.tap/test-results/test/internals/server.test.js.tap +30 -0
  97. package/.tap/test-results/test/internals/validation.test.js.tap +121 -0
  98. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +12 -0
  99. package/.tap/test-results/test/listen.1.test.js.tap +31 -0
  100. package/.tap/test-results/test/listen.2.test.js.tap +46 -0
  101. package/.tap/test-results/test/listen.3.test.js.tap +25 -0
  102. package/.tap/test-results/test/listen.4.test.js.tap +51 -0
  103. package/.tap/test-results/test/lock.test.js.tap +29 -0
  104. package/.tap/test-results/test/logger/instantiation.test.js.tap +92 -0
  105. package/.tap/test-results/test/logger/logging.test.js.tap +117 -0
  106. package/.tap/test-results/test/logger/options.test.js.tap +165 -0
  107. package/.tap/test-results/test/logger/request.test.js.tap +82 -0
  108. package/.tap/test-results/test/logger/response.test.js.tap +38 -0
  109. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +44 -0
  110. package/.tap/test-results/test/method-missing.test.js.tap +8 -0
  111. package/.tap/test-results/test/middleware.test.js.tap +17 -0
  112. package/.tap/test-results/test/mkcalendar.test.js.tap +43 -0
  113. package/.tap/test-results/test/mkcol.test.js.tap +14 -0
  114. package/.tap/test-results/test/move.test.js.tap +15 -0
  115. package/.tap/test-results/test/noop-set.test.js.tap +8 -0
  116. package/.tap/test-results/test/nullable-validation.test.js.tap +36 -0
  117. package/.tap/test-results/test/options.error-handler.test.js.tap +186 -0
  118. package/.tap/test-results/test/options.test.js.tap +174 -0
  119. package/.tap/test-results/test/output-validation.test.js.tap +66 -0
  120. package/.tap/test-results/test/patch.error-handler.test.js.tap +206 -0
  121. package/.tap/test-results/test/patch.test.js.tap +182 -0
  122. package/.tap/test-results/test/plugin.1.test.js.tap +78 -0
  123. package/.tap/test-results/test/plugin.2.test.js.tap +102 -0
  124. package/.tap/test-results/test/plugin.3.test.js.tap +58 -0
  125. package/.tap/test-results/test/plugin.4.test.js.tap +164 -0
  126. package/.tap/test-results/test/post-empty-body.test.js.tap +8 -0
  127. package/.tap/test-results/test/pretty-print.test.js.tap +82 -0
  128. package/.tap/test-results/test/promises.test.js.tap +46 -0
  129. package/.tap/test-results/test/propfind.test.js.tap +43 -0
  130. package/.tap/test-results/test/proppatch.test.js.tap +29 -0
  131. package/.tap/test-results/test/proto-poisoning.test.js.tap +47 -0
  132. package/.tap/test-results/test/put.error-handler.test.js.tap +206 -0
  133. package/.tap/test-results/test/put.test.js.tap +182 -0
  134. package/.tap/test-results/test/register.test.js.tap +61 -0
  135. package/.tap/test-results/test/reply-code.test.js.tap +40 -0
  136. package/.tap/test-results/test/reply-earlyHints.test.js.tap +22 -0
  137. package/.tap/test-results/test/reply-error.test.js.tap +643 -0
  138. package/.tap/test-results/test/reply-trailers.test.js.tap +176 -0
  139. package/.tap/test-results/test/report.test.js.tap +43 -0
  140. package/.tap/test-results/test/request-error.test.js.tap +98 -0
  141. package/.tap/test-results/test/request-id.test.js.tap +38 -0
  142. package/.tap/test-results/test/request.deprecated.test.js.tap +13 -0
  143. package/.tap/test-results/test/requestTimeout.test.js.tap +21 -0
  144. package/.tap/test-results/test/route-hooks.test.js.tap +498 -0
  145. package/.tap/test-results/test/route-prefix.test.js.tap +195 -0
  146. package/.tap/test-results/test/route-shorthand.test.js.tap +190 -0
  147. package/.tap/test-results/test/route.1.test.js.tap +93 -0
  148. package/.tap/test-results/test/route.2.test.js.tap +28 -0
  149. package/.tap/test-results/test/route.3.test.js.tap +39 -0
  150. package/.tap/test-results/test/route.4.test.js.tap +32 -0
  151. package/.tap/test-results/test/route.5.test.js.tap +54 -0
  152. package/.tap/test-results/test/route.6.test.js.tap +81 -0
  153. package/.tap/test-results/test/route.7.test.js.tap +93 -0
  154. package/.tap/test-results/test/route.8.test.js.tap +38 -0
  155. package/.tap/test-results/test/router-options.test.js.tap +104 -0
  156. package/.tap/test-results/test/same-shape.test.js.tap +22 -0
  157. package/.tap/test-results/test/schema-examples.test.js.tap +85 -0
  158. package/.tap/test-results/test/schema-feature.test.js.tap +445 -0
  159. package/.tap/test-results/test/schema-serialization.test.js.tap +194 -0
  160. package/.tap/test-results/test/schema-special-usage.test.js.tap +186 -0
  161. package/.tap/test-results/test/schema-validation.test.js.tap +199 -0
  162. package/.tap/test-results/test/search.test.js.tap +77 -0
  163. package/.tap/test-results/test/serialize-response.test.js.tap +26 -0
  164. package/.tap/test-results/test/server.test.js.tap +65 -0
  165. package/.tap/test-results/test/set-error-handler.test.js.tap +7 -0
  166. package/.tap/test-results/test/skip-reply-send.test.js.tap +272 -0
  167. package/.tap/test-results/test/stream.1.test.js.tap +36 -0
  168. package/.tap/test-results/test/stream.2.test.js.tap +20 -0
  169. package/.tap/test-results/test/stream.3.test.js.tap +34 -0
  170. package/.tap/test-results/test/stream.4.test.js.tap +40 -0
  171. package/.tap/test-results/test/stream.5.test.js.tap +37 -0
  172. package/.tap/test-results/test/sync-routes.test.js.tap +19 -0
  173. package/.tap/test-results/test/throw.test.js.tap +116 -0
  174. package/.tap/test-results/test/trace.test.js.tap +7 -0
  175. package/.tap/test-results/test/trust-proxy.test.js.tap +109 -0
  176. package/.tap/test-results/test/type-provider.test.js.tap +12 -0
  177. package/.tap/test-results/test/unlock.test.js.tap +14 -0
  178. package/.tap/test-results/test/upgrade.test.js.tap +8 -0
  179. package/.tap/test-results/test/url-rewriting.test.js.tap +39 -0
  180. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +33 -0
  181. package/.tap/test-results/test/validation-error-handling.test.js.tap +180 -0
  182. package/.tap/test-results/test/versioned-routes.test.js.tap +151 -0
  183. package/.tap/test-results/test/web-api.test.js.tap +51 -0
  184. package/.tap/test-results/test/wrapThenable.test.js.tap +11 -0
  185. package/.taprc +4 -8
  186. package/README.md +3 -6
  187. package/build/build-error-serializer.js +4 -1
  188. package/build/build-validation.js +5 -4
  189. package/docs/Guides/Database.md +1 -1
  190. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  191. package/docs/Guides/Ecosystem.md +2 -0
  192. package/docs/Guides/Migration-Guide-V5.md +20 -0
  193. package/docs/Guides/Write-Type-Provider.md +4 -2
  194. package/docs/Reference/ContentTypeParser.md +30 -1
  195. package/docs/Reference/Decorators.md +42 -16
  196. package/docs/Reference/Errors.md +10 -2
  197. package/docs/Reference/Hooks.md +48 -14
  198. package/docs/Reference/Logging.md +5 -5
  199. package/docs/Reference/Reply.md +29 -24
  200. package/docs/Reference/Request.md +5 -1
  201. package/docs/Reference/Routes.md +24 -28
  202. package/docs/Reference/Server.md +14 -53
  203. package/docs/Reference/Type-Providers.md +21 -26
  204. package/docs/Reference/TypeScript.md +46 -29
  205. package/docs/Reference/Warnings.md +2 -8
  206. package/eslint.config.js +27 -0
  207. package/examples/typescript-server.ts +14 -14
  208. package/fastify.d.ts +15 -14
  209. package/fastify.js +41 -15
  210. package/lib/configValidator.js +94 -76
  211. package/lib/contentTypeParser.js +54 -88
  212. package/lib/decorate.js +3 -7
  213. package/lib/error-serializer.js +77 -19
  214. package/lib/errors.js +31 -6
  215. package/lib/handleRequest.js +70 -39
  216. package/lib/httpMethods.js +34 -18
  217. package/lib/logger.js +24 -6
  218. package/lib/pluginUtils.js +5 -5
  219. package/lib/reply.js +16 -13
  220. package/lib/request.js +37 -19
  221. package/lib/route.js +7 -31
  222. package/lib/server.js +62 -123
  223. package/lib/warnings.js +28 -27
  224. package/lib/wrapThenable.js +46 -22
  225. package/package.json +38 -58
  226. package/test/404s.test.js +8 -12
  227. package/test/async-await.test.js +46 -2
  228. package/test/build/error-serializer.test.js +4 -2
  229. package/test/check.test.js +225 -0
  230. package/test/close-pipelining.test.js +2 -34
  231. package/test/close.test.js +1 -41
  232. package/test/content-parser.test.js +69 -117
  233. package/test/custom-parser.1.test.js +40 -1
  234. package/test/decorator-namespace.test._js_ +31 -0
  235. package/test/decorator.test.js +92 -43
  236. package/test/delete.test.js +21 -1
  237. package/test/diagnostics-channel/404.test.js +57 -0
  238. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  239. package/test/diagnostics-channel/async-request.test.js +72 -0
  240. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  241. package/test/diagnostics-channel/error-request.test.js +61 -0
  242. package/test/diagnostics-channel/error-status.test.js +39 -0
  243. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  244. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  245. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  246. package/test/diagnostics-channel/sync-request.test.js +61 -0
  247. package/test/encapsulated-error-handler.test.js +201 -14
  248. package/test/esm/index.test.js +2 -12
  249. package/test/findRoute.test.js +16 -0
  250. package/test/genReqId.test.js +9 -0
  251. package/test/get.test.js +28 -0
  252. package/test/has-route.test.js +18 -2
  253. package/test/helper.js +1 -5
  254. package/test/hooks.test.js +0 -4
  255. package/test/http2/constraint.test.js +22 -1
  256. package/test/http2/plain.test.js +21 -6
  257. package/test/http2/secure.test.js +12 -1
  258. package/test/https/https.test.js +57 -0
  259. package/test/inject.test.js +1 -2
  260. package/test/internals/decorator.test.js +0 -2
  261. package/test/internals/errors.test.js +57 -17
  262. package/test/internals/handleRequest.test.js +5 -1
  263. package/test/internals/initialConfig.test.js +5 -5
  264. package/test/internals/logger.test.js +31 -2
  265. package/test/internals/reply.test.js +38 -80
  266. package/test/internals/request.test.js +13 -11
  267. package/test/listen.1.test.js +5 -15
  268. package/test/listen.5.test.js +88 -0
  269. package/test/logger/instantiation.test.js +8 -8
  270. package/test/logger/logging.test.js +4 -4
  271. package/test/logger/options.test.js +102 -21
  272. package/test/logger/response.test.js +6 -6
  273. package/test/maxRequestsPerSocket.test.js +2 -5
  274. package/test/method-missing.test.js +24 -0
  275. package/test/plugin.1.test.js +2 -4
  276. package/test/plugin.2.test.js +0 -2
  277. package/test/plugin.3.test.js +0 -2
  278. package/test/plugin.4.test.js +92 -56
  279. package/test/register.test.js +2 -4
  280. package/test/reply-earlyHints.test.js +98 -0
  281. package/test/reply-error.test.js +0 -2
  282. package/test/route-hooks.test.js +0 -1
  283. package/test/route-shorthand.test.js +60 -0
  284. package/test/schema-special-usage.test.js +1 -1
  285. package/test/server.test.js +17 -2
  286. package/test/stream.2.test.js +1 -1
  287. package/test/stream.4.test.js +0 -42
  288. package/test/stream.5.test.js +2 -2
  289. package/test/trust-proxy.test.js +33 -27
  290. package/test/types/errors.test-d.ts +0 -2
  291. package/test/types/fastify.test-d.ts +14 -12
  292. package/test/types/hooks.test-d.ts +1 -0
  293. package/test/types/import.ts +1 -0
  294. package/test/types/instance.test-d.ts +10 -51
  295. package/test/types/logger.test-d.ts +43 -6
  296. package/test/types/plugin.test-d.ts +5 -2
  297. package/test/types/register.test-d.ts +2 -2
  298. package/test/types/reply.test-d.ts +13 -12
  299. package/test/types/request.test-d.ts +19 -8
  300. package/test/types/route.test-d.ts +30 -2
  301. package/test/types/schema.test-d.ts +2 -2
  302. package/test/types/serverFactory.test-d.ts +1 -1
  303. package/test/types/type-provider.test-d.ts +60 -13
  304. package/test/types/using.test-d.ts +4 -1
  305. package/test/url-rewriting.test.js +3 -2
  306. package/test/useSemicolonDelimiter.test.js +3 -6
  307. package/test/versioned-routes.test.js +1 -1
  308. package/test/web-api.test.js +0 -6
  309. package/types/content-type-parser.d.ts +3 -3
  310. package/types/context.d.ts +0 -1
  311. package/types/errors.d.ts +1 -0
  312. package/types/hooks.d.ts +6 -6
  313. package/types/instance.d.ts +28 -41
  314. package/types/logger.d.ts +3 -3
  315. package/types/plugin.d.ts +3 -3
  316. package/types/reply.d.ts +13 -14
  317. package/types/request.d.ts +5 -3
  318. package/types/route.d.ts +29 -29
  319. package/types/schema.d.ts +3 -3
  320. package/types/serverFactory.d.ts +2 -2
  321. package/types/type-provider.d.ts +22 -12
  322. package/types/utils.d.ts +18 -18
  323. package/.c8rc.json +0 -8
  324. package/.eslintrc +0 -4
  325. package/test/default-route.test.js +0 -88
  326. package/test/listen.deprecated.test.js +0 -229
  327. package/test/unsupported-httpversion.test.js +0 -31
  328. 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 FSTDEP020 = createDeprecation({
81
- code: 'FSTDEP020',
82
- message: 'You are using the deprecated "reply.getResponseTime()" method. Use the "reply.elapsedTime" property instead. Method "reply.getResponseTime()" will be removed in `fastify@5`.'
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 FSTWRN002 = createWarning({
93
- name: 'FastifyWarning',
94
- code: 'FSTWRN002',
95
- message: 'The %s plugin being registered mixes async and callback styles, which will result in an error in `fastify@5`',
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
- FSTDEP020,
116
+ FSTDEP021,
116
117
  FSTWRN001,
117
- FSTWRN002
118
+ FSTSEC001
118
119
  }
@@ -5,44 +5,68 @@ const {
5
5
  kReplyHijacked
6
6
  } = require('./symbols')
7
7
 
8
- function wrapThenable (thenable, reply) {
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
- // this is for async functions that are using reply.send directly
15
- //
16
- // since wrap-thenable will be called when using reply.send directly
17
- // without actual return. the response can be sent already or
18
- // the request may be terminated during the reply. in this situation,
19
- // it require an extra checking of request.aborted to see whether
20
- // the request is killed by client.
21
- if (payload !== undefined || (reply.sent === false && reply.raw.headersSent === false && reply.request.raw.aborted === false)) {
22
- // we use a try-catch internally to avoid adding a catch to another
23
- // promise, increase promise perf by 10%
24
- try {
25
- reply.send(payload)
26
- } catch (err) {
27
- reply[kReplyIsError] = true
28
- reply.send(err)
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 (reply.sent === true) {
33
- reply.log.error({ err }, 'Promise errored, but reply.sent = true was set')
34
- return
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": "4.27.0",
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": "c8 --reporter=lcov tap --coverage-report=html --no-browser --no-check-coverage",
15
- "coverage:ci-check-coverage": "c8 check-coverage --branches 100 --functions 100 --lines 100 --statements 100",
16
- "lint": "npm run lint:standard && npm run lint:typescript && npm run lint:markdown",
17
- "lint:fix": "standard --fix && npm run lint:typescript: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:standard": "standard | snazzy",
20
- "lint:typescript": "eslint -c types/.eslintrc.json types/**/*.d.ts test/types/**/*.test-d.ts",
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 -- --cov --coverage-report=lcovonly && npm run test:typescript",
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 --cov --no-coverage-report --reporter=terse",
29
- "unit": "c8 tap",
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 --cov --coverage-report=html --coverage-report=cobertura | tee out.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.2",
157
- "@sinclair/typebox": "^0.31.17",
158
- "@sinonjs/fake-timers": "^11.1.0",
159
- "@types/node": "^20.8.4",
160
- "@typescript-eslint/eslint-plugin": "^6.7.5",
161
- "@typescript-eslint/parser": "^6.7.5",
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": "^2.1.1",
162
+ "ajv-formats": "^3.0.1",
165
163
  "ajv-i18n": "^4.2.0",
166
164
  "ajv-merge-patch": "^5.0.1",
167
- "autocannon": "^7.14.0",
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": "^8.51.0",
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.2",
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.11.0",
185
- "json-schema-to-ts": "^2.9.2",
175
+ "joi": "^17.12.3",
176
+ "json-schema-to-ts": "^3.0.1",
186
177
  "JSONStream": "^1.3.5",
187
- "markdownlint-cli2": "^0.10.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
- "standard": "^17.1.0",
195
- "tap": "^16.3.9",
196
- "tsd": "^0.29.0",
197
- "typescript": "^5.2.2",
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.3.2"
190
+ "yup": "^1.4.0"
201
191
  },
202
192
  "dependencies": {
203
193
  "@fastify/ajv-compiler": "^3.5.0",
204
- "@fastify/error": "^3.4.0",
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
- "fast-content-type-parse": "^1.1.0",
209
- "fast-json-stringify": "^5.8.0",
210
- "find-my-way": "^8.0.0",
211
- "light-my-request": "^5.11.0",
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.0",
205
+ "rfdc": "^1.3.1",
216
206
  "secure-json-parse": "^2.7.0",
217
- "semver": "^7.5.4",
218
- "toad-cache": "^3.3.0"
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.append('test-field', 'just some field')
72
+ const form = new FormData()
73
+ form.set('test-field', 'just some field')
75
74
 
76
- sget({
75
+ const response = await fetch(getServerUrl(fastify) + '/notSupported', {
77
76
  method: 'POST',
78
- url: getServerUrl(fastify) + '/notSupported',
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
  })
@@ -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(11)
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 { default: standard } = await import('standard')
19
- const result = await standard.lintText(code)
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