UNPKG

2.57 kBJavaScriptView Raw
1let Prefixer = require('./prefixer')
2let OldValue = require('./old-value')
3let vendor = require('./vendor')
4let utils = require('./utils')
5
6class Value extends Prefixer {
7 /**
8 * Clone decl for each prefixed values
9 */
10 static save(prefixes, decl) {
11 let prop = decl.prop
12 let result = []
13
14 for (let prefix in decl._autoprefixerValues) {
15 let value = decl._autoprefixerValues[prefix]
16
17 if (value === decl.value) {
18 continue
19 }
20
21 let item
22 let propPrefix = vendor.prefix(prop)
23
24 if (propPrefix === '-pie-') {
25 continue
26 }
27
28 if (propPrefix === prefix) {
29 item = decl.value = value
30 result.push(item)
31 continue
32 }
33
34 let prefixed = prefixes.prefixed(prop, prefix)
35 let rule = decl.parent
36
37 if (!rule.every(i => i.prop !== prefixed)) {
38 result.push(item)
39 continue
40 }
41
42 let trimmed = value.replace(/\s+/, ' ')
43 let already = rule.some(
44 i => i.prop === decl.prop && i.value.replace(/\s+/, ' ') === trimmed
45 )
46
47 if (already) {
48 result.push(item)
49 continue
50 }
51
52 let cloned = this.clone(decl, { value })
53 item = decl.parent.insertBefore(decl, cloned)
54
55 result.push(item)
56 }
57
58 return result
59 }
60
61 /**
62 * Is declaration need to be prefixed
63 */
64 check(decl) {
65 let value = decl.value
66 if (!value.includes(this.name)) {
67 return false
68 }
69
70 return !!value.match(this.regexp())
71 }
72
73 /**
74 * Lazy regexp loading
75 */
76 regexp() {
77 return this.regexpCache || (this.regexpCache = utils.regexp(this.name))
78 }
79
80 /**
81 * Add prefix to values in string
82 */
83 replace(string, prefix) {
84 return string.replace(this.regexp(), `$1${prefix}$2`)
85 }
86
87 /**
88 * Get value with comments if it was not changed
89 */
90 value(decl) {
91 if (decl.raws.value && decl.raws.value.value === decl.value) {
92 return decl.raws.value.raw
93 } else {
94 return decl.value
95 }
96 }
97
98 /**
99 * Save values with next prefixed token
100 */
101 add(decl, prefix) {
102 if (!decl._autoprefixerValues) {
103 decl._autoprefixerValues = {}
104 }
105 let value = decl._autoprefixerValues[prefix] || this.value(decl)
106
107 let before
108 do {
109 before = value
110 value = this.replace(value, prefix)
111 if (value === false) return
112 } while (value !== before)
113
114 decl._autoprefixerValues[prefix] = value
115 }
116
117 /**
118 * Return function to fast find prefixed value
119 */
120 old(prefix) {
121 return new OldValue(this.name, prefix + this.name)
122 }
123}
124
125module.exports = Value