import _ from 'lodash' import postcss from 'postcss' import selectorParser from 'postcss-selector-parser' import { useMemo } from './useMemo' const classNameParser = selectorParser((selectors) => { return selectors.first.filter(({ type }) => type === 'class').pop().value }) const getClassNameFromSelector = useMemo( (selector) => classNameParser.transformSync(selector), (selector) => selector ) export default function generateVariantFunction(generator, options = {}) { return { options, handler: (container, config) => { const cloned = postcss.root({ nodes: container.clone().nodes }) container.before( _.defaultTo( generator({ container: cloned, separator: config.separator, modifySelectors: (modifierFunction) => { cloned.each((rule) => { if (rule.type !== 'rule') { return } rule.selectors = rule.selectors.map((selector) => { return modifierFunction({ get className() { return getClassNameFromSelector(selector) }, selector, }) }) }) return cloned }, }), cloned ).nodes ) }, } }