UNPKG

rasengan

Version:

The modern React Framework

81 lines (80 loc) 2.77 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { DefaultLayout } from '../components/template.js'; /** * This function adds metadata to a router * @param option * @returns */ export const defineRouter = (option) => { const { imports, layout, pages, loaderComponent, notFoundComponent, useParentLayout, } = option; return async (Router) => { // Handle errors // if (!option.pages) // throw new Error( // 'You must provide a list of pages in the router option object' // ); // Create router const router = new Router(); // List of pages component const pageComponentList = []; for (let p of pages ?? []) { // Check if p is an array if (Array.isArray(p)) { for (let page of p) { if (isMDXPage(page)) { const Page = await convertMDXPageToPageComponent(page); pageComponentList.push(Page); } else { pageComponentList.push(page); } } continue; } // When p is a MDXPageComponent if (isMDXPage(p)) { const Page = await convertMDXPageToPageComponent(p); pageComponentList.push(Page); } else { pageComponentList.push(p); } } let routers = await Promise.all(imports ?? []); // Set properties router.routers = routers; router.layout = layout || DefaultLayout; router.pages = pageComponentList; router.loaderComponent = loaderComponent || (() => null); router.notFoundComponent = notFoundComponent; router.useParentLayout = useParentLayout ?? true; return router; }; }; export const convertMDXPageToPageComponent = async (MDXPage) => { // Load MDXRenderer from @rasenganjs/mdx const MDXRenderer = await loadMDXRenderer(); const Page = () => { return _jsx(MDXRenderer, { className: '', children: MDXPage }); }; Page.path = MDXPage.metadata.path; Page.metadata = MDXPage.metadata.metadata; return Page; }; export const isMDXPage = (page) => { // Check if page is a MDX Page Component or not if (page.type === 'MDXPageComponent') { return true; } return false; }; const loadMDXRenderer = async () => { try { // @ts-ignore const { MDXRenderer } = await import('@rasenganjs/mdx'); return MDXRenderer; } catch (e) { throw new Error('Failed to load MDXRenderer component from @rasenganjs/mdx, make sure you have installed the package'); } };