From d0fe3416538b2b6dc12676ac4f1f0437dacb4f96 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 15 Mar 2025 18:26:33 -0500 Subject: [PATCH 1/4] fix bug with res.del when the first arguments it's a function --- .../v4-deprecated-signatures/delete.input.ts | 9 ++++++++ .../v4-deprecated-signatures/delete.output.ts | 9 ++++++++ transforms/v4-deprecated-signatures.ts | 23 +++++++++++++++---- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts index 844634f..fca9495 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts @@ -3,6 +3,15 @@ import express from "express"; const app = express(); app.get("/", (req, res) => {}); + +app.del(() => { + myImportantLogic(); +}); + +app.del(function () { + myImportantLogic(); +}); + app.del("/old", () => { myImportantLogic(); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts index 64d81fc..7282fc7 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts @@ -3,6 +3,15 @@ import express from "express"; const app = express(); app.get("/", (req, res) => {}); + +app.del(() => { + myImportantLogic(); +}); + +app.del(function () { + myImportantLogic(); +}); + app.delete("/old", () => { myImportantLogic(); }); diff --git a/transforms/v4-deprecated-signatures.ts b/transforms/v4-deprecated-signatures.ts index d54fda2..c1a0a7d 100644 --- a/transforms/v4-deprecated-signatures.ts +++ b/transforms/v4-deprecated-signatures.ts @@ -1,5 +1,5 @@ import type { API, ASTPath, FileInfo } from 'jscodeshift' -import { CallExpression, Identifier, callExpression, identifier, memberExpression, withParser } from 'jscodeshift' +import { CallExpression, callExpression, identifier, memberExpression, withParser } from 'jscodeshift' import { recursiveParent } from '../utils/recursiveParent' const separateStatusAndBody = (path: ASTPath, calleePropertyName: string) => { @@ -94,10 +94,25 @@ export default function transformer(file: FileInfo, _api: API): string { }) parsedFile - .find(Identifier, { - name: 'del', + .find(CallExpression, { + callee: { + property: { + name: 'del', + }, + }, + }) + .map((path) => { + const pathArguments = path.node.arguments + + if (pathArguments[0].type === 'ArrowFunctionExpression' || pathArguments[0].type === 'FunctionExpression') + return path + + if (path.node.callee.type === 'MemberExpression' && path.node.callee.property.type === 'Identifier') { + path.node.callee.property.name = 'delete' + } + + return path }) - .replaceWith(() => identifier('delete')) parsedFile .find(CallExpression, { From 910777c146d8c16d0ce23f918ae8b8271c7411fc Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 15 Mar 2025 18:28:13 -0500 Subject: [PATCH 2/4] test: add more tests --- .../v4-deprecated-signatures/json.input.ts | 14 ++++++++++++++ .../v4-deprecated-signatures/json.output.ts | 14 ++++++++++++++ .../v4-deprecated-signatures/jsonp.input.ts | 4 ++++ .../v4-deprecated-signatures/jsonp.output.ts | 4 ++++ .../v4-deprecated-signatures/redirect.input.ts | 14 ++++++++++++++ .../v4-deprecated-signatures/redirect.output.ts | 14 ++++++++++++++ .../v4-deprecated-signatures/send-file.input.ts | 8 ++++++++ .../v4-deprecated-signatures/send-file.output.ts | 8 ++++++++ .../v4-deprecated-signatures/send.input.ts | 14 ++++++++++++++ .../v4-deprecated-signatures/send.output.ts | 14 ++++++++++++++ 10 files changed, 108 insertions(+) diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/json.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/json.input.ts index 56fc2b4..2f23e2a 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/json.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/json.input.ts @@ -2,6 +2,20 @@ import express from "express"; const app = express(); +app.get("/json", function (...arg) { + const [, res] = arg + res.json(); +}); + +app.get("/json", function (...arg) { + const [, res] = arg + res.json({ user: "Username", isValid: true }, 200); +}); + +app.get("/json", function (req, res) { + res.json(); +}); + app.get("/json", function (req, res) { res.json({ user: "Username", isValid: true }, 200); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/json.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/json.output.ts index 92905a1..c25583c 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/json.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/json.output.ts @@ -2,6 +2,20 @@ import express from "express"; const app = express(); +app.get("/json", function (...arg) { + const [, res] = arg + res.json(); +}); + +app.get("/json", function (...arg) { + const [, res] = arg + res.status(200).json({ user: "Username", isValid: true }); +}); + +app.get("/json", function (req, res) { + res.json(); +}); + app.get("/json", function (req, res) { res.status(200).json({ user: "Username", isValid: true }); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.input.ts index 99b2b2f..88a7e27 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.input.ts @@ -2,6 +2,10 @@ import express from "express"; const app = express(); +app.get("/json", function (req, res) { + res.json(); +}); + app.get("/jsonp", function (req, res) { res.jsonp({ user: "Username", isValid: true }, 200); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.output.ts index 2a8e4c1..4aafe06 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/jsonp.output.ts @@ -2,6 +2,10 @@ import express from "express"; const app = express(); +app.get("/json", function (req, res) { + res.json(); +}); + app.get("/jsonp", function (req, res) { res.status(200).jsonp({ user: "Username", isValid: true }); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/redirect.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/redirect.input.ts index b31fa65..5f21753 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/redirect.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/redirect.input.ts @@ -3,6 +3,20 @@ import { redirect } from "somelibrary"; const app = express(); +app.get("/", function (...arg) { + const [, res] = arg + res.redirect(); +}); + +app.get("/", function (...arg) { + const [, res] = arg + res.redirect("/other-page", 301); +}); + +app.get("/", function (req, res) { + res.redirect(); +}); + app.get("/", function (req, res) { res.redirect("/other-page", 301); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/redirect.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/redirect.output.ts index f14a6b6..5843b1d 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/redirect.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/redirect.output.ts @@ -3,6 +3,20 @@ import { redirect } from "somelibrary"; const app = express(); +app.get("/", function (...arg) { + const [, res] = arg + res.redirect(); +}); + +app.get("/", function (...arg) { + const [, res] = arg + res.redirect(301, "/other-page"); +}); + +app.get("/", function (req, res) { + res.redirect(); +}); + app.get("/", function (req, res) { res.redirect(301, "/other-page"); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/send-file.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/send-file.input.ts index c7a7902..37926ea 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/send-file.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/send-file.input.ts @@ -22,6 +22,14 @@ const sharedSendFile = (res, next, fileName) => { }) } +app.get('/file/:name', (req, res, next) => { + res.sendfile() +}) + +app.get('/file/:name', (req, res, next) => { + res.sendfile("file.txt") +}) + app.get('/file/:name', (req, res, next) => { const fileName = req.params.name diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/send-file.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/send-file.output.ts index 170b666..f222bc4 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/send-file.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/send-file.output.ts @@ -22,6 +22,14 @@ const sharedSendFile = (res, next, fileName) => { }) } +app.get('/file/:name', (req, res, next) => { + res.sendFile() +}) + +app.get('/file/:name', (req, res, next) => { + res.sendFile("file.txt") +}) + app.get('/file/:name', (req, res, next) => { const fileName = req.params.name diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/send.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/send.input.ts index d2d38fa..f436e85 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/send.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/send.input.ts @@ -2,6 +2,20 @@ import express from "express"; const app = express(); +app.get("/send", function (...arg) { + const [, res] = arg + res.send(); +}); + +app.get("/send", function (...arg) { + const [, res] = arg + res.send(200, true); +}); + +app.get("/send", function (req, res) { + res.send(); +}); + app.get("/send", function (req, res) { res.send(200, { hello: "world" }); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/send.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/send.output.ts index f317983..0824a61 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/send.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/send.output.ts @@ -2,6 +2,20 @@ import express from "express"; const app = express(); +app.get("/send", function (...arg) { + const [, res] = arg + res.send(); +}); + +app.get("/send", function (...arg) { + const [, res] = arg + res.status(200).send(true); +}); + +app.get("/send", function (req, res) { + res.send(); +}); + app.get("/send", function (req, res) { res.status(200).send({ hello: "world" }); }); From 08191b1281c44fe9299eb3ec2372d454e879cbbf Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 15 Mar 2025 19:51:26 -0500 Subject: [PATCH 3/4] test: add some test --- .../v4-deprecated-signatures/delete.input.ts | 6 ++++++ .../v4-deprecated-signatures/delete.output.ts | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts index fca9495..8cc6851 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts @@ -16,6 +16,12 @@ app.del("/old", () => { myImportantLogic(); }); +function noModify() { + let a + + app.del(a) +} + const myImportantLogic = () => { console.log("making sure it's there"); }; diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts index 7282fc7..17df364 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts @@ -16,6 +16,12 @@ app.delete("/old", () => { myImportantLogic(); }); +function noModify() { + let a + + app.del(a) +} + const myImportantLogic = () => { console.log("making sure it's there"); }; From ebb3299099c611df516089f326800bb66cee42ed Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 15 Mar 2025 20:04:24 -0500 Subject: [PATCH 4/4] test: add more test for delete method --- .../v4-deprecated-signatures/delete.input.ts | 12 ++++++++++++ .../v4-deprecated-signatures/delete.output.ts | 12 ++++++++++++ transforms/v4-deprecated-signatures.ts | 6 +++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts b/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts index 8cc6851..aeab3e3 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/delete.input.ts @@ -4,6 +4,18 @@ const app = express(); app.get("/", (req, res) => {}); +app.del([""],() => { + myImportantLogic(); +}); + +app.del([],() => { + myImportantLogic(); +}); + +app.del(/d/,() => { + myImportantLogic(); +}); + app.del(() => { myImportantLogic(); }); diff --git a/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts b/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts index 17df364..b1dbf42 100644 --- a/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts +++ b/transforms/__testfixtures__/v4-deprecated-signatures/delete.output.ts @@ -4,6 +4,18 @@ const app = express(); app.get("/", (req, res) => {}); +app.delete([""],() => { + myImportantLogic(); +}); + +app.delete([],() => { + myImportantLogic(); +}); + +app.delete(/d/,() => { + myImportantLogic(); +}); + app.del(() => { myImportantLogic(); }); diff --git a/transforms/v4-deprecated-signatures.ts b/transforms/v4-deprecated-signatures.ts index c1a0a7d..a2f3978 100644 --- a/transforms/v4-deprecated-signatures.ts +++ b/transforms/v4-deprecated-signatures.ts @@ -104,7 +104,11 @@ export default function transformer(file: FileInfo, _api: API): string { .map((path) => { const pathArguments = path.node.arguments - if (pathArguments[0].type === 'ArrowFunctionExpression' || pathArguments[0].type === 'FunctionExpression') + if ( + pathArguments[0].type !== 'RegExpLiteral' && + pathArguments[0].type !== 'StringLiteral' && + pathArguments[0].type !== 'ArrayExpression' + ) return path if (path.node.callee.type === 'MemberExpression' && path.node.callee.property.type === 'Identifier') {