@jitsu/js 1.7.2 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/jitsu.cjs.js CHANGED
@@ -110,7 +110,7 @@ function loadScript(src, attributes) {
110
110
  });
111
111
  }
112
112
 
113
- var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
113
+ var __awaiter$5 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
114
114
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
115
115
  return new (P || (P = Promise))(function (resolve, reject) {
116
116
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -122,7 +122,7 @@ var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _argu
122
122
  const tagPlugin = {
123
123
  id: "tag",
124
124
  handle(config, payload) {
125
- return __awaiter$4(this, void 0, void 0, function* () {
125
+ return __awaiter$5(this, void 0, void 0, function* () {
126
126
  if (!applyFilters(payload, config)) {
127
127
  return;
128
128
  }
@@ -191,7 +191,7 @@ function replaceMacro(code, event) {
191
191
  return code.replace(/{{\s*event\s*}}/g, JSON.stringify(event));
192
192
  }
193
193
 
194
- var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
194
+ var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
195
195
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
196
196
  return new (P || (P = Promise))(function (resolve, reject) {
197
197
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -203,7 +203,7 @@ var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _argu
203
203
  const logrocketPlugin = {
204
204
  id: "logrocket",
205
205
  handle(config, payload) {
206
- return __awaiter$3(this, void 0, void 0, function* () {
206
+ return __awaiter$4(this, void 0, void 0, function* () {
207
207
  if (!applyFilters(payload, config)) {
208
208
  return;
209
209
  }
@@ -245,7 +245,7 @@ function flushLogRocketQueue(lr) {
245
245
  }
246
246
  }
247
247
  function initLogrocketIfNeeded(appId) {
248
- return __awaiter$3(this, void 0, void 0, function* () {
248
+ return __awaiter$4(this, void 0, void 0, function* () {
249
249
  if (getLogRocketState() !== "fresh") {
250
250
  return;
251
251
  }
@@ -271,7 +271,7 @@ function initLogrocketIfNeeded(appId) {
271
271
  });
272
272
  }
273
273
 
274
- var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
274
+ var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
275
275
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
276
276
  return new (P || (P = Promise))(function (resolve, reject) {
277
277
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -285,7 +285,7 @@ const gtmPlugin = {
285
285
  id: "gtm",
286
286
  handle(config, payload) {
287
287
  var _a, _b;
288
- return __awaiter$2(this, void 0, void 0, function* () {
288
+ return __awaiter$3(this, void 0, void 0, function* () {
289
289
  if (!applyFilters(payload, config)) {
290
290
  return;
291
291
  }
@@ -322,7 +322,7 @@ function setGtmState(s) {
322
322
  window["__jitsuGtmState"] = s;
323
323
  }
324
324
  function initGtmIfNeeded(config, payload) {
325
- return __awaiter$2(this, void 0, void 0, function* () {
325
+ return __awaiter$3(this, void 0, void 0, function* () {
326
326
  if (getGtmState() !== "fresh") {
327
327
  return;
328
328
  }
@@ -356,7 +356,7 @@ function initGtmIfNeeded(config, payload) {
356
356
  });
357
357
  }
358
358
 
359
- var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
359
+ var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
360
360
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
361
361
  return new (P || (P = Promise))(function (resolve, reject) {
362
362
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -370,7 +370,7 @@ const ga4Plugin = {
370
370
  id: "ga4-tag",
371
371
  handle(config, payload) {
372
372
  var _a, _b;
373
- return __awaiter$1(this, void 0, void 0, function* () {
373
+ return __awaiter$2(this, void 0, void 0, function* () {
374
374
  if (!applyFilters(payload, config)) {
375
375
  return;
376
376
  }
@@ -418,7 +418,7 @@ function setGa4State(s) {
418
418
  window["__jitsuGa4State"] = s;
419
419
  }
420
420
  function initGa4IfNeeded(config, payload) {
421
- return __awaiter$1(this, void 0, void 0, function* () {
421
+ return __awaiter$2(this, void 0, void 0, function* () {
422
422
  if (getGa4State() !== "fresh") {
423
423
  return;
424
424
  }
@@ -484,8 +484,9 @@ const internalDestinationPlugins = {
484
484
  [logrocketPlugin.id]: logrocketPlugin,
485
485
  };
486
486
 
487
- var name = "@jitsu/js";
488
- var version = "0.0.0";
487
+ //import pkg from "../package.json";
488
+ const jitsuVersion = "0.0.0";
489
+ const jitsuLibraryName = "@jitsu/js";
489
490
 
490
491
  const publicSuffixes = "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(",");
491
492
  //convert to Map
@@ -512,7 +513,7 @@ function getTopLevelDomain(hostname) {
512
513
  }
513
514
 
514
515
  /* global analytics */
515
- var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
516
+ var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
516
517
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
517
518
  return new (P || (P = Promise))(function (resolve, reject) {
518
519
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -531,6 +532,7 @@ const defaultConfig = {
531
532
  echoEvents: false,
532
533
  cookieDomain: undefined,
533
534
  runtime: undefined,
535
+ s2s: undefined,
534
536
  };
535
537
  const parseQuery = (qs) => {
536
538
  if (!qs) {
@@ -563,11 +565,21 @@ function safeCall(f, defaultVal) {
563
565
  }
564
566
  }
565
567
  function restoreTraits(storage) {
566
- const val = storage.getItem("__user_traits");
568
+ let val = storage.getItem("__user_traits");
567
569
  if (typeof val === "string") {
568
- return safeCall(() => JSON.parse(val), {});
570
+ val = safeCall(() => JSON.parse(val), {});
571
+ }
572
+ if (typeof val !== "object" || val === null) {
573
+ val = {};
569
574
  }
570
- return val;
575
+ let groupVal = storage.getItem("__group_traits");
576
+ if (typeof groupVal === "string") {
577
+ groupVal = safeCall(() => JSON.parse(groupVal), {});
578
+ }
579
+ if (typeof groupVal !== "object" || groupVal === null) {
580
+ groupVal = {};
581
+ }
582
+ return Object.assign(Object.assign({}, (groupVal || {})), (val || {}));
571
583
  }
572
584
  function getCookie(name) {
573
585
  const value = `; ${document.cookie}`;
@@ -769,20 +781,34 @@ function deepMerge(target, source) {
769
781
  function isInBrowser() {
770
782
  return typeof document !== "undefined" && typeof window !== "undefined";
771
783
  }
772
- function adjustPayload(payload, config, storage) {
784
+ /**
785
+ * Fixes a weird bug in analytics URL where path
786
+ * of https://test.com becomes //test.com
787
+ */
788
+ function fixPath(path) {
789
+ if (path.indexOf("//") === 0 && path.lastIndexOf("/") === 1) {
790
+ return "/";
791
+ }
792
+ return path;
793
+ }
794
+ function adjustPayload(payload, config, storage, s2s) {
773
795
  var _a, _b;
774
796
  const runtime = config.runtime || (isInBrowser() ? windowRuntime(config) : emptyRuntime(config));
775
797
  const url = runtime.pageUrl();
776
798
  const parsedUrl = safeCall(() => new URL(url), undefined);
777
799
  const query = parsedUrl ? parseQuery(parsedUrl.search) : {};
778
800
  const properties = payload.properties || {};
801
+ if (properties.path) {
802
+ properties.path = fixPath(properties.path);
803
+ }
779
804
  const customContext = ((_a = payload.properties) === null || _a === void 0 ? void 0 : _a.context) || {};
780
805
  (_b = payload.properties) === null || _b === void 0 ? true : delete _b.context;
781
806
  const referrer = runtime.referrer();
782
807
  const context = {
783
808
  library: {
784
- name: name,
785
- version: version,
809
+ name: jitsuLibraryName,
810
+ version: jitsuVersion,
811
+ env: s2s ? "node" : "browser",
786
812
  },
787
813
  userAgent: runtime.userAgent(),
788
814
  locale: runtime.language(),
@@ -801,13 +827,13 @@ function adjustPayload(payload, config, storage) {
801
827
  clientIds: Object.assign({ fbc: runtime.getCookie("_fbc"), fbp: runtime.getCookie("_fbp") }, getGa4Ids(runtime)),
802
828
  campaign: parseUtms(query),
803
829
  };
804
- const withContext = Object.assign(Object.assign({}, payload), { timestamp: new Date().toISOString(), sentAt: new Date().toISOString(), messageId: randomId(properties.path || (parsedUrl && parsedUrl.pathname)), writeKey: maskWriteKey(config.writeKey), context: deepMerge(context, customContext) });
830
+ const withContext = Object.assign(Object.assign({}, payload), { timestamp: new Date().toISOString(), sentAt: new Date().toISOString(), messageId: randomId(properties.path || (parsedUrl && parsedUrl.pathname)), writeKey: maskWriteKey(config.writeKey), groupId: storage.getItem("__group_id"), context: deepMerge(context, customContext) });
805
831
  delete withContext.meta;
806
832
  delete withContext.options;
807
833
  return withContext;
808
834
  }
809
835
  function processDestinations(destinations, method, originalEvent, debug, analyticsInstance) {
810
- return __awaiter(this, void 0, void 0, function* () {
836
+ return __awaiter$1(this, void 0, void 0, function* () {
811
837
  const promises = [];
812
838
  for (const destination of destinations) {
813
839
  let newEvents = [originalEvent];
@@ -899,86 +925,69 @@ function maskWriteKey(writeKey) {
899
925
  return writeKey;
900
926
  }
901
927
  function send(method, payload, jitsuConfig, instance, store) {
902
- if (jitsuConfig.echoEvents) {
903
- console.log(`[JITSU DEBUG] sending '${method}' event:`, payload);
904
- return;
905
- }
906
- const url = `${jitsuConfig.host}/api/s/${method}`;
907
- const fetch = jitsuConfig.fetch || globalThis.fetch;
908
- if (!fetch) {
909
- throw new Error("Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope");
910
- }
911
- const debugHeader = jitsuConfig.debug ? { "X-Enable-Debug": "true" } : {};
912
- // if (jitsuConfig.debug) {
913
- // console.log(`[JITSU] Sending event to ${url}: `, JSON.stringify(payload, null, 2));
914
- // }
915
- const adjustedPayload = adjustPayload(payload, jitsuConfig, store);
916
- const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {};
917
- return fetch(url, {
918
- method: "POST",
919
- headers: Object.assign(Object.assign({ "Content-Type": "application/json" }, authHeader), debugHeader),
920
- body: JSON.stringify(adjustedPayload),
921
- })
922
- .then(res => {
923
- if (jitsuConfig.debug) {
924
- console.log(`[JITSU] ${url} replied ${res.status}. Original payload: `, JSON.stringify(adjustedPayload, null, 2));
928
+ return __awaiter$1(this, void 0, void 0, function* () {
929
+ if (jitsuConfig.echoEvents) {
930
+ console.log(`[JITSU DEBUG] sending '${method}' event:`, payload);
931
+ return;
925
932
  }
926
- if (res.ok) {
927
- return res.text();
933
+ const s2s = jitsuConfig.s2s === undefined ? !isInBrowser() : jitsuConfig.s2s;
934
+ const url = s2s ? `${jitsuConfig.host}/api/s/s2s/${method}` : `${jitsuConfig.host}/api/s/${method}`;
935
+ const fetch = jitsuConfig.fetch || globalThis.fetch;
936
+ if (!fetch) {
937
+ throw new Error("Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope");
928
938
  }
929
- else {
930
- return Promise.reject(res.text());
939
+ const debugHeader = jitsuConfig.debug ? { "X-Enable-Debug": "true" } : {};
940
+ // if (jitsuConfig.debug) {
941
+ // console.log(`[JITSU] Sending event to ${url}: `, JSON.stringify(payload, null, 2));
942
+ // }
943
+ const adjustedPayload = adjustPayload(payload, jitsuConfig, store, s2s);
944
+ const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {};
945
+ let fetchResult;
946
+ try {
947
+ fetchResult = yield fetch(url, {
948
+ method: "POST",
949
+ headers: Object.assign(Object.assign({ "Content-Type": "application/json" }, authHeader), debugHeader),
950
+ body: JSON.stringify(adjustedPayload),
951
+ });
952
+ }
953
+ catch (e) {
954
+ throw new Error(`Calling ${url} failed: ${e.message}`);
955
+ }
956
+ let responseText;
957
+ try {
958
+ responseText = yield fetchResult.text();
931
959
  }
932
- })
933
- .then(responseText => {
934
- let response;
960
+ catch (e) {
961
+ console.warn(`Can't read response text from ${url} (status - ${fetchResult.status} ${fetchResult.statusText}): ${e === null || e === void 0 ? void 0 : e.message}`);
962
+ }
963
+ if (jitsuConfig.debug) {
964
+ console.log(`[JITSU DEBUG] ${url} replied ${fetchResult.status}: ${responseText}. Original payload:\n${JSON.stringify(adjustedPayload, null, 2)}`);
965
+ }
966
+ if (!fetchResult.ok) {
967
+ throw new Error(`Jitsu ${url} replied ${fetchResult.status} - ${fetchResult.statusText}: ${responseText}`);
968
+ }
969
+ let responseJson;
935
970
  try {
936
- response = JSON.parse(responseText);
971
+ responseJson = JSON.parse(responseText);
937
972
  }
938
973
  catch (e) {
939
974
  return Promise.reject(`Can't parse JSON: ${responseText}: ${e === null || e === void 0 ? void 0 : e.message}`);
940
975
  }
941
- if (response.destinations) {
942
- if (jitsuConfig.debug) {
943
- console.log(`[JITSU] Processing device destinations: `, JSON.stringify(response.destinations, null, 2));
976
+ if (responseJson.destinations && responseJson.destinations.length > 0) {
977
+ if (jitsuConfig.s2s) {
978
+ 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);
979
+ }
980
+ else {
981
+ if (jitsuConfig.debug) {
982
+ console.log(`[JITSU] Processing device destinations: `, JSON.stringify(responseJson.destinations, null, 2));
983
+ }
984
+ return processDestinations(responseJson.destinations, method, adjustedPayload, !!jitsuConfig.debug, instance);
944
985
  }
945
- return processDestinations(response.destinations, method, adjustedPayload, !!jitsuConfig.debug, instance);
946
- }
947
- })
948
- .catch(err => {
949
- if (jitsuConfig.debug) {
950
- console.error(`Jitsu ${url} failed: `, err);
951
986
  }
987
+ return adjustedPayload;
952
988
  });
953
989
  }
954
990
  const jitsuAnalyticsPlugin = (pluginConfig = {}) => {
955
- const storageCache = {};
956
- // AnalyticsInstance's storage is async somewhere inside. So if we make 'page' call right after 'identify' call
957
- // 'page' call will load traits from storage before 'identify' call had a change to save them.
958
- // to avoid that we use in-memory cache for storage
959
- const cachingStorageWrapper = (persistentStorage) => ({
960
- setItem(key, val) {
961
- if (pluginConfig.debug) {
962
- console.log(`[JITSU DEBUG] Caching storage setItem: ${key}=${val}`);
963
- }
964
- storageCache[key] = val;
965
- persistentStorage.setItem(key, val);
966
- },
967
- getItem(key) {
968
- const value = storageCache[key] || persistentStorage.getItem(key);
969
- if (pluginConfig.debug) {
970
- console.log(`[JITSU DEBUG] Caching storage getItem: ${key}=${value}. Evicted from cache: ${!storageCache[key]}`);
971
- }
972
- return value;
973
- },
974
- removeItem(key) {
975
- if (pluginConfig.debug) {
976
- console.log(`[JITSU DEBUG] Caching storage removeItem: ${key}`);
977
- }
978
- delete storageCache[key];
979
- persistentStorage.removeItem(key);
980
- },
981
- });
982
991
  const instanceConfig = Object.assign(Object.assign({}, defaultConfig), pluginConfig);
983
992
  return {
984
993
  name: "jitsu",
@@ -995,30 +1004,46 @@ const jitsuAnalyticsPlugin = (pluginConfig = {}) => {
995
1004
  },
996
1005
  page: args => {
997
1006
  const { payload, config, instance } = args;
998
- return send("page", payload, config, instance, cachingStorageWrapper(instance.storage));
1007
+ return send("page", payload, config, instance, pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage);
999
1008
  },
1000
1009
  track: args => {
1001
1010
  const { payload, config, instance } = args;
1002
- return send("track", payload, config, instance, cachingStorageWrapper(instance.storage));
1011
+ return send("track", payload, config, instance, pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage);
1003
1012
  },
1004
1013
  identify: args => {
1005
1014
  const { payload, config, instance } = args;
1006
1015
  // Store traits in cache to be able to use them in page and track events that run asynchronously with current identify.
1007
- storageCache["__user_traits"] = payload.traits;
1008
- return send("identify", payload, config, instance, cachingStorageWrapper(instance.storage));
1016
+ const storage = pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage;
1017
+ storage.setItem("__user_id", payload.userId);
1018
+ if (payload.traits && typeof payload.traits === "object") {
1019
+ storage.setItem("__user_traits", payload.traits);
1020
+ }
1021
+ return send("identify", payload, config, instance, storage);
1009
1022
  },
1010
1023
  reset: args => {
1011
1024
  //clear storage cache
1012
- Object.keys(storageCache).forEach(key => delete storageCache[key]);
1025
+ if (pluginConfig.storageWrapper) {
1026
+ pluginConfig.storageWrapper(args.instance.storage).reset();
1027
+ }
1013
1028
  },
1014
1029
  methods: {
1015
1030
  //analytics doesn't support group as a base method, so we need to add it manually
1016
1031
  group(groupId, traits, options, callback) {
1032
+ if (typeof groupId === "number") {
1033
+ //fix potential issues with group id being used incorrectly
1034
+ groupId = groupId + "";
1035
+ }
1017
1036
  const analyticsInstance = this.instance;
1018
- const cacheWrap = cachingStorageWrapper(analyticsInstance.storage);
1037
+ const cacheWrap = pluginConfig.storageWrapper
1038
+ ? pluginConfig.storageWrapper(analyticsInstance.storage)
1039
+ : analyticsInstance.storage;
1019
1040
  const user = analyticsInstance.user();
1020
1041
  const userId = (options === null || options === void 0 ? void 0 : options.userId) || (user === null || user === void 0 ? void 0 : user.userId);
1021
1042
  const anonymousId = (options === null || options === void 0 ? void 0 : options.anonymousId) || (user === null || user === void 0 ? void 0 : user.anonymousId) || cacheWrap.getItem("__anon_id");
1043
+ cacheWrap.setItem("__group_id", groupId);
1044
+ if (traits && typeof traits === "object") {
1045
+ cacheWrap.setItem("__group_traits", traits);
1046
+ }
1022
1047
  return send("group", Object.assign(Object.assign({ type: "group", groupId, traits }, (anonymousId ? { anonymousId } : {})), (userId ? { userId } : {})), instanceConfig, analyticsInstance, cacheWrap);
1023
1048
  },
1024
1049
  },
@@ -1046,6 +1071,15 @@ function hash(str, seed = 0) {
1046
1071
  return 4294967296 * (2097151 & h2) + (h1 >>> 0);
1047
1072
  }
1048
1073
 
1074
+ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
1075
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1076
+ return new (P || (P = Promise))(function (resolve, reject) {
1077
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1078
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1079
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1080
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
1081
+ });
1082
+ };
1049
1083
  function parse(input) {
1050
1084
  let value = input;
1051
1085
  if ((input === null || input === void 0 ? void 0 : input.indexOf("%7B%22")) === 0) {
@@ -1080,22 +1114,75 @@ const emptyAnalytics = {
1080
1114
  };
1081
1115
  function createUnderlyingAnalyticsInstance(opts, rt, plugins = []) {
1082
1116
  const storage = rt.store();
1117
+ const storageCache = {};
1118
+ // AnalyticsInstance's storage is async somewhere inside. So if we make 'page' call right after 'identify' call
1119
+ // 'page' call will load traits from storage before 'identify' call had a change to save them.
1120
+ // to avoid that we use in-memory cache for storage
1121
+ const cachingStorageWrapper = (persistentStorage) => ({
1122
+ setItem(key, val) {
1123
+ if (opts.debug) {
1124
+ console.log(`[JITSU DEBUG] Caching storage setItem: ${key}=${val}`);
1125
+ }
1126
+ storageCache[key] = val;
1127
+ persistentStorage.setItem(key, val);
1128
+ },
1129
+ getItem(key) {
1130
+ const value = storageCache[key] || persistentStorage.getItem(key);
1131
+ if (opts.debug) {
1132
+ console.log(`[JITSU DEBUG] Caching storage getItem: ${key}=${value}. Evicted from cache: ${!storageCache[key]}`);
1133
+ }
1134
+ return value;
1135
+ },
1136
+ reset() {
1137
+ for (const key of [...Object.keys(storageCache)]) {
1138
+ storage.removeItem(key);
1139
+ delete storageCache[key];
1140
+ }
1141
+ },
1142
+ removeItem(key) {
1143
+ if (opts.debug) {
1144
+ console.log(`[JITSU DEBUG] Caching storage removeItem: ${key}`);
1145
+ }
1146
+ delete storageCache[key];
1147
+ persistentStorage.removeItem(key);
1148
+ },
1149
+ });
1083
1150
  const analytics = analyticsLib({
1084
- app: "test",
1085
1151
  debug: !!opts.debug,
1086
1152
  storage,
1087
- plugins: [jitsuAnalyticsPlugin(opts), ...plugins],
1153
+ plugins: [jitsuAnalyticsPlugin(Object.assign(Object.assign({}, opts), { storageWrapper: cachingStorageWrapper })), ...plugins],
1088
1154
  });
1089
- const originalPage = analytics.page;
1090
- analytics.page = (...args) => {
1091
- if (args.length === 2 && typeof args[0] === "string" && typeof args[1] === "object") {
1092
- return originalPage(Object.assign({ name: args[0] }, args[1]));
1093
- }
1094
- else {
1095
- return originalPage(...args);
1096
- }
1097
- };
1098
- return Object.assign(Object.assign({}, analytics), { setAnonymousId: (id) => {
1155
+ return Object.assign(Object.assign({}, analytics), { page: (...args) => {
1156
+ if (args.length === 2 && typeof args[0] === "string" && typeof args[1] === "object") {
1157
+ return analytics.page(Object.assign({ name: args[0] }, args[1]));
1158
+ }
1159
+ else {
1160
+ return analytics.page(...args);
1161
+ }
1162
+ }, identify: (...args) => {
1163
+ if (args[0] && typeof args[0] !== "object" && typeof args[0] !== "string") {
1164
+ //fix the quirk of analytics.js: if you pass number as first argument, it will be converted to string
1165
+ args[0] = args[0] + "";
1166
+ }
1167
+ //analytics.js sets userId and traits asynchronously, so if
1168
+ //we want them to be available immediately after identify call in subsequent page() calls,
1169
+ //we need to put them into storage manually
1170
+ const storage = analytics.storage;
1171
+ const storageWrapper = cachingStorageWrapper(storage);
1172
+ if (typeof args[0] === "string") {
1173
+ //first argument is user id
1174
+ storageWrapper.setItem("__user_id", args[0]);
1175
+ }
1176
+ else if (typeof args[0] === "object") {
1177
+ //first argument is traits
1178
+ storageWrapper.setItem("__user_traits", args[0]);
1179
+ }
1180
+ if (args.length === 2 && typeof args[1] === "object") {
1181
+ //first argument is user id, second is traits
1182
+ storageWrapper.setItem("__user_traits", args[1]);
1183
+ }
1184
+ return analytics.identify(...args);
1185
+ }, setAnonymousId: (id) => {
1099
1186
  if (opts.debug) {
1100
1187
  console.log("[JITSU DEBUG] Setting anonymous id to " + id);
1101
1188
  //Workaround for analytics.js bug. Underlying setAnonymousId doesn't work set the id immediately,
@@ -1108,12 +1195,17 @@ function createUnderlyingAnalyticsInstance(opts, rt, plugins = []) {
1108
1195
  analytics.setAnonymousId(id);
1109
1196
  }
1110
1197
  }, group(groupId, traits, options, callback) {
1111
- for (const plugin of Object.values(analytics.plugins)) {
1112
- if (plugin["group"]) {
1113
- plugin["group"](groupId, traits, options, callback);
1198
+ return __awaiter(this, void 0, void 0, function* () {
1199
+ const results = [];
1200
+ for (const plugin of Object.values(analytics.plugins)) {
1201
+ if (plugin["group"]) {
1202
+ results.push(yield plugin["group"](groupId, traits, options, callback));
1203
+ }
1114
1204
  }
1115
- }
1116
- return Promise.resolve({});
1205
+ //It's incorrect at many levels. First, it's not a dispatched event. Second, we take a first result
1206
+ //However, since returned values are used for debugging purposes only, it's ok
1207
+ return results[0];
1208
+ });
1117
1209
  } });
1118
1210
  }
1119
1211
  function jitsuAnalytics(opts) {
package/dist/jitsu.d.ts CHANGED
@@ -37,6 +37,12 @@ type JitsuOptions = {
37
37
  * writeKey / host. It's useful for debugging development environment
38
38
  */
39
39
  echoEvents?: boolean;
40
+ /**
41
+ * If true, events will go to s2s endpoints like ${host}/api/s/s2s/{type}. Otherwise they'll go to ${host}/api/s/{type}.
42
+ *
43
+ * If not set at all, it will be detected automatically by presence of `window` object
44
+ */
45
+ s2s?: boolean;
40
46
  };
41
47
  type PersistentStorage = {
42
48
  getItem: (key: string, options?: any) => any;