text: var core = require('./core');
  var fs = require('fs');
  var path = require('path');
  var caller = require('./caller.js');
  var nodeModulesPaths = require('./node-modules-paths.js');
  
  module.exports = function (x, opts) {
    if (core[x]) {
      return x;
    }
  
    if (!opts) {
      opts = {};
    }
    var isFile = opts.isFile || function (file) {
        try {
          var stat = fs.statSync(file)
        }
        catch (err) {
          if (err && err.code === 'ENOENT') {
            return false
          }
        }
        return stat.isFile() || stat.isFIFO();
      };
    var readFileSync = opts.readFileSync || fs.readFileSync;
  
    var extensions = opts.extensions || ['.js'];
    var y = opts.basedir || path.dirname(caller());
  
    opts.paths = opts.paths || [];
  
    if (x.match(/^(?:\.\.?\/|\/|([A-Za-z]:)?\\)/)) {
      var m = loadAsFileSync(path.resolve(y, x))
        || loadAsDirectorySync(path.resolve(y, x));
      if (m) {
        return m;
      }
    } else {
      var n = loadNodeModulesSync(x, y);
      if (n) {
        return n;
      }
    }
  
    throw new Error("Cannot find module '" + x + "'");
  
    function loadAsFileSync(x) {
      if (isFile(x)) {
        return x;
      }
  
      for (var i = 0; i < extensions.length; i++) {
        var file = x + extensions[i];
        if (isFile(file)) {
          return file;
        }
      }
    }
  
    function loadAsDirectorySync(x) {
      var pkgfile = path.join(x, '/package.json');
      if (isFile(pkgfile)) {
        var body = readFileSync(pkgfile, 'utf8');
        try {
          var pkg = JSON.parse(body);
          if (opts.packageFilter) {
            pkg = opts.packageFilter(pkg, x);
          }
  
          if (pkg.main) {
            var m = loadAsFileSync(path.resolve(x, pkg.main));
            if (m) {
              return m;
            }
            var n = loadAsDirectorySync(path.resolve(x, pkg.main));
            if (n) {
              return n;
            }
          }
        }
        catch (err) {
        }
      }
  
      return loadAsFileSync(path.join(x, '/index'));
    }
  
    function loadNodeModulesSync(x, start) {
      var dirs = nodeModulesPaths(start, opts);
      for (var i = 0; i < dirs.length; i++) {
        var dir = dirs[i];
        var m = loadAsFileSync(path.join(dir, '/', x));
        if (m) {
          return m;
        }
        var n = loadAsDirectorySync(path.join(dir, '/', x));
        if (n) {
          return n;
        }
      }
    }
  };
  