UNPKG

1.09 kBJavaScriptView Raw
1// get the closest variable from a node
2export default function getClosestVariable(name, node, opts) {
3 const variables = getVariables(node);
4
5 let variable = variables[name];
6
7 if (requiresAncestorVariable(variable, node)) {
8 variable = getClosestVariable(name, node.parent, opts);
9 }
10
11 if (requiresFnVariable(variable, opts)) {
12 variable = getFnVariable(name, node, opts.variables);
13 }
14
15 return variable;
16}
17
18// return the variables object of a node
19const getVariables = node => Object(Object(node).variables);
20
21// return whether the variable should be replaced using an ancestor variable
22const requiresAncestorVariable = (variable, node) => undefined === variable && node && node.parent;
23
24// return whether variable should be replaced using a variables function
25const requiresFnVariable = (value, opts) => value === undefined && Object(opts).variables === Object(Object(opts).variables);
26
27// return whether variable should be replaced using a variables function
28const getFnVariable = (name, node, variables) => 'function' === typeof variables
29 ? variables(name, node)
30: variables[name];