rasengan
Version:
The modern React Framework
81 lines (80 loc) • 2.77 kB
JavaScript
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');
}
};