These launch configs will allow you to debug typescript files directly from VSCode. It will honor the tsconfig and resolve node modules properly. You do not need to install ts-node or nodemon, as everything is run using npx.
{
"configurations": [
{
"type": "node",
"request": "launch",
"name": "ts-node current file",
"runtimeExecutable": "npx",
"runtimeArgs": ["-y", "ts-node"],
"program": "${file}",
"cwd": "${fileDirname}",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "watch current file",
"runtimeExecutable": "npx",
"runtimeArgs": [
"-y",
"nodemon",
"-q",
"--exec",
"$(echo npx -y ts-node ${file})"
],
"program": "${file}",
"cwd": "${fileDirname}",
"restart": true,
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
],
}The first one is pretty straightforward. If the file is src/path/to/example.ts, this is the equivalent of:
cd src/path/to
npx -y ts-node example.ts
It's better to use cwd in this way, as this allows for nested tsconfig files as may appear in a monorepo.
The second one had to be a bit sneaky because of... quirks. nodemon recently added TypeScript support, but internally it simply runs the ts-node command instead of node. However, to avoid the dependency for those using regular JS, they didn't add ts-node to its dependencies. You could avoid this by installing it in the project with npm i -D ts-node, but I wanted these to work without installing anything. This can be solved with nodemon's --exec option by compounding npx scripts:
cd src/path/to
npx -y nodemon -q --exec 'npx -y ts-node' ./example.ts
HOWEVER, you can't directly do this with runtimeArgs in a launch config, because VSCode messes up the quotes. To hack around this
The runtimeExecutable is npx, which allows running modules directly from npm.
This launch config will run the current typescript file in the debugger. This does not require ts-node to be installed, as it runs through npx.
If you want live reloading, you can use the combination of nodemon and ts-node. Unfortunately, I havent found a way to do this without installing ts-node (see below). As in all cases, I strongly recommend adding it as a devDependency in your project rather than installing globally.
npm i -D ts-node
Then you can use this configuration:
{
"configurations": [
{
"type": "node",
"request": "launch",
"name": "watch current file",
"runtimeExecutable": "npx",
"runtimeArgs": ["-y", "nodemon", "-q"],
"program": "${file}",
"cwd": "${fileDirname}",
"restart": true,
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
],
}
{ "configurations": [ { "type": "node", "request": "launch", "name": "ts-node current file", "runtimeExecutable": "npx", "runtimeArgs": ["-y", "ts-node"], "program": "${file}", "cwd": "${fileDirname}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", }, ], }