romainl's node.js require.resolve()
This commit is contained in:
parent
9d8e497069
commit
dc9bcfed89
|
@ -0,0 +1,105 @@
|
||||||
|
" https://gist.github.com/romainl/1f50c55b0ee92e5420de51e6c4b38491
|
||||||
|
|
||||||
|
setlocal includeexpr=RESOLVE(v:fname)
|
||||||
|
|
||||||
|
function! RESOLVE(module) abort
|
||||||
|
let built_ins = [
|
||||||
|
\ "assert",
|
||||||
|
\ "async_hooks",
|
||||||
|
\ "child_process",
|
||||||
|
\ "cluster",
|
||||||
|
\ "crypto",
|
||||||
|
\ "dns",
|
||||||
|
\ "domain",
|
||||||
|
\ "events",
|
||||||
|
\ "fs",
|
||||||
|
\ "http",
|
||||||
|
\ "http2",
|
||||||
|
\ "https",
|
||||||
|
\ "inspector",
|
||||||
|
\ "net",
|
||||||
|
\ "os",
|
||||||
|
\ "path",
|
||||||
|
\ "perf_hooks",
|
||||||
|
\ "punycode",
|
||||||
|
\ "querystring",
|
||||||
|
\ "readline",
|
||||||
|
\ "stream",
|
||||||
|
\ "string_decoder",
|
||||||
|
\ "tls",
|
||||||
|
\ "tty",
|
||||||
|
\ "dgram",
|
||||||
|
\ "url",
|
||||||
|
\ "util",
|
||||||
|
\ "v8",
|
||||||
|
\ "vm",
|
||||||
|
\ "zlib" ]
|
||||||
|
|
||||||
|
" There's no source file for built-in node modules.
|
||||||
|
" Example: var http = require('http');
|
||||||
|
if index(built_ins, a:module) != -1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Handling absolute and relative paths.
|
||||||
|
" Example: var foo = require('./foo.js');
|
||||||
|
if a:module =~ '^\/' || a:module =~ '^\.\{1,2}\/'
|
||||||
|
let root = fnamemodify(substitute(finddir("node_modules", ".;"), '/node_modules', '', ''), ':p:h:h')
|
||||||
|
if a:module =~ '^\.\{1,2}\/'
|
||||||
|
let module = substitute(a:module, '^\.\{1,2}\/', '', '')
|
||||||
|
endif
|
||||||
|
|
||||||
|
let filename = 0
|
||||||
|
try
|
||||||
|
let filename = findfile(module, root)
|
||||||
|
catch
|
||||||
|
try
|
||||||
|
let filename = findfile(module . ".js", root)
|
||||||
|
catch
|
||||||
|
try
|
||||||
|
let filename = findfile(module . "/index.js", root)
|
||||||
|
catch
|
||||||
|
let filename = 0
|
||||||
|
endtry
|
||||||
|
endtry
|
||||||
|
endtry
|
||||||
|
|
||||||
|
return filename
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Handling vendored-in modules.
|
||||||
|
" Example: var _ = require('lodash');
|
||||||
|
for dir in NODE_MODULES_PATHS()
|
||||||
|
" require('module') => node_modules/module/package.json#main => node_modules/module/**/...
|
||||||
|
if filereadable(dir . "/" . a:module . "/package.json")
|
||||||
|
let package = json_decode(join(readfile(dir . "/" . a:module . "/package.json")))
|
||||||
|
return dir . "/" . a:module . "/" . substitute(get(package, "main", "index.js"), '^\.\{1,2}\/', '', '')
|
||||||
|
endif
|
||||||
|
|
||||||
|
" require('module') => node_modules/module/index.js
|
||||||
|
if filereadable(dir . "/" . a:module . "/index.js")
|
||||||
|
return dir . "/" . a:module . "/index.js"
|
||||||
|
endif
|
||||||
|
|
||||||
|
" require('module') => node_modules/module.js
|
||||||
|
if filereadable(dir . "/" . a:module . ".js")
|
||||||
|
return dir . "/" . a:module . ".js"
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" well, well, well
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! NODE_MODULES_PATHS() abort
|
||||||
|
" node_modules/
|
||||||
|
let node_modules = finddir("node_modules", ".;")
|
||||||
|
|
||||||
|
" node_modules/foo/node_modules/
|
||||||
|
let basic_dirs = extend([node_modules], globpath(node_modules, "*/node_modules", 1, 1))
|
||||||
|
|
||||||
|
" node_modules/@foo/bar/node_modules/
|
||||||
|
let all_dirs = extend(basic_dirs, globpath(node_modules, "@*/*/node_modules", 1, 1))
|
||||||
|
|
||||||
|
return all_dirs
|
||||||
|
endfunction
|
Loading…
Reference in New Issue