Created
December 20, 2011 07:21
-
-
Save numbcoder/1500641 to your computer and use it in GitHub Desktop.
CommonJS Module simple implemention
This file contains hidden or 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
/** | |
* Define a module along with a payload | |
* @param module a name for the payload | |
* @param payload a function to call with (require, exports, module) params | |
*/ | |
(function() { | |
var global = (function() { | |
return this; | |
})(); | |
if (typeof requirejs !== "undefined") | |
return; | |
var _define = function(module, deps, payload) { | |
if (typeof module !== 'string') { | |
if (_define.original) | |
_define.original.apply(window, arguments); | |
else { | |
console.error('dropping module because define wasn\'t a string.'); | |
console.trace(); | |
} | |
return; | |
} | |
if (arguments.length == 2) | |
payload = deps; | |
if (!_define.modules) | |
_define.modules = {}; | |
_define.modules[module] = payload; | |
}; | |
if (global.define) | |
_define.original = global.define; | |
global.define = _define; | |
/** | |
* Get at functionality define()ed using the function above | |
*/ | |
var _require = function(parentId, module, callback) { | |
if (Object.prototype.toString.call(module) === "[object Array]") { | |
var params = []; | |
for (var i = 0, l = module.length; i < l; ++i) { | |
var dep = lookup(parentId, module[i]); | |
if (!dep && _require.original) | |
return _require.original.apply(window, arguments); | |
params.push(dep); | |
} | |
if (callback) { | |
callback.apply(null, params); | |
} | |
} | |
else if (typeof module === 'string') { | |
var payload = lookup(parentId, module); | |
if (!payload && _require.original) | |
return _require.original.apply(window, arguments); | |
if (callback) { | |
callback(); | |
} | |
return payload; | |
} | |
else { | |
if (_require.original) | |
return _require.original.apply(window, arguments); | |
} | |
}; | |
if (global.require) | |
_require.original = global.require; | |
global.require = function(module, callback) { | |
return _require("", module, callback); | |
}; | |
global.require.packaged = true; | |
var normalizeModule = function(parentId, moduleName) { | |
// normalize plugin requires | |
if (moduleName.indexOf("!") !== -1) { | |
var chunks = moduleName.split("!"); | |
return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); | |
} | |
// normalize relative requires | |
if (moduleName.charAt(0) == ".") { | |
var base = parentId.split("/").slice(0, -1).join("/"); | |
moduleName = base + "/" + moduleName; | |
while(moduleName.indexOf(".") !== -1 && previous != moduleName) { | |
var previous = moduleName; | |
moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); | |
} | |
} | |
return moduleName; | |
}; | |
/** | |
* Internal function to lookup moduleNames and resolve them by calling the | |
* definition function if needed. | |
*/ | |
var lookup = function(parentId, moduleName) { | |
moduleName = normalizeModule(parentId, moduleName); | |
var module = _define.modules[moduleName]; | |
if (!module) { | |
return null; | |
} | |
if (typeof module === 'function') { | |
var exports = {}; | |
var mod = { | |
id: moduleName, | |
uri: '', | |
exports: exports | |
}; | |
var req = function(module, callback) { | |
return _require(moduleName, module, callback); | |
}; | |
var returnValue = module(req, exports, mod); | |
exports = returnValue || mod.exports; | |
// cache the resulting module object for next time | |
_define.modules[moduleName] = exports; | |
return exports; | |
} | |
return module; | |
}; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment