postcss-advanced-variables-mod
Version:
Use Sass-like variables, conditionals, and iterators in CSS
31 lines (22 loc) • 1.09 kB
JavaScript
// return the closest variable from a node
export default function getClosestVariable(name, node, opts) {
const variables = getVariables(node);
let variable = variables[name];
if (requiresAncestorVariable(variable, node)) {
variable = getClosestVariable(name, node.parent, opts);
}
if (requiresFnVariable(variable, opts)) {
variable = getFnVariable(name, node, opts.variables);
}
return variable;
}
// return the variables object of a node
const getVariables = node => Object(Object(node).variables);
// return whether the variable should be replaced using an ancestor variable
const requiresAncestorVariable = (variable, node) => undefined === variable && node && node.parent;
// return whether variable should be replaced using a variables function
const requiresFnVariable = (value, opts) => value === undefined && Object(opts).variables === Object(Object(opts).variables);
// return whether variable should be replaced using a variables function
const getFnVariable = (name, node, variables) => 'function' === typeof variables
? variables(name, node)
: variables[name];