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,982 @@
1
+ 'use strict'
2
+
3
+ const { test } = require('node:test')
4
+ const errors = require('../../lib/errors')
5
+ const { readFileSync } = require('node:fs')
6
+ const { resolve } = require('node:path')
7
+
8
+ const expectedErrors = 88
9
+
10
+ test(`should expose ${expectedErrors} errors`, t => {
11
+ t.plan(1)
12
+ const exportedKeys = Object.keys(errors)
13
+ let counter = 0
14
+ for (const key of exportedKeys) {
15
+ if (errors[key].name === 'FastifyError') {
16
+ counter++
17
+ }
18
+ }
19
+ t.assert.strictEqual(counter, expectedErrors)
20
+ })
21
+
22
+ test('ensure name and codes of Errors are identical', t => {
23
+ t.plan(expectedErrors)
24
+
25
+ const exportedKeys = Object.keys(errors)
26
+ for (const key of exportedKeys) {
27
+ if (errors[key].name === 'FastifyError') {
28
+ t.assert.strictEqual(key, new errors[key]().code, key)
29
+ }
30
+ }
31
+ })
32
+
33
+ test('FST_ERR_NOT_FOUND', t => {
34
+ t.plan(5)
35
+ const error = new errors.FST_ERR_NOT_FOUND()
36
+ t.assert.strictEqual(error.name, 'FastifyError')
37
+ t.assert.strictEqual(error.code, 'FST_ERR_NOT_FOUND')
38
+ t.assert.strictEqual(error.message, 'Not Found')
39
+ t.assert.strictEqual(error.statusCode, 404)
40
+ t.assert.ok(error instanceof Error)
41
+ })
42
+
43
+ test('FST_ERR_OPTIONS_NOT_OBJ', t => {
44
+ t.plan(5)
45
+ const error = new errors.FST_ERR_OPTIONS_NOT_OBJ()
46
+ t.assert.strictEqual(error.name, 'FastifyError')
47
+ t.assert.strictEqual(error.code, 'FST_ERR_OPTIONS_NOT_OBJ')
48
+ t.assert.strictEqual(error.message, 'Options must be an object')
49
+ t.assert.strictEqual(error.statusCode, 500)
50
+ t.assert.ok(error instanceof TypeError)
51
+ })
52
+
53
+ test('FST_ERR_QSP_NOT_FN', t => {
54
+ t.plan(5)
55
+ const error = new errors.FST_ERR_QSP_NOT_FN()
56
+ t.assert.strictEqual(error.name, 'FastifyError')
57
+ t.assert.strictEqual(error.code, 'FST_ERR_QSP_NOT_FN')
58
+ t.assert.strictEqual(error.message, "querystringParser option should be a function, instead got '%s'")
59
+ t.assert.strictEqual(error.statusCode, 500)
60
+ t.assert.ok(error instanceof TypeError)
61
+ })
62
+
63
+ test('FST_ERR_SCHEMA_CONTROLLER_BUCKET_OPT_NOT_FN', t => {
64
+ t.plan(5)
65
+ const error = new errors.FST_ERR_SCHEMA_CONTROLLER_BUCKET_OPT_NOT_FN()
66
+ t.assert.strictEqual(error.name, 'FastifyError')
67
+ t.assert.strictEqual(error.code, 'FST_ERR_SCHEMA_CONTROLLER_BUCKET_OPT_NOT_FN')
68
+ t.assert.strictEqual(error.message, "schemaController.bucket option should be a function, instead got '%s'")
69
+ t.assert.strictEqual(error.statusCode, 500)
70
+ t.assert.ok(error instanceof TypeError)
71
+ })
72
+
73
+ test('FST_ERR_SCHEMA_ERROR_FORMATTER_NOT_FN', t => {
74
+ t.plan(5)
75
+ const error = new errors.FST_ERR_SCHEMA_ERROR_FORMATTER_NOT_FN()
76
+ t.assert.strictEqual(error.name, 'FastifyError')
77
+ t.assert.strictEqual(error.code, 'FST_ERR_SCHEMA_ERROR_FORMATTER_NOT_FN')
78
+ t.assert.strictEqual(error.message, "schemaErrorFormatter option should be a non async function. Instead got '%s'.")
79
+ t.assert.strictEqual(error.statusCode, 500)
80
+ t.assert.ok(error instanceof TypeError)
81
+ })
82
+
83
+ test('FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_OBJ', t => {
84
+ t.plan(5)
85
+ const error = new errors.FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_OBJ()
86
+ t.assert.strictEqual(error.name, 'FastifyError')
87
+ t.assert.strictEqual(error.code, 'FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_OBJ')
88
+ t.assert.strictEqual(error.message, "ajv.customOptions option should be an object, instead got '%s'")
89
+ t.assert.strictEqual(error.statusCode, 500)
90
+ t.assert.ok(error instanceof TypeError)
91
+ })
92
+
93
+ test('FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_ARR', t => {
94
+ t.plan(5)
95
+ const error = new errors.FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_ARR()
96
+ t.assert.strictEqual(error.name, 'FastifyError')
97
+ t.assert.strictEqual(error.code, 'FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_ARR')
98
+ t.assert.strictEqual(error.message, "ajv.plugins option should be an array, instead got '%s'")
99
+ t.assert.strictEqual(error.statusCode, 500)
100
+ t.assert.ok(error instanceof TypeError)
101
+ })
102
+
103
+ test('FST_ERR_CTP_ALREADY_PRESENT', t => {
104
+ t.plan(5)
105
+ const error = new errors.FST_ERR_CTP_ALREADY_PRESENT()
106
+ t.assert.strictEqual(error.name, 'FastifyError')
107
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_ALREADY_PRESENT')
108
+ t.assert.strictEqual(error.message, "Content type parser '%s' already present.")
109
+ t.assert.strictEqual(error.statusCode, 500)
110
+ t.assert.ok(error instanceof Error)
111
+ })
112
+
113
+ test('FST_ERR_CTP_INVALID_TYPE', t => {
114
+ t.plan(5)
115
+ const error = new errors.FST_ERR_CTP_INVALID_TYPE()
116
+ t.assert.strictEqual(error.name, 'FastifyError')
117
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INVALID_TYPE')
118
+ t.assert.strictEqual(error.message, 'The content type should be a string or a RegExp')
119
+ t.assert.strictEqual(error.statusCode, 500)
120
+ t.assert.ok(error instanceof TypeError)
121
+ })
122
+
123
+ test('FST_ERR_CTP_EMPTY_TYPE', t => {
124
+ t.plan(5)
125
+ const error = new errors.FST_ERR_CTP_EMPTY_TYPE()
126
+ t.assert.strictEqual(error.name, 'FastifyError')
127
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_EMPTY_TYPE')
128
+ t.assert.strictEqual(error.message, 'The content type cannot be an empty string')
129
+ t.assert.strictEqual(error.statusCode, 500)
130
+ t.assert.ok(error instanceof TypeError)
131
+ })
132
+
133
+ test('FST_ERR_CTP_INVALID_HANDLER', t => {
134
+ t.plan(5)
135
+ const error = new errors.FST_ERR_CTP_INVALID_HANDLER()
136
+ t.assert.strictEqual(error.name, 'FastifyError')
137
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INVALID_HANDLER')
138
+ t.assert.strictEqual(error.message, 'The content type handler should be a function')
139
+ t.assert.strictEqual(error.statusCode, 500)
140
+ t.assert.ok(error instanceof TypeError)
141
+ })
142
+
143
+ test('FST_ERR_CTP_INVALID_PARSE_TYPE', t => {
144
+ t.plan(5)
145
+ const error = new errors.FST_ERR_CTP_INVALID_PARSE_TYPE()
146
+ t.assert.strictEqual(error.name, 'FastifyError')
147
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INVALID_PARSE_TYPE')
148
+ t.assert.strictEqual(error.message, "The body parser can only parse your data as 'string' or 'buffer', you asked '%s' which is not supported.")
149
+ t.assert.strictEqual(error.statusCode, 500)
150
+ t.assert.ok(error instanceof TypeError)
151
+ })
152
+
153
+ test('FST_ERR_CTP_BODY_TOO_LARGE', t => {
154
+ t.plan(5)
155
+ const error = new errors.FST_ERR_CTP_BODY_TOO_LARGE()
156
+ t.assert.strictEqual(error.name, 'FastifyError')
157
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_BODY_TOO_LARGE')
158
+ t.assert.strictEqual(error.message, 'Request body is too large')
159
+ t.assert.strictEqual(error.statusCode, 413)
160
+ t.assert.ok(error instanceof RangeError)
161
+ })
162
+
163
+ test('FST_ERR_CTP_INVALID_MEDIA_TYPE', t => {
164
+ t.plan(5)
165
+ const error = new errors.FST_ERR_CTP_INVALID_MEDIA_TYPE()
166
+ t.assert.strictEqual(error.name, 'FastifyError')
167
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INVALID_MEDIA_TYPE')
168
+ t.assert.strictEqual(error.message, 'Unsupported Media Type')
169
+ t.assert.strictEqual(error.statusCode, 415)
170
+ t.assert.ok(error instanceof Error)
171
+ })
172
+
173
+ test('FST_ERR_CTP_INVALID_CONTENT_LENGTH', t => {
174
+ t.plan(5)
175
+ const error = new errors.FST_ERR_CTP_INVALID_CONTENT_LENGTH()
176
+ t.assert.strictEqual(error.name, 'FastifyError')
177
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INVALID_CONTENT_LENGTH')
178
+ t.assert.strictEqual(error.message, 'Request body size did not match Content-Length')
179
+ t.assert.strictEqual(error.statusCode, 400)
180
+ t.assert.ok(error instanceof RangeError)
181
+ })
182
+
183
+ test('FST_ERR_CTP_EMPTY_JSON_BODY', t => {
184
+ t.plan(5)
185
+ const error = new errors.FST_ERR_CTP_EMPTY_JSON_BODY()
186
+ t.assert.strictEqual(error.name, 'FastifyError')
187
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_EMPTY_JSON_BODY')
188
+ t.assert.strictEqual(error.message, "Body cannot be empty when content-type is set to 'application/json'")
189
+ t.assert.strictEqual(error.statusCode, 400)
190
+ t.assert.ok(error instanceof Error)
191
+ })
192
+
193
+ test('FST_ERR_CTP_INVALID_JSON_BODY', t => {
194
+ t.plan(5)
195
+ const error = new errors.FST_ERR_CTP_INVALID_JSON_BODY()
196
+ t.assert.strictEqual(error.name, 'FastifyError')
197
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INVALID_JSON_BODY')
198
+ t.assert.strictEqual(error.message, "Body is not valid JSON but content-type is set to 'application/json'")
199
+ t.assert.strictEqual(error.statusCode, 400)
200
+ t.assert.ok(error instanceof Error)
201
+ })
202
+
203
+ test('FST_ERR_CTP_INSTANCE_ALREADY_STARTED', t => {
204
+ t.plan(5)
205
+ const error = new errors.FST_ERR_CTP_INSTANCE_ALREADY_STARTED()
206
+ t.assert.strictEqual(error.name, 'FastifyError')
207
+ t.assert.strictEqual(error.code, 'FST_ERR_CTP_INSTANCE_ALREADY_STARTED')
208
+ t.assert.strictEqual(error.message, 'Cannot call "%s" when fastify instance is already started!')
209
+ t.assert.strictEqual(error.statusCode, 400)
210
+ t.assert.ok(error instanceof Error)
211
+ })
212
+
213
+ test('FST_ERR_DEC_ALREADY_PRESENT', t => {
214
+ t.plan(5)
215
+ const error = new errors.FST_ERR_DEC_ALREADY_PRESENT()
216
+ t.assert.strictEqual(error.name, 'FastifyError')
217
+ t.assert.strictEqual(error.code, 'FST_ERR_DEC_ALREADY_PRESENT')
218
+ t.assert.strictEqual(error.message, "The decorator '%s' has already been added!")
219
+ t.assert.strictEqual(error.statusCode, 500)
220
+ t.assert.ok(error instanceof Error)
221
+ })
222
+
223
+ test('FST_ERR_DEC_DEPENDENCY_INVALID_TYPE', t => {
224
+ t.plan(5)
225
+ const error = new errors.FST_ERR_DEC_DEPENDENCY_INVALID_TYPE()
226
+ t.assert.strictEqual(error.name, 'FastifyError')
227
+ t.assert.strictEqual(error.code, 'FST_ERR_DEC_DEPENDENCY_INVALID_TYPE')
228
+ t.assert.strictEqual(error.message, "The dependencies of decorator '%s' must be of type Array.")
229
+ t.assert.strictEqual(error.statusCode, 500)
230
+ t.assert.ok(error instanceof TypeError)
231
+ })
232
+
233
+ test('FST_ERR_DEC_MISSING_DEPENDENCY', t => {
234
+ t.plan(5)
235
+ const error = new errors.FST_ERR_DEC_MISSING_DEPENDENCY()
236
+ t.assert.strictEqual(error.name, 'FastifyError')
237
+ t.assert.strictEqual(error.code, 'FST_ERR_DEC_MISSING_DEPENDENCY')
238
+ t.assert.strictEqual(error.message, "The decorator is missing dependency '%s'.")
239
+ t.assert.strictEqual(error.statusCode, 500)
240
+ t.assert.ok(error instanceof Error)
241
+ })
242
+
243
+ test('FST_ERR_DEC_AFTER_START', t => {
244
+ t.plan(5)
245
+ const error = new errors.FST_ERR_DEC_AFTER_START()
246
+ t.assert.strictEqual(error.name, 'FastifyError')
247
+ t.assert.strictEqual(error.code, 'FST_ERR_DEC_AFTER_START')
248
+ t.assert.strictEqual(error.message, "The decorator '%s' has been added after start!")
249
+ t.assert.strictEqual(error.statusCode, 500)
250
+ t.assert.ok(error instanceof Error)
251
+ })
252
+
253
+ test('FST_ERR_DEC_REFERENCE_TYPE', t => {
254
+ t.plan(5)
255
+ const error = new errors.FST_ERR_DEC_REFERENCE_TYPE()
256
+ t.assert.strictEqual(error.name, 'FastifyError')
257
+ t.assert.strictEqual(error.code, 'FST_ERR_DEC_REFERENCE_TYPE')
258
+ t.assert.strictEqual(error.message, "The decorator '%s' of type '%s' is a reference type. Use the { getter, setter } interface instead.")
259
+ t.assert.strictEqual(error.statusCode, 500)
260
+ t.assert.ok(error instanceof Error)
261
+ })
262
+
263
+ test('FST_ERR_DEC_UNDECLARED', t => {
264
+ t.plan(5)
265
+ const error = new errors.FST_ERR_DEC_UNDECLARED('myDecorator', 'request')
266
+ t.assert.strictEqual(error.name, 'FastifyError')
267
+ t.assert.strictEqual(error.code, 'FST_ERR_DEC_UNDECLARED')
268
+ t.assert.strictEqual(error.message, "No decorator 'myDecorator' has been declared on request.")
269
+ t.assert.strictEqual(error.statusCode, 500)
270
+ t.assert.ok(error instanceof Error)
271
+ })
272
+
273
+ test('FST_ERR_HOOK_INVALID_TYPE', t => {
274
+ t.plan(5)
275
+ const error = new errors.FST_ERR_HOOK_INVALID_TYPE()
276
+ t.assert.strictEqual(error.name, 'FastifyError')
277
+ t.assert.strictEqual(error.code, 'FST_ERR_HOOK_INVALID_TYPE')
278
+ t.assert.strictEqual(error.message, 'The hook name must be a string')
279
+ t.assert.strictEqual(error.statusCode, 500)
280
+ t.assert.ok(error instanceof TypeError)
281
+ })
282
+
283
+ test('FST_ERR_HOOK_INVALID_HANDLER', t => {
284
+ t.plan(5)
285
+ const error = new errors.FST_ERR_HOOK_INVALID_HANDLER()
286
+ t.assert.strictEqual(error.name, 'FastifyError')
287
+ t.assert.strictEqual(error.code, 'FST_ERR_HOOK_INVALID_HANDLER')
288
+ t.assert.strictEqual(error.message, '%s hook should be a function, instead got %s')
289
+ t.assert.strictEqual(error.statusCode, 500)
290
+ t.assert.ok(error instanceof TypeError)
291
+ })
292
+
293
+ test('FST_ERR_HOOK_INVALID_ASYNC_HANDLER', t => {
294
+ t.plan(5)
295
+ const error = new errors.FST_ERR_HOOK_INVALID_ASYNC_HANDLER()
296
+ t.assert.strictEqual(error.name, 'FastifyError')
297
+ t.assert.strictEqual(error.code, 'FST_ERR_HOOK_INVALID_ASYNC_HANDLER')
298
+ t.assert.strictEqual(error.message, "Async function has too many arguments. Async hooks should not use the 'done' argument.")
299
+ t.assert.strictEqual(error.statusCode, 500)
300
+ t.assert.ok(error instanceof TypeError)
301
+ })
302
+
303
+ test('FST_ERR_HOOK_NOT_SUPPORTED', t => {
304
+ t.plan(5)
305
+ const error = new errors.FST_ERR_HOOK_NOT_SUPPORTED()
306
+ t.assert.strictEqual(error.name, 'FastifyError')
307
+ t.assert.strictEqual(error.code, 'FST_ERR_HOOK_NOT_SUPPORTED')
308
+ t.assert.strictEqual(error.message, '%s hook not supported!')
309
+ t.assert.strictEqual(error.statusCode, 500)
310
+ t.assert.ok(error instanceof TypeError)
311
+ })
312
+
313
+ test('FST_ERR_MISSING_MIDDLEWARE', t => {
314
+ t.plan(5)
315
+ const error = new errors.FST_ERR_MISSING_MIDDLEWARE()
316
+ t.assert.strictEqual(error.name, 'FastifyError')
317
+ t.assert.strictEqual(error.code, 'FST_ERR_MISSING_MIDDLEWARE')
318
+ t.assert.strictEqual(error.message, 'You must register a plugin for handling middlewares, visit fastify.dev/docs/latest/Reference/Middleware/ for more info.')
319
+ t.assert.strictEqual(error.statusCode, 500)
320
+ t.assert.ok(error instanceof Error)
321
+ })
322
+
323
+ test('FST_ERR_HOOK_TIMEOUT', t => {
324
+ t.plan(5)
325
+ const error = new errors.FST_ERR_HOOK_TIMEOUT()
326
+ t.assert.strictEqual(error.name, 'FastifyError')
327
+ t.assert.strictEqual(error.code, 'FST_ERR_HOOK_TIMEOUT')
328
+ t.assert.strictEqual(error.message, "A callback for '%s' hook%s timed out. You may have forgotten to call 'done' function or to resolve a Promise")
329
+ t.assert.strictEqual(error.statusCode, 500)
330
+ t.assert.ok(error instanceof Error)
331
+ })
332
+
333
+ test('FST_ERR_LOG_INVALID_DESTINATION', t => {
334
+ t.plan(5)
335
+ const error = new errors.FST_ERR_LOG_INVALID_DESTINATION()
336
+ t.assert.strictEqual(error.name, 'FastifyError')
337
+ t.assert.strictEqual(error.code, 'FST_ERR_LOG_INVALID_DESTINATION')
338
+ t.assert.strictEqual(error.message, 'Cannot specify both logger.stream and logger.file options')
339
+ t.assert.strictEqual(error.statusCode, 500)
340
+ t.assert.ok(error instanceof Error)
341
+ })
342
+
343
+ test('FST_ERR_LOG_INVALID_LOGGER', t => {
344
+ t.plan(5)
345
+ const error = new errors.FST_ERR_LOG_INVALID_LOGGER()
346
+ t.assert.strictEqual(error.name, 'FastifyError')
347
+ t.assert.strictEqual(error.code, 'FST_ERR_LOG_INVALID_LOGGER')
348
+ t.assert.strictEqual(error.message, "Invalid logger object provided. The logger instance should have these functions(s): '%s'.")
349
+ t.assert.strictEqual(error.statusCode, 500)
350
+ t.assert.ok(error instanceof TypeError)
351
+ })
352
+
353
+ test('FST_ERR_LOG_INVALID_LOGGER_INSTANCE', t => {
354
+ t.plan(5)
355
+ const error = new errors.FST_ERR_LOG_INVALID_LOGGER_INSTANCE()
356
+ t.assert.strictEqual(error.name, 'FastifyError')
357
+ t.assert.strictEqual(error.code, 'FST_ERR_LOG_INVALID_LOGGER_INSTANCE')
358
+ t.assert.strictEqual(error.message, 'loggerInstance only accepts a logger instance.')
359
+ t.assert.strictEqual(error.statusCode, 500)
360
+ t.assert.ok(error instanceof TypeError)
361
+ })
362
+
363
+ test('FST_ERR_LOG_INVALID_LOGGER_CONFIG', t => {
364
+ t.plan(5)
365
+ const error = new errors.FST_ERR_LOG_INVALID_LOGGER_CONFIG()
366
+ t.assert.strictEqual(error.name, 'FastifyError')
367
+ t.assert.strictEqual(error.code, 'FST_ERR_LOG_INVALID_LOGGER_CONFIG')
368
+ t.assert.strictEqual(error.message, 'logger options only accepts a configuration object.')
369
+ t.assert.strictEqual(error.statusCode, 500)
370
+ t.assert.ok(error instanceof TypeError)
371
+ })
372
+
373
+ test('FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED', t => {
374
+ t.plan(5)
375
+ const error = new errors.FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED()
376
+ t.assert.strictEqual(error.name, 'FastifyError')
377
+ t.assert.strictEqual(error.code, 'FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED')
378
+ t.assert.strictEqual(error.message, 'You cannot provide both logger and loggerInstance. Please provide only one.')
379
+ t.assert.strictEqual(error.statusCode, 500)
380
+ t.assert.ok(error instanceof TypeError)
381
+ })
382
+
383
+ test('FST_ERR_REP_INVALID_PAYLOAD_TYPE', t => {
384
+ t.plan(5)
385
+ const error = new errors.FST_ERR_REP_INVALID_PAYLOAD_TYPE()
386
+ t.assert.strictEqual(error.name, 'FastifyError')
387
+ t.assert.strictEqual(error.code, 'FST_ERR_REP_INVALID_PAYLOAD_TYPE')
388
+ t.assert.strictEqual(error.message, "Attempted to send payload of invalid type '%s'. Expected a string or Buffer.")
389
+ t.assert.strictEqual(error.statusCode, 500)
390
+ t.assert.ok(error instanceof TypeError)
391
+ })
392
+
393
+ test('FST_ERR_REP_RESPONSE_BODY_CONSUMED', t => {
394
+ t.plan(5)
395
+ const error = new errors.FST_ERR_REP_RESPONSE_BODY_CONSUMED()
396
+ t.assert.strictEqual(error.name, 'FastifyError')
397
+ t.assert.strictEqual(error.code, 'FST_ERR_REP_RESPONSE_BODY_CONSUMED')
398
+ t.assert.strictEqual(error.message, 'Response.body is already consumed.')
399
+ t.assert.strictEqual(error.statusCode, 500)
400
+ t.assert.ok(error instanceof Error)
401
+ })
402
+
403
+ test('FST_ERR_REP_READABLE_STREAM_LOCKED', t => {
404
+ t.plan(5)
405
+ const error = new errors.FST_ERR_REP_READABLE_STREAM_LOCKED()
406
+ t.assert.strictEqual(error.name, 'FastifyError')
407
+ t.assert.strictEqual(error.code, 'FST_ERR_REP_READABLE_STREAM_LOCKED')
408
+ t.assert.strictEqual(error.message, 'ReadableStream was locked. You should call releaseLock() method on reader before sending.')
409
+ t.assert.strictEqual(error.statusCode, 500)
410
+ t.assert.ok(error instanceof Error)
411
+ })
412
+
413
+ test('FST_ERR_REP_ALREADY_SENT', t => {
414
+ t.plan(5)
415
+ const error = new errors.FST_ERR_REP_ALREADY_SENT('/hello', 'GET')
416
+ t.assert.strictEqual(error.name, 'FastifyError')
417
+ t.assert.strictEqual(error.code, 'FST_ERR_REP_ALREADY_SENT')
418
+ t.assert.strictEqual(error.message, 'Reply was already sent, did you forget to "return reply" in "/hello" (GET)?')
419
+ t.assert.strictEqual(error.statusCode, 500)
420
+ t.assert.ok(error instanceof Error)
421
+ })
422
+
423
+ test('FST_ERR_REP_SENT_VALUE', t => {
424
+ t.plan(5)
425
+ const error = new errors.FST_ERR_REP_SENT_VALUE()
426
+ t.assert.strictEqual(error.name, 'FastifyError')
427
+ t.assert.strictEqual(error.code, 'FST_ERR_REP_SENT_VALUE')
428
+ t.assert.strictEqual(error.message, 'The only possible value for reply.sent is true.')
429
+ t.assert.strictEqual(error.statusCode, 500)
430
+ t.assert.ok(error instanceof TypeError)
431
+ })
432
+
433
+ test('FST_ERR_SEND_INSIDE_ONERR', t => {
434
+ t.plan(5)
435
+ const error = new errors.FST_ERR_SEND_INSIDE_ONERR()
436
+ t.assert.strictEqual(error.name, 'FastifyError')
437
+ t.assert.strictEqual(error.code, 'FST_ERR_SEND_INSIDE_ONERR')
438
+ t.assert.strictEqual(error.message, 'You cannot use `send` inside the `onError` hook')
439
+ t.assert.strictEqual(error.statusCode, 500)
440
+ t.assert.ok(error instanceof Error)
441
+ })
442
+
443
+ test('FST_ERR_SEND_UNDEFINED_ERR', t => {
444
+ t.plan(5)
445
+ const error = new errors.FST_ERR_SEND_UNDEFINED_ERR()
446
+ t.assert.strictEqual(error.name, 'FastifyError')
447
+ t.assert.strictEqual(error.code, 'FST_ERR_SEND_UNDEFINED_ERR')
448
+ t.assert.strictEqual(error.message, 'Undefined error has occurred')
449
+ t.assert.strictEqual(error.statusCode, 500)
450
+ t.assert.ok(error instanceof Error)
451
+ })
452
+
453
+ test('FST_ERR_BAD_STATUS_CODE', t => {
454
+ t.plan(5)
455
+ const error = new errors.FST_ERR_BAD_STATUS_CODE()
456
+ t.assert.strictEqual(error.name, 'FastifyError')
457
+ t.assert.strictEqual(error.code, 'FST_ERR_BAD_STATUS_CODE')
458
+ t.assert.strictEqual(error.message, 'Called reply with an invalid status code: %s')
459
+ t.assert.strictEqual(error.statusCode, 500)
460
+ t.assert.ok(error instanceof Error)
461
+ })
462
+
463
+ test('FST_ERR_BAD_TRAILER_NAME', t => {
464
+ t.plan(5)
465
+ const error = new errors.FST_ERR_BAD_TRAILER_NAME()
466
+ t.assert.strictEqual(error.name, 'FastifyError')
467
+ t.assert.strictEqual(error.code, 'FST_ERR_BAD_TRAILER_NAME')
468
+ t.assert.strictEqual(error.message, 'Called reply.trailer with an invalid header name: %s')
469
+ t.assert.strictEqual(error.statusCode, 500)
470
+ t.assert.ok(error instanceof Error)
471
+ })
472
+
473
+ test('FST_ERR_BAD_TRAILER_VALUE', t => {
474
+ t.plan(5)
475
+ const error = new errors.FST_ERR_BAD_TRAILER_VALUE()
476
+ t.assert.strictEqual(error.name, 'FastifyError')
477
+ t.assert.strictEqual(error.code, 'FST_ERR_BAD_TRAILER_VALUE')
478
+ t.assert.strictEqual(error.message, "Called reply.trailer('%s', fn) with an invalid type: %s. Expected a function.")
479
+ t.assert.strictEqual(error.statusCode, 500)
480
+ t.assert.ok(error instanceof Error)
481
+ })
482
+
483
+ test('FST_ERR_FAILED_ERROR_SERIALIZATION', t => {
484
+ t.plan(5)
485
+ const error = new errors.FST_ERR_FAILED_ERROR_SERIALIZATION()
486
+ t.assert.strictEqual(error.name, 'FastifyError')
487
+ t.assert.strictEqual(error.code, 'FST_ERR_FAILED_ERROR_SERIALIZATION')
488
+ t.assert.strictEqual(error.message, 'Failed to serialize an error. Error: %s. Original error: %s')
489
+ t.assert.strictEqual(error.statusCode, 500)
490
+ t.assert.ok(error instanceof Error)
491
+ })
492
+
493
+ test('FST_ERR_MISSING_SERIALIZATION_FN', t => {
494
+ t.plan(5)
495
+ const error = new errors.FST_ERR_MISSING_SERIALIZATION_FN()
496
+ t.assert.strictEqual(error.name, 'FastifyError')
497
+ t.assert.strictEqual(error.code, 'FST_ERR_MISSING_SERIALIZATION_FN')
498
+ t.assert.strictEqual(error.message, 'Missing serialization function. Key "%s"')
499
+ t.assert.strictEqual(error.statusCode, 500)
500
+ t.assert.ok(error instanceof Error)
501
+ })
502
+
503
+ test('FST_ERR_MISSING_CONTENTTYPE_SERIALIZATION_FN', t => {
504
+ t.plan(5)
505
+ const error = new errors.FST_ERR_MISSING_CONTENTTYPE_SERIALIZATION_FN()
506
+ t.assert.strictEqual(error.name, 'FastifyError')
507
+ t.assert.strictEqual(error.code, 'FST_ERR_MISSING_CONTENTTYPE_SERIALIZATION_FN')
508
+ t.assert.strictEqual(error.message, 'Missing serialization function. Key "%s:%s"')
509
+ t.assert.strictEqual(error.statusCode, 500)
510
+ t.assert.ok(error instanceof Error)
511
+ })
512
+
513
+ test('FST_ERR_REQ_INVALID_VALIDATION_INVOCATION', t => {
514
+ t.plan(5)
515
+ const error = new errors.FST_ERR_REQ_INVALID_VALIDATION_INVOCATION()
516
+ t.assert.strictEqual(error.name, 'FastifyError')
517
+ t.assert.strictEqual(error.code, 'FST_ERR_REQ_INVALID_VALIDATION_INVOCATION')
518
+ t.assert.strictEqual(error.message, 'Invalid validation invocation. Missing validation function for HTTP part "%s" nor schema provided.')
519
+ t.assert.strictEqual(error.statusCode, 500)
520
+ t.assert.ok(error instanceof Error)
521
+ })
522
+
523
+ test('FST_ERR_SCH_MISSING_ID', t => {
524
+ t.plan(5)
525
+ const error = new errors.FST_ERR_SCH_MISSING_ID()
526
+ t.assert.strictEqual(error.name, 'FastifyError')
527
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_MISSING_ID')
528
+ t.assert.strictEqual(error.message, 'Missing schema $id property')
529
+ t.assert.strictEqual(error.statusCode, 500)
530
+ t.assert.ok(error instanceof Error)
531
+ })
532
+
533
+ test('FST_ERR_SCH_ALREADY_PRESENT', t => {
534
+ t.plan(5)
535
+ const error = new errors.FST_ERR_SCH_ALREADY_PRESENT()
536
+ t.assert.strictEqual(error.name, 'FastifyError')
537
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_ALREADY_PRESENT')
538
+ t.assert.strictEqual(error.message, "Schema with id '%s' already declared!")
539
+ t.assert.strictEqual(error.statusCode, 500)
540
+ t.assert.ok(error instanceof Error)
541
+ })
542
+
543
+ test('FST_ERR_SCH_CONTENT_MISSING_SCHEMA', t => {
544
+ t.plan(5)
545
+ const error = new errors.FST_ERR_SCH_CONTENT_MISSING_SCHEMA()
546
+ t.assert.strictEqual(error.name, 'FastifyError')
547
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_CONTENT_MISSING_SCHEMA')
548
+ t.assert.strictEqual(error.message, "Schema is missing for the content type '%s'")
549
+ t.assert.strictEqual(error.statusCode, 500)
550
+ t.assert.ok(error instanceof Error)
551
+ })
552
+
553
+ test('FST_ERR_SCH_DUPLICATE', t => {
554
+ t.plan(5)
555
+ const error = new errors.FST_ERR_SCH_DUPLICATE()
556
+ t.assert.strictEqual(error.name, 'FastifyError')
557
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_DUPLICATE')
558
+ t.assert.strictEqual(error.message, "Schema with '%s' already present!")
559
+ t.assert.strictEqual(error.statusCode, 500)
560
+ t.assert.ok(error instanceof Error)
561
+ })
562
+
563
+ test('FST_ERR_SCH_VALIDATION_BUILD', t => {
564
+ t.plan(5)
565
+ const error = new errors.FST_ERR_SCH_VALIDATION_BUILD()
566
+ t.assert.strictEqual(error.name, 'FastifyError')
567
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_VALIDATION_BUILD')
568
+ t.assert.strictEqual(error.message, 'Failed building the validation schema for %s: %s, due to error %s')
569
+ t.assert.strictEqual(error.statusCode, 500)
570
+ t.assert.ok(error instanceof Error)
571
+ })
572
+
573
+ test('FST_ERR_SCH_SERIALIZATION_BUILD', t => {
574
+ t.plan(5)
575
+ const error = new errors.FST_ERR_SCH_SERIALIZATION_BUILD()
576
+ t.assert.strictEqual(error.name, 'FastifyError')
577
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_SERIALIZATION_BUILD')
578
+ t.assert.strictEqual(error.message, 'Failed building the serialization schema for %s: %s, due to error %s')
579
+ t.assert.strictEqual(error.statusCode, 500)
580
+ t.assert.ok(error instanceof Error)
581
+ })
582
+
583
+ test('FST_ERR_SCH_RESPONSE_SCHEMA_NOT_NESTED_2XX', t => {
584
+ t.plan(5)
585
+ const error = new errors.FST_ERR_SCH_RESPONSE_SCHEMA_NOT_NESTED_2XX()
586
+ t.assert.strictEqual(error.name, 'FastifyError')
587
+ t.assert.strictEqual(error.code, 'FST_ERR_SCH_RESPONSE_SCHEMA_NOT_NESTED_2XX')
588
+ t.assert.strictEqual(error.message, 'response schemas should be nested under a valid status code, e.g { 2xx: { type: "object" } }')
589
+ t.assert.strictEqual(error.statusCode, 500)
590
+ t.assert.ok(error instanceof Error)
591
+ })
592
+
593
+ test('FST_ERR_INIT_OPTS_INVALID', t => {
594
+ t.plan(5)
595
+ const error = new errors.FST_ERR_INIT_OPTS_INVALID()
596
+ t.assert.strictEqual(error.name, 'FastifyError')
597
+ t.assert.strictEqual(error.code, 'FST_ERR_INIT_OPTS_INVALID')
598
+ t.assert.strictEqual(error.message, "Invalid initialization options: '%s'")
599
+ t.assert.strictEqual(error.statusCode, 500)
600
+ t.assert.ok(error instanceof Error)
601
+ })
602
+
603
+ test('FST_ERR_FORCE_CLOSE_CONNECTIONS_IDLE_NOT_AVAILABLE', t => {
604
+ t.plan(5)
605
+ const error = new errors.FST_ERR_FORCE_CLOSE_CONNECTIONS_IDLE_NOT_AVAILABLE()
606
+ t.assert.strictEqual(error.name, 'FastifyError')
607
+ t.assert.strictEqual(error.code, 'FST_ERR_FORCE_CLOSE_CONNECTIONS_IDLE_NOT_AVAILABLE')
608
+ t.assert.strictEqual(error.message, "Cannot set forceCloseConnections to 'idle' as your HTTP server does not support closeIdleConnections method")
609
+ t.assert.strictEqual(error.statusCode, 500)
610
+ t.assert.ok(error instanceof Error)
611
+ })
612
+
613
+ test('FST_ERR_DUPLICATED_ROUTE', t => {
614
+ t.plan(5)
615
+ const error = new errors.FST_ERR_DUPLICATED_ROUTE()
616
+ t.assert.strictEqual(error.name, 'FastifyError')
617
+ t.assert.strictEqual(error.code, 'FST_ERR_DUPLICATED_ROUTE')
618
+ t.assert.strictEqual(error.message, "Method '%s' already declared for route '%s'")
619
+ t.assert.strictEqual(error.statusCode, 500)
620
+ t.assert.ok(error instanceof Error)
621
+ })
622
+
623
+ test('FST_ERR_BAD_URL', t => {
624
+ t.plan(5)
625
+ const error = new errors.FST_ERR_BAD_URL()
626
+ t.assert.strictEqual(error.name, 'FastifyError')
627
+ t.assert.strictEqual(error.code, 'FST_ERR_BAD_URL')
628
+ t.assert.strictEqual(error.message, "'%s' is not a valid url component")
629
+ t.assert.strictEqual(error.statusCode, 400)
630
+ t.assert.ok(error instanceof Error)
631
+ })
632
+
633
+ test('FST_ERR_ASYNC_CONSTRAINT', t => {
634
+ t.plan(5)
635
+ const error = new errors.FST_ERR_ASYNC_CONSTRAINT()
636
+ t.assert.strictEqual(error.name, 'FastifyError')
637
+ t.assert.strictEqual(error.code, 'FST_ERR_ASYNC_CONSTRAINT')
638
+ t.assert.strictEqual(error.message, 'Unexpected error from async constraint')
639
+ t.assert.strictEqual(error.statusCode, 500)
640
+ t.assert.ok(error instanceof Error)
641
+ })
642
+
643
+ test('FST_ERR_INVALID_URL', t => {
644
+ t.plan(5)
645
+ const error = new errors.FST_ERR_INVALID_URL()
646
+ t.assert.strictEqual(error.name, 'FastifyError')
647
+ t.assert.strictEqual(error.code, 'FST_ERR_INVALID_URL')
648
+ t.assert.strictEqual(error.message, "URL must be a string. Received '%s'")
649
+ t.assert.strictEqual(error.statusCode, 400)
650
+ t.assert.ok(error instanceof TypeError)
651
+ })
652
+
653
+ test('FST_ERR_ROUTE_OPTIONS_NOT_OBJ', t => {
654
+ t.plan(5)
655
+ const error = new errors.FST_ERR_ROUTE_OPTIONS_NOT_OBJ()
656
+ t.assert.strictEqual(error.name, 'FastifyError')
657
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_OPTIONS_NOT_OBJ')
658
+ t.assert.strictEqual(error.message, 'Options for "%s:%s" route must be an object')
659
+ t.assert.strictEqual(error.statusCode, 500)
660
+ t.assert.ok(error instanceof TypeError)
661
+ })
662
+
663
+ test('FST_ERR_ROUTE_DUPLICATED_HANDLER', t => {
664
+ t.plan(5)
665
+ const error = new errors.FST_ERR_ROUTE_DUPLICATED_HANDLER()
666
+ t.assert.strictEqual(error.name, 'FastifyError')
667
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_DUPLICATED_HANDLER')
668
+ t.assert.strictEqual(error.message, 'Duplicate handler for "%s:%s" route is not allowed!')
669
+ t.assert.strictEqual(error.statusCode, 500)
670
+ t.assert.ok(error instanceof Error)
671
+ })
672
+
673
+ test('FST_ERR_ROUTE_HANDLER_NOT_FN', t => {
674
+ t.plan(5)
675
+ const error = new errors.FST_ERR_ROUTE_HANDLER_NOT_FN()
676
+ t.assert.strictEqual(error.name, 'FastifyError')
677
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_HANDLER_NOT_FN')
678
+ t.assert.strictEqual(error.message, 'Error Handler for %s:%s route, if defined, must be a function')
679
+ t.assert.strictEqual(error.statusCode, 500)
680
+ t.assert.ok(error instanceof TypeError)
681
+ })
682
+
683
+ test('FST_ERR_ROUTE_MISSING_HANDLER', t => {
684
+ t.plan(5)
685
+ const error = new errors.FST_ERR_ROUTE_MISSING_HANDLER()
686
+ t.assert.strictEqual(error.name, 'FastifyError')
687
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_MISSING_HANDLER')
688
+ t.assert.strictEqual(error.message, 'Missing handler function for "%s:%s" route.')
689
+ t.assert.strictEqual(error.statusCode, 500)
690
+ t.assert.ok(error instanceof Error)
691
+ })
692
+
693
+ test('FST_ERR_ROUTE_METHOD_INVALID', t => {
694
+ t.plan(5)
695
+ const error = new errors.FST_ERR_ROUTE_METHOD_INVALID()
696
+ t.assert.strictEqual(error.name, 'FastifyError')
697
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_METHOD_INVALID')
698
+ t.assert.strictEqual(error.message, 'Provided method is invalid!')
699
+ t.assert.strictEqual(error.statusCode, 500)
700
+ t.assert.ok(error instanceof TypeError)
701
+ })
702
+
703
+ test('FST_ERR_ROUTE_METHOD_NOT_SUPPORTED', t => {
704
+ t.plan(5)
705
+ const error = new errors.FST_ERR_ROUTE_METHOD_NOT_SUPPORTED()
706
+ t.assert.strictEqual(error.name, 'FastifyError')
707
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_METHOD_NOT_SUPPORTED')
708
+ t.assert.strictEqual(error.message, '%s method is not supported.')
709
+ t.assert.strictEqual(error.statusCode, 500)
710
+ t.assert.ok(error instanceof Error)
711
+ })
712
+
713
+ test('FST_ERR_ROUTE_BODY_VALIDATION_SCHEMA_NOT_SUPPORTED', t => {
714
+ t.plan(5)
715
+ const error = new errors.FST_ERR_ROUTE_BODY_VALIDATION_SCHEMA_NOT_SUPPORTED()
716
+ t.assert.strictEqual(error.name, 'FastifyError')
717
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_BODY_VALIDATION_SCHEMA_NOT_SUPPORTED')
718
+ t.assert.strictEqual(error.message, 'Body validation schema for %s:%s route is not supported!')
719
+ t.assert.strictEqual(error.statusCode, 500)
720
+ t.assert.ok(error instanceof Error)
721
+ })
722
+
723
+ test('FST_ERR_ROUTE_BODY_LIMIT_OPTION_NOT_INT', t => {
724
+ t.plan(5)
725
+ const error = new errors.FST_ERR_ROUTE_BODY_LIMIT_OPTION_NOT_INT()
726
+ t.assert.strictEqual(error.name, 'FastifyError')
727
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_BODY_LIMIT_OPTION_NOT_INT')
728
+ t.assert.strictEqual(error.message, "'bodyLimit' option must be an integer > 0. Got '%s'")
729
+ t.assert.strictEqual(error.statusCode, 500)
730
+ t.assert.ok(error instanceof TypeError)
731
+ })
732
+
733
+ test('FST_ERR_ROUTE_BODY_LIMIT_OPTION_NOT_INT', t => {
734
+ t.plan(5)
735
+ const error = new errors.FST_ERR_ROUTE_BODY_LIMIT_OPTION_NOT_INT()
736
+ t.assert.strictEqual(error.name, 'FastifyError')
737
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_BODY_LIMIT_OPTION_NOT_INT')
738
+ t.assert.strictEqual(error.message, "'bodyLimit' option must be an integer > 0. Got '%s'")
739
+ t.assert.strictEqual(error.statusCode, 500)
740
+ t.assert.ok(error instanceof TypeError)
741
+ })
742
+
743
+ test('FST_ERR_ROUTE_REWRITE_NOT_STR', t => {
744
+ t.plan(5)
745
+ const error = new errors.FST_ERR_ROUTE_REWRITE_NOT_STR()
746
+ t.assert.strictEqual(error.name, 'FastifyError')
747
+ t.assert.strictEqual(error.code, 'FST_ERR_ROUTE_REWRITE_NOT_STR')
748
+ t.assert.strictEqual(error.message, 'Rewrite url for "%s" needs to be of type "string" but received "%s"')
749
+ t.assert.strictEqual(error.statusCode, 500)
750
+ t.assert.ok(error instanceof TypeError)
751
+ })
752
+
753
+ test('FST_ERR_REOPENED_CLOSE_SERVER', t => {
754
+ t.plan(5)
755
+ const error = new errors.FST_ERR_REOPENED_CLOSE_SERVER()
756
+ t.assert.strictEqual(error.name, 'FastifyError')
757
+ t.assert.strictEqual(error.code, 'FST_ERR_REOPENED_CLOSE_SERVER')
758
+ t.assert.strictEqual(error.message, 'Fastify has already been closed and cannot be reopened')
759
+ t.assert.strictEqual(error.statusCode, 500)
760
+ t.assert.ok(error instanceof Error)
761
+ })
762
+
763
+ test('FST_ERR_REOPENED_SERVER', t => {
764
+ t.plan(5)
765
+ const error = new errors.FST_ERR_REOPENED_SERVER()
766
+ t.assert.strictEqual(error.name, 'FastifyError')
767
+ t.assert.strictEqual(error.code, 'FST_ERR_REOPENED_SERVER')
768
+ t.assert.strictEqual(error.message, 'Fastify is already listening')
769
+ t.assert.strictEqual(error.statusCode, 500)
770
+ t.assert.ok(error instanceof Error)
771
+ })
772
+
773
+ test('FST_ERR_INSTANCE_ALREADY_LISTENING', t => {
774
+ t.plan(5)
775
+ const error = new errors.FST_ERR_INSTANCE_ALREADY_LISTENING()
776
+ t.assert.strictEqual(error.name, 'FastifyError')
777
+ t.assert.strictEqual(error.code, 'FST_ERR_INSTANCE_ALREADY_LISTENING')
778
+ t.assert.strictEqual(error.message, 'Fastify instance is already listening. %s')
779
+ t.assert.strictEqual(error.statusCode, 500)
780
+ t.assert.ok(error instanceof Error)
781
+ })
782
+
783
+ test('FST_ERR_PLUGIN_VERSION_MISMATCH', t => {
784
+ t.plan(5)
785
+ const error = new errors.FST_ERR_PLUGIN_VERSION_MISMATCH()
786
+ t.assert.strictEqual(error.name, 'FastifyError')
787
+ t.assert.strictEqual(error.code, 'FST_ERR_PLUGIN_VERSION_MISMATCH')
788
+ t.assert.strictEqual(error.message, "fastify-plugin: %s - expected '%s' fastify version, '%s' is installed")
789
+ t.assert.strictEqual(error.statusCode, 500)
790
+ t.assert.ok(error instanceof Error)
791
+ })
792
+
793
+ test('FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE', t => {
794
+ t.plan(5)
795
+ const error = new errors.FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE()
796
+ t.assert.strictEqual(error.name, 'FastifyError')
797
+ t.assert.strictEqual(error.code, 'FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE')
798
+ t.assert.strictEqual(error.message, "The decorator '%s'%s is not present in %s")
799
+ t.assert.strictEqual(error.statusCode, 500)
800
+ t.assert.ok(error instanceof Error)
801
+ })
802
+
803
+ test('FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER', t => {
804
+ t.plan(5)
805
+ const error = new errors.FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER('easter-egg')
806
+ t.assert.strictEqual(error.name, 'FastifyError')
807
+ t.assert.strictEqual(error.code, 'FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER')
808
+ t.assert.strictEqual(error.message, 'The easter-egg plugin being registered mixes async and callback styles. Async plugin should not mix async and callback style.')
809
+ t.assert.strictEqual(error.statusCode, 500)
810
+ t.assert.ok(error instanceof TypeError)
811
+ })
812
+
813
+ test('FST_ERR_PLUGIN_CALLBACK_NOT_FN', t => {
814
+ t.plan(5)
815
+ const error = new errors.FST_ERR_PLUGIN_CALLBACK_NOT_FN()
816
+ t.assert.strictEqual(error.name, 'FastifyError')
817
+ t.assert.strictEqual(error.code, 'FST_ERR_PLUGIN_CALLBACK_NOT_FN')
818
+ t.assert.strictEqual(error.message, 'fastify-plugin: %s')
819
+ t.assert.strictEqual(error.statusCode, 500)
820
+ t.assert.ok(error instanceof TypeError)
821
+ })
822
+
823
+ test('FST_ERR_PLUGIN_NOT_VALID', t => {
824
+ t.plan(5)
825
+ const error = new errors.FST_ERR_PLUGIN_NOT_VALID()
826
+ t.assert.strictEqual(error.name, 'FastifyError')
827
+ t.assert.strictEqual(error.code, 'FST_ERR_PLUGIN_NOT_VALID')
828
+ t.assert.strictEqual(error.message, 'fastify-plugin: %s')
829
+ t.assert.strictEqual(error.statusCode, 500)
830
+ t.assert.ok(error instanceof Error)
831
+ })
832
+
833
+ test('FST_ERR_ROOT_PLG_BOOTED', t => {
834
+ t.plan(5)
835
+ const error = new errors.FST_ERR_ROOT_PLG_BOOTED()
836
+ t.assert.strictEqual(error.name, 'FastifyError')
837
+ t.assert.strictEqual(error.code, 'FST_ERR_ROOT_PLG_BOOTED')
838
+ t.assert.strictEqual(error.message, 'fastify-plugin: %s')
839
+ t.assert.strictEqual(error.statusCode, 500)
840
+ t.assert.ok(error instanceof Error)
841
+ })
842
+
843
+ test('FST_ERR_PARENT_PLUGIN_BOOTED', t => {
844
+ t.plan(5)
845
+ const error = new errors.FST_ERR_PARENT_PLUGIN_BOOTED()
846
+ t.assert.strictEqual(error.name, 'FastifyError')
847
+ t.assert.strictEqual(error.code, 'FST_ERR_PARENT_PLUGIN_BOOTED')
848
+ t.assert.strictEqual(error.message, 'fastify-plugin: %s')
849
+ t.assert.strictEqual(error.statusCode, 500)
850
+ t.assert.ok(error instanceof Error)
851
+ })
852
+
853
+ test('FST_ERR_PLUGIN_TIMEOUT', t => {
854
+ t.plan(5)
855
+ const error = new errors.FST_ERR_PLUGIN_TIMEOUT()
856
+ t.assert.strictEqual(error.name, 'FastifyError')
857
+ t.assert.strictEqual(error.code, 'FST_ERR_PLUGIN_TIMEOUT')
858
+ t.assert.strictEqual(error.message, 'fastify-plugin: %s')
859
+ t.assert.strictEqual(error.statusCode, 500)
860
+ t.assert.ok(error instanceof Error)
861
+ })
862
+
863
+ test('FST_ERR_VALIDATION', t => {
864
+ t.plan(5)
865
+ const error = new errors.FST_ERR_VALIDATION()
866
+ t.assert.strictEqual(error.name, 'FastifyError')
867
+ t.assert.strictEqual(error.code, 'FST_ERR_VALIDATION')
868
+ t.assert.strictEqual(error.message, '%s')
869
+ t.assert.strictEqual(error.statusCode, 400)
870
+ t.assert.ok(error instanceof Error)
871
+ })
872
+
873
+ test('FST_ERR_LISTEN_OPTIONS_INVALID', t => {
874
+ t.plan(5)
875
+ const error = new errors.FST_ERR_LISTEN_OPTIONS_INVALID()
876
+ t.assert.strictEqual(error.name, 'FastifyError')
877
+ t.assert.strictEqual(error.code, 'FST_ERR_LISTEN_OPTIONS_INVALID')
878
+ t.assert.strictEqual(error.message, "Invalid listen options: '%s'")
879
+ t.assert.strictEqual(error.statusCode, 500)
880
+ t.assert.ok(error instanceof TypeError)
881
+ })
882
+
883
+ test('FST_ERR_ERROR_HANDLER_NOT_FN', t => {
884
+ t.plan(5)
885
+ const error = new errors.FST_ERR_ERROR_HANDLER_NOT_FN()
886
+ t.assert.strictEqual(error.name, 'FastifyError')
887
+ t.assert.strictEqual(error.code, 'FST_ERR_ERROR_HANDLER_NOT_FN')
888
+ t.assert.strictEqual(error.message, 'Error Handler must be a function')
889
+ t.assert.strictEqual(error.statusCode, 500)
890
+ t.assert.ok(error instanceof TypeError)
891
+ })
892
+
893
+ test('Ensure that all errors are in Errors.md TOC', t => {
894
+ t.plan(expectedErrors)
895
+
896
+ const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
897
+
898
+ const exportedKeys = Object.keys(errors)
899
+ for (const key of exportedKeys) {
900
+ if (errors[key].name === 'FastifyError') {
901
+ t.assert.ok(errorsMd.includes(` - [${key.toUpperCase()}](#${key.toLowerCase()})`), key)
902
+ }
903
+ }
904
+ })
905
+
906
+ test('Ensure that non-existing errors are not in Errors.md TOC', t => {
907
+ t.plan(expectedErrors)
908
+ const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
909
+
910
+ const matchRE = / {4}- \[([A-Z0-9_]+)\]\(#[a-z0-9_]+\)/g
911
+ const matches = errorsMd.matchAll(matchRE)
912
+ const exportedKeys = Object.keys(errors)
913
+
914
+ for (const match of matches) {
915
+ t.assert.ok(exportedKeys.indexOf(match[1]) !== -1, match[1])
916
+ }
917
+ })
918
+
919
+ test('Ensure that all errors are in Errors.md documented', t => {
920
+ t.plan(expectedErrors)
921
+ const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
922
+
923
+ const exportedKeys = Object.keys(errors)
924
+ for (const key of exportedKeys) {
925
+ if (errors[key].name === 'FastifyError') {
926
+ t.assert.ok(errorsMd.includes(`<a id="${key.toLowerCase()}">${key.toUpperCase()}</a>`), key)
927
+ }
928
+ }
929
+ })
930
+
931
+ test('Ensure that non-existing errors are not in Errors.md documented', t => {
932
+ t.plan(expectedErrors)
933
+
934
+ const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
935
+
936
+ const matchRE = /<a id="[0-9a-zA-Z_]+">([0-9a-zA-Z_]+)<\/a>/g
937
+ const matches = errorsMd.matchAll(matchRE)
938
+ const exportedKeys = Object.keys(errors)
939
+
940
+ for (const match of matches) {
941
+ t.assert.ok(exportedKeys.indexOf(match[1]) !== -1, match[1])
942
+ }
943
+ })
944
+
945
+ test('Ensure that all errors are in errors.d.ts', t => {
946
+ t.plan(expectedErrors)
947
+
948
+ const errorsDts = readFileSync(resolve(__dirname, '../../types/errors.d.ts'), 'utf8')
949
+
950
+ const FastifyErrorCodesRE = /export type FastifyErrorCodes = Record<([^>]+),\s*FastifyErrorConstructor>/m
951
+
952
+ const [, errorCodeType] = errorsDts.match(FastifyErrorCodesRE)
953
+
954
+ const errorCodeRE = /'([A-Z0-9_]+)'/g
955
+ const matches = errorCodeType.matchAll(errorCodeRE)
956
+ const errorTypes = [...matches].map(match => match[1])
957
+ const exportedKeys = Object.keys(errors)
958
+
959
+ for (const key of exportedKeys) {
960
+ if (errors[key].name === 'FastifyError') {
961
+ t.assert.ok(errorTypes.includes(key), key)
962
+ }
963
+ }
964
+ })
965
+
966
+ test('Ensure that non-existing errors are not in errors.d.ts', t => {
967
+ t.plan(expectedErrors)
968
+
969
+ const errorsDts = readFileSync(resolve(__dirname, '../../types/errors.d.ts'), 'utf8')
970
+
971
+ const FastifyErrorCodesRE = /export type FastifyErrorCodes = Record<([^>]+),\s*FastifyErrorConstructor>/m
972
+
973
+ const [, errorCodeType] = errorsDts.match(FastifyErrorCodesRE)
974
+
975
+ const errorCodeRE = /'([A-Z0-9_]+)'/g
976
+ const matches = errorCodeType.matchAll(errorCodeRE)
977
+ const exportedKeys = Object.keys(errors)
978
+
979
+ for (const match of matches) {
980
+ t.assert.ok(exportedKeys.indexOf(match[1]) !== -1, match[1])
981
+ }
982
+ })