Skip to content

Commit e2c7e62

Browse files
committed
Refactor to move implementation to lib/
1 parent e569ca1 commit e2c7e62

File tree

5 files changed

+72
-72
lines changed

5 files changed

+72
-72
lines changed

Diff for: index.js

+1-68
Original file line numberDiff line numberDiff line change
@@ -1,68 +1 @@
1-
/**
2-
* @typedef {import('hast').Properties} Properties
3-
* @typedef {import('hast').Element} Element
4-
*/
5-
6-
const search = /[#.]/g
7-
8-
/**
9-
* Create a hast element from a simple CSS selector.
10-
*
11-
* @template {string} Selector
12-
* Type of selector.
13-
* @template {string} [DefaultTagName='div']
14-
* Type of default tag name.
15-
* @param {Selector | null | undefined} [selector]
16-
* A simple CSS selector.
17-
*
18-
* Can contain a tag-name (`foo`), classes (`.bar`), and an ID (`#baz`).
19-
* Multiple classes are allowed.
20-
* Uses the last ID if multiple IDs are found.
21-
* @param {DefaultTagName | null | undefined} [defaultTagName='div']
22-
* Tag name to use if `selector` does not specify one (default: `'div'`).
23-
* @returns {Element & {tagName: import('./extract.js').ExtractTagName<Selector, DefaultTagName>}}
24-
* Built element.
25-
*/
26-
export function parseSelector(selector, defaultTagName) {
27-
const value = selector || ''
28-
/** @type {Properties} */
29-
const props = {}
30-
let start = 0
31-
/** @type {string | undefined} */
32-
let previous
33-
/** @type {string | undefined} */
34-
let tagName
35-
36-
while (start < value.length) {
37-
search.lastIndex = start
38-
const match = search.exec(value)
39-
const subvalue = value.slice(start, match ? match.index : value.length)
40-
41-
if (subvalue) {
42-
if (!previous) {
43-
tagName = subvalue
44-
} else if (previous === '#') {
45-
props.id = subvalue
46-
} else if (Array.isArray(props.className)) {
47-
props.className.push(subvalue)
48-
} else {
49-
props.className = [subvalue]
50-
}
51-
52-
start += subvalue.length
53-
}
54-
55-
if (match) {
56-
previous = match[0]
57-
start++
58-
}
59-
}
60-
61-
return {
62-
type: 'element',
63-
// @ts-expect-error: fine.
64-
tagName: tagName || defaultTagName || 'div',
65-
properties: props,
66-
children: []
67-
}
68-
}
1+
export {parseSelector} from './lib/index.js'
File renamed without changes.

Diff for: extract.ts renamed to lib/extract.ts

File renamed without changes.

Diff for: lib/index.js

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* @typedef {import('hast').Properties} Properties
3+
* @typedef {import('hast').Element} Element
4+
*/
5+
6+
const search = /[#.]/g
7+
8+
/**
9+
* Create a hast element from a simple CSS selector.
10+
*
11+
* @template {string} Selector
12+
* Type of selector.
13+
* @template {string} [DefaultTagName='div']
14+
* Type of default tag name.
15+
* @param {Selector | null | undefined} [selector]
16+
* A simple CSS selector.
17+
*
18+
* Can contain a tag-name (`foo`), classes (`.bar`), and an ID (`#baz`).
19+
* Multiple classes are allowed.
20+
* Uses the last ID if multiple IDs are found.
21+
* @param {DefaultTagName | null | undefined} [defaultTagName='div']
22+
* Tag name to use if `selector` does not specify one (default: `'div'`).
23+
* @returns {Element & {tagName: import('./extract.js').ExtractTagName<Selector, DefaultTagName>}}
24+
* Built element.
25+
*/
26+
export function parseSelector(selector, defaultTagName) {
27+
const value = selector || ''
28+
/** @type {Properties} */
29+
const props = {}
30+
let start = 0
31+
/** @type {string | undefined} */
32+
let previous
33+
/** @type {string | undefined} */
34+
let tagName
35+
36+
while (start < value.length) {
37+
search.lastIndex = start
38+
const match = search.exec(value)
39+
const subvalue = value.slice(start, match ? match.index : value.length)
40+
41+
if (subvalue) {
42+
if (!previous) {
43+
tagName = subvalue
44+
} else if (previous === '#') {
45+
props.id = subvalue
46+
} else if (Array.isArray(props.className)) {
47+
props.className.push(subvalue)
48+
} else {
49+
props.className = [subvalue]
50+
}
51+
52+
start += subvalue.length
53+
}
54+
55+
if (match) {
56+
previous = match[0]
57+
start++
58+
}
59+
}
60+
61+
return {
62+
type: 'element',
63+
// @ts-expect-error: fine.
64+
tagName: tagName || defaultTagName || 'div',
65+
properties: props,
66+
children: []
67+
}
68+
}

Diff for: package.json

+3-4
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,13 @@
3030
"types": "index.d.ts",
3131
"typesVersions": {
3232
"<=4.1": {
33-
"extract.d.ts": [
34-
"extract-legacy.d.ts"
33+
"lib/extract.d.ts": [
34+
"lib/extract-legacy.d.ts"
3535
]
3636
}
3737
},
3838
"files": [
39-
"extract-legacy.d.ts",
40-
"extract.d.ts",
39+
"lib/",
4140
"index.d.ts",
4241
"index.js"
4342
],

0 commit comments

Comments
 (0)