Esta API está principalmente destinada a autores de bibliotecas. Por el momento solo se soporta el enrutamiento de sistema de archivos estilo Next.js, pero otros estilos pueden agregarse en el futuro.
Estilo Next.js
La clase FileSystemRouter puede resolver rutas contra un directorio pages. (El directorio app de Next.js 13 aún no es soportado.) Considera el siguiente directorio pages:
pages
├── index.tsx
├── settings.tsx
├── blog
│ ├── [slug].tsx
│ └── index.tsx
└── [[...catchall]].tsxEl FileSystemRouter se puede usar para resolver rutas contra este directorio:
const router = new Bun.FileSystemRouter({
style: "nextjs",
dir: "./pages",
origin: "https://mydomain.com",
assetPrefix: "_next/static/"
});
router.match("/");
// =>
{
filePath: "/path/to/pages/index.tsx",
kind: "exact",
name: "/",
pathname: "/",
src: "https://mydomain.com/_next/static/pages/index.tsx"
}Los parámetros de consulta se analizarán y devolverán en la propiedad query.
router.match("/settings?foo=bar");
// =>
{
filePath: "/Users/colinmcd94/Documents/bun/fun/pages/settings.tsx",
kind: "dynamic",
name: "/settings",
pathname: "/settings?foo=bar",
src: "https://mydomain.com/_next/static/pages/settings.tsx",
query: {
foo: "bar"
}
}El enrutador analizará automáticamente los parámetros de URL y los devolverá en la propiedad params:
router.match("/blog/my-cool-post");
// =>
{
filePath: "/Users/colinmcd94/Documents/bun/fun/pages/blog/[slug].tsx",
kind: "dynamic",
name: "/blog/[slug]",
pathname: "/blog/my-cool-post",
src: "https://mydomain.com/_next/static/pages/blog/[slug].tsx",
params: {
slug: "my-cool-post"
}
}El método .match() también acepta objetos Request y Response. La propiedad url se usará para resolver la ruta.
router.match(new Request("https://example.com/blog/my-cool-post"));El enrutador leerá el contenido del directorio en la inicialización. Para volver a escanear los archivos, usa el método .reload().
router.reload();Referencia
interface Bun {
class FileSystemRouter {
constructor(params: {
dir: string;
style: "nextjs";
origin?: string;
assetPrefix?: string;
fileExtensions?: string[];
});
reload(): void;
match(path: string | Request | Response): {
filePath: string;
kind: "exact" | "catch-all" | "optional-catch-all" | "dynamic";
name: string;
pathname: string;
src: string;
params?: Record<string, string>;
query?: Record<string, string>;
} | null
}
}