1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import removeMeta from './removeMeta'
const dlv = require('dlv')
import escapeClassName from 'css.escape'
export function stringifyConfigValue(x: any): string {
if (typeof x === 'string') return x
if (typeof x === 'number') return x.toString()
if (Array.isArray(x)) {
return x
.filter((y) => typeof y === 'string')
.filter(Boolean)
.join(', ')
}
return null
}
export function stringifyCss(className: string, obj: any): string {
if (obj.__rule !== true && !Array.isArray(obj)) return null
if (Array.isArray(obj)) {
const rules = obj.map((x) => stringifyCss(className, x)).filter(Boolean)
if (rules.length === 0) return null
return rules.join('\n\n')
}
let css = ``
const context = dlv(obj, '__context', [])
const props = Object.keys(removeMeta(obj))
if (props.length === 0) return null
for (let i = 0; i < context.length; i++) {
css += `${'\t'.repeat(i)}${context[i]} {\n`
}
const indentStr = '\t'.repeat(context.length)
const decls = props.reduce((acc, curr, i) => {
return `${acc}${i === 0 ? '' : '\n'}${indentStr + '\t'}${curr}: ${
obj[curr]
};`
}, '')
css += `${indentStr}${augmentClassName(
className,
obj
)} {\n${decls}\n${indentStr}}`
for (let i = context.length - 1; i >= 0; i--) {
css += `${'\t'.repeat(i)}\n}`
}
return css
}
function augmentClassName(className: string, obj: any): string {
const pseudo = obj.__pseudo ? obj.__pseudo.join('') : ''
const scope = obj.__scope ? `${obj.__scope} ` : ''
return `${scope}.${escapeClassName(className)}${pseudo}`
}
|