Skip to content

Commit 3b20ce6

Browse files
committed
Add JSDoc based types
1 parent 94d0af0 commit 3b20ce6

40 files changed

+566
-248
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.DS_Store
2+
*.d.ts
23
*.log
34
coverage/
45
node_modules/

lib/all.js

+25-7
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,44 @@
1+
/**
2+
* @typedef {import('unist').Node} Node
3+
* @typedef {import('unist').Parent} Parent
4+
* @typedef {import('./index.js').H} H
5+
* @typedef {import('./index.js').Content} Content
6+
*/
7+
18
import {one} from './one.js'
29

10+
/**
11+
* @param {H} h
12+
* @param {Node} parent
13+
*/
314
export function all(h, parent) {
15+
/** @type {Array.<Node>} */
16+
// @ts-ignore looks like a parent.
417
var nodes = parent.children || []
5-
var length = nodes.length
6-
var values = []
718
var index = -1
19+
/** @type {Array.<Content>} */
20+
var values = []
21+
/** @type {Content} */
822
var result
23+
/** @type {Content} */
924
var head
1025

11-
while (++index < length) {
26+
while (++index < nodes.length) {
27+
// @ts-ignore looks like a parent.
1228
result = one(h, nodes[index], parent)
1329

1430
if (result) {
1531
if (index && nodes[index - 1].type === 'break') {
16-
if (result.value) {
32+
if (result.type === 'text') {
1733
result.value = result.value.replace(/^\s+/, '')
1834
}
1935

20-
head = result.children && result.children[0]
36+
if (result.type === 'element') {
37+
head = result.children[0]
2138

22-
if (head && head.value) {
23-
head.value = head.value.replace(/^\s+/, '')
39+
if (head && head.type === 'text') {
40+
head.value = head.value.replace(/^\s+/, '')
41+
}
2442
}
2543
}
2644

lib/footer.js

+29-8
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,56 @@
1+
/**
2+
* @typedef {import('mdast').BlockContent} BlockContent
3+
* @typedef {import('mdast').FootnoteDefinition} FootnoteDefinition
4+
* @typedef {import('mdast').Link} Link
5+
* @typedef {import('mdast').ListItem} ListItem
6+
* @typedef {import('mdast').Paragraph} Paragraph
7+
* @typedef {import('./index.js').H} H
8+
*/
9+
110
import {thematicBreak} from './handlers/thematic-break.js'
211
import {list} from './handlers/list.js'
312
import {wrap} from './wrap.js'
413

14+
/**
15+
* @param {H} h
16+
*/
517
export function footer(h) {
618
var footnoteById = h.footnoteById
719
var footnoteOrder = h.footnoteOrder
8-
var length = footnoteOrder.length
920
var index = -1
21+
/** @type {Array.<ListItem>} */
1022
var listItems = []
23+
/** @type {FootnoteDefinition} */
1124
var def
25+
/** @type {Link} */
1226
var backReference
13-
var content
27+
/** @type {Paragraph} */
1428
var tail
29+
/** @type {Array.<BlockContent>} */
30+
var content
1531

16-
while (++index < length) {
32+
while (++index < footnoteOrder.length) {
1733
def = footnoteById[footnoteOrder[index].toUpperCase()]
1834

1935
if (!def) {
2036
continue
2137
}
2238

23-
content = def.children.concat()
24-
tail = content[content.length - 1]
39+
content = [...def.children]
2540
backReference = {
2641
type: 'link',
2742
url: '#fnref-' + def.identifier,
2843
data: {hProperties: {className: ['footnote-backref']}},
2944
children: [{type: 'text', value: '↩'}]
3045
}
3146

32-
if (!tail || tail.type !== 'paragraph') {
47+
if (
48+
content[content.length - 1] &&
49+
content[content.length - 1].type === 'paragraph'
50+
) {
51+
// @ts-ignore it’s a paragraph, TypeScript...
52+
tail = content[content.length - 1]
53+
} else {
3354
tail = {type: 'paragraph', children: []}
3455
content.push(tail)
3556
}
@@ -53,10 +74,10 @@ export function footer(h) {
5374
'div',
5475
{className: ['footnotes']},
5576
wrap(
56-
[
77+
[].concat(
5778
thematicBreak(h),
5879
list(h, {type: 'list', ordered: true, children: listItems})
59-
],
80+
),
6081
true
6182
)
6283
)

lib/handlers/blockquote.js

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1+
/**
2+
* @typedef {import('mdast').Blockquote} Blockquote
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {wrap} from '../wrap.js'
27
import {all} from '../all.js'
38

9+
/**
10+
* @type {Handler}
11+
* @param {Blockquote} node
12+
*/
413
export function blockquote(h, node) {
514
return h(node, 'blockquote', wrap(all(h, node), true))
615
}

lib/handlers/break.js

+11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
1+
/**
2+
* @typedef {import('unist').Node} Node
3+
* @typedef {import('mdast').Break} Break
4+
* @typedef {import('../index.js').Handler} Handler
5+
*/
6+
17
import {u} from 'unist-builder'
28

9+
/**
10+
* @type {Handler}
11+
* @param {Break} node
12+
* @returns {Array.<Node>}
13+
*/
314
export function hardBreak(h, node) {
415
return [h(node, 'br'), u('text', '\n')]
516
}

lib/handlers/code.js

+13
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
1+
/**
2+
* @typedef {import('mdast').Code} Code
3+
* @typedef {import('hast').Element} Element
4+
* @typedef {import('hast').Properties} Properties
5+
* @typedef {import('../index.js').Handler} Handler
6+
*/
7+
18
import {u} from 'unist-builder'
29

10+
/**
11+
* @type {Handler}
12+
* @param {Code} node
13+
*/
314
export function code(h, node) {
415
var value = node.value ? node.value + '\n' : ''
516
// To do: next major, use `node.lang` w/o regex, the splitting’s been going
617
// on for years in remark now.
718
var lang = node.lang && node.lang.match(/^[^ \t]+(?=[ \t]|$)/)
19+
/** @type {Properties} */
820
var props = {}
21+
/** @type {Element} */
922
var code
1023

1124
if (lang) {

lib/handlers/delete.js

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1+
/**
2+
* @typedef {import('mdast').Delete} Delete
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {all} from '../all.js'
27

8+
/**
9+
* @type {Handler}
10+
* @param {Delete} node
11+
*/
312
export function strikethrough(h, node) {
413
return h(node, 'del', all(h, node))
514
}

lib/handlers/emphasis.js

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1+
/**
2+
* @typedef {import('mdast').Emphasis} Emphasis
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {all} from '../all.js'
27

8+
/**
9+
* @type {Handler}
10+
* @param {Emphasis} node
11+
*/
312
export function emphasis(h, node) {
413
return h(node, 'em', all(h, node))
514
}

lib/handlers/footnote-reference.js

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1+
/**
2+
* @typedef {import('mdast').FootnoteReference} FootnoteReference
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {u} from 'unist-builder'
27

8+
/**
9+
* @type {Handler}
10+
* @param {FootnoteReference} node
11+
*/
312
export function footnoteReference(h, node) {
413
var footnoteOrder = h.footnoteOrder
514
var identifier = String(node.identifier)

lib/handlers/footnote.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1+
/**
2+
* @typedef {import('mdast').Footnote} Footnote
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {footnoteReference} from './footnote-reference.js'
27

8+
/**
9+
* @type {Handler}
10+
* @param {Footnote} node
11+
*/
312
export function footnote(h, node) {
413
var footnoteById = h.footnoteById
514
var footnoteOrder = h.footnoteOrder
6-
var identifier = 1
15+
var no = 1
16+
/** @type {string} */
17+
var identifier
718

8-
while (identifier in footnoteById) {
9-
identifier++
10-
}
19+
while (no in footnoteById) no++
1120

12-
identifier = String(identifier)
21+
identifier = String(no)
1322

1423
// No need to check if `identifier` exists in `footnoteOrder`, it’s guaranteed
1524
// to not exist because we just generated it.

lib/handlers/heading.js

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1+
/**
2+
* @typedef {import('mdast').Heading} Heading
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {all} from '../all.js'
27

8+
/**
9+
* @type {Handler}
10+
* @param {Heading} node
11+
*/
312
export function heading(h, node) {
413
return h(node, 'h' + node.depth, all(h, node))
514
}

lib/handlers/html.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1+
/**
2+
* @typedef {import('mdast').HTML} HTML
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {u} from 'unist-builder'
27

3-
// Return either a `raw` node in dangerous mode, otherwise nothing.
8+
/**
9+
* Return either a `raw` node in dangerous mode, otherwise nothing.
10+
*
11+
* @type {Handler}
12+
* @param {HTML} node
13+
*/
414
export function html(h, node) {
15+
// @ts-ignore non-standard raw nodes.
516
return h.dangerous ? h.augment(node, u('raw', node.value)) : null
617
}

lib/handlers/image-reference.js

+11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1+
/**
2+
* @typedef {import('mdast').ImageReference} ImageReference
3+
* @typedef {import('hast').Properties} Properties
4+
* @typedef {import('../index.js').Handler} Handler
5+
*/
6+
17
import normalize from 'mdurl/encode.js'
28
import {revert} from '../revert.js'
39

10+
/**
11+
* @type {Handler}
12+
* @param {ImageReference} node
13+
*/
414
export function imageReference(h, node) {
515
var def = h.definition(node.identifier)
16+
/** @type {Properties} */
617
var props
718

819
if (!def) {

lib/handlers/image.js

+11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1+
/**
2+
* @typedef {import('mdast').Image} Image
3+
* @typedef {import('hast').Properties} Properties
4+
* @typedef {import('../index.js').Handler} Handler
5+
*/
6+
17
import normalize from 'mdurl/encode.js'
28

9+
/**
10+
* @type {Handler}
11+
* @param {Image} node
12+
*/
313
export function image(h, node) {
14+
/** @type {Properties} */
415
var props = {src: normalize(node.url), alt: node.alt}
516

617
if (node.title !== null && node.title !== undefined) {

lib/handlers/inline-code.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1+
/**
2+
* @typedef {import('mdast').InlineCode} InlineCode
3+
* @typedef {import('../index.js').Handler} Handler
4+
*/
5+
16
import {u} from 'unist-builder'
27

8+
/**
9+
* @type {Handler}
10+
* @param {InlineCode} node
11+
*/
312
export function inlineCode(h, node) {
4-
var value = node.value.replace(/\r?\n|\r/g, ' ')
5-
return h(node, 'code', [u('text', value)])
13+
return h(node, 'code', [u('text', node.value.replace(/\r?\n|\r/g, ' '))])
614
}

lib/handlers/link-reference.js

+11
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1+
/**
2+
* @typedef {import('mdast').LinkReference} LinkReference
3+
* @typedef {import('hast').Properties} Properties
4+
* @typedef {import('../index.js').Handler} Handler
5+
*/
6+
17
import normalize from 'mdurl/encode.js'
28
import {revert} from '../revert.js'
39
import {all} from '../all.js'
410

11+
/**
12+
* @type {Handler}
13+
* @param {LinkReference} node
14+
*/
515
export function linkReference(h, node) {
616
var def = h.definition(node.identifier)
17+
/** @type {Properties} */
718
var props
819

920
if (!def) {

lib/handlers/link.js

+11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
1+
/**
2+
* @typedef {import('mdast').Link} Link
3+
* @typedef {import('hast').Properties} Properties
4+
* @typedef {import('../index.js').Handler} Handler
5+
*/
6+
17
import normalize from 'mdurl/encode.js'
28
import {all} from '../all.js'
39

10+
/**
11+
* @type {Handler}
12+
* @param {Link} node
13+
*/
414
export function link(h, node) {
15+
/** @type {Properties} */
516
var props = {href: normalize(node.url)}
617

718
if (node.title !== null && node.title !== undefined) {

0 commit comments

Comments
 (0)