-
Notifications
You must be signed in to change notification settings - Fork 254
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ae8237c
commit 5cc90a2
Showing
6 changed files
with
186 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
" Check for Node.js >= v16.10 | ||
function! s:isVersionSufficient(file) | ||
if executable(a:file) == 1 | ||
let version = system(a:file.' --version') | ||
if !v:shell_error | ||
let version_parts = map(filter(split(version, '\v\ze\.|v'), 'v:val =~# "\\v\\d+"'), 'matchstr(v:val, "\\v\\d+")') | ||
if len(version_parts) >= 2 && (version_parts[0] > 16 || (version_parts[0] == 16 && version_parts[1] >= 10)) | ||
return 1 | ||
endif | ||
endif | ||
endif | ||
return 0 | ||
endfunction | ||
|
||
" Will do the following checks in order of precedence: | ||
" -Use $NODE or $NODE/node if they exist and are executable | ||
" -check for node as vim-plug plugin (user-specific) | ||
" -check for system-wide install of node | ||
" -If all above fail will get node as vim-plug plugin and build it | ||
" Changes $PATH to include node path | ||
function! spacevim#plug#nodejs#IsBuildRequired() | ||
let pathsep = g:spacevim.os.windows ? ';' : ':' | ||
" Prefer $NODE override | ||
if exists('$NODE') && s:isVersionSufficient('$NODE') | ||
let $PATH = fnamemodify('$NODE', ':h').pathsep.$PATH | ||
return 0 | ||
endif | ||
" Prefer user plugin Node.js if it exists | ||
if s:isVersionSufficient(g:plug_home.'/node/node') | ||
let $PATH = g:plug_home.'/node'.pathsep.$PATH | ||
return 0 | ||
endif | ||
" Last check for system-wide Node.js | ||
if s:isVersionSufficient('node') | ||
return 0 | ||
endif | ||
return 1 | ||
endfunction | ||
|
||
" If no valid $NODE or systemwide node.js: build node.js dependency | ||
function! spacevim#plug#nodejs#Build(info) | ||
if !spacevim#load('programming') | ||
echom "nodejs layer requires the 'programming' layer to build. Add 'programming' layer to init.spacevim" | ||
return | ||
endif | ||
if g:spacevim.os.windows | ||
echom 'Building Node.js automatically on Windows is untested and likely to fail' | ||
execute('AsyncRun -mode=term -pos=tab @ .\\vcbuild openssl-no-asm') | ||
return | ||
endif | ||
if (!exists('$CC') && executable('gcc') != 1) || | ||
\ executable('make') != 1 || executable('python3') != 1 | ||
echom 'Unable to build Node.js, requires a C++ compiler, make, and python3' | ||
return | ||
endif | ||
|
||
echom 'Building Node.js, please wait 60+ seconds for build to start...' | ||
let ninja_flag = '' | ||
let s:jobs_flag = '' | ||
if executable('ninja') | ||
let ninja_flag=' --ninja' | ||
else | ||
" Determine number of cores/threads for make -j, ninja autodetects | ||
let num_threads = 4 | ||
if executable('lscpu') | ||
let result = system("lscpu | grep -E '?^(CPU\\(s\\):|Thread\\(s\\) per core:)' | tr -s ' ' | cut -f 2 -d:") | ||
if !v:shell_error | ||
let num_threads = join(split(result), '*') | ||
endif | ||
endif | ||
let s:jobs_flag = ' -j '.num_threads | ||
endif | ||
|
||
" Build intermediate files to temp, vim will delete folder on exit | ||
let s:cwd = getcwd() | ||
let temp_dir = fnamemodify(tempname(), ':p:h') | ||
call mkdir(temp_dir.'/out', 'p') | ||
if getftype('out') =~# 'link' | ||
call system('rm out') | ||
endif | ||
call system('ln -s '.temp_dir.'/out out') | ||
call system('./configure'.ninja_flag.' > '.temp_dir.'/nodejs_configure.log') | ||
autocmd User asyncrun.vim ++once execute( | ||
\ 'AsyncRun -cwd='.s:cwd.' -mode=term -pos=tab -program=make -post=call\ spacevim\#plug\#nodejs\#PostBuild(code) @'.s:jobs_flag) | ||
call timer_start(60000, { -> plug#load('asyncrun.vim') }) | ||
endfunction | ||
|
||
function! spacevim#plug#nodejs#PostBuild(exit_code) | ||
execute 'tcd' fnameescape(s:cwd) | ||
unlet s:cwd s:jobs_flag | ||
if a:exit_code == 0 | ||
call system('rm -r deps/icu-tmp node') | ||
call rename('out/Release/node', 'node') | ||
let pathsep = g:spacevim.os.windows ? ';' : ':' | ||
let $PATH = g:plug_home.'/node'.pathsep.$PATH | ||
|
||
" This sets up corepack/npm links the same as `make install` does | ||
call system('ln -s deps/corepack/dist/corepack.js corepack') | ||
call system('ln -s deps/npm/bin/npm-cli.js npm') | ||
call system('ln -s deps/npm/bin/npx-cli.js npx') | ||
call system('node corepack enable') | ||
endif | ||
call system('rm out') | ||
tcd - | ||
endfunction | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# nodejs Layer | ||
|
||
## Table of Contents | ||
|
||
<!-- vim-markdown-toc GFM --> | ||
* [Description](#description) | ||
* [Install](#install) | ||
* [Key Bindings](#keybindings) | ||
|
||
<!-- vim-markdown-toc --> | ||
|
||
## Description | ||
|
||
This layer adds support for the Node.js tool. | ||
|
||
## Install | ||
|
||
To use this layer, add it to your `~/.spacevim` as follows: | ||
|
||
``` | ||
let g:spacevim_layers = [ | ||
\ 'programming', 'nodejs', | ||
\ ] | ||
``` | ||
|
||
If Node.js is installed system-wide and is version >= 16.10 then that will be used. Otherwise the nodejs layer requires the programming layer to build Node.js as a dependency within vim-plug's plugged directory. | ||
|
||
Node.js built with the repo requires 1.2 GiB space. Intermediate files are deleted after build. | ||
|
||
If you instead wish to use Node.js elsewhere (not on `$PATH`), this package will look at `$NODE` and use that if it is of sufficient version. | ||
|
||
The curated node will be added to `$PATH` for use by other plugins. Node.js >= v16.10 also includes yarn/npm, useful for other plugins to install dependencies. |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
if spacevim#plug#nodejs#IsBuildRequired() | ||
MP 'nodejs/node', { 'do': function('spacevim#plug#nodejs#Build') } | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters