fastify
Version:
Fast and low overhead web framework, for Node.js
163 lines (143 loc) • 6.56 kB
text/typescript
import { expectAssignable, expectType } from 'tsd'
import fastify, {
ContextConfigDefault,
FastifyRequestContext,
FastifyContextConfig,
FastifyLogFn,
FastifySchema,
FastifyTypeProviderDefault,
RawReplyDefaultExpression,
RawRequestDefaultExpression,
RawServerDefault,
RequestBodyDefault,
RequestGenericInterface,
RouteHandler,
RouteHandlerMethod
} from '../../fastify'
import { FastifyInstance } from '../../types/instance'
import { FastifyLoggerInstance } from '../../types/logger'
import { FastifyReply } from '../../types/reply'
import { FastifyRequest, RequestRouteOptions } from '../../types/request'
import { FastifyRouteConfig, RouteGenericInterface } from '../../types/route'
import { RequestHeadersDefault, RequestParamsDefault, RequestQuerystringDefault } from '../../types/utils'
interface RequestBody {
content: string;
}
interface RequestQuerystring {
from: string;
}
interface RequestParams {
id: number;
}
interface RequestHeaders {
'x-foobar': string;
}
interface RequestData extends RequestGenericInterface {
Body: RequestBody;
Querystring: RequestQuerystring;
Params: RequestParams;
Headers: RequestHeaders;
}
type Handler = RouteHandler<RequestData>
type CustomRequest = FastifyRequest<{
Body: RequestBody | undefined;
Querystring: RequestQuerystring;
Params: RequestParams;
Headers: RequestHeaders;
}>
type HTTPRequestPart = 'body' | 'query' | 'querystring' | 'params' | 'headers'
type ExpectedGetValidationFunction = (input: {[key: string]: unknown}) => boolean
interface CustomLoggerInterface extends FastifyLoggerInstance {
foo: FastifyLogFn; // custom severity logger method
}
const getHandler: RouteHandler = function (request, _reply) {
expectType<string>(request.url)
expectType<string>(request.originalUrl)
expectType<string>(request.method)
expectType<string>(request.routerPath)
expectType<string>(request.routerMethod)
expectType<Readonly<RequestRouteOptions>>(request.routeOptions)
expectType<boolean>(request.is404)
expectType<string>(request.hostname)
expectType<string>(request.ip)
expectType<string[] | undefined>(request.ips)
expectType<RawRequestDefaultExpression>(request.raw)
expectType<RequestBodyDefault>(request.body)
expectType<RequestParamsDefault>(request.params)
expectType<FastifyRequestContext<ContextConfigDefault>>(request.context)
expectType<FastifyRequestContext<ContextConfigDefault>['config']>(request.context.config)
expectType<FastifyRequestContext<ContextConfigDefault>['config']>(request.routeConfig)
expectType<FastifyRequestContext<ContextConfigDefault>['config']>(request.routeOptions.config)
expectType<ContextConfigDefault & FastifyRouteConfig & FastifyContextConfig>(request.routeOptions.config)
expectType<FastifySchema | undefined>(request.routeSchema)
expectType<FastifySchema | undefined>(request.routeOptions.schema)
expectType<RouteHandlerMethod>(request.routeOptions.handler)
expectType<string | undefined>(request.routeOptions.url)
expectType<RequestHeadersDefault & RawRequestDefaultExpression['headers']>(request.headers)
request.headers = {}
expectType<RequestQuerystringDefault>(request.query)
expectType<string>(request.id)
expectType<FastifyLoggerInstance>(request.log)
expectType<RawRequestDefaultExpression['socket']>(request.socket)
expectType<Error & { validation: any; validationContext: string } | undefined>(request.validationError)
expectType<FastifyInstance>(request.server)
expectAssignable<(httpPart: HTTPRequestPart) => ExpectedGetValidationFunction>(request.getValidationFunction)
expectAssignable<(schema: {[key: string]: unknown}) => ExpectedGetValidationFunction>(request.getValidationFunction)
expectAssignable<(input: {[key: string]: unknown}, schema: {[key: string]: unknown}, httpPart?: HTTPRequestPart) => boolean>(request.validateInput)
expectAssignable<(input: {[key: string]: unknown}, httpPart?: HTTPRequestPart) => boolean>(request.validateInput)
}
const getHandlerWithCustomLogger: RouteHandlerMethod<RawServerDefault, RawRequestDefaultExpression, RawReplyDefaultExpression, RouteGenericInterface, ContextConfigDefault, FastifySchema, FastifyTypeProviderDefault, CustomLoggerInterface> = function (request, _reply) {
expectType<CustomLoggerInterface>(request.log)
}
const postHandler: Handler = function (request) {
expectType<RequestBody>(request.body)
expectType<RequestParams>(request.params)
expectType<RequestHeaders & RawRequestDefaultExpression['headers']>(request.headers)
expectType<RequestQuerystring>(request.query)
expectType<string>(request.body.content)
expectType<string>(request.query.from)
expectType<number>(request.params.id)
expectType<string>(request.headers['x-foobar'])
expectType<FastifyInstance>(request.server)
expectType<FastifyRequestContext<ContextConfigDefault>>(request.context)
expectType<FastifyRequestContext<ContextConfigDefault>['config']>(request.context.config)
}
function putHandler (request: CustomRequest, reply: FastifyReply) {
expectType<RequestBody | undefined>(request.body)
expectType<RequestParams>(request.params)
expectType<RequestHeaders & RawRequestDefaultExpression['headers']>(request.headers)
expectType<RequestQuerystring>(request.query)
if (request.body === undefined) {
expectType<undefined>(request.body)
} else {
expectType<string>(request.body.content)
}
expectType<string>(request.query.from)
expectType<number>(request.params.id)
expectType<string>(request.headers['x-foobar'])
expectType<FastifyInstance>(request.server)
expectType<FastifyRequestContext<ContextConfigDefault>>(request.context)
expectType<FastifyRequestContext<ContextConfigDefault>['config']>(request.context.config)
}
const server = fastify()
server.get('/get', getHandler)
server.post('/post', postHandler)
server.put('/put', putHandler)
const customLogger: CustomLoggerInterface = {
level: 'info',
silent: () => { },
info: () => { },
warn: () => { },
error: () => { },
fatal: () => { },
trace: () => { },
debug: () => { },
foo: () => { }, // custom severity logger method
child: () => customLogger
}
const serverWithCustomLogger = fastify({ logger: customLogger })
expectType<
FastifyInstance<RawServerDefault, RawRequestDefaultExpression, RawReplyDefaultExpression, CustomLoggerInterface>
& PromiseLike<FastifyInstance<RawServerDefault, RawRequestDefaultExpression, RawReplyDefaultExpression, CustomLoggerInterface>>
>(serverWithCustomLogger)
serverWithCustomLogger.get('/get', getHandlerWithCustomLogger)