Upgrade typescript
Client: nodejs
Patch: Cameron Martin

Typescript was on a really old version, and upgrading this is necessary for future changes. Upgrading this required upgrading `@types/node` and `commander`, since the old versions of these are not compatible with the newer version of typescript.

This closes #3084
diff --git a/LANGUAGES.md b/LANGUAGES.md
index 05e2947..eca3dfb 100644
--- a/LANGUAGES.md
+++ b/LANGUAGES.md
@@ -252,7 +252,7 @@
 <td align=left><a href="https://github.com/apache/thrift/blob/master/lib/nodets/README.md">node.ts</a></td>
 <!-- Since -----------------><td>0.12.0</td>
 <!-- Build Systems ---------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>3.1.6</td><td></td>
+<!-- Language Levels -------><td>5.7.2</td><td></td>
 <!-- Field types -----------><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Low-Level Transports --><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Transport Wrappers ----><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td>
diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.js
index 1d137ff..617039b 100644
--- a/lib/nodejs/test/client.js
+++ b/lib/nodejs/test/client.js
@@ -29,7 +29,7 @@
   require("./test_driver").ThriftTestDriverPromise;
 const SecondService = require(`./${helpers.genPath}/SecondService`);
 
-const program = require("commander");
+const { program } = require("commander");
 
 program
   .option(
@@ -49,7 +49,7 @@
   .option("--ssl", "use SSL transport")
   .option("--callback", "test with callback style functions")
   .option(
-    "-t, --type <type>",
+    "--type <type>",
     "Select server type (http|multiplex|tcp|websocket)",
     "tcp",
   )
@@ -57,26 +57,27 @@
   .option("--es5", "Use es5 code")
   .parse(process.argv);
 
-const host = program.host;
-const port = program.port;
-const domainSocket = program.domainSocket;
-const ssl = program.ssl;
-let type = program.type;
+const opts = program.opts();
+const host = opts.host;
+const port = opts.port;
+const domainSocket = opts.domainSocket;
+const ssl = opts.ssl;
+let type = opts.type;
 
 /* for compatibility with cross test invocation for http transport testing */
-if (program.transport === "http") {
-  program.transport = "buffered";
+if (opts.transport === "http") {
+  opts.transport = "buffered";
   type = "http";
 }
 
-if (program.transport === "websocket") {
-  program.transport = "buffered";
+if (opts.transport === "websocket") {
+  opts.transport = "buffered";
   type = "websocket";
 }
 
 const options = {
-  transport: helpers.transports[program.transport],
-  protocol: helpers.protocols[program.protocol],
+  transport: helpers.transports[opts.transport],
+  protocol: helpers.protocols[opts.protocol],
 };
 
 if (type === "http" || type === "websocket") {
@@ -101,10 +102,8 @@
 
 let connection;
 let client;
-const testDriver = program.callback
-  ? ThriftTestDriver
-  : ThriftTestDriverPromise;
-if (helpers.ecmaMode === "es6" && program.callback) {
+const testDriver = opts.callback ? ThriftTestDriver : ThriftTestDriverPromise;
+if (helpers.ecmaMode === "es6" && opts.callback) {
   console.log("ES6 does not support callback style");
   process.exit(0);
 }
diff --git a/lib/nodejs/test/episodic-code-generation-test/client.js b/lib/nodejs/test/episodic-code-generation-test/client.js
index 631bfe7..cf014c2 100644
--- a/lib/nodejs/test/episodic-code-generation-test/client.js
+++ b/lib/nodejs/test/episodic-code-generation-test/client.js
@@ -22,7 +22,7 @@
 const assert = require("assert");
 const test = require("tape");
 const thrift = require("thrift");
-const program = require("commander");
+const { program } = require("commander");
 
 program
   .option("--host <host>", "Set the thrift server host to connect", "localhost")
@@ -32,8 +32,9 @@
 const Service = require("./gen-2/second-episode/gen-nodejs/Service");
 const Types = require("types-package/first-episode/Types_types");
 
-const host = program.host;
-const port = program.port;
+const opts = program.opts();
+const host = opts.host;
+const port = opts.port;
 
 const options = {
   transport: thrift.TBufferedTransport,
diff --git a/lib/nodejs/test/episodic-code-generation-test/server.js b/lib/nodejs/test/episodic-code-generation-test/server.js
index feca380..2b9a96d 100644
--- a/lib/nodejs/test/episodic-code-generation-test/server.js
+++ b/lib/nodejs/test/episodic-code-generation-test/server.js
@@ -20,7 +20,7 @@
  */
 
 const thrift = require("../../lib/thrift");
-const program = require("commander");
+const { program } = require("commander");
 
 program
   .option("--port <port>", "Set the thrift server port", 9090)
@@ -29,7 +29,8 @@
 const Service = require("./gen-2/second-episode/gen-nodejs/Service");
 const Types = require("types-package/first-episode/Types_types");
 
-const port = program.port;
+const opts = program.opts();
+const port = opts.port;
 
 const options = {
   transport: thrift.TBufferedTransport,
diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js
index c8e7808..b56bea7 100644
--- a/lib/nodejs/test/server.js
+++ b/lib/nodejs/test/server.js
@@ -22,7 +22,7 @@
 const fs = require("fs");
 const path = require("path");
 const thrift = require("../lib/thrift");
-const program = require("commander");
+const { program } = require("commander");
 const helpers = require("./helpers");
 
 program
@@ -40,7 +40,7 @@
   .option("--port <port>", "Set thrift server port", 9090)
   .option("--domain-socket <path>", "Set thift server unix domain socket")
   .option(
-    "-t, --type <type>",
+    "--type <type>",
     "Select server type (http|multiplex|tcp|websocket)",
     "tcp",
   )
@@ -53,22 +53,23 @@
 const SecondService = require(`./${helpers.genPath}/SecondService`);
 const { ThriftTestHandler } = require("./test_handler");
 
-const port = program.port;
-const domainSocket = program.domainSocket;
-const ssl = program.ssl;
+const opts = program.opts();
+const port = opts.port;
+const domainSocket = opts.domainSocket;
+const ssl = opts.ssl;
 
-let type = program.type;
-if (program.transport === "http") {
-  program.transport = "buffered";
+let type = opts.type;
+if (opts.transport === "http") {
+  opts.transport = "buffered";
   type = "http";
-} else if (program.transport === "websocket") {
-  program.transport = "buffered";
+} else if (opts.transport === "websocket") {
+  opts.transport = "buffered";
   type = "websocket";
 }
 
 let options = {
-  transport: helpers.transports[program.transport],
-  protocol: helpers.protocols[program.protocol],
+  transport: helpers.transports[opts.transport],
+  protocol: helpers.protocols[opts.protocol],
 };
 
 if (type === "http" || type === "websocket") {
diff --git a/lib/nodets/test/client.ts b/lib/nodets/test/client.ts
index a95567f..c2666bc 100644
--- a/lib/nodets/test/client.ts
+++ b/lib/nodets/test/client.ts
@@ -25,17 +25,18 @@
 import ThriftTestDriver = test_driver.ThriftTestDriver;
 import ThriftTestDriverPromise = test_driver.ThriftTestDriverPromise;
 
-// var program = require("commander");
-import * as program from "commander";
+import { program } from "commander";
 
 program
-  .option("--port <port>", "Set thrift server port number to connect", 9090)
+  .option("--port <port>", "Set thrift server port number to connect", Number.parseInt, 9090)
   .option("--promise", "test with promise style functions")
   .option("--protocol", "Set thrift protocol (binary) [protocol]")
   .parse(process.argv);
 
-var port: number = program.port;
-var promise = program.promise;
+
+var opts = program.opts();
+var port: number = opts.port;
+var promise = opts.promise;
 
 var options = {
   transport: Thrift.TBufferedTransport,
diff --git a/lib/nodets/test/server.ts b/lib/nodets/test/server.ts
index 79457ce..5911384 100644
--- a/lib/nodets/test/server.ts
+++ b/lib/nodets/test/server.ts
@@ -1,15 +1,17 @@
 import thrift = require("thrift");
-var program = require("commander");
-import ThriftTest = require("./gen-nodejs/ThriftTest");
-import test_handler = require("./test_handler");
+import { program } from 'commander';
+import ThriftTest = require('./gen-nodejs/ThriftTest');
+import test_handler = require('./test_handler');
+
 
 program
-  .option("--port <port>", "Set thrift server port", 9090)
-  .option("--promise", "test with promise style functions")
-  .option("--protocol", '"Set thrift protocol (binary) [protocol]"')
+  .option('--port <port>', 'Set thrift server port', Number.parseInt, 9090)
+  .option('--promise', 'test with promise style functions')
+  .option('--protocol', '"Set thrift protocol (binary) [protocol]"')
   .parse(process.argv);
 
-var port: number = program.port;
+var opts = program.opts();
+var port: number = opts.port;
 
 var options: thrift.ServerOptions = {
   transport: thrift.TBufferedTransport,
@@ -17,12 +19,8 @@
 };
 
 var server: thrift.Server;
-if (program.promise) {
-  server = thrift.createServer(
-    ThriftTest.Processor,
-    new test_handler.AsyncThriftTestHandler(),
-    options,
-  );
+if (opts.promise) {
+  server = thrift.createServer(ThriftTest.Processor, new test_handler.AsyncThriftTestHandler(), options);
 } else {
   server = thrift.createServer(
     ThriftTest.Processor,
diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json
index 244d91d..9740000 100644
--- a/lib/ts/package-lock.json
+++ b/lib/ts/package-lock.json
@@ -31,7 +31,7 @@
         "jslint": "^0.12.0",
         "node-int64": "^0.4.0",
         "phantom": "^6.0.3",
-        "typescript": "^3.2.4"
+        "typescript": "^5.7.2"
       }
     },
     "node_modules/@babel/parser": {
@@ -85,10 +85,13 @@
       "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA=="
     },
     "node_modules/@types/node": {
-      "version": "10.12.18",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz",
-      "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==",
-      "dev": true
+      "version": "22.10.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz",
+      "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==",
+      "dev": true,
+      "dependencies": {
+        "undici-types": "~6.20.0"
+      }
     },
     "node_modules/@types/node-int64": {
       "version": "0.4.29",
@@ -4631,16 +4634,16 @@
       "dev": true
     },
     "node_modules/typescript": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
-      "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
+      "version": "5.7.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+      "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
       "dev": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
       },
       "engines": {
-        "node": ">=4.2.0"
+        "node": ">=14.17"
       }
     },
     "node_modules/uc.micro": {
@@ -4729,6 +4732,12 @@
         "node": "*"
       }
     },
+    "node_modules/undici-types": {
+      "version": "6.20.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "dev": true
+    },
     "node_modules/uri-js": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
diff --git a/lib/ts/package.json b/lib/ts/package.json
index 13aefaa..17988c6 100644
--- a/lib/ts/package.json
+++ b/lib/ts/package.json
@@ -27,7 +27,7 @@
     "jslint": "^0.12.0",
     "node-int64": "^0.4.0",
     "phantom": "^6.0.3",
-    "typescript": "^3.2.4"
+    "typescript": "^5.7.2"
   },
   "dependencies": {
     "bufferutil": "^4.0.1",
diff --git a/package-lock.json b/package-lock.json
index 9b7db5c..701dd07 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,11 +17,11 @@
       },
       "devDependencies": {
         "@eslint/js": "^9.18.0",
-        "@types/node": "^10.12.6",
+        "@types/node": "^22.10.5",
         "@types/node-int64": "^0.4.29",
         "@types/q": "^1.5.1",
         "buffer-equals": "^1.0.4",
-        "commander": "^2.14.1",
+        "commander": "^13.0.0",
         "connect": "^3.6.6",
         "eslint": "^9.18.0",
         "eslint-config-prettier": "^10.0.1",
@@ -33,7 +33,7 @@
         "nyc": "^15.0.0",
         "prettier": "^3.4.2",
         "tape": "^4.9.0",
-        "typescript": "^3.1.6",
+        "typescript": "^5.7.2",
         "utf-8-validate": "^5.0.0"
       },
       "engines": {
@@ -718,15 +718,18 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "10.12.6",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.6.tgz",
-      "integrity": "sha512-+ZWB5Ec1iki99xQFzBlivlKxSZQ+fuUKBott8StBOnLN4dWbRHlgdg1XknpW6g0tweniN5DcOqA64CJyOUPSAw==",
-      "dev": true
+      "version": "22.10.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz",
+      "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==",
+      "dev": true,
+      "dependencies": {
+        "undici-types": "~6.20.0"
+      }
     },
     "node_modules/@types/node-int64": {
-      "version": "0.4.29",
-      "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz",
-      "integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==",
+      "version": "0.4.32",
+      "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.32.tgz",
+      "integrity": "sha512-xf/JsSlnXQ+mzvc0IpXemcrO4BrCfpgNpMco+GLcXkFk01k/gW9lGJu+Vof0ZSvHK6DsHJDPSbjFPs36QkWXqw==",
       "dev": true,
       "dependencies": {
         "@types/node": "*"
@@ -1073,10 +1076,13 @@
       }
     },
     "node_modules/commander": {
-      "version": "2.19.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
-      "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
-      "dev": true
+      "version": "13.0.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-13.0.0.tgz",
+      "integrity": "sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=18"
+      }
     },
     "node_modules/commondir": {
       "version": "1.0.1",
@@ -3568,16 +3574,16 @@
       }
     },
     "node_modules/typescript": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
-      "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
+      "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
       "dev": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
       },
       "engines": {
-        "node": ">=4.2.0"
+        "node": ">=14.17"
       }
     },
     "node_modules/uc.micro": {
@@ -3592,6 +3598,12 @@
       "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
       "dev": true
     },
+    "node_modules/undici-types": {
+      "version": "6.20.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "dev": true
+    },
     "node_modules/unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
diff --git a/package.json b/package.json
index 6ed792d..c86c155 100644
--- a/package.json
+++ b/package.json
@@ -44,11 +44,11 @@
   },
   "devDependencies": {
     "@eslint/js": "^9.18.0",
-    "@types/node": "^10.12.6",
+    "@types/node": "^22.10.5",
     "@types/node-int64": "^0.4.29",
     "@types/q": "^1.5.1",
     "buffer-equals": "^1.0.4",
-    "commander": "^2.14.1",
+    "commander": "^13.0.0",
     "connect": "^3.6.6",
     "eslint": "^9.18.0",
     "eslint-config-prettier": "^10.0.1",
@@ -60,7 +60,7 @@
     "nyc": "^15.0.0",
     "prettier": "^3.4.2",
     "tape": "^4.9.0",
-    "typescript": "^3.1.6",
+    "typescript": "^5.7.2",
     "utf-8-validate": "^5.0.0"
   },
   "scripts": {