UNPKG

@netronk/mdx-remote

Version:

The remote MDX files adapter for Netronk Gen

104 lines (98 loc) 2.51 kB
// src/compile.ts import { rehypeCode, remarkGfm, remarkHeading } from "@netronk/gen-core/mdx-plugins"; import rehypeImgSize from "rehype-img-size"; // src/processor.ts import { compile } from "@mdx-js/mdx"; import matter from "gray-matter"; // src/render.ts import React from "react"; async function renderMDX(compiled, scope, components) { let jsxRuntime; if (process.env.NODE_ENV === "production") { jsxRuntime = await import("react/jsx-runtime"); } else { jsxRuntime = await import("react/jsx-dev-runtime"); } const fullScope = { opts: jsxRuntime, ...scope }; const keys = Object.keys(fullScope); const values = Object.values(fullScope); const hydrateFn = Reflect.construct(Function, keys.concat(compiled)); const result = hydrateFn.apply(hydrateFn, values); return React.createElement(result.default, { components }); } // src/processor.ts function getCompileOptions(mdxOptions = {}) { return { development: process.env.NODE_ENV !== "production", ...mdxOptions, outputFormat: "function-body" }; } async function processMDX(source, options, scope = {}, components) { const { data: frontmatter, content } = matter(source); const file = await compile({ value: content }, getCompileOptions(options)); const compiled = String(file); return { vfile: file, content: await renderMDX(compiled, scope, components), frontmatter, toc: file.data.toc, scope }; } // src/utils.ts function pluginOption(def, options = []) { const list = def(Array.isArray(options) ? options : []).filter( Boolean ); if (typeof options === "function") { return options(list); } return list; } // src/compile.ts async function compileMDX(options) { const { mdxOptions = {} } = options; return processMDX( options.source, { ...mdxOptions, remarkPlugins: pluginOption( (v) => [ remarkGfm, [remarkHeading, mdxOptions.remarkHeadingOptions], ...v ], mdxOptions.remarkPlugins ), rehypePlugins: pluginOption( (v) => [ mdxOptions.rehypeCodeOptions !== false && [ rehypeCode, mdxOptions.rehypeCodeOptions ], [ rehypeImgSize, { dir: mdxOptions.imageDir ?? "./public" }, ...v ] ], mdxOptions.rehypePlugins ) }, options.scope, options.components ); } export { compileMDX };