From 22a66cb6e243a3f1c867b62e3942fd2e828019d9 Mon Sep 17 00:00:00 2001 From: Valerio Virgillito Date: Thu, 8 Mar 2012 13:56:09 -0800 Subject: integrating v0.7 montage into ninja Signed-off-by: Valerio Virgillito --- node_modules/montage/require/browser.js | 90 ++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) (limited to 'node_modules/montage/require/browser.js') diff --git a/node_modules/montage/require/browser.js b/node_modules/montage/require/browser.js index 3fdd58d4..f4a11d97 100755 --- a/node_modules/montage/require/browser.js +++ b/node_modules/montage/require/browser.js @@ -47,7 +47,9 @@ Require.read = function (url) { try { request.open(GET, url, true); - request.overrideMimeType(APPLICATION_JAVASCRIPT_MIMETYPE); + if (request.overrideMimeType) { + request.overrideMimeType(APPLICATION_JAVASCRIPT_MIMETYPE); + } request.onreadystatechange = function () { if (request.readyState === 4) { onload(); @@ -76,7 +78,7 @@ var globalEval = /*this.execScript ||*/eval; // For Firebug evaled code isn't debuggable otherwise // http://code.google.com/p/fbug/issues/detail?id=2198 if (global.navigator && global.navigator.userAgent.indexOf("Firefox") >= 0) { - globalEval = new Function("evalString", "return eval(evalString)"); + globalEval = new Function("_", "return eval(_)"); } var __FILE__String = "__FILE__", @@ -89,6 +91,8 @@ Require.Compiler = function (config) { return function(module) { if (module.factory || module.text === void 0) return module; + if (config.define) + throw new Error("Can't use eval."); // Here we use a couple tricks to make debugging better in various browsers: // TODO: determine if these are all necessary / the best options @@ -117,4 +121,86 @@ Require.Compiler = function (config) { } }; +Require.XhrLoader = function (config) { + return function (url, module) { + return Require.read(url) + .then(function (text) { + module.type = "javascript"; + module.text = text; + module.location = url; + }); + }; +}; + +var definitions = {}; +var getDefinition = function (hash, id) { + definitions[hash] = definitions[hash] || {}; + definitions[hash][id] = definitions[hash][id] || Promise.defer(); + return definitions[hash][id]; +}; +define = function (hash, id, module) { + getDefinition(hash, id).resolve(module); +}; + +Require.ScriptLoader = function (config) { + var hash = config.packageDescription.hash; + return function (location, module) { + return Promise.call(function () { + + // short-cut by predefinition + if (definitions[hash] && definitions[hash][module.id]) { + return definitions[hash][module.id].promise; + } + + if (/\.js$/.test(location)) { + location = location.replace(/\.js/, ".load.js"); + } else { + location += ".load.js"; + } + + var script = document.createElement("script"); + script.onload = function() { + script.parentNode.removeChild(script); + }; + script.onerror = function (error) { + script.parentNode.removeChild(script); + }; + script.src = location; + script.defer = true; + document.getElementsByTagName("head")[0].appendChild(script); + + return getDefinition(hash, module.id).promise + }) + .then(function (definition) { + delete definitions[hash][module.id]; + for (var name in definition) { + module[name] = definition[name]; + } + module.location = location; + module.directory = URL.resolve(location, "."); + }); + }; +}; + +Require.makeLoader = function (config) { + if (config.define) { + Loader = Require.ScriptLoader; + } else { + Loader = Require.XhrLoader; + } + return Require.MappingsLoader( + config, + Require.ExtensionsLoader( + config, + Require.PathsLoader( + config, + Require.MemoizedLoader( + config, + Loader(config) + ) + ) + ) + ); +}; + }); -- cgit v1.2.3