@jitsu/js 1.10.0 → 1.10.1-canary.1321.20250430101335

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.
@@ -0,0 +1,1680 @@
1
+ 'use strict';
2
+
3
+ function n$2(t,e,l,n,r){for(e=e.split?e.split("."):e,n=0;n<e.length;n++)t=t?t[e[n]]:r;return t===r?l:t}
4
+
5
+ var e="undefined",o$1="object",b$3="any",m$1="*",j$1="__",F$2="undefined"!=typeof process?process:{};F$2.env&&F$2.env.NODE_ENV||"";var $$1="undefined"!=typeof document;null!=F$2.versions&&null!=F$2.versions.node;"undefined"!=typeof Deno&&void 0!==Deno.core;$$1&&"nodejs"===window.name||"undefined"!=typeof navigator&&void 0!==navigator.userAgent&&(navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom"));function M$1(n,t){return t.charAt(0)[n]()+t.slice(1)}var U$1=M$1.bind(null,"toUpperCase"),H$1=M$1.bind(null,"toLowerCase");function J$2(n){return Y$1(n)?U$1("null"):"object"==typeof n?yn(n):Object.prototype.toString.call(n).slice(8,-1)}function R$1(n,t){void 0===t&&(t=!0);var e=J$2(n);return t?H$1(e):e}function V$1(n,t){return typeof t===n}var W$1=V$1.bind(null,"function"),q$1=V$1.bind(null,"string"),I$2=V$1.bind(null,"undefined");var Q$1=V$1.bind(null,"boolean");V$1.bind(null,"symbol");function Y$1(n){return null===n}function nn(n){return "number"===R$1(n)&&!isNaN(n)}function rn(n){return "array"===R$1(n)}function on(n){if(!un(n))return !1;for(var t=n;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(n)===t}function un(n){return n&&("object"==typeof n||null!==n)}function yn(n){return W$1(n.constructor)?n.constructor.name:null}function hn(n){return n instanceof Error||q$1(n.message)&&n.constructor&&nn(n.constructor.stackTraceLimit)}function On(n,t){if("object"!=typeof t||Y$1(t))return !1;if(t instanceof n)return !0;var e=R$1(new n(""));if(hn(t))for(;t;){if(R$1(t)===e)return !0;t=Object.getPrototypeOf(t);}return !1}On.bind(null,TypeError);On.bind(null,SyntaxError);function $n(n,t){var e=n instanceof Element||n instanceof HTMLDocument;return e&&t?Tn(n,t):e}function Tn(n,t){return void 0===t&&(t=""),n&&n.nodeName===t.toUpperCase()}function _n(n){var t=[].slice.call(arguments,1);return function(){return n.apply(void 0,[].slice.call(arguments).concat(t))}}_n($n,"form");_n($n,"button");_n($n,"input");_n($n,"select");
6
+
7
+ function n$1(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch(e){return null}}function s(r){return function(e){for(var r,t=Object.create(null),o=/([^&=]+)=?([^&]*)/g;r=o.exec(e);){var a=n$1(r[1]),i=n$1(r[2]);"[]"===a.substring(a.length-2)?(t[a=a.substring(0,a.length-2)]||(t[a]=[])).push(i):t[a]=""===i||i;}for(var u in t){var c=u.split("[");c.length>1&&(m(t,c.map(function(e){return e.replace(/[?[\]\\ ]/g,"")}),t[u]),delete t[u]);}return t}(function(r){if(r){var t=r.match(/\?(.*)/);return t&&t[1]?t[1].split("#")[0]:""}return $$1&&window.location.search.substring(1)}(r))}function m(e,r,t){for(var n=r.length-1,o=0;o<n;++o){var a=r[o];if("__proto__"===a||"constructor"===a)break;a in e||(e[a]={}),e=e[a];}e[r[n]]=t;}function y$1(){for(var e="",r=0,t=4294967295*Math.random()|0;r++<36;){var n="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"[r-1],o=15&t;e+="-"==n||"4"==n?n:("x"==n?o:3&o|8).toString(16),t=r%8==0?4294967295*Math.random()|0:t>>4;}return e}
8
+
9
+ var l="global",o=j$1+"global"+j$1,n=typeof self===o$1&&self.self===self&&self||typeof global===o$1&&global.global===global&&global||void 0;function a$2(t){return n[o][t]}function f(t,e){return n[o][t]=e}function i$2(t){delete n[o][t];}function u$1(t,e,r){var l;try{if(b$2(t)){var o=window[t];l=o[e].bind(o);}}catch(t){}return l||r}n[o]||(n[o]={});var c$1={};function b$2(t){if(typeof c$1[t]!==e)return c$1[t];try{var e$1=window[t];e$1.setItem(e,e),e$1.removeItem(e);}catch(e){return c$1[t]=!1}return c$1[t]=!0}
10
+
11
+ function g$1(){return g$1=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);}return e},g$1.apply(this,arguments)}var h$1="function",v="undefined",y="@@redux/"+Math.random().toString(36),b$1=/* #__PURE__ */function(){return typeof Symbol===h$1&&Symbol.observable||"@@observable"}(),I$1=" != "+h$1;function w(e,t,n){var r;if(typeof t===h$1&&typeof n===v&&(n=t,t=void 0),typeof n!==v){if(typeof n!==h$1)throw new Error("enhancer"+I$1);return n(w)(e,t)}if(typeof e!==h$1)throw new Error("reducer"+I$1);var i=e,a=t,o=[],u=o,s=!1;function l(){u===o&&(u=o.slice());}function f(){return a}function d(e){if(typeof e!==h$1)throw new Error("Listener"+I$1);var t=!0;return l(),u.push(e),function(){if(t){t=!1,l();var n=u.indexOf(e);u.splice(n,1);}}}function p(e){if(!on(e))throw new Error("Act != obj");if(typeof e.type===v)throw new Error("ActType "+v);if(s)throw new Error("Dispatch in reducer");try{s=!0,a=i(a,e);}finally{s=!1;}for(var t=o=u,n=0;n<t.length;n++)(0, t[n])();return e}return p({type:"@@redux/INIT"}),(r={dispatch:p,subscribe:d,getState:f,replaceReducer:function(e){if(typeof e!==h$1)throw new Error("next reducer"+I$1);i=e,p({type:"@@redux/INIT"});}})[b$1]=function(){var e,t=d;return (e={subscribe:function(e){if("object"!=typeof e)throw new TypeError("Observer != obj");function n(){e.next&&e.next(f());}return n(),{unsubscribe:t(n)}}})[b$1]=function(){return this},e},r}function E$1(e,t){var n=t&&t.type;return "action "+(n&&n.toString()||"?")+"reducer "+e+" returns "+v}function P(){var e=[].slice.call(arguments);return 0===e.length?function(e){return e}:1===e.length?e[0]:e.reduce(function(e,t){return function(){return e(t.apply(void 0,[].slice.call(arguments)))}})}function S(){var e=arguments;return function(t){return function(n,r,i){var a,o=t(n,r,i),u=o.dispatch,c={getState:o.getState,dispatch:function(e){return u(e)}};return a=[].slice.call(e).map(function(e){return e(c)}),g$1({},o,{dispatch:u=P.apply(void 0,a)(o.dispatch)})}}}var N$1=j$1+"anon_id",A$1=j$1+"user_id",_=j$1+"user_traits",j="userId",k$1="anonymousId",x$1=["bootstrap","params","campaign","initializeStart","initialize","initializeEnd","ready","resetStart","reset","resetEnd","pageStart","page","pageEnd","pageAborted","trackStart","track","trackEnd","trackAborted","identifyStart","identify","identifyEnd","identifyAborted","userIdChanged","registerPlugins","enablePlugin","disablePlugin","online","offline","setItemStart","setItem","setItemEnd","setItemAborted","removeItemStart","removeItem","removeItemEnd","removeItemAborted"],T=["name","EVENTS","config","loaded"],z=x$1.reduce(function(e,t){return e[t]=t,e},{registerPluginType:function(e){return "registerPlugin:"+e},pluginReadyType:function(e){return "ready:"+e}}),M=/^utm_/,q=/^an_prop_/,V=/^an_trait_/;function C$1(e){var t=e.storage.setItem;return function(n){return function(r){return function(i){if(i.type===z.bootstrap){var a=i.params,o=i.user,u=i.persistedUser,c=i.initialUser,s=u.userId===o.userId;u.anonymousId!==o.anonymousId&&t(N$1,o.anonymousId),s||t(A$1,o.userId),c.traits&&t(_,g$1({},s&&u.traits?u.traits:{},c.traits));var l=Object.keys(i.params);if(l.length){var f=a.an_uid,d=a.an_event,p=l.reduce(function(e,t){if(t.match(M)||t.match(/^(d|g)clid/)){var n=t.replace(M,"");e.campaign["campaign"===n?"name":n]=a[t];}return t.match(q)&&(e.props[t.replace(q,"")]=a[t]),t.match(V)&&(e.traits[t.replace(V,"")]=a[t]),e},{campaign:{},props:{},traits:{}});n.dispatch(g$1({type:z.params,raw:a},p,f?{userId:f}:{})),f&&setTimeout(function(){return e.identify(f,p.traits)},0),d&&setTimeout(function(){return e.track(d,p.props)},0),Object.keys(p.campaign).length&&n.dispatch({type:z.campaign,campaign:p.campaign});}}return r(i)}}}}function U(e){return function(t,n){if(void 0===t&&(t={}),void 0===n&&(n={}),n.type===z.setItemEnd){if(n.key===N$1)return g$1({},t,{anonymousId:n.value});if(n.key===A$1)return g$1({},t,{userId:n.value})}switch(n.type){case z.identify:return Object.assign({},t,{userId:n.userId,traits:g$1({},t.traits,n.traits)});case z.reset:return [A$1,N$1,_].forEach(function(t){e.removeItem(t);}),Object.assign({},t,{userId:null,anonymousId:null,traits:{}});default:return t}}}function R(e){return {userId:e.getItem(A$1),anonymousId:e.getItem(N$1),traits:e.getItem(_)}}var $=function(e){return j$1+"TEMP"+j$1+e};function D(t){var n=t.storage,r=n.setItem,a=n.removeItem,o=n.getItem;return function(t){return function(n){return function(u){var c=u.userId,s=u.traits,l=u.options;if(u.type===z.reset&&([A$1,_,N$1].forEach(function(e){a(e);}),[j,k$1,"traits"].forEach(function(e){i$2($(e));})),u.type===z.identify){o(N$1)||r(N$1,y$1());var f=o(A$1),d=o(_)||{};f&&f!==c&&t.dispatch({type:z.userIdChanged,old:{userId:f,traits:d},new:{userId:c,traits:s},options:l}),c&&r(A$1,c),s&&r(_,g$1({},d,s));}return n(u)}}}}var B={};function L$1(e,t){B[e]&&W$1(B[e])&&(B[e](t),delete B[e]);}function J$1(e,t,n){return new Promise(function(r,i){return t()?r(e):n<1?i(g$1({},e,{queue:!0})):new Promise(function(e){return setTimeout(e,10)}).then(function(a){return J$1(e,t,n-10).then(r,i)})})}function X(e){return {abort:e}}var H=function(e){var t=e.data,n=e.action,r=e.instance,i=e.state,a=e.allPlugins,o=e.allMatches,u=e.store,s=e.EVENTS;try{var f=i.plugins,d=i.context,p=n.type,m=p.match(W),h=t.exact.map(function(e){return e.pluginName});m&&(h=o.during.map(function(e){return e.pluginName}));var v=function(e,t){return function(n,r,i){var a=r.config,o=r.name,u=o+"."+n.type;i&&(u=i.event);var c=n.type.match(W)?function(e,t,n,r,i){return function(a,o){var u=r?r.name:e,c=o&&ne(o)?o:n;if(r&&(!(c=o&&ne(o)?o:[e]).includes(e)||1!==c.length))throw new Error("Method "+t+" can only abort "+e+" plugin. "+JSON.stringify(c)+" input valid");return g$1({},i,{abort:{reason:a,plugins:c,caller:t,_:u}})}}(o,u,t,i,n):function(e,t){return function(){throw new Error(e.type+" action not cancellable. Remove abort in "+t)}}(n,u);return {payload:ae(n),instance:e,config:a||{},abort:c}}}(r,h),y=t.exact.reduce(function(e,t){var n=t.pluginName,r=t.methodName,i=!1;return r.match(/^initialize/)||r.match(/^reset/)||(i=!f[n].loaded),d.offline&&r.match(/^(page|track|identify)/)&&(i=!0),e[""+n]=i,e},{});return Promise.resolve(t.exact.reduce(function(e,i,o){try{var u=i.pluginName;return Promise.resolve(e).then(function(e){function i(){return Promise.resolve(e)}var o=function(){if(t.namespaced&&t.namespaced[u])return Promise.resolve(t.namespaced[u].reduce(function(e,t,n){try{return Promise.resolve(e).then(function(e){return t.method&&W$1(t.method)?(function(e,t){var n=ie(e);if(n&&n.name===t){var r=ie(n.method);throw new Error([t+" plugin is calling method "+e,"Plugins cant call self","Use "+n.method+" "+(r?"or "+r.method:"")+" in "+t+" plugin insteadof "+e].join("\n"))}}(t.methodName,t.pluginName),Promise.resolve(t.method({payload:e,instance:r,abort:(n=e,i=u,o=t.pluginName,function(e,t){return g$1({},n,{abort:{reason:e,plugins:t||[i],caller:p,from:o||i}})}),config:Q(t.pluginName,f,a),plugins:f})).then(function(t){var n=on(t)?t:{};return Promise.resolve(g$1({},e,n))})):e;var n,i,o;})}catch(e){return Promise.reject(e)}},Promise.resolve(n))).then(function(t){e[u]=t;});e[u]=n;}();return o&&o.then?o.then(i):i()})}catch(e){return Promise.reject(e)}},Promise.resolve({}))).then(function(e){return Promise.resolve(t.exact.reduce(function(n,i,o){try{var s=t.exact.length===o+1,l=i.pluginName,d=a[l];return Promise.resolve(n).then(function(t){var n=e[l]?e[l]:{};if(m&&(n=t),ee(n,l))return K({data:n,method:p,instance:r,pluginName:l,store:u}),Promise.resolve(t);if(ee(t,l))return s&&K({data:t,method:p,instance:r,store:u}),Promise.resolve(t);if(y.hasOwnProperty(l)&&!0===y[l])return u.dispatch({type:"queue",plugin:l,payload:n,_:{called:"queue",from:"queueMechanism"}}),Promise.resolve(t);var i=v(e[l],a[l]);return Promise.resolve(d[p]({abort:i.abort,payload:n,instance:r,config:Q(l,f,a),plugins:f})).then(function(i){var a=on(i)?i:{},o=g$1({},t,a),s=e[l];if(ee(s,l))K({data:s,method:p,instance:r,pluginName:l,store:u});else {var f=p+":"+l;(f.match(/:/g)||[]).length<2&&!p.match(F$1)&&!p.match(G$1)&&r.dispatch(g$1({},m?o:n,{type:f,_:{called:f,from:"submethod"}}));}return Promise.resolve(o)})})}catch(e){return Promise.reject(e)}},Promise.resolve(n))).then(function(e){if(!(p.match(W)||p.match(/^registerPlugin/)||p.match(G$1)||p.match(F$1)||p.match(/^params/)||p.match(/^userIdChanged/))){if(s.plugins.includes(p),e._&&e._.originalAction===p)return e;var n=g$1({},e,{_:{originalAction:e.type,called:e.type,from:"engineEnd"}});te(e,t.exact.length)&&!p.match(/End$/)&&(n=g$1({},n,{type:e.type+"Aborted"})),u.dispatch(n);}return e})})}catch(e){return Promise.reject(e)}},W=/Start$/,F$1=/^bootstrap/,G$1=/^ready/;function K(e){var t=e.pluginName,n=e.method+"Aborted"+(t?":"+t:"");e.store.dispatch(g$1({},e.data,{type:n,_:{called:n,from:"abort"}}));}function Q(e,t,n){var r=t[e]||n[e];return r&&r.config?r.config:{}}function Y(e,t){return t.reduce(function(t,n){return n[e]?t.concat({methodName:e,pluginName:n.name,method:n[e]}):t},[])}function Z(e,t){var n=e.replace(W,""),r=t?":"+t:"";return [""+e+r,""+n+r,n+"End"+r]}function ee(e,t){var n=e.abort;return !!n&&(!0===n||re(n,t)||n&&re(n.plugins,t))}function te(e,t){var n=e.abort;if(!n)return !1;if(!0===n||q$1(n))return !0;var r=n.plugins;return ne(n)&&n.length===t||ne(r)&&r.length===t}function ne(e){return Array.isArray(e)}function re(e,t){return !(!e||!ne(e))&&e.includes(t)}function ie(e){var t=e.match(/(.*):(.*)/);return !!t&&{method:t[1],name:t[2]}}function ae(e){return Object.keys(e).reduce(function(t,n){return "type"===n||(t[n]=on(e[n])?Object.assign({},e[n]):e[n]),t},{})}function oe(e,t,n){var r={};return function(i){return function(a){return function(o){try{var u,s=function(e){return u?e:a(m)},d=o.type,p=o.plugins,m=o;if(o.abort)return Promise.resolve(a(o));if(d===z.enablePlugin&&i.dispatch({type:z.initializeStart,plugins:p,disabled:[],fromEnable:!0,meta:o.meta}),d===z.disablePlugin&&setTimeout(function(){return L$1(o.meta.rid,{payload:o})},0),d===z.initializeEnd){var h=t(),v=Object.keys(h),y=v.filter(function(e){return p.includes(e)}).map(function(e){return h[e]}),b=[],I=[],w=o.disabled,E=y.map(function(e){var t=e.loaded,n=e.name,a=e.config;return J$1(e,function(){return t({config:a})},1e4).then(function(t){return r[n]||(i.dispatch({type:z.pluginReadyType(n),name:n,events:Object.keys(e).filter(function(e){return !T.includes(e)})}),r[n]=!0),b=b.concat(n),e}).catch(function(e){if(e instanceof Error)throw new Error(e);return I=I.concat(e.name),e})});Promise.all(E).then(function(e){var t={plugins:b,failed:I,disabled:w};setTimeout(function(){v.length===E.length+w.length&&i.dispatch(g$1({},{type:z.ready},t));},0);});}var P=function(){if(d!==z.bootstrap)return /^ready:([^:]*)$/.test(d)&&setTimeout(function(){return function(e,t,n){var r={},i=t(),a=e.getState(),o=a.plugins,u=a.queue,s=a.user;if(!a.context.offline&&u&&u.actions&&u.actions.length){var f=u.actions.reduce(function(e,t,n){return o[t.plugin].loaded?(e.process.push(t),e.processIndex.push(n)):(e.requeue.push(t),e.requeueIndex.push(n)),e},{processIndex:[],process:[],requeue:[],requeueIndex:[]});if(f.processIndex&&f.processIndex.length){f.processIndex.forEach(function(t){var a=u.actions[t],f=a.plugin,d=a.payload.type,p=i[f][d];if(p&&W$1(p)){var m,h=function(e,t){return void 0===e&&(e={}),void 0===t&&(t={}),[j,k$1].reduce(function(n,r){return e.hasOwnProperty(r)&&t[r]&&t[r]!==e[r]&&(n[r]=t[r]),n},e)}(a.payload,s),v=r[h.meta.rid];if(!v&&(m=p({payload:h,config:o[f].config,instance:n,abort:X}))&&on(m)&&m.abort)return void(r[h.meta.rid]=!0);if(!v){var y=d+":"+f;e.dispatch(g$1({},h,{type:y,_:{called:y,from:"queueDrain"}}));}}});var d=u.actions.filter(function(e,t){return !~f.processIndex.indexOf(t)});u.actions=d;}}}(i,t,e)},0),Promise.resolve(function(e,t,n,r,i){try{var a=W$1(t)?t():t,o=e.type,u=o.replace(W,"");if(e._&&e._.called)return Promise.resolve(e);var c=n.getState(),s=(m=a,void 0===(h=c.plugins)&&(h={}),void 0===(v=e.options)&&(v={}),Object.keys(m).filter(function(e){var t=v.plugins||{};return Q$1(t[e])?t[e]:!1!==t.all&&(!h[e]||!1!==h[e].enabled)}).map(function(e){return m[e]}));o===z.initializeStart&&e.fromEnable&&(s=Object.keys(c.plugins).filter(function(t){var n=c.plugins[t];return e.plugins.includes(t)&&!n.initialized}).map(function(e){return a[e]}));var d=s.map(function(e){return e.name}),p=function(e,t,n){var r=Z(e).map(function(e){return Y(e,t)});return t.reduce(function(n,r){var i=r.name,a=Z(e,i).map(function(e){return Y(e,t)}),o=a[0],u=a[1],c=a[2];return o.length&&(n.beforeNS[i]=o),u.length&&(n.duringNS[i]=u),c.length&&(n.afterNS[i]=c),n},{before:r[0],beforeNS:{},during:r[1],duringNS:{},after:r[2],afterNS:{}})}(o,s);return Promise.resolve(H({action:e,data:{exact:p.before,namespaced:p.beforeNS},state:c,allPlugins:a,allMatches:p,instance:n,store:r,EVENTS:i})).then(function(e){function t(){var t=function(){if(o.match(W))return Promise.resolve(H({action:g$1({},s,{type:u+"End"}),data:{exact:p.after,namespaced:p.afterNS},state:c,allPlugins:a,allMatches:p,instance:n,store:r,EVENTS:i})).then(function(e){e.meta&&e.meta.hasCallback&&L$1(e.meta.rid,{payload:e});})}();return t&&t.then?t.then(function(){return e}):e}if(te(e,d.length))return e;var s,l=function(){if(o!==u)return Promise.resolve(H({action:g$1({},e,{type:u}),data:{exact:p.during,namespaced:p.duringNS},state:c,allPlugins:a,allMatches:p,instance:n,store:r,EVENTS:i})).then(function(e){s=e;});s=e;}();return l&&l.then?l.then(t):t()})}catch(e){return Promise.reject(e)}var m,h,v;}(o,t,e,i,n)).then(function(e){return u=1,a(e)})}();return Promise.resolve(P&&P.then?P.then(s):s(P))}catch(e){return Promise.reject(e)}}}}}function ue(e){return function(t){return function(t){return function(n){var r=n.type,i=n.key,a=n.value,o=n.options;if(r===z.setItem||r===z.removeItem){if(n.abort)return t(n);r===z.setItem?e.setItem(i,a,o):e.removeItem(i,o);}return t(n)}}}}var ce=function(){var e=this;this.before=[],this.after=[],this.addMiddleware=function(t,n){e[n]=e[n].concat(t);},this.removeMiddleware=function(t,n){var r=e[n].findIndex(function(e){return e===t});-1!==r&&(e[n]=[].concat(e[n].slice(0,r),e[n].slice(r+1)));},this.dynamicMiddlewares=function(t){return function(n){return function(r){return function(i){var a={getState:n.getState,dispatch:function(e){return n.dispatch(e)}},o=e[t].map(function(e){return e(a)});return P.apply(void 0,o)(r)(i)}}}};};function se(e){return function(t,n){void 0===t&&(t={});var r={};if("initialize:aborted"===n.type)return t;if(/^registerPlugin:([^:]*)$/.test(n.type)){var i=le(n.type,"registerPlugin"),a=e()[i];if(!a||!i)return t;var o=n.enabled,u=a.config;return r[i]={enabled:o,initialized:!!o&&Boolean(!a.initialize),loaded:!!o&&Boolean(a.loaded({config:u})),config:u},g$1({},t,r)}if(/^initialize:([^:]*)$/.test(n.type)){var c=le(n.type,z.initialize),s=e()[c];return s&&c?(r[c]=g$1({},t[c],{initialized:!0,loaded:Boolean(s.loaded({config:s.config}))}),g$1({},t,r)):t}if(/^ready:([^:]*)$/.test(n.type))return r[n.name]=g$1({},t[n.name],{loaded:!0}),g$1({},t,r);switch(n.type){case z.disablePlugin:return g$1({},t,fe(n.plugins,!1,t));case z.enablePlugin:return g$1({},t,fe(n.plugins,!0,t));default:return t}}}function le(e,t){return e.substring(t.length+1,e.length)}function fe(e,t,n){return e.reduce(function(e,r){return e[r]=g$1({},n[r],{enabled:t}),e},n)}function de(e){try{return JSON.parse(JSON.stringify(e))}catch(e){}return e}var pe={last:{},history:[]};function me(e,t){void 0===e&&(e=pe);var n=t.options,r=t.meta;if(t.type===z.track){var i=de(g$1({event:t.event,properties:t.properties},Object.keys(n).length&&{options:n},{meta:r}));return g$1({},e,{last:i,history:e.history.concat(i)})}return e}var ge={actions:[]};function he(e,t){void 0===e&&(e=ge);var n=t.payload;switch(t.type){case"queue":var r;return r=n&&n.type&&n.type===z.identify?[t].concat(e.actions):e.actions.concat(t),g$1({},e,{actions:r});case"dequeue":return [];default:return e}}var ve=/#.*$/;function ye(e){var t=/(http[s]?:\/\/)?([^\/\s]+\/)(.*)/g.exec(e);return "/"+(t&&t[3]?t[3].split("?")[0].replace(ve,""):"")}var be,Ie=function(e){if(void 0===e&&(e={}),!$$1)return e;var t=document,n=t.title,r=t.referrer,i=window,a=i.location,o=i.innerWidth,u=i.innerHeight,c=a.hash,s=a.search,l=function(e){var t=function(){if($$1)for(var e,t=document.getElementsByTagName("link"),n=0;e=t[n];n++)if("canonical"===e.getAttribute("rel"))return e.getAttribute("href")}();return t?t.match(/\?/)?t:t+e:window.location.href.replace(ve,"")}(s),f={title:n,url:l,path:ye(l),hash:c,search:s,width:o,height:u};return r&&""!==r&&(f.referrer=r),g$1({},f,e)},we={last:{},history:[]};function Ee(e,t){void 0===e&&(e=we);var n=t.options;if(t.type===z.page){var r=de(g$1({properties:t.properties,meta:t.meta},Object.keys(n).length&&{options:n}));return g$1({},e,{last:r,history:e.history.concat(r)})}return e}be={};var Pe={initialized:!1,sessionId:y$1(),app:null,version:null,debug:!1,offline:!!$$1&&!navigator.onLine,os:{name:"na"},userAgent:$$1?navigator.userAgent:"node",library:{name:"analytics",version:"0.12.14"},timezone:void 0,locale:void 0,campaign:{},referrer:be};function Se(e,t){void 0===e&&(e=Pe);var n=e.initialized,r=t.campaign;switch(t.type){case z.campaign:return g$1({},e,{campaign:r});case z.offline:return g$1({},e,{offline:!0});case z.online:return g$1({},e,{offline:!1});default:return n?e:g$1({},Pe,e,{initialized:!0})}}var Ne=["plugins","reducers","storage"];function Ae(){return f("analytics",[]),function(e){return function(t,n$1,r){var i=e(t,n$1,r),a=i.dispatch;return Object.assign(i,{dispatch:function(e){return n[o].analytics.push(e.action||e),a(e)}})}}}function _e(e){return function(){return P(P.apply(null,arguments),Ae())}}function Oe(e){return e?rn(e)?e:[e]:[]}function je(t,n,r){void 0===t&&(t={});var i,a,o=y$1();return n&&(B[o]=(i=n,a=function(e){for(var t,n=e||Array.prototype.slice.call(arguments),r=0;r<n.length;r++)if(W$1(n[r])){t=n[r];break}return t}(r),function(e){a&&a(e),i(e);})),g$1({},t,{rid:o,ts:(new Date).getTime()},n?{hasCallback:!0}:{})}function ke(o){void 0===o&&(o={});var u=o.reducers||{},s$1=o.initialUser||{},f$1=(o.plugins||[]).reduce(function(e,t){if(W$1(t))return e.middlewares=e.middlewares.concat(t),e;if(t.NAMESPACE&&(t.name=t.NAMESPACE),!t.name)throw new Error("https://lytics.dev/errors/1");t.config||(t.config={});var n=t.EVENTS?Object.keys(t.EVENTS).map(function(e){return t.EVENTS[e]}):[];e.pluginEnabled[t.name]=!(!1===t.enabled||!1===t.config.enabled),delete t.enabled,t.methods&&(e.methods[t.name]=Object.keys(t.methods).reduce(function(e,n){var r;return e[n]=(r=t.methods[n],function(){for(var e=Array.prototype.slice.call(arguments),t=new Array(r.length),n=0;n<e.length;n++)t[n]=e[n];return t[t.length]=K,r.apply({instance:K},t)}),e},{}),delete t.methods);var r=Object.keys(t).concat(n),i=new Set(e.events.concat(r));if(e.events=Array.from(i),e.pluginsArray=e.pluginsArray.concat(t),e.plugins[t.name])throw new Error(t.name+"AlreadyLoaded");return e.plugins[t.name]=t,e.plugins[t.name].loaded||(e.plugins[t.name].loaded=function(){return !0}),e},{plugins:{},pluginEnabled:{},methods:{},pluginsArray:[],middlewares:[],events:[]}),m=o.storage?o.storage:{getItem:a$2,setItem:f,removeItem:i$2},b=function(e){return function(t,n,i){return n.getState("user")[t]||(i&&on(i)&&i[t]?i[t]:R(e)[t]||a$2($(t))||null)}}(m),I=f$1.plugins,A=f$1.events.filter(function(e){return !T.includes(e)}).sort(),_=new Set(A.concat(x$1).filter(function(e){return !T.includes(e)})),O=Array.from(_).sort(),M=function(){return I},q=new ce,V=q.addMiddleware,B=q.removeMiddleware,L=q.dynamicMiddlewares,J=function(){throw new Error("Abort disabled inListener")},X=s(),H=R(m),W=g$1({},H,s$1,X.an_uid?{userId:X.an_uid}:{},X.an_aid?{anonymousId:X.an_aid}:{});W.anonymousId||(W.anonymousId=y$1());var F=g$1({enable:function(e,t){return new Promise(function(n){le.dispatch({type:z.enablePlugin,plugins:Oe(e),_:{originalAction:z.enablePlugin}},n,[t]);})},disable:function(e,t){return new Promise(function(n){le.dispatch({type:z.disablePlugin,plugins:Oe(e),_:{originalAction:z.disablePlugin}},n,[t]);})}},f$1.methods),G=!1,K={identify:function(e,t,n,r){try{var i=q$1(e)?e:null,o=on(e)?e:t,u=n||{},s=K.user();f($(j),i);var l=i||o.userId||b(j,K,o);return Promise.resolve(new Promise(function(e){le.dispatch(g$1({type:z.identifyStart,userId:l,traits:o||{},options:u,anonymousId:s.anonymousId},s.id&&s.id!==i&&{previousId:s.id}),e,[t,n,r]);}))}catch(e){return Promise.reject(e)}},track:function(e,t,n,r){try{var i=on(e)?e.event:e;if(!i||!q$1(i))throw new Error("EventMissing");var a=on(e)?e:t||{},o=on(n)?n:{};return Promise.resolve(new Promise(function(e){le.dispatch({type:z.trackStart,event:i,properties:a,options:o,userId:b(j,K,t),anonymousId:b(k$1,K,t)},e,[t,n,r]);}))}catch(e){return Promise.reject(e)}},page:function(e,t,n){try{var r=on(e)?e:{},i=on(t)?t:{};return Promise.resolve(new Promise(function(a){le.dispatch({type:z.pageStart,properties:Ie(r),options:i,userId:b(j,K,r),anonymousId:b(k$1,K,r)},a,[e,t,n]);}))}catch(e){return Promise.reject(e)}},user:function(e){if(e===j||"id"===e)return b(j,K);if(e===k$1||"anonId"===e)return b(k$1,K);var t=K.getState("user");return e?n$2(t,e):t},reset:function(e){return new Promise(function(t){le.dispatch({type:z.resetStart},t,e);})},ready:function(e){return G&&e({plugins:F,instance:K}),K.on(z.ready,function(t){e(t),G=!0;})},on:function(e,t){if(!e||!W$1(t))return !1;if(e===z.bootstrap)throw new Error(".on disabled for "+e);var n=/Start$|Start:/;if("*"===e){var r=function(e){return function(e){return function(r){return r.type.match(n)&&t({payload:r,instance:K,plugins:I}),e(r)}}},i=function(e){return function(e){return function(r){return r.type.match(n)||t({payload:r,instance:K,plugins:I}),e(r)}}};return V(r,xe),V(i,Te),function(){B(r,xe),B(i,Te);}}var a=e.match(n)?xe:Te,o=function(n){return function(n){return function(r){return r.type===e&&t({payload:r,instance:K,plugins:I,abort:J}),n(r)}}};return V(o,a),function(){return B(o,a)}},once:function(e,t){if(!e||!W$1(t))return !1;if(e===z.bootstrap)throw new Error(".once disabled for "+e);var n=K.on(e,function(e){t({payload:e.payload,instance:K,plugins:I,abort:J}),n();});return n},getState:function(e){var t=le.getState();return e?n$2(t,e):Object.assign({},t)},dispatch:function(e){var t=q$1(e)?{type:e}:e;if(x$1.includes(t.type))throw new Error("reserved action "+t.type);var n=g$1({},t,{_:g$1({originalAction:t.type},e._||{})});le.dispatch(n);},enablePlugin:F.enable,disablePlugin:F.disable,plugins:F,storage:{getItem:m.getItem,setItem:function(e,t,n){le.dispatch({type:z.setItemStart,key:e,value:t,options:n});},removeItem:function(e,t){le.dispatch({type:z.removeItemStart,key:e,options:t});}},setAnonymousId:function(e,t){K.storage.setItem(N$1,e,t);},events:{core:x$1,plugins:A}},Q=f$1.middlewares.concat([function(e){return function(e){return function(t){return t.meta||(t.meta=je()),e(t)}}},L(xe),oe(K,M,{all:O,plugins:A}),ue(m),C$1(K),D(K),L(Te)]),Y={context:Se,user:U(m),page:Ee,track:me,plugins:se(M),queue:he},Z=P,ee=P;if($$1&&o.debug){var te=window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;te&&(Z=te({trace:!0,traceLimit:25})),ee=function(){return 0===arguments.length?Ae():on(typeof arguments[0])?_e():_e().apply(null,arguments)};}var ne,re=function(e){return Object.keys(e).reduce(function(t,n){return Ne.includes(n)||(t[n]=e[n]),t},{})}(o),ie=f$1.pluginsArray.reduce(function(e,t){var n=t.name,r=t.config,i=t.loaded,a=f$1.pluginEnabled[n];return e[n]={enabled:a,initialized:!!a&&Boolean(!t.initialize),loaded:Boolean(i({config:r})),config:r},e},{}),ae={context:re,user:W,plugins:ie},le=w(function(e){for(var t=Object.keys(e),n={},r=0;r<t.length;r++){var i=t[r];typeof e[i]===h$1&&(n[i]=e[i]);}var a,o=Object.keys(n);try{!function(e){Object.keys(e).forEach(function(t){var n=e[t];if(typeof n(void 0,{type:"@@redux/INIT"})===v||typeof n(void 0,{type:y})===v)throw new Error("reducer "+t+" "+v)});}(n);}catch(e){a=e;}return function(e,t){if(void 0===e&&(e={}),a)throw a;for(var r=!1,i={},u=0;u<o.length;u++){var c=o[u],s=e[c],l=(0, n[c])(s,t);if(typeof l===v){var f=E$1(c,t);throw new Error(f)}i[c]=l,r=r||l!==s;}return r?i:e}}(g$1({},Y,u)),ae,ee(Z(S.apply(void 0,Q))));le.dispatch=(ne=le.dispatch,function(e,t,n){var r=g$1({},e,{meta:je(e.meta,t,Oe(n))});return ne.apply(null,[r])});var fe=Object.keys(I);le.dispatch({type:z.bootstrap,plugins:fe,config:re,params:X,user:W,initialUser:s$1,persistedUser:H});var de=fe.filter(function(e){return f$1.pluginEnabled[e]}),pe=fe.filter(function(e){return !f$1.pluginEnabled[e]});return le.dispatch({type:z.registerPlugins,plugins:fe,enabled:f$1.pluginEnabled}),f$1.pluginsArray.map(function(e,t){var n=e.bootstrap,r=e.config,i=e.name;n&&W$1(n)&&n({instance:K,config:r,payload:e}),le.dispatch({type:z.registerPluginType(i),name:i,enabled:f$1.pluginEnabled[i],plugin:e}),f$1.pluginsArray.length===t+1&&le.dispatch({type:z.initializeStart,plugins:de,disabled:pe});}),K}var xe="before",Te="after";
12
+
13
+ var t="cookie",i$1=a$1(),r$1=d$1,c=d$1;function u(o){return i$1?d$1(o,"",-1):i$2(o)}function a$1(){if(void 0!==i$1)return i$1;var e="cookiecookie";try{d$1(e,e),i$1=-1!==document.cookie.indexOf(e),u(e);}catch(e){i$1=!1;}return i$1}function d$1(e,t,r,c,u,a){if("undefined"!=typeof window){var d=arguments.length>1;return !1===i$1&&(d?f(e,t):a$2(e)),d?document.cookie=e+"="+encodeURIComponent(t)+(r?"; expires="+new Date(+new Date+1e3*r).toUTCString()+(c?"; path="+c:"")+(u?"; domain="+u:"")+(a?"; secure":""):""):decodeURIComponent((("; "+document.cookie).split("; "+e+"=")[1]||"").split(";")[0])}}
14
+
15
+ var r="localStorage",g=b$2.bind(null,"localStorage");u$1("localStorage","getItem",a$2);u$1("localStorage","setItem",f);u$1("localStorage","removeItem",i$2);
16
+
17
+ var a="sessionStorage",i=b$2.bind(null,"sessionStorage");u$1("sessionStorage","getItem",a$2);u$1("sessionStorage","setItem",f);u$1("sessionStorage","removeItem",i$2);
18
+
19
+ function I(t){var o=t;try{if("true"===(o=JSON.parse(t)))return !0;if("false"===o)return !1;if(on(o))return o;parseFloat(o)===o&&(o=parseFloat(o));}catch(t){}if(null!==o&&""!==o)return o}var k=g(),O=i(),x=a$1();function C(o,e){if(o){var r=A(e),a=!N(r),i=d(r)?I(localStorage.getItem(o)):void 0;if(a&&!I$2(i))return i;var n=h(r)?I(r$1(o)):void 0;if(a&&n)return n;var l=E(r)?I(sessionStorage.getItem(o)):void 0;if(a&&l)return l;var u=a$2(o);return a?u:{localStorage:i,sessionStorage:l,cookie:n,global:u}}}function L(r$2,a$1,l$1){if(r$2&&!I$2(a$1)){var u={},g=A(l$1),m=JSON.stringify(a$1),S=!N(g);return d(g)&&(u[r]=F(r,a$1,I(localStorage.getItem(r$2))),localStorage.setItem(r$2,m),S)?u[r]:h(g)&&(u[t]=F(t,a$1,I(r$1(r$2))),c(r$2,m),S)?u[t]:E(g)&&(u[a]=F(a,a$1,I(sessionStorage.getItem(r$2))),sessionStorage.setItem(r$2,m),S)?u[a]:(u[l]=F(l,a$1,a$2(r$2)),f(r$2,a$1),S?u[l]:u)}}function b(t$1,e){if(t$1){var a$1=A(e),s=C(t$1,m$1),n={};return !I$2(s.localStorage)&&d(a$1)&&(localStorage.removeItem(t$1),n[r]=s.localStorage),!I$2(s.cookie)&&h(a$1)&&(u(t$1),n[t]=s.cookie),!I$2(s.sessionStorage)&&E(a$1)&&(sessionStorage.removeItem(t$1),n[a]=s.sessionStorage),!I$2(s.global)&&G(a$1,l)&&(i$2(t$1),n[l]=s.global),n}}function A(t){return t?q$1(t)?t:t.storage:b$3}function d(t){return k&&G(t,r)}function h(t$1){return x&&G(t$1,t)}function E(t){return O&&G(t,a)}function N(t){return t===m$1||"all"===t}function G(t,o){return t===b$3||t===o||N(t)}function F(t,o,e){return {location:t,current:o,previous:e}}var J={setItem:L,getItem:C,removeItem:b};
20
+
21
+ function _defineProperty(obj, key, value) {
22
+ if (key in obj) {
23
+ Object.defineProperty(obj, key, {
24
+ value: value,
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true
28
+ });
29
+ } else {
30
+ obj[key] = value;
31
+ }
32
+
33
+ return obj;
34
+ }
35
+
36
+ function ownKeys(object, enumerableOnly) {
37
+ var keys = Object.keys(object);
38
+
39
+ if (Object.getOwnPropertySymbols) {
40
+ var symbols = Object.getOwnPropertySymbols(object);
41
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
42
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
43
+ })), keys.push.apply(keys, symbols);
44
+ }
45
+
46
+ return keys;
47
+ }
48
+
49
+ function _objectSpread2(target) {
50
+ for (var i = 1; i < arguments.length; i++) {
51
+ var source = null != arguments[i] ? arguments[i] : {};
52
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
53
+ _defineProperty(target, key, source[key]);
54
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
55
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
56
+ });
57
+ }
58
+
59
+ return target;
60
+ }
61
+
62
+ function analyticsLib() {
63
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
64
+ var defaultSettings = {
65
+ storage: J
66
+ };
67
+ return ke(_objectSpread2(_objectSpread2({}, defaultSettings), opts));
68
+ }
69
+
70
+ function findScript(src) {
71
+ const scripts = Array.prototype.slice.call(window.document.querySelectorAll("script"));
72
+ return scripts.find(s => s.src === src);
73
+ }
74
+ function buildScriptSrc(src, options) {
75
+ let result = src;
76
+ if (!result.startsWith("http")) {
77
+ result = `https://${(options === null || options === void 0 ? void 0 : options.www) ? "www." : ""}${result}`;
78
+ }
79
+ if (options === null || options === void 0 ? void 0 : options.min) {
80
+ result = result + ".min.js";
81
+ }
82
+ else if (options === null || options === void 0 ? void 0 : options.js) {
83
+ result = result + ".js";
84
+ }
85
+ if (options === null || options === void 0 ? void 0 : options.query) {
86
+ result += "?" + options.query;
87
+ }
88
+ return result;
89
+ }
90
+ function loadScript(src, options) {
91
+ const found = findScript(src);
92
+ if (found !== undefined) {
93
+ const status = found === null || found === void 0 ? void 0 : found.getAttribute("status");
94
+ if (status === "loaded") {
95
+ return Promise.resolve(found);
96
+ }
97
+ if (status === "loading") {
98
+ return new Promise((resolve, reject) => {
99
+ found.addEventListener("load", () => resolve(found));
100
+ found.addEventListener("error", err => reject(err));
101
+ });
102
+ }
103
+ }
104
+ return new Promise((resolve, reject) => {
105
+ var _a, _b;
106
+ const script = window.document.createElement("script");
107
+ script.type = "text/javascript";
108
+ script.src = buildScriptSrc(src, options);
109
+ script.async = true;
110
+ script.setAttribute("status", "loading");
111
+ for (const [k, v] of Object.entries((_a = options === null || options === void 0 ? void 0 : options.attributes) !== null && _a !== void 0 ? _a : {})) {
112
+ script.setAttribute(k, v);
113
+ }
114
+ script.onload = () => {
115
+ script.onerror = script.onload = null;
116
+ script.setAttribute("status", "loaded");
117
+ resolve(script);
118
+ };
119
+ script.onerror = () => {
120
+ script.onerror = script.onload = null;
121
+ script.setAttribute("status", "error");
122
+ reject(new Error(`Failed to load ${src}`));
123
+ };
124
+ const tag = window.document.getElementsByTagName("script")[0];
125
+ (_b = tag.parentElement) === null || _b === void 0 ? void 0 : _b.insertBefore(script, tag);
126
+ });
127
+ }
128
+
129
+ const internalDestinationPlugins = {};
130
+
131
+ const jitsuVersion = "2.0.0";
132
+ const jitsuLibraryName = "@jitsu/js";
133
+
134
+ const publicSuffixes = "myshopify.com,ac,com.ac,edu.ac,gov.ac,net.ac,mil.ac,org.ac,ad,nom.ad,ae,co.ae,net.ae,org.ae,sch.ae,ac.ae,gov.ae,mil.ae,aero,af,gov.af,com.af,org.af,net.af,edu.af,ag,com.ag,org.ag,net.ag,co.ag,nom.ag,ai,off.ai,com.ai,net.ai,org.ai,al,com.al,edu.al,gov.al,mil.al,net.al,org.al,am,co.am,com.am,commune.am,net.am,org.am,ao,ed.ao,gv.ao,og.ao,co.ao,pb.ao,it.ao,aq,ar,bet.ar,com.ar,coop.ar,edu.ar,gob.ar,gov.ar,int.ar,mil.ar,musica.ar,mutual.ar,net.ar,org.ar,senasa.ar,tur.ar,arpa,e164.arpa,in-addr.arpa,ip6.arpa,iris.arpa,uri.arpa,urn.arpa,as,gov.as,asia,at,ac.at,co.at,gv.at,or.at,sth.ac.at,au,com.au,net.au,org.au,edu.au,gov.au,asn.au,id.au,act.au,nsw.au,nt.au,qld.au,sa.au,tas.au,vic.au,wa.au,aw,com.aw,ax,az,com.az,net.az,int.az,gov.az,org.az,edu.az,info.az,pp.az,mil.az,name.az,pro.az,biz.az,ba,com.ba,edu.ba,gov.ba,mil.ba,net.ba,org.ba,bb,biz.bb,co.bb,com.bb,edu.bb,gov.bb,info.bb,net.bb,org.bb,store.bb,tv.bb,bd,be,ac.be,bf,gov.bf,bg,a.bg,b.bg,c.bg,d.bg,e.bg,f.bg,g.bg,h.bg,i.bg,j.bg,k.bg,l.bg,m.bg,n.bg,o.bg,p.bg,q.bg,r.bg,s.bg,t.bg,u.bg,v.bg,w.bg,x.bg,y.bg,z.bg,0.bg,1.bg,2.bg,3.bg,4.bg,5.bg,6.bg,7.bg,8.bg,9.bg,bh,com.bh,edu.bh,net.bh,org.bh,gov.bh,bi,co.bi,com.bi,edu.bi,or.bi,org.bi,biz,bj,africa.bj,agro.bj,architectes.bj,assur.bj,avocats.bj,co.bj,com.bj,eco.bj,econo.bj,edu.bj,info.bj,loisirs.bj,money.bj,net.bj,org.bj,ote.bj,resto.bj,restaurant.bj,tourism.bj,univ.bj,bm,com.bm,edu.bm,gov.bm,net.bm,org.bm,bn,com.bn,edu.bn,gov.bn,net.bn,org.bn,bo,com.bo,edu.bo,gob.bo,int.bo,org.bo,net.bo,mil.bo,tv.bo,web.bo,br,9guacu.br,abc.br,adm.br,adv.br,agr.br,aju.br,am.br,anani.br,aparecida.br,app.br,arq.br,art.br,ato.br,b.br,barueri.br,belem.br,bhz.br,bib.br,bio.br,blog.br,bmd.br,boavista.br,bsb.br,campinagrande.br,campinas.br,caxias.br,cim.br,cng.br,cnt.br,com.br,contagem.br,coop.br,coz.br,cri.br,cuiaba.br,curitiba.br,def.br,des.br,det.br,dev.br,ecn.br,eco.br,edu.br,emp.br,enf.br,eng.br,esp.br,etc.br,eti.br,far.br,feira.br,flog.br,floripa.br,fm.br,fnd.br,fortal.br,fot.br,foz.br,fst.br,g12.br,geo.br,ggf.br,goiania.br,gov.br,gru.br,imb.br,ind.br,inf.br,jab.br,jampa.br,jdf.br,joinville.br,jor.br,jus.br,leg.br,lel.br,log.br,londrina.br,macapa.br,maceio.br,manaus.br,maringa.br,mat.br,med.br,mil.br,morena.br,mp.br,mus.br,natal.br,net.br,niteroi.br,nom.br,not.br,ntr.br,odo.br,ong.br,org.br,osasco.br,palmas.br,poa.br,ppg.br,pro.br,psc.br,psi.br,pvh.br,qsl.br,radio.br,rec.br,recife.br,rep.br,ribeirao.br,rio.br,riobranco.br,riopreto.br,salvador.br,sampa.br,santamaria.br,santoandre.br,saobernardo.br,saogonca.br,seg.br,sjc.br,slg.br,slz.br,sorocaba.br,srv.br,taxi.br,tc.br,tec.br,teo.br,the.br,tmp.br,trd.br,tur.br,tv.br,udi.br,vet.br,vix.br,vlog.br,wiki.br,zlg.br,bs,com.bs,net.bs,org.bs,edu.bs,gov.bs,bt,com.bt,edu.bt,gov.bt,net.bt,org.bt,bv,bw,co.bw,org.bw,by,gov.by,mil.by,com.by,of.by,bz,com.bz,net.bz,org.bz,edu.bz,gov.bz,ca,ab.ca,bc.ca,mb.ca,nb.ca,nf.ca,nl.ca,ns.ca,nt.ca,nu.ca,on.ca,pe.ca,qc.ca,sk.ca,yk.ca,gc.ca,cat,cc,cd,gov.cd,cf,cg,ch,ci,org.ci,or.ci,com.ci,co.ci,edu.ci,ed.ci,ac.ci,net.ci,go.ci,asso.ci,aéroport.ci,int.ci,presse.ci,md.ci,gouv.ci,ck,cl,co.cl,gob.cl,gov.cl,mil.cl,cm,co.cm,com.cm,gov.cm,net.cm,cn,ac.cn,com.cn,edu.cn,gov.cn,net.cn,org.cn,mil.cn,co,arts.co,com.co,edu.co,firm.co,gov.co,info.co,int.co,mil.co,net.co,nom.co,org.co,rec.co,web.co,com,coop,cr,ac.cr,co.cr,ed.cr,fi.cr,go.cr,or.cr,sa.cr,cu,com.cu,edu.cu,org.cu,net.cu,gov.cu,inf.cu,cv,com.cv,edu.cv,int.cv,nome.cv,org.cv,cw,com.cw,edu.cw,net.cw,org.cw,cx,gov.cx,cy,ac.cy,biz.cy,com.cy,ekloges.cy,gov.cy,ltd.cy,mil.cy,net.cy,org.cy,press.cy,pro.cy,tm.cy,cz,de,dj,dk,dm,com.dm,net.dm,org.dm,edu.dm,gov.dm,do,art.do,com.do,edu.do,gob.do,gov.do,mil.do,net.do,org.do,sld.do,web.do,dz,art.dz,asso.dz,com.dz,edu.dz,gov.dz,org.dz,net.dz,pol.dz,soc.dz,tm.dz,ec,com.ec,info.ec,net.ec,fin.ec,k12.ec,med.ec,pro.ec,org.ec,edu.ec,gov.ec,gob.ec,mil.ec,edu,ee,edu.ee,gov.ee,riik.ee,lib.ee,med.ee,com.ee,pri.ee,aip.ee,org.ee,fie.ee,eg,com.eg,edu.eg,eun.eg,gov.eg,mil.eg,name.eg,net.eg,org.eg,sci.eg,er,es,com.es,nom.es,org.es,gob.es,edu.es,et,com.et,gov.et,org.et,edu.et,biz.et,name.et,info.et,net.et,eu,fi,aland.fi,fj,ac.fj,biz.fj,com.fj,gov.fj,info.fj,mil.fj,name.fj,net.fj,org.fj,pro.fj,fk,com.fm,edu.fm,net.fm,org.fm,fm,fo,fr,asso.fr,com.fr,gouv.fr,nom.fr,prd.fr,tm.fr,aeroport.fr,avocat.fr,avoues.fr,cci.fr,chambagri.fr,chirurgiens-dentistes.fr,experts-comptables.fr,geometre-expert.fr,greta.fr,huissier-justice.fr,medecin.fr,notaires.fr,pharmacien.fr,port.fr,veterinaire.fr,ga,gb,edu.gd,gov.gd,gd,ge,com.ge,edu.ge,gov.ge,org.ge,mil.ge,net.ge,pvt.ge,gf,gg,co.gg,net.gg,org.gg,gh,com.gh,edu.gh,gov.gh,org.gh,mil.gh,gi,com.gi,ltd.gi,gov.gi,mod.gi,edu.gi,org.gi,gl,co.gl,com.gl,edu.gl,net.gl,org.gl,gm,gn,ac.gn,com.gn,edu.gn,gov.gn,org.gn,net.gn,gov,gp,com.gp,net.gp,mobi.gp,edu.gp,org.gp,asso.gp,gq,gr,com.gr,edu.gr,net.gr,org.gr,gov.gr,gs,gt,com.gt,edu.gt,gob.gt,ind.gt,mil.gt,net.gt,org.gt,gu,com.gu,edu.gu,gov.gu,guam.gu,info.gu,net.gu,org.gu,web.gu,gw,gy,co.gy,com.gy,edu.gy,gov.gy,net.gy,org.gy,hk,com.hk,edu.hk,gov.hk,idv.hk,net.hk,org.hk,hm,hn,com.hn,edu.hn,org.hn,net.hn,mil.hn,gob.hn,hr,iz.hr,from.hr,name.hr,com.hr,ht,com.ht,shop.ht,firm.ht,info.ht,adult.ht,net.ht,pro.ht,org.ht,med.ht,art.ht,coop.ht,pol.ht,asso.ht,edu.ht,rel.ht,gouv.ht,perso.ht,hu,co.hu,info.hu,org.hu,priv.hu,sport.hu,tm.hu,2000.hu,agrar.hu,bolt.hu,casino.hu,city.hu,erotica.hu,erotika.hu,film.hu,forum.hu,games.hu,hotel.hu,ingatlan.hu,jogasz.hu,konyvelo.hu,lakas.hu,media.hu,news.hu,reklam.hu,sex.hu,shop.hu,suli.hu,szex.hu,tozsde.hu,utazas.hu,video.hu,id,ac.id,biz.id,co.id,desa.id,go.id,mil.id,my.id,net.id,or.id,ponpes.id,sch.id,web.id,ie,gov.ie,il,ac.il,co.il,gov.il,idf.il,k12.il,muni.il,net.il,org.il,im,ac.im,co.im,com.im,ltd.co.im,net.im,org.im,plc.co.im,tt.im,tv.im,in,5g.in,6g.in,ac.in,ai.in,am.in,bihar.in,biz.in,business.in,ca.in,cn.in,co.in,com.in,coop.in,cs.in,delhi.in,dr.in,edu.in,er.in,firm.in,gen.in,gov.in,gujarat.in,ind.in,info.in,int.in,internet.in,io.in,me.in,mil.in,net.in,nic.in,org.in,pg.in,post.in,pro.in,res.in,travel.in,tv.in,uk.in,up.in,us.in,info,int,eu.int,io,com.io,iq,gov.iq,edu.iq,mil.iq,com.iq,org.iq,net.iq,ir,ac.ir,co.ir,gov.ir,id.ir,net.ir,org.ir,sch.ir,is,net.is,com.is,edu.is,gov.is,org.is,int.is,it,gov.it,edu.it,je,co.je,net.je,org.je,jm,jo,com.jo,org.jo,net.jo,edu.jo,sch.jo,gov.jo,mil.jo,name.jo,jobs,jp,ac.jp,ad.jp,co.jp,ed.jp,go.jp,gr.jp,lg.jp,ne.jp,or.jp,ke,ac.ke,co.ke,go.ke,info.ke,me.ke,mobi.ke,ne.ke,or.ke,sc.ke,kg,org.kg,net.kg,com.kg,edu.kg,gov.kg,mil.kg,kh,ki,edu.ki,biz.ki,net.ki,org.ki,gov.ki,info.ki,com.ki,km,org.km,nom.km,gov.km,prd.km,tm.km,edu.km,mil.km,ass.km,com.km,kn,net.kn,org.kn,edu.kn,gov.kn,kp,com.kp,edu.kp,gov.kp,org.kp,rep.kp,tra.kp,kr,ac.kr,co.kr,es.kr,go.kr,hs.kr,kg.kr,mil.kr,ms.kr,ne.kr,or.kr,pe.kr,re.kr,sc.kr,kw,com.kw,edu.kw,emb.kw,gov.kw,ind.kw,net.kw,org.kw,ky,com.ky,edu.ky,net.ky,org.ky,kz,org.kz,edu.kz,net.kz,gov.kz,mil.kz,com.kz,la,int.la,net.la,info.la,edu.la,gov.la,per.la,com.la,org.la,lb,com.lb,edu.lb,gov.lb,net.lb,org.lb,lc,com.lc,net.lc,co.lc,org.lc,edu.lc,gov.lc,li,lk,gov.lk,sch.lk,net.lk,int.lk,com.lk,org.lk,edu.lk,ngo.lk,soc.lk,web.lk,ltd.lk,assn.lk,grp.lk,hotel.lk,ac.lk,lr,com.lr,edu.lr,gov.lr,org.lr,net.lr,ls,ac.ls,biz.ls,co.ls,edu.ls,gov.ls,info.ls,net.ls,org.ls,sc.ls,lt,gov.lt,lu,lv,com.lv,edu.lv,gov.lv,org.lv,mil.lv,id.lv,net.lv,asn.lv,conf.lv,ly,com.ly,net.ly,gov.ly,plc.ly,edu.ly,sch.ly,med.ly,org.ly,id.ly,ma,co.ma,net.ma,gov.ma,org.ma,ac.ma,press.ma,mc,tm.mc,asso.mc,md,me,co.me,net.me,org.me,edu.me,ac.me,gov.me,its.me,priv.me,mg,org.mg,nom.mg,gov.mg,prd.mg,tm.mg,edu.mg,mil.mg,com.mg,co.mg,mh,mil,mk,com.mk,org.mk,net.mk,edu.mk,gov.mk,inf.mk,name.mk,ml,com.ml,edu.ml,gouv.ml,gov.ml,net.ml,org.ml,presse.ml,mm,mn,gov.mn,edu.mn,org.mn,mo,com.mo,net.mo,org.mo,edu.mo,gov.mo,mobi,mp,mq,mr,gov.mr,ms,com.ms,edu.ms,gov.ms,net.ms,org.ms,mt,com.mt,edu.mt,net.mt,org.mt,mu,com.mu,net.mu,org.mu,gov.mu,ac.mu,co.mu,or.mu,museum,mv,aero.mv,biz.mv,com.mv,coop.mv,edu.mv,gov.mv,info.mv,int.mv,mil.mv,museum.mv,name.mv,net.mv,org.mv,pro.mv,mw,ac.mw,biz.mw,co.mw,com.mw,coop.mw,edu.mw,gov.mw,int.mw,museum.mw,net.mw,org.mw,mx,com.mx,org.mx,gob.mx,edu.mx,net.mx,my,biz.my,com.my,edu.my,gov.my,mil.my,name.my,net.my,org.my,mz,ac.mz,adv.mz,co.mz,edu.mz,gov.mz,mil.mz,net.mz,org.mz,na,info.na,pro.na,name.na,school.na,or.na,dr.na,us.na,mx.na,ca.na,in.na,cc.na,tv.na,ws.na,mobi.na,co.na,com.na,org.na,name,nc,asso.nc,nom.nc,ne,net,nf,com.nf,net.nf,per.nf,rec.nf,web.nf,arts.nf,firm.nf,info.nf,other.nf,store.nf,ng,com.ng,edu.ng,gov.ng,i.ng,mil.ng,mobi.ng,name.ng,net.ng,org.ng,sch.ng,ni,ac.ni,biz.ni,co.ni,com.ni,edu.ni,gob.ni,in.ni,info.ni,int.ni,mil.ni,net.ni,nom.ni,org.ni,web.ni,nl,no,fhs.no,vgs.no,fylkesbibl.no,folkebibl.no,museum.no,idrett.no,priv.no,mil.no,stat.no,dep.no,kommune.no,herad.no,np,nr,biz.nr,info.nr,gov.nr,edu.nr,org.nr,net.nr,com.nr,nu,nz,ac.nz,co.nz,cri.nz,geek.nz,gen.nz,govt.nz,health.nz,iwi.nz,kiwi.nz,maori.nz,mil.nz,māori.nz,net.nz,org.nz,parliament.nz,school.nz,om,co.om,com.om,edu.om,gov.om,med.om,museum.om,net.om,org.om,pro.om,onion,org,pa,ac.pa,gob.pa,com.pa,org.pa,sld.pa,edu.pa,net.pa,ing.pa,abo.pa,med.pa,nom.pa,pe,edu.pe,gob.pe,nom.pe,mil.pe,org.pe,com.pe,net.pe,pf,com.pf,org.pf,edu.pf,pg,ph,com.ph,net.ph,org.ph,gov.ph,edu.ph,ngo.ph,mil.ph,i.ph,pk,com.pk,net.pk,edu.pk,org.pk,fam.pk,biz.pk,web.pk,gov.pk,gob.pk,gok.pk,gon.pk,gop.pk,gos.pk,info.pk,pl,com.pl,net.pl,org.pl,aid.pl,agro.pl,atm.pl,auto.pl,biz.pl,edu.pl,gmina.pl,gsm.pl,info.pl,mail.pl,miasta.pl,media.pl,mil.pl,nieruchomosci.pl,nom.pl,pc.pl,powiat.pl,priv.pl,realestate.pl,rel.pl,sex.pl,shop.pl,sklep.pl,sos.pl,szkola.pl,targi.pl,tm.pl,tourism.pl,travel.pl,turystyka.pl,pm,pn,gov.pn,co.pn,org.pn,edu.pn,net.pn,post,pr,com.pr,net.pr,org.pr,gov.pr,edu.pr,isla.pr,pro.pr,biz.pr,info.pr,name.pr,est.pr,prof.pr,ac.pr,pro,aaa.pro,aca.pro,acct.pro,avocat.pro,bar.pro,cpa.pro,eng.pro,jur.pro,law.pro,med.pro,recht.pro,ps,edu.ps,gov.ps,sec.ps,plo.ps,com.ps,org.ps,net.ps,pt,net.pt,gov.pt,org.pt,edu.pt,int.pt,publ.pt,com.pt,nome.pt,pw,co.pw,ne.pw,or.pw,ed.pw,go.pw,belau.pw,py,com.py,coop.py,edu.py,gov.py,mil.py,net.py,org.py,qa,com.qa,edu.qa,gov.qa,mil.qa,name.qa,net.qa,org.qa,sch.qa,re,asso.re,com.re,nom.re,ro,arts.ro,com.ro,firm.ro,info.ro,nom.ro,nt.ro,org.ro,rec.ro,store.ro,tm.ro,www.ro,rs,ac.rs,co.rs,edu.rs,gov.rs,in.rs,org.rs,ru,rw,ac.rw,co.rw,coop.rw,gov.rw,mil.rw,net.rw,org.rw,sa,com.sa,net.sa,org.sa,gov.sa,med.sa,pub.sa,edu.sa,sch.sa,sb,com.sb,edu.sb,gov.sb,net.sb,org.sb,sc,com.sc,gov.sc,net.sc,org.sc,edu.sc,sd,com.sd,net.sd,org.sd,edu.sd,med.sd,tv.sd,gov.sd,info.sd,se,a.se,ac.se,b.se,bd.se,brand.se,c.se,d.se,e.se,f.se,fh.se,fhsk.se,fhv.se,g.se,h.se,i.se,k.se,komforb.se,kommunalforbund.se,komvux.se,l.se,lanbib.se,m.se,n.se,naturbruksgymn.se,o.se,org.se,p.se,parti.se,pp.se,press.se,r.se,s.se,t.se,tm.se,u.se,w.se,x.se,y.se,z.se,sg,com.sg,net.sg,org.sg,gov.sg,edu.sg,per.sg,sh,com.sh,net.sh,gov.sh,org.sh,mil.sh,si,sj,sk,sl,com.sl,net.sl,edu.sl,gov.sl,org.sl,sm,sn,art.sn,com.sn,edu.sn,gouv.sn,org.sn,perso.sn,univ.sn,so,com.so,edu.so,gov.so,me.so,net.so,org.so,sr,ss,biz.ss,com.ss,edu.ss,gov.ss,me.ss,net.ss,org.ss,sch.ss,st,co.st,com.st,consulado.st,edu.st,embaixada.st,mil.st,net.st,org.st,principe.st,saotome.st,store.st,su,sv,com.sv,edu.sv,gob.sv,org.sv,red.sv,sx,gov.sx,sy,edu.sy,gov.sy,net.sy,mil.sy,com.sy,org.sy,sz,co.sz,ac.sz,org.sz,tc,td,tel,tf,tg,th,ac.th,co.th,go.th,in.th,mi.th,net.th,or.th,tj,ac.tj,biz.tj,co.tj,com.tj,edu.tj,go.tj,gov.tj,int.tj,mil.tj,name.tj,net.tj,nic.tj,org.tj,test.tj,web.tj,tk,tl,gov.tl,tm,com.tm,co.tm,org.tm,net.tm,nom.tm,gov.tm,mil.tm,edu.tm,tn,com.tn,ens.tn,fin.tn,gov.tn,ind.tn,info.tn,intl.tn,mincom.tn,nat.tn,net.tn,org.tn,perso.tn,tourism.tn,to,com.to,gov.to,net.to,org.to,edu.to,mil.to,tr,av.tr,bbs.tr,bel.tr,biz.tr,com.tr,dr.tr,edu.tr,gen.tr,gov.tr,info.tr,mil.tr,k12.tr,kep.tr,name.tr,net.tr,org.tr,pol.tr,tel.tr,tsk.tr,tv.tr,web.tr,nc.tr,tt,co.tt,com.tt,org.tt,net.tt,biz.tt,info.tt,pro.tt,int.tt,coop.tt,jobs.tt,mobi.tt,travel.tt,museum.tt,aero.tt,name.tt,gov.tt,edu.tt,tv,tw,edu.tw,gov.tw,mil.tw,com.tw,net.tw,org.tw,idv.tw,game.tw,ebiz.tw,club.tw,tz,ac.tz,co.tz,go.tz,hotel.tz,info.tz,me.tz,mil.tz,mobi.tz,ne.tz,or.tz,sc.tz,tv.tz,ua,com.ua,edu.ua,gov.ua,in.ua,net.ua,org.ua,ug,co.ug,or.ug,ac.ug,sc.ug,go.ug,ne.ug,com.ug,org.ug,uk,ac.uk,co.uk,gov.uk,ltd.uk,me.uk,net.uk,nhs.uk,org.uk,plc.uk,police.uk,us,dni.us,fed.us,isa.us,kids.us,nsn.us,ak.us,al.us,ar.us,as.us,az.us,ca.us,co.us,ct.us,dc.us,de.us,fl.us,ga.us,gu.us,hi.us,ia.us,id.us,il.us,in.us,ks.us,ky.us,la.us,ma.us,md.us,me.us,mi.us,mn.us,mo.us,ms.us,mt.us,nc.us,nd.us,ne.us,nh.us,nj.us,nm.us,nv.us,ny.us,oh.us,ok.us,or.us,pa.us,pr.us,ri.us,sc.us,sd.us,tn.us,tx.us,ut.us,vi.us,vt.us,va.us,wa.us,wi.us,wv.us,wy.us,uy,com.uy,edu.uy,gub.uy,mil.uy,net.uy,org.uy,uz,co.uz,com.uz,net.uz,org.uz,va,vc,com.vc,net.vc,org.vc,gov.vc,mil.vc,edu.vc,ve,arts.ve,bib.ve,co.ve,com.ve,e12.ve,edu.ve,firm.ve,gob.ve,gov.ve,info.ve,int.ve,mil.ve,net.ve,nom.ve,org.ve,rar.ve,rec.ve,store.ve,tec.ve,web.ve,vg,vi,co.vi,com.vi,k12.vi,net.vi,org.vi,vn,ac.vn,ai.vn,biz.vn,com.vn,edu.vn,gov.vn,health.vn,id.vn,info.vn,int.vn,io.vn,name.vn,net.vn,org.vn,pro.vn,vu,com.vu,edu.vu,net.vu,org.vu,wf,ws,com.ws,net.ws,org.ws,gov.ws,edu.ws,yt,ye,com.ye,edu.ye,gov.ye,net.ye,mil.ye,org.ye,ac.za,agric.za,alt.za,co.za,edu.za,gov.za,grondar.za,law.za,mil.za,net.za,ngo.za,nic.za,nis.za,nom.za,org.za,school.za,tm.za,web.za,zm,ac.zm,biz.zm,co.zm,com.zm,edu.zm,gov.zm,info.zm,mil.zm,net.zm,org.zm,sch.zm,zw,ac.zw,co.zw,gov.zw,mil.zw,org.zw".split(",");
135
+ //convert to Map
136
+ const _publicSuffixesMap = {};
137
+ publicSuffixes.forEach(tld => {
138
+ _publicSuffixesMap[tld] = true;
139
+ });
140
+ const publicSuffixesMap = _publicSuffixesMap;
141
+ function getTopLevelDomain(hostname) {
142
+ const [domain] = hostname.split(":");
143
+ const parts = domain.split(".");
144
+ if (parts[parts.length - 1] === "localhost" || parts.length < 2) {
145
+ return parts[parts.length - 1];
146
+ }
147
+ else {
148
+ const d = parts[parts.length - 2] + "." + parts[parts.length - 1];
149
+ if (parts.length > 2 && publicSuffixesMap[d]) {
150
+ return parts[parts.length - 3] + "." + d;
151
+ }
152
+ else {
153
+ return d;
154
+ }
155
+ }
156
+ }
157
+
158
+ class Processor {
159
+ constructor(options) {
160
+ this.selfOptions = options || {};
161
+ this.pipes = {};
162
+ }
163
+ options(options) {
164
+ if (options) {
165
+ this.selfOptions = options;
166
+ }
167
+ return this.selfOptions;
168
+ }
169
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
170
+ pipe(name, pipeArg) {
171
+ let pipe = pipeArg;
172
+ if (typeof name === "string") {
173
+ if (typeof pipe === "undefined") {
174
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
175
+ return this.pipes[name];
176
+ }
177
+ else {
178
+ this.pipes[name] = pipe;
179
+ }
180
+ }
181
+ if (name && name.name) {
182
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
183
+ pipe = name;
184
+ if (pipe.processor === this) {
185
+ return pipe;
186
+ }
187
+ this.pipes[pipe.name] = pipe;
188
+ }
189
+ pipe.processor = this;
190
+ return pipe;
191
+ }
192
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
193
+ process(input, pipe) {
194
+ let context = input;
195
+ context.options = this.options();
196
+ let nextPipe = pipe || input.pipe || "default";
197
+ let lastPipe;
198
+ while (nextPipe) {
199
+ if (typeof context.nextAfterChildren !== "undefined") {
200
+ // children processed and coming back to parent
201
+ context.next = context.nextAfterChildren;
202
+ context.nextAfterChildren = null;
203
+ }
204
+ if (typeof nextPipe === "string") {
205
+ nextPipe = this.pipe(nextPipe);
206
+ }
207
+ nextPipe.process(context);
208
+ lastPipe = nextPipe;
209
+ nextPipe = null;
210
+ if (context) {
211
+ if (context.next) {
212
+ context = context.next;
213
+ nextPipe = context.pipe || lastPipe;
214
+ }
215
+ }
216
+ }
217
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
218
+ return context.hasResult ? context.result : undefined;
219
+ }
220
+ }
221
+
222
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
223
+ class Pipe {
224
+ constructor(name) {
225
+ this.name = name;
226
+ this.filters = [];
227
+ }
228
+ process(input) {
229
+ if (!this.processor) {
230
+ throw new Error("add this pipe to a processor before using it");
231
+ }
232
+ const debug = this.debug;
233
+ const length = this.filters.length;
234
+ const context = input;
235
+ for (let index = 0; index < length; index++) {
236
+ const filter = this.filters[index];
237
+ if (debug) {
238
+ this.log(`filter: ${filter.filterName}`);
239
+ }
240
+ filter(context);
241
+ if (typeof context === "object" && context.exiting) {
242
+ context.exiting = false;
243
+ break;
244
+ }
245
+ }
246
+ if (!context.next && this.resultCheck) {
247
+ this.resultCheck(context);
248
+ }
249
+ }
250
+ log(msg) {
251
+ console.log(`[jsondiffpatch] ${this.name} pipe, ${msg}`);
252
+ }
253
+ append(...args) {
254
+ this.filters.push(...args);
255
+ return this;
256
+ }
257
+ prepend(...args) {
258
+ this.filters.unshift(...args);
259
+ return this;
260
+ }
261
+ indexOf(filterName) {
262
+ if (!filterName) {
263
+ throw new Error("a filter name is required");
264
+ }
265
+ for (let index = 0; index < this.filters.length; index++) {
266
+ const filter = this.filters[index];
267
+ if (filter.filterName === filterName) {
268
+ return index;
269
+ }
270
+ }
271
+ throw new Error(`filter not found: ${filterName}`);
272
+ }
273
+ list() {
274
+ return this.filters.map(f => f.filterName);
275
+ }
276
+ after(filterName, ...params) {
277
+ const index = this.indexOf(filterName);
278
+ this.filters.splice(index + 1, 0, ...params);
279
+ return this;
280
+ }
281
+ before(filterName, ...params) {
282
+ const index = this.indexOf(filterName);
283
+ this.filters.splice(index, 0, ...params);
284
+ return this;
285
+ }
286
+ replace(filterName, ...params) {
287
+ const index = this.indexOf(filterName);
288
+ this.filters.splice(index, 1, ...params);
289
+ return this;
290
+ }
291
+ remove(filterName) {
292
+ const index = this.indexOf(filterName);
293
+ this.filters.splice(index, 1);
294
+ return this;
295
+ }
296
+ clear() {
297
+ this.filters.length = 0;
298
+ return this;
299
+ }
300
+ shouldHaveResult(should) {
301
+ if (should === false) {
302
+ this.resultCheck = null;
303
+ return;
304
+ }
305
+ if (this.resultCheck) {
306
+ return;
307
+ }
308
+ this.resultCheck = context => {
309
+ if (!context.hasResult) {
310
+ console.log(context);
311
+ const error = new Error(`${this.name} failed`);
312
+ error.noResult = true;
313
+ throw error;
314
+ }
315
+ };
316
+ return this;
317
+ }
318
+ }
319
+
320
+ class Context {
321
+ setResult(result) {
322
+ this.result = result;
323
+ this.hasResult = true;
324
+ return this;
325
+ }
326
+ exit() {
327
+ this.exiting = true;
328
+ return this;
329
+ }
330
+ push(child, name) {
331
+ child.parent = this;
332
+ if (typeof name !== "undefined") {
333
+ child.childName = name;
334
+ }
335
+ child.root = this.root || this;
336
+ child.options = child.options || this.options;
337
+ if (!this.children) {
338
+ this.children = [child];
339
+ this.nextAfterChildren = this.next || null;
340
+ this.next = child;
341
+ }
342
+ else {
343
+ this.children[this.children.length - 1].next = child;
344
+ this.children.push(child);
345
+ }
346
+ child.next = this;
347
+ return this;
348
+ }
349
+ }
350
+
351
+ class DiffContext extends Context {
352
+ constructor(left, right) {
353
+ super();
354
+ this.left = left;
355
+ this.right = right;
356
+ this.pipe = "diff";
357
+ }
358
+ setResult(result) {
359
+ return super.setResult(result);
360
+ }
361
+ }
362
+
363
+ class PatchContext extends Context {
364
+ constructor(left, delta) {
365
+ super();
366
+ this.left = left;
367
+ this.delta = delta;
368
+ this.pipe = "patch";
369
+ }
370
+ }
371
+
372
+ function arrayEquals(a, b) {
373
+ if (a.length !== b.length) {
374
+ return false;
375
+ }
376
+ for (let i = 0; i < a.length; i++) {
377
+ if (a[i] !== b[i]) {
378
+ return false;
379
+ }
380
+ }
381
+ return true;
382
+ }
383
+ const diffFilter$1 = function trivialMatchesDiffFilter(context) {
384
+ if (context.left === context.right) {
385
+ context.setResult(undefined).exit();
386
+ return;
387
+ }
388
+ if (typeof context.left === "undefined") {
389
+ if (typeof context.right === "function") {
390
+ throw new Error("functions are not supported");
391
+ }
392
+ context.setResult([context.right]).exit();
393
+ return;
394
+ }
395
+ if (typeof context.right === "undefined") {
396
+ context.setResult([context.left, 0, 0]).exit();
397
+ return;
398
+ }
399
+ if (typeof context.left === "function" || typeof context.right === "function") {
400
+ throw new Error("functions are not supported");
401
+ }
402
+ context.leftType = context.left === null ? "null" : typeof context.left;
403
+ context.rightType = context.right === null ? "null" : typeof context.right;
404
+ if (context.leftType !== context.rightType) {
405
+ context.setResult([context.left, context.right]).exit();
406
+ return;
407
+ }
408
+ if (context.leftType === "boolean" || context.leftType === "number" || context.leftType === "string") {
409
+ context.setResult([context.left, context.right]).exit();
410
+ return;
411
+ }
412
+ if (context.leftType === "object") {
413
+ context.leftIsArray = Array.isArray(context.left);
414
+ }
415
+ if (context.rightType === "object") {
416
+ context.rightIsArray = Array.isArray(context.right);
417
+ }
418
+ if (context.leftIsArray !== context.rightIsArray) {
419
+ context.setResult([context.left, context.right]).exit();
420
+ return;
421
+ }
422
+ if (context.leftIsArray && context.rightIsArray) {
423
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
424
+ if (arrayEquals(context.left, context.right)) {
425
+ context.setResult(undefined).exit();
426
+ return;
427
+ }
428
+ else {
429
+ context.setResult([context.left, context.right]).exit();
430
+ return;
431
+ }
432
+ }
433
+ if (context.left instanceof RegExp) {
434
+ if (context.right instanceof RegExp) {
435
+ context.setResult([context.left.toString(), context.right.toString()]).exit();
436
+ }
437
+ else {
438
+ context.setResult([context.left, context.right]).exit();
439
+ }
440
+ }
441
+ };
442
+ diffFilter$1.filterName = "trivial";
443
+ const patchFilter$1 = function trivialMatchesPatchFilter(context) {
444
+ if (typeof context.delta === "undefined") {
445
+ context.setResult(context.left).exit();
446
+ return;
447
+ }
448
+ context.nested = !Array.isArray(context.delta);
449
+ if (context.nested) {
450
+ return;
451
+ }
452
+ const nonNestedDelta = context.delta;
453
+ if (nonNestedDelta.length === 1) {
454
+ context.setResult(nonNestedDelta[0]).exit();
455
+ return;
456
+ }
457
+ if (nonNestedDelta.length === 2) {
458
+ if (context.left instanceof RegExp) {
459
+ const regexArgs = /^\/(.*)\/([gimyu]+)$/.exec(nonNestedDelta[1]);
460
+ if (regexArgs) {
461
+ context.setResult(new RegExp(regexArgs[1], regexArgs[2])).exit();
462
+ return;
463
+ }
464
+ }
465
+ context.setResult(nonNestedDelta[1]).exit();
466
+ return;
467
+ }
468
+ if (nonNestedDelta.length === 3 && nonNestedDelta[2] === 0) {
469
+ context.setResult(undefined).exit();
470
+ }
471
+ };
472
+ patchFilter$1.filterName = "trivial";
473
+
474
+ const collectChildrenDiffFilter = context => {
475
+ if (!context || !context.children) {
476
+ return;
477
+ }
478
+ const length = context.children.length;
479
+ let child;
480
+ let result = context.result;
481
+ for (let index = 0; index < length; index++) {
482
+ child = context.children[index];
483
+ if (typeof child.result === "undefined") {
484
+ continue;
485
+ }
486
+ result = result || {};
487
+ result[child.childName] = child.result;
488
+ }
489
+ if (result && context.leftIsArray) {
490
+ result._t = "a";
491
+ }
492
+ context.setResult(result).exit();
493
+ };
494
+ collectChildrenDiffFilter.filterName = "collectChildren";
495
+ const objectsDiffFilter = context => {
496
+ if (context.leftIsArray || context.leftType !== "object") {
497
+ return;
498
+ }
499
+ const left = context.left;
500
+ const right = context.right;
501
+ let name;
502
+ let child;
503
+ const propertyFilter = context.options.propertyFilter;
504
+ for (name in left) {
505
+ if (!Object.prototype.hasOwnProperty.call(left, name)) {
506
+ continue;
507
+ }
508
+ if (propertyFilter && !propertyFilter(name, context)) {
509
+ continue;
510
+ }
511
+ child = new DiffContext(left[name], right[name]);
512
+ context.push(child, name);
513
+ }
514
+ for (name in right) {
515
+ if (!Object.prototype.hasOwnProperty.call(right, name)) {
516
+ continue;
517
+ }
518
+ if (propertyFilter && !propertyFilter(name, context)) {
519
+ continue;
520
+ }
521
+ if (typeof left[name] === "undefined") {
522
+ child = new DiffContext(undefined, right[name]);
523
+ context.push(child, name);
524
+ }
525
+ }
526
+ if (!context.children || context.children.length === 0) {
527
+ context.setResult(undefined).exit();
528
+ return;
529
+ }
530
+ context.exit();
531
+ };
532
+ objectsDiffFilter.filterName = "objects";
533
+ const patchFilter = function nestedPatchFilter(context) {
534
+ if (!context.nested) {
535
+ return;
536
+ }
537
+ const nestedDelta = context.delta;
538
+ if (nestedDelta._t) {
539
+ return;
540
+ }
541
+ const objectDelta = nestedDelta;
542
+ let name;
543
+ let child;
544
+ for (name in objectDelta) {
545
+ child = new PatchContext(context.left[name], objectDelta[name]);
546
+ context.push(child, name);
547
+ }
548
+ context.exit();
549
+ };
550
+ patchFilter.filterName = "objects";
551
+ const collectChildrenPatchFilter = function collectChildrenPatchFilter(context) {
552
+ if (!context || !context.children) {
553
+ return;
554
+ }
555
+ const deltaWithChildren = context.delta;
556
+ if (deltaWithChildren._t) {
557
+ return;
558
+ }
559
+ const object = context.left;
560
+ const length = context.children.length;
561
+ let child;
562
+ for (let index = 0; index < length; index++) {
563
+ child = context.children[index];
564
+ const property = child.childName;
565
+ if (Object.prototype.hasOwnProperty.call(context.left, property) && child.result === undefined) {
566
+ delete object[property];
567
+ }
568
+ else if (object[property] !== child.result) {
569
+ object[property] = child.result;
570
+ }
571
+ }
572
+ context.setResult(object).exit();
573
+ };
574
+ collectChildrenPatchFilter.filterName = "collectChildren";
575
+
576
+ const diffFilter = function datesDiffFilter(context) {
577
+ if (context.left instanceof Date) {
578
+ if (context.right instanceof Date) {
579
+ if (context.left.getTime() !== context.right.getTime()) {
580
+ context.setResult([context.left, context.right]);
581
+ }
582
+ else {
583
+ context.setResult(undefined);
584
+ }
585
+ }
586
+ else {
587
+ context.setResult([context.left, context.right]);
588
+ }
589
+ context.exit();
590
+ }
591
+ else if (context.right instanceof Date) {
592
+ context.setResult([context.left, context.right]).exit();
593
+ }
594
+ };
595
+ diffFilter.filterName = "dates";
596
+
597
+ class DiffPatcher {
598
+ constructor(options) {
599
+ this.processor = new Processor(options);
600
+ this.processor.pipe(new Pipe("diff")
601
+ .append(collectChildrenDiffFilter, diffFilter$1, diffFilter, objectsDiffFilter)
602
+ .shouldHaveResult());
603
+ this.processor.pipe(new Pipe("patch")
604
+ .append(collectChildrenPatchFilter, patchFilter$1, patchFilter)
605
+ .shouldHaveResult());
606
+ }
607
+ options(options) {
608
+ return this.processor.options(options);
609
+ }
610
+ diff(left, right) {
611
+ return this.processor.process(new DiffContext(left, right));
612
+ }
613
+ patch(left, delta) {
614
+ return this.processor.process(new PatchContext(left, delta));
615
+ }
616
+ }
617
+
618
+ function create(options) {
619
+ return new DiffPatcher(options);
620
+ }
621
+
622
+ /* global analytics */
623
+ var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
624
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
625
+ return new (P || (P = Promise))(function (resolve, reject) {
626
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
627
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
628
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
629
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
630
+ });
631
+ };
632
+ const diff = create();
633
+ const defaultConfig = {
634
+ /* Your segment writeKey */
635
+ writeKey: null,
636
+ /* Disable anonymous MTU */
637
+ host: null,
638
+ debug: false,
639
+ fetch: null,
640
+ echoEvents: false,
641
+ cookieDomain: undefined,
642
+ cookieNames: {},
643
+ cookieCapture: {},
644
+ runtime: undefined,
645
+ fetchTimeoutMs: undefined,
646
+ s2s: undefined,
647
+ idEndpoint: undefined,
648
+ errorPolicy: "log",
649
+ defaultPayloadContext: {},
650
+ privacy: {
651
+ dontSend: false,
652
+ disableUserIds: false,
653
+ ipPolicy: "keep",
654
+ consentCategories: undefined,
655
+ },
656
+ };
657
+ // mergeConfig merges newConfig into currentConfig also making sure that all undefined values are replaced with defaultConfig values
658
+ const mergeConfig = (current, newConfig) => {
659
+ for (const key of Object.keys(defaultConfig)) {
660
+ const value = newConfig[key];
661
+ if (key === "privacy") {
662
+ if (typeof value === "object") {
663
+ current.privacy = Object.assign(Object.assign(Object.assign({}, defaultConfig.privacy), current.privacy), value);
664
+ }
665
+ else if (newConfig.hasOwnProperty("privacy") && typeof value === "undefined") {
666
+ // explicitly set to undefined - reset to default
667
+ current.privacy = Object.assign({}, defaultConfig.privacy);
668
+ }
669
+ }
670
+ else if (typeof value === "undefined") {
671
+ if (newConfig.hasOwnProperty(key) || !current.hasOwnProperty(key)) {
672
+ // explicitly set to undefined - reset to default
673
+ // or was not set at all - set to default
674
+ current[key] = defaultConfig[key];
675
+ }
676
+ }
677
+ else {
678
+ current[key] = value;
679
+ }
680
+ }
681
+ };
682
+ const parseQuery = (qs) => {
683
+ if (!qs) {
684
+ return {};
685
+ }
686
+ let queryString = qs.length > 0 && qs.charAt(0) === "?" ? qs.substring(1) : qs;
687
+ let query = {};
688
+ let pairs = (queryString[0] === "?" ? queryString.substr(1) : queryString).split("&");
689
+ for (let i = 0; i < pairs.length; i++) {
690
+ let pair = pairs[i].split("=");
691
+ query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || "");
692
+ }
693
+ return query;
694
+ };
695
+ function utmToKey(key) {
696
+ const name = key.substring("utm_".length);
697
+ return name === "campaign" ? "name" : name;
698
+ }
699
+ function parseUtms(query) {
700
+ return Object.entries(query)
701
+ .filter(([key]) => key.indexOf("utm_") === 0)
702
+ .reduce((acc, [key, value]) => (Object.assign(Object.assign({}, acc), { [utmToKey(key)]: value })), {});
703
+ }
704
+ function safeCall(f, defaultVal) {
705
+ try {
706
+ return f();
707
+ }
708
+ catch (e) {
709
+ return defaultVal;
710
+ }
711
+ }
712
+ function restoreTraits(storage) {
713
+ let val = storage.getItem("__user_traits");
714
+ if (typeof val === "string") {
715
+ val = safeCall(() => JSON.parse(val), {});
716
+ }
717
+ if (typeof val !== "object" || val === null || Array.isArray(val)) {
718
+ val = {};
719
+ }
720
+ let groupVal = storage.getItem("__group_traits");
721
+ if (typeof groupVal === "string") {
722
+ groupVal = safeCall(() => JSON.parse(groupVal), {});
723
+ }
724
+ if (typeof groupVal !== "object" || groupVal === null || Array.isArray(groupVal)) {
725
+ groupVal = {};
726
+ }
727
+ return Object.assign(Object.assign({}, (groupVal || {})), (val || {}));
728
+ }
729
+ function getCookie(name) {
730
+ const value = `; ${document.cookie}`;
731
+ const parts = value.split(`; ${name}=`);
732
+ return parts.length === 2 ? parts.pop().split(";").shift() : undefined;
733
+ }
734
+ function getClientIds(runtime, customCookieCapture) {
735
+ const cookieCapture = Object.assign({ fbc: "_fbc", fbp: "_fbp" }, customCookieCapture);
736
+ const clientIds = Object.entries(cookieCapture).reduce((acc, [key, cookieName]) => {
737
+ acc[key] = runtime.getCookie(cookieName);
738
+ return acc;
739
+ }, {});
740
+ return Object.assign(Object.assign({}, clientIds), getGa4Ids(runtime));
741
+ }
742
+ function getGa4Ids(runtime) {
743
+ var _a;
744
+ const allCookies = runtime.getCookies();
745
+ const clientId = (_a = allCookies["_ga"]) === null || _a === void 0 ? void 0 : _a.split(".").slice(-2).join(".");
746
+ const gaSessionCookies = Object.entries(allCookies).filter(([key]) => key.startsWith("_ga_"));
747
+ const sessionIds = gaSessionCookies.length > 0
748
+ ? Object.fromEntries(gaSessionCookies
749
+ .map(([key, value]) => {
750
+ if (typeof value !== "string") {
751
+ return null;
752
+ }
753
+ const parts = value.split(".");
754
+ if (parts.length < 3) {
755
+ return null;
756
+ }
757
+ return [key.substring("_ga_".length), parts[2]];
758
+ })
759
+ .filter(v => v !== null))
760
+ : undefined;
761
+ if (clientId || sessionIds) {
762
+ return { ga4: { clientId, sessionIds } };
763
+ }
764
+ else {
765
+ return undefined;
766
+ }
767
+ }
768
+ function removeCookie(name, { domain, secure }) {
769
+ document.cookie =
770
+ name +
771
+ "=;domain=" +
772
+ domain +
773
+ ";path=/" +
774
+ ";expires=Thu, 01 Jan 1970 00:00:01 GMT;SameSite=" +
775
+ (secure ? "None" : "Lax") +
776
+ (secure ? ";secure" : "");
777
+ }
778
+ function setCookie(name, val, { domain, secure }) {
779
+ document.cookie =
780
+ name +
781
+ "=" +
782
+ val +
783
+ ";domain=" +
784
+ domain +
785
+ ";path=/" +
786
+ ";expires=" +
787
+ new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 365 * 5).toUTCString() +
788
+ ";SameSite=" +
789
+ (secure ? "None" : "Lax") +
790
+ (secure ? ";secure" : "");
791
+ }
792
+ const defaultCookie2Key = {
793
+ __anon_id: "__eventn_id",
794
+ __user_id: "__eventn_uid",
795
+ __user_traits: "__eventn_id_usr",
796
+ __group_id: "__group_id",
797
+ __group_traits: "__group_traits",
798
+ };
799
+ const cookieStorage = (cookieDomain, key2cookie) => {
800
+ return {
801
+ setItem(key, val) {
802
+ const cookieName = key2cookie(key) || key;
803
+ if (typeof val === "undefined") {
804
+ removeCookie(cookieName, {
805
+ domain: cookieDomain,
806
+ secure: window.location.protocol === "https:",
807
+ });
808
+ return;
809
+ }
810
+ const strVal = typeof val === "object" && val !== null ? encodeURIComponent(JSON.stringify(val)) : val;
811
+ setCookie(cookieName, strVal, {
812
+ domain: cookieDomain,
813
+ secure: window.location.protocol === "https:",
814
+ });
815
+ },
816
+ getItem(key) {
817
+ const cookieName = key2cookie(key) || key;
818
+ const result = getCookie(cookieName);
819
+ if (key === "__anon_id") {
820
+ //anonymous id must always be a string, so we don't parse it to preserve its exact value
821
+ return result;
822
+ }
823
+ if (typeof result === "undefined" && key === "__user_id") {
824
+ //backward compatibility with old jitsu cookie. get user id if from traits
825
+ const traits = parse(getCookie(key2cookie("__user_traits") || "__eventn_id_usr")) || {};
826
+ return traits.internal_id || traits.user_id || traits.id || traits.userId;
827
+ }
828
+ return parse(result);
829
+ },
830
+ removeItem(key) {
831
+ removeCookie(key2cookie(key) || key, {
832
+ domain: cookieDomain,
833
+ secure: window.location.protocol === "https:",
834
+ });
835
+ },
836
+ reset() {
837
+ for (const key of Object.keys(defaultCookie2Key)) {
838
+ removeCookie(key2cookie(key) || key, {
839
+ domain: cookieDomain,
840
+ secure: window.location.protocol === "https:",
841
+ });
842
+ }
843
+ },
844
+ };
845
+ };
846
+ function windowRuntime(opts) {
847
+ const key2Cookie = (key) => {
848
+ var _a, _b, _c, _d, _e;
849
+ switch (key) {
850
+ case "__anon_id":
851
+ return ((_a = opts.cookieNames) === null || _a === void 0 ? void 0 : _a.anonymousId) || defaultCookie2Key.__anon_id;
852
+ case "__user_id":
853
+ return ((_b = opts.cookieNames) === null || _b === void 0 ? void 0 : _b.userId) || defaultCookie2Key.__user_id;
854
+ case "__user_traits":
855
+ return ((_c = opts.cookieNames) === null || _c === void 0 ? void 0 : _c.userTraits) || defaultCookie2Key.__user_traits;
856
+ case "__group_id":
857
+ return ((_d = opts.cookieNames) === null || _d === void 0 ? void 0 : _d.groupId) || defaultCookie2Key.__group_id;
858
+ case "__group_traits":
859
+ return ((_e = opts.cookieNames) === null || _e === void 0 ? void 0 : _e.groupTraits) || defaultCookie2Key.__group_traits;
860
+ default:
861
+ return key;
862
+ }
863
+ };
864
+ return {
865
+ getCookie(name) {
866
+ const value = `; ${document.cookie}`;
867
+ const parts = value.split(`; ${name}=`);
868
+ return parts.length === 2 ? parts.pop().split(";").shift() : undefined;
869
+ },
870
+ getCookies() {
871
+ const value = `; ${document.cookie}`;
872
+ const cookies = {};
873
+ const matches = value.matchAll(/(\w+)=([^;]+)/g);
874
+ for (const match of matches) {
875
+ cookies[match[1]] = match[2];
876
+ }
877
+ return cookies;
878
+ },
879
+ documentEncoding() {
880
+ return window.document.characterSet;
881
+ },
882
+ timezoneOffset() {
883
+ return new Date().getTimezoneOffset();
884
+ },
885
+ store() {
886
+ return cookieStorage(opts.cookieDomain || getTopLevelDomain(window.location.hostname), key2Cookie);
887
+ },
888
+ language() {
889
+ return window.navigator.language;
890
+ },
891
+ pageTitle() {
892
+ return window.document.title;
893
+ },
894
+ pageUrl() {
895
+ return window.location.href;
896
+ },
897
+ referrer() {
898
+ return window.document.referrer;
899
+ },
900
+ screen() {
901
+ return {
902
+ width: window.screen.width,
903
+ height: window.screen.height,
904
+ innerWidth: window.innerWidth,
905
+ innerHeight: window.innerHeight,
906
+ density: Math.floor(window.devicePixelRatio),
907
+ };
908
+ },
909
+ userAgent() {
910
+ return window.navigator.userAgent;
911
+ },
912
+ };
913
+ }
914
+ function createInMemoryStorage(debug) {
915
+ const storage = {};
916
+ return {
917
+ reset() {
918
+ Object.keys(storage).forEach(key => delete storage[key]);
919
+ },
920
+ setItem(key, val) {
921
+ if (debug) {
922
+ console.log(`[JITSU EMPTY RUNTIME] Set storage item ${key}=${JSON.stringify(val)}`);
923
+ }
924
+ if (typeof val === "undefined") {
925
+ delete storage[key];
926
+ }
927
+ else {
928
+ storage[key] = val;
929
+ }
930
+ },
931
+ getItem(key) {
932
+ const val = storage[key];
933
+ if (debug) {
934
+ console.log(`[JITSU EMPTY RUNTIME] Get storage item ${key}=${JSON.stringify(val)}`);
935
+ }
936
+ return val;
937
+ },
938
+ removeItem(key) {
939
+ if (debug) {
940
+ console.log(`[JITSU EMPTY RUNTIME] Get storage item ${key}=${storage[key]}`);
941
+ }
942
+ delete storage[key];
943
+ },
944
+ };
945
+ }
946
+ const emptyRuntime = (config) => ({
947
+ documentEncoding() {
948
+ return undefined;
949
+ },
950
+ timezoneOffset() {
951
+ return undefined;
952
+ },
953
+ getCookie(name) {
954
+ return undefined;
955
+ },
956
+ getCookies() {
957
+ return {};
958
+ },
959
+ store() {
960
+ return createInMemoryStorage(config.debug);
961
+ },
962
+ language() {
963
+ return undefined;
964
+ },
965
+ pageTitle() {
966
+ return undefined;
967
+ },
968
+ pageUrl() {
969
+ return undefined;
970
+ },
971
+ referrer() {
972
+ return undefined;
973
+ },
974
+ screen() {
975
+ return undefined;
976
+ },
977
+ userAgent() {
978
+ return undefined;
979
+ },
980
+ });
981
+ function deepMerge(target, source) {
982
+ if (typeof source !== "object" || source === null) {
983
+ return source;
984
+ }
985
+ if (typeof target !== "object" || target === null) {
986
+ return source;
987
+ }
988
+ return Object.entries(source).reduce((acc, [key, value]) => {
989
+ acc[key] = deepMerge(target[key], value);
990
+ return acc;
991
+ }, target);
992
+ }
993
+ function isInBrowser() {
994
+ return typeof document !== "undefined" && typeof window !== "undefined";
995
+ }
996
+ /**
997
+ * Fixes a weird bug in analytics URL where path
998
+ * of https://test.com becomes //test.com
999
+ */
1000
+ function fixPath(path) {
1001
+ if (path.indexOf("//") === 0 && path.lastIndexOf("/") === 1) {
1002
+ return "/";
1003
+ }
1004
+ return path;
1005
+ }
1006
+ const hashRegex = /#.*$/;
1007
+ /**
1008
+ * for compatibility with path produced by analytics.js
1009
+ * @param url
1010
+ */
1011
+ function urlPath(url) {
1012
+ const regex = /(http[s]?:\/\/)?([^\/\s]+\/)(.*)/g;
1013
+ const matches = regex.exec(url);
1014
+ const pathMatch = matches && matches[3] ? matches[3].split("?")[0].replace(hashRegex, "") : "";
1015
+ return "/" + pathMatch;
1016
+ }
1017
+ function adjustPayload(payload, config, storage, s2s) {
1018
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
1019
+ const runtime = config.runtime || (isInBrowser() ? windowRuntime(config) : emptyRuntime(config));
1020
+ const url = runtime.pageUrl();
1021
+ const parsedUrl = safeCall(() => new URL(url), undefined);
1022
+ const query = parsedUrl ? parseQuery(parsedUrl.search) : {};
1023
+ const properties = payload.properties || {};
1024
+ if (payload.type === "page" && (properties.url || url)) {
1025
+ const targetUrl = properties.url || url;
1026
+ properties.url = targetUrl.replace(hashRegex, "");
1027
+ properties.path = fixPath(urlPath(targetUrl));
1028
+ }
1029
+ const customContext = deepMerge(config.defaultPayloadContext, ((_a = payload.properties) === null || _a === void 0 ? void 0 : _a.context) || ((_b = payload.options) === null || _b === void 0 ? void 0 : _b.context) || {});
1030
+ (_c = payload.properties) === null || _c === void 0 ? true : delete _c.context;
1031
+ const referrer = runtime.referrer();
1032
+ const context = {
1033
+ library: {
1034
+ name: jitsuLibraryName,
1035
+ version: jitsuVersion,
1036
+ env: isInBrowser() ? "browser" : "node",
1037
+ },
1038
+ consent: ((_d = config.privacy) === null || _d === void 0 ? void 0 : _d.consentCategories)
1039
+ ? {
1040
+ categoryPreferences: config.privacy.consentCategories,
1041
+ }
1042
+ : undefined,
1043
+ userAgent: (_e = runtime.userAgent) === null || _e === void 0 ? void 0 : _e.call(runtime),
1044
+ locale: (_f = runtime.language) === null || _f === void 0 ? void 0 : _f.call(runtime),
1045
+ screen: (_g = runtime.screen) === null || _g === void 0 ? void 0 : _g.call(runtime),
1046
+ ip: (_h = runtime === null || runtime === void 0 ? void 0 : runtime.ip) === null || _h === void 0 ? void 0 : _h.call(runtime),
1047
+ traits: payload.type != "identify" && payload.type != "group"
1048
+ ? Object.assign(Object.assign({}, (restoreTraits(storage) || {})), (((_j = payload === null || payload === void 0 ? void 0 : payload.options) === null || _j === void 0 ? void 0 : _j.traits) || {})) : undefined,
1049
+ page: {
1050
+ path: properties.path || (parsedUrl && parsedUrl.pathname),
1051
+ referrer: referrer,
1052
+ referring_domain: safeCall(() => referrer && new URL(referrer).hostname),
1053
+ host: parsedUrl && parsedUrl.host,
1054
+ search: properties.search || (parsedUrl && parsedUrl.search),
1055
+ title: properties.title || runtime.pageTitle(),
1056
+ url: properties.url || url,
1057
+ encoding: properties.encoding || runtime.documentEncoding(),
1058
+ },
1059
+ clientIds: !((_k = config.privacy) === null || _k === void 0 ? void 0 : _k.disableUserIds) ? getClientIds(runtime, config.cookieCapture) : undefined,
1060
+ campaign: parseUtms(query),
1061
+ };
1062
+ const withContext = Object.assign(Object.assign({}, payload), { userId: ((_l = payload === null || payload === void 0 ? void 0 : payload.options) === null || _l === void 0 ? void 0 : _l.userId) || (payload === null || payload === void 0 ? void 0 : payload.userId), anonymousId: ((_m = payload === null || payload === void 0 ? void 0 : payload.options) === null || _m === void 0 ? void 0 : _m.anonymousId) || (payload === null || payload === void 0 ? void 0 : payload.anonymousId), groupId: ((_o = payload === null || payload === void 0 ? void 0 : payload.options) === null || _o === void 0 ? void 0 : _o.groupId) || storage.getItem("__group_id"), timestamp: new Date().toISOString(), sentAt: new Date().toISOString(), messageId: randomId(properties.path || (parsedUrl && parsedUrl.pathname)), writeKey: maskWriteKey(config.writeKey), context: deepMerge(context, customContext) });
1063
+ delete withContext.meta;
1064
+ delete withContext.options;
1065
+ if ((_p = config.privacy) === null || _p === void 0 ? void 0 : _p.disableUserIds) {
1066
+ delete withContext.userId;
1067
+ delete withContext.anonymousId;
1068
+ delete withContext.context.traits;
1069
+ delete withContext.groupId;
1070
+ }
1071
+ return withContext;
1072
+ }
1073
+ function isDiff(obj) {
1074
+ const keys = Object.keys(obj);
1075
+ return keys.length === 1 && keys[0] === "__diff";
1076
+ }
1077
+ function processDestinations(destinations, method, originalEvent, debug, analyticsInstance) {
1078
+ return __awaiter$1(this, void 0, void 0, function* () {
1079
+ const promises = [];
1080
+ for (const destination of destinations) {
1081
+ let newEvents = [originalEvent];
1082
+ if (destination.newEvents) {
1083
+ try {
1084
+ newEvents = destination.newEvents.map(e => e === "same" ? originalEvent : isDiff(e) ? diff.patch(originalEvent, e.__diff) : e);
1085
+ }
1086
+ catch (e) {
1087
+ console.error(`[JITSU] Error applying '${destination.id}' changes to event: ${e === null || e === void 0 ? void 0 : e.message}`, e);
1088
+ }
1089
+ }
1090
+ const credentials = Object.assign(Object.assign({}, destination.credentials), destination.options);
1091
+ if (destination.deviceOptions.type === "internal-plugin") {
1092
+ const plugin = internalDestinationPlugins[destination.deviceOptions.name];
1093
+ if (plugin) {
1094
+ for (const event of newEvents) {
1095
+ try {
1096
+ promises.push(plugin.handle(Object.assign(Object.assign({}, credentials), { debug }), event));
1097
+ }
1098
+ catch (e) {
1099
+ console.warn(`[JITSU] Error processing event with internal plugin '${destination.deviceOptions.name}': ${e === null || e === void 0 ? void 0 : e.message}`, e);
1100
+ }
1101
+ }
1102
+ }
1103
+ else {
1104
+ console.warn(`[JITSU] Unknown internal plugin '${destination.deviceOptions.name}' for destination '${destination.id}'`);
1105
+ }
1106
+ }
1107
+ else if (destination.deviceOptions.type === "analytics-plugin") {
1108
+ yield loadScript(destination.deviceOptions.packageCdn);
1109
+ const plugin = window[destination.deviceOptions.moduleVarName];
1110
+ if (!plugin) {
1111
+ console.warn(`[JITSU] Broken plugin '${destination.deviceOptions.packageCdn}' for destination '${destination.id}' - it doesn't export '${destination.deviceOptions.moduleVarName}' variable`);
1112
+ }
1113
+ else {
1114
+ let pluginInstance;
1115
+ try {
1116
+ pluginInstance = (typeof plugin === "function" ? plugin : plugin.init)(credentials);
1117
+ }
1118
+ catch (e) {
1119
+ console.warn(`[JITSU] Error creating plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}': ${e === null || e === void 0 ? void 0 : e.message}`, e);
1120
+ }
1121
+ try {
1122
+ if (debug) {
1123
+ console.log(`[JITSU] Plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}' initialized with config:`, pluginInstance.config);
1124
+ }
1125
+ pluginInstance.initialize({ config: pluginInstance.config, instance: analyticsInstance });
1126
+ }
1127
+ catch (e) {
1128
+ console.warn(`[JITSU] Error initializing plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}': ${e === null || e === void 0 ? void 0 : e.message}. Config: ${JSON.stringify(pluginInstance.config)}`, e);
1129
+ continue;
1130
+ }
1131
+ if (pluginInstance[method]) {
1132
+ for (const event of newEvents) {
1133
+ try {
1134
+ pluginInstance[method]({
1135
+ payload: event,
1136
+ config: pluginInstance.config,
1137
+ instance: analyticsInstance,
1138
+ });
1139
+ }
1140
+ catch (e) {
1141
+ console.warn(`[JITSU] Error processing ${method}() with plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}': ${e === null || e === void 0 ? void 0 : e.message}`, e);
1142
+ }
1143
+ }
1144
+ }
1145
+ }
1146
+ }
1147
+ }
1148
+ });
1149
+ }
1150
+ function looksLikeCuid(id) {
1151
+ return id.length === 25 && id.charAt(0) === "c";
1152
+ }
1153
+ function validateWriteKey(writeKey) {
1154
+ if (writeKey) {
1155
+ const [, secret] = writeKey.split(":", 2);
1156
+ if (!secret && !looksLikeCuid(writeKey)) {
1157
+ throw new Error(`Legacy write key detected - ${writeKey}! This format doesn't work anymore, it should be 'key:secret'. Please download a new key from Jitsu UI`);
1158
+ }
1159
+ }
1160
+ return writeKey;
1161
+ }
1162
+ function maskWriteKey(writeKey) {
1163
+ if (writeKey) {
1164
+ const [id, secret] = writeKey.split(":", 2);
1165
+ if (secret) {
1166
+ return `${id}:***`;
1167
+ }
1168
+ else {
1169
+ return "***";
1170
+ }
1171
+ }
1172
+ return writeKey;
1173
+ }
1174
+ function getErrorHandler(opts) {
1175
+ const configuredHandler = opts.errorPolicy || "log";
1176
+ if (typeof configuredHandler === "function") {
1177
+ return configuredHandler;
1178
+ }
1179
+ else if (configuredHandler === "rethrow") {
1180
+ return (msg, ...args) => {
1181
+ //ignore args, not clear what to do with them
1182
+ throw new Error(msg);
1183
+ };
1184
+ }
1185
+ else {
1186
+ return (msg, ...args) => {
1187
+ console.error(msg, ...args);
1188
+ };
1189
+ }
1190
+ }
1191
+ function send(method, payload, jitsuConfig, instance, store) {
1192
+ return __awaiter$1(this, void 0, void 0, function* () {
1193
+ var _a, _b;
1194
+ const s2s = !!jitsuConfig.s2s;
1195
+ const debugHeader = jitsuConfig.debug ? { "X-Enable-Debug": "true" } : {};
1196
+ const adjustedPayload = adjustPayload(payload, jitsuConfig, store);
1197
+ if (jitsuConfig.echoEvents) {
1198
+ console.log(`[JITSU DEBUG] sending '${method}' event:`, adjustedPayload);
1199
+ return;
1200
+ }
1201
+ const url = s2s ? `${jitsuConfig.host}/api/s/s2s/${method}` : `${jitsuConfig.host}/api/s/${method}`;
1202
+ const fetch = jitsuConfig.fetch || globalThis.fetch;
1203
+ if (!fetch) {
1204
+ //don't run it through error handler since error is critical and should be addressed
1205
+ throw new Error("Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope");
1206
+ }
1207
+ const abortController = jitsuConfig.fetchTimeoutMs ? new AbortController() : undefined;
1208
+ const abortTimeout = jitsuConfig.fetchTimeoutMs
1209
+ ? setTimeout(() => {
1210
+ abortController.abort();
1211
+ }, jitsuConfig.fetchTimeoutMs)
1212
+ : undefined;
1213
+ const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {};
1214
+ const ipHeader = typeof ((_a = jitsuConfig.privacy) === null || _a === void 0 ? void 0 : _a.ipPolicy) === "undefined" || ((_b = jitsuConfig.privacy) === null || _b === void 0 ? void 0 : _b.ipPolicy) === "keep"
1215
+ ? {}
1216
+ : { "X-IP-Policy": jitsuConfig.privacy.ipPolicy };
1217
+ let fetchResult;
1218
+ try {
1219
+ fetchResult = yield fetch(url, {
1220
+ method: "POST",
1221
+ headers: Object.assign(Object.assign(Object.assign({ "Content-Type": "application/json" }, authHeader), debugHeader), ipHeader),
1222
+ body: JSON.stringify(adjustedPayload),
1223
+ signal: abortController === null || abortController === void 0 ? void 0 : abortController.signal,
1224
+ });
1225
+ if (abortTimeout) {
1226
+ clearTimeout(abortTimeout);
1227
+ }
1228
+ }
1229
+ catch (e) {
1230
+ getErrorHandler(jitsuConfig)(`Call to ${url} failed with error ${e.message}`);
1231
+ return Promise.resolve();
1232
+ }
1233
+ let responseText;
1234
+ try {
1235
+ responseText = yield fetchResult.text();
1236
+ }
1237
+ catch (e) {
1238
+ console.warn(`Can't read response text from ${url} (status - ${fetchResult.status} ${fetchResult.statusText}): ${e === null || e === void 0 ? void 0 : e.message}`);
1239
+ }
1240
+ if (jitsuConfig.debug) {
1241
+ console.log(`[JITSU DEBUG] ${url} replied ${fetchResult.status}: ${responseText}. Original payload:\n${JSON.stringify(adjustedPayload, null, 2)}`);
1242
+ }
1243
+ if (!fetchResult.ok) {
1244
+ getErrorHandler(jitsuConfig)(`Call to ${url} failed with error: ${fetchResult.status} - ${fetchResult.statusText}: ${responseText}`);
1245
+ return Promise.resolve();
1246
+ }
1247
+ let responseJson;
1248
+ try {
1249
+ responseJson = JSON.parse(responseText);
1250
+ }
1251
+ catch (e) {
1252
+ getErrorHandler(jitsuConfig)(`Can't parse JSON: ${responseText}: ${e === null || e === void 0 ? void 0 : e.message}`);
1253
+ return Promise.resolve();
1254
+ }
1255
+ if (responseJson.destinations && responseJson.destinations.length > 0) {
1256
+ if (jitsuConfig.s2s) {
1257
+ console.warn(`[JITSU] ${payload.type} responded with list of ${responseJson.destinations.length} destinations. However, this code is running in server-to-server mode, so destinations will be ignored`, jitsuConfig.debug ? JSON.stringify(responseJson.destinations, null, 2) : undefined);
1258
+ }
1259
+ else {
1260
+ //double protection, ingest should not return destinations in s2s mode
1261
+ if (isInBrowser()) {
1262
+ if (jitsuConfig.debug) {
1263
+ console.log(`[JITSU] Processing device destinations: `, JSON.stringify(responseJson.destinations, null, 2));
1264
+ }
1265
+ return processDestinations(responseJson.destinations, method, adjustedPayload, !!jitsuConfig.debug, instance);
1266
+ }
1267
+ }
1268
+ }
1269
+ return adjustedPayload;
1270
+ });
1271
+ }
1272
+ const controllingTraits = ["$doNotSend"];
1273
+ /**
1274
+ * Remove all members of traits that controls identify/group behavior (see analytics.d.ts), and should not be recorded. Returns
1275
+ * copy of the object with these members removed.
1276
+ *
1277
+ * Do not modify traits object, but creates one
1278
+ * @param traits
1279
+ */
1280
+ function stripControllingTraits(traits) {
1281
+ const res = Object.assign({}, traits);
1282
+ // see Traits definition in analytics.d.ts. We cannot define const here, so here's a little code duplication
1283
+ for (const key of controllingTraits) {
1284
+ delete res[key];
1285
+ }
1286
+ return res;
1287
+ }
1288
+ const jitsuAnalyticsPlugin = (jitsuOptions = {}, storage) => {
1289
+ // just to make sure that all undefined values are replaced with defaultConfig values
1290
+ mergeConfig(jitsuOptions, jitsuOptions);
1291
+ return {
1292
+ name: "jitsu",
1293
+ config: jitsuOptions,
1294
+ initialize: (args) => __awaiter$1(void 0, void 0, void 0, function* () {
1295
+ const { config } = args;
1296
+ if (config.debug) {
1297
+ console.debug("[JITSU DEBUG] Initializing Jitsu plugin with config: ", JSON.stringify(config, null, 2));
1298
+ }
1299
+ if (!config.host && !config.echoEvents) {
1300
+ throw new Error("Please specify host variable in jitsu plugin initialization, or set echoEvents to true");
1301
+ }
1302
+ validateWriteKey(config.writeKey);
1303
+ if (config.idEndpoint) {
1304
+ if (!isInBrowser()) {
1305
+ console.error(`[JITSU] 'idEndpoint' option can be used only in browser environment`);
1306
+ return;
1307
+ }
1308
+ try {
1309
+ const fetch = config.fetch || globalThis.fetch;
1310
+ const controller = new AbortController();
1311
+ setTimeout(() => controller.abort(), 1000);
1312
+ const domain = config.cookieDomain || getTopLevelDomain(window.location.hostname);
1313
+ const res = yield fetch(config.idEndpoint + "?domain=" + encodeURIComponent(domain), {
1314
+ credentials: "include",
1315
+ signal: controller.signal,
1316
+ });
1317
+ if (!res.ok) {
1318
+ console.error(`[JITSU] Can't fetch idEndpoint: ${res.status} - ${res.statusText}`);
1319
+ }
1320
+ else if (config.debug) {
1321
+ console.log(`[JITSU DEBUG] Fetch idEndpoint: ${res.status}`);
1322
+ }
1323
+ }
1324
+ catch (e) {
1325
+ console.error(`[JITSU] Can't fetch idEndpoint: ${e.message}`);
1326
+ }
1327
+ }
1328
+ }),
1329
+ page: args => {
1330
+ var _a;
1331
+ const { payload, config, instance } = args;
1332
+ if ((_a = config.privacy) === null || _a === void 0 ? void 0 : _a.dontSend) {
1333
+ return;
1334
+ }
1335
+ return send("page", payload, config, instance, storage);
1336
+ },
1337
+ track: args => {
1338
+ var _a;
1339
+ const { payload, config, instance } = args;
1340
+ if ((_a = config.privacy) === null || _a === void 0 ? void 0 : _a.dontSend) {
1341
+ return;
1342
+ }
1343
+ return send("track", payload, config, instance, storage);
1344
+ },
1345
+ identify: args => {
1346
+ var _a, _b, _c;
1347
+ const { payload, config, instance } = args;
1348
+ if (((_a = config.privacy) === null || _a === void 0 ? void 0 : _a.dontSend) || ((_b = config.privacy) === null || _b === void 0 ? void 0 : _b.disableUserIds)) {
1349
+ return;
1350
+ }
1351
+ // Store traits in cache to be able to use them in page and track events that run asynchronously with current identify.
1352
+ storage.setItem("__user_id", payload.userId);
1353
+ const doNotSend = (_c = payload.traits) === null || _c === void 0 ? void 0 : _c.$doNotSend;
1354
+ if (payload.traits && typeof payload.traits === "object") {
1355
+ payload.traits = stripControllingTraits(payload.traits);
1356
+ storage.setItem("__user_traits", payload.traits);
1357
+ }
1358
+ if (doNotSend) {
1359
+ return Promise.resolve();
1360
+ }
1361
+ return send("identify", payload, config, instance, storage);
1362
+ },
1363
+ reset: args => {
1364
+ const { config, instance } = args;
1365
+ storage.reset();
1366
+ if (config.debug) {
1367
+ console.log("[JITSU DEBUG] Resetting Jitsu plugin storage");
1368
+ }
1369
+ },
1370
+ methods: {
1371
+ //analytics doesn't support group as a base method, so we need to add it manually
1372
+ configure(newOptions) {
1373
+ var _a, _b, _c, _d;
1374
+ const idsWasDisabled = ((_a = jitsuOptions.privacy) === null || _a === void 0 ? void 0 : _a.disableUserIds) || ((_b = jitsuOptions.privacy) === null || _b === void 0 ? void 0 : _b.dontSend);
1375
+ mergeConfig(jitsuOptions, newOptions);
1376
+ const idsDisabledNow = ((_c = jitsuOptions.privacy) === null || _c === void 0 ? void 0 : _c.disableUserIds) || ((_d = jitsuOptions.privacy) === null || _d === void 0 ? void 0 : _d.dontSend);
1377
+ if (!idsDisabledNow && idsWasDisabled) {
1378
+ if (jitsuOptions.debug) {
1379
+ console.log("[JITSU] Enabling Anonymous ID. Generating new Id.");
1380
+ }
1381
+ const instance = this.instance;
1382
+ const newAnonymousId = uuid();
1383
+ const userState = instance.user();
1384
+ if (userState) {
1385
+ userState.anonymousId = newAnonymousId;
1386
+ }
1387
+ storage.setItem("__anon_id", newAnonymousId);
1388
+ instance.setAnonymousId(newAnonymousId);
1389
+ }
1390
+ },
1391
+ group(groupId, traits, options, callback) {
1392
+ var _a, _b;
1393
+ if (((_a = jitsuOptions.privacy) === null || _a === void 0 ? void 0 : _a.dontSend) || ((_b = jitsuOptions.privacy) === null || _b === void 0 ? void 0 : _b.disableUserIds)) {
1394
+ return;
1395
+ }
1396
+ if (typeof groupId === "number") {
1397
+ //fix potential issues with group id being used incorrectly
1398
+ groupId = groupId + "";
1399
+ }
1400
+ const instance = this.instance;
1401
+ const user = instance.user();
1402
+ const userId = (options === null || options === void 0 ? void 0 : options.userId) || (user === null || user === void 0 ? void 0 : user.userId);
1403
+ const anonymousId = (options === null || options === void 0 ? void 0 : options.anonymousId) || (user === null || user === void 0 ? void 0 : user.anonymousId) || storage.getItem("__anon_id");
1404
+ storage.setItem("__group_id", groupId);
1405
+ const doNotSend = traits === null || traits === void 0 ? void 0 : traits.$doNotSend;
1406
+ if (traits && typeof traits === "object") {
1407
+ traits = stripControllingTraits(traits);
1408
+ storage.setItem("__group_traits", traits);
1409
+ }
1410
+ if (doNotSend) {
1411
+ return Promise.resolve();
1412
+ }
1413
+ return send("group", Object.assign(Object.assign({ type: "group", groupId, traits }, (anonymousId ? { anonymousId } : {})), (userId ? { userId } : {})), jitsuOptions, instance, storage);
1414
+ },
1415
+ },
1416
+ };
1417
+ };
1418
+ let seedCounter = 0;
1419
+ function getSeed() {
1420
+ var _a;
1421
+ seedCounter = (seedCounter + 1) % Number.MAX_SAFE_INTEGER;
1422
+ const defaultSeed = Date.now() % 2147483647;
1423
+ const seed = isInBrowser() ? ((_a = window === null || window === void 0 ? void 0 : window.performance) === null || _a === void 0 ? void 0 : _a.now()) || defaultSeed : defaultSeed;
1424
+ return seed + seedCounter;
1425
+ }
1426
+ function randomId(hashString = "") {
1427
+ const d = Date.now();
1428
+ return (((Math.random() * d * hash(hashString !== null && hashString !== void 0 ? hashString : "", getSeed())) % Number.MAX_SAFE_INTEGER).toString(36) +
1429
+ ((Math.random() * d * hash(hashString !== null && hashString !== void 0 ? hashString : "", getSeed())) % Number.MAX_SAFE_INTEGER).toString(36));
1430
+ }
1431
+ function uuid() {
1432
+ var u = "", m = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx", i = 0, rb = (Math.random() * 0xffffffff) | 0;
1433
+ while (i++ < 36) {
1434
+ var c = m[i - 1], r = rb & 0xf, v = c == "x" ? r : (r & 0x3) | 0x8;
1435
+ u += c == "-" || c == "4" ? c : v.toString(16);
1436
+ rb = i % 8 == 0 ? (Math.random() * 0xffffffff) | 0 : rb >> 4;
1437
+ }
1438
+ return u;
1439
+ }
1440
+ function hash(str, seed = 0) {
1441
+ let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
1442
+ for (let i = 0, ch; i < str.length; i++) {
1443
+ ch = str.charCodeAt(i);
1444
+ h1 = Math.imul(h1 ^ ch, 2654435761);
1445
+ h2 = Math.imul(h2 ^ ch, 1597334677);
1446
+ }
1447
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
1448
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
1449
+ return 4294967296 * (2097151 & h2) + (h1 >>> 0);
1450
+ }
1451
+
1452
+ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
1453
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1454
+ return new (P || (P = Promise))(function (resolve, reject) {
1455
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1456
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1457
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1458
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
1459
+ });
1460
+ };
1461
+ function parse(input) {
1462
+ let value = input;
1463
+ if ((input === null || input === void 0 ? void 0 : input.indexOf("%7B%22")) === 0) {
1464
+ value = decodeURIComponent(input);
1465
+ }
1466
+ try {
1467
+ value = JSON.parse(value);
1468
+ if (value === "true")
1469
+ return true;
1470
+ if (value === "false")
1471
+ return false;
1472
+ if (typeof value === "object")
1473
+ return value;
1474
+ if (parseFloat(value) === value) {
1475
+ value = parseFloat(value);
1476
+ }
1477
+ }
1478
+ catch (e) { }
1479
+ if (value === null || value === "") {
1480
+ return;
1481
+ }
1482
+ return value;
1483
+ }
1484
+ const emptyAnalytics = {
1485
+ setAnonymousId: () => { },
1486
+ track: () => Promise.resolve(),
1487
+ page: () => Promise.resolve(),
1488
+ user: () => ({}),
1489
+ identify: () => Promise.resolve({}),
1490
+ group: () => Promise.resolve({}),
1491
+ reset: () => Promise.resolve({}),
1492
+ configure: () => { },
1493
+ };
1494
+ function createUnderlyingAnalyticsInstance(opts, rt, plugins = []) {
1495
+ var _a, _b, _c;
1496
+ const storageCache = {};
1497
+ // AnalyticsInstance's storage is async somewhere inside. So if we make 'page' call right after 'identify' call
1498
+ // 'page' call will load traits from storage before 'identify' call had a change to save them.
1499
+ // to avoid that we use in-memory cache for storage
1500
+ const cachingStorageWrapper = (persistentStorage) => ({
1501
+ setItem(key, val) {
1502
+ var _a, _b;
1503
+ if (((_a = opts.privacy) === null || _a === void 0 ? void 0 : _a.dontSend) || ((_b = opts.privacy) === null || _b === void 0 ? void 0 : _b.disableUserIds)) {
1504
+ return;
1505
+ }
1506
+ if (opts.debug) {
1507
+ console.log(`[JITSU DEBUG] Caching storage setItem: ${key}=${val}`);
1508
+ }
1509
+ storageCache[key] = val;
1510
+ persistentStorage.setItem(key, val);
1511
+ },
1512
+ getItem(key) {
1513
+ var _a, _b;
1514
+ if (((_a = opts.privacy) === null || _a === void 0 ? void 0 : _a.dontSend) || ((_b = opts.privacy) === null || _b === void 0 ? void 0 : _b.disableUserIds)) {
1515
+ return;
1516
+ }
1517
+ const value = storageCache[key] || persistentStorage.getItem(key);
1518
+ if (opts.debug) {
1519
+ console.log(`[JITSU DEBUG] Caching storage getItem: ${key}=${value}. Evicted from cache: ${!storageCache[key]}`);
1520
+ }
1521
+ return value;
1522
+ },
1523
+ reset() {
1524
+ for (const key of [...Object.keys(storageCache)]) {
1525
+ delete storageCache[key];
1526
+ }
1527
+ persistentStorage.reset();
1528
+ },
1529
+ removeItem(key) {
1530
+ if (opts.debug) {
1531
+ console.log(`[JITSU DEBUG] Caching storage removeItem: ${key}`);
1532
+ }
1533
+ delete storageCache[key];
1534
+ persistentStorage.removeItem(key);
1535
+ },
1536
+ });
1537
+ const storage = cachingStorageWrapper(((_a = rt.store) === null || _a === void 0 ? void 0 : _a.call(rt)) || createInMemoryStorage(opts.debug));
1538
+ const analytics = analyticsLib({
1539
+ debug: !!opts.debug,
1540
+ storage,
1541
+ plugins: [jitsuAnalyticsPlugin(opts, storage), ...plugins],
1542
+ });
1543
+ const a = Object.assign(Object.assign({}, analytics), { page: (...args) => {
1544
+ if (args.length === 2 && typeof args[0] === "string" && typeof args[1] === "object") {
1545
+ return analytics.page(Object.assign({ name: args[0] }, args[1]));
1546
+ }
1547
+ else {
1548
+ return analytics.page(...args);
1549
+ }
1550
+ }, identify: (...args) => {
1551
+ if (args[0] && typeof args[0] !== "object" && typeof args[0] !== "string") {
1552
+ //fix the quirk of analytics.js: if you pass number as first argument, it will be converted to string
1553
+ args[0] = args[0] + "";
1554
+ }
1555
+ //analytics.js sets userId and traits asynchronously, so if
1556
+ //we want them to be available immediately after identify call in subsequent page() calls,
1557
+ //we need to put them into storage manually
1558
+ const storage = analytics.storage;
1559
+ const storageWrapper = cachingStorageWrapper(storage);
1560
+ if (typeof args[0] === "string") {
1561
+ //first argument is user id
1562
+ storageWrapper.setItem("__user_id", args[0]);
1563
+ }
1564
+ else if (typeof args[0] === "object") {
1565
+ //first argument is traits
1566
+ storageWrapper.setItem("__user_traits", args[0]);
1567
+ }
1568
+ if (args.length === 2 && typeof args[1] === "object") {
1569
+ //first argument is user id, second is traits
1570
+ storageWrapper.setItem("__user_traits", args[1]);
1571
+ }
1572
+ return analytics.identify(...args);
1573
+ }, setAnonymousId: (id) => {
1574
+ if (opts.debug) {
1575
+ console.log("[JITSU DEBUG] Setting anonymous id to " + id);
1576
+ }
1577
+ //Workaround for analytics.js bug. Underlying setAnonymousId doesn't set the id immediately,
1578
+ //so we got to it manually here. See https://github.com/jitsucom/jitsu/issues/1060
1579
+ storage.setItem("__anon_id", id);
1580
+ const userState = analytics.user();
1581
+ if (userState) {
1582
+ userState.anonymousId = id;
1583
+ }
1584
+ analytics.setAnonymousId(id);
1585
+ }, reset() {
1586
+ return __awaiter(this, void 0, void 0, function* () {
1587
+ if (opts.debug) {
1588
+ console.log("[JITSU DEBUG] Called reset(). Storage state", JSON.stringify(analytics.user()));
1589
+ }
1590
+ storage.reset();
1591
+ yield analytics.reset();
1592
+ this.setAnonymousId(uuid());
1593
+ if (opts.debug) {
1594
+ console.log("[JITSU DEBUG] User state after reset", JSON.stringify(analytics.user()));
1595
+ }
1596
+ });
1597
+ },
1598
+ configure(options) {
1599
+ return __awaiter(this, void 0, void 0, function* () {
1600
+ var _a, _b;
1601
+ if (opts.debug) {
1602
+ console.log("[JITSU DEBUG] Update Jitsu config with", JSON.stringify(options));
1603
+ }
1604
+ if (((_a = options.privacy) === null || _a === void 0 ? void 0 : _a.disableUserIds) || ((_b = options.privacy) === null || _b === void 0 ? void 0 : _b.dontSend)) {
1605
+ storage.reset();
1606
+ }
1607
+ for (const plugin of Object.values(analytics.plugins)) {
1608
+ if (typeof plugin["configure"] === "function") {
1609
+ plugin["configure"](options);
1610
+ }
1611
+ }
1612
+ });
1613
+ },
1614
+ group(groupId, traits, options, callback) {
1615
+ return __awaiter(this, void 0, void 0, function* () {
1616
+ const results = [];
1617
+ for (const plugin of Object.values(analytics.plugins)) {
1618
+ if (plugin["group"]) {
1619
+ results.push(yield plugin["group"](groupId, traits, options, callback));
1620
+ }
1621
+ }
1622
+ //It's incorrect at many levels. First, it's not a dispatched event. Second, we take a first result
1623
+ //However, since returned values are used for debugging purposes only, it's ok
1624
+ return results[0];
1625
+ });
1626
+ } });
1627
+ if (((_b = opts.privacy) === null || _b === void 0 ? void 0 : _b.disableUserIds) || ((_c = opts.privacy) === null || _c === void 0 ? void 0 : _c.dontSend)) {
1628
+ storage.reset();
1629
+ }
1630
+ return a;
1631
+ }
1632
+ /**
1633
+ * Fix common mistakes in jitsu configuration
1634
+ * @param opts
1635
+ */
1636
+ function fixOptions(opts) {
1637
+ var _a, _b;
1638
+ return Object.assign(Object.assign({}, opts), { host: ((_a = opts.host) !== null && _a !== void 0 ? _a : "").indexOf("https://") !== 0 && ((_b = opts.host) !== null && _b !== void 0 ? _b : "").indexOf("http://") !== 0
1639
+ ? `https://${opts.host}`
1640
+ : opts.host });
1641
+ }
1642
+ function jitsuAnalytics(_opts) {
1643
+ const opts = fixOptions(_opts);
1644
+ const inBrowser = isInBrowser();
1645
+ const rt = opts.runtime || (inBrowser ? windowRuntime(opts) : emptyRuntime(opts));
1646
+ return createUnderlyingAnalyticsInstance(opts, rt);
1647
+ // if (inBrowser) {
1648
+ // const fetch = opts.fetch || globalThis.fetch;
1649
+ // if (!fetch) {
1650
+ // throw new Error(
1651
+ // "Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope"
1652
+ // );
1653
+ // }
1654
+ // const url = `${opts.host}/api/s/cfg`;
1655
+ // const authHeader = {};
1656
+ // const debugHeader = opts.debug ? { "X-Enable-Debug": "true" } : {};
1657
+ // fetch(url)
1658
+ // .then(res => res.json())
1659
+ // .then(res => {
1660
+ // result.loaded(createUnderlyingAnalyticsInstance(opts, rt, []));
1661
+ // })
1662
+ // .catch(e => {
1663
+ // console.warn(`[JITSU] error getting device-destinations from ${url}`, e);
1664
+ // result.loaded(createUnderlyingAnalyticsInstance(opts, rt));
1665
+ // });
1666
+ // } else {
1667
+ // result.loaded(createUnderlyingAnalyticsInstance(opts, rt));
1668
+ // }
1669
+ }
1670
+
1671
+ exports.createInMemoryStorage = createInMemoryStorage;
1672
+ exports.emptyAnalytics = emptyAnalytics;
1673
+ exports.emptyRuntime = emptyRuntime;
1674
+ exports.isInBrowser = isInBrowser;
1675
+ exports.jitsuAnalytics = jitsuAnalytics;
1676
+ exports.jitsuAnalyticsPlugin = jitsuAnalyticsPlugin;
1677
+ exports.parseQuery = parseQuery;
1678
+ exports.randomId = randomId;
1679
+ exports.uuid = uuid;
1680
+ exports.windowRuntime = windowRuntime;