Skip to content

Commit

Permalink
feat: merge decorators when registering plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
DemonHa committed May 1, 2024
1 parent 4e07627 commit 83b070e
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 16 deletions.
16 changes: 14 additions & 2 deletions examples/typescript-plugin-safety.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FastifyBaseLogger, FastifyPluginAsync, FastifyPluginCallback, FastifyPluginOptions, FastifyTypeProvider, FastifyTypeProviderDefault, RawServerBase, RawServerDefault } from "../fastify";
import fastify, { FastifyBaseLogger, FastifyPluginAsync, FastifyPluginCallback, FastifyPluginOptions, FastifyTypeProvider, FastifyTypeProviderDefault, RawServerBase, RawServerDefault } from "../fastify";
import { FastifyDecorators, FastifyInstance } from "../types/instance";

type ExtractSixGeneric<T> = T extends FastifyInstance<any, any, any, any, any, infer U> ? U : void;
Expand Down Expand Up @@ -73,7 +73,7 @@ const a = fastifyPlugin<{
})
});

fastifyPlugin<{ decorators: {}, dependencies: [typeof a] }>((fastify) => {
const b = fastifyPlugin<{ decorators: { fastify: { other: string } }, dependencies: [typeof a] }>((fastify) => {
fastify.someProperty;

fastify.get("/", (req, res) => {
Expand All @@ -83,5 +83,17 @@ fastifyPlugin<{ decorators: {}, dependencies: [typeof a] }>((fastify) => {
});
}, {});

const app = fastify()
.register(a, {})
.register(b, {});

app.someProperty;
app.other; // <- If we hover on the property it will have the correct type

app.route({
method: "POST",
url: "/health",
handler: (req, res) => {
res.sendFile("./somefilepath") // <- Now the type works
}
})
2 changes: 1 addition & 1 deletion types/instance.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ export type FastifyInstance<
ready(): FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider, Decorators> & PromiseLike<undefined>;
ready(readyListener: (err: Error) => void): FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider, Decorators>;

register: FastifyRegister<FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider, Decorators> & PromiseLike<undefined>>;
register: FastifyRegister<RawServer, RawRequest, RawReply, Decorators>;

routing(req: RawRequest, res: RawReply): void;
getDefaultRoute(): DefaultRoute<RawRequest, RawReply>;
Expand Down
31 changes: 18 additions & 13 deletions types/register.d.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { FastifyPluginOptions, FastifyPluginCallback, FastifyPluginAsync } from './plugin'
import { LogLevel } from './logger'
import { FastifyInstance } from './instance'
import { RawServerBase } from './utils'
import { FastifyBaseLogger, FastifyTypeProvider, RawServerDefault } from '../fastify'
import { FastifyDecorators, FastifyInstance } from './instance'
import { RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerBase } from './utils'
import { FastifyBaseLogger, FastifyTypeProvider, FastifyTypeProviderDefault, RawServerDefault } from '../fastify'

export interface RegisterOptions {
prefix?: string;
Expand All @@ -17,17 +17,22 @@ export type FastifyRegisterOptions<Options> = (RegisterOptions & Options) | ((in
*
* Function for adding a plugin to fastify. The options are inferred from the passed in FastifyPlugin parameter.
*/
export interface FastifyRegister<T = void, RawServer extends RawServerBase = RawServerDefault, TypeProviderDefault extends FastifyTypeProvider = FastifyTypeProvider, LoggerDefault extends FastifyBaseLogger = FastifyBaseLogger> {
<Options extends FastifyPluginOptions, Server extends RawServerBase = RawServer, TypeProvider extends FastifyTypeProvider = TypeProviderDefault, Logger extends FastifyBaseLogger = LoggerDefault>(
plugin: FastifyPluginCallback<Options, Server, TypeProvider, Logger>,
export interface FastifyRegister<
RawServer extends RawServerBase = RawServerDefault,
RawRequest extends RawRequestDefaultExpression<RawServer> = RawRequestDefaultExpression<RawServer>,
RawReply extends RawReplyDefaultExpression<RawServer> = RawReplyDefaultExpression<RawServer>,
D extends FastifyDecorators = object,
> {
<Options extends FastifyPluginOptions, Server extends RawServerBase = RawServer, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger, Decorators extends FastifyDecorators = object>(
plugin: FastifyPluginCallback<Options, Server, TypeProvider, Logger, Decorators>,
opts?: FastifyRegisterOptions<Options>
): T;
<Options extends FastifyPluginOptions, Server extends RawServerBase = RawServer, TypeProvider extends FastifyTypeProvider = TypeProviderDefault, Logger extends FastifyBaseLogger = LoggerDefault>(
plugin: FastifyPluginAsync<Options, Server, TypeProvider, Logger>,
): FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider, Decorators & D> & PromiseLike<undefined>;
<Options extends FastifyPluginOptions, Server extends RawServerBase = RawServer, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger, Decorators extends FastifyDecorators = object>(
plugin: FastifyPluginAsync<Options, Server, TypeProvider, Logger, Decorators>,
opts?: FastifyRegisterOptions<Options>
): T;
<Options extends FastifyPluginOptions, Server extends RawServerBase = RawServer, TypeProvider extends FastifyTypeProvider = TypeProviderDefault, Logger extends FastifyBaseLogger = LoggerDefault>(
plugin: FastifyPluginCallback<Options, Server, TypeProvider, Logger> | FastifyPluginAsync<Options, Server, TypeProvider, Logger> | Promise<{ default: FastifyPluginCallback<Options, Server, TypeProvider, Logger> }> | Promise<{ default: FastifyPluginAsync<Options, Server, TypeProvider, Logger> }>,
): FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider, Decorators & D> & PromiseLike<undefined>;
<Options extends FastifyPluginOptions, Server extends RawServerBase = RawServer, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger, Decorators extends FastifyDecorators = object>(
plugin: FastifyPluginCallback<Options, Server, TypeProvider, Logger, Decorators> | FastifyPluginAsync<Options, Server, TypeProvider, Logger, Decorators> | Promise<{ default: FastifyPluginCallback<Options, Server, TypeProvider, Logger, Decorators> }> | Promise<{ default: FastifyPluginAsync<Options, Server, TypeProvider, Logger, Decorators> }>,
opts?: FastifyRegisterOptions<Options>
): T;
): FastifyInstance<RawServer, RawRequest, RawReply, Logger, TypeProvider, Decorators & D> & PromiseLike<undefined>;
}

0 comments on commit 83b070e

Please sign in to comment.