node-fastify 5.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/.borp.yaml +3 -0
  2. package/.markdownlint-cli2.yaml +22 -0
  3. package/.prettierignore +1 -0
  4. package/GOVERNANCE.md +4 -0
  5. package/LICENSE +21 -0
  6. package/PROJECT_CHARTER.md +126 -0
  7. package/README.md +423 -0
  8. package/SECURITY.md +220 -0
  9. package/SPONSORS.md +24 -0
  10. package/build/build-error-serializer.js +35 -0
  11. package/build/build-validation.js +169 -0
  12. package/build/sync-version.js +11 -0
  13. package/docs/Guides/Benchmarking.md +60 -0
  14. package/docs/Guides/Database.md +321 -0
  15. package/docs/Guides/Delay-Accepting-Requests.md +608 -0
  16. package/docs/Guides/Detecting-When-Clients-Abort.md +172 -0
  17. package/docs/Guides/Ecosystem.md +726 -0
  18. package/docs/Guides/Fluent-Schema.md +127 -0
  19. package/docs/Guides/Getting-Started.md +620 -0
  20. package/docs/Guides/Index.md +43 -0
  21. package/docs/Guides/Migration-Guide-V3.md +287 -0
  22. package/docs/Guides/Migration-Guide-V4.md +267 -0
  23. package/docs/Guides/Migration-Guide-V5.md +727 -0
  24. package/docs/Guides/Plugins-Guide.md +520 -0
  25. package/docs/Guides/Prototype-Poisoning.md +383 -0
  26. package/docs/Guides/Recommendations.md +378 -0
  27. package/docs/Guides/Serverless.md +604 -0
  28. package/docs/Guides/Style-Guide.md +246 -0
  29. package/docs/Guides/Testing.md +481 -0
  30. package/docs/Guides/Write-Plugin.md +103 -0
  31. package/docs/Guides/Write-Type-Provider.md +34 -0
  32. package/docs/Reference/ContentTypeParser.md +271 -0
  33. package/docs/Reference/Decorators.md +436 -0
  34. package/docs/Reference/Encapsulation.md +194 -0
  35. package/docs/Reference/Errors.md +377 -0
  36. package/docs/Reference/HTTP2.md +94 -0
  37. package/docs/Reference/Hooks.md +958 -0
  38. package/docs/Reference/Index.md +73 -0
  39. package/docs/Reference/LTS.md +86 -0
  40. package/docs/Reference/Lifecycle.md +99 -0
  41. package/docs/Reference/Logging.md +268 -0
  42. package/docs/Reference/Middleware.md +79 -0
  43. package/docs/Reference/Plugins.md +245 -0
  44. package/docs/Reference/Principles.md +73 -0
  45. package/docs/Reference/Reply.md +1001 -0
  46. package/docs/Reference/Request.md +295 -0
  47. package/docs/Reference/Routes.md +802 -0
  48. package/docs/Reference/Server.md +2389 -0
  49. package/docs/Reference/Type-Providers.md +256 -0
  50. package/docs/Reference/TypeScript.md +1729 -0
  51. package/docs/Reference/Validation-and-Serialization.md +1130 -0
  52. package/docs/Reference/Warnings.md +58 -0
  53. package/docs/index.md +24 -0
  54. package/docs/resources/encapsulation_context.drawio +1 -0
  55. package/docs/resources/encapsulation_context.svg +3 -0
  56. package/eslint.config.js +35 -0
  57. package/examples/asyncawait.js +38 -0
  58. package/examples/benchmark/body.json +3 -0
  59. package/examples/benchmark/hooks-benchmark-async-await.js +44 -0
  60. package/examples/benchmark/hooks-benchmark.js +52 -0
  61. package/examples/benchmark/parser.js +47 -0
  62. package/examples/benchmark/simple.js +30 -0
  63. package/examples/benchmark/webstream.js +27 -0
  64. package/examples/hooks.js +91 -0
  65. package/examples/http2.js +39 -0
  66. package/examples/https.js +38 -0
  67. package/examples/parser.js +53 -0
  68. package/examples/plugin.js +12 -0
  69. package/examples/route-prefix.js +38 -0
  70. package/examples/shared-schema.js +38 -0
  71. package/examples/simple-stream.js +20 -0
  72. package/examples/simple.js +32 -0
  73. package/examples/simple.mjs +27 -0
  74. package/examples/typescript-server.ts +79 -0
  75. package/examples/use-plugin.js +29 -0
  76. package/fastify.d.ts +253 -0
  77. package/fastify.js +985 -0
  78. package/integration/server.js +29 -0
  79. package/integration/test.sh +23 -0
  80. package/lib/config-validator.js +1266 -0
  81. package/lib/content-type-parser.js +413 -0
  82. package/lib/content-type.js +160 -0
  83. package/lib/context.js +98 -0
  84. package/lib/decorate.js +152 -0
  85. package/lib/error-handler.js +173 -0
  86. package/lib/error-serializer.js +134 -0
  87. package/lib/error-status.js +14 -0
  88. package/lib/errors.js +516 -0
  89. package/lib/four-oh-four.js +190 -0
  90. package/lib/handle-request.js +195 -0
  91. package/lib/head-route.js +45 -0
  92. package/lib/hooks.js +429 -0
  93. package/lib/initial-config-validation.js +37 -0
  94. package/lib/logger-factory.js +136 -0
  95. package/lib/logger-pino.js +68 -0
  96. package/lib/noop-set.js +10 -0
  97. package/lib/plugin-override.js +90 -0
  98. package/lib/plugin-utils.js +169 -0
  99. package/lib/promise.js +23 -0
  100. package/lib/reply.js +1030 -0
  101. package/lib/req-id-gen-factory.js +52 -0
  102. package/lib/request.js +391 -0
  103. package/lib/route.js +686 -0
  104. package/lib/schema-controller.js +164 -0
  105. package/lib/schemas.js +207 -0
  106. package/lib/server.js +441 -0
  107. package/lib/symbols.js +71 -0
  108. package/lib/validation.js +280 -0
  109. package/lib/warnings.js +57 -0
  110. package/lib/wrap-thenable.js +84 -0
  111. package/package.json +225 -0
  112. package/scripts/validate-ecosystem-links.js +179 -0
  113. package/test/404s.test.js +2035 -0
  114. package/test/500s.test.js +422 -0
  115. package/test/allow-unsafe-regex.test.js +92 -0
  116. package/test/als.test.js +65 -0
  117. package/test/async-await.test.js +705 -0
  118. package/test/async-dispose.test.js +20 -0
  119. package/test/async_hooks.test.js +52 -0
  120. package/test/body-limit.test.js +224 -0
  121. package/test/buffer.test.js +74 -0
  122. package/test/build/error-serializer.test.js +36 -0
  123. package/test/build/version.test.js +14 -0
  124. package/test/build-certificate.js +109 -0
  125. package/test/bundler/README.md +29 -0
  126. package/test/bundler/esbuild/bundler-test.js +32 -0
  127. package/test/bundler/esbuild/package.json +10 -0
  128. package/test/bundler/esbuild/src/fail-plugin-version.js +14 -0
  129. package/test/bundler/esbuild/src/index.js +9 -0
  130. package/test/bundler/webpack/bundler-test.js +32 -0
  131. package/test/bundler/webpack/package.json +11 -0
  132. package/test/bundler/webpack/src/fail-plugin-version.js +14 -0
  133. package/test/bundler/webpack/src/index.js +9 -0
  134. package/test/bundler/webpack/webpack.config.js +15 -0
  135. package/test/case-insensitive.test.js +102 -0
  136. package/test/chainable.test.js +40 -0
  137. package/test/child-logger-factory.test.js +128 -0
  138. package/test/client-timeout.test.js +38 -0
  139. package/test/close-pipelining.test.js +78 -0
  140. package/test/close.test.js +706 -0
  141. package/test/conditional-pino.test.js +47 -0
  142. package/test/connection-timeout.test.js +42 -0
  143. package/test/constrained-routes.test.js +1138 -0
  144. package/test/content-length.test.js +174 -0
  145. package/test/content-parser.test.js +739 -0
  146. package/test/content-type.test.js +181 -0
  147. package/test/context-config.test.js +164 -0
  148. package/test/custom-http-server.test.js +118 -0
  149. package/test/custom-parser-async.test.js +59 -0
  150. package/test/custom-parser.0.test.js +701 -0
  151. package/test/custom-parser.1.test.js +266 -0
  152. package/test/custom-parser.2.test.js +91 -0
  153. package/test/custom-parser.3.test.js +208 -0
  154. package/test/custom-parser.4.test.js +218 -0
  155. package/test/custom-parser.5.test.js +130 -0
  156. package/test/custom-querystring-parser.test.js +129 -0
  157. package/test/decorator.test.js +1330 -0
  158. package/test/delete.test.js +344 -0
  159. package/test/diagnostics-channel/404.test.js +49 -0
  160. package/test/diagnostics-channel/async-delay-request.test.js +65 -0
  161. package/test/diagnostics-channel/async-request.test.js +64 -0
  162. package/test/diagnostics-channel/error-before-handler.test.js +35 -0
  163. package/test/diagnostics-channel/error-request.test.js +53 -0
  164. package/test/diagnostics-channel/error-status.test.js +123 -0
  165. package/test/diagnostics-channel/init.test.js +50 -0
  166. package/test/diagnostics-channel/sync-delay-request.test.js +49 -0
  167. package/test/diagnostics-channel/sync-request-reply.test.js +51 -0
  168. package/test/diagnostics-channel/sync-request.test.js +54 -0
  169. package/test/encapsulated-child-logger-factory.test.js +69 -0
  170. package/test/encapsulated-error-handler.test.js +237 -0
  171. package/test/esm/errorCodes.test.mjs +10 -0
  172. package/test/esm/esm.test.mjs +13 -0
  173. package/test/esm/index.test.js +8 -0
  174. package/test/esm/named-exports.mjs +14 -0
  175. package/test/esm/other.mjs +8 -0
  176. package/test/esm/plugin.mjs +8 -0
  177. package/test/fastify-instance.test.js +300 -0
  178. package/test/find-route.test.js +152 -0
  179. package/test/fluent-schema.test.js +209 -0
  180. package/test/genReqId.test.js +426 -0
  181. package/test/handler-context.test.js +45 -0
  182. package/test/handler-timeout.test.js +367 -0
  183. package/test/has-route.test.js +88 -0
  184. package/test/header-overflow.test.js +55 -0
  185. package/test/helper.js +496 -0
  186. package/test/hooks-async.test.js +1099 -0
  187. package/test/hooks.on-listen.test.js +1162 -0
  188. package/test/hooks.on-ready.test.js +421 -0
  189. package/test/hooks.test.js +3578 -0
  190. package/test/http-methods/copy.test.js +35 -0
  191. package/test/http-methods/custom-http-methods.test.js +114 -0
  192. package/test/http-methods/get.test.js +412 -0
  193. package/test/http-methods/head.test.js +263 -0
  194. package/test/http-methods/lock.test.js +108 -0
  195. package/test/http-methods/mkcalendar.test.js +143 -0
  196. package/test/http-methods/mkcol.test.js +35 -0
  197. package/test/http-methods/move.test.js +42 -0
  198. package/test/http-methods/propfind.test.js +136 -0
  199. package/test/http-methods/proppatch.test.js +105 -0
  200. package/test/http-methods/report.test.js +142 -0
  201. package/test/http-methods/search.test.js +233 -0
  202. package/test/http-methods/trace.test.js +21 -0
  203. package/test/http-methods/unlock.test.js +38 -0
  204. package/test/http2/closing.test.js +270 -0
  205. package/test/http2/constraint.test.js +109 -0
  206. package/test/http2/head.test.js +34 -0
  207. package/test/http2/plain.test.js +68 -0
  208. package/test/http2/secure-with-fallback.test.js +113 -0
  209. package/test/http2/secure.test.js +67 -0
  210. package/test/http2/unknown-http-method.test.js +34 -0
  211. package/test/https/custom-https-server.test.js +58 -0
  212. package/test/https/https.test.js +136 -0
  213. package/test/imports.test.js +17 -0
  214. package/test/inject.test.js +502 -0
  215. package/test/input-validation.js +335 -0
  216. package/test/internals/all.test.js +38 -0
  217. package/test/internals/content-type-parser.test.js +111 -0
  218. package/test/internals/context.test.js +31 -0
  219. package/test/internals/decorator.test.js +156 -0
  220. package/test/internals/errors.test.js +982 -0
  221. package/test/internals/handle-request.test.js +270 -0
  222. package/test/internals/hook-runner.test.js +449 -0
  223. package/test/internals/hooks.test.js +96 -0
  224. package/test/internals/initial-config.test.js +383 -0
  225. package/test/internals/logger.test.js +163 -0
  226. package/test/internals/plugin.test.js +170 -0
  227. package/test/internals/promise.test.js +63 -0
  228. package/test/internals/reply-serialize.test.js +714 -0
  229. package/test/internals/reply.test.js +1920 -0
  230. package/test/internals/req-id-gen-factory.test.js +133 -0
  231. package/test/internals/request-validate.test.js +1402 -0
  232. package/test/internals/request.test.js +506 -0
  233. package/test/internals/schema-controller-perf.test.js +40 -0
  234. package/test/internals/server.test.js +91 -0
  235. package/test/internals/validation.test.js +352 -0
  236. package/test/issue-4959.test.js +118 -0
  237. package/test/keep-alive-timeout.test.js +42 -0
  238. package/test/listen.1.test.js +154 -0
  239. package/test/listen.2.test.js +113 -0
  240. package/test/listen.3.test.js +83 -0
  241. package/test/listen.4.test.js +168 -0
  242. package/test/listen.5.test.js +122 -0
  243. package/test/logger/instantiation.test.js +341 -0
  244. package/test/logger/logger-test-utils.js +47 -0
  245. package/test/logger/logging.test.js +460 -0
  246. package/test/logger/options.test.js +579 -0
  247. package/test/logger/request.test.js +292 -0
  248. package/test/logger/response.test.js +183 -0
  249. package/test/logger/tap-parallel-not-ok +0 -0
  250. package/test/max-requests-per-socket.test.js +113 -0
  251. package/test/middleware.test.js +37 -0
  252. package/test/noop-set.test.js +19 -0
  253. package/test/nullable-validation.test.js +187 -0
  254. package/test/options.error-handler.test.js +5 -0
  255. package/test/options.test.js +5 -0
  256. package/test/output-validation.test.js +140 -0
  257. package/test/patch.error-handler.test.js +5 -0
  258. package/test/patch.test.js +5 -0
  259. package/test/plugin.1.test.js +230 -0
  260. package/test/plugin.2.test.js +314 -0
  261. package/test/plugin.3.test.js +287 -0
  262. package/test/plugin.4.test.js +504 -0
  263. package/test/plugin.helper.js +8 -0
  264. package/test/plugin.name.display.js +10 -0
  265. package/test/post-empty-body.test.js +38 -0
  266. package/test/pretty-print.test.js +366 -0
  267. package/test/promises.test.js +125 -0
  268. package/test/proto-poisoning.test.js +145 -0
  269. package/test/put.error-handler.test.js +5 -0
  270. package/test/put.test.js +5 -0
  271. package/test/register.test.js +184 -0
  272. package/test/reply-code.test.js +148 -0
  273. package/test/reply-early-hints.test.js +100 -0
  274. package/test/reply-error.test.js +815 -0
  275. package/test/reply-trailers.test.js +445 -0
  276. package/test/reply-web-stream-locked.test.js +37 -0
  277. package/test/request-error.test.js +624 -0
  278. package/test/request-header-host.test.js +339 -0
  279. package/test/request-id.test.js +118 -0
  280. package/test/request-timeout.test.js +53 -0
  281. package/test/route-hooks.test.js +635 -0
  282. package/test/route-prefix.test.js +904 -0
  283. package/test/route-shorthand.test.js +48 -0
  284. package/test/route.1.test.js +259 -0
  285. package/test/route.2.test.js +100 -0
  286. package/test/route.3.test.js +213 -0
  287. package/test/route.4.test.js +127 -0
  288. package/test/route.5.test.js +211 -0
  289. package/test/route.6.test.js +306 -0
  290. package/test/route.7.test.js +406 -0
  291. package/test/route.8.test.js +225 -0
  292. package/test/router-options.test.js +1108 -0
  293. package/test/same-shape.test.js +124 -0
  294. package/test/schema-examples.test.js +661 -0
  295. package/test/schema-feature.test.js +2198 -0
  296. package/test/schema-serialization.test.js +1171 -0
  297. package/test/schema-special-usage.test.js +1348 -0
  298. package/test/schema-validation.test.js +1572 -0
  299. package/test/scripts/validate-ecosystem-links.test.js +339 -0
  300. package/test/serialize-response.test.js +186 -0
  301. package/test/server.test.js +347 -0
  302. package/test/set-error-handler.test.js +69 -0
  303. package/test/skip-reply-send.test.js +317 -0
  304. package/test/stream-serializers.test.js +40 -0
  305. package/test/stream.1.test.js +94 -0
  306. package/test/stream.2.test.js +129 -0
  307. package/test/stream.3.test.js +198 -0
  308. package/test/stream.4.test.js +176 -0
  309. package/test/stream.5.test.js +188 -0
  310. package/test/sync-routes.test.js +32 -0
  311. package/test/throw.test.js +359 -0
  312. package/test/toolkit.js +63 -0
  313. package/test/trust-proxy.test.js +162 -0
  314. package/test/type-provider.test.js +22 -0
  315. package/test/types/content-type-parser.test-d.ts +72 -0
  316. package/test/types/decorate-request-reply.test-d.ts +18 -0
  317. package/test/types/dummy-plugin.ts +9 -0
  318. package/test/types/errors.test-d.ts +90 -0
  319. package/test/types/fastify.test-d.ts +352 -0
  320. package/test/types/hooks.test-d.ts +550 -0
  321. package/test/types/import.ts +2 -0
  322. package/test/types/instance.test-d.ts +588 -0
  323. package/test/types/logger.test-d.ts +277 -0
  324. package/test/types/plugin.test-d.ts +97 -0
  325. package/test/types/register.test-d.ts +237 -0
  326. package/test/types/reply.test-d.ts +254 -0
  327. package/test/types/request.test-d.ts +188 -0
  328. package/test/types/route.test-d.ts +553 -0
  329. package/test/types/schema.test-d.ts +135 -0
  330. package/test/types/serverFactory.test-d.ts +37 -0
  331. package/test/types/type-provider.test-d.ts +1213 -0
  332. package/test/types/using.test-d.ts +17 -0
  333. package/test/upgrade.test.js +52 -0
  334. package/test/url-rewriting.test.js +122 -0
  335. package/test/use-semicolon-delimiter.test.js +168 -0
  336. package/test/validation-error-handling.test.js +900 -0
  337. package/test/versioned-routes.test.js +603 -0
  338. package/test/web-api.test.js +616 -0
  339. package/test/wrap-thenable.test.js +30 -0
  340. package/types/content-type-parser.d.ts +75 -0
  341. package/types/context.d.ts +22 -0
  342. package/types/errors.d.ts +92 -0
  343. package/types/hooks.d.ts +875 -0
  344. package/types/instance.d.ts +609 -0
  345. package/types/logger.d.ts +107 -0
  346. package/types/plugin.d.ts +44 -0
  347. package/types/register.d.ts +42 -0
  348. package/types/reply.d.ts +81 -0
  349. package/types/request.d.ts +95 -0
  350. package/types/route.d.ts +199 -0
  351. package/types/schema.d.ts +61 -0
  352. package/types/server-factory.d.ts +19 -0
  353. package/types/type-provider.d.ts +130 -0
  354. package/types/utils.d.ts +98 -0
