83 lines
1.9 KiB
JavaScript
83 lines
1.9 KiB
JavaScript
var getBundleURL = require('./bundle-url').getBundleURL;
|
|
|
|
function loadBundlesLazy(bundles) {
|
|
if (!Array.isArray(bundles)) {
|
|
bundles = [bundles]
|
|
}
|
|
|
|
var id = bundles[bundles.length - 1];
|
|
|
|
try {
|
|
return Promise.resolve(require(id));
|
|
} catch (err) {
|
|
if (err.code === 'MODULE_NOT_FOUND') {
|
|
return new LazyPromise(function (resolve, reject) {
|
|
loadBundles(bundles.slice(0, -1))
|
|
.then(function () {
|
|
return require(id);
|
|
})
|
|
.then(resolve, reject);
|
|
});
|
|
}
|
|
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
function loadBundles(bundles) {
|
|
return Promise.all(bundles.map(loadBundle));
|
|
}
|
|
|
|
var bundleLoaders = {};
|
|
function registerBundleLoader(type, loader) {
|
|
bundleLoaders[type] = loader;
|
|
}
|
|
|
|
module.exports = exports = loadBundlesLazy;
|
|
exports.load = loadBundles;
|
|
exports.register = registerBundleLoader;
|
|
|
|
var bundles = {};
|
|
function loadBundle(bundle) {
|
|
var id;
|
|
if (Array.isArray(bundle)) {
|
|
id = bundle[1];
|
|
bundle = bundle[0];
|
|
}
|
|
|
|
if (bundles[bundle]) {
|
|
return bundles[bundle];
|
|
}
|
|
|
|
var type = (bundle.substring(bundle.lastIndexOf('.') + 1, bundle.length) || bundle).toLowerCase();
|
|
var bundleLoader = bundleLoaders[type];
|
|
if (bundleLoader) {
|
|
return bundles[bundle] = bundleLoader(getBundleURL() + bundle)
|
|
.then(function (resolved) {
|
|
if (resolved) {
|
|
module.bundle.register(id, resolved);
|
|
}
|
|
|
|
return resolved;
|
|
}).catch(function(e) {
|
|
delete bundles[bundle];
|
|
|
|
throw e;
|
|
});
|
|
}
|
|
}
|
|
|
|
function LazyPromise(executor) {
|
|
this.executor = executor;
|
|
this.promise = null;
|
|
}
|
|
|
|
LazyPromise.prototype.then = function (onSuccess, onError) {
|
|
if (this.promise === null) this.promise = new Promise(this.executor)
|
|
return this.promise.then(onSuccess, onError)
|
|
};
|
|
|
|
LazyPromise.prototype.catch = function (onError) {
|
|
if (this.promise === null) this.promise = new Promise(this.executor)
|
|
return this.promise.catch(onError)
|
|
};
|