react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / resolve / lib / async.js
80684 viewsvar core = require('./core');1var fs = require('fs');2var path = require('path');3var caller = require('./caller.js');4var nodeModulesPaths = require('./node-modules-paths.js');5var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\//;67module.exports = function resolve (x, opts, cb) {8if (typeof opts === 'function') {9cb = opts;10opts = {};11}12if (!opts) opts = {};13if (typeof x !== 'string') {14return process.nextTick(function () {15cb(new Error('path must be a string'));16});17}1819var isFile = opts.isFile || function (file, cb) {20fs.stat(file, function (err, stat) {21if (err && err.code === 'ENOENT') cb(null, false)22else if (err) cb(err)23else cb(null, stat.isFile() || stat.isFIFO())24});25};26var readFile = opts.readFile || fs.readFile;2728var extensions = opts.extensions || [ '.js' ];29var y = opts.basedir || path.dirname(caller());3031opts.paths = opts.paths || [];3233if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) {34var res = path.resolve(y, x);35if (x === '..') res += '/';36if (/\/$/.test(x) && res === y) {37loadAsDirectory(res, opts.package, onfile);38}39else loadAsFile(res, opts.package, onfile);40}41else loadNodeModules(x, y, function (err, n, pkg) {42if (err) cb(err)43else if (n) cb(null, n, pkg)44else if (core[x]) return cb(null, x);45else cb(new Error("Cannot find module '" + x + "' from '" + y + "'"))46});4748function onfile (err, m, pkg) {49if (err) cb(err)50else if (m) cb(null, m, pkg)51else loadAsDirectory(res, function (err, d, pkg) {52if (err) cb(err)53else if (d) cb(null, d, pkg)54else cb(new Error("Cannot find module '" + x + "' from '" + y + "'"))55})56}5758function loadAsFile (x, pkg, cb) {59if (typeof pkg === 'function') {60cb = pkg;61pkg = undefined;62}6364var exts = [''].concat(extensions);65load(exts, x, pkg)6667function load (exts, x, pkg) {68if (exts.length === 0) return cb(null, undefined, pkg);69var file = x + exts[0];7071if (pkg) onpkg(null, pkg)72else loadpkg(path.dirname(file), onpkg);7374function onpkg (err, pkg_, dir) {75pkg = pkg_;76if (err) return cb(err)77if (dir && pkg && opts.pathFilter) {78var rfile = path.relative(dir, file);79var rel = rfile.slice(0, rfile.length - exts[0].length);80var r = opts.pathFilter(pkg, x, rel);81if (r) return load(82[''].concat(extensions.slice()),83path.resolve(dir, r),84pkg85);86}87isFile(file, onex);88}89function onex (err, ex) {90if (err) cb(err)91else if (!ex) load(exts.slice(1), x, pkg)92else cb(null, file, pkg)93}94}95}9697function loadpkg (dir, cb) {98if (dir === '' || dir === '/') return cb(null);99if (process.platform === 'win32' && /^\w:[\\\/]*$/.test(dir)) {100return cb(null);101}102if (/[\\\/]node_modules[\\\/]*$/.test(dir)) return cb(null);103104var pkgfile = path.join(dir, 'package.json');105isFile(pkgfile, function (err, ex) {106// on err, ex is false107if (!ex) return loadpkg(108path.dirname(dir), cb109);110111readFile(pkgfile, function (err, body) {112if (err) cb(err);113try { var pkg = JSON.parse(body) }114catch (err) {}115116if (pkg && opts.packageFilter) {117pkg = opts.packageFilter(pkg, pkgfile);118}119cb(null, pkg, dir);120});121});122}123124function loadAsDirectory (x, fpkg, cb) {125if (typeof fpkg === 'function') {126cb = fpkg;127fpkg = opts.package;128}129130var pkgfile = path.join(x, '/package.json');131isFile(pkgfile, function (err, ex) {132if (err) return cb(err);133if (!ex) return loadAsFile(path.join(x, '/index'), fpkg, cb);134135readFile(pkgfile, function (err, body) {136if (err) return cb(err);137try {138var pkg = JSON.parse(body);139}140catch (err) {}141142if (opts.packageFilter) {143pkg = opts.packageFilter(pkg, pkgfile);144}145146if (pkg.main) {147if (pkg.main === '.' || pkg.main === './'){148pkg.main = 'index'149}150loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {151if (err) return cb(err);152if (m) return cb(null, m, pkg);153if (!pkg) return loadAsFile(path.join(x, '/index'), pkg, cb);154155var dir = path.resolve(x, pkg.main);156loadAsDirectory(dir, pkg, function (err, n, pkg) {157if (err) return cb(err);158if (n) return cb(null, n, pkg);159loadAsFile(path.join(x, '/index'), pkg, cb);160});161});162return;163}164165loadAsFile(path.join(x, '/index'), pkg, cb);166});167});168}169170function loadNodeModules (x, start, cb) {171(function process (dirs) {172if (dirs.length === 0) return cb(null, undefined);173var dir = dirs[0];174175var file = path.join(dir, '/', x);176loadAsFile(file, undefined, onfile);177178function onfile (err, m, pkg) {179if (err) return cb(err);180if (m) return cb(null, m, pkg);181loadAsDirectory(path.join(dir, '/', x), undefined, ondir);182}183184function ondir (err, n, pkg) {185if (err) return cb(err);186if (n) return cb(null, n, pkg);187process(dirs.slice(1));188}189})(nodeModulesPaths(start, opts));190}191};192193194