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