-
-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathgetAttributeValue.ts
44 lines (34 loc) · 1.32 KB
/
getAttributeValue.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import type { AST } from "vue-eslint-parser";
function getAttributeValue(node: AST.VAttribute | AST.VDirective) {
if (!node.value) {
return null;
}
if (!node.directive) {
return node.value.value;
}
if (node.key.name.name === "bind" && node.value.expression) {
// <div :height="100" />
if (node.value.expression.type === "Literal") {
return node.value.expression.value;
}
if (node.value.expression.type === 'LogicalExpression') {
const operator = node.value.expression.operator;
let leftSideOfOperation;
let rightSideOfOperation;
if (node.value.expression.left.type === 'Literal') {
leftSideOfOperation = node.value.expression.left.value;
}
if (node.value.expression.right.type === 'Literal') {
rightSideOfOperation = node.value.expression.right.value;
}
return eval(`${leftSideOfOperation} ${operator} ${rightSideOfOperation}`);
}
// TODO we're effectively using this as just a placeholder to let rules know
// that a value has been passed in for this attribute. We should replace
// this with a stronger API to either explicitly handle all of the different
// types of values or just return a special symbol or something else.
return node.value.expression;
}
return null;
}
export default getAttributeValue;