basant307/AI_Governance_Project
048
1let postcss = require('postcss')2 3let IMPORTANT = /\s*!important\s*$/i4 5let UNITLESS = {6 'box-flex': true,7 'box-flex-group': true,8 'column-count': true,9 'flex': true,10 'flex-grow': true,11 'flex-positive': true,12 'flex-shrink': true,13 'flex-negative': true,14 'font-weight': true,15 'line-clamp': true,16 'line-height': true,17 'opacity': true,18 'order': true,19 'orphans': true,20 'tab-size': true,21 'widows': true,22 'z-index': true,23 'zoom': true,24 'fill-opacity': true,25 'stroke-dashoffset': true,26 'stroke-opacity': true,27 'stroke-width': true28}29 30function dashify(str) {31 return str32 .replace(/([A-Z])/g, '-$1')33 .replace(/^ms-/, '-ms-')34 .toLowerCase()35}36 37function decl(parent, name, value) {38 if (value === false || value === null) return39 40 if (!name.startsWith('--')) {41 name = dashify(name)42 }43 44 if (typeof value === 'number') {45 if (value === 0 || UNITLESS[name]) {46 value = value.toString()47 } else {48 value += 'px'49 }50 }51 52 if (name === 'css-float') name = 'float'53 54 if (IMPORTANT.test(value)) {55 value = value.replace(IMPORTANT, '')56 parent.push(postcss.decl({ prop: name, value, important: true }))57 } else {58 parent.push(postcss.decl({ prop: name, value }))59 }60}61 62function atRule(parent, parts, value) {63 let node = postcss.atRule({ name: parts[1], params: parts[3] || '' })64 if (typeof value === 'object') {65 node.nodes = []66 parse(value, node)67 }68 parent.push(node)69}70 71function parse(obj, parent) {72 let name, node, value73 for (name in obj) {74 value = obj[name]75 if (value === null || typeof value === 'undefined') {76 continue77 } else if (name[0] === '@') {78 let parts = name.match(/@(\S+)(\s+([\W\w]*)\s*)?/)79 if (Array.isArray(value)) {80 for (let i of value) {81 atRule(parent, parts, i)82 }83 } else {84 atRule(parent, parts, value)85 }86 } else if (Array.isArray(value)) {87 for (let i of value) {88 decl(parent, name, i)89 }90 } else if (typeof value === 'object') {91 node = postcss.rule({ selector: name })92 parse(value, node)93 parent.push(node)94 } else {95 decl(parent, name, value)96 }97 }98}99 100module.exports = function (obj) {101 let root = postcss.root()102 parse(obj, root)103 return root104}105 