UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

174 lines 7.08 kB
import { kwiz_cdn_root } from "../helpers/constants"; import { isDebug } from "../helpers/debug"; import { isFunction, isNotEmptyArray, isNullOrEmptyString, isNullOrUndefined } from "../helpers/typecheckers"; import Sod from "./sod"; class script { constructor() { this.isRtl = false; this._WrapFunctionArr = []; } static get Instance() { if (script.instance === null) { //share single instance between all imports if (typeof window.kSingleScripts !== 'undefined') script.instance = window.kSingleScripts; //a global instance already exists, use it else { script.instance = new script(); window.kSingleScripts = script.instance; //place this instance in the global namespace for others to reuse } } return script.instance; } async loadKnownScript(knownScript) { var promisesDependencies = []; (knownScript.dependencies || []).forEach(dep => { promisesDependencies.push(this.loadKnownScript(dep)); }); if (promisesDependencies.length > 0) await Promise.all(promisesDependencies); return new Promise((resolve, reject) => { this.ensureKnownScriptInternal(knownScript, { success: () => { resolve(Sod.getGlobal(knownScript.global)); }, error: reject }); }); } loadKnownScript_Sync(knownScript) { try { if (isNotEmptyArray(knownScript.dependencies)) { (knownScript.dependencies || []).forEach(dep => { this.loadKnownScript_Sync(dep); }); } } catch { } this.ensureKnownScriptInternal(knownScript, undefined, true); return Sod.getGlobal(knownScript.global); } ensureKnownScriptInternal(knownScript, callbacks, sync = false) { let url = isDebug() && !knownScript.forceMin ? knownScript.url.replace('.min.js', '.js') : knownScript.url; if (url[0] === '/') url = kwiz_cdn_root() + url; if (sync === true) this.ensureScriptSync(url, knownScript.global, callbacks, knownScript.sodName); else this.ensureScript(url, knownScript.global, callbacks, knownScript.sodName); let cssFiles = this.isRtl === true && !isNullOrUndefined(knownScript.rtlCss) ? knownScript.rtlCss : knownScript.css; if (!isNullOrUndefined(cssFiles)) cssFiles.forEach(css => { if (!isNullOrEmptyString(css)) { let cssurl = isDebug() && !knownScript.forceMin ? css.replace('.min.css', '.css') : css; if (cssurl[0] === '/') cssurl = kwiz_cdn_root() + cssurl; let knownStyles = document.getElementsByClassName("kwizcom_known_css"); let found = false; for (let si = 0; si < knownStyles.length; si++) { let elm = knownStyles[si]; if (elm.href && elm.href.toLowerCase() === cssurl.toLowerCase()) { found = true; break; } } if (!found) { let link = document.createElement("link"); link.rel = "stylesheet"; link.className = "kwizcom_known_css"; link.type = "text/css"; link.href = cssurl; document.head.appendChild(link); } } }); } loadCss(cssUrl) { let knownStyles = document.getElementsByClassName("kwizcom_known_css"); let found = false; for (let si = 0; si < knownStyles.length; si++) { let elm = knownStyles[si]; if (elm.href && elm.href.toLowerCase() === cssUrl.toLowerCase()) { found = true; break; } } if (!found) { let link = document.createElement("link"); link.rel = "stylesheet"; link.className = "kwizcom_known_css"; link.type = "text/css"; link.href = cssUrl; document.head.appendChild(link); } } ensureScriptSync(scriptUrl, global, callbacks, sodName) { //in IE there is no promise, we cannot use any async functions return Sod.ensureScriptNoPromise(scriptUrl, global, callbacks, sodName, true); } async ensureScript(scriptUrl, global, callbacks, sodName) { if (isFunction(callbacks)) callbacks = { success: callbacks, error: callbacks }; return Sod.ensureScript(scriptUrl, global, callbacks, sodName, false); } /** ensure a collection of scripts and call the callback when they are all done */ async ensureScripts(scripts, callbacks) { if (isFunction(callbacks)) callbacks = { success: callbacks, error: callbacks }; let promises = []; let length = scripts.length; let finished = 0; let hadError = false; const cbs = callbacks ? { success: () => { finished++; if (finished === length) //all finished { hadError ? callbacks.error() : callbacks.success(); } }, error: () => { hadError = true; finished++; if (finished === length) //all finished callbacks.error(); } } : null; scripts.forEach(scr => { promises.push(Sod.ensureScript(scr.scriptUrl, scr.global, cbs, scr.sodName)); }); return Promise.all(promises); } /** @deprecated - use wrapFunction instead from helpers/functions */ wrapFunction3(originalFunction, instance, doBefore, doAfter) { try { if (instance !== null) { originalFunction.bind(instance); } var idx = this._WrapFunctionArr.length; this._WrapFunctionArr[idx] = originalFunction; originalFunction = function (...args) { if (typeof (doBefore) === "function") { doBefore.apply(instance, args); } var returnValue = this._WrapFunctionArr[idx].apply(instance, args); if (typeof (doAfter) === "function") { doAfter.apply(instance, args); } return returnValue; }; if (instance !== null) { originalFunction.bind(instance); } } catch (e) { if (isDebug()) console.log('unhandled error in wrapFunction3'); } } } script.instance = null; export default script; //# sourceMappingURL=script.js.map