rasengan
Version:
The modern React Framework
81 lines (80 loc) • 2.99 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) => {
// 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 (page.source) {
pageComponentList.push(page);
continue;
}
// When p is a MDXPageComponent
// the "type" property holds the "MDXPageComponent" value, coming from @rasenganjs/mdx plugin
if (isMDXPage(page)) {
const Page = await convertMDXPageToPageComponent(page);
pageComponentList.push(Page);
}
else {
pageComponentList.push(page);
}
}
continue;
}
if (p.source) {
pageComponentList.push(p);
continue;
}
// When p is a MDXPageComponent
// type property holds the "MDXPageComponent" value, coming from @rasenganjs/mdx plugin
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;
};
};
/**
* This function helps to convert the data provided by @rasenganjs/mdx into a PageComponent component
* The MDXPage arg has to follow exactly the type returned by the @rasenganjs/mdx plugin
* @param MDXPage
* @returns
*/
export const convertMDXPageToPageComponent = async (MDXPage) => {
const Page = () => {
return (_jsx(MDXPage.Renderer, { config: MDXPage.config, toc: MDXPage.toc, raw: MDXPage.raw, children: MDXPage.Content }));
};
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;
};