@netronk/mdx-remote
Version:
The remote MDX files adapter for Netronk Gen
104 lines (98 loc) • 2.51 kB
JavaScript
// 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
};