fastify 4.27.0 → 5.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.markdownlint-cli2.yaml +1 -1
  2. package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +241 -0
  3. package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +268 -0
  4. package/.tap/test-results/test/404s.test.js.tap +623 -0
  5. package/.tap/test-results/test/500s.test.js.tap +64 -0
  6. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +36 -0
  7. package/.tap/test-results/test/als.test.js.tap +15 -0
  8. package/.tap/test-results/test/async-await.test.js.tap +184 -0
  9. package/.tap/test-results/test/async-dispose.test.js.tap +8 -0
  10. package/.tap/test-results/test/async_hooks.test.js.tap +10 -0
  11. package/.tap/test-results/test/bodyLimit.test.js.tap +48 -0
  12. package/.tap/test-results/test/buffer.test.js.tap +20 -0
  13. package/.tap/test-results/test/build/error-serializer.test.js.tap +12 -0
  14. package/.tap/test-results/test/build/version.test.js.tap +7 -0
  15. package/.tap/test-results/test/case-insensitive.test.js.tap +36 -0
  16. package/.tap/test-results/test/chainable.test.js.tap +17 -0
  17. package/.tap/test-results/test/check.test.js.tap +10 -0
  18. package/.tap/test-results/test/childLoggerFactory.test.js.tap +23 -0
  19. package/.tap/test-results/test/client-timeout.test.js.tap +7 -0
  20. package/.tap/test-results/test/close-pipelining.test.js.tap +15 -0
  21. package/.tap/test-results/test/close.test.js.tap +172 -0
  22. package/.tap/test-results/test/connectionTimeout.test.js.tap +12 -0
  23. package/.tap/test-results/test/constrained-routes.test.js.tap +173 -0
  24. package/.tap/test-results/test/content-length.test.js.tap +46 -0
  25. package/.tap/test-results/test/content-parser.test.js.tap +266 -0
  26. package/.tap/test-results/test/content-type.test.js.tap +14 -0
  27. package/.tap/test-results/test/context-config.test.js.tap +41 -0
  28. package/.tap/test-results/test/copy.test.js.tap +14 -0
  29. package/.tap/test-results/test/custom-http-server.test.js.tap +30 -0
  30. package/.tap/test-results/test/custom-parser-async.test.js.tap +21 -0
  31. package/.tap/test-results/test/custom-parser.0.test.js.tap +199 -0
  32. package/.tap/test-results/test/custom-parser.1.test.js.tap +90 -0
  33. package/.tap/test-results/test/custom-parser.2.test.js.tap +22 -0
  34. package/.tap/test-results/test/custom-parser.3.test.js.tap +53 -0
  35. package/.tap/test-results/test/custom-parser.4.test.js.tap +45 -0
  36. package/.tap/test-results/test/custom-parser.5.test.js.tap +41 -0
  37. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +46 -0
  38. package/.tap/test-results/test/decorator.test.js.tap +465 -0
  39. package/.tap/test-results/test/delete.test.js.tap +110 -0
  40. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +15 -0
  41. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +25 -0
  42. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +24 -0
  43. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +9 -0
  44. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +20 -0
  45. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +10 -0
  46. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +14 -0
  47. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +16 -0
  48. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +16 -0
  49. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +19 -0
  50. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +18 -0
  51. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +243 -0
  52. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +9 -0
  53. package/.tap/test-results/test/esm/esm.test.mjs.tap +8 -0
  54. package/.tap/test-results/test/esm/index.test.js.tap +8 -0
  55. package/.tap/test-results/test/fastify-instance.test.js.tap +114 -0
  56. package/.tap/test-results/test/findRoute.test.js.tap +37 -0
  57. package/.tap/test-results/test/fluent-schema.test.js.tap +36 -0
  58. package/.tap/test-results/test/genReqId.test.js.tap +106 -0
  59. package/.tap/test-results/test/get.test.js.tap +151 -0
  60. package/.tap/test-results/test/handler-context.test.js.tap +19 -0
  61. package/.tap/test-results/test/has-route.test.js.tap +30 -0
  62. package/.tap/test-results/test/head.test.js.tap +130 -0
  63. package/.tap/test-results/test/header-overflow.test.js.tap +16 -0
  64. package/.tap/test-results/test/hooks-async.test.js.tap +286 -0
  65. package/.tap/test-results/test/hooks.on-listen.test.js.tap +311 -0
  66. package/.tap/test-results/test/hooks.on-ready.test.js.tap +151 -0
  67. package/.tap/test-results/test/hooks.test.js.tap +966 -0
  68. package/.tap/test-results/test/http2/closing.test.js.tap +35 -0
  69. package/.tap/test-results/test/http2/constraint.test.js.tap +32 -0
  70. package/.tap/test-results/test/http2/head.test.js.tap +9 -0
  71. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +8 -0
  72. package/.tap/test-results/test/http2/plain.test.js.tap +22 -0
  73. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +40 -0
  74. package/.tap/test-results/test/http2/secure.test.js.tap +27 -0
  75. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +9 -0
  76. package/.tap/test-results/test/https/custom-https-server.test.js.tap +10 -0
  77. package/.tap/test-results/test/https/https.test.js.tap +45 -0
  78. package/.tap/test-results/test/imports.test.js.tap +14 -0
  79. package/.tap/test-results/test/inject.test.js.tap +165 -0
  80. package/.tap/test-results/test/internals/all.test.js.tap +42 -0
  81. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +14 -0
  82. package/.tap/test-results/test/internals/context.test.js.tap +14 -0
  83. package/.tap/test-results/test/internals/decorator.test.js.tap +51 -0
  84. package/.tap/test-results/test/internals/errors.test.js.tap +1212 -0
  85. package/.tap/test-results/test/internals/handleRequest.test.js.tap +69 -0
  86. package/.tap/test-results/test/internals/hookRunner.test.js.tap +143 -0
  87. package/.tap/test-results/test/internals/hooks.test.js.tap +45 -0
  88. package/.tap/test-results/test/internals/initialConfig.test.js.tap +125 -0
  89. package/.tap/test-results/test/internals/logger.test.js.tap +71 -0
  90. package/.tap/test-results/test/internals/plugin.test.js.tap +48 -0
  91. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +166 -0
  92. package/.tap/test-results/test/internals/reply.test.js.tap +688 -0
  93. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +74 -0
  94. package/.tap/test-results/test/internals/request-validate.test.js.tap +384 -0
  95. package/.tap/test-results/test/internals/request.test.js.tap +163 -0
  96. package/.tap/test-results/test/internals/server.test.js.tap +30 -0
  97. package/.tap/test-results/test/internals/validation.test.js.tap +121 -0
  98. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +12 -0
  99. package/.tap/test-results/test/listen.1.test.js.tap +31 -0
  100. package/.tap/test-results/test/listen.2.test.js.tap +46 -0
  101. package/.tap/test-results/test/listen.3.test.js.tap +25 -0
  102. package/.tap/test-results/test/listen.4.test.js.tap +51 -0
  103. package/.tap/test-results/test/lock.test.js.tap +29 -0
  104. package/.tap/test-results/test/logger/instantiation.test.js.tap +92 -0
  105. package/.tap/test-results/test/logger/logging.test.js.tap +117 -0
  106. package/.tap/test-results/test/logger/options.test.js.tap +165 -0
  107. package/.tap/test-results/test/logger/request.test.js.tap +82 -0
  108. package/.tap/test-results/test/logger/response.test.js.tap +38 -0
  109. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +44 -0
  110. package/.tap/test-results/test/method-missing.test.js.tap +8 -0
  111. package/.tap/test-results/test/middleware.test.js.tap +17 -0
  112. package/.tap/test-results/test/mkcalendar.test.js.tap +43 -0
  113. package/.tap/test-results/test/mkcol.test.js.tap +14 -0
  114. package/.tap/test-results/test/move.test.js.tap +15 -0
  115. package/.tap/test-results/test/noop-set.test.js.tap +8 -0
  116. package/.tap/test-results/test/nullable-validation.test.js.tap +36 -0
  117. package/.tap/test-results/test/options.error-handler.test.js.tap +186 -0
  118. package/.tap/test-results/test/options.test.js.tap +174 -0
  119. package/.tap/test-results/test/output-validation.test.js.tap +66 -0
  120. package/.tap/test-results/test/patch.error-handler.test.js.tap +206 -0
  121. package/.tap/test-results/test/patch.test.js.tap +182 -0
  122. package/.tap/test-results/test/plugin.1.test.js.tap +78 -0
  123. package/.tap/test-results/test/plugin.2.test.js.tap +102 -0
  124. package/.tap/test-results/test/plugin.3.test.js.tap +58 -0
  125. package/.tap/test-results/test/plugin.4.test.js.tap +164 -0
  126. package/.tap/test-results/test/post-empty-body.test.js.tap +8 -0
  127. package/.tap/test-results/test/pretty-print.test.js.tap +82 -0
  128. package/.tap/test-results/test/promises.test.js.tap +46 -0
  129. package/.tap/test-results/test/propfind.test.js.tap +43 -0
  130. package/.tap/test-results/test/proppatch.test.js.tap +29 -0
  131. package/.tap/test-results/test/proto-poisoning.test.js.tap +47 -0
  132. package/.tap/test-results/test/put.error-handler.test.js.tap +206 -0
  133. package/.tap/test-results/test/put.test.js.tap +182 -0
  134. package/.tap/test-results/test/register.test.js.tap +61 -0
  135. package/.tap/test-results/test/reply-code.test.js.tap +40 -0
  136. package/.tap/test-results/test/reply-earlyHints.test.js.tap +22 -0
  137. package/.tap/test-results/test/reply-error.test.js.tap +643 -0
  138. package/.tap/test-results/test/reply-trailers.test.js.tap +176 -0
  139. package/.tap/test-results/test/report.test.js.tap +43 -0
  140. package/.tap/test-results/test/request-error.test.js.tap +98 -0
  141. package/.tap/test-results/test/request-id.test.js.tap +38 -0
  142. package/.tap/test-results/test/request.deprecated.test.js.tap +13 -0
  143. package/.tap/test-results/test/requestTimeout.test.js.tap +21 -0
  144. package/.tap/test-results/test/route-hooks.test.js.tap +498 -0
  145. package/.tap/test-results/test/route-prefix.test.js.tap +195 -0
  146. package/.tap/test-results/test/route-shorthand.test.js.tap +190 -0
  147. package/.tap/test-results/test/route.1.test.js.tap +93 -0
  148. package/.tap/test-results/test/route.2.test.js.tap +28 -0
  149. package/.tap/test-results/test/route.3.test.js.tap +39 -0
  150. package/.tap/test-results/test/route.4.test.js.tap +32 -0
  151. package/.tap/test-results/test/route.5.test.js.tap +54 -0
  152. package/.tap/test-results/test/route.6.test.js.tap +81 -0
  153. package/.tap/test-results/test/route.7.test.js.tap +93 -0
  154. package/.tap/test-results/test/route.8.test.js.tap +38 -0
  155. package/.tap/test-results/test/router-options.test.js.tap +104 -0
  156. package/.tap/test-results/test/same-shape.test.js.tap +22 -0
  157. package/.tap/test-results/test/schema-examples.test.js.tap +85 -0
  158. package/.tap/test-results/test/schema-feature.test.js.tap +445 -0
  159. package/.tap/test-results/test/schema-serialization.test.js.tap +194 -0
  160. package/.tap/test-results/test/schema-special-usage.test.js.tap +186 -0
  161. package/.tap/test-results/test/schema-validation.test.js.tap +199 -0
  162. package/.tap/test-results/test/search.test.js.tap +77 -0
  163. package/.tap/test-results/test/serialize-response.test.js.tap +26 -0
  164. package/.tap/test-results/test/server.test.js.tap +65 -0
  165. package/.tap/test-results/test/set-error-handler.test.js.tap +7 -0
  166. package/.tap/test-results/test/skip-reply-send.test.js.tap +272 -0
  167. package/.tap/test-results/test/stream.1.test.js.tap +36 -0
  168. package/.tap/test-results/test/stream.2.test.js.tap +20 -0
  169. package/.tap/test-results/test/stream.3.test.js.tap +34 -0
  170. package/.tap/test-results/test/stream.4.test.js.tap +40 -0
  171. package/.tap/test-results/test/stream.5.test.js.tap +37 -0
  172. package/.tap/test-results/test/sync-routes.test.js.tap +19 -0
  173. package/.tap/test-results/test/throw.test.js.tap +116 -0
  174. package/.tap/test-results/test/trace.test.js.tap +7 -0
  175. package/.tap/test-results/test/trust-proxy.test.js.tap +109 -0
  176. package/.tap/test-results/test/type-provider.test.js.tap +12 -0
  177. package/.tap/test-results/test/unlock.test.js.tap +14 -0
  178. package/.tap/test-results/test/upgrade.test.js.tap +8 -0
  179. package/.tap/test-results/test/url-rewriting.test.js.tap +39 -0
  180. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +33 -0
  181. package/.tap/test-results/test/validation-error-handling.test.js.tap +180 -0
  182. package/.tap/test-results/test/versioned-routes.test.js.tap +151 -0
  183. package/.tap/test-results/test/web-api.test.js.tap +51 -0
  184. package/.tap/test-results/test/wrapThenable.test.js.tap +11 -0
  185. package/.taprc +4 -8
  186. package/README.md +3 -6
  187. package/build/build-error-serializer.js +4 -1
  188. package/build/build-validation.js +5 -4
  189. package/docs/Guides/Database.md +1 -1
  190. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  191. package/docs/Guides/Ecosystem.md +2 -0
  192. package/docs/Guides/Migration-Guide-V5.md +20 -0
  193. package/docs/Guides/Write-Type-Provider.md +4 -2
  194. package/docs/Reference/ContentTypeParser.md +30 -1
  195. package/docs/Reference/Decorators.md +42 -16
  196. package/docs/Reference/Errors.md +10 -2
  197. package/docs/Reference/Hooks.md +48 -14
  198. package/docs/Reference/Logging.md +5 -5
  199. package/docs/Reference/Reply.md +29 -24
  200. package/docs/Reference/Request.md +5 -1
  201. package/docs/Reference/Routes.md +24 -28
  202. package/docs/Reference/Server.md +14 -53
  203. package/docs/Reference/Type-Providers.md +21 -26
  204. package/docs/Reference/TypeScript.md +46 -29
  205. package/docs/Reference/Warnings.md +2 -8
  206. package/eslint.config.js +27 -0
  207. package/examples/typescript-server.ts +14 -14
  208. package/fastify.d.ts +15 -14
  209. package/fastify.js +41 -15
  210. package/lib/configValidator.js +94 -76
  211. package/lib/contentTypeParser.js +54 -88
  212. package/lib/decorate.js +3 -7
  213. package/lib/error-serializer.js +77 -19
  214. package/lib/errors.js +31 -6
  215. package/lib/handleRequest.js +70 -39
  216. package/lib/httpMethods.js +34 -18
  217. package/lib/logger.js +24 -6
  218. package/lib/pluginUtils.js +5 -5
  219. package/lib/reply.js +16 -13
  220. package/lib/request.js +37 -19
  221. package/lib/route.js +7 -31
  222. package/lib/server.js +62 -123
  223. package/lib/warnings.js +28 -27
  224. package/lib/wrapThenable.js +46 -22
  225. package/package.json +38 -58
  226. package/test/404s.test.js +8 -12
  227. package/test/async-await.test.js +46 -2
  228. package/test/build/error-serializer.test.js +4 -2
  229. package/test/check.test.js +225 -0
  230. package/test/close-pipelining.test.js +2 -34
  231. package/test/close.test.js +1 -41
  232. package/test/content-parser.test.js +69 -117
  233. package/test/custom-parser.1.test.js +40 -1
  234. package/test/decorator-namespace.test._js_ +31 -0
  235. package/test/decorator.test.js +92 -43
  236. package/test/delete.test.js +21 -1
  237. package/test/diagnostics-channel/404.test.js +57 -0
  238. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  239. package/test/diagnostics-channel/async-request.test.js +72 -0
  240. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  241. package/test/diagnostics-channel/error-request.test.js +61 -0
  242. package/test/diagnostics-channel/error-status.test.js +39 -0
  243. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  244. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  245. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  246. package/test/diagnostics-channel/sync-request.test.js +61 -0
  247. package/test/encapsulated-error-handler.test.js +201 -14
  248. package/test/esm/index.test.js +2 -12
  249. package/test/findRoute.test.js +16 -0
  250. package/test/genReqId.test.js +9 -0
  251. package/test/get.test.js +28 -0
  252. package/test/has-route.test.js +18 -2
  253. package/test/helper.js +1 -5
  254. package/test/hooks.test.js +0 -4
  255. package/test/http2/constraint.test.js +22 -1
  256. package/test/http2/plain.test.js +21 -6
  257. package/test/http2/secure.test.js +12 -1
  258. package/test/https/https.test.js +57 -0
  259. package/test/inject.test.js +1 -2
  260. package/test/internals/decorator.test.js +0 -2
  261. package/test/internals/errors.test.js +57 -17
  262. package/test/internals/handleRequest.test.js +5 -1
  263. package/test/internals/initialConfig.test.js +5 -5
  264. package/test/internals/logger.test.js +31 -2
  265. package/test/internals/reply.test.js +38 -80
  266. package/test/internals/request.test.js +13 -11
  267. package/test/listen.1.test.js +5 -15
  268. package/test/listen.5.test.js +88 -0
  269. package/test/logger/instantiation.test.js +8 -8
  270. package/test/logger/logging.test.js +4 -4
  271. package/test/logger/options.test.js +102 -21
  272. package/test/logger/response.test.js +6 -6
  273. package/test/maxRequestsPerSocket.test.js +2 -5
  274. package/test/method-missing.test.js +24 -0
  275. package/test/plugin.1.test.js +2 -4
  276. package/test/plugin.2.test.js +0 -2
  277. package/test/plugin.3.test.js +0 -2
  278. package/test/plugin.4.test.js +92 -56
  279. package/test/register.test.js +2 -4
  280. package/test/reply-earlyHints.test.js +98 -0
  281. package/test/reply-error.test.js +0 -2
  282. package/test/route-hooks.test.js +0 -1
  283. package/test/route-shorthand.test.js +60 -0
  284. package/test/schema-special-usage.test.js +1 -1
  285. package/test/server.test.js +17 -2
  286. package/test/stream.2.test.js +1 -1
  287. package/test/stream.4.test.js +0 -42
  288. package/test/stream.5.test.js +2 -2
  289. package/test/trust-proxy.test.js +33 -27
  290. package/test/types/errors.test-d.ts +0 -2
  291. package/test/types/fastify.test-d.ts +14 -12
  292. package/test/types/hooks.test-d.ts +1 -0
  293. package/test/types/import.ts +1 -0
  294. package/test/types/instance.test-d.ts +10 -51
  295. package/test/types/logger.test-d.ts +43 -6
  296. package/test/types/plugin.test-d.ts +5 -2
  297. package/test/types/register.test-d.ts +2 -2
  298. package/test/types/reply.test-d.ts +13 -12
  299. package/test/types/request.test-d.ts +19 -8
  300. package/test/types/route.test-d.ts +30 -2
  301. package/test/types/schema.test-d.ts +2 -2
  302. package/test/types/serverFactory.test-d.ts +1 -1
  303. package/test/types/type-provider.test-d.ts +60 -13
  304. package/test/types/using.test-d.ts +4 -1
  305. package/test/url-rewriting.test.js +3 -2
  306. package/test/useSemicolonDelimiter.test.js +3 -6
  307. package/test/versioned-routes.test.js +1 -1
  308. package/test/web-api.test.js +0 -6
  309. package/types/content-type-parser.d.ts +3 -3
  310. package/types/context.d.ts +0 -1
  311. package/types/errors.d.ts +1 -0
  312. package/types/hooks.d.ts +6 -6
  313. package/types/instance.d.ts +28 -41
  314. package/types/logger.d.ts +3 -3
  315. package/types/plugin.d.ts +3 -3
  316. package/types/reply.d.ts +13 -14
  317. package/types/request.d.ts +5 -3
  318. package/types/route.d.ts +29 -29
  319. package/types/schema.d.ts +3 -3
  320. package/types/serverFactory.d.ts +2 -2
  321. package/types/type-provider.d.ts +22 -12
  322. package/types/utils.d.ts +18 -18
  323. package/.c8rc.json +0 -8
  324. package/.eslintrc +0 -4
  325. package/test/default-route.test.js +0 -88
  326. package/test/listen.deprecated.test.js +0 -229
  327. package/test/unsupported-httpversion.test.js +0 -31
  328. package/types/.eslintrc.json +0 -48
