Skip to content

Commit

Permalink
fix plugin types
Browse files Browse the repository at this point in the history
  • Loading branch information
tinchoz49 committed Jul 13, 2024
1 parent ba9d7d7 commit 918d10b
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 14 deletions.
3 changes: 3 additions & 0 deletions scripts/generate-dts.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ import { $ } from 'execa'

await $`tsc src/server.js src/plugin.js --declaration --allowJs --emitDeclarationOnly --outDir types`

const overload = fs.readFileSync('src/fastify-overload.d.ts', 'utf-8')

const types = fs.readFileSync('types/plugin.d.ts', 'utf-8')
fs.writeFileSync(
'types/plugin.d.ts',
types + 'import "./fastify-overload.d.ts"'
)
fs.writeFileSync('types/fastify-overload.d.ts', overload)
80 changes: 80 additions & 0 deletions src/fastify-overload.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/* eslint-disable ts/prefer-function-type */
/* eslint-disable ts/no-invalid-void-type */
/* eslint-disable no-unused-vars */
/// <reference types="node" />

import type * as fastify from 'fastify'
import type { ContextConfigDefault, FastifyBaseLogger, FastifyInstance, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerBase, RawServerDefault, RequestGenericInterface } from 'fastify'
import type { RouteGenericInterface } from 'fastify/types/route.js'
import type { IncomingMessage, Server, ServerResponse } from 'node:http'

import type { WebSocket, WebSocketServer } from './websocket-server.js'

declare module 'fastify' {
interface RouteShorthandOptions<
RawServer extends RawServerBase = RawServerDefault
> {
uws?: true | { topics: Array<string | Buffer> }
}

interface FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider> {
websocketServer: WebSocketServer
}

interface FastifyRequest {
uws: boolean
}

interface RouteShorthandMethod<
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault,
Logger extends FastifyBaseLogger = FastifyBaseLogger
> {
<RequestGeneric extends RequestGenericInterface = RequestGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler extends FastifySchema = FastifySchema, InnerLogger extends Logger = Logger>(
path: string,
opts: RouteShorthandOptions<RawServer, RawRequest, RawReply, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, InnerLogger> & { uws: true | { topics: Array<string | Buffer> } }, // this creates an overload that only applies these different types if the handler is for websockets
handler?: fastifyUws.WebsocketHandler<RawServer, RawRequest, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, InnerLogger>
): FastifyInstance<RawServer, RawRequest, RawReply, InnerLogger, TypeProvider>
}

interface RouteOptions<
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
RouteGeneric extends RouteGenericInterface = RouteGenericInterface,
ContextConfig = ContextConfigDefault,
SchemaCompiler = fastify.FastifySchema,
TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault,
Logger extends FastifyBaseLogger = FastifyBaseLogger
> extends fastifyUws.WebsocketRouteOptions<RawServer, RawRequest, RouteGeneric, ContextConfig, SchemaCompiler, TypeProvider, Logger> { }
}

declare namespace fastifyUws {
export interface WebsocketRouteOptions<
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RequestGeneric extends RequestGenericInterface = RequestGenericInterface,
ContextConfig = ContextConfigDefault,
SchemaCompiler extends FastifySchema = FastifySchema,
TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault,
Logger extends FastifyBaseLogger = FastifyBaseLogger
> {
uwsHandler?: fastifyUws.WebsocketHandler<RawServer, RawRequest, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, Logger>
}

export type WebsocketHandler<
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RequestGeneric extends RequestGenericInterface = RequestGenericInterface,
ContextConfig = ContextConfigDefault,
SchemaCompiler extends FastifySchema = FastifySchema,
TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault,
Logger extends FastifyBaseLogger = FastifyBaseLogger
> = (
this: FastifyInstance<Server, IncomingMessage, ServerResponse>,
connection: WebSocket,
request: FastifyRequest<RequestGeneric, RawServer, RawRequest, SchemaCompiler, TypeProvider, ContextConfig, Logger>
) => void | Promise<any>
}
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
},
"include": [
"./src/**/*.js",
"types/fastify-overload.d.ts"
"./src/**/*.d.ts"
]
}
30 changes: 17 additions & 13 deletions types/fastify-overload.d.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
/* eslint-disable ts/prefer-function-type */
/* eslint-disable ts/no-invalid-void-type */
/* eslint-disable no-unused-vars */
/// <reference types="node" />

