-
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
9ab50bb
commit ad24ee2
Showing
6 changed files
with
180 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,100 @@ | ||
" 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, PR welcome' | ||
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...' | ||
let ninja_flag = '' | ||
let 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 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') | ||
execute('AsyncRun -mode=term -pos=tab -program=make -post=call\ spacevim\\#plug\\#nodejs\\#postbuild(code) @'.jobs_flag) | ||
endfunction | ||
|
||
function! spacevim#plug#nodejs#postbuild(exit_code) | ||
execute 'tcd' fnameescape(s:cwd) | ||
unlet s:cwd | ||
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 | ||
|
||
" Check for Node.js >= v16.10 | ||
function! s:isNodeJsVersionSufficient(node) | ||
if executable(a:node) == 1 | ||
let node_version = system(a:node.' --version') | ||
let node_version_parts = map(filter(split(node_version, '\v\ze\.|v'), 'v:val =~# "\\v\\d+"'), 'matchstr(v:val, "\\v\\d+")') | ||
if len(node_version_parts) >= 2 && (node_version_parts[0] > 16 || (node_version_parts[0] == 16 && node_version_parts[1] >= 10)) | ||
return 1 | ||
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:isNodeJsVersionSufficient('$NODE') | ||
let $PATH = fnamemodify('$NODE', ':h').pathsep.$PATH | ||
return 0 | ||
endif | ||
" Prefer user plugin Node.js if it exists | ||
if s:isNodeJsVersionSufficient(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:isNodeJsVersionSufficient('node') | ||
return 0 | ||
endif | ||
return 1 | ||
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