Last active
December 14, 2015 09:58
-
-
Save euforic/5068417 to your computer and use it in GitHub Desktop.
Node Style require for browser and Titanium
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Require the given path. | |
* | |
* @param {String} path | |
* @return {Object} exports | |
* @api public | |
*/ | |
function require(path, parent, orig) { | |
var resolved = require.resolve(path); | |
// lookup failed | |
if (null == resolved) { | |
orig = orig || path; | |
parent = parent || 'root'; | |
var err = new Error('Failed to require "' + orig + '" from "' + parent + '"'); | |
err.path = orig; | |
err.parent = parent; | |
err.require = true; | |
throw err; | |
} | |
var module = require.modules[resolved]; | |
var __filename = resolved; | |
var __dirname = resolved.replace('.js', '').replace('.json', ''); | |
// perform real require() | |
// by invoking the module's | |
// registered function | |
if (!module.exports) { | |
module.exports = {}; | |
module.client = module.component = true; | |
module.call(this, module.exports, require.relative(resolved), module, __dirname, __filename, require.global); | |
} | |
return module.exports; | |
} | |
/** | |
* Registered modules. | |
*/ | |
require.global = {}; | |
/** | |
* Registered modules. | |
*/ | |
require.modules = {}; | |
/** | |
* Registered aliases. | |
*/ | |
require.aliases = {}; | |
/** | |
* Resolve `path`. | |
* | |
* Lookup: | |
* | |
* - PATH/index.js | |
* - PATH.js | |
* - PATH | |
* | |
* @param {String} path | |
* @return {String} path or null | |
* @api private | |
*/ | |
require.resolve = function(path) { | |
if (path.charAt(0) === '/') path = path.slice(1); | |
var index = path + '/index.js'; | |
var paths = [ | |
path, | |
path + '.js', | |
path + '.json', | |
path + '/index.js', | |
path + '/index.json' | |
]; | |
for (var i = 0; i < paths.length; i++) { | |
var path = paths[i]; | |
if (require.modules.hasOwnProperty(path)) return path; | |
} | |
if (require.aliases.hasOwnProperty(index)) { | |
return require.aliases[index]; | |
} | |
}; | |
/** | |
* Normalize `path` relative to the current path. | |
* | |
* @param {String} curr | |
* @param {String} path | |
* @return {String} | |
* @api private | |
*/ | |
require.normalize = function(curr, path) { | |
var segs = []; | |
if ('.' != path.charAt(0)) return path; | |
curr = curr.split('/'); | |
path = path.split('/'); | |
for (var i = 0; i < path.length; ++i) { | |
if ('..' == path[i]) { | |
curr.pop(); | |
} else if ('.' != path[i] && '' != path[i]) { | |
segs.push(path[i]); | |
} | |
} | |
return curr.concat(segs).join('/'); | |
}; | |
/** | |
* Register module at `path` with callback `definition`. | |
* | |
* @param {String} path | |
* @param {Function} definition | |
* @api private | |
*/ | |
require.register = function(path, definition) { | |
require.modules[path] = definition; | |
}; | |
/** | |
* Alias a module definition. | |
* | |
* @param {String} from | |
* @param {String} to | |
* @api private | |
*/ | |
require.alias = function(from, to) { | |
if (!require.modules.hasOwnProperty(from)) { | |
throw new Error('Failed to alias "' + from + '", it does not exist'); | |
} | |
require.aliases[to] = from; | |
}; | |
/** | |
* Return a require function relative to the `parent` path. | |
* | |
* @param {String} parent | |
* @return {Function} | |
* @api private | |
*/ | |
require.relative = function(parent) { | |
var p = require.normalize(parent, '..'); | |
/** | |
* lastIndexOf helper. | |
*/ | |
function lastIndexOf(arr, obj) { | |
var i = arr.length; | |
while (i--) { | |
if (arr[i] === obj) return i; | |
} | |
return -1; | |
} | |
/** | |
* The relative require() itself. | |
*/ | |
function localRequire(path) { | |
var resolved = localRequire.resolve(path); | |
return require(resolved, parent, path); | |
} | |
/** | |
* Resolve relative to the parent. | |
*/ | |
localRequire.resolve = function(path) { | |
var c = path.charAt(0); | |
if ('/' == c) return path.slice(1); | |
if ('.' == c) return require.normalize(p, path); | |
// resolve deps by returning | |
// the dep in the nearest "ti_modules" | |
// directory | |
var segs = parent.split('/'); | |
var i = lastIndexOf(segs, 'ti_modules') + 1; | |
if (!i) i = 0; | |
path = segs.slice(0, i + 1).join('/') + '/ti_modules/' + path; | |
return path; | |
}; | |
/** | |
* Check if module is defined at `path`. | |
*/ | |
localRequire.exists = function(path) { | |
return require.modules.hasOwnProperty(localRequire.resolve(path)); | |
}; | |
return localRequire; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment