Skip to content

Commit d3653b3

Browse files
committed
add support for re-exports using the spread operator for NodeJS exports
1 parent c106b67 commit d3653b3

File tree

11 files changed

+39
-0
lines changed

11 files changed

+39
-0
lines changed

javascript/ql/src/semmle/javascript/NodeJS.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ class NodeModule extends Module {
5555
name = pwn.getPropertyName()
5656
)
5757
or
58+
// a re-export using spread-operator. E.g. `const foo = require("./foo"); module.exports = {bar: bar, ...foo};`
59+
exists(ObjectExpr obj | obj.analyze().getAValue() = getAModuleExportsValue() |
60+
obj
61+
.getAProperty()
62+
.(SpreadProperty)
63+
.getInit()
64+
.(SpreadElement)
65+
.getOperand()
66+
.flow()
67+
.getALocalSource()
68+
.asExpr()
69+
.(Import)
70+
.getImportedModule()
71+
.exports(name, export)
72+
)
73+
or
5874
// an externs definition (where appropriate)
5975
exists(PropAccess pacc | export = pacc |
6076
pacc.getBase().analyze().getAValue() = getAModuleExportsValue() and
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
| b.js:7:22:7:27 | module |
22
| d.js:3:1:3:6 | module |
3+
| reexport/a.js:1:1:1:6 | module |
4+
| reexport/b.js:3:1:3:6 | module |
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
| b.js:1:1:8:0 | <toplevel> | sneaky |
22
| d.js:1:1:7:15 | <toplevel> | baz |
3+
| reexport/a.js:1:1:3:1 | <toplevel> | foo |
4+
| reexport/b.js:1:1:6:1 | <toplevel> | bar |
5+
| reexport/b.js:1:1:6:1 | <toplevel> | foo |
36
| sub/c.js:1:1:4:0 | <toplevel> | foo |
47
| sub/f.js:1:1:4:17 | <toplevel> | bar |

javascript/ql/test/library-tests/NodeJS/Module_getAnImport.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@
1515
| mjs-files/require-from-js.js:1:1:4:0 | <toplevel> | mjs-files/require-from-js.js:1:12:1:36 | require ... on-me') |
1616
| mjs-files/require-from-js.js:1:1:4:0 | <toplevel> | mjs-files/require-from-js.js:2:12:2:39 | require ... me.js') |
1717
| mjs-files/require-from-js.js:1:1:4:0 | <toplevel> | mjs-files/require-from-js.js:3:12:3:40 | require ... e.mjs') |
18+
| reexport/b.js:1:1:6:1 | <toplevel> | reexport/b.js:1:11:1:24 | require("./a") |
1819
| sub/c.js:1:1:4:0 | <toplevel> | sub/c.js:1:1:1:15 | require('../a') |

javascript/ql/test/library-tests/NodeJS/Module_getAnImportedModule.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
| index.js:1:1:3:0 | <toplevel> | b.js:1:1:8:0 | <toplevel> |
99
| mjs-files/require-from-js.js:1:1:4:0 | <toplevel> | mjs-files/depend-on-me.js:1:1:8:0 | <toplevel> |
1010
| mjs-files/require-from-js.js:1:1:4:0 | <toplevel> | mjs-files/depend-on-me.mjs:1:1:7:1 | <toplevel> |
11+
| reexport/b.js:1:1:6:1 | <toplevel> | reexport/a.js:1:1:3:1 | <toplevel> |
1112
| sub/c.js:1:1:4:0 | <toplevel> | a.js:1:1:14:0 | <toplevel> |

javascript/ql/test/library-tests/NodeJS/Modules.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
| e.js:1:1:6:0 | <toplevel> | e.js:0:0:0:0 | e.js | e.js | e |
55
| index.js:1:1:3:0 | <toplevel> | index.js:0:0:0:0 | index.js | index.js | index |
66
| mjs-files/require-from-js.js:1:1:4:0 | <toplevel> | mjs-files/require-from-js.js:0:0:0:0 | mjs-files/require-from-js.js | mjs-files/require-from-js.js | require-from-js |
7+
| reexport/a.js:1:1:3:1 | <toplevel> | reexport/a.js:0:0:0:0 | reexport/a.js | reexport/a.js | a |
8+
| reexport/b.js:1:1:6:1 | <toplevel> | reexport/b.js:0:0:0:0 | reexport/b.js | reexport/b.js | b |
79
| sub/c.js:1:1:4:0 | <toplevel> | sub/c.js:0:0:0:0 | sub/c.js | sub/c.js | c |
810
| sub/f.js:1:1:4:17 | <toplevel> | sub/f.js:0:0:0:0 | sub/f.js | sub/f.js | f |

javascript/ql/test/library-tests/NodeJS/NodeModule_exports.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@
22
| d.js:1:1:7:15 | <toplevel> | baz | d.js:4:2:4:8 | baz: 42 |
33
| mjs-files/depend-on-me.js:1:1:8:0 | <toplevel> | add | mjs-files/depend-on-me.js:5:1:7:1 | export ... + y;\\n} |
44
| mjs-files/depend-on-me.mjs:1:1:7:1 | <toplevel> | add | mjs-files/depend-on-me.mjs:5:1:7:1 | export ... + y;\\n} |
5+
| reexport/a.js:1:1:3:1 | <toplevel> | foo | reexport/a.js:2:5:2:26 | foo: fu ... oo() {} |
6+
| reexport/b.js:1:1:6:1 | <toplevel> | bar | reexport/b.js:4:5:4:26 | bar: fu ... ar() {} |
7+
| reexport/b.js:1:1:6:1 | <toplevel> | foo | reexport/a.js:2:5:2:26 | foo: fu ... oo() {} |
58
| sub/c.js:1:1:4:0 | <toplevel> | foo | sub/c.js:3:1:3:11 | exports.foo |
69
| sub/f.js:1:1:4:17 | <toplevel> | bar | sub/f.js:4:1:4:11 | exports.bar |

javascript/ql/test/library-tests/NodeJS/Require.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@
1919
| mjs-files/require-from-js.js:1:12:1:36 | require ... on-me') |
2020
| mjs-files/require-from-js.js:2:12:2:39 | require ... me.js') |
2121
| mjs-files/require-from-js.js:3:12:3:40 | require ... e.mjs') |
22+
| reexport/b.js:1:11:1:24 | require("./a") |
2223
| sub/c.js:1:1:1:15 | require('../a') |

javascript/ql/test/library-tests/NodeJS/RequireImport.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@
1111
| mjs-files/require-from-js.js:1:12:1:36 | require ... on-me') | ./depend-on-me | mjs-files/depend-on-me.mjs:1:1:7:1 | <toplevel> |
1212
| mjs-files/require-from-js.js:2:12:2:39 | require ... me.js') | ./depend-on-me.js | mjs-files/depend-on-me.js:1:1:8:0 | <toplevel> |
1313
| mjs-files/require-from-js.js:3:12:3:40 | require ... e.mjs') | ./depend-on-me.mjs | mjs-files/depend-on-me.mjs:1:1:7:1 | <toplevel> |
14+
| reexport/b.js:1:11:1:24 | require("./a") | ./a | reexport/a.js:1:1:3:1 | <toplevel> |
1415
| sub/c.js:1:1:1:15 | require('../a') | ../a | a.js:1:1:14:0 | <toplevel> |
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
foo: function foo() {}
3+
}

0 commit comments

Comments
 (0)