cwt-map
Version:
React.js HERE Maps component
128 lines (127 loc) • 4.12 kB
JavaScript
;
exports.__esModule = true;
// import from npm
var Promise = require("bluebird");
var Map = require("core-js/library/fn/map");
var lodash_1 = require("lodash");
/**
* map for script names against utility objects
* @type {Map<string, ScriptState>}
*/
exports.loadedScripts = new Map();
/**
* script tags to be generated by the cache method
* @type {{}}
*/
exports.scriptTags = {};
/**
*
* @param scripts {Scripts} - An object with all the scripts required. Keys are script names, values are URLs.
*/
function cache(scripts) {
lodash_1.forEach(scripts, function (script, name) {
var _a;
lodash_1.assignIn(exports.scriptTags, (_a = {},
_a[name] = {
name: name,
onLoad: onLoad.bind(null, name),
script: script,
tag: getScript(script, name)
},
_a));
});
}
exports.cache = cache;
function getScriptStub(name) {
return exports.scriptTags[name];
}
exports.getScriptStub = getScriptStub;
/**
* Callback to be fired when each script has loaded.
* @param name {string} - The name of the string that has just loaded.
* @param callback {Callback} - A callback to execute when the script has loaded.
*/
function onLoad(name, callback) {
var stored = exports.loadedScripts.get(name);
if (stored.hasLoaded) {
callback(null, stored);
}
else if (stored) {
stored.promise.then(function () {
stored.wasRejected ? callback(stored.error) : callback(null, stored);
});
}
}
exports.onLoad = onLoad;
/**
* Callback to be fired when all scripts have loaded
* @param callback {Function} - The callback to be executed.
*/
function onAllLoad(callback) {
var promises = [];
var results = [];
exports.loadedScripts.forEach(function (value) {
if (value.hasLoaded) {
results.push(value);
}
else {
promises.push(value.promise);
}
});
if (promises.length > 0) {
Promise.all(promises)
.then(function (res) { return callback(null, res); })["catch"](function (errs) { return callback(errs, null); });
}
else {
callback(null, results);
}
}
exports.onAllLoad = onAllLoad;
/**
* Get a script from a remote location.
* @param name {string} - The name of the script to be retrieved.
* @param url {string} - The URL/location of the script to be retrieved.
*/
function getScript(url, name) {
// if (!loadedScripts.has(name) && !document.querySelector(`script[src="${url}"]`)) {
if (!exports.loadedScripts.has(name)) {
var tag_1 = document.createElement("script");
var promise = new Promise(function (resolve, reject) {
var body = document.getElementsByTagName("body")[0];
// make sure the script type is javascript
// and that scripts are loaded in order using
// the "async" option
lodash_1.assignIn(tag_1, {
async: false,
type: "text/javascript"
});
function handleResult(event) {
var stored = exports.loadedScripts.get(name);
if (event.type === "load") {
stored.hasLoaded = true;
resolve(stored);
}
else if (event.type === "error") {
stored.wasRejected = true;
reject(stored.error);
}
}
// add load and error event listeners
tag_1.addEventListener("load", handleResult);
tag_1.addEventListener("error", handleResult);
lodash_1.assignIn(tag_1, { src: url });
body.appendChild(tag_1);
});
var scriptObject = {
hasLoaded: false,
promise: promise,
tag: tag_1,
wasRejected: false
};
exports.loadedScripts.set(name, scriptObject);
}
return exports.loadedScripts.get(name);
}
exports.getScript = getScript;
// also make cache the default export
exports["default"] = cache;