mirror of https://github.com/neovim/neovim.git
Merge f6953e2333
into efb44e0cad
This commit is contained in:
commit
4a3a7a79be
|
@ -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()
|
||||
|
|
|
@ -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.'
|
||||
)
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue