@qoretechnologies/reqraft 0.10.56 → 0.10.57-pr.127.ge03fd3a

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.
Files changed (115) hide show
  1. package/.claude/CLAUDE.md +1 -0
  2. package/README.md +20 -0
  3. package/design/TRACKING.md +210 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/tracking/browser/attach.d.ts +8 -0
  9. package/dist/tracking/browser/attach.d.ts.map +1 -0
  10. package/dist/tracking/browser/attach.js +182 -0
  11. package/dist/tracking/browser/attach.js.map +1 -0
  12. package/dist/tracking/browser/env.d.ts +14 -0
  13. package/dist/tracking/browser/env.d.ts.map +1 -0
  14. package/dist/tracking/browser/env.js +150 -0
  15. package/dist/tracking/browser/env.js.map +1 -0
  16. package/dist/tracking/core/consent.d.ts +21 -0
  17. package/dist/tracking/core/consent.d.ts.map +1 -0
  18. package/dist/tracking/core/consent.js +39 -0
  19. package/dist/tracking/core/consent.js.map +1 -0
  20. package/dist/tracking/core/engagement.d.ts +20 -0
  21. package/dist/tracking/core/engagement.d.ts.map +1 -0
  22. package/dist/tracking/core/engagement.js +52 -0
  23. package/dist/tracking/core/engagement.js.map +1 -0
  24. package/dist/tracking/core/experiments.d.ts +109 -0
  25. package/dist/tracking/core/experiments.d.ts.map +1 -0
  26. package/dist/tracking/core/experiments.js +294 -0
  27. package/dist/tracking/core/experiments.js.map +1 -0
  28. package/dist/tracking/core/hash.d.ts +16 -0
  29. package/dist/tracking/core/hash.d.ts.map +1 -0
  30. package/dist/tracking/core/hash.js +31 -0
  31. package/dist/tracking/core/hash.js.map +1 -0
  32. package/dist/tracking/core/ids.d.ts +6 -0
  33. package/dist/tracking/core/ids.d.ts.map +1 -0
  34. package/dist/tracking/core/ids.js +31 -0
  35. package/dist/tracking/core/ids.js.map +1 -0
  36. package/dist/tracking/core/observable.d.ts +12 -0
  37. package/dist/tracking/core/observable.d.ts.map +1 -0
  38. package/dist/tracking/core/observable.js +32 -0
  39. package/dist/tracking/core/observable.js.map +1 -0
  40. package/dist/tracking/core/queue.d.ts +47 -0
  41. package/dist/tracking/core/queue.d.ts.map +1 -0
  42. package/dist/tracking/core/queue.js +205 -0
  43. package/dist/tracking/core/queue.js.map +1 -0
  44. package/dist/tracking/core/sections.d.ts +54 -0
  45. package/dist/tracking/core/sections.d.ts.map +1 -0
  46. package/dist/tracking/core/sections.js +156 -0
  47. package/dist/tracking/core/sections.js.map +1 -0
  48. package/dist/tracking/core/storage.d.ts +15 -0
  49. package/dist/tracking/core/storage.d.ts.map +1 -0
  50. package/dist/tracking/core/storage.js +72 -0
  51. package/dist/tracking/core/storage.js.map +1 -0
  52. package/dist/tracking/core/tracker.d.ts +122 -0
  53. package/dist/tracking/core/tracker.d.ts.map +1 -0
  54. package/dist/tracking/core/tracker.js +390 -0
  55. package/dist/tracking/core/tracker.js.map +1 -0
  56. package/dist/tracking/core/types.d.ts +130 -0
  57. package/dist/tracking/core/types.d.ts.map +1 -0
  58. package/dist/tracking/core/types.js +69 -0
  59. package/dist/tracking/core/types.js.map +1 -0
  60. package/dist/tracking/core/utm.d.ts +6 -0
  61. package/dist/tracking/core/utm.d.ts.map +1 -0
  62. package/dist/tracking/core/utm.js +30 -0
  63. package/dist/tracking/core/utm.js.map +1 -0
  64. package/dist/tracking/index.d.ts +46 -0
  65. package/dist/tracking/index.d.ts.map +1 -0
  66. package/dist/tracking/index.js +91 -0
  67. package/dist/tracking/index.js.map +1 -0
  68. package/dist/tracking/markup.d.ts +12 -0
  69. package/dist/tracking/markup.d.ts.map +1 -0
  70. package/dist/tracking/markup.js +19 -0
  71. package/dist/tracking/markup.js.map +1 -0
  72. package/dist/tracking/react/Experiment.d.ts +23 -0
  73. package/dist/tracking/react/Experiment.d.ts.map +1 -0
  74. package/dist/tracking/react/Experiment.js +28 -0
  75. package/dist/tracking/react/Experiment.js.map +1 -0
  76. package/dist/tracking/react/TrackingProvider.d.ts +26 -0
  77. package/dist/tracking/react/TrackingProvider.d.ts.map +1 -0
  78. package/dist/tracking/react/TrackingProvider.js +45 -0
  79. package/dist/tracking/react/TrackingProvider.js.map +1 -0
  80. package/dist/tracking/react/hooks.d.ts +39 -0
  81. package/dist/tracking/react/hooks.d.ts.map +1 -0
  82. package/dist/tracking/react/hooks.js +96 -0
  83. package/dist/tracking/react/hooks.js.map +1 -0
  84. package/dist/tracking/react/index.d.ts +7 -0
  85. package/dist/tracking/react/index.d.ts.map +1 -0
  86. package/dist/tracking/react/index.js +17 -0
  87. package/dist/tracking/react/index.js.map +1 -0
  88. package/dist/tracking/testing.d.ts +40 -0
  89. package/dist/tracking/testing.d.ts.map +1 -0
  90. package/dist/tracking/testing.js +140 -0
  91. package/dist/tracking/testing.js.map +1 -0
  92. package/package.json +1 -1
  93. package/src/index.tsx +3 -0
  94. package/src/tracking/browser/attach.ts +186 -0
  95. package/src/tracking/browser/env.ts +78 -0
  96. package/src/tracking/core/consent.ts +37 -0
  97. package/src/tracking/core/engagement.ts +47 -0
  98. package/src/tracking/core/experiments.ts +258 -0
  99. package/src/tracking/core/hash.ts +26 -0
  100. package/src/tracking/core/ids.ts +25 -0
  101. package/src/tracking/core/observable.ts +23 -0
  102. package/src/tracking/core/queue.ts +131 -0
  103. package/src/tracking/core/sections.ts +166 -0
  104. package/src/tracking/core/storage.ts +69 -0
  105. package/src/tracking/core/tracker.ts +417 -0
  106. package/src/tracking/core/types.ts +162 -0
  107. package/src/tracking/core/utm.ts +23 -0
  108. package/src/tracking/index.ts +72 -0
  109. package/src/tracking/markup.ts +17 -0
  110. package/src/tracking/react/Experiment.stories.tsx +174 -0
  111. package/src/tracking/react/Experiment.tsx +44 -0
  112. package/src/tracking/react/TrackingProvider.tsx +56 -0
  113. package/src/tracking/react/hooks.ts +106 -0
  114. package/src/tracking/react/index.ts +13 -0
  115. package/src/tracking/testing.ts +108 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,390 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.Tracker = void 0;