@@ -1,14 +1,11 @@
1
1
  'use strict'
2
2
 
3
- /* eslint no-prototype-builtins: 0 */
4
-
5
3
  const t = require('tap')
6
4
  const test = t.test
7
5
  const Fastify = require('..')
8
6
  const fp = require('fastify-plugin')
9
7
  const sget = require('simple-get').concat
10
8
  const symbols = require('../lib/symbols.js')
11
- const proxyquire = require('proxyquire')
12
9
 
13
10
  test('server methods should exist', t => {
14
11
  t.plan(2)
@@ -789,49 +786,44 @@ test('decorate* should throw if called after ready', async t => {
789
786
  await fastify.close()
790
787
  })
791
788
 
792
- test('decorate* should emit warning if an array is passed', t => {
793
- t.plan(1)
789
+ test('decorate* should emit error if an array is passed', t => {
790
+ t.plan(2)
794
791
 
795
- function onWarning (name) {
796
- t.equal(name, 'test_array')
792
+ const fastify = Fastify()
793
+ try {
794
+ fastify.decorateRequest('test_array', [])
795
+ t.fail('should not decorate')
796
+ } catch (err) {
797
+ t.same(err.code, 'FST_ERR_DEC_REFERENCE_TYPE')
798
+ t.same(err.message, "The decorator 'test_array' of type 'object' is a reference type. Use the { getter, setter } interface instead.")
797
799
  }
800
+ })
798
801
 
799
- const decorate = proxyquire('../lib/decorate', {
800
- './warnings': {
801
- FSTDEP006: onWarning
802
- }
803
- })
804
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
805
- fastify.decorateRequest('test_array', [])
802
+ test('server.decorate should not emit error if reference type is passed', async t => {
803
+ t.plan(1)
804
+
805
+ const fastify = Fastify()
806
+ fastify.decorate('test_array', [])
807
+ fastify.decorate('test_object', {})
808
+ await fastify.ready()
809
+ t.pass('Done')
806
810
  })
807
811
 
808
812
  test('decorate* should emit warning if object type is passed', t => {
809
- t.plan(1)
813
+ t.plan(2)
810
814
 
811
- function onWarning (name) {
812
- t.equal(name, 'test_object')
815
+ const fastify = Fastify()
816
+ try {
817
+ fastify.decorateRequest('test_object', { foo: 'bar' })
818
+ t.fail('should not decorate')
819
+ } catch (err) {
820
+ t.same(err.code, 'FST_ERR_DEC_REFERENCE_TYPE')
821
+ t.same(err.message, "The decorator 'test_object' of type 'object' is a reference type. Use the { getter, setter } interface instead.")
813
822
  }
814
-
815
- const decorate = proxyquire('../lib/decorate', {
816
- './warnings': {
817
- FSTDEP006: onWarning
818
- }
819
- })
820
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
821
- fastify.decorateRequest('test_object', { foo: 'bar' })
822
823
  })
823
824
 
824
825
  test('decorate* should not emit warning if object with getter/setter is passed', t => {
825
- function onWarning (warning) {
826
- t.fail('Should not call a warn')
827
- }
828
-
829
- const decorate = proxyquire('../lib/decorate', {
830
- './warnings': {
831
- FSTDEP006: onWarning
832
- }
833
- })
834
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
826
+ const fastify = Fastify()
835
827
 
836
828
  fastify.decorateRequest('test_getter_setter', {
837
829
  setter (val) {
@@ -844,17 +836,74 @@ test('decorate* should not emit warning if object with getter/setter is passed',
844
836
  t.end('Done')
845
837
  })
846
838
 
847
- test('decorate* should not emit warning if string,bool,numbers are passed', t => {
848
- function onWarning (warning) {
849
- t.fail('Should not call a warn')
850
- }
839
+ test('decorateRequest with getter/setter can handle encapsulation', async t => {
840
+ t.plan(24)
841
+
842
+ const fastify = Fastify({ logger: true })
843
+
844
+ fastify.decorateRequest('test_getter_setter_holder')
845
+ fastify.decorateRequest('test_getter_setter', {
846
+ getter () {
847
+ this.test_getter_setter_holder ??= {}
848
+ return this.test_getter_setter_holder
849
+ }
850
+ })
851
+
852
+ fastify.get('/', async function (req, reply) {
853
+ t.same(req.test_getter_setter, {}, 'a getter')
854
+ req.test_getter_setter.a = req.id
855
+ t.same(req.test_getter_setter, { a: req.id })
856
+ })
857
+
858
+ fastify.addHook('onResponse', async function hook (req, reply) {
859
+ t.same(req.test_getter_setter, { a: req.id })
860
+ })
851
861
 
852
- const decorate = proxyquire('../lib/decorate', {
853
- './warnings': {
854
- FSTDEP006: onWarning
862
+ await Promise.all([
863
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
864
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
865
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
866
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
867
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
868
+ fastify.inject('/').then(res => t.same(res.statusCode, 200))
869
+ ])
870
+ })
871
+
872
+ test('decorateRequest with getter/setter can handle encapsulation with arrays', async t => {
873
+ t.plan(24)
874
+
875
+ const fastify = Fastify({ logger: true })
876
+
877
+ fastify.decorateRequest('array_holder')
878
+ fastify.decorateRequest('my_array', {
879
+ getter () {
880
+ this.array_holder ??= []
881
+ return this.array_holder
855
882
  }
856
883
  })
857
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
884
+
885
+ fastify.get('/', async function (req, reply) {
886
+ t.same(req.my_array, [])
887
+ req.my_array.push(req.id)
888
+ t.same(req.my_array, [req.id])
889
+ })
890
+
891
+ fastify.addHook('onResponse', async function hook (req, reply) {
892
+ t.same(req.my_array, [req.id])
893
+ })
894
+
895
+ await Promise.all([
896
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
897
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
898
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
899
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
900
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
901
+ fastify.inject('/').then(res => t.same(res.statusCode, 200))
902
+ ])
903
+ })
904
+
905
+ test('decorate* should not emit error if string,bool,numbers are passed', t => {
906
+ const fastify = Fastify()
858
907
 
859
908
  fastify.decorateRequest('test_str', 'foo')
860
909
  fastify.decorateRequest('test_bool', true)
@@ -300,8 +300,28 @@ fastify.listen({ port: 0 }, err => {
300
300
  })
301
301
  })
302
302
 
303
+ test('shorthand - delete with application/json Content-Type header and null body', t => {
304
+ t.plan(4)
305
+ const fastify = require('..')()
306
+ fastify.delete('/', {}, (req, reply) => {
307
+ t.equal(req.body, null)
308
+ reply.send(req.body)
309
+ })
310
+ fastify.inject({
311
+ method: 'DELETE',
312
+ url: '/',
313
+ headers: { 'Content-Type': 'application/json' },
314
+ body: 'null'
315
+ }, (err, response) => {
316
+ t.error(err)
317
+ t.equal(response.statusCode, 200)
318
+ t.same(response.payload.toString(), 'null')
319
+ })
320
+ })
321
+
303
322
  // https://github.com/fastify/fastify/issues/936
304
- test('shorthand - delete with application/json Content-Type header and without body', t => {
323
+ // Skip this test because this is an invalid request
324
+ test('shorthand - delete with application/json Content-Type header and without body', { skip: 'https://github.com/fastify/fastify/pull/5419' }, t => {
305
325
  t.plan(4)
306
326
  const fastify = require('..')()
307
327
  fastify.delete('/', {}, (req, reply) => {
@@ -0,0 +1,57 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ const sget = require('simple-get').concat
7
+ const Fastify = require('../..')
8
+ const { getServerUrl } = require('../helper')
9
+ const Request = require('../../lib/request')
10
+ const Reply = require('../../lib/reply')
11
+
12
+ test('diagnostics channel sync events fire in expected order', t => {
13
+ t.plan(9)
14
+ let callOrder = 0
15
+ let firstEncounteredMessage
16
+
17
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
18
+ t.equal(callOrder++, 0)
19
+ firstEncounteredMessage = msg
20
+ t.ok(msg.request instanceof Request)
21
+ t.ok(msg.reply instanceof Reply)
22
+ })
23
+
24
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
25
+ t.ok(msg.request instanceof Request)
26
+ t.ok(msg.reply instanceof Reply)
27
+ t.equal(callOrder++, 1)
28
+ t.equal(msg, firstEncounteredMessage)
29
+ })
30
+
31
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
32
+ t.fail('should not trigger error channel')
33
+ })
34
+
35
+ const fastify = Fastify()
36
+ fastify.route({
37
+ method: 'GET',
38
+ url: '/',
39
+ handler: function (req, reply) {
40
+ reply.callNotFound()
41
+ }
42
+ })
43
+
44
+ fastify.listen({ port: 0 }, function (err) {
45
+ if (err) t.error(err)
46
+
47
+ t.teardown(() => { fastify.close() })
48
+
49
+ sget({
50
+ method: 'GET',
51
+ url: getServerUrl(fastify) + '/'
52
+ }, (err, response, body) => {
53
+ t.error(err)
54
+ t.equal(response.statusCode, 404)
55
+ })
56
+ })
57
+ })
@@ -0,0 +1,74 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ const sget = require('simple-get').concat
7
+ const Fastify = require('../..')
8
+ const { getServerUrl } = require('../helper')
9
+ const Request = require('../../lib/request')
10
+ const Reply = require('../../lib/reply')
11
+
12
+ test('diagnostics channel async events fire in expected order', t => {
13
+ t.plan(19)
14
+ let callOrder = 0
15
+ let firstEncounteredMessage
16
+
17
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
18
+ t.equal(callOrder++, 0)
19
+ firstEncounteredMessage = msg
20
+ t.ok(msg.request instanceof Request)
21
+ t.ok(msg.reply instanceof Reply)
22
+ })
23
+
24
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
25
+ t.equal(callOrder++, 1)
26
+ t.ok(msg.request instanceof Request)
27
+ t.ok(msg.reply instanceof Reply)
28
+ t.equal(msg, firstEncounteredMessage)
29
+ t.equal(msg.async, true)
30
+ })
31
+
32
+ diagnostics.subscribe('tracing:fastify.request.handler:asyncStart', (msg) => {
33
+ t.equal(callOrder++, 2)
34
+ t.ok(msg.request instanceof Request)
35
+ t.ok(msg.reply instanceof Reply)
36
+ t.equal(msg, firstEncounteredMessage)
37
+ })
38
+
39
+ diagnostics.subscribe('tracing:fastify.request.handler:asyncEnd', (msg) => {
40
+ t.equal(callOrder++, 3)
41
+ t.ok(msg.request instanceof Request)
42
+ t.ok(msg.reply instanceof Reply)
43
+ t.equal(msg, firstEncounteredMessage)
44
+ })
45
+
46
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
47
+ t.fail('should not trigger error channel')
48
+ })
49
+
50
+ const fastify = Fastify()
51
+ fastify.route({
52
+ method: 'GET',
53
+ url: '/',
54
+ handler: async function (req, reply) {
55
+ setImmediate(() => reply.send({ hello: 'world' }))
56
+ return reply
57
+ }
58
+ })
59
+
60
+ fastify.listen({ port: 0 }, function (err) {
61
+ if (err) t.error(err)
62
+
63
+ t.teardown(() => { fastify.close() })
64
+
65
+ sget({
66
+ method: 'GET',
67
+ url: getServerUrl(fastify) + '/'
68
+ }, (err, response, body) => {
69
+ t.error(err)
70
+ t.equal(response.statusCode, 200)
71
+ t.same(JSON.parse(body), { hello: 'world' })
72
+ })
73
+ })
74
+ })
@@ -0,0 +1,72 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ const sget = require('simple-get').concat
7
+ const Fastify = require('../..')
8
+ const { getServerUrl } = require('../helper')
9
+ const Request = require('../../lib/request')
10
+ const Reply = require('../../lib/reply')
11
+
12
+ test('diagnostics channel async events fire in expected order', t => {
13
+ t.plan(18)
14
+ let callOrder = 0
15
+ let firstEncounteredMessage
16
+
17
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
18
+ t.equal(callOrder++, 0)
19
+ firstEncounteredMessage = msg
20
+ t.ok(msg.request instanceof Request)
21
+ t.ok(msg.reply instanceof Reply)
22
+ })
23
+
24
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
25
+ t.equal(callOrder++, 1)
26
+ t.ok(msg.request instanceof Request)
27
+ t.ok(msg.reply instanceof Reply)
28
+ t.equal(msg, firstEncounteredMessage)
29
+ })
30
+
31
+ diagnostics.subscribe('tracing:fastify.request.handler:asyncStart', (msg) => {
32
+ t.equal(callOrder++, 2)
33
+ t.ok(msg.request instanceof Request)
34
+ t.ok(msg.reply instanceof Reply)
35
+ t.equal(msg, firstEncounteredMessage)
36
+ })
37
+
38
+ diagnostics.subscribe('tracing:fastify.request.handler:asyncEnd', (msg) => {
39
+ t.equal(callOrder++, 3)
40
+ t.ok(msg.request instanceof Request)
41
+ t.ok(msg.reply instanceof Reply)
42
+ t.equal(msg, firstEncounteredMessage)
43
+ })
44
+
45
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
46
+ t.fail('should not trigger error channel')
47
+ })
48
+
49
+ const fastify = Fastify()
50
+ fastify.route({
51
+ method: 'GET',
52
+ url: '/',
53
+ handler: async function (req, reply) {
54
+ return { hello: 'world' }
55
+ }
56
+ })
57
+
58
+ fastify.listen({ port: 0 }, function (err) {
59
+ if (err) t.error(err)
60
+
61
+ t.teardown(() => { fastify.close() })
62
+
63
+ sget({
64
+ method: 'GET',
65
+ url: getServerUrl(fastify) + '/'
66
+ }, (err, response, body) => {
67
+ t.error(err)
68
+ t.equal(response.statusCode, 200)
69
+ t.same(JSON.parse(body), { hello: 'world' })
70
+ })
71
+ })
72
+ })
@@ -0,0 +1,36 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ require('../../lib/hooks').onSendHookRunner = function Stub () {}
7
+ const Request = require('../../lib/request')
8
+ const Reply = require('../../lib/reply')
9
+ const symbols = require('../../lib/symbols.js')
10
+ const { preHandlerCallback } = require('../../lib/handleRequest')[Symbol.for('internals')]
11
+
12
+ test('diagnostics channel handles an error before calling context handler', t => {
13
+ t.plan(3)
14
+ let callOrder = 0
15
+
16
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
17
+ t.equal(callOrder++, 0)
18
+ })
19
+
20
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
21
+ t.equal(callOrder++, 1)
22
+ t.equal(msg.error.message, 'oh no')
23
+ })
24
+
25
+ const error = new Error('oh no')
26
+ const request = new Request()
27
+ const reply = new Reply({}, request)
28
+ request[symbols.kRouteContext] = {
29
+ config: {
30
+ url: '/foo',
31
+ method: 'GET'
32
+ }
33
+ }
34
+
35
+ preHandlerCallback(error, request, reply)
36
+ })
@@ -0,0 +1,61 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ const sget = require('simple-get').concat
7
+ const Fastify = require('../..')
8
+ const { getServerUrl } = require('../helper')
9
+ const Request = require('../../lib/request')
10
+ const Reply = require('../../lib/reply')
11
+
12
+ test('diagnostics channel events report on errors', t => {
13
+ t.plan(14)
14
+ let callOrder = 0
15
+ let firstEncounteredMessage
16
+
17
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
18
+ t.equal(callOrder++, 0)
19
+ firstEncounteredMessage = msg
20
+ t.ok(msg.request instanceof Request)
21
+ t.ok(msg.reply instanceof Reply)
22
+ })
23
+
24
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
25
+ t.ok(msg.request instanceof Request)
26
+ t.ok(msg.reply instanceof Reply)
27
+ t.equal(callOrder++, 2)
28
+ t.equal(msg, firstEncounteredMessage)
29
+ })
30
+
31
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
32
+ t.ok(msg.request instanceof Request)
33
+ t.ok(msg.reply instanceof Reply)
34
+ t.ok(msg.error instanceof Error)
35
+ t.equal(callOrder++, 1)
36
+ t.equal(msg.error.message, 'borked')
37
+ })
38
+
39
+ const fastify = Fastify()
40
+ fastify.route({
41
+ method: 'GET',
42
+ url: '/',
43
+ handler: function (req, reply) {
44
+ throw new Error('borked')
45
+ }
46
+ })
47
+
48
+ fastify.listen({ port: 0 }, function (err) {
49
+ if (err) t.error(err)
50
+
51
+ t.teardown(() => { fastify.close() })
52
+
53
+ sget({
54
+ method: 'GET',
55
+ url: getServerUrl(fastify) + '/'
56
+ }, (err, response, body) => {
57
+ t.error(err)
58
+ t.equal(response.statusCode, 500)
59
+ })
60
+ })
61
+ })
@@ -0,0 +1,39 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const test = t.test
5
+ const Fastify = require('../..')
6
+ const statusCodes = require('node:http').STATUS_CODES
7
+ const diagnostics = require('dc-polyfill')
8
+
9
+ test('Error.status property support', t => {
10
+ t.plan(4)
11
+ const fastify = Fastify()
12
+ t.teardown(fastify.close.bind(fastify))
13
+ const err = new Error('winter is coming')
14
+ err.status = 418
15
+
16
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
17
+ t.equal(msg.error.message, 'winter is coming')
18
+ })
19
+
20
+ fastify.get('/', () => {
21
+ return Promise.reject(err)
22
+ })
23
+
24
+ fastify.inject({
25
+ method: 'GET',
26
+ url: '/'
27
+ }, (error, res) => {
28
+ t.error(error)
29
+ t.equal(res.statusCode, 418)
30
+ t.same(
31
+ {
32
+ error: statusCodes['418'],
33
+ message: err.message,
34
+ statusCode: 418
35
+ },
36
+ JSON.parse(res.payload)
37
+ )
38
+ })
39
+ })
@@ -9,7 +9,7 @@ test('diagnostics_channel when present and subscribers', t => {
9
9
 
10
10
  let fastifyInHook
11
11
 
12
- const dc = {
12
+ const diagnostics = {
13
13
  channel (name) {
14
14
  t.equal(name, 'fastify.initialization')
15
15
  return {
@@ -23,8 +23,8 @@ test('diagnostics_channel when present and subscribers', t => {
23
23
  '@noCallThru': true
24
24
  }
25
25
 
26
- const fastify = proxyquire('../fastify', {
27
- 'node:diagnostics_channel': dc
26
+ const fastify = proxyquire('../../fastify', {
27
+ 'dc-polyfill': diagnostics
28
28
  })()
29
29
  t.equal(fastifyInHook, fastify)
30
30
  })
@@ -32,7 +32,7 @@ test('diagnostics_channel when present and subscribers', t => {
32
32
  test('diagnostics_channel when present and no subscribers', t => {
33
33
  t.plan(1)
34
34
 
35
- const dc = {
35
+ const diagnostics = {
36
36
  channel (name) {
37
37
  t.equal(name, 'fastify.initialization')
38
38
  return {
@@ -45,17 +45,7 @@ test('diagnostics_channel when present and no subscribers', t => {
45
45
  '@noCallThru': true
46
46
  }
47
47
 
48
- proxyquire('../fastify', {
49
- 'node:diagnostics_channel': dc
48
+ proxyquire('../../fastify', {
49
+ 'dc-polyfill': diagnostics
50
50
  })()
51
51
  })
52
-
53
- test('diagnostics_channel when not present', t => {
54
- t.plan(1)
55
-
56
- t.doesNotThrow(() => {
57
- proxyquire('../fastify', {
58
- 'node:diagnostics_channel': null
59
- })()
60
- })
61
- })
@@ -0,0 +1,58 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ const sget = require('simple-get').concat
7
+ const Fastify = require('../..')
8
+ const { getServerUrl } = require('../helper')
9
+ const Request = require('../../lib/request')
10
+ const Reply = require('../../lib/reply')
11
+
12
+ test('diagnostics channel sync events fire in expected order', t => {
13
+ t.plan(10)
14
+ let callOrder = 0
15
+ let firstEncounteredMessage
16
+
17
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
18
+ t.equal(callOrder++, 0)
19
+ firstEncounteredMessage = msg
20
+ t.ok(msg.request instanceof Request)
21
+ t.ok(msg.reply instanceof Reply)
22
+ })
23
+
24
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
25
+ t.ok(msg.request instanceof Request)
26
+ t.ok(msg.reply instanceof Reply)
27
+ t.equal(callOrder++, 1)
28
+ t.equal(msg, firstEncounteredMessage)
29
+ })
30
+
31
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
32
+ t.fail('should not trigger error channel')
33
+ })
34
+
35
+ const fastify = Fastify()
36
+ fastify.route({
37
+ method: 'GET',
38
+ url: '/',
39
+ handler: function (req, reply) {
40
+ setImmediate(() => reply.send({ hello: 'world' }))
41
+ }
42
+ })
43
+
44
+ fastify.listen({ port: 0 }, function (err) {
45
+ if (err) t.error(err)
46
+
47
+ t.teardown(() => { fastify.close() })
48
+
49
+ sget({
50
+ method: 'GET',
51
+ url: getServerUrl(fastify) + '/'
52
+ }, (err, response, body) => {
53
+ t.error(err)
54
+ t.equal(response.statusCode, 200)
55
+ t.same(JSON.parse(body), { hello: 'world' })
56
+ })
57
+ })
58
+ })