From 46a9d77cc33dff93a8a5bb71d823b1b8e5e19715 Mon Sep 17 00:00:00 2001 From: Guilherme Date: Wed, 5 Nov 2025 18:21:31 +0100 Subject: [PATCH 1/6] fix(nodejs): use experimental sql parameter for nodejs --- lua/copilot/lsp/binary.lua | 1 + lua/copilot/lsp/nodejs.lua | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/copilot/lsp/binary.lua b/lua/copilot/lsp/binary.lua index a8635d47..0193c641 100644 --- a/lua/copilot/lsp/binary.lua +++ b/lua/copilot/lsp/binary.lua @@ -270,6 +270,7 @@ end ---@return table function M.get_execute_command() return { + "--experimental-sqlite", M.server_path or M.get_server_path(), "--stdio", } diff --git a/lua/copilot/lsp/nodejs.lua b/lua/copilot/lsp/nodejs.lua index eb506159..9de8d668 100644 --- a/lua/copilot/lsp/nodejs.lua +++ b/lua/copilot/lsp/nodejs.lua @@ -96,7 +96,10 @@ end ---@return table function M.get_execute_command() - return util.append_command(M.node_command, { M.server_path or M.get_server_path(), "--stdio" }) + return util.append_command( + M.node_command, + { "--experimental-sqlite", M.server_path or M.get_server_path(), "--stdio" } + ) end ---@param node_command? string|string[] From 891c20ce7ff66911d41b517117bc85e24934dd0f Mon Sep 17 00:00:00 2001 From: Guilherme Date: Thu, 6 Nov 2025 14:23:16 +0100 Subject: [PATCH 2/6] feat(nodejs): check version to add args --- lua/copilot/lsp/binary.lua | 11 ++++++----- lua/copilot/lsp/nodejs.lua | 9 +++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lua/copilot/lsp/binary.lua b/lua/copilot/lsp/binary.lua index 0193c641..90eb7d4e 100644 --- a/lua/copilot/lsp/binary.lua +++ b/lua/copilot/lsp/binary.lua @@ -1,5 +1,6 @@ local util = require("copilot.util") local logger = require("copilot.logger") +local nodejs = require("copilot.lsp.nodejs") local M = { ---@class copilot_server_info @@ -269,11 +270,11 @@ end ---@return table function M.get_execute_command() - return { - "--experimental-sqlite", - M.server_path or M.get_server_path(), - "--stdio", - } + local args = { M.server_path or M.get_server_path(), "--stdio" } + if nodejs.get_node_version() < 25 then + table.insert(args, 1, "--experimental-sqlite") + end + return util.append_command(M.node_command, args) end ---@return copilot_server_info diff --git a/lua/copilot/lsp/nodejs.lua b/lua/copilot/lsp/nodejs.lua index 9de8d668..bee325a9 100644 --- a/lua/copilot/lsp/nodejs.lua +++ b/lua/copilot/lsp/nodejs.lua @@ -96,10 +96,11 @@ end ---@return table function M.get_execute_command() - return util.append_command( - M.node_command, - { "--experimental-sqlite", M.server_path or M.get_server_path(), "--stdio" } - ) + local args = { M.server_path or M.get_server_path(), "--stdio" } + if M.node_version < 25 then + table.insert(args, 1, "--experimental-sqlite") + end + return util.append_command(M.node_command, args) end ---@param node_command? string|string[] From 8c3a2c1bebfbef4fa9fb3f4796223c2681c7892b Mon Sep 17 00:00:00 2001 From: Guilherme Date: Thu, 6 Nov 2025 14:37:04 +0100 Subject: [PATCH 3/6] fix(nodejs): comparison nodejs version --- lua/copilot/lsp/binary.lua | 8 +++++--- lua/copilot/lsp/nodejs.lua | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lua/copilot/lsp/binary.lua b/lua/copilot/lsp/binary.lua index 90eb7d4e..561e8f96 100644 --- a/lua/copilot/lsp/binary.lua +++ b/lua/copilot/lsp/binary.lua @@ -197,7 +197,7 @@ function M.init() local plugin_path = vim.fs.normalize(util.get_plugin_path()) local copilot_server_info = M.get_copilot_server_info() local download_filename = - string.format("copilot-language-server-%s-%s.zip", copilot_server_info.path, copilot_version) + string.format("copilot-language-server-%s-%s.zip", copilot_server_info.path, copilot_version) local url = string.format( "https://github.com/github/copilot-language-server-release/releases/download/%s/%s", copilot_version, @@ -205,7 +205,7 @@ function M.init() ) local local_server_zip_path = vim.fs.joinpath(plugin_path, "copilot/", copilot_server_info.path) local local_server_zip_filepath = - vim.fs.joinpath(plugin_path, "copilot/", copilot_server_info.path, download_filename) + vim.fs.joinpath(plugin_path, "copilot/", copilot_server_info.path, download_filename) logger.trace("copilot_server_info: ", copilot_server_info) @@ -271,7 +271,9 @@ end ---@return table function M.get_execute_command() local args = { M.server_path or M.get_server_path(), "--stdio" } - if nodejs.get_node_version() < 25 then + local node_version = nodejs.get_node_version() + local node_version_major = tonumber(string.match(node_version or "", "^(%d+)%.")) or 0 + if node_version_major < 25 then table.insert(args, 1, "--experimental-sqlite") end return util.append_command(M.node_command, args) diff --git a/lua/copilot/lsp/nodejs.lua b/lua/copilot/lsp/nodejs.lua index bee325a9..b2f56b22 100644 --- a/lua/copilot/lsp/nodejs.lua +++ b/lua/copilot/lsp/nodejs.lua @@ -97,7 +97,8 @@ end ---@return table function M.get_execute_command() local args = { M.server_path or M.get_server_path(), "--stdio" } - if M.node_version < 25 then + local node_version_major = tonumber(string.match(M.node_version or "", "^(%d+)%.")) or 0 + if node_version_major < 25 then table.insert(args, 1, "--experimental-sqlite") end return util.append_command(M.node_command, args) From f58c73329116e2d08fb7aff98a3b2a6383b2900b Mon Sep 17 00:00:00 2001 From: Guilherme Date: Thu, 6 Nov 2025 22:04:16 +0100 Subject: [PATCH 4/6] refactor(lsp): move node version check to util --- lua/copilot/lsp/binary.lua | 11 +++-------- lua/copilot/lsp/nodejs.lua | 7 ++----- lua/copilot/util.lua | 13 +++++++++++++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lua/copilot/lsp/binary.lua b/lua/copilot/lsp/binary.lua index 561e8f96..8a0238f0 100644 --- a/lua/copilot/lsp/binary.lua +++ b/lua/copilot/lsp/binary.lua @@ -197,7 +197,7 @@ function M.init() local plugin_path = vim.fs.normalize(util.get_plugin_path()) local copilot_server_info = M.get_copilot_server_info() local download_filename = - string.format("copilot-language-server-%s-%s.zip", copilot_server_info.path, copilot_version) + string.format("copilot-language-server-%s-%s.zip", copilot_server_info.path, copilot_version) local url = string.format( "https://github.com/github/copilot-language-server-release/releases/download/%s/%s", copilot_version, @@ -205,7 +205,7 @@ function M.init() ) local local_server_zip_path = vim.fs.joinpath(plugin_path, "copilot/", copilot_server_info.path) local local_server_zip_filepath = - vim.fs.joinpath(plugin_path, "copilot/", copilot_server_info.path, download_filename) + vim.fs.joinpath(plugin_path, "copilot/", copilot_server_info.path, download_filename) logger.trace("copilot_server_info: ", copilot_server_info) @@ -270,13 +270,8 @@ end ---@return table function M.get_execute_command() - local args = { M.server_path or M.get_server_path(), "--stdio" } local node_version = nodejs.get_node_version() - local node_version_major = tonumber(string.match(node_version or "", "^(%d+)%.")) or 0 - if node_version_major < 25 then - table.insert(args, 1, "--experimental-sqlite") - end - return util.append_command(M.node_command, args) + return util.get_node_args(M.server_path or M.get_server_path(), node_version) end ---@return copilot_server_info diff --git a/lua/copilot/lsp/nodejs.lua b/lua/copilot/lsp/nodejs.lua index b2f56b22..d0caed48 100644 --- a/lua/copilot/lsp/nodejs.lua +++ b/lua/copilot/lsp/nodejs.lua @@ -96,11 +96,8 @@ end ---@return table function M.get_execute_command() - local args = { M.server_path or M.get_server_path(), "--stdio" } - local node_version_major = tonumber(string.match(M.node_version or "", "^(%d+)%.")) or 0 - if node_version_major < 25 then - table.insert(args, 1, "--experimental-sqlite") - end + local args = util.get_node_args(M.server_path or M.get_server_path(), M.node_version) + return util.append_command(M.node_command, args) end diff --git a/lua/copilot/util.lua b/lua/copilot/util.lua index 0942981b..1f5a1223 100644 --- a/lua/copilot/util.lua +++ b/lua/copilot/util.lua @@ -187,4 +187,17 @@ function M.append_command(cmd, append) return full_cmd end +---@param server_path string +---@param node_version string|nil +---@return string[] +function M.get_node_args(server_path, node_version) + local args = { server_path, "--stdio" } + local node_version_major = tonumber(string.match(node_version or "", "^(%d+)%.")) or 0 + if node_version_major < 25 then + table.insert(args, 1, "--experimental-sqlite") + end + + return args +end + return M From 8c9837e3b7213146c3c1631c0c84e93e8f0661e0 Mon Sep 17 00:00:00 2001 From: Antoine Gaudreau Simard Date: Fri, 7 Nov 2025 11:10:24 -0500 Subject: [PATCH 5/6] test: fix tests --- tests/stubs/nodejs.lua | 26 +++++++++++++++++++++----- tests/test_nodejs.lua | 34 ++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/tests/stubs/nodejs.lua b/tests/stubs/nodejs.lua index 05c35402..0718e0f1 100644 --- a/tests/stubs/nodejs.lua +++ b/tests/stubs/nodejs.lua @@ -39,12 +39,23 @@ function M.process(stdout, code, fail, callback) return captured_args end -M.valid_node_version = "22.0.0" M.invalid_node_version = "10.0.0" +M.valid_node_version_22 = "22.0.0" +M.valid_node_version_24 = "24.0.0" +M.valid_node_version_25 = "25.0.0" ---Convenience wrapper for Stub.process for a valid Node.js version (>= 22) -function M.valid_node(callback) - return M.process("v" .. M.valid_node_version, 0, false, callback) +function M.valid_node_22(callback) + return M.process("v" .. M.valid_node_version_22, 0, false, callback) +end + +---Convenience wrapper for Stub.process for a valid Node.js version (>= 22) +function M.valid_node_24(callback) + return M.process("v" .. M.valid_node_version_24, 0, false, callback) +end + +function M.valid_node_25(callback) + return M.process("v" .. M.valid_node_version_25, 0, false, callback) end ---Convenience wrapper for Stub.process for an invalid Node.js version (< 22) @@ -53,8 +64,9 @@ function M.invalid_node(callback) end ---@param callback function the function to call while vim.api.nvim_get_runtime_file is stubbed +---@param node_function function|nil ---@return string|nil captured_path -- the path vim.api.nvim_get_runtime_file was called with -function M.get_runtime_server_path(callback) +function M.get_runtime_server_path(callback, node_function) local captured_path = nil local original_get_file = vim.api.nvim_get_runtime_file @@ -70,8 +82,12 @@ function M.get_runtime_server_path(callback) return 1 end + if node_function == nil then + node_function = M.valid_node_25 + end + -- stub valid node version for callback so setup() succeeds - M.valid_node(function() + node_function(function() -- wrap callback in pcall to ensure vim.api.nvim_get_runtime_file is restored if callback errors local ok, err = pcall(callback) vim.api.nvim_get_runtime_file = original_get_file diff --git a/tests/test_nodejs.lua b/tests/test_nodejs.lua index 2a53f785..b53572c5 100644 --- a/tests/test_nodejs.lua +++ b/tests/test_nodejs.lua @@ -15,47 +15,47 @@ local T = MiniTest.new_set({ T["get_node_version()"] = MiniTest.new_set() T["get_node_version()"]["default node command"] = function() - local captured_args = stub.valid_node(function() + local captured_args = stub.valid_node_22(function() stub.nodejs.setup() local version, error = stub.nodejs.get_node_version() - eq(version, stub.valid_node_version) + eq(version, stub.valid_node_version_22) eq(error, nil) end) eq(captured_args, { "node", "--version" }) end T["get_node_version()"]["custom node command as string"] = function() - local captured_args = stub.valid_node(function() + local captured_args = stub.valid_node_22(function() stub.nodejs.setup("/usr/local/bin/node") local version, error = stub.nodejs.get_node_version() - eq(version, stub.valid_node_version) + eq(version, stub.valid_node_version_22) eq(error, nil) end) eq(captured_args, { "/usr/local/bin/node", "--version" }) end T["get_node_version()"]["custom node command as string with spaces"] = function() - local captured_args = stub.valid_node(function() + local captured_args = stub.valid_node_22(function() stub.nodejs.setup("/path to/node") local version, error = stub.nodejs.get_node_version() - eq(version, stub.valid_node_version) + eq(version, stub.valid_node_version_22) eq(error, nil) end) eq(captured_args, { "/path to/node", "--version" }) end T["get_node_version()"]["custom node command as table"] = function() - local captured_args = stub.valid_node(function() + local captured_args = stub.valid_node_22(function() stub.nodejs.setup({ "mise", "x", "node@lts", "--", "node" }) local version, error = stub.nodejs.get_node_version() - eq(version, stub.valid_node_version) + eq(version, stub.valid_node_version_22) eq(error, nil) end) eq(captured_args, { "mise", "x", "node@lts", "--", "node", "--version" }) @@ -99,6 +99,24 @@ end T["get_execute_command()"] = MiniTest.new_set() +T["get_execute_command()"]["default node command v22, default server path"] = function() + local captured_path = stub.get_runtime_server_path(function() + eq(stub.nodejs.setup(), true) + local cmd = stub.nodejs.get_execute_command() + eq(cmd, { "node", "--experimental-sqlite", vim.fn.expand(stub.default_server_path), "--stdio" }) + end, stub.valid_node_22) + eq(captured_path, stub.default_server_path) +end + +T["get_execute_command()"]["default node command v24, default server path"] = function() + local captured_path = stub.get_runtime_server_path(function() + eq(stub.nodejs.setup(), true) + local cmd = stub.nodejs.get_execute_command() + eq(cmd, { "node", "--experimental-sqlite", vim.fn.expand(stub.default_server_path), "--stdio" }) + end, stub.valid_node_24) + eq(captured_path, stub.default_server_path) +end + T["get_execute_command()"]["default node command, default server path"] = function() local captured_path = stub.get_runtime_server_path(function() eq(stub.nodejs.setup(), true) From a11b223bcc88968d6573694f1f16370cf030304b Mon Sep 17 00:00:00 2001 From: Antoine Gaudreau Simard Date: Fri, 7 Nov 2025 11:31:27 -0500 Subject: [PATCH 6/6] fix support for binary server --- lua/copilot/config/server.lua | 4 +++- lua/copilot/lsp/binary.lua | 2 +- lua/copilot/lsp/nodejs.lua | 2 +- lua/copilot/util.lua | 5 +++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lua/copilot/config/server.lua b/lua/copilot/config/server.lua index 84b837d9..23aa78c2 100644 --- a/lua/copilot/config/server.lua +++ b/lua/copilot/config/server.lua @@ -1,5 +1,7 @@ +---@alias ServerType string<'nodejs', 'binary'> + ---@class (exact) ServerConfig ----@field type string<'nodejs', 'binary'> Type of the server +---@field type ServerType Type of the server ---@field custom_server_filepath? string|nil Path to the custom server file, can be absolute, relative or a file name (for PATH) local server = { diff --git a/lua/copilot/lsp/binary.lua b/lua/copilot/lsp/binary.lua index 8a0238f0..029c073b 100644 --- a/lua/copilot/lsp/binary.lua +++ b/lua/copilot/lsp/binary.lua @@ -271,7 +271,7 @@ end ---@return table function M.get_execute_command() local node_version = nodejs.get_node_version() - return util.get_node_args(M.server_path or M.get_server_path(), node_version) + return util.get_node_args(M.server_path or M.get_server_path(), "binary", node_version) end ---@return copilot_server_info diff --git a/lua/copilot/lsp/nodejs.lua b/lua/copilot/lsp/nodejs.lua index d0caed48..98c6107c 100644 --- a/lua/copilot/lsp/nodejs.lua +++ b/lua/copilot/lsp/nodejs.lua @@ -96,7 +96,7 @@ end ---@return table function M.get_execute_command() - local args = util.get_node_args(M.server_path or M.get_server_path(), M.node_version) + local args = util.get_node_args(M.server_path or M.get_server_path(), "nodejs", M.node_version) return util.append_command(M.node_command, args) end diff --git a/lua/copilot/util.lua b/lua/copilot/util.lua index 1f5a1223..80f176a7 100644 --- a/lua/copilot/util.lua +++ b/lua/copilot/util.lua @@ -188,12 +188,13 @@ function M.append_command(cmd, append) end ---@param server_path string +---@param server_type ServerType ---@param node_version string|nil ---@return string[] -function M.get_node_args(server_path, node_version) +function M.get_node_args(server_path, server_type, node_version) local args = { server_path, "--stdio" } local node_version_major = tonumber(string.match(node_version or "", "^(%d+)%.")) or 0 - if node_version_major < 25 then + if (server_type == "nodejs") and (node_version_major < 25) then table.insert(args, 1, "--experimental-sqlite") end