Skip to content

Commit 6d9d859

Browse files
authored
Merge pull request github#1934 from asger-semmle/node-js-classification
Approved by esben-semmle
2 parents 4fe74c0 + b631bfc commit 6d9d859

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

change-notes/1.23/extractor-javascript.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
## Changes to code extraction
66

77
* Asynchronous generator methods are now parsed correctly and no longer cause a spurious syntax error.
8+
* Recognition of CommonJS modules has improved. As a result, some files that were previously extracted as
9+
global scripts are now extracted as modules.
810
* Top-level `await` is now supported.

javascript/extractor/src/com/semmle/js/extractor/NodeJSDetector.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@ private static boolean isRequireCall(Expression e) {
9797
if (e instanceof CallExpression) {
9898
CallExpression call = (CallExpression) e;
9999
Expression callee = call.getCallee();
100-
return (isIdentifier(callee, "require") || isRequireCall(callee))
101-
&& call.getArguments().size() == 1;
100+
if (isIdentifier(callee, "require") && call.getArguments().size() == 1) return true;
101+
if (isRequireCall(callee)) return true;
102+
return false;
102103
} else if (e instanceof MemberExpression) {
103104
return isRequireCall(((MemberExpression) e).getObject());
104105
} else if (e instanceof AssignmentExpression) {

javascript/extractor/src/com/semmle/js/extractor/test/NodeJSDetectorTests.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,8 @@ public void testUMD() {
164164

165165
@Test
166166
public void amdefine() {
167-
// not currently detected
168167
isNodeJS(
169-
"if (typeof define !== 'function') define = require('amdefine')(module, require);", false);
168+
"if (typeof define !== 'function') define = require('amdefine')(module, require);", true);
170169
}
171170

172171
@Test
@@ -202,4 +201,14 @@ public void requireInIf() {
202201
+ "}",
203202
true);
204203
}
204+
205+
@Test
206+
public void requireAndCall() {
207+
isNodeJS("var foo = require('foo')();", true);
208+
}
209+
210+
@Test
211+
public void requireAndCallMethod() {
212+
isNodeJS("var foo = require('foo').bar();", true);
213+
}
205214
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* @name Modules
3+
* @description The number of modules in the snapshot.
4+
* @kind metric
5+
* @metricType project
6+
* @metricAggregate sum
7+
* @tags meta
8+
* @id js/meta/modules
9+
*/
10+
11+
import javascript
12+
import CallGraphQuality
13+
14+
select projectRoot(), count(Module mod)

0 commit comments

Comments
 (0)