Permalink
Browse files

stub out async

  • Loading branch information...
substack committed Feb 18, 2013
1 parent ba7038a commit f4b02e3bbf0c3b09f83cfb2b22b12b0f55afdf92
Showing with 105 additions and 0 deletions.
  1. +1 −0 index.js
  2. +104 −0 lib/async.js
View
@@ -1,4 +1,5 @@
var core = require('./lib/core');
+exports = module.exports = require('./lib/async');
exports.core = core;
exports.isCore = function (x) { return core[x] };
exports.sync = require('./lib/sync');
View
@@ -0,0 +1,104 @@
+var core = require('./core');
+var fs = require('fs');
+var path = require('path');
+var exists = fs.exists || path.exists;
+
+module.exports = function (x, opts, cb) {
+ if (core[x]) return x;
+
+ if (typeof opts === 'function') {
+ cb = opts;
+ opts = {};
+ }
+ if (!opts) opts = {};
+return;
+
+ var isFile = opts.isFile || function (file) {
+ return existsSync(file) && fs.statSync(file).isFile()
+ };
+ var readFileSync = opts.readFileSync || fs.readFileSync;
+
+ var extensions = opts.extensions || [ '.js' ];
+ var y = opts.basedir
+ || path.dirname(require.cache[__filename].parent.filename)
+ ;
+
+ 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 = nodeModulesPathsSync(start);
+ 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;
+ }
+ }
+
+ function nodeModulesPathsSync (start) {
+ var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\/+/;
+ var parts = start.split(splitRe);
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = path.join(
+ path.join.apply(path, parts.slice(0, i + 1)),
+ 'node_modules'
+ );
+ if (!parts[0].match(/([A-Za-z]:)/)) {
+ dir = '/' + dir;
+ }
+ dirs.push(dir);
+ }
+ return dirs.concat(opts.paths);
+ }
+};

0 comments on commit f4b02e3

Please sign in to comment.