diff --git a/node_modules/architect-build/build_support/mini_require.js b/node_modules/architect-build/build_support/mini_require.js index 60194f04..b63d37f7 100644 --- a/node_modules/architect-build/build_support/mini_require.js +++ b/node_modules/architect-build/build_support/mini_require.js @@ -61,14 +61,15 @@ var define = function(name, deps, callback) { define.lastModule = name; }; var defQueue = []; -var addToLoadQueue = function(missing, deps, callback) { +var addToLoadQueue = function(missing, deps, callback, errback) { var toLoad = missing.length; var map = {}; define.queue.push({ deps: deps, map: map, toLoad: toLoad, - callback: callback + callback: callback, + errback: errback }); for (var i = 0; i < missing.length; ++i) { @@ -82,9 +83,24 @@ var addToLoadQueue = function(missing, deps, callback) { }; var processLoadQueue = function(err, id) { + var changed = false; + if (err) { + define.errors[err.id] = err; + define.queue.forEach(function(r) { + if (r.map[err.id]) { + r.toLoad = -1; + if (r.errback) r.errback(err); + } + }); + if (define.lastModule = err.id) + define.lastModule = null; + define.pending = define.pending.filter(function(p) { + return p != err.id; + }); + changed = true; + } + if (defQueue.length) { - if (err) - throw err; if (defQueue.length > 1) throw new Error("more than one module in defqueue"); define(id, defQueue[0][0], defQueue[0][1]); @@ -92,7 +108,6 @@ var processLoadQueue = function(err, id) { } var pending = define.pending; - var changed = false; define.queue.forEach(function(r) { pending.forEach(function(id) { if (r.map[id]) @@ -102,15 +117,17 @@ var processLoadQueue = function(err, id) { r.toLoad--; if (!r.toLoad) { changed = true; - _require("", r.deps, r.callback); + _require("", r.deps, r.callback, r.errback); } }); + define.lastModule = null; if (pending.length) define.pending = []; + if (changed) { define.queue = define.queue.filter(function(r) { - return r.toLoad; + return r.toLoad > 0; }); } }; @@ -118,6 +135,7 @@ var processLoadQueue = function(err, id) { define.amd = true; define.queue = []; define.loaded = {}; +define.errors = {}; define.loading = {}; define.pending = []; define.modules = { require: 1, exports: 1, module: 1 }; @@ -182,7 +200,7 @@ var lookup = function(moduleName) { return mod; }; -var _require = function(parentId, moduleName, callback) { +var _require = function(parentId, moduleName, callback, errback) { if (typeof moduleName === "string") { var depName = normalizeName(parentId, moduleName); var module = lookup(depName); @@ -197,7 +215,7 @@ var _require = function(parentId, moduleName, callback) { var args = deps.map(lookup); return callback && callback.apply(null, args); } else { - return addToLoadQueue(missing, deps, callback); + return addToLoadQueue(missing, deps, callback, errback); } } if (_require.original) @@ -256,6 +274,7 @@ config.paths = Object.create(null); require.undef = function(module, callback) { module = normalizeName("", module); var path = require.toUrl(module, ".js"); + delete define.errors[module]; delete define.loaded[module]; delete define.modules[module]; delete define.fetchedUrls[path]; @@ -302,6 +321,7 @@ require.toUrl = function(moduleName, ext, skipExt) { }; var loadScript = function(path, id, callback) { + // TODO use importScripts for webworkers var head = document.head || document.documentElement; var s = document.createElement("script"); s.src = path; @@ -320,6 +340,12 @@ var loadScript = function(path, id, callback) { callback(null, id); } }; + s.onerror = function(e) { + processLoadQueue({ + id: id, + path: path + }); + } }; require.load = function(module) {