Skip to content

Commit 4fdcf45

Browse files
authored
Use ESM
Closes GH-71. Reviewed-by: Christian Murphy <christian.murphy.42@gmail.com> Reviewed-by: Jonathan Haines <jonno.haines@gmail.com>
1 parent b053134 commit 4fdcf45

File tree

10 files changed

+129
-150
lines changed

10 files changed

+129
-150
lines changed

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
.DS_Store
22
*.log
3-
.nyc_output/
43
coverage/
54
node_modules/
6-
mdast-util-toc.js
7-
mdast-util-toc.min.js

example.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1+
// remark-usage-ignore-next
2+
import {inspect} from 'util'
3+
14
// Dependencies:
2-
var u = require('unist-builder')
3-
var toc = require('.')
5+
import {u} from 'unist-builder'
6+
import {toc} from './index.js'
47

5-
// Given a mdast tree:
6-
var tree = u('root', [
8+
// Now running:
9+
const tree = u('root', [
710
u('heading', {depth: 1}, [u('text', 'Alpha')]),
811
u('heading', {depth: 2}, [u('text', 'Bravo')]),
912
u('heading', {depth: 3}, [u('text', 'Charlie')]),
1013
u('heading', {depth: 2}, [u('text', 'Delta')])
1114
])
1215

13-
var table = toc(tree)
16+
const table = toc(tree)
1417

1518
// Yields:
16-
console.log('javascript', require('util').inspect(table, {depth: 3}))
19+
console.log('javascript', inspect(table, {depth: 3}))

index.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
'use strict'
2-
3-
module.exports = require('./lib')
1+
export {toc} from './lib/index.js'

lib/contents.js

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
'use strict'
2-
3-
var extend = require('extend')
4-
5-
module.exports = contents
1+
import extend from 'extend'
62

73
// Transform a list of heading objects to a markdown list.
8-
function contents(map, tight, prefix, ordered) {
9-
var table = {type: 'list', ordered: ordered, spread: false, children: []}
10-
var minDepth = Number.POSITIVE_INFINITY
11-
var index = -1
4+
export function contents(map, tight, prefix, ordered) {
5+
const table = {type: 'list', ordered, spread: false, children: []}
6+
let minDepth = Number.POSITIVE_INFINITY
7+
let index = -1
128

139
// Find minimum depth.
1410
while (++index < map.length) {
@@ -35,11 +31,11 @@ function contents(map, tight, prefix, ordered) {
3531
}
3632

3733
// Insert an entry into `parent`.
34+
// eslint-disable-next-line max-params
3835
function insert(entry, parent, tight, prefix, ordered) {
39-
var siblings = parent.children
40-
var tail = siblings[siblings.length - 1]
41-
var index = -1
42-
var item
36+
const siblings = parent.children
37+
const tail = siblings[siblings.length - 1]
38+
let index = -1
4339

4440
if (entry.depth === 1) {
4541
siblings.push({
@@ -65,13 +61,13 @@ function insert(entry, parent, tight, prefix, ordered) {
6561
entry.depth--
6662
insert(entry, tail, tight, prefix, ordered)
6763
} else if (parent.type === 'list') {
68-
item = {type: 'listItem', spread: false, children: []}
64+
const item = {type: 'listItem', spread: false, children: []}
6965
siblings.push(item)
7066
insert(entry, item, tight, prefix, ordered)
7167
} else {
72-
item = {
68+
const item = {
7369
type: 'list',
74-
ordered: ordered,
70+
ordered,
7571
spread: false,
7672
children: []
7773
}
@@ -95,8 +91,8 @@ function insert(entry, parent, tight, prefix, ordered) {
9591
}
9692

9793
function all(children) {
98-
var result = []
99-
var index = -1
94+
let result = []
95+
let index = -1
10096

10197
if (children) {
10298
while (++index < children.length) {
@@ -108,8 +104,6 @@ function all(children) {
108104
}
109105

110106
function one(node) {
111-
var copy
112-
113107
if (
114108
node.type === 'link' ||
115109
node.type === 'linkReference' ||
@@ -119,7 +113,7 @@ function one(node) {
119113
return all(node.children)
120114
}
121115

122-
copy = extend({}, node)
116+
let copy = extend({}, node)
123117

124118
delete copy.children
125119
delete copy.position

lib/index.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
1-
'use strict'
2-
3-
module.exports = toc
4-
5-
var search = require('./search')
6-
var contents = require('./contents')
7-
var toExpression = require('./to-expression')
1+
import {search} from './search.js'
2+
import {contents} from './contents.js'
3+
import {toExpression} from './to-expression.js'
84

95
// Get a TOC representation of `node`.
10-
function toc(node, options) {
11-
var settings = options || {}
12-
var heading = settings.heading ? toExpression(settings.heading) : null
13-
var result = search(node, heading, settings)
6+
export function toc(node, options) {
7+
const settings = options || {}
8+
const heading = settings.heading ? toExpression(settings.heading) : null
9+
const result = search(node, heading, settings)
1410

15-
result.map = result.map.length
16-
? contents(
17-
result.map,
18-
settings.tight,
19-
settings.prefix,
20-
settings.ordered || false
21-
)
22-
: null
11+
result.map =
12+
result.map.length > 0
13+
? contents(
14+
result.map,
15+
settings.tight,
16+
settings.prefix,
17+
settings.ordered || false
18+
)
19+
: null
2320

2421
// No given heading.
2522
if (!heading) {
26-
result.endIndex = result.index = null
23+
result.endIndex = null
24+
result.index = null
2725
}
2826

2927
return result

lib/search.js

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
1-
'use strict'
1+
import Slugger from 'github-slugger'
2+
import toString from 'mdast-util-to-string'
3+
import {visit} from 'unist-util-visit'
4+
import {convert} from 'unist-util-is'
5+
import {toExpression} from './to-expression.js'
26

3-
module.exports = search
4-
5-
var toString = require('mdast-util-to-string')
6-
var visit = require('unist-util-visit')
7-
var convert = require('unist-util-is/convert')
8-
var slugs = require('github-slugger')()
9-
var toExpression = require('./to-expression')
7+
const slugs = new Slugger()
108

119
// Search a node for a location.
12-
function search(root, expression, settings) {
13-
var skip = settings.skip && toExpression(settings.skip)
14-
var parents = convert(settings.parents || root)
15-
var map = []
16-
var index
17-
var endIndex
18-
var opening
10+
export function search(root, expression, settings) {
11+
const skip = settings.skip && toExpression(settings.skip)
12+
const parents = convert(settings.parents || root)
13+
const map = []
14+
let index
15+
let endIndex
16+
let opening
1917

2018
slugs.reset()
2119

@@ -25,16 +23,18 @@ function search(root, expression, settings) {
2523

2624
return {
2725
index: index || -1,
26+
// <sindresorhus/eslint-plugin-unicorn#980>
27+
// eslint-disable-next-line unicorn/explicit-length-check
2828
endIndex: index ? endIndex || root.children.length : -1,
29-
map: map
29+
map
3030
}
3131

3232
function onheading(node, position, parent) {
33-
var value = toString(node)
34-
/* istanbul ignore next - to do: remove this when `remark-attr` is up to
35-
* date w/ micromark. */
36-
var id = node.data && node.data.hProperties && node.data.hProperties.id
37-
var slug = slugs.slug(id || value)
33+
const value = toString(node)
34+
// Remove this when `remark-attr` is up to date w/ micromark.
35+
/* c8 ignore next */
36+
const id = node.data && node.data.hProperties && node.data.hProperties.id
37+
const slug = slugs.slug(id || value)
3838

3939
if (!parents(parent)) {
4040
return

lib/to-expression.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
'use strict'
2-
3-
module.exports = toExpression
4-
51
// Transform a string into an applicable expression.
6-
function toExpression(value) {
2+
export function toExpression(value) {
73
return new RegExp('^(' + value + ')$', 'i')
84
}

package.json

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
"Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)",
2626
"Jonathan Haines <jonno.haines@gmail.com> (https://barrythepenguin.github.io)"
2727
],
28+
"sideEffects": false,
29+
"type": "module",
30+
"main": "index.js",
2831
"types": "types/index.d.ts",
2932
"files": [
3033
"types/index.d.ts",
31-
"lib",
34+
"lib/",
3235
"index.js"
3336
],
3437
"dependencies": {
@@ -37,13 +40,12 @@
3740
"extend": "^3.0.2",
3841
"github-slugger": "^1.2.1",
3942
"mdast-util-to-string": "^2.0.0",
40-
"unist-util-is": "^4.0.0",
41-
"unist-util-visit": "^2.0.0"
43+
"unist-util-is": "^5.0.0",
44+
"unist-util-visit": "^3.0.0"
4245
},
4346
"devDependencies": {
44-
"browserify": "^17.0.0",
47+
"c8": "^7.0.0",
4548
"dtslint": "^4.0.0",
46-
"nyc": "^15.0.0",
4749
"prettier": "^2.0.0",
4850
"remark": "^13.0.0",
4951
"remark-attr": "^0.11.0",
@@ -54,27 +56,16 @@
5456
"remark-preset-wooorm": "^8.0.0",
5557
"remark-usage": "^9.0.0",
5658
"tape": "^5.0.0",
57-
"tinyify": "^3.0.0",
5859
"typescript": "^4.0.0",
5960
"unified": "^9.0.0",
60-
"unist-builder": "^2.0.0",
61-
"xo": "^0.38.0"
61+
"unist-builder": "^3.0.0",
62+
"xo": "^0.39.0"
6263
},
6364
"scripts": {
6465
"format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix",
65-
"build-bundle": "browserify . -s mdastUtilTOC > mdast-util-toc.js",
66-
"build-mangle": "browserify . -s mdastUtilTOC -p tinyify > mdast-util-toc.min.js",
67-
"build": "npm run build-bundle && npm run build-mangle",
68-
"test-api": "node test",
69-
"test-coverage": "nyc --reporter lcov tape test/index.js",
70-
"test-types": "dtslint types",
71-
"test": "npm run format && npm run build && npm run test-coverage && npm run test-types"
72-
},
73-
"nyc": {
74-
"check-coverage": true,
75-
"lines": 100,
76-
"functions": 100,
77-
"branches": 100
66+
"test-api": "node test/index.js",
67+
"test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov node test/index.js",
68+
"test": "npm run format && npm run test-coverage"
7869
},
7970
"prettier": {
8071
"tabWidth": 2,
@@ -86,16 +77,16 @@
8677
},
8778
"xo": {
8879
"prettier": true,
89-
"esnext": false,
90-
"rules": {
91-
"max-params": "off",
92-
"no-multi-assign": "off",
93-
"unicorn/explicit-length-check": "off",
94-
"unicorn/prefer-optional-catch-binding": "off"
95-
},
80+
"overrides": [
81+
{
82+
"files": "example.js",
83+
"rules": {
84+
"capitalized-comments": "off"
85+
}
86+
}
87+
],
9688
"ignores": [
97-
"types/",
98-
"mdast-util-toc.js"
89+
"types/"
9990
]
10091
},
10192
"remarkConfig": {

readme.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
## Install
1414

15+
This package is [ESM only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c):
16+
Node 12+ is needed to use it and it must be `import`ed instead of `require`d.
17+
1518
[npm][]:
1619

1720
```sh
@@ -23,21 +26,21 @@ npm install mdast-util-toc
2326
Dependencies:
2427

2528
```javascript
26-
var u = require('unist-builder')
27-
var toc = require('mdast-util-toc')
29+
import {u} from 'unist-builder'
30+
import {toc} from 'mdast-util-toc'
2831
```
2932

30-
Given a mdast tree:
33+
Now running:
3134

3235
```javascript
33-
var tree = u('root', [
36+
const tree = u('root', [
3437
u('heading', {depth: 1}, [u('text', 'Alpha')]),
3538
u('heading', {depth: 2}, [u('text', 'Bravo')]),
3639
u('heading', {depth: 3}, [u('text', 'Charlie')]),
3740
u('heading', {depth: 2}, [u('text', 'Delta')])
3841
])
3942

40-
var table = toc(tree)
43+
const table = toc(tree)
4144
```
4245

4346
Yields:
@@ -57,6 +60,9 @@ Yields:
5760

5861
## API
5962

63+
This package exports the following identifiers: `toc`.
64+
There is no default export.
65+
6066
### `toc(tree[, options])`
6167

6268
Generate a Table of Contents from a [tree][].

0 commit comments

Comments
 (0)