import type {Node as MdastNode} from 'unist' import type { Parent as MdastParent, Literal as MdastLiteral, BlockContent, DefinitionContent, PhrasingContent } from 'mdast' import type {ElementContent, Parent as HastParent} from 'hast' import type {Program} from 'estree-jsx' import type {Tag} from './lib/index.js' // Expose JavaScript API. export {mdxJsxFromMarkdown, mdxJsxToMarkdown} from './lib/index.js' // Expose options. export type {ToMarkdownOptions} from './lib/index.js' // Expose node types. /** * MDX JSX attribute value set to an expression. * * ```markdown * > | * ^^^ * ``` */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxAttributeValueExpression extends MdastLiteral { /** * Node type. */ type: 'mdxJsxAttributeValueExpression' data?: { /** * Program node from estree. */ // eslint-disable-next-line @typescript-eslint/ban-types estree?: Program | null | undefined } & MdastLiteral['data'] } /** * MDX JSX attribute as an expression. * * ```markdown * > | * ^^^^^^ * ``` */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxExpressionAttribute extends MdastLiteral { /** * Node type. */ type: 'mdxJsxExpressionAttribute' data?: { /** * Program node from estree. */ // eslint-disable-next-line @typescript-eslint/ban-types estree?: Program | null | undefined } & MdastLiteral['data'] } /** * MDX JSX attribute with a key. * * ```markdown * > | * ^^^^^ * ``` */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxAttribute extends MdastNode { /** * Node type. */ type: 'mdxJsxAttribute' /** * Attribute name. */ name: string /** * Attribute value. */ // eslint-disable-next-line @typescript-eslint/ban-types value?: MdxJsxAttributeValueExpression | string | null | undefined } /** * MDX JSX element node, occurring in flow (block). */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxFlowElement extends MdastParent { /** * Node type. */ type: 'mdxJsxFlowElement' /** * MDX JSX element name (`null` for fragments). */ // eslint-disable-next-line @typescript-eslint/ban-types name: string | null /** * MDX JSX element attributes. */ attributes: Array /** * Content. */ children: Array } /** * MDX JSX element node, occurring in text (phrasing). */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxTextElement extends MdastParent { /** * Node type. */ type: 'mdxJsxTextElement' /** * MDX JSX element name (`null` for fragments). */ // eslint-disable-next-line @typescript-eslint/ban-types name: string | null /** * MDX JSX element attributes. */ attributes: Array /** * Content. */ children: PhrasingContent[] } /** * MDX JSX element node, occurring in flow (block), for hast. */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxFlowElementHast extends HastParent { /** * Node type. */ type: 'mdxJsxFlowElement' /** * MDX JSX element name (`null` for fragments). */ // eslint-disable-next-line @typescript-eslint/ban-types name: string | null /** * MDX JSX element attributes. */ attributes: Array /** * Content. */ children: ElementContent[] } /** * MDX JSX element node, occurring in text (phrasing), for hast. */ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface MdxJsxTextElementHast extends HastParent { /** * Node type. */ type: 'mdxJsxTextElement' /** * MDX JSX element name (`null` for fragments). */ // eslint-disable-next-line @typescript-eslint/ban-types name: string | null /** * MDX JSX element attributes. */ attributes: Array /** * Content. */ children: ElementContent[] } // Add nodes to mdast content. declare module 'mdast' { // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface StaticPhrasingContentMap { /** * MDX JSX element node, occurring in text (phrasing). */ mdxJsxTextElement: MdxJsxTextElement } // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface BlockContentMap { /** * MDX JSX element node, occurring in flow (block). */ mdxJsxFlowElement: MdxJsxFlowElement } } // Add nodes to hast content. declare module 'hast' { // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface RootContentMap { /** * MDX JSX element node, occurring in text (phrasing). */ mdxJsxTextElement: MdxJsxTextElementHast /** * MDX JSX element node, occurring in flow (block). */ mdxJsxFlowElement: MdxJsxFlowElementHast } // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface ElementContentMap { /** * MDX JSX element node, occurring in text (phrasing). */ mdxJsxTextElement: MdxJsxTextElementHast /** * MDX JSX element node, occurring in flow (block). */ mdxJsxFlowElement: MdxJsxFlowElementHast } } // Add custom data tracked to turn markdown into a tree. declare module 'mdast-util-from-markdown' { // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface CompileData { /** * Current MDX JSX tag. */ mdxJsxTag?: Tag | undefined /** * Current stack of open MDX JSX tags. */ mdxJsxTagStack?: Tag[] | undefined } } // Add custom data tracked to turn a syntax tree into markdown. declare module 'mdast-util-to-markdown' { // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface ConstructNameMap { /** * Whole JSX element, in flow. * * ```markdown * > | * ^^^^^ * ``` */ mdxJsxFlowElement: 'mdxJsxFlowElement' /** * Whole JSX element, in text. * * ```markdown * > | a . * ^^^^^ * ``` */ mdxJsxTextElement: 'mdxJsxTextElement' } }