1 |
|
2 | export 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 |
|
19 | const getVariables = node => Object(Object(node).variables);
|
20 |
|
21 |
|
22 | const requiresAncestorVariable = (variable, node) => undefined === variable && node && node.parent;
|
23 |
|
24 |
|
25 | const requiresFnVariable = (value, opts) => value === undefined && Object(opts).variables === Object(Object(opts).variables);
|
26 |
|
27 |
|
28 | const getFnVariable = (name, node, variables) => 'function' === typeof variables
|
29 | ? variables(name, node)
|
30 | : variables[name];
|