fastify-autoroute
TypeScript icon, indicating that this package has built-in type declarations

0.1.4 • Public • Published

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

Package Sidebar

Install

npm i fastify-autoroute

Weekly Downloads

10

Version

0.1.4

License

MIT

Unpacked Size

16.5 kB

Total Files

7

Last publish

Collaborators

  • imedadel