Skip to content

imedadel/fastify-autoroute

Repository files navigation

Fastify AutoRoute

Next.js file routing for Fastify.

If you're familiar with Next.js, you know how awesome the routing is. If not, have a look on their documentation :)

AutoRoute gives you exactly the same routing (except for optional catch all routes, they can't be done in Fastify or they're inherently supported, je sais pas 🤷‍♀️).

Install

yarn add fastify-autoroute
# or
npm i fastify-autoroute

Usage

Add AutoRoute as a plugin to Fastify:

import { FastifyPlugin } from "fastify";
import { join } from "path";
import fastifyAutoRoute from "fastify-autoroute";

const app: FastifyPlugin = function (fastify, opts, next): void {
	fastify.register(fastifyAutoRoute, {
		autoRouteDir: join(__dirname, "routes"),
	});

	next();
};

export default app;

Options

  • autoRouteDir (required, string) — this is the root folder of your routes. This is similar to Next.js /pages.

Structure

I tried explaining this, but instead here is an example

For the following directory:

├───routes
│   ├───users
│   │   ├───[id]
│   │   │   ├───index.get.ts
│   │   │   ├───index.delete.ts
│   │   │   ├───name.get.ts
│   │   │   └───email.get.ts
│   │   └───index.post.ts
│   ├───teams
│   │   ├───[...slug].get.ts
│   └───index.get.ts

You will get the following Fastify routes:

GET	/
POST	/users
GET	/users/name
GET	/users/email
GET	/users/:id
DELETE	/users/:id
GET	/teams/*

Note. the method all is expanded into all the methods supported by Fastify. So, name.all.ts is expanded into

GET /name
POST /name
PUT /name
...

File content

The default export is passed as a handler to fastify.route(). All other named exports are bassed as options to fastify.route() too.

export const schema = {};
export const onRequest = [];
export default async (request: FastifyRequest, reply: FastifyReply) => {
	return { ok: true };
};

Accessing Fastify

In order to access Fastify and its decorators, you can use the following structure:

export default (fastify: FastifyInstance) => async (
	request: FastifyRequest,
	reply: FastifyReply
) => {
	return {
		config: fastify.config,
	};
};

The same structure applies when accessing Fastify from inside onRequest:

export const onRequest = [
	(fastify) => async (request, reply) => {
		// your content
		return;
	},
];

Currently, accessing Fastify from inside other hooks is not supported.

Unresolved issues

  • Typing: Can't it be nicer? Like automatic typing for every exported function? Is that possible in Typescript?
  • More errors: There should be more errors and checks for when users misuse this plugin.

Author

Imed Adel (Twitter)

License

MIT