Skip to content

TPEOficial/sprint

Repository files navigation

Sprint for Node.JS

Sprint - Quickly API

GitHub Kofi

Quickstart   •   Discord

Features

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();

File-based dynamic routing system

In this example, we generate a route called random with subroutes inside it.

📦example
 ┣ 📂middlewares
 ┃ ┗ 📜auth.js
 ┣ 📂routes
 ┃ ┗ 📜random.js
 ┗ 📜app.js

Define route

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;

Visual grouping of routes

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

Define middleware

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();
    }
});

Define Rate Limit

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

Use Logger

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

About

Sprint - Quickly API

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published