1+ /**
2+ * @typedef {import('mdast').Literal } Literal
3+ * @typedef {import('mdast-util-from-markdown').Extension } FromMarkdownExtension
4+ * @typedef {import('mdast-util-from-markdown').Handle } FromMarkdownHandle
5+ * @typedef {import('mdast-util-to-markdown').Options } ToMarkdownExtension
6+ * @typedef {import('mdast-util-to-markdown').Handle } ToMarkdownHandle
7+ * @typedef {import('estree-jsx').Program } Estree
8+ *
9+ * @typedef {Literal & {type: 'mdxFlowExpression', data: {estree?: Estree}} } MDXFlowExpression
10+ * @typedef {Literal & {type: 'mdxSpanExpression', data: {estree?: Estree}} } MDXSpanExpression
11+ */
12+
113import stripIndent from 'strip-indent'
214
315const eol = / \r ? \n | \r / g
416
17+ /** @type {FromMarkdownExtension } */
518export const mdxExpressionFromMarkdown = {
619 enter : {
720 mdxFlowExpression : enterMdxFlowExpression ,
@@ -15,6 +28,7 @@ export const mdxExpressionFromMarkdown = {
1528 }
1629}
1730
31+ /** @type {ToMarkdownExtension } */
1832export const mdxExpressionToMarkdown = {
1933 handlers : {
2034 mdxFlowExpression : handleMdxExpression ,
@@ -26,37 +40,53 @@ export const mdxExpressionToMarkdown = {
2640 ]
2741}
2842
43+ /** @type {FromMarkdownHandle } */
2944function enterMdxFlowExpression ( token ) {
45+ // @ts -expect-error: fine.
3046 this . enter ( { type : 'mdxFlowExpression' , value : '' } , token )
3147 this . buffer ( )
3248}
3349
50+ /** @type {FromMarkdownHandle } */
3451function enterMdxTextExpression ( token ) {
52+ // @ts -expect-error: fine.
3553 this . enter ( { type : 'mdxTextExpression' , value : '' } , token )
3654 this . buffer ( )
3755}
3856
57+ /** @type {FromMarkdownHandle } */
3958function exitMdxExpression ( token ) {
4059 const value = this . resume ( )
4160 const node = this . exit ( token )
4261
4362 node . value = token . type === 'mdxFlowExpression' ? dedent ( value ) : value
4463
64+ // @ts -expect-error: estree.
4565 if ( token . estree ) {
66+ // @ts -expect-error: estree.
4667 node . data = { estree : token . estree }
4768 }
4869}
4970
71+ /** @type {FromMarkdownHandle } */
5072function exitMdxExpressionData ( token ) {
5173 this . config . enter . data . call ( this , token )
5274 this . config . exit . data . call ( this , token )
5375}
5476
77+ /**
78+ * @type {ToMarkdownHandle }
79+ * @param {MDXFlowExpression|MDXSpanExpression } node
80+ */
5581function handleMdxExpression ( node ) {
5682 const value = node . value || ''
5783 return '{' + ( node . type === 'mdxFlowExpression' ? indent ( value ) : value ) + '}'
5884}
5985
86+ /**
87+ * @param {string } value
88+ * @returns {string }
89+ */
6090function dedent ( value ) {
6191 const firstLineEnding = / \r ? \n | \r / . exec ( value )
6292 const position = firstLineEnding
@@ -70,10 +100,16 @@ function dedent(value) {
70100 return value
71101}
72102
103+ /**
104+ * @param {string } value
105+ * @returns {string }
106+ */
73107function indent ( value ) {
108+ /** @type {Array.<string> } */
74109 const result = [ ]
75110 let start = 0
76111 let line = 0
112+ /** @type {RegExpExecArray|null } */
77113 let match
78114
79115 while ( ( match = eol . exec ( value ) ) ) {
@@ -87,6 +123,10 @@ function indent(value) {
87123
88124 return result . join ( '' )
89125
126+ /**
127+ * @param {string } slice
128+ * @returns {void }
129+ */
90130 function one ( slice ) {
91131 result . push ( ( line && slice ? ' ' : '' ) + slice )
92132 }
0 commit comments