UNPKG

fumadocs-mdx

Version:

The built-in source for Fumadocs

125 lines (121 loc) 3 kB
// src/utils/mdx-options.ts import * as plugins from "fumadocs-core/mdx-plugins"; // src/mdx-plugins/remark-exports.ts import { valueToEstree } from "estree-util-value-to-estree"; function remarkMdxExport({ values }) { return (tree, vfile) => { for (const name of values) { if (!(name in vfile.data)) return; tree.children.unshift(getMdastExport(name, vfile.data[name])); } }; } function getMdastExport(name, value) { return { type: "mdxjsEsm", value: "", data: { estree: { type: "Program", sourceType: "module", body: [ { type: "ExportNamedDeclaration", specifiers: [], source: null, declaration: { type: "VariableDeclaration", kind: "let", declarations: [ { type: "VariableDeclarator", id: { type: "Identifier", name }, init: valueToEstree(value) } ] } } ] } } }; } // src/utils/mdx-options.ts function pluginOption(def, options = []) { const list = def(Array.isArray(options) ? options : []).filter( Boolean ); if (typeof options === "function") { return options(list); } return list; } function getDefaultMDXOptions({ valueToExport = [], rehypeCodeOptions, remarkImageOptions, remarkHeadingOptions, remarkStructureOptions, remarkCodeTabOptions, remarkNpmOptions, _withoutBundler = false, ...mdxOptions }) { const mdxExports = [ "structuredData", "frontmatter", "lastModified", ...valueToExport ]; const remarkPlugins = pluginOption( (v) => [ plugins.remarkGfm, [ plugins.remarkHeading, { generateToc: false, ...remarkHeadingOptions } ], remarkImageOptions !== false && [ plugins.remarkImage, { ...remarkImageOptions, useImport: _withoutBundler ? false : remarkImageOptions?.useImport } ], "remarkCodeTab" in plugins && remarkCodeTabOptions !== false && [ plugins.remarkCodeTab, remarkCodeTabOptions ], "remarkNpm" in plugins && remarkNpmOptions !== false && [plugins.remarkNpm, remarkNpmOptions], ...v, remarkStructureOptions !== false && [ plugins.remarkStructure, remarkStructureOptions ], [remarkMdxExport, { values: mdxExports }] ], mdxOptions.remarkPlugins ); const rehypePlugins = pluginOption( (v) => [ rehypeCodeOptions !== false && [plugins.rehypeCode, rehypeCodeOptions], ...v, plugins.rehypeToc ], mdxOptions.rehypePlugins ); return { ...mdxOptions, outputFormat: _withoutBundler ? "function-body" : mdxOptions.outputFormat, remarkPlugins, rehypePlugins }; } export { getDefaultMDXOptions };