@hanzo/event 0.3.42 → 0.3.43
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/core.d.ts +8 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/index.cjs +124 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +121 -3
- package/dist/index.mjs.map +1 -1
- package/dist/link.d.ts +28 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/react.cjs +120 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.mjs +120 -2
- package/dist/react.mjs.map +1 -1
- package/dist/storage.d.ts +6 -0
- package/dist/storage.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/anon.d.ts +3 -0
- package/src/anon.js +19 -1
- package/src/core.ts +45 -3
- package/src/index.ts +2 -0
- package/src/link.test.ts +222 -0
- package/src/link.ts +103 -0
- package/src/storage.ts +14 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { Analytics, createAnalytics, resetClients, VERSION, getCohort, getFirstTouch, } from './core';
|
|
2
2
|
export { parseDsn, buildSentryEvent, buildEnvelope, framesFromStack } from './sentry';
|
|
3
3
|
export { uuidv7, uuidv7Time } from './uid';
|
|
4
|
+
export { linkUrl, readLink, stripLink, LINK_PARAMS } from './link';
|
|
5
|
+
export type { LinkState } from './link';
|
|
4
6
|
export { PRODUCT_PROJECT, dsnForProduct } from './dsn';
|
|
5
7
|
export type { ErrorIdentity } from './sentry';
|
|
6
8
|
export { scrubText, redactSecrets, scrubPII } from './scrub';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { Analytics, createAnalytics, resetClients, VERSION, getCohort, getFirstTouch, } from './core';
|
|
2
2
|
export { parseDsn, buildSentryEvent, buildEnvelope, framesFromStack } from './sentry';
|
|
3
3
|
export { uuidv7, uuidv7Time } from './uid';
|
|
4
|
+
export { linkUrl, readLink, stripLink, LINK_PARAMS } from './link';
|
|
5
|
+
export type { LinkState } from './link';
|
|
4
6
|
export { PRODUCT_PROJECT, dsnForProduct } from './dsn';
|
|
5
7
|
export type { ErrorIdentity } from './sentry';
|
|
6
8
|
export { scrubText, redactSecrets, scrubPII } from './scrub';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,OAAO,EACP,SAAS,EACT,aAAa,GACd,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACrF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACtF,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACvD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC3E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,MAAM,EACN,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,GAAG,EACH,SAAS,EACT,SAAS,EACT,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,SAAS,CAAA;AAEhB;;;kEAGkE;AAClE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACtE,YAAY,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,OAAO,EACP,SAAS,EACT,aAAa,GACd,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACrF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAClE,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACtF,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACvD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC3E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,MAAM,EACN,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,GAAG,EACH,SAAS,EACT,SAAS,EACT,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,SAAS,CAAA;AAEhB;;;kEAGkE;AAClE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACtE,YAAY,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -390,6 +390,15 @@ function hzAnonId() {
|
|
|
390
390
|
}
|
|
391
391
|
return id;
|
|
392
392
|
}
|
|
393
|
+
function hzAnonAdopt(id) {
|
|
394
|
+
hzAnonMemo = id;
|
|
395
|
+
hzAnonWrite(HZ_ANON_KEY, id);
|
|
396
|
+
try {
|
|
397
|
+
var s = hzAnonStore();
|
|
398
|
+
if (s) s.setItem(HZ_ANON_KEY, id);
|
|
399
|
+
} catch (e) {
|
|
400
|
+
}
|
|
401
|
+
}
|
|
393
402
|
|
|
394
403
|
// src/uid.ts
|
|
395
404
|
function uuidv7Time(id) {
|
|
@@ -397,7 +406,7 @@ function uuidv7Time(id) {
|
|
|
397
406
|
}
|
|
398
407
|
|
|
399
408
|
// package.json
|
|
400
|
-
var version = "0.3.
|
|
409
|
+
var version = "0.3.43";
|
|
401
410
|
|
|
402
411
|
// src/version.ts
|
|
403
412
|
var VERSION = version;
|
|
@@ -717,6 +726,13 @@ function sessionId(now = Date.now()) {
|
|
|
717
726
|
s.setItem(KEY.session, JSON.stringify(state));
|
|
718
727
|
return state.id;
|
|
719
728
|
}
|
|
729
|
+
function adoptSession(id, now = Date.now()) {
|
|
730
|
+
const s = ls();
|
|
731
|
+
if (s) s.setItem(KEY.session, JSON.stringify({ id, last: now }));
|
|
732
|
+
}
|
|
733
|
+
function adoptAnonId(id) {
|
|
734
|
+
hzAnonAdopt(id);
|
|
735
|
+
}
|
|
720
736
|
function getFirstTouch() {
|
|
721
737
|
const s = ls();
|
|
722
738
|
if (!s) return void 0;
|
|
@@ -756,6 +772,76 @@ function mergeCohort(patch) {
|
|
|
756
772
|
return next;
|
|
757
773
|
}
|
|
758
774
|
|
|
775
|
+
// src/link.ts
|
|
776
|
+
var LINK_PARAMS = { anon: "hz_aid", session: "hz_sid", firstTouch: "hz_ft" };
|
|
777
|
+
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
778
|
+
var isId = (v) => !!v && UUID.test(v);
|
|
779
|
+
function encodeFirstTouch(a) {
|
|
780
|
+
return JSON.stringify([
|
|
781
|
+
a.utm.source,
|
|
782
|
+
a.utm.medium,
|
|
783
|
+
a.utm.campaign,
|
|
784
|
+
a.utm.term,
|
|
785
|
+
a.utm.content,
|
|
786
|
+
a.refCode,
|
|
787
|
+
a.referrer,
|
|
788
|
+
a.channel
|
|
789
|
+
].map((v) => v ?? ""));
|
|
790
|
+
}
|
|
791
|
+
function decodeFirstTouch(raw) {
|
|
792
|
+
if (!raw || raw.length > 1024) return void 0;
|
|
793
|
+
try {
|
|
794
|
+
const t = JSON.parse(raw);
|
|
795
|
+
if (!Array.isArray(t) || t.length !== 8 || t.some((v) => typeof v !== "string")) return void 0;
|
|
796
|
+
const [source, medium, campaign, term, content, refCode, referrer, channel] = t;
|
|
797
|
+
const u = (v) => v || void 0;
|
|
798
|
+
return {
|
|
799
|
+
utm: { source: u(source), medium: u(medium), campaign: u(campaign), term: u(term), content: u(content) },
|
|
800
|
+
refCode: u(refCode),
|
|
801
|
+
referrer: u(referrer),
|
|
802
|
+
channel: u(channel)
|
|
803
|
+
};
|
|
804
|
+
} catch {
|
|
805
|
+
return void 0;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
function linkUrl(url, state, fromHost, base) {
|
|
809
|
+
let u;
|
|
810
|
+
try {
|
|
811
|
+
u = new URL(url, base);
|
|
812
|
+
} catch {
|
|
813
|
+
return url;
|
|
814
|
+
}
|
|
815
|
+
if (u.protocol !== "https:" && u.protocol !== "http:") return url;
|
|
816
|
+
if (!orgOf(u.hostname) || u.hostname === fromHost) return url;
|
|
817
|
+
const set = (k, v) => v && u.searchParams.set(k, v);
|
|
818
|
+
if (isId(state.anonId)) set(LINK_PARAMS.anon, state.anonId);
|
|
819
|
+
if (isId(state.sessionId)) set(LINK_PARAMS.session, state.sessionId);
|
|
820
|
+
if (state.firstTouch) set(LINK_PARAMS.firstTouch, encodeFirstTouch(state.firstTouch));
|
|
821
|
+
return u.toString();
|
|
822
|
+
}
|
|
823
|
+
function readLink(search) {
|
|
824
|
+
const q = new URLSearchParams(search || "");
|
|
825
|
+
const a = q.get(LINK_PARAMS.anon);
|
|
826
|
+
const s = q.get(LINK_PARAMS.session);
|
|
827
|
+
return {
|
|
828
|
+
anonId: isId(a) ? a : void 0,
|
|
829
|
+
sessionId: isId(s) ? s : void 0,
|
|
830
|
+
firstTouch: decodeFirstTouch(q.get(LINK_PARAMS.firstTouch))
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
function stripLink(href) {
|
|
834
|
+
const u = new URL(href);
|
|
835
|
+
let hit = false;
|
|
836
|
+
for (const k of Object.values(LINK_PARAMS)) {
|
|
837
|
+
if (u.searchParams.has(k)) {
|
|
838
|
+
u.searchParams.delete(k);
|
|
839
|
+
hit = true;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
return hit ? u.pathname + u.search + u.hash : void 0;
|
|
843
|
+
}
|
|
844
|
+
|
|
759
845
|
// src/core.ts
|
|
760
846
|
var EVENT_PATH = "/v1/event";
|
|
761
847
|
var DEFAULT_HOST = "https://api.hanzo.ai";
|
|
@@ -916,8 +1002,19 @@ var Analytics = class {
|
|
|
916
1002
|
if (this.started || !this.cfg.enabled) return;
|
|
917
1003
|
this.started = true;
|
|
918
1004
|
if (!isBrowser()) return;
|
|
1005
|
+
const linked = readLink(window.location.search);
|
|
1006
|
+
if (linked.anonId) adoptAnonId(linked.anonId);
|
|
1007
|
+
if (linked.sessionId) adoptSession(linked.sessionId);
|
|
1008
|
+
const clean = stripLink(window.location.href);
|
|
1009
|
+
if (clean !== void 0) {
|
|
1010
|
+
try {
|
|
1011
|
+
window.history.replaceState(window.history.state, "", clean);
|
|
1012
|
+
} catch {
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
919
1015
|
const parsed = parseAttribution(window.location.search, document.referrer);
|
|
920
|
-
|
|
1016
|
+
const first = linked.firstTouch && !getFirstTouch() ? setFirstTouchOnce(linked.firstTouch) : void 0;
|
|
1017
|
+
this.attribution = first ?? (hasAttribution(parsed) ? setFirstTouchOnce(parsed) : getFirstTouch() ?? parsed);
|
|
921
1018
|
this.cohort = mergeCohort({
|
|
922
1019
|
channel: this.attribution.channel ?? deriveChannel(this.attribution),
|
|
923
1020
|
refCode: this.attribution.refCode
|
|
@@ -936,6 +1033,27 @@ var Analytics = class {
|
|
|
936
1033
|
});
|
|
937
1034
|
}
|
|
938
1035
|
}
|
|
1036
|
+
/** link returns `url` carrying this visitor's anonymous id, session and first
|
|
1037
|
+
* touch when the destination is a Hanzo-owned host, so the journey continues
|
|
1038
|
+
* across the hop. Any other URL comes back unchanged. */
|
|
1039
|
+
link(url) {
|
|
1040
|
+
if (!isBrowser()) return url;
|
|
1041
|
+
if (!this.started) this.init();
|
|
1042
|
+
return linkUrl(
|
|
1043
|
+
url,
|
|
1044
|
+
{ anonId: anonId(), sessionId: sessionId(), firstTouch: this.attribution },
|
|
1045
|
+
window.location.hostname,
|
|
1046
|
+
window.location.href
|
|
1047
|
+
);
|
|
1048
|
+
}
|
|
1049
|
+
/** authorize decorates an OAuth authorize URL for the redirect to IAM and flushes
|
|
1050
|
+
* what is queued, because the page is about to unload. Assign the result to
|
|
1051
|
+
* `location`. */
|
|
1052
|
+
authorize(url) {
|
|
1053
|
+
const out = this.link(url);
|
|
1054
|
+
this.flush(true);
|
|
1055
|
+
return out;
|
|
1056
|
+
}
|
|
939
1057
|
/** identify binds the current visitor to a stable person id (post-login). */
|
|
940
1058
|
identify(personId, traits) {
|
|
941
1059
|
this.personId = personId;
|
|
@@ -1225,6 +1343,6 @@ var COHORTS = {
|
|
|
1225
1343
|
* curl -fsSL https://unpkg.com/@hanzo/event/src/anon.js -o apps/analytics/anon.js
|
|
1226
1344
|
*/
|
|
1227
1345
|
|
|
1228
|
-
export { Analytics, COHORTS, GOALS, ORG_DOMAIN, ORG_KEY, PRODUCT_PROJECT, VERSION, buildEnvelope, buildSentryEvent, createAnalytics, deriveChannel, digest, dsnForProduct, exceptionEntry, exceptionProperties, fingerprint, framesFromStack, getCohort, getFirstTouch, hasAttribution, hostOf, isoWeek, keyFor, keyForPage, orgOf, parseAttribution, parseDsn, redactSecrets, resetClients, scrubPII, scrubText, hzUuidv7 as uuidv7, uuidv7Time };
|
|
1346
|
+
export { Analytics, COHORTS, GOALS, LINK_PARAMS, ORG_DOMAIN, ORG_KEY, PRODUCT_PROJECT, VERSION, buildEnvelope, buildSentryEvent, createAnalytics, deriveChannel, digest, dsnForProduct, exceptionEntry, exceptionProperties, fingerprint, framesFromStack, getCohort, getFirstTouch, hasAttribution, hostOf, isoWeek, keyFor, keyForPage, linkUrl, orgOf, parseAttribution, parseDsn, readLink, redactSecrets, resetClients, scrubPII, scrubText, stripLink, hzUuidv7 as uuidv7, uuidv7Time };
|
|
1229
1347
|
//# sourceMappingURL=index.mjs.map
|
|
1230
1348
|
//# sourceMappingURL=index.mjs.map
|