1.1.2 • Published 2 years ago

fastify-file-routes v1.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Fastify File Routes

Banner

NPM downloads npm node-current

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

npm install fastify-file-routes
yarn add fastify-file-routes

:blue_book: Usage/Examples

1. Register the Plugin.

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.

mkdir routes

3. Create your first route in the routes directory

//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.

//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.

//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..

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

7. Prefix Route

//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

//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

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

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

License

MIT

Related/Acknowledgements

Fastify - AutoRoutes - Lots of code has been used from this project.