node-fastify 5.8.3

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 (354) hide show
  1. package/.borp.yaml +3 -0
  2. package/.markdownlint-cli2.yaml +22 -0
  3. package/.prettierignore +1 -0
  4. package/GOVERNANCE.md +4 -0
  5. package/LICENSE +21 -0
  6. package/PROJECT_CHARTER.md +126 -0
  7. package/README.md +423 -0
  8. package/SECURITY.md +220 -0
  9. package/SPONSORS.md +24 -0
  10. package/build/build-error-serializer.js +35 -0
  11. package/build/build-validation.js +169 -0
  12. package/build/sync-version.js +11 -0
  13. package/docs/Guides/Benchmarking.md +60 -0
  14. package/docs/Guides/Database.md +321 -0
  15. package/docs/Guides/Delay-Accepting-Requests.md +608 -0
  16. package/docs/Guides/Detecting-When-Clients-Abort.md +172 -0
  17. package/docs/Guides/Ecosystem.md +726 -0
  18. package/docs/Guides/Fluent-Schema.md +127 -0
  19. package/docs/Guides/Getting-Started.md +620 -0
  20. package/docs/Guides/Index.md +43 -0
  21. package/docs/Guides/Migration-Guide-V3.md +287 -0
  22. package/docs/Guides/Migration-Guide-V4.md +267 -0
  23. package/docs/Guides/Migration-Guide-V5.md +727 -0
  24. package/docs/Guides/Plugins-Guide.md +520 -0
  25. package/docs/Guides/Prototype-Poisoning.md +383 -0
  26. package/docs/Guides/Recommendations.md +378 -0
  27. package/docs/Guides/Serverless.md +604 -0
  28. package/docs/Guides/Style-Guide.md +246 -0
  29. package/docs/Guides/Testing.md +481 -0
  30. package/docs/Guides/Write-Plugin.md +103 -0
  31. package/docs/Guides/Write-Type-Provider.md +34 -0
  32. package/docs/Reference/ContentTypeParser.md +271 -0
  33. package/docs/Reference/Decorators.md +436 -0
  34. package/docs/Reference/Encapsulation.md +194 -0
  35. package/docs/Reference/Errors.md +377 -0
  36. package/docs/Reference/HTTP2.md +94 -0
  37. package/docs/Reference/Hooks.md +958 -0
  38. package/docs/Reference/Index.md +73 -0
  39. package/docs/Reference/LTS.md +86 -0
  40. package/docs/Reference/Lifecycle.md +99 -0
  41. package/docs/Reference/Logging.md +268 -0
  42. package/docs/Reference/Middleware.md +79 -0
  43. package/docs/Reference/Plugins.md +245 -0
  44. package/docs/Reference/Principles.md +73 -0
  45. package/docs/Reference/Reply.md +1001 -0
  46. package/docs/Reference/Request.md +295 -0
  47. package/docs/Reference/Routes.md +802 -0
  48. package/docs/Reference/Server.md +2389 -0
  49. package/docs/Reference/Type-Providers.md +256 -0
  50. package/docs/Reference/TypeScript.md +1729 -0
  51. package/docs/Reference/Validation-and-Serialization.md +1130 -0
  52. package/docs/Reference/Warnings.md +58 -0
  53. package/docs/index.md +24 -0
  54. package/docs/resources/encapsulation_context.drawio +1 -0
  55. package/docs/resources/encapsulation_context.svg +3 -0
  56. package/eslint.config.js +35 -0
  57. package/examples/asyncawait.js +38 -0
  58. package/examples/benchmark/body.json +3 -0
  59. package/examples/benchmark/hooks-benchmark-async-await.js +44 -0
  60. package/examples/benchmark/hooks-benchmark.js +52 -0
  61. package/examples/benchmark/parser.js +47 -0
  62. package/examples/benchmark/simple.js +30 -0
  63. package/examples/benchmark/webstream.js +27 -0
  64. package/examples/hooks.js +91 -0
  65. package/examples/http2.js +39 -0
  66. package/examples/https.js +38 -0
  67. package/examples/parser.js +53 -0
  68. package/examples/plugin.js +12 -0
  69. package/examples/route-prefix.js +38 -0
  70. package/examples/shared-schema.js +38 -0
  71. package/examples/simple-stream.js +20 -0
  72. package/examples/simple.js +32 -0
  73. package/examples/simple.mjs +27 -0
  74. package/examples/typescript-server.ts +79 -0
  75. package/examples/use-plugin.js +29 -0
  76. package/fastify.d.ts +253 -0
  77. package/fastify.js +985 -0
  78. package/integration/server.js +29 -0
  79. package/integration/test.sh +23 -0
  80. package/lib/config-validator.js +1266 -0
  81. package/lib/content-type-parser.js +413 -0
  82. package/lib/content-type.js +160 -0
  83. package/lib/context.js +98 -0
  84. package/lib/decorate.js +152 -0
  85. package/lib/error-handler.js +173 -0
  86. package/lib/error-serializer.js +134 -0
  87. package/lib/error-status.js +14 -0
  88. package/lib/errors.js +516 -0
  89. package/lib/four-oh-four.js +190 -0
  90. package/lib/handle-request.js +195 -0
  91. package/lib/head-route.js +45 -0
  92. package/lib/hooks.js +429 -0
  93. package/lib/initial-config-validation.js +37 -0
  94. package/lib/logger-factory.js +136 -0
  95. package/lib/logger-pino.js +68 -0
  96. package/lib/noop-set.js +10 -0
  97. package/lib/plugin-override.js +90 -0
  98. package/lib/plugin-utils.js +169 -0
  99. package/lib/promise.js +23 -0
  100. package/lib/reply.js +1030 -0
  101. package/lib/req-id-gen-factory.js +52 -0
  102. package/lib/request.js +391 -0
  103. package/lib/route.js +686 -0
  104. package/lib/schema-controller.js +164 -0
  105. package/lib/schemas.js +207 -0
  106. package/lib/server.js +441 -0
  107. package/lib/symbols.js +71 -0
  108. package/lib/validation.js +280 -0
  109. package/lib/warnings.js +57 -0
  110. package/lib/wrap-thenable.js +84 -0
  111. package/package.json +225 -0
  112. package/scripts/validate-ecosystem-links.js +179 -0
  113. package/test/404s.test.js +2035 -0
  114. package/test/500s.test.js +422 -0
  115. package/test/allow-unsafe-regex.test.js +92 -0
  116. package/test/als.test.js +65 -0
  117. package/test/async-await.test.js +705 -0
  118. package/test/async-dispose.test.js +20 -0
  119. package/test/async_hooks.test.js +52 -0
  120. package/test/body-limit.test.js +224 -0
  121. package/test/buffer.test.js +74 -0
  122. package/test/build/error-serializer.test.js +36 -0
  123. package/test/build/version.test.js +14 -0
  124. package/test/build-certificate.js +109 -0
  125. package/test/bundler/README.md +29 -0
  126. package/test/bundler/esbuild/bundler-test.js +32 -0
  127. package/test/bundler/esbuild/package.json +10 -0
  128. package/test/bundler/esbuild/src/fail-plugin-version.js +14 -0
  129. package/test/bundler/esbuild/src/index.js +9 -0
  130. package/test/bundler/webpack/bundler-test.js +32 -0
  131. package/test/bundler/webpack/package.json +11 -0
  132. package/test/bundler/webpack/src/fail-plugin-version.js +14 -0
  133. package/test/bundler/webpack/src/index.js +9 -0
  134. package/test/bundler/webpack/webpack.config.js +15 -0
  135. package/test/case-insensitive.test.js +102 -0
  136. package/test/chainable.test.js +40 -0
  137. package/test/child-logger-factory.test.js +128 -0
  138. package/test/client-timeout.test.js +38 -0
  139. package/test/close-pipelining.test.js +78 -0
  140. package/test/close.test.js +706 -0
  141. package/test/conditional-pino.test.js +47 -0
  142. package/test/connection-timeout.test.js +42 -0
  143. package/test/constrained-routes.test.js +1138 -0
  144. package/test/content-length.test.js +174 -0
  145. package/test/content-parser.test.js +739 -0
  146. package/test/content-type.test.js +181 -0
  147. package/test/context-config.test.js +164 -0
  148. package/test/custom-http-server.test.js +118 -0
  149. package/test/custom-parser-async.test.js +59 -0
  150. package/test/custom-parser.0.test.js +701 -0
  151. package/test/custom-parser.1.test.js +266 -0
  152. package/test/custom-parser.2.test.js +91 -0
  153. package/test/custom-parser.3.test.js +208 -0
  154. package/test/custom-parser.4.test.js +218 -0
  155. package/test/custom-parser.5.test.js +130 -0
  156. package/test/custom-querystring-parser.test.js +129 -0
  157. package/test/decorator.test.js +1330 -0
  158. package/test/delete.test.js +344 -0
  159. package/test/diagnostics-channel/404.test.js +49 -0
  160. package/test/diagnostics-channel/async-delay-request.test.js +65 -0
  161. package/test/diagnostics-channel/async-request.test.js +64 -0
  162. package/test/diagnostics-channel/error-before-handler.test.js +35 -0
  163. package/test/diagnostics-channel/error-request.test.js +53 -0
  164. package/test/diagnostics-channel/error-status.test.js +123 -0
  165. package/test/diagnostics-channel/init.test.js +50 -0
  166. package/test/diagnostics-channel/sync-delay-request.test.js +49 -0
  167. package/test/diagnostics-channel/sync-request-reply.test.js +51 -0
  168. package/test/diagnostics-channel/sync-request.test.js +54 -0
  169. package/test/encapsulated-child-logger-factory.test.js +69 -0
  170. package/test/encapsulated-error-handler.test.js +237 -0
  171. package/test/esm/errorCodes.test.mjs +10 -0
  172. package/test/esm/esm.test.mjs +13 -0
  173. package/test/esm/index.test.js +8 -0
  174. package/test/esm/named-exports.mjs +14 -0
  175. package/test/esm/other.mjs +8 -0
  176. package/test/esm/plugin.mjs +8 -0
  177. package/test/fastify-instance.test.js +300 -0
  178. package/test/find-route.test.js +152 -0
  179. package/test/fluent-schema.test.js +209 -0
  180. package/test/genReqId.test.js +426 -0
  181. package/test/handler-context.test.js +45 -0
  182. package/test/handler-timeout.test.js +367 -0
  183. package/test/has-route.test.js +88 -0
  184. package/test/header-overflow.test.js +55 -0
  185. package/test/helper.js +496 -0
  186. package/test/hooks-async.test.js +1099 -0
  187. package/test/hooks.on-listen.test.js +1162 -0
  188. package/test/hooks.on-ready.test.js +421 -0
  189. package/test/hooks.test.js +3578 -0
  190. package/test/http-methods/copy.test.js +35 -0
  191. package/test/http-methods/custom-http-methods.test.js +114 -0
  192. package/test/http-methods/get.test.js +412 -0
  193. package/test/http-methods/head.test.js +263 -0
  194. package/test/http-methods/lock.test.js +108 -0
  195. package/test/http-methods/mkcalendar.test.js +143 -0
  196. package/test/http-methods/mkcol.test.js +35 -0
  197. package/test/http-methods/move.test.js +42 -0
  198. package/test/http-methods/propfind.test.js +136 -0
  199. package/test/http-methods/proppatch.test.js +105 -0
  200. package/test/http-methods/report.test.js +142 -0
  201. package/test/http-methods/search.test.js +233 -0
  202. package/test/http-methods/trace.test.js +21 -0
  203. package/test/http-methods/unlock.test.js +38 -0
  204. package/test/http2/closing.test.js +270 -0
  205. package/test/http2/constraint.test.js +109 -0
  206. package/test/http2/head.test.js +34 -0
  207. package/test/http2/plain.test.js +68 -0
  208. package/test/http2/secure-with-fallback.test.js +113 -0
  209. package/test/http2/secure.test.js +67 -0
  210. package/test/http2/unknown-http-method.test.js +34 -0
  211. package/test/https/custom-https-server.test.js +58 -0
  212. package/test/https/https.test.js +136 -0
  213. package/test/imports.test.js +17 -0
  214. package/test/inject.test.js +502 -0
  215. package/test/input-validation.js +335 -0
  216. package/test/internals/all.test.js +38 -0
  217. package/test/internals/content-type-parser.test.js +111 -0
  218. package/test/internals/context.test.js +31 -0
  219. package/test/internals/decorator.test.js +156 -0
  220. package/test/internals/errors.test.js +982 -0
  221. package/test/internals/handle-request.test.js +270 -0
  222. package/test/internals/hook-runner.test.js +449 -0
  223. package/test/internals/hooks.test.js +96 -0
  224. package/test/internals/initial-config.test.js +383 -0
  225. package/test/internals/logger.test.js +163 -0
  226. package/test/internals/plugin.test.js +170 -0
  227. package/test/internals/promise.test.js +63 -0
  228. package/test/internals/reply-serialize.test.js +714 -0
  229. package/test/internals/reply.test.js +1920 -0
  230. package/test/internals/req-id-gen-factory.test.js +133 -0
  231. package/test/internals/request-validate.test.js +1402 -0
  232. package/test/internals/request.test.js +506 -0
  233. package/test/internals/schema-controller-perf.test.js +40 -0
  234. package/test/internals/server.test.js +91 -0
  235. package/test/internals/validation.test.js +352 -0
  236. package/test/issue-4959.test.js +118 -0
  237. package/test/keep-alive-timeout.test.js +42 -0
  238. package/test/listen.1.test.js +154 -0
  239. package/test/listen.2.test.js +113 -0
  240. package/test/listen.3.test.js +83 -0
  241. package/test/listen.4.test.js +168 -0
  242. package/test/listen.5.test.js +122 -0
  243. package/test/logger/instantiation.test.js +341 -0
  244. package/test/logger/logger-test-utils.js +47 -0
  245. package/test/logger/logging.test.js +460 -0
  246. package/test/logger/options.test.js +579 -0
  247. package/test/logger/request.test.js +292 -0
  248. package/test/logger/response.test.js +183 -0
  249. package/test/logger/tap-parallel-not-ok +0 -0
  250. package/test/max-requests-per-socket.test.js +113 -0
  251. package/test/middleware.test.js +37 -0
  252. package/test/noop-set.test.js +19 -0
  253. package/test/nullable-validation.test.js +187 -0
  254. package/test/options.error-handler.test.js +5 -0
  255. package/test/options.test.js +5 -0
  256. package/test/output-validation.test.js +140 -0
  257. package/test/patch.error-handler.test.js +5 -0
  258. package/test/patch.test.js +5 -0
  259. package/test/plugin.1.test.js +230 -0
  260. package/test/plugin.2.test.js +314 -0
  261. package/test/plugin.3.test.js +287 -0
  262. package/test/plugin.4.test.js +504 -0
  263. package/test/plugin.helper.js +8 -0
  264. package/test/plugin.name.display.js +10 -0
  265. package/test/post-empty-body.test.js +38 -0
  266. package/test/pretty-print.test.js +366 -0
  267. package/test/promises.test.js +125 -0
  268. package/test/proto-poisoning.test.js +145 -0
  269. package/test/put.error-handler.test.js +5 -0
  270. package/test/put.test.js +5 -0
  271. package/test/register.test.js +184 -0
  272. package/test/reply-code.test.js +148 -0
  273. package/test/reply-early-hints.test.js +100 -0
  274. package/test/reply-error.test.js +815 -0
  275. package/test/reply-trailers.test.js +445 -0
  276. package/test/reply-web-stream-locked.test.js +37 -0
  277. package/test/request-error.test.js +624 -0
  278. package/test/request-header-host.test.js +339 -0
  279. package/test/request-id.test.js +118 -0
  280. package/test/request-timeout.test.js +53 -0
  281. package/test/route-hooks.test.js +635 -0
  282. package/test/route-prefix.test.js +904 -0
  283. package/test/route-shorthand.test.js +48 -0
  284. package/test/route.1.test.js +259 -0
  285. package/test/route.2.test.js +100 -0
  286. package/test/route.3.test.js +213 -0
  287. package/test/route.4.test.js +127 -0
  288. package/test/route.5.test.js +211 -0
  289. package/test/route.6.test.js +306 -0
  290. package/test/route.7.test.js +406 -0
  291. package/test/route.8.test.js +225 -0
  292. package/test/router-options.test.js +1108 -0
  293. package/test/same-shape.test.js +124 -0
  294. package/test/schema-examples.test.js +661 -0
  295. package/test/schema-feature.test.js +2198 -0
  296. package/test/schema-serialization.test.js +1171 -0
  297. package/test/schema-special-usage.test.js +1348 -0
  298. package/test/schema-validation.test.js +1572 -0
  299. package/test/scripts/validate-ecosystem-links.test.js +339 -0
  300. package/test/serialize-response.test.js +186 -0
  301. package/test/server.test.js +347 -0
  302. package/test/set-error-handler.test.js +69 -0
  303. package/test/skip-reply-send.test.js +317 -0
  304. package/test/stream-serializers.test.js +40 -0
  305. package/test/stream.1.test.js +94 -0
  306. package/test/stream.2.test.js +129 -0
  307. package/test/stream.3.test.js +198 -0
  308. package/test/stream.4.test.js +176 -0
  309. package/test/stream.5.test.js +188 -0
  310. package/test/sync-routes.test.js +32 -0
  311. package/test/throw.test.js +359 -0
  312. package/test/toolkit.js +63 -0
  313. package/test/trust-proxy.test.js +162 -0
  314. package/test/type-provider.test.js +22 -0
  315. package/test/types/content-type-parser.test-d.ts +72 -0
  316. package/test/types/decorate-request-reply.test-d.ts +18 -0
  317. package/test/types/dummy-plugin.ts +9 -0
  318. package/test/types/errors.test-d.ts +90 -0
  319. package/test/types/fastify.test-d.ts +352 -0
  320. package/test/types/hooks.test-d.ts +550 -0
  321. package/test/types/import.ts +2 -0
  322. package/test/types/instance.test-d.ts +588 -0
  323. package/test/types/logger.test-d.ts +277 -0
  324. package/test/types/plugin.test-d.ts +97 -0
  325. package/test/types/register.test-d.ts +237 -0
  326. package/test/types/reply.test-d.ts +254 -0
  327. package/test/types/request.test-d.ts +188 -0
  328. package/test/types/route.test-d.ts +553 -0
  329. package/test/types/schema.test-d.ts +135 -0
  330. package/test/types/serverFactory.test-d.ts +37 -0
  331. package/test/types/type-provider.test-d.ts +1213 -0
  332. package/test/types/using.test-d.ts +17 -0
  333. package/test/upgrade.test.js +52 -0
  334. package/test/url-rewriting.test.js +122 -0
  335. package/test/use-semicolon-delimiter.test.js +168 -0
  336. package/test/validation-error-handling.test.js +900 -0
  337. package/test/versioned-routes.test.js +603 -0
  338. package/test/web-api.test.js +616 -0
  339. package/test/wrap-thenable.test.js +30 -0
  340. package/types/content-type-parser.d.ts +75 -0
  341. package/types/context.d.ts +22 -0
  342. package/types/errors.d.ts +92 -0
  343. package/types/hooks.d.ts +875 -0
  344. package/types/instance.d.ts +609 -0
  345. package/types/logger.d.ts +107 -0
  346. package/types/plugin.d.ts +44 -0
  347. package/types/register.d.ts +42 -0
  348. package/types/reply.d.ts +81 -0
  349. package/types/request.d.ts +95 -0
  350. package/types/route.d.ts +199 -0
  351. package/types/schema.d.ts +61 -0
  352. package/types/server-factory.d.ts +19 -0
  353. package/types/type-provider.d.ts +130 -0
  354. package/types/utils.d.ts +98 -0
