4
4
* @typedef {import('mdast').HTML } HTML
5
5
* @typedef {import('mdast-util-mdx-expression').MDXFlowExpression } MDXFlowExpression
6
6
* @typedef {import('mdast-util-mdx-expression').MDXTextExpression } MDXTextExpression
7
- * @typedef { Root|Content } Node
8
- *
9
- * @typedef { string|number|boolean } MarkerParameterValue
10
- * @typedef {Record<string, MarkerParameterValue> } MarkerParameters
7
+ */
8
+
9
+ /**
10
+ * @typedef {Root | Content } Node
11
11
*
12
12
* @typedef Mdx1CommentNode
13
13
* @property {'comment' } type
14
14
* @property {string } value
15
15
*
16
+ * @typedef {string | number | boolean } MarkerParameterValue
17
+ * Value.
18
+ *
19
+ * If it looks like a number (to JavaScript), it’s cast as number.
20
+ * The strings `true` and `false` are turned into their corresponding
21
+ * booleans.
22
+ * The empty string is also considered the `true` boolean.
23
+ * @typedef {Record<string, MarkerParameterValue> } MarkerParameters
24
+ * Parameters.
25
+ *
16
26
* @typedef Marker
17
27
* Comment marker.
18
28
* @property {string } name
19
29
* Name of marker.
20
30
* @property {string } attributes
21
31
* Value after name.
22
- * @property {MarkerParameters| null } parameters
32
+ * @property {MarkerParameters | null } parameters
23
33
* Parsed attributes, with decimal numbers, `true`, and `false` are casted to
24
34
* numbers and booleans.
25
- * @property {HTML| Mdx1CommentNode| MDXFlowExpression| MDXTextExpression } node
35
+ * @property {HTML | Mdx1CommentNode | MDXFlowExpression | MDXTextExpression } node
26
36
* Reference to given node.
27
37
*/
28
38
@@ -34,12 +44,13 @@ const markerExpression = new RegExp(
34
44
'(\\s*<!--' + commentExpression . source + '-->\\s*)'
35
45
)
36
46
47
+ // To do: next major: replace `null` with `undefined` in API output.
37
48
/**
38
49
* Parse a comment marker.
39
50
*
40
51
* @param {unknown } value
41
52
* `Node` to parse.
42
- * @returns {Marker| null }
53
+ * @returns {Marker | null }
43
54
* Information, when applicable.
44
55
*/
45
56
export function commentMarker ( value ) {
@@ -52,7 +63,7 @@ export function commentMarker(value) {
52
63
value . type === 'mdxTextExpression' )
53
64
) {
54
65
let offset = 2
55
- /** @type {RegExpMatchArray| null| undefined } */
66
+ /** @type {RegExpMatchArray | null | undefined } */
56
67
let match
57
68
58
69
// @ts -expect-error: MDX@1
@@ -87,10 +98,12 @@ export function commentMarker(value) {
87
98
}
88
99
89
100
/**
90
- * Parse `value` into an object .
101
+ * Parse a string of “attributes” .
91
102
*
92
103
* @param {string } value
93
- * @returns {MarkerParameters|null }
104
+ * Attributes.
105
+ * @returns {MarkerParameters | null }
106
+ * Parameters.
94
107
*/
95
108
function parseParameters ( value ) {
96
109
/** @type {MarkerParameters } */
@@ -111,18 +124,20 @@ function parseParameters(value) {
111
124
* @param {string } $2
112
125
* @param {string } $3
113
126
* @param {string } $4
127
+ * @returns {string }
114
128
*/
115
129
// eslint-disable-next-line max-params
116
130
function replacer ( _ , $1 , $2 , $3 , $4 ) {
117
131
/** @type {MarkerParameterValue } */
118
132
let value = $2 || $3 || $4 || ''
133
+ const number = Number ( value )
119
134
120
135
if ( value === 'true' || value === '' ) {
121
136
value = true
122
137
} else if ( value === 'false' ) {
123
138
value = false
124
- } else if ( ! Number . isNaN ( Number ( value ) ) ) {
125
- value = Number ( value )
139
+ } else if ( ! Number . isNaN ( number ) ) {
140
+ value = number
126
141
}
127
142
128
143
parameters [ $1 ] = value
@@ -132,8 +147,12 @@ function parseParameters(value) {
132
147
}
133
148
134
149
/**
150
+ * Check if something looks like a node.
151
+ *
135
152
* @param {unknown } value
153
+ * Thing.
136
154
* @returns {value is Node }
155
+ * It’s a node!
137
156
*/
138
157
function isNode ( value ) {
139
158
return Boolean ( value && typeof value === 'object' && 'type' in value )
0 commit comments