/* Usage: const withMDX = require("@next/mdx")({ options: { remarkPlugins: [ withProse, ], }, }); */ const proseComponents = ["Heading"]; const isJsNode = (node) => { return ( ["jsx", "import", "export"].includes(node.type) && !/^<[a-z]+(>|\s)/.test(node.value) && !new RegExp(`^<(${proseComponents.join("|")})(>|\\s)`).test(node.value) ); }; module.exports.withProse = () => { return (tree) => { let insideProse = false; tree.children = tree.children.flatMap((node, i) => { if (insideProse && isJsNode(node)) { insideProse = false; return [{ type: "jsx", value: "" }, node]; } if (!insideProse && !isJsNode(node)) { insideProse = true; return [ { type: "jsx", value: '
' }, node, ...(i === tree.children.length - 1 ? [{ type: "jsx", value: "
" }] : []), ]; } if (i === tree.children.length - 1 && insideProse) { return [node, { type: "jsx", value: "" }]; } return [node]; }); }; };