@@ -0,0 +1,727 @@
1
+ # V5 Migration Guide
2
+
3
+ This guide is intended to help with migration from Fastify v4 to v5.
4
+
5
+ Before migrating to v5, please ensure that you have fixed all deprecation
6
+ warnings from v4. All v4 deprecations have been removed and will no longer
7
+ work after upgrading.
8
+
9
+ ## Long Term Support Cycle
10
+
11
+ Fastify v5 will only support Node.js v20+. If you are using an older version of
12
+ Node.js, you will need to upgrade to a newer version to use Fastify v5.
13
+
14
+ Fastify v4 is still supported until June 30, 2025. If you are unable to upgrade,
15
+ you should consider buying an end-of-life support plan from HeroDevs.
16
+
17
+ ### Why Node.js v20?
18
+
19
+ Fastify v5 will only support Node.js v20+ because it has significant differences
20
+ compared to v18, such as
21
+ better support for `node:test`. This allows us to provide a better developer
22
+ experience and streamline maintenance.
23
+
24
+ Node.js v18 will exit Long Term Support on April 30, 2025, so you should be planning
25
+ to upgrade to v20 anyway.
26
+
27
+ ## Breaking Changes
28
+
29
+ ### Full JSON Schema is now required for `querystring`, `params` and `body` and response schemas
30
+
31
+ Starting with v5, Fastify will require a full JSON schema for the `querystring`,
32
+ `params` and `body` schema. Note that the `jsonShortHand` option has been
33
+ removed as well.
34
+
35
+ If the default JSON Schema validator is used, you will need
36
+ to provide a full JSON schema for the
37
+ `querystring`, `params`, `body`, and `response` schemas,
38
+ including the `type` property.
39
+
40
+ ```js
41
+ // v4
42
+ fastify.get('/route', {
43
+ schema: {
44
+ querystring: {
45
+ name: { type: 'string' }
46
+ }
47
+ }
48
+ }, (req, reply) => {
49
+ reply.send({ hello: req.query.name });
50
+ });
51
+ ```
52
+
53
+ ```js
54
+ // v5
55
+ fastify.get('/route', {
56
+ schema: {
57
+ querystring: {
58
+ type: 'object',
59
+ properties: {
60
+ name: { type: 'string' }
61
+ },
62
+ required: ['name']
63
+ }
64
+ }
65
+ }, (req, reply) => {
66
+ reply.send({ hello: req.query.name });
67
+ });
68
+ ```
69
+
70
+ See [#5586](https://github.com/fastify/fastify/pull/5586) for more details
71
+
72
+ Note that it's still possible to override the JSON Schema validator to
73
+ use a different format, such as Zod. This change simplifies that as well.
74
+
75
+ This change helps with integration of other tools, such as
76
+ [`@fastify/swagger`](https://github.com/fastify/fastify-swagger).
77
+
78
+ ### New logger constructor signature
79
+
80
+ In Fastify v4, Fastify accepted the options to build a pino
81
+ logger in the `logger` option, as well as a custom logger instance.
82
+ This was the source of significant confusion.
83
+
84
+ As a result, the `logger` option will not accept a custom logger anymore in v5.
85
+ To use a custom logger, you should use the `loggerInstance` option instead:
86
+
87
+ ```js
88
+ // v4
89
+ const logger = require('pino')();
90
+ const fastify = require('fastify')({
91
+ logger
92
+ });
93
+ ```
94
+
95
+ ```js
96
+ // v5
97
+ const loggerInstance = require('pino')();
98
+ const fastify = require('fastify')({
99
+ loggerInstance
100
+ });
101
+ ```
102
+
103
+ ### `useSemicolonDelimiter` false by default
104
+
105
+ Starting with v5, Fastify instances will no longer default to supporting the use
106
+ of semicolon delimiters in the query string as they did in v4.
107
+ This is due to it being non-standard
108
+ behavior and not adhering to [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-3.4).
109
+
110
+ If you still wish to use semicolons as delimiters, you can do so by
111
+ setting `useSemicolonDelimiter: true` in the server configuration.
112
+
113
+ ```js
114
+ const fastify = require('fastify')({
115
+ useSemicolonDelimiter: true
116
+ });
117
+ ```
118
+
119
+ ### The parameters object no longer has a prototype
120
+
121
+ In v4, the `parameters` object had a prototype. This is no longer the case in v5.
122
+ This means that you can no longer access properties inherited from `Object` on
123
+ the `parameters` object, such as `toString` or `hasOwnProperty`.
124
+
125
+ ```js
126
+ // v4
127
+ fastify.get('/route/:name', (req, reply) => {
128
+ console.log(req.params.hasOwnProperty('name')); // true
129
+ return { hello: req.params.name };
130
+ });
131
+ ```
132
+
133
+ ```js
134
+ // v5
135
+ fastify.get('/route/:name', (req, reply) => {
136
+ console.log(Object.hasOwn(req.params, 'name')); // true
137
+ return { hello: req.params.name };
138
+ });
139
+ ```
140
+
141
+ This increases the security of the application by hardening against prototype
142
+ pollution attacks.
143
+
144
+ ### Type Providers now differentiate between validator and serializer schemas
145
+
146
+ In v4, the type providers had the same types for both validation and serialization.
147
+ In v5, the type providers have been split into two separate types: `ValidatorSchema`
148
+ and `SerializerSchema`.
149
+
150
+ [`@fastify/type-provider-json-schema-to-ts`](https://github.com/fastify/fastify-type-provider-json-schema-to-ts)
151
+ and
152
+ [`@fastify/type-provider-typebox`](https://github.com/fastify/fastify-type-provider-typebox)
153
+ have already been updated: upgrade to the latest version to get the new types.
154
+ If you are using a custom type provider, you will need to modify it like
155
+ the following:
156
+
157
+ ```
158
+ --- a/index.ts
159
+ +++ b/index.ts
160
+ @@ -11,7 +11,8 @@ import {
161
+ import { FromSchema, FromSchemaDefaultOptions, FromSchemaOptions, JSONSchema } from 'json-schema-to-ts'
162
+
163
+ export interface JsonSchemaToTsProvider<
164
+ Options extends FromSchemaOptions = FromSchemaDefaultOptions
165
+ > extends FastifyTypeProvider {
166
+ - output: this['input'] extends JSONSchema ? FromSchema<this['input'], Options> : unknown;
167
+ + validator: this['schema'] extends JSONSchema ? FromSchema<this['schema'], Options> : unknown;
168
+ + serializer: this['schema'] extends JSONSchema ? FromSchema<this['schema'], Options> : unknown;
169
+ }
170
+ ```
171
+
172
+ ### Changes to the .listen() method
173
+
174
+ The variadic argument signature of the `.listen()` method has been removed.
175
+ This means that you can no longer call `.listen()` with a variable number of arguments.
176
+
177
+ ```js
178
+ // v4
179
+ fastify.listen(8000)
180
+ ```
181
+
182
+ Will become:
183
+
184
+ ```js
185
+ // v5
186
+ fastify.listen({ port: 8000 })
187
+ ```
188
+
189
+ This was already deprecated in v4 as `FSTDEP011`, so you should have already updated
190
+ your code to use the new signature.
191
+
192
+ ### Direct return of trailers has been removed
193
+
194
+ In v4, you could directly return trailers from a handler.
195
+ This is no longer possible in v5.
196
+
197
+ ```js
198
+ // v4
199
+ fastify.get('/route', (req, reply) => {
200
+ reply.trailer('ETag', function (reply, payload) {
201
+ return 'custom-etag'
202
+ })
203
+ reply.send('')
204
+ });
205
+ ```
206
+
207
+ ```js
208
+ // v5
209
+ fastify.get('/route', (req, reply) => {
210
+ reply.trailer('ETag', async function (reply, payload) {
211
+ return 'custom-etag'
212
+ })
213
+ reply.send('')
214
+ });
215
+ ```
216
+
217
+ A callback could also be used.
218
+ This was already deprecated in v4 as `FSTDEP013`,
219
+ so you should have already updated your code to use the new signature.
220
+
221
+ ### Streamlined access to route definition
222
+
223
+ All deprecated properties relating to accessing the route definition have been removed
224
+ and are now accessed via `request.routeOptions`.
225
+
226
+ | Code | Description | How to solve | Discussion |
227
+ | ---- | ----------- | ------------ | ---------- |
228
+ | FSTDEP012 | You are trying to access the deprecated `request.context` property. | Use `request.routeOptions.config` or `request.routeOptions.schema`. | [#4216](https://github.com/fastify/fastify/pull/4216) [#5084](https://github.com/fastify/fastify/pull/5084) |
229
+ | FSTDEP015 | You are accessing the deprecated `request.routeSchema` property. | Use `request.routeOptions.schema`. | [#4470](https://github.com/fastify/fastify/pull/4470) |
230
+ | FSTDEP016 | You are accessing the deprecated `request.routeConfig` property. | Use `request.routeOptions.config`. | [#4470](https://github.com/fastify/fastify/pull/4470) |
231
+ | FSTDEP017 | You are accessing the deprecated `request.routerPath` property. | Use `request.routeOptions.url`. | [#4470](https://github.com/fastify/fastify/pull/4470) |
232
+ | FSTDEP018 | You are accessing the deprecated `request.routerMethod` property. | Use `request.routeOptions.method`. | [#4470](https://github.com/fastify/fastify/pull/4470) |
233
+ | FSTDEP019 | You are accessing the deprecated `reply.context` property. | Use `reply.routeOptions.config` or `reply.routeOptions.schema`. | [#5032](https://github.com/fastify/fastify/pull/5032) [#5084](https://github.com/fastify/fastify/pull/5084) |
234
+
235
+ See [#5616](https://github.com/fastify/fastify/pull/5616) for more information.
236
+
237
+ ### `reply.redirect()` has a new signature
238
+
239
+ The `reply.redirect()` method has a new signature:
240
+ `reply.redirect(url: string, code?: number)`.
241
+
242
+ ```js
243
+ // v4
244
+ reply.redirect(301, '/new-route')
245
+ ```
246
+
247
+ Change it to:
248
+
249
+ ```js
250
+ // v5
251
+ reply.redirect('/new-route', 301)
252
+ ```
253
+
254
+ This was already deprecated in v4 as `FSTDEP021`, so you should have already
255
+ updated your code to use the new signature.
256
+
257
+
258
+ ### Modifying `reply.sent` is now forbidden
259
+
260
+ In v4, you could modify the `reply.sent` property to prevent the response from
261
+ being sent.
262
+ This is no longer possible in v5, use `reply.hijack()` instead.
263
+
264
+ ```js
265
+ // v4
266
+ fastify.get('/route', (req, reply) => {
267
+ reply.sent = true;
268
+ reply.raw.end('hello');
269
+ });
270
+ ```
271
+
272
+ Change it to:
273
+
274
+ ```js
275
+ // v5
276
+ fastify.get('/route', (req, reply) => {
277
+ reply.hijack();
278
+ reply.raw.end('hello');
279
+ });
280
+ ```
281
+
282
+ This was already deprecated in v4 as `FSTDEP010`, so you should have already
283
+ updated your code to use the new signature.
284
+
285
+ ### Constraints for route versioning signature changes
286
+
287
+ We changed the signature for route versioning constraints.
288
+ The `version` and `versioning` options have been removed and you should
289
+ use the `constraints` option instead.
290
+
291
+ | Code | Description | How to solve | Discussion |
292
+ | ---- | ----------- | ------------ | ---------- |
293
+ | FSTDEP008 | You are using route constraints via the route `{version: "..."}` option. | Use `{constraints: {version: "..."}}` option. | [#2682](https://github.com/fastify/fastify/pull/2682) |
294
+ | FSTDEP009 | You are using a custom route versioning strategy via the server `{versioning: "..."}` option. | Use `{constraints: {version: "..."}}` option. | [#2682](https://github.com/fastify/fastify/pull/2682) |
295
+
296
+ ### `HEAD` routes requires to register before `GET` when `exposeHeadRoutes: true`
297
+
298
+ We have a more strict requirement for custom `HEAD` route when
299
+ `exposeHeadRoutes: true`.
300
+
301
+ When you provides a custom `HEAD` route, you must either explicitly
302
+ set `exposeHeadRoutes` to `false`
303
+
304
+ ```js
305
+ // v4
306
+ fastify.get('/route', {
307
+
308
+ }, (req, reply) => {
309
+ reply.send({ hello: 'world' });
310
+ });
311
+
312
+ fastify.head('/route', (req, reply) => {
313
+ // ...
314
+ });
315
+ ```
316
+
317
+ ```js
318
+ // v5
319
+ fastify.get('/route', {
320
+ exposeHeadRoutes: false
321
+ }, (req, reply) => {
322
+ reply.send({ hello: 'world' });
323
+ });
324
+
325
+ fastify.head('/route', (req, reply) => {
326
+ // ...
327
+ });
328
+ ```
329
+
330
+ or place the `HEAD` route before `GET`.
331
+
332
+ ```js
333
+ // v5
334
+ fastify.head('/route', (req, reply) => {
335
+ // ...
336
+ });
337
+
338
+ fastify.get('/route', {
339
+
340
+ }, (req, reply) => {
341
+ reply.send({ hello: 'world' });
342
+ });
343
+ ```
344
+
345
+ This was changed in [#2700](https://github.com/fastify/fastify/pull/2700),
346
+ and the old behavior was deprecated in v4 as `FSTDEP007`.
347
+
348
+ ### Removed `request.connection`
349
+
350
+ The `request.connection` property has been removed in v5.
351
+ You should use `request.socket` instead.
352
+
353
+ ```js
354
+ // v4
355
+ fastify.get('/route', (req, reply) => {
356
+ console.log(req.connection.remoteAddress);
357
+ return { hello: 'world' };
358
+ });
359
+ ```
360
+
361
+ ```js
362
+ // v5
363
+ fastify.get('/route', (req, reply) => {
364
+ console.log(req.socket.remoteAddress);
365
+ return { hello: 'world' };
366
+ });
367
+ ```
368
+
369
+ This was already deprecated in v4 as `FSTDEP05`, so you should
370
+ have already updated your code to use the new signature.
371
+
372
+ ### `reply.getResponseTime()` has been removed, use `reply.elapsedTime` instead
373
+
374
+ The `reply.getResponseTime()` method has been removed in v5.
375
+ You should use `reply.elapsedTime` instead.
376
+
377
+ ```js
378
+ // v4
379
+ fastify.get('/route', (req, reply) => {
380
+ console.log(reply.getResponseTime());
381
+ return { hello: 'world' };
382
+ });
383
+ ```
384
+
385
+ ```js
386
+ // v5
387
+ fastify.get('/route', (req, reply) => {
388
+ console.log(reply.elapsedTime);
389
+ return { hello: 'world' };
390
+ });
391
+ ```
392
+
393
+ This was already deprecated in v4 as `FSTDEP20`, so you should have already
394
+ updated your code to use the new signature.
395
+
396
+ ### `fastify.hasRoute()` now matches the behavior of `find-my-way`
397
+
398
+ The `fastify.hasRoute()` method now matches the behavior of `find-my-way`
399
+ and requires the route definition to be passed as it is defined in the route.
400
+
401
+ ```js
402
+ // v4
403
+ fastify.get('/example/:file(^\\d+).png', function (request, reply) { })
404
+
405
+ console.log(fastify.hasRoute({
406
+ method: 'GET',
407
+ url: '/example/12345.png'
408
+ )); // true
409
+ ```
410
+
411
+ ```js
412
+ // v5
413
+
414
+ fastify.get('/example/:file(^\\d+).png', function (request, reply) { })
415
+
416
+ console.log(fastify.hasRoute({
417
+ method: 'GET',
418
+ url: '/example/:file(^\\d+).png'
419
+ )); // true
420
+ ```
421
+
422
+ ### Removal of some non-standard HTTP methods
423
+
424
+ We have removed the following HTTP methods from Fastify:
425
+ - `PROPFIND`
426
+ - `PROPPATCH`
427
+ - `MKCOL`
428
+ - `COPY`
429
+ - `MOVE`
430
+ - `LOCK`
431
+ - `UNLOCK`
432
+ - `TRACE`
433
+ - `SEARCH`
434
+
435
+ It's now possible to add them back using the `addHttpMethod` method.
436
+
437
+ ```js
438
+ const fastify = Fastify()
439
+
440
+ // add a new http method on top of the default ones:
441
+ fastify.addHttpMethod('REBIND')
442
+
443
+ // add a new HTTP method that accepts a body:
444
+ fastify.addHttpMethod('REBIND', { hasBody: true })
445
+
446
+ // reads the HTTP methods list:
447
+ fastify.supportedMethods // returns a string array
448
+ ```
449
+
450
+ See [#5567](https://github.com/fastify/fastify/pull/5567) for more
451
+ information.
452
+
453
+ ### Removed support from reference types in decorators
454
+
455
+ Decorating Request/Reply with a reference type (`Array`, `Object`)
456
+ is now prohibited as this reference is shared amongst all requests.
457
+
458
+ ```js
459
+ // v4
460
+ fastify.decorateRequest('myObject', { hello: 'world' });
461
+ ```
462
+
463
+ ```js
464
+ // v5
465
+ fastify.decorateRequest('myObject');
466
+ fastify.addHook('onRequest', async (req, reply) => {
467
+ req.myObject = { hello: 'world' };
468
+ });
469
+ ```
470
+
471
+ or turn it into a function
472
+
473
+ ```js
474
+ // v5
475
+ fastify.decorateRequest('myObject', () => ({ hello: 'world' }));
476
+ ```
477
+
478
+ or as a getter
479
+
480
+ ```js
481
+ // v5
482
+ fastify.decorateRequest('myObject', {
483
+ getter () {
484
+ return { hello: 'world' }
485
+ }
486
+ });
487
+ ```
488
+
489
+ See [#5462](https://github.com/fastify/fastify/pull/5462) for more information.
490
+
491
+ ### Remove support for DELETE with a `Content-Type: application/json` header and an empty body
492
+
493
+ In v4, Fastify allowed `DELETE` requests with a `Content-Type: application/json`
494
+ header and an empty body was accepted.
495
+ This is no longer allowed in v5.
496
+
497
+ See [#5419](https://github.com/fastify/fastify/pull/5419) for more information.
498
+
499
+ ### Plugins cannot mix callback/promise API anymore
500
+
501
+ In v4, plugins could mix the callback and promise API, leading to unexpected behavior.
502
+ This is no longer allowed in v5.
503
+
504
+ ```js
505
+ // v4
506
+ fastify.register(async function (instance, opts, done) {
507
+ done();
508
+ });
509
+ ```
510
+
511
+ ```js
512
+ // v5
513
+ fastify.register(async function (instance, opts) {
514
+ return;
515
+ });
516
+ ```
517
+
518
+ or
519
+
520
+ ```js
521
+ // v5
522
+ fastify.register(function (instance, opts, done) {
523
+ done();
524
+ });
525
+ ```
526
+
527
+ ### Requests now have `host`, `hostname`, and `port`, and `hostname` no longer includes the port number
528
+
529
+ In Fastify v4, `req.hostname` would include both the hostname and the
530
+ server’s port, so locally it might have the value `localhost:1234`.
531
+ With v5, we aligned to the Node.js URL object and now include `host`, `hostname`,
532
+ and `port` properties. `req.host` has the same value as `req.hostname` did in v4,
533
+ while `req.hostname` includes the hostname _without_ a port if a port is present,
534
+ and `req.port` contains just the port number.
535
+ See [#4766](https://github.com/fastify/fastify/pull/4766)
536
+ and [#4682](https://github.com/fastify/fastify/issues/4682) for more information.
537
+
538
+ ### Removes `getDefaultRoute` and `setDefaultRoute` methods
539
+
540
+ The `getDefaultRoute` and `setDefaultRoute` methods have been removed in v5.
541
+
542
+ See [#4485](https://github.com/fastify/fastify/pull/4485)
543
+ and [#4480](https://github.com/fastify/fastify/pull/4485)
544
+ for more information.
545
+ This was already deprecated in v4 as `FSTDEP014`,
546
+ so you should have already updated your code.
547
+
548
+ ### `time` and `date-time` formats enforce timezone
549
+
550
+ The updated AJV compiler updates `ajv-formats` which now
551
+ enforce the use of timezone in `time` and `date-time` format.
552
+ A workaround is to use `iso-time` and `iso-date-time` formats
553
+ which support an optional timezone for backwards compatibility.
554
+ See the
555
+ [full discussion](https://github.com/fastify/fluent-json-schema/issues/267).
556
+
557
+ ## New Features
558
+
559
+ ### Diagnostic Channel support
560
+
561
+ Fastify v5 now supports the [Diagnostics Channel](https://nodejs.org/api/diagnostics_channel.html)
562
+ API natively
563
+ and provides a way to trace the lifecycle of a request.
564
+
565
+ ```js
566
+ 'use strict'
567
+
568
+ const diagnostics = require('node:diagnostics_channel')
569
+ const Fastify = require('fastify')
570
+
571
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
572
+ console.log(msg.route.url) // '/:id'
573
+ console.log(msg.route.method) // 'GET'
574
+ })
575
+
576
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
577
+ // msg is the same as the one emitted by the 'tracing:fastify.request.handler:start' channel
578
+ console.log(msg)
579
+ })
580
+
581
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
582
+ // in case of error
583
+ })
584
+
585
+ const fastify = Fastify()
586
+ fastify.route({
587
+ method: 'GET',
588
+ url: '/:id',
589
+ handler: function (req, reply) {
590
+ return { hello: 'world' }
591
+ }
592
+ })
593
+
594
+ fastify.listen({ port: 0 }, async function () {
595
+ const result = await fetch(fastify.listeningOrigin + '/7')
596
+
597
+ t.assert.ok(result.ok)
598
+ t.assert.strictEqual(response.status, 200)
599
+ t.assert.deepStrictEqual(await result.json(), { hello: 'world' })
600
+ })
601
+ ```
602
+
603
+ See the [documentation](https://github.com/fastify/fastify/blob/main/docs/Reference/Hooks.md#diagnostics-channel-hooks)
604
+ and [#5252](https://github.com/fastify/fastify/pull/5252) for additional details.
605
+
606
+ ## Contributors
607
+
608
+ The complete list of contributors, across all of the core
609
+ Fastify packages, is provided below. Please consider
610
+ contributing to those that are capable of accepting sponsorships.
611
+
612
+ | Contributor | Sponsor Link | Packages |
613
+ | --- | --- | --- |
614
+ | 10xLaCroixDrinker | [❤️ sponsor](https://github.com/sponsors/10xLaCroixDrinker) | fastify-cli |
615
+ | Bram-dc | | fastify; fastify-swagger |
616
+ | BrianValente | | fastify |
617
+ | BryanAbate | | fastify-cli |
618
+ | Cadienvan | [❤️ sponsor](https://github.com/sponsors/Cadienvan) | fastify |
619
+ | Cangit | | fastify |
620
+ | Cyberlane | | fastify-elasticsearch |
621
+ | Eomm | [❤️ sponsor](https://github.com/sponsors/Eomm) | ajv-compiler; fastify; fastify-awilix; fastify-diagnostics-channel; fastify-elasticsearch; fastify-hotwire; fastify-mongodb; fastify-nextjs; fastify-swagger-ui; under-pressure |
622
+ | EstebanDalelR | [❤️ sponsor](https://github.com/sponsors/EstebanDalelR) | fastify-cli |
623
+ | Fdawgs | [❤️ sponsor](https://github.com/sponsors/Fdawgs) | aws-lambda-fastify; csrf-protection; env-schema; fastify; fastify-accepts; fastify-accepts-serializer; fastify-auth; fastify-awilix; fastify-basic-auth; fastify-bearer-auth; fastify-caching; fastify-circuit-breaker; fastify-cli; fastify-cookie; fastify-cors; fastify-diagnostics-channel; fastify-elasticsearch; fastify-env; fastify-error; fastify-etag; fastify-express; fastify-flash; fastify-formbody; fastify-funky; fastify-helmet; fastify-hotwire; fastify-http-proxy; fastify-jwt; fastify-kafka; fastify-leveldb; fastify-mongodb; fastify-multipart; fastify-mysql; fastify-nextjs; fastify-oauth2; fastify-passport; fastify-plugin; fastify-postgres; fastify-rate-limit; fastify-redis; fastify-reply-from; fastify-request-context; fastify-response-validation; fastify-routes; fastify-routes-stats; fastify-schedule; fastify-secure-session; fastify-sensible; fastify-swagger-ui; fastify-url-data; fastify-websocket; fastify-zipkin; fluent-json-schema; forwarded; middie; point-of-view; process-warning; proxy-addr; safe-regex2; secure-json-parse; under-pressure |
624
+ | Gehbt | | fastify-secure-session |
625
+ | Gesma94 | | fastify-routes-stats |
626
+ | H4ad | [❤️ sponsor](https://github.com/sponsors/H4ad) | aws-lambda-fastify |
627
+ | JohanManders | | fastify-secure-session |
628
+ | LiviaMedeiros | | fastify |
629
+ | Momy93 | | fastify-secure-session |
630
+ | MunifTanjim | | fastify-swagger-ui |
631
+ | Nanosync | | fastify-secure-session |
632
+ | RafaelGSS | [❤️ sponsor](https://github.com/sponsors/RafaelGSS) | fastify; under-pressure |
633
+ | Rantoledo | | fastify |
634
+ | SMNBLMRR | | fastify |
635
+ | SimoneDevkt | | fastify-cli |
636
+ | Tony133 | | fastify |
637
+ | Uzlopak | [❤️ sponsor](https://github.com/sponsors/Uzlopak) | fastify; fastify-autoload; fastify-diagnostics-channel; fastify-hotwire; fastify-nextjs; fastify-passport; fastify-plugin; fastify-rate-limit; fastify-routes; fastify-static; fastify-swagger-ui; point-of-view; under-pressure |
638
+ | Zamiell | | fastify-secure-session |
639
+ | aadito123 | | fastify |
640
+ | aaroncadillac | [❤️ sponsor](https://github.com/sponsors/aaroncadillac) | fastify |
641
+ | aarontravass | | fastify |
642
+ | acro5piano | [❤️ sponsor](https://github.com/sponsors/acro5piano) | fastify-secure-session |
643
+ | adamward459 | | fastify-cli |
644
+ | adrai | [❤️ sponsor](https://github.com/sponsors/adrai) | aws-lambda-fastify |
645
+ | alenap93 | | fastify |
646
+ | alexandrucancescu | | fastify-nextjs |
647
+ | anthonyringoet | | aws-lambda-fastify |
648
+ | arshcodemod | | fastify |
649
+ | autopulated | | point-of-view |
650
+ | barbieri | | fastify |
651
+ | beyazit | | fastify |
652
+ | big-kahuna-burger | [❤️ sponsor](https://github.com/sponsors/big-kahuna-burger) | fastify-cli; fastify-compress; fastify-helmet |
653
+ | bilalshareef | | fastify-routes |
654
+ | blue86321 | | fastify-swagger-ui |
655
+ | bodinsamuel | | fastify-rate-limit |
656
+ | busybox11 | [❤️ sponsor](https://github.com/sponsors/busybox11) | fastify |
657
+ | climba03003 | | csrf-protection; fastify; fastify-accepts; fastify-accepts-serializer; fastify-auth; fastify-basic-auth; fastify-bearer-auth; fastify-caching; fastify-circuit-breaker; fastify-compress; fastify-cors; fastify-env; fastify-etag; fastify-flash; fastify-formbody; fastify-http-proxy; fastify-mongodb; fastify-swagger-ui; fastify-url-data; fastify-websocket; middie |
658
+ | dancastillo | [❤️ sponsor](https://github.com/sponsors/dancastillo) | fastify; fastify-basic-auth; fastify-caching; fastify-circuit-breaker; fastify-cors; fastify-helmet; fastify-passport; fastify-response-validation; fastify-routes; fastify-schedule |
659
+ | danny-andrews | | fastify-kafka |
660
+ | davidcralph | [❤️ sponsor](https://github.com/sponsors/davidcralph) | csrf-protection |
661
+ | davideroffo | | under-pressure |
662
+ | dhensby | | fastify-cli |
663
+ | dmkng | | fastify |
664
+ | domdomegg | | fastify |
665
+ | faustman | | fastify-cli |
666
+ | floridemai | | fluent-json-schema |
667
+ | fox1t | | fastify-autoload |
668
+ | giuliowaitforitdavide | | fastify |
669
+ | gunters63 | | fastify-reply-from |
670
+ | gurgunday | | fastify; fastify-circuit-breaker; fastify-cookie; fastify-multipart; fastify-mysql; fastify-rate-limit; fastify-response-validation; fastify-sensible; fastify-swagger-ui; fluent-json-schema; middie; proxy-addr; safe-regex2; secure-json-parse |
671
+ | ildella | | under-pressure |
672
+ | james-kaguru | | fastify |
673
+ | jcbain | | fastify-http-proxy |
674
+ | jdhollander | | fastify-swagger-ui |
675
+ | jean-michelet | | fastify; fastify-autoload; fastify-cli; fastify-mysql; fastify-sensible |
676
+ | johaven | | fastify-multipart |
677
+ | jordanebelanger | | fastify-plugin |
678
+ | jscheffner | | fastify |
679
+ | jsprw | | fastify-secure-session |
680
+ | jsumners | [❤️ sponsor](https://github.com/sponsors/jsumners) | ajv-compiler; avvio; csrf-protection; env-schema; fast-json-stringify; fastify; fastify-accepts; fastify-accepts-serializer; fastify-auth; fastify-autoload; fastify-awilix; fastify-basic-auth; fastify-bearer-auth; fastify-caching; fastify-circuit-breaker; fastify-compress; fastify-cookie; fastify-cors; fastify-env; fastify-error; fastify-etag; fastify-express; fastify-flash; fastify-formbody; fastify-funky; fastify-helmet; fastify-http-proxy; fastify-jwt; fastify-kafka; fastify-leveldb; fastify-multipart; fastify-mysql; fastify-oauth2; fastify-plugin; fastify-postgres; fastify-redis; fastify-reply-from; fastify-request-context; fastify-response-validation; fastify-routes; fastify-routes-stats; fastify-schedule; fastify-secure-session; fastify-sensible; fastify-static; fastify-swagger; fastify-swagger-ui; fastify-url-data; fastify-websocket; fastify-zipkin; fluent-json-schema; forwarded; light-my-request; middie; process-warning; proxy-addr; safe-regex2; secure-json-parse; under-pressure |
681
+ | karankraina | | under-pressure |
682
+ | kerolloz | [❤️ sponsor](https://github.com/sponsors/kerolloz) | fastify-jwt |
683
+ | kibertoad | | fastify-rate-limit |
684
+ | kukidon-dev | | fastify-passport |
685
+ | kunal097 | | fastify |
686
+ | lamweili | | fastify-sensible |
687
+ | lemonclown | | fastify-mongodb |
688
+ | liuhanqu | | fastify |
689
+ | matthyk | | fastify-plugin |
690
+ | mch-dsk | | fastify |
691
+ | mcollina | [❤️ sponsor](https://github.com/sponsors/mcollina) | ajv-compiler; avvio; csrf-protection; fastify; fastify-accepts; fastify-accepts-serializer; fastify-auth; fastify-autoload; fastify-awilix; fastify-basic-auth; fastify-bearer-auth; fastify-caching; fastify-circuit-breaker; fastify-cli; fastify-compress; fastify-cookie; fastify-cors; fastify-diagnostics-channel; fastify-elasticsearch; fastify-env; fastify-etag; fastify-express; fastify-flash; fastify-formbody; fastify-funky; fastify-helmet; fastify-http-proxy; fastify-jwt; fastify-kafka; fastify-leveldb; fastify-multipart; fastify-mysql; fastify-oauth2; fastify-passport; fastify-plugin; fastify-postgres; fastify-rate-limit; fastify-redis; fastify-reply-from; fastify-request-context; fastify-response-validation; fastify-routes; fastify-routes-stats; fastify-schedule; fastify-secure-session; fastify-static; fastify-swagger; fastify-swagger-ui; fastify-url-data; fastify-websocket; fastify-zipkin; fluent-json-schema; light-my-request; middie; point-of-view; proxy-addr; secure-json-parse; under-pressure |
692
+ | melroy89 | [❤️ sponsor](https://github.com/sponsors/melroy89) | under-pressure |
693
+ | metcoder95 | [❤️ sponsor](https://github.com/sponsors/metcoder95) | fastify-elasticsearch |
694
+ | mhamann | | fastify-cli |
695
+ | mihaur | | fastify-elasticsearch |
696
+ | mikesamm | | fastify |
697
+ | mikhael-abdallah | | secure-json-parse |
698
+ | miquelfire | [❤️ sponsor](https://github.com/sponsors/miquelfire) | fastify-routes |
699
+ | miraries | | fastify-swagger-ui |
700
+ | mohab-sameh | | fastify |
701
+ | monish001 | | fastify |
702
+ | moradebianchetti81 | | fastify |
703
+ | mouhannad-sh | | aws-lambda-fastify |
704
+ | multivoltage | | point-of-view |
705
+ | muya | [❤️ sponsor](https://github.com/sponsors/muya) | under-pressure |
706
+ | mweberxyz | | point-of-view |
707
+ | nflaig | | fastify |
708
+ | nickfla1 | | avvio |
709
+ | o-az | | process-warning |
710
+ | ojeytonwilliams | | csrf-protection |
711
+ | onosendi | | fastify-formbody |
712
+ | philippviereck | | fastify |
713
+ | pip77 | | fastify-mongodb |
714
+ | puskin94 | | fastify |
715
+ | remidewitte | | fastify |
716
+ | rozzilla | | fastify |
717
+ | samialdury | | fastify-cli |
718
+ | sknetl | | fastify-cors |
719
+ | sourcecodeit | | fastify |
720
+ | synapse | | env-schema |
721
+ | timursaurus | | secure-json-parse |
722
+ | tlhunter | | fastify |
723
+ | tlund101 | | fastify-rate-limit |
724
+ | ttshivers | | fastify-http-proxy |
725
+ | voxpelli | [❤️ sponsor](https://github.com/sponsors/voxpelli) | fastify |
726
+ | weixinwu | | fastify-cli |
727
+ | zetaraku | | fastify-cli |