@jitsu/js 1.7.2 → 1.9.0-canary.548.20240108170646
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.cjs.js
CHANGED
|
@@ -110,7 +110,7 @@ function loadScript(src, attributes) {
|
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
var __awaiter$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
-
|
|
488
|
-
|
|
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
|
-
|
|
568
|
+
let val = storage.getItem("__user_traits");
|
|
567
569
|
if (typeof val === "string") {
|
|
568
|
-
|
|
570
|
+
val = safeCall(() => JSON.parse(val), {});
|
|
571
|
+
}
|
|
572
|
+
if (typeof val !== "object" || val === null) {
|
|
573
|
+
val = {};
|
|
569
574
|
}
|
|
570
|
-
|
|
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
|
-
|
|
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:
|
|
785
|
-
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
|
-
|
|
903
|
-
|
|
904
|
-
|
|
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
|
-
|
|
927
|
-
|
|
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
|
-
|
|
930
|
-
|
|
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
|
-
|
|
934
|
-
|
|
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
|
-
|
|
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 (
|
|
942
|
-
if (jitsuConfig.
|
|
943
|
-
console.
|
|
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,
|
|
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,
|
|
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
|
-
|
|
1008
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
|
|
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
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
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
|
-
|
|
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;
|