convfastify is a plugin for the Fastify framework that provides a conventional way of declaring routes.
Features:
- Autoload routes
- Typesafe route definition
- Preconfigured swagger
For npm users:
npm i convfastifyFor yarn users:
yarn add convfastifyRegister the plugin and load routes:
const fastify = require("fastify");
const { default: convfastify } = require("convfastify");
const app = fastify({
logger: true,
});
app.register(
convfastify()
.loadFrom(`${__dirname}/routes/**/*.js`)
.serveSwagger()
.register()
);
app.listen({
port: 8080,
});On the files under the /routes directory:
const { route } = require("convfastify");
module.exports.default = route.define({
method: "GET",
url: "/",
schema: {
querystring: {
type: "object",
properties: {
foo: { type: "number" },
bar: { type: "string" },
},
required: ["foo", "bar"],
},
response: {
200: {
type: "object",
properties: {
message: { type: "string" },
},
},
},
},
handler: (_, res) => {
res.send({ message: "Hello World" });
},
});It will load the routes defined in the routes directory and serve swagger.
Register the plugin and load routes:
import fastify from "fastify";
import convfastify from "convfastify";
import { dirname } from "path";
import { fileURLToPath } from "url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const app = fastify({
logger: true,
});
app.register(
convfastify
.default()
.loadFrom(`${__dirname}/routes/**/*.js`)
.serveSwagger()
.register({ esm: true })
);
app.listen({
port: 8080,
});On the files under the /routes directory:
import { route } from "convfastify";
export default route.define({
method: "GET",
url: "/",
schema: {
querystring: {
type: "object",
properties: {
foo: { type: "number" },
bar: { type: "string" },
},
required: ["foo", "bar"],
},
response: {
200: {
type: "object",
properties: {
message: { type: "string" },
},
},
},
},
handler: (_, res) => {
res.send({ message: "Hello World" });
},
});It will load the routes defined in the routes directory and serve swagger.
Register the plugin and load routes:
import fastify from "fastify";
import convfastify from "convfastify";
const app = fastify({
logger: true,
});
app.register(
convfastify()
// Load routes
.loadFrom(`${__dirname}/routes/**/*.js`)
// Serving swagger
.serveSwagger()
// Register the plugin
.register()
);
app.listen({
port: 8080,
});On the files under the /routes directory:
import { route } from "convfastify";
export default route.define({
method: "GET",
url: "/",
schema: {
querystring: {
type: "object",
properties: {
foo: { type: "number" },
bar: { type: "string" },
},
required: ["foo", "bar"],
},
response: {
200: {
type: "object",
properties: {
message: { type: "string" },
},
},
},
},
handler: (req, res) => {
res.send({ message: "Hello World" });
},
});It will load the routes defined in the routes directory and serve swagger.
By default when you define routes, it is preconfigured to infer types using json-schema-to-ts, but you can use a different type provider.
Example:
import { route } from "convfastify";
import { TypeBoxTypeProvider, Type } from "@fastify/type-provider-typebox";
export default route.withType<TypeBoxTypeProvider>().define({
url: "/",
method: "GET",
schema: {
querystring: Type.Object({
name: Type.String(),
}),
response: {
200: Type.Object({
name: Type.String(),
}),
},
},
handler: (req, res) => {
res.send({ name: req.query.name });
},
});This guide is intended to help with migration from convfastify v1 to v2.
To support different type providers, route is not a function you can call directly but an object.
To migrate it with minimal effort:
- Create a file
src/route.ts
import { route as convroute } from "convfastify";
import { TypeBoxTypeProvider } from "@fastify/type-provider-typebox";
// NOTE: in this example we are using `TypeBoxTypeProvider` but you can use any provider
export const route = convroute.withType<TypeBoxTypeProvider>().define;Now you can import route from the /src/route.ts instead of convfastify directly on all of your routes
This method allows loading routes from a specified path or glob pattern.
This method allows serving swagger for the loaded routes. It accepts configuration for swagger and swaggerUi.
This method allows you to register the plugin to your fastify application.
It accepts configuration object for the plugin.
esm: set it to true if you are using esm module resolution