Skip to content

Commit bcc505a

Browse files
committed
Refactor
1 parent 7a4f8d5 commit bcc505a

File tree

1 file changed

+23
-43
lines changed

1 file changed

+23
-43
lines changed
Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { State } from './state'
22
import * as jit from './jit'
3+
import { segment } from './segment'
34

45
export function getVariantsFromClassName(
56
state: State,
@@ -13,60 +14,39 @@ export function getVariantsFromClassName(
1314
}
1415
return [variant.name]
1516
})
16-
let variants = new Set<string>()
17-
let offset = 0
18-
let parts = splitAtTopLevelOnly(className, state.separator)
17+
18+
let parts = segment(className, state.separator)
1919
if (parts.length < 2) {
20-
return { variants: Array.from(variants), offset }
20+
return { variants: [], offset: 0 }
2121
}
22+
2223
parts = parts.filter(Boolean)
2324

24-
for (let part of parts) {
25-
if (
26-
allVariants.includes(part) ||
27-
(state.jit &&
28-
((part.includes('[') && part.endsWith(']')) || part.includes('/')) &&
29-
jit.generateRules(state, [`${part}${state.separator}[color:red]`]).rules.length > 0)
30-
) {
31-
variants.add(part)
32-
offset += part.length + state.separator.length
33-
continue
25+
function isValidVariant(part: string) {
26+
if (allVariants.includes(part)) {
27+
return true
3428
}
3529

36-
break
37-
}
38-
39-
return { variants: Array.from(variants), offset }
40-
}
41-
42-
// https://github.com/tailwindlabs/tailwindcss/blob/a8a2e2a7191fbd4bee044523aecbade5823a8664/src/util/splitAtTopLevelOnly.js
43-
function splitAtTopLevelOnly(input: string, separator: string): string[] {
44-
let stack: string[] = []
45-
let parts: string[] = []
46-
let lastPos = 0
30+
let className = `${part}${state.separator}[color:red]`
4731

48-
for (let idx = 0; idx < input.length; idx++) {
49-
let char = input[idx]
50-
51-
if (stack.length === 0 && char === separator[0]) {
52-
if (separator.length === 1 || input.slice(idx, idx + separator.length) === separator) {
53-
parts.push(input.slice(lastPos, idx))
54-
lastPos = idx + separator.length
32+
if (state.jit) {
33+
if ((part.includes('[') && part.endsWith(']')) || part.includes('/')) {
34+
return jit.generateRules(state, [className]).rules.length > 0
5535
}
5636
}
5737

58-
if (char === '(' || char === '[' || char === '{') {
59-
stack.push(char)
60-
} else if (
61-
(char === ')' && stack[stack.length - 1] === '(') ||
62-
(char === ']' && stack[stack.length - 1] === '[') ||
63-
(char === '}' && stack[stack.length - 1] === '{')
64-
) {
65-
stack.pop()
66-
}
38+
return false
6739
}
6840

69-
parts.push(input.slice(lastPos))
41+
let offset = 0
42+
let variants = new Set<string>()
7043

71-
return parts
44+
for (let part of parts) {
45+
if (!isValidVariant(part)) break
46+
47+
variants.add(part)
48+
offset += part.length + state.separator!.length
49+
}
50+
51+
return { variants: Array.from(variants), offset }
7252
}

0 commit comments

Comments
 (0)