A server side router for the react server components era.
An experiment brought to you by dir.zip
Install the package
npm install @dir.zip/central-routerThen create the following files:
lib/router.tsx
import Router from "@dir.zip/central-router";
const router = new Router();
export default routerapp/[[...router]]/layout.tsx
import router from '../../lib/router'
export default async function Layout({
children,
}: {
children: React.ReactNode;
}) {
return await router.initLayout({children})
}app/[[...router]]/page.tsx
import router from "../../lib/router";
export default async function Page({params}: {params: {"1up": string[]} }) {
const getParams = params["1up"];
router.addRoute("/", async() => {
return <div>This is a test without a layout</div>
})
return router.init(getParams);
}app/api/[[...router]]/route.ts
import router from '../../lib/router';
const routes = router.initApiRoute()
export const { GET, POST, PUT, DELETE, PATCH } = routes;You can add routes inside the catch all page that you initially created. You can either create a route that returns a JSX element or a Response for api routes.
| Name | Description |
|---|---|
| path | The path for a route. Can contain url parameters like /:slug. These are fully typed. |
| handler | An async function that either returns a JSX element or Response. |
| type | Can either be a page or api route. |
The type accepts a string of either page or (api:GET | api:POST | api:PATCH | api:DELETE | api:PUT)
If you use any of the api types, the path will automatically be prefixed with /api/.... By default, if you don't provide a type it will be considered a page and expect a JSX element.
Wrap routes with a layout. Set the path for which routes the layout should wrap. Accepts an async function that returns a JSX element. For example, you can use layouts to check auth status.
🥸 Tip for you: You can wrap api routes by creating a layout with the path set to /api/*
| Name | Description |
|---|---|
| path | The path for a route. Can contain url parameters like /:slug, and wildcards like /:slug/* |
| handler | An async function that either returns a JSX element |
- Because of the nature of this library, it can only be used with a server. Since there is only 1 wildcard route, static exports will not work (for now). We can explore this with a generator that reads your routes.
- You must use the
[[..1up]]folder names