You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.7 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

var fs = require('fs')
var path = require('path')
var resolve = require('resolve').sync
var rc = require('rc')
var spawnSync = require('child_process').spawnSync
var isWin32 = process.platform === 'win32'
'use strict';
// resolvers
module.exports = [
nativeResolve,
nodePathResolve,
userHomeResolve,
nodeModulesResolve,
yarnModulesResolve,
prefixResolve,
execPathResolve
]
function resolveFn(module, basePath, dirname) {
try {
return resolve(module, {
basedir: path.join(basePath, dirname || '')
})
} catch (e) {}
}
// resolve using native require() function
// if NODE_PATH is defined, a global module should be natively resolved
function nativeResolve(module, dirname) {
try {
return require.resolve(module, dirname)
} catch (e) {}
}
// See: http://nodejs.org/docs/latest/api/modules.html#modules_loading_from_the_global_folders
// required?
function nodePathResolve(module, dirname) {
var i, l, modulePath
var nodePath = process.env.NODE_PATH
if (!nodePath) { return }
nodePath = nodePath.split(path.delimiter).map(function (nodepath) {
return path.normalize(nodepath)
})
for (i = 0, l = nodePath.length; i < l; i += 1) {
if (modulePath = resolveFn(module, dirname || nodePath[i])) {
break
}
}
return modulePath
}
function userHomeResolve(module) {
var i, l, modulePath
var homePath = isWin32 ? process.env['USERPROFILE'] : process.env['HOME']
var paths = [
'node_modules',
'node_libraries',
'node_packages'
]
for (i = 0, l = paths.length; i < l; i += 1) {
if (modulePath = resolveFn(module, homePath, paths[i])) {
break;
}
}
return modulePath
}
// See: https://npmjs.org/doc/files/npm-folders.html#prefix-Configuration
// it uses execPath to discover the default prefix on *nix and %APPDATA% on Windows
function prefixResolve(module) {
var modulePath, dirname
var prefix = rc('npm').prefix
if (isWin32) {
prefix = prefix || path.join(process.env.APPDATA, 'npm')
dirname = prefix
}
else {
prefix = prefix || path.join(path.dirname(process.execPath), '..')
dirname = path.join(prefix, 'lib')
}
dirname = path.join(dirname, 'node_modules')
modulePath = resolveFn(module, dirname)
return modulePath
}
// Resolves packages using the node installation path
// Useful for resolving global packages such as npm when the prefix has been overriden by the user
function execPathResolve(module) {
var modulePath, dirname
var execPath = path.dirname(process.execPath)
if (isWin32) {
dirname = execPath
}
else {
dirname = path.join(execPath, '..', 'lib')
}
dirname = path.join(dirname, 'node_modules')
modulePath = resolveFn(module, dirname)
return modulePath
}
function nodeModulesResolve(module) {
var i, l, modulePath
var nodeModules = process.env['NODE_MODULES']
if (typeof nodeModules === 'string') {
nodeModules = nodeModules.split(path.delimiter)
for (i = 0, l = nodeModules.length; i < l; i += 1) {
if (modulePath = resolveFn(module, nodeModules[i])) {
break;
}
}
}
return modulePath
}
function yarnModulesResolve(module) {
var i, modulePath;
// Retrieve yarn global path
var yarnCmd = isWin32 ? 'yarn.cmd' : 'yarn';
var result = spawnSync(yarnCmd, ['global', 'dir'], { encoding: 'utf8' });
if (!result.error && result.stdout) {
var yarnPath = result.stdout.replace(/[\r\n]+/g, '');
var nodeModulesStr = path.join(yarnPath, 'node_modules');
if (typeof nodeModulesStr === 'string') {
var nodeModules = nodeModulesStr.split(path.delimiter);
for (i = 0; i < nodeModules.length; i++) {
if (modulePath = resolveFn(module, nodeModules[i])) {
break;
}
}
}
}
return modulePath;
}