Sprint provides different modules depending on the required use.
| Feature | Status |
|---|---|
| File-based dynamic routing system | 🟢 Active |
| Advanced middleware system | 🟢 Active |
| Pre-established security policies | 🟢 Active |
| Native support for JSON, formatted and ready to use | 🟢 Active |
| CORS, Morgan, and similar modules preinstalled | 🟢 Active |
| Preconfigured health check and 404 error pages | 🟢 Active |
| Anti-directory listing rate limiting system | 🟢 Active |
| Logger module included to reduce memory consumption | 🟢 Active |
import Sprint from "sprint-es";
const app = new Sprint();
app.get("/", (req, res) => res.send("Hello World!"));
app.listen();In this example, we generate a route called random with subroutes inside it.
📦example
┣ 📂middlewares
┃ ┗ 📜auth.js
┣ 📂routes
┃ ┗ 📜random.js
┗ 📜app.js
We define a Router as we would in ExpressJS and export it to a file with the desired route name within the routes folder. Sprint will recognize it automatically.
import { Router } from "sprint-es";
const router = Router();
router.get("/", (req, res) => res.send("Hello World 2!"));
export default router;You can create folders with names in parentheses to group your routes more easily without affecting the path in the API URL.
📦routes
┣ 📂(auth)
┃ ┣ 📂(protected)
┃ ┃ ┣ 📂settings
┃ ┃ ┃ ┗ 📜index.js
┃ ┃ ┗ 📜profile.js
┃ ┗ 📜login.js
We export a defineMiddleware function in a file with the name of your choice in the middlewares folder. Sprint will recognize it automatically.
import { defineMiddleware } from "sprint-es";
export default defineMiddleware({
name: "admin",
priority: 20, // Runs after auth.
include: "/admin/**",
handler: (req, res, next) => {
if (!req.user) return res.status(401).json({ error: "Not authenticated" });
if (req.user.role !== "admin") {
console.log(`[Sprint Example: Admin] Access denied for user: ${req.user.name} (role: ${req.user.role})`);
return res.status(403).json({
error: "Forbidden",
message: "Admin access required"
});
}
console.log(`[Sprint Example: Admin] Admin access granted for: ${req.user.name}`);
next();
}
});import { defineMiddleware } from "sprint-es";
import { createRateLimit } from "sprint-es/rate-limit";
const ratelimitIp = createRateLimit(3, "5s", "ip", {
blockDuration: "1m"
});
export default defineMiddleware({
name: "rate-limit",
priority: 7, // Runs after logger.
include: "/**",
handler: async (req, res, next) => {
const { success, limit, remaining, reset } = await ratelimitIp.limit(req.ip);
if (!success) return res.status(429).send("Too many requests. Try again later.");
console.log(`Request allowed. Remaining: ${remaining}/${limit}`);
next();
}
});More info: https://docs.tpeoficial.com/docs/toolkitify/rate-limit/introduction
Logger is designed to reduce memory consumption when using console.logs. Using it will improve the performance of your API.
import { defineMiddleware } from "sprint-es";
import { logger } from "sprint-es/logger";
export default defineMiddleware({
name: "logger",
priority: 5, // Runs first.
include: "/**", // All routes.
handler: (req, res, next) => {
const start = Date.now();
res.on("finish", () => {
const duration = Date.now() - start;
logger.info(`${req.method} ${req.originalUrl} - ${res.statusCode} (${duration}ms)`);
});
next();
}
});More info: https://docs.tpeoficial.com/docs/toolkitify/logger/introduction