This commit is contained in:
dundargoc 2024-05-05 10:04:15 -04:00 committed by GitHub
commit 4a3a7a79be
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 99 additions and 98 deletions

View File

@ -1,22 +1,6 @@
if exists('g:loaded_node_provider')
finish
endif
let g:loaded_node_provider = 1
function! s:is_minimum_version(version, min_version) abort
if empty(a:version)
let nodejs_version = get(split(system(['node', '-v']), "\n"), 0, '')
if v:shell_error || nodejs_version[0] !=# 'v'
return 0
endif
else
let nodejs_version = a:version
endif
" Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
let nodejs_version = matchstr(nodejs_version, '\(\d\.\?\)\+')
" [major, minor, patch]
return !v:lua.vim.version.lt(nodejs_version, a:min_version)
endfunction
let s:NodeHandler = {
\ 'stdout_buffered': v:true,
@ -28,21 +12,6 @@ function! s:NodeHandler.on_exit(job_id, data, event) abort
let self.result = filereadable(entry_point) ? entry_point : ''
endfunction
" Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
" Return 1 if it is supported
" Return 0 otherwise
function! provider#node#can_inspect() abort
if !executable('node')
return 0
endif
let ver = get(split(system(['node', '-v']), "\n"), 0, '')
if v:shell_error || ver[0] !=# 'v'
return 0
endif
return (ver[1] ==# '6' && s:is_minimum_version(ver, '6.12.0'))
\ || s:is_minimum_version(ver, '7.6.0')
endfunction
function! provider#node#Detect() abort
let minver = '6.0.0'
if exists('g:node_host_prog')
@ -51,17 +20,10 @@ function! provider#node#Detect() abort
if !executable('node')
return ['', 'node not found (or not executable)']
endif
if !s:is_minimum_version(v:null, minver)
if !v:lua.vim.provider.node.is_minimum_version(v:null, minver)
return ['', printf('node version %s not found', minver)]
endif
let npm_opts = {}
if executable('npm')
let npm_opts = deepcopy(s:NodeHandler)
let npm_opts.entry_point = '/neovim/bin/cli.js'
let npm_opts.job_id = jobstart('npm --loglevel silent root -g', npm_opts)
endif
let yarn_opts = {}
if executable('yarn')
let yarn_opts = deepcopy(s:NodeHandler)
@ -76,21 +38,6 @@ function! provider#node#Detect() abort
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
endif
let pnpm_opts = {}
if executable('pnpm')
let pnpm_opts = deepcopy(s:NodeHandler)
let pnpm_opts.entry_point = '/neovim/bin/cli.js'
let pnpm_opts.job_id = jobstart('pnpm --loglevel silent root -g', pnpm_opts)
endif
" npm returns the directory faster, so let's check that first
if !empty(npm_opts)
let result = jobwait([npm_opts.job_id])
if result[0] == 0 && npm_opts.result != ''
return [npm_opts.result, '']
endif
endif
if !empty(yarn_opts)
let result = jobwait([yarn_opts.job_id])
if result[0] == 0 && yarn_opts.result != ''
@ -98,6 +45,13 @@ function! provider#node#Detect() abort
endif
endif
let pnpm_opts = {}
if executable('pnpm')
let pnpm_opts = deepcopy(s:NodeHandler)
let pnpm_opts.entry_point = '/neovim/bin/cli.js'
let pnpm_opts.job_id = jobstart('pnpm --loglevel silent root -g', pnpm_opts)
endif
if !empty(pnpm_opts)
let result = jobwait([pnpm_opts.job_id])
if result[0] == 0 && pnpm_opts.result != ''
@ -105,57 +59,18 @@ function! provider#node#Detect() abort
endif
endif
return ['', 'failed to detect node']
endfunction
function! provider#node#Prog() abort
return s:prog
return v:lua.vim.provider.node.detect()
endfunction
function! provider#node#Require(host) abort
if s:err != ''
echoerr s:err
return
endif
let args = ['node']
if !empty($NVIM_NODE_HOST_DEBUG) && provider#node#can_inspect()
call add(args, '--inspect-brk')
endif
call add(args, provider#node#Prog())
return provider#Poll(args, a:host.orig_name, '$NVIM_NODE_LOG_FILE')
return v:lua.vim.provider.node.require(a:host)
endfunction
function! provider#node#Call(method, args) abort
if s:err != ''
echoerr s:err
return
endif
if !exists('s:host')
try
let s:host = remote#host#Require('node')
catch
let s:err = v:exception
echohl WarningMsg
echomsg v:exception
echohl None
return
endtry
endif
return call('rpcrequest', insert(insert(a:args, 'node_'.a:method), s:host))
return v:lua.vim.provider.node.call(a:method, a:args)
endfunction
let s:err = ''
let [s:prog, s:_] = provider#node#Detect()
let g:loaded_node_provider = empty(s:prog) ? 1 : 2
if g:loaded_node_provider != 2
let s:err = 'Cannot find the "neovim" node package. Try :checkhealth'
endif
call remote#host#RegisterPlugin('node-provider', 'node', [])
call v:lua.vim.provider.node.start()

View File

@ -33,7 +33,7 @@ function M.check()
-- Skip further checks, they are nonsense if nodejs is too old.
return
end
if vim.fn['provider#node#can_inspect']() == 0 then
if not require('vim.provider.node').can_inspect() then
health.warn(
'node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.'
)

View File

@ -1,4 +1,5 @@
local M = vim._defer_require('vim.provider', {
node = ..., --- @module 'vim.provider.node'
perl = ..., --- @module 'vim.provider.perl'
python = ..., --- @module 'vim.provider.python'
ruby = ..., --- @module 'vim.provider.ruby'

View File

@ -0,0 +1,85 @@
local M = {}
local s_err ---@type string?
local s_host ---@type string?
--- @param version string?
--- @param min_version string
--- @return boolean
function M.is_minimum_version(version, min_version)
local nodejs_version ---@type string?
if version ~= nil and version ~= '' then
local nodejs_version_system = vim.system({ 'node', '-v' }):wait()
nodejs_version = nodejs_version_system.stdout or ''
if nodejs_version_system.code ~= 0 or not vim.startswith(nodejs_version, 'v') then
return false
end
else
nodejs_version = version
end
-- Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
nodejs_version = vim.fn.matchstr(nodejs_version, [[\(\d\.\?\)\+]])
return vim.version.ge(nodejs_version, min_version)
end
--- Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
--- @return boolean true if it's supported
function M.can_inspect()
if vim.fn.executable('node') ~= 1 then
return false
end
local ver_system = vim.system({ 'node', '-v' }):wait() or ''
local ver = ver_system.stdout or ''
if ver_system.code ~= 0 or not vim.startswith(ver, 'v') then
return false
end
return (vim.startswith(ver, '6') and M.is_minimum_version(ver, '6.12.0'))
or M.is_minimum_version(ver, '7.6.0')
end
function M.detect()
local p = vim.system({ 'npm', '--loglevel', 'silent', 'root', '-g' }):wait()
if p.code == 0 and vim.trim(p.stdout) ~= '' then
return { p.stdout, '' }
end
-- Add yarn and pnmp code here later
return { '', 'failed to detect node' }
end
function M.require(host)
local args = { 'node' }
if vim.env.NVIM_NODE_HOST_DEBUG and M.can_inspect() then
table.insert(args, '--inspect-brk')
end
local prog = vim.fn['provider#node#Detect']()[1] ---@type any
table.insert(args, prog)
return vim.fn['provider#Poll'](args, host.orig_name, '$NVIM_NODE_LOG_FILE')
end
function M.call(method, args)
if s_err then
return
end
if not s_host then
local ok, result = pcall(vim.fn['remote#host#Require'], 'node') ---@type any, any
if not ok then
s_err = result
vim.api.nvim_echo({ { result, 'WarningMsg' } }, true, {})
return
end
s_host = result
end
return vim.fn.rpcrequest(s_host, 'node_' .. method, unpack(args))
end
function M.start()
vim.fn['remote#host#RegisterPlugin']('node-provider', 'node', {})
end
return M