Skip to content

Commit cff0734

Browse files
murderteethclaude
andcommitted
Recognize legacy @now/node type aliases
Extends the Vercel serverless handler detection to also match the deprecated Zeit-era @now/node package with NowRequest/NowResponse types. Per-review feedback from asgerf, these aliases still appear in real-world code. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent dfe0559 commit cff0734

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ module VercelNode {
3232
this = any(Module m).getAnExportedValue("default").getAFunctionValue() and
3333
req = this.getParameter(0) and
3434
res = this.getParameter(1) and
35-
req.hasUnderlyingType("@vercel/node", "VercelRequest") and
36-
res.hasUnderlyingType("@vercel/node", "VercelResponse")
35+
req.hasUnderlyingType(["@vercel/node", "@now/node"], ["NowRequest", "VercelRequest"]) and
36+
res.hasUnderlyingType(["@vercel/node", "@now/node"], ["NowResponse", "VercelResponse"])
3737
}
3838

3939
/** Gets the parameter that contains the request object. */
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { NowRequest, NowResponse } from "@now/node";
2+
3+
// Legacy Zeit-era aliases. The model should treat these identically to
4+
// the modern @vercel/node NowRequest -> VercelRequest, NowResponse -> VercelResponse.
5+
export default function handler(req: NowRequest, res: NowResponse) {
6+
res.send(req.query.name);
7+
}

javascript/ql/test/library-tests/frameworks/vercel/tests.expected

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
test_RouteHandler
2+
| src/now.ts:5:16:7:1 | functio ... ame);\\n} |
23
| src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
34
test_RequestSource
5+
| src/now.ts:5:33:5:35 | req | src/now.ts:5:16:7:1 | functio ... ame);\\n} |
46
| src/vercel.ts:9:33:9:35 | req | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
57
test_ResponseSource
8+
| src/now.ts:5:50:5:52 | res | src/now.ts:5:16:7:1 | functio ... ame);\\n} |
69
| src/vercel.ts:9:53:9:55 | res | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
710
| src/vercel.ts:23:3:23:17 | res.status(200) | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
811
test_HeaderDefinition
912
| src/vercel.ts:19:3:19:44 | res.set ... /html") | content-type | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
1013
test_RedirectInvocation
1114
| src/vercel.ts:26:3:26:39 | res.red ... string) | src/vercel.ts:26:16:26:38 | req.que ... string | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
1215
test_RequestInputAccess
16+
| src/now.ts:6:12:6:20 | req.query | parameter | src/now.ts:5:16:7:1 | functio ... ame);\\n} |
1317
| src/vercel.ts:11:13:11:21 | req.query | parameter | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
1418
| src/vercel.ts:12:13:12:20 | req.body | body | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
1519
| src/vercel.ts:13:13:13:23 | req.cookies | cookie | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
@@ -18,5 +22,6 @@ test_RequestInputAccess
1822
| src/vercel.ts:16:15:16:33 | req.headers.referer | header | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
1923
| src/vercel.ts:26:16:26:24 | req.query | parameter | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
2024
test_ResponseSendArgument
25+
| src/now.ts:6:12:6:25 | req.query.name | src/now.ts:5:16:7:1 | functio ... ame);\\n} |
2126
| src/vercel.ts:22:12:22:12 | q | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |
2227
| src/vercel.ts:23:24:23:24 | b | src/vercel.ts:9:16:27:1 | functio ... ing);\\n} |

0 commit comments

Comments
 (0)