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
+
1
13
import stripIndent from 'strip-indent'
2
14
3
15
const eol = / \r ? \n | \r / g
4
16
17
+ /** @type {FromMarkdownExtension } */
5
18
export const mdxExpressionFromMarkdown = {
6
19
enter : {
7
20
mdxFlowExpression : enterMdxFlowExpression ,
@@ -15,6 +28,7 @@ export const mdxExpressionFromMarkdown = {
15
28
}
16
29
}
17
30
31
+ /** @type {ToMarkdownExtension } */
18
32
export const mdxExpressionToMarkdown = {
19
33
handlers : {
20
34
mdxFlowExpression : handleMdxExpression ,
@@ -26,37 +40,53 @@ export const mdxExpressionToMarkdown = {
26
40
]
27
41
}
28
42
43
+ /** @type {FromMarkdownHandle } */
29
44
function enterMdxFlowExpression ( token ) {
45
+ // @ts -expect-error: fine.
30
46
this . enter ( { type : 'mdxFlowExpression' , value : '' } , token )
31
47
this . buffer ( )
32
48
}
33
49
50
+ /** @type {FromMarkdownHandle } */
34
51
function enterMdxTextExpression ( token ) {
52
+ // @ts -expect-error: fine.
35
53
this . enter ( { type : 'mdxTextExpression' , value : '' } , token )
36
54
this . buffer ( )
37
55
}
38
56
57
+ /** @type {FromMarkdownHandle } */
39
58
function exitMdxExpression ( token ) {
40
59
const value = this . resume ( )
41
60
const node = this . exit ( token )
42
61
43
62
node . value = token . type === 'mdxFlowExpression' ? dedent ( value ) : value
44
63
64
+ // @ts -expect-error: estree.
45
65
if ( token . estree ) {
66
+ // @ts -expect-error: estree.
46
67
node . data = { estree : token . estree }
47
68
}
48
69
}
49
70
71
+ /** @type {FromMarkdownHandle } */
50
72
function exitMdxExpressionData ( token ) {
51
73
this . config . enter . data . call ( this , token )
52
74
this . config . exit . data . call ( this , token )
53
75
}
54
76
77
+ /**
78
+ * @type {ToMarkdownHandle }
79
+ * @param {MDXFlowExpression|MDXSpanExpression } node
80
+ */
55
81
function handleMdxExpression ( node ) {
56
82
const value = node . value || ''
57
83
return '{' + ( node . type === 'mdxFlowExpression' ? indent ( value ) : value ) + '}'
58
84
}
59
85
86
+ /**
87
+ * @param {string } value
88
+ * @returns {string }
89
+ */
60
90
function dedent ( value ) {
61
91
const firstLineEnding = / \r ? \n | \r / . exec ( value )
62
92
const position = firstLineEnding
@@ -70,10 +100,16 @@ function dedent(value) {
70
100
return value
71
101
}
72
102
103
+ /**
104
+ * @param {string } value
105
+ * @returns {string }
106
+ */
73
107
function indent ( value ) {
108
+ /** @type {Array.<string> } */
74
109
const result = [ ]
75
110
let start = 0
76
111
let line = 0
112
+ /** @type {RegExpExecArray|null } */
77
113
let match
78
114
79
115
while ( ( match = eol . exec ( value ) ) ) {
@@ -87,6 +123,10 @@ function indent(value) {
87
123
88
124
return result . join ( '' )
89
125
126
+ /**
127
+ * @param {string } slice
128
+ * @returns {void }
129
+ */
90
130
function one ( slice ) {
91
131
result . push ( ( line && slice ? ' ' : '' ) + slice )
92
132
}
0 commit comments