-
-
Notifications
You must be signed in to change notification settings - Fork 400
/
Copy pathindex.js
67 lines (54 loc) · 1.64 KB
/
index.js
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
59
60
61
62
63
64
65
66
67
import warning from 'tiny-warning'
/**
* Set selector.
*
* @param original rule
* @param className class string
* @return flag indicating function was successfull or not
*/
function registerClass(rule, className) {
// Skip falsy values
if (!className) return true
// Support array of class names `{composes: ['foo', 'bar']}`
if (Array.isArray(className)) {
for (let index = 0; index < className.length; index++) {
const isSetted = registerClass(rule, className[index])
if (!isSetted) return false
}
return true
}
// Support space separated class names `{composes: 'foo bar'}`
if (className.indexOf(' ') > -1) {
return registerClass(rule, className.split(' '))
}
const {parent} = rule.options
// It is a ref to a local rule.
if (className[0] === '$') {
const refRule = parent.getRule(className.substr(1))
if (!refRule) {
warning(false, `[JSS] Referenced rule is not defined. \n${rule.toString()}`)
return false
}
if (refRule === rule) {
warning(false, `[JSS] Cyclic composition detected. \n${rule.toString()}`)
return false
}
parent.classes[rule.key] += ` ${parent.classes[refRule.key]}`
return true
}
parent.classes[rule.key] += ` ${className}`
return true
}
/**
* Convert compose property to additional class, remove property from original styles.
*/
export default function jssCompose() {
function onProcessStyle(style, rule) {
if (!('composes' in style)) return style
registerClass(rule, style.composes)
// Remove composes property to prevent infinite loop.
delete style.composes
return style
}
return {onProcessStyle}
}