@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,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.utmParams = exports.parseUtm = void 0;
|
|
4
|
+
var UTM_FIELDS = ['source', 'medium', 'campaign', 'term', 'content'];
|
|
5
|
+
/** The `utm_*` parameters of a query string, or null when there are none. */
|
|
6
|
+
var parseUtm = function (search) {
|
|
7
|
+
var _a;
|
|
8
|
+
var params;
|
|
9
|
+
try {
|
|
10
|
+
params = new URLSearchParams(search);
|
|
11
|
+
}
|
|
12
|
+
catch (_b) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
var utm = {};
|
|
16
|
+
for (var _i = 0, UTM_FIELDS_1 = UTM_FIELDS; _i < UTM_FIELDS_1.length; _i++) {
|
|
17
|
+
var f = UTM_FIELDS_1[_i];
|
|
18
|
+
var v = (_a = params.get("utm_".concat(f))) === null || _a === void 0 ? void 0 : _a.trim();
|
|
19
|
+
if (v)
|
|
20
|
+
utm[f] = v.slice(0, 200);
|
|
21
|
+
}
|
|
22
|
+
return Object.keys(utm).length ? utm : null;
|
|
23
|
+
};
|
|
24
|
+
exports.parseUtm = parseUtm;
|
|
25
|
+
/** `{ source: 'x' }` → `[['utm_source', 'x']]`, in a stable order. */
|
|
26
|
+
var utmParams = function (utm) {
|
|
27
|
+
return utm ? UTM_FIELDS.filter(function (f) { return utm[f]; }).map(function (f) { return ["utm_".concat(f), utm[f]]; }) : [];
|
|
28
|
+
};
|
|
29
|
+
exports.utmParams = utmParams;
|
|
30
|
+
//# sourceMappingURL=utm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utm.js","sourceRoot":"","sources":["../../../src/tracking/core/utm.ts"],"names":[],"mappings":";;;AAEA,IAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAEhF,6EAA6E;AACtE,IAAM,QAAQ,GAAG,UAAC,MAAc;;IACrC,IAAI,MAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAM,GAAG,GAAS,EAAE,CAAC;IACrB,KAAgB,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU,EAAE,CAAC;QAAxB,IAAM,CAAC,mBAAA;QACV,IAAM,CAAC,GAAG,MAAA,MAAM,CAAC,GAAG,CAAC,cAAO,CAAC,CAAE,CAAC,0CAAE,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC,CAAC;AAbW,QAAA,QAAQ,YAanB;AAEF,sEAAsE;AAC/D,IAAM,SAAS,GAAG,UAAC,GAA4B;IACpD,OAAA,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,GAAG,CAAC,CAAC,CAAC,EAAN,CAAM,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,cAAO,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAW,CAAC,EAA9B,CAA8B,CAAC,CAAC,CAAC,CAAC,EAAE;AAAtF,CAAsF,CAAC;AAD5E,QAAA,SAAS,aACmE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-party tracking, consent and A/B testing for any Qore web app.
|
|
3
|
+
*
|
|
4
|
+
* How to use it: design/TRACKING.md in this repo.
|
|
5
|
+
* The contract (events, experiments, storage): qorus-api design/analytics-and-experiments-design.md.
|
|
6
|
+
*
|
|
7
|
+
* Layers (each only imports the ones above it):
|
|
8
|
+
* core/ plain TypeScript, no DOM: ids, consent, queue, sections, hashing, assignment, Tracker
|
|
9
|
+
* browser/ wiring to window/document: transport, IntersectionObserver, listeners
|
|
10
|
+
* react/ <TrackingProvider>, useConsent, useExperiment, <Experiment>
|
|
11
|
+
* Nothing product-specific lives here: the property, endpoints, consent version and storage
|
|
12
|
+
* prefix come from the config each app passes to `createBrowserTracker`.
|
|
13
|
+
*/
|
|
14
|
+
import { type IAttached } from './browser/attach';
|
|
15
|
+
import { Tracker } from './core/tracker';
|
|
16
|
+
import { type TTrackingOptions } from './core/types';
|
|
17
|
+
export { Tracker } from './core/tracker';
|
|
18
|
+
export type { IPageInfo, ITrackerEnv } from './core/tracker';
|
|
19
|
+
export { ConsentStore } from './core/consent';
|
|
20
|
+
export { assign, bucketRanges, controlOf, DEFAULT_PREVIEW_PARAM, ExperimentStore, normaliseDefinition, parsePreview, pathMatches, } from './core/experiments';
|
|
21
|
+
export type { IAssignContext, IAssignment, TAssignmentReason, TExperimentsStatus } from './core/experiments';
|
|
22
|
+
export { fnv1a32, hashV2 } from './core/hash';
|
|
23
|
+
export { Observable } from './core/observable';
|
|
24
|
+
export { EventQueue } from './core/queue';
|
|
25
|
+
export type { ITransport } from './core/queue';
|
|
26
|
+
export { effectiveRatio, SectionClock } from './core/sections';
|
|
27
|
+
export type { ISectionSummary } from './core/sections';
|
|
28
|
+
export { memoryStorage, readJson, safeStorage, writeJson } from './core/storage';
|
|
29
|
+
export type { IStorage } from './core/storage';
|
|
30
|
+
export { parseUtm, utmParams } from './core/utm';
|
|
31
|
+
export { DEFAULT_CONFIG, DEFAULT_STORAGE_PREFIX, KEYS, resolveConfig, storageKeys } from './core/types';
|
|
32
|
+
export type { IBatch, IExperimentDefinition, IExperimentVariant, ITrackedEvent, ITrackingConfig, IUtm, TConsentState, TEventType, TProps, TRequiredTrackingConfig, TStorageKeys, TTrackingOptions, } from './core/types';
|
|
33
|
+
export { attachToPage } from './browser/attach';
|
|
34
|
+
export type { IAttached } from './browser/attach';
|
|
35
|
+
export { browserEnv, browserTransport, deviceOf } from './browser/env';
|
|
36
|
+
/** A tracker for a real browser page. Call `attach()` once the page is up (`<TrackingProvider>` does). */
|
|
37
|
+
export declare const createBrowserTracker: (options: TTrackingOptions) => {
|
|
38
|
+
tracker: Tracker;
|
|
39
|
+
attach: () => IAttached;
|
|
40
|
+
};
|
|
41
|
+
export { trackClick, trackSection } from './markup';
|
|
42
|
+
export type { TTrackAttributes } from './markup';
|
|
43
|
+
export * from './react';
|
|
44
|
+
export { createMemoryTracker } from './testing';
|
|
45
|
+
export type { IMemoryTracker, IMemoryTrackerOptions } from './testing';
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracking/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,MAAM,EACN,YAAY,EACZ,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxG,YAAY,EACV,MAAM,EACN,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,IAAI,EACJ,aAAa,EACb,UAAU,EACV,MAAM,EACN,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEvE,0GAA0G;AAC1G,eAAO,MAAM,oBAAoB,YAAa,gBAAgB,KAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,SAAS,CAAA;CAI3G,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.createMemoryTracker = exports.trackSection = exports.trackClick = exports.createBrowserTracker = exports.deviceOf = exports.browserTransport = exports.browserEnv = exports.attachToPage = exports.storageKeys = exports.resolveConfig = exports.KEYS = exports.DEFAULT_STORAGE_PREFIX = exports.DEFAULT_CONFIG = exports.utmParams = exports.parseUtm = exports.writeJson = exports.safeStorage = exports.readJson = exports.memoryStorage = exports.SectionClock = exports.effectiveRatio = exports.EventQueue = exports.Observable = exports.hashV2 = exports.fnv1a32 = exports.pathMatches = exports.parsePreview = exports.normaliseDefinition = exports.ExperimentStore = exports.DEFAULT_PREVIEW_PARAM = exports.controlOf = exports.bucketRanges = exports.assign = exports.ConsentStore = exports.Tracker = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* First-party tracking, consent and A/B testing for any Qore web app.
|
|
20
|
+
*
|
|
21
|
+
* How to use it: design/TRACKING.md in this repo.
|
|
22
|
+
* The contract (events, experiments, storage): qorus-api design/analytics-and-experiments-design.md.
|
|
23
|
+
*
|
|
24
|
+
* Layers (each only imports the ones above it):
|
|
25
|
+
* core/ plain TypeScript, no DOM: ids, consent, queue, sections, hashing, assignment, Tracker
|
|
26
|
+
* browser/ wiring to window/document: transport, IntersectionObserver, listeners
|
|
27
|
+
* react/ <TrackingProvider>, useConsent, useExperiment, <Experiment>
|
|
28
|
+
* Nothing product-specific lives here: the property, endpoints, consent version and storage
|
|
29
|
+
* prefix come from the config each app passes to `createBrowserTracker`.
|
|
30
|
+
*/
|
|
31
|
+
var attach_1 = require("./browser/attach");
|
|
32
|
+
var env_1 = require("./browser/env");
|
|
33
|
+
var tracker_1 = require("./core/tracker");
|
|
34
|
+
var types_1 = require("./core/types");
|
|
35
|
+
var tracker_2 = require("./core/tracker");
|
|
36
|
+
Object.defineProperty(exports, "Tracker", { enumerable: true, get: function () { return tracker_2.Tracker; } });
|
|
37
|
+
var consent_1 = require("./core/consent");
|
|
38
|
+
Object.defineProperty(exports, "ConsentStore", { enumerable: true, get: function () { return consent_1.ConsentStore; } });
|
|
39
|
+
var experiments_1 = require("./core/experiments");
|
|
40
|
+
Object.defineProperty(exports, "assign", { enumerable: true, get: function () { return experiments_1.assign; } });
|
|
41
|
+
Object.defineProperty(exports, "bucketRanges", { enumerable: true, get: function () { return experiments_1.bucketRanges; } });
|
|
42
|
+
Object.defineProperty(exports, "controlOf", { enumerable: true, get: function () { return experiments_1.controlOf; } });
|
|
43
|
+
Object.defineProperty(exports, "DEFAULT_PREVIEW_PARAM", { enumerable: true, get: function () { return experiments_1.DEFAULT_PREVIEW_PARAM; } });
|
|
44
|
+
Object.defineProperty(exports, "ExperimentStore", { enumerable: true, get: function () { return experiments_1.ExperimentStore; } });
|
|
45
|
+
Object.defineProperty(exports, "normaliseDefinition", { enumerable: true, get: function () { return experiments_1.normaliseDefinition; } });
|
|
46
|
+
Object.defineProperty(exports, "parsePreview", { enumerable: true, get: function () { return experiments_1.parsePreview; } });
|
|
47
|
+
Object.defineProperty(exports, "pathMatches", { enumerable: true, get: function () { return experiments_1.pathMatches; } });
|
|
48
|
+
var hash_1 = require("./core/hash");
|
|
49
|
+
Object.defineProperty(exports, "fnv1a32", { enumerable: true, get: function () { return hash_1.fnv1a32; } });
|
|
50
|
+
Object.defineProperty(exports, "hashV2", { enumerable: true, get: function () { return hash_1.hashV2; } });
|
|
51
|
+
var observable_1 = require("./core/observable");
|
|
52
|
+
Object.defineProperty(exports, "Observable", { enumerable: true, get: function () { return observable_1.Observable; } });
|
|
53
|
+
var queue_1 = require("./core/queue");
|
|
54
|
+
Object.defineProperty(exports, "EventQueue", { enumerable: true, get: function () { return queue_1.EventQueue; } });
|
|
55
|
+
var sections_1 = require("./core/sections");
|
|
56
|
+
Object.defineProperty(exports, "effectiveRatio", { enumerable: true, get: function () { return sections_1.effectiveRatio; } });
|
|
57
|
+
Object.defineProperty(exports, "SectionClock", { enumerable: true, get: function () { return sections_1.SectionClock; } });
|
|
58
|
+
var storage_1 = require("./core/storage");
|
|
59
|
+
Object.defineProperty(exports, "memoryStorage", { enumerable: true, get: function () { return storage_1.memoryStorage; } });
|
|
60
|
+
Object.defineProperty(exports, "readJson", { enumerable: true, get: function () { return storage_1.readJson; } });
|
|
61
|
+
Object.defineProperty(exports, "safeStorage", { enumerable: true, get: function () { return storage_1.safeStorage; } });
|
|
62
|
+
Object.defineProperty(exports, "writeJson", { enumerable: true, get: function () { return storage_1.writeJson; } });
|
|
63
|
+
var utm_1 = require("./core/utm");
|
|
64
|
+
Object.defineProperty(exports, "parseUtm", { enumerable: true, get: function () { return utm_1.parseUtm; } });
|
|
65
|
+
Object.defineProperty(exports, "utmParams", { enumerable: true, get: function () { return utm_1.utmParams; } });
|
|
66
|
+
var types_2 = require("./core/types");
|
|
67
|
+
Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return types_2.DEFAULT_CONFIG; } });
|
|
68
|
+
Object.defineProperty(exports, "DEFAULT_STORAGE_PREFIX", { enumerable: true, get: function () { return types_2.DEFAULT_STORAGE_PREFIX; } });
|
|
69
|
+
Object.defineProperty(exports, "KEYS", { enumerable: true, get: function () { return types_2.KEYS; } });
|
|
70
|
+
Object.defineProperty(exports, "resolveConfig", { enumerable: true, get: function () { return types_2.resolveConfig; } });
|
|
71
|
+
Object.defineProperty(exports, "storageKeys", { enumerable: true, get: function () { return types_2.storageKeys; } });
|
|
72
|
+
var attach_2 = require("./browser/attach");
|
|
73
|
+
Object.defineProperty(exports, "attachToPage", { enumerable: true, get: function () { return attach_2.attachToPage; } });
|
|
74
|
+
var env_2 = require("./browser/env");
|
|
75
|
+
Object.defineProperty(exports, "browserEnv", { enumerable: true, get: function () { return env_2.browserEnv; } });
|
|
76
|
+
Object.defineProperty(exports, "browserTransport", { enumerable: true, get: function () { return env_2.browserTransport; } });
|
|
77
|
+
Object.defineProperty(exports, "deviceOf", { enumerable: true, get: function () { return env_2.deviceOf; } });
|
|
78
|
+
/** A tracker for a real browser page. Call `attach()` once the page is up (`<TrackingProvider>` does). */
|
|
79
|
+
var createBrowserTracker = function (options) {
|
|
80
|
+
var config = (0, types_1.resolveConfig)(options);
|
|
81
|
+
var tracker = new tracker_1.Tracker(config, (0, env_1.browserEnv)(config.endpoint));
|
|
82
|
+
return { tracker: tracker, attach: function () { return (0, attach_1.attachToPage)(tracker, config.heartbeatMs); } };
|
|
83
|
+
};
|
|
84
|
+
exports.createBrowserTracker = createBrowserTracker;
|
|
85
|
+
var markup_1 = require("./markup");
|
|
86
|
+
Object.defineProperty(exports, "trackClick", { enumerable: true, get: function () { return markup_1.trackClick; } });
|
|
87
|
+
Object.defineProperty(exports, "trackSection", { enumerable: true, get: function () { return markup_1.trackSection; } });
|
|
88
|
+
__exportStar(require("./react"), exports);
|
|
89
|
+
var testing_1 = require("./testing");
|
|
90
|
+
Object.defineProperty(exports, "createMemoryTracker", { enumerable: true, get: function () { return testing_1.createMemoryTracker; } });
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracking/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;GAYG;AACH,2CAAgE;AAChE,qCAA2C;AAC3C,0CAAyC;AACzC,sCAAoE;AAEpE,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAEhB,0CAA8C;AAArC,uGAAA,YAAY,OAAA;AACrB,kDAS4B;AAR1B,qGAAA,MAAM,OAAA;AACN,2GAAA,YAAY,OAAA;AACZ,wGAAA,SAAS,OAAA;AACT,oHAAA,qBAAqB,OAAA;AACrB,8GAAA,eAAe,OAAA;AACf,kHAAA,mBAAmB,OAAA;AACnB,2GAAA,YAAY,OAAA;AACZ,0GAAA,WAAW,OAAA;AAGb,oCAA8C;AAArC,+FAAA,OAAO,OAAA;AAAE,8FAAA,MAAM,OAAA;AACxB,gDAA+C;AAAtC,wGAAA,UAAU,OAAA;AACnB,sCAA0C;AAAjC,mGAAA,UAAU,OAAA;AAEnB,4CAA+D;AAAtD,0GAAA,cAAc,OAAA;AAAE,wGAAA,YAAY,OAAA;AAErC,0CAAiF;AAAxE,wGAAA,aAAa,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,oGAAA,SAAS,OAAA;AAExD,kCAAiD;AAAxC,+FAAA,QAAQ,OAAA;AAAE,gGAAA,SAAS,OAAA;AAC5B,sCAAwG;AAA/F,uGAAA,cAAc,OAAA;AAAE,+GAAA,sBAAsB,OAAA;AAAE,6FAAA,IAAI,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,oGAAA,WAAW,OAAA;AAejF,2CAAgD;AAAvC,sGAAA,YAAY,OAAA;AAErB,qCAAuE;AAA9D,iGAAA,UAAU,OAAA;AAAE,uGAAA,gBAAgB,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAE/C,0GAA0G;AACnG,IAAM,oBAAoB,GAAG,UAAC,OAAyB;IAC5D,IAAM,MAAM,GAAG,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC;IACtC,IAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,MAAM,EAAE,IAAA,gBAAU,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,OAAO,SAAA,EAAE,MAAM,EAAE,cAAM,OAAA,IAAA,qBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,EAAzC,CAAyC,EAAE,CAAC;AAC9E,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B;AAEF,mCAAoD;AAA3C,oGAAA,UAAU,OAAA;AAAE,sGAAA,YAAY,OAAA;AAEjC,0CAAwB;AACxB,qCAAgD;AAAvC,8GAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The markup contract as props, for places where JSX `data-*` attributes cannot be
|
|
3
|
+
* written directly (a Reqore panel action or a tier's `actionButtonProps` are
|
|
4
|
+
* object literals). In JSX, `data-track-click="…"` works just as well.
|
|
5
|
+
*
|
|
6
|
+
* <ReqoreButton {...trackClick('get-started', 'cta')} … />
|
|
7
|
+
* bottomActions={[{ ...primaryCta, ...trackClick('contact', 'pricing-panel'), label: … }]}
|
|
8
|
+
*/
|
|
9
|
+
export type TTrackAttributes = Record<`data-track-${string}`, string>;
|
|
10
|
+
export declare const trackClick: (target: string, placement?: string, label?: string) => TTrackAttributes;
|
|
11
|
+
export declare const trackSection: (id: string) => TTrackAttributes;
|
|
12
|
+
//# sourceMappingURL=markup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../../src/tracking/markup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,UAAU,WAAY,MAAM,cAAc,MAAM,UAAU,MAAM,KAAG,gBAI9E,CAAC;AAEH,eAAO,MAAM,YAAY,OAAQ,MAAM,KAAG,gBAAkD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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.trackSection = exports.trackClick = void 0;
|
|
15
|
+
var trackClick = function (target, placement, label) { return (__assign(__assign({ 'data-track-click': target }, (placement ? { 'data-track-placement': placement } : {})), (label ? { 'data-track-label': label } : {}))); };
|
|
16
|
+
exports.trackClick = trackClick;
|
|
17
|
+
var trackSection = function (id) { return ({ 'data-track-section': id }); };
|
|
18
|
+
exports.trackSection = trackSection;
|
|
19
|
+
//# sourceMappingURL=markup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup.js","sourceRoot":"","sources":["../../src/tracking/markup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAUO,IAAM,UAAU,GAAG,UAAC,MAAc,EAAE,SAAkB,EAAE,KAAc,IAAuB,OAAA,qBAClG,kBAAkB,EAAE,MAAM,IACvB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACxD,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC/C,EAJkG,CAIlG,CAAC;AAJU,QAAA,UAAU,cAIpB;AAEI,IAAM,YAAY,GAAG,UAAC,EAAU,IAAuB,OAAA,CAAC,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC,EAA9B,CAA8B,CAAC;AAAhF,QAAA,YAAY,gBAAoE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface IExperimentProps {
|
|
3
|
+
/** The experiment key, as in the admin API (`signup-cta`). */
|
|
4
|
+
id: string;
|
|
5
|
+
/** One element per variant key; the control's key must be among them. */
|
|
6
|
+
variants: Record<string, ReactNode>;
|
|
7
|
+
/** The control's key (default `a`). */
|
|
8
|
+
control?: string;
|
|
9
|
+
/** Trigger section (`data-track-section` id) when the definition names none. */
|
|
10
|
+
trigger?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Renders the visitor's variant: `<Experiment id="signup-cta" variants={{ a: <A />, b: <B /> }} />`.
|
|
14
|
+
* Without consent, without a running definition, or outside the traffic share it
|
|
15
|
+
* renders the control and logs nothing. An ended (concluded) experiment renders its winner
|
|
16
|
+
* for everybody. An in-app switch (`experiments.setEditorOverride`) shows one version per
|
|
17
|
+
* experiment (never logged); a `?qa_variant=signup-cta:b` link previews one for QA.
|
|
18
|
+
*
|
|
19
|
+
* DOM: a `display: contents` wrapper with `data-experiment`, `data-variant` (shown),
|
|
20
|
+
* `data-variants` (every key, comma-separated) and `data-experiment-reason`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const Experiment: ({ id, variants, control, trigger }: IExperimentProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=Experiment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Experiment.d.ts","sourceRoot":"","sources":["../../../src/tracking/react/Experiment.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,uCAA8C,gBAAgB,4CAiBpF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Experiment = void 0;
|
|
4
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
var hooks_1 = require("./hooks");
|
|
6
|
+
/**
|
|
7
|
+
* Renders the visitor's variant: `<Experiment id="signup-cta" variants={{ a: <A />, b: <B /> }} />`.
|
|
8
|
+
* Without consent, without a running definition, or outside the traffic share it
|
|
9
|
+
* renders the control and logs nothing. An ended (concluded) experiment renders its winner
|
|
10
|
+
* for everybody. An in-app switch (`experiments.setEditorOverride`) shows one version per
|
|
11
|
+
* experiment (never logged); a `?qa_variant=signup-cta:b` link previews one for QA.
|
|
12
|
+
*
|
|
13
|
+
* DOM: a `display: contents` wrapper with `data-experiment`, `data-variant` (shown),
|
|
14
|
+
* `data-variants` (every key, comma-separated) and `data-experiment-reason`.
|
|
15
|
+
*/
|
|
16
|
+
var Experiment = function (_a) {
|
|
17
|
+
var _b;
|
|
18
|
+
var id = _a.id, variants = _a.variants, _c = _a.control, control = _c === void 0 ? 'a' : _c, trigger = _a.trigger;
|
|
19
|
+
var keys = Object.keys(variants);
|
|
20
|
+
var _d = (0, hooks_1.useExperiment)(id, { control: control, trigger: trigger, variants: keys }), variant = _d.variant, assignment = _d.assignment;
|
|
21
|
+
var shown = variants[variant] !== undefined ? variant : control;
|
|
22
|
+
// DOM markers, so an editor overlay can find every experiment on the page. `display: contents`
|
|
23
|
+
// gives the wrapper no box, so the page lays out exactly as without it.
|
|
24
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: CONTENTS, "data-experiment": id, "data-variant": shown, "data-variants": keys.join(','), "data-experiment-reason": assignment.reason, children: (_b = variants[shown]) !== null && _b !== void 0 ? _b : null }));
|
|
25
|
+
};
|
|
26
|
+
exports.Experiment = Experiment;
|
|
27
|
+
var CONTENTS = { display: 'contents' };
|
|
28
|
+
//# sourceMappingURL=Experiment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Experiment.js","sourceRoot":"","sources":["../../../src/tracking/react/Experiment.tsx"],"names":[],"mappings":";;;;AACA,iCAAwC;AAaxC;;;;;;;;;GASG;AACI,IAAM,UAAU,GAAG,UAAC,EAA0D;;QAAxD,EAAE,QAAA,EAAE,QAAQ,cAAA,EAAE,eAAa,EAAb,OAAO,mBAAG,GAAG,KAAA,EAAE,OAAO,aAAA;IAC/D,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAA,KAA0B,IAAA,qBAAa,EAAC,EAAE,EAAE,EAAE,OAAO,SAAA,EAAE,OAAO,SAAA,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAA/E,OAAO,aAAA,EAAE,UAAU,gBAA4D,CAAC;IACxF,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,+FAA+F;IAC/F,wEAAwE;IACxE,OAAO,CACL,gCACE,KAAK,EAAE,QAAQ,qBACE,EAAE,kBACL,KAAK,mBACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,4BACL,UAAU,CAAC,MAAM,YAExC,MAAA,QAAQ,CAAC,KAAK,CAAC,mCAAI,IAAI,GACpB,CACP,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,UAAU,cAiBrB;AAEF,IAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,UAAU,EAAW,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ReactNode, type MutableRefObject } from 'react';
|
|
2
|
+
import type { IAttached } from '../browser/attach';
|
|
3
|
+
import type { Tracker } from '../core/tracker';
|
|
4
|
+
interface ITrackingContext {
|
|
5
|
+
tracker: Tracker | null;
|
|
6
|
+
/** The page wiring; set before any child's passive effect runs. */
|
|
7
|
+
attached: MutableRefObject<IAttached | null>;
|
|
8
|
+
}
|
|
9
|
+
export interface ITrackingProviderProps {
|
|
10
|
+
tracker: Tracker | null;
|
|
11
|
+
/** Attaches the tracker to the page (listeners, observers); omitted in stories and tests. */
|
|
12
|
+
attach?: () => IAttached;
|
|
13
|
+
/** The current route (`pathname + search`): each change is a new page view. */
|
|
14
|
+
location: string;
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Mount once, at the app shell. Without a provider (or with `tracker={null}`)
|
|
19
|
+
* everything still renders: consent reads `unknown`, experiments serve the control.
|
|
20
|
+
*/
|
|
21
|
+
export declare const TrackingProvider: ({ tracker, attach, location, children }: ITrackingProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare const useTrackingContext: () => ITrackingContext;
|
|
23
|
+
/** The tracker, or null outside a provider. Call `goal`, `custom`, `record` on it. */
|
|
24
|
+
export declare const useTracker: () => Tracker;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=TrackingProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackingProvider.d.ts","sourceRoot":"","sources":["../../../src/tracking/react/TrackingProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC3H,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,mEAAmE;IACnE,QAAQ,EAAE,gBAAgB,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC9C;AAID,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,SAAS,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,4CAA6C,sBAAsB,4CAyB/F,CAAC;AAEF,eAAO,MAAM,kBAAkB,wBAAoC,CAAC;AAEpE,sFAAsF;AACtF,eAAO,MAAM,UAAU,eAA4C,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useTracker = exports.useTrackingContext = exports.TrackingProvider = void 0;
|
|
4
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
var react_1 = require("react");
|
|
6
|
+
var TrackingContext = (0, react_1.createContext)({ tracker: null, attached: { current: null } });
|
|
7
|
+
/**
|
|
8
|
+
* Mount once, at the app shell. Without a provider (or with `tracker={null}`)
|
|
9
|
+
* everything still renders: consent reads `unknown`, experiments serve the control.
|
|
10
|
+
*/
|
|
11
|
+
var TrackingProvider = function (_a) {
|
|
12
|
+
var tracker = _a.tracker, attach = _a.attach, location = _a.location, children = _a.children;
|
|
13
|
+
var attached = (0, react_1.useRef)(null);
|
|
14
|
+
// Layout effects: every layout effect runs before any passive effect, so the
|
|
15
|
+
// tracker is attached and started before a child's `useExperiment` effect.
|
|
16
|
+
(0, react_1.useLayoutEffect)(function () {
|
|
17
|
+
var _a;
|
|
18
|
+
if (!tracker)
|
|
19
|
+
return undefined;
|
|
20
|
+
try {
|
|
21
|
+
attached.current = (_a = attach === null || attach === void 0 ? void 0 : attach()) !== null && _a !== void 0 ? _a : null;
|
|
22
|
+
tracker.start();
|
|
23
|
+
}
|
|
24
|
+
catch (_b) {
|
|
25
|
+
/* never into the page */
|
|
26
|
+
}
|
|
27
|
+
return function () {
|
|
28
|
+
var _a;
|
|
29
|
+
(_a = attached.current) === null || _a === void 0 ? void 0 : _a.detach();
|
|
30
|
+
attached.current = null;
|
|
31
|
+
};
|
|
32
|
+
}, [tracker, attach]);
|
|
33
|
+
(0, react_1.useLayoutEffect)(function () {
|
|
34
|
+
tracker === null || tracker === void 0 ? void 0 : tracker.pageview();
|
|
35
|
+
}, [tracker, location]);
|
|
36
|
+
var value = (0, react_1.useMemo)(function () { return ({ tracker: tracker, attached: attached }); }, [tracker]);
|
|
37
|
+
return (0, jsx_runtime_1.jsx)(TrackingContext.Provider, { value: value, children: children });
|
|
38
|
+
};
|
|
39
|
+
exports.TrackingProvider = TrackingProvider;
|
|
40
|
+
var useTrackingContext = function () { return (0, react_1.useContext)(TrackingContext); };
|
|
41
|
+
exports.useTrackingContext = useTrackingContext;
|
|
42
|
+
/** The tracker, or null outside a provider. Call `goal`, `custom`, `record` on it. */
|
|
43
|
+
var useTracker = function () { return (0, react_1.useContext)(TrackingContext).tracker; };
|
|
44
|
+
exports.useTracker = useTracker;
|
|
45
|
+
//# sourceMappingURL=TrackingProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackingProvider.js","sourceRoot":"","sources":["../../../src/tracking/react/TrackingProvider.tsx"],"names":[],"mappings":";;;;AAAA,+BAA2H;AAU3H,IAAM,eAAe,GAAG,IAAA,qBAAa,EAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAWxG;;;GAGG;AACI,IAAM,gBAAgB,GAAG,UAAC,EAA+D;QAA7D,OAAO,aAAA,EAAE,MAAM,YAAA,EAAE,QAAQ,cAAA,EAAE,QAAQ,cAAA;IACpE,IAAM,QAAQ,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAEhD,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAA,uBAAe,EAAC;;QACd,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,EAAI,mCAAI,IAAI,CAAC;YACtC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,WAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,OAAO;;YACL,MAAA,QAAQ,CAAC,OAAO,0CAAE,MAAM,EAAE,CAAC;YAC3B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtB,IAAA,uBAAe,EAAC;QACd,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExB,IAAM,KAAK,GAAG,IAAA,eAAO,EAAC,cAAM,OAAA,CAAC,EAAE,OAAO,SAAA,EAAE,QAAQ,UAAA,EAAE,CAAC,EAAvB,CAAuB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,OAAO,uBAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA4B,CAAC;AACvF,CAAC,CAAC;AAzBW,QAAA,gBAAgB,oBAyB3B;AAEK,IAAM,kBAAkB,GAAG,cAAM,OAAA,IAAA,kBAAU,EAAC,eAAe,CAAC,EAA3B,CAA2B,CAAC;AAAvD,QAAA,kBAAkB,sBAAqC;AAEpE,sFAAsF;AAC/E,IAAM,UAAU,GAAG,cAAM,OAAA,IAAA,kBAAU,EAAC,eAAe,CAAC,CAAC,OAAO,EAAnC,CAAmC,CAAC;AAAvD,QAAA,UAAU,cAA6C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { IAssignment } from '../core/experiments';
|
|
2
|
+
import { Observable } from '../core/observable';
|
|
3
|
+
import type { TConsentState } from '../core/types';
|
|
4
|
+
/** The visitor's consent and the two answers. `unknown` outside a provider. */
|
|
5
|
+
export declare const useConsent: () => {
|
|
6
|
+
state: TConsentState;
|
|
7
|
+
grant: () => void;
|
|
8
|
+
deny: () => void;
|
|
9
|
+
available: boolean;
|
|
10
|
+
};
|
|
11
|
+
/** Whether the app asked to reopen its consent prompt (a "Cookie settings" link). */
|
|
12
|
+
export declare const consentPanel: Observable<boolean>;
|
|
13
|
+
export declare const openConsentSettings: () => void;
|
|
14
|
+
export declare const closeConsentSettings: () => void;
|
|
15
|
+
export declare const useConsentPanelOpen: () => boolean;
|
|
16
|
+
export interface IUseExperimentOptions {
|
|
17
|
+
/** The control's key (default `a`): served whenever the visitor is not assigned. */
|
|
18
|
+
control?: string;
|
|
19
|
+
/** Variant keys this code can render; an assignment outside it falls back to the control. */
|
|
20
|
+
variants?: string[];
|
|
21
|
+
/** Trigger section when the experiment definition names none. */
|
|
22
|
+
trigger?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface IUseExperiment {
|
|
25
|
+
variant: string;
|
|
26
|
+
assignment: IAssignment;
|
|
27
|
+
/** Put on the element whose being seen counts as exposure, when there is no trigger section. */
|
|
28
|
+
triggerRef: (el: Element | null) => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The variant this visitor sees. Decided once when the component mounts and kept
|
|
32
|
+
* for the page view (no flicker when definitions or consent arrive later: the
|
|
33
|
+
* next page view picks them up). Two exceptions, both for an editor: the in-app
|
|
34
|
+
* version switch (`setEditorOverride`) applies at once, and `experiments.refresh()`
|
|
35
|
+
* (after a winner is accepted or a version removed) decides again. Logs the exposure once per page view when the
|
|
36
|
+
* trigger is seen, and only for enrolled visitors (never for a preview or a winner).
|
|
37
|
+
*/
|
|
38
|
+
export declare const useExperiment: (key: string, options?: IUseExperimentOptions) => IUseExperiment;
|
|
39
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/tracking/react/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD,+EAA+E;AAC/E,eAAO,MAAM,UAAU;;;;;CAUtB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,YAAY,qBAAiC,CAAC;AAC3D,eAAO,MAAM,mBAAmB,YAA+B,CAAC;AAChE,eAAO,MAAM,oBAAoB,YAAgC,CAAC;AAClE,eAAO,MAAM,mBAAmB,eAAyF,CAAC;AAE1H,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,WAAW,CAAC;IACxB,gGAAgG;IAChG,UAAU,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAS,MAAM,YAAW,qBAAqB,KAAQ,cAsDhF,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
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.useExperiment = exports.useConsentPanelOpen = exports.closeConsentSettings = exports.openConsentSettings = exports.consentPanel = exports.useConsent = void 0;
|
|
15
|
+
var react_1 = require("react");
|
|
16
|
+
var observable_1 = require("../core/observable");
|
|
17
|
+
var TrackingProvider_1 = require("./TrackingProvider");
|
|
18
|
+
var noopSubscribe = function () { return function () { return undefined; }; };
|
|
19
|
+
/** The visitor's consent and the two answers. `unknown` outside a provider. */
|
|
20
|
+
var useConsent = function () {
|
|
21
|
+
var tracker = (0, TrackingProvider_1.useTrackingContext)().tracker;
|
|
22
|
+
var state = (0, react_1.useSyncExternalStore)(tracker ? tracker.consent.state.subscribe : noopSubscribe, function () { return (tracker ? tracker.consent.get() : 'unknown'); }, function () { return 'unknown'; });
|
|
23
|
+
var grant = (0, react_1.useCallback)(function () { return tracker === null || tracker === void 0 ? void 0 : tracker.grant(); }, [tracker]);
|
|
24
|
+
var deny = (0, react_1.useCallback)(function () { return tracker === null || tracker === void 0 ? void 0 : tracker.deny(); }, [tracker]);
|
|
25
|
+
return { state: state, grant: grant, deny: deny, available: !!tracker };
|
|
26
|
+
};
|
|
27
|
+
exports.useConsent = useConsent;
|
|
28
|
+
/** Whether the app asked to reopen its consent prompt (a "Cookie settings" link). */
|
|
29
|
+
exports.consentPanel = new observable_1.Observable(false);
|
|
30
|
+
var openConsentSettings = function () { return exports.consentPanel.set(true); };
|
|
31
|
+
exports.openConsentSettings = openConsentSettings;
|
|
32
|
+
var closeConsentSettings = function () { return exports.consentPanel.set(false); };
|
|
33
|
+
exports.closeConsentSettings = closeConsentSettings;
|
|
34
|
+
var useConsentPanelOpen = function () { return (0, react_1.useSyncExternalStore)(exports.consentPanel.subscribe, exports.consentPanel.get, exports.consentPanel.get); };
|
|
35
|
+
exports.useConsentPanelOpen = useConsentPanelOpen;
|
|
36
|
+
/**
|
|
37
|
+
* The variant this visitor sees. Decided once when the component mounts and kept
|
|
38
|
+
* for the page view (no flicker when definitions or consent arrive later: the
|
|
39
|
+
* next page view picks them up). Two exceptions, both for an editor: the in-app
|
|
40
|
+
* version switch (`setEditorOverride`) applies at once, and `experiments.refresh()`
|
|
41
|
+
* (after a winner is accepted or a version removed) decides again. Logs the exposure once per page view when the
|
|
42
|
+
* trigger is seen, and only for enrolled visitors (never for a preview or a winner).
|
|
43
|
+
*/
|
|
44
|
+
var useExperiment = function (key, options) {
|
|
45
|
+
var _a;
|
|
46
|
+
if (options === void 0) { options = {}; }
|
|
47
|
+
var _b = (0, TrackingProvider_1.useTrackingContext)(), tracker = _b.tracker, attached = _b.attached;
|
|
48
|
+
var control = (_a = options.control) !== null && _a !== void 0 ? _a : 'a';
|
|
49
|
+
var known = options.variants;
|
|
50
|
+
var decide = (0, react_1.useCallback)(function () {
|
|
51
|
+
var a = tracker
|
|
52
|
+
? tracker.decide(key, control)
|
|
53
|
+
: { key: key, variant: control, enrolled: false, reason: 'no-consent', trigger: null };
|
|
54
|
+
return known && !known.includes(a.variant) ? __assign(__assign({}, a), { variant: control, enrolled: false }) : a;
|
|
55
|
+
// `known` is the variant keys of the call site: constant for its lifetime.
|
|
56
|
+
}, [tracker, key, control]);
|
|
57
|
+
var mounted = (0, react_1.useState)(decide)[0];
|
|
58
|
+
var store = tracker === null || tracker === void 0 ? void 0 : tracker.experiments;
|
|
59
|
+
var revision = (0, react_1.useSyncExternalStore)(store ? store.revision.subscribe : noopSubscribe, function () { var _a; return (_a = store === null || store === void 0 ? void 0 : store.revision.get()) !== null && _a !== void 0 ? _a : 0; }, function () { return 0; });
|
|
60
|
+
var editorVariant = (0, react_1.useSyncExternalStore)(store ? store.editorOverrides.subscribe : noopSubscribe, function () { return store === null || store === void 0 ? void 0 : store.editorOverrideOf(key); }, function () { return undefined; });
|
|
61
|
+
// Windows of the same app (an editor and its preview frame) share the switch through localStorage.
|
|
62
|
+
(0, react_1.useEffect)(function () {
|
|
63
|
+
if (!store || typeof window === 'undefined')
|
|
64
|
+
return undefined;
|
|
65
|
+
var onStorage = function () { return store.reloadEditorOverrides(); };
|
|
66
|
+
window.addEventListener('storage', onStorage);
|
|
67
|
+
return function () { return window.removeEventListener('storage', onStorage); };
|
|
68
|
+
}, [store]);
|
|
69
|
+
// Same object while no switch or refresh changed it, so the exposure watch is not re-created.
|
|
70
|
+
var mountedSwitch = (0, react_1.useState)(editorVariant)[0];
|
|
71
|
+
var assignment = (0, react_1.useMemo)(function () { return (revision === 0 && editorVariant === mountedSwitch ? mounted : decide()); }, [revision, editorVariant, mountedSwitch, mounted, decide]);
|
|
72
|
+
var element = (0, react_1.useRef)(null);
|
|
73
|
+
var triggerRef = (0, react_1.useCallback)(function (el) {
|
|
74
|
+
element.current = el;
|
|
75
|
+
}, []);
|
|
76
|
+
(0, react_1.useEffect)(function () {
|
|
77
|
+
var _a, _b;
|
|
78
|
+
if (!tracker || !assignment.enrolled)
|
|
79
|
+
return undefined;
|
|
80
|
+
var trigger = (_b = (_a = assignment.trigger) !== null && _a !== void 0 ? _a : options.trigger) !== null && _b !== void 0 ? _b : null;
|
|
81
|
+
var unobserve;
|
|
82
|
+
if (!trigger && element.current && attached.current) {
|
|
83
|
+
trigger = "experiment:".concat(key);
|
|
84
|
+
unobserve = attached.current.observeElement(element.current, trigger);
|
|
85
|
+
}
|
|
86
|
+
var unwatch = tracker.watchExposure(__assign(__assign({}, assignment), { trigger: trigger }));
|
|
87
|
+
return function () {
|
|
88
|
+
unwatch();
|
|
89
|
+
unobserve === null || unobserve === void 0 ? void 0 : unobserve();
|
|
90
|
+
};
|
|
91
|
+
// A new assignment only comes from a switch or a refresh; options.trigger is a constant at the call site.
|
|
92
|
+
}, [tracker, assignment]);
|
|
93
|
+
return { variant: assignment.variant, assignment: assignment, triggerRef: triggerRef };
|
|
94
|
+
};
|
|
95
|
+
exports.useExperiment = useExperiment;
|
|
96
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/tracking/react/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { TrackingProvider, useTracker, useTrackingContext } from './TrackingProvider';
|
|
2
|
+
export { Experiment } from './Experiment';
|
|
3
|
+
export { closeConsentSettings, consentPanel, openConsentSettings, useConsent, useConsentPanelOpen, useExperiment, } from './hooks';
|
|
4
|
+
export type { IUseExperiment, IUseExperimentOptions } from './hooks';
|
|
5
|
+
export type { ITrackingProviderProps } from './TrackingProvider';
|
|
6
|
+
export type { IExperimentProps } from './Experiment';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tracking/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useExperiment = exports.useConsentPanelOpen = exports.useConsent = exports.openConsentSettings = exports.consentPanel = exports.closeConsentSettings = exports.Experiment = exports.useTrackingContext = exports.useTracker = exports.TrackingProvider = void 0;
|
|
4
|
+
var TrackingProvider_1 = require("./TrackingProvider");
|
|
5
|
+
Object.defineProperty(exports, "TrackingProvider", { enumerable: true, get: function () { return TrackingProvider_1.TrackingProvider; } });
|
|
6
|
+
Object.defineProperty(exports, "useTracker", { enumerable: true, get: function () { return TrackingProvider_1.useTracker; } });
|
|
7
|
+
Object.defineProperty(exports, "useTrackingContext", { enumerable: true, get: function () { return TrackingProvider_1.useTrackingContext; } });
|
|
8
|
+
var Experiment_1 = require("./Experiment");
|
|
9
|
+
Object.defineProperty(exports, "Experiment", { enumerable: true, get: function () { return Experiment_1.Experiment; } });
|
|
10
|
+
var hooks_1 = require("./hooks");
|
|
11
|
+
Object.defineProperty(exports, "closeConsentSettings", { enumerable: true, get: function () { return hooks_1.closeConsentSettings; } });
|
|
12
|
+
Object.defineProperty(exports, "consentPanel", { enumerable: true, get: function () { return hooks_1.consentPanel; } });
|
|
13
|
+
Object.defineProperty(exports, "openConsentSettings", { enumerable: true, get: function () { return hooks_1.openConsentSettings; } });
|
|
14
|
+
Object.defineProperty(exports, "useConsent", { enumerable: true, get: function () { return hooks_1.useConsent; } });
|
|
15
|
+
Object.defineProperty(exports, "useConsentPanelOpen", { enumerable: true, get: function () { return hooks_1.useConsentPanelOpen; } });
|
|
16
|
+
Object.defineProperty(exports, "useExperiment", { enumerable: true, get: function () { return hooks_1.useExperiment; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tracking/react/index.ts"],"names":[],"mappings":";;;AAAA,uDAAsF;AAA7E,oHAAA,gBAAgB,OAAA;AAAE,8GAAA,UAAU,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AACzD,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,iCAOiB;AANf,6GAAA,oBAAoB,OAAA;AACpB,qGAAA,YAAY,OAAA;AACZ,4GAAA,mBAAmB,OAAA;AACnB,mGAAA,UAAU,OAAA;AACV,4GAAA,mBAAmB,OAAA;AACnB,sGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type IStorage } from './core/storage';
|
|
2
|
+
import { Tracker, type IPageInfo } from './core/tracker';
|
|
3
|
+
import { type IBatch, type IExperimentDefinition, type ITrackingConfig, type TStorageKeys } from './core/types';
|
|
4
|
+
/**
|
|
5
|
+
* A tracker with no browser behind it: memory storage, a fake clock and timers you
|
|
6
|
+
* drive, a transport that records batches. For unit tests and Storybook stories.
|
|
7
|
+
* Defaults: property `test`, the default storage prefix (`qa.`), page `https://example.com/`.
|
|
8
|
+
*/
|
|
9
|
+
export interface IMemoryTracker {
|
|
10
|
+
tracker: Tracker;
|
|
11
|
+
/** Batches handed to the transport, parsed. */
|
|
12
|
+
sent: {
|
|
13
|
+
batch: IBatch;
|
|
14
|
+
mode: 'fetch' | 'beacon';
|
|
15
|
+
}[];
|
|
16
|
+
local: IStorage;
|
|
17
|
+
session: IStorage;
|
|
18
|
+
/** The storage keys under the config's prefix. */
|
|
19
|
+
keys: TStorageKeys;
|
|
20
|
+
page: IPageInfo;
|
|
21
|
+
/** Moves the clock forward and runs every timer that is due. */
|
|
22
|
+
advance: (ms: number) => Promise<void>;
|
|
23
|
+
now: () => number;
|
|
24
|
+
/** Makes the next transport calls fail (network down). */
|
|
25
|
+
setOffline: (offline: boolean) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface IMemoryTrackerOptions {
|
|
28
|
+
/** Any config field; `property`, `endpoint` and `experimentsEndpoint` have test defaults. */
|
|
29
|
+
config?: Partial<ITrackingConfig>;
|
|
30
|
+
consent?: 'granted' | 'denied';
|
|
31
|
+
/** The running-experiments answer: a list, a function (read on every load), or 'fail' (no endpoint). */
|
|
32
|
+
experiments?: IExperimentDefinition[] | (() => unknown[]) | 'fail';
|
|
33
|
+
page?: Partial<IPageInfo>;
|
|
34
|
+
vid?: string;
|
|
35
|
+
start?: number;
|
|
36
|
+
/** localStorage contents before the tracker starts (applied last). */
|
|
37
|
+
seed?: Record<string, string>;
|
|
38
|
+
}
|
|
39
|
+
export declare const createMemoryTracker: (options?: IMemoryTrackerOptions) => IMemoryTracker;
|
|
40
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/tracking/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAA8B,KAAK,MAAM,EAAE,KAAK,qBAAqB,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5I;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,EAAE,CAAC;IACpD,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,QAAQ,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,gEAAgE;IAChE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,6FAA6F;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,wGAAwG;IACxG,WAAW,CAAC,EAAE,qBAAqB,EAAE,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,eAAO,MAAM,mBAAmB,aAAa,qBAAqB,KAAQ,cAqEzE,CAAC"}
|