fastify 4.28.0 → 5.0.0-alpha.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 (514) hide show
  1. package/.idea/fastify.iml +12 -0
  2. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  3. package/.idea/jsLibraryMappings.xml +6 -0
  4. package/.idea/jsLinters/eslint.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/vcs.xml +6 -0
  7. package/.markdownlint-cli2.yaml +1 -1
  8. package/.taprc +4 -8
  9. package/README.md +3 -6
  10. package/build/build-error-serializer.js +4 -1
  11. package/build/build-validation.js +5 -4
  12. package/docs/Guides/Database.md +1 -1
  13. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  14. package/docs/Guides/Ecosystem.md +2 -0
  15. package/docs/Guides/Migration-Guide-V5.md +20 -0
  16. package/docs/Guides/Write-Type-Provider.md +4 -2
  17. package/docs/Reference/ContentTypeParser.md +30 -1
  18. package/docs/Reference/Decorators.md +42 -16
  19. package/docs/Reference/Errors.md +10 -2
  20. package/docs/Reference/Hooks.md +48 -14
  21. package/docs/Reference/Logging.md +5 -5
  22. package/docs/Reference/Reply.md +23 -18
  23. package/docs/Reference/Request.md +5 -1
  24. package/docs/Reference/Routes.md +24 -28
  25. package/docs/Reference/Server.md +14 -53
  26. package/docs/Reference/Type-Providers.md +21 -26
  27. package/docs/Reference/TypeScript.md +46 -29
  28. package/docs/Reference/Warnings.md +0 -8
  29. package/eslint.config.js +27 -0
  30. package/examples/typescript-server.ts +14 -14
  31. package/fastify.d.ts +15 -14
  32. package/fastify.js +41 -15
  33. package/lib/configValidator.js +94 -76
  34. package/lib/contentTypeParser.js +54 -88
  35. package/lib/decorate.js +3 -7
  36. package/lib/error-serializer.js +2 -1
  37. package/lib/errors.js +31 -6
  38. package/lib/handleRequest.js +70 -39
  39. package/lib/httpMethods.js +34 -18
  40. package/lib/logger.js +24 -6
  41. package/lib/pluginUtils.js +5 -5
  42. package/lib/reply.js +7 -10
  43. package/lib/request.js +37 -19
  44. package/lib/route.js +6 -34
  45. package/lib/server.js +62 -123
  46. package/lib/warnings.js +24 -29
  47. package/lib/wrapThenable.js +46 -22
  48. package/package.json +38 -58
  49. package/test/404s.test.js +8 -12
  50. package/test/async-await.test.js +46 -2
  51. package/test/build/error-serializer.test.js +4 -2
  52. package/test/check.test.js +225 -0
  53. package/test/close-pipelining.test.js +2 -41
  54. package/test/close.test.js +1 -41
  55. package/test/content-parser.test.js +69 -117
  56. package/test/custom-parser.1.test.js +40 -1
  57. package/test/decorator-namespace.test._js_ +31 -0
  58. package/test/decorator.test.js +92 -43
  59. package/test/delete.test.js +21 -1
  60. package/test/diagnostics-channel/404.test.js +57 -0
  61. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  62. package/test/diagnostics-channel/async-request.test.js +72 -0
  63. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  64. package/test/diagnostics-channel/error-request.test.js +61 -0
  65. package/test/diagnostics-channel/error-status.test.js +39 -0
  66. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  67. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  68. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  69. package/test/diagnostics-channel/sync-request.test.js +61 -0
  70. package/test/encapsulated-error-handler.test.js +201 -14
  71. package/test/esm/index.test.js +2 -12
  72. package/test/findRoute.test.js +16 -0
  73. package/test/genReqId.test.js +9 -0
  74. package/test/get.test.js +28 -0
  75. package/test/has-route.test.js +1 -1
  76. package/test/helper.js +1 -5
  77. package/test/hooks.test.js +0 -4
  78. package/test/http2/constraint.test.js +22 -1
  79. package/test/http2/plain.test.js +21 -6
  80. package/test/http2/secure.test.js +12 -1
  81. package/test/https/https.test.js +57 -0
  82. package/test/inject.test.js +1 -2
  83. package/test/internals/decorator.test.js +0 -2
  84. package/test/internals/errors.test.js +57 -17
  85. package/test/internals/handleRequest.test.js +5 -1
  86. package/test/internals/initialConfig.test.js +5 -5
  87. package/test/internals/logger.test.js +31 -2
  88. package/test/internals/reply.test.js +6 -78
  89. package/test/internals/request.test.js +13 -11
  90. package/test/listen.1.test.js +5 -15
  91. package/test/listen.5.test.js +99 -0
  92. package/test/logger/instantiation.test.js +8 -8
  93. package/test/logger/logging.test.js +4 -4
  94. package/test/logger/options.test.js +102 -21
  95. package/test/logger/response.test.js +6 -6
  96. package/test/maxRequestsPerSocket.test.js +2 -5
  97. package/test/method-missing.test.js +24 -0
  98. package/test/plugin.1.test.js +2 -4
  99. package/test/plugin.2.test.js +0 -2
  100. package/test/plugin.3.test.js +0 -2
  101. package/test/plugin.4.test.js +92 -56
  102. package/test/register.test.js +2 -4
  103. package/test/reply-earlyHints.test.js +98 -0
  104. package/test/reply-error.test.js +0 -2
  105. package/test/route-hooks.test.js +0 -1
  106. package/test/route-shorthand.test.js +60 -0
  107. package/test/schema-special-usage.test.js +1 -1
  108. package/test/server.test.js +17 -2
  109. package/test/stream.2.test.js +1 -1
  110. package/test/stream.4.test.js +0 -42
  111. package/test/stream.5.test.js +2 -2
  112. package/test/trust-proxy.test.js +33 -27
  113. package/test/types/errors.test-d.ts +0 -2
  114. package/test/types/fastify.test-d.ts +14 -12
  115. package/test/types/hooks.test-d.ts +1 -0
  116. package/test/types/import.ts +1 -0
  117. package/test/types/instance.test-d.ts +10 -51
  118. package/test/types/logger.test-d.ts +43 -6
  119. package/test/types/plugin.test-d.ts +5 -2
  120. package/test/types/register.test-d.ts +2 -2
  121. package/test/types/reply.test-d.ts +13 -12
  122. package/test/types/request.test-d.ts +19 -8
  123. package/test/types/route.test-d.ts +30 -2
  124. package/test/types/schema.test-d.ts +2 -2
  125. package/test/types/serverFactory.test-d.ts +1 -1
  126. package/test/types/type-provider.test-d.ts +59 -12
  127. package/test/types/using.test-d.ts +4 -1
  128. package/test/url-rewriting.test.js +3 -2
  129. package/test/useSemicolonDelimiter.test.js +3 -6
  130. package/test/versioned-routes.test.js +1 -1
  131. package/test/web-api.test.js +0 -6
  132. package/types/content-type-parser.d.ts +3 -3
  133. package/types/context.d.ts +0 -1
  134. package/types/errors.d.ts +1 -0
  135. package/types/hooks.d.ts +6 -6
  136. package/types/instance.d.ts +28 -41
  137. package/types/logger.d.ts +3 -3
  138. package/types/plugin.d.ts +3 -3
  139. package/types/reply.d.ts +9 -12
  140. package/types/request.d.ts +5 -3
  141. package/types/route.d.ts +31 -31
  142. package/types/schema.d.ts +3 -3
  143. package/types/serverFactory.d.ts +2 -2
  144. package/types/type-provider.d.ts +22 -12
  145. package/types/utils.d.ts +18 -23
  146. package/.c8rc.json +0 -8
  147. package/.eslintrc +0 -4
  148. package/.tap/processinfo/029eb7a1-1942-40bc-98e2-cef3b7a14b5e.json +0 -268
  149. package/.tap/processinfo/03c196c6-01c3-4268-a9b5-298dff18a873.json +0 -269
  150. package/.tap/processinfo/04bbabba-8611-4908-9092-dfa9fcc13327.json +0 -268
  151. package/.tap/processinfo/05d8a743-3edf-4e2d-ae5a-dc99d0855ba5.json +0 -272
  152. package/.tap/processinfo/07718963-36a8-4d87-82ad-366c877a5247.json +0 -268
  153. package/.tap/processinfo/08fe3bde-5814-4308-9158-cdf1e47391b7.json +0 -268
  154. package/.tap/processinfo/0a3e3fb0-eabf-4532-ae80-20434da22678.json +0 -268
  155. package/.tap/processinfo/0caf2a75-4b3a-46c4-9b41-c7e450e5e15f.json +0 -268
  156. package/.tap/processinfo/0cf35d52-e5b2-4884-bcf0-b0ab3017b689.json +0 -268
  157. package/.tap/processinfo/0e666134-5013-4ecd-9ee6-59b22716c39c.json +0 -268
  158. package/.tap/processinfo/1087b811-4ec4-4f91-92b4-a78a51a437de.json +0 -268
  159. package/.tap/processinfo/13709ed3-b68c-42cf-8472-b0c4b8a89d2b.json +0 -268
  160. package/.tap/processinfo/13ac2f18-d0e0-439f-bc86-2ff0119af857.json +0 -268
  161. package/.tap/processinfo/13e47e0e-f6e8-4381-8a42-923b661f4a4f.json +0 -268
  162. package/.tap/processinfo/143f7d43-b8e8-4666-b482-f28fb37160ee.json +0 -268
  163. package/.tap/processinfo/14f3801d-03ab-4db3-9df5-c5d47e0a8cf0.json +0 -270
  164. package/.tap/processinfo/15a07dad-4bcd-442c-95e0-30c31f2b9818.json +0 -273
  165. package/.tap/processinfo/191ad3ad-04d8-4fb9-b119-ad2811f9b925.json +0 -243
  166. package/.tap/processinfo/1b25d54b-62d3-44cd-b581-31e705522fae.json +0 -268
  167. package/.tap/processinfo/1b7cb260-f04b-4135-a4fe-093081c4706f.json +0 -268
  168. package/.tap/processinfo/1e395d63-4815-4c77-aa47-df3709cc0ef9.json +0 -268
  169. package/.tap/processinfo/1e7f6a54-3abf-4771-863a-585cba110aec.json +0 -268
  170. package/.tap/processinfo/21a15e1d-0b41-47d8-b03d-0ba130969034.json +0 -244
  171. package/.tap/processinfo/21e02016-9ecd-4983-8417-9c74d224644f.json +0 -269
  172. package/.tap/processinfo/2327d941-d0d5-4762-b386-02a9a27ad28e.json +0 -268
  173. package/.tap/processinfo/23d39204-eac9-4f57-8db4-ffa996227fbd.json +0 -268
  174. package/.tap/processinfo/2493875a-0ac6-4d53-993c-f44471fd0678.json +0 -268
  175. package/.tap/processinfo/2698669f-f1e7-4a12-a687-8d58177be2b0.json +0 -269
  176. package/.tap/processinfo/2862b053-0a3d-46d7-9381-ffcb06287609.json +0 -268
  177. package/.tap/processinfo/2ac1b8d6-ac92-40e2-a59a-7681069f487c.json +0 -268
  178. package/.tap/processinfo/2c75e5f7-c4ef-47e4-a1c4-105eef6c0fab.json +0 -242
  179. package/.tap/processinfo/2e2c45cd-718b-4e5a-bf88-f801630f2803.json +0 -268
  180. package/.tap/processinfo/2f9ca478-3e03-4cce-a0bc-fcdc86d7c316.json +0 -268
  181. package/.tap/processinfo/30e3117f-fb74-456f-8f02-527e9eb9fcc3.json +0 -268
  182. package/.tap/processinfo/332be679-63c7-4b49-8b87-ef55995ada2d.json +0 -268
  183. package/.tap/processinfo/37c36f95-07f9-4ef0-8ab4-9e107d51b605.json +0 -269
  184. package/.tap/processinfo/3874eae2-f3db-44ef-9a9f-c8169d4b2b76.json +0 -268
  185. package/.tap/processinfo/38a7c3da-a411-41d0-8993-9deefd23500d.json +0 -268
  186. package/.tap/processinfo/3a7b6dbd-e153-4ce5-b557-21fb82009983.json +0 -269
  187. package/.tap/processinfo/3c6731ec-936d-470f-b7b0-0c87b54be051.json +0 -268
  188. package/.tap/processinfo/3c850ea9-4ef0-4044-a3fd-fbadfa9d543e.json +0 -268
  189. package/.tap/processinfo/3e4e15e0-a325-46f0-be57-5fd374560b7a.json +0 -269
  190. package/.tap/processinfo/3ed868e0-887c-402a-9f22-b1fdb74b4da0.json +0 -268
  191. package/.tap/processinfo/405498d7-5854-4ce1-a7dc-06920932f26d.json +0 -268
  192. package/.tap/processinfo/40b7eb19-ae35-4490-8a11-eb91a573c590.json +0 -268
  193. package/.tap/processinfo/40bb1260-d856-4248-8939-a0a05e322041.json +0 -268
  194. package/.tap/processinfo/41252e0b-7f69-44cc-b356-dd94bcbfdb29.json +0 -268
  195. package/.tap/processinfo/418fa710-e2fd-4508-b533-c179958da464.json +0 -269
  196. package/.tap/processinfo/433ef009-63aa-48fe-8e5d-c725228fa2fc.json +0 -268
  197. package/.tap/processinfo/44bf577c-9c01-4197-bd29-2e1ae888c4d4.json +0 -268
  198. package/.tap/processinfo/458fb7f2-20b9-48a2-8853-403c9851f605.json +0 -268
  199. package/.tap/processinfo/46b9892b-bb23-4b86-b0fa-9297f08c611a.json +0 -268
  200. package/.tap/processinfo/46bd9aaf-6cf3-4bd5-b90d-e136a7299a8e.json +0 -268
  201. package/.tap/processinfo/4779aa5f-e57a-4fcc-87e2-7d0bd4fca27f.json +0 -268
  202. package/.tap/processinfo/47b73f4b-ab31-49e1-97fd-8436dbe4bdf3.json +0 -269
  203. package/.tap/processinfo/49dba52e-e0c9-445d-8e9d-6d9ebe3ce6c4.json +0 -268
  204. package/.tap/processinfo/4b1dbc61-4e65-4c56-9784-2036f369038a.json +0 -268
  205. package/.tap/processinfo/4b6f0b40-43ef-4668-83a0-e07e28509df5.json +0 -268
  206. package/.tap/processinfo/4c236f70-f532-460b-8f7a-dd973301d493.json +0 -268
  207. package/.tap/processinfo/4d92b707-a268-48b8-885b-004d3a288c41.json +0 -269
  208. package/.tap/processinfo/4ff10bae-7c97-4c0a-b712-6c0d2f8c0e8e.json +0 -270
  209. package/.tap/processinfo/50f95bd5-ae12-4d83-99f4-ae9b0690c6a8.json +0 -268
  210. package/.tap/processinfo/557e4a49-d99c-4a63-b2f2-f33d897ab874.json +0 -268
  211. package/.tap/processinfo/589fd21a-8319-4abf-8cf7-82cb4a463a4b.json +0 -269
  212. package/.tap/processinfo/5a872f3a-949f-40be-8004-d739d034255c.json +0 -272
  213. package/.tap/processinfo/5abc301a-23da-424d-891e-3afbaff9156c.json +0 -269
  214. package/.tap/processinfo/5c31614c-a766-4837-ab59-dd6977166f72.json +0 -253
  215. package/.tap/processinfo/5d1e90c8-d819-4901-b022-f9ea4cd81978.json +0 -268
  216. package/.tap/processinfo/5d283e67-f31d-4fa8-a559-a1d8e82ee046.json +0 -269
  217. package/.tap/processinfo/5df505bc-6a4b-4c41-822f-51e2d7111de8.json +0 -268
  218. package/.tap/processinfo/5eaf64a2-fbfd-40e7-b391-c30f744b2bf1.json +0 -269
  219. package/.tap/processinfo/5ef5ede0-6436-4938-8401-d32ad4bffd5d.json +0 -268
  220. package/.tap/processinfo/606f05c0-8293-41db-bc92-eea82123697f.json +0 -269
  221. package/.tap/processinfo/6446806d-6cab-4c1d-a9ed-6bccaf3c4ea9.json +0 -268
  222. package/.tap/processinfo/64da7e08-925d-444d-98de-6568c6115d8d.json +0 -269
  223. package/.tap/processinfo/6917da6d-d2dc-466a-a893-7fb7412dde96.json +0 -268
  224. package/.tap/processinfo/69bbeee0-c398-4ccf-98b3-fb625a63bab4.json +0 -268
  225. package/.tap/processinfo/6da6ea8f-3370-4703-b230-90159531f766.json +0 -268
  226. package/.tap/processinfo/6ecffe1f-3016-4c11-9294-b488baced99f.json +0 -268
  227. package/.tap/processinfo/6f23f41f-ccbd-48cb-9ab6-311db0cfb65c.json +0 -270
  228. package/.tap/processinfo/70168912-9bb2-4334-bb89-041f1764cddf.json +0 -268
  229. package/.tap/processinfo/713a674e-40e1-46b4-866e-949d57c1a9f9.json +0 -270
  230. package/.tap/processinfo/730254d4-eacb-4cdf-80f4-8da22341cde5.json +0 -268
  231. package/.tap/processinfo/7344e559-c546-416f-8f1b-0f9fe12c6f02.json +0 -268
  232. package/.tap/processinfo/7556217a-0155-448f-b4d4-bec1bb0f6040.json +0 -269
  233. package/.tap/processinfo/7572079c-166c-4c4c-85ff-89b9430b214f.json +0 -268
  234. package/.tap/processinfo/7808180f-1974-47cd-bba2-2d6b8b711d65.json +0 -273
  235. package/.tap/processinfo/796dde83-da66-4db2-8d27-d45a3627c9c7.json +0 -268
  236. package/.tap/processinfo/7979819f-3723-48be-9f55-be700e689441.json +0 -270
  237. package/.tap/processinfo/7a664d39-d7f5-42f9-89df-15563048fab6.json +0 -268
  238. package/.tap/processinfo/7b047b72-01d9-4217-857c-93341651b4b3.json +0 -269
  239. package/.tap/processinfo/7ce41af6-7961-45ae-8c6f-b6e1c5692a48.json +0 -268
  240. package/.tap/processinfo/7e1de1c6-127e-463d-9357-081ee33ef5ce.json +0 -269
  241. package/.tap/processinfo/81ac7a7f-b0c0-4ef6-82cb-c718ea84e152.json +0 -268
  242. package/.tap/processinfo/851a058f-a497-4b10-a0b7-c9182d9c4d5a.json +0 -268
  243. package/.tap/processinfo/86502974-c245-4194-ade4-d9c6fdbb757e.json +0 -268
  244. package/.tap/processinfo/86b9786f-4a98-43b8-882a-5f936b876f08.json +0 -241
  245. package/.tap/processinfo/8a3fe726-86ab-4300-8d73-7eacbbc02a05.json +0 -268
  246. package/.tap/processinfo/8adf928b-c963-4ba0-9c35-606fcbd8a2aa.json +0 -272
  247. package/.tap/processinfo/8b31a6d8-1a33-4a27-93ca-1c5b364be068.json +0 -240
  248. package/.tap/processinfo/8ec12773-6b18-49a2-8e52-874c797df965.json +0 -833
  249. package/.tap/processinfo/8edb9502-3420-42fb-a602-e5de93be2df1.json +0 -268
  250. package/.tap/processinfo/8fc572e6-9828-4f98-a49c-9e081b2193c4.json +0 -242
  251. package/.tap/processinfo/8fee2d30-c5dd-4fae-9cf2-2ef8dd0f90de.json +0 -834
  252. package/.tap/processinfo/92cc0496-5f26-4370-8212-18136b972f99.json +0 -268
  253. package/.tap/processinfo/93a3f064-3f6e-4f49-becb-f7925f2961a9.json +0 -268
  254. package/.tap/processinfo/967e3697-8310-4a19-8dd5-927ac8bd6c79.json +0 -269
  255. package/.tap/processinfo/97225e23-9d30-4287-b3f5-72bccebec50b.json +0 -268
  256. package/.tap/processinfo/9a363bc6-4e65-47e8-94ca-26a9db428fb4.json +0 -268
  257. package/.tap/processinfo/9d2fe462-57fa-43f1-b02c-d188f15de30b.json +0 -270
  258. package/.tap/processinfo/a00b6cda-feb7-4b8a-8179-4c43bc29d670.json +0 -269
  259. package/.tap/processinfo/a017cbd5-4ac7-49e1-8c77-1bf4f6e7f2a6.json +0 -271
  260. package/.tap/processinfo/a1277309-1984-48f8-b60b-f5e8639736be.json +0 -271
  261. package/.tap/processinfo/a16bf53e-4337-48ff-88fa-67f55738e0f5.json +0 -268
  262. package/.tap/processinfo/a3a9848f-440e-41bb-9b0b-568bcfee0ddc.json +0 -268
  263. package/.tap/processinfo/a468c11f-f2f1-4e92-9ba0-6d28b6569b72.json +0 -268
  264. package/.tap/processinfo/a5880465-68f1-46b3-84a5-0da389d0bc67.json +0 -268
  265. package/.tap/processinfo/a666f394-39b4-44ad-8e74-abebf74dde3b.json +0 -270
  266. package/.tap/processinfo/af09d8ca-7053-4410-b514-b22c47f5979f.json +0 -268
  267. package/.tap/processinfo/af203309-28aa-459d-a56e-d88833695521.json +0 -268
  268. package/.tap/processinfo/afa2f7b6-dcd2-4d90-bf3c-54ba8b6800eb.json +0 -268
  269. package/.tap/processinfo/b231291d-ef14-4ff0-85f9-38a73a5408f8.json +0 -268
  270. package/.tap/processinfo/b3d3f2a1-a9fc-4d88-b122-fae90248cd59.json +0 -268
  271. package/.tap/processinfo/b834bf83-26c4-403a-8e91-eb15fe4b0b5d.json +0 -268
  272. package/.tap/processinfo/b8786fd7-47df-4ac1-8d6f-2d4c7623c681.json +0 -268
  273. package/.tap/processinfo/b9758f53-7f5a-4b03-8684-8a42ad644e5a.json +0 -268
  274. package/.tap/processinfo/bd194ea2-a21a-4604-b225-ee48abf1e607.json +0 -242
  275. package/.tap/processinfo/bd7ced53-3872-43b7-ad73-3352e50b728b.json +0 -268
  276. package/.tap/processinfo/be50295b-7e50-46cd-8bf1-637bf222699c.json +0 -268
  277. package/.tap/processinfo/bec61dd9-aa52-4e6c-8e37-5c9c10e935fd.json +0 -268
  278. package/.tap/processinfo/c015adf9-1d60-447e-87b5-b2031fe55bba.json +0 -268
  279. package/.tap/processinfo/c0666afa-7f64-45bd-97fb-145df1380157.json +0 -268
  280. package/.tap/processinfo/c2c0c012-c1c0-4457-84d6-dadba8396c94.json +0 -268
  281. package/.tap/processinfo/c3dd3ecd-737b-47ce-a917-54341c7bbed3.json +0 -268
  282. package/.tap/processinfo/c41ac06d-64b8-4bb3-bf56-0551f5a48f4b.json +0 -268
  283. package/.tap/processinfo/c4235bfb-a2aa-4271-9c6b-3ceb370219b1.json +0 -268
  284. package/.tap/processinfo/c4e6f24f-288c-493c-b6f0-02924aeb6758.json +0 -270
  285. package/.tap/processinfo/c54227bb-4a7b-40bb-bfe6-b54fe55078f3.json +0 -268
  286. package/.tap/processinfo/c699de91-3b0b-4466-9418-6910a3eb640a.json +0 -269
  287. package/.tap/processinfo/c74e2f37-451a-4577-ac18-e597fbd9a1d4.json +0 -269
  288. package/.tap/processinfo/c90cccec-5b4b-445f-a935-ac22859675d0.json +0 -252
  289. package/.tap/processinfo/c9dd6c7d-0d16-45e5-87ae-117388bf2994.json +0 -268
  290. package/.tap/processinfo/ca2e48fb-58c5-47fc-ad2e-263838aea42c.json +0 -272
  291. package/.tap/processinfo/ca87351d-c710-45c1-838a-16bccac59874.json +0 -273
  292. package/.tap/processinfo/cdb4a671-5776-4944-91b9-c456c58841ef.json +0 -268
  293. package/.tap/processinfo/cf10fdc8-6a87-447a-9e12-45f447af61f3.json +0 -244
  294. package/.tap/processinfo/cf3f1f08-643e-4f24-82ca-40f7a349c3d1.json +0 -268
  295. package/.tap/processinfo/d091172a-06a5-469b-82a9-8fefe3dd99da.json +0 -240
  296. package/.tap/processinfo/d1675431-61d6-45f8-a010-6e654112a00a.json +0 -272
  297. package/.tap/processinfo/d2d54aa2-c221-4ad4-b6b7-0c58e3c3679c.json +0 -269
  298. package/.tap/processinfo/d4f3c95a-ddbe-419d-bce0-dd6acceee21f.json +0 -268
  299. package/.tap/processinfo/d54ed8f1-43c3-478a-90d3-2c8aced723f2.json +0 -269
  300. package/.tap/processinfo/d6e5a2a6-4647-4d98-916c-aec4ace54a65.json +0 -268
  301. package/.tap/processinfo/d7280c64-45e6-4b12-affc-3ac9a5d4014a.json +0 -268
  302. package/.tap/processinfo/d82c8367-d825-4405-88df-07298f6ef840.json +0 -269
  303. package/.tap/processinfo/d8f97e53-e921-4d33-9c8d-2f7e807a9425.json +0 -268
  304. package/.tap/processinfo/da546a73-9714-4f8c-bdbb-e42730edbcfa.json +0 -268
  305. package/.tap/processinfo/da7fb7fb-1da4-49f8-a3ee-d4ea623c01a5.json +0 -268
  306. package/.tap/processinfo/daa6a016-4f0c-4050-923c-2022e0bb21d8.json +0 -268
  307. package/.tap/processinfo/db9a251d-8540-4719-b464-e7d5febd97d1.json +0 -240
  308. package/.tap/processinfo/dc10c603-8e58-4611-baa3-44da2578d07a.json +0 -268
  309. package/.tap/processinfo/dde56c1a-858c-47cc-b0bb-61279620ac17.json +0 -268
  310. package/.tap/processinfo/e0d9c4ea-f7c7-4c64-8ced-66dc6f0ac5d2.json +0 -271
  311. package/.tap/processinfo/e121454f-5dfa-4209-ba15-4c39840871f2.json +0 -831
  312. package/.tap/processinfo/e1f43e40-c3fe-4eb8-a713-d5910cc6b25a.json +0 -268
  313. package/.tap/processinfo/e4575e7a-f00e-488b-94e1-8f877b54725e.json +0 -268
  314. package/.tap/processinfo/e9ad667e-8603-4488-af64-449cc9532803.json +0 -268
  315. package/.tap/processinfo/eb26a697-e5e2-4730-aeea-bcb9c49afd4d.json +0 -268
  316. package/.tap/processinfo/eb29d1c3-feaf-4744-9d84-cf257e8269b0.json +0 -268
  317. package/.tap/processinfo/ee720c0a-ed64-4e7e-8c0a-139c7b9725d2.json +0 -268
  318. package/.tap/processinfo/ef88c13a-87b2-49e4-a683-7b812505cd6f.json +0 -268
  319. package/.tap/processinfo/f4ed6948-dac0-4128-9f86-d083b6918ea7.json +0 -268
  320. package/.tap/processinfo/f7544c01-8ac7-4e42-8ad5-c4d62e094d1f.json +0 -270
  321. package/.tap/processinfo/f7cee4b3-7bcc-4591-a628-5629b0b41c9e.json +0 -268
  322. package/.tap/processinfo/f9c0a1f7-c1a4-44d3-ae3f-8c1eb42cd746.json +0 -269
  323. package/.tap/processinfo/fc46b4da-79db-4201-af7e-34bb17f92d69.json +0 -270
  324. package/.tap/processinfo/fccc0056-03c4-40cb-9d0b-2db4bbe573c1.json +0 -268
  325. package/.tap/processinfo/fd2df572-54d7-4ce7-b7aa-a2b4b00d4127.json +0 -254
  326. package/.tap/processinfo/fea9377f-b473-484d-bee6-ac7f49e50937.json +0 -269
  327. package/.tap/processinfo/feb516dc-abda-46e6-9b42-d37adfc63366.json +0 -268
  328. package/.tap/processinfo/ff0fda4c-aa2e-4236-906e-fdfb6bd6632e.json +0 -269
  329. package/.tap/test-results/test/404s.test.js.tap +0 -623
  330. package/.tap/test-results/test/500s.test.js.tap +0 -64
  331. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +0 -36
  332. package/.tap/test-results/test/als.test.js.tap +0 -15
  333. package/.tap/test-results/test/async-await.test.js.tap +0 -184
  334. package/.tap/test-results/test/async-dispose.test.js.tap +0 -8
  335. package/.tap/test-results/test/async_hooks.test.js.tap +0 -10
  336. package/.tap/test-results/test/bodyLimit.test.js.tap +0 -48
  337. package/.tap/test-results/test/buffer.test.js.tap +0 -20
  338. package/.tap/test-results/test/build/error-serializer.test.js.tap +0 -8
  339. package/.tap/test-results/test/build/version.test.js.tap +0 -7
  340. package/.tap/test-results/test/case-insensitive.test.js.tap +0 -36
  341. package/.tap/test-results/test/chainable.test.js.tap +0 -17
  342. package/.tap/test-results/test/check.test.js.tap +0 -10
  343. package/.tap/test-results/test/childLoggerFactory.test.js.tap +0 -23
  344. package/.tap/test-results/test/client-timeout.test.js.tap +0 -7
  345. package/.tap/test-results/test/close-pipelining.test.js.tap +0 -15
  346. package/.tap/test-results/test/close.test.js.tap +0 -172
  347. package/.tap/test-results/test/connectionTimeout.test.js.tap +0 -12
  348. package/.tap/test-results/test/constrained-routes.test.js.tap +0 -173
  349. package/.tap/test-results/test/content-length.test.js.tap +0 -46
  350. package/.tap/test-results/test/content-parser.test.js.tap +0 -266
  351. package/.tap/test-results/test/content-type.test.js.tap +0 -14
  352. package/.tap/test-results/test/context-config.test.js.tap +0 -41
  353. package/.tap/test-results/test/copy.test.js.tap +0 -14
  354. package/.tap/test-results/test/custom-http-server.test.js.tap +0 -30
  355. package/.tap/test-results/test/custom-parser-async.test.js.tap +0 -21
  356. package/.tap/test-results/test/custom-parser.0.test.js.tap +0 -199
  357. package/.tap/test-results/test/custom-parser.1.test.js.tap +0 -90
  358. package/.tap/test-results/test/custom-parser.2.test.js.tap +0 -22
  359. package/.tap/test-results/test/custom-parser.3.test.js.tap +0 -53
  360. package/.tap/test-results/test/custom-parser.4.test.js.tap +0 -45
  361. package/.tap/test-results/test/custom-parser.5.test.js.tap +0 -41
  362. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +0 -46
  363. package/.tap/test-results/test/decorator.test.js.tap +0 -465
  364. package/.tap/test-results/test/delete.test.js.tap +0 -110
  365. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +0 -15
  366. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +0 -25
  367. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +0 -24
  368. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +0 -9
  369. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +0 -20
  370. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +0 -10
  371. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +0 -14
  372. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +0 -16
  373. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +0 -16
  374. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +0 -19
  375. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +0 -18
  376. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +0 -243
  377. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +0 -9
  378. package/.tap/test-results/test/esm/esm.test.mjs.tap +0 -8
  379. package/.tap/test-results/test/esm/index.test.js.tap +0 -8
  380. package/.tap/test-results/test/fastify-instance.test.js.tap +0 -114
  381. package/.tap/test-results/test/findRoute.test.js.tap +0 -37
  382. package/.tap/test-results/test/fluent-schema.test.js.tap +0 -36
  383. package/.tap/test-results/test/genReqId.test.js.tap +0 -106
  384. package/.tap/test-results/test/get.test.js.tap +0 -151
  385. package/.tap/test-results/test/handler-context.test.js.tap +0 -19
  386. package/.tap/test-results/test/has-route.test.js.tap +0 -30
  387. package/.tap/test-results/test/head.test.js.tap +0 -130
  388. package/.tap/test-results/test/header-overflow.test.js.tap +0 -16
  389. package/.tap/test-results/test/hooks-async.test.js.tap +0 -286
  390. package/.tap/test-results/test/hooks.on-listen.test.js.tap +0 -311
  391. package/.tap/test-results/test/hooks.on-ready.test.js.tap +0 -151
  392. package/.tap/test-results/test/hooks.test.js.tap +0 -966
  393. package/.tap/test-results/test/http2/closing.test.js.tap +0 -35
  394. package/.tap/test-results/test/http2/constraint.test.js.tap +0 -32
  395. package/.tap/test-results/test/http2/head.test.js.tap +0 -9
  396. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +0 -8
  397. package/.tap/test-results/test/http2/plain.test.js.tap +0 -22
  398. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +0 -40
  399. package/.tap/test-results/test/http2/secure.test.js.tap +0 -27
  400. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +0 -9
  401. package/.tap/test-results/test/https/custom-https-server.test.js.tap +0 -10
  402. package/.tap/test-results/test/https/https.test.js.tap +0 -45
  403. package/.tap/test-results/test/imports.test.js.tap +0 -14
  404. package/.tap/test-results/test/inject.test.js.tap +0 -165
  405. package/.tap/test-results/test/internals/all.test.js.tap +0 -42
  406. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +0 -14
  407. package/.tap/test-results/test/internals/context.test.js.tap +0 -14
  408. package/.tap/test-results/test/internals/decorator.test.js.tap +0 -51
  409. package/.tap/test-results/test/internals/errors.test.js.tap +0 -1212
  410. package/.tap/test-results/test/internals/handleRequest.test.js.tap +0 -69
  411. package/.tap/test-results/test/internals/hookRunner.test.js.tap +0 -143
  412. package/.tap/test-results/test/internals/hooks.test.js.tap +0 -45
  413. package/.tap/test-results/test/internals/initialConfig.test.js.tap +0 -125
  414. package/.tap/test-results/test/internals/logger.test.js.tap +0 -71
  415. package/.tap/test-results/test/internals/plugin.test.js.tap +0 -48
  416. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +0 -166
  417. package/.tap/test-results/test/internals/reply.test.js.tap +0 -688
  418. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +0 -74
  419. package/.tap/test-results/test/internals/request-validate.test.js.tap +0 -384
  420. package/.tap/test-results/test/internals/request.test.js.tap +0 -163
  421. package/.tap/test-results/test/internals/server.test.js.tap +0 -30
  422. package/.tap/test-results/test/internals/validation.test.js.tap +0 -121
  423. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +0 -12
  424. package/.tap/test-results/test/listen.1.test.js.tap +0 -31
  425. package/.tap/test-results/test/listen.2.test.js.tap +0 -46
  426. package/.tap/test-results/test/listen.3.test.js.tap +0 -25
  427. package/.tap/test-results/test/listen.4.test.js.tap +0 -51
  428. package/.tap/test-results/test/lock.test.js.tap +0 -29
  429. package/.tap/test-results/test/logger/instantiation.test.js.tap +0 -92
  430. package/.tap/test-results/test/logger/logging.test.js.tap +0 -117
  431. package/.tap/test-results/test/logger/options.test.js.tap +0 -165
  432. package/.tap/test-results/test/logger/request.test.js.tap +0 -82
  433. package/.tap/test-results/test/logger/response.test.js.tap +0 -38
  434. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +0 -44
  435. package/.tap/test-results/test/method-missing.test.js.tap +0 -8
  436. package/.tap/test-results/test/middleware.test.js.tap +0 -17
  437. package/.tap/test-results/test/mkcalendar.test.js.tap +0 -43
  438. package/.tap/test-results/test/mkcol.test.js.tap +0 -14
  439. package/.tap/test-results/test/move.test.js.tap +0 -15
  440. package/.tap/test-results/test/noop-set.test.js.tap +0 -8
  441. package/.tap/test-results/test/nullable-validation.test.js.tap +0 -36
  442. package/.tap/test-results/test/options.error-handler.test.js.tap +0 -186
  443. package/.tap/test-results/test/options.test.js.tap +0 -174
  444. package/.tap/test-results/test/output-validation.test.js.tap +0 -66
  445. package/.tap/test-results/test/patch.error-handler.test.js.tap +0 -206
  446. package/.tap/test-results/test/patch.test.js.tap +0 -182
  447. package/.tap/test-results/test/plugin.1.test.js.tap +0 -78
  448. package/.tap/test-results/test/plugin.2.test.js.tap +0 -102
  449. package/.tap/test-results/test/plugin.3.test.js.tap +0 -58
  450. package/.tap/test-results/test/plugin.4.test.js.tap +0 -164
  451. package/.tap/test-results/test/post-empty-body.test.js.tap +0 -8
  452. package/.tap/test-results/test/pretty-print.test.js.tap +0 -82
  453. package/.tap/test-results/test/promises.test.js.tap +0 -46
  454. package/.tap/test-results/test/propfind.test.js.tap +0 -43
  455. package/.tap/test-results/test/proppatch.test.js.tap +0 -29
  456. package/.tap/test-results/test/proto-poisoning.test.js.tap +0 -47
  457. package/.tap/test-results/test/put.error-handler.test.js.tap +0 -206
  458. package/.tap/test-results/test/put.test.js.tap +0 -182
  459. package/.tap/test-results/test/register.test.js.tap +0 -61
  460. package/.tap/test-results/test/reply-code.test.js.tap +0 -40
  461. package/.tap/test-results/test/reply-earlyHints.test.js.tap +0 -22
  462. package/.tap/test-results/test/reply-error.test.js.tap +0 -643
  463. package/.tap/test-results/test/reply-trailers.test.js.tap +0 -176
  464. package/.tap/test-results/test/report.test.js.tap +0 -43
  465. package/.tap/test-results/test/request-error.test.js.tap +0 -98
  466. package/.tap/test-results/test/request-id.test.js.tap +0 -38
  467. package/.tap/test-results/test/request.deprecated.test.js.tap +0 -13
  468. package/.tap/test-results/test/requestTimeout.test.js.tap +0 -21
  469. package/.tap/test-results/test/route-hooks.test.js.tap +0 -498
  470. package/.tap/test-results/test/route-prefix.test.js.tap +0 -195
  471. package/.tap/test-results/test/route-shorthand.test.js.tap +0 -190
  472. package/.tap/test-results/test/route.1.test.js.tap +0 -93
  473. package/.tap/test-results/test/route.2.test.js.tap +0 -28
  474. package/.tap/test-results/test/route.3.test.js.tap +0 -39
  475. package/.tap/test-results/test/route.4.test.js.tap +0 -32
  476. package/.tap/test-results/test/route.5.test.js.tap +0 -54
  477. package/.tap/test-results/test/route.6.test.js.tap +0 -81
  478. package/.tap/test-results/test/route.7.test.js.tap +0 -93
  479. package/.tap/test-results/test/route.8.test.js.tap +0 -38
  480. package/.tap/test-results/test/router-options.test.js.tap +0 -104
  481. package/.tap/test-results/test/same-shape.test.js.tap +0 -22
  482. package/.tap/test-results/test/schema-examples.test.js.tap +0 -85
  483. package/.tap/test-results/test/schema-feature.test.js.tap +0 -445
  484. package/.tap/test-results/test/schema-serialization.test.js.tap +0 -194
  485. package/.tap/test-results/test/schema-special-usage.test.js.tap +0 -186
  486. package/.tap/test-results/test/schema-validation.test.js.tap +0 -199
  487. package/.tap/test-results/test/search.test.js.tap +0 -77
  488. package/.tap/test-results/test/serialize-response.test.js.tap +0 -26
  489. package/.tap/test-results/test/server.test.js.tap +0 -65
  490. package/.tap/test-results/test/set-error-handler.test.js.tap +0 -7
  491. package/.tap/test-results/test/skip-reply-send.test.js.tap +0 -272
  492. package/.tap/test-results/test/stream.1.test.js.tap +0 -36
  493. package/.tap/test-results/test/stream.2.test.js.tap +0 -20
  494. package/.tap/test-results/test/stream.3.test.js.tap +0 -34
  495. package/.tap/test-results/test/stream.4.test.js.tap +0 -40
  496. package/.tap/test-results/test/stream.5.test.js.tap +0 -37
  497. package/.tap/test-results/test/sync-routes.test.js.tap +0 -19
  498. package/.tap/test-results/test/throw.test.js.tap +0 -116
  499. package/.tap/test-results/test/trace.test.js.tap +0 -7
  500. package/.tap/test-results/test/trust-proxy.test.js.tap +0 -109
  501. package/.tap/test-results/test/type-provider.test.js.tap +0 -12
  502. package/.tap/test-results/test/unlock.test.js.tap +0 -14
  503. package/.tap/test-results/test/upgrade.test.js.tap +0 -8
  504. package/.tap/test-results/test/url-rewriting.test.js.tap +0 -39
  505. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +0 -33
  506. package/.tap/test-results/test/validation-error-handling.test.js.tap +0 -180
  507. package/.tap/test-results/test/versioned-routes.test.js.tap +0 -151
  508. package/.tap/test-results/test/web-api.test.js.tap +0 -51
  509. package/.tap/test-results/test/wrapThenable.test.js.tap +0 -11
  510. package/EXPENSE_POLICY.md +0 -105
  511. package/test/default-route.test.js +0 -88
  512. package/test/listen.deprecated.test.js +0 -229
  513. package/test/unsupported-httpversion.test.js +0 -31
  514. package/types/.eslintrc.json +0 -48
