@lowentry/utils 1.10.3 → 1.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +2801 -1
  2. package/index.js.map +1 -1
  3. package/package.json +1 -2
package/index.js CHANGED
@@ -1,2 +1,2802 @@
1
- import n from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/asyncToGenerator";import r from"@babel/runtime/helpers/typeof";import"@babel/runtime/helpers/awaitAsyncGenerator";import a from"@babel/runtime/helpers/wrapAsyncGenerator";import o from"@babel/runtime/regenerator";import i from"fast-deep-equal";import u from"clone-deep";var c=/[^0-9.\-]/g,l=function(n){return null!=n},s=function(n){return Array.isArray(n)},f=function(n){return s(n)?n:void 0!==n?[n]:[]},h=function(n){return"object"===r(n)&&null!==n&&!Array.isArray(n)},p=function(n){return h(n)?n:{}},m=function(n){return l(n)?""+n:""},d=function(){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];for(var r=0,a=e;r<a.length;r++){var o=a[r];if(l(o))return""+o}return""},v=function(n){return Math.round(w(n))},g=function(){return Math.round(y.apply(void 0,arguments))},w=function(n){var e=+n;return isNaN(e)?0:e},y=function(){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];for(var r=0,a=e;r<a.length;r++){var o=a[r];if(null!==o){var i=+o;if(!isNaN(i))return i}}return 0},b=function(n){return Math.round(x(n))},A=function(){return Math.round(k.apply(void 0,arguments))},x=function(n){var e="number"==typeof n?n:parseFloat((n+"").replace(c,""));return isNaN(e)?0:e},k=function(){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];for(var r=0,a=e;r<a.length;r++){var o=a[r];if(null!==o){var i="number"==typeof o?o:parseFloat((o+"").replace(c,""));if(!isNaN(i))return i}}return 0};function M(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,r)}return t}var T,C,S,j,O,E,I,L,U,_,P,F,N,q,D,B,V,z=function(n){if(!G.isTransactionalValueValid(n))throw console.error("The given value is not a valid TransactionalValue:"),console.error(n),new Error("The given value is not a valid TransactionalValue")},W=function(n,e){for(var t=0;t<n.changes.length;t++){var r=n.changes[t];if(r.id===e)return{index:t,value:r.value}}return null},G={equals:i,parseVersionString:function(n){var e,t,r;if(h(n)&&l(null===(e=n)||void 0===e?void 0:e.major)&&l(null===(t=n)||void 0===t?void 0:t.minor)&&l(null===(r=n)||void 0===r?void 0:r.patch))return n;var a=(n=m(n).trim()).split(" ")[0].split("-")[0].split("."),o=b(a[0]),i=b(a[1]),u=b(a[2]),c={major:o,minor:i,patch:u,toString:function(){return o+"."+i+"."+u},equals:function(n){return n=G.parseVersionString(n),o===n.major&&i===n.minor&&u===n.patch},largerThan:function(n){return n=G.parseVersionString(n),o>n.major||!(o<n.major)&&(i>n.minor||!(i<n.minor)&&u>n.patch)},largerThanOrEquals:function(n){return n=G.parseVersionString(n),o>n.major||!(o<n.major)&&(i>n.minor||!(i<n.minor)&&u>=n.patch)},smallerThan:function(n){return!c.largerThanOrEquals(n)},smallerThanOrEquals:function(n){return!c.largerThan(n)}};return c},contains:function(n,e){if(!n)return!1;var t=!1;return e=m(e),G.each(n,(function(n){if(m(n)===e)return t=!0,!1})),t},containsCaseInsensitive:function(n,e){if(!n)return!1;var t=!1;return e=m(e).toLowerCase(),G.each(n,(function(n){if(m(n).toLowerCase()===e)return t=!0,!1})),t},containsAll:function(n,e){if(!n)return!1;var t=!0;return G.each(e,(function(e){if(!G.contains(n,e))return t=!1,!1})),t},containsAllCaseInsensitive:function(n,e){if(!n)return!1;var t=!0;return G.each(e,(function(e){if(!G.containsCaseInsensitive(n,e))return t=!1,!1})),t},containsAny:function(n,e){if(!n)return!1;var t=!1;return G.each(e,(function(e){if(G.contains(n,e))return t=!0,!1})),t},containsAnyCaseInsensitive:function(n,e){if(!n)return!1;var t=!1;return G.each(e,(function(e){if(G.containsCaseInsensitive(n,e))return t=!0,!1})),t},containsNone:function(n,e){if(!n)return!0;var t=!0;return G.each(e,(function(e){if(G.contains(n,e))return t=!1,!1})),t},containsNoneCaseInsensitive:function(n,e){if(!n)return!0;var t=!0;return G.each(e,(function(e){if(G.containsCaseInsensitive(n,e))return t=!1,!1})),t},each:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=n)if(Array.isArray(n))for(var a=0;a<n.length&&!1!==e.call(n[a],n[a],a);a++);else if("object"===r(n)||"function"==typeof n){for(var o in n)if((!0===t||Object.prototype.hasOwnProperty.call(n,o))&&!1===e.call(n[o],n[o],o))break}else console.warn("Executed LeUtils.each() on an invalid type: ["+r(n)+"]",n);return n},eachAsync:(V=function(){var n=t(o.mark((function n(e,r,a,i){var u,c;return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return u=[],c=!1,n.next=4,G.eachAsync(e,function(){var n=t(o.mark((function n(e,i){var l,s;return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:l=o.mark((function n(){var e;return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(e=[],G.each(u,(function(n){n.__lowentry_utils__promise_is_done__||e.push(n)})),!((u=e).length>a)){n.next=6;break}return n.next=6,Promise.any(u);case 6:case"end":return n.stop()}}),n)}));case 1:if(!(u.length>a)){n.next=5;break}return n.delegateYield(l(),"t0",3);case 3:n.next=1;break;case 5:if(!c){n.next=7;break}return n.abrupt("return",!1);case 7:s=t(o.mark((function n(){return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,r.call(e,e,i);case 2:if(n.t0=n.sent,!1!==n.t0){n.next=5;break}c=!0;case 5:s.__lowentry_utils__promise_is_done__=!0;case 6:case"end":return n.stop()}}),n)})))(),u.push(s);case 9:case"end":return n.stop()}}),n)})));return function(e,t){return n.apply(this,arguments)}}(),i);case 4:return n.next=6,Promise.all(u);case 6:return n.abrupt("return",e);case 7:case"end":return n.stop()}}),n)})));return function(e,t,r,a){return n.apply(this,arguments)}}(),function(){var n=t(o.mark((function n(e,t){var a,i,u,c,l=arguments;return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(a=l.length>2&&void 0!==l[2]?l[2]:1,i=l.length>3&&void 0!==l[3]&&l[3],null==e){n.next=36;break}if(!((a=b(a))>1)){n.next=8;break}return n.next=7,V(e,t,a,i);case 7:return n.abrupt("return",n.sent);case 8:if(!Array.isArray(e)){n.next=21;break}u=0;case 10:if(!(u<e.length)){n.next=19;break}return n.next=13,t.call(e[u],e[u],u);case 13:if(n.t0=n.sent,!1!==n.t0){n.next=16;break}return n.abrupt("break",19);case 16:u++,n.next=10;break;case 19:n.next=36;break;case 21:if("object"!==r(e)&&"function"!=typeof e){n.next=35;break}n.t1=o.keys(e);case 23:if((n.t2=n.t1()).done){n.next=33;break}if(c=n.t2.value,!0!==i&&!Object.prototype.hasOwnProperty.call(e,c)){n.next=31;break}return n.next=28,t.call(e[c],e[c],c);case 28:if(n.t3=n.sent,!1!==n.t3){n.next=31;break}return n.abrupt("break",33);case 31:n.next=23;break;case 33:n.next=36;break;case 35:console.warn("Executed LeUtils.eachAsync() on an invalid type: ["+r(e)+"]",e);case 36:return n.abrupt("return",e);case 37:case"end":return n.stop()}}),n)})));return function(e,t){return n.apply(this,arguments)}}()),filter:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=n){if(Array.isArray(n)){for(var a=[],o=0;o<n.length;o++)!1!==e.call(n[o],n[o],o)&&a.push(n[o]);return a}if("object"===r(n)||"function"==typeof n){var i={};for(var u in n)(!0===t||Object.prototype.hasOwnProperty.call(n,u))&&!1!==e.call(n[u],n[u],u)&&(i[u]=n[u]);return i}console.warn("Executed LeUtils.filter() on an invalid type: ["+r(n)+"]",n)}return n},map:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=n){if(Array.isArray(n)){for(var a=[],o=0;o<n.length;o++)a[o]=e.call(n[o],n[o],o);return a}if("object"===r(n)||"function"==typeof n){var i={};for(var u in n)(!0===t||Object.prototype.hasOwnProperty.call(n,u))&&(i[u]=e.call(n[u],n[u],u));return i}console.warn("Executed LeUtils.map() on an invalid type: ["+r(n)+"]",n)}return n},mapToArray:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=[];if(null!=n)if(Array.isArray(n))for(var o=0;o<n.length;o++)a.push(e.call(n[o],n[o],o));else if("object"===r(n)||"function"==typeof n)for(var i in n)(!0===t||Object.prototype.hasOwnProperty.call(n,i))&&a.push(e.call(n[i],n[i],i));else console.warn("Executed LeUtils.mapToArray() on an invalid type: ["+r(n)+"]",n);return a},mapToArraySorted:function(n,e,t){for(var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=G.sortKeys(n,e,r),o=[],i=0;i<a.length;i++)o.push(t.call(n[a[i]],n[a[i]],a[i]));return o},sortKeys:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=[];if(null!=n)if(Array.isArray(n))for(var o=0;o<n.length;o++)a.push(o);else if("object"===r(n)||"function"==typeof n)for(var i in n)(!0===t||Object.prototype.hasOwnProperty.call(n,i))&&a.push(i);else console.warn("Executed LeUtils.sortKeys() on an invalid type: ["+r(n)+"]",n);return a.sort((function(t,r){return e(n[t],n[r])})),a},flattenArray:(B=function n(e,t){Array.isArray(t)?t.forEach((function(t){n(e,t)})):e.push(t)},function(n){if(!Array.isArray(n))return[n];var e=[];return n.forEach((function(n){B(e,n)})),e}),compare:function(n,e){return n<e?-1:n>e?1:0},compareNumbers:function(n,e){return n-e},compareNumericStrings:function(n,e){return n=m(n).trim(),e=m(e).trim(),n.length===e.length?n<e?-1:n>e?1:0:n.length<e.length?-1:1},compareTimestampStrings:function(n,e){return n=G.base64ToHex(m(n).replaceAll("-","+").replaceAll("_","/")),e=G.base64ToHex(m(e).replaceAll("-","+").replaceAll("_","/")),G.compare(n,e)},isEmptyObject:function(n){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];for(var t in n)if(!0===e||Object.prototype.hasOwnProperty.call(n,t))return!1;return!0},getObjectFieldsCount:function(n){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],t=0;for(var r in n)(!0===e||Object.prototype.hasOwnProperty.call(n,r))&&t++;return t},isGeneratorFunction:(F=o.mark((function n(){return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:case"end":return n.stop()}}),n)})).constructor,N=a(o.mark((function n(){return o.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:case"end":return n.stop()}}),n)}))).constructor,q=function(){}.constructor,D=Array.from(new Set(["GeneratorFunction","AsyncFunction","AsyncGeneratorFunction",F.name,F.displayName,N.name,N.displayName])).filter((function(n){return n&&n!==q.name&&n!==q.displayName})),function(n){if(!n)return!1;var e=n.constructor;return!!e&&(e.name&&D.includes(e.name)||e.displayName&&D.includes(e.displayName))}),setTimeout:function(n){function e(e,t){return n.apply(this,arguments)}return e.toString=function(){return n.toString()},e}((function(n,e){e=x(e);var t=performance.now(),r=setTimeout((function(){var e=performance.now();try{n((e-t)/1e3)}catch(n){console.error(n)}t=e}),e);return{remove:function(){null!==r&&(clearTimeout(r),r=null)}}})),setInterval:function(n){function e(e){return n.apply(this,arguments)}return e.toString=function(){return n.toString()},e}((function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(e=k(e,1e3),t)try{n(0)}catch(n){console.error(n)}var r=performance.now(),a=setInterval((function(){var e=performance.now();try{n((e-r)/1e3)}catch(n){console.error(n)}r=e}),e);return{remove:function(){null!==a&&(clearInterval(a),a=null)}}})),setAnimationFrameTimeout:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;e=A(e,1);var t=!0,r=null,a=performance.now();return function o(){if(t){if(e<=0){t=!1,r=null;var i=performance.now();try{n((i-a)/1e3)}catch(n){console.error(n)}return void(a=i)}e--,r="undefined"==typeof window?setTimeout(o,1e3/60):requestAnimationFrame(o)}}(),{remove:function(){t=!1,null!==r&&("undefined"==typeof window?clearTimeout(r):cancelAnimationFrame(r),r=null)}}},setAnimationFrameInterval:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(e=A(e,1),t)try{n(0)}catch(n){console.error(n)}var r=!0,a=null,o=performance.now(),i=e,u=function t(){if(r){if(i<=0){var u=performance.now();try{n((u-o)/1e3)}catch(n){console.error(n)}o=u,i=e}i--,r&&(a="undefined"==typeof window?setTimeout(t,1e3/60):requestAnimationFrame(t))}};return"undefined"==typeof window?setTimeout(u,1e3/60):requestAnimationFrame(u),{remove:function(){r=!1,null!==a&&("undefined"==typeof window?clearTimeout(a):cancelAnimationFrame(a),a=null)}}},promiseTimeout:function(n){return n=x(n),new Promise(n<=0?function(n){return n()}:function(e){return setTimeout(e,n)})},promiseAnimationFrameTimeout:function(n){return n=b(n),new Promise(n<=0?function(n){return n()}:function(e){return G.setAnimationFrameTimeout(e,n)})},platformIsMobile:function(){var n,e;if("undefined"==typeof window)return!1;var t=m((null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||(null===(e=window.navigator)||void 0===e?void 0:e.vendor)||window.opera||""),r=t.substring(0,4);return!(!/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)&&!/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(r))},platformHasCursor:function(){var n;return"undefined"==typeof window||!(G.platformIsMobile()||null!==(n=window.matchMedia("(any-hover: none)"))&&void 0!==n&&n.matches)},capitalize:function(n){return(n=m(n).trim()).length<=0?n:n.charAt(0).toUpperCase()+n.slice(1)},endsWithAny:function(n,e){var t;n=m(n),t=Array.isArray(e)?e:m(e).split("");var r=!1;return G.each(t,(function(e){if(n.endsWith(m(e)))return r=!0,!1})),r},startsWithAny:function(n,e){var t;n=m(n),t=Array.isArray(e)?e:m(e).split("");var r=!1;return G.each(t,(function(e){if(n.startsWith(m(e)))return r=!0,!1})),r},trimEnd:function(n,e){var t;n=m(n),t=Array.isArray(e)?e:m(e).split("");for(var r=function(e){e=m(e),n.endsWith(e)&&(n=n.substring(0,n.length-e.length),a=!0)},a=!0;a;)a=!1,G.each(t,r);return n},trimStart:function(n,e){var t;n=m(n),t=Array.isArray(e)?e:m(e).split("");for(var r=function(e){e=m(e),n.startsWith(e)&&(n=n.substring(e.length),a=!0)},a=!0;a;)a=!1,G.each(t,r);return n},trim:function(n,e){return G.trimEnd(G.trimStart(n,e),e)},purgeSentence:function(n){return n=G.trimEnd(m(n).trim(),".: \r\n\t"),n+=G.endsWithAny(n,"!?;")?"":"."},purgeErrorMessage:function(n){var e,t=m("string"==typeof n?n:null!==(e=n.message)&&void 0!==e?e:JSON.stringify(n)).split("threw an error:");return t[t.length-1].trim()},generateNamePermutations:function(){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];var r=[];return(e=G.flattenArray(e).map((function(n){return m(n).trim().toLowerCase()})).filter((function(n){return n.length>0}))).length>0&&(r.push(e.join("")),r.push(e.map(G.capitalize).join(""))),e.length>1&&(r.push([e[0]].concat(e.slice(1).map(G.capitalize)).join("")),r.push(e.join("-")),r.push(e.join("_"))),r},increaseNumericStringByOne:function(n){if("string"!=typeof n)for(var e=(n=""+n).length-1;e>=0;e--){var t=n.charAt(e);if(t<"0"||t>"9")return"1"}if(""===n)return"1";for(var r=n.length-1;r>=0;r--){var a=n.charAt(r);if(a<"0"||a>"9")return"1";if(a<"9"){a++,n=n.substring(0,r)+a+n.substring(r+1);break}n=n.substring(0,r)+"0"+n.substring(r+1)}return"0"===n.charAt(0)&&(n="1"+n),n},uniqueId:(L=null,U={},_=function(n){for(var e=0===n?0:Math.ceil((Math.floor(Math.log2(n))+1)/8),t=new Uint8ClampedArray(e),r=n,a=e-1;a>=0;a--){var o=255&r;t[a]=o,r=Math.floor(r/256)}return t},P=function(){var n;try{if("number"!=typeof(n=(performance.timeOrigin||performance.timing.navigationStart)+performance.now()))throw new Error}catch(e){n=Date.now?Date.now():(new Date).getTime()}n=Math.round(n);var e=_(n),t=null;try{var r;t=null===(r=crypto)||void 0===r?void 0:r.randomUUID()}catch(n){}if(t)t=G.base64ToBytes(G.hexToBase64(t));else{var a=_((Math.random()+" ").substring(2,12).padEnd(10,"0")),o=_((Math.random()+" ").substring(2,12).padEnd(10,"0")),i=_((Math.random()+" ").substring(2,12).padEnd(10,"0")),u=_((Math.random()+" ").substring(2,12).padEnd(10,"0"));(t=new Uint8Array(a.length+o.length+i.length+u.length)).set(a,0),t.set(o,a.length),t.set(i,a.length+o.length),t.set(u,a.length+o.length+i.length)}var c=new Uint8Array(e.length+t.length);return c.set(e,0),c.set(t,e.length),{time:n,id:t=G.bytesToBase64(c).replaceAll("=","").replaceAll("+","-").replaceAll("/","_")}},function(){for(;;){var n=P();if(L!==n.time)return L=n.time,U=e({},n.id,!0),n.id;if(!0!==U[n.id])return U[n.id]=!0,n.id}}),timestamp:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(l(n))n=x(n);else try{if("number"!=typeof(n=(performance.timeOrigin||performance.timing.navigationStart)+performance.now()))throw new Error}catch(e){n=Date.now?Date.now():(new Date).getTime()}var e=function(n){for(var e=0===n?0:Math.ceil((Math.floor(Math.log2(n))+1)/8),t=new Uint8ClampedArray(e),r=n,a=e-1;a>=0;a--){var o=255&r;t[a]=o,r=Math.floor(r/256)}return t}(n=Math.round(n));return G.bytesToBase64(e).replaceAll("=","").replaceAll("+","-").replaceAll("/","_")},getEmptyImageSrc:function(){return"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="},getPercentage:function(n,e){return n=x(n),(e=x(e))<=0?100:Math.max(0,Math.min(100,n/e*100))},getImagePixels:function(n){if(!document)return new Uint8ClampedArray;var e=document.createElement("canvas");document.body.appendChild(e);try{var t=e.getContext("2d"),r=Math.floor(n.width),a=Math.floor(n.height);return r<=0||a<=0?(e.width=1,e.height=1):(e.width=r,e.height=a,t.drawImage(n,0,0,e.width,e.height)),t.getImageData(0,0,e.width,e.height).data}finally{e.parentNode.removeChild(e)}},getColoredImage:function(n,e){if(!document)return G.getEmptyImageSrc();var t=document.createElement("canvas");document.body.appendChild(t);try{var r=t.getContext("2d"),a=Math.floor(n.width),o=Math.floor(n.height);return a<=0||o<=0?(t.width=1,t.height=1):(t.width=a,t.height=o,r.drawImage(n,0,0,t.width,t.height)),r.globalCompositeOperation="source-in",r.fillStyle=e,r.fillRect(0,0,t.width,t.height),t.toDataURL("image/png")}finally{t.parentNode.removeChild(t)}},rgbToHex:function(n){return"#"+n.map((function(n){var e=n.toString(16);return 1===e.length?"0"+e:e})).join("")},hexToRgb:function(e){for(var t=4===(e=e.replace(/[^0-9A-F]/gi,"")).length||8===e.length;e.length<6;)e=e.replace(/(.)/g,"$1$1");var r=e.match(/\w{2}/g).map((function(n){return parseInt(n,16)}));return[r[0],r[1],r[2]].concat(n(t?[r[3]]:[]))},rgbToHsl:function(e){var t,r,a=e[0]/255,o=e[1]/255,i=e[2]/255,u=Math.max(a,o,i),c=Math.min(a,o,i),l=(u+c)/2;if(u===c)t=r=0;else{var s=u-c;switch(r=l>.5?s/(2-u-c):s/(u+c),u){case a:t=(o-i)/s+(o<i?6:0);break;case o:t=(i-a)/s+2;break;case i:t=(a-o)/s+4}t/=6}return[t,r,l].concat(n(e.length>=4?[e[3]/255]:[]))},hslToRgb:(I=function(n,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?n+6*(e-n)*t:t<.5?e:t<2/3?n+(e-n)*(2/3-t)*6:n},function(e){var t,r,a,o=e[0],i=e[1],u=e[2];if(0===i)t=r=a=u;else{var c=u<.5?u*(1+i):u+i-u*i,l=2*u-c;t=I(l,c,o+1/3),r=I(l,c,o),a=I(l,c,o-1/3)}return[255*t,255*r,255*a].concat(n(e.length>=4?[255*e[3]]:[])).map((function(n){return Math.max(0,Math.min(255,Math.round(n)))}))}),rgbToLab:function(e){var t=e[0]/255,r=e[1]/255,a=e[2]/255,o=(.4124*(t=t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92)+.3576*(r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92)+.1805*(a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92))/.95047,i=.2126*t+.7152*r+.0722*a,u=(.0193*t+.1192*r+.9505*a)/1.08883;return o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(o-i),200*(i-(u=u>.008856?Math.pow(u,1/3):7.787*u+16/116))].concat(n(e.length>=4?[e[3]/255]:[]))},getDifferenceBetweenRgb:function(n,e){var t=G.rgbToLab(n),r=G.rgbToLab(e);return G.getDifferenceBetweenLab(t,r)},getDifferenceBetweenLab:function(n,e){var t=n[0]-e[0],r=n[1]-e[1],a=n[2]-e[2],o=Math.sqrt(n[1]*n[1]+n[2]*n[2]),i=o-Math.sqrt(e[1]*e[1]+e[2]*e[2]),u=r*r+a*a-i*i,c=t/1,l=i/(1+.045*o),s=(u=u<0?0:Math.sqrt(u))/(1+.015*o),f=c*c+l*l+s*s;return f<0?0:Math.sqrt(f)},getRgbOfGradient:function(n,e){e=Math.max(0,Math.min(100,x(e)));var t=null;if(G.each(n,(function(n,r){if(r=b(r),null===t)t=[r,Math.abs(e-r)];else{var a=Math.abs(e-r);a<t[1]&&(t=[r,a])}})),null===t)return null;t=t[0];var r=99999,a=-99999;if(G.each(n,(function(n,e){(e=b(e))<t&&e>a&&(a=e),e>t&&e<r&&(r=e)})),99999===r&&(r=null),-99999===a&&(a=null),null===r&&null===a||r===a)return n[t];if(null!==r&&null!==a?Math.abs(r-e)>Math.abs(e-a)?r=t:a=t:null===a?a=t:r=t,a>r){var o=r;r=a,a=o}var i=r-a,u=e-a;return G.getRgbBetween(n[a],n[r],u/i*100)},getRgbBetween:function(n,e,t){t=x(t);for(var r=Math.max(0,Math.min(1,t/100)),a=1-r,o=Math.min(n.length,e.length),i=[],u=0;u<o;u++)i.push(Math.max(0,Math.min(255,Math.round(n[u]*a+e[u]*r))));return i},btoa:function(n){function e(e){return n.apply(this,arguments)}return e.toString=function(){return n.toString()},e}((function(n){return"function"==typeof btoa?btoa(n):Buffer.from(n).toString("base64")})),atob:function(n){function e(e){return n.apply(this,arguments)}return e.toString=function(){return n.toString()},e}((function(n){return"function"==typeof atob?atob(n):Buffer.from(n,"base64").toString()})),utf8ToBase64:function(n){return G.btoa(encodeURIComponent(n).replace(/%([0-9A-F]{2})/g,(function(n,e){return String.fromCharCode(parseInt(e,16))})))},base64ToUtf8:function(n){return decodeURIComponent(G.atob(n.trim()).split("").map((function(n){return"%"+("00"+n.charCodeAt(0).toString(16)).slice(-2)})).join(""))},base64ToHex:function(n){return G.atob(n.trim()).split("").map((function(n){return("0"+n.charCodeAt(0).toString(16)).slice(-2)})).join("")},hexToBase64:function(n){return G.btoa(n.replace(/[^0-9A-F]/gi,"").match(/\w{2}/g).map((function(n){return String.fromCharCode(parseInt(n,16))})).join(""))},base64ToBytes:function(n){for(var e=G.atob(n.trim()),t=e.length,r=new Uint8Array(t),a=0;a<t;a++)r[a]=e.charCodeAt(a);return r},bytesToBase64:function(n){for(var e=new Uint8Array(n),t=e.byteLength,r="",a=0;a<t;a++)r+=String.fromCharCode(e[a]);return G.btoa(r)},downloadFile:function(n,e,t){var r=document.createElement("a");r.setAttribute("download","string"==typeof e?e:"file"),r.href="data:"+t+";base64,"+n,r.setAttribute("target","_blank"),r.click()},localStorageGet:function(n){if("undefined"!=typeof window){var e=window.localStorage.getItem("LeUtils_"+n);if("string"==typeof e)try{if(void 0!==(e=JSON.parse(e))["-"])return e["-"]}catch(n){}}},localStorageSet:function(n,e){"undefined"!=typeof window&&(void 0!==e?window.localStorage.setItem("LeUtils_"+n,JSON.stringify({"-":e})):window.localStorage.removeItem("LeUtils_"+n))},localStorageRemove:function(n){"undefined"!=typeof window&&window.localStorage.removeItem("LeUtils_"+n)},isCurrentHostPrivate:(O=null,E=!1,function(){if("undefined"==typeof window)return!1;var n=window.location.hostname;return O===n?E:(O=n,E=G.isGivenHostPrivate(O))}),isGivenHostPrivate:function(n){if("localhost"===(n=m(n).trim().toLowerCase())||"127.0.0.1"===n)return!0;if(!/^(\d{1,3}\.){3}\d{1,3}$/.test(n))return!1;var e=n.split(".");return"10"===e[0]||"172"===e[0]&&parseInt(e[1],10)>=16&&parseInt(e[1],10)<=31||"192"===e[0]&&"168"===e[1]},createTreeSet:function(n,e){e=e||G.compare,(n=n||[]).sort(e);var t=function(t){for(var r=0,a=n.length-1;r<=a;){var o=Math.floor((r+a)/2),i=n[o],u=e(i,t);if(u<0)r=o+1;else{if(!(u>0))return{found:!0,index:o,value:i};a=o-1}}return{found:!1,index:r,value:void 0}},r={getElements:function(){return n},getComparator:function(){return e},size:function(){return n.length},isEmpty:function(){return n.length<=0},contains:function(n){return t(n).found},first:function(){return n.length>0?n[0]:void 0},last:function(){return n.length>0?n[n.length-1]:void 0},pollFirst:function(){return n.length>0?n.splice(0,1)[0]:void 0},pollLast:function(){return n.length>0?n.splice(n.length-1,1)[0]:void 0},add:function(e){var r=t(e);r.found||n.splice(r.index,0,e)},addAll:function(n){G.each(n,r.add)},getEqualValue:function(n){var e=t(n);if(e.found)return e.value},getEqualValueOrAdd:function(e){var r=t(e);return r.found?r.value:(n.splice(r.index,0,e),e)}};return r},createTransactionalValue:function(n){return void 0===n&&(n=null),{value:n,changes:[]}},isTransactionalValueValid:function(n){return"object"===r(n)&&"value"in n&&"changes"in n&&Array.isArray(n.changes)},transactionalValueToString:function(n){if(!G.isTransactionalValueValid(n))return n+"";if(n.changes.length<=0)return""+n.value;for(var e=""+n.value,t=0;t<n.changes.length;t++)e+=" -> "+n.changes[t].value;return n.changes[n.changes.length-1].value+" ("+e+")"},transactionSetAndCommit:function(n,e){z(n),void 0===e&&(e=null),n.value=e,n.changes=[]},transactionSetWithoutCommitting:function(n,e){z(n),void 0===e&&(e=null);var t=G.uniqueId();return n.changes.push({id:t,value:e}),t},transactionCommitChange:function(n,e){z(n);var t=W(n,e);return null!==t&&(n.value=t.value,n.changes.splice(0,t.index+1),!0)},transactionCancelChange:function(n,e){z(n);var t=W(n,e);return null!==t&&(n.changes.splice(t.index,1),!0)},transactionIsChangeRelevant:function(n,e){return z(n),null!==W(n,e)},transactionGetCommittedValue:function(n){return z(n),n.value},transactionGetValue:function(n){return z(n),n.changes.length<=0?n.value:n.changes[n.changes.length-1].value},createWorkerThread:function(n){var t=new Worker("/workers/"+n+".worker.js"),r={},a=function(n){delete r[n]};return t.onerror=function(e){console.error("Worker "+n+":",e)},t.onmessage=function(n){var e=n.data;if(null!=e&&e.id){var t=r[e.id];t&&(a(e.id),t(e))}},{worker:t,sendMessage:function(n,o){return new Promise((function(i,u){var c,l=G.uniqueId();!function(n,e){r[n]=e}(l,i),setTimeout((function(){a(l),u("timeout")}),null!==(c=null==o?void 0:o.timeout)&&void 0!==c?c:1e4),t.postMessage(function(n){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?M(Object(r),!0).forEach((function(t){e(n,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):M(Object(r)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))}))}return n}({id:l},n))}))}}},sendWorkerMessage:(j={},function(n,e,t){return j[n]||(j[n]=G.createWorkerThread(n)),j[n].sendMessage(e,t)}),clone:function(n){return u(n,!0)},purgeEmail:function(n){return(n=m(n).trim().toLowerCase().replace(/\s/g,"")).includes("@")&&n.includes(".")?n:""},isFocusClear:(S=["text","search","email","number","password","tel","time","url","week","month","date","datetime-local"],function(){var n,e;return!("input"===(null===(n=document)||void 0===n||null===(n=n.activeElement)||void 0===n||null===(n=n.tagName)||void 0===n?void 0:n.toLowerCase())&&S.includes(null===(e=document)||void 0===e||null===(e=e.activeElement)||void 0===e||null===(e=e.type)||void 0===e?void 0:e.toLowerCase()))}),getUserLocale:(C=null,function(){return null===C&&(C=function(){if("undefined"==typeof window)return"en-US";var n=window.navigator.languages;if(!s(n)||n.length<=0)return"en-US";if((n=n.filter((function(n){return"string"==typeof n&&n.includes("-")&&"en-us"!==n.toLowerCase()}))).length<=0)return"en-US";var e=n.filter((function(n){return!n.toLowerCase().startsWith("en-")}));return e.length<=0?n[0]:e[0]}()),C}),getUserLocaleDateFormat:(T=null,function(){return null===T&&(T=function(){var n="/";if("undefined"!=typeof window&&"undefined"!=typeof Intl&&void 0!==Intl.DateTimeFormat){var e=new Intl.DateTimeFormat(G.getUserLocale()).format();e.includes("-")?n="-":(e.includes(". ")||e.includes("."))&&(n=".")}return"YYYY"+n+"MM"+n+"DD"}()),T})};export{f as ARRAY,w as FLOAT,y as FLOAT_ANY,x as FLOAT_LAX,k as FLOAT_LAX_ANY,v as INT,g as INT_ANY,b as INT_LAX,A as INT_LAX_ANY,l as ISSET,s as IS_ARRAY,h as IS_OBJECT,G as LeUtils,p as OBJECT,m as STRING,d as STRING_ANY};
1
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
2
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
4
+ import _typeof from '@babel/runtime/helpers/typeof';
5
+ import '@babel/runtime/helpers/awaitAsyncGenerator';
6
+ import _wrapAsyncGenerator from '@babel/runtime/helpers/wrapAsyncGenerator';
7
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
8
+ import FastDeepEqual from 'fast-deep-equal';
9
+ import CloneDeep from 'clone-deep';
10
+
11
+ var REGEX_ALL_NON_FLOAT_CHARACTERS = /[^0-9.\-]/g;
12
+
13
+ /**
14
+ * Returns true if the value is set (not undefined and not null).
15
+ *
16
+ * @param {*} value
17
+ * @returns {boolean}
18
+ */
19
+ var ISSET = function ISSET(value) {
20
+ return typeof value !== 'undefined' && value !== null;
21
+ };
22
+
23
+ /**
24
+ * Returns true if the value is an array.
25
+ *
26
+ * @param {*} value
27
+ * @returns {boolean}
28
+ */
29
+ var IS_ARRAY = function IS_ARRAY(value) {
30
+ return Array.isArray(value);
31
+ };
32
+
33
+ /**
34
+ * Ensures the given value is an array (returns the value wrapped in an array if it's not).
35
+ *
36
+ * @param {*} value
37
+ * @returns {*[]}
38
+ */
39
+ var ARRAY = function ARRAY(value) {
40
+ return IS_ARRAY(value) ? value : typeof value !== 'undefined' ? [value] : [];
41
+ };
42
+
43
+ /**
44
+ * Returns true if the value is an object.
45
+ *
46
+ * @param {*} value
47
+ * @returns {boolean}
48
+ */
49
+ var IS_OBJECT = function IS_OBJECT(value) {
50
+ return _typeof(value) === 'object' && value !== null && !Array.isArray(value);
51
+ };
52
+
53
+ /**
54
+ * Ensures the given value is an object (returns an empty object if it's not).
55
+ *
56
+ * @param value
57
+ * @returns {object}
58
+ */
59
+ var OBJECT = function OBJECT(value) {
60
+ return IS_OBJECT(value) ? value : {};
61
+ };
62
+
63
+ /**
64
+ * Ensures the given value is a string (casts it to a string if it's not, null and undefined will return an empty string).
65
+ *
66
+ * @param {*} value
67
+ * @returns {string}
68
+ */
69
+ var STRING = function STRING(value) {
70
+ return ISSET(value) ? '' + value : '';
71
+ };
72
+
73
+ /**
74
+ * Returns the first non-null non-undefined value as a string.
75
+ *
76
+ * @param {*} values
77
+ * @returns {string}
78
+ */
79
+ var STRING_ANY = function STRING_ANY() {
80
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
81
+ values[_key] = arguments[_key];
82
+ }
83
+ for (var _i = 0, _values = values; _i < _values.length; _i++) {
84
+ var value = _values[_i];
85
+ if (ISSET(value)) {
86
+ return '' + value;
87
+ }
88
+ }
89
+ return '';
90
+ };
91
+
92
+ /**
93
+ * Ensures the given value is an integer (attempts to cast it to an integer if it's not, null and undefined will return 0).
94
+ *
95
+ * @param {*} value
96
+ * @returns {number}
97
+ */
98
+ var INT = function INT(value) {
99
+ return Math.round(FLOAT(value));
100
+ };
101
+
102
+ /**
103
+ * Returns the first non-null non-undefined int-castable value as an integer.
104
+ *
105
+ * @param {*} values
106
+ * @returns {number}
107
+ */
108
+ var INT_ANY = function INT_ANY() {
109
+ return Math.round(FLOAT_ANY.apply(void 0, arguments));
110
+ };
111
+
112
+ /**
113
+ * Ensures the given value is a float (attempts to cast it to a float if it's not, null and undefined will return 0).
114
+ *
115
+ * @param {*} value
116
+ * @returns {number}
117
+ */
118
+ var FLOAT = function FLOAT(value) {
119
+ var v = +value;
120
+ if (!isNaN(v)) {
121
+ return v;
122
+ }
123
+ return 0;
124
+ };
125
+
126
+ /**
127
+ * Returns the first non-null non-undefined float-castable value as a float.
128
+ *
129
+ * @param {*} values
130
+ * @returns {number}
131
+ */
132
+ var FLOAT_ANY = function FLOAT_ANY() {
133
+ for (var _len2 = arguments.length, values = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
134
+ values[_key2] = arguments[_key2];
135
+ }
136
+ for (var _i2 = 0, _values2 = values; _i2 < _values2.length; _i2++) {
137
+ var value = _values2[_i2];
138
+ if (value !== null) {
139
+ var v = +value;
140
+ if (!isNaN(v)) {
141
+ return v;
142
+ }
143
+ }
144
+ }
145
+ return 0;
146
+ };
147
+
148
+ /**
149
+ * Ensures the given value is an integer (attempts to cast it to an integer if it's not, null and undefined will return 0).
150
+ * This version is less strict than INT, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.
151
+ *
152
+ * @param {*} value
153
+ * @returns {number}
154
+ */
155
+ var INT_LAX = function INT_LAX(value) {
156
+ return Math.round(FLOAT_LAX(value));
157
+ };
158
+
159
+ /**
160
+ * Returns the first non-null non-undefined int-castable value as an integer.
161
+ * This version is less strict than INT_ANY, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.
162
+ *
163
+ * @param {*} values
164
+ * @returns {number}
165
+ */
166
+ var INT_LAX_ANY = function INT_LAX_ANY() {
167
+ return Math.round(FLOAT_LAX_ANY.apply(void 0, arguments));
168
+ };
169
+
170
+ /**
171
+ * Ensures the given value is a float (attempts to cast it to a float if it's not, null and undefined will return 0).
172
+ * This version is less strict than FLOAT, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.
173
+ *
174
+ * @param {*} value
175
+ * @returns {number}
176
+ */
177
+ var FLOAT_LAX = function FLOAT_LAX(value) {
178
+ var v = typeof value === 'number' ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));
179
+ if (!isNaN(v)) {
180
+ return v;
181
+ }
182
+ return 0;
183
+ };
184
+
185
+ /**
186
+ * Returns the first non-null non-undefined float-castable value as a float.
187
+ * This version is less strict than FLOAT_ANY, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.
188
+ *
189
+ * @param {*} values
190
+ * @returns {number}
191
+ */
192
+ var FLOAT_LAX_ANY = function FLOAT_LAX_ANY() {
193
+ for (var _len3 = arguments.length, values = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
194
+ values[_key3] = arguments[_key3];
195
+ }
196
+ for (var _i3 = 0, _values3 = values; _i3 < _values3.length; _i3++) {
197
+ var value = _values3[_i3];
198
+ if (value !== null) {
199
+ var v = typeof value === 'number' ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));
200
+ if (!isNaN(v)) {
201
+ return v;
202
+ }
203
+ }
204
+ }
205
+ return 0;
206
+ };
207
+
208
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
209
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
210
+
211
+ /**
212
+ * @param {LeUtils~TransactionalValue} transactionalValue
213
+ */
214
+ var checkTransactionalValue = function checkTransactionalValue(transactionalValue) {
215
+ if (!LeUtils.isTransactionalValueValid(transactionalValue)) {
216
+ console.error('The given value is not a valid TransactionalValue:');
217
+ console.error(transactionalValue);
218
+ throw new Error('The given value is not a valid TransactionalValue');
219
+ }
220
+ };
221
+
222
+ /**
223
+ * @param {LeUtils~TransactionalValue} transactionalValue
224
+ * @param {string} changeId
225
+ * @returns {{index:number, value:*}|null}
226
+ */
227
+ var findTransactionalValueChange = function findTransactionalValueChange(transactionalValue, changeId) {
228
+ for (var i = 0; i < transactionalValue.changes.length; i++) {
229
+ var change = transactionalValue.changes[i];
230
+ if (change.id === changeId) {
231
+ return {
232
+ index: i,
233
+ value: change.value
234
+ };
235
+ }
236
+ }
237
+ return null;
238
+ };
239
+ var LeUtils = {
240
+ /**
241
+ * A deep equals implementation (npm package "fast-deep-equal").
242
+ *
243
+ * @param {*} value The value to compare.
244
+ * @param {*} other The other value to compare.
245
+ * @returns {boolean} Returns true if the values are equivalent.
246
+ */
247
+ equals: FastDeepEqual,
248
+ /**
249
+ * Parses the given version string, and returns an object with the major, minor, and patch numbers, as well as some comparison functions.
250
+ *
251
+ * Expects a version string such as:
252
+ * - "1"
253
+ * - "1.2"
254
+ * - "1.2.3"
255
+ * - "1.2.3 anything"
256
+ * - "1.2.3-anything"
257
+ *
258
+ * @param {string|*} versionString
259
+ * @returns {{major: (number), minor: (number), patch: (number), toString: (function(): string), equals: (function(string|*): boolean), smallerThan: (function(string|*): boolean), smallerThanOrEquals: (function(string|*): boolean), largerThan: (function(string|*): boolean), largerThanOrEquals: (function(string|*): boolean)}}
260
+ */
261
+ parseVersionString: function parseVersionString(versionString) {
262
+ var _versionString, _versionString2, _versionString3;
263
+ if (IS_OBJECT(versionString) && ISSET((_versionString = versionString) === null || _versionString === void 0 ? void 0 : _versionString.major) && ISSET((_versionString2 = versionString) === null || _versionString2 === void 0 ? void 0 : _versionString2.minor) && ISSET((_versionString3 = versionString) === null || _versionString3 === void 0 ? void 0 : _versionString3.patch)) {
264
+ return versionString;
265
+ }
266
+ versionString = STRING(versionString).trim();
267
+ var partsVersion = versionString.split(' ')[0].split('-')[0].split('.');
268
+ var major = INT_LAX(partsVersion[0]);
269
+ var minor = INT_LAX(partsVersion[1]);
270
+ var patch = INT_LAX(partsVersion[2]);
271
+ var THIS = {
272
+ major: major,
273
+ minor: minor,
274
+ patch: patch,
275
+ toString: function toString() {
276
+ return major + '.' + minor + '.' + patch;
277
+ },
278
+ equals: function equals(otherVersion) {
279
+ otherVersion = LeUtils.parseVersionString(otherVersion);
280
+ return major === otherVersion.major && minor === otherVersion.minor && patch === otherVersion.patch;
281
+ },
282
+ largerThan: function largerThan(otherVersion) {
283
+ otherVersion = LeUtils.parseVersionString(otherVersion);
284
+ if (major > otherVersion.major) {
285
+ return true;
286
+ }
287
+ if (major < otherVersion.major) {
288
+ return false;
289
+ }
290
+ if (minor > otherVersion.minor) {
291
+ return true;
292
+ }
293
+ if (minor < otherVersion.minor) {
294
+ return false;
295
+ }
296
+ return patch > otherVersion.patch;
297
+ },
298
+ largerThanOrEquals: function largerThanOrEquals(otherVersion) {
299
+ otherVersion = LeUtils.parseVersionString(otherVersion);
300
+ if (major > otherVersion.major) {
301
+ return true;
302
+ }
303
+ if (major < otherVersion.major) {
304
+ return false;
305
+ }
306
+ if (minor > otherVersion.minor) {
307
+ return true;
308
+ }
309
+ if (minor < otherVersion.minor) {
310
+ return false;
311
+ }
312
+ return patch >= otherVersion.patch;
313
+ },
314
+ smallerThan: function smallerThan(otherVersion) {
315
+ return !THIS.largerThanOrEquals(otherVersion);
316
+ },
317
+ smallerThanOrEquals: function smallerThanOrEquals(otherVersion) {
318
+ return !THIS.largerThan(otherVersion);
319
+ }
320
+ };
321
+ return THIS;
322
+ },
323
+ /**
324
+ * Returns true if the array or object contains the given value.
325
+ *
326
+ * Values are compared by casting both of them to a string.
327
+ *
328
+ * @param {array|object|Function} array
329
+ * @param {*} value
330
+ * @returns {boolean}
331
+ */
332
+ contains: function contains(array, value) {
333
+ if (!array) {
334
+ return false;
335
+ }
336
+ var result = false;
337
+ value = STRING(value);
338
+ LeUtils.each(array, function (val) {
339
+ if (STRING(val) === value) {
340
+ result = true;
341
+ return false;
342
+ }
343
+ });
344
+ return result;
345
+ },
346
+ /**
347
+ * Returns true if the array or object contains the given value.
348
+ *
349
+ * Values are compared by casting both of them to a string, and then lowercasing them.
350
+ *
351
+ * @param {array|object|Function} array
352
+ * @param {*} value
353
+ * @returns {boolean}
354
+ */
355
+ containsCaseInsensitive: function containsCaseInsensitive(array, value) {
356
+ if (!array) {
357
+ return false;
358
+ }
359
+ var result = false;
360
+ value = STRING(value).toLowerCase();
361
+ LeUtils.each(array, function (val) {
362
+ if (STRING(val).toLowerCase() === value) {
363
+ result = true;
364
+ return false;
365
+ }
366
+ });
367
+ return result;
368
+ },
369
+ /**
370
+ * Returns true if the array or object contains all the given values.
371
+ *
372
+ * Values are compared by casting both of them to a string.
373
+ *
374
+ * @param {array|object|Function} array
375
+ * @param {array|object|Function} values
376
+ * @returns {boolean}
377
+ */
378
+ containsAll: function containsAll(array, values) {
379
+ if (!array) {
380
+ return false;
381
+ }
382
+ var result = true;
383
+ LeUtils.each(values, function (value) {
384
+ if (!LeUtils.contains(array, value)) {
385
+ result = false;
386
+ return false;
387
+ }
388
+ });
389
+ return result;
390
+ },
391
+ /**
392
+ * Returns true if the array or object contains all the given values.
393
+ *
394
+ * Values are compared by casting both of them to a string, and then lowercasing them.
395
+ *
396
+ * @param {array|object|Function} array
397
+ * @param {array|object|Function} values
398
+ * @returns {boolean}
399
+ */
400
+ containsAllCaseInsensitive: function containsAllCaseInsensitive(array, values) {
401
+ if (!array) {
402
+ return false;
403
+ }
404
+ var result = true;
405
+ LeUtils.each(values, function (value) {
406
+ if (!LeUtils.containsCaseInsensitive(array, value)) {
407
+ result = false;
408
+ return false;
409
+ }
410
+ });
411
+ return result;
412
+ },
413
+ /**
414
+ * Returns true if the array or object contains any of the given values.
415
+ *
416
+ * Values are compared by casting both of them to a string.
417
+ *
418
+ * @param {array|object|Function} array
419
+ * @param {array|object|Function} values
420
+ * @returns {boolean}
421
+ */
422
+ containsAny: function containsAny(array, values) {
423
+ if (!array) {
424
+ return false;
425
+ }
426
+ var result = false;
427
+ LeUtils.each(values, function (value) {
428
+ if (LeUtils.contains(array, value)) {
429
+ result = true;
430
+ return false;
431
+ }
432
+ });
433
+ return result;
434
+ },
435
+ /**
436
+ * Returns true if the array or object contains any of the given values.
437
+ *
438
+ * Values are compared by casting both of them to a string, and then lowercasing them.
439
+ *
440
+ * @param {array|object|Function} array
441
+ * @param {array|object|Function} values
442
+ * @returns {boolean}
443
+ */
444
+ containsAnyCaseInsensitive: function containsAnyCaseInsensitive(array, values) {
445
+ if (!array) {
446
+ return false;
447
+ }
448
+ var result = false;
449
+ LeUtils.each(values, function (value) {
450
+ if (LeUtils.containsCaseInsensitive(array, value)) {
451
+ result = true;
452
+ return false;
453
+ }
454
+ });
455
+ return result;
456
+ },
457
+ /**
458
+ * Returns true if the array or object contains none of the given values.
459
+ *
460
+ * Values are compared by casting both of them to a string.
461
+ *
462
+ * @param {array|object|Function} array
463
+ * @param {array|object|Function} values
464
+ * @returns {boolean}
465
+ */
466
+ containsNone: function containsNone(array, values) {
467
+ if (!array) {
468
+ return true;
469
+ }
470
+ var result = true;
471
+ LeUtils.each(values, function (value) {
472
+ if (LeUtils.contains(array, value)) {
473
+ result = false;
474
+ return false;
475
+ }
476
+ });
477
+ return result;
478
+ },
479
+ /**
480
+ * Returns true if the array or object contains none of the given values.
481
+ *
482
+ * Values are compared by casting both of them to a string, and then lowercasing them.
483
+ *
484
+ * @param {array|object|Function} array
485
+ * @param {array|object|Function} values
486
+ * @returns {boolean}
487
+ */
488
+ containsNoneCaseInsensitive: function containsNoneCaseInsensitive(array, values) {
489
+ if (!array) {
490
+ return true;
491
+ }
492
+ var result = true;
493
+ LeUtils.each(values, function (value) {
494
+ if (LeUtils.containsCaseInsensitive(array, value)) {
495
+ result = false;
496
+ return false;
497
+ }
498
+ });
499
+ return result;
500
+ },
501
+ /**
502
+ * @callback LeUtils~__eachCallback
503
+ * @param {*} value
504
+ * @param {*} index
505
+ */
506
+ /**
507
+ * Loops through each element in the given array or object, and calls the callback for each element.
508
+ *
509
+ * @param {*[]|object|Function} elements
510
+ * @param {LeUtils~__eachCallback} callback
511
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
512
+ * @returns {*[]|object|Function}
513
+ */
514
+ each: function each(elements, callback) {
515
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
516
+ if (elements !== null && typeof elements !== 'undefined') {
517
+ if (Array.isArray(elements)) {
518
+ for (var index = 0; index < elements.length; index++) {
519
+ if (callback.call(elements[index], elements[index], index) === false) {
520
+ break;
521
+ }
522
+ }
523
+ } else if (_typeof(elements) === 'object' || typeof elements === 'function') {
524
+ for (var _index in elements) {
525
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(elements, _index)) {
526
+ if (callback.call(elements[_index], elements[_index], _index) === false) {
527
+ break;
528
+ }
529
+ }
530
+ }
531
+ } else {
532
+ console.warn('Executed LeUtils.each() on an invalid type: [' + _typeof(elements) + ']', elements);
533
+ }
534
+ }
535
+ return elements;
536
+ },
537
+ /**
538
+ * Like LeUtils.each(), except that it expects an async callback.
539
+ *
540
+ * @param {*[]|object|function} elements
541
+ * @param {LeUtils~__eachCallback} asyncCallback
542
+ * @param {number} [optionalParallelCount]
543
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
544
+ * @returns {*[]|object|function}
545
+ */
546
+ eachAsync: function () {
547
+ var eachAsyncParallel = /*#__PURE__*/function () {
548
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(elements, asyncCallback, optionalParallelCount, optionalSkipHasOwnPropertyCheck) {
549
+ var promises, doBreak;
550
+ return _regeneratorRuntime.wrap(function _callee3$(_context4) {
551
+ while (1) switch (_context4.prev = _context4.next) {
552
+ case 0:
553
+ promises = [];
554
+ doBreak = false;
555
+ _context4.next = 4;
556
+ return LeUtils.eachAsync(elements, /*#__PURE__*/function () {
557
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(element, index) {
558
+ var _loop, promise;
559
+ return _regeneratorRuntime.wrap(function _callee2$(_context3) {
560
+ while (1) switch (_context3.prev = _context3.next) {
561
+ case 0:
562
+ _loop = /*#__PURE__*/_regeneratorRuntime.mark(function _loop() {
563
+ var newPromises;
564
+ return _regeneratorRuntime.wrap(function _loop$(_context2) {
565
+ while (1) switch (_context2.prev = _context2.next) {
566
+ case 0:
567
+ newPromises = [];
568
+ LeUtils.each(promises, function (promise) {
569
+ if (!promise.__lowentry_utils__promise_is_done__) {
570
+ newPromises.push(promise);
571
+ }
572
+ });
573
+ promises = newPromises;
574
+ if (!(promises.length > optionalParallelCount)) {
575
+ _context2.next = 6;
576
+ break;
577
+ }
578
+ _context2.next = 6;
579
+ return Promise.any(promises);
580
+ case 6:
581
+ case "end":
582
+ return _context2.stop();
583
+ }
584
+ }, _loop);
585
+ });
586
+ case 1:
587
+ if (!(promises.length > optionalParallelCount)) {
588
+ _context3.next = 5;
589
+ break;
590
+ }
591
+ return _context3.delegateYield(_loop(), "t0", 3);
592
+ case 3:
593
+ _context3.next = 1;
594
+ break;
595
+ case 5:
596
+ if (!doBreak) {
597
+ _context3.next = 7;
598
+ break;
599
+ }
600
+ return _context3.abrupt("return", false);
601
+ case 7:
602
+ promise = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
603
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
604
+ while (1) switch (_context.prev = _context.next) {
605
+ case 0:
606
+ _context.next = 2;
607
+ return asyncCallback.call(element, element, index);
608
+ case 2:
609
+ _context.t0 = _context.sent;
610
+ if (!(_context.t0 === false)) {
611
+ _context.next = 5;
612
+ break;
613
+ }
614
+ doBreak = true;
615
+ case 5:
616
+ promise.__lowentry_utils__promise_is_done__ = true;
617
+ case 6:
618
+ case "end":
619
+ return _context.stop();
620
+ }
621
+ }, _callee);
622
+ }))();
623
+ promises.push(promise);
624
+ case 9:
625
+ case "end":
626
+ return _context3.stop();
627
+ }
628
+ }, _callee2);
629
+ }));
630
+ return function (_x5, _x6) {
631
+ return _ref3.apply(this, arguments);
632
+ };
633
+ }(), optionalSkipHasOwnPropertyCheck);
634
+ case 4:
635
+ _context4.next = 6;
636
+ return Promise.all(promises);
637
+ case 6:
638
+ return _context4.abrupt("return", elements);
639
+ case 7:
640
+ case "end":
641
+ return _context4.stop();
642
+ }
643
+ }, _callee3);
644
+ }));
645
+ return function eachAsyncParallel(_x, _x2, _x3, _x4) {
646
+ return _ref2.apply(this, arguments);
647
+ };
648
+ }();
649
+ return /*#__PURE__*/function () {
650
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(elements, asyncCallback) {
651
+ var parallelCount,
652
+ optionalSkipHasOwnPropertyCheck,
653
+ index,
654
+ _index2,
655
+ _args5 = arguments;
656
+ return _regeneratorRuntime.wrap(function _callee4$(_context5) {
657
+ while (1) switch (_context5.prev = _context5.next) {
658
+ case 0:
659
+ parallelCount = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : 1;
660
+ optionalSkipHasOwnPropertyCheck = _args5.length > 3 && _args5[3] !== undefined ? _args5[3] : false;
661
+ if (!(elements !== null && typeof elements !== 'undefined')) {
662
+ _context5.next = 36;
663
+ break;
664
+ }
665
+ parallelCount = INT_LAX(parallelCount);
666
+ if (!(parallelCount > 1)) {
667
+ _context5.next = 8;
668
+ break;
669
+ }
670
+ _context5.next = 7;
671
+ return eachAsyncParallel(elements, asyncCallback, parallelCount, optionalSkipHasOwnPropertyCheck);
672
+ case 7:
673
+ return _context5.abrupt("return", _context5.sent);
674
+ case 8:
675
+ if (!Array.isArray(elements)) {
676
+ _context5.next = 21;
677
+ break;
678
+ }
679
+ index = 0;
680
+ case 10:
681
+ if (!(index < elements.length)) {
682
+ _context5.next = 19;
683
+ break;
684
+ }
685
+ _context5.next = 13;
686
+ return asyncCallback.call(elements[index], elements[index], index);
687
+ case 13:
688
+ _context5.t0 = _context5.sent;
689
+ if (!(_context5.t0 === false)) {
690
+ _context5.next = 16;
691
+ break;
692
+ }
693
+ return _context5.abrupt("break", 19);
694
+ case 16:
695
+ index++;
696
+ _context5.next = 10;
697
+ break;
698
+ case 19:
699
+ _context5.next = 36;
700
+ break;
701
+ case 21:
702
+ if (!(_typeof(elements) === 'object' || typeof elements === 'function')) {
703
+ _context5.next = 35;
704
+ break;
705
+ }
706
+ _context5.t1 = _regeneratorRuntime.keys(elements);
707
+ case 23:
708
+ if ((_context5.t2 = _context5.t1()).done) {
709
+ _context5.next = 33;
710
+ break;
711
+ }
712
+ _index2 = _context5.t2.value;
713
+ if (!(optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(elements, _index2))) {
714
+ _context5.next = 31;
715
+ break;
716
+ }
717
+ _context5.next = 28;
718
+ return asyncCallback.call(elements[_index2], elements[_index2], _index2);
719
+ case 28:
720
+ _context5.t3 = _context5.sent;
721
+ if (!(_context5.t3 === false)) {
722
+ _context5.next = 31;
723
+ break;
724
+ }
725
+ return _context5.abrupt("break", 33);
726
+ case 31:
727
+ _context5.next = 23;
728
+ break;
729
+ case 33:
730
+ _context5.next = 36;
731
+ break;
732
+ case 35:
733
+ console.warn('Executed LeUtils.eachAsync() on an invalid type: [' + _typeof(elements) + ']', elements);
734
+ case 36:
735
+ return _context5.abrupt("return", elements);
736
+ case 37:
737
+ case "end":
738
+ return _context5.stop();
739
+ }
740
+ }, _callee4);
741
+ }));
742
+ return function (_x7, _x8) {
743
+ return _ref5.apply(this, arguments);
744
+ };
745
+ }();
746
+ }(),
747
+ /**
748
+ * @callback LeUtils~__filterCallback
749
+ * @param {*} value
750
+ * @param {*} index
751
+ */
752
+ /**
753
+ * Loops through the given elements, and returns a new array or object, with only the elements that didn't return false from the callback.
754
+ *
755
+ * @param {*[]|object|Function} elements
756
+ * @param {LeUtils~__filterCallback} callback
757
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
758
+ * @returns {*[]|object|Function}
759
+ */
760
+ filter: function filter(elements, callback) {
761
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
762
+ if (elements !== null && typeof elements !== 'undefined') {
763
+ if (Array.isArray(elements)) {
764
+ var result = [];
765
+ for (var index = 0; index < elements.length; index++) {
766
+ if (callback.call(elements[index], elements[index], index) !== false) {
767
+ result.push(elements[index]);
768
+ }
769
+ }
770
+ return result;
771
+ } else if (_typeof(elements) === 'object' || typeof elements === 'function') {
772
+ var _result = {};
773
+ for (var _index3 in elements) {
774
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(elements, _index3)) {
775
+ if (callback.call(elements[_index3], elements[_index3], _index3) !== false) {
776
+ _result[_index3] = elements[_index3];
777
+ }
778
+ }
779
+ }
780
+ return _result;
781
+ } else {
782
+ console.warn('Executed LeUtils.filter() on an invalid type: [' + _typeof(elements) + ']', elements);
783
+ }
784
+ }
785
+ return elements;
786
+ },
787
+ /**
788
+ * @callback LeUtils~__mapCallback
789
+ * @param {*} value
790
+ * @param {*} index
791
+ */
792
+ /**
793
+ * Loops through the given elements, and returns a new array or object, with the elements that were returned from the callback.
794
+ *
795
+ * @param {*[]|object|Function} elements
796
+ * @param {LeUtils~__mapCallback} callback
797
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
798
+ * @returns {*[]|object|Function}
799
+ */
800
+ map: function map(elements, callback) {
801
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
802
+ if (elements !== null && typeof elements !== 'undefined') {
803
+ if (Array.isArray(elements)) {
804
+ var result = [];
805
+ for (var index = 0; index < elements.length; index++) {
806
+ result[index] = callback.call(elements[index], elements[index], index);
807
+ }
808
+ return result;
809
+ } else if (_typeof(elements) === 'object' || typeof elements === 'function') {
810
+ var _result2 = {};
811
+ for (var _index4 in elements) {
812
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(elements, _index4)) {
813
+ _result2[_index4] = callback.call(elements[_index4], elements[_index4], _index4);
814
+ }
815
+ }
816
+ return _result2;
817
+ } else {
818
+ console.warn('Executed LeUtils.map() on an invalid type: [' + _typeof(elements) + ']', elements);
819
+ }
820
+ }
821
+ return elements;
822
+ },
823
+ /**
824
+ * @callback LeUtils~__mapToArrayCallback
825
+ * @param {*} value
826
+ * @param {*} index
827
+ */
828
+ /**
829
+ * Loops through the given elements, and returns a new array, with the elements that were returned from the callback. Always returns an array.
830
+ *
831
+ * @param {*[]|object|Function} elements
832
+ * @param {LeUtils~__mapToArrayCallback} callback
833
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
834
+ * @returns {*[]}
835
+ */
836
+ mapToArray: function mapToArray(elements, callback) {
837
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
838
+ var result = [];
839
+ if (elements !== null && typeof elements !== 'undefined') {
840
+ if (Array.isArray(elements)) {
841
+ for (var index = 0; index < elements.length; index++) {
842
+ result.push(callback.call(elements[index], elements[index], index));
843
+ }
844
+ } else if (_typeof(elements) === 'object' || typeof elements === 'function') {
845
+ for (var _index5 in elements) {
846
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(elements, _index5)) {
847
+ result.push(callback.call(elements[_index5], elements[_index5], _index5));
848
+ }
849
+ }
850
+ } else {
851
+ console.warn('Executed LeUtils.mapToArray() on an invalid type: [' + _typeof(elements) + ']', elements);
852
+ }
853
+ }
854
+ return result;
855
+ },
856
+ /**
857
+ * @callback LeUtils~__mapToArraySortedCallback
858
+ * @param {*} value
859
+ * @param {*} index
860
+ */
861
+ /**
862
+ * Loops through the given elements, and returns a new array, with the elements that were returned from the callback. The elements will be sorted by the result from the given comparator. Always returns an array.
863
+ *
864
+ * @param {*[]|object|Function} elements
865
+ * @param {LeUtils~__sortKeysComparatorCallback} comparator
866
+ * @param {LeUtils~__mapToArraySortedCallback} callback
867
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
868
+ * @returns {*[]}
869
+ */
870
+ mapToArraySorted: function mapToArraySorted(elements, comparator, callback) {
871
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
872
+ var keys = LeUtils.sortKeys(elements, comparator, optionalSkipHasOwnPropertyCheck);
873
+ var result = [];
874
+ for (var i = 0; i < keys.length; i++) {
875
+ result.push(callback.call(elements[keys[i]], elements[keys[i]], keys[i]));
876
+ }
877
+ return result;
878
+ },
879
+ /**
880
+ * @callback LeUtils~__sortKeysComparatorCallback
881
+ * @param {*} elementA
882
+ * @param {*} elementB
883
+ */
884
+ /**
885
+ * Loops through the given elements, and returns a new array, with the keys from the given elements, sorted by the result from the given comparator. Always returns an array.
886
+ *
887
+ * @param {*[]|object|Function} elements
888
+ * @param {LeUtils~__sortKeysComparatorCallback} comparator
889
+ * @param {boolean} [optionalSkipHasOwnPropertyCheck]
890
+ * @returns {*[]}
891
+ */
892
+ sortKeys: function sortKeys(elements, comparator) {
893
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
894
+ var keys = [];
895
+ if (elements !== null && typeof elements !== 'undefined') {
896
+ if (Array.isArray(elements)) {
897
+ for (var index = 0; index < elements.length; index++) {
898
+ keys.push(index);
899
+ }
900
+ } else if (_typeof(elements) === 'object' || typeof elements === 'function') {
901
+ for (var _index6 in elements) {
902
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(elements, _index6)) {
903
+ keys.push(_index6);
904
+ }
905
+ }
906
+ } else {
907
+ console.warn('Executed LeUtils.sortKeys() on an invalid type: [' + _typeof(elements) + ']', elements);
908
+ }
909
+ }
910
+ keys.sort(function (a, b) {
911
+ return comparator(elements[a], elements[b]);
912
+ });
913
+ return keys;
914
+ },
915
+ /**
916
+ * Turns the given value(s) into a 1 dimensional array.
917
+ *
918
+ * Does the same thing as Array.flat(Infinity).
919
+ *
920
+ * @param {*} array
921
+ * @returns {*[]}
922
+ */
923
+ flattenArray: function () {
924
+ var flattenArrayRecursive = function flattenArrayRecursive(result, array) {
925
+ if (!Array.isArray(array)) {
926
+ result.push(array);
927
+ return;
928
+ }
929
+ array.forEach(function (entry) {
930
+ flattenArrayRecursive(result, entry);
931
+ });
932
+ };
933
+ return function (array) {
934
+ if (!Array.isArray(array)) {
935
+ return [array];
936
+ }
937
+ var result = [];
938
+ array.forEach(function (entry) {
939
+ flattenArrayRecursive(result, entry);
940
+ });
941
+ return result;
942
+ };
943
+ }(),
944
+ /**
945
+ * Compares two values. Primarily used for sorting.
946
+ *
947
+ * @param {*} a
948
+ * @param {*} b
949
+ * @returns {number}
950
+ */
951
+ compare: function compare(a, b) {
952
+ return a < b ? -1 : a > b ? 1 : 0;
953
+ },
954
+ /**
955
+ * Compares two numbers. Primarily used for sorting.
956
+ *
957
+ * @param {number} a
958
+ * @param {number} b
959
+ * @returns {number}
960
+ */
961
+ compareNumbers: function compareNumbers(a, b) {
962
+ return a - b;
963
+ },
964
+ /**
965
+ * Compares two numeric strings. Primarily used for sorting.
966
+ *
967
+ * @param {string|number} a
968
+ * @param {string|number} b
969
+ * @returns {number}
970
+ */
971
+ compareNumericStrings: function compareNumericStrings(a, b) {
972
+ a = STRING(a).trim();
973
+ b = STRING(b).trim();
974
+ if (a.length === b.length) {
975
+ return a < b ? -1 : a > b ? 1 : 0;
976
+ }
977
+ return a.length < b.length ? -1 : 1;
978
+ },
979
+ /**
980
+ * Compares two strings generated by LeUtils.timestamp(). Primarily used for sorting.
981
+ *
982
+ * @param {string} a
983
+ * @param {string} b
984
+ * @returns {number}
985
+ */
986
+ compareTimestampStrings: function compareTimestampStrings(a, b) {
987
+ a = LeUtils.base64ToHex(STRING(a).replaceAll('-', '+').replaceAll('_', '/'));
988
+ b = LeUtils.base64ToHex(STRING(b).replaceAll('-', '+').replaceAll('_', '/'));
989
+ return LeUtils.compare(a, b);
990
+ },
991
+ /**
992
+ * Returns true if the given object is empty, false otherwise.
993
+ *
994
+ * @param {object} obj
995
+ * @param [optionalSkipHasOwnPropertyCheck]
996
+ * @returns {boolean}
997
+ */
998
+ isEmptyObject: function isEmptyObject(obj) {
999
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1000
+ for (var field in obj) {
1001
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(obj, field)) {
1002
+ return false;
1003
+ }
1004
+ }
1005
+ return true;
1006
+ },
1007
+ /**
1008
+ * Returns the number of fields in the given object.
1009
+ *
1010
+ * @param {object} obj
1011
+ * @param [optionalSkipHasOwnPropertyCheck]
1012
+ * @returns {number}
1013
+ */
1014
+ getObjectFieldsCount: function getObjectFieldsCount(obj) {
1015
+ var optionalSkipHasOwnPropertyCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1016
+ var count = 0;
1017
+ for (var field in obj) {
1018
+ if (optionalSkipHasOwnPropertyCheck === true || Object.prototype.hasOwnProperty.call(obj, field)) {
1019
+ count++;
1020
+ }
1021
+ }
1022
+ return count;
1023
+ },
1024
+ /**
1025
+ * Returns true if the given function is a generator function (like: "function* (){}"), returns false otherwise.
1026
+ *
1027
+ * @param {Function} func
1028
+ * @returns {boolean}
1029
+ */
1030
+ isGeneratorFunction: function () {
1031
+ var GeneratorFunction = _regeneratorRuntime.mark(function _callee5() {
1032
+ return _regeneratorRuntime.wrap(function _callee5$(_context6) {
1033
+ while (1) switch (_context6.prev = _context6.next) {
1034
+ case 0:
1035
+ case "end":
1036
+ return _context6.stop();
1037
+ }
1038
+ }, _callee5);
1039
+ }).constructor;
1040
+ var AsyncGeneratorFunction = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
1041
+ return _regeneratorRuntime.wrap(function _callee6$(_context7) {
1042
+ while (1) switch (_context7.prev = _context7.next) {
1043
+ case 0:
1044
+ case "end":
1045
+ return _context7.stop();
1046
+ }
1047
+ }, _callee6);
1048
+ })).constructor;
1049
+ var RegularFunction = function () {}.constructor;
1050
+ var PossibleGeneratorFunctionNames = Array.from(new Set(['GeneratorFunction', 'AsyncFunction', 'AsyncGeneratorFunction', GeneratorFunction.name, GeneratorFunction.displayName, AsyncGeneratorFunction.name, AsyncGeneratorFunction.displayName])).filter(function (element) {
1051
+ return element && element !== RegularFunction.name && element !== RegularFunction.displayName;
1052
+ });
1053
+ return function (func) {
1054
+ if (!func) {
1055
+ return false;
1056
+ }
1057
+ var constructor = func.constructor;
1058
+ if (!constructor) {
1059
+ return false;
1060
+ }
1061
+ return constructor.name && PossibleGeneratorFunctionNames.includes(constructor.name) || constructor.displayName && PossibleGeneratorFunctionNames.includes(constructor.displayName);
1062
+ };
1063
+ }(),
1064
+ /**
1065
+ * @callback LeUtils~__setTimeoutCallback
1066
+ * @param {number} deltaTime
1067
+ */
1068
+ /**
1069
+ * Executes the callback after the given number of milliseconds. Passes the elapsed time in seconds to the callback.
1070
+ *
1071
+ * To cancel the timeout, call remove() on the result of this function (example: "const timeoutHandler = LeUtils.setTimeout((deltaTime)=>{}, 1000); timeoutHandler.remove();")
1072
+ *
1073
+ * @param {LeUtils~__setTimeoutCallback} callback ([number] deltaTime)
1074
+ * @param {number} ms
1075
+ * @returns {{remove:Function}}
1076
+ */
1077
+ setTimeout: function (_setTimeout) {
1078
+ function setTimeout(_x9, _x10) {
1079
+ return _setTimeout.apply(this, arguments);
1080
+ }
1081
+ setTimeout.toString = function () {
1082
+ return _setTimeout.toString();
1083
+ };
1084
+ return setTimeout;
1085
+ }(function (callback, ms) {
1086
+ ms = FLOAT_LAX(ms);
1087
+ var lastTime = performance.now();
1088
+ var handler = setTimeout(function () {
1089
+ var currentTime = performance.now();
1090
+ try {
1091
+ callback((currentTime - lastTime) / 1000);
1092
+ } catch (e) {
1093
+ console.error(e);
1094
+ }
1095
+ lastTime = currentTime;
1096
+ }, ms);
1097
+ return {
1098
+ remove: function remove() {
1099
+ if (handler !== null) {
1100
+ clearTimeout(handler);
1101
+ handler = null;
1102
+ }
1103
+ }
1104
+ };
1105
+ }),
1106
+ /**
1107
+ * @callback LeUtils~__setIntervalCallback
1108
+ * @param {number} deltaTime
1109
+ */
1110
+ /**
1111
+ * Executes the callback every given number of milliseconds. Passes the time difference in seconds between the last frame and now to it.
1112
+ *
1113
+ * To remove the interval, call remove() on the result of this function (example: "const intervalHandler = LeUtils.setInterval((deltaTime)=>{}, 1000); intervalHandler.remove();")
1114
+ *
1115
+ * @param {LeUtils~__setIntervalCallback} callback ([number] deltaTime)
1116
+ * @param {number} [intervalMs]
1117
+ * @param {boolean} [fireImmediately]
1118
+ * @returns {{remove:Function}}
1119
+ */
1120
+ setInterval: function (_setInterval) {
1121
+ function setInterval(_x11) {
1122
+ return _setInterval.apply(this, arguments);
1123
+ }
1124
+ setInterval.toString = function () {
1125
+ return _setInterval.toString();
1126
+ };
1127
+ return setInterval;
1128
+ }(function (callback) {
1129
+ var intervalMs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
1130
+ var fireImmediately = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1131
+ intervalMs = FLOAT_LAX_ANY(intervalMs, 1000);
1132
+ if (fireImmediately) {
1133
+ try {
1134
+ callback(0);
1135
+ } catch (e) {
1136
+ console.error(e);
1137
+ }
1138
+ }
1139
+ var lastTime = performance.now();
1140
+ var handler = setInterval(function () {
1141
+ var currentTime = performance.now();
1142
+ try {
1143
+ callback((currentTime - lastTime) / 1000);
1144
+ } catch (e) {
1145
+ console.error(e);
1146
+ }
1147
+ lastTime = currentTime;
1148
+ }, intervalMs);
1149
+ return {
1150
+ remove: function remove() {
1151
+ if (handler !== null) {
1152
+ clearInterval(handler);
1153
+ handler = null;
1154
+ }
1155
+ }
1156
+ };
1157
+ }),
1158
+ /**
1159
+ * @callback LeUtils~__setAnimationFrameTimeoutCallback
1160
+ * @param {number} deltaTime
1161
+ */
1162
+ /**
1163
+ * Executes the callback after the given number of frames. Passes the elapsed time in seconds to the callback.
1164
+ *
1165
+ * To cancel the timeout, call remove() on the result of this function (example: "const timeoutHandler = LeUtils.setAnimationFrameTimeout((deltaTime){}, 5); timeoutHandler.remove();")
1166
+ *
1167
+ * @param {LeUtils~__setAnimationFrameTimeoutCallback} callback ([number] deltaTime)
1168
+ * @param {number} [frames]
1169
+ * @returns {{remove:Function}}
1170
+ */
1171
+ setAnimationFrameTimeout: function setAnimationFrameTimeout(callback) {
1172
+ var frames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
1173
+ frames = INT_LAX_ANY(frames, 1);
1174
+ var run = true;
1175
+ var requestAnimationFrameId = null;
1176
+ var lastTime = performance.now();
1177
+ var tick = function tick() {
1178
+ if (run) {
1179
+ if (frames <= 0) {
1180
+ run = false;
1181
+ requestAnimationFrameId = null;
1182
+ var currentTime = performance.now();
1183
+ try {
1184
+ callback((currentTime - lastTime) / 1000);
1185
+ } catch (e) {
1186
+ console.error(e);
1187
+ }
1188
+ lastTime = currentTime;
1189
+ return;
1190
+ }
1191
+ frames--;
1192
+ requestAnimationFrameId = typeof window === 'undefined' ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);
1193
+ }
1194
+ };
1195
+ tick();
1196
+ return {
1197
+ remove: function remove() {
1198
+ run = false;
1199
+ if (requestAnimationFrameId !== null) {
1200
+ typeof window === 'undefined' ? clearTimeout(requestAnimationFrameId) : cancelAnimationFrame(requestAnimationFrameId);
1201
+ requestAnimationFrameId = null;
1202
+ }
1203
+ }
1204
+ };
1205
+ },
1206
+ /**
1207
+ * @callback LeUtils~__setAnimationFrameIntervalCallback
1208
+ * @param {number} deltaTime
1209
+ */
1210
+ /**
1211
+ * Executes the callback every given number of frames. Passes the time difference in seconds between the last frame and now to it.
1212
+ *
1213
+ * To remove the interval, call remove() on the result of this function (example: "const intervalHandler = LeUtils.setAnimationFrameInterval((deltaTime)=>{}, 5); intervalHandler.remove();")
1214
+ *
1215
+ * @param {LeUtils~__setAnimationFrameIntervalCallback} callback ([number] deltaTime)
1216
+ * @param {number} [intervalFrames]
1217
+ * @param {boolean} [fireImmediately]
1218
+ * @returns {{remove:Function}}
1219
+ */
1220
+ setAnimationFrameInterval: function setAnimationFrameInterval(callback) {
1221
+ var intervalFrames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
1222
+ var fireImmediately = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1223
+ intervalFrames = INT_LAX_ANY(intervalFrames, 1);
1224
+ if (fireImmediately) {
1225
+ try {
1226
+ callback(0);
1227
+ } catch (e) {
1228
+ console.error(e);
1229
+ }
1230
+ }
1231
+ var run = true;
1232
+ var requestAnimationFrameId = null;
1233
+ var lastTime = performance.now();
1234
+ var frames = intervalFrames;
1235
+ var tick = function tick() {
1236
+ if (run) {
1237
+ if (frames <= 0) {
1238
+ var currentTime = performance.now();
1239
+ try {
1240
+ callback((currentTime - lastTime) / 1000);
1241
+ } catch (e) {
1242
+ console.error(e);
1243
+ }
1244
+ lastTime = currentTime;
1245
+ frames = intervalFrames;
1246
+ }
1247
+ frames--;
1248
+ if (run) {
1249
+ requestAnimationFrameId = typeof window === 'undefined' ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);
1250
+ }
1251
+ }
1252
+ };
1253
+ typeof window === 'undefined' ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);
1254
+ return {
1255
+ remove: function remove() {
1256
+ run = false;
1257
+ if (requestAnimationFrameId !== null) {
1258
+ typeof window === 'undefined' ? clearTimeout(requestAnimationFrameId) : cancelAnimationFrame(requestAnimationFrameId);
1259
+ requestAnimationFrameId = null;
1260
+ }
1261
+ }
1262
+ };
1263
+ },
1264
+ /**
1265
+ * Returns a promise, which will be resolved after the given number of milliseconds.
1266
+ *
1267
+ * @param {number} ms
1268
+ * @returns {Promise}
1269
+ */
1270
+ promiseTimeout: function promiseTimeout(ms) {
1271
+ ms = FLOAT_LAX(ms);
1272
+ if (ms <= 0) {
1273
+ return new Promise(function (resolve) {
1274
+ return resolve();
1275
+ });
1276
+ }
1277
+ return new Promise(function (resolve) {
1278
+ return setTimeout(resolve, ms);
1279
+ });
1280
+ },
1281
+ /**
1282
+ * Returns a promise, which will be resolved after the given number of frames.
1283
+ *
1284
+ * @param {number} frames
1285
+ * @returns {Promise}
1286
+ */
1287
+ promiseAnimationFrameTimeout: function promiseAnimationFrameTimeout(frames) {
1288
+ frames = INT_LAX(frames);
1289
+ if (frames <= 0) {
1290
+ return new Promise(function (resolve) {
1291
+ return resolve();
1292
+ });
1293
+ }
1294
+ return new Promise(function (resolve) {
1295
+ return LeUtils.setAnimationFrameTimeout(resolve, frames);
1296
+ });
1297
+ },
1298
+ /**
1299
+ * Returns true if the user is on a smartphone device (mobile).
1300
+ * Will return false if the user is on a tablet or on a desktop.
1301
+ *
1302
+ * In short:
1303
+ * - Mobile: True
1304
+ * - Tablet: False
1305
+ * - Desktop: False
1306
+ *
1307
+ * @returns {boolean}
1308
+ */
1309
+ platformIsMobile: function platformIsMobile() {
1310
+ var _window$navigator, _window$navigator2;
1311
+ if (typeof window === 'undefined') {
1312
+ return false;
1313
+ }
1314
+ // noinspection JSDeprecatedSymbols, JSUnresolvedReference
1315
+ /** navigator.userAgentData.mobile doesn't return the correct value on some platforms, so this is a work-around, code from: http://detectmobilebrowsers.com **/
1316
+ var a = STRING(((_window$navigator = window.navigator) === null || _window$navigator === void 0 ? void 0 : _window$navigator.userAgent) || ((_window$navigator2 = window.navigator) === null || _window$navigator2 === void 0 ? void 0 : _window$navigator2.vendor) || window.opera || '');
1317
+ var b = a.substring(0, 4);
1318
+ return !!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(b));
1319
+ },
1320
+ /**
1321
+ * Returns true if the user has a cursor (mouse, touchpad, etc).
1322
+ * In this context, a cursor is defined as an input device that can hover over elements without necessarily interacting with them.
1323
+ *
1324
+ * @returns {boolean}
1325
+ */
1326
+ platformHasCursor: function platformHasCursor() {
1327
+ var _window$matchMedia;
1328
+ if (typeof window === 'undefined') {
1329
+ return true;
1330
+ }
1331
+ return !LeUtils.platformIsMobile() && !((_window$matchMedia = window.matchMedia('(any-hover: none)')) !== null && _window$matchMedia !== void 0 && _window$matchMedia.matches);
1332
+ },
1333
+ /**
1334
+ * Returns the given string, with the first character capitalized.
1335
+ *
1336
+ * @param {String} string
1337
+ * @returns {string}
1338
+ */
1339
+ capitalize: function capitalize(string) {
1340
+ string = STRING(string).trim();
1341
+ if (string.length <= 0) {
1342
+ return string;
1343
+ }
1344
+ return string.charAt(0).toUpperCase() + string.slice(1);
1345
+ },
1346
+ /**
1347
+ * Returns true if the given string ends with any of the given characters or words.
1348
+ *
1349
+ * @param {string} string
1350
+ * @param {string|string[]} endingCharsStringOrArray
1351
+ * @returns {boolean}
1352
+ */
1353
+ endsWithAny: function endsWithAny(string, endingCharsStringOrArray) {
1354
+ string = STRING(string);
1355
+ var endingCharsArray;
1356
+ if (Array.isArray(endingCharsStringOrArray)) {
1357
+ endingCharsArray = endingCharsStringOrArray;
1358
+ } else {
1359
+ endingCharsArray = STRING(endingCharsStringOrArray).split('');
1360
+ }
1361
+ var result = false;
1362
+ LeUtils.each(endingCharsArray, function (chars) {
1363
+ if (string.endsWith(STRING(chars))) {
1364
+ result = true;
1365
+ return false;
1366
+ }
1367
+ });
1368
+ return result;
1369
+ },
1370
+ /**
1371
+ * Returns true if the given string starts with any of the given characters or words.
1372
+ *
1373
+ * @param {string} string
1374
+ * @param {string|string[]} startingCharsStringOrArray
1375
+ * @returns {boolean}
1376
+ */
1377
+ startsWithAny: function startsWithAny(string, startingCharsStringOrArray) {
1378
+ string = STRING(string);
1379
+ var startingCharsArray;
1380
+ if (Array.isArray(startingCharsStringOrArray)) {
1381
+ startingCharsArray = startingCharsStringOrArray;
1382
+ } else {
1383
+ startingCharsArray = STRING(startingCharsStringOrArray).split('');
1384
+ }
1385
+ var result = false;
1386
+ LeUtils.each(startingCharsArray, function (chars) {
1387
+ if (string.startsWith(STRING(chars))) {
1388
+ result = true;
1389
+ return false;
1390
+ }
1391
+ });
1392
+ return result;
1393
+ },
1394
+ /**
1395
+ * Trims the end of the given string, by removing the given characters from it.
1396
+ *
1397
+ * @param {string} string
1398
+ * @param {string|string[]} trimCharsStringOrArray
1399
+ */
1400
+ trimEnd: function trimEnd(string, trimCharsStringOrArray) {
1401
+ string = STRING(string);
1402
+ var endingCharsArray;
1403
+ if (Array.isArray(trimCharsStringOrArray)) {
1404
+ endingCharsArray = trimCharsStringOrArray;
1405
+ } else {
1406
+ endingCharsArray = STRING(trimCharsStringOrArray).split('');
1407
+ }
1408
+ var trimChars = function trimChars(chars) {
1409
+ chars = STRING(chars);
1410
+ if (string.endsWith(chars)) {
1411
+ string = string.substring(0, string.length - chars.length);
1412
+ run = true;
1413
+ }
1414
+ };
1415
+ var run = true;
1416
+ while (run) {
1417
+ run = false;
1418
+ LeUtils.each(endingCharsArray, trimChars);
1419
+ }
1420
+ return string;
1421
+ },
1422
+ /**
1423
+ * Trims the start of the given string, by removing the given characters from it.
1424
+ *
1425
+ * @param {string} string
1426
+ * @param {string|string[]} trimCharsStringOrArray
1427
+ */
1428
+ trimStart: function trimStart(string, trimCharsStringOrArray) {
1429
+ string = STRING(string);
1430
+ var startingCharsArray;
1431
+ if (Array.isArray(trimCharsStringOrArray)) {
1432
+ startingCharsArray = trimCharsStringOrArray;
1433
+ } else {
1434
+ startingCharsArray = STRING(trimCharsStringOrArray).split('');
1435
+ }
1436
+ var trimChars = function trimChars(chars) {
1437
+ chars = STRING(chars);
1438
+ if (string.startsWith(chars)) {
1439
+ string = string.substring(chars.length);
1440
+ run = true;
1441
+ }
1442
+ };
1443
+ var run = true;
1444
+ while (run) {
1445
+ run = false;
1446
+ LeUtils.each(startingCharsArray, trimChars);
1447
+ }
1448
+ return string;
1449
+ },
1450
+ /**
1451
+ * Trims the start and end of the given string, by removing the given characters from it.
1452
+ *
1453
+ * @param {string} string
1454
+ * @param {string|string[]} trimCharsStringOrArray
1455
+ */
1456
+ trim: function trim(string, trimCharsStringOrArray) {
1457
+ return LeUtils.trimEnd(LeUtils.trimStart(string, trimCharsStringOrArray), trimCharsStringOrArray);
1458
+ },
1459
+ /**
1460
+ * Returns the given string, trims the start and end, and makes sure it ends with a valid sentence ending character (such as !?;.).
1461
+ *
1462
+ * @param {string} sentence
1463
+ * @returns {string}
1464
+ */
1465
+ purgeSentence: function purgeSentence(sentence) {
1466
+ sentence = LeUtils.trimEnd(STRING(sentence).trim(), '.: \r\n\t');
1467
+ sentence += LeUtils.endsWithAny(sentence, '!?;') ? '' : '.';
1468
+ return sentence;
1469
+ },
1470
+ /**
1471
+ * Attempts to obtain and return an error message from the given error, regardless of what is passed to this function.
1472
+ *
1473
+ * @param {*} error
1474
+ * @returns {string}
1475
+ */
1476
+ purgeErrorMessage: function purgeErrorMessage(error) {
1477
+ var _error$message;
1478
+ var message = STRING(typeof error === 'string' ? error : (_error$message = error.message) !== null && _error$message !== void 0 ? _error$message : JSON.stringify(error));
1479
+ var messageParts = message.split('threw an error:');
1480
+ return messageParts[messageParts.length - 1].trim();
1481
+ },
1482
+ /**
1483
+ * Generates all permutations of the given names.
1484
+ *
1485
+ * For example, if you pass "foo" and "bar", it will return:
1486
+ * - foobar
1487
+ * - fooBar
1488
+ * - FooBar
1489
+ * - foo-bar
1490
+ * - foo_bar
1491
+ *
1492
+ * @param {string} names
1493
+ * @returns {string[]}
1494
+ */
1495
+ generateNamePermutations: function generateNamePermutations() {
1496
+ for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
1497
+ names[_key] = arguments[_key];
1498
+ }
1499
+ names = LeUtils.flattenArray(names).map(function (name) {
1500
+ return STRING(name).trim().toLowerCase();
1501
+ }).filter(function (name) {
1502
+ return name.length > 0;
1503
+ });
1504
+ var results = [];
1505
+ if (names.length > 0) {
1506
+ results.push(names.join('')); //foobar
1507
+ results.push(names.map(LeUtils.capitalize).join('')); //FooBar
1508
+ }
1509
+ if (names.length > 1) {
1510
+ results.push([names[0]].concat(names.slice(1).map(LeUtils.capitalize)).join('')); //fooBar
1511
+ results.push(names.join('-')); //foo-bar
1512
+ results.push(names.join('_')); //foo_bar
1513
+ }
1514
+ return results;
1515
+ },
1516
+ /**
1517
+ * Increases the given numeric string by 1, this allows you to increase a numeric string without a limit.
1518
+ *
1519
+ * @param {string} string
1520
+ * @returns {string}
1521
+ */
1522
+ increaseNumericStringByOne: function increaseNumericStringByOne(string) {
1523
+ if (typeof string !== 'string') {
1524
+ string = '' + string;
1525
+ for (var i = string.length - 1; i >= 0; i--) {
1526
+ var c = string.charAt(i);
1527
+ if (c < '0' || c > '9') {
1528
+ return '1';
1529
+ }
1530
+ }
1531
+ }
1532
+ if (string === '') {
1533
+ return '1';
1534
+ }
1535
+ for (var _i = string.length - 1; _i >= 0; _i--) {
1536
+ var _c = string.charAt(_i);
1537
+ if (_c < '0' || _c > '9') {
1538
+ return '1';
1539
+ }
1540
+ if (_c < '9') {
1541
+ _c++;
1542
+ string = string.substring(0, _i) + _c + string.substring(_i + 1); // string[i] = (char + 1);
1543
+ break;
1544
+ }
1545
+ string = string.substring(0, _i) + '0' + string.substring(_i + 1); // string[i] = '0';
1546
+ }
1547
+ if (string.charAt(0) === '0') {
1548
+ string = '1' + string;
1549
+ }
1550
+ return string;
1551
+ },
1552
+ /**
1553
+ * Generates a base64 string (with +/ replaced by -_) that is guaranteed to be unique.
1554
+ *
1555
+ * @returns {string}
1556
+ */
1557
+ uniqueId: function () {
1558
+ var previousUniqueIdsTime = null;
1559
+ var previousUniqueIds = {};
1560
+ var numberToBytes = function numberToBytes(number) {
1561
+ var size = number === 0 ? 0 : Math.ceil((Math.floor(Math.log2(number)) + 1) / 8);
1562
+ var bytes = new Uint8ClampedArray(size);
1563
+ var x = number;
1564
+ for (var i = size - 1; i >= 0; i--) {
1565
+ var rightByte = x & 0xff;
1566
+ bytes[i] = rightByte;
1567
+ x = Math.floor(x / 0x100);
1568
+ }
1569
+ return bytes;
1570
+ };
1571
+ var generateUniqueId = function generateUniqueId() {
1572
+ var now;
1573
+ try {
1574
+ // noinspection JSDeprecatedSymbols
1575
+ now = (performance.timeOrigin || performance.timing.navigationStart) + performance.now();
1576
+ if (typeof now !== 'number') {
1577
+ throw new Error();
1578
+ }
1579
+ } catch (e) {
1580
+ now = Date.now ? Date.now() : new Date().getTime();
1581
+ }
1582
+ now = Math.round(now);
1583
+ var nowBytes = numberToBytes(now);
1584
+ var uuid = null;
1585
+ try {
1586
+ var _crypto;
1587
+ uuid = (_crypto = crypto) === null || _crypto === void 0 ? void 0 : _crypto.randomUUID();
1588
+ } catch (e) {}
1589
+ if (uuid) {
1590
+ uuid = LeUtils.base64ToBytes(LeUtils.hexToBase64(uuid));
1591
+ } else {
1592
+ var bytesChunkA = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));
1593
+ var bytesChunkB = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));
1594
+ var bytesChunkC = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));
1595
+ var bytesChunkD = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));
1596
+ uuid = new Uint8Array(bytesChunkA.length + bytesChunkB.length + bytesChunkC.length + bytesChunkD.length);
1597
+ uuid.set(bytesChunkA, 0);
1598
+ uuid.set(bytesChunkB, bytesChunkA.length);
1599
+ uuid.set(bytesChunkC, bytesChunkA.length + bytesChunkB.length);
1600
+ uuid.set(bytesChunkD, bytesChunkA.length + bytesChunkB.length + bytesChunkC.length);
1601
+ }
1602
+ var bytes = new Uint8Array(nowBytes.length + uuid.length);
1603
+ bytes.set(nowBytes, 0);
1604
+ bytes.set(uuid, nowBytes.length);
1605
+ uuid = LeUtils.bytesToBase64(bytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');
1606
+ return {
1607
+ time: now,
1608
+ id: uuid
1609
+ };
1610
+ };
1611
+ return function () {
1612
+ while (true) {
1613
+ var result = generateUniqueId();
1614
+ if (previousUniqueIdsTime !== result.time) {
1615
+ previousUniqueIdsTime = result.time;
1616
+ previousUniqueIds = _defineProperty({}, result.id, true);
1617
+ return result.id;
1618
+ } else if (previousUniqueIds[result.id] !== true) {
1619
+ previousUniqueIds[result.id] = true;
1620
+ return result.id;
1621
+ }
1622
+ }
1623
+ };
1624
+ }(),
1625
+ /**
1626
+ * Generates a base64 string (with +/ replaced by -_) of the current time (in milliseconds since 1970).
1627
+ *
1628
+ * @param {number} [now] Optional time to use instead of the current time. If not set, the current time will be used.
1629
+ * @returns {string}
1630
+ */
1631
+ timestamp: function () {
1632
+ var numberToBytes = function numberToBytes(number) {
1633
+ var size = number === 0 ? 0 : Math.ceil((Math.floor(Math.log2(number)) + 1) / 8);
1634
+ var bytes = new Uint8ClampedArray(size);
1635
+ var x = number;
1636
+ for (var i = size - 1; i >= 0; i--) {
1637
+ var rightByte = x & 0xff;
1638
+ bytes[i] = rightByte;
1639
+ x = Math.floor(x / 0x100);
1640
+ }
1641
+ return bytes;
1642
+ };
1643
+ return function () {
1644
+ var now = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1645
+ if (ISSET(now)) {
1646
+ now = FLOAT_LAX(now);
1647
+ } else {
1648
+ try {
1649
+ // noinspection JSDeprecatedSymbols
1650
+ now = (performance.timeOrigin || performance.timing.navigationStart) + performance.now();
1651
+ if (typeof now !== 'number') {
1652
+ throw new Error();
1653
+ }
1654
+ } catch (e) {
1655
+ now = Date.now ? Date.now() : new Date().getTime();
1656
+ }
1657
+ }
1658
+ now = Math.round(now);
1659
+ var nowBytes = numberToBytes(now);
1660
+ return LeUtils.bytesToBase64(nowBytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');
1661
+ };
1662
+ }(),
1663
+ /**
1664
+ * Returns a data URL of a 1x1 transparent pixel.
1665
+ *
1666
+ * @returns {string}
1667
+ */
1668
+ getEmptyImageSrc: function getEmptyImageSrc() {
1669
+ // noinspection SpellCheckingInspection
1670
+ return 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
1671
+ },
1672
+ /**
1673
+ * Calculates and returns the percentage of the part and total ((part / total) * 100).
1674
+ *
1675
+ * @param {number|string} part
1676
+ * @param {number|string} total
1677
+ * @returns {number}
1678
+ */
1679
+ getPercentage: function getPercentage(part, total) {
1680
+ part = FLOAT_LAX(part);
1681
+ total = FLOAT_LAX(total);
1682
+ if (total <= 0) {
1683
+ return 100;
1684
+ }
1685
+ return Math.max(0, Math.min(100, part / total * 100));
1686
+ },
1687
+ /**
1688
+ * Returns the pixels of the given Image object.
1689
+ *
1690
+ * @param {HTMLImageElement} image
1691
+ * @returns {Uint8ClampedArray}
1692
+ */
1693
+ getImagePixels: function getImagePixels(image) {
1694
+ if (!document) {
1695
+ return new Uint8ClampedArray();
1696
+ }
1697
+ var canvas = document.createElement('canvas');
1698
+ document.body.appendChild(canvas);
1699
+ try {
1700
+ var ctx = canvas.getContext('2d');
1701
+ var width = Math.floor(image.width);
1702
+ var height = Math.floor(image.height);
1703
+ if (width <= 0 || height <= 0) {
1704
+ canvas.width = 1;
1705
+ canvas.height = 1;
1706
+ } else {
1707
+ canvas.width = width;
1708
+ canvas.height = height;
1709
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
1710
+ }
1711
+ return ctx.getImageData(0, 0, canvas.width, canvas.height).data;
1712
+ } finally {
1713
+ canvas.parentNode.removeChild(canvas);
1714
+ }
1715
+ },
1716
+ /**
1717
+ * Returns the data URL (mimetype "image/png") of a colored version of the given Image object.
1718
+ *
1719
+ * @param {HTMLImageElement} image
1720
+ * @param {string} color
1721
+ * @returns {string}
1722
+ */
1723
+ getColoredImage: function getColoredImage(image, color) {
1724
+ if (!document) {
1725
+ return LeUtils.getEmptyImageSrc();
1726
+ }
1727
+ var canvas = document.createElement('canvas');
1728
+ document.body.appendChild(canvas);
1729
+ try {
1730
+ var ctx = canvas.getContext('2d');
1731
+ var width = Math.floor(image.width);
1732
+ var height = Math.floor(image.height);
1733
+ if (width <= 0 || height <= 0) {
1734
+ canvas.width = 1;
1735
+ canvas.height = 1;
1736
+ } else {
1737
+ canvas.width = width;
1738
+ canvas.height = height;
1739
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
1740
+ }
1741
+ ctx.globalCompositeOperation = 'source-in';
1742
+ ctx.fillStyle = color;
1743
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
1744
+ return canvas.toDataURL('image/png');
1745
+ } finally {
1746
+ canvas.parentNode.removeChild(canvas);
1747
+ }
1748
+ },
1749
+ /**
1750
+ * Returns the hex color of the given RGB(A).
1751
+ *
1752
+ * @param {number[]} rgb
1753
+ * @returns {string}
1754
+ */
1755
+ rgbToHex: function rgbToHex(rgb) {
1756
+ return '#' + rgb.map(function (x) {
1757
+ var hex = x.toString(16);
1758
+ return hex.length === 1 ? '0' + hex : hex;
1759
+ }).join('');
1760
+ },
1761
+ /**
1762
+ * Returns the RGB(A) of the given hex color.
1763
+ *
1764
+ * @param {string} hexstring
1765
+ * @returns {number[]}
1766
+ */
1767
+ hexToRgb: function hexToRgb(hexstring) {
1768
+ hexstring = hexstring.replace(/[^0-9A-F]/gi, '');
1769
+ var hasAlpha = hexstring.length === 4 || hexstring.length === 8;
1770
+ while (hexstring.length < 6) {
1771
+ hexstring = hexstring.replace(/(.)/g, '$1$1');
1772
+ }
1773
+ var result = hexstring.match(/\w{2}/g).map(function (a) {
1774
+ return parseInt(a, 16);
1775
+ });
1776
+ return [result[0], result[1], result[2]].concat(_toConsumableArray(hasAlpha ? [result[3]] : []));
1777
+ },
1778
+ /**
1779
+ * Returns the HSL(A) of the given RGB(A).
1780
+ *
1781
+ * @param {number[]} rgb
1782
+ * @returns {number[]}
1783
+ */
1784
+ rgbToHsl: function rgbToHsl(rgb) {
1785
+ var r = rgb[0] / 255;
1786
+ var g = rgb[1] / 255;
1787
+ var b = rgb[2] / 255;
1788
+ var max = Math.max(r, g, b);
1789
+ var min = Math.min(r, g, b);
1790
+ var h,
1791
+ s,
1792
+ l = (max + min) / 2;
1793
+ if (max === min) {
1794
+ h = s = 0;
1795
+ } else {
1796
+ var d = max - min;
1797
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
1798
+ switch (max) {
1799
+ case r:
1800
+ h = (g - b) / d + (g < b ? 6 : 0);
1801
+ break;
1802
+ case g:
1803
+ h = (b - r) / d + 2;
1804
+ break;
1805
+ case b:
1806
+ h = (r - g) / d + 4;
1807
+ break;
1808
+ }
1809
+ h /= 6;
1810
+ }
1811
+ return [h, s, l].concat(_toConsumableArray(rgb.length >= 4 ? [rgb[3] / 255] : []));
1812
+ },
1813
+ /**
1814
+ * Returns the RGB(A) of the given HSL(A).
1815
+ *
1816
+ * @param {number[]} hsl
1817
+ * @returns {number[]}
1818
+ */
1819
+ hslToRgb: function () {
1820
+ var hue2rgb = function hue2rgb(p, q, t) {
1821
+ if (t < 0) {
1822
+ t += 1;
1823
+ }
1824
+ if (t > 1) {
1825
+ t -= 1;
1826
+ }
1827
+ if (t < 1 / 6) {
1828
+ return p + (q - p) * 6 * t;
1829
+ }
1830
+ if (t < 1 / 2) {
1831
+ return q;
1832
+ }
1833
+ if (t < 2 / 3) {
1834
+ return p + (q - p) * (2 / 3 - t) * 6;
1835
+ }
1836
+ return p;
1837
+ };
1838
+ return function (hsl) {
1839
+ var h = hsl[0];
1840
+ var s = hsl[1];
1841
+ var l = hsl[2];
1842
+ var r, g, b;
1843
+ if (s === 0) {
1844
+ r = g = b = l;
1845
+ } else {
1846
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
1847
+ var p = 2 * l - q;
1848
+ r = hue2rgb(p, q, h + 1 / 3);
1849
+ g = hue2rgb(p, q, h);
1850
+ b = hue2rgb(p, q, h - 1 / 3);
1851
+ }
1852
+ return [r * 255, g * 255, b * 255].concat(_toConsumableArray(hsl.length >= 4 ? [hsl[3] * 255] : [])).map(function (c) {
1853
+ return Math.max(0, Math.min(255, Math.round(c)));
1854
+ });
1855
+ };
1856
+ }(),
1857
+ /**
1858
+ * Returns the LAB(A) of the given RGB(A).
1859
+ *
1860
+ * @param {number[]} rgb
1861
+ * @returns {number[]}
1862
+ */
1863
+ rgbToLab: function rgbToLab(rgb) {
1864
+ var r = rgb[0] / 255;
1865
+ var g = rgb[1] / 255;
1866
+ var b = rgb[2] / 255;
1867
+ r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
1868
+ g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
1869
+ b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
1870
+ var x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;
1871
+ var y = r * 0.2126 + g * 0.7152 + b * 0.0722;
1872
+ var z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;
1873
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
1874
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
1875
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
1876
+ return [116 * y - 16, 500 * (x - y), 200 * (y - z)].concat(_toConsumableArray(rgb.length >= 4 ? [rgb[3] / 255] : []));
1877
+ },
1878
+ /**
1879
+ * Returns the difference (calculated with DeltaE) of the LAB values of the given RGB values.
1880
+ *
1881
+ * Returns a number:
1882
+ *
1883
+ * <pre>
1884
+ * < 1.0 is not perceptible by human eyes
1885
+ * 1-2 is perceptible through close observation
1886
+ * 2-10 is perceptible at a glance
1887
+ * 11-49 is more similar than opposite
1888
+ * 100 is exactly the opposite color
1889
+ * </pre>
1890
+ *
1891
+ * @param {number[]} rgbA
1892
+ * @param {number[]} rgbB
1893
+ * @returns {number}
1894
+ */
1895
+ getDifferenceBetweenRgb: function getDifferenceBetweenRgb(rgbA, rgbB) {
1896
+ var labA = LeUtils.rgbToLab(rgbA);
1897
+ var labB = LeUtils.rgbToLab(rgbB);
1898
+ return LeUtils.getDifferenceBetweenLab(labA, labB);
1899
+ },
1900
+ /**
1901
+ * Returns the difference (calculated with DeltaE) of the given LAB values. Ignores the Alpha channel.
1902
+ *
1903
+ * Returns a number:
1904
+ *
1905
+ * <pre>
1906
+ * < 1.0 is not perceptible by human eyes
1907
+ * 1-2 is perceptible through close observation
1908
+ * 2-10 is perceptible at a glance
1909
+ * 11-49 is more similar than opposite
1910
+ * 100 is exactly the opposite color
1911
+ * </pre>
1912
+ *
1913
+ * @param {number[]} labA
1914
+ * @param {number[]} labB
1915
+ * @returns {number}
1916
+ */
1917
+ getDifferenceBetweenLab: function getDifferenceBetweenLab(labA, labB) {
1918
+ var deltaL = labA[0] - labB[0];
1919
+ var deltaA = labA[1] - labB[1];
1920
+ var deltaB = labA[2] - labB[2];
1921
+ var c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);
1922
+ var c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);
1923
+ var deltaC = c1 - c2;
1924
+ var deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;
1925
+ deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);
1926
+ var sc = 1.0 + 0.045 * c1;
1927
+ var sh = 1.0 + 0.015 * c1;
1928
+ var deltaLKlsl = deltaL / 1.0;
1929
+ var deltaCkcsc = deltaC / sc;
1930
+ var deltaHkhsh = deltaH / sh;
1931
+ var i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;
1932
+ return i < 0 ? 0 : Math.sqrt(i);
1933
+ },
1934
+ /**
1935
+ * Returns the RGB(A) of the given RGB(A) values, based on the given percentage (0-100).
1936
+ * This allows you to define a gradient of colors to fade in between, rather than just having a start and an end color.
1937
+ *
1938
+ * Usage:
1939
+ *
1940
+ * <pre>
1941
+ * LeUtils.getRgbOfGradient({
1942
+ * 0: [255, 0, 0],
1943
+ * 33: [255, 255, 0],
1944
+ * 66: [0, 255, 0],
1945
+ * 100:[0, 255, 255],
1946
+ * }, 45.1234);
1947
+ * </pre>
1948
+ *
1949
+ * @param {{[percentage]: number[]}} gradient
1950
+ * @param {number} percentage
1951
+ * @returns {number[]}
1952
+ */
1953
+ getRgbOfGradient: function getRgbOfGradient(gradient, percentage) {
1954
+ percentage = Math.max(0, Math.min(100, FLOAT_LAX(percentage)));
1955
+ var closest = null;
1956
+ LeUtils.each(gradient, function (color, percent) {
1957
+ percent = INT_LAX(percent);
1958
+ if (closest === null) {
1959
+ closest = [percent, Math.abs(percentage - percent)];
1960
+ } else {
1961
+ var difference = Math.abs(percentage - percent);
1962
+ if (difference < closest[1]) {
1963
+ closest = [percent, difference];
1964
+ }
1965
+ }
1966
+ });
1967
+ if (closest === null) {
1968
+ return null;
1969
+ }
1970
+ closest = closest[0];
1971
+ var higher = 99999;
1972
+ var lower = -99999;
1973
+ LeUtils.each(gradient, function (color, percent) {
1974
+ percent = INT_LAX(percent);
1975
+ if (percent < closest) {
1976
+ if (percent > lower) {
1977
+ lower = percent;
1978
+ }
1979
+ }
1980
+ if (percent > closest) {
1981
+ if (percent < higher) {
1982
+ higher = percent;
1983
+ }
1984
+ }
1985
+ });
1986
+ if (higher === 99999) {
1987
+ higher = null;
1988
+ }
1989
+ if (lower === -99999) {
1990
+ lower = null;
1991
+ }
1992
+ if (higher === null && lower === null || higher === lower) {
1993
+ return gradient[closest];
1994
+ } else if (higher !== null && lower !== null) {
1995
+ var higherDifference = Math.abs(higher - percentage);
1996
+ var lowerDifference = Math.abs(percentage - lower);
1997
+ if (higherDifference > lowerDifference) {
1998
+ higher = closest;
1999
+ } else {
2000
+ lower = closest;
2001
+ }
2002
+ } else if (lower === null) {
2003
+ lower = closest;
2004
+ } else {
2005
+ higher = closest;
2006
+ }
2007
+ if (lower > higher) {
2008
+ var tmp = higher;
2009
+ higher = lower;
2010
+ lower = tmp;
2011
+ }
2012
+ var total = higher - lower;
2013
+ var part = percentage - lower;
2014
+ return LeUtils.getRgbBetween(gradient[lower], gradient[higher], part / total * 100);
2015
+ },
2016
+ /**
2017
+ * Returns the RGB(A) between the two given RGB(A) values, based on the given percentage (0-100).
2018
+ *
2019
+ * @param {number[]} startRgb
2020
+ * @param {number[]} endRgb
2021
+ * @param {number} percentage
2022
+ * @returns {number[]}
2023
+ */
2024
+ getRgbBetween: function getRgbBetween(startRgb, endRgb, percentage) {
2025
+ percentage = FLOAT_LAX(percentage);
2026
+ var partEnd = Math.max(0, Math.min(1, percentage / 100.0));
2027
+ var partStart = 1 - partEnd;
2028
+ var length = Math.min(startRgb.length, endRgb.length);
2029
+ var result = [];
2030
+ for (var i = 0; i < length; i++) {
2031
+ result.push(Math.max(0, Math.min(255, Math.round(startRgb[i] * partStart + endRgb[i] * partEnd))));
2032
+ }
2033
+ return result;
2034
+ },
2035
+ /**
2036
+ * An implementation of the btoa function, which should work in all environments.
2037
+ *
2038
+ * @param {string} string
2039
+ * @returns {string}
2040
+ */
2041
+ btoa: function (_btoa) {
2042
+ function btoa(_x12) {
2043
+ return _btoa.apply(this, arguments);
2044
+ }
2045
+ btoa.toString = function () {
2046
+ return _btoa.toString();
2047
+ };
2048
+ return btoa;
2049
+ }(function (string) {
2050
+ if (typeof btoa === 'function') {
2051
+ return btoa(string);
2052
+ }
2053
+ return Buffer.from(string).toString('base64');
2054
+ }),
2055
+ /**
2056
+ * An implementation of the atob function, which should work in all environments.
2057
+ *
2058
+ * @param {string} base64string
2059
+ * @returns {string}
2060
+ */
2061
+ atob: function (_atob) {
2062
+ function atob(_x13) {
2063
+ return _atob.apply(this, arguments);
2064
+ }
2065
+ atob.toString = function () {
2066
+ return _atob.toString();
2067
+ };
2068
+ return atob;
2069
+ }(function (base64string) {
2070
+ if (typeof atob === 'function') {
2071
+ return atob(base64string);
2072
+ }
2073
+ return Buffer.from(base64string, 'base64').toString();
2074
+ }),
2075
+ /**
2076
+ * Encodes a UTF-8 string into a base64 string.
2077
+ *
2078
+ * @param {string} string
2079
+ * @returns {string}
2080
+ */
2081
+ utf8ToBase64: function utf8ToBase64(string) {
2082
+ return LeUtils.btoa(encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, function (match, p1) {
2083
+ return String.fromCharCode(parseInt(p1, 16));
2084
+ }));
2085
+ },
2086
+ /**
2087
+ * Decodes a base64 string back into a UTF-8 string.
2088
+ *
2089
+ * @param {string} base64string
2090
+ * @returns {string}
2091
+ */
2092
+ base64ToUtf8: function base64ToUtf8(base64string) {
2093
+ return decodeURIComponent(LeUtils.atob(base64string.trim()).split('').map(function (c) {
2094
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
2095
+ }).join(''));
2096
+ },
2097
+ /**
2098
+ * Converts a base64 string into a hex string.
2099
+ *
2100
+ * @param {string} base64string
2101
+ * @returns {string}
2102
+ */
2103
+ base64ToHex: function base64ToHex(base64string) {
2104
+ return LeUtils.atob(base64string.trim()).split('').map(function (c) {
2105
+ return ('0' + c.charCodeAt(0).toString(16)).slice(-2);
2106
+ }).join('');
2107
+ },
2108
+ /**
2109
+ * Converts a hex string into a base64 string.
2110
+ *
2111
+ * @param {string} hexstring
2112
+ * @returns {string}
2113
+ */
2114
+ hexToBase64: function hexToBase64(hexstring) {
2115
+ return LeUtils.btoa(hexstring.replace(/[^0-9A-F]/gi, '').match(/\w{2}/g).map(function (a) {
2116
+ return String.fromCharCode(parseInt(a, 16));
2117
+ }).join(''));
2118
+ },
2119
+ /**
2120
+ * Converts a base64 string into bytes (Uint8Array).
2121
+ *
2122
+ * @param {string} base64string
2123
+ * @returns {Uint8Array}
2124
+ */
2125
+ base64ToBytes: function base64ToBytes(base64string) {
2126
+ var binary = LeUtils.atob(base64string.trim());
2127
+ var len = binary.length;
2128
+ var data = new Uint8Array(len);
2129
+ for (var i = 0; i < len; i++) {
2130
+ data[i] = binary.charCodeAt(i);
2131
+ }
2132
+ return data;
2133
+ },
2134
+ /**
2135
+ * Converts bytes into a base64 string.
2136
+ *
2137
+ * @param {ArrayLike<number>|ArrayBufferLike} arraybuffer
2138
+ * @returns {string}
2139
+ */
2140
+ bytesToBase64: function bytesToBase64(arraybuffer) {
2141
+ var bytes = new Uint8Array(arraybuffer);
2142
+ var len = bytes.byteLength;
2143
+ var binary = '';
2144
+ for (var i = 0; i < len; i++) {
2145
+ binary += String.fromCharCode(bytes[i]);
2146
+ }
2147
+ return LeUtils.btoa(binary);
2148
+ },
2149
+ /**
2150
+ * Downloads the given base64 string as a file.
2151
+ *
2152
+ * @param {string} base64string
2153
+ * @param {string} [fileName]
2154
+ * @param {string} [mimeType]
2155
+ */
2156
+ downloadFile: function downloadFile(base64string, fileName, mimeType) {
2157
+ var link = document.createElement('a');
2158
+ link.setAttribute('download', typeof fileName === 'string' ? fileName : 'file');
2159
+ link.href = 'data:' + mimeType + ';base64,' + base64string;
2160
+ link.setAttribute('target', '_blank');
2161
+ link.click();
2162
+ },
2163
+ /**
2164
+ * Loads the value from the browser, returns undefined if the value doesn't exist.
2165
+ *
2166
+ * @param {string} id
2167
+ * @returns {*}
2168
+ */
2169
+ localStorageGet: function localStorageGet(id) {
2170
+ if (typeof window === 'undefined') {
2171
+ return;
2172
+ }
2173
+ var result = window.localStorage.getItem('LeUtils_' + id);
2174
+ if (typeof result !== 'string') {
2175
+ return;
2176
+ }
2177
+ try {
2178
+ result = JSON.parse(result);
2179
+ if (typeof result['-'] !== 'undefined') {
2180
+ return result['-'];
2181
+ }
2182
+ } catch (e) {}
2183
+ },
2184
+ /**
2185
+ * Saves the given data in the browser.
2186
+ *
2187
+ * @param {string} id
2188
+ * @param {*} data
2189
+ */
2190
+ localStorageSet: function localStorageSet(id, data) {
2191
+ if (typeof window === 'undefined') {
2192
+ return;
2193
+ }
2194
+ if (typeof data === 'undefined') {
2195
+ window.localStorage.removeItem('LeUtils_' + id);
2196
+ return;
2197
+ }
2198
+ window.localStorage.setItem('LeUtils_' + id, JSON.stringify({
2199
+ '-': data
2200
+ }));
2201
+ },
2202
+ /**
2203
+ * Removes the data from the browser.
2204
+ *
2205
+ * @param {string} id
2206
+ */
2207
+ localStorageRemove: function localStorageRemove(id) {
2208
+ if (typeof window === 'undefined') {
2209
+ return;
2210
+ }
2211
+ window.localStorage.removeItem('LeUtils_' + id);
2212
+ },
2213
+ /**
2214
+ * Returns whether the current hostname (window.location.hostname) is private (such as localhost, 192.168.1.1, etc).
2215
+ * This can be used to determine if the app is running in a development environment or not.
2216
+ *
2217
+ * Only "localhost" and IPv4 addresses are supported. IPv6 addresses will always return false.
2218
+ *
2219
+ * @returns {boolean}
2220
+ */
2221
+ isCurrentHostPrivate: function () {
2222
+ var lastHostname = null;
2223
+ var lastResult = false;
2224
+ return function () {
2225
+ if (typeof window === 'undefined') {
2226
+ return false; // server-side rendering, who knows to who it is being served to, assume it's public
2227
+ }
2228
+ var hostname = window.location.hostname;
2229
+ if (lastHostname === hostname) {
2230
+ return lastResult;
2231
+ }
2232
+ lastHostname = hostname;
2233
+ lastResult = LeUtils.isGivenHostPrivate(lastHostname);
2234
+ return lastResult;
2235
+ };
2236
+ }(),
2237
+ /**
2238
+ * Returns true if the given hostname is private (such as localhost, 192.168.1.1, etc).
2239
+ *
2240
+ * Only "localhost" and IPv4 addresses are supported. IPv6 addresses will always return false.
2241
+ *
2242
+ * @param {string} host
2243
+ * @returns {boolean}
2244
+ */
2245
+ isGivenHostPrivate: function isGivenHostPrivate(host) {
2246
+ host = STRING(host).trim().toLowerCase();
2247
+ if (host === 'localhost' || host === '127.0.0.1') {
2248
+ return true;
2249
+ }
2250
+ if (!/^(\d{1,3}\.){3}\d{1,3}$/.test(host)) {
2251
+ return false;
2252
+ }
2253
+ var parts = host.split('.');
2254
+ return parts[0] === '10' ||
2255
+ // 10.0.0.0 - 10.255.255.255
2256
+ parts[0] === '172' && parseInt(parts[1], 10) >= 16 && parseInt(parts[1], 10) <= 31 ||
2257
+ // 172.16.0.0 - 172.31.255.255
2258
+ parts[0] === '192' && parts[1] === '168'; // 192.168.0.0 - 192.168.255.255
2259
+ },
2260
+ /**
2261
+ * Creates and returns a new TreeSet.
2262
+ * A TreeSet is a set of elements, sorted by a comparator.
2263
+ * Binary search is used to find elements, which makes it very fast to find elements.
2264
+ *
2265
+ * The comparator is also used to determine if two values are equal to each other.
2266
+ * This way, you can have values that aren't the same be treated as if they are. This can be used to deal with issues such as floating point errors for example.
2267
+ *
2268
+ * @param {*[]} elements
2269
+ * @param {Function} comparator
2270
+ * @returns {{getElements: (function(): *[]), getComparator: (function(): Function), size: (function(): number), isEmpty: (function(): boolean), contains: (function(*): boolean), first: (function(): *|undefined), last: (function(): *|undefined), pollFirst: (function(): *|undefined), pollLast: (function(): *|undefined), add: function(*), addAll: function(*[]|object), getEqualValue: (function(*): (*)), getEqualValueOrAdd: (function(*): (*))}}
2271
+ */
2272
+ createTreeSet: function createTreeSet(elements, comparator) {
2273
+ comparator = comparator || LeUtils.compare;
2274
+ elements = elements || [];
2275
+ elements.sort(comparator);
2276
+
2277
+ /**
2278
+ * Performs a binary search on the elements, and returns the result.
2279
+ *
2280
+ * @param {*} value
2281
+ * @returns {{found: boolean, index: number, value: *|undefined}}
2282
+ */
2283
+ var binarySearch = function binarySearch(value) {
2284
+ var low = 0;
2285
+ var high = elements.length - 1;
2286
+ while (low <= high) {
2287
+ var mid = Math.floor((low + high) / 2);
2288
+ var midValue = elements[mid];
2289
+ var cmp = comparator(midValue, value);
2290
+ if (cmp < 0) {
2291
+ low = mid + 1;
2292
+ } else if (cmp > 0) {
2293
+ high = mid - 1;
2294
+ } else {
2295
+ return {
2296
+ found: true,
2297
+ index: mid,
2298
+ value: midValue
2299
+ };
2300
+ }
2301
+ }
2302
+ return {
2303
+ found: false,
2304
+ index: low,
2305
+ value: undefined
2306
+ };
2307
+ };
2308
+ var treeSet = {
2309
+ /**
2310
+ * Returns the elements of the set.
2311
+ *
2312
+ * @returns {*[]}
2313
+ */
2314
+ getElements: function getElements() {
2315
+ return elements;
2316
+ },
2317
+ /**
2318
+ * Returns the comparator of the set.
2319
+ *
2320
+ * @returns {Function}
2321
+ */
2322
+ getComparator: function getComparator() {
2323
+ return comparator;
2324
+ },
2325
+ /**
2326
+ * Returns the size of the set.
2327
+ *
2328
+ * @returns {number}
2329
+ */
2330
+ size: function size() {
2331
+ return elements.length;
2332
+ },
2333
+ /**
2334
+ * Returns true if the set is empty, false otherwise.
2335
+ *
2336
+ * @returns {boolean}
2337
+ */
2338
+ isEmpty: function isEmpty() {
2339
+ return elements.length <= 0;
2340
+ },
2341
+ /**
2342
+ * Returns true if the set contains a value that is equal to the given value, returns false otherwise.
2343
+ *
2344
+ * @param {*} value
2345
+ * @returns {boolean}
2346
+ */
2347
+ contains: function contains(value) {
2348
+ return binarySearch(value).found;
2349
+ },
2350
+ /**
2351
+ * Returns the first element of the set, or undefined if it is empty.
2352
+ *
2353
+ * @returns {*|undefined}
2354
+ */
2355
+ first: function first() {
2356
+ return elements.length > 0 ? elements[0] : undefined;
2357
+ },
2358
+ /**
2359
+ * Returns the last element of the set, or undefined if it is empty.
2360
+ *
2361
+ * @returns {*|undefined}
2362
+ */
2363
+ last: function last() {
2364
+ return elements.length > 0 ? elements[elements.length - 1] : undefined;
2365
+ },
2366
+ /**
2367
+ * Removes and returns the first element of the set, or undefined if it is empty.
2368
+ *
2369
+ * @returns {*|undefined}
2370
+ */
2371
+ pollFirst: function pollFirst() {
2372
+ return elements.length > 0 ? elements.splice(0, 1)[0] : undefined;
2373
+ },
2374
+ /**
2375
+ * Removes and returns the last element of the set, or undefined if it is empty.
2376
+ *
2377
+ * @returns {*|undefined}
2378
+ */
2379
+ pollLast: function pollLast() {
2380
+ return elements.length > 0 ? elements.splice(elements.length - 1, 1)[0] : undefined;
2381
+ },
2382
+ /**
2383
+ * Adds the given value to the set. Will only do so if no equal value already exists.
2384
+ *
2385
+ * @param {*} value
2386
+ */
2387
+ add: function add(value) {
2388
+ var result = binarySearch(value);
2389
+ if (result.found) {
2390
+ return;
2391
+ }
2392
+ elements.splice(result.index, 0, value);
2393
+ },
2394
+ /**
2395
+ * Adds all the given values to the set. Will only do so if no equal value already exists.
2396
+ *
2397
+ * @param {*[]|object} values
2398
+ */
2399
+ addAll: function addAll(values) {
2400
+ LeUtils.each(values, treeSet.add);
2401
+ },
2402
+ /**
2403
+ * Returns an equal value that's already in the tree set, or undefined if no equal values in it exist.
2404
+ *
2405
+ * @param {*} value
2406
+ * @returns {*|undefined}
2407
+ */
2408
+ getEqualValue: function getEqualValue(value) {
2409
+ var result = binarySearch(value);
2410
+ if (result.found) {
2411
+ return result.value;
2412
+ }
2413
+ return undefined;
2414
+ },
2415
+ /**
2416
+ * Returns an equal value that's already in the tree set. If no equal values in it exist, the given value will be added and returned.
2417
+ *
2418
+ * @param {*} value
2419
+ * @returns {*}
2420
+ */
2421
+ getEqualValueOrAdd: function getEqualValueOrAdd(value) {
2422
+ var result = binarySearch(value);
2423
+ if (result.found) {
2424
+ return result.value;
2425
+ }
2426
+ elements.splice(result.index, 0, value);
2427
+ return value;
2428
+ }
2429
+ };
2430
+ return treeSet;
2431
+ },
2432
+ /**
2433
+ * @typedef {Object} LeUtils~TransactionalValue
2434
+ * @property {*} value
2435
+ * @property {{id:string, value:*}[]} changes
2436
+ */
2437
+ /**
2438
+ * Creates and returns a new TransactionalValue object.
2439
+ * With a TransactionalValue, you can keep track of changes to a value, and commit or cancel them.
2440
+ *
2441
+ * Multiple uncommitted changes can be made at the same time, the last change will be the one that overwrites older changes.
2442
+ * If that change is cancelled, the previous change will be the one that overwrites older changes.
2443
+ * This allows you to make multiple unconfirmed changes, and confirm or cancel each of them individually at any time.
2444
+ *
2445
+ * @param {*} [value]
2446
+ * @returns {LeUtils~TransactionalValue}
2447
+ */
2448
+ createTransactionalValue: function createTransactionalValue(value) {
2449
+ if (typeof value === 'undefined') {
2450
+ value = null;
2451
+ }
2452
+ return {
2453
+ value: value,
2454
+ changes: []
2455
+ };
2456
+ },
2457
+ /**
2458
+ * Returns true if the given value is a valid TransactionalValue, returns false if it isn't.
2459
+ *
2460
+ * @param {LeUtils~TransactionalValue} transactionalValue
2461
+ * @returns {boolean}
2462
+ */
2463
+ isTransactionalValueValid: function isTransactionalValueValid(transactionalValue) {
2464
+ return _typeof(transactionalValue) === 'object' && 'value' in transactionalValue && 'changes' in transactionalValue && Array.isArray(transactionalValue.changes);
2465
+ },
2466
+ /**
2467
+ * Returns true if the given value is a TransactionalValue, false otherwise.
2468
+ *
2469
+ * @param {LeUtils~TransactionalValue} transactionalValue
2470
+ * @returns {string}
2471
+ */
2472
+ transactionalValueToString: function transactionalValueToString(transactionalValue) {
2473
+ if (!LeUtils.isTransactionalValueValid(transactionalValue)) {
2474
+ return transactionalValue + '';
2475
+ }
2476
+ if (transactionalValue.changes.length <= 0) {
2477
+ return '' + transactionalValue.value;
2478
+ }
2479
+ var valuesString = '' + transactionalValue.value;
2480
+ for (var i = 0; i < transactionalValue.changes.length; i++) {
2481
+ valuesString += ' -> ' + transactionalValue.changes[i].value;
2482
+ }
2483
+ return transactionalValue.changes[transactionalValue.changes.length - 1].value + ' (' + valuesString + ')';
2484
+ },
2485
+ /**
2486
+ * Sets the committed value of the given TransactionalValue to the given value. Clears out the previously uncommitted changes.
2487
+ *
2488
+ * @param {LeUtils~TransactionalValue} transactionalValue
2489
+ * @param {*} value
2490
+ */
2491
+ transactionSetAndCommit: function transactionSetAndCommit(transactionalValue, value) {
2492
+ checkTransactionalValue(transactionalValue);
2493
+ if (typeof value === 'undefined') {
2494
+ value = null;
2495
+ }
2496
+ transactionalValue.value = value;
2497
+ transactionalValue.changes = [];
2498
+ },
2499
+ /**
2500
+ * Sets the value of the given TransactionalValue to the given value, without yet committing it, meaning it can be committed or cancelled later.
2501
+ * It returns the ID of the change, which can be used to commit or cancel the change later.
2502
+ *
2503
+ * @param {LeUtils~TransactionalValue} transactionalValue
2504
+ * @param {*} value
2505
+ * @returns {string}
2506
+ */
2507
+ transactionSetWithoutCommitting: function transactionSetWithoutCommitting(transactionalValue, value) {
2508
+ checkTransactionalValue(transactionalValue);
2509
+ if (typeof value === 'undefined') {
2510
+ value = null;
2511
+ }
2512
+ var id = LeUtils.uniqueId();
2513
+ transactionalValue.changes.push({
2514
+ id: id,
2515
+ value: value
2516
+ });
2517
+ return id;
2518
+ },
2519
+ /**
2520
+ * Commits the change with the given ID, making it the new committed value.
2521
+ * Returns true if the change was found and committed, returns false if it was already overwritten by a newer committed change.
2522
+ *
2523
+ * @param {LeUtils~TransactionalValue} transactionalValue
2524
+ * @param {string} changeId
2525
+ * @returns {boolean}
2526
+ */
2527
+ transactionCommitChange: function transactionCommitChange(transactionalValue, changeId) {
2528
+ checkTransactionalValue(transactionalValue);
2529
+ var change = findTransactionalValueChange(transactionalValue, changeId);
2530
+ if (change === null) {
2531
+ return false;
2532
+ }
2533
+ transactionalValue.value = change.value;
2534
+ transactionalValue.changes.splice(0, change.index + 1);
2535
+ return true;
2536
+ },
2537
+ /**
2538
+ * Cancels the change with the given ID, removing it from the uncommitted changes.
2539
+ * Returns true if the change was found and removed, returns false if it was already overwritten by a newer committed change.
2540
+ *
2541
+ * @param {LeUtils~TransactionalValue} transactionalValue
2542
+ * @param {string} changeId
2543
+ * @returns {boolean}
2544
+ */
2545
+ transactionCancelChange: function transactionCancelChange(transactionalValue, changeId) {
2546
+ checkTransactionalValue(transactionalValue);
2547
+ var change = findTransactionalValueChange(transactionalValue, changeId);
2548
+ if (change === null) {
2549
+ return false;
2550
+ }
2551
+ transactionalValue.changes.splice(change.index, 1);
2552
+ return true;
2553
+ },
2554
+ /**
2555
+ * Returns true if the change was found, meaning it can still make a difference to the final committed value of this TransactionalValue.
2556
+ * Returns false if it was already overwritten by a newer committed change, meaning that this change can no longer make a difference to the final committed value of this TransactionalValue.
2557
+ *
2558
+ * @param {LeUtils~TransactionalValue} transactionalValue
2559
+ * @param {string} changeId
2560
+ * @returns {boolean}
2561
+ */
2562
+ transactionIsChangeRelevant: function transactionIsChangeRelevant(transactionalValue, changeId) {
2563
+ checkTransactionalValue(transactionalValue);
2564
+ return findTransactionalValueChange(transactionalValue, changeId) !== null;
2565
+ },
2566
+ /**
2567
+ * Returns the committed value of the given TransactionalValue.
2568
+ *
2569
+ * @param {LeUtils~TransactionalValue} transactionalValue
2570
+ * @returns {*}
2571
+ */
2572
+ transactionGetCommittedValue: function transactionGetCommittedValue(transactionalValue) {
2573
+ checkTransactionalValue(transactionalValue);
2574
+ return transactionalValue.value;
2575
+ },
2576
+ /**
2577
+ * Returns the value (including any uncommitted changes made to it) of the given TransactionalValue.
2578
+ *
2579
+ * @param {LeUtils~TransactionalValue} transactionalValue
2580
+ * @returns {*}
2581
+ */
2582
+ transactionGetValue: function transactionGetValue(transactionalValue) {
2583
+ checkTransactionalValue(transactionalValue);
2584
+ if (transactionalValue.changes.length <= 0) {
2585
+ return transactionalValue.value;
2586
+ }
2587
+ return transactionalValue.changes[transactionalValue.changes.length - 1].value;
2588
+ },
2589
+ /**
2590
+ * Creates a worker thread. Workers have to be stored at /workers/{workerName}.worker.js for this to work.
2591
+ *
2592
+ * Example of a worker file:
2593
+ *
2594
+ * ```js
2595
+ * onmessage = (message) =>
2596
+ * {
2597
+ * postMessage({
2598
+ * ...message.data,
2599
+ * results: ['...some expensive calculation involving message.data...'],
2600
+ * });
2601
+ * };
2602
+ * ```
2603
+ *
2604
+ * Usage:
2605
+ *
2606
+ * ```js
2607
+ * const {results} = await (async () =>
2608
+ * {
2609
+ * try
2610
+ * {
2611
+ * return await LeUtils.sendWorkerMessage('my-worker', {someData:[1, 2, 3, 4, 5]});
2612
+ * }
2613
+ * catch(error)
2614
+ * {
2615
+ * console.error('MyWorker: ', error);
2616
+ * return {results:[]};
2617
+ * }
2618
+ * })();
2619
+ * ```
2620
+ *
2621
+ * or, if you want more control over the number of threads you have (the above example will only create 1 thread per worker):
2622
+ *
2623
+ * ```js
2624
+ * const myWorker1 = LeUtils.createWorkerThread('my-worker'); // creates a thread, you can create multiple worker threads of the same worker, to run multiple instances in parallel
2625
+ * const myWorker2 = LeUtils.createWorkerThread('my-worker'); // same worker, another thread
2626
+ * const {results} = await (async () =>
2627
+ * {
2628
+ * try
2629
+ * {
2630
+ * return await myWorker1.sendMessage({someData:[1, 2, 3, 4, 5]});
2631
+ * }
2632
+ * catch(error)
2633
+ * {
2634
+ * console.error('MyWorker: ', error);
2635
+ * return {results:[]};
2636
+ * }
2637
+ * })();
2638
+ * ```
2639
+ *
2640
+ * @param {string} name
2641
+ * @returns {{worker: Worker, sendMessage: function(Object, {timeout: number|undefined}|undefined): Promise<Object>}}
2642
+ */
2643
+ createWorkerThread: function createWorkerThread(name) {
2644
+ var worker = new Worker('/workers/' + name + '.worker.js');
2645
+ var listeners = {};
2646
+ var addListener = function addListener(id, callback) {
2647
+ listeners[id] = callback;
2648
+ };
2649
+ var removeListener = function removeListener(id) {
2650
+ delete listeners[id];
2651
+ };
2652
+ var sendMessage = function sendMessage(data, options) {
2653
+ return new Promise(function (resolve, reject) {
2654
+ var _options$timeout;
2655
+ var id = LeUtils.uniqueId();
2656
+ addListener(id, resolve);
2657
+ setTimeout(function () {
2658
+ removeListener(id);
2659
+ reject('timeout');
2660
+ }, (_options$timeout = options === null || options === void 0 ? void 0 : options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : 10000);
2661
+ worker.postMessage(_objectSpread({
2662
+ id: id
2663
+ }, data));
2664
+ });
2665
+ };
2666
+ worker.onerror = function (error) {
2667
+ console.error('Worker ' + name + ':', error);
2668
+ };
2669
+ worker.onmessage = function (message) {
2670
+ var data = message.data;
2671
+ if (data !== null && data !== void 0 && data.id) {
2672
+ var callback = listeners[data.id];
2673
+ if (callback) {
2674
+ removeListener(data.id);
2675
+ callback(data);
2676
+ }
2677
+ }
2678
+ };
2679
+ return {
2680
+ worker: worker,
2681
+ sendMessage: sendMessage
2682
+ };
2683
+ },
2684
+ /**
2685
+ * Sends a message to the given worker. Creates a worker thread for this worker if it doesn't exist yet.
2686
+ *
2687
+ * See {@link LeUtils#createWorkerThread} for more info on how to use workers.
2688
+ *
2689
+ * @param {string} workerName
2690
+ * @param {Object} data
2691
+ * @param {{timeout: number|undefined}} [options]
2692
+ * @returns {Promise<Object>}
2693
+ */
2694
+ sendWorkerMessage: function () {
2695
+ var workers = {};
2696
+ return function (workerName, data, options) {
2697
+ if (!workers[workerName]) {
2698
+ workers[workerName] = LeUtils.createWorkerThread(workerName);
2699
+ }
2700
+ return workers[workerName].sendMessage(data, options);
2701
+ };
2702
+ }(),
2703
+ /**
2704
+ * Returns a deep copy of the given value.
2705
+ *
2706
+ * @param {*} value
2707
+ * @returns {*}
2708
+ */
2709
+ clone: function clone(value) {
2710
+ return CloneDeep(value, true);
2711
+ },
2712
+ /**
2713
+ * Purges the given email address, returning an empty string if it's invalid.
2714
+ *
2715
+ * @param {string} email
2716
+ * @returns {string}
2717
+ */
2718
+ purgeEmail: function purgeEmail(email) {
2719
+ email = STRING(email).trim().toLowerCase().replace(/\s/g, '');
2720
+ if (!email.includes('@') || !email.includes('.')) {
2721
+ return '';
2722
+ }
2723
+ return email;
2724
+ },
2725
+ /**
2726
+ * Returns true if the focus is effectively clear, meaning that the user is not typing in an input field.
2727
+ *
2728
+ * @returns {boolean}
2729
+ */
2730
+ isFocusClear: function () {
2731
+ var inputTypes = ['text', 'search', 'email', 'number', 'password', 'tel', 'time', 'url', 'week', 'month', 'date', 'datetime-local'];
2732
+ return function () {
2733
+ var _document, _document2;
2734
+ return !(((_document = document) === null || _document === void 0 || (_document = _document.activeElement) === null || _document === void 0 || (_document = _document.tagName) === null || _document === void 0 ? void 0 : _document.toLowerCase()) === 'input' && inputTypes.includes((_document2 = document) === null || _document2 === void 0 || (_document2 = _document2.activeElement) === null || _document2 === void 0 || (_document2 = _document2.type) === null || _document2 === void 0 ? void 0 : _document2.toLowerCase()));
2735
+ };
2736
+ }(),
2737
+ /**
2738
+ * Returns the user's locale. Returns 'en-US' if it can't be determined.
2739
+ *
2740
+ * @returns {string}
2741
+ */
2742
+ getUserLocale: function () {
2743
+ var userLocale = null;
2744
+ return function () {
2745
+ if (userLocale === null) {
2746
+ userLocale = function () {
2747
+ if (typeof window === 'undefined') {
2748
+ return 'en-US';
2749
+ }
2750
+ var locales = window.navigator.languages;
2751
+ if (!IS_ARRAY(locales) || locales.length <= 0) {
2752
+ return 'en-US';
2753
+ }
2754
+ locales = locales.filter(function (locale) {
2755
+ return typeof locale === 'string' && locale.includes('-') && locale.toLowerCase() !== 'en-us';
2756
+ });
2757
+ if (locales.length <= 0) {
2758
+ return 'en-US';
2759
+ }
2760
+ var localesNoEnglish = locales.filter(function (locale) {
2761
+ return !locale.toLowerCase().startsWith('en-');
2762
+ });
2763
+ if (localesNoEnglish.length <= 0) {
2764
+ return locales[0];
2765
+ }
2766
+ return localesNoEnglish[0];
2767
+ }();
2768
+ }
2769
+ return userLocale;
2770
+ };
2771
+ }(),
2772
+ /**
2773
+ * Returns the user's locale date format. Always returns YYYY MM DD, with the character in between depending on the user's locale. Returns 'YYYY/MM/DD' if the user's locale can't be determined.
2774
+ *
2775
+ * @returns {string}
2776
+ */
2777
+ getUserLocaleDateFormat: function () {
2778
+ var userLocaleDateFormat = null;
2779
+ return function () {
2780
+ if (userLocaleDateFormat === null) {
2781
+ userLocaleDateFormat = function () {
2782
+ var _char = '/';
2783
+ if (typeof window !== 'undefined' && typeof Intl !== 'undefined' && typeof Intl.DateTimeFormat !== 'undefined') {
2784
+ var formattedDate = new Intl.DateTimeFormat(LeUtils.getUserLocale()).format();
2785
+ if (formattedDate.includes('-')) {
2786
+ _char = '-';
2787
+ } else if (formattedDate.includes('. ')) {
2788
+ _char = '.';
2789
+ } else if (formattedDate.includes('.')) {
2790
+ _char = '.';
2791
+ }
2792
+ }
2793
+ return 'YYYY' + _char + 'MM' + _char + 'DD';
2794
+ }();
2795
+ }
2796
+ return userLocaleDateFormat;
2797
+ };
2798
+ }()
2799
+ };
2800
+
2801
+ export { ARRAY, FLOAT, FLOAT_ANY, FLOAT_LAX, FLOAT_LAX_ANY, INT, INT_ANY, INT_LAX, INT_LAX_ANY, ISSET, IS_ARRAY, IS_OBJECT, LeUtils, OBJECT, STRING, STRING_ANY };
2
2802
  //# sourceMappingURL=index.js.map