2021-05-03 17:00:04 +00:00
|
|
|
import { State } from './state'
|
2022-05-26 10:31:22 +00:00
|
|
|
import * as jit from './jit'
|
2021-05-03 17:00:04 +00:00
|
|
|
|
|
|
|
export function getVariantsFromClassName(
|
|
|
|
state: State,
|
|
|
|
className: string
|
|
|
|
): { variants: string[]; offset: number } {
|
|
|
|
let allVariants = Object.keys(state.variants)
|
2022-10-13 08:23:19 +00:00
|
|
|
let parts = splitAtTopLevelOnly(className, state.separator).filter(Boolean)
|
2021-05-03 17:00:04 +00:00
|
|
|
let variants = new Set<string>()
|
|
|
|
let offset = 0
|
|
|
|
|
2022-05-26 10:31:22 +00:00
|
|
|
for (let part of parts) {
|
|
|
|
if (
|
|
|
|
allVariants.includes(part) ||
|
|
|
|
(state.jit &&
|
2022-10-07 15:54:25 +00:00
|
|
|
((part.includes('[') && part.endsWith(']')) ||
|
|
|
|
(part.includes('<') && part.includes('>'))) &&
|
2022-05-26 10:31:22 +00:00
|
|
|
jit.generateRules(state, [`${part}${state.separator}[color:red]`]).rules.length > 0)
|
|
|
|
) {
|
|
|
|
variants.add(part)
|
|
|
|
offset += part.length + state.separator.length
|
|
|
|
continue
|
2021-05-03 17:00:04 +00:00
|
|
|
}
|
2022-05-26 10:31:22 +00:00
|
|
|
|
|
|
|
break
|
2021-05-03 17:00:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return { variants: Array.from(variants), offset }
|
|
|
|
}
|
2022-05-26 10:31:22 +00:00
|
|
|
|
2022-10-13 08:23:19 +00:00
|
|
|
// https://github.com/tailwindlabs/tailwindcss/blob/a8a2e2a7191fbd4bee044523aecbade5823a8664/src/util/splitAtTopLevelOnly.js
|
|
|
|
function splitAtTopLevelOnly(input: string, separator: string): string[] {
|
|
|
|
let stack: string[] = []
|
|
|
|
let parts: string[] = []
|
|
|
|
let lastPos = 0
|
2022-05-26 10:31:22 +00:00
|
|
|
|
2022-10-13 08:23:19 +00:00
|
|
|
for (let idx = 0; idx < input.length; idx++) {
|
|
|
|
let char = input[idx]
|
2022-05-26 10:31:22 +00:00
|
|
|
|
2022-10-13 08:23:19 +00:00
|
|
|
if (stack.length === 0 && char === separator[0]) {
|
|
|
|
if (separator.length === 1 || input.slice(idx, idx + separator.length) === separator) {
|
|
|
|
parts.push(input.slice(lastPos, idx))
|
|
|
|
lastPos = idx + separator.length
|
2022-05-26 10:31:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-13 08:23:19 +00:00
|
|
|
if (char === '(' || char === '[' || char === '{') {
|
|
|
|
stack.push(char)
|
|
|
|
} else if (
|
|
|
|
(char === ')' && stack[stack.length - 1] === '(') ||
|
|
|
|
(char === ']' && stack[stack.length - 1] === '[') ||
|
|
|
|
(char === '}' && stack[stack.length - 1] === '{')
|
|
|
|
) {
|
|
|
|
stack.pop()
|
2022-05-26 10:31:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-13 08:23:19 +00:00
|
|
|
parts.push(input.slice(lastPos))
|
|
|
|
|
|
|
|
return parts
|
2022-05-26 10:31:22 +00:00
|
|
|
}
|