@@ -0,0 +1,246 @@
1
+ # Fastify Style Guide
2
+
3
+ ## Welcome
4
+
5
+ Welcome to *Fastify Style Guide*. This guide is here to provide you with a
6
+ conventional writing style for users writing developer documentation on our Open
7
+ Source framework. Each topic is precise and well explained to help you write
8
+ documentation users can easily understand and implement.
9
+
10
+ ## Who is this guide for?
11
+
12
+ This guide is for anyone who loves to build with Fastify or wants to contribute
13
+ to our documentation. You do not need to be an expert in writing technical
14
+ documentation. This guide is here to help you.
15
+
16
+ Visit the [contribute](https://fastify.dev/contribute) page on our website or
17
+ read the
18
+ [CONTRIBUTING.md](https://github.com/fastify/fastify/blob/main/CONTRIBUTING.md)
19
+ file on GitHub to join our Open Source folks.
20
+
21
+ ## Before you write
22
+
23
+ You need to know the following:
24
+
25
+ * JavaScript
26
+ * Node.js
27
+ * Git
28
+ * GitHub
29
+ * Markdown
30
+ * HTTP
31
+ * NPM
32
+
33
+ ### Consider your Audience
34
+
35
+ Before you start writing, think about your audience. In this case, your audience
36
+ should already know HTTP, JavaScript, NPM, and Node.js. It is necessary to keep
37
+ your readers in mind because they are the ones consuming your content. You want
38
+ to give as much useful information as possible. Consider the vital things they
39
+ need to know and how they can understand them. Use words and references that
40
+ readers can relate to easily. Ask for feedback from the community, it can help
41
+ you write better documentation that focuses on the user and what you want to
42
+ achieve.
43
+
44
+ ### Get straight to the point
45
+
46
+ Give your readers a clear and precise action to take. Start with what is most
47
+ important. This way, you can help them find what they need faster. Mostly,
48
+ readers tend to read the first content on a page, and many will not scroll
49
+ further.
50
+
51
+ **Example**
52
+
53
+ Less like this: Colons are very important to register a parametric path. It lets
54
+ the framework know there is a new parameter created. You can place the colon
55
+ before the parameter name so the parametric path can be created.
56
+
57
+ More Like this: To register a parametric path, put a colon before the parameter
58
+ name. Using a colon lets the framework know it is a parametric path and not a
59
+ static path.
60
+
61
+ ### Avoid adding video or image content
62
+
63
+
64
+ Do not add videos or screenshots to the documentation. It is easier to keep
65
+ under version control. Videos and images will eventually end up becoming
66
+ outdated as new updates keep developing. Instead, make a referral link or a
67
+ YouTube video. You can add links by using `[Title](www.websitename.com)` in the
68
+ markdown.
69
+
70
+ **Example**
71
+
72
+ ```
73
+ To learn more about hooks, see [Fastify hooks](https://fastify.dev/docs/latest/Reference/Hooks/).
74
+ ```
75
+
76
+ Result:
77
+ >To learn more about hooks, see [Fastify
78
+ >hooks](https://fastify.dev/docs/latest/Reference/Hooks/).
79
+
80
+
81
+
82
+ ### Avoid plagiarism
83
+
84
+ Make sure you avoid copying other people's work. Keep it as original as
85
+ possible. You can learn from what they have done and reference where it is from
86
+ if you use a particular quote from their work.
87
+
88
+
89
+ ## Word Choice
90
+
91
+ There are a few things you need to use and avoid when writing your documentation
92
+ to improve readability for readers and make documentation neat, direct, and
93
+ clean.
94
+
95
+
96
+ ### When to use the second person "you" as the pronoun
97
+
98
+ When writing articles or guides, your content should communicate directly to
99
+ readers in the second person ("you") addressed form. It is easier to give them
100
+ direct instruction on what to do on a particular topic. To see an example, visit
101
+ the [Plugins Guide](./Plugins-Guide.md).
102
+
103
+ **Example**
104
+
105
+ Less like this: we can use the following plugins.
106
+
107
+ More like this: You can use the following plugins.
108
+
109
+ > According to [Wikipedia](#), ***You*** is usually a second person pronoun.
110
+ > Also, used to refer to an indeterminate person, as a more common alternative
111
+ > to a very formal indefinite pronoun.
112
+
113
+ ## When to avoid the second person "you" as the pronoun
114
+
115
+ One of the main rules of formal writing such as reference documentation, or API
116
+ documentation, is to avoid the second person ("you") or directly addressing the
117
+ reader.
118
+
119
+ **Example**
120
+
121
+ Less like this: You can use the following recommendation as an example.
122
+
123
+ More like this: As an example, the following recommendations should be
124
+ referenced.
125
+
126
+ To view a live example, refer to the [Decorators](../Reference/Decorators.md)
127
+ reference document.
128
+
129
+
130
+ ### Avoid using contractions
131
+
132
+ Contractions are the shortened version of written and spoken forms of a word,
133
+ i.e. using "don't" instead of "do not". Avoid contractions to provide a more
134
+ formal tone.
135
+
136
+ ### Avoid using condescending terms
137
+
138
+ Condescending terms are words that include:
139
+
140
+ * Just
141
+ * Easy
142
+ * Simply
143
+ * Basically
144
+ * Obviously
145
+
146
+ The reader may not find it easy to use Fastify's framework and plugins; avoid
147
+ words that make it sound simple, easy, offensive, or insensitive. Not everyone
148
+ who reads the documentation has the same level of understanding.
149
+
150
+
151
+ ### Starting with a verb
152
+
153
+ Mostly start your description with a verb, which makes it simple and precise for
154
+ the reader to follow. Prefer using present tense because it is easier to read
155
+ and understand than the past or future tense.
156
+
157
+ **Example**
158
+
159
+ Less like this: There is a need for Node.js to be installed before you can be
160
+ able to use Fastify.
161
+
162
+ More like this: Install Node.js to make use of Fastify.
163
+
164
+ ### Grammatical moods
165
+
166
+ Grammatical moods are a great way to express your writing. Avoid sounding too
167
+ bossy while making a direct statement. Know when to switch between indicative,
168
+ imperative, and subjunctive moods.
169
+
170
+
171
+ **Indicative** - Use when making a factual statement or question.
172
+
173
+ Example: Since there is no testing framework available, "Fastify recommends ways
174
+ to write tests".
175
+
176
+ **Imperative** - Use when giving instructions, actions, commands, or when you
177
+ write your headings.
178
+
179
+ Example: Install dependencies before starting development.
180
+
181
+
182
+ **Subjunctive** - Use when making suggestions, hypotheses, or non-factual
183
+ statements.
184
+
185
+ Example: Reading the documentation on our website is recommended to get
186
+ comprehensive knowledge of the framework.
187
+
188
+ ### Use **active** voice instead of **passive**
189
+
190
+ Using active voice is a more compact and direct way of conveying your
191
+ documentation.
192
+
193
+ **Example**
194
+
195
+
196
+ Passive: The node dependencies and packages are installed by npm.
197
+
198
+ Active: npm installs packages and node dependencies.
199
+
200
+ ## Writing Style
201
+
202
+ ### Documentation titles
203
+
204
+ When creating a new guide, API, or reference in the `/docs/` directory, use
205
+ short titles that best describe the topic of your documentation. Name your files
206
+ in kebab-cases and avoid Raw or camelCase. To learn more about kebab-case you
207
+ can visit this medium article on [Case
208
+ Styles](https://medium.com/better-programming/string-case-styles-camel-pascal-snake-and-kebab-case-981407998841).
209
+
210
+ **Examples**:
211
+
212
+ >`hook-and-plugins.md`,
213
+
214
+ `adding-test-plugins.md`,
215
+
216
+ `removing-requests.md`.
217
+
218
+ ### Hyperlinks
219
+
220
+ Hyperlinks should have a clear title of what they reference. Here is how your
221
+ hyperlink should look:
222
+
223
+ ```MD
224
+ <!-- More like this -->
225
+
226
+ // Add clear & brief description
227
+ [Fastify Plugins] (https://fastify.dev/docs/latest/Plugins/)
228
+
229
+ <!--Less like this -->
230
+
231
+ // incomplete description
232
+ [Fastify] (https://fastify.dev/docs/latest/Plugins/)
233
+
234
+ // Adding title in link brackets
235
+ [](https://fastify.dev/docs/latest/Plugins/ "fastify plugin")
236
+
237
+ // Empty title
238
+ [](https://fastify.dev/docs/latest/Plugins/)
239
+
240
+ // Adding links localhost URLs instead of using code strings (``)
241
+ [http://localhost:3000/](http://localhost:3000/)
242
+
243
+ ```
244
+
245
+ Include in your documentation as many essential references as possible, but
246
+ avoid having numerous links when writing for beginners to avoid distractions.
@@ -0,0 +1,481 @@
1
+ <h1 style="text-align: center;">Fastify</h1>
2
+
3
+ # Testing
4
+ <a id="testing"></a>
5
+
6
+ Testing is one of the most important parts of developing an application. Fastify
7
+ is very flexible when it comes to testing and is compatible with most testing
8
+ frameworks (such as [Node Test Runner](https://nodejs.org/api/test.html),
9
+ which is used in the examples below).
10
+
11
+ ## Application
12
+
13
+ Let's `cd` into a fresh directory called 'testing-example' and type `npm init
14
+ -y` in our terminal.
15
+
16
+ Run `npm i fastify && npm i pino-pretty -D`
17
+
18
+ ### Separating concerns makes testing easy
19
+
20
+ First, we are going to separate our application code from our server code:
21
+
22
+ **app.js**:
23
+
24
+ ```js
25
+ 'use strict'
26
+
27
+ const fastify = require('fastify')
28
+
29
+ function build(opts={}) {
30
+ const app = fastify(opts)
31
+ app.get('/', async function (request, reply) {
32
+ return { hello: 'world' }
33
+ })
34
+
35
+ return app
36
+ }
37
+
38
+ module.exports = build
39
+ ```
40
+
41
+ **server.js**:
42
+
43
+ ```js
44
+ 'use strict'
45
+
46
+ const server = require('./app')({
47
+ logger: {
48
+ level: 'info',
49
+ transport: {
50
+ target: 'pino-pretty'
51
+ }
52
+ }
53
+ })
54
+
55
+ server.listen({ port: 3000 }, (err, address) => {
56
+ if (err) {
57
+ server.log.error(err)
58
+ process.exit(1)
59
+ }
60
+ })
61
+ ```
62
+
63
+ ### Benefits of using fastify.inject()
64
+
65
+ Fastify comes with built-in support for fake HTTP injection thanks to
66
+ [`light-my-request`](https://github.com/fastify/light-my-request).
67
+
68
+ Before introducing any tests, we will use the `.inject` method to make a fake
69
+ request to our route:
70
+
71
+ **app.test.js**:
72
+
73
+ ```js
74
+ 'use strict'
75
+
76
+ const build = require('./app')
77
+
78
+ const test = async () => {
79
+ const app = build()
80
+
81
+ const response = await app.inject({
82
+ method: 'GET',
83
+ url: '/'
84
+ })
85
+
86
+ console.log('status code: ', response.statusCode)
87
+ console.log('body: ', response.body)
88
+ }
89
+ test()
90
+ ```
91
+
92
+ First, our code will run inside an asynchronous function, giving us access to
93
+ async/await.
94
+
95
+ `.inject` ensures all registered plugins have booted up and our application is
96
+ ready to test. Finally, we pass the request method we want to use and a route.
97
+ Using await we can store the response without a callback.
98
+
99
+
100
+
101
+ Run the test file in your terminal `node app.test.js`
102
+
103
+ ```sh
104
+ status code: 200
105
+ body: {"hello":"world"}
106
+ ```
107
+
108
+
109
+
110
+ ### Testing with HTTP injection
111
+
112
+ Now we can replace our `console.log` calls with actual tests!
113
+
114
+ In your `package.json` change the "test" script to:
115
+
116
+ `"test": "node --test --watch"`
117
+
118
+ **app.test.js**:
119
+
120
+ ```js
121
+ 'use strict'
122
+
123
+ const { test } = require('node:test')
124
+ const build = require('./app')
125
+
126
+ test('requests the "/" route', async t => {
127
+ t.plan(1)
128
+ const app = build()
129
+
130
+ const response = await app.inject({
131
+ method: 'GET',
132
+ url: '/'
133
+ })
134
+ t.assert.strictEqual(response.statusCode, 200, 'returns a status code of 200')
135
+ })
136
+ ```
137
+
138
+ Finally, run `npm test` in the terminal and see your test results!
139
+
140
+ The `inject` method can do much more than a simple GET request to a URL:
141
+ ```js
142
+ fastify.inject({
143
+ method: String,
144
+ url: String,
145
+ query: Object,
146
+ payload: Object,
147
+ headers: Object,
148
+ cookies: Object
149
+ }, (error, response) => {
150
+ // your tests
151
+ })
152
+ ```
153
+
154
+ `.inject` methods can also be chained by omitting the callback function:
155
+
156
+ ```js
157
+ fastify
158
+ .inject()
159
+ .get('/')
160
+ .headers({ foo: 'bar' })
161
+ .query({ foo: 'bar' })
162
+ .end((err, res) => { // the .end call will trigger the request
163
+ console.log(res.payload)
164
+ })
165
+ ```
166
+
167
+ or in the promisified version
168
+
169
+ ```js
170
+ fastify
171
+ .inject({
172
+ method: String,
173
+ url: String,
174
+ query: Object,
175
+ payload: Object,
176
+ headers: Object,
177
+ cookies: Object
178
+ })
179
+ .then(response => {
180
+ // your tests
181
+ })
182
+ .catch(err => {
183
+ // handle error
184
+ })
185
+ ```
186
+
187
+ Async await is supported as well!
188
+ ```js
189
+ try {
190
+ const res = await fastify.inject({ method: String, url: String, payload: Object, headers: Object })
191
+ // your tests
192
+ } catch (err) {
193
+ // handle error
194
+ }
195
+ ```
196
+
197
+ #### Another Example:
198
+
199
+ **app.js**
200
+ ```js
201
+ const Fastify = require('fastify')
202
+
203
+ function buildFastify () {
204
+ const fastify = Fastify()
205
+
206
+ fastify.get('/', function (request, reply) {
207
+ reply.send({ hello: 'world' })
208
+ })
209
+
210
+ return fastify
211
+ }
212
+
213
+ module.exports = buildFastify
214
+ ```
215
+
216
+ **test.js**
217
+ ```js
218
+ const { test } = require('node:test')
219
+ const buildFastify = require('./app')
220
+
221
+ test('GET `/` route', t => {
222
+ t.plan(4)
223
+
224
+ const fastify = buildFastify()
225
+
226
+ // At the end of your tests it is highly recommended to call `.close()`
227
+ // to ensure that all connections to external services get closed.
228
+ t.after(() => fastify.close())
229
+
230
+ fastify.inject({
231
+ method: 'GET',
232
+ url: '/'
233
+ }, (err, response) => {
234
+ t.assert.ifError(err)
235
+ t.assert.strictEqual(response.statusCode, 200)
236
+ t.assert.strictEqual(response.headers['content-type'], 'application/json; charset=utf-8')
237
+ t.assert.deepStrictEqual(response.json(), { hello: 'world' })
238
+ })
239
+ })
240
+ ```
241
+
242
+ ### Testing with a running server
243
+ Fastify can also be tested after starting the server with `fastify.listen()` or
244
+ after initializing routes and plugins with `fastify.ready()`.
245
+
246
+ #### Example:
247
+
248
+ Uses **app.js** from the previous example.
249
+
250
+ **test-listen.js** (testing with [`undici`](https://www.npmjs.com/package/undici))
251
+ ```js
252
+ const { test } = require('node:test')
253
+ const { Client } = require('undici')
254
+ const buildFastify = require('./app')
255
+
256
+ test('should work with undici', async t => {
257
+ t.plan(2)
258
+
259
+ const fastify = buildFastify()
260
+
261
+ await fastify.listen()
262
+
263
+ const client = new Client(
264
+ 'http://localhost:' + fastify.server.address().port, {
265
+ keepAliveTimeout: 10,
266
+ keepAliveMaxTimeout: 10
267
+ }
268
+ )
269
+
270
+ t.after(() => {
271
+ fastify.close()
272
+ client.close()
273
+ })
274
+
275
+ const response = await client.request({ method: 'GET', path: '/' })
276
+
277
+ t.assert.strictEqual(await response.body.text(), '{"hello":"world"}')
278
+ t.assert.strictEqual(response.statusCode, 200)
279
+ })
280
+ ```
281
+
282
+ Alternatively, starting with Node.js 18,
283
+ [`fetch`](https://nodejs.org/docs/latest-v18.x/api/globals.html#fetch)
284
+ may be used without requiring any extra dependencies:
285
+
286
+ **test-listen.js**
287
+ ```js
288
+ const { test } = require('node:test')
289
+ const buildFastify = require('./app')
290
+
291
+ test('should work with fetch', async t => {
292
+ t.plan(3)
293
+
294
+ const fastify = buildFastify()
295
+
296
+ t.after(() => fastify.close())
297
+
298
+ await fastify.listen()
299
+
300
+ const response = await fetch(
301
+ 'http://localhost:' + fastify.server.address().port
302
+ )
303
+
304
+ t.assert.strictEqual(response.status, 200)
305
+ t.assert.strictEqual(
306
+ response.headers.get('content-type'),
307
+ 'application/json; charset=utf-8'
308
+ )
309
+ const jsonResult = await response.json()
310
+ t.assert.strictEqual(jsonResult.hello, 'world')
311
+ })
312
+ ```
313
+
314
+ **test-ready.js** (testing with
315
+ [`SuperTest`](https://www.npmjs.com/package/supertest))
316
+ ```js
317
+ const { test } = require('node:test')
318
+ const supertest = require('supertest')
319
+ const buildFastify = require('./app')
320
+
321
+ test('GET `/` route', async (t) => {
322
+ const fastify = buildFastify()
323
+
324
+ t.after(() => fastify.close())
325
+
326
+ await fastify.ready()
327
+
328
+ const response = await supertest(fastify.server)
329
+ .get('/')
330
+ .expect(200)
331
+ .expect('Content-Type', 'application/json; charset=utf-8')
332
+ t.assert.deepStrictEqual(response.body, { hello: 'world' })
333
+ })
334
+ ```
335
+
336
+ ### How to inspect node tests
337
+ 1. Isolate your test by passing the `{only: true}` option
338
+ ```javascript
339
+ test('should ...', {only: true}, t => ...)
340
+ ```
341
+ 2. Run `node --test`
342
+ ```bash
343
+ > node --test --test-only --inspect-brk test/<test-file.test.js>
344
+ ```
345
+ - `--test-only` specifies to run tests with the `only` option enabled
346
+ - `--inspect-brk` will launch the node debugger
347
+ 3. In VS Code, create and launch a `Node.js: Attach` debug configuration. No
348
+ modification should be necessary.
349
+
350
+ Now you should be able to step through your test file (and the rest of
351
+ `Fastify`) in your code editor.
352
+
353
+
354
+
355
+ ## Plugins
356
+ Let's `cd` into a fresh directory called 'testing-plugin-example' and type
357
+ `npm init -y` in our terminal.
358
+
359
+ Run `npm i fastify fastify-plugin`
360
+
361
+ **plugin/myFirstPlugin.js**:
362
+
363
+ ```js
364
+ const fP = require("fastify-plugin")
365
+
366
+ async function myPlugin(fastify, options) {
367
+ fastify.decorateRequest("helloRequest", "Hello World")
368
+ fastify.decorate("helloInstance", "Hello Fastify Instance")
369
+ }
370
+
371
+ module.exports = fP(myPlugin)
372
+ ```
373
+
374
+ A basic example of a Plugin. See [Plugin Guide](./Plugins-Guide.md)
375
+
376
+ **test/myFirstPlugin.test.js**:
377
+
378
+ ```js
379
+ const Fastify = require("fastify");
380
+ const { test } = require("node:test");
381
+ const myPlugin = require("../plugin/myFirstPlugin");
382
+
383
+ test("Test the Plugin Route", async t => {
384
+ // Create a mock fastify application to test the plugin
385
+ const fastify = Fastify()
386
+
387
+ fastify.register(myPlugin)
388
+
389
+ // Add an endpoint of your choice
390
+ fastify.get("/", async (request, reply) => {
391
+ return ({ message: request.helloRequest })
392
+ })
393
+
394
+ // Use fastify.inject to fake a HTTP Request
395
+ const fastifyResponse = await fastify.inject({
396
+ method: "GET",
397
+ url: "/"
398
+ })
399
+
400
+ console.log('status code: ', fastifyResponse.statusCode)
401
+ console.log('body: ', fastifyResponse.body)
402
+ })
403
+ ```
404
+ Learn more about [```fastify.inject()```](#benefits-of-using-fastifyinject).
405
+ Run the test file in your terminal `node test/myFirstPlugin.test.js`
406
+
407
+ ```sh
408
+ status code: 200
409
+ body: {"message":"Hello World"}
410
+ ```
411
+
412
+ Now we can replace our `console.log` calls with actual tests!
413
+
414
+ In your `package.json` change the "test" script to:
415
+
416
+ `"test": "node --test --watch"`
417
+
418
+ Create the test for the endpoint.
419
+
420
+ **test/myFirstPlugin.test.js**:
421
+
422
+ ```js
423
+ const Fastify = require("fastify");
424
+ const { test } = require("node:test");
425
+ const myPlugin = require("../plugin/myFirstPlugin");
426
+
427
+ test("Test the Plugin Route", async t => {
428
+ // Specifies the number of test
429
+ t.plan(2)
430
+
431
+ const fastify = Fastify()
432
+
433
+ fastify.register(myPlugin)
434
+
435
+ fastify.get("/", async (request, reply) => {
436
+ return ({ message: request.helloRequest })
437
+ })
438
+
439
+ const fastifyResponse = await fastify.inject({
440
+ method: "GET",
441
+ url: "/"
442
+ })
443
+
444
+ t.assert.strictEqual(fastifyResponse.statusCode, 200)
445
+ t.assert.deepStrictEqual(JSON.parse(fastifyResponse.body), { message: "Hello World" })
446
+ })
447
+ ```
448
+
449
+ Finally, run `npm test` in the terminal and see your test results!
450
+
451
+ Test the ```.decorate()``` and ```.decorateRequest()```.
452
+
453
+ **test/myFirstPlugin.test.js**:
454
+
455
+ ```js
456
+ const Fastify = require("fastify");
457
+ const { test }= require("node:test");
458
+ const myPlugin = require("../plugin/myFirstPlugin");
459
+
460
+ test("Test the Plugin Route", async t => {
461
+ t.plan(5)
462
+ const fastify = Fastify()
463
+
464
+ fastify.register(myPlugin)
465
+
466
+ fastify.get("/", async (request, reply) => {
467
+ // Testing the fastify decorators
468
+ t.assert.ifError(request.helloRequest)
469
+ t.assert.ok(request.helloRequest, "Hello World")
470
+ t.assert.ok(fastify.helloInstance, "Hello Fastify Instance")
471
+ return ({ message: request.helloRequest })
472
+ })
473
+
474
+ const fastifyResponse = await fastify.inject({
475
+ method: "GET",
476
+ url: "/"
477
+ })
478
+ t.assert.strictEqual(fastifyResponse.statusCode, 200)
479
+ t.assert.deepStrictEqual(JSON.parse(fastifyResponse.body), { message: "Hello World" })
480
+ })
481
+ ```