* Refactor * Don’t prefix classes in arbitrary values for group and peer * use `foo` instead of `lol` * handle the prefix inside the group/peer variants Then add the `NoPrefix` feature to the variant itself, which will skip prefixing any other class in the generated selector (because we already took care of prefixing `.group` and `.peer`). We are using an internal symbol such that: - We can keep it as a private API - We don't introduce a breaking change * refactor to simple object instead We will still use a symbol as an internal/private marker, but the data itself will be a simple object for now. If we want to refactor this (and more) in the future using bitflags then we can refactor that in a separate PR. --------- Co-authored-by: Robin Malfait <malfait.robin@gmail.com>
33 lines
992 B
JavaScript
33 lines
992 B
JavaScript
import parser from 'postcss-selector-parser'
|
|
|
|
/**
|
|
* @template {string | import('postcss-selector-parser').Root} T
|
|
*
|
|
* Prefix all classes in the selector with the given prefix
|
|
*
|
|
* It can take either a string or a selector AST and will return the same type
|
|
*
|
|
* @param {string} prefix
|
|
* @param {T} selector
|
|
* @param {boolean} prependNegative
|
|
* @returns {T}
|
|
*/
|
|
export default function (prefix, selector, prependNegative = false) {
|
|
if (prefix === '') {
|
|
return selector
|
|
}
|
|
|
|
/** @type {import('postcss-selector-parser').Root} */
|
|
let ast = typeof selector === 'string' ? parser().astSync(selector) : selector
|
|
|
|
ast.walkClasses((classSelector) => {
|
|
let baseClass = classSelector.value
|
|
let shouldPlaceNegativeBeforePrefix = prependNegative && baseClass.startsWith('-')
|
|
|
|
classSelector.value = shouldPlaceNegativeBeforePrefix
|
|
? `-${prefix}${baseClass.slice(1)}`
|
|
: `${prefix}${baseClass}`
|
|
})
|
|
|
|
return typeof selector === 'string' ? ast.toString() : ast
|
|
}
|