UNPKG

cwt-map

Version:
128 lines (127 loc) 4.12 kB
"use strict"; 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;