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