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,12 @@
1
+ 'use strict'
2
+
3
+ module.exports = function (fastify, opts, done) {
4
+ fastify
5
+ .get('/', opts, function (req, reply) {
6
+ reply.send({ hello: 'world' })
7
+ })
8
+ .post('/', opts, function (req, reply) {
9
+ reply.send({ hello: 'world' })
10
+ })
11
+ done()
12
+ }
@@ -0,0 +1,38 @@
1
+ 'use strict'
2
+
3
+ const fastify = require('../fastify')({ logger: true })
4
+
5
+ const opts = {
6
+ schema: {
7
+ response: {
8
+ '2xx': {
9
+ type: 'object',
10
+ properties: {
11
+ greet: { type: 'string' }
12
+ }
13
+ }
14
+ }
15
+ }
16
+ }
17
+
18
+ fastify.register(function (instance, options, done) {
19
+ // the route will be '/english/hello'
20
+ instance.get('/hello', opts, (req, reply) => {
21
+ reply.send({ greet: 'hello' })
22
+ })
23
+ done()
24
+ }, { prefix: '/english' })
25
+
26
+ fastify.register(function (instance, options, done) {
27
+ // the route will be '/italian/hello'
28
+ instance.get('/hello', opts, (req, reply) => {
29
+ reply.send({ greet: 'ciao' })
30
+ })
31
+ done()
32
+ }, { prefix: '/italian' })
33
+
34
+ fastify.listen({ port: 8000 }, function (err) {
35
+ if (err) {
36
+ throw err
37
+ }
38
+ })
@@ -0,0 +1,38 @@
1
+ 'use strict'
2
+
3
+ const fastify = require('../fastify')({ logger: true })
4
+
5
+ fastify.addSchema({
6
+ $id: 'https://foo/common.json',
7
+ definitions: {
8
+ response: {
9
+ $id: '#reply',
10
+ type: 'object',
11
+ properties: {
12
+ hello: {
13
+ $id: '#bar',
14
+ type: 'string'
15
+ }
16
+ }
17
+ }
18
+ }
19
+ })
20
+
21
+ const opts = {
22
+ schema: {
23
+ response: {
24
+ 200: { $ref: 'https://foo/common.json#reply' }
25
+ }
26
+ }
27
+ }
28
+
29
+ fastify
30
+ .get('/', opts, function (req, reply) {
31
+ reply.send({ hello: 'world' })
32
+ })
33
+
34
+ fastify.listen({ port: 3000 }, err => {
35
+ if (err) {
36
+ throw err
37
+ }
38
+ })
@@ -0,0 +1,20 @@
1
+ 'use strict'
2
+
3
+ const fastify = require('../fastify')({
4
+ logger: false
5
+ })
6
+
7
+ const Readable = require('node:stream').Readable
8
+
9
+ fastify
10
+ .get('/', function (req, reply) {
11
+ const stream = Readable.from(['hello world'])
12
+ reply.send(stream)
13
+ })
14
+
15
+ fastify.listen({ port: 3000 }, (err, address) => {
16
+ if (err) {
17
+ throw err
18
+ }
19
+ fastify.log.info(`server listening on ${address}`)
20
+ })
@@ -0,0 +1,32 @@
1
+ 'use strict'
2
+
3
+ const fastify = require('../fastify')({
4
+ logger: false
5
+ })
6
+
7
+ const schema = {
8
+ schema: {
9
+ response: {
10
+ 200: {
11
+ type: 'object',
12
+ properties: {
13
+ hello: {
14
+ type: 'string'
15
+ }
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }
21
+
22
+ fastify
23
+ .get('/', schema, function (req, reply) {
24
+ reply
25
+ .send({ hello: 'world' })
26
+ })
27
+
28
+ fastify.listen({ port: 3000 }, (err, address) => {
29
+ if (err) {
30
+ throw err
31
+ }
32
+ })
@@ -0,0 +1,27 @@
1
+ // works on Node v14.13.0+
2
+ import { fastify } from '../fastify.js'
3
+
4
+ const app = fastify({
5
+ logger: true
6
+ })
7
+
8
+ const schema = {
9
+ schema: {
10
+ response: {
11
+ 200: {
12
+ type: 'object',
13
+ properties: {
14
+ hello: {
15
+ type: 'string'
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }
21
+ }
22
+
23
+ app.get('/', schema, async function (req, reply) {
24
+ return { hello: 'world' }
25
+ })
26
+
27
+ app.listen({ port: 3000 }).catch(console.error)
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Most type annotations in this file are not strictly necessary but are
3
+ * included for this example.
4
+ *
5
+ * To run this example execute the following commands to install typescript,
6
+ * transpile the code, and start the server:
7
+ *
8
+ * npm i -g typescript
9
+ * tsc examples/typescript-server.ts --target es6 --module commonjs
10
+ * node examples/typescript-server.js
11
+ */
12
+
13
+ import fastify, { FastifyInstance, RouteShorthandOptions } from '../fastify'
14
+ import { Server, IncomingMessage, ServerResponse } from 'node:http'
15
+
16
+ // Create an http server. We pass the relevant typings for our http version used.
17
+ // By passing types we get correctly typed access to the underlying http objects in routes.
18
+ // If using http2 we'd pass <http2.Http2Server, http2.Http2ServerRequest, http2.Http2ServerResponse>
19
+ const server: FastifyInstance<
20
+ Server,
21
+ IncomingMessage,
22
+ ServerResponse
23
+ > = fastify({ logger: true })
24
+
25
+ // Define interfaces for our request. We can create these automatically
26
+ // off our JSON Schema files (See TypeScript.md) but for the purpose of this
27
+ // example we manually define them.
28
+ interface PingQuerystring {
29
+ foo?: number;
30
+ }
31
+
32
+ interface PingParams {
33
+ bar?: string;
34
+ }
35
+
36
+ interface PingHeaders {
37
+ a?: string;
38
+ }
39
+
40
+ interface PingBody {
41
+ baz?: string;
42
+ }
43
+
44
+ // Define our route options with schema validation
45
+ const opts: RouteShorthandOptions = {
46
+ schema: {
47
+ body: {
48
+ type: 'object',
49
+ properties: {
50
+ pong: {
51
+ type: 'string'
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+
58
+ // Add our route handler with correct types
59
+ server.post<{
60
+ Querystring: PingQuerystring;
61
+ Params: PingParams;
62
+ Headers: PingHeaders;
63
+ Body: PingBody;
64
+ }>('/ping/:bar', opts, (request, reply) => {
65
+ console.log(request.query) // this is of type `PingQuerystring`
66
+ console.log(request.params) // this is of type `PingParams`
67
+ console.log(request.headers) // this is of type `PingHeaders`
68
+ console.log(request.body) // this is of type `PingBody`
69
+ reply.code(200).send({ pong: 'it worked!' })
70
+ })
71
+
72
+ // Start your server
73
+ server.listen({ port: 8080 }, (err, address) => {
74
+ if (err) {
75
+ console.error(err)
76
+ process.exit(1)
77
+ }
78
+ console.log(`server listening on ${address}`)
79
+ })
@@ -0,0 +1,29 @@
1
+ 'use strict'
2
+
3
+ const fastify = require('../fastify')({ logger: true })
4
+
5
+ const opts = {
6
+ schema: {
7
+ response: {
8
+ '2xx': {
9
+ type: 'object',
10
+ properties: {
11
+ hello: {
12
+ type: 'string'
13
+ }
14
+ }
15
+ }
16
+ }
17
+ }
18
+ }
19
+ fastify.register(require('./plugin'), opts, function (err) {
20
+ if (err) {
21
+ throw err
22
+ }
23
+ })
24
+
25
+ fastify.listen({ port: 3000 }, function (err) {
26
+ if (err) {
27
+ throw err
28
+ }
29
+ })
package/fastify.d.ts ADDED
@@ -0,0 +1,253 @@
1
+ import * as http from 'node:http'
2
+ import * as http2 from 'node:http2'
3
+ import * as https from 'node:https'
4
+ import { Socket } from 'node:net'
5
+
6
+ import { BuildCompilerFromPool, ValidatorFactory } from '@fastify/ajv-compiler'
7
+ import { FastifyError } from '@fastify/error'
8
+ import { Options as FJSOptions, SerializerFactory } from '@fastify/fast-json-stringify-compiler'
9
+ import { Config as FindMyWayConfig, ConstraintStrategy, HTTPVersion } from 'find-my-way'
10
+ import { InjectOptions, CallbackFunc as LightMyRequestCallback, Chain as LightMyRequestChain, Response as LightMyRequestResponse } from 'light-my-request'
11
+
12
+ import { AddContentTypeParser, ConstructorAction, FastifyBodyParser, FastifyContentTypeParser, getDefaultJsonParser, hasContentTypeParser, ProtoAction } from './types/content-type-parser'
13
+ import { FastifyContextConfig, FastifyReplyContext, FastifyRequestContext } from './types/context'
14
+ import { FastifyErrorCodes } from './types/errors'
15
+ import { DoneFuncWithErrOrRes, HookHandlerDoneFunction, onCloseAsyncHookHandler, onCloseHookHandler, onErrorAsyncHookHandler, onErrorHookHandler, onListenAsyncHookHandler, onListenHookHandler, onReadyAsyncHookHandler, onReadyHookHandler, onRegisterHookHandler, onRequestAbortAsyncHookHandler, onRequestAbortHookHandler, onRequestAsyncHookHandler, onRequestHookHandler, onResponseAsyncHookHandler, onResponseHookHandler, onRouteHookHandler, onSendAsyncHookHandler, onSendHookHandler, onTimeoutAsyncHookHandler, onTimeoutHookHandler, preCloseAsyncHookHandler, preCloseHookHandler, preHandlerAsyncHookHandler, preHandlerHookHandler, preParsingAsyncHookHandler, preParsingHookHandler, preSerializationAsyncHookHandler, preSerializationHookHandler, preValidationAsyncHookHandler, preValidationHookHandler, RequestPayload } from './types/hooks'
16
+ import { FastifyInstance, FastifyListenOptions, PrintRoutesOptions } from './types/instance'
17
+ import {
18
+ FastifyBaseLogger,
19
+ FastifyChildLoggerFactory,
20
+ FastifyLogFn,
21
+ FastifyLoggerInstance,
22
+ FastifyLoggerOptions,
23
+ LogLevel,
24
+ PinoLoggerOptions
25
+ } from './types/logger'
26
+ import { FastifyPlugin, FastifyPluginAsync, FastifyPluginCallback, FastifyPluginOptions } from './types/plugin'
27
+ import { FastifyRegister, FastifyRegisterOptions, RegisterOptions } from './types/register'
28
+ import { FastifyReply } from './types/reply'
29
+ import { FastifyRequest, RequestGenericInterface } from './types/request'
30
+ import { RouteGenericInterface, RouteHandler, RouteHandlerMethod, RouteOptions, RouteShorthandMethod, RouteShorthandOptions, RouteShorthandOptionsWithHandler } from './types/route'
31
+ import { FastifySchema, FastifySchemaValidationError, FastifySchemaCompiler, FastifySerializerCompiler, SchemaErrorDataVar, SchemaErrorFormatter } from './types/schema'
32
+ import { FastifyServerFactory, FastifyServerFactoryHandler } from './types/server-factory'
33
+ import { FastifyTypeProvider, FastifyTypeProviderDefault, SafePromiseLike } from './types/type-provider'
34
+ import { ContextConfigDefault, HTTPMethods, RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerBase, RawServerDefault, RequestBodyDefault, RequestHeadersDefault, RequestParamsDefault, RequestQuerystringDefault } from './types/utils'
35
+
36
+ declare module '@fastify/error' {
37
+ interface FastifyError {
38
+ validationContext?: SchemaErrorDataVar;
39
+ validation?: FastifySchemaValidationError[];
40
+ }
41
+ }
42
+
43
+ type Fastify = typeof fastify
44
+
45
+ declare namespace fastify {
46
+ export const errorCodes: FastifyErrorCodes
47
+
48
+ export type FastifyHttp2SecureOptions<
49
+ Server extends http2.Http2SecureServer,
50
+ Logger extends FastifyBaseLogger = FastifyBaseLogger
51
+ > = FastifyServerOptions<Server, Logger> & {
52
+ http2: true,
53
+ https: http2.SecureServerOptions,
54
+ http2SessionTimeout?: number
55
+ }
56
+
57
+ export type FastifyHttp2Options<
58
+ Server extends http2.Http2Server,
59
+ Logger extends FastifyBaseLogger = FastifyBaseLogger
60
+ > = FastifyServerOptions<Server, Logger> & {
61
+ http2: true,
62
+ http2SessionTimeout?: number
63
+ }
64
+
65
+ export type FastifyHttpsOptions<
66
+ Server extends https.Server,
67
+ Logger extends FastifyBaseLogger = FastifyBaseLogger
68
+ > = FastifyServerOptions<Server, Logger> & {
69
+ https: https.ServerOptions | null
70
+ }
71
+
72
+ export type FastifyHttpOptions<
73
+ Server extends http.Server,
74
+ Logger extends FastifyBaseLogger = FastifyBaseLogger
75
+ > = FastifyServerOptions<Server, Logger> & {
76
+ http?: http.ServerOptions | null
77
+ }
78
+
79
+ type FindMyWayVersion<RawServer extends RawServerBase> = RawServer extends http.Server ? HTTPVersion.V1 : HTTPVersion.V2
80
+ type FindMyWayConfigForServer<RawServer extends RawServerBase> = FindMyWayConfig<FindMyWayVersion<RawServer>>
81
+
82
+ export interface ConnectionError extends Error {
83
+ code: string,
84
+ bytesParsed: number,
85
+ rawPacket: {
86
+ type: string,
87
+ data: number[]
88
+ }
89
+ }
90
+
91
+ type TrustProxyFunction = (address: string, hop: number) => boolean
92
+
93
+ export type FastifyRouterOptions<RawServer extends RawServerBase> = Omit<FindMyWayConfigForServer<RawServer>, 'defaultRoute' | 'onBadUrl' | 'querystringParser'> & {
94
+ defaultRoute?: (
95
+ req: RawRequestDefaultExpression<RawServer>,
96
+ res: RawReplyDefaultExpression<RawServer>
97
+ ) => void,
98
+ onBadUrl?: (
99
+ path: string,
100
+ req: RawRequestDefaultExpression<RawServer>,
101
+ res: RawReplyDefaultExpression<RawServer>
102
+ ) => void,
103
+ querystringParser?: (str: string) => { [key: string]: unknown }
104
+ }
105
+
106
+ /**
107
+ * Options for a fastify server instance. Utilizes conditional logic on the generic server parameter to enforce certain https and http2
108
+ */
109
+ export type FastifyServerOptions<
110
+ RawServer extends RawServerBase = RawServerDefault,
111
+ Logger extends FastifyBaseLogger = FastifyBaseLogger
112
+ > = {
113
+ ignoreTrailingSlash?: boolean,
114
+ ignoreDuplicateSlashes?: boolean,
115
+ connectionTimeout?: number,
116
+ keepAliveTimeout?: number,
117
+ maxRequestsPerSocket?: number,
118
+ forceCloseConnections?: boolean | 'idle',
119
+ requestTimeout?: number,
120
+ pluginTimeout?: number,
121
+ bodyLimit?: number,
122
+ handlerTimeout?: number,
123
+ maxParamLength?: number,
124
+ disableRequestLogging?: boolean | ((req: FastifyRequest) => boolean),
125
+ exposeHeadRoutes?: boolean,
126
+ onProtoPoisoning?: ProtoAction,
127
+ onConstructorPoisoning?: ConstructorAction,
128
+ logger?: boolean | FastifyLoggerOptions<RawServer> & PinoLoggerOptions,
129
+ loggerInstance?: Logger
130
+ serializerOpts?: FJSOptions | Record<string, unknown>,
131
+ serverFactory?: FastifyServerFactory<RawServer>,
132
+ caseSensitive?: boolean,
133
+ allowUnsafeRegex?: boolean,
134
+ requestIdHeader?: string | false,
135
+ requestIdLogLabel?: string;
136
+ useSemicolonDelimiter?: boolean,
137
+ genReqId?: (req: RawRequestDefaultExpression<RawServer>) => string,
138
+ trustProxy?: boolean | string | string[] | number | TrustProxyFunction,
139
+ querystringParser?: (str: string) => { [key: string]: unknown },
140
+ constraints?: {
141
+ [name: string]: ConstraintStrategy<FindMyWayVersion<RawServer>, unknown>,
142
+ },
143
+ schemaController?: {
144
+ bucket?: (parentSchemas?: unknown) => {
145
+ add(schema: unknown): FastifyInstance;
146
+ getSchema(schemaId: string): unknown;
147
+ getSchemas(): Record<string, unknown>;
148
+ };
149
+ compilersFactory?: {
150
+ buildValidator?: ValidatorFactory;
151
+ buildSerializer?: SerializerFactory;
152
+ };
153
+ };
154
+ return503OnClosing?: boolean,
155
+ ajv?: Parameters<BuildCompilerFromPool>[1],
156
+ frameworkErrors?: <RequestGeneric extends RequestGenericInterface = RequestGenericInterface, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, SchemaCompiler extends FastifySchema = FastifySchema>(
157
+ error: FastifyError,
158
+ req: FastifyRequest<RequestGeneric, RawServer, RawRequestDefaultExpression<RawServer>, FastifySchema, TypeProvider>,
159
+ res: FastifyReply<RequestGeneric, RawServer, RawRequestDefaultExpression<RawServer>, RawReplyDefaultExpression<RawServer>, FastifyContextConfig, SchemaCompiler, TypeProvider>
160
+ ) => void,
161
+ rewriteUrl?: (
162
+ // The RawRequestDefaultExpression, RawReplyDefaultExpression, and FastifyTypeProviderDefault parameters
163
+ // should be narrowed further but those generic parameters are not passed to this FastifyServerOptions type
164
+ this: FastifyInstance<RawServer, RawRequestDefaultExpression<RawServer>, RawReplyDefaultExpression<RawServer>, Logger, FastifyTypeProviderDefault>,
165
+ req: RawRequestDefaultExpression<RawServer>
166
+ ) => string,
167
+ schemaErrorFormatter?: SchemaErrorFormatter,
168
+ /**
169
+ * listener to error events emitted by client connections
170
+ */
171
+ clientErrorHandler?: (error: ConnectionError, socket: Socket) => void,
172
+ childLoggerFactory?: FastifyChildLoggerFactory,
173
+ allowErrorHandlerOverride?: boolean
174
+ routerOptions?: FastifyRouterOptions<RawServer>,
175
+ }
176
+
177
+ /**
178
+ * @deprecated use {@link FastifySchemaValidationError}
179
+ */
180
+ export type ValidationResult = FastifySchemaValidationError
181
+
182
+ /* Export additional types */
183
+ export type {
184
+ LightMyRequestChain, InjectOptions, LightMyRequestResponse, LightMyRequestCallback, // 'light-my-request'
185
+ FastifyRequest, RequestGenericInterface, // './types/request'
186
+ FastifyReply, // './types/reply'
187
+ FastifyPluginCallback, FastifyPluginAsync, FastifyPluginOptions, FastifyPlugin, // './types/plugin'
188
+ FastifyListenOptions, FastifyInstance, PrintRoutesOptions, // './types/instance'
189
+ FastifyLoggerOptions, FastifyBaseLogger, FastifyLoggerInstance, FastifyLogFn, LogLevel, // './types/logger'
190
+ FastifyRequestContext, FastifyContextConfig, FastifyReplyContext, // './types/context'
191
+ RouteHandler, RouteHandlerMethod, RouteOptions, RouteShorthandMethod, RouteShorthandOptions, RouteShorthandOptionsWithHandler, RouteGenericInterface, // './types/route'
192
+ FastifyRegister, FastifyRegisterOptions, RegisterOptions, // './types/register'
193
+ FastifyBodyParser, FastifyContentTypeParser, AddContentTypeParser, hasContentTypeParser, getDefaultJsonParser, ProtoAction, ConstructorAction, // './types/content-type-parser'
194
+ FastifyError, // '@fastify/error'
195
+ FastifySchema, FastifySchemaValidationError, FastifySchemaCompiler, FastifySerializerCompiler, // './types/schema'
196
+ HTTPMethods, RawServerBase, RawRequestDefaultExpression, RawReplyDefaultExpression, RawServerDefault, ContextConfigDefault, RequestBodyDefault, RequestQuerystringDefault, RequestParamsDefault, RequestHeadersDefault, // './types/utils'
197
+ DoneFuncWithErrOrRes, HookHandlerDoneFunction, RequestPayload, onCloseAsyncHookHandler, onCloseHookHandler, onErrorAsyncHookHandler, onErrorHookHandler, onReadyAsyncHookHandler, onReadyHookHandler, onListenAsyncHookHandler, onListenHookHandler, onRegisterHookHandler, onRequestAsyncHookHandler, onRequestHookHandler, onResponseAsyncHookHandler, onResponseHookHandler, onRouteHookHandler, onSendAsyncHookHandler, onSendHookHandler, onTimeoutAsyncHookHandler, onTimeoutHookHandler, preHandlerAsyncHookHandler, preHandlerHookHandler, preParsingAsyncHookHandler, preParsingHookHandler, preSerializationAsyncHookHandler, preSerializationHookHandler, preValidationAsyncHookHandler, preValidationHookHandler, onRequestAbortHookHandler, onRequestAbortAsyncHookHandler, preCloseAsyncHookHandler, preCloseHookHandler, // './types/hooks'
198
+ FastifyServerFactory, FastifyServerFactoryHandler, // './types/serverFactory'
199
+ FastifyTypeProvider, FastifyTypeProviderDefault, SafePromiseLike, // './types/type-provider'
200
+ FastifyErrorCodes // './types/errors'
201
+ }
202
+ // named export
203
+ // import { plugin } from 'plugin'
204
+ // const { plugin } = require('plugin')
205
+ export const fastify: Fastify
206
+ // default export
207
+ // import plugin from 'plugin'
208
+ export { fastify as default }
209
+ }
210
+
211
+ /**
212
+ * Fastify factory function for the standard fastify http, https, or http2 server instance.
213
+ *
214
+ * The default function utilizes http
215
+ *
216
+ * @param opts Fastify server options
217
+ * @returns Fastify server instance
218
+ */
219
+ declare function fastify<
220
+ Server extends http2.Http2SecureServer,
221
+ Request extends RawRequestDefaultExpression<Server> = RawRequestDefaultExpression<Server>,
222
+ Reply extends RawReplyDefaultExpression<Server> = RawReplyDefaultExpression<Server>,
223
+ Logger extends FastifyBaseLogger = FastifyBaseLogger,
224
+ TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault
225
+ > (opts: fastify.FastifyHttp2SecureOptions<Server, Logger>): FastifyInstance<Server, Request, Reply, Logger, TypeProvider> & SafePromiseLike<FastifyInstance<Server, Request, Reply, Logger, TypeProvider>>
226
+
227
+ declare function fastify<
228
+ Server extends http2.Http2Server,
229
+ Request extends RawRequestDefaultExpression<Server> = RawRequestDefaultExpression<Server>,
230
+ Reply extends RawReplyDefaultExpression<Server> = RawReplyDefaultExpression<Server>,
231
+ Logger extends FastifyBaseLogger = FastifyBaseLogger,
232
+ TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault
233
+ > (opts: fastify.FastifyHttp2Options<Server, Logger>): FastifyInstance<Server, Request, Reply, Logger, TypeProvider> & SafePromiseLike<FastifyInstance<Server, Request, Reply, Logger, TypeProvider>>
234
+
235
+ declare function fastify<
236
+ Server extends https.Server,
237
+ Request extends RawRequestDefaultExpression<Server> = RawRequestDefaultExpression<Server>,
238
+ Reply extends RawReplyDefaultExpression<Server> = RawReplyDefaultExpression<Server>,
239
+ Logger extends FastifyBaseLogger = FastifyBaseLogger,
240
+ TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault
241
+ > (opts: fastify.FastifyHttpsOptions<Server, Logger>): FastifyInstance<Server, Request, Reply, Logger, TypeProvider> & SafePromiseLike<FastifyInstance<Server, Request, Reply, Logger, TypeProvider>>
242
+
243
+ declare function fastify<
244
+ Server extends http.Server,
245
+ Request extends RawRequestDefaultExpression<Server> = RawRequestDefaultExpression<Server>,
246
+ Reply extends RawReplyDefaultExpression<Server> = RawReplyDefaultExpression<Server>,
247
+ Logger extends FastifyBaseLogger = FastifyBaseLogger,
248
+ TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault
249
+ > (opts?: fastify.FastifyHttpOptions<Server, Logger>): FastifyInstance<Server, Request, Reply, Logger, TypeProvider> & SafePromiseLike<FastifyInstance<Server, Request, Reply, Logger, TypeProvider>>
250
+
251
+ // CJS export
252
+ // const fastify = require('fastify')
253
+ export = fastify