How to Fix Missing vsDebugServer.js in Neovim TypeScript Debugging

I’ve recently been diving into Neovim as a full development environment, and one of the things I really wanted to set up was debugging for TypeScript and JavaScript using DAP (Debug Adapter Protocol).

Well it didn’t go as smoothly as I hoped.

The first time I tried launching the debugger, I was greeted with this delightful error:

Error trying to launch JS debugger: ...utils.lua:64:
Debugger entrypoint file 'C:\Users\MyName\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\ms-vscode.js-debug\out/src/vsDebugServer.js' does not exist.

At first, I thought I had messed up a path somewhere but after digging deeper, I found out the problem wasn’t me.

What Does This Error Actually

I was using the following configuration in my init.lua, assuming I could reuse the built in js debug that ships with Visual Studio Code:

require('dap-vscode-js').setup({
  adapters = { 'pwa-node', 'pwa-chrome' },
  debugger_path = "C:\\Users\\MyName\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\ms-vscode.js-debug"
})

However the ms-vscode.js-debug extension from newer versions of VS Code no longer includes:

out/src/vsDebugServer.js

So Neovim tries to launch a file that simply doesn’t exist anymore, and everything falls apart.

The Solution Manually Point to the Right js-debug Server

Instead of relying on dap-vscode-js to magically find the adapter, I manually configured it using a downloaded version of js-debug-dap.

Final Working Setup (Drop This Into Your DAP Config)

local dap = require('dap')

require("dap").adapters["pwa-node"] = {
  type = "server",
  host = "::1",
  port = 8000,
  executable = {
    command = "node",
    args = {"C:\\Users\\JasonEvans\\Downloads\\js-debug-dap-v1.102.0\\js-debug\\src\\dapDebugServer.js", "8000"},
  }
}

require("dap").configurations.typescript = {
  {
    type = "pwa-node",
    request = "launch",
    name = "Launch file",
    program = "${file}",
    cwd = "${workspaceFolder}",
  },
}

Make sure to replace the path to match wherever you extracted the js-debug folder.

Enable Debugging for JavaScript Too

If you want to reuse the same setup for .js files:

require("dap").configurations.javascript = dap.configurations.typescript

Now I can debug:

index.ts
server.js
React / Next.js .tsx files (if mapped to typescriptreact)

Productivity Boost Add Useful Keybindings

vim.keymap.set("n", "<F5>", ":lua require'dap'.continue()<CR>")
vim.keymap.set("n", "<F10>", ":lua require'dap'.step_over()<CR>")
vim.keymap.set("n", "<F11>", ":lua require'dap'.step_into()<CR>")
vim.keymap.set("n", "<F12>", ":lua require'dap'.step_out()<CR>")

These keybindings make Neovim debugging feel almost like VS Code.

Final Thought

At first, I thought “debugging in Neovim is too complicated”, but the real issue was simply a missing file due to updated folder structures in js-debug. Once I manually pointed the adapter to dapDebugServer.js, everything started working flawlessly.

Related blog posts