1 | var getBundleURL = require('./bundle-url').getBundleURL;
|
2 |
|
3 | function loadBundlesLazy(bundles) {
|
4 | if (!Array.isArray(bundles)) {
|
5 | bundles = [bundles]
|
6 | }
|
7 |
|
8 | var id = bundles[bundles.length - 1];
|
9 |
|
10 | try {
|
11 | return Promise.resolve(require(id));
|
12 | } catch (err) {
|
13 | if (err.code === 'MODULE_NOT_FOUND') {
|
14 | return new LazyPromise(function (resolve, reject) {
|
15 | loadBundles(bundles.slice(0, -1))
|
16 | .then(function () {
|
17 | return require(id);
|
18 | })
|
19 | .then(resolve, reject);
|
20 | });
|
21 | }
|
22 |
|
23 | throw err;
|
24 | }
|
25 | }
|
26 |
|
27 | function loadBundles(bundles) {
|
28 | return Promise.all(bundles.map(loadBundle));
|
29 | }
|
30 |
|
31 | var bundleLoaders = {};
|
32 | function registerBundleLoader(type, loader) {
|
33 | bundleLoaders[type] = loader;
|
34 | }
|
35 |
|
36 | module.exports = exports = loadBundlesLazy;
|
37 | exports.load = loadBundles;
|
38 | exports.register = registerBundleLoader;
|
39 |
|
40 | var bundles = {};
|
41 | function loadBundle(bundle) {
|
42 | var id;
|
43 | if (Array.isArray(bundle)) {
|
44 | id = bundle[1];
|
45 | bundle = bundle[0];
|
46 | }
|
47 |
|
48 | if (bundles[bundle]) {
|
49 | return bundles[bundle];
|
50 | }
|
51 |
|
52 | var type = (bundle.substring(bundle.lastIndexOf('.') + 1, bundle.length) || bundle).toLowerCase();
|
53 | var bundleLoader = bundleLoaders[type];
|
54 | if (bundleLoader) {
|
55 | return bundles[bundle] = bundleLoader(getBundleURL() + bundle)
|
56 | .then(function (resolved) {
|
57 | if (resolved) {
|
58 | module.bundle.register(id, resolved);
|
59 | }
|
60 |
|
61 | return resolved;
|
62 | }).catch(function(e) {
|
63 | delete bundles[bundle];
|
64 |
|
65 | throw e;
|
66 | });
|
67 | }
|
68 | }
|
69 |
|
70 | function LazyPromise(executor) {
|
71 | this.executor = executor;
|
72 | this.promise = null;
|
73 | }
|
74 |
|
75 | LazyPromise.prototype.then = function (onSuccess, onError) {
|
76 | if (this.promise === null) this.promise = new Promise(this.executor)
|
77 | return this.promise.then(onSuccess, onError)
|
78 | };
|
79 |
|
80 | LazyPromise.prototype.catch = function (onError) {
|
81 | if (this.promise === null) this.promise = new Promise(this.executor)
|
82 | return this.promise.catch(onError)
|
83 | };
|