UNPKG

1.7 kBJavaScriptView Raw
1'use strict';
2
3var scriptjs = require('scriptjs');
4var bromote = require('../loaders');
5var loaded = {};
6var loading = {};
7
8function attachDep(windowKey, requireKey, cb) {
9 try {
10 window[windowKey] = require(requireKey);
11 setTimeout(cb, 0);
12 } catch (reqerr) {
13 // not in the bundle, lets hope it's a remote
14 if (typeof bromote[requireKey] !== 'function')
15 return cb(new Error(requireKey + ' was neither included in the bundle, nor as a remote script!'));
16
17 bromote[requireKey](function (dep) {
18 window[windowKey] = dep;
19 cb();
20 });
21 }
22}
23
24function attachDepsToWindow(deps, cb) {
25 if (!deps) return setTimeout(cb, 0);
26
27 var keys = Object.keys(deps)
28 , tasks = keys.length
29 , error;
30
31 if (!tasks) return setTimeout(cb, 0);
32
33 keys.forEach(function (k) {
34 attachDep(deps[k], k, function (err) {
35 if (error) return;
36 if (err) return cb(error = err);
37 if (!--tasks) cb();
38 });
39 });
40}
41
42function loadScript (asset, cb) {
43 scriptjs(asset.url, function () {
44 loaded[asset.url] = window[asset.exports];
45 loading[asset.url] = false;
46 if (typeof asset.init === 'function') asset.init();
47 cb(loaded[asset.url]);
48 });
49}
50
51module.exports = function load(asset, cb) {
52 if (loaded[asset.url])
53 return setTimeout(cb.bind(null, loaded[asset.url]), 0);
54
55 // if we are currently loading an asset, try again in a bit to call back with the loaded asset
56 if (loading[asset.url])
57 return setTimeout(load.bind(null, asset, cb), 10);
58
59 loading[asset.url] = true;
60 attachDepsToWindow(asset.deps, function (err) {
61 if (err) return (console.error(err.message), console.error(err.stack));
62
63 loadScript(asset, cb);
64 });
65};