@@ -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 80 errors', t => {
8
+ test('should expose 84 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 80 errors', t => {
14
14
  counter++
15
15
  }
16
16
  }
17
- t.equal(counter, 80)
17
+ t.equal(counter, 84)
18
18
  })
19
19
 
20
20
  test('ensure name and codes of Errors are identical', t => {
21
- t.plan(80)
21
+ t.plan(84)
22
22
  const exportedKeys = Object.keys(errors)
23
23
  for (const key of exportedKeys) {
24
24
  if (errors[key].name === 'FastifyError') {
@@ -247,6 +247,16 @@ test('FST_ERR_DEC_AFTER_START', t => {
247
247
  t.ok(error instanceof Error)
248
248
  })
249
249
 
250
+ test('FST_ERR_DEC_REFERENCE_TYPE', t => {
251
+ t.plan(5)
252
+ const error = new errors.FST_ERR_DEC_REFERENCE_TYPE()
253
+ t.equal(error.name, 'FastifyError')
254
+ t.equal(error.code, 'FST_ERR_DEC_REFERENCE_TYPE')
255
+ t.equal(error.message, "The decorator '%s' of type '%s' is a reference type. Use the { getter, setter } interface instead.")
256
+ t.equal(error.statusCode, 500)
257
+ t.ok(error instanceof Error)
258
+ })
259
+
250
260
  test('FST_ERR_HOOK_INVALID_TYPE', t => {
251
261
  t.plan(5)
252
262
  const error = new errors.FST_ERR_HOOK_INVALID_TYPE()
@@ -327,6 +337,36 @@ test('FST_ERR_LOG_INVALID_LOGGER', t => {
327
337
  t.ok(error instanceof TypeError)
328
338
  })
329
339
 
340
+ test('FST_ERR_LOG_INVALID_LOGGER_INSTANCE', t => {
341
+ t.plan(5)
342
+ const error = new errors.FST_ERR_LOG_INVALID_LOGGER_INSTANCE()
343
+ t.equal(error.name, 'FastifyError')
344
+ t.equal(error.code, 'FST_ERR_LOG_INVALID_LOGGER_INSTANCE')
345
+ t.equal(error.message, 'loggerInstance only accepts a logger instance.')
346
+ t.equal(error.statusCode, 500)
347
+ t.ok(error instanceof TypeError)
348
+ })
349
+
350
+ test('FST_ERR_LOG_INVALID_LOGGER_CONFIG', t => {
351
+ t.plan(5)
352
+ const error = new errors.FST_ERR_LOG_INVALID_LOGGER_CONFIG()
353
+ t.equal(error.name, 'FastifyError')
354
+ t.equal(error.code, 'FST_ERR_LOG_INVALID_LOGGER_CONFIG')
355
+ t.equal(error.message, 'logger options only accepts a configuration object.')
356
+ t.equal(error.statusCode, 500)
357
+ t.ok(error instanceof TypeError)
358
+ })
359
+
360
+ test('FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED', t => {
361
+ t.plan(5)
362
+ const error = new errors.FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED()
363
+ t.equal(error.name, 'FastifyError')
364
+ t.equal(error.code, 'FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED')
365
+ t.equal(error.message, 'You cannot provide both logger and loggerInstance. Please provide only one.')
366
+ t.equal(error.statusCode, 500)
367
+ t.ok(error instanceof TypeError)
368
+ })
369
+
330
370
  test('FST_ERR_REP_INVALID_PAYLOAD_TYPE', t => {
331
371
  t.plan(5)
332
372
  const error = new errors.FST_ERR_REP_INVALID_PAYLOAD_TYPE()
@@ -587,16 +627,6 @@ test('FST_ERR_ASYNC_CONSTRAINT', t => {
587
627
  t.ok(error instanceof Error)
588
628
  })
589
629
 
590
- test('FST_ERR_DEFAULT_ROUTE_INVALID_TYPE', t => {
591
- t.plan(5)
592
- const error = new errors.FST_ERR_DEFAULT_ROUTE_INVALID_TYPE()
593
- t.equal(error.name, 'FastifyError')
594
- t.equal(error.code, 'FST_ERR_DEFAULT_ROUTE_INVALID_TYPE')
595
- t.equal(error.message, 'The defaultRoute type should be a function')
596
- t.equal(error.statusCode, 500)
597
- t.ok(error instanceof TypeError)
598
- })
599
-
600
630
  test('FST_ERR_INVALID_URL', t => {
601
631
  t.plan(5)
602
632
  const error = new errors.FST_ERR_INVALID_URL()
@@ -757,6 +787,16 @@ test('FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE', t => {
757
787
  t.ok(error instanceof Error)
758
788
  })
759
789
 
790
+ test('FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER', t => {
791
+ t.plan(5)
792
+ const error = new errors.FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER('easter-egg')
793
+ t.equal(error.name, 'FastifyError')
794
+ t.equal(error.code, 'FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER')
795
+ t.equal(error.message, 'The easter-egg plugin being registered mixes async and callback styles. Async plugin should not mix async and callback style.')
796
+ t.equal(error.statusCode, 500)
797
+ t.ok(error instanceof TypeError)
798
+ })
799
+
760
800
  test('FST_ERR_PLUGIN_CALLBACK_NOT_FN', t => {
761
801
  t.plan(5)
762
802
  const error = new errors.FST_ERR_PLUGIN_CALLBACK_NOT_FN()
@@ -838,7 +878,7 @@ test('FST_ERR_ERROR_HANDLER_NOT_FN', t => {
838
878
  })
839
879
 
840
880
  test('Ensure that all errors are in Errors.md TOC', t => {
841
- t.plan(80)
881
+ t.plan(84)
842
882
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
843
883
 
844
884
  const exportedKeys = Object.keys(errors)
@@ -850,7 +890,7 @@ test('Ensure that all errors are in Errors.md TOC', t => {
850
890
  })
851
891
 
852
892
  test('Ensure that non-existing errors are not in Errors.md TOC', t => {
853
- t.plan(80)
893
+ t.plan(84)
854
894
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
855
895
 
856
896
  const matchRE = / {4}- \[([A-Z0-9_]+)\]\(#[a-z0-9_]+\)/g
@@ -863,7 +903,7 @@ test('Ensure that non-existing errors are not in Errors.md TOC', t => {
863
903
  })
864
904
 
865
905
  test('Ensure that all errors are in Errors.md documented', t => {
866
- t.plan(80)
906
+ t.plan(84)
867
907
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
868
908
 
869
909
  const exportedKeys = Object.keys(errors)
@@ -875,7 +915,7 @@ test('Ensure that all errors are in Errors.md documented', t => {
875
915
  })
876
916
 
877
917
  test('Ensure that non-existing errors are not in Errors.md documented', t => {
878
- t.plan(80)
918
+ t.plan(84)
879
919
  const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
880
920
 
881
921
  const matchRE = /<a id="[0-9a-zA-Z_]+">([0-9a-zA-Z_]+)<\/a>/g
@@ -94,7 +94,11 @@ test('handler function - reply', t => {
94
94
  preValidation: [],
95
95
  preHandler: [],
96
96
  onSend: [],
97
- onError: []
97
+ onError: [],
98
+ config: {
99
+ url: '',
100
+ method: ''
101
+ }
98
102
  }
99
103
  buildSchema(context, schemaValidator)
100
104
  internals.handler({ [kRouteContext]: context }, new Reply(res, { [kRouteContext]: context }))
@@ -45,11 +45,11 @@ test('without options passed to Fastify, initialConfig should expose default val
45
45
  onProtoPoisoning: 'error',
46
46
  onConstructorPoisoning: 'error',
47
47
  pluginTimeout: 10000,
48
- requestIdHeader: 'request-id',
48
+ requestIdHeader: false,
49
49
  requestIdLogLabel: 'reqId',
50
50
  http2SessionTimeout: 72000,
51
51
  exposeHeadRoutes: true,
52
- useSemicolonDelimiter: true
52
+ useSemicolonDelimiter: false
53
53
  }
54
54
 
55
55
  t.same(Fastify().initialConfig, fastifyDefaultOptions)
@@ -105,7 +105,7 @@ test('Fastify.initialConfig should expose all options', t => {
105
105
  genReqId: function (req) {
106
106
  return reqId++
107
107
  },
108
- logger: pino({ level: 'info' }),
108
+ loggerInstance: pino({ level: 'info' }),
109
109
  constraints: {
110
110
  version: versionStrategy
111
111
  },
@@ -285,11 +285,11 @@ test('Should not have issues when passing stream options to Pino.js', t => {
285
285
  onProtoPoisoning: 'error',
286
286
  onConstructorPoisoning: 'error',
287
287
  pluginTimeout: 10000,
288
- requestIdHeader: 'request-id',
288
+ requestIdHeader: false,
289
289
  requestIdLogLabel: 'reqId',
290
290
  http2SessionTimeout: 72000,
291
291
  exposeHeadRoutes: true,
292
- useSemicolonDelimiter: true
292
+ useSemicolonDelimiter: false
293
293
  })
294
294
  } catch (error) {
295
295
  t.fail()
@@ -46,13 +46,42 @@ test('The logger should add a unique id for every request', t => {
46
46
  }
47
47
  })
48
48
 
49
- test('The logger should reuse request id header for req.id', t => {
49
+ test('The logger should not reuse request id header for req.id', t => {
50
50
  const fastify = Fastify()
51
51
  fastify.get('/', (req, reply) => {
52
52
  t.ok(req.id)
53
53
  reply.send({ id: req.id })
54
54
  })
55
55
 
56
+ fastify.listen({ port: 0 }, err => {
57
+ t.error(err)
58
+
59
+ fastify.inject({
60
+ method: 'GET',
61
+ url: 'http://localhost:' + fastify.server.address().port,
62
+ headers: {
63
+ 'Request-Id': 'request-id-1'
64
+ }
65
+ }, (err, res) => {
66
+ t.error(err)
67
+ const payload = JSON.parse(res.payload)
68
+ t.ok(payload.id !== 'request-id-1', 'the request id from the header should not be returned with default configuration')
69
+ t.ok(payload.id === 'req-1') // first request id when using the default configuration
70
+ fastify.close()
71
+ t.end()
72
+ })
73
+ })
74
+ })
75
+
76
+ test('The logger should reuse request id header for req.id if requestIdHeader is set', t => {
77
+ const fastify = Fastify({
78
+ requestIdHeader: 'request-id'
79
+ })
80
+ fastify.get('/', (req, reply) => {
81
+ t.ok(req.id)
82
+ reply.send({ id: req.id })
83
+ })
84
+
56
85
  fastify.listen({ port: 0 }, err => {
57
86
  t.error(err)
58
87
 
@@ -127,7 +156,7 @@ test('The serializer prevent fails if the request socket is undefined', t => {
127
156
  method: 'GET',
128
157
  url: '/',
129
158
  version: undefined,
130
- hostname: undefined,
159
+ host: undefined,
131
160
  remoteAddress: undefined,
132
161
  remotePort: undefined
133
162
  })
@@ -19,7 +19,7 @@ const {
19
19
  } = require('../../lib/symbols')
20
20
  const fs = require('node:fs')
21
21
  const path = require('node:path')
22
- const { FSTDEP010, FSTDEP019, FSTDEP020, FSTDEP021 } = require('../../lib/warnings')
22
+ const { FSTDEP010, FSTDEP019, FSTDEP021 } = require('../../lib/warnings')
23
23
 
24
24
  const agent = new http.Agent({ keepAlive: false })
25
25
 
@@ -36,7 +36,7 @@ const doGet = function (url) {
36
36
  }
37
37
 
38
38
  test('Once called, Reply should return an object with methods', t => {
39
- t.plan(16)
39
+ t.plan(15)
40
40
  const response = { res: 'res' }
41
41
  const context = { config: { onSend: [] }, schema: {} }
42
42
  const request = { [kRouteContext]: context, [kPublicRouteContext]: { config: context.config, schema: context.schema } }
@@ -49,7 +49,6 @@ test('Once called, Reply should return an object with methods', t => {
49
49
  t.equal(typeof reply.status, 'function')
50
50
  t.equal(typeof reply.header, 'function')
51
51
  t.equal(typeof reply.serialize, 'function')
52
- t.equal(typeof reply.getResponseTime, 'function')
53
52
  t.equal(typeof reply[kReplyHeaders], 'object')
54
53
  t.same(reply.raw, response)
55
54
  t.equal(reply[kRouteContext], context)
@@ -1415,9 +1414,9 @@ test('.statusCode is getter and setter', t => {
1415
1414
  const fastify = Fastify()
1416
1415
 
1417
1416
  fastify.get('/', function (req, reply) {
1418
- t.ok(reply.statusCode, 200, 'default status value')
1417
+ t.equal(reply.statusCode, 200, 'default status value')
1419
1418
  reply.statusCode = 418
1420
- t.ok(reply.statusCode, 418)
1419
+ t.equal(reply.statusCode, 418)
1421
1420
  reply.send()
1422
1421
  })
1423
1422
 
@@ -1572,82 +1571,11 @@ test('should not throw error when attempting to set reply.sent if the underlinin
1572
1571
  })
1573
1572
  })
1574
1573
 
1575
- test('reply.getResponseTime() should return 0 before the timer is initialised on the reply by setting up response listeners', t => {
1574
+ test('reply.elapsedTime should return 0 before the timer is initialised on the reply by setting up response listeners', t => {
1576
1575
  t.plan(1)
1577
1576
  const response = { statusCode: 200 }
1578
1577
  const reply = new Reply(response, null)
1579
- t.equal(reply.getResponseTime(), 0)
1580
- })
1581
-
1582
- test('reply.getResponseTime() should return a number greater than 0 after the timer is initialised on the reply by setting up response listeners', t => {
1583
- t.plan(1)
1584
- const fastify = Fastify()
1585
- fastify.route({
1586
- method: 'GET',
1587
- url: '/',
1588
- handler: (req, reply) => {
1589
- reply.send('hello world')
1590
- }
1591
- })
1592
-
1593
- fastify.addHook('onResponse', (req, reply) => {
1594
- t.ok(reply.getResponseTime() > 0)
1595
- t.end()
1596
- })
1597
-
1598
- fastify.inject({ method: 'GET', url: '/' })
1599
- })
1600
-
1601
- test('should emit deprecation warning when trying to use reply.getResponseTime() and should return the time since a request started while inflight', t => {
1602
- t.plan(5)
1603
- const fastify = Fastify()
1604
- fastify.route({
1605
- method: 'GET',
1606
- url: '/',
1607
- handler: (req, reply) => {
1608
- reply.send('hello world')
1609
- }
1610
- })
1611
-
1612
- process.removeAllListeners('warning')
1613
- process.on('warning', onWarning)
1614
- function onWarning (warning) {
1615
- t.equal(warning.name, 'DeprecationWarning')
1616
- t.equal(warning.code, FSTDEP020.code)
1617
- }
1618
-
1619
- fastify.addHook('preValidation', (req, reply, done) => {
1620
- t.equal(reply.getResponseTime(), reply.getResponseTime())
1621
- done()
1622
- })
1623
-
1624
- fastify.inject({ method: 'GET', url: '/' }, (err, res) => {
1625
- t.error(err)
1626
- t.pass()
1627
-
1628
- process.removeListener('warning', onWarning)
1629
- })
1630
-
1631
- FSTDEP020.emitted = false
1632
- })
1633
-
1634
- test('reply.getResponseTime() should return the same value after a request is finished', t => {
1635
- t.plan(1)
1636
- const fastify = Fastify()
1637
- fastify.route({
1638
- method: 'GET',
1639
- url: '/',
1640
- handler: (req, reply) => {
1641
- reply.send('hello world')
1642
- }
1643
- })
1644
-
1645
- fastify.addHook('onResponse', (req, reply) => {
1646
- t.equal(reply.getResponseTime(), reply.getResponseTime())
1647
- t.end()
1648
- })
1649
-
1650
- fastify.inject({ method: 'GET', url: '/' })
1578
+ t.equal(reply.elapsedTime, 0)
1651
1579
  })
1652
1580
 
1653
1581
  test('reply.elapsedTime should return a number greater than 0 after the timer is initialised on the reply by setting up response listeners', t => {
@@ -60,7 +60,7 @@ test('Regular request', t => {
60
60
  t.equal(request.log, 'log')
61
61
  t.equal(request.ip, 'ip')
62
62
  t.equal(request.ips, undefined)
63
- t.equal(request.hostname, 'hostname')
63
+ t.equal(request.host, 'hostname')
64
64
  t.equal(request.body, undefined)
65
65
  t.equal(request.method, 'GET')
66
66
  t.equal(request.url, '/')
@@ -142,7 +142,7 @@ test('Request with undefined config', t => {
142
142
  })
143
143
 
144
144
  test('Regular request - hostname from authority', t => {
145
- t.plan(2)
145
+ t.plan(3)
146
146
  const headers = {
147
147
  ':authority': 'authority'
148
148
  }
@@ -155,11 +155,12 @@ test('Regular request - hostname from authority', t => {
155
155
 
156
156
  const request = new Request('id', 'params', req, 'query', 'log')
157
157
  t.type(request, Request)
158
- t.equal(request.hostname, 'authority')
158
+ t.equal(request.host, 'authority')
159
+ t.equal(request.port, null)
159
160
  })
160
161
 
161
162
  test('Regular request - host header has precedence over authority', t => {
162
- t.plan(2)
163
+ t.plan(3)
163
164
  const headers = {
164
165
  host: 'hostname',
165
166
  ':authority': 'authority'
@@ -172,7 +173,8 @@ test('Regular request - host header has precedence over authority', t => {
172
173
  }
173
174
  const request = new Request('id', 'params', req, 'query', 'log')
174
175
  t.type(request, Request)
175
- t.equal(request.hostname, 'hostname')
176
+ t.equal(request.host, 'hostname')
177
+ t.equal(request.port, null)
176
178
  })
177
179
 
178
180
  test('Request with trust proxy', t => {
@@ -222,7 +224,7 @@ test('Request with trust proxy', t => {
222
224
  t.equal(request.log, 'log')
223
225
  t.equal(request.ip, '2.2.2.2')
224
226
  t.same(request.ips, ['ip', '1.1.1.1', '2.2.2.2'])
225
- t.equal(request.hostname, 'example.com')
227
+ t.equal(request.host, 'example.com')
226
228
  t.equal(request.body, undefined)
227
229
  t.equal(request.method, 'GET')
228
230
  t.equal(request.url, '/')
@@ -272,7 +274,7 @@ test('Request with trust proxy - no x-forwarded-host header', t => {
272
274
  const TpRequest = Request.buildRequest(Request, true)
273
275
  const request = new TpRequest('id', 'params', req, 'query', 'log')
274
276
  t.type(request, TpRequest)
275
- t.equal(request.hostname, 'hostname')
277
+ t.equal(request.host, 'hostname')
276
278
  })
277
279
 
278
280
  test('Request with trust proxy - no x-forwarded-host header and fallback to authority', t => {
@@ -291,7 +293,7 @@ test('Request with trust proxy - no x-forwarded-host header and fallback to auth
291
293
  const TpRequest = Request.buildRequest(Request, true)
292
294
  const request = new TpRequest('id', 'params', req, 'query', 'log')
293
295
  t.type(request, TpRequest)
294
- t.equal(request.hostname, 'authority')
296
+ t.equal(request.host, 'authority')
295
297
  })
296
298
 
297
299
  test('Request with trust proxy - x-forwarded-host header has precedence over host', t => {
@@ -311,7 +313,7 @@ test('Request with trust proxy - x-forwarded-host header has precedence over hos
311
313
  const TpRequest = Request.buildRequest(Request, true)
312
314
  const request = new TpRequest('id', 'params', req, 'query', 'log')
313
315
  t.type(request, TpRequest)
314
- t.equal(request.hostname, 'example.com')
316
+ t.equal(request.host, 'example.com')
315
317
  })
316
318
 
317
319
  test('Request with trust proxy - handles multiple entries in x-forwarded-host/proto', t => {
@@ -330,7 +332,7 @@ test('Request with trust proxy - handles multiple entries in x-forwarded-host/pr
330
332
  const TpRequest = Request.buildRequest(Request, true)
331
333
  const request = new TpRequest('id', 'params', req, 'query', 'log')
332
334
  t.type(request, TpRequest)
333
- t.equal(request.hostname, 'example.com')
335
+ t.equal(request.host, 'example.com')
334
336
  t.equal(request.protocol, 'https')
335
337
  })
336
338
 
@@ -373,7 +375,7 @@ test('Request with undefined socket', t => {
373
375
  t.equal(request.log, 'log')
374
376
  t.equal(request.ip, undefined)
375
377
  t.equal(request.ips, undefined)
376
- t.equal(request.hostname, 'hostname')
378
+ t.equal(request.host, 'hostname')
377
379
  t.same(request.body, null)
378
380
  t.equal(request.method, 'GET')
379
381
  t.equal(request.url, '/')
@@ -29,25 +29,15 @@ test('Async/await listen with arguments', async t => {
29
29
  t.fail('should not be deprecated')
30
30
  })
31
31
 
32
- t.plan(1)
33
32
  const fastify = Fastify()
34
33
  t.teardown(fastify.close.bind(fastify))
35
34
  const addr = await fastify.listen({ port: 0, host: '0.0.0.0' })
36
35
  const address = fastify.server.address()
37
- t.equal(addr, `http://${address.address}:${address.port}`)
38
- })
39
-
40
- test('Promise listen with arguments', t => {
41
- process.on('warning', () => {
42
- t.fail('should not be deprecated')
43
- })
44
-
45
- t.plan(1)
46
- const fastify = Fastify()
47
- t.teardown(fastify.close.bind(fastify))
48
- fastify.listen({ port: 0, host: '0.0.0.0' }).then(addr => {
49
- const address = fastify.server.address()
50
- t.equal(addr, `http://${address.address}:${address.port}`)
36
+ t.equal(addr, `http://127.0.0.1:${address.port}`)
37
+ t.same(address, {
38
+ address: '0.0.0.0',
39
+ family: 'IPv4',
40
+ port: address.port
51
41
  })
52
42
  })
53
43
 
@@ -0,0 +1,99 @@
1
+ 'use strict'
2
+
3
+ const { test } = require('tap')
4
+ const net = require('node:net')
5
+ const Fastify = require('../fastify')
6
+ const { once } = require('node:events')
7
+
8
+ function createDeferredPromise () {
9
+ const promise = {}
10
+ promise.promise = new Promise((resolve) => {
11
+ promise.resolve = resolve
12
+ })
13
+ return promise
14
+ }
15
+
16
+ test('same port conflict and success should not fire callback multiple times - callback', async (t) => {
17
+ t.plan(7)
18
+ const server = net.createServer()
19
+ server.listen({ port: 0, host: '127.0.0.1' })
20
+ await once(server, 'listening')
21
+ const option = { port: server.address().port, host: server.address().address }
22
+ let count = 0
23
+ const fastify = Fastify()
24
+ const promise = createDeferredPromise()
25
+ function callback (err) {
26
+ switch (count) {
27
+ case 6: {
28
+ // success in here
29
+ t.error(err)
30
+ fastify.close((err) => {
31
+ t.error(err)
32
+ promise.resolve()
33
+ })
34
+ break
35
+ }
36
+ case 5: {
37
+ server.close()
38
+ setTimeout(() => {
39
+ fastify.listen(option, callback)
40
+ }, 100)
41
+ break
42
+ }
43
+ default: {
44
+ // expect error
45
+ t.equal(err.code, 'EADDRINUSE')
46
+ setTimeout(() => {
47
+ fastify.listen(option, callback)
48
+ }, 100)
49
+ }
50
+ }
51
+ count++
52
+ }
53
+ fastify.listen(option, callback)
54
+ await promise.promise
55
+ })
56
+
57
+ test('same port conflict and success should not fire callback multiple times - promise', async (t) => {
58
+ t.plan(5)
59
+ const server = net.createServer()
60
+ server.listen({ port: 0, host: '127.0.0.1' })
61
+ await once(server, 'listening')
62
+ const option = { port: server.address().port, host: server.address().address }
63
+ const fastify = Fastify()
64
+
65
+ try {
66
+ await fastify.listen(option)
67
+ } catch (err) {
68
+ t.equal(err.code, 'EADDRINUSE')
69
+ }
70
+ try {
71
+ await fastify.listen(option)
72
+ } catch (err) {
73
+ t.equal(err.code, 'EADDRINUSE')
74
+ }
75
+ try {
76
+ await fastify.listen(option)
77
+ } catch (err) {
78
+ t.equal(err.code, 'EADDRINUSE')
79
+ }
80
+ try {
81
+ await fastify.listen(option)
82
+ } catch (err) {
83
+ t.equal(err.code, 'EADDRINUSE')
84
+ }
85
+ try {
86
+ await fastify.listen(option)
87
+ } catch (err) {
88
+ t.equal(err.code, 'EADDRINUSE')
89
+ }
90
+
91
+ server.close()
92
+
93
+ await once(server, 'close')
94
+
95
+ // when ever we can listen, and close properly
96
+ // which means there is no problem on the callback
97
+ await fastify.listen()
98
+ await fastify.close()
99
+ })
@@ -32,9 +32,9 @@ t.test('logger instantiation', (t) => {
32
32
 
33
33
  const stream = split(JSON.parse)
34
34
 
35
- const logger = require('pino')(stream)
35
+ const loggerInstance = require('pino')(stream)
36
36
 
37
- const fastify = Fastify({ logger })
37
+ const fastify = Fastify({ loggerInstance })
38
38
  t.teardown(fastify.close.bind(fastify))
39
39
 
40
40
  fastify.get('/foo', function (req, reply) {
@@ -203,17 +203,17 @@ t.test('logger instantiation', (t) => {
203
203
  t.test('should be able to use a custom logger', (t) => {
204
204
  t.plan(7)
205
205
 
206
- const logger = {
206
+ const loggerInstance = {
207
207
  fatal: (msg) => { t.equal(msg, 'fatal') },
208
208
  error: (msg) => { t.equal(msg, 'error') },
209
209
  warn: (msg) => { t.equal(msg, 'warn') },
210
210
  info: (msg) => { t.equal(msg, 'info') },
211
211
  debug: (msg) => { t.equal(msg, 'debug') },
212
212
  trace: (msg) => { t.equal(msg, 'trace') },
213
- child: () => logger
213
+ child: () => loggerInstance
214
214
  }
215
215
 
216
- const fastify = Fastify({ logger })
216
+ const fastify = Fastify({ loggerInstance })
217
217
  t.teardown(fastify.close.bind(fastify))
218
218
 
219
219
  fastify.log.fatal('fatal')
@@ -223,7 +223,7 @@ t.test('logger instantiation', (t) => {
223
223
  fastify.log.debug('debug')
224
224
  fastify.log.trace('trace')
225
225
  const child = fastify.log.child()
226
- t.equal(child, logger)
226
+ t.equal(child, loggerInstance)
227
227
  })
228
228
 
229
229
  t.test('should throw in case a partially matching logger is provided', async (t) => {
@@ -246,7 +246,7 @@ t.test('logger instantiation', (t) => {
246
246
  t.plan(lines.length + 1)
247
247
 
248
248
  const stream = split(JSON.parse)
249
- const logger = require('pino')({
249
+ const loggerInstance = require('pino')({
250
250
  level: 'info',
251
251
  serializers: {
252
252
  req: function (req) {
@@ -258,7 +258,7 @@ t.test('logger instantiation', (t) => {
258
258
  }, stream)
259
259
 
260
260
  const fastify = Fastify({
261
- logger
261
+ loggerInstance
262
262
  })
263
263
  t.teardown(fastify.close.bind(fastify))
264
264
 
@@ -29,10 +29,10 @@ t.test('logging', (t) => {
29
29
 
30
30
  const stream = split(JSON.parse)
31
31
 
32
- const logger = pino({ level: 'trace' }, stream)
32
+ const loggerInstance = pino({ level: 'trace' }, stream)
33
33
 
34
34
  const fastify = Fastify({
35
- logger
35
+ loggerInstance
36
36
  })
37
37
  t.teardown(fastify.close.bind(fastify))
38
38
 
@@ -229,10 +229,10 @@ t.test('logging', (t) => {
229
229
  t.plan(lines.length + 1)
230
230
 
231
231
  const stream = split(JSON.parse)
232
- const logger = pino(stream)
232
+ const loggerInstance = pino(stream)
233
233
 
234
234
  const fastify = Fastify({
235
- logger
235
+ loggerInstance
236
236
  })
237
237
  t.teardown(fastify.close.bind(fastify))
238
238