0.1.4 β€’ Published 4 years ago

fastify-autoroute v0.1.4

Weekly downloads
1
License
MIT
Repository
github
Last release
4 years ago

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