15
+ var consent_1 = require("./consent");
16
+ var engagement_1 = require("./engagement");
17
+ var experiments_1 = require("./experiments");
18
+ var ids_1 = require("./ids");
19
+ var observable_1 = require("./observable");
20
+ var queue_1 = require("./queue");
21
+ var sections_1 = require("./sections");
22
+ var storage_1 = require("./storage");
23
+ var types_1 = require("./types");
24
+ var utm_1 = require("./utm");
25
+ /**
26
+ * The tracker: identity, consent, the event queue, page views and their summaries,
27
+ * experiment assignment and exposure. It has no DOM code of its own (see
28
+ * `browser/attach.ts`), so it runs unchanged in tests and in any web property.
29
+ * Everything product-specific (property, endpoints, storage prefix) is in `config`.
30
+ *
31
+ * Never throws into the page: every public method is wrapped.
32
+ */
33
+ var Tracker = /** @class */ (function () {
34
+ function Tracker(options, env) {
35
+ var _this = this;
36
+ this.env = env;
37
+ this.pv = null;
38
+ this.lastUrl = null;
39
+ this.watches = new Set();
40
+ this.started = false;
41
+ /** The current page view id (null without consent): the browser layer re-measures sections on change. */
42
+ this.pageViewId = new observable_1.Observable(null);
43
+ this.active = function () { return _this.config.enabled && _this.consent.granted(); };
44
+ /** The tracker's clock (the browser layer times sections with it). */
45
+ this.now = function () { return _this.env.now(); };
46
+ // A config built by hand (not through `resolveConfig`) still gets the defaults.
47
+ var config = (0, types_1.resolveConfig)(options);
48
+ this.config = config;
49
+ this.keys = (0, types_1.storageKeys)(config.storagePrefix);
50
+ this.consent = new consent_1.ConsentStore(env.local, config.consentVersion, this.keys);
51
+ var first = env.page();
52
+ this.firstTouchUtm = (0, utm_1.parseUtm)(first.search);
53
+ this.experiments = new experiments_1.ExperimentStore({
54
+ property: config.property,
55
+ endpoint: config.experimentsEndpoint,
56
+ local: env.local,
57
+ session: env.session,
58
+ now: env.now,
59
+ fetchJson: env.fetchJson,
60
+ keys: this.keys,
61
+ previewParam: config.previewParam,
62
+ });
63
+ this.experiments.applyPreviewFrom(first.search);
64
+ this.sections = new sections_1.SectionClock(env.now());
65
+ this.engagement = new engagement_1.EngagementClock(config.engagedWindowMs);
66
+ this.queue = new queue_1.EventQueue({
67
+ flushIntervalMs: config.flushIntervalMs,
68
+ maxQueued: config.maxQueued,
69
+ transport: env.transport,
70
+ envelope: function () { return _this.envelope(); },
71
+ now: env.now,
72
+ setTimer: env.setTimer,
73
+ clearTimer: env.clearTimer,
74
+ debug: config.debug ? function (b) { var _a; return (_a = env.log) === null || _a === void 0 ? void 0 : _a.call(env, '[tracking] batch', b); } : undefined,
75
+ });
76
+ this.sections.onSeen(function (id) { return _this.safe(function () { return _this.onSectionSeen(id); }); });
77
+ this.consent.state.subscribe(function () { return _this.safe(function () { return _this.onConsentChange(); }); });
78
+ }
79
+ /** Runs `fn` and swallows any error: analytics never breaks the page. */
80
+ Tracker.prototype.safe = function (fn) {
81
+ var _a, _b;
82
+ try {
83
+ return fn();
84
+ }
85
+ catch (err) {
86
+ if (this.config.debug)
87
+ (_b = (_a = this.env).log) === null || _b === void 0 ? void 0 : _b.call(_a, '[tracking] error', err);
88
+ return undefined;
89
+ }
90
+ };
91
+ // ── identity ────────────────────────────────────────────────────────────────
92
+ /** The visitor id: exists only with consent. */
93
+ Tracker.prototype.vid = function () {
94
+ if (!this.active())
95
+ return null;
96
+ var vid = this.env.local.get(this.keys.vid);
97
+ if (!vid) {
98
+ vid = (0, ids_1.randomId)(16);
99
+ this.env.local.set(this.keys.vid, vid);
100
+ }
101
+ return vid;
102
+ };
103
+ /** The session id: a new one after `sessionTimeoutMs` without an event. */
104
+ Tracker.prototype.sid = function (touch) {
105
+ var now = this.env.now();
106
+ var s = (0, storage_1.readJson)(this.env.session, this.keys.sid);
107
+ var id = s && now - s.last < this.config.sessionTimeoutMs ? s.id : (0, ids_1.randomId)(12);
108
+ if (touch || !s || s.id !== id)
109
+ (0, storage_1.writeJson)(this.env.session, this.keys.sid, { id: id, last: now });
110
+ return id;
111
+ };
112
+ Tracker.prototype.envelope = function () {
113
+ var vid = this.vid();
114
+ if (!vid)
115
+ return null;
116
+ return { v: 1, property: this.config.property, vid: vid, sid: this.sid(false), consent: 'granted' };
117
+ };
118
+ // ── consent ─────────────────────────────────────────────────────────────────
119
+ Tracker.prototype.grant = function () {
120
+ var _this = this;
121
+ this.safe(function () { return _this.consent.answer('granted'); });
122
+ };
123
+ /** Declines or withdraws: the visitor id and everything tied to it are deleted, nothing more is sent. */
124
+ Tracker.prototype.deny = function () {
125
+ var _this = this;
126
+ this.safe(function () { return _this.consent.answer('denied'); });
127
+ };
128
+ Tracker.prototype.onConsentChange = function () {
129
+ var _this = this;
130
+ if (this.consent.granted()) {
131
+ if (!this.config.enabled)
132
+ return;
133
+ this.vid();
134
+ if (this.firstTouchUtm && !this.env.session.get(this.keys.utm))
135
+ (0, storage_1.writeJson)(this.env.session, this.keys.utm, this.firstTouchUtm);
136
+ this.beginPageView();
137
+ void this.experiments.load();
138
+ return;
139
+ }
140
+ this.queue.clear();
141
+ [this.keys.vid, this.keys.exposed].forEach(function (k) { return _this.env.local.remove(k); });
142
+ [this.keys.sid, this.keys.utm].forEach(function (k) { return _this.env.session.remove(k); });
143
+ this.pv = null;
144
+ this.pageViewId.set(null);
145
+ };
146
+ // ── lifecycle ───────────────────────────────────────────────────────────────
147
+ /** Call once when the page has loaded: starts the first page view if consent was given earlier. */
148
+ Tracker.prototype.start = function () {
149
+ var _this = this;
150
+ this.safe(function () {
151
+ // Idempotent: React StrictMode mounts twice in development.
152
+ if (_this.started)
153
+ return;
154
+ _this.started = true;
155
+ void _this.experiments.load();
156
+ if (!_this.active())
157
+ return;
158
+ _this.vid();
159
+ _this.beginPageView();
160
+ });
161
+ };
162
+ /** A route change in a single-page app: closes the current page view and starts a new one. */
163
+ Tracker.prototype.pageview = function () {
164
+ var _this = this;
165
+ this.safe(function () {
166
+ var page = _this.env.page();
167
+ if (_this.pv && _this.lastUrl === page.path + page.search)
168
+ return;
169
+ _this.experiments.applyPreviewFrom(page.search);
170
+ if (!_this.active())
171
+ return;
172
+ if (_this.pv)
173
+ _this.summary(true);
174
+ _this.beginPageView();
175
+ });
176
+ };
177
+ Tracker.prototype.beginPageView = function () {
178
+ var _this = this;
179
+ var _a;
180
+ var page = this.env.page();
181
+ var now = this.env.now();
182
+ var previous = this.lastUrl;
183
+ this.pv = { id: (0, ids_1.eventId)(), path: page.path, start: now, maxScrollPct: 0, summarySeq: 0, exposed: new Set() };
184
+ this.lastUrl = page.path + page.search;
185
+ this.sections.reset(now);
186
+ this.engagement.reset();
187
+ this.pageViewId.set(this.pv.id);
188
+ var firstOfSession = !this.env.session.get(this.keys.sid);
189
+ var utm = (_a = (0, utm_1.parseUtm)(page.search)) !== null && _a !== void 0 ? _a : (firstOfSession ? this.firstTouchUtm : null);
190
+ this.record('pageview', __assign(__assign({
191
+ // The first page view carries the document referrer; later SPA views the previous page.
192
+ referrer: previous ? "".concat(page.origin).concat(previous) : page.referrer || null, title: page.title }, (utm ? { utm: utm } : {})), { viewport: page.viewport, lang: page.lang }));
193
+ // Watches whose trigger is the render itself fire once per page view.
194
+ this.watches.forEach(function (w) { return w.assignment.trigger == null && _this.expose(w.assignment, 'render'); });
195
+ this.watches.forEach(function (w) { return w.assignment.trigger != null && _this.sections.register(w.assignment.trigger, false); });
196
+ };
197
+ /**
198
+ * A cumulative summary of the page view. Sent when the tab is hidden (`final:
199
+ * false`, the visitor may come back) and when the page is left (`final: true`);
200
+ * the one with the highest `seq` for a `pv_id` is the complete one.
201
+ */
202
+ Tracker.prototype.summary = function (final) {
203
+ var _this = this;
204
+ this.safe(function () {
205
+ if (!_this.pv || !_this.active())
206
+ return;
207
+ var now = _this.env.now();
208
+ _this.pv.summarySeq += 1;
209
+ _this.record('page_summary', {
210
+ duration_ms: Math.max(0, Math.round(now - _this.pv.start)),
211
+ engaged_ms: _this.engagement.total(now),
212
+ max_scroll_pct: _this.pv.maxScrollPct,
213
+ exit_section: _this.sections.current(),
214
+ sections: _this.sections.summary(now),
215
+ seq: _this.pv.summarySeq,
216
+ final: final,
217
+ });
218
+ });
219
+ };
220
+ // ── signals from the browser layer ─────────────────────────────────────────
221
+ Tracker.prototype.activity = function () {
222
+ var _this = this;
223
+ this.safe(function () { return _this.engagement.activity(_this.env.now()); });
224
+ };
225
+ Tracker.prototype.scrolled = function (pct) {
226
+ var _this = this;
227
+ this.safe(function () {
228
+ if (_this.pv)
229
+ _this.pv.maxScrollPct = Math.max(_this.pv.maxScrollPct, Math.min(100, Math.round(pct)));
230
+ });
231
+ };
232
+ Tracker.prototype.setTabVisible = function (visible) {
233
+ var _this = this;
234
+ this.safe(function () {
235
+ var now = _this.env.now();
236
+ _this.sections.setTabVisible(visible, now);
237
+ _this.engagement.setTabVisible(visible, now);
238
+ if (!visible) {
239
+ _this.summary(false);
240
+ void _this.flush('beacon');
241
+ }
242
+ });
243
+ };
244
+ /** The page is going away (`pagehide`). */
245
+ Tracker.prototype.leave = function () {
246
+ var _this = this;
247
+ this.safe(function () {
248
+ _this.summary(true);
249
+ void _this.flush('beacon');
250
+ });
251
+ };
252
+ Tracker.prototype.flush = function (mode) {
253
+ var _this = this;
254
+ var _a;
255
+ if (mode === void 0) { mode = 'fetch'; }
256
+ return (_a = this.safe(function () { return _this.queue.flush(mode); })) !== null && _a !== void 0 ? _a : Promise.resolve();
257
+ };
258
+ // ── events ──────────────────────────────────────────────────────────────────
259
+ /** Queues an event of any type (nothing happens without consent). */
260
+ Tracker.prototype.record = function (type, props) {
261
+ var _this = this;
262
+ this.safe(function () {
263
+ if (!_this.active() || !_this.pv)
264
+ return;
265
+ _this.sid(true);
266
+ _this.queue.push(__assign({ id: (0, ids_1.eventId)(), type: type, ts: new Date(_this.env.now()).toISOString(), pv_id: _this.pv.id, path: _this.pv.path }, (props && Object.keys(props).length ? { props: props } : {})));
267
+ });
268
+ };
269
+ Tracker.prototype.heartbeat = function () {
270
+ this.record('heartbeat');
271
+ };
272
+ Tracker.prototype.click = function (props) {
273
+ this.record('click', props);
274
+ };
275
+ /** A conversion the server's goals can match (`signup-started`, …). */
276
+ Tracker.prototype.goal = function (name, value) {
277
+ this.record('goal', value == null ? { goal: name } : { goal: name, value: value });
278
+ };
279
+ /** A named event with free-form props (`form-submitted`, `plan-picked`, …). */
280
+ Tracker.prototype.custom = function (name, props) {
281
+ if (props === void 0) { props = {}; }
282
+ this.record('custom', __assign(__assign({}, props), { name: name }));
283
+ };
284
+ // ── experiments ─────────────────────────────────────────────────────────────
285
+ /**
286
+ * The variant for this visitor. Preview override first, then the running
287
+ * definition; the control whenever consent, the definitions or targeting say no.
288
+ */
289
+ Tracker.prototype.decide = function (key, fallbackControl) {
290
+ var _this = this;
291
+ var _a;
292
+ if (fallbackControl === void 0) { fallbackControl = 'a'; }
293
+ return ((_a = this.safe(function () {
294
+ var _a, _b;
295
+ var def = _this.experiments.get(key);
296
+ var trigger = (_b = (_a = def === null || def === void 0 ? void 0 : def.trigger) === null || _a === void 0 ? void 0 : _a.section) !== null && _b !== void 0 ? _b : null;
297
+ // An ended test shows its winner to everybody (consent or not, previews or not).
298
+ if ((def === null || def === void 0 ? void 0 : def.status) === 'concluded')
299
+ return (0, experiments_1.assign)(def, null, { path: _this.env.page().path });
300
+ var preview = _this.experiments.previewOf(key);
301
+ if (preview)
302
+ return { key: key, variant: preview, enrolled: false, reason: 'preview', trigger: trigger };
303
+ if (!_this.active())
304
+ return { key: key, variant: fallbackControl, enrolled: false, reason: 'no-consent', trigger: trigger };
305
+ if (!def)
306
+ return { key: key, variant: fallbackControl, enrolled: false, reason: 'not-running', trigger: null };
307
+ var page = _this.env.page();
308
+ return (0, experiments_1.assign)(def, _this.vid(), { path: page.path, device: page.device, lang: page.lang });
309
+ })) !== null && _a !== void 0 ? _a : { key: key, variant: fallbackControl, enrolled: false, reason: 'not-running', trigger: null });
310
+ };
311
+ /**
312
+ * Logs the exposure once per page view when the trigger section is seen (or at
313
+ * once for `trigger: null`). Returns an unsubscribe for when the variant unmounts.
314
+ */
315
+ Tracker.prototype.watchExposure = function (assignment) {
316
+ var _this = this;
317
+ if (!assignment.enrolled)
318
+ return function () { return undefined; };
319
+ var watch = { assignment: assignment };
320
+ this.watches.add(watch);
321
+ this.safe(function () {
322
+ if (assignment.trigger == null)
323
+ _this.expose(assignment, 'render');
324
+ else {
325
+ _this.sections.register(assignment.trigger, false);
326
+ if (_this.sections.isSeen(assignment.trigger))
327
+ _this.expose(assignment, 'view');
328
+ }
329
+ });
330
+ return function () { return void _this.watches.delete(watch); };
331
+ };
332
+ Tracker.prototype.onSectionSeen = function (id) {
333
+ var _this = this;
334
+ this.watches.forEach(function (w) { return w.assignment.trigger === id && _this.expose(w.assignment, 'view'); });
335
+ };
336
+ Tracker.prototype.expose = function (a, trigger) {
337
+ var _a;
338
+ var _b;
339
+ if (!this.pv || !this.active() || this.pv.exposed.has(a.key))
340
+ return;
341
+ this.pv.exposed.add(a.key);
342
+ var exposed = (_b = (0, storage_1.readJson)(this.env.local, this.keys.exposed)) !== null && _b !== void 0 ? _b : {};
343
+ if (exposed[a.key] !== a.variant)
344
+ (0, storage_1.writeJson)(this.env.local, this.keys.exposed, __assign(__assign({}, exposed), (_a = {}, _a[a.key] = a.variant, _a)));
345
+ this.record('exposure', { experiment: a.key, variant: a.variant, trigger: trigger });
346
+ };
347
+ // ── sign-up attribution ─────────────────────────────────────────────────────
348
+ /**
349
+ * Adds `qa_exp=key:variant,…` (experiments this visitor was exposed to; the server's
350
+ * sign-up flow reads this parameter, §5.4 of the contract) and the
351
+ * session's first-touch `utm_*` to a sign-up URL — nothing else, never the vid.
352
+ * Without consent the URL is returned unchanged.
353
+ */
354
+ Tracker.prototype.decorateSignupUrl = function (url) {
355
+ var _this = this;
356
+ var _a;
357
+ return ((_a = this.safe(function () {
358
+ var _a, _b;
359
+ if (!_this.active())
360
+ return url;
361
+ var u = new URL(url);
362
+ var exposed = (_a = (0, storage_1.readJson)(_this.env.local, _this.keys.exposed)) !== null && _a !== void 0 ? _a : {};
363
+ var pairs = Object.entries(exposed)
364
+ .filter(function (_a) {
365
+ var k = _a[0], v = _a[1];
366
+ return k && v;
367
+ })
368
+ .sort(function (_a, _b) {
369
+ var a = _a[0];
370
+ var b = _b[0];
371
+ return a.localeCompare(b);
372
+ })
373
+ .map(function (_a) {
374
+ var k = _a[0], v = _a[1];
375
+ return "".concat(k, ":").concat(v);
376
+ });
377
+ if (pairs.length)
378
+ u.searchParams.set('qa_exp', pairs.join(','));
379
+ var utm = (_b = (0, storage_1.readJson)(_this.env.session, _this.keys.utm)) !== null && _b !== void 0 ? _b : _this.firstTouchUtm;
380
+ (0, utm_1.utmParams)(utm).forEach(function (_a) {
381
+ var k = _a[0], v = _a[1];
382
+ return u.searchParams.set(k, v);
383
+ });
384
+ return u.toString();
385
+ })) !== null && _a !== void 0 ? _a : url);
386
+ };
387
+ return Tracker;
388
+ }());
389
+ exports.Tracker = Tracker;
390
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../src/tracking/core/tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Wire types of the first-party tracker. The contract (event shapes, batch envelope,
3
+ * experiment definitions) is owned by qorus-api `design/analytics-and-experiments-design.md`
4
+ * (§4 collector, §5 experiments); change it there first, then here.
5
+ */
6
+ export type TConsentState = 'unknown' | 'granted' | 'denied';
7
+ /** Event types the collector knows. New ones are allowed without a schema change (§4). */
8
+ export type TEventType = 'pageview' | 'page_summary' | 'click' | 'heartbeat' | 'exposure' | 'goal' | 'custom' | (string & Record<never, never>);
9
+ export type TProps = Record<string, unknown>;
10
+ export interface ITrackedEvent {
11
+ /** Random id: makes the write idempotent (retries, beacon + fetch fallback). */
12
+ id: string;
13
+ type: TEventType;
14
+ /** ISO timestamp of when it happened in the browser. */
15
+ ts: string;
16
+ pv_id: string;
17
+ path: string;
18
+ props?: TProps;
19
+ }
20
+ export interface IBatch {
21
+ v: 1;
22
+ property: string;
23
+ vid: string;
24
+ sid: string;
25
+ sent_at: string;
26
+ consent: 'granted';
27
+ events: ITrackedEvent[];
28
+ }
29
+ export interface IUtm {
30
+ source?: string;
31
+ medium?: string;
32
+ campaign?: string;
33
+ term?: string;
34
+ content?: string;
35
+ }
36
+ /** Public fields of a running experiment (the experiments endpoint, `?property=…`). */
37
+ export interface IExperimentVariant {
38
+ key: string;
39
+ weight: number;
40
+ control?: boolean;
41
+ }
42
+ export interface IExperimentDefinition {
43
+ key: string;
44
+ /**
45
+ * `running` (assign and log), or `concluded`: everybody sees `winner`, nothing is logged. A
46
+ * concluded entry carries only `key`, `status` and `winner`; its `variants` are normalised to [].
47
+ */
48
+ status?: 'running' | 'concluded' | (string & Record<never, never>);
49
+ winner?: string | null;
50
+ /** Counter of the running experiment's phase (a removed version starts a new one). */
51
+ phase?: number;
52
+ variants: IExperimentVariant[];
53
+ /** Share of visitors enrolled, 0..1 (the rest see the control, no exposure). */
54
+ traffic: number;
55
+ targeting?: {
56
+ paths?: string[] | null;
57
+ device?: string | null;
58
+ lang?: string | null;
59
+ } | null;
60
+ /** The element whose being seen counts as exposure; none → exposure on render. */
61
+ trigger?: {
62
+ section?: string | null;
63
+ } | null;
64
+ }
65
+ /** Everything the tracker needs from its host. Every product-specific value lives here. */
66
+ export interface ITrackingConfig {
67
+ /**
68
+ * Which product the events belong to (`landing`, `ide`, `admin`, …). The server keeps each
69
+ * property's events, goals and experiments apart, and the experiments list is fetched for it.
70
+ */
71
+ property: string;
72
+ /** Collector URL (`POST`, the batch envelope of §4 of the contract). */
73
+ endpoint: string;
74
+ /** Running-experiments URL (`GET`); `?property=` is appended. */
75
+ experimentsEndpoint: string;
76
+ /** Master switch: false → nothing is ever sent, experiments serve the control. */
77
+ enabled: boolean;
78
+ /** Bump when the consent text changes materially: stored answers of older versions are asked again. */
79
+ consentVersion: number;
80
+ /**
81
+ * Prefix of every localStorage / sessionStorage key the tracker writes (default `qa.`, the
82
+ * contract's). Two products on one origin need different prefixes, or they share one consent
83
+ * answer, one visitor id and one experiments cache.
84
+ */
85
+ storagePrefix: string;
86
+ /** Query parameter of a shareable variant preview (`?qa_variant=key:variant`). */
87
+ previewParam: string;
88
+ /** Log every batch to the console instead of silently sending. */
89
+ debug: boolean;
90
+ flushIntervalMs: number;
91
+ /** Flush as soon as this many events are queued. */
92
+ maxQueued: number;
93
+ heartbeatMs: number;
94
+ sessionTimeoutMs: number;
95
+ /** An interaction within this window counts the time as engaged. */
96
+ engagedWindowMs: number;
97
+ }
98
+ /** The config fields every product must set: nothing product-specific has a default. */
99
+ export type TRequiredTrackingConfig = 'property' | 'endpoint' | 'experimentsEndpoint';
100
+ export declare const DEFAULT_STORAGE_PREFIX = "qa.";
101
+ export declare const DEFAULT_CONFIG: Omit<ITrackingConfig, TRequiredTrackingConfig>;
102
+ /** What a product passes: the required fields, and any default it wants to change. */
103
+ export type TTrackingOptions = Partial<ITrackingConfig> & Pick<ITrackingConfig, TRequiredTrackingConfig>;
104
+ /** The full config: `options` over `DEFAULT_CONFIG` (an `undefined` option keeps the default). */
105
+ export declare const resolveConfig: (options: TTrackingOptions) => ITrackingConfig;
106
+ /** The storage keys for one prefix (first-party, removable in one sweep). */
107
+ export declare const storageKeys: (prefix?: string) => {
108
+ /** localStorage: `granted` | `denied` */
109
+ consent: string;
110
+ /** localStorage: the consent version that was answered */
111
+ consentVersion: string;
112
+ /** localStorage: the visitor id (exists only with consent) */
113
+ vid: string;
114
+ /** sessionStorage: `{ id, last }` */
115
+ sid: string;
116
+ /** sessionStorage: first-touch utm of this session */
117
+ utm: string;
118
+ /** localStorage: `{ experimentKey: variant }` the visitor was exposed to (sign-up attribution) */
119
+ exposed: string;
120
+ /** sessionStorage: preview overrides from the preview query parameter */
121
+ preview: string;
122
+ /** localStorage: last fetched public experiment definitions */
123
+ experimentsCache: string;
124
+ /** localStorage: an in-app version switch per experiment (`{ key: variant }`), never logged */
125
+ editorVariants: string;
126
+ };
127
+ export type TStorageKeys = ReturnType<typeof storageKeys>;
128
+ /** The keys with the default prefix (`qa.consent`, `qa.vid`, …). */
129
+ export declare const KEYS: TStorageKeys;
130
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * Wire types of the first-party tracker. The contract (event shapes, batch envelope,
4
+ * experiment definitions) is owned by qorus-api `design/analytics-and-experiments-design.md`
5
+ * (§4 collector, §5 experiments); change it there first, then here.
6
+ */
7
+ var __assign = (this && this.__assign) || function () {
8
+ __assign = Object.assign || function(t) {
9
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
10
+ s = arguments[i];
11
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
12
+ t[p] = s[p];
13
+ }
14
+ return t;
15
+ };
16
+ return __assign.apply(this, arguments);
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.KEYS = exports.storageKeys = exports.resolveConfig = exports.DEFAULT_CONFIG = exports.DEFAULT_STORAGE_PREFIX = void 0;
20
+ exports.DEFAULT_STORAGE_PREFIX = 'qa.';
21
+ exports.DEFAULT_CONFIG = {
22
+ enabled: true,
23
+ consentVersion: 1,
24
+ storagePrefix: exports.DEFAULT_STORAGE_PREFIX,
25
+ previewParam: 'qa_variant',
26
+ debug: false,
27
+ flushIntervalMs: 5000,
28
+ maxQueued: 20,
29
+ heartbeatMs: 15000,
30
+ sessionTimeoutMs: 30 * 60 * 1000,
31
+ engagedWindowMs: 10000,
32
+ };
33
+ /** The full config: `options` over `DEFAULT_CONFIG` (an `undefined` option keeps the default). */
34
+ var resolveConfig = function (options) {
35
+ var set = Object.fromEntries(Object.entries(options).filter(function (_a) {
36
+ var v = _a[1];
37
+ return v !== undefined;
38
+ }));
39
+ return __assign(__assign({}, exports.DEFAULT_CONFIG), set);
40
+ };
41
+ exports.resolveConfig = resolveConfig;
42
+ /** The storage keys for one prefix (first-party, removable in one sweep). */
43
+ var storageKeys = function (prefix) {
44
+ if (prefix === void 0) { prefix = exports.DEFAULT_STORAGE_PREFIX; }
45
+ return ({
46
+ /** localStorage: `granted` | `denied` */
47
+ consent: "".concat(prefix, "consent"),
48
+ /** localStorage: the consent version that was answered */
49
+ consentVersion: "".concat(prefix, "consent.v"),
50
+ /** localStorage: the visitor id (exists only with consent) */
51
+ vid: "".concat(prefix, "vid"),
52
+ /** sessionStorage: `{ id, last }` */
53
+ sid: "".concat(prefix, "sid"),
54
+ /** sessionStorage: first-touch utm of this session */
55
+ utm: "".concat(prefix, "utm"),
56
+ /** localStorage: `{ experimentKey: variant }` the visitor was exposed to (sign-up attribution) */
57
+ exposed: "".concat(prefix, "exp"),
58
+ /** sessionStorage: preview overrides from the preview query parameter */
59
+ preview: "".concat(prefix, "preview"),
60
+ /** localStorage: last fetched public experiment definitions */
61
+ experimentsCache: "".concat(prefix, "experiments"),
62
+ /** localStorage: an in-app version switch per experiment (`{ key: variant }`), never logged */
63
+ editorVariants: "".concat(prefix, "editor.variants"),
64
+ });
65
+ };
66
+ exports.storageKeys = storageKeys;
67
+ /** The keys with the default prefix (`qa.consent`, `qa.vid`, …). */
68
+ exports.KEYS = (0, exports.storageKeys)(exports.DEFAULT_STORAGE_PREFIX);
69
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tracking/core/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;AA4GU,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAE/B,QAAA,cAAc,GAAmD;IAC5E,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,8BAAsB;IACrC,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,KAAK;IACZ,eAAe,EAAE,IAAI;IACrB,SAAS,EAAE,EAAE;IACb,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAChC,eAAe,EAAE,KAAK;CACvB,CAAC;AAKF,kGAAkG;AAC3F,IAAM,aAAa,GAAG,UAAC,OAAyB;IACrD,IAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,UAAC,EAAK;YAAF,CAAC,QAAA;QAAM,OAAA,CAAC,KAAK,SAAS;IAAf,CAAe,CAAC,CAAC,CAAC;IAC3F,OAAO,sBAAK,sBAAc,GAAK,GAAG,CAAqB,CAAC;AAC1D,CAAC,CAAC;AAHW,QAAA,aAAa,iBAGxB;AAEF,6EAA6E;AACtE,IAAM,WAAW,GAAG,UAAC,MAAuC;IAAvC,uBAAA,EAAA,SAAiB,8BAAsB;IAAK,OAAA,CAAC;QACvE,yCAAyC;QACzC,OAAO,EAAE,UAAG,MAAM,YAAS;QAC3B,0DAA0D;QAC1D,cAAc,EAAE,UAAG,MAAM,cAAW;QACpC,8DAA8D;QAC9D,GAAG,EAAE,UAAG,MAAM,QAAK;QACnB,qCAAqC;QACrC,GAAG,EAAE,UAAG,MAAM,QAAK;QACnB,sDAAsD;QACtD,GAAG,EAAE,UAAG,MAAM,QAAK;QACnB,kGAAkG;QAClG,OAAO,EAAE,UAAG,MAAM,QAAK;QACvB,yEAAyE;QACzE,OAAO,EAAE,UAAG,MAAM,YAAS;QAC3B,+DAA+D;QAC/D,gBAAgB,EAAE,UAAG,MAAM,gBAAa;QACxC,+FAA+F;QAC/F,cAAc,EAAE,UAAG,MAAM,oBAAiB;KAC3C,CAAC;AAnBsE,CAmBtE,CAAC;AAnBU,QAAA,WAAW,eAmBrB;AAIH,oEAAoE;AACvD,QAAA,IAAI,GAAiB,IAAA,mBAAW,EAAC,8BAAsB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { IUtm } from './types';
2
+ /** The `utm_*` parameters of a query string, or null when there are none. */
3
+ export declare const parseUtm: (search: string) => IUtm | null;
4
+ /** `{ source: 'x' }` → `[['utm_source', 'x']]`, in a stable order. */
5
+ export declare const utmParams: (utm: IUtm | null | undefined) => [string, string][];
6
+ //# sourceMappingURL=utm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utm.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/utm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAIpC,6EAA6E;AAC7E,eAAO,MAAM,QAAQ,WAAY,MAAM,KAAG,IAAI,GAAG,IAahD,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,SAAS,QAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACe,CAAC"}