@qoretechnologies/reqraft 0.10.56 → 0.10.57-pr.127.g0a792ea
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/.claude/CLAUDE.md +1 -0
- package/README.md +20 -0
- package/design/TRACKING.md +290 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/tracking/browser/attach.d.ts +8 -0
- package/dist/tracking/browser/attach.d.ts.map +1 -0
- package/dist/tracking/browser/attach.js +182 -0
- package/dist/tracking/browser/attach.js.map +1 -0
- package/dist/tracking/browser/env.d.ts +14 -0
- package/dist/tracking/browser/env.d.ts.map +1 -0
- package/dist/tracking/browser/env.js +150 -0
- package/dist/tracking/browser/env.js.map +1 -0
- package/dist/tracking/core/consent.d.ts +21 -0
- package/dist/tracking/core/consent.d.ts.map +1 -0
- package/dist/tracking/core/consent.js +39 -0
- package/dist/tracking/core/consent.js.map +1 -0
- package/dist/tracking/core/engagement.d.ts +20 -0
- package/dist/tracking/core/engagement.d.ts.map +1 -0
- package/dist/tracking/core/engagement.js +52 -0
- package/dist/tracking/core/engagement.js.map +1 -0
- package/dist/tracking/core/experiments.d.ts +109 -0
- package/dist/tracking/core/experiments.d.ts.map +1 -0
- package/dist/tracking/core/experiments.js +294 -0
- package/dist/tracking/core/experiments.js.map +1 -0
- package/dist/tracking/core/hash.d.ts +16 -0
- package/dist/tracking/core/hash.d.ts.map +1 -0
- package/dist/tracking/core/hash.js +31 -0
- package/dist/tracking/core/hash.js.map +1 -0
- package/dist/tracking/core/ids.d.ts +6 -0
- package/dist/tracking/core/ids.d.ts.map +1 -0
- package/dist/tracking/core/ids.js +31 -0
- package/dist/tracking/core/ids.js.map +1 -0
- package/dist/tracking/core/observable.d.ts +12 -0
- package/dist/tracking/core/observable.d.ts.map +1 -0
- package/dist/tracking/core/observable.js +32 -0
- package/dist/tracking/core/observable.js.map +1 -0
- package/dist/tracking/core/queue.d.ts +47 -0
- package/dist/tracking/core/queue.d.ts.map +1 -0
- package/dist/tracking/core/queue.js +205 -0
- package/dist/tracking/core/queue.js.map +1 -0
- package/dist/tracking/core/sections.d.ts +54 -0
- package/dist/tracking/core/sections.d.ts.map +1 -0
- package/dist/tracking/core/sections.js +156 -0
- package/dist/tracking/core/sections.js.map +1 -0
- package/dist/tracking/core/storage.d.ts +15 -0
- package/dist/tracking/core/storage.d.ts.map +1 -0
- package/dist/tracking/core/storage.js +72 -0
- package/dist/tracking/core/storage.js.map +1 -0
- package/dist/tracking/core/tracker.d.ts +122 -0
- package/dist/tracking/core/tracker.d.ts.map +1 -0
- package/dist/tracking/core/tracker.js +390 -0
- package/dist/tracking/core/tracker.js.map +1 -0
- package/dist/tracking/core/types.d.ts +130 -0
- package/dist/tracking/core/types.d.ts.map +1 -0
- package/dist/tracking/core/types.js +69 -0
- package/dist/tracking/core/types.js.map +1 -0
- package/dist/tracking/core/utm.d.ts +6 -0
- package/dist/tracking/core/utm.d.ts.map +1 -0
- package/dist/tracking/core/utm.js +30 -0
- package/dist/tracking/core/utm.js.map +1 -0
- package/dist/tracking/index.d.ts +46 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +91 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/markup.d.ts +12 -0
- package/dist/tracking/markup.d.ts.map +1 -0
- package/dist/tracking/markup.js +19 -0
- package/dist/tracking/markup.js.map +1 -0
- package/dist/tracking/react/Experiment.d.ts +23 -0
- package/dist/tracking/react/Experiment.d.ts.map +1 -0
- package/dist/tracking/react/Experiment.js +28 -0
- package/dist/tracking/react/Experiment.js.map +1 -0
- package/dist/tracking/react/TrackingProvider.d.ts +26 -0
- package/dist/tracking/react/TrackingProvider.d.ts.map +1 -0
- package/dist/tracking/react/TrackingProvider.js +45 -0
- package/dist/tracking/react/TrackingProvider.js.map +1 -0
- package/dist/tracking/react/hooks.d.ts +39 -0
- package/dist/tracking/react/hooks.d.ts.map +1 -0
- package/dist/tracking/react/hooks.js +96 -0
- package/dist/tracking/react/hooks.js.map +1 -0
- package/dist/tracking/react/index.d.ts +7 -0
- package/dist/tracking/react/index.d.ts.map +1 -0
- package/dist/tracking/react/index.js +17 -0
- package/dist/tracking/react/index.js.map +1 -0
- package/dist/tracking/testing.d.ts +40 -0
- package/dist/tracking/testing.d.ts.map +1 -0
- package/dist/tracking/testing.js +140 -0
- package/dist/tracking/testing.js.map +1 -0
- package/dist/tracking/ui/ExperimentCard.d.ts +55 -0
- package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentCard.js +340 -0
- package/dist/tracking/ui/ExperimentCard.js.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts +59 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.js +359 -0
- package/dist/tracking/ui/ExperimentsOverlay.js.map +1 -0
- package/dist/tracking/ui/anchor.d.ts +107 -0
- package/dist/tracking/ui/anchor.d.ts.map +1 -0
- package/dist/tracking/ui/anchor.js +108 -0
- package/dist/tracking/ui/anchor.js.map +1 -0
- package/dist/tracking/ui/card.d.ts +121 -0
- package/dist/tracking/ui/card.d.ts.map +1 -0
- package/dist/tracking/ui/card.js +417 -0
- package/dist/tracking/ui/card.js.map +1 -0
- package/dist/tracking/ui/client.d.ts +42 -0
- package/dist/tracking/ui/client.d.ts.map +1 -0
- package/dist/tracking/ui/client.js +123 -0
- package/dist/tracking/ui/client.js.map +1 -0
- package/dist/tracking/ui/index.d.ts +20 -0
- package/dist/tracking/ui/index.d.ts.map +1 -0
- package/dist/tracking/ui/index.js +60 -0
- package/dist/tracking/ui/index.js.map +1 -0
- package/dist/tracking/ui/types.d.ts +120 -0
- package/dist/tracking/ui/types.d.ts.map +1 -0
- package/dist/tracking/ui/types.js +8 -0
- package/dist/tracking/ui/types.js.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts +31 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.js +136 -0
- package/dist/tracking/ui/useExperimentsAdmin.js.map +1 -0
- package/package.json +1 -1
- package/src/index.tsx +5 -0
- package/src/stories/tracking.tsx +206 -0
- package/src/tracking/browser/attach.ts +186 -0
- package/src/tracking/browser/env.ts +78 -0
- package/src/tracking/core/consent.ts +37 -0
- package/src/tracking/core/engagement.ts +47 -0
- package/src/tracking/core/experiments.ts +258 -0
- package/src/tracking/core/hash.ts +26 -0
- package/src/tracking/core/ids.ts +25 -0
- package/src/tracking/core/observable.ts +23 -0
- package/src/tracking/core/queue.ts +131 -0
- package/src/tracking/core/sections.ts +166 -0
- package/src/tracking/core/storage.ts +69 -0
- package/src/tracking/core/tracker.ts +417 -0
- package/src/tracking/core/types.ts +162 -0
- package/src/tracking/core/utm.ts +23 -0
- package/src/tracking/index.ts +72 -0
- package/src/tracking/markup.ts +17 -0
- package/src/tracking/react/Experiment.tsx +44 -0
- package/src/tracking/react/TrackingProvider.tsx +56 -0
- package/src/tracking/react/hooks.ts +106 -0
- package/src/tracking/react/index.ts +13 -0
- package/src/tracking/testing.ts +108 -0
- package/src/tracking/ui/ExperimentCard.stories.tsx +290 -0
- package/src/tracking/ui/ExperimentCard.tsx +581 -0
- package/src/tracking/ui/ExperimentsOverlay.stories.tsx +155 -0
- package/src/tracking/ui/ExperimentsOverlay.tsx +437 -0
- package/src/tracking/ui/anchor.ts +180 -0
- package/src/tracking/ui/card.ts +464 -0
- package/src/tracking/ui/client.ts +117 -0
- package/src/tracking/ui/index.ts +77 -0
- package/src/tracking/ui/types.ts +110 -0
- package/src/tracking/ui/useExperimentsAdmin.ts +103 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.browserEnv = exports.deviceOf = exports.browserTransport = void 0;
|
|
40
|
+
var storage_1 = require("../core/storage");
|
|
41
|
+
/**
|
|
42
|
+
* Sends a batch. `beacon` (page going away): `navigator.sendBeacon`, falling back
|
|
43
|
+
* to `fetch(…, { keepalive: true })` when the beacon is refused (too big, or the
|
|
44
|
+
* browser has none). Any HTTP answer counts as delivered — the collector always
|
|
45
|
+
* answers 204, and a 404 (collector not installed) must not turn into a retry loop;
|
|
46
|
+
* only a network error keeps the batch for the next flush.
|
|
47
|
+
*/
|
|
48
|
+
var browserTransport = function (endpoint) { return ({
|
|
49
|
+
send: function (body, mode) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
51
|
+
var _a;
|
|
52
|
+
return __generator(this, function (_b) {
|
|
53
|
+
switch (_b.label) {
|
|
54
|
+
case 0:
|
|
55
|
+
if (mode === 'beacon' && typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {
|
|
56
|
+
try {
|
|
57
|
+
if (navigator.sendBeacon(endpoint, new Blob([body], { type: 'application/json' })))
|
|
58
|
+
return [2 /*return*/, true];
|
|
59
|
+
}
|
|
60
|
+
catch (_c) {
|
|
61
|
+
/* fall through to fetch */
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
_b.label = 1;
|
|
65
|
+
case 1:
|
|
66
|
+
_b.trys.push([1, 3, , 4]);
|
|
67
|
+
return [4 /*yield*/, fetch(endpoint, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
body: body,
|
|
70
|
+
headers: { 'Content-Type': 'application/json' },
|
|
71
|
+
// Batches stay under 60 KB (queue.ts), inside keepalive's 64 KB budget.
|
|
72
|
+
keepalive: true,
|
|
73
|
+
credentials: 'same-origin',
|
|
74
|
+
})];
|
|
75
|
+
case 2:
|
|
76
|
+
_b.sent();
|
|
77
|
+
return [2 /*return*/, true];
|
|
78
|
+
case 3:
|
|
79
|
+
_a = _b.sent();
|
|
80
|
+
return [2 /*return*/, false];
|
|
81
|
+
case 4: return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
}); };
|
|
87
|
+
exports.browserTransport = browserTransport;
|
|
88
|
+
var fetchJson = function (url, timeoutMs) { return __awaiter(void 0, void 0, void 0, function () {
|
|
89
|
+
var ctrl, timer, res;
|
|
90
|
+
return __generator(this, function (_a) {
|
|
91
|
+
switch (_a.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
ctrl = typeof AbortController !== 'undefined' ? new AbortController() : undefined;
|
|
94
|
+
timer = setTimeout(function () { return ctrl === null || ctrl === void 0 ? void 0 : ctrl.abort(); }, timeoutMs);
|
|
95
|
+
_a.label = 1;
|
|
96
|
+
case 1:
|
|
97
|
+
_a.trys.push([1, , 4, 5]);
|
|
98
|
+
return [4 /*yield*/, fetch(url, { headers: { Accept: 'application/json' }, signal: ctrl === null || ctrl === void 0 ? void 0 : ctrl.signal, credentials: 'same-origin' })];
|
|
99
|
+
case 2:
|
|
100
|
+
res = _a.sent();
|
|
101
|
+
if (!res.ok)
|
|
102
|
+
throw new Error("HTTP ".concat(res.status));
|
|
103
|
+
return [4 /*yield*/, res.json()];
|
|
104
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
105
|
+
case 4:
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
return [7 /*endfinally*/];
|
|
108
|
+
case 5: return [2 /*return*/];
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}); };
|
|
112
|
+
/** desktop / tablet / mobile from the user agent (targeting only; the server classifies for reports). */
|
|
113
|
+
var deviceOf = function (ua) {
|
|
114
|
+
if (/iPad|Tablet|PlayBook|Silk|Android(?!.*Mobile)/i.test(ua))
|
|
115
|
+
return 'tablet';
|
|
116
|
+
if (/Mobi|iPhone|iPod|Android.*Mobile|Opera Mini|IEMobile/i.test(ua))
|
|
117
|
+
return 'mobile';
|
|
118
|
+
return 'desktop';
|
|
119
|
+
};
|
|
120
|
+
exports.deviceOf = deviceOf;
|
|
121
|
+
var readPage = function () { return ({
|
|
122
|
+
origin: window.location.origin,
|
|
123
|
+
path: window.location.pathname,
|
|
124
|
+
search: window.location.search,
|
|
125
|
+
title: document.title,
|
|
126
|
+
referrer: document.referrer,
|
|
127
|
+
lang: navigator.language || 'en',
|
|
128
|
+
viewport: [window.innerWidth, window.innerHeight],
|
|
129
|
+
device: (0, exports.deviceOf)(navigator.userAgent || ''),
|
|
130
|
+
}); };
|
|
131
|
+
var browserEnv = function (endpoint) { return ({
|
|
132
|
+
local: (0, storage_1.safeStorage)(function () { return window.localStorage; }),
|
|
133
|
+
session: (0, storage_1.safeStorage)(function () { return window.sessionStorage; }),
|
|
134
|
+
transport: (0, exports.browserTransport)(endpoint),
|
|
135
|
+
now: function () { return Date.now(); },
|
|
136
|
+
setTimer: function (fn, ms) { return setTimeout(fn, ms); },
|
|
137
|
+
clearTimer: function (h) { return clearTimeout(h); },
|
|
138
|
+
page: readPage,
|
|
139
|
+
fetchJson: fetchJson,
|
|
140
|
+
// eslint-disable-next-line no-console
|
|
141
|
+
log: function () {
|
|
142
|
+
var args = [];
|
|
143
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
144
|
+
args[_i] = arguments[_i];
|
|
145
|
+
}
|
|
146
|
+
return console.info.apply(console, args);
|
|
147
|
+
},
|
|
148
|
+
}); };
|
|
149
|
+
exports.browserEnv = browserEnv;
|
|
150
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/tracking/browser/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IStorage } from './storage';
|
|
2
|
+
import { Observable } from './observable';
|
|
3
|
+
import { type TConsentState, type TStorageKeys } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* The visitor's answer (§3 of the contract): `localStorage["<prefix>consent"]` is
|
|
6
|
+
* `granted` | `denied`, `<prefix>consent.v` the version of the text they answered
|
|
7
|
+
* (prefix `qa.` by default). An answer to an older version counts as no answer, so
|
|
8
|
+
* the consent prompt asks again.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ConsentStore {
|
|
11
|
+
private readonly storage;
|
|
12
|
+
private readonly version;
|
|
13
|
+
private readonly keys;
|
|
14
|
+
readonly state: Observable<TConsentState>;
|
|
15
|
+
constructor(storage: IStorage, version: number, keys?: TStorageKeys);
|
|
16
|
+
private read;
|
|
17
|
+
get: () => TConsentState;
|
|
18
|
+
granted: () => boolean;
|
|
19
|
+
answer(state: 'granted' | 'denied'): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/consent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAQ,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEtE;;;;;GAKG;AACH,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;gBAGvB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,YAAmB;IAK5C,OAAO,CAAC,IAAI;IAOZ,GAAG,QAAO,aAAa,CAAqB;IAC5C,OAAO,QAAO,OAAO,CAAmC;IAExD,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;CAKnC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConsentStore = void 0;
|
|
4
|
+
var observable_1 = require("./observable");
|
|
5
|
+
var types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* The visitor's answer (§3 of the contract): `localStorage["<prefix>consent"]` is
|
|
8
|
+
* `granted` | `denied`, `<prefix>consent.v` the version of the text they answered
|
|
9
|
+
* (prefix `qa.` by default). An answer to an older version counts as no answer, so
|
|
10
|
+
* the consent prompt asks again.
|
|
11
|
+
*/
|
|
12
|
+
var ConsentStore = /** @class */ (function () {
|
|
13
|
+
function ConsentStore(storage, version, keys) {
|
|
14
|
+
if (keys === void 0) { keys = types_1.KEYS; }
|
|
15
|
+
var _this = this;
|
|
16
|
+
this.storage = storage;
|
|
17
|
+
this.version = version;
|
|
18
|
+
this.keys = keys;
|
|
19
|
+
this.get = function () { return _this.state.get(); };
|
|
20
|
+
this.granted = function () { return _this.state.get() === 'granted'; };
|
|
21
|
+
this.state = new observable_1.Observable(this.read());
|
|
22
|
+
}
|
|
23
|
+
ConsentStore.prototype.read = function () {
|
|
24
|
+
var _a;
|
|
25
|
+
var answer = this.storage.get(this.keys.consent);
|
|
26
|
+
var version = Number((_a = this.storage.get(this.keys.consentVersion)) !== null && _a !== void 0 ? _a : 0);
|
|
27
|
+
if ((answer === 'granted' || answer === 'denied') && version >= this.version)
|
|
28
|
+
return answer;
|
|
29
|
+
return 'unknown';
|
|
30
|
+
};
|
|
31
|
+
ConsentStore.prototype.answer = function (state) {
|
|
32
|
+
this.storage.set(this.keys.consent, state);
|
|
33
|
+
this.storage.set(this.keys.consentVersion, String(this.version));
|
|
34
|
+
this.state.set(state);
|
|
35
|
+
};
|
|
36
|
+
return ConsentStore;
|
|
37
|
+
}());
|
|
38
|
+
exports.ConsentStore = ConsentStore;
|
|
39
|
+
//# sourceMappingURL=consent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../../../src/tracking/core/consent.ts"],"names":[],"mappings":";;;AACA,2CAA0C;AAC1C,iCAAsE;AAEtE;;;;;GAKG;AACH;IAGE,sBACmB,OAAiB,EACjB,OAAe,EACf,IAAyB;QAAzB,qBAAA,EAAA,OAAqB,YAAI;QAH5C,iBAMC;QALkB,YAAO,GAAP,OAAO,CAAU;QACjB,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAqB;QAY5C,QAAG,GAAG,cAAqB,OAAA,KAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAhB,CAAgB,CAAC;QAC5C,YAAO,GAAG,cAAe,OAAA,KAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,SAAS,EAA9B,CAA8B,CAAC;QAXtD,IAAI,CAAC,KAAK,GAAG,IAAI,uBAAU,CAAgB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAEO,2BAAI,GAAZ;;QACE,IAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAM,OAAO,GAAG,MAAM,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC;QAC5F,OAAO,SAAS,CAAC;IACnB,CAAC;IAKD,6BAAM,GAAN,UAAO,KAA2B;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACH,mBAAC;AAAD,CAAC,AA1BD,IA0BC;AA1BY,oCAAY"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engaged time: the tab is visible AND the visitor did something (scroll, pointer,
|
|
3
|
+
* key, touch) within the last `windowMs`. Each interaction extends the engaged
|
|
4
|
+
* stretch to `interaction + windowMs`; hiding the tab ends it at once.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EngagementClock {
|
|
7
|
+
private readonly windowMs;
|
|
8
|
+
private engagedMs;
|
|
9
|
+
/** Start and end of the current engaged stretch (end is in the future while active). */
|
|
10
|
+
private from;
|
|
11
|
+
private until;
|
|
12
|
+
private tabVisible;
|
|
13
|
+
constructor(windowMs: number);
|
|
14
|
+
reset(): void;
|
|
15
|
+
activity(now: number): void;
|
|
16
|
+
setTabVisible(visible: boolean, now: number): void;
|
|
17
|
+
private close;
|
|
18
|
+
total(now: number): number;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=engagement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/engagement.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,eAAe;IAOd,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,OAAO,CAAC,SAAS,CAAK;IACtB,wFAAwF;IACxF,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,UAAU,CAAQ;gBAEG,QAAQ,EAAE,MAAM;IAE7C,KAAK;IAML,QAAQ,CAAC,GAAG,EAAE,MAAM;IAWpB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM;IAK3C,OAAO,CAAC,KAAK;IAMb,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAI3B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EngagementClock = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Engaged time: the tab is visible AND the visitor did something (scroll, pointer,
|
|
6
|
+
* key, touch) within the last `windowMs`. Each interaction extends the engaged
|
|
7
|
+
* stretch to `interaction + windowMs`; hiding the tab ends it at once.
|
|
8
|
+
*/
|
|
9
|
+
var EngagementClock = /** @class */ (function () {
|
|
10
|
+
function EngagementClock(windowMs) {
|
|
11
|
+
this.windowMs = windowMs;
|
|
12
|
+
this.engagedMs = 0;
|
|
13
|
+
/** Start and end of the current engaged stretch (end is in the future while active). */
|
|
14
|
+
this.from = null;
|
|
15
|
+
this.until = 0;
|
|
16
|
+
this.tabVisible = true;
|
|
17
|
+
}
|
|
18
|
+
EngagementClock.prototype.reset = function () {
|
|
19
|
+
this.engagedMs = 0;
|
|
20
|
+
this.from = null;
|
|
21
|
+
this.until = 0;
|
|
22
|
+
};
|
|
23
|
+
EngagementClock.prototype.activity = function (now) {
|
|
24
|
+
if (!this.tabVisible)
|
|
25
|
+
return;
|
|
26
|
+
if (this.from != null && now <= this.until) {
|
|
27
|
+
this.until = now + this.windowMs;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.close(now);
|
|
31
|
+
this.from = now;
|
|
32
|
+
this.until = now + this.windowMs;
|
|
33
|
+
};
|
|
34
|
+
EngagementClock.prototype.setTabVisible = function (visible, now) {
|
|
35
|
+
if (!visible)
|
|
36
|
+
this.close(now);
|
|
37
|
+
this.tabVisible = visible;
|
|
38
|
+
};
|
|
39
|
+
EngagementClock.prototype.close = function (now) {
|
|
40
|
+
if (this.from == null)
|
|
41
|
+
return;
|
|
42
|
+
this.engagedMs += Math.max(0, Math.min(now, this.until) - this.from);
|
|
43
|
+
this.from = null;
|
|
44
|
+
};
|
|
45
|
+
EngagementClock.prototype.total = function (now) {
|
|
46
|
+
var open = this.from != null ? Math.max(0, Math.min(now, this.until) - this.from) : 0;
|
|
47
|
+
return Math.round(this.engagedMs + open);
|
|
48
|
+
};
|
|
49
|
+
return EngagementClock;
|
|
50
|
+
}());
|
|
51
|
+
exports.EngagementClock = EngagementClock;
|
|
52
|
+
//# sourceMappingURL=engagement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement.js","sourceRoot":"","sources":["../../../src/tracking/core/engagement.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH;IAOE,yBAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QANrC,cAAS,GAAG,CAAC,CAAC;QACtB,wFAAwF;QAChF,SAAI,GAAkB,IAAI,CAAC;QAC3B,UAAK,GAAG,CAAC,CAAC;QACV,eAAU,GAAG,IAAI,CAAC;IAEsB,CAAC;IAEjD,+BAAK,GAAL;QACE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,kCAAQ,GAAR,UAAS,GAAW;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,uCAAa,GAAb,UAAc,OAAgB,EAAE,GAAW;QACzC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC5B,CAAC;IAEO,+BAAK,GAAb,UAAc,GAAW;QACvB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;YAAE,OAAO;QAC9B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,+BAAK,GAAL,UAAM,GAAW;QACf,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC;IACH,sBAAC;AAAD,CAAC,AAzCD,IAyCC;AAzCY,0CAAe"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Observable } from './observable';
|
|
2
|
+
import { type IStorage } from './storage';
|
|
3
|
+
import { type IExperimentDefinition, type IExperimentVariant, type TStorageKeys } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Client-side assignment (§5 of the contract). No round trip: the running
|
|
6
|
+
* experiments are fetched once (public fields only) and every visitor is bucketed
|
|
7
|
+
* locally from their `vid`, the same way every time, on any page.
|
|
8
|
+
*/
|
|
9
|
+
export type TAssignmentReason =
|
|
10
|
+
/** Bucketed into a variant: an exposure is logged when the trigger is seen. */
|
|
11
|
+
'assigned'
|
|
12
|
+
/** Outside the experiment's traffic share: control, no exposure. */
|
|
13
|
+
| 'not-enrolled'
|
|
14
|
+
/** Targeting (path, device, language) does not match: control, no exposure. */
|
|
15
|
+
| 'not-targeted'
|
|
16
|
+
/** No consent (no vid) or tracking disabled: control, no exposure. */
|
|
17
|
+
| 'no-consent'
|
|
18
|
+
/** Definitions not loaded (yet, or the endpoint is missing) or experiment not running: control. */
|
|
19
|
+
| 'not-running'
|
|
20
|
+
/** A preview link (`?qa_variant=`) or the in-app version switch: that variant, never logged. */
|
|
21
|
+
| 'preview'
|
|
22
|
+
/** The experiment ended: everybody sees the winner, nothing is logged. */
|
|
23
|
+
| 'concluded';
|
|
24
|
+
export interface IAssignment {
|
|
25
|
+
key: string;
|
|
26
|
+
variant: string;
|
|
27
|
+
/** Whether this visitor counts for the experiment (exposure is logged). */
|
|
28
|
+
enrolled: boolean;
|
|
29
|
+
reason: TAssignmentReason;
|
|
30
|
+
/** The section whose being seen logs the exposure; null → on render. */
|
|
31
|
+
trigger: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface IAssignContext {
|
|
34
|
+
path: string;
|
|
35
|
+
device?: 'desktop' | 'tablet' | 'mobile';
|
|
36
|
+
lang?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare const controlOf: (variants: IExperimentVariant[], fallback?: string) => string;
|
|
39
|
+
/**
|
|
40
|
+
* GrowthBook's bucket ranges: variant i owns `[c_i, c_i + traffic * w_i)` where
|
|
41
|
+
* `c_i` is the sum of the weights before it. The enrolled share equals `traffic`,
|
|
42
|
+
* and raising `traffic` later never moves an enrolled visitor to another variant.
|
|
43
|
+
* Weights that do not add up to 1 are normalised.
|
|
44
|
+
*/
|
|
45
|
+
export declare const bucketRanges: (weights: number[], traffic: number) => [number, number][];
|
|
46
|
+
/** `/` matches `/` only; `/blog/*` matches `/blog/` and everything under it. */
|
|
47
|
+
export declare const pathMatches: (patterns: string[] | null | undefined, path: string) => boolean;
|
|
48
|
+
/** Pure assignment of one visitor to one experiment. */
|
|
49
|
+
export declare const assign: (def: IExperimentDefinition, vid: string | null, ctx: IAssignContext) => IAssignment;
|
|
50
|
+
/** The default preview query parameter. */
|
|
51
|
+
export declare const DEFAULT_PREVIEW_PARAM = "qa_variant";
|
|
52
|
+
/**
|
|
53
|
+
* `?qa_variant=signup-cta:b,other:a` → `{ 'signup-cta': 'b', other: 'a' }`.
|
|
54
|
+
* `?qa_variant=clear` (or `off`) → `{}` and clears the saved preview.
|
|
55
|
+
* Returns null when the parameter is absent. `param` names the query parameter.
|
|
56
|
+
*/
|
|
57
|
+
export declare const parsePreview: (search: string, param?: string) => Record<string, string> | null;
|
|
58
|
+
export type TExperimentsStatus = 'idle' | 'loading' | 'ready' | 'failed';
|
|
59
|
+
/** A usable entry, normalised (a concluded entry gets `variants: []`); null for junk. */
|
|
60
|
+
export declare const normaliseDefinition: (x: unknown) => IExperimentDefinition | null;
|
|
61
|
+
export interface IExperimentsDeps {
|
|
62
|
+
property: string;
|
|
63
|
+
endpoint: string;
|
|
64
|
+
local: IStorage;
|
|
65
|
+
session: IStorage;
|
|
66
|
+
now: () => number;
|
|
67
|
+
fetchJson: (url: string, timeoutMs: number) => Promise<unknown>;
|
|
68
|
+
/** Storage keys (default prefix `qa.`). */
|
|
69
|
+
keys?: TStorageKeys;
|
|
70
|
+
/** The preview query parameter (default `qa_variant`). */
|
|
71
|
+
previewParam?: string;
|
|
72
|
+
}
|
|
73
|
+
/** Holds the running experiments and the preview overrides. */
|
|
74
|
+
export declare class ExperimentStore {
|
|
75
|
+
private readonly d;
|
|
76
|
+
readonly status: Observable<TExperimentsStatus>;
|
|
77
|
+
/**
|
|
78
|
+
* An in-app version switch, per experiment (`{ key: variant }`), in this browser's
|
|
79
|
+
* localStorage (an editor lets its user see each version). A preview: never logged.
|
|
80
|
+
* Rendered variants follow it live.
|
|
81
|
+
*/
|
|
82
|
+
readonly editorOverrides: Observable<Record<string, string>>;
|
|
83
|
+
/**
|
|
84
|
+
* Bumped by `refresh()` (an editor, after it accepted a winner or removed a version): mounted
|
|
85
|
+
* experiments decide again, so an accepted test shows its winner at once. Visitors never
|
|
86
|
+
* trigger it, so their variant stays fixed for the page view.
|
|
87
|
+
*/
|
|
88
|
+
readonly revision: Observable<number>;
|
|
89
|
+
private definitions;
|
|
90
|
+
private preview;
|
|
91
|
+
private readonly keys;
|
|
92
|
+
constructor(d: IExperimentsDeps);
|
|
93
|
+
/** Reads the preview parameter (`?qa_variant=`) from the URL; the preview sticks for the browser session. */
|
|
94
|
+
applyPreviewFrom(search: string): void;
|
|
95
|
+
/** The in-app switch first, then a preview link. */
|
|
96
|
+
previewOf: (key: string) => string | undefined;
|
|
97
|
+
editorOverrideOf: (key: string) => string | undefined;
|
|
98
|
+
/** The in-app version switch for one experiment; `null` goes back to the visitor's own variant. */
|
|
99
|
+
setEditorOverride(key: string, variant: string | null): void;
|
|
100
|
+
/** Re-reads the switches (another window of the same app changed them). */
|
|
101
|
+
reloadEditorOverrides(): void;
|
|
102
|
+
/** Loads the definitions again and makes mounted experiments decide again (for an editor, never for visitors). */
|
|
103
|
+
refresh(): Promise<void>;
|
|
104
|
+
private setDefinitions;
|
|
105
|
+
get(key: string): IExperimentDefinition;
|
|
106
|
+
/** Fetches the running experiments; a missing endpoint leaves everyone on the control. */
|
|
107
|
+
load(force?: boolean): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=experiments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experiments.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/experiments.ts"],"names":[],"mappings":"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"}
|