UNPKG

1.96 kBJavaScriptView Raw
1var getBundleURL = require('./bundle-url').getBundleURL;
2
3function 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
27function loadBundles(bundles) {
28 return Promise.all(bundles.map(loadBundle));
29}
30
31var bundleLoaders = {};
32function registerBundleLoader(type, loader) {
33 bundleLoaders[type] = loader;
34}
35
36module.exports = exports = loadBundlesLazy;
37exports.load = loadBundles;
38exports.register = registerBundleLoader;
39
40var bundles = {};
41function 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
70function LazyPromise(executor) {
71 this.executor = executor;
72 this.promise = null;
73}
74
75LazyPromise.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
80LazyPromise.prototype.catch = function (onError) {
81 if (this.promise === null) this.promise = new Promise(this.executor)
82 return this.promise.catch(onError)
83};