UNPKG

file-router-react

Version:

File-based routing for React using wouter.

79 lines (78 loc) 2.64 kB
import { filenameToRoute } from "./utils"; /** * Create routes from Vite's import.meta.glob. * * @param modules - The result from import.meta.glob * @returns Array of route configurations * * @example * ```typescript * import { createViteRoutes, FileRouter } from 'file-router-react'; * * const modules = import.meta.glob('./pages/**\/*.{tsx,jsx}', { eager: true }); * const routes = createViteRoutes(modules); * * function App() { * return <FileRouter routes={routes} />; * } * ``` */ export function createViteRoutes(modules) { return Object.entries(modules).map(([key, module]) => { // Clean up the path to get just the relative path from pages directory let cleanPath = key .replace(/.*\/pages\//, '') // Remove everything before /pages/ .replace(/^\/?pages\//, '') // Remove leading pages/ if present .replace(/^\.\//, '') // Remove leading ./ .replace(/^\//, ''); // Remove leading / return { path: filenameToRoute(cleanPath), component: module.default, }; }); } /** * Create routes from webpack's require.context. * * @param requireContext - The webpack require.context result * @returns Array of route configurations */ export function createWebpackRoutes(requireContext) { return requireContext.keys().map((key) => ({ path: filenameToRoute(key.replace('./', '')), component: requireContext(key).default, })); } /** * Auto-detect and create routes based on your bundler environment. * * @param viteModules - Optional: result from import.meta.glob for Vite projects * @returns Array of route configurations */ export function createFileRoutes(viteModules) { // If Vite modules are provided, use them if (viteModules) { return createViteRoutes(viteModules); } // Try webpack require.context try { if (typeof require !== 'undefined' && require.context) { // Try different possible page directories const possiblePaths = ['./pages', './src/pages']; for (const path of possiblePaths) { try { const ctx = require.context(path, true, /\.(tsx|jsx)$/); return createWebpackRoutes(ctx); } catch (e) { // Continue to next path } } } } catch (error) { // Webpack not available } console.warn('file-router-react: Could not auto-detect pages. For Vite projects, please pass import.meta.glob result to createFileRoutes()'); return []; }