import { IncomingMessage, ServerResponse, Server } from 'http';
import { FastifyRequest, RawServerBase, RawServerDefault, RawRequestDefaultExpression, RawReplyDefaultExpression, RequestGenericInterface, ContextConfigDefault, FastifyInstance, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, FastifyBaseLogger } from 'fastify';
import * as fastify from 'fastify';
import { RouteGenericInterface } from 'fastify/types/route.js';
import type { WebSocketServer, WebSocket } from '../src/websocket-server.js';
import type * as fastify from 'fastify'
import type { ContextConfigDefault, FastifyBaseLogger, FastifyInstance, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerBase, RawServerDefault, RequestGenericInterface } from 'fastify'
import type { RouteGenericInterface } from 'fastify/types/route.js'
import type { IncomingMessage, Server, ServerResponse } from 'node:http'

import type { WebSocket, WebSocketServer } from './websocket-server.js'

declare module 'fastify' {
interface RouteShorthandOptions<
Expand All @@ -14,8 +18,7 @@ declare module 'fastify' {
}

interface FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider> {
get: RouteShorthandMethod<RawServer, RawRequest, RawReply, TypeProvider, Logger>,
websocketServer: WebSocketServer,
websocketServer: WebSocketServer
}

interface FastifyRequest {
Expand All @@ -27,12 +30,13 @@ declare module 'fastify' {
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault,
Logger extends FastifyBaseLogger = FastifyBaseLogger
> {
<RequestGeneric extends RequestGenericInterface = RequestGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler extends FastifySchema = FastifySchema, Logger extends FastifyBaseLogger = FastifyBaseLogger>(
<RequestGeneric extends RequestGenericInterface = RequestGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler extends FastifySchema = FastifySchema, InnerLogger extends Logger = Logger>(
path: string,
opts: { uws: true | { topics: Array<string | Buffer> } } & RouteShorthandOptions<RawServer, RawRequest, RawReply, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, Logger>, // this creates an overload that only applies these different types if the handler is for websockets
handler?: fastifyUws.WebsocketHandler<RawServer, RawRequest, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, Logger>
): FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider>;
opts: RouteShorthandOptions<RawServer, RawRequest, RawReply, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, InnerLogger> & { uws: true | { topics: Array<string | Buffer> } }, // this creates an overload that only applies these different types if the handler is for websockets
handler?: fastifyUws.WebsocketHandler<RawServer, RawRequest, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, InnerLogger>
): FastifyInstance<RawServer, RawRequest, RawReply, InnerLogger, TypeProvider>
}

interface RouteOptions<
Expand All @@ -57,7 +61,7 @@ declare namespace fastifyUws {
TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault,
Logger extends FastifyBaseLogger = FastifyBaseLogger
> {
uwsHandler?: fastifyUws.WebsocketHandler<RawServer, RawRequest, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, Logger>;
uwsHandler?: fastifyUws.WebsocketHandler<RawServer, RawRequest, RequestGeneric, ContextConfig, SchemaCompiler, TypeProvider, Logger>
}

export type WebsocketHandler<
Expand All @@ -72,5 +76,5 @@ declare namespace fastifyUws {
this: FastifyInstance<Server, IncomingMessage, ServerResponse>,
connection: WebSocket,
request: FastifyRequest<RequestGeneric, RawServer, RawRequest, SchemaCompiler, TypeProvider, ContextConfig, Logger>
) => void | Promise<any>;
) => void | Promise<any>
}

0 comments on commit 918d10b

Please sign in to comment.