Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/spa5k/fastify-file-routes

A Fastify plugin that provides a file system routes, based on the way Next.JS file system routing works, including all possible features.
https://github.com/spa5k/fastify-file-routes

fastify fastify-plugin filesystem hacktoberfest nextjs routing

Last synced: 4 days ago
JSON representation

A Fastify plugin that provides a file system routes, based on the way Next.JS file system routing works, including all possible features.

Awesome Lists containing this project

README

        

# Fastify File Routes

![Banner](./banner.png)

[![NPM downloads](https://img.shields.io/npm/dm/fastify-file-routes.svg?style=for-the-badge)](https://www.npmjs.com/package/fastify-file-routes)
[![npm](https://img.shields.io/npm/v/fastify-file-routes?logo=npm&style=for-the-badge)](https://www.npmjs.com/package/fastify-file-routes)
![node-current](https://img.shields.io/badge/Node-%3E=14-success?style=for-the-badge&logo=node)

A Fastify plugin that provides a file system routes, based on the way Next.JS file system routing works, including all possible features.

## :sparkles: Features

1. File System Routing.
2. Index Routes.
3. Nested Routes.
4. Dynamic Route Segments.
5. Catch All (Wildcard \*) Routes.
6. Multiple parameters. eg /users/:id-:name

## :rocket: Installation

```sh
npm install fastify-file-routes
```

```yarn
yarn add fastify-file-routes
```

## :blue_book: Usage/Examples

### 1. Register the Plugin.

```typescript
import { fileRoutes } from "fastify-file-routes";

const app: FastifyInstance = fastify({ logger: true });

await app.register(fileRoutes, {
routesDir: "./routes",
prefix, // -> optional
});

await app.listen(3000);
```

### 2. Create the routes directory.

```sh
mkdir routes
```

### 3. Create your first route in the routes directory

```typescript
//file: `routes/some/route.ts`
//url: `http://localhost/some/route`

import type { Route } from "fastify-file-routes";

export const routes: Route = {
get: {
handler: async (request, reply) => {
await reply.send({
some: "route",
});
},
},
};
```

### 4. Access the Parameters.

```typescript
//file: `routes/users/[userId]/settings.js`
//mapped to: `http://localhost/users/:userId/settings`

export const routes: Route = {
get: {
handler: async (request, reply) => {
const { params } = request;
await reply.send(`photos of user ${params.userId}`);
},
},
};
```

### 5. Wildcard (\*) routes.

```typescript
//file: `routes/profile/[...id].ts `
//mapped to: `http://localhost/profile/*`

export const routes: Route = {
get: {
handler: async (request, reply) => {
const { params } = request;
await reply.send(`wildcard route`);
},
},
};
```

### 6. Post Request..

```typescript
export const routes: Route = {
post: {
handler: async (_request, reply) => {
await reply.send({
post: "post user",
});
},
},
};
```

### 7. Prefix Route

```typescript
//file: `routes/some/route.ts`
//url: `http://localhost/api/some/route`

await app.register(fileRoutes, {
routesDir: "./routes",
prefix: "/api",
});

export const routes: Route = {
post: {
handler: async (_request, reply) => {
await reply.send({
post: "post user",
});
},
},
};
```

### 8. Multiple Parameters

```typescript
//file: `routes/some/[param1]-[param2].ts`
//url: `http://localhost/some/:param1-:param2`

await app.register(fileRoutes, {
routesDir: "./routes",
});

export const routes: Route = {
post: {
handler: async (_request, reply) => {
await reply.send({
post: "multiple params",
});
},
},
};
```

## :information_source: Info

1. Check the examples folder in /examples to see how to use the plugin.
2. route.prefixTrailingSlash has been set to 'both'.

## :arrow_forward: Route module definition

Method specification for attributes is available here: [Method specification](https://www.fastify.io/docs/latest/Routes/#full-declaration)

> :information_source: attributes `url` and `method` are dynamically provided

Allowed attributes mapped to Http methods in module:

- delete
- get
- head
- patch
- post
- put
- options

## :arrow_forward: Skipping files

to skip file in routes directory, prepend the `.` or `_` character to filename

examples:

```text
routes
├── .ignored-directory
├── _ignored-directory
├── .ignored-js-file.js
├── _ignored-js-file.js
├── .ignored-ts-file.ts
├── _ignored-ts-file.ts
├── ignored-js-test.test.js
└── ignored-ts-test.test.ts
```

> :warning: also any `*.test.js` and `*.test.ts` are skipped!

this is useful if you want to have a lib file which contains functions that don't have to be a route, so just create the file with `_` prepending character

## TODO

1. Adding support for optional wildcard routes - [[...id]].
2. More tests.
3. Better typescript stuff for validation and inferences in routes.

## Visualization of this Repo.

![Visualization of this repo](./diagram.svg)

## License

[MIT](https://choosealicense.com/licenses/mit/)

## Related/Acknowledgements

[Fastify - AutoRoutes](https://github.com/GiovanniCardamone/fastify-autoroutes) - Lots of code has been used from this project.