Skip to content

Commit

Permalink
fix: infer correct hook handler (fastify#4945)
Browse files Browse the repository at this point in the history
* fix: infer correct hook handler

* Update test/types/hooks.test-d.ts

* simplify

* remove duplicate typing tests

* remove duplicate test

* remove unused import

* fix

* fix linting
  • Loading branch information
Uzlopak authored and beyazit committed Aug 9, 2023
1 parent f4d3390 commit d86db42
Show file tree
Hide file tree
Showing 4 changed files with 169 additions and 148 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
"coverage:ci": "c8 --reporter=lcov tap --coverage-report=html --no-browser --no-check-coverage",
"coverage:ci-check-coverage": "c8 check-coverage --branches 100 --functions 100 --lines 100 --statements 100",
"lint": "npm run lint:standard && npm run lint:typescript && npm run lint:markdown",
"lint:fix": "standard --fix",
"lint:fix": "standard --fix && npm run lint:typescript:fix",
"lint:markdown": "markdownlint-cli2",
"lint:standard": "standard | snazzy",
"lint:typescript": "eslint -c types/.eslintrc.json types/**/*.d.ts test/types/**/*.test-d.ts",
"lint:typescript:fix": "npm run lint:typescript -- --fix",
"prepublishOnly": "cross-env PREPUBLISH=true tap --no-check-coverage test/build/**.test.js && npm run test:validator:integrity",
"test": "npm run lint && npm run unit && npm run test:typescript",
"test:ci": "npm run unit -- --cov --coverage-report=lcovonly && npm run test:typescript",
Expand Down
13 changes: 13 additions & 0 deletions test/types/hooks.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -392,3 +392,16 @@ server.addHook('preClose', function (done) {
server.addHook('preClose', async function () {
expectType<FastifyInstance>(this)
})

expectError(server.addHook('onClose', async function (instance, done) {}))
expectError(server.addHook('onError', async function (request, reply, error, done) {}))
expectError(server.addHook('onReady', async function (done) {}))
expectError(server.addHook('onRequest', async function (request, reply, done) {}))
expectError(server.addHook('onRequestAbort', async function (request, done) {}))
expectError(server.addHook('onResponse', async function (request, reply, done) {}))
expectError(server.addHook('onSend', async function (request, reply, payload, done) {}))
expectError(server.addHook('onTimeout', async function (request, reply, done) {}))
expectError(server.addHook('preClose', async function (done) {}))
expectError(server.addHook('preHandler', async function (request, reply, done) {}))
expectError(server.addHook('preSerialization', async function (request, reply, payload, done) {}))
expectError(server.addHook('preValidation', async function (request, reply, done) {}))
106 changes: 102 additions & 4 deletions types/hooks.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ interface DoneFuncWithErrOrRes {
* Note: the hook is NOT called if the payload is a string, a Buffer, a stream or null.
*/
export interface preSerializationHookHandler<
PreSerializationPayload,
PreSerializationPayload = unknown,
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
Expand All @@ -210,7 +210,7 @@ export interface preSerializationHookHandler<
}

export interface preSerializationAsyncHookHandler<
PreSerializationPayload,
PreSerializationPayload = unknown,
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
Expand All @@ -233,7 +233,7 @@ export interface preSerializationAsyncHookHandler<
* Note: If you change the payload, you may only change it to a string, a Buffer, a stream, or null.
*/
export interface onSendHookHandler<
OnSendPayload,
OnSendPayload = unknown,
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
Expand All @@ -253,7 +253,7 @@ export interface onSendHookHandler<
}

export interface onSendAsyncHookHandler<
OnSendPayload,
OnSendPayload = unknown,
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
Expand Down Expand Up @@ -432,6 +432,66 @@ export interface onRequestAbortAsyncHookHandler<
): Promise<unknown>;
}

export type LifecycleHook = 'onRequest'
| 'preParsing'
| 'preValidation'
| 'preHandler'
| 'preSerialization'
| 'onSend'
| 'onResponse'
| 'onRequest'
| 'onError'
| 'onTimeout'
| 'onRequestAbort'

export type LifecycleHookLookup<K extends LifecycleHook> = K extends 'onRequest'
? onRequestHookHandler
: K extends 'preParsing'
? preParsingHookHandler
: K extends 'preValidation'
? preValidationHookHandler
: K extends 'preHandler'
? preHandlerHookHandler
: K extends 'preSerialization'
? preSerializationHookHandler
: K extends 'onSend'
? onSendHookHandler
: K extends 'onResponse'
? onResponseHookHandler
: K extends 'onRequest'
? onRequestHookHandler
: K extends 'onError'
? onErrorHookHandler
: K extends 'onTimeout'
? onTimeoutHookHandler
: K extends 'onRequestAbort'
? onRequestAbortHookHandler
: never

export type LifecycleHookAsyncLookup<K extends LifecycleHook> = K extends 'onRequest'
? onRequestAsyncHookHandler
: K extends 'preParsing'
? preParsingAsyncHookHandler
: K extends 'preValidation'
? preValidationAsyncHookHandler
: K extends 'preHandler'
? preHandlerAsyncHookHandler
: K extends 'preSerialization'
? preSerializationAsyncHookHandler
: K extends 'onSend'
? onSendAsyncHookHandler
: K extends 'onResponse'
? onResponseAsyncHookHandler
: K extends 'onRequest'
? onRequestAsyncHookHandler
: K extends 'onError'
? onErrorAsyncHookHandler
: K extends 'onTimeout'
? onTimeoutAsyncHookHandler
: K extends 'onRequestAbort'
? onRequestAbortAsyncHookHandler
: never

// Application Hooks

/**
Expand Down Expand Up @@ -555,3 +615,41 @@ export interface preCloseAsyncHookHandler<
this: FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider>,
): Promise<unknown>;
}

export type ApplicationHook = 'onRoute'
| 'onRegister'
| 'onReady'
| 'onClose'
| 'preClose'

export type ApplicationHookLookup<K extends ApplicationHook> = K extends 'onRegister'
? onRegisterHookHandler
: K extends 'onReady'
? onReadyHookHandler
: K extends 'onClose'
? onCloseHookHandler
: K extends 'preClose'
? preCloseHookHandler
: never

export type ApplicationHookAsyncLookup<K extends ApplicationHook> = K extends 'onRegister'
? onRegisterHookHandler
: K extends 'onReady'
? onReadyAsyncHookHandler
: K extends 'onClose'
? onCloseAsyncHookHandler
: K extends 'preClose'
? preCloseAsyncHookHandler
: never

export type HookLookup <K extends ApplicationHook | LifecycleHook> = K extends ApplicationHook
? ApplicationHookLookup<K>
: K extends LifecycleHook
? LifecycleHookLookup<K>
: never

export type HookAsyncLookup <K extends ApplicationHook | LifecycleHook> = K extends ApplicationHook
? ApplicationHookAsyncLookup<K>
: K extends LifecycleHook
? LifecycleHookAsyncLookup<K>
: never

0 comments on commit d86db42

Please sign in to comment.