@liveblocks/zenrouter
v1.0.17
Published
An opinionated HTTP router with typed path params, built-in body validation, and a clean auth model.
Downloads
2,023
Readme
@liveblocks/zenrouter
Zen Router is an opinionated API router with batteries included, encouraging patterns that remain maintainable as your application grows.
Installation
npm i @liveblocks/zenrouterPurpose
The main purpose of this router is to implement an API backend.
Quick start
import { object, string } from "decoders";
import { Router } from "@liveblocks/zenrouter";
const zen = new Router(/* ... */);
zen.route(
"GET /greet/<name>",
({ p }) => ({ result: `Hi, ${p.name}!` })
);
zen.route(
"POST /greet",
object({ name: string }),
({ body }) => ({
result: `Hi, ${body.name}!`,
})
);
export default zen;The Zen Router pipeline

Principles
Pragmatic
- Implementing real-world endpoints should be joyful, easy, and type-safe.
- All requests and responses are JSON by default.
- All error responses have at least an
{ error }key with a human-readable string. - You can throw any HTTP error to short-circuit a non-2xx response.
- JSON error responses for all known HTTP status codes, customizable per status code.
- CORS support is built-in with a sane
{ cors: true }default that applies to all endpoints in the router.OPTIONSroutes and responses are managed automatically.
Secure by default
- All requests must be authorized. Authorization is opt-out, not opt-in.
- All path params are verified and type-safe (
/foo/<bar>/<qux>available asp.barandp.qux), cannot be empty, and are URI-decoded automatically. - Input JSON bodies of POST requests must be validated, and are made available
as a fully-type safe
bodyin the handler. - All query strings are type-safely accessible (
/foo?abc=hiasq.abc).
Maintainable
- All route patterns are static, fully qualified, and thus greppable. No "base" prefix URL setup, which in practice makes codebases harder to navigate over time.
- Routes include the method in the definition (
zen.route("POST /v2/foo/bar")instead ofzen.post("/v2/foo/bar")). - No complex middlewares. Only the request context and auth functions can carry data alongside a request. No per-route middlewares, no monkey-patching of the request object.
- Default error handling is configurable per status code; individual handlers can always bypass it by throwing a custom Response.
License
Licensed under the Apache License 2.0, Copyright © 2021-present Liveblocks.
See LICENSE for more information.
