Skip to content

Commit e3fa3b1

Browse files
committed
Fix: #id selector does not work in :of()
1 parent 2060bc2 commit e3fa3b1

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

packages/core/src/utils/generate-selector.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ const prefixMap: Record<string, string> = {
66
'pseudo-class': ':',
77
'pseudo-element': '::',
88
'attribute': '',
9-
'combinator': ''
9+
'combinator': '',
10+
'id': '#',
1011
}
1112

1213
export default function generateSelector(nodes: SelectorNode[], body = ''): string {

packages/core/src/utils/parse-selector.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import MasterCSS from '../core'
33
import parsePair from './parse-pair'
44

55
export declare type SelectorLiteralNode = {
6-
type?: 'attribute' | 'pseudo-class' | 'pseudo-element' | 'class' | 'universal'
6+
type?: 'attribute' | 'pseudo-class' | 'pseudo-element' | 'class' | 'universal' | 'id'
77
raw?: string
88
value?: string
99
children?: SelectorNode[]
@@ -23,7 +23,7 @@ export declare type SelectorCombinatorNode = {
2323

2424
export declare type SelectorNode = SelectorLiteralNode | SelectorCombinatorNode | SelectorSeparatorNode
2525

26-
const SELECTOR_REGEX = new RegExp(`(?:[a-zA-Z0-9-]+)|([${SELECTOR_COMBINATORS.join('')}.:,*])|(a-zA-Z0-9-)`, 'g')
26+
const SELECTOR_REGEX = new RegExp(`(?:[a-zA-Z0-9-]+)|([${SELECTOR_COMBINATORS.join('')}#.:,*])|(a-zA-Z0-9-)`, 'g')
2727

2828
export default function parseSelector(token: string, css = new MasterCSS(), isRaw = true) {
2929
const resolve = (eachToken: string): SelectorNode[] => {
@@ -35,7 +35,7 @@ export default function parseSelector(token: string, css = new MasterCSS(), isRa
3535
const raw = match[0]
3636
tokenIndex += raw.length
3737

38-
if (raw === ':' || raw === '.') {
38+
if (raw === ':' || raw === '.' || raw === '#') {
3939
currentPrefix += raw
4040
continue
4141
}
@@ -73,6 +73,8 @@ export default function parseSelector(token: string, css = new MasterCSS(), isRa
7373
type = 'pseudo-element'
7474
} else if (currentPrefix === '.') {
7575
type = 'class'
76+
} else if (currentPrefix === '#') {
77+
type = 'id'
7678
}
7779

7880
nodes.push({

packages/core/tests/utils/parse-selector.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ export const cases = {
2020
{ type: 'class', raw: '.active', value: 'active' }
2121
]
2222
}]],
23+
[':of(#active)', '#active ', [{
24+
type: 'pseudo-class', raw: ':of', value: 'of', children: [
25+
{ type: 'id', raw: '#active', value: 'active' },
26+
]
27+
}]],
28+
[':of(active)', 'active ', [{
29+
type: 'pseudo-class', raw: ':of', value: 'of', children: [
30+
{ raw: 'active', value: 'active' },
31+
]
32+
}]],
2333
[':of(.active_)', '.active ', [{
2434
type: 'pseudo-class', raw: ':of', value: 'of', children: [
2535
{ type: 'class', raw: '.active', value: 'active' },

0 commit comments

Comments
 (0)