let camelcase = require('camelcase-css') let UNITLESS = { boxFlex: true, boxFlexGroup: true, columnCount: true, flex: true, flexGrow: true, flexPositive: true, flexShrink: true, flexNegative: true, fontWeight: true, lineClamp: true, lineHeight: true, opacity: true, order: true, orphans: true, tabSize: true, widows: true, zIndex: true, zoom: true, fillOpacity: true, strokeDashoffset: true, strokeOpacity: true, strokeWidth: true } function atRule (node) { if (typeof node.nodes === 'undefined') { return true } else { return process(node) } } function process (node) { let name let result = {} node.each(child => { if (child.type === 'atrule') { name = '@' + child.name if (child.params) name += ' ' + child.params if (typeof result[name] === 'undefined') { result[name] = atRule(child) } else if (Array.isArray(result[name])) { result[name].push(atRule(child)) } else { result[name] = [result[name], atRule(child)] } } else if (child.type === 'rule') { let body = process(child) if (result[child.selector]) { for (let i in body) { result[child.selector][i] = body[i] } } else { result[child.selector] = body } } else if (child.type === 'decl') { if (child.prop[0] === '-' && child.prop[1] === '-') { name = child.prop } else { name = camelcase(child.prop) } let value = child.value if (!isNaN(child.value) && UNITLESS[name]) { value = parseFloat(child.value) } if (child.important) value += ' !important' if (typeof result[name] === 'undefined') { result[name] = value } else if (Array.isArray(result[name])) { result[name].push(value) } else { result[name] = [result[name], value] } } }) return result } module.exports = process