/// import type { Root } from 'mdast' import type { MdxjsEsm } from 'mdast-util-mdx' import { createJSXWithSpreadPropsNode, createNameSpaceImportNode, } from '../../utils/mdastUtils' export function DemoMdxPlugin() { return transformer function transformer(tree: Root, file: any) { const children = tree.children const addImports: MdxjsEsm[] = [] children.forEach((child, index) => { // find jsx node like: if (child.type === 'mdxJsxFlowElement' && child.name === 'Demo') { const srcAttr = child.attributes.find( (attr) => attr.type === 'mdxJsxAttribute' && attr.name === 'src' && typeof attr.value === 'string' ) const srcValue = srcAttr?.value if (srcValue) { const nextIndex = addImports.length const varName = `_demo${nextIndex}` // add import: // import * as varName from "${srcValue}?demo" addImports.push( createNameSpaceImportNode({ name: varName, from: `${srcValue}?demo`, }) ) // replace this node with: // children.splice( index, 1, createJSXWithSpreadPropsNode({ Component: 'Demo', props: varName }) ) } } }) children.unshift(...addImports) } }