Skip to content

Commit 8833ff7

Browse files
committed
JS: Use Vue model in Vuex model
1 parent ebf17e1 commit 8833ff7

File tree

1 file changed

+10
-28
lines changed
  • javascript/ql/lib/semmle/javascript/frameworks

1 file changed

+10
-28
lines changed

javascript/ql/lib/semmle/javascript/frameworks/Vuex.qll

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,6 @@
55
private import javascript
66
private import semmle.javascript.dataflow.internal.FlowSteps as FlowSteps
77

8-
/** A minimal adapter for the `vue` model based on API nodes. */
9-
private module VueAPI {
10-
/**
11-
* An API node representing the object passed to the Vue constructor `new Vue({...})`
12-
* or equivalent.
13-
*/
14-
class VueConfigObject extends API::Node {
15-
VueConfigObject() { this.getARhs() = any(Vue::Component c).getOwnOptionsObject() }
16-
17-
/** Gets an API node representing `this` in the Vue component. */
18-
API::Node getAnInstanceRef() {
19-
result = getAMember().getReceiver()
20-
or
21-
result = getAMember().getAMember().getReceiver()
22-
}
23-
}
24-
}
25-
268
/**
279
* Provides classes and predicates for working with the `vuex` library.
2810
*/
@@ -49,7 +31,7 @@ module Vuex {
4931
API::Node storeRef(string namespace) {
5032
result = vuex().getMember("Store").getInstance() and namespace = ""
5133
or
52-
result = any(VueAPI::VueConfigObject v).getAnInstanceRef().getMember("$store") and
34+
result = any(Vue::Component v).getInstance().getMember("$store") and
5335
namespace = ""
5436
or
5537
result =
@@ -132,13 +114,13 @@ module Vuex {
132114
}
133115

134116
/** Gets the Vue component in which the generated functions are installed. */
135-
VueAPI::VueConfigObject getVueConfigObject() {
117+
Vue::Component getVueComponent() {
136118
exists(DataFlow::ObjectLiteralNode obj |
137119
obj.getASpreadProperty() = getReturn().getAUse() and
138-
result.getAMember().getARhs() = obj
120+
result.getOwnOptions().getAMember().getARhs() = obj
139121
)
140122
or
141-
result.getAMember().getARhs() = this
123+
result.getOwnOptions().getAMember().getARhs() = this
142124
}
143125
}
144126

@@ -153,7 +135,7 @@ module Vuex {
153135
exists(MapHelperCall call, string localName |
154136
call.getHelperName() = helperName and
155137
call.hasMapping(localName, storeName) and
156-
result = call.getVueConfigObject().getAnInstanceRef().getMember(localName) and
138+
result = call.getVueComponent().getInstance().getMember(localName) and
157139
localName != "*"
158140
)
159141
}
@@ -339,10 +321,10 @@ module Vuex {
339321
/**
340322
* Gets the `x` in `mapState({name: () => x})`.
341323
*/
342-
DataFlow::Node mapStateHelperPred(VueAPI::VueConfigObject vue, string name) {
324+
DataFlow::Node mapStateHelperPred(Vue::Component component, string name) {
343325
exists(MapHelperCall call |
344326
call.getHelperName() = "mapState" and
345-
vue = call.getVueConfigObject() and
327+
component = call.getVueComponent() and
346328
result = call.getLastParameter().getMember(name).getReturn().getARhs()
347329
)
348330
}
@@ -352,9 +334,9 @@ module Vuex {
352334
* corresponding property access.
353335
*/
354336
predicate mapStateHelperStep(DataFlow::Node pred, DataFlow::Node succ) {
355-
exists(VueAPI::VueConfigObject vue, string name |
356-
pred = mapStateHelperPred(vue, name) and
357-
succ = pragma[only_bind_out](vue).getAnInstanceRef().getMember(name).getAnImmediateUse()
337+
exists(Vue::Component component, string name |
338+
pred = mapStateHelperPred(component, name) and
339+
succ = pragma[only_bind_out](component).getInstance().getMember(name).getAnImmediateUse()
358340
)
359341
}
360342

0 commit comments

Comments
 (0)