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.
- package/.borp.yaml +3 -0
- package/.markdownlint-cli2.yaml +22 -0
- package/.prettierignore +1 -0
- package/GOVERNANCE.md +4 -0
- package/LICENSE +21 -0
- package/PROJECT_CHARTER.md +126 -0
- package/README.md +423 -0
- package/SECURITY.md +220 -0
- package/SPONSORS.md +24 -0
- package/build/build-error-serializer.js +35 -0
- package/build/build-validation.js +169 -0
- package/build/sync-version.js +11 -0
- package/docs/Guides/Benchmarking.md +60 -0
- package/docs/Guides/Database.md +321 -0
- package/docs/Guides/Delay-Accepting-Requests.md +608 -0
- package/docs/Guides/Detecting-When-Clients-Abort.md +172 -0
- package/docs/Guides/Ecosystem.md +726 -0
- package/docs/Guides/Fluent-Schema.md +127 -0
- package/docs/Guides/Getting-Started.md +620 -0
- package/docs/Guides/Index.md +43 -0
- package/docs/Guides/Migration-Guide-V3.md +287 -0
- package/docs/Guides/Migration-Guide-V4.md +267 -0
- package/docs/Guides/Migration-Guide-V5.md +727 -0
- package/docs/Guides/Plugins-Guide.md +520 -0
- package/docs/Guides/Prototype-Poisoning.md +383 -0
- package/docs/Guides/Recommendations.md +378 -0
- package/docs/Guides/Serverless.md +604 -0
- package/docs/Guides/Style-Guide.md +246 -0
- package/docs/Guides/Testing.md +481 -0
- package/docs/Guides/Write-Plugin.md +103 -0
- package/docs/Guides/Write-Type-Provider.md +34 -0
- package/docs/Reference/ContentTypeParser.md +271 -0
- package/docs/Reference/Decorators.md +436 -0
- package/docs/Reference/Encapsulation.md +194 -0
- package/docs/Reference/Errors.md +377 -0
- package/docs/Reference/HTTP2.md +94 -0
- package/docs/Reference/Hooks.md +958 -0
- package/docs/Reference/Index.md +73 -0
- package/docs/Reference/LTS.md +86 -0
- package/docs/Reference/Lifecycle.md +99 -0
- package/docs/Reference/Logging.md +268 -0
- package/docs/Reference/Middleware.md +79 -0
- package/docs/Reference/Plugins.md +245 -0
- package/docs/Reference/Principles.md +73 -0
- package/docs/Reference/Reply.md +1001 -0
- package/docs/Reference/Request.md +295 -0
- package/docs/Reference/Routes.md +802 -0
- package/docs/Reference/Server.md +2389 -0
- package/docs/Reference/Type-Providers.md +256 -0
- package/docs/Reference/TypeScript.md +1729 -0
- package/docs/Reference/Validation-and-Serialization.md +1130 -0
- package/docs/Reference/Warnings.md +58 -0
- package/docs/index.md +24 -0
- package/docs/resources/encapsulation_context.drawio +1 -0
- package/docs/resources/encapsulation_context.svg +3 -0
- package/eslint.config.js +35 -0
- package/examples/asyncawait.js +38 -0
- package/examples/benchmark/body.json +3 -0
- package/examples/benchmark/hooks-benchmark-async-await.js +44 -0
- package/examples/benchmark/hooks-benchmark.js +52 -0
- package/examples/benchmark/parser.js +47 -0
- package/examples/benchmark/simple.js +30 -0
- package/examples/benchmark/webstream.js +27 -0
- package/examples/hooks.js +91 -0
- package/examples/http2.js +39 -0
- package/examples/https.js +38 -0
- package/examples/parser.js +53 -0
- package/examples/plugin.js +12 -0
- package/examples/route-prefix.js +38 -0
- package/examples/shared-schema.js +38 -0
- package/examples/simple-stream.js +20 -0
- package/examples/simple.js +32 -0
- package/examples/simple.mjs +27 -0
- package/examples/typescript-server.ts +79 -0
- package/examples/use-plugin.js +29 -0
- package/fastify.d.ts +253 -0
- package/fastify.js +985 -0
- package/integration/server.js +29 -0
- package/integration/test.sh +23 -0
- package/lib/config-validator.js +1266 -0
- package/lib/content-type-parser.js +413 -0
- package/lib/content-type.js +160 -0
- package/lib/context.js +98 -0
- package/lib/decorate.js +152 -0
- package/lib/error-handler.js +173 -0
- package/lib/error-serializer.js +134 -0
- package/lib/error-status.js +14 -0
- package/lib/errors.js +516 -0
- package/lib/four-oh-four.js +190 -0
- package/lib/handle-request.js +195 -0
- package/lib/head-route.js +45 -0
- package/lib/hooks.js +429 -0
- package/lib/initial-config-validation.js +37 -0
- package/lib/logger-factory.js +136 -0
- package/lib/logger-pino.js +68 -0
- package/lib/noop-set.js +10 -0
- package/lib/plugin-override.js +90 -0
- package/lib/plugin-utils.js +169 -0
- package/lib/promise.js +23 -0
- package/lib/reply.js +1030 -0
- package/lib/req-id-gen-factory.js +52 -0
- package/lib/request.js +391 -0
- package/lib/route.js +686 -0
- package/lib/schema-controller.js +164 -0
- package/lib/schemas.js +207 -0
- package/lib/server.js +441 -0
- package/lib/symbols.js +71 -0
- package/lib/validation.js +280 -0
- package/lib/warnings.js +57 -0
- package/lib/wrap-thenable.js +84 -0
- package/package.json +225 -0
- package/scripts/validate-ecosystem-links.js +179 -0
- package/test/404s.test.js +2035 -0
- package/test/500s.test.js +422 -0
- package/test/allow-unsafe-regex.test.js +92 -0
- package/test/als.test.js +65 -0
- package/test/async-await.test.js +705 -0
- package/test/async-dispose.test.js +20 -0
- package/test/async_hooks.test.js +52 -0
- package/test/body-limit.test.js +224 -0
- package/test/buffer.test.js +74 -0
- package/test/build/error-serializer.test.js +36 -0
- package/test/build/version.test.js +14 -0
- package/test/build-certificate.js +109 -0
- package/test/bundler/README.md +29 -0
- package/test/bundler/esbuild/bundler-test.js +32 -0
- package/test/bundler/esbuild/package.json +10 -0
- package/test/bundler/esbuild/src/fail-plugin-version.js +14 -0
- package/test/bundler/esbuild/src/index.js +9 -0
- package/test/bundler/webpack/bundler-test.js +32 -0
- package/test/bundler/webpack/package.json +11 -0
- package/test/bundler/webpack/src/fail-plugin-version.js +14 -0
- package/test/bundler/webpack/src/index.js +9 -0
- package/test/bundler/webpack/webpack.config.js +15 -0
- package/test/case-insensitive.test.js +102 -0
- package/test/chainable.test.js +40 -0
- package/test/child-logger-factory.test.js +128 -0
- package/test/client-timeout.test.js +38 -0
- package/test/close-pipelining.test.js +78 -0
- package/test/close.test.js +706 -0
- package/test/conditional-pino.test.js +47 -0
- package/test/connection-timeout.test.js +42 -0
- package/test/constrained-routes.test.js +1138 -0
- package/test/content-length.test.js +174 -0
- package/test/content-parser.test.js +739 -0
- package/test/content-type.test.js +181 -0
- package/test/context-config.test.js +164 -0
- package/test/custom-http-server.test.js +118 -0
- package/test/custom-parser-async.test.js +59 -0
- package/test/custom-parser.0.test.js +701 -0
- package/test/custom-parser.1.test.js +266 -0
- package/test/custom-parser.2.test.js +91 -0
- package/test/custom-parser.3.test.js +208 -0
- package/test/custom-parser.4.test.js +218 -0
- package/test/custom-parser.5.test.js +130 -0
- package/test/custom-querystring-parser.test.js +129 -0
- package/test/decorator.test.js +1330 -0
- package/test/delete.test.js +344 -0
- package/test/diagnostics-channel/404.test.js +49 -0
- package/test/diagnostics-channel/async-delay-request.test.js +65 -0
- package/test/diagnostics-channel/async-request.test.js +64 -0
- package/test/diagnostics-channel/error-before-handler.test.js +35 -0
- package/test/diagnostics-channel/error-request.test.js +53 -0
- package/test/diagnostics-channel/error-status.test.js +123 -0
- package/test/diagnostics-channel/init.test.js +50 -0
- package/test/diagnostics-channel/sync-delay-request.test.js +49 -0
- package/test/diagnostics-channel/sync-request-reply.test.js +51 -0
- package/test/diagnostics-channel/sync-request.test.js +54 -0
- package/test/encapsulated-child-logger-factory.test.js +69 -0
- package/test/encapsulated-error-handler.test.js +237 -0
- package/test/esm/errorCodes.test.mjs +10 -0
- package/test/esm/esm.test.mjs +13 -0
- package/test/esm/index.test.js +8 -0
- package/test/esm/named-exports.mjs +14 -0
- package/test/esm/other.mjs +8 -0
- package/test/esm/plugin.mjs +8 -0
- package/test/fastify-instance.test.js +300 -0
- package/test/find-route.test.js +152 -0
- package/test/fluent-schema.test.js +209 -0
- package/test/genReqId.test.js +426 -0
- package/test/handler-context.test.js +45 -0
- package/test/handler-timeout.test.js +367 -0
- package/test/has-route.test.js +88 -0
- package/test/header-overflow.test.js +55 -0
- package/test/helper.js +496 -0
- package/test/hooks-async.test.js +1099 -0
- package/test/hooks.on-listen.test.js +1162 -0
- package/test/hooks.on-ready.test.js +421 -0
- package/test/hooks.test.js +3578 -0
- package/test/http-methods/copy.test.js +35 -0
- package/test/http-methods/custom-http-methods.test.js +114 -0
- package/test/http-methods/get.test.js +412 -0
- package/test/http-methods/head.test.js +263 -0
- package/test/http-methods/lock.test.js +108 -0
- package/test/http-methods/mkcalendar.test.js +143 -0
- package/test/http-methods/mkcol.test.js +35 -0
- package/test/http-methods/move.test.js +42 -0
- package/test/http-methods/propfind.test.js +136 -0
- package/test/http-methods/proppatch.test.js +105 -0
- package/test/http-methods/report.test.js +142 -0
- package/test/http-methods/search.test.js +233 -0
- package/test/http-methods/trace.test.js +21 -0
- package/test/http-methods/unlock.test.js +38 -0
- package/test/http2/closing.test.js +270 -0
- package/test/http2/constraint.test.js +109 -0
- package/test/http2/head.test.js +34 -0
- package/test/http2/plain.test.js +68 -0
- package/test/http2/secure-with-fallback.test.js +113 -0
- package/test/http2/secure.test.js +67 -0
- package/test/http2/unknown-http-method.test.js +34 -0
- package/test/https/custom-https-server.test.js +58 -0
- package/test/https/https.test.js +136 -0
- package/test/imports.test.js +17 -0
- package/test/inject.test.js +502 -0
- package/test/input-validation.js +335 -0
- package/test/internals/all.test.js +38 -0
- package/test/internals/content-type-parser.test.js +111 -0
- package/test/internals/context.test.js +31 -0
- package/test/internals/decorator.test.js +156 -0
- package/test/internals/errors.test.js +982 -0
- package/test/internals/handle-request.test.js +270 -0
- package/test/internals/hook-runner.test.js +449 -0
- package/test/internals/hooks.test.js +96 -0
- package/test/internals/initial-config.test.js +383 -0
- package/test/internals/logger.test.js +163 -0
- package/test/internals/plugin.test.js +170 -0
- package/test/internals/promise.test.js +63 -0
- package/test/internals/reply-serialize.test.js +714 -0
- package/test/internals/reply.test.js +1920 -0
- package/test/internals/req-id-gen-factory.test.js +133 -0
- package/test/internals/request-validate.test.js +1402 -0
- package/test/internals/request.test.js +506 -0
- package/test/internals/schema-controller-perf.test.js +40 -0
- package/test/internals/server.test.js +91 -0
- package/test/internals/validation.test.js +352 -0
- package/test/issue-4959.test.js +118 -0
- package/test/keep-alive-timeout.test.js +42 -0
- package/test/listen.1.test.js +154 -0
- package/test/listen.2.test.js +113 -0
- package/test/listen.3.test.js +83 -0
- package/test/listen.4.test.js +168 -0
- package/test/listen.5.test.js +122 -0
- package/test/logger/instantiation.test.js +341 -0
- package/test/logger/logger-test-utils.js +47 -0
- package/test/logger/logging.test.js +460 -0
- package/test/logger/options.test.js +579 -0
- package/test/logger/request.test.js +292 -0
- package/test/logger/response.test.js +183 -0
- package/test/logger/tap-parallel-not-ok +0 -0
- package/test/max-requests-per-socket.test.js +113 -0
- package/test/middleware.test.js +37 -0
- package/test/noop-set.test.js +19 -0
- package/test/nullable-validation.test.js +187 -0
- package/test/options.error-handler.test.js +5 -0
- package/test/options.test.js +5 -0
- package/test/output-validation.test.js +140 -0
- package/test/patch.error-handler.test.js +5 -0
- package/test/patch.test.js +5 -0
- package/test/plugin.1.test.js +230 -0
- package/test/plugin.2.test.js +314 -0
- package/test/plugin.3.test.js +287 -0
- package/test/plugin.4.test.js +504 -0
- package/test/plugin.helper.js +8 -0
- package/test/plugin.name.display.js +10 -0
- package/test/post-empty-body.test.js +38 -0
- package/test/pretty-print.test.js +366 -0
- package/test/promises.test.js +125 -0
- package/test/proto-poisoning.test.js +145 -0
- package/test/put.error-handler.test.js +5 -0
- package/test/put.test.js +5 -0
- package/test/register.test.js +184 -0
- package/test/reply-code.test.js +148 -0
- package/test/reply-early-hints.test.js +100 -0
- package/test/reply-error.test.js +815 -0
- package/test/reply-trailers.test.js +445 -0
- package/test/reply-web-stream-locked.test.js +37 -0
- package/test/request-error.test.js +624 -0
- package/test/request-header-host.test.js +339 -0
- package/test/request-id.test.js +118 -0
- package/test/request-timeout.test.js +53 -0
- package/test/route-hooks.test.js +635 -0
- package/test/route-prefix.test.js +904 -0
- package/test/route-shorthand.test.js +48 -0
- package/test/route.1.test.js +259 -0
- package/test/route.2.test.js +100 -0
- package/test/route.3.test.js +213 -0
- package/test/route.4.test.js +127 -0
- package/test/route.5.test.js +211 -0
- package/test/route.6.test.js +306 -0
- package/test/route.7.test.js +406 -0
- package/test/route.8.test.js +225 -0
- package/test/router-options.test.js +1108 -0
- package/test/same-shape.test.js +124 -0
- package/test/schema-examples.test.js +661 -0
- package/test/schema-feature.test.js +2198 -0
- package/test/schema-serialization.test.js +1171 -0
- package/test/schema-special-usage.test.js +1348 -0
- package/test/schema-validation.test.js +1572 -0
- package/test/scripts/validate-ecosystem-links.test.js +339 -0
- package/test/serialize-response.test.js +186 -0
- package/test/server.test.js +347 -0
- package/test/set-error-handler.test.js +69 -0
- package/test/skip-reply-send.test.js +317 -0
- package/test/stream-serializers.test.js +40 -0
- package/test/stream.1.test.js +94 -0
- package/test/stream.2.test.js +129 -0
- package/test/stream.3.test.js +198 -0
- package/test/stream.4.test.js +176 -0
- package/test/stream.5.test.js +188 -0
- package/test/sync-routes.test.js +32 -0
- package/test/throw.test.js +359 -0
- package/test/toolkit.js +63 -0
- package/test/trust-proxy.test.js +162 -0
- package/test/type-provider.test.js +22 -0
- package/test/types/content-type-parser.test-d.ts +72 -0
- package/test/types/decorate-request-reply.test-d.ts +18 -0
- package/test/types/dummy-plugin.ts +9 -0
- package/test/types/errors.test-d.ts +90 -0
- package/test/types/fastify.test-d.ts +352 -0
- package/test/types/hooks.test-d.ts +550 -0
- package/test/types/import.ts +2 -0
- package/test/types/instance.test-d.ts +588 -0
- package/test/types/logger.test-d.ts +277 -0
- package/test/types/plugin.test-d.ts +97 -0
- package/test/types/register.test-d.ts +237 -0
- package/test/types/reply.test-d.ts +254 -0
- package/test/types/request.test-d.ts +188 -0
- package/test/types/route.test-d.ts +553 -0
- package/test/types/schema.test-d.ts +135 -0
- package/test/types/serverFactory.test-d.ts +37 -0
- package/test/types/type-provider.test-d.ts +1213 -0
- package/test/types/using.test-d.ts +17 -0
- package/test/upgrade.test.js +52 -0
- package/test/url-rewriting.test.js +122 -0
- package/test/use-semicolon-delimiter.test.js +168 -0
- package/test/validation-error-handling.test.js +900 -0
- package/test/versioned-routes.test.js +603 -0
- package/test/web-api.test.js +616 -0
- package/test/wrap-thenable.test.js +30 -0
- package/types/content-type-parser.d.ts +75 -0
- package/types/context.d.ts +22 -0
- package/types/errors.d.ts +92 -0
- package/types/hooks.d.ts +875 -0
- package/types/instance.d.ts +609 -0
- package/types/logger.d.ts +107 -0
- package/types/plugin.d.ts +44 -0
- package/types/register.d.ts +42 -0
- package/types/reply.d.ts +81 -0
- package/types/request.d.ts +95 -0
- package/types/route.d.ts +199 -0
- package/types/schema.d.ts +61 -0
- package/types/server-factory.d.ts +19 -0
- package/types/type-provider.d.ts +130 -0
- package/types/utils.d.ts +98 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { RouteGenericInterface } from './route'
|
|
2
|
+
import { FastifySchema } from './schema'
|
|
3
|
+
import { HttpKeys, RecordKeysToLowercase } from './utils'
|
|
4
|
+
|
|
5
|
+
// -----------------------------------------------------------------------------------------------
|
|
6
|
+
// TypeProvider
|
|
7
|
+
// -----------------------------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
export interface FastifyTypeProvider {
|
|
10
|
+
readonly schema: unknown,
|
|
11
|
+
readonly validator: unknown,
|
|
12
|
+
readonly serializer: unknown,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface FastifyTypeProviderDefault extends FastifyTypeProvider {}
|
|
16
|
+
|
|
17
|
+
export type CallValidatorTypeProvider<F extends FastifyTypeProvider, S> = (F & { schema: S })['validator']
|
|
18
|
+
export type CallSerializerTypeProvider<F extends FastifyTypeProvider, S> = (F & { schema: S })['serializer']
|
|
19
|
+
|
|
20
|
+
// -----------------------------------------------------------------------------------------------
|
|
21
|
+
// FastifyRequestType
|
|
22
|
+
// -----------------------------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
// Used to map undefined SchemaCompiler properties to unknown
|
|
25
|
+
// Without brackets, UndefinedToUnknown<undefined | null> => unknown
|
|
26
|
+
type UndefinedToUnknown<T> = [T] extends [undefined] ? unknown : T
|
|
27
|
+
|
|
28
|
+
// union-aware keyof operator
|
|
29
|
+
// keyof ({ a: number} | { b: number}) => never
|
|
30
|
+
// KeysOf<{a: number} | {b: number}> => "a" | "b"
|
|
31
|
+
// this exists to allow users to override faulty type-provider logic.
|
|
32
|
+
type KeysOf<T> = T extends any ? keyof T : never
|
|
33
|
+
|
|
34
|
+
// Resolves Request types either from generic argument or Type Provider.
|
|
35
|
+
type ResolveRequestParams<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> =
|
|
36
|
+
UndefinedToUnknown<KeysOf<RouteGeneric['Params']> extends never ? CallValidatorTypeProvider<TypeProvider, SchemaCompiler['params']> : RouteGeneric['Params']>
|
|
37
|
+
type ResolveRequestQuerystring<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> =
|
|
38
|
+
UndefinedToUnknown<KeysOf<RouteGeneric['Querystring']> extends never ? CallValidatorTypeProvider<TypeProvider, SchemaCompiler['querystring']> : RouteGeneric['Querystring']>
|
|
39
|
+
type ResolveRequestHeaders<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> =
|
|
40
|
+
UndefinedToUnknown<KeysOf<RouteGeneric['Headers']> extends never ? CallValidatorTypeProvider<TypeProvider, SchemaCompiler['headers']> : RouteGeneric['Headers']>
|
|
41
|
+
type ResolveRequestBody<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> =
|
|
42
|
+
UndefinedToUnknown<KeysOf<RouteGeneric['Body']> extends never ? CallValidatorTypeProvider<TypeProvider, SchemaCompiler['body']> : RouteGeneric['Body']>
|
|
43
|
+
|
|
44
|
+
// The target request type. This type is inferenced on fastify 'requests' via generic argument assignment
|
|
45
|
+
export interface FastifyRequestType<Params = unknown, Querystring = unknown, Headers = unknown, Body = unknown> {
|
|
46
|
+
params: Params,
|
|
47
|
+
query: Querystring,
|
|
48
|
+
headers: Headers,
|
|
49
|
+
body: Body
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Resolves the FastifyRequest generic parameters
|
|
53
|
+
export interface ResolveFastifyRequestType<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> extends FastifyRequestType {
|
|
54
|
+
params: ResolveRequestParams<TypeProvider, SchemaCompiler, RouteGeneric>,
|
|
55
|
+
query: ResolveRequestQuerystring<TypeProvider, SchemaCompiler, RouteGeneric>,
|
|
56
|
+
headers: RecordKeysToLowercase<ResolveRequestHeaders<TypeProvider, SchemaCompiler, RouteGeneric>>,
|
|
57
|
+
body: ResolveRequestBody<TypeProvider, SchemaCompiler, RouteGeneric>
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// -----------------------------------------------------------------------------------------------
|
|
61
|
+
// FastifyReplyType
|
|
62
|
+
// -----------------------------------------------------------------------------------------------
|
|
63
|
+
|
|
64
|
+
// Resolves the Reply type by taking a union of response status codes and content-types
|
|
65
|
+
type ResolveReplyFromSchemaCompiler<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema> = {
|
|
66
|
+
[K1 in keyof SchemaCompiler['response']]: SchemaCompiler['response'][K1] extends { content: { [keyof: string]: { schema: unknown } } } ? ({
|
|
67
|
+
[K2 in keyof SchemaCompiler['response'][K1]['content']]: CallSerializerTypeProvider<TypeProvider, SchemaCompiler['response'][K1]['content'][K2]['schema']>
|
|
68
|
+
} extends infer Result ? Result[keyof Result] : unknown) : CallSerializerTypeProvider<TypeProvider, SchemaCompiler['response'][K1]>
|
|
69
|
+
} extends infer Result ? Result[keyof Result] : unknown
|
|
70
|
+
|
|
71
|
+
// The target reply type. This type is inferenced on fastify 'replies' via generic argument assignment
|
|
72
|
+
export type FastifyReplyType<Reply = unknown> = Reply
|
|
73
|
+
|
|
74
|
+
// Resolves the Reply type either via generic argument or from response schema. This type uses a different
|
|
75
|
+
// resolution strategy to Requests where the Reply will infer a union of each status code type specified
|
|
76
|
+
// by the user. The Reply can be explicitly overridden by users providing a generic Reply type on the route.
|
|
77
|
+
export type ResolveFastifyReplyType<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> = UndefinedToUnknown<KeysOf<RouteGeneric['Reply']> extends never ? ResolveReplyFromSchemaCompiler<TypeProvider, SchemaCompiler> : RouteGeneric['Reply']>
|
|
78
|
+
|
|
79
|
+
// -----------------------------------------------------------------------------------------------
|
|
80
|
+
// FastifyReplyReturnType
|
|
81
|
+
// -----------------------------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
// Resolves the Reply return type by taking a union of response status codes in the generic argument
|
|
84
|
+
type ResolveReplyReturnTypeFromRouteGeneric<RouteGeneric extends RouteGenericInterface> = RouteGeneric extends { Reply: infer Return }
|
|
85
|
+
? keyof Return extends HttpKeys ? Return[keyof Return] | Return : Return
|
|
86
|
+
: unknown
|
|
87
|
+
|
|
88
|
+
// The target reply return type. This type is inferenced on fastify 'routes' via generic argument assignment
|
|
89
|
+
export type ResolveFastifyReplyReturnType<
|
|
90
|
+
TypeProvider extends FastifyTypeProvider,
|
|
91
|
+
SchemaCompiler extends FastifySchema,
|
|
92
|
+
RouteGeneric extends RouteGenericInterface
|
|
93
|
+
> = ResolveFastifyReplyType<
|
|
94
|
+
TypeProvider,
|
|
95
|
+
SchemaCompiler,
|
|
96
|
+
RouteGeneric
|
|
97
|
+
> extends infer ReplyType
|
|
98
|
+
? RouteGeneric['Reply'] extends ReplyType
|
|
99
|
+
? ResolveReplyReturnTypeFromRouteGeneric<RouteGeneric> extends infer Return
|
|
100
|
+
? Return | void | Promise<Return | void>
|
|
101
|
+
: unknown
|
|
102
|
+
: ReplyType | void | Promise<ReplyType | void>
|
|
103
|
+
// review: support both async and sync return types
|
|
104
|
+
// (Promise<Return> | Return | Promise<void> | void)
|
|
105
|
+
: unknown
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* This branded type is needed to indicate APIs that return Promise-likes which can
|
|
109
|
+
* safely "float" (not have rejections handled by calling code).
|
|
110
|
+
*
|
|
111
|
+
* Please refer to the following Github issue for more info:
|
|
112
|
+
* https://github.com/fastify/fastify/issues/5498
|
|
113
|
+
*/
|
|
114
|
+
export type SafePromiseLike<T> = PromiseLike<T> & { __linterBrands: 'SafePromiseLike' }
|
|
115
|
+
|
|
116
|
+
// -----------------------------------------------------------------------------------------------
|
|
117
|
+
// SendArgs
|
|
118
|
+
// -----------------------------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Determines whether the send() payload parameter should be required or optional.
|
|
122
|
+
* - When ReplyType is unknown (default/unspecified), payload is optional
|
|
123
|
+
* - When ReplyType is undefined or void, payload is optional (returning undefined is valid)
|
|
124
|
+
* - Otherwise, payload is required
|
|
125
|
+
*/
|
|
126
|
+
export type SendArgs<ReplyType> = unknown extends ReplyType
|
|
127
|
+
? [payload?: ReplyType]
|
|
128
|
+
: [ReplyType] extends [undefined | void]
|
|
129
|
+
? [payload?: ReplyType]
|
|
130
|
+
: [payload: ReplyType]
|
package/types/utils.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as http from 'node:http'
|
|
2
|
+
import * as http2 from 'node:http2'
|
|
3
|
+
import * as https from 'node:https'
|
|
4
|
+
|
|
5
|
+
type AutocompletePrimitiveBaseType<T> =
|
|
6
|
+
T extends string ? string :
|
|
7
|
+
T extends number ? number :
|
|
8
|
+
T extends boolean ? boolean :
|
|
9
|
+
never
|
|
10
|
+
|
|
11
|
+
export type Autocomplete<T> = T | (AutocompletePrimitiveBaseType<T> & Record<never, never>)
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Standard HTTP method strings
|
|
15
|
+
* for internal use
|
|
16
|
+
*/
|
|
17
|
+
type _HTTPMethods = 'DELETE' | 'GET' | 'HEAD' | 'PATCH' | 'POST' | 'PUT' | 'OPTIONS' |
|
|
18
|
+
'PROPFIND' | 'PROPPATCH' | 'MKCOL' | 'COPY' | 'MOVE' | 'LOCK' | 'UNLOCK' | 'TRACE' | 'SEARCH' | 'REPORT' | 'MKCALENDAR'
|
|
19
|
+
|
|
20
|
+
export type HTTPMethods = Autocomplete<_HTTPMethods | Lowercase<_HTTPMethods>>
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A union type of the Node.js server types from the http, https, and http2 modules.
|
|
24
|
+
*/
|
|
25
|
+
export type RawServerBase = http.Server | https.Server | http2.Http2Server | http2.Http2SecureServer
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The default server type
|
|
29
|
+
*/
|
|
30
|
+
export type RawServerDefault = http.Server
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The default request type based on the server type. Utilizes generic constraining.
|
|
34
|
+
*/
|
|
35
|
+
export type RawRequestDefaultExpression<
|
|
36
|
+
RawServer extends RawServerBase = RawServerDefault
|
|
37
|
+
> = RawServer extends http.Server | https.Server ? http.IncomingMessage
|
|
38
|
+
: RawServer extends http2.Http2Server | http2.Http2SecureServer ? http2.Http2ServerRequest
|
|
39
|
+
: never
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The default reply type based on the server type. Utilizes generic constraining.
|
|
43
|
+
*/
|
|
44
|
+
export type RawReplyDefaultExpression<
|
|
45
|
+
RawServer extends RawServerBase = RawServerDefault
|
|
46
|
+
> = RawServer extends http.Server | https.Server ? http.ServerResponse
|
|
47
|
+
: RawServer extends http2.Http2Server | http2.Http2SecureServer ? http2.Http2ServerResponse
|
|
48
|
+
: never
|
|
49
|
+
|
|
50
|
+
export type RequestBodyDefault = unknown
|
|
51
|
+
export type RequestQuerystringDefault = unknown
|
|
52
|
+
export type RequestParamsDefault = unknown
|
|
53
|
+
export type RequestHeadersDefault = unknown
|
|
54
|
+
|
|
55
|
+
export type ContextConfigDefault = unknown
|
|
56
|
+
export type ReplyDefault = unknown
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Helpers for determining the type of the response payload based on the code
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
type StringAsNumber<T extends string> = T extends `${infer N extends number}` ? N : never
|
|
63
|
+
type CodeClasses = 1 | 2 | 3 | 4 | 5
|
|
64
|
+
type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
|
|
65
|
+
type HttpCodes = StringAsNumber<`${CodeClasses}${Digit}${Digit}`>
|
|
66
|
+
type HttpKeys = HttpCodes | `${Digit}xx`
|
|
67
|
+
export type StatusCodeReply = {
|
|
68
|
+
[Key in HttpKeys]?: unknown;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// weird TS quirk: https://stackoverflow.com/questions/58977876/generic-conditional-type-resolves-to-never-when-the-generic-type-is-set-to-never
|
|
72
|
+
export type ReplyKeysToCodes<Key> = [Key] extends [never] ? number :
|
|
73
|
+
Key extends HttpCodes ? Key :
|
|
74
|
+
Key extends `${infer X extends CodeClasses}xx` ?
|
|
75
|
+
StringAsNumber<`${X}${Digit}${Digit}`> : number
|
|
76
|
+
|
|
77
|
+
export type CodeToReplyKey<Code extends number> = `${Code}` extends `${infer FirstDigit extends CodeClasses}${number}`
|
|
78
|
+
? `${FirstDigit}xx`
|
|
79
|
+
: never
|
|
80
|
+
|
|
81
|
+
export type RecordKeysToLowercase<Input> = Input extends Record<string, unknown>
|
|
82
|
+
? {
|
|
83
|
+
[Key in keyof Input as Key extends string
|
|
84
|
+
? Lowercase<Key>
|
|
85
|
+
: Key
|
|
86
|
+
]: Input[Key];
|
|
87
|
+
}
|
|
88
|
+
: Input
|
|
89
|
+
|
|
90
|
+
type OmitIndexSignature<T> = {
|
|
91
|
+
[K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* HTTP header strings
|
|
96
|
+
* Use this type only for input values, not for output values.
|
|
97
|
+
*/
|
|
98
|
+
export type HttpHeader = keyof OmitIndexSignature<http.OutgoingHttpHeaders> | (string & Record<never, never>)
|