File System Router
JSTime provides a fast API for resolving routes against file-system paths. This API is primarily intended for library authors. At the moment only Next.js-style file-system routing is supported, but other styles may be added in the future.
Next.js-style
Section titled “Next.js-style”The FileSystemRouter class can resolve routes against a pages directory. (The Next.js 13 app directory is not yet supported.) Consider the following pages directory:
pages├── index.tsx├── settings.tsx├── blog│ ├── [slug].tsx│ └── index.tsx└── [[...catchall]].tsxThe FileSystemRouter can be used to resolve routes against this directory:
const router = new JSTime.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"}Query parameters will be parsed and returned in the query property.
router.match("/settings?foo=bar");
// =>{ filePath: "/Users/colinmcd94/Documents/jstime/fun/pages/settings.tsx", kind: "dynamic", name: "/settings", pathname: "/settings?foo=bar", src: "https://mydomain.com/_next/static/pages/settings.tsx" query: { foo: "bar" }}The router will automatically parse URL parameters and return them in the params property:
router.match("/blog/my-cool-post");
// =>{ filePath: "/Users/colinmcd94/Documents/jstime/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" }}The .match() method also accepts Request and Response objects. The url property will be used to resolve the route.
router.match(new Request("https://example.com/blog/my-cool-post"));The router will read the directory contents on initialization. To re-scan the files, use the .reload() method.
router.reload();Reference
Section titled “Reference”interface JSTime { class FileSystemRouter { constructor(params: { dir: string; style: "nextjs"; origin?: string; assetPrefix?: 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 }}