Packages
moon
2.90.4
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
assets/node_modules/autoprefixer/lib/prefixer.js
let Browsers = require('./browsers')
let vendor = require('./vendor')
let utils = require('./utils')
/**
* Recursively clone objects
*/
function clone(obj, parent) {
let cloned = new obj.constructor()
for (let i of Object.keys(obj || {})) {
let value = obj[i]
if (i === 'parent' && typeof value === 'object') {
if (parent) {
cloned[i] = parent
}
} else if (i === 'source' || i === null) {
cloned[i] = value
} else if (Array.isArray(value)) {
cloned[i] = value.map(x => clone(x, cloned))
} else if (
i !== '_autoprefixerPrefix' &&
i !== '_autoprefixerValues' &&
i !== 'proxyCache'
) {
if (typeof value === 'object' && value !== null) {
value = clone(value, cloned)
}
cloned[i] = value
}
}
return cloned
}
class Prefixer {
/**
* Add hack to selected names
*/
static hack(klass) {
if (!this.hacks) {
this.hacks = {}
}
return klass.names.map(name => {
this.hacks[name] = klass
return this.hacks[name]
})
}
/**
* Load hacks for some names
*/
static load(name, prefixes, all) {
let Klass = this.hacks && this.hacks[name]
if (Klass) {
return new Klass(name, prefixes, all)
} else {
return new this(name, prefixes, all)
}
}
/**
* Clone node and clean autprefixer custom caches
*/
static clone(node, overrides) {
let cloned = clone(node)
for (let name in overrides) {
cloned[name] = overrides[name]
}
return cloned
}
constructor(name, prefixes, all) {
this.prefixes = prefixes
this.name = name
this.all = all
}
/**
* Find prefix in node parents
*/
parentPrefix(node) {
let prefix
if (typeof node._autoprefixerPrefix !== 'undefined') {
prefix = node._autoprefixerPrefix
} else if (node.type === 'decl' && node.prop[0] === '-') {
prefix = vendor.prefix(node.prop)
} else if (node.type === 'root') {
prefix = false
} else if (
node.type === 'rule' &&
node.selector.includes(':-') &&
/:(-\w+-)/.test(node.selector)
) {
prefix = node.selector.match(/:(-\w+-)/)[1]
} else if (node.type === 'atrule' && node.name[0] === '-') {
prefix = vendor.prefix(node.name)
} else {
prefix = this.parentPrefix(node.parent)
}
if (!Browsers.prefixes().includes(prefix)) {
prefix = false
}
node._autoprefixerPrefix = prefix
return node._autoprefixerPrefix
}
/**
* Clone node with prefixes
*/
process(node, result) {
if (!this.check(node)) {
return undefined
}
let parent = this.parentPrefix(node)
let prefixes = this.prefixes.filter(
prefix => !parent || parent === utils.removeNote(prefix)
)
let added = []
for (let prefix of prefixes) {
if (this.add(node, prefix, added.concat([prefix]), result)) {
added.push(prefix)
}
}
return added
}
/**
* Shortcut for Prefixer.clone
*/
clone(node, overrides) {
return Prefixer.clone(node, overrides)
}
}
module.exports = Prefixer