better support for the &&=, ||=, and ??= operators

This commit is contained in:
Erik Krogh Kristensen
2020-08-13 09:22:32 +02:00
parent fd9eb1d40b
commit d95d427c5b
6 changed files with 728 additions and 2 deletions

View File

@@ -1551,8 +1551,27 @@ public class CFGExtractor {
@Override
public Void visit(AssignmentExpression nd, SuccessorInfo i) {
visitAssign(nd, nd.getLeft(), nd.getRight());
succ(nd, i.getGuardedSuccessors(nd));
// `a &&= b` expands to `a || (a = b);`
// The CFG is a conditional assignment, so we go through the assignment `nd` last.
if ("&&=".equals(nd.getOperator()) || "||=".equals(nd.getOperator()) || "??=".equals(nd.getOperator())) {
if ("&&=".equals(nd.getOperator())) {
// from lhs to rhs on truthy. from lhs to false-branch on falsy.
visit(nd.getLeft(), First.of(nd.getRight()), i.getSuccessors(false));
} else if ("||=".equals(nd.getOperator())) {
// from lhs to true-branch on truthy. from lhs to rhs on falsy.
visit(nd.getLeft(), i.getSuccessors(true), First.of(nd.getRight()));
} else { // "??="
// the union of the above - truthyness is unknown.
visit(nd.getLeft(), union(First.of(nd.getRight()), i.getAllSuccessors()), null);
}
visit(nd.getRight(), First.of(nd), null); // from right to assignment.
succ(nd, i.getGuardedSuccessors(nd));
} else {
visitAssign(nd, nd.getLeft(), nd.getRight());
succ(nd, i.getGuardedSuccessors(nd));
}
return null;
}

View File

@@ -852,6 +852,9 @@ public class TypeScriptASTConverter {
case ">>=":
case "<<=":
case ">>>=":
case "??=":
case "&&=":
case "||=":
return new AssignmentExpression(loc, operator, convertLValue(left), right);
default:

View File

@@ -0,0 +1,9 @@
let a = 2;
let b = 3;
a = 23;
a += 19;
a &&= 4;
a ||= 5;
a ??= 6;

View File

@@ -1,4 +1,25 @@
test_getParent
| assignment2.ts:1:5:1:5 | a | assignment2.ts:1:5:1:9 | a = 2 |
| assignment2.ts:1:5:1:9 | a = 2 | assignment2.ts:1:1:1:10 | let a = 2; |
| assignment2.ts:1:9:1:9 | 2 | assignment2.ts:1:5:1:9 | a = 2 |
| assignment2.ts:2:5:2:5 | b | assignment2.ts:2:5:2:9 | b = 3 |
| assignment2.ts:2:5:2:9 | b = 3 | assignment2.ts:2:1:2:10 | let b = 3; |
| assignment2.ts:2:9:2:9 | 3 | assignment2.ts:2:5:2:9 | b = 3 |
| assignment2.ts:4:1:4:1 | a | assignment2.ts:4:1:4:6 | a = 23 |
| assignment2.ts:4:1:4:6 | a = 23 | assignment2.ts:4:1:4:7 | a = 23; |
| assignment2.ts:4:5:4:6 | 23 | assignment2.ts:4:1:4:6 | a = 23 |
| assignment2.ts:5:1:5:1 | a | assignment2.ts:5:1:5:7 | a += 19 |
| assignment2.ts:5:1:5:7 | a += 19 | assignment2.ts:5:1:5:8 | a += 19; |
| assignment2.ts:5:6:5:7 | 19 | assignment2.ts:5:1:5:7 | a += 19 |
| assignment2.ts:7:1:7:1 | a | assignment2.ts:7:1:7:7 | a &&= 4 |
| assignment2.ts:7:1:7:7 | a &&= 4 | assignment2.ts:7:1:7:8 | a &&= 4; |
| assignment2.ts:7:7:7:7 | 4 | assignment2.ts:7:1:7:7 | a &&= 4 |
| assignment2.ts:8:1:8:1 | a | assignment2.ts:8:1:8:7 | a \|\|= 5 |
| assignment2.ts:8:1:8:7 | a \|\|= 5 | assignment2.ts:8:1:8:8 | a \|\|= 5; |
| assignment2.ts:8:7:8:7 | 5 | assignment2.ts:8:1:8:7 | a \|\|= 5 |
| assignment2.ts:9:1:9:1 | a | assignment2.ts:9:1:9:7 | a ??= 6 |
| assignment2.ts:9:1:9:7 | a ??= 6 | assignment2.ts:9:1:9:8 | a ??= 6; |
| assignment2.ts:9:7:9:7 | 6 | assignment2.ts:9:1:9:7 | a ??= 6 |
| assignment.js:1:1:1:1 | a | assignment.js:1:1:1:6 | a = 23 |
| assignment.js:1:1:1:6 | a = 23 | assignment.js:1:1:1:7 | a = 23; |
| assignment.js:1:5:1:6 | 23 | assignment.js:1:1:1:6 | a = 23 |
@@ -468,6 +489,27 @@ test_getParent
| update.js:4:1:4:1 | b | update.js:4:1:4:3 | b-- |
| update.js:4:1:4:3 | b-- | update.js:4:1:4:4 | b--; |
test_getTopLevel
| assignment2.ts:1:5:1:5 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:1:5:1:9 | a = 2 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:1:9:1:9 | 2 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:2:5:2:5 | b | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:2:5:2:9 | b = 3 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:2:9:2:9 | 3 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:4:1:4:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:4:1:4:6 | a = 23 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:4:5:4:6 | 23 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:5:1:5:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:5:1:5:7 | a += 19 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:5:6:5:7 | 19 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:7:1:7:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:7:1:7:7 | a &&= 4 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:7:7:7:7 | 4 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:8:1:8:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:8:1:8:7 | a \|\|= 5 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:8:7:8:7 | 5 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:9:1:9:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:9:1:9:7 | a ??= 6 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:9:7:9:7 | 6 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment.js:1:1:1:1 | a | assignment.js:1:1:12:7 | <toplevel> |
| assignment.js:1:1:1:6 | a = 23 | assignment.js:1:1:12:7 | <toplevel> |
| assignment.js:1:5:1:6 | 23 | assignment.js:1:1:12:7 | <toplevel> |
@@ -937,6 +979,20 @@ test_getTopLevel
| update.js:4:1:4:1 | b | update.js:1:1:5:0 | <toplevel> |
| update.js:4:1:4:3 | b-- | update.js:1:1:5:0 | <toplevel> |
test_getChild
| assignment2.ts:1:5:1:9 | a = 2 | 0 | assignment2.ts:1:5:1:5 | a |
| assignment2.ts:1:5:1:9 | a = 2 | 1 | assignment2.ts:1:9:1:9 | 2 |
| assignment2.ts:2:5:2:9 | b = 3 | 0 | assignment2.ts:2:5:2:5 | b |
| assignment2.ts:2:5:2:9 | b = 3 | 1 | assignment2.ts:2:9:2:9 | 3 |
| assignment2.ts:4:1:4:6 | a = 23 | 0 | assignment2.ts:4:1:4:1 | a |
| assignment2.ts:4:1:4:6 | a = 23 | 1 | assignment2.ts:4:5:4:6 | 23 |
| assignment2.ts:5:1:5:7 | a += 19 | 0 | assignment2.ts:5:1:5:1 | a |
| assignment2.ts:5:1:5:7 | a += 19 | 1 | assignment2.ts:5:6:5:7 | 19 |
| assignment2.ts:7:1:7:7 | a &&= 4 | 0 | assignment2.ts:7:1:7:1 | a |
| assignment2.ts:7:1:7:7 | a &&= 4 | 1 | assignment2.ts:7:7:7:7 | 4 |
| assignment2.ts:8:1:8:7 | a \|\|= 5 | 0 | assignment2.ts:8:1:8:1 | a |
| assignment2.ts:8:1:8:7 | a \|\|= 5 | 1 | assignment2.ts:8:7:8:7 | 5 |
| assignment2.ts:9:1:9:7 | a ??= 6 | 0 | assignment2.ts:9:1:9:1 | a |
| assignment2.ts:9:1:9:7 | a ??= 6 | 1 | assignment2.ts:9:7:9:7 | 6 |
| assignment.js:1:1:1:6 | a = 23 | 0 | assignment.js:1:1:1:1 | a |
| assignment.js:1:1:1:6 | a = 23 | 1 | assignment.js:1:5:1:6 | 23 |
| assignment.js:2:1:2:7 | a += 19 | 0 | assignment.js:2:1:2:1 | a |
@@ -1213,6 +1269,20 @@ test_getChild
| update.js:3:1:3:3 | --b | 0 | update.js:3:3:3:3 | b |
| update.js:4:1:4:3 | b-- | 0 | update.js:4:1:4:1 | b |
test_isPure
| assignment2.ts:1:5:1:5 | a |
| assignment2.ts:1:9:1:9 | 2 |
| assignment2.ts:2:5:2:5 | b |
| assignment2.ts:2:9:2:9 | 3 |
| assignment2.ts:4:1:4:1 | a |
| assignment2.ts:4:5:4:6 | 23 |
| assignment2.ts:5:1:5:1 | a |
| assignment2.ts:5:6:5:7 | 19 |
| assignment2.ts:7:1:7:1 | a |
| assignment2.ts:7:7:7:7 | 4 |
| assignment2.ts:8:1:8:1 | a |
| assignment2.ts:8:7:8:7 | 5 |
| assignment2.ts:9:1:9:1 | a |
| assignment2.ts:9:7:9:7 | 6 |
| assignment.js:1:1:1:1 | a |
| assignment.js:1:5:1:6 | 23 |
| assignment.js:2:1:2:1 | a |
@@ -1708,6 +1778,27 @@ test_stripParens
| primaries.js:28:2:28:5 | (42) | primaries.js:28:3:28:4 | 42 |
| unary.js:6:5:6:7 | (0) | unary.js:6:6:6:6 | 0 |
test_getContainer
| assignment2.ts:1:5:1:5 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:1:5:1:9 | a = 2 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:1:9:1:9 | 2 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:2:5:2:5 | b | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:2:5:2:9 | b = 3 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:2:9:2:9 | 3 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:4:1:4:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:4:1:4:6 | a = 23 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:4:5:4:6 | 23 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:5:1:5:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:5:1:5:7 | a += 19 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:5:6:5:7 | 19 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:7:1:7:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:7:1:7:7 | a &&= 4 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:7:7:7:7 | 4 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:8:1:8:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:8:1:8:7 | a \|\|= 5 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:8:7:8:7 | 5 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:9:1:9:1 | a | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:9:1:9:7 | a ??= 6 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment2.ts:9:7:9:7 | 6 | assignment2.ts:1:1:9:8 | <toplevel> |
| assignment.js:1:1:1:1 | a | assignment.js:1:1:12:7 | <toplevel> |
| assignment.js:1:1:1:6 | a = 23 | assignment.js:1:1:12:7 | <toplevel> |
| assignment.js:1:5:1:6 | 23 | assignment.js:1:1:12:7 | <toplevel> |
@@ -2177,6 +2268,27 @@ test_getContainer
| update.js:4:1:4:1 | b | update.js:1:1:5:0 | <toplevel> |
| update.js:4:1:4:3 | b-- | update.js:1:1:5:0 | <toplevel> |
test_getEnclosingStmt
| assignment2.ts:1:5:1:5 | a | assignment2.ts:1:1:1:10 | let a = 2; |
| assignment2.ts:1:5:1:9 | a = 2 | assignment2.ts:1:1:1:10 | let a = 2; |
| assignment2.ts:1:9:1:9 | 2 | assignment2.ts:1:1:1:10 | let a = 2; |
| assignment2.ts:2:5:2:5 | b | assignment2.ts:2:1:2:10 | let b = 3; |
| assignment2.ts:2:5:2:9 | b = 3 | assignment2.ts:2:1:2:10 | let b = 3; |
| assignment2.ts:2:9:2:9 | 3 | assignment2.ts:2:1:2:10 | let b = 3; |
| assignment2.ts:4:1:4:1 | a | assignment2.ts:4:1:4:7 | a = 23; |
| assignment2.ts:4:1:4:6 | a = 23 | assignment2.ts:4:1:4:7 | a = 23; |
| assignment2.ts:4:5:4:6 | 23 | assignment2.ts:4:1:4:7 | a = 23; |
| assignment2.ts:5:1:5:1 | a | assignment2.ts:5:1:5:8 | a += 19; |
| assignment2.ts:5:1:5:7 | a += 19 | assignment2.ts:5:1:5:8 | a += 19; |
| assignment2.ts:5:6:5:7 | 19 | assignment2.ts:5:1:5:8 | a += 19; |
| assignment2.ts:7:1:7:1 | a | assignment2.ts:7:1:7:8 | a &&= 4; |
| assignment2.ts:7:1:7:7 | a &&= 4 | assignment2.ts:7:1:7:8 | a &&= 4; |
| assignment2.ts:7:7:7:7 | 4 | assignment2.ts:7:1:7:8 | a &&= 4; |
| assignment2.ts:8:1:8:1 | a | assignment2.ts:8:1:8:8 | a \|\|= 5; |
| assignment2.ts:8:1:8:7 | a \|\|= 5 | assignment2.ts:8:1:8:8 | a \|\|= 5; |
| assignment2.ts:8:7:8:7 | 5 | assignment2.ts:8:1:8:8 | a \|\|= 5; |
| assignment2.ts:9:1:9:1 | a | assignment2.ts:9:1:9:8 | a ??= 6; |
| assignment2.ts:9:1:9:7 | a ??= 6 | assignment2.ts:9:1:9:8 | a ??= 6; |
| assignment2.ts:9:7:9:7 | 6 | assignment2.ts:9:1:9:8 | a ??= 6; |
| assignment.js:1:1:1:1 | a | assignment.js:1:1:1:7 | a = 23; |
| assignment.js:1:1:1:6 | a = 23 | assignment.js:1:1:1:7 | a = 23; |
| assignment.js:1:5:1:6 | 23 | assignment.js:1:1:1:7 | a = 23; |
@@ -2612,6 +2724,14 @@ test_getEnclosingStmt
| update.js:4:1:4:1 | b | update.js:4:1:4:4 | b--; |
| update.js:4:1:4:3 | b-- | update.js:4:1:4:4 | b--; |
test_inNullSensitiveContext
| assignment2.ts:5:1:5:1 | a |
| assignment2.ts:5:6:5:7 | 19 |
| assignment2.ts:7:1:7:1 | a |
| assignment2.ts:7:7:7:7 | 4 |
| assignment2.ts:8:1:8:1 | a |
| assignment2.ts:8:7:8:7 | 5 |
| assignment2.ts:9:1:9:1 | a |
| assignment2.ts:9:7:9:7 | 6 |
| assignment.js:2:1:2:1 | a |
| assignment.js:2:6:2:7 | 19 |
| assignment.js:3:1:3:1 | a |

View File

@@ -3048,6 +3048,239 @@ nodes
| torrents.js:7:25:7:27 | loc |
| torrents.js:7:25:7:27 | loc |
| torrents.js:7:25:7:27 | loc |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:24:9:30 | req.url |
| typescript.ts:9:24:9:30 | req.url |
| typescript.ts:9:24:9:30 | req.url |
| typescript.ts:9:24:9:30 | req.url |
| typescript.ts:9:24:9:30 | req.url |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:12:29:12:32 | path |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:20:15:20:18 | path |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:21:39:21:43 | path3 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:23:15:23:18 | path |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:24:39:24:43 | path4 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:30:15:30:18 | path |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| typescript.ts:32:29:32:33 | path6 |
| views.js:1:43:1:55 | req.params[0] |
| views.js:1:43:1:55 | req.params[0] |
| views.js:1:43:1:55 | req.params[0] |
@@ -7362,6 +7595,310 @@ edges
| torrents.js:6:24:6:27 | name | torrents.js:6:12:6:45 | dir + " ... t.data" |
| torrents.js:6:24:6:27 | name | torrents.js:6:12:6:45 | dir + " ... t.data" |
| torrents.js:6:24:6:27 | name | torrents.js:6:12:6:45 | dir + " ... t.data" |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:12:29:12:32 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:20:15:20:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:23:15:23:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:7:9:48 | path | typescript.ts:30:15:30:18 | path |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:37 | url.par ... , true) | typescript.ts:9:14:9:43 | url.par ... ).query |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:43 | url.par ... ).query | typescript.ts:9:14:9:48 | url.par ... ry.path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:14:9:48 | url.par ... ry.path | typescript.ts:9:7:9:48 | path |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:9:24:9:30 | req.url | typescript.ts:9:14:9:37 | url.par ... , true) |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:7:20:18 | path3 | typescript.ts:21:39:21:43 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:20:15:20:18 | path | typescript.ts:20:7:20:18 | path3 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:7:23:18 | path4 | typescript.ts:24:39:24:43 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:23:15:23:18 | path | typescript.ts:23:7:23:18 | path4 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:7:30:18 | path6 | typescript.ts:32:29:32:33 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| typescript.ts:30:15:30:18 | path | typescript.ts:30:7:30:18 | path6 |
| views.js:1:43:1:55 | req.params[0] | views.js:1:43:1:55 | req.params[0] |
#select
| TaintedPath-es6.js:10:26:10:45 | join("public", path) | TaintedPath-es6.js:7:20:7:26 | req.url | TaintedPath-es6.js:10:26:10:45 | join("public", path) | This path depends on $@. | TaintedPath-es6.js:7:20:7:26 | req.url | a user-provided value |
@@ -7497,4 +8034,8 @@ edges
| tainted-string-steps.js:26:18:26:45 | path.sp ... hatever | tainted-string-steps.js:6:24:6:30 | req.url | tainted-string-steps.js:26:18:26:45 | path.sp ... hatever | This path depends on $@. | tainted-string-steps.js:6:24:6:30 | req.url | a user-provided value |
| tainted-string-steps.js:27:18:27:36 | path.split(unknown) | tainted-string-steps.js:6:24:6:30 | req.url | tainted-string-steps.js:27:18:27:36 | path.split(unknown) | This path depends on $@. | tainted-string-steps.js:6:24:6:30 | req.url | a user-provided value |
| torrents.js:7:25:7:27 | loc | torrents.js:5:13:5:38 | parseTo ... t).name | torrents.js:7:25:7:27 | loc | This path depends on $@. | torrents.js:5:13:5:38 | parseTo ... t).name | a user-provided value |
| typescript.ts:12:29:12:32 | path | typescript.ts:9:24:9:30 | req.url | typescript.ts:12:29:12:32 | path | This path depends on $@. | typescript.ts:9:24:9:30 | req.url | a user-provided value |
| typescript.ts:21:39:21:43 | path3 | typescript.ts:9:24:9:30 | req.url | typescript.ts:21:39:21:43 | path3 | This path depends on $@. | typescript.ts:9:24:9:30 | req.url | a user-provided value |
| typescript.ts:24:39:24:43 | path4 | typescript.ts:9:24:9:30 | req.url | typescript.ts:24:39:24:43 | path4 | This path depends on $@. | typescript.ts:9:24:9:30 | req.url | a user-provided value |
| typescript.ts:32:29:32:33 | path6 | typescript.ts:9:24:9:30 | req.url | typescript.ts:32:29:32:33 | path6 | This path depends on $@. | typescript.ts:9:24:9:30 | req.url | a user-provided value |
| views.js:1:43:1:55 | req.params[0] | views.js:1:43:1:55 | req.params[0] | views.js:1:43:1:55 | req.params[0] | This path depends on $@. | views.js:1:43:1:55 | req.params[0] | a user-provided value |

View File

@@ -0,0 +1,34 @@
var fs = require('fs'),
http = require('http'),
url = require('url'),
sanitize = require('sanitize-filename'),
pathModule = require('path')
;
var server = http.createServer(function(req, res) {
let path = url.parse(req.url, true).query.path;
// BAD: This could read any file on the file system
res.write(fs.readFileSync(path));
if (path === 'foo.txt')
res.write(fs.readFileSync(path)); // GOOD: Path is compared to white-list
let path2 = path;
path2 ||= res.write(fs.readFileSync(path2)); // GOOD: path is falsy
let path3 = path;
path3 &&= res.write(fs.readFileSync(path3)); // BAD: path is truthy
let path4 = path;
path4 ??= res.write(fs.readFileSync(path4)); // GOOD - path is null or undefined - but we don't capture that. [INCONSISTENCY]
let path5 = path;
path5 &&= "clean";
res.write(fs.readFileSync(path5)); // GOOD: path is either falsy or "clean";
let path6 = path;
path6 ||= "clean";
res.write(fs.readFileSync(path6)); // BAD: path can still be tainted
});