file-router-react
Version:
File-based routing for React using wouter.
79 lines (78 loc) • 2.64 kB
JavaScript
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 [];
}