1 | 'use strict';
|
2 |
|
3 | var scriptjs = require('scriptjs');
|
4 | var bromote = require('../loaders');
|
5 | var loaded = {};
|
6 | var loading = {};
|
7 |
|
8 | function attachDep(windowKey, requireKey, cb) {
|
9 | try {
|
10 | window[windowKey] = require(requireKey);
|
11 | setTimeout(cb, 0);
|
12 | } catch (reqerr) {
|
13 |
|
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 |
|
24 | function 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 |
|
42 | function 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 |
|
51 | module.exports = function load(asset, cb) {
|
52 | if (loaded[asset.url])
|
53 | return setTimeout(cb.bind(null, loaded[asset.url]), 0);
|
54 |
|
55 |
|
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 | };
|