Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/imedadel/fastify-autoroute

Next.js file routing for Fastify
https://github.com/imedadel/fastify-autoroute

fastify fastify-plugin nextjs router

Last synced: 1 day ago
JSON representation

Next.js file routing for Fastify

Awesome Lists containing this project

README

        

# 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](https://nextjs.org/docs/routing/dynamic-routes) :)

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

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

# Usage

Add AutoRoute as a plugin to Fastify:

```ts
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.

```ts
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:

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

The same structure applies when accessing Fastify from inside `onRequest`:

```ts
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](https://twitter.com/imedadel_))

# License

MIT