@salla.sa/base 2.11.64 → 2.11.76

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.
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("lodash/get"),t=require("eventemitter2"),r=require("store/src/store-engine"),n=require("store/storages/localStorage"),l=require("store/storages/sessionStorage"),i=require("store/storages/cookieStorage"),a=require("store/storages/memoryStorage");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),c=o(t),u=o(r),d=o(n),g=o(l),p=o(i),f=o(a);function h(e,t=!1){e+="";let r,n=["٠","١","٢","٣","٤","٥","٦","٧","٨","٩"],l=["0","1","2","3","4","5","6","7","8","9"],i=(t=t||!Salla.config.get("store.settings.arabic_numbers_enabled"))?n:l,a=t?l:n;for(let t=0;t<i.length;t++)r=new RegExp(i[t],"g"),e=e.replace(r,a[t]);return e}function m(e){let t=(e.match(/\./g)||[]).length;return t&&1!==t?m(e.replace(/\.(.+)\./g,".$1")):e}function b(e){return`${e}`.startsWith("https://")||`${e}`.startsWith("http://")}function v(e){return b(e)||b(e)?e:Salla.config.get("store.url",window.location.href.split("/").slice(0,-1).join("/")).rtrim("/")+"/"+e?.ltrim("/")}function S(e,t){if(!t||!e)return window.location.href;let r=new RegExp("([?&])"+e+"=[^&]+[&]?","g"),n=window.location.href.replace(r,"$1").split("#")[0].replace(/&$|\?$/,"");return n.includes("?")?n+="&":n+=(n.endsWith("/")?"":"/")+"?",(n+e+"="+encodeURIComponent(t)).replace(/&$|\?$/,"")}function w(e){return window.location.origin+"/"+e?.ltrim("/")}function y(e){return b(e)?e:w("themes/"+Salla.config.get("theme.name")+"/"+e?.ltrim("/"))}function _(e,t,r){let n=e[0];return r&&0==e.length?Array.isArray(r)?(r.push(t),r):[r,t]:Array.isArray(r)?(r.push(t),r):"string"==typeof r?[r,t]:r?(r[n]=_(e.slice(1),t,r[n]),r):n?{[n]:_(e.slice(1),t)}:""===n?[t]:t}var x={digitsOnly:function(e){return h(e,!0).replace(/[^0-9.]/g,"").replace("..",".").rtrim(".")},inputDigitsOnly:function e(t,r=!1){if("string"==typeof t)return document.querySelectorAll(t).forEach((t=>e(t,r)));if(!t)return void Salla.logger.warn("Can't find Object With Id: "+t);let n=Salla.helpers.digitsOnly(t.value);return t.min&&n<t.min?t.value=t.min:t.max&&n>t.max?t.value=t.max:t.maxLength>=1&&n.toString().length>t.maxLength?t.value=n.toString().substring(0,t.maxLength):t.value=r||t.dataset.hasOwnProperty("digitsWithDecimal")?m(n):n.replace(/\D/g,"")},number:h,money:function(e){let t=Salla.config.currency(e?.currency).symbol;return h(e="object"==typeof e?e.amount:e)+" "+t},setNested:function(e,t,r){let n=e,l=t.split("."),i=l.length;for(let e=0;e<i-1;e++){let t=l[e];n[t]||(n[t]={}),n=n[t]}return n[l[i-1]]=r,e},getNested:function(e,t,r){let n=s.default(e,t);return void 0!==n?n:r},inputData:function(e,t,r={}){if(e.includes("[")){let n=e.split("]").join("").split("[");return{name:n[0],value:_(n.slice(1),t,r[n[0]])}}return{name:e,value:t}},url:Object.freeze({__proto__:null,is_full_url:b,get:v,addParamToUrl:S,baseUrl:w,asset:y,cdn:function(e){return"https://cdn.salla.network/"+e?.ltrim("/")},api:function(e){return Salla.config.get("store.api",v(""))?.rtrim("/")+"/"+e?.ltrim("/")},is_page:function(e){return e&&Salla.config.get("page.slug")===e},is_placeholder:function(e){return y(salla.config.get("theme.settings.placeholder"))===y(e)}}),addParamToUrl:S,debounce:function(e,t){t=t||100;let r,n=[];return function(...l){return clearTimeout(r),r=setTimeout((()=>{let t=e(...l);n.forEach((e=>e(t))),n=[]}),t),new Promise((e=>n.push(e)))}}},k=function(e){let t={log:function(t,r){if(!e)return;if(!salla.config.isDebug())return;"trace"===salla.config.get("debug")&&(r="trace");let n=e.log,l=void 0===r?n:this.__dict__[r]||n,i=["%cTwilight","color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;"],a={event:"#CFF680",backend:"#7b68ee"}[r];a&&(i[0]+="%c"+r[0].toUpperCase()+r.substring(1),i.push(`margin-left: 5px;color: ${a};font-weight:bold; border:1px solid ${a}; padding: 2px 6px; border-radius: 5px;`)),l.call(e,...i.concat(...t))},__dict__:{trace:e.trace,debug:e.debug,info:e.info,warn:e.warn,error:e.error}};return{event:function(){t.log(arguments,"event")},trace:function(){t.log(arguments,"trace")},debug:function(){t.log(arguments,"debug")},info:function(){t.log(arguments,"info")},warn:function(){t.log(arguments,"warn")},error:function(){t.log(arguments,"error")},log:function(){t.log(arguments,void 0)},backend:function(){t.log(arguments,"backend")},logs:function(e){[e].flat().forEach((e=>e&&t.log([e].flat(),"backend")))}}}(console);class A extends c.default{constructor(){super({wildcard:!0,delimiter:"::",newListener:!1,removeListener:!1,maxListeners:10,verboseMemoryLeak:!1,ignoreErrors:!1}),this.delimiter="::","undefined"!=typeof document&&(this.body=document.querySelector("body")),this.logableEvents=["cart::item.added.failed","cart::item.deleted.failed"],this.ingoreLogEvents=["document::click","document::keyup","document::change"],this.noneFireableActions=["document.request"]}createAndDispatch(e,...t){this.dispatch(e,...t)}emit(e,...t){let r=e.replace("::",".");if(!this.noneFireableActions.includes(r)&&void 0!==Salla.call&&"function"==typeof Salla.call(r))return Salla.log(`'Salla.${r}(...)' triggered using event '${e}'`),r=r.split("."),Array.isArray(t[0])&&(t=t[0]),void salla[r[0]][r[1]](...t);super.emit(e,...t),this.trackEvents(e,...t)}emitAsync(e,...t){let r=super.emitAsync(e,...t);try{this.trackEvents(e,...t)}catch(r){salla.logger.warn(`error on tracking event (${e})`,t,r)}return r}trackEvents(e,...t){if("undefined"!=typeof window){window.dataLayer=window.dataLayer||[];let r={event:e};t.map((e=>"object"==typeof e&&(r={...r,...e}))),window.dataLayer.push(r)}Salla.logger&&!this.ingoreLogEvents.includes(e)&&Salla.logger.event(e,...t),this.dispatchMobileEvent(e,{...t.values()})}dispatch(e,...t){return this.emit(e,...t)}dispatchEvents(e){if(e&&"object"==typeof e)for(const[t,r]of Object.entries(e))this.dispatch(t,r);else Salla.log("No Events To Dispatch!",e)}addListener(e,t){return this.on(e,t)}addEventListener(e,t){return this.on(e,t)}listen(e,t){return this.on(e,t)}registerGlobalListener(e,t){return this.onAny(t)}dispatchMobileEvent(e,t={}){if(!("undefined"!=typeof window&&window.dataLayer&&dataLayer[0]&&dataLayer[0].page&&dataLayer[0].page.mobileApp))return"";if(window.webkit)try{window.webkit.messageHandlers.callbackHandler.postMessage(JSON.stringify({event:e,details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}else if(Android)try{Android.customEventWithData(e,JSON.stringify({details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}}}const L=u.default.createStore([d.default,g.default,p.default,f.default],[]);"undefined"==typeof global?(window.salla=window.salla||window.Salla||{},window.Salla=window.salla):(global.salla=global.salla||global.Salla||{},global.Salla=global.salla),Salla.status="base",Salla.config=new class{constructor(e={},t={}){this.default_properties=t,this.properties_={...this.default_properties,...e}}merge(e){return Object.assign(this.properties_,e),this.properties_.store={...this.default_properties.store,...this.properties_.store},this}set(e,t){return e.includes(".")?(Salla.helpers.setNested(this.properties_,e,t),this):(this.properties_[e]=t,this)}get(e,t=null){return e.includes(".")?Salla.helpers.getNested(this.properties_,e,t):this.properties_.hasOwnProperty(e)?this.properties_[e]||t:t||void 0}all(){return this.properties_}isDebug(){return this.get("debug")||Salla.storage.get("debug")}},Salla.logger=k,Salla.event=new A,Salla.storage=new class{constructor(){Salla.event.on("storage::item.remove",(e=>this.remove(e))),Salla.event.on("storage::item.set",((e,t)=>this.set(e,t))),this.store=L}set(e,t){if(e.includes(".")){let r=e.split(".")[0],n={[r]:this.store.get(r)};return n=Salla.helpers.setNested(n,e,t),this.store.set(r,n[r])}return this.store.set(e,t)}remove(e){return this.store.remove(e)}clearAll(){return this.store.clearAll()}get(e,t){if(e.includes(".")){let t=e.split(".")[0];return Salla.helpers.getNested({[t]:this.store.get(t)},e)}return this.store.get(e,t)}},Salla.cookie=new class{constructor(){Salla.event.on("cookies::remove",(e=>this.remove(e))),Salla.event.on("cookies::add",((e,t)=>this.set(e,t)))}get(e){return document.cookie.split("; ").find((t=>t.startsWith(e+"=")))?.split("=")[1]}set(e,t="",r=10){let n="";if(r){let e=new Date;e.setTime(e.getTime()+24*r*60*60*1e3),n="; expires="+e.toUTCString()}return document.cookie=`${e}=${t}${n}"; path=/; secure; SameSite=Lax"`,this}remove(e){return document.cookie=`${e}=; Max-Age=0; path=/;`,this}clearAll(){let e=document.cookie.split(";");for(let t=0;t<e.length;t++){let r=e[t],n=r.indexOf("="),l=n>-1?r.substr(0,n):r;this.remove(l)}}},Salla.helpers=x,Salla.log=Salla.logger.log,Salla.money=Salla.helpers.money,Salla.url=Salla.helpers.url,Salla.versions={base:"[VI]{version}[/VI]"};var E=Salla;exports.default=E;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("lodash/get"),t=require("eventemitter2"),r=require("store/src/store-engine"),n=require("store/storages/localStorage"),i=require("store/storages/sessionStorage"),o=require("store/storages/cookieStorage"),l=require("store/storages/memoryStorage");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=a(e),c=a(t),u=a(r),d=a(n),g=a(i),p=a(o),h=a(l);function f(e,t=!1){e+="";let r,n=["٠","١","٢","٣","٤","٥","٦","٧","٨","٩"],i=["0","1","2","3","4","5","6","7","8","9"],o=(t=t||!Salla.config.get("store.settings.arabic_numbers_enabled"))?n:i,l=t?i:n;for(let t=0;t<o.length;t++)r=new RegExp(o[t],"g"),e=e.replace(r,l[t]);return e}function m(e){let t=(`${e}`.match(/\./g)||[]).length;return t&&1!==t?m(e.replace(/\.(.+)\./g,".$1")):e}function S(e){return`${e}`.startsWith("https://")||`${e}`.startsWith("http://")}function y(e){if(S(e))return e;let t=Salla.config.get("store.url");return t||(t=window.location.href.split("/").slice(0,-1).join("/"),Salla.config.set("store.url",t)),t.rtrim("/")+"/"+e?.ltrim("/")}function w(e,t){if(!t||!e)return window.location.href;let r=new RegExp("([?&])"+e+"=[^&]+[&]?","g"),n=window.location.href.replace(r,"$1").split("#")[0].replace(/&$|\?$/,"");return n.includes("?")?n+="&":n+=(n.endsWith("/")?"":"/")+"?",(n+e+"="+encodeURIComponent(t)).replace(/&$|\?$/,"")}function b(e){return window.location.origin+"/"+e?.ltrim("/")}function v(e){return S(e)?e:b("themes/"+Salla.config.get("theme.name")+"/"+e?.ltrim("/"))}function _(e,t,r){let n=e[0];return r&&0==e.length?Array.isArray(r)?(r.push(t),r):[r,t]:Array.isArray(r)?(r.push(t),r):"string"==typeof r?[r,t]:r?(r[n]=_(e.slice(1),t,r[n]),r):n?{[n]:_(e.slice(1),t)}:""===n?[t]:t}String.prototype.toStudlyCase=function(){return this.trim().replace(/([^a-zA-Z\d].)/g,(function(e){return e.toUpperCase().replace(/[^a-zA-Z\d]/g,"")}))},String.prototype.toDatasetName=function(){return this.startsWith("data-")?this.substr(5).toStudlyCase():this.toStudlyCase()},String.prototype.toSelector=function(){return this.trim().startsWith(".")||this.trim().startsWith("#")?this:"#"+this},String.prototype.replaceArray=function(e,t){for(var r,n=this,i=0;i<e.length;i++)r=new RegExp(e[i],"g"),n=n.replace(r,t[i]);return n},String.prototype.rtrim=function(e){return void 0===e&&(e="\\s"),this.replace(new RegExp("["+e+"]*$"),"")},String.prototype.ltrim=function(e){return void 0===e&&(e="\\s"),this.replace(new RegExp("^["+e+"]*"),"")},String.prototype.digitsOnly=function(){return Salla.helpers.digitsOnly(this)};var x={digitsOnly:function(e){return f(e,!0).replace(/[^0-9.]/g,"").replace("..",".").rtrim(".")},inputDigitsOnly:function e(t,r=!1){if("string"==typeof t)return document.querySelectorAll(t).forEach((t=>e(t,r)));if(!t)return void Salla.logger.warn("Can't find Object With Id: "+t);let n=Salla.helpers.digitsOnly(t.value);return t.min&&n<parseInt(t.min)?t.value=t.min:t.max&&n>parseInt(t.max)?t.value=t.max:t.maxLength>=1&&n.toString().length>t.maxLength?t.value=n.toString().substring(0,t.maxLength):t.value=r||t.dataset.hasOwnProperty("digitsWithDecimal")?m(n):n.replace(/\D/g,"")},number:f,money:function(e){let t=Salla.config.currency(e?.currency).symbol;return f(e="object"==typeof e?e.amount:e)+" "+t},setNested:function(e,t,r){let n=e,i=t.split("."),o=i.length;for(let e=0;e<o-1;e++){let t=i[e];n[t]||(n[t]={}),n=n[t]}return n[i[o-1]]=r,e},getNested:function(e,t,r){let n=s.default(e,t);return void 0!==n?n:r},inputData:function(e,t,r={}){if(e.includes("[")){let n=e.split("]").join("").split("[");return{name:n[0],value:_(n.slice(1),t,r[n[0]])}}return{name:e,value:t}},url:Object.freeze({__proto__:null,is_full_url:S,base:function(e){if(S(e))return e;const{hostname:t}=new URL(y("/"));return"https://"+t+"/"+e?.ltrim("/")},get:y,domain:function(e){return S(e)?e:Salla.config.get("store.url",window.location.href.split("/").slice(0,-1).join("/")).rtrim("/")+"/"+e?.ltrim("/")},addParamToUrl:w,baseUrl:b,asset:v,cdn:function(e){return"https://cdn.salla.network/"+e?.ltrim("/")},api:function(e){return Salla.config.get("store.api",y(""))?.rtrim("/")+"/"+e?.ltrim("/")},is_page:function(e){return e&&Salla.config.get("page.slug")===e},is_placeholder:function(e){return v(salla.config.get("theme.settings.placeholder"))===v(e)}}),addParamToUrl:w,debounce:function(e,t){t=t||100;let r,n=[];return function(...i){return clearTimeout(r),r=setTimeout((()=>{let t=e(...i);n.forEach((e=>e(t))),n=[]}),t),new Promise((e=>n.push(e)))}}},A=function(e){let t={log:function(t,r){if(!e)return;if(!salla.config.isDebug())return;"trace"===salla.config.get("debug")&&(r="trace");let n=e.log,i=void 0===r?n:this.__dict__[r]||n,o=["%cTwilight","color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;"],l={event:"#CFF680",backend:"#7b68ee"}[r];l&&(o[0]+="%c"+r[0].toUpperCase()+r.substring(1),o.push(`margin-left: 5px;color: ${l};font-weight:bold; border:1px solid ${l}; padding: 2px 6px; border-radius: 5px;`)),i.call(e,...o.concat(...t))},__dict__:{trace:e.trace,debug:e.debug,info:e.info,warn:e.warn,error:e.error}};return{event:function(){t.log(arguments,"event")},trace:function(){t.log(arguments,"trace")},debug:function(){t.log(arguments,"debug")},info:function(){t.log(arguments,"info")},warn:function(){t.log(arguments,"warn")},error:function(){t.log(arguments,"error")},log:function(){t.log(arguments,void 0)},backend:function(){t.log(arguments,"backend")},logs:function(e){[e].flat().forEach((e=>e&&t.log([e].flat(),"backend")))}}}(console);class k extends c.default{constructor(){super({wildcard:!0,delimiter:"::",newListener:!1,removeListener:!1,maxListeners:10,verboseMemoryLeak:!1,ignoreErrors:!1}),this.delimiter="::","undefined"!=typeof document&&(this.body=document.querySelector("body")),this.logableEvents=["cart::item.added.failed","cart::item.deleted.failed"],this.ingoreLogEvents=["document::click","document::keyup","document::change"],this.noneFireableActions=["document.request"]}createAndDispatch(e,...t){this.dispatch(e,...t)}emit(e,...t){let r=e.replace("::",".");if(!this.noneFireableActions.includes(r)&&Salla.call&&"function"==typeof Salla.call(r))return Salla.log(`'Salla.${r}(...)' triggered using event '${e}'`),r=r.split("."),Array.isArray(t[0])&&(t=t[0]),void salla[r[0]][r[1]](...t);super.emit(e,...t),this.trackEvents(e,...t)}emitAsync(e,...t){let r=super.emitAsync(e,...t);try{this.trackEvents(e,...t)}catch(r){Salla.logger.warn(`error on tracking event (${e})`,t,r)}return r}trackEvents(e,...t){if("undefined"!=typeof window){window.dataLayer=window.dataLayer||[];let r={event:e};t.map((e=>"object"==typeof e&&(r={...r,...e}))),window.dataLayer.push(r)}Salla.logger&&!this.ingoreLogEvents.includes(e)&&Salla.logger.event(e,...t),this.dispatchMobileEvent(e,...t)}dispatch(e,...t){return this.emit(e,...t)}dispatchEvents(e){if(e)if("object"!=typeof e||Array.isArray(e))Salla.log("Events object is wrong, it should be object of {event:payload}",e);else for(const[t,r]of Object.entries(e))this.dispatch(t,r);else Salla.log("No Events To Dispatch!",e)}addListener(e,t){return this.on(e,t)}addEventListener(e,t){return this.on(e,t)}listen(e,t){return this.on(e,t)}registerGlobalListener(e,t){return this.onAny(t)}dispatchMobileEvent(e,t={}){if(!("undefined"!=typeof window&&window.dataLayer&&dataLayer[0]&&dataLayer[0].page&&dataLayer[0].page.mobileApp))return"";if(window.webkit)try{window.webkit.messageHandlers.callbackHandler.postMessage(JSON.stringify({event:e,details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}else if("undefined"!=typeof Android)try{Android.customEventWithData(e,JSON.stringify({details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}}}const E=u.default.createStore([d.default,g.default,p.default,h.default],[]);"undefined"!=typeof window&&(window.salla=window.salla||window.Salla||{},window.Salla=window.salla),"undefined"!=typeof global&&(global.salla=global.salla||global.Salla||{},global.Salla=global.salla),Salla.status="base",Salla.config=new class{constructor(e={},t={}){this.default_properties=t,this.properties_={...this.default_properties,...e}}merge(e){return this.properties_={...this.properties_,...e},this.properties_.store={...this.default_properties?.store||{},...this.properties_.store},this}set(e,t){return e.includes(".")?(Salla.helpers.setNested(this.properties_,e,t),this):(this.properties_[e]=t,this)}currency(e){return e=e||this.get("user.currency_code"),this.get("currencies."+e)||Object.values(this.get("currencies"))[0]}get(e,t=null){return e.includes(".")?Salla.helpers.getNested(this.properties_,e,t):this.properties_.hasOwnProperty(e)?this.properties_[e]||t:t||void 0}all(){return this.properties_}isDebug(){return this.get("debug")||Salla.storage.get("debug")}},Salla.logger=A,Salla.event=new k,Salla.helpers=x,Salla.storage=new class{constructor(){Salla.event.on("storage::item.remove",(e=>this.remove(e))),Salla.event.on("storage::item.set",((e,t)=>this.set(e,t))),this.store=E}set(e,t){if(e.includes(".")){let r=e.split(".")[0],n={[r]:this.store.get(r)};return n=Salla.helpers.setNested(n,e,t),this.store.set(r,n[r])}return this.store.set(e,t)}remove(e){return this.store.remove(e)}clearAll(){return this.store.clearAll()}get(e,t){if(e.includes(".")){let t=e.split(".")[0];return Salla.helpers.getNested({[t]:this.store.get(t)},e)}return this.store.get(e,t)}},Salla.cookie=new class{constructor(){Salla.event.on("cookies::remove",(e=>this.remove(e))),Salla.event.on("cookies::add",((e,t)=>this.set(e,t)))}get(e){return document.cookie.split("; ").find((t=>t.startsWith(e+"=")))?.split("=")[1]}set(e,t="",r=10){let n="";if(r){let e=new Date;e.setTime(e.getTime()+24*r*60*60*1e3),n="; expires="+e.toUTCString()}return document.cookie=`${e}=${t}${n}"; path=/; secure; SameSite=Lax"`,this}remove(e){return document.cookie=`${e}=; Max-Age=0; path=/;`,this}clearAll(){let e=document.cookie.split(";");for(let t=0;t<e.length;t++){let r=e[t],n=r.indexOf("="),i=n>-1?r.substr(0,n):r;this.remove(i)}}},Salla.log=Salla.logger.log,Salla.money=Salla.helpers.money,Salla.url=Salla.helpers.url,Salla.versions={base:"[VI]{version}[/VI]"};var L=Salla;exports.default=L;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/helpers/numbers.js","../../src/helpers/url.js","../../src/helpers/index.js","../../src/logger.js","../../src/event.js","../../src/storage.js","../../src/index.js","../../src/config.js","../../src/cookie.js"],"sourcesContent":["/**\n * @param num\n * @param {boolean} isToEnglish\n * @return {string}\n */\nexport function number(num, isToEnglish = false) {\n num = num + \"\";//make sure that number will be converted to string;\n isToEnglish = isToEnglish || !Salla.config.get('store.settings.arabic_numbers_enabled');\n let ar = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n let en = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n let find = isToEnglish ? ar : en;\n let replace = isToEnglish ? en : ar;\n let regex;\n for (let i = 0; i < find.length; i++) {\n regex = new RegExp(find[i], \"g\");\n num = num.replace(regex, replace[i]);\n }\n return num;\n}\n\n/**\n * when need to get digit's only from string \"Jamal12Hi\" => 12, or \"١٢٣\" => 123\n * @param {string} num\n * @return {string}\n */\nexport function digitsOnly(num) {\n return number(num, true).replace(/[^0-9.]/g, '')\n .replace('..', '.')\n .rtrim('.'); // without this: `Salla.helpers.digitsOnly('١٬٦٠٠ ر.س')` => `1600.`\n}\n\n/**\n * @param {HTMLInputElement|string} input - selector or input object\n * @param {boolean} is_decimal\n * @return {string|*|void}\n */\nexport function inputDigitsOnly(input, is_decimal = false) {\n if (typeof input == 'string') {\n return document.querySelectorAll(input).forEach(el => inputDigitsOnly(el, is_decimal));\n }\n if (!input) {\n Salla.logger.warn('Can\\'t find Object With Id: ' + input);\n return;\n }\n let new_val = Salla.helpers.digitsOnly(input.value);\n\n if (input.min && new_val < input.min) {\n return input.value = input.min;\n }\n if (input.max && new_val > input.max) {\n return input.value = input.max;\n }\n if (input.maxLength >= 1 && new_val.toString().length > input.maxLength) {\n return input.value = new_val.toString().substring(0, input.maxLength);\n }\n\n return input.value = (is_decimal || input.dataset.hasOwnProperty('digitsWithDecimal'))\n ? getOnlyDecimal(new_val)\n : new_val.replace(/\\D/g, '');\n}\n\nexport function getOnlyDecimal(value) {\n let dotsCount = (value.match(/\\./g) || []).length;\n if (!dotsCount || dotsCount === 1) {\n return value;\n }\n\n // if there is more than one dotes, remove the last dot.\n // Ex: 123.545.66 => 123.54566\n return getOnlyDecimal(value.replace(/\\.(.+)\\./g, '.$1'));\n}\n\n/**\n * @param {string|number|{amount: number,currency: string}} money\n * @return string\n */\nexport function money(money) {\n let currency = Salla.config.currency(money?.currency).symbol;\n money = typeof money === 'object' ? money.amount : money;\n return number(money) + ' ' + currency;\n}","export function is_full_url(url) {\n return `${url}`.startsWith('https://') || `${url}`.startsWith('http://');\n}\n\n/**\n * @param {string } url\n * @return string\n */\nexport function get(url) {\n if (is_full_url(url)) {\n return url;\n }\n return is_full_url(url)\n ? url\n : (\n Salla.config.get(\"store.url\", window.location.href.split(\"/\").slice(0, -1).join(\"/\")).rtrim(\"/\") +\n \"/\" +\n url?.ltrim(\"/\")\n );\n}\n\nexport function addParamToUrl(key, value) {\n if (!value || !key) {\n return window.location.href;\n }\n let regex = new RegExp(\"([?&])\" + key + \"=[^&]+[&]?\", \"g\");\n let url = window.location.href\n .replace(regex, \"$1\") //remove old one\n .split('#')[0]//remove any hash values ex 'https://my_site.test/brands#brand-section-1'\n .replace(/&$|\\?$/, \"\");// remove the `?` or `&` if it's the last char\n if (url.includes(\"?\")) {\n url += \"&\";\n } else {\n //avoid cases like this: 'https://my_store.test/ar?test=hi'\n url += (url.endsWith('/') ? \"\" : \"/\") + \"?\";\n }\n\n return (url + key + \"=\" + encodeURIComponent(value)).replace(/&$|\\?$/, \"\");\n}\n\n//this will get it without username if it's salla domain ex: Salla.sa/test will ignore test\nexport function baseUrl(path) {\n return window.location.origin + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function asset(path) {\n return is_full_url(path)\n ? path\n : baseUrl(\"themes/\" + Salla.config.get(\"theme.name\") + \"/\" + path?.ltrim(\"/\"));\n}\n\nexport function cdn(path) {\n return \"https://cdn.salla.network/\" + path?.ltrim(\"/\");\n}\n\n/**\n * Return url for api\n * @example Salla.url.api('test') => https://my_store.test/api/v1/test\n * @param path\n * @return {string}\n */\nexport function api(path) {\n return Salla.config.get(\"store.api\", get(\"\"))?.rtrim(\"/\") + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function is_page(pageName) {\n return pageName && Salla.config.get(\"page.slug\") === pageName;\n}\n\nexport function is_placeholder(url) {\n return asset(salla.config.get('theme.settings.placeholder')) === asset(url);\n}","import {digitsOnly, inputDigitsOnly, money, number} from \"./numbers\";\nimport get from \"lodash/get\";\nimport * as url from \"./url\";\n\n/**\n * To use it, you need some moves:\n * 1- First : you should have global variable:`let my_debounce;`\n * 2- Next : make your own function: `function my_debounce_fn(callback,...data){...}`\n * 3- Next : in your method, check if it's not existed yet, use this helper method to create it: `if(!my_debounce){my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500)}`\n * 4- Next : then delay the passed callback: `my_debounce(callback, ...data);`\n * 5- Finally : use it: `my_debounce(() =>{...yourRepeatableLogic})`\n * will be something like:\n *\n * ```\n * let my_debounce;\n * function my_debounce_fn(callback,...data){\n * if(!my_debounce){\n * //inline method\n * my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500);\n * }\n * return my_debounce(callback, ...data);\n * }\n * // use it like:\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 1');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 2');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 3');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 4');\n * //output=> `hello there - 4`\n * ```\n * 😎Or just use Salla appHelpers:`app.debounce((my_data)=>Salla.log(my_data), 'hello there - *')`\n *\n * @param fn\n * @param delay\n * @return {function(...[*]): Promise<unknown>}\n */\nfunction debounce(fn, delay) {\n delay = delay || 100;\n let resolves = [];\n let timer;\n return function (...args) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n let result = fn(...args);\n resolves.forEach((r) => r(result));\n resolves = [];\n }, delay);\n return new Promise((r) => resolves.push(r));\n };\n}\n\n/**\n * Use It When You want to grab data from input names with brackets Ex.\n * <input name=\"products[0][id]\" value...>\n * <input name=\"products[0][name]\" value...>\n * <input name=\"products[1][id]\" value...>\n * <input name=\"products[1][name]\" value...>\n * will be like: {products:[{id:.., name:..},{id:.., name:..}]}\n * @param name\n * @param value\n * @param dataset\n * @return {{name, value}|{name, value: (*|[*, *]|[string, *]|{}|[*])}}\n */\nfunction getInputDataWithName(name, value, dataset = {}) {\n if (name.includes(\"[\")) {\n let nameLevels = name.split(\"]\").join(\"\").split(\"[\");\n return {name: nameLevels[0], value: getLeveledData(nameLevels.slice(1), value, dataset[nameLevels[0]])};\n }\n return {name: name, value: value};\n}\n\n/**\n * in case input name is array for example \"jamal[4655]\" let's fix it\n * This Helper method to get suitable array data, Ex.\n * jamal[]=1\n * jamal[]=2\n * final result will be: {jamal:[1,2]}\n *\n * @param {String[]} nameLevels\n * @param {string|mixed} value\n * @param {{}|undefined} existedData\n * @return {*[]|*|(string|*)[]|{}}\n */\nfunction getLeveledData(nameLevels, value, existedData) {\n let currentName = nameLevels[0];\n\n //it's an array, so add value ass array\n if (existedData && nameLevels.length == 0) {\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n //todo::handle in case it's object\n return [existedData, value];\n }\n\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n if (typeof existedData === \"string\") {\n return [existedData, value];\n }\n\n //it's nested data\n if (existedData) {\n existedData[currentName] = getLeveledData(nameLevels.slice(1), value, existedData[currentName]);\n return existedData;\n }\n\n if (currentName) {\n return {[currentName]: getLeveledData(nameLevels.slice(1), value)};\n }\n\n //handling \"[]\" without name\n return currentName === \"\" ? [value] : value;\n}\n\n/*\nwindow.onbeforeunload = function (event) {\n Salla.document.event.leaving(event);\n if (!Salla.config.get(\"canLeave\")) {\n event.preventDefault();\n return false;\n }\n};\n*/\nexport function setNested(object, key, value) {\n let schema = object;\n let keys = key.split(\".\");\n let len = keys.length;\n for (let i = 0; i < len - 1; i++) {\n let elem = keys[i];\n if (!schema[elem]) schema[elem] = {};\n schema = schema[elem];\n }\n\n schema[keys[len - 1]] = value;\n return object;\n}\n\nexport function getNested(object, key, default_) {\n let data = get(object, key);\n return data !== undefined ? data : default_;\n}\n\n/**\n * @type {{debounce: (function(*, *=): function(...[*]): Promise<unknown>), inputData: ((function(*=, *=, *): ({name, value}|{name, value: (*|*[]|(string|*)[]|{})}))|*), digitsOnly: ((function(*=, *=): (undefined|*))|*)}}\n */\nexport default {\n // Numbers helpers\n digitsOnly : digitsOnly,\n inputDigitsOnly: inputDigitsOnly,\n number : number,\n money : money,\n\n // Nested objects helpers\n setNested: setNested,\n getNested: getNested,\n inputData: getInputDataWithName,\n\n // Url helpers\n url : url,\n addParamToUrl: url.addParamToUrl,\n\n // other\n debounce: debounce,\n};\n","\"use strict\";\n/**\n * A logger to help us to use Salla.logger.log like console.log\n *\n * @namespace Salla.logger\n *\n * @credits @Ammar Hasan\n * @see https://stackoverflow.com/a/21856736\n *\n */\nexport default (function (c) {\n \"use strict\";\n\n let proxy = {\n log: function (a, type) {\n if (!c) {\n return; /* return or call your custom function here */\n }\n\n if(!salla.config.isDebug()){\n return;\n }\n\n // let's force trace for all logs when the debug is trace level\n if (salla.config.get('debug') === 'trace') {\n type = 'trace';\n }\n\n let colorableTypes={\n event:'#CFF680',\n backend:'#7b68ee'\n };\n\n let l = c.log,\n f = type === undefined ? l : (this.__dict__[type] || l);\n\n let style = ['%cTwilight', 'color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;'];\n let color=colorableTypes[type];\n if (color) {\n style[0] += '%c' + type[0].toUpperCase() + type.substring(1);\n style.push(`margin-left: 5px;color: ${color};font-weight:bold; border:1px solid ${color}; padding: 2px 6px; border-radius: 5px;`)\n }\n\n f.call(c, ...style.concat(...a))\n },\n __dict__: {\n \"trace\": c.trace,\n \"debug\": c.debug,\n \"info\": c.info,\n \"warn\": c.warn,\n \"error\": c.error\n }\n };\n\n return {\n event: function () {\n proxy.log(arguments, \"event\");\n },\n trace: function () {\n proxy.log(arguments, \"trace\");\n },\n debug: function () {\n proxy.log(arguments, \"debug\");\n },\n info: function () {\n proxy.log(arguments, \"info\");\n },\n warn: function () {\n proxy.log(arguments, \"warn\");\n },\n error: function () {\n proxy.log(arguments, \"error\");\n },\n log: function () {\n proxy.log(arguments, undefined);\n },\n //use this to pass messages from backEnd, no need to add documentations, because it will no passed in production\n backend: function () {\n proxy.log(arguments, \"backend\");\n },\n //this for internal usage to pass multi logs using one function, no need to add it to documentation @see \\Salla\\Core\\Traits\\WithStageLogger::debug\n logs:function (logs) {\n [logs].flat().forEach(logData => logData && proxy.log([logData].flat(), 'backend'));\n }\n };\n}(console))\n","import EventEmitter from \"eventemitter2\";\n\n/**\n * @namespace Salla.event\n *\n * @property {string} delimiter\n * @property {array} loggableEvents - log errors or important events.\n */\nexport default class Emitter extends EventEmitter {\n constructor() {\n let delimiter = \"::\";\n super({\n wildcard : true,\n delimiter : delimiter,\n newListener : false,\n removeListener : false,\n maxListeners : 10,\n verboseMemoryLeak: false,\n ignoreErrors : false,\n });\n this.delimiter = delimiter;\n\n if (typeof document !== \"undefined\") {\n this.body = document.querySelector(\"body\");\n }\n\n this.logableEvents = [\"cart::item.added.failed\", \"cart::item.deleted.failed\"];\n this.ingoreLogEvents = [\n \"document::click\",\n \"document::keyup\",\n \"document::change\",\n //'document::submit',\n ];\n\n this.noneFireableActions = [\"document.request\"];\n }\n\n /**\n * @param {string} event_name\n * @param data\n *\n * @deprecated , legacy code, use dispatch() instead\n */\n createAndDispatch(event_name, ...data) {\n this.dispatch(event_name, ...data);\n }\n\n emit(event_name, ...data) {\n /**\n * if the event, is api/event method, call it,\n * ex: cart::quick.add call Salla.api.cart.quickAdd(...data)\n * we don't used Salla.call(actionName)(...data), to avoid losing this scope in our apis.\n *\n * @deprecated don't use it anymore\n */\n let actionName = event_name.replace(\"::\", \".\");\n if (\n !this.noneFireableActions.includes(actionName) &&\n typeof Salla.call !== \"undefined\" &&\n typeof Salla.call(actionName) === \"function\"\n ) {\n Salla.log(`'Salla.${actionName}(...)' triggered using event '${event_name}'`);\n actionName = actionName.split(\".\"); //['cart','addItem']\n //when we are passing event from back end using `twilight()->addEvent('eventName', param1, param2, param3)`, here we will pass them back as variables\n if (Array.isArray(data[0])) {\n data = data[0];\n }\n salla[actionName[0]][actionName[1]](...data);\n return;\n }\n\n\n super.emit(event_name, ...data);\n this.trackEvents(event_name, ...data);\n }\n\n emitAsync(event_name, ...data) {\n //to make sure that data object will not be affected by track process\n let result = super.emitAsync(event_name, ...data);\n try {\n this.trackEvents(event_name, ...data);\n } catch (e) {\n salla.logger.warn(`error on tracking event (${event_name})`, data, e);\n }\n return result;\n }\n\n trackEvents(event_name, ...data){\n // let's send the event to data layer\n if (typeof window !== \"undefined\") {\n window.dataLayer = window.dataLayer || [];\n /**\n * data is coming as an array like this:\n * [{\"services\": {\"intercom\": {\"app_id\": \"***\"}}}]\n * we will merge it into one object like this:\n * {event: event_name, \"services\": {\"intercom\": {\"app_id\": \"***\"}}}\n */\n let dataLayerObject = {event: event_name};\n data.map(item => typeof item === 'object' && (dataLayerObject = {...dataLayerObject, ...item}));\n window.dataLayer.push(dataLayerObject);\n }\n\n //if there is need to log errors, or events, lets do it here.\n if (Salla.logger && !this.ingoreLogEvents.includes(event_name)) {\n Salla.logger.event(event_name, ...data);\n }\n\n this.dispatchMobileEvent(event_name, {...data.values()});\n }\n /**\n * Fire Event with data\n *\n * @param {string} event_name - action name like `cart::addItem` or event name like `cart::item.added`\n * @param {any|undefined} data\n * @data {{payload}} data\n */\n dispatch(event_name, ...data) {\n return this.emit(event_name, ...data);\n }\n\n /**\n * Fire multi events using object of events\n *\n * @param {Object.<string, *>} events\n */\n dispatchEvents(events) {\n if (!events || typeof events !== \"object\") {\n Salla.log(\"No Events To Dispatch!\", events);\n return;\n }\n\n for (const [event_name, payload] of Object.entries(events)) {\n this.dispatch(event_name, payload);\n }\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addEventListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for this.addListener\n * @param {string} eventName\n * @param {function} callback\n */\n listen(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Register Global listener will allow you to track all events in salla,\n * all Salla events will push to it.\n *\n * @param {string} name\n * @param {function} callback\n * @deprecated use onAny, it maybe used in the apps\n */\n registerGlobalListener(name, callback) {\n return this.onAny(callback);\n }\n\n /**\n * This help to push an event to mobile app.\n *\n * @param eventName\n * @param details\n * @returns {string}\n */\n dispatchMobileEvent(eventName, details = {}) {\n if (\n typeof window === \"undefined\" ||\n !window.dataLayer ||\n !dataLayer[0] ||\n !dataLayer[0].page ||\n !dataLayer[0].page.mobileApp\n ) {\n return \"\";\n }\n\n if (window.webkit) {\n try {\n window.webkit.messageHandlers.callbackHandler.postMessage(\n JSON.stringify({\n event : eventName,\n details: details,\n })\n );\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n return;\n }\n\n if (Android) {\n try {\n Android.customEventWithData(eventName, JSON.stringify({details: details}));\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n }\n }\n}\n","import createStore from \"store/src/store-engine\"\nimport localStorage from \"store/storages/localStorage\"\nimport sessionStorage from \"store/storages/sessionStorage\"\nimport cookieStorage from \"store/storages/cookieStorage\"\nimport memoryStorage from \"store/storages/memoryStorage\"\n\nconst localStore = createStore.createStore([\n localStorage,\n sessionStorage,\n cookieStorage,\n memoryStorage,\n], [])\n\n/**\n * @namespace Salla.storage\n */\nexport default class Storage {\n constructor() {\n Salla.event.on(\"storage::item.remove\", (key) => this.remove(key));\n Salla.event.on(\"storage::item.set\", (key, value) => this.set(key, value));\n this.store = localStore;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n let parentObject = {[firstKey]: this.store.get(firstKey)};\n parentObject = Salla.helpers.setNested(parentObject, key, value);\n return this.store.set(firstKey, parentObject[firstKey]);\n }\n return this.store.set(key, value);\n }\n\n remove(key) {\n return this.store.remove(key);\n }\n\n clearAll() {\n return this.store.clearAll();\n }\n\n get(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n return Salla.helpers.getNested({[firstKey]: this.store.get(firstKey)}, key);\n }\n return this.store.get(key, value);\n }\n}\n","\"use strict\";\n\nif (typeof global === 'undefined') {\n window.salla = window.salla || window.Salla || {};\n window.Salla = window.salla;\n} else {\n global.salla = global.salla || global.Salla || {};\n global.Salla = global.salla;\n}\n\n// loading helpers object and link it to salla\nimport Helpers from \"./helpers\"\nimport Logger from \"./logger\"\nimport Config from \"./config\"\nimport Emitter from \"./event\"\nimport Storage from \"./storage\"\nimport Cookie from \"./cookie\"\n\nSalla.status = 'base';\n// const Salla = {};\nSalla.config = new Config();\nSalla.logger = Logger;\nSalla.event = new Emitter();\n\nSalla.storage = new Storage();\nSalla.cookie = new Cookie();\nSalla.helpers = Helpers;\n\n// alias\nSalla.log = Salla.logger.log;\nSalla.money = Salla.helpers.money;\nSalla.url = Salla.helpers.url;\nSalla.versions = {\n base: '[VI]{version}[/VI]'\n};\n\nexport default Salla","/**\n * @namespace Salla.config\n *\n * @property {any} properties_\n */\nexport default class Config {\n constructor(properties = {}, default_properties = {}) {\n this.default_properties = default_properties;\n this.properties_ = {...this.default_properties, ...properties};\n }\n\n merge(config) {\n Object.assign(this.properties_, config);\n\n this.properties_.store = {...this.default_properties.store, ...this.properties_.store};\n\n return this;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n Salla.helpers.setNested(this.properties_, key, value);\n return this;\n }\n this.properties_[key] = value;\n return this;\n }\n\n /**\n * @param {string} key\n * @param {null|any} default_\n * @return {any}\n */\n get(key, default_ = null) {\n if (key.includes(\".\")) {\n return Salla.helpers.getNested(this.properties_, key, default_);\n }\n\n return this.properties_.hasOwnProperty(key) ? this.properties_[key] || default_ : default_ || undefined;\n }\n\n all() {\n return this.properties_;\n }\n\n isDebug() {\n return this.get('debug') || Salla.storage.get('debug');\n }\n}\n","/**\n * @namespace Salla.cookie\n */\nexport default class Cookie {\n constructor() {\n Salla.event.on(\"cookies::remove\", (key) => this.remove(key));\n Salla.event.on(\"cookies::add\", (key, value) => this.set(key, value));\n }\n\n get(key) {\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(key + \"=\"))\n ?.split(\"=\")[1];\n }\n\n set(key, value = \"\", days = 10) {\n let expires = \"\";\n if (days) {\n let date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = \"; expires=\" + date.toUTCString();\n }\n document.cookie = `${key}=${value}${expires}\"; path=/; secure; SameSite=Lax\"`;\n return this;\n }\n\n remove(key) {\n document.cookie = `${key}=; Max-Age=0; path=/;`;\n return this;\n }\n\n clearAll() {\n let cookies = document.cookie.split(\";\");\n\n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n let eqPos = cookie.indexOf(\"=\");\n let name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n this.remove(name);\n }\n }\n}\n"],"names":["number","num","isToEnglish","regex","ar","en","find","Salla","config","get","replace","i","length","RegExp","getOnlyDecimal","value","dotsCount","match","is_full_url","url","startsWith","window","location","href","split","slice","join","rtrim","ltrim","addParamToUrl","key","includes","endsWith","encodeURIComponent","baseUrl","path","origin","asset","getLeveledData","nameLevels","existedData","currentName","Array","isArray","push","Helpers","digitsOnly","inputDigitsOnly","input","is_decimal","document","querySelectorAll","forEach","el","logger","warn","new_val","helpers","min","max","maxLength","toString","substring","dataset","hasOwnProperty","money","currency","symbol","amount","setNested","object","schema","keys","len","elem","getNested","default_","data","undefined","inputData","name","pageName","salla","debounce","fn","delay","timer","resolves","args","clearTimeout","setTimeout","result","r","Promise","Logger","c","proxy","log","a","type","isDebug","l","f","this","__dict__","style","color","event","backend","toUpperCase","call","concat","trace","debug","info","error","arguments","logs","flat","logData","console","Emitter","EventEmitter","constructor","super","wildcard","delimiter","newListener","removeListener","maxListeners","verboseMemoryLeak","ignoreErrors","body","querySelector","logableEvents","ingoreLogEvents","noneFireableActions","createAndDispatch","event_name","dispatch","emit","actionName","trackEvents","emitAsync","e","dataLayer","dataLayerObject","map","item","dispatchMobileEvent","values","dispatchEvents","events","payload","Object","entries","addListener","eventName","callback","on","addEventListener","listen","registerGlobalListener","onAny","details","page","mobileApp","webkit","messageHandlers","callbackHandler","postMessage","JSON","stringify","err","Android","customEventWithData","localStore","createStore","localStorage","sessionStorage","cookieStorage","memoryStorage","global","status","properties","default_properties","properties_","merge","assign","store","set","all","storage","remove","firstKey","parentObject","clearAll","cookie","row","days","expires","date","Date","setTime","getTime","toUTCString","cookies","eqPos","indexOf","substr","versions","base","Salla$1"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/helpers/numbers.js","../../src/helpers/url.js","../../src/helpers/index.js","../../src/helpers/string.js","../../src/logger.js","../../src/event.js","../../src/storage.js","../../src/index.js","../../src/config.js","../../src/cookie.js"],"sourcesContent":["/**\n * @param num\n * @param {boolean} isToEnglish\n * @return {string}\n */\nexport function number(num, isToEnglish = false) {\n num = num + \"\";//make sure that number will be converted to string;\n isToEnglish = isToEnglish || !Salla.config.get('store.settings.arabic_numbers_enabled');\n let ar = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n let en = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n let find = isToEnglish ? ar : en;\n let replace = isToEnglish ? en : ar;\n let regex;\n for (let i = 0; i < find.length; i++) {\n regex = new RegExp(find[i], \"g\");\n num = num.replace(regex, replace[i]);\n }\n return num;\n}\n\n/**\n * when need to get digit's only from string \"Jamal12Hi\" => 12, or \"١٢٣\" => 123\n * @param {string} num\n * @return {string}\n */\nexport function digitsOnly(num) {\n return number(num, true).replace(/[^0-9.]/g, '')\n .replace('..', '.')\n .rtrim('.'); // without this: `Salla.helpers.digitsOnly('١٬٦٠٠ ر.س')` => `1600.`\n}\n\n/**\n * @param {HTMLInputElement|string} input - selector or input object\n * @param {boolean} is_decimal\n * @return {string|*|void}\n */\nexport function inputDigitsOnly(input, is_decimal = false) {\n if (typeof input == 'string') {\n return document.querySelectorAll(input).forEach(el => inputDigitsOnly(el, is_decimal));\n }\n if (!input) {\n Salla.logger.warn('Can\\'t find Object With Id: ' + input);\n return;\n }\n let new_val = Salla.helpers.digitsOnly(input.value);\n\n if (input.min && new_val < parseInt(input.min)) {\n return input.value = input.min;\n }\n if (input.max && new_val > parseInt(input.max)) {\n return input.value = input.max;\n }\n if (input.maxLength >= 1 && new_val.toString().length > input.maxLength) {\n return input.value = new_val.toString().substring(0, input.maxLength);\n }\n\n return input.value = (is_decimal || input.dataset.hasOwnProperty('digitsWithDecimal'))\n ? getOnlyDecimal(new_val)\n : new_val.replace(/\\D/g, '');\n}\n\nexport function getOnlyDecimal(value) {\n let dotsCount = (`${value}`.match(/\\./g) || []).length;\n if (!dotsCount || dotsCount === 1) {\n return value;\n }\n\n // if there is more than one dotes, remove the last dot.\n // Ex: 123.545.66 => 123.54566\n return getOnlyDecimal(value.replace(/\\.(.+)\\./g, '.$1'));\n}\n\n/**\n * @param {string|number|{amount: number,currency: string}} money\n * @return string\n */\nexport function money(money) {\n let currency = Salla.config.currency(money?.currency).symbol;\n money = typeof money === 'object' ? money.amount : money;\n return number(money) + ' ' + currency;\n}","export function is_full_url(url) {\n return `${url}`.startsWith('https://') || `${url}`.startsWith('http://');\n}\n\n/**\n * @param {string } url\n * @return string\n */\nexport function base(url) {\n if (is_full_url(url)) {\n return url;\n }\n\n const { hostname } = new URL(get('/'));\n\n return 'https://' + hostname + \"/\" + url?.ltrim(\"/\");\n}\n\n/**\n * @param {string } url\n * @return string\n */\nexport function get(url) {\n if (is_full_url(url)) {\n return url;\n }\n\n let storeUrl = Salla.config.get(\"store.url\");\n\n if(!storeUrl){\n storeUrl = window.location.href.split(\"/\").slice(0, -1).join(\"/\");\n Salla.config.set('store.url', storeUrl)\n }\n\n return storeUrl.rtrim(\"/\") + \"/\" + url?.ltrim(\"/\");\n}\n\nexport function domain(url) {\n if (is_full_url(url)) {\n return url;\n }\n\n\n\n return (\n Salla.config.get(\"store.url\", window.location.href.split(\"/\").slice(0, -1).join(\"/\")).rtrim(\"/\") +\n \"/\" +\n url?.ltrim(\"/\")\n );\n}\n\nexport function addParamToUrl(key, value) {\n if (!value || !key) {\n return window.location.href;\n }\n let regex = new RegExp(\"([?&])\" + key + \"=[^&]+[&]?\", \"g\");\n let url = window.location.href\n .replace(regex, \"$1\") //remove old one\n .split('#')[0]//remove any hash values ex 'https://my_site.test/brands#brand-section-1'\n .replace(/&$|\\?$/, \"\");// remove the `?` or `&` if it's the last char\n if (url.includes(\"?\")) {\n url += \"&\";\n } else {\n //avoid cases like this: 'https://my_store.test/ar?test=hi'\n url += (url.endsWith('/') ? \"\" : \"/\") + \"?\";\n }\n\n return (url + key + \"=\" + encodeURIComponent(value)).replace(/&$|\\?$/, \"\");\n}\n\n//this will get it without username if it's salla domain ex: Salla.sa/test will ignore test\nexport function baseUrl(path) {\n return window.location.origin + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function asset(path) {\n return is_full_url(path)\n ? path\n : baseUrl(\"themes/\" + Salla.config.get(\"theme.name\") + \"/\" + path?.ltrim(\"/\"));\n}\n\nexport function cdn(path) {\n return \"https://cdn.salla.network/\" + path?.ltrim(\"/\");\n}\n\n/**\n * Return url for api\n * @example Salla.url.api('test') => https://my_store.test/api/v1/test\n * @param path\n * @return {string}\n */\nexport function api(path) {\n return Salla.config.get(\"store.api\", get(\"\"))?.rtrim(\"/\") + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function is_page(pageName) {\n return pageName && Salla.config.get(\"page.slug\") === pageName;\n}\n\nexport function is_placeholder(url) {\n return asset(salla.config.get('theme.settings.placeholder')) === asset(url);\n}","import { digitsOnly, inputDigitsOnly, money, number } from \"./numbers\";\nimport './string';\nimport get from \"lodash/get\";\nimport * as url from \"./url\";\n\n/**\n * To use it, you need some moves:\n * 1- First : you should have global variable:`let my_debounce;`\n * 2- Next : make your own function: `function my_debounce_fn(callback,...data){...}`\n * 3- Next : in your method, check if it's not existed yet, use this helper method to create it: `if(!my_debounce){my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500)}`\n * 4- Next : then delay the passed callback: `my_debounce(callback, ...data);`\n * 5- Finally : use it: `my_debounce(() =>{...yourRepeatableLogic})`\n * will be something like:\n *\n * ```\n * let my_debounce;\n * function my_debounce_fn(callback,...data){\n * if(!my_debounce){\n * //inline method\n * my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500);\n * }\n * return my_debounce(callback, ...data);\n * }\n * // use it like:\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 1');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 2');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 3');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 4');\n * //output=> `hello there - 4`\n * ```\n * 😎Or just use Salla appHelpers:`app.debounce((my_data)=>Salla.log(my_data), 'hello there - *')`\n *\n * @param fn\n * @param delay\n * @return {function(...[*]): Promise<unknown>}\n */\nfunction debounce(fn, delay) {\n delay = delay || 100;\n let resolves = [];\n let timer;\n return function (...args) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n let result = fn(...args);\n resolves.forEach((r) => r(result));\n resolves = [];\n }, delay);\n return new Promise((r) => resolves.push(r));\n };\n}\n\n/**\n * Use It When You want to grab data from input names with brackets Ex.\n * <input name=\"products[0][id]\" value...>\n * <input name=\"products[0][name]\" value...>\n * <input name=\"products[1][id]\" value...>\n * <input name=\"products[1][name]\" value...>\n * will be like: {products:[{id:.., name:..},{id:.., name:..}]}\n * @param name\n * @param value\n * @param dataset\n * @return {{name, value}|{name, value: (*|[*, *]|[string, *]|{}|[*])}}\n */\nfunction getInputDataWithName(name, value, dataset = {}) {\n if (name.includes(\"[\")) {\n let nameLevels = name.split(\"]\").join(\"\").split(\"[\");\n return { name: nameLevels[0], value: getLeveledData(nameLevels.slice(1), value, dataset[nameLevels[0]]) };\n }\n return { name: name, value: value };\n}\n\n/**\n * in case input name is array for example \"jamal[4655]\" let's fix it\n * This Helper method to get suitable array data, Ex.\n * jamal[]=1\n * jamal[]=2\n * final result will be: {jamal:[1,2]}\n *\n * @param {String[]} nameLevels\n * @param {string|mixed} value\n * @param {{}|undefined} existedData\n * @return {*[]|*|(string|*)[]|{}}\n */\nfunction getLeveledData(nameLevels, value, existedData) {\n // TODO: typo, rename it to `getLabeledData`\n let currentName = nameLevels[0];\n\n //it's an array, so add value ass array\n if (existedData && nameLevels.length == 0) {\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n //todo::handle in case it's object\n return [existedData, value];\n }\n\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n if (typeof existedData === \"string\") {\n return [existedData, value];\n }\n\n //it's nested data\n if (existedData) {\n existedData[currentName] = getLeveledData(nameLevels.slice(1), value, existedData[currentName]);\n return existedData;\n }\n\n if (currentName) {\n return { [currentName]: getLeveledData(nameLevels.slice(1), value) };\n }\n\n //handling \"[]\" without name\n return currentName === \"\" ? [value] : value;\n}\n\n/*\nwindow.onbeforeunload = function (event) {\n Salla.document.event.leaving(event);\n if (!Salla.config.get(\"canLeave\")) {\n event.preventDefault();\n return false;\n }\n};\n*/\nexport function setNested(object, key, value) {\n let schema = object;\n let keys = key.split(\".\");\n let len = keys.length;\n for (let i = 0; i < len - 1; i++) {\n let elem = keys[i];\n if (!schema[elem]) schema[elem] = {};\n schema = schema[elem];\n }\n\n schema[keys[len - 1]] = value;\n return object;\n}\n\nexport function getNested(object, key, default_) {\n let data = get(object, key);\n return data !== undefined ? data : default_;\n}\n\n/**\n * @type {{debounce: (function(*, *=): function(...[*]): Promise<unknown>), inputData: ((function(*=, *=, *): ({name, value}|{name, value: (*|*[]|(string|*)[]|{})}))|*), digitsOnly: ((function(*=, *=): (undefined|*))|*)}}\n */\nexport default {\n // Numbers helpers\n digitsOnly: digitsOnly,\n inputDigitsOnly: inputDigitsOnly,\n number: number,\n money: money,\n\n // Nested objects helpers\n setNested: setNested,\n getNested: getNested,\n inputData: getInputDataWithName,\n\n // Url helpers\n url : url,\n addParamToUrl: url.addParamToUrl,\n\n // other\n debounce: debounce,\n};\n","// todo:: cover these helpers into types\nString.prototype.toStudlyCase = function () {\n return this.trim() //remove first spaces\n .replace(/([^a-zA-Z\\d].)/g, function (t) {//get\n return t.toUpperCase()\n .replace(/[^a-zA-Z\\d]/g, '');\n });\n};\n\nString.prototype.toDatasetName = function () {\n return this.startsWith('data-')\n ? this.substr(5).toStudlyCase()\n : this.toStudlyCase();\n};\n\n// TODO: Check the importance of this method. Or add mode detail information.\n// helper method to get string as selector, by adding (#) to the beginning if it's not start with one.\nString.prototype.toSelector = function () {\n // todo:: add html tags if it's needed.\n return this.trim().startsWith(\".\") || this.trim().startsWith(\"#\")\n ? this\n : \"#\" + this;\n};\n\nString.prototype.replaceArray = function (find, replace) {\n var replaceString = this;\n var regex;\n for (var i = 0; i < find.length; i++) {\n regex = new RegExp(find[i], \"g\");\n replaceString = replaceString.replace(regex, replace[i]);\n }\n return replaceString;\n};\n\nString.prototype.rtrim = function (s) {\n if (s === undefined)\n s = '\\\\s';\n return this.replace(new RegExp(\"[\" + s + \"]*$\"), '');\n};\n\nString.prototype.ltrim = function (s) {\n if (s === undefined)\n s = '\\\\s';\n return this.replace(new RegExp(\"^[\" + s + \"]*\"), '');\n};\n\nString.prototype.digitsOnly = function () {\n return Salla.helpers.digitsOnly(this);\n};","\"use strict\";\n/**\n * A logger to help us to use Salla.logger.log like console.log\n *\n * @namespace Salla.logger\n *\n * @credits @Ammar Hasan\n * @see https://stackoverflow.com/a/21856736\n *\n */\nexport default (function (c) {\n \"use strict\";\n \n let proxy = {\n log: function (a, type) {\n if (!c) {\n return; /* return or call your custom function here */\n }\n\n if (!salla.config.isDebug()) {\n return;\n }\n\n // let's force trace for all logs when the debug is trace level\n if (salla.config.get('debug') === 'trace') {\n type = 'trace';\n }\n let colorableTypes = {\n event: '#CFF680',\n backend: '#7b68ee'\n };\n\n let l = c.log,\n f = type === undefined ? l : (this.__dict__[type] || l);\n\n let style = ['%cTwilight', 'color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;'];\n let color = colorableTypes[type];\n if (color) {\n style[0] += '%c' + type[0].toUpperCase() + type.substring(1);\n style.push(`margin-left: 5px;color: ${color};font-weight:bold; border:1px solid ${color}; padding: 2px 6px; border-radius: 5px;`)\n }\n\n f.call(c, ...style.concat(...a))\n },\n __dict__: {\n \"trace\": c.trace,\n \"debug\": c.debug,\n \"info\": c.info,\n \"warn\": c.warn,\n \"error\": c.error\n }\n };\n\n return {\n event: function () {\n proxy.log(arguments, \"event\");\n },\n trace: function () {\n proxy.log(arguments, \"trace\");\n },\n debug: function () {\n proxy.log(arguments, \"debug\");\n },\n info: function () {\n proxy.log(arguments, \"info\");\n },\n warn: function () {\n proxy.log(arguments, \"warn\");\n },\n error: function () {\n proxy.log(arguments, \"error\");\n },\n log: function () {\n proxy.log(arguments, undefined);\n },\n //use this to pass messages from backEnd, no need to add documentations, because it will no passed in production\n backend: function () {\n proxy.log(arguments, \"backend\");\n },\n //this for internal usage to pass multi logs using one function, no need to add it to documentation @see \\Salla\\Core\\Traits\\WithStageLogger::debug\n logs: function (logs) {\n [logs].flat().forEach(logData => logData && proxy.log([logData].flat(), 'backend'));\n }\n };\n}(console))\n","import EventEmitter from \"eventemitter2\";\n\n/**\n * @namespace Salla.event\n *\n * @property {string} delimiter\n * @property {array} loggableEvents - log errors or important events.\n */\nexport default class Emitter extends EventEmitter {\n constructor() {\n let delimiter = \"::\";\n super({\n wildcard: true,\n delimiter: delimiter,\n newListener: false,\n removeListener: false,\n maxListeners: 10,\n verboseMemoryLeak: false,\n ignoreErrors: false,\n });\n this.delimiter = delimiter;\n\n if (typeof document !== \"undefined\") {\n this.body = document.querySelector(\"body\");\n }\n\n this.logableEvents = [\"cart::item.added.failed\", \"cart::item.deleted.failed\"];\n this.ingoreLogEvents = [\n \"document::click\",\n \"document::keyup\",\n \"document::change\",\n //'document::submit',\n ];\n\n this.noneFireableActions = [\"document.request\"];\n }\n\n /**\n * @param {string} event_name\n * @param data\n *\n * @deprecated , legacy code, use dispatch() instead\n */\n createAndDispatch(event_name, ...data) {\n this.dispatch(event_name, ...data);\n }\n\n emit(event_name, ...data) {\n /**\n * if the event, is api/event method, call it,\n * ex: cart::quick.add call Salla.api.cart.quickAdd(...data)\n * we don't used Salla.call(actionName)(...data), to avoid losing this scope in our apis.\n *\n * @deprecated don't use it anymore\n */\n let actionName = event_name.replace(\"::\", \".\");\n if (!this.noneFireableActions.includes(actionName) && Salla.call && typeof Salla.call(actionName) === \"function\") {\n Salla.log(`'Salla.${actionName}(...)' triggered using event '${event_name}'`);\n actionName = actionName.split(\".\"); //['cart','addItem']\n //when we are passing event from back end using `twilight()->addEvent('eventName', param1, param2, param3)`, here we will pass them back as variables\n if (Array.isArray(data[0])) {\n data = data[0];\n }\n salla[actionName[0]][actionName[1]](...data);\n return;\n }\n\n\n super.emit(event_name, ...data);\n this.trackEvents(event_name, ...data);\n }\n\n emitAsync(event_name, ...data) {\n //to make sure that data object will not be affected by track process\n let result = super.emitAsync(event_name, ...data);\n try { \n this.trackEvents(event_name, ...data);\n } catch (e) {\n Salla.logger.warn(`error on tracking event (${event_name})`, data, e);\n }\n return result;\n }\n\n trackEvents(event_name, ...data){\n // let's send the event to data layer\n if (typeof window !== \"undefined\") {\n window.dataLayer = window.dataLayer || [];\n /**\n * data is coming as an array like this:\n * [{\"services\": {\"intercom\": {\"app_id\": \"***\"}}}]\n * we will merge it into one object like this:\n * {event: event_name, \"services\": {\"intercom\": {\"app_id\": \"***\"}}}\n */\n let dataLayerObject = { event: event_name };\n data.map(item => typeof item === 'object' && (dataLayerObject = { ...dataLayerObject, ...item }));\n window.dataLayer.push(dataLayerObject);\n }\n\n //if there is need to log errors, or events, lets do it here.\n if (Salla.logger && !this.ingoreLogEvents.includes(event_name)) {\n Salla.logger.event(event_name, ...data);\n }\n\n this.dispatchMobileEvent(event_name, ...data);\n }\n /**\n * Fire Event with data\n *\n * @param {string} event_name - action name like `cart::addItem` or event name like `cart::item.added`\n * @param {any|undefined} data\n * @data {{payload}} data\n */\n dispatch(event_name, ...data) {\n return this.emit(event_name, ...data);\n }\n\n /**\n * Fire multi events using object of events\n *\n * @param {Object.<string, *>} events\n */\n dispatchEvents(events) {\n if (!events) {\n Salla.log(\"No Events To Dispatch!\", events);\n return;\n }\n\n if(typeof events !== \"object\" || Array.isArray(events)){\n Salla.log(\"Events object is wrong, it should be object of {event:payload}\", events);\n return;\n }\n\n for (const [event_name, payload] of Object.entries(events)) {\n this.dispatch(event_name, payload);\n }\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addEventListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for this.addListener\n * @param {string} eventName\n * @param {function} callback\n */\n listen(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Register Global listener will allow you to track all events in salla,\n * all Salla events will push to it.\n *\n * @param {string} name\n * @param {function} callback\n * @deprecated use onAny, it maybe used in the apps\n */\n registerGlobalListener(name, callback) {\n return this.onAny(callback);\n }\n\n /**\n * This help to push an event to mobile app.\n *\n * @param eventName\n * @param details\n * @returns {string}\n */\n dispatchMobileEvent(eventName, details = {}) {\n if (\n typeof window === \"undefined\" ||\n !window.dataLayer ||\n !dataLayer[0] ||\n !dataLayer[0].page ||\n !dataLayer[0].page.mobileApp\n ) {\n return \"\";\n }\n\n if (window.webkit) {\n try {\n window.webkit.messageHandlers.callbackHandler.postMessage(\n JSON.stringify({\n event: eventName,\n details: details,\n })\n );\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n return;\n }\n\n if (typeof Android !=='undefined') {\n try {\n Android.customEventWithData(eventName, JSON.stringify({ details: details }));\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n }\n }\n}\n","import createStore from \"store/src/store-engine\"\nimport localStorage from \"store/storages/localStorage\"\nimport sessionStorage from \"store/storages/sessionStorage\"\nimport cookieStorage from \"store/storages/cookieStorage\"\nimport memoryStorage from \"store/storages/memoryStorage\"\n\nconst localStore = createStore.createStore([\n localStorage,\n sessionStorage,\n cookieStorage,\n memoryStorage,\n], [])\n\n/**\n * @namespace Salla.storage\n */\nexport default class Storage {\n constructor() {\n Salla.event.on(\"storage::item.remove\", (key) => this.remove(key));\n Salla.event.on(\"storage::item.set\", (key, value) => this.set(key, value));\n this.store = localStore;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n let parentObject = {[firstKey]: this.store.get(firstKey)};\n parentObject = Salla.helpers.setNested(parentObject, key, value);\n return this.store.set(firstKey, parentObject[firstKey]);\n }\n return this.store.set(key, value);\n }\n\n remove(key) {\n return this.store.remove(key);\n }\n\n clearAll() {\n return this.store.clearAll();\n }\n\n get(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n return Salla.helpers.getNested({[firstKey]: this.store.get(firstKey)}, key);\n }\n return this.store.get(key, value);\n }\n}\n","\"use strict\";\n\nif (typeof window !== \"undefined\") {\n window.salla = window.salla || window.Salla || {};\n window.Salla = window.salla;\n}\nif (typeof global !== \"undefined\") {\n global.salla = global.salla || global.Salla || {};\n global.Salla = global.salla;\n}\n\n// loading helpers object and link it to salla\nimport Helpers from \"./helpers\"\nimport Logger from \"./logger\"\nimport Config from \"./config\"\nimport Emitter from \"./event\"\nimport Storage from \"./storage\"\nimport Cookie from \"./cookie\"\n\nSalla.status = 'base';\n// const Salla = {};\nSalla.config = new Config();\nSalla.logger = Logger;\nSalla.event = new Emitter();\n\nSalla.helpers = Helpers;\nSalla.storage = new Storage();\nSalla.cookie = new Cookie();\n\n// alias\nSalla.log = Salla.logger.log;\nSalla.money = Salla.helpers.money;\nSalla.url = Salla.helpers.url;\nSalla.versions = {\n base: '[VI]{version}[/VI]'\n};\n\n\nexport default Salla","/**\n * @namespace Salla.config\n *\n * @property {any} properties_\n */\nexport default class Config {\n constructor(properties = {}, default_properties = {}) {\n this.default_properties = default_properties;\n this.properties_ = { ...this.default_properties, ...properties };\n }\n\n merge(config) {\n this.properties_ = {...this.properties_, ...config};\n\n this.properties_.store = { ...this.default_properties?.store||{}, ...this.properties_.store };\n\n return this;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n Salla.helpers.setNested(this.properties_, key, value);\n return this;\n }\n this.properties_[key] = value;\n return this;\n }\n\n /**\n * @param {string|undefined} isoCode\n * @return {Currency}\n */\n currency(isoCode){\n isoCode = isoCode || this.get('user.currency_code');\n return this.get('currencies.' + isoCode) || Object.values(this.get('currencies'))[0];\n }\n\n\n /**\n * @param {string} key\n * @param {null|any} default_\n * @return {any}\n */\n get(key, default_ = null) {\n if (key.includes(\".\")) {\n return Salla.helpers.getNested(this.properties_, key, default_);\n }\n return this.properties_.hasOwnProperty(key) ? this.properties_[key] || default_ : default_ || undefined;\n }\n\n all() {\n return this.properties_;\n }\n\n isDebug() {\n return this.get('debug') || Salla.storage.get('debug');\n }\n}\n","/**\n * @namespace Salla.cookie\n */\nexport default class Cookie {\n constructor() {\n Salla.event.on(\"cookies::remove\", (key) => this.remove(key));\n Salla.event.on(\"cookies::add\", (key, value) => this.set(key, value));\n }\n\n get(key) {\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(key + \"=\"))\n ?.split(\"=\")[1];\n }\n\n set(key, value = \"\", days = 10) {\n let expires = \"\";\n if (days) {\n let date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = \"; expires=\" + date.toUTCString();\n }\n document.cookie = `${key}=${value}${expires}\"; path=/; secure; SameSite=Lax\"`;\n return this;\n }\n\n remove(key) {\n document.cookie = `${key}=; Max-Age=0; path=/;`;\n return this;\n }\n\n clearAll() {\n let cookies = document.cookie.split(\";\");\n\n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n let eqPos = cookie.indexOf(\"=\");\n let name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n this.remove(name);\n }\n }\n}\n"],"names":["number","num","isToEnglish","regex","ar","en","find","Salla","config","get","replace","i","length","RegExp","getOnlyDecimal","value","dotsCount","match","is_full_url","url","startsWith","storeUrl","window","location","href","split","slice","join","set","rtrim","ltrim","addParamToUrl","key","includes","endsWith","encodeURIComponent","baseUrl","path","origin","asset","getLeveledData","nameLevels","existedData","currentName","Array","isArray","push","String","prototype","toStudlyCase","this","trim","t","toUpperCase","toDatasetName","substr","toSelector","replaceArray","replaceString","s","undefined","digitsOnly","helpers","Helpers","inputDigitsOnly","input","is_decimal","document","querySelectorAll","forEach","el","logger","warn","new_val","min","parseInt","max","maxLength","toString","substring","dataset","hasOwnProperty","money","currency","symbol","amount","setNested","object","schema","keys","len","elem","getNested","default_","data","inputData","name","hostname","URL","pageName","salla","debounce","fn","delay","timer","resolves","args","clearTimeout","setTimeout","result","r","Promise","Logger","c","proxy","log","a","type","isDebug","l","f","__dict__","style","color","event","backend","call","concat","trace","debug","info","error","arguments","logs","flat","logData","console","Emitter","EventEmitter","constructor","super","wildcard","delimiter","newListener","removeListener","maxListeners","verboseMemoryLeak","ignoreErrors","body","querySelector","logableEvents","ingoreLogEvents","noneFireableActions","createAndDispatch","event_name","dispatch","emit","actionName","trackEvents","emitAsync","e","dataLayer","dataLayerObject","map","item","dispatchMobileEvent","dispatchEvents","events","payload","Object","entries","addListener","eventName","callback","on","addEventListener","listen","registerGlobalListener","onAny","details","page","mobileApp","webkit","messageHandlers","callbackHandler","postMessage","JSON","stringify","err","Android","customEventWithData","localStore","createStore","localStorage","sessionStorage","cookieStorage","memoryStorage","global","status","properties","default_properties","properties_","merge","store","isoCode","values","all","storage","remove","firstKey","parentObject","clearAll","cookie","row","days","expires","date","Date","setTime","getTime","toUTCString","cookies","eqPos","indexOf","versions","base","Salla$1"],"mappings":"ocAKO,SAASA,EAAOC,EAAKC,GAAc,GACtCD,GAAY,GAEZ,IAIIE,EAJAC,EAAK,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnDC,EAAK,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnDC,GAHJJ,EAAcA,IAAgBK,MAAMC,OAAOC,IAAI,0CAGtBL,EAAKC,EAC1BK,EAAUR,EAAcG,EAAKD,EAEjC,IAAK,IAAIO,EAAI,EAAGA,EAAIL,EAAKM,OAAQD,IAC7BR,EAAQ,IAAIU,OAAOP,EAAKK,GAAI,KAC5BV,EAAMA,EAAIS,QAAQP,EAAOO,EAAQC,IAErC,OAAOV,CACX,CA2CO,SAASa,EAAeC,GAC3B,IAAIC,GAAc,GAAED,IAAQE,MAAM,QAAU,IAAIL,OAChD,OAAKI,GAA2B,IAAdA,EAMXF,EAAeC,EAAML,QAAQ,YAAa,QALtCK,CAMf,CCtEO,SAASG,EAAYC,GAC1B,MAAQ,GAAEA,IAAMC,WAAW,aAAgB,GAAED,IAAMC,WAAW,UAChE,CAoBO,SAASX,EAAIU,GAClB,GAAID,EAAYC,GACd,OAAOA,EAGT,IAAIE,EAAWd,MAAMC,OAAOC,IAAI,aAOhC,OALIY,IACAA,EAAWC,OAAOC,SAASC,KAAKC,MAAM,KAAKC,MAAM,GAAI,GAAGC,KAAK,KAC7DpB,MAAMC,OAAOoB,IAAI,YAAaP,IAG3BA,EAASQ,MAAM,KAAO,IAAMV,GAAKW,MAAM,IAChD,CAgBO,SAASC,EAAcC,EAAKjB,GACjC,IAAKA,IAAUiB,EACb,OAAOV,OAAOC,SAASC,KAEzB,IAAIrB,EAAQ,IAAIU,OAAO,SAAWmB,EAAM,aAAc,KAClDb,EAAMG,OAAOC,SAASC,KACvBd,QAAQP,EAAO,MACfsB,MAAM,KAAK,GACXf,QAAQ,SAAU,IAQrB,OAPIS,EAAIc,SAAS,KACfd,GAAO,IAGPA,IAAQA,EAAIe,SAAS,KAAO,GAAK,KAAO,KAGlCf,EAAMa,EAAM,IAAMG,mBAAmBpB,IAAQL,QAAQ,SAAU,GACzE,CAGO,SAAS0B,EAAQC,GACtB,OAAOf,OAAOC,SAASe,OAAS,IAAMD,GAAMP,MAAM,IACpD,CAEO,SAASS,EAAMF,GACpB,OAAOnB,EAAYmB,GACfA,EACAD,EAAQ,UAAY7B,MAAMC,OAAOC,IAAI,cAAgB,IAAM4B,GAAMP,MAAM,KAC7E,CCIA,SAASU,EAAeC,EAAY1B,EAAO2B,GAEzC,IAAIC,EAAcF,EAAW,GAG7B,OAAIC,GAAoC,GAArBD,EAAW7B,OACxBgC,MAAMC,QAAQH,IAChBA,EAAYI,KAAK/B,GACV2B,GAIF,CAACA,EAAa3B,GAGnB6B,MAAMC,QAAQH,IAChBA,EAAYI,KAAK/B,GACV2B,GAGkB,iBAAhBA,EACF,CAACA,EAAa3B,GAInB2B,GACFA,EAAYC,GAAeH,EAAeC,EAAWf,MAAM,GAAIX,EAAO2B,EAAYC,IAC3ED,GAGLC,EACK,CAAEA,CAACA,GAAcH,EAAeC,EAAWf,MAAM,GAAIX,IAIvC,KAAhB4B,EAAqB,CAAC5B,GAASA,CACxC,CCtHAgC,OAAOC,UAAUC,aAAe,WAC5B,OAAOC,KAAKC,OACPzC,QAAQ,mBAAmB,SAAU0C,GAClC,OAAOA,EAAEC,cACJ3C,QAAQ,eAAgB,GACjC,GACR,EAEAqC,OAAOC,UAAUM,cAAgB,WAC7B,OAAOJ,KAAK9B,WAAW,SACjB8B,KAAKK,OAAO,GAAGN,eACfC,KAAKD,cACf,EAIAF,OAAOC,UAAUQ,WAAa,WAE1B,OAAON,KAAKC,OAAO/B,WAAW,MAAQ8B,KAAKC,OAAO/B,WAAW,KACvD8B,KACA,IAAMA,IAChB,EAEAH,OAAOC,UAAUS,aAAe,SAAUnD,EAAMI,GAG5C,IAFA,IACIP,EADAuD,EAAgBR,KAEXvC,EAAI,EAAGA,EAAIL,EAAKM,OAAQD,IAC7BR,EAAQ,IAAIU,OAAOP,EAAKK,GAAI,KAC5B+C,EAAgBA,EAAchD,QAAQP,EAAOO,EAAQC,IAEzD,OAAO+C,CACX,EAEAX,OAAOC,UAAUnB,MAAQ,SAAU8B,GAG/B,YAFUC,IAAND,IACAA,EAAI,OACDT,KAAKxC,QAAQ,IAAIG,OAAO,IAAM8C,EAAI,OAAQ,GACrD,EAEAZ,OAAOC,UAAUlB,MAAQ,SAAU6B,GAG/B,YAFUC,IAAND,IACAA,EAAI,OACDT,KAAKxC,QAAQ,IAAIG,OAAO,KAAO8C,EAAI,MAAO,GACrD,EAEAZ,OAAOC,UAAUa,WAAa,WAC1B,OAAOtD,MAAMuD,QAAQD,WAAWX,KACpC,EDwGA,IAAea,EAAA,CAEbF,WFjIK,SAAoB5D,GACvB,OAAOD,EAAOC,GAAK,GAAMS,QAAQ,WAAY,IACxCA,QAAQ,KAAM,KACdmB,MAAM,IACf,EE8HEmC,gBFvHK,SAASA,EAAgBC,EAAOC,GAAa,GAChD,GAAoB,iBAATD,EACP,OAAOE,SAASC,iBAAiBH,GAAOI,SAAQC,GAAMN,EAAgBM,EAAIJ,KAE9E,IAAKD,EAED,YADA1D,MAAMgE,OAAOC,KAAK,8BAAiCP,GAGvD,IAAIQ,EAAUlE,MAAMuD,QAAQD,WAAWI,EAAMlD,OAE7C,OAAIkD,EAAMS,KAAOD,EAAUE,SAASV,EAAMS,KAC/BT,EAAMlD,MAAQkD,EAAMS,IAE3BT,EAAMW,KAAOH,EAAUE,SAASV,EAAMW,KAC/BX,EAAMlD,MAAQkD,EAAMW,IAE3BX,EAAMY,WAAa,GAAKJ,EAAQK,WAAWlE,OAASqD,EAAMY,UACnDZ,EAAMlD,MAAQ0D,EAAQK,WAAWC,UAAU,EAAGd,EAAMY,WAGxDZ,EAAMlD,MAASmD,GAAcD,EAAMe,QAAQC,eAAe,qBAC3DnE,EAAe2D,GACfA,EAAQ/D,QAAQ,MAAO,GACjC,EEiGEV,OAAQA,EACRkF,MFjFK,SAAeA,GAClB,IAAIC,EAAW5E,MAAMC,OAAO2E,SAASD,GAAOC,UAAUC,OAEtD,OAAOpF,EADPkF,EAAyB,iBAAVA,EAAqBA,EAAMG,OAASH,GAC5B,IAAMC,CACjC,EEgFEG,UA9BK,SAAmBC,EAAQvD,EAAKjB,GACrC,IAAIyE,EAASD,EACTE,EAAOzD,EAAIP,MAAM,KACjBiE,EAAMD,EAAK7E,OACf,IAAK,IAAID,EAAI,EAAGA,EAAI+E,EAAM,EAAG/E,IAAK,CAChC,IAAIgF,EAAOF,EAAK9E,GACX6E,EAAOG,KAAOH,EAAOG,GAAQ,IAClCH,EAASA,EAAOG,EAClB,CAGA,OADAH,EAAOC,EAAKC,EAAM,IAAM3E,EACjBwE,CACT,EAmBEK,UAjBK,SAAmBL,EAAQvD,EAAK6D,GACrC,IAAIC,EAAOrF,EAAAA,QAAI8E,EAAQvD,GACvB,YAAgB4B,IAATkC,EAAqBA,EAAOD,CACrC,EAeEE,UAnGF,SAA8BC,EAAMjF,EAAOiE,EAAU,CAAA,GACnD,GAAIgB,EAAK/D,SAAS,KAAM,CACtB,IAAIQ,EAAauD,EAAKvE,MAAM,KAAKE,KAAK,IAAIF,MAAM,KAChD,MAAO,CAAEuE,KAAMvD,EAAW,GAAI1B,MAAOyB,EAAeC,EAAWf,MAAM,GAAIX,EAAOiE,EAAQvC,EAAW,KACrG,CACA,MAAO,CAAEuD,KAAMA,EAAMjF,MAAOA,EAC9B,EAgGEI,qDD7JK,SAAcA,GACjB,GAAID,EAAYC,GACZ,OAAOA,EAGX,MAAM8E,SAAEA,GAAa,IAAIC,IAAIzF,EAAI,MAEjC,MAAO,WAAawF,EAAW,IAAM9E,GAAKW,MAAM,IACpD,eAqBO,SAAgBX,GACrB,OAAID,EAAYC,GACPA,EAMLZ,MAAMC,OAAOC,IAAI,YAAaa,OAAOC,SAASC,KAAKC,MAAM,KAAKC,MAAM,GAAI,GAAGC,KAAK,MAAME,MAAM,KAC5F,IACAV,GAAKW,MAAM,IAEjB,wCAgCO,SAAaO,GAClB,MAAO,6BAA+BA,GAAMP,MAAM,IACpD,MAQO,SAAaO,GAClB,OAAO9B,MAAMC,OAAOC,IAAI,YAAaA,EAAI,MAAMoB,MAAM,KAAO,IAAMQ,GAAMP,MAAM,IAChF,UAEO,SAAiBqE,GACtB,OAAOA,GAAY5F,MAAMC,OAAOC,IAAI,eAAiB0F,CACvD,iBAEO,SAAwBhF,GAC7B,OAAOoB,EAAM6D,MAAM5F,OAAOC,IAAI,iCAAmC8B,EAAMpB,EACzE,ICiEEY,cAAeZ,EAGfkF,SArIF,SAAkBC,EAAIC,GACpBA,EAAQA,GAAS,IACjB,IACIC,EADAC,EAAW,GAEf,OAAO,YAAaC,GAOlB,OANAC,aAAaH,GACbA,EAAQI,YAAW,KACjB,IAAIC,EAASP,KAAMI,GACnBD,EAASpC,SAASyC,GAAMA,EAAED,KAC1BJ,EAAW,EAAE,GACZF,GACI,IAAIQ,SAASD,GAAML,EAAS3D,KAAKgE,KAE5C,GEvCgBE,EAAA,SAAUC,GAGxB,IAAIC,EAAQ,CACVC,IAAK,SAAUC,EAAGC,GAChB,IAAKJ,EACH,OAGF,IAAKb,MAAM5F,OAAO8G,UAChB,OAIgC,UAA9BlB,MAAM5F,OAAOC,IAAI,WACnB4G,EAAO,SAET,IAKIE,EAAIN,EAAEE,IACRK,OAAa5D,IAATyD,EAAqBE,EAAKrE,KAAKuE,SAASJ,IAASE,EAEnDG,EAAQ,CAAC,aAAc,oGACvBC,EATiB,CACnBC,MAAO,UACPC,QAAS,WAOgBR,GACvBM,IACFD,EAAM,IAAM,KAAOL,EAAK,GAAGhE,cAAgBgE,EAAKtC,UAAU,GAC1D2C,EAAM5E,KAAM,2BAA0B6E,wCAA4CA,6CAGpFH,EAAEM,KAAKb,KAAMS,EAAMK,UAAUX,GAC9B,EACDK,SAAU,CACRO,MAASf,EAAEe,MACXC,MAAShB,EAAEgB,MACXC,KAAQjB,EAAEiB,KACV1D,KAAQyC,EAAEzC,KACV2D,MAASlB,EAAEkB,QAIf,MAAO,CACLP,MAAO,WACLV,EAAMC,IAAIiB,UAAW,QACtB,EACDJ,MAAO,WACLd,EAAMC,IAAIiB,UAAW,QACtB,EACDH,MAAO,WACLf,EAAMC,IAAIiB,UAAW,QACtB,EACDF,KAAM,WACJhB,EAAMC,IAAIiB,UAAW,OACtB,EACD5D,KAAM,WACJ0C,EAAMC,IAAIiB,UAAW,OACtB,EACDD,MAAO,WACLjB,EAAMC,IAAIiB,UAAW,QACtB,EACDjB,IAAK,WACHD,EAAMC,IAAIiB,eAAWxE,EACtB,EAEDiE,QAAS,WACPX,EAAMC,IAAIiB,UAAW,UACtB,EAEDC,KAAM,SAAUA,GACd,CAACA,GAAMC,OAAOjE,SAAQkE,GAAWA,GAAWrB,EAAMC,IAAI,CAACoB,GAASD,OAAQ,YAC1E,EAEH,CA1Ee,CA0EdE,SC5Ea,MAAMC,UAAgBC,EAAAA,QACnCC,cAEEC,MAAM,CACJC,UAAU,EACVC,UAHc,KAIdC,aAAa,EACbC,gBAAgB,EAChBC,aAAc,GACdC,mBAAmB,EACnBC,cAAc,IAEhBjG,KAAK4F,UAVW,KAYQ,oBAAb3E,WACTjB,KAAKkG,KAAOjF,SAASkF,cAAc,SAGrCnG,KAAKoG,cAAgB,CAAC,0BAA2B,6BACjDpG,KAAKqG,gBAAkB,CACrB,kBACA,kBACA,oBAIFrG,KAAKsG,oBAAsB,CAAC,mBAC9B,CAQAC,kBAAkBC,KAAe5D,GAC/B5C,KAAKyG,SAASD,KAAe5D,EAC/B,CAEA8D,KAAKF,KAAe5D,GAQlB,IAAI+D,EAAaH,EAAWhJ,QAAQ,KAAM,KAC1C,IAAKwC,KAAKsG,oBAAoBvH,SAAS4H,IAAetJ,MAAMuH,MAA0C,mBAA3BvH,MAAMuH,KAAK+B,GAQpF,OAPAtJ,MAAM4G,IAAK,UAAS0C,kCAA2CH,MAC/DG,EAAaA,EAAWpI,MAAM,KAE1BmB,MAAMC,QAAQiD,EAAK,MACrBA,EAAOA,EAAK,SAEdM,MAAMyD,EAAW,IAAIA,EAAW,OAAO/D,GAKzC8C,MAAMgB,KAAKF,KAAe5D,GAC1B5C,KAAK4G,YAAYJ,KAAe5D,EAClC,CAEAiE,UAAUL,KAAe5D,GAEvB,IAAIe,EAAS+B,MAAMmB,UAAUL,KAAe5D,GAC5C,IACE5C,KAAK4G,YAAYJ,KAAe5D,EAGlC,CAFE,MAAOkE,GACPzJ,MAAMgE,OAAOC,KAAM,4BAA2BkF,KAAe5D,EAAMkE,EACrE,CACA,OAAOnD,CACT,CAEAiD,YAAYJ,KAAe5D,GAEzB,GAAsB,oBAAXxE,OAAwB,CACjCA,OAAO2I,UAAY3I,OAAO2I,WAAa,GAOvC,IAAIC,EAAkB,CAAEtC,MAAO8B,GAC/B5D,EAAKqE,KAAIC,GAAwB,iBAATA,IAAsBF,EAAkB,IAAKA,KAAoBE,MACzF9I,OAAO2I,UAAUnH,KAAKoH,EACxB,CAGI3J,MAAMgE,SAAWrB,KAAKqG,gBAAgBtH,SAASyH,IACjDnJ,MAAMgE,OAAOqD,MAAM8B,KAAe5D,GAGpC5C,KAAKmH,oBAAoBX,KAAgB5D,EAC3C,CAQA6D,SAASD,KAAe5D,GACtB,OAAO5C,KAAK0G,KAAKF,KAAe5D,EAClC,CAOAwE,eAAeC,GACb,GAAKA,EAKP,GAAqB,iBAAXA,GAAuB3H,MAAMC,QAAQ0H,GAC7ChK,MAAM4G,IAAI,iEAAkEoD,QAI5E,IAAK,MAAOb,EAAYc,KAAYC,OAAOC,QAAQH,GACjDrH,KAAKyG,SAASD,EAAYc,QAV1BjK,MAAM4G,IAAI,yBAA0BoD,EAYxC,CASAI,YAAYC,EAAWC,GACrB,OAAO3H,KAAK4H,GAAGF,EAAWC,EAC5B,CASAE,iBAAiBH,EAAWC,GAC1B,OAAO3H,KAAK4H,GAAGF,EAAWC,EAC5B,CAOAG,OAAOJ,EAAWC,GAChB,OAAO3H,KAAK4H,GAAGF,EAAWC,EAC5B,CAUAI,uBAAuBjF,EAAM6E,GAC3B,OAAO3H,KAAKgI,MAAML,EACpB,CASAR,oBAAoBO,EAAWO,EAAU,IACvC,KACoB,oBAAX7J,QACNA,OAAO2I,WACPA,UAAU,IACVA,UAAU,GAAGmB,MACbnB,UAAU,GAAGmB,KAAKC,WAEnB,MAAO,GAGT,GAAI/J,OAAOgK,OACT,IACEhK,OAAOgK,OAAOC,gBAAgBC,gBAAgBC,YAC5CC,KAAKC,UAAU,CACb/D,MAAOgD,EACPO,QAASA,IAKf,CAFE,MAAOS,GACPrL,MAAM4G,IAAIyE,EAAK,wCACjB,MAIF,GAAsB,oBAAXC,QACT,IACEA,QAAQC,oBAAoBlB,EAAWc,KAAKC,UAAU,CAAER,QAASA,IAGnE,CAFE,MAAOS,GACPrL,MAAM4G,IAAIyE,EAAK,wCACjB,CAEJ,ECrNF,MAAMG,EAAaC,EAAAA,QAAYA,YAAY,CACzCC,EAAY,QACZC,EAAc,QACdC,UACAC,EAAAA,SACC,ICTmB,oBAAX9K,SACTA,OAAO8E,MAAQ9E,OAAO8E,OAAS9E,OAAOf,OAAS,GAC/Ce,OAAOf,MAAQe,OAAO8E,OAEF,oBAAXiG,SACTA,OAAOjG,MAAQiG,OAAOjG,OAASiG,OAAO9L,OAAS,GAC/C8L,OAAO9L,MAAQ8L,OAAOjG,OAWxB7F,MAAM+L,OAAS,OAEf/L,MAAMC,OAAS,IChBA,MACbmI,YAAY4D,EAAa,GAAIC,EAAqB,CAAA,GAChDtJ,KAAKsJ,mBAAqBA,EAC1BtJ,KAAKuJ,YAAc,IAAKvJ,KAAKsJ,sBAAuBD,EACtD,CAEAG,MAAMlM,GAKJ,OAJA0C,KAAKuJ,YAAc,IAAIvJ,KAAKuJ,eAAgBjM,GAE5C0C,KAAKuJ,YAAYE,MAAQ,IAAKzJ,KAAKsJ,oBAAoBG,OAAO,MAAOzJ,KAAKuJ,YAAYE,OAE/EzJ,IACT,CAEAtB,IAAII,EAAKjB,GACP,OAAIiB,EAAIC,SAAS,MACf1B,MAAMuD,QAAQwB,UAAUpC,KAAKuJ,YAAazK,EAAKjB,GACxCmC,OAETA,KAAKuJ,YAAYzK,GAAOjB,EACjBmC,KACT,CAMAiC,SAASyH,GAEP,OADAA,EAAUA,GAAW1J,KAAKzC,IAAI,sBACvByC,KAAKzC,IAAI,cAAgBmM,IAAYnC,OAAOoC,OAAO3J,KAAKzC,IAAI,eAAe,EACpF,CAQAA,IAAIuB,EAAK6D,EAAW,MAClB,OAAI7D,EAAIC,SAAS,KACR1B,MAAMuD,QAAQ8B,UAAU1C,KAAKuJ,YAAazK,EAAK6D,GAEjD3C,KAAKuJ,YAAYxH,eAAejD,GAAOkB,KAAKuJ,YAAYzK,IAAQ6D,EAAWA,QAAYjC,CAChG,CAEAkJ,MACE,OAAO5J,KAAKuJ,WACd,CAEAnF,UACE,OAAOpE,KAAKzC,IAAI,UAAYF,MAAMwM,QAAQtM,IAAI,QAChD,GDlCFF,MAAMgE,OAASyC,EACfzG,MAAMqH,MAAQ,IAAIa,EAElBlI,MAAMuD,QAAUC,EAChBxD,MAAMwM,QAAU,IDVD,MACbpE,cACEpI,MAAMqH,MAAMkD,GAAG,wBAAyB9I,GAAQkB,KAAK8J,OAAOhL,KAC5DzB,MAAMqH,MAAMkD,GAAG,qBAAqB,CAAC9I,EAAKjB,IAAUmC,KAAKtB,IAAII,EAAKjB,KAClEmC,KAAKyJ,MAAQZ,CACf,CAEAnK,IAAII,EAAKjB,GACP,GAAIiB,EAAIC,SAAS,KAAM,CACrB,IAAIgL,EAAWjL,EAAIP,MAAM,KAAK,GAC1ByL,EAAe,CAACD,CAACA,GAAW/J,KAAKyJ,MAAMlM,IAAIwM,IAE/C,OADAC,EAAe3M,MAAMuD,QAAQwB,UAAU4H,EAAclL,EAAKjB,GACnDmC,KAAKyJ,MAAM/K,IAAIqL,EAAUC,EAAaD,GAC/C,CACA,OAAO/J,KAAKyJ,MAAM/K,IAAII,EAAKjB,EAC7B,CAEAiM,OAAOhL,GACL,OAAOkB,KAAKyJ,MAAMK,OAAOhL,EAC3B,CAEAmL,WACE,OAAOjK,KAAKyJ,MAAMQ,UACpB,CAEA1M,IAAIuB,EAAKjB,GACP,GAAIiB,EAAIC,SAAS,KAAM,CACrB,IAAIgL,EAAWjL,EAAIP,MAAM,KAAK,GAC9B,OAAOlB,MAAMuD,QAAQ8B,UAAU,CAACqH,CAACA,GAAW/J,KAAKyJ,MAAMlM,IAAIwM,IAAYjL,EACzE,CACA,OAAOkB,KAAKyJ,MAAMlM,IAAIuB,EAAKjB,EAC7B,GCpBFR,MAAM6M,OAAS,IExBA,MACbzE,cACEpI,MAAMqH,MAAMkD,GAAG,mBAAoB9I,GAAQkB,KAAK8J,OAAOhL,KACvDzB,MAAMqH,MAAMkD,GAAG,gBAAgB,CAAC9I,EAAKjB,IAAUmC,KAAKtB,IAAII,EAAKjB,IAC/D,CAEAN,IAAIuB,GACF,OAAOmC,SAASiJ,OACb3L,MAAM,MACNnB,MAAM+M,GAAQA,EAAIjM,WAAWY,EAAM,QAClCP,MAAM,KAAK,EACjB,CAEAG,IAAII,EAAKjB,EAAQ,GAAIuM,EAAO,IAC1B,IAAIC,EAAU,GACd,GAAID,EAAM,CACR,IAAIE,EAAO,IAAIC,KACfD,EAAKE,QAAQF,EAAKG,UAAmB,GAAPL,EAAY,GAAK,GAAK,KACpDC,EAAU,aAAeC,EAAKI,aAChC,CAEA,OADAzJ,SAASiJ,OAAU,GAAEpL,KAAOjB,IAAQwM,oCAC7BrK,IACT,CAEA8J,OAAOhL,GAEL,OADAmC,SAASiJ,OAAU,GAAEpL,yBACdkB,IACT,CAEAiK,WACE,IAAIU,EAAU1J,SAASiJ,OAAO3L,MAAM,KAEpC,IAAK,IAAId,EAAI,EAAGA,EAAIkN,EAAQjN,OAAQD,IAAK,CACvC,IAAIyM,EAASS,EAAQlN,GACjBmN,EAAQV,EAAOW,QAAQ,KACvB/H,EAAO8H,GAAS,EAAIV,EAAO7J,OAAO,EAAGuK,GAASV,EAClDlK,KAAK8J,OAAOhH,EACd,CACF,GFXFzF,MAAM4G,IAAM5G,MAAMgE,OAAO4C,IACzB5G,MAAM2E,MAAQ3E,MAAMuD,QAAQoB,MAC5B3E,MAAMY,IAAMZ,MAAMuD,QAAQ3C,IAC1BZ,MAAMyN,SAAW,CACfC,KAAM,sBAIR,IAAAC,EAAe3N"}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"lodash/get";import t from"eventemitter2";import r from"store/src/store-engine";import n from"store/storages/localStorage";import i from"store/storages/sessionStorage";import o from"store/storages/cookieStorage";import l from"store/storages/memoryStorage";function a(e,t=!1){e+="";let r,n=["٠","١","٢","٣","٤","٥","٦","٧","٨","٩"],i=["0","1","2","3","4","5","6","7","8","9"],o=(t=t||!Salla.config.get("store.settings.arabic_numbers_enabled"))?n:i,l=t?i:n;for(let t=0;t<o.length;t++)r=new RegExp(o[t],"g"),e=e.replace(r,l[t]);return e}function s(e){let t=(e.match(/\./g)||[]).length;return t&&1!==t?s(e.replace(/\.(.+)\./g,".$1")):e}function c(e){return`${e}`.startsWith("https://")||`${e}`.startsWith("http://")}function u(e){return c(e)||c(e)?e:Salla.config.get("store.url",window.location.href.split("/").slice(0,-1).join("/")).rtrim("/")+"/"+e?.ltrim("/")}function d(e,t){if(!t||!e)return window.location.href;let r=new RegExp("([?&])"+e+"=[^&]+[&]?","g"),n=window.location.href.replace(r,"$1").split("#")[0].replace(/&$|\?$/,"");return n.includes("?")?n+="&":n+=(n.endsWith("/")?"":"/")+"?",(n+e+"="+encodeURIComponent(t)).replace(/&$|\?$/,"")}function g(e){return window.location.origin+"/"+e?.ltrim("/")}function p(e){return c(e)?e:g("themes/"+Salla.config.get("theme.name")+"/"+e?.ltrim("/"))}function h(e,t,r){let n=e[0];return r&&0==e.length?Array.isArray(r)?(r.push(t),r):[r,t]:Array.isArray(r)?(r.push(t),r):"string"==typeof r?[r,t]:r?(r[n]=h(e.slice(1),t,r[n]),r):n?{[n]:h(e.slice(1),t)}:""===n?[t]:t}var f={digitsOnly:function(e){return a(e,!0).replace(/[^0-9.]/g,"").replace("..",".").rtrim(".")},inputDigitsOnly:function e(t,r=!1){if("string"==typeof t)return document.querySelectorAll(t).forEach((t=>e(t,r)));if(!t)return void Salla.logger.warn("Can't find Object With Id: "+t);let n=Salla.helpers.digitsOnly(t.value);return t.min&&n<t.min?t.value=t.min:t.max&&n>t.max?t.value=t.max:t.maxLength>=1&&n.toString().length>t.maxLength?t.value=n.toString().substring(0,t.maxLength):t.value=r||t.dataset.hasOwnProperty("digitsWithDecimal")?s(n):n.replace(/\D/g,"")},number:a,money:function(e){let t=Salla.config.currency(e?.currency).symbol;return a(e="object"==typeof e?e.amount:e)+" "+t},setNested:function(e,t,r){let n=e,i=t.split("."),o=i.length;for(let e=0;e<o-1;e++){let t=i[e];n[t]||(n[t]={}),n=n[t]}return n[i[o-1]]=r,e},getNested:function(t,r,n){let i=e(t,r);return void 0!==i?i:n},inputData:function(e,t,r={}){if(e.includes("[")){let n=e.split("]").join("").split("[");return{name:n[0],value:h(n.slice(1),t,r[n[0]])}}return{name:e,value:t}},url:Object.freeze({__proto__:null,is_full_url:c,get:u,addParamToUrl:d,baseUrl:g,asset:p,cdn:function(e){return"https://cdn.salla.network/"+e?.ltrim("/")},api:function(e){return Salla.config.get("store.api",u(""))?.rtrim("/")+"/"+e?.ltrim("/")},is_page:function(e){return e&&Salla.config.get("page.slug")===e},is_placeholder:function(e){return p(salla.config.get("theme.settings.placeholder"))===p(e)}}),addParamToUrl:d,debounce:function(e,t){t=t||100;let r,n=[];return function(...i){return clearTimeout(r),r=setTimeout((()=>{let t=e(...i);n.forEach((e=>e(t))),n=[]}),t),new Promise((e=>n.push(e)))}}},m=function(e){let t={log:function(t,r){if(!e)return;if(!salla.config.isDebug())return;"trace"===salla.config.get("debug")&&(r="trace");let n=e.log,i=void 0===r?n:this.__dict__[r]||n,o=["%cTwilight","color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;"],l={event:"#CFF680",backend:"#7b68ee"}[r];l&&(o[0]+="%c"+r[0].toUpperCase()+r.substring(1),o.push(`margin-left: 5px;color: ${l};font-weight:bold; border:1px solid ${l}; padding: 2px 6px; border-radius: 5px;`)),i.call(e,...o.concat(...t))},__dict__:{trace:e.trace,debug:e.debug,info:e.info,warn:e.warn,error:e.error}};return{event:function(){t.log(arguments,"event")},trace:function(){t.log(arguments,"trace")},debug:function(){t.log(arguments,"debug")},info:function(){t.log(arguments,"info")},warn:function(){t.log(arguments,"warn")},error:function(){t.log(arguments,"error")},log:function(){t.log(arguments,void 0)},backend:function(){t.log(arguments,"backend")},logs:function(e){[e].flat().forEach((e=>e&&t.log([e].flat(),"backend")))}}}(console);const S=r.createStore([n,i,o,l],[]);"undefined"==typeof global?(window.salla=window.salla||window.Salla||{},window.Salla=window.salla):(global.salla=global.salla||global.Salla||{},global.Salla=global.salla),Salla.status="base",Salla.config=new class{constructor(e={},t={}){this.default_properties=t,this.properties_={...this.default_properties,...e}}merge(e){return Object.assign(this.properties_,e),this.properties_.store={...this.default_properties.store,...this.properties_.store},this}set(e,t){return e.includes(".")?(Salla.helpers.setNested(this.properties_,e,t),this):(this.properties_[e]=t,this)}get(e,t=null){return e.includes(".")?Salla.helpers.getNested(this.properties_,e,t):this.properties_.hasOwnProperty(e)?this.properties_[e]||t:t||void 0}all(){return this.properties_}isDebug(){return this.get("debug")||Salla.storage.get("debug")}},Salla.logger=m,Salla.event=new class extends t{constructor(){super({wildcard:!0,delimiter:"::",newListener:!1,removeListener:!1,maxListeners:10,verboseMemoryLeak:!1,ignoreErrors:!1}),this.delimiter="::","undefined"!=typeof document&&(this.body=document.querySelector("body")),this.logableEvents=["cart::item.added.failed","cart::item.deleted.failed"],this.ingoreLogEvents=["document::click","document::keyup","document::change"],this.noneFireableActions=["document.request"]}createAndDispatch(e,...t){this.dispatch(e,...t)}emit(e,...t){let r=e.replace("::",".");if(!this.noneFireableActions.includes(r)&&void 0!==Salla.call&&"function"==typeof Salla.call(r))return Salla.log(`'Salla.${r}(...)' triggered using event '${e}'`),r=r.split("."),Array.isArray(t[0])&&(t=t[0]),void salla[r[0]][r[1]](...t);super.emit(e,...t),this.trackEvents(e,...t)}emitAsync(e,...t){let r=super.emitAsync(e,...t);try{this.trackEvents(e,...t)}catch(r){salla.logger.warn(`error on tracking event (${e})`,t,r)}return r}trackEvents(e,...t){if("undefined"!=typeof window){window.dataLayer=window.dataLayer||[];let r={event:e};t.map((e=>"object"==typeof e&&(r={...r,...e}))),window.dataLayer.push(r)}Salla.logger&&!this.ingoreLogEvents.includes(e)&&Salla.logger.event(e,...t),this.dispatchMobileEvent(e,{...t.values()})}dispatch(e,...t){return this.emit(e,...t)}dispatchEvents(e){if(e&&"object"==typeof e)for(const[t,r]of Object.entries(e))this.dispatch(t,r);else Salla.log("No Events To Dispatch!",e)}addListener(e,t){return this.on(e,t)}addEventListener(e,t){return this.on(e,t)}listen(e,t){return this.on(e,t)}registerGlobalListener(e,t){return this.onAny(t)}dispatchMobileEvent(e,t={}){if(!("undefined"!=typeof window&&window.dataLayer&&dataLayer[0]&&dataLayer[0].page&&dataLayer[0].page.mobileApp))return"";if(window.webkit)try{window.webkit.messageHandlers.callbackHandler.postMessage(JSON.stringify({event:e,details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}else if(Android)try{Android.customEventWithData(e,JSON.stringify({details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}}},Salla.storage=new class{constructor(){Salla.event.on("storage::item.remove",(e=>this.remove(e))),Salla.event.on("storage::item.set",((e,t)=>this.set(e,t))),this.store=S}set(e,t){if(e.includes(".")){let r=e.split(".")[0],n={[r]:this.store.get(r)};return n=Salla.helpers.setNested(n,e,t),this.store.set(r,n[r])}return this.store.set(e,t)}remove(e){return this.store.remove(e)}clearAll(){return this.store.clearAll()}get(e,t){if(e.includes(".")){let t=e.split(".")[0];return Salla.helpers.getNested({[t]:this.store.get(t)},e)}return this.store.get(e,t)}},Salla.cookie=new class{constructor(){Salla.event.on("cookies::remove",(e=>this.remove(e))),Salla.event.on("cookies::add",((e,t)=>this.set(e,t)))}get(e){return document.cookie.split("; ").find((t=>t.startsWith(e+"=")))?.split("=")[1]}set(e,t="",r=10){let n="";if(r){let e=new Date;e.setTime(e.getTime()+24*r*60*60*1e3),n="; expires="+e.toUTCString()}return document.cookie=`${e}=${t}${n}"; path=/; secure; SameSite=Lax"`,this}remove(e){return document.cookie=`${e}=; Max-Age=0; path=/;`,this}clearAll(){let e=document.cookie.split(";");for(let t=0;t<e.length;t++){let r=e[t],n=r.indexOf("="),i=n>-1?r.substr(0,n):r;this.remove(i)}}},Salla.helpers=f,Salla.log=Salla.logger.log,Salla.money=Salla.helpers.money,Salla.url=Salla.helpers.url,Salla.versions={base:"[VI]{version}[/VI]"};var b=Salla;export{b as default};
1
+ import e from"lodash/get";import t from"eventemitter2";import r from"store/src/store-engine";import n from"store/storages/localStorage";import i from"store/storages/sessionStorage";import o from"store/storages/cookieStorage";import l from"store/storages/memoryStorage";function a(e,t=!1){e+="";let r,n=["٠","١","٢","٣","٤","٥","٦","٧","٨","٩"],i=["0","1","2","3","4","5","6","7","8","9"],o=(t=t||!Salla.config.get("store.settings.arabic_numbers_enabled"))?n:i,l=t?i:n;for(let t=0;t<o.length;t++)r=new RegExp(o[t],"g"),e=e.replace(r,l[t]);return e}function s(e){let t=(`${e}`.match(/\./g)||[]).length;return t&&1!==t?s(e.replace(/\.(.+)\./g,".$1")):e}function c(e){return`${e}`.startsWith("https://")||`${e}`.startsWith("http://")}function u(e){if(c(e))return e;let t=Salla.config.get("store.url");return t||(t=window.location.href.split("/").slice(0,-1).join("/"),Salla.config.set("store.url",t)),t.rtrim("/")+"/"+e?.ltrim("/")}function d(e,t){if(!t||!e)return window.location.href;let r=new RegExp("([?&])"+e+"=[^&]+[&]?","g"),n=window.location.href.replace(r,"$1").split("#")[0].replace(/&$|\?$/,"");return n.includes("?")?n+="&":n+=(n.endsWith("/")?"":"/")+"?",(n+e+"="+encodeURIComponent(t)).replace(/&$|\?$/,"")}function g(e){return window.location.origin+"/"+e?.ltrim("/")}function p(e){return c(e)?e:g("themes/"+Salla.config.get("theme.name")+"/"+e?.ltrim("/"))}function h(e,t,r){let n=e[0];return r&&0==e.length?Array.isArray(r)?(r.push(t),r):[r,t]:Array.isArray(r)?(r.push(t),r):"string"==typeof r?[r,t]:r?(r[n]=h(e.slice(1),t,r[n]),r):n?{[n]:h(e.slice(1),t)}:""===n?[t]:t}String.prototype.toStudlyCase=function(){return this.trim().replace(/([^a-zA-Z\d].)/g,(function(e){return e.toUpperCase().replace(/[^a-zA-Z\d]/g,"")}))},String.prototype.toDatasetName=function(){return this.startsWith("data-")?this.substr(5).toStudlyCase():this.toStudlyCase()},String.prototype.toSelector=function(){return this.trim().startsWith(".")||this.trim().startsWith("#")?this:"#"+this},String.prototype.replaceArray=function(e,t){for(var r,n=this,i=0;i<e.length;i++)r=new RegExp(e[i],"g"),n=n.replace(r,t[i]);return n},String.prototype.rtrim=function(e){return void 0===e&&(e="\\s"),this.replace(new RegExp("["+e+"]*$"),"")},String.prototype.ltrim=function(e){return void 0===e&&(e="\\s"),this.replace(new RegExp("^["+e+"]*"),"")},String.prototype.digitsOnly=function(){return Salla.helpers.digitsOnly(this)};var f={digitsOnly:function(e){return a(e,!0).replace(/[^0-9.]/g,"").replace("..",".").rtrim(".")},inputDigitsOnly:function e(t,r=!1){if("string"==typeof t)return document.querySelectorAll(t).forEach((t=>e(t,r)));if(!t)return void Salla.logger.warn("Can't find Object With Id: "+t);let n=Salla.helpers.digitsOnly(t.value);return t.min&&n<parseInt(t.min)?t.value=t.min:t.max&&n>parseInt(t.max)?t.value=t.max:t.maxLength>=1&&n.toString().length>t.maxLength?t.value=n.toString().substring(0,t.maxLength):t.value=r||t.dataset.hasOwnProperty("digitsWithDecimal")?s(n):n.replace(/\D/g,"")},number:a,money:function(e){let t=Salla.config.currency(e?.currency).symbol;return a(e="object"==typeof e?e.amount:e)+" "+t},setNested:function(e,t,r){let n=e,i=t.split("."),o=i.length;for(let e=0;e<o-1;e++){let t=i[e];n[t]||(n[t]={}),n=n[t]}return n[i[o-1]]=r,e},getNested:function(t,r,n){let i=e(t,r);return void 0!==i?i:n},inputData:function(e,t,r={}){if(e.includes("[")){let n=e.split("]").join("").split("[");return{name:n[0],value:h(n.slice(1),t,r[n[0]])}}return{name:e,value:t}},url:Object.freeze({__proto__:null,is_full_url:c,base:function(e){if(c(e))return e;const{hostname:t}=new URL(u("/"));return"https://"+t+"/"+e?.ltrim("/")},get:u,domain:function(e){return c(e)?e:Salla.config.get("store.url",window.location.href.split("/").slice(0,-1).join("/")).rtrim("/")+"/"+e?.ltrim("/")},addParamToUrl:d,baseUrl:g,asset:p,cdn:function(e){return"https://cdn.salla.network/"+e?.ltrim("/")},api:function(e){return Salla.config.get("store.api",u(""))?.rtrim("/")+"/"+e?.ltrim("/")},is_page:function(e){return e&&Salla.config.get("page.slug")===e},is_placeholder:function(e){return p(salla.config.get("theme.settings.placeholder"))===p(e)}}),addParamToUrl:d,debounce:function(e,t){t=t||100;let r,n=[];return function(...i){return clearTimeout(r),r=setTimeout((()=>{let t=e(...i);n.forEach((e=>e(t))),n=[]}),t),new Promise((e=>n.push(e)))}}},m=function(e){let t={log:function(t,r){if(!e)return;if(!salla.config.isDebug())return;"trace"===salla.config.get("debug")&&(r="trace");let n=e.log,i=void 0===r?n:this.__dict__[r]||n,o=["%cTwilight","color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;"],l={event:"#CFF680",backend:"#7b68ee"}[r];l&&(o[0]+="%c"+r[0].toUpperCase()+r.substring(1),o.push(`margin-left: 5px;color: ${l};font-weight:bold; border:1px solid ${l}; padding: 2px 6px; border-radius: 5px;`)),i.call(e,...o.concat(...t))},__dict__:{trace:e.trace,debug:e.debug,info:e.info,warn:e.warn,error:e.error}};return{event:function(){t.log(arguments,"event")},trace:function(){t.log(arguments,"trace")},debug:function(){t.log(arguments,"debug")},info:function(){t.log(arguments,"info")},warn:function(){t.log(arguments,"warn")},error:function(){t.log(arguments,"error")},log:function(){t.log(arguments,void 0)},backend:function(){t.log(arguments,"backend")},logs:function(e){[e].flat().forEach((e=>e&&t.log([e].flat(),"backend")))}}}(console);const S=r.createStore([n,i,o,l],[]);"undefined"!=typeof window&&(window.salla=window.salla||window.Salla||{},window.Salla=window.salla),"undefined"!=typeof global&&(global.salla=global.salla||global.Salla||{},global.Salla=global.salla),Salla.status="base",Salla.config=new class{constructor(e={},t={}){this.default_properties=t,this.properties_={...this.default_properties,...e}}merge(e){return this.properties_={...this.properties_,...e},this.properties_.store={...this.default_properties?.store||{},...this.properties_.store},this}set(e,t){return e.includes(".")?(Salla.helpers.setNested(this.properties_,e,t),this):(this.properties_[e]=t,this)}currency(e){return e=e||this.get("user.currency_code"),this.get("currencies."+e)||Object.values(this.get("currencies"))[0]}get(e,t=null){return e.includes(".")?Salla.helpers.getNested(this.properties_,e,t):this.properties_.hasOwnProperty(e)?this.properties_[e]||t:t||void 0}all(){return this.properties_}isDebug(){return this.get("debug")||Salla.storage.get("debug")}},Salla.logger=m,Salla.event=new class extends t{constructor(){super({wildcard:!0,delimiter:"::",newListener:!1,removeListener:!1,maxListeners:10,verboseMemoryLeak:!1,ignoreErrors:!1}),this.delimiter="::","undefined"!=typeof document&&(this.body=document.querySelector("body")),this.logableEvents=["cart::item.added.failed","cart::item.deleted.failed"],this.ingoreLogEvents=["document::click","document::keyup","document::change"],this.noneFireableActions=["document.request"]}createAndDispatch(e,...t){this.dispatch(e,...t)}emit(e,...t){let r=e.replace("::",".");if(!this.noneFireableActions.includes(r)&&Salla.call&&"function"==typeof Salla.call(r))return Salla.log(`'Salla.${r}(...)' triggered using event '${e}'`),r=r.split("."),Array.isArray(t[0])&&(t=t[0]),void salla[r[0]][r[1]](...t);super.emit(e,...t),this.trackEvents(e,...t)}emitAsync(e,...t){let r=super.emitAsync(e,...t);try{this.trackEvents(e,...t)}catch(r){Salla.logger.warn(`error on tracking event (${e})`,t,r)}return r}trackEvents(e,...t){if("undefined"!=typeof window){window.dataLayer=window.dataLayer||[];let r={event:e};t.map((e=>"object"==typeof e&&(r={...r,...e}))),window.dataLayer.push(r)}Salla.logger&&!this.ingoreLogEvents.includes(e)&&Salla.logger.event(e,...t),this.dispatchMobileEvent(e,...t)}dispatch(e,...t){return this.emit(e,...t)}dispatchEvents(e){if(e)if("object"!=typeof e||Array.isArray(e))Salla.log("Events object is wrong, it should be object of {event:payload}",e);else for(const[t,r]of Object.entries(e))this.dispatch(t,r);else Salla.log("No Events To Dispatch!",e)}addListener(e,t){return this.on(e,t)}addEventListener(e,t){return this.on(e,t)}listen(e,t){return this.on(e,t)}registerGlobalListener(e,t){return this.onAny(t)}dispatchMobileEvent(e,t={}){if(!("undefined"!=typeof window&&window.dataLayer&&dataLayer[0]&&dataLayer[0].page&&dataLayer[0].page.mobileApp))return"";if(window.webkit)try{window.webkit.messageHandlers.callbackHandler.postMessage(JSON.stringify({event:e,details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}else if("undefined"!=typeof Android)try{Android.customEventWithData(e,JSON.stringify({details:t}))}catch(e){Salla.log(e,"The native context does not exist yet")}}},Salla.helpers=f,Salla.storage=new class{constructor(){Salla.event.on("storage::item.remove",(e=>this.remove(e))),Salla.event.on("storage::item.set",((e,t)=>this.set(e,t))),this.store=S}set(e,t){if(e.includes(".")){let r=e.split(".")[0],n={[r]:this.store.get(r)};return n=Salla.helpers.setNested(n,e,t),this.store.set(r,n[r])}return this.store.set(e,t)}remove(e){return this.store.remove(e)}clearAll(){return this.store.clearAll()}get(e,t){if(e.includes(".")){let t=e.split(".")[0];return Salla.helpers.getNested({[t]:this.store.get(t)},e)}return this.store.get(e,t)}},Salla.cookie=new class{constructor(){Salla.event.on("cookies::remove",(e=>this.remove(e))),Salla.event.on("cookies::add",((e,t)=>this.set(e,t)))}get(e){return document.cookie.split("; ").find((t=>t.startsWith(e+"=")))?.split("=")[1]}set(e,t="",r=10){let n="";if(r){let e=new Date;e.setTime(e.getTime()+24*r*60*60*1e3),n="; expires="+e.toUTCString()}return document.cookie=`${e}=${t}${n}"; path=/; secure; SameSite=Lax"`,this}remove(e){return document.cookie=`${e}=; Max-Age=0; path=/;`,this}clearAll(){let e=document.cookie.split(";");for(let t=0;t<e.length;t++){let r=e[t],n=r.indexOf("="),i=n>-1?r.substr(0,n):r;this.remove(i)}}},Salla.log=Salla.logger.log,Salla.money=Salla.helpers.money,Salla.url=Salla.helpers.url,Salla.versions={base:"[VI]{version}[/VI]"};var y=Salla;export{y as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/helpers/numbers.js","../../src/helpers/url.js","../../src/helpers/index.js","../../src/logger.js","../../src/storage.js","../../src/index.js","../../src/config.js","../../src/event.js","../../src/cookie.js"],"sourcesContent":["/**\n * @param num\n * @param {boolean} isToEnglish\n * @return {string}\n */\nexport function number(num, isToEnglish = false) {\n num = num + \"\";//make sure that number will be converted to string;\n isToEnglish = isToEnglish || !Salla.config.get('store.settings.arabic_numbers_enabled');\n let ar = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n let en = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n let find = isToEnglish ? ar : en;\n let replace = isToEnglish ? en : ar;\n let regex;\n for (let i = 0; i < find.length; i++) {\n regex = new RegExp(find[i], \"g\");\n num = num.replace(regex, replace[i]);\n }\n return num;\n}\n\n/**\n * when need to get digit's only from string \"Jamal12Hi\" => 12, or \"١٢٣\" => 123\n * @param {string} num\n * @return {string}\n */\nexport function digitsOnly(num) {\n return number(num, true).replace(/[^0-9.]/g, '')\n .replace('..', '.')\n .rtrim('.'); // without this: `Salla.helpers.digitsOnly('١٬٦٠٠ ر.س')` => `1600.`\n}\n\n/**\n * @param {HTMLInputElement|string} input - selector or input object\n * @param {boolean} is_decimal\n * @return {string|*|void}\n */\nexport function inputDigitsOnly(input, is_decimal = false) {\n if (typeof input == 'string') {\n return document.querySelectorAll(input).forEach(el => inputDigitsOnly(el, is_decimal));\n }\n if (!input) {\n Salla.logger.warn('Can\\'t find Object With Id: ' + input);\n return;\n }\n let new_val = Salla.helpers.digitsOnly(input.value);\n\n if (input.min && new_val < input.min) {\n return input.value = input.min;\n }\n if (input.max && new_val > input.max) {\n return input.value = input.max;\n }\n if (input.maxLength >= 1 && new_val.toString().length > input.maxLength) {\n return input.value = new_val.toString().substring(0, input.maxLength);\n }\n\n return input.value = (is_decimal || input.dataset.hasOwnProperty('digitsWithDecimal'))\n ? getOnlyDecimal(new_val)\n : new_val.replace(/\\D/g, '');\n}\n\nexport function getOnlyDecimal(value) {\n let dotsCount = (value.match(/\\./g) || []).length;\n if (!dotsCount || dotsCount === 1) {\n return value;\n }\n\n // if there is more than one dotes, remove the last dot.\n // Ex: 123.545.66 => 123.54566\n return getOnlyDecimal(value.replace(/\\.(.+)\\./g, '.$1'));\n}\n\n/**\n * @param {string|number|{amount: number,currency: string}} money\n * @return string\n */\nexport function money(money) {\n let currency = Salla.config.currency(money?.currency).symbol;\n money = typeof money === 'object' ? money.amount : money;\n return number(money) + ' ' + currency;\n}","export function is_full_url(url) {\n return `${url}`.startsWith('https://') || `${url}`.startsWith('http://');\n}\n\n/**\n * @param {string } url\n * @return string\n */\nexport function get(url) {\n if (is_full_url(url)) {\n return url;\n }\n return is_full_url(url)\n ? url\n : (\n Salla.config.get(\"store.url\", window.location.href.split(\"/\").slice(0, -1).join(\"/\")).rtrim(\"/\") +\n \"/\" +\n url?.ltrim(\"/\")\n );\n}\n\nexport function addParamToUrl(key, value) {\n if (!value || !key) {\n return window.location.href;\n }\n let regex = new RegExp(\"([?&])\" + key + \"=[^&]+[&]?\", \"g\");\n let url = window.location.href\n .replace(regex, \"$1\") //remove old one\n .split('#')[0]//remove any hash values ex 'https://my_site.test/brands#brand-section-1'\n .replace(/&$|\\?$/, \"\");// remove the `?` or `&` if it's the last char\n if (url.includes(\"?\")) {\n url += \"&\";\n } else {\n //avoid cases like this: 'https://my_store.test/ar?test=hi'\n url += (url.endsWith('/') ? \"\" : \"/\") + \"?\";\n }\n\n return (url + key + \"=\" + encodeURIComponent(value)).replace(/&$|\\?$/, \"\");\n}\n\n//this will get it without username if it's salla domain ex: Salla.sa/test will ignore test\nexport function baseUrl(path) {\n return window.location.origin + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function asset(path) {\n return is_full_url(path)\n ? path\n : baseUrl(\"themes/\" + Salla.config.get(\"theme.name\") + \"/\" + path?.ltrim(\"/\"));\n}\n\nexport function cdn(path) {\n return \"https://cdn.salla.network/\" + path?.ltrim(\"/\");\n}\n\n/**\n * Return url for api\n * @example Salla.url.api('test') => https://my_store.test/api/v1/test\n * @param path\n * @return {string}\n */\nexport function api(path) {\n return Salla.config.get(\"store.api\", get(\"\"))?.rtrim(\"/\") + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function is_page(pageName) {\n return pageName && Salla.config.get(\"page.slug\") === pageName;\n}\n\nexport function is_placeholder(url) {\n return asset(salla.config.get('theme.settings.placeholder')) === asset(url);\n}","import {digitsOnly, inputDigitsOnly, money, number} from \"./numbers\";\nimport get from \"lodash/get\";\nimport * as url from \"./url\";\n\n/**\n * To use it, you need some moves:\n * 1- First : you should have global variable:`let my_debounce;`\n * 2- Next : make your own function: `function my_debounce_fn(callback,...data){...}`\n * 3- Next : in your method, check if it's not existed yet, use this helper method to create it: `if(!my_debounce){my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500)}`\n * 4- Next : then delay the passed callback: `my_debounce(callback, ...data);`\n * 5- Finally : use it: `my_debounce(() =>{...yourRepeatableLogic})`\n * will be something like:\n *\n * ```\n * let my_debounce;\n * function my_debounce_fn(callback,...data){\n * if(!my_debounce){\n * //inline method\n * my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500);\n * }\n * return my_debounce(callback, ...data);\n * }\n * // use it like:\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 1');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 2');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 3');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 4');\n * //output=> `hello there - 4`\n * ```\n * 😎Or just use Salla appHelpers:`app.debounce((my_data)=>Salla.log(my_data), 'hello there - *')`\n *\n * @param fn\n * @param delay\n * @return {function(...[*]): Promise<unknown>}\n */\nfunction debounce(fn, delay) {\n delay = delay || 100;\n let resolves = [];\n let timer;\n return function (...args) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n let result = fn(...args);\n resolves.forEach((r) => r(result));\n resolves = [];\n }, delay);\n return new Promise((r) => resolves.push(r));\n };\n}\n\n/**\n * Use It When You want to grab data from input names with brackets Ex.\n * <input name=\"products[0][id]\" value...>\n * <input name=\"products[0][name]\" value...>\n * <input name=\"products[1][id]\" value...>\n * <input name=\"products[1][name]\" value...>\n * will be like: {products:[{id:.., name:..},{id:.., name:..}]}\n * @param name\n * @param value\n * @param dataset\n * @return {{name, value}|{name, value: (*|[*, *]|[string, *]|{}|[*])}}\n */\nfunction getInputDataWithName(name, value, dataset = {}) {\n if (name.includes(\"[\")) {\n let nameLevels = name.split(\"]\").join(\"\").split(\"[\");\n return {name: nameLevels[0], value: getLeveledData(nameLevels.slice(1), value, dataset[nameLevels[0]])};\n }\n return {name: name, value: value};\n}\n\n/**\n * in case input name is array for example \"jamal[4655]\" let's fix it\n * This Helper method to get suitable array data, Ex.\n * jamal[]=1\n * jamal[]=2\n * final result will be: {jamal:[1,2]}\n *\n * @param {String[]} nameLevels\n * @param {string|mixed} value\n * @param {{}|undefined} existedData\n * @return {*[]|*|(string|*)[]|{}}\n */\nfunction getLeveledData(nameLevels, value, existedData) {\n let currentName = nameLevels[0];\n\n //it's an array, so add value ass array\n if (existedData && nameLevels.length == 0) {\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n //todo::handle in case it's object\n return [existedData, value];\n }\n\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n if (typeof existedData === \"string\") {\n return [existedData, value];\n }\n\n //it's nested data\n if (existedData) {\n existedData[currentName] = getLeveledData(nameLevels.slice(1), value, existedData[currentName]);\n return existedData;\n }\n\n if (currentName) {\n return {[currentName]: getLeveledData(nameLevels.slice(1), value)};\n }\n\n //handling \"[]\" without name\n return currentName === \"\" ? [value] : value;\n}\n\n/*\nwindow.onbeforeunload = function (event) {\n Salla.document.event.leaving(event);\n if (!Salla.config.get(\"canLeave\")) {\n event.preventDefault();\n return false;\n }\n};\n*/\nexport function setNested(object, key, value) {\n let schema = object;\n let keys = key.split(\".\");\n let len = keys.length;\n for (let i = 0; i < len - 1; i++) {\n let elem = keys[i];\n if (!schema[elem]) schema[elem] = {};\n schema = schema[elem];\n }\n\n schema[keys[len - 1]] = value;\n return object;\n}\n\nexport function getNested(object, key, default_) {\n let data = get(object, key);\n return data !== undefined ? data : default_;\n}\n\n/**\n * @type {{debounce: (function(*, *=): function(...[*]): Promise<unknown>), inputData: ((function(*=, *=, *): ({name, value}|{name, value: (*|*[]|(string|*)[]|{})}))|*), digitsOnly: ((function(*=, *=): (undefined|*))|*)}}\n */\nexport default {\n // Numbers helpers\n digitsOnly : digitsOnly,\n inputDigitsOnly: inputDigitsOnly,\n number : number,\n money : money,\n\n // Nested objects helpers\n setNested: setNested,\n getNested: getNested,\n inputData: getInputDataWithName,\n\n // Url helpers\n url : url,\n addParamToUrl: url.addParamToUrl,\n\n // other\n debounce: debounce,\n};\n","\"use strict\";\n/**\n * A logger to help us to use Salla.logger.log like console.log\n *\n * @namespace Salla.logger\n *\n * @credits @Ammar Hasan\n * @see https://stackoverflow.com/a/21856736\n *\n */\nexport default (function (c) {\n \"use strict\";\n\n let proxy = {\n log: function (a, type) {\n if (!c) {\n return; /* return or call your custom function here */\n }\n\n if(!salla.config.isDebug()){\n return;\n }\n\n // let's force trace for all logs when the debug is trace level\n if (salla.config.get('debug') === 'trace') {\n type = 'trace';\n }\n\n let colorableTypes={\n event:'#CFF680',\n backend:'#7b68ee'\n };\n\n let l = c.log,\n f = type === undefined ? l : (this.__dict__[type] || l);\n\n let style = ['%cTwilight', 'color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;'];\n let color=colorableTypes[type];\n if (color) {\n style[0] += '%c' + type[0].toUpperCase() + type.substring(1);\n style.push(`margin-left: 5px;color: ${color};font-weight:bold; border:1px solid ${color}; padding: 2px 6px; border-radius: 5px;`)\n }\n\n f.call(c, ...style.concat(...a))\n },\n __dict__: {\n \"trace\": c.trace,\n \"debug\": c.debug,\n \"info\": c.info,\n \"warn\": c.warn,\n \"error\": c.error\n }\n };\n\n return {\n event: function () {\n proxy.log(arguments, \"event\");\n },\n trace: function () {\n proxy.log(arguments, \"trace\");\n },\n debug: function () {\n proxy.log(arguments, \"debug\");\n },\n info: function () {\n proxy.log(arguments, \"info\");\n },\n warn: function () {\n proxy.log(arguments, \"warn\");\n },\n error: function () {\n proxy.log(arguments, \"error\");\n },\n log: function () {\n proxy.log(arguments, undefined);\n },\n //use this to pass messages from backEnd, no need to add documentations, because it will no passed in production\n backend: function () {\n proxy.log(arguments, \"backend\");\n },\n //this for internal usage to pass multi logs using one function, no need to add it to documentation @see \\Salla\\Core\\Traits\\WithStageLogger::debug\n logs:function (logs) {\n [logs].flat().forEach(logData => logData && proxy.log([logData].flat(), 'backend'));\n }\n };\n}(console))\n","import createStore from \"store/src/store-engine\"\nimport localStorage from \"store/storages/localStorage\"\nimport sessionStorage from \"store/storages/sessionStorage\"\nimport cookieStorage from \"store/storages/cookieStorage\"\nimport memoryStorage from \"store/storages/memoryStorage\"\n\nconst localStore = createStore.createStore([\n localStorage,\n sessionStorage,\n cookieStorage,\n memoryStorage,\n], [])\n\n/**\n * @namespace Salla.storage\n */\nexport default class Storage {\n constructor() {\n Salla.event.on(\"storage::item.remove\", (key) => this.remove(key));\n Salla.event.on(\"storage::item.set\", (key, value) => this.set(key, value));\n this.store = localStore;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n let parentObject = {[firstKey]: this.store.get(firstKey)};\n parentObject = Salla.helpers.setNested(parentObject, key, value);\n return this.store.set(firstKey, parentObject[firstKey]);\n }\n return this.store.set(key, value);\n }\n\n remove(key) {\n return this.store.remove(key);\n }\n\n clearAll() {\n return this.store.clearAll();\n }\n\n get(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n return Salla.helpers.getNested({[firstKey]: this.store.get(firstKey)}, key);\n }\n return this.store.get(key, value);\n }\n}\n","\"use strict\";\n\nif (typeof global === 'undefined') {\n window.salla = window.salla || window.Salla || {};\n window.Salla = window.salla;\n} else {\n global.salla = global.salla || global.Salla || {};\n global.Salla = global.salla;\n}\n\n// loading helpers object and link it to salla\nimport Helpers from \"./helpers\"\nimport Logger from \"./logger\"\nimport Config from \"./config\"\nimport Emitter from \"./event\"\nimport Storage from \"./storage\"\nimport Cookie from \"./cookie\"\n\nSalla.status = 'base';\n// const Salla = {};\nSalla.config = new Config();\nSalla.logger = Logger;\nSalla.event = new Emitter();\n\nSalla.storage = new Storage();\nSalla.cookie = new Cookie();\nSalla.helpers = Helpers;\n\n// alias\nSalla.log = Salla.logger.log;\nSalla.money = Salla.helpers.money;\nSalla.url = Salla.helpers.url;\nSalla.versions = {\n base: '[VI]{version}[/VI]'\n};\n\nexport default Salla","/**\n * @namespace Salla.config\n *\n * @property {any} properties_\n */\nexport default class Config {\n constructor(properties = {}, default_properties = {}) {\n this.default_properties = default_properties;\n this.properties_ = {...this.default_properties, ...properties};\n }\n\n merge(config) {\n Object.assign(this.properties_, config);\n\n this.properties_.store = {...this.default_properties.store, ...this.properties_.store};\n\n return this;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n Salla.helpers.setNested(this.properties_, key, value);\n return this;\n }\n this.properties_[key] = value;\n return this;\n }\n\n /**\n * @param {string} key\n * @param {null|any} default_\n * @return {any}\n */\n get(key, default_ = null) {\n if (key.includes(\".\")) {\n return Salla.helpers.getNested(this.properties_, key, default_);\n }\n\n return this.properties_.hasOwnProperty(key) ? this.properties_[key] || default_ : default_ || undefined;\n }\n\n all() {\n return this.properties_;\n }\n\n isDebug() {\n return this.get('debug') || Salla.storage.get('debug');\n }\n}\n","import EventEmitter from \"eventemitter2\";\n\n/**\n * @namespace Salla.event\n *\n * @property {string} delimiter\n * @property {array} loggableEvents - log errors or important events.\n */\nexport default class Emitter extends EventEmitter {\n constructor() {\n let delimiter = \"::\";\n super({\n wildcard : true,\n delimiter : delimiter,\n newListener : false,\n removeListener : false,\n maxListeners : 10,\n verboseMemoryLeak: false,\n ignoreErrors : false,\n });\n this.delimiter = delimiter;\n\n if (typeof document !== \"undefined\") {\n this.body = document.querySelector(\"body\");\n }\n\n this.logableEvents = [\"cart::item.added.failed\", \"cart::item.deleted.failed\"];\n this.ingoreLogEvents = [\n \"document::click\",\n \"document::keyup\",\n \"document::change\",\n //'document::submit',\n ];\n\n this.noneFireableActions = [\"document.request\"];\n }\n\n /**\n * @param {string} event_name\n * @param data\n *\n * @deprecated , legacy code, use dispatch() instead\n */\n createAndDispatch(event_name, ...data) {\n this.dispatch(event_name, ...data);\n }\n\n emit(event_name, ...data) {\n /**\n * if the event, is api/event method, call it,\n * ex: cart::quick.add call Salla.api.cart.quickAdd(...data)\n * we don't used Salla.call(actionName)(...data), to avoid losing this scope in our apis.\n *\n * @deprecated don't use it anymore\n */\n let actionName = event_name.replace(\"::\", \".\");\n if (\n !this.noneFireableActions.includes(actionName) &&\n typeof Salla.call !== \"undefined\" &&\n typeof Salla.call(actionName) === \"function\"\n ) {\n Salla.log(`'Salla.${actionName}(...)' triggered using event '${event_name}'`);\n actionName = actionName.split(\".\"); //['cart','addItem']\n //when we are passing event from back end using `twilight()->addEvent('eventName', param1, param2, param3)`, here we will pass them back as variables\n if (Array.isArray(data[0])) {\n data = data[0];\n }\n salla[actionName[0]][actionName[1]](...data);\n return;\n }\n\n\n super.emit(event_name, ...data);\n this.trackEvents(event_name, ...data);\n }\n\n emitAsync(event_name, ...data) {\n //to make sure that data object will not be affected by track process\n let result = super.emitAsync(event_name, ...data);\n try {\n this.trackEvents(event_name, ...data);\n } catch (e) {\n salla.logger.warn(`error on tracking event (${event_name})`, data, e);\n }\n return result;\n }\n\n trackEvents(event_name, ...data){\n // let's send the event to data layer\n if (typeof window !== \"undefined\") {\n window.dataLayer = window.dataLayer || [];\n /**\n * data is coming as an array like this:\n * [{\"services\": {\"intercom\": {\"app_id\": \"***\"}}}]\n * we will merge it into one object like this:\n * {event: event_name, \"services\": {\"intercom\": {\"app_id\": \"***\"}}}\n */\n let dataLayerObject = {event: event_name};\n data.map(item => typeof item === 'object' && (dataLayerObject = {...dataLayerObject, ...item}));\n window.dataLayer.push(dataLayerObject);\n }\n\n //if there is need to log errors, or events, lets do it here.\n if (Salla.logger && !this.ingoreLogEvents.includes(event_name)) {\n Salla.logger.event(event_name, ...data);\n }\n\n this.dispatchMobileEvent(event_name, {...data.values()});\n }\n /**\n * Fire Event with data\n *\n * @param {string} event_name - action name like `cart::addItem` or event name like `cart::item.added`\n * @param {any|undefined} data\n * @data {{payload}} data\n */\n dispatch(event_name, ...data) {\n return this.emit(event_name, ...data);\n }\n\n /**\n * Fire multi events using object of events\n *\n * @param {Object.<string, *>} events\n */\n dispatchEvents(events) {\n if (!events || typeof events !== \"object\") {\n Salla.log(\"No Events To Dispatch!\", events);\n return;\n }\n\n for (const [event_name, payload] of Object.entries(events)) {\n this.dispatch(event_name, payload);\n }\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addEventListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for this.addListener\n * @param {string} eventName\n * @param {function} callback\n */\n listen(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Register Global listener will allow you to track all events in salla,\n * all Salla events will push to it.\n *\n * @param {string} name\n * @param {function} callback\n * @deprecated use onAny, it maybe used in the apps\n */\n registerGlobalListener(name, callback) {\n return this.onAny(callback);\n }\n\n /**\n * This help to push an event to mobile app.\n *\n * @param eventName\n * @param details\n * @returns {string}\n */\n dispatchMobileEvent(eventName, details = {}) {\n if (\n typeof window === \"undefined\" ||\n !window.dataLayer ||\n !dataLayer[0] ||\n !dataLayer[0].page ||\n !dataLayer[0].page.mobileApp\n ) {\n return \"\";\n }\n\n if (window.webkit) {\n try {\n window.webkit.messageHandlers.callbackHandler.postMessage(\n JSON.stringify({\n event : eventName,\n details: details,\n })\n );\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n return;\n }\n\n if (Android) {\n try {\n Android.customEventWithData(eventName, JSON.stringify({details: details}));\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n }\n }\n}\n","/**\n * @namespace Salla.cookie\n */\nexport default class Cookie {\n constructor() {\n Salla.event.on(\"cookies::remove\", (key) => this.remove(key));\n Salla.event.on(\"cookies::add\", (key, value) => this.set(key, value));\n }\n\n get(key) {\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(key + \"=\"))\n ?.split(\"=\")[1];\n }\n\n set(key, value = \"\", days = 10) {\n let expires = \"\";\n if (days) {\n let date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = \"; expires=\" + date.toUTCString();\n }\n document.cookie = `${key}=${value}${expires}\"; path=/; secure; SameSite=Lax\"`;\n return this;\n }\n\n remove(key) {\n document.cookie = `${key}=; Max-Age=0; path=/;`;\n return this;\n }\n\n clearAll() {\n let cookies = document.cookie.split(\";\");\n\n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n let eqPos = cookie.indexOf(\"=\");\n let name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n this.remove(name);\n }\n }\n}\n"],"names":["number","num","isToEnglish","regex","ar","en","find","Salla","config","get","replace","i","length","RegExp","getOnlyDecimal","value","dotsCount","match","is_full_url","url","startsWith","window","location","href","split","slice","join","rtrim","ltrim","addParamToUrl","key","includes","endsWith","encodeURIComponent","baseUrl","path","origin","asset","getLeveledData","nameLevels","existedData","currentName","Array","isArray","push","Helpers","digitsOnly","inputDigitsOnly","input","is_decimal","document","querySelectorAll","forEach","el","logger","warn","new_val","helpers","min","max","maxLength","toString","substring","dataset","hasOwnProperty","money","currency","symbol","amount","setNested","object","schema","keys","len","elem","getNested","default_","data","undefined","inputData","name","pageName","salla","debounce","fn","delay","timer","resolves","args","clearTimeout","setTimeout","result","r","Promise","Logger","c","proxy","log","a","type","isDebug","l","f","this","__dict__","style","color","event","backend","toUpperCase","call","concat","trace","debug","info","error","arguments","logs","flat","logData","console","localStore","createStore","localStorage","sessionStorage","cookieStorage","memoryStorage","global","status","constructor","properties","default_properties","properties_","merge","Object","assign","store","set","all","storage","EventEmitter","super","wildcard","delimiter","newListener","removeListener","maxListeners","verboseMemoryLeak","ignoreErrors","body","querySelector","logableEvents","ingoreLogEvents","noneFireableActions","createAndDispatch","event_name","dispatch","emit","actionName","trackEvents","emitAsync","e","dataLayer","dataLayerObject","map","item","dispatchMobileEvent","values","dispatchEvents","events","payload","entries","addListener","eventName","callback","on","addEventListener","listen","registerGlobalListener","onAny","details","page","mobileApp","webkit","messageHandlers","callbackHandler","postMessage","JSON","stringify","err","Android","customEventWithData","remove","firstKey","parentObject","clearAll","cookie","row","days","expires","date","Date","setTime","getTime","toUTCString","cookies","eqPos","indexOf","substr","versions","base","Salla$1"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/helpers/numbers.js","../../src/helpers/url.js","../../src/helpers/index.js","../../src/helpers/string.js","../../src/logger.js","../../src/storage.js","../../src/index.js","../../src/config.js","../../src/event.js","../../src/cookie.js"],"sourcesContent":["/**\n * @param num\n * @param {boolean} isToEnglish\n * @return {string}\n */\nexport function number(num, isToEnglish = false) {\n num = num + \"\";//make sure that number will be converted to string;\n isToEnglish = isToEnglish || !Salla.config.get('store.settings.arabic_numbers_enabled');\n let ar = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n let en = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n let find = isToEnglish ? ar : en;\n let replace = isToEnglish ? en : ar;\n let regex;\n for (let i = 0; i < find.length; i++) {\n regex = new RegExp(find[i], \"g\");\n num = num.replace(regex, replace[i]);\n }\n return num;\n}\n\n/**\n * when need to get digit's only from string \"Jamal12Hi\" => 12, or \"١٢٣\" => 123\n * @param {string} num\n * @return {string}\n */\nexport function digitsOnly(num) {\n return number(num, true).replace(/[^0-9.]/g, '')\n .replace('..', '.')\n .rtrim('.'); // without this: `Salla.helpers.digitsOnly('١٬٦٠٠ ر.س')` => `1600.`\n}\n\n/**\n * @param {HTMLInputElement|string} input - selector or input object\n * @param {boolean} is_decimal\n * @return {string|*|void}\n */\nexport function inputDigitsOnly(input, is_decimal = false) {\n if (typeof input == 'string') {\n return document.querySelectorAll(input).forEach(el => inputDigitsOnly(el, is_decimal));\n }\n if (!input) {\n Salla.logger.warn('Can\\'t find Object With Id: ' + input);\n return;\n }\n let new_val = Salla.helpers.digitsOnly(input.value);\n\n if (input.min && new_val < parseInt(input.min)) {\n return input.value = input.min;\n }\n if (input.max && new_val > parseInt(input.max)) {\n return input.value = input.max;\n }\n if (input.maxLength >= 1 && new_val.toString().length > input.maxLength) {\n return input.value = new_val.toString().substring(0, input.maxLength);\n }\n\n return input.value = (is_decimal || input.dataset.hasOwnProperty('digitsWithDecimal'))\n ? getOnlyDecimal(new_val)\n : new_val.replace(/\\D/g, '');\n}\n\nexport function getOnlyDecimal(value) {\n let dotsCount = (`${value}`.match(/\\./g) || []).length;\n if (!dotsCount || dotsCount === 1) {\n return value;\n }\n\n // if there is more than one dotes, remove the last dot.\n // Ex: 123.545.66 => 123.54566\n return getOnlyDecimal(value.replace(/\\.(.+)\\./g, '.$1'));\n}\n\n/**\n * @param {string|number|{amount: number,currency: string}} money\n * @return string\n */\nexport function money(money) {\n let currency = Salla.config.currency(money?.currency).symbol;\n money = typeof money === 'object' ? money.amount : money;\n return number(money) + ' ' + currency;\n}","export function is_full_url(url) {\n return `${url}`.startsWith('https://') || `${url}`.startsWith('http://');\n}\n\n/**\n * @param {string } url\n * @return string\n */\nexport function base(url) {\n if (is_full_url(url)) {\n return url;\n }\n\n const { hostname } = new URL(get('/'));\n\n return 'https://' + hostname + \"/\" + url?.ltrim(\"/\");\n}\n\n/**\n * @param {string } url\n * @return string\n */\nexport function get(url) {\n if (is_full_url(url)) {\n return url;\n }\n\n let storeUrl = Salla.config.get(\"store.url\");\n\n if(!storeUrl){\n storeUrl = window.location.href.split(\"/\").slice(0, -1).join(\"/\");\n Salla.config.set('store.url', storeUrl)\n }\n\n return storeUrl.rtrim(\"/\") + \"/\" + url?.ltrim(\"/\");\n}\n\nexport function domain(url) {\n if (is_full_url(url)) {\n return url;\n }\n\n\n\n return (\n Salla.config.get(\"store.url\", window.location.href.split(\"/\").slice(0, -1).join(\"/\")).rtrim(\"/\") +\n \"/\" +\n url?.ltrim(\"/\")\n );\n}\n\nexport function addParamToUrl(key, value) {\n if (!value || !key) {\n return window.location.href;\n }\n let regex = new RegExp(\"([?&])\" + key + \"=[^&]+[&]?\", \"g\");\n let url = window.location.href\n .replace(regex, \"$1\") //remove old one\n .split('#')[0]//remove any hash values ex 'https://my_site.test/brands#brand-section-1'\n .replace(/&$|\\?$/, \"\");// remove the `?` or `&` if it's the last char\n if (url.includes(\"?\")) {\n url += \"&\";\n } else {\n //avoid cases like this: 'https://my_store.test/ar?test=hi'\n url += (url.endsWith('/') ? \"\" : \"/\") + \"?\";\n }\n\n return (url + key + \"=\" + encodeURIComponent(value)).replace(/&$|\\?$/, \"\");\n}\n\n//this will get it without username if it's salla domain ex: Salla.sa/test will ignore test\nexport function baseUrl(path) {\n return window.location.origin + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function asset(path) {\n return is_full_url(path)\n ? path\n : baseUrl(\"themes/\" + Salla.config.get(\"theme.name\") + \"/\" + path?.ltrim(\"/\"));\n}\n\nexport function cdn(path) {\n return \"https://cdn.salla.network/\" + path?.ltrim(\"/\");\n}\n\n/**\n * Return url for api\n * @example Salla.url.api('test') => https://my_store.test/api/v1/test\n * @param path\n * @return {string}\n */\nexport function api(path) {\n return Salla.config.get(\"store.api\", get(\"\"))?.rtrim(\"/\") + \"/\" + path?.ltrim(\"/\");\n}\n\nexport function is_page(pageName) {\n return pageName && Salla.config.get(\"page.slug\") === pageName;\n}\n\nexport function is_placeholder(url) {\n return asset(salla.config.get('theme.settings.placeholder')) === asset(url);\n}","import { digitsOnly, inputDigitsOnly, money, number } from \"./numbers\";\nimport './string';\nimport get from \"lodash/get\";\nimport * as url from \"./url\";\n\n/**\n * To use it, you need some moves:\n * 1- First : you should have global variable:`let my_debounce;`\n * 2- Next : make your own function: `function my_debounce_fn(callback,...data){...}`\n * 3- Next : in your method, check if it's not existed yet, use this helper method to create it: `if(!my_debounce){my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500)}`\n * 4- Next : then delay the passed callback: `my_debounce(callback, ...data);`\n * 5- Finally : use it: `my_debounce(() =>{...yourRepeatableLogic})`\n * will be something like:\n *\n * ```\n * let my_debounce;\n * function my_debounce_fn(callback,...data){\n * if(!my_debounce){\n * //inline method\n * my_debounce=Salla.helpers.debounce((fn, ...inner_data) => fn(...inner_data), 500);\n * }\n * return my_debounce(callback, ...data);\n * }\n * // use it like:\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 1');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 2');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 3');\n * my_debounce_fn((my_data)=>Salla.log(my_data), 'hello there - 4');\n * //output=> `hello there - 4`\n * ```\n * 😎Or just use Salla appHelpers:`app.debounce((my_data)=>Salla.log(my_data), 'hello there - *')`\n *\n * @param fn\n * @param delay\n * @return {function(...[*]): Promise<unknown>}\n */\nfunction debounce(fn, delay) {\n delay = delay || 100;\n let resolves = [];\n let timer;\n return function (...args) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n let result = fn(...args);\n resolves.forEach((r) => r(result));\n resolves = [];\n }, delay);\n return new Promise((r) => resolves.push(r));\n };\n}\n\n/**\n * Use It When You want to grab data from input names with brackets Ex.\n * <input name=\"products[0][id]\" value...>\n * <input name=\"products[0][name]\" value...>\n * <input name=\"products[1][id]\" value...>\n * <input name=\"products[1][name]\" value...>\n * will be like: {products:[{id:.., name:..},{id:.., name:..}]}\n * @param name\n * @param value\n * @param dataset\n * @return {{name, value}|{name, value: (*|[*, *]|[string, *]|{}|[*])}}\n */\nfunction getInputDataWithName(name, value, dataset = {}) {\n if (name.includes(\"[\")) {\n let nameLevels = name.split(\"]\").join(\"\").split(\"[\");\n return { name: nameLevels[0], value: getLeveledData(nameLevels.slice(1), value, dataset[nameLevels[0]]) };\n }\n return { name: name, value: value };\n}\n\n/**\n * in case input name is array for example \"jamal[4655]\" let's fix it\n * This Helper method to get suitable array data, Ex.\n * jamal[]=1\n * jamal[]=2\n * final result will be: {jamal:[1,2]}\n *\n * @param {String[]} nameLevels\n * @param {string|mixed} value\n * @param {{}|undefined} existedData\n * @return {*[]|*|(string|*)[]|{}}\n */\nfunction getLeveledData(nameLevels, value, existedData) {\n // TODO: typo, rename it to `getLabeledData`\n let currentName = nameLevels[0];\n\n //it's an array, so add value ass array\n if (existedData && nameLevels.length == 0) {\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n //todo::handle in case it's object\n return [existedData, value];\n }\n\n if (Array.isArray(existedData)) {\n existedData.push(value);\n return existedData;\n }\n\n if (typeof existedData === \"string\") {\n return [existedData, value];\n }\n\n //it's nested data\n if (existedData) {\n existedData[currentName] = getLeveledData(nameLevels.slice(1), value, existedData[currentName]);\n return existedData;\n }\n\n if (currentName) {\n return { [currentName]: getLeveledData(nameLevels.slice(1), value) };\n }\n\n //handling \"[]\" without name\n return currentName === \"\" ? [value] : value;\n}\n\n/*\nwindow.onbeforeunload = function (event) {\n Salla.document.event.leaving(event);\n if (!Salla.config.get(\"canLeave\")) {\n event.preventDefault();\n return false;\n }\n};\n*/\nexport function setNested(object, key, value) {\n let schema = object;\n let keys = key.split(\".\");\n let len = keys.length;\n for (let i = 0; i < len - 1; i++) {\n let elem = keys[i];\n if (!schema[elem]) schema[elem] = {};\n schema = schema[elem];\n }\n\n schema[keys[len - 1]] = value;\n return object;\n}\n\nexport function getNested(object, key, default_) {\n let data = get(object, key);\n return data !== undefined ? data : default_;\n}\n\n/**\n * @type {{debounce: (function(*, *=): function(...[*]): Promise<unknown>), inputData: ((function(*=, *=, *): ({name, value}|{name, value: (*|*[]|(string|*)[]|{})}))|*), digitsOnly: ((function(*=, *=): (undefined|*))|*)}}\n */\nexport default {\n // Numbers helpers\n digitsOnly: digitsOnly,\n inputDigitsOnly: inputDigitsOnly,\n number: number,\n money: money,\n\n // Nested objects helpers\n setNested: setNested,\n getNested: getNested,\n inputData: getInputDataWithName,\n\n // Url helpers\n url : url,\n addParamToUrl: url.addParamToUrl,\n\n // other\n debounce: debounce,\n};\n","// todo:: cover these helpers into types\nString.prototype.toStudlyCase = function () {\n return this.trim() //remove first spaces\n .replace(/([^a-zA-Z\\d].)/g, function (t) {//get\n return t.toUpperCase()\n .replace(/[^a-zA-Z\\d]/g, '');\n });\n};\n\nString.prototype.toDatasetName = function () {\n return this.startsWith('data-')\n ? this.substr(5).toStudlyCase()\n : this.toStudlyCase();\n};\n\n// TODO: Check the importance of this method. Or add mode detail information.\n// helper method to get string as selector, by adding (#) to the beginning if it's not start with one.\nString.prototype.toSelector = function () {\n // todo:: add html tags if it's needed.\n return this.trim().startsWith(\".\") || this.trim().startsWith(\"#\")\n ? this\n : \"#\" + this;\n};\n\nString.prototype.replaceArray = function (find, replace) {\n var replaceString = this;\n var regex;\n for (var i = 0; i < find.length; i++) {\n regex = new RegExp(find[i], \"g\");\n replaceString = replaceString.replace(regex, replace[i]);\n }\n return replaceString;\n};\n\nString.prototype.rtrim = function (s) {\n if (s === undefined)\n s = '\\\\s';\n return this.replace(new RegExp(\"[\" + s + \"]*$\"), '');\n};\n\nString.prototype.ltrim = function (s) {\n if (s === undefined)\n s = '\\\\s';\n return this.replace(new RegExp(\"^[\" + s + \"]*\"), '');\n};\n\nString.prototype.digitsOnly = function () {\n return Salla.helpers.digitsOnly(this);\n};","\"use strict\";\n/**\n * A logger to help us to use Salla.logger.log like console.log\n *\n * @namespace Salla.logger\n *\n * @credits @Ammar Hasan\n * @see https://stackoverflow.com/a/21856736\n *\n */\nexport default (function (c) {\n \"use strict\";\n \n let proxy = {\n log: function (a, type) {\n if (!c) {\n return; /* return or call your custom function here */\n }\n\n if (!salla.config.isDebug()) {\n return;\n }\n\n // let's force trace for all logs when the debug is trace level\n if (salla.config.get('debug') === 'trace') {\n type = 'trace';\n }\n let colorableTypes = {\n event: '#CFF680',\n backend: '#7b68ee'\n };\n\n let l = c.log,\n f = type === undefined ? l : (this.__dict__[type] || l);\n\n let style = ['%cTwilight', 'color: #5cd5c4;font-weight:bold; border:1px solid #5cd5c4; padding: 2px 6px; border-radius: 5px;'];\n let color = colorableTypes[type];\n if (color) {\n style[0] += '%c' + type[0].toUpperCase() + type.substring(1);\n style.push(`margin-left: 5px;color: ${color};font-weight:bold; border:1px solid ${color}; padding: 2px 6px; border-radius: 5px;`)\n }\n\n f.call(c, ...style.concat(...a))\n },\n __dict__: {\n \"trace\": c.trace,\n \"debug\": c.debug,\n \"info\": c.info,\n \"warn\": c.warn,\n \"error\": c.error\n }\n };\n\n return {\n event: function () {\n proxy.log(arguments, \"event\");\n },\n trace: function () {\n proxy.log(arguments, \"trace\");\n },\n debug: function () {\n proxy.log(arguments, \"debug\");\n },\n info: function () {\n proxy.log(arguments, \"info\");\n },\n warn: function () {\n proxy.log(arguments, \"warn\");\n },\n error: function () {\n proxy.log(arguments, \"error\");\n },\n log: function () {\n proxy.log(arguments, undefined);\n },\n //use this to pass messages from backEnd, no need to add documentations, because it will no passed in production\n backend: function () {\n proxy.log(arguments, \"backend\");\n },\n //this for internal usage to pass multi logs using one function, no need to add it to documentation @see \\Salla\\Core\\Traits\\WithStageLogger::debug\n logs: function (logs) {\n [logs].flat().forEach(logData => logData && proxy.log([logData].flat(), 'backend'));\n }\n };\n}(console))\n","import createStore from \"store/src/store-engine\"\nimport localStorage from \"store/storages/localStorage\"\nimport sessionStorage from \"store/storages/sessionStorage\"\nimport cookieStorage from \"store/storages/cookieStorage\"\nimport memoryStorage from \"store/storages/memoryStorage\"\n\nconst localStore = createStore.createStore([\n localStorage,\n sessionStorage,\n cookieStorage,\n memoryStorage,\n], [])\n\n/**\n * @namespace Salla.storage\n */\nexport default class Storage {\n constructor() {\n Salla.event.on(\"storage::item.remove\", (key) => this.remove(key));\n Salla.event.on(\"storage::item.set\", (key, value) => this.set(key, value));\n this.store = localStore;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n let parentObject = {[firstKey]: this.store.get(firstKey)};\n parentObject = Salla.helpers.setNested(parentObject, key, value);\n return this.store.set(firstKey, parentObject[firstKey]);\n }\n return this.store.set(key, value);\n }\n\n remove(key) {\n return this.store.remove(key);\n }\n\n clearAll() {\n return this.store.clearAll();\n }\n\n get(key, value) {\n if (key.includes(\".\")) {\n let firstKey = key.split(\".\")[0];\n return Salla.helpers.getNested({[firstKey]: this.store.get(firstKey)}, key);\n }\n return this.store.get(key, value);\n }\n}\n","\"use strict\";\n\nif (typeof window !== \"undefined\") {\n window.salla = window.salla || window.Salla || {};\n window.Salla = window.salla;\n}\nif (typeof global !== \"undefined\") {\n global.salla = global.salla || global.Salla || {};\n global.Salla = global.salla;\n}\n\n// loading helpers object and link it to salla\nimport Helpers from \"./helpers\"\nimport Logger from \"./logger\"\nimport Config from \"./config\"\nimport Emitter from \"./event\"\nimport Storage from \"./storage\"\nimport Cookie from \"./cookie\"\n\nSalla.status = 'base';\n// const Salla = {};\nSalla.config = new Config();\nSalla.logger = Logger;\nSalla.event = new Emitter();\n\nSalla.helpers = Helpers;\nSalla.storage = new Storage();\nSalla.cookie = new Cookie();\n\n// alias\nSalla.log = Salla.logger.log;\nSalla.money = Salla.helpers.money;\nSalla.url = Salla.helpers.url;\nSalla.versions = {\n base: '[VI]{version}[/VI]'\n};\n\n\nexport default Salla","/**\n * @namespace Salla.config\n *\n * @property {any} properties_\n */\nexport default class Config {\n constructor(properties = {}, default_properties = {}) {\n this.default_properties = default_properties;\n this.properties_ = { ...this.default_properties, ...properties };\n }\n\n merge(config) {\n this.properties_ = {...this.properties_, ...config};\n\n this.properties_.store = { ...this.default_properties?.store||{}, ...this.properties_.store };\n\n return this;\n }\n\n set(key, value) {\n if (key.includes(\".\")) {\n Salla.helpers.setNested(this.properties_, key, value);\n return this;\n }\n this.properties_[key] = value;\n return this;\n }\n\n /**\n * @param {string|undefined} isoCode\n * @return {Currency}\n */\n currency(isoCode){\n isoCode = isoCode || this.get('user.currency_code');\n return this.get('currencies.' + isoCode) || Object.values(this.get('currencies'))[0];\n }\n\n\n /**\n * @param {string} key\n * @param {null|any} default_\n * @return {any}\n */\n get(key, default_ = null) {\n if (key.includes(\".\")) {\n return Salla.helpers.getNested(this.properties_, key, default_);\n }\n return this.properties_.hasOwnProperty(key) ? this.properties_[key] || default_ : default_ || undefined;\n }\n\n all() {\n return this.properties_;\n }\n\n isDebug() {\n return this.get('debug') || Salla.storage.get('debug');\n }\n}\n","import EventEmitter from \"eventemitter2\";\n\n/**\n * @namespace Salla.event\n *\n * @property {string} delimiter\n * @property {array} loggableEvents - log errors or important events.\n */\nexport default class Emitter extends EventEmitter {\n constructor() {\n let delimiter = \"::\";\n super({\n wildcard: true,\n delimiter: delimiter,\n newListener: false,\n removeListener: false,\n maxListeners: 10,\n verboseMemoryLeak: false,\n ignoreErrors: false,\n });\n this.delimiter = delimiter;\n\n if (typeof document !== \"undefined\") {\n this.body = document.querySelector(\"body\");\n }\n\n this.logableEvents = [\"cart::item.added.failed\", \"cart::item.deleted.failed\"];\n this.ingoreLogEvents = [\n \"document::click\",\n \"document::keyup\",\n \"document::change\",\n //'document::submit',\n ];\n\n this.noneFireableActions = [\"document.request\"];\n }\n\n /**\n * @param {string} event_name\n * @param data\n *\n * @deprecated , legacy code, use dispatch() instead\n */\n createAndDispatch(event_name, ...data) {\n this.dispatch(event_name, ...data);\n }\n\n emit(event_name, ...data) {\n /**\n * if the event, is api/event method, call it,\n * ex: cart::quick.add call Salla.api.cart.quickAdd(...data)\n * we don't used Salla.call(actionName)(...data), to avoid losing this scope in our apis.\n *\n * @deprecated don't use it anymore\n */\n let actionName = event_name.replace(\"::\", \".\");\n if (!this.noneFireableActions.includes(actionName) && Salla.call && typeof Salla.call(actionName) === \"function\") {\n Salla.log(`'Salla.${actionName}(...)' triggered using event '${event_name}'`);\n actionName = actionName.split(\".\"); //['cart','addItem']\n //when we are passing event from back end using `twilight()->addEvent('eventName', param1, param2, param3)`, here we will pass them back as variables\n if (Array.isArray(data[0])) {\n data = data[0];\n }\n salla[actionName[0]][actionName[1]](...data);\n return;\n }\n\n\n super.emit(event_name, ...data);\n this.trackEvents(event_name, ...data);\n }\n\n emitAsync(event_name, ...data) {\n //to make sure that data object will not be affected by track process\n let result = super.emitAsync(event_name, ...data);\n try { \n this.trackEvents(event_name, ...data);\n } catch (e) {\n Salla.logger.warn(`error on tracking event (${event_name})`, data, e);\n }\n return result;\n }\n\n trackEvents(event_name, ...data){\n // let's send the event to data layer\n if (typeof window !== \"undefined\") {\n window.dataLayer = window.dataLayer || [];\n /**\n * data is coming as an array like this:\n * [{\"services\": {\"intercom\": {\"app_id\": \"***\"}}}]\n * we will merge it into one object like this:\n * {event: event_name, \"services\": {\"intercom\": {\"app_id\": \"***\"}}}\n */\n let dataLayerObject = { event: event_name };\n data.map(item => typeof item === 'object' && (dataLayerObject = { ...dataLayerObject, ...item }));\n window.dataLayer.push(dataLayerObject);\n }\n\n //if there is need to log errors, or events, lets do it here.\n if (Salla.logger && !this.ingoreLogEvents.includes(event_name)) {\n Salla.logger.event(event_name, ...data);\n }\n\n this.dispatchMobileEvent(event_name, ...data);\n }\n /**\n * Fire Event with data\n *\n * @param {string} event_name - action name like `cart::addItem` or event name like `cart::item.added`\n * @param {any|undefined} data\n * @data {{payload}} data\n */\n dispatch(event_name, ...data) {\n return this.emit(event_name, ...data);\n }\n\n /**\n * Fire multi events using object of events\n *\n * @param {Object.<string, *>} events\n */\n dispatchEvents(events) {\n if (!events) {\n Salla.log(\"No Events To Dispatch!\", events);\n return;\n }\n\n if(typeof events !== \"object\" || Array.isArray(events)){\n Salla.log(\"Events object is wrong, it should be object of {event:payload}\", events);\n return;\n }\n\n for (const [event_name, payload] of Object.entries(events)) {\n this.dispatch(event_name, payload);\n }\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for on function\n *\n * @param {string} eventName\n * @param {function} callback\n * @deprecated use on\n */\n addEventListener(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Alias for this.addListener\n * @param {string} eventName\n * @param {function} callback\n */\n listen(eventName, callback) {\n return this.on(eventName, callback);\n }\n\n /**\n * Register Global listener will allow you to track all events in salla,\n * all Salla events will push to it.\n *\n * @param {string} name\n * @param {function} callback\n * @deprecated use onAny, it maybe used in the apps\n */\n registerGlobalListener(name, callback) {\n return this.onAny(callback);\n }\n\n /**\n * This help to push an event to mobile app.\n *\n * @param eventName\n * @param details\n * @returns {string}\n */\n dispatchMobileEvent(eventName, details = {}) {\n if (\n typeof window === \"undefined\" ||\n !window.dataLayer ||\n !dataLayer[0] ||\n !dataLayer[0].page ||\n !dataLayer[0].page.mobileApp\n ) {\n return \"\";\n }\n\n if (window.webkit) {\n try {\n window.webkit.messageHandlers.callbackHandler.postMessage(\n JSON.stringify({\n event: eventName,\n details: details,\n })\n );\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n return;\n }\n\n if (typeof Android !=='undefined') {\n try {\n Android.customEventWithData(eventName, JSON.stringify({ details: details }));\n } catch (err) {\n Salla.log(err, \"The native context does not exist yet\");\n }\n }\n }\n}\n","/**\n * @namespace Salla.cookie\n */\nexport default class Cookie {\n constructor() {\n Salla.event.on(\"cookies::remove\", (key) => this.remove(key));\n Salla.event.on(\"cookies::add\", (key, value) => this.set(key, value));\n }\n\n get(key) {\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(key + \"=\"))\n ?.split(\"=\")[1];\n }\n\n set(key, value = \"\", days = 10) {\n let expires = \"\";\n if (days) {\n let date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = \"; expires=\" + date.toUTCString();\n }\n document.cookie = `${key}=${value}${expires}\"; path=/; secure; SameSite=Lax\"`;\n return this;\n }\n\n remove(key) {\n document.cookie = `${key}=; Max-Age=0; path=/;`;\n return this;\n }\n\n clearAll() {\n let cookies = document.cookie.split(\";\");\n\n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n let eqPos = cookie.indexOf(\"=\");\n let name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n this.remove(name);\n }\n }\n}\n"],"names":["number","num","isToEnglish","regex","ar","en","find","Salla","config","get","replace","i","length","RegExp","getOnlyDecimal","value","dotsCount","match","is_full_url","url","startsWith","storeUrl","window","location","href","split","slice","join","set","rtrim","ltrim","addParamToUrl","key","includes","endsWith","encodeURIComponent","baseUrl","path","origin","asset","getLeveledData","nameLevels","existedData","currentName","Array","isArray","push","String","prototype","toStudlyCase","this","trim","t","toUpperCase","toDatasetName","substr","toSelector","replaceArray","replaceString","s","undefined","digitsOnly","helpers","Helpers","inputDigitsOnly","input","is_decimal","document","querySelectorAll","forEach","el","logger","warn","new_val","min","parseInt","max","maxLength","toString","substring","dataset","hasOwnProperty","money","currency","symbol","amount","setNested","object","schema","keys","len","elem","getNested","default_","data","inputData","name","hostname","URL","pageName","salla","debounce","fn","delay","timer","resolves","args","clearTimeout","setTimeout","result","r","Promise","Logger","c","proxy","log","a","type","isDebug","l","f","__dict__","style","color","event","backend","call","concat","trace","debug","info","error","arguments","logs","flat","logData","console","localStore","createStore","localStorage","sessionStorage","cookieStorage","memoryStorage","global","status","constructor","properties","default_properties","properties_","merge","store","isoCode","Object","values","all","storage","EventEmitter","super","wildcard","delimiter","newListener","removeListener","maxListeners","verboseMemoryLeak","ignoreErrors","body","querySelector","logableEvents","ingoreLogEvents","noneFireableActions","createAndDispatch","event_name","dispatch","emit","actionName","trackEvents","emitAsync","e","dataLayer","dataLayerObject","map","item","dispatchMobileEvent","dispatchEvents","events","payload","entries","addListener","eventName","callback","on","addEventListener","listen","registerGlobalListener","onAny","details","page","mobileApp","webkit","messageHandlers","callbackHandler","postMessage","JSON","stringify","err","Android","customEventWithData","remove","firstKey","parentObject","clearAll","cookie","row","days","expires","date","Date","setTime","getTime","toUTCString","cookies","eqPos","indexOf","versions","base","Salla$1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salla.sa/base",
3
- "version": "2.11.64",
3
+ "version": "2.11.76",
4
4
  "description": "Salla Base",
5
5
  "main": "dist/cjs/",
6
6
  "module": "dist/esm/",
@@ -8,7 +8,8 @@
8
8
  "scripts": {
9
9
  "build": "npx rollup --config --preserveSymlinks=true",
10
10
  "serve": "npx rollup --watch --serve --config --preserveSymlinks=true",
11
- "watch": "npx rollup --watch --config --preserveSymlinks=true"
11
+ "watch": "npx rollup --watch --config --preserveSymlinks=true",
12
+ "test": "jest --detectOpenHandles"
12
13
  },
13
14
  "repository": {
14
15
  "type": "git",
@@ -45,14 +46,18 @@
45
46
  "@optimize-lodash/rollup-plugin": "^3.0.0",
46
47
  "@rollup/plugin-babel": "^5.3.1",
47
48
  "@rollup/plugin-commonjs": "^22.0.2",
48
- "rollup": "^2.79.0",
49
+ "jest": "^29.3.1",
50
+ "jest-environment-jsdom": "^29.3.1",
51
+ "rollup": "^2.79.1",
52
+ "rollup-jest": "^3.1.0",
49
53
  "rollup-plugin-analyzer": "^4.0.0",
50
54
  "rollup-plugin-cleaner": "^1.0.0",
51
55
  "rollup-plugin-exclude-dependencies-from-bundle": "^1.1.22",
52
56
  "rollup-plugin-node-polyfills": "^0.2.1",
53
57
  "rollup-plugin-serve": "^2.0.1",
54
58
  "rollup-plugin-terser": "^7.0.2",
55
- "rollup-plugin-version-injector": "^1.3.3"
59
+ "rollup-plugin-version-injector": "^1.3.3",
60
+ "sinon": "^15.0.1"
56
61
  },
57
- "gitHead": "647dc77a4a70adb81e5ea2f51eaa893c63ccbc75"
62
+ "gitHead": "4f4b8aa4498f131bf20300dc6f44a77f156396a1"
58
63
  }
@@ -25,6 +25,7 @@ export type PageName = 'blog.index'
25
25
 
26
26
  export interface UrlHelpers {
27
27
  asset: UrlHelper;
28
+ base: UrlHelper;
28
29
  get: UrlHelper;
29
30
  cdn: UrlHelper;
30
31
  api: UrlHelper;