return {
  'mfussenegger/nvim-dap',
  dependencies = {
    'leoluz/nvim-dap-go',
    { 'theHamsta/nvim-dap-virtual-text', opts = {} },
    {
      'rcarriga/nvim-dap-ui',
      dependencies = { 'nvim-neotest/nvim-nio' },
      keys = {
        {
          '<leader>du',
          function()
            require('dapui').toggle {}
          end,
          desc = 'Dap UI',
        },
        {
          '<leader>de',
          function()
            require('dapui').eval()
          end,
          desc = 'Eval',
          mode = { 'n', 'v' },
        },
      },
      opts = {},
      config = function(_, opts)
        local dap = require 'dap'
        local dapui = require 'dapui'
        dapui.setup(opts)
        dap.listeners.after.event_initialized['dapui_config'] = function()
          dapui.open {}
        end
        dap.listeners.before.event_terminated['dapui_config'] = function()
          dapui.close {}
        end
        dap.listeners.before.event_exited['dapui_config'] = function()
          dapui.close {}
        end
      end,
    },
  },

  keys = {
    {
      '<leader>dB',
      function()
        require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ')
      end,
      desc = 'Breakpoint Condition',
    },
    {
      '<leader>db',
      function()
        require('dap').toggle_breakpoint()
      end,
      desc = 'Toggle Breakpoint',
    },
    {
      '<leader>dc',
      function()
        require('dap').continue()
      end,
      desc = 'Run/Continue',
    },
    -- {
    --   '<leader>da',
    --   function()
    --     require('dap').continue { before = get_args }
    --   end,
    --   desc = 'Run with Args',
    -- },
    {
      '<leader>dC',
      function()
        require('dap').run_to_cursor()
      end,
      desc = 'Run to Cursor',
    },
    {
      '<leader>dg',
      function()
        require('dap').goto_()
      end,
      desc = 'Go to Line (No Execute)',
    },
    {
      '<leader>di',
      function()
        require('dap').step_into()
      end,
      desc = 'Step Into',
    },
    {
      '<leader>dj',
      function()
        require('dap').down()
      end,
      desc = 'Down',
    },
    {
      '<leader>dk',
      function()
        require('dap').up()
      end,
      desc = 'Up',
    },
    {
      '<leader>dl',
      function()
        require('dap').run_last()
      end,
      desc = 'Run Last',
    },
    {
      '<leader>do',
      function()
        require('dap').step_out()
      end,
      desc = 'Step Out',
    },
    {
      '<leader>dO',
      function()
        require('dap').step_over()
      end,
      desc = 'Step Over',
    },
    {
      '<leader>dP',
      function()
        require('dap').pause()
      end,
      desc = 'Pause',
    },
    {
      '<leader>dr',
      function()
        require('dap').repl.toggle()
      end,
      desc = 'Toggle REPL',
    },
    {
      '<leader>ds',
      function()
        require('dap').session()
      end,
      desc = 'Session',
    },
    {
      '<leader>dt',
      function()
        require('dap').terminate()
      end,
      desc = 'Terminate',
    },
    {
      '<leader>dw',
      function()
        require('dap.ui.widgets').hover()
      end,
      desc = 'Widgets',
    },
  },

  config = function()
    -- load mason-nvim-dap here, after all adapters have been setup
    -- if LazyVim.has 'mason-nvim-dap.nvim' then
    --   require('mason-nvim-dap').setup(LazyVim.opts 'mason-nvim-dap.nvim')
    -- end
    -- TODO: add icons

    vim.api.nvim_set_hl(0, 'DapStoppedLine', { default = true, link = 'Visual' })

    -- for name, sign in pairs(LazyVim.config.icons.dap) do
    --   sign = type(sign) == 'table' and sign or { sign }
    --   vim.fn.sign_define('Dap' .. name, { text = sign[1], texthl = sign[2] or 'DiagnosticInfo', linehl = sign[3], numhl = sign[3] })
    -- end

    -- local dap = require 'dap'
    -- if not dap.adapters['pwa-node'] then
    --   require('dap').adapters['pwa-node'] = {
    --     type = 'server',
    --     host = 'localhost',
    --     port = '${port}',
    --     executable = {
    --       command = 'node',
    --       -- 💀 Make sure to update this path to point to your installation
    --       args = {
    --         LazyVim.get_pkg_path('js-debug-adapter', '/js-debug/src/dapDebugServer.js'),
    --         '${port}',
    --       },
    --     },
    --   }
    -- end
    -- if not dap.adapters['node'] then
    --   dap.adapters['node'] = function(cb, config)
    --     if config.type == 'node' then
    --       config.type = 'pwa-node'
    --     end
    --     local nativeAdapter = dap.adapters['pwa-node']
    --     if type(nativeAdapter) == 'function' then
    --       nativeAdapter(cb, config)
    --     else
    --       cb(nativeAdapter)
    --     end
    --   end
    -- end
    --
    -- local js_filetypes = { 'typescript', 'javascript', 'typescriptreact', 'javascriptreact' }
    --
    -- local vscode = require 'dap.ext.vscode'
    -- vscode.type_to_filetypes['node'] = js_filetypes
    -- vscode.type_to_filetypes['pwa-node'] = js_filetypes
    --
    -- for _, language in ipairs(js_filetypes) do
    --   if not dap.configurations[language] then
    --     dap.configurations[language] = {
    --       {
    --         type = 'pwa-node',
    --         request = 'launch',
    --         name = 'Launch file',
    --         program = '${file}',
    --         cwd = '${workspaceFolder}',
    --       },
    --       {
    --         type = 'pwa-node',
    --         request = 'attach',
    --         name = 'Attach',
    --         processId = require('dap.utils').pick_process,
    --         cwd = '${workspaceFolder}',
    --       },
    --     }
    --   end
    -- end
  end,
}
