aliaset
Version:
twind monorepo
29 lines (24 loc) • 941 B
text/typescript
import type { TwindRule } from '../types'
export function merge(rules: TwindRule[], name: string): TwindRule[] {
// merge:
// - same conditions
// - replace name with hash of name + condititions + declarations
// - precedence:
// - combine bits or use max precendence
// - set layer bit to merged
const result: TwindRule[] = []
let current: TwindRule | undefined
for (const rule of rules) {
// only merge rules with declarations and names (eg no global rules)
if (!(rule.d && rule.n)) {
result.push({ ...rule, n: rule.n && name })
} else if (current?.p == rule.p && '' + current.r == '' + rule.r) {
current.c = [current.c, rule.c].filter(Boolean).join(' ')
current.d = current.d + ';' + rule.d
} else {
// only set name for named rules eg not for global or className propagation rules
result.push((current = { ...rule, n: rule.n && name }))
}
}
return result
}