Baku

Baku - [漠] means pico in Sinosphere is a router using URLPattern for Deno.

import { Router } from "https://deno.land/x/baku/mod.ts";

const router = Router();
router.get("/", () => new Response("Hello Baku!"));

Deno.serve(router.handle);

Motivation

Some routing libraies like Hono and Oak work on Deno.
But they aren't desinged for Deno.serve().

Baku is a primitive router designed for that.
To be accurate, this is an extension of Deno.serveHandler with built-in routing.
Baku fulfills demands like wanting to use Deno.ServeHandlerInfo.

API

router.[method](path, handler)

Register a handler for the given path and method.

method: get, post, put, delete.

// GET /user/:id
router.get("/user/:id", (req) => {
  return new Response(`Your id is ${req.params?.id}`);
});

router.on(method, path, handler)

Register a handler for the given path and method.

router.on("PURGE", "/cache", () => {
  return new Response("Cache purged");
});

req.params()

Get path parameters.

// GET /user/:id
router.get("/user/:id", (req) => {
  return new Response(`Your id is ${req.params?.id}`);
  // => Your id is 123
});

req.query()

Get query parameters.

// GET /search?q=hello
router.get("/search", (req) => {
  return new Response(`Your query is ${req.query?.q}`);
  // => Your query is hello
});

Example

import {
  createResponse,
  json,
  notFound,
  redirect,
  Router,
  text,
} from "https://deno.land/x/baku/mod.ts";

// create a router object, `new` is not needed
const router = Router();

// handle a GET request and return a TEXT response
router.get("/", () => text("Hello Baku"));

// capture path parameters and return a JSON response
router.get("/user/:id", (req) => {
  return text(`Your id is ${req.params?.id}`);
});

// return a primitive Response object
router.get("/money", () => {
  const res = createResponse();
  res.status(402);
  return res.text("Payment required");
});

// capture path parameters with RegExp
router.get("/post/:date(\\d+)/:title([a-z]+)", (req) => {
  const { date, title } = req.params as { date: string; title: string };
  return json({ post: { date, title } });
});

// get query parameters
router.get("/search", (req) => {
  const { q } = req.query as { q?: string };
  return text(`Your query is ${q}`);
});

// handle a PURGE method and return a Redirect response
router.on("PURGE", "/cache", () => redirect("/"));

// return client public IP
router.get("/ip", (_req, info) => {
  return text(info.remoteAddr.hostname);
});

// return a custom 404 response
router.all("*", () => notFound("Custom 404"));

Deno.serve(router.handle);