fastify-file-routes
v1.1.2
Published
A Fastify plugin that provides a file system routes, based on the way Next.JS file system routing works, including all possible features.
Downloads
300
Maintainers
Readme
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.
: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
- Check the examples folder in /examples to see how to use the plugin.
- 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
andmethod
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
- Adding support for optional wildcard routes - [[...id]].
- More tests.
- Better typescript stuff for validation and inferences in routes.
Visualization of this Repo.
License
Related/Acknowledgements
Fastify - AutoRoutes - Lots of code has been used from this project.