@journeeze/sdk 0.0.0-stage → 0.1.0-rc.2
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/AGENTS.md +67 -0
- package/CHANGELOG.md +30 -0
- package/LICENSE.md +27 -0
- package/README.md +164 -2
- package/dist/THIRD_PARTY_LICENSES.txt +246 -0
- package/dist/consent-CoKD33Rm.js +170 -0
- package/dist/context-UnG6_X61.js +17 -0
- package/dist/contract.js +10 -0
- package/dist/feedback-C4CYtS2A.js +196 -0
- package/dist/help-C1x-y2f9.js +878 -0
- package/dist/hook-BdG4UL4k.js +91 -0
- package/dist/index-B_nob8S0.js +2091 -0
- package/dist/index-CfCbJJXa.js +20 -0
- package/dist/index.js +10 -0
- package/dist/loader-Ba4X-WNl.js +95 -0
- package/dist/react.js +70 -0
- package/dist/resolve-BfWByuTp.js +97 -0
- package/dist/script.js +13 -0
- package/dist/signals-E3VEdmWH.js +477 -0
- package/dist/telemetry-Cik-cYzw.js +140 -0
- package/dist/transport-B5YJFQEF.js +60 -0
- package/dist/types/config.d.ts +17 -0
- package/dist/types/context.d.ts +6 -0
- package/dist/types/contract.d.ts +13 -0
- package/dist/types/help/core/client.d.ts +26 -0
- package/dist/types/help/core/controller.d.ts +175 -0
- package/dist/types/help/core/events.d.ts +8 -0
- package/dist/types/help/core/help.d.ts +24 -0
- package/dist/types/help/core/highlight.d.ts +38 -0
- package/dist/types/help/core/panel.d.ts +11 -0
- package/dist/types/help/core/search.d.ts +7 -0
- package/dist/types/help/ui/callout.d.ts +2 -0
- package/dist/types/help/ui/panel.d.ts +3 -0
- package/dist/types/help/ui/request.d.ts +2 -0
- package/dist/types/help/ui/styles.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/invite.d.ts +4 -0
- package/dist/types/loader.d.ts +57 -0
- package/dist/types/mask.d.ts +10 -0
- package/dist/types/react.d.ts +9 -0
- package/dist/types/resolve/resolve.d.ts +12 -0
- package/dist/types/script.d.ts +6 -0
- package/dist/types/signals/cel.d.ts +8 -0
- package/dist/types/signals/hook.d.ts +10 -0
- package/dist/types/signals/signals.conformance.d.ts +2 -0
- package/dist/types/signals/signals.d.ts +145 -0
- package/dist/types/telemetry/telemetry.d.ts +63 -0
- package/dist/types/transport.d.ts +30 -0
- package/dist/types/types.d.ts +391 -0
- package/dist/types/widget/anchor.d.ts +11 -0
- package/dist/types/widget/capture.d.ts +28 -0
- package/dist/types/widget/consent.d.ts +25 -0
- package/dist/types/widget/feedback.d.ts +36 -0
- package/dist/types/widget/icons.d.ts +14 -0
- package/dist/types/widget/outbox.d.ts +69 -0
- package/dist/types/widget/styles.d.ts +1 -0
- package/dist/types/widget.d.ts +27 -0
- package/dist/types/wire.d.ts +66 -0
- package/dist/widget-DQZm8sAC.js +1599 -0
- package/package.json +68 -4
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { CONTEXT_FIELDS as Xt, CONTEXT_ID_PATTERN as qt } from "./contract.js";
|
|
2
|
+
import { w as C } from "./loader-Ba4X-WNl.js";
|
|
3
|
+
import { p as Gt, s as Ht, j as gt, m as Vt, M as Zt, r as Qt } from "./transport-B5YJFQEF.js";
|
|
4
|
+
import { c as Yt, C as vt } from "./consent-CoKD33Rm.js";
|
|
5
|
+
const Jt = /[A-Za-z0-9_]/, te = /^[A-Za-z_]\w{0,63}$/, Z = (o) => !!o && Jt.test(o), st = (o) => !!o && o >= "0" && o <= "9";
|
|
6
|
+
function wt(o, n, r) {
|
|
7
|
+
const m = typeof o == typeof r;
|
|
8
|
+
return n === "==" ? m && o === r : n === "!=" ? !(m && o === r) : !m || typeof o == "boolean" ? !1 : n === "<" ? o < r : n === "<=" ? o <= r : n === ">" ? o > r : o >= r;
|
|
9
|
+
}
|
|
10
|
+
function ee(o) {
|
|
11
|
+
if (!(o?.length <= 1024)) return;
|
|
12
|
+
let n = 0, r = 0, m = 0;
|
|
13
|
+
const v = () => {
|
|
14
|
+
for (; n < o.length && o[n] <= " "; ) n++;
|
|
15
|
+
}, w = () => {
|
|
16
|
+
const a = n;
|
|
17
|
+
for (; n < o.length && Z(o[n]); ) n++;
|
|
18
|
+
if (o.slice(a, n) !== "event" || o[n] !== ".") return;
|
|
19
|
+
n++;
|
|
20
|
+
const l = n;
|
|
21
|
+
for (; n < o.length && Z(o[n]); ) n++;
|
|
22
|
+
const c = o.slice(l, n);
|
|
23
|
+
if (c === "kind") return [!0, ""];
|
|
24
|
+
if (c !== "fields" || o[n] !== ".") return;
|
|
25
|
+
n++;
|
|
26
|
+
const h = n;
|
|
27
|
+
for (; n < o.length && Z(o[n]); ) n++;
|
|
28
|
+
const u = o.slice(h, n);
|
|
29
|
+
return te.test(u) ? [!1, u] : void 0;
|
|
30
|
+
}, x = (a) => {
|
|
31
|
+
let l = "";
|
|
32
|
+
for (n++; n < o.length; ) {
|
|
33
|
+
const c = o[n];
|
|
34
|
+
if (c === a)
|
|
35
|
+
return n++, l;
|
|
36
|
+
if (c === "\\") {
|
|
37
|
+
const h = o[n + 1];
|
|
38
|
+
if (h === void 0 || !`\\"'`.includes(h)) return;
|
|
39
|
+
l += h, n += 2;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (c < " ") return;
|
|
43
|
+
l += c, n++;
|
|
44
|
+
}
|
|
45
|
+
}, U = () => {
|
|
46
|
+
const a = n;
|
|
47
|
+
o[n] === "-" && n++;
|
|
48
|
+
const l = n;
|
|
49
|
+
for (; n < o.length && st(o[n]); ) n++;
|
|
50
|
+
if (n !== l) {
|
|
51
|
+
if (o[n] === ".") {
|
|
52
|
+
n++;
|
|
53
|
+
const c = n;
|
|
54
|
+
for (; n < o.length && st(o[n]); ) n++;
|
|
55
|
+
if (n === c) return;
|
|
56
|
+
}
|
|
57
|
+
return Number(o.slice(a, n));
|
|
58
|
+
}
|
|
59
|
+
}, D = () => {
|
|
60
|
+
const a = o[n];
|
|
61
|
+
if (a === '"' || a === "'") return x(a);
|
|
62
|
+
if (a === "-" || st(a)) return U();
|
|
63
|
+
const l = n;
|
|
64
|
+
for (; n < o.length && Z(o[n]); ) n++;
|
|
65
|
+
const c = o.slice(l, n);
|
|
66
|
+
return c === "true" ? !0 : c === "false" ? !1 : void 0;
|
|
67
|
+
}, k = () => {
|
|
68
|
+
const a = o[n], l = o[n + 1];
|
|
69
|
+
if (a === "=" && l === "=")
|
|
70
|
+
return n += 2, "==";
|
|
71
|
+
if (a === "!" && l === "=")
|
|
72
|
+
return n += 2, "!=";
|
|
73
|
+
if (a === "<" || a === ">")
|
|
74
|
+
return n += l === "=" ? 2 : 1, l === "=" ? a + "=" : a;
|
|
75
|
+
}, R = () => {
|
|
76
|
+
if (v(), o[n] === "(") {
|
|
77
|
+
if (++m > 8) return;
|
|
78
|
+
n++;
|
|
79
|
+
const u = W();
|
|
80
|
+
return v(), !u || o[n] !== ")" ? void 0 : (n++, m--, u);
|
|
81
|
+
}
|
|
82
|
+
const a = o[n] === "e", l = a ? w() : D();
|
|
83
|
+
if (l === void 0) return;
|
|
84
|
+
v();
|
|
85
|
+
const c = k();
|
|
86
|
+
if (!c) return;
|
|
87
|
+
if (v(), a) {
|
|
88
|
+
const u = D();
|
|
89
|
+
if (u === void 0 || ++r > 32) return;
|
|
90
|
+
const b = l;
|
|
91
|
+
return (j) => wt(b[0] ? j.kind : j.fields[b[1]], c, u);
|
|
92
|
+
}
|
|
93
|
+
const h = w();
|
|
94
|
+
if (h && !(++r > 32))
|
|
95
|
+
return (u) => wt(l, c, h[0] ? u.kind : u.fields[h[1]]);
|
|
96
|
+
}, S = (a, l, c) => {
|
|
97
|
+
let h = a();
|
|
98
|
+
if (h)
|
|
99
|
+
for (; ; ) {
|
|
100
|
+
if (v(), o[n] !== l || o[n + 1] !== l) return h;
|
|
101
|
+
n += 2;
|
|
102
|
+
const u = a();
|
|
103
|
+
if (!u) return;
|
|
104
|
+
const b = h;
|
|
105
|
+
h = c ? (j) => b(j) && u(j) : (j) => b(j) || u(j);
|
|
106
|
+
}
|
|
107
|
+
}, p = () => S(R, "&", !0), W = () => S(p, "|", !1), L = W();
|
|
108
|
+
return v(), L && n === o.length ? L : void 0;
|
|
109
|
+
}
|
|
110
|
+
const ne = "jz-platform@1", rt = {
|
|
111
|
+
abandoned_step: { step: "int" },
|
|
112
|
+
hesitation: { dwell_ms: "int" },
|
|
113
|
+
rage_click: { clicks: "int" },
|
|
114
|
+
dead_click: {},
|
|
115
|
+
step_target_missing: { journey: "id", step: "int", rev: "int", tried: "id" }
|
|
116
|
+
}, yt = /^[a-z][a-z0-9_]{0,63}$/, It = /^[a-z0-9._:-]{1,96}$/, oe = /^[a-z0-9._:-]{1,64}$/, _t = 700, ke = 3, jt = 3e3, at = 1e3, ie = 12e4, se = 1e3, re = 1e4, ae = 300, ce = 64, kt = 50, St = 32 * 1024, bt = 5e3, zt = 200, le = 256 * 1024, At = (o, n) => typeof o == "function" && n.every((r) => typeof o.prototype?.[r] == "function");
|
|
117
|
+
function Et(o) {
|
|
118
|
+
const n = o;
|
|
119
|
+
return !!n && At(n.TFloBrowser, ["init", "addPattern", "removePattern", "ingest", "flush", "destroy"]) && At(n.Pattern, ["when", "then", "notThen", "within", "emit"]);
|
|
120
|
+
}
|
|
121
|
+
const de = () => import("./index-B_nob8S0.js");
|
|
122
|
+
async function fe(o, n = de) {
|
|
123
|
+
if (o !== void 0)
|
|
124
|
+
try {
|
|
125
|
+
const r = typeof o == "function" ? await o() : o;
|
|
126
|
+
if (Et(r)) return r;
|
|
127
|
+
C("signals.tflo lacks the TFloBrowser/Pattern surface; using the SDK's own");
|
|
128
|
+
} catch {
|
|
129
|
+
C("signals.tflo failed to load; using the SDK's own");
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const r = await n();
|
|
133
|
+
if (Et(r)) return r;
|
|
134
|
+
} catch {
|
|
135
|
+
}
|
|
136
|
+
C("tflo failed to load; signals off");
|
|
137
|
+
}
|
|
138
|
+
const Tt = "[data-jz-mask],[data-jz-block],input,textarea,select,[contenteditable]:not([contenteditable='false'])";
|
|
139
|
+
function Mt(o, n = []) {
|
|
140
|
+
let r = o instanceof Element ? o : o instanceof Node ? o.parentElement : null;
|
|
141
|
+
if (!r) return;
|
|
142
|
+
const m = [Tt, ...n].join(",");
|
|
143
|
+
try {
|
|
144
|
+
if (r.closest(m)) return;
|
|
145
|
+
} catch {
|
|
146
|
+
if (r.closest(Tt)) return;
|
|
147
|
+
}
|
|
148
|
+
const w = r.closest("[data-tflow-id]")?.getAttribute("data-tflow-id") ?? void 0;
|
|
149
|
+
return w !== void 0 && It.test(w) ? w : void 0;
|
|
150
|
+
}
|
|
151
|
+
const ue = (o) => Math.round(o / 500) * 500;
|
|
152
|
+
function pe() {
|
|
153
|
+
return crypto.randomUUID();
|
|
154
|
+
}
|
|
155
|
+
const me = 128;
|
|
156
|
+
async function Se(o) {
|
|
157
|
+
const n = o.site;
|
|
158
|
+
if (n.signalsEnabled !== !0) return;
|
|
159
|
+
const r = o.options.signals ?? {}, m = await fe(r.tflo, o.loadOwn);
|
|
160
|
+
if (!m) return;
|
|
161
|
+
const v = o.now ?? (() => performance.now()), w = o.fetchImpl ?? ((...t) => fetch(...t)), x = o.newId ?? pe, U = o.options.maskSelectors ?? [], D = /* @__PURE__ */ new Map();
|
|
162
|
+
for (const t of n.siteSignals ?? []) {
|
|
163
|
+
if (!yt.test(t.name) || t.name in rt || t.name.startsWith("jz_")) continue;
|
|
164
|
+
const e = {};
|
|
165
|
+
for (const i of (t.params ?? []).slice(0, 8)) e[i.name] = i.type === "string" ? "id" : i.type;
|
|
166
|
+
D.set(t.name, e);
|
|
167
|
+
}
|
|
168
|
+
let k = !1;
|
|
169
|
+
const R = [], S = (t, e, i) => {
|
|
170
|
+
t.addEventListener(e, i, { capture: !0, passive: !0 }), R.push(() => t.removeEventListener(e, i, { capture: !0 }));
|
|
171
|
+
};
|
|
172
|
+
let p = [], W = 0, L = 0, a, l = 0, c, h = Promise.resolve();
|
|
173
|
+
const u = (t) => {
|
|
174
|
+
k || c !== void 0 || (c = setTimeout(() => {
|
|
175
|
+
c = void 0, h = h.then(Pt);
|
|
176
|
+
}, t));
|
|
177
|
+
}, b = (t, e = 0) => ({
|
|
178
|
+
siteKey: o.options.siteKey,
|
|
179
|
+
consentGiven: !0,
|
|
180
|
+
ruleSet: ne,
|
|
181
|
+
signals: t,
|
|
182
|
+
...e > 0 ? { droppedAtUnload: e } : {}
|
|
183
|
+
}), j = (t, e) => {
|
|
184
|
+
const i = [];
|
|
185
|
+
for (const s of t) {
|
|
186
|
+
if (i.length >= kt || gt(b([...i, s])) > e) break;
|
|
187
|
+
i.push(s);
|
|
188
|
+
}
|
|
189
|
+
return i;
|
|
190
|
+
}, Pt = async () => {
|
|
191
|
+
let t = a;
|
|
192
|
+
if (!t && p.length > 0) {
|
|
193
|
+
const e = j(p, St);
|
|
194
|
+
p = p.slice(e.length), t = { signals: e, retries: 0, firstAt: Date.now(), dropped: l }, l = 0;
|
|
195
|
+
}
|
|
196
|
+
if (!(!t || t.signals.length === 0)) {
|
|
197
|
+
a = void 0;
|
|
198
|
+
try {
|
|
199
|
+
await Yt(o.endpoint, "RecordSignals", b(t.signals, t.dropped), w);
|
|
200
|
+
} catch (e) {
|
|
201
|
+
const i = e instanceof vt ? e.status : 0, s = e instanceof vt ? e.retryAfterMs : void 0;
|
|
202
|
+
if (!k && Vt(t.retries, i) && Date.now() - t.firstAt < Zt) {
|
|
203
|
+
a = { ...t, retries: t.retries + 1 }, u(Qt(t.retries + 1, s));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
p.length > 0 && u(p.length >= kt ? 0 : bt);
|
|
208
|
+
}
|
|
209
|
+
}, Ot = (t, e) => {
|
|
210
|
+
if (!(k || L >= ae)) {
|
|
211
|
+
for (L++, p.push({ eventId: x(), seq: ++W, ...t }), p.length > zt && (p = p.slice(-zt)); p.length > 1 && gt(p) > le; ) p = p.slice(1);
|
|
212
|
+
e ? (c !== void 0 && clearTimeout(c), c = void 0, u(0)) : u(bt);
|
|
213
|
+
}
|
|
214
|
+
}, ct = /* @__PURE__ */ new Map(), B = /* @__PURE__ */ new Map(), K = /* @__PURE__ */ new Map(), Ct = () => {
|
|
215
|
+
const t = o.getContext(), e = {};
|
|
216
|
+
for (const i of Xt) {
|
|
217
|
+
const s = t[i];
|
|
218
|
+
typeof s == "string" && qt.test(s) && (e[i] = s);
|
|
219
|
+
}
|
|
220
|
+
return e;
|
|
221
|
+
}, xt = (t, e) => {
|
|
222
|
+
if (t === "int" && typeof e == "number" && Number.isFinite(e)) return { intValue: String(Math.trunc(e)) };
|
|
223
|
+
if (t === "double" && typeof e == "number" && Number.isFinite(e)) return { doubleValue: e };
|
|
224
|
+
if (t === "bool" && typeof e == "boolean") return { boolValue: e };
|
|
225
|
+
if (t === "id" && typeof e == "string" && oe.test(e)) return { stringValue: e };
|
|
226
|
+
}, lt = (t) => {
|
|
227
|
+
const e = t.payload ?? {};
|
|
228
|
+
if (e.__drop === !0) return;
|
|
229
|
+
const i = rt[t.name], s = i ?? D.get(t.name);
|
|
230
|
+
if (!s) return;
|
|
231
|
+
const d = typeof e.target == "string" && It.test(e.target) ? e.target : void 0;
|
|
232
|
+
if (t.name === "rage_click" && d) {
|
|
233
|
+
const I = K.get(d);
|
|
234
|
+
queueMicrotask(() => _(() => I?.reset()));
|
|
235
|
+
}
|
|
236
|
+
const f = `${t.name} ${d ?? ""}`, g = v(), T = ct.get(f);
|
|
237
|
+
if (T !== void 0 && g - T < re) {
|
|
238
|
+
t.name === "rage_click" && typeof e.clicks == "number" && B.set(f, (B.get(f) ?? 0) + e.clicks);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
ct.set(f, g);
|
|
242
|
+
const V = {};
|
|
243
|
+
let F = 0;
|
|
244
|
+
for (const [I, Kt] of Object.entries(s)) {
|
|
245
|
+
let it = e[I];
|
|
246
|
+
I === "clicks" && typeof it == "number" && (it += B.get(f) ?? 0, B.delete(f));
|
|
247
|
+
const ht = xt(Kt, it);
|
|
248
|
+
ht && F < 8 && (V[I] = ht, F++);
|
|
249
|
+
}
|
|
250
|
+
Ot(
|
|
251
|
+
{
|
|
252
|
+
name: t.name,
|
|
253
|
+
source: i ? "SIGNAL_SOURCE_PLATFORM" : "SIGNAL_SOURCE_SITE",
|
|
254
|
+
context: Ct(),
|
|
255
|
+
...d ? { target: d } : {},
|
|
256
|
+
...F > 0 ? { params: V } : {}
|
|
257
|
+
},
|
|
258
|
+
t.name === "abandoned_step"
|
|
259
|
+
);
|
|
260
|
+
}, Q = m.Pattern;
|
|
261
|
+
let y;
|
|
262
|
+
const dt = async () => {
|
|
263
|
+
const t = new m.TFloBrowser({ sinks: [{ name: "journeeze", send: lt }], onSinkError: () => {
|
|
264
|
+
} });
|
|
265
|
+
try {
|
|
266
|
+
await t.init();
|
|
267
|
+
} catch {
|
|
268
|
+
return C("tflo failed to initialise; signals off"), !1;
|
|
269
|
+
}
|
|
270
|
+
return k ? (t.destroy(), !1) : (y = t, Bt(t), !0);
|
|
271
|
+
}, P = (t, e = {}) => {
|
|
272
|
+
!k && y && _(() => y.ingest({ kind: t, ts: v(), fields: e }));
|
|
273
|
+
}, Y = (t) => t.kind === "jz.end", z = /* @__PURE__ */ new Map();
|
|
274
|
+
let Dt = 0, M;
|
|
275
|
+
const X = (t) => {
|
|
276
|
+
z.delete(t.name), _(() => y?.removePattern(t.name));
|
|
277
|
+
}, J = (t, e, i, s, d, f) => {
|
|
278
|
+
if (!y) return;
|
|
279
|
+
for (const I of z.values()) if (I.key === e) return;
|
|
280
|
+
z.size >= me && X(z.values().next().value);
|
|
281
|
+
const g = ++Dt, T = `${t}#${g}`, V = s(new Q(T), g).within(i).emit(d), F = y.addPattern(V);
|
|
282
|
+
z.set(T, { name: T, key: e, runtime: F, deadline: v() + i }), P("jz.window", { ...f, w: g }), M ?? (M = setInterval(Rt, se));
|
|
283
|
+
};
|
|
284
|
+
function Rt() {
|
|
285
|
+
const t = v();
|
|
286
|
+
for (const e of [...z.values()]) {
|
|
287
|
+
if (e.deadline > t) continue;
|
|
288
|
+
const i = _(() => e.runtime.flush()) ?? [];
|
|
289
|
+
X(e);
|
|
290
|
+
for (const s of i) lt(s);
|
|
291
|
+
}
|
|
292
|
+
z.size === 0 && M !== void 0 && (clearInterval(M), M = void 0);
|
|
293
|
+
}
|
|
294
|
+
const O = (t, e) => {
|
|
295
|
+
for (const i of [...z.values()]) i.name.startsWith(`${t}#`) && (e === void 0 || i.key === e) && X(i);
|
|
296
|
+
};
|
|
297
|
+
let Lt = 0;
|
|
298
|
+
const A = /* @__PURE__ */ new Map(), Nt = (t) => {
|
|
299
|
+
if (!y) return;
|
|
300
|
+
const e = A.get(t);
|
|
301
|
+
if (e) {
|
|
302
|
+
A.delete(t), A.set(t, e);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (A.size >= ce) {
|
|
306
|
+
const [f, g] = A.entries().next().value;
|
|
307
|
+
_(() => y?.removePattern(g)), A.delete(f), K.delete(f);
|
|
308
|
+
}
|
|
309
|
+
const i = (f) => f.kind === "jz.click" && f.fields.target === t, s = `rage_click#${++Lt}`, d = y.addPattern(
|
|
310
|
+
new Q(s).when(i).then(i).then(i).within(_t).emit(
|
|
311
|
+
(f) => f.last().ts - f.first().ts <= _t ? { name: "rage_click", payload: { target: t, clicks: f.length } } : { name: "rage_click", payload: { __drop: !0 } }
|
|
312
|
+
)
|
|
313
|
+
);
|
|
314
|
+
A.set(t, s), K.set(t, d);
|
|
315
|
+
}, $t = (t, e) => J(
|
|
316
|
+
"hesitation",
|
|
317
|
+
t,
|
|
318
|
+
jt,
|
|
319
|
+
(i, s) => i.when((d) => d.fields.w === s).notThen((d) => Y(d) || (d.kind === "jz.unhover" || d.kind === "jz.blur" || d.kind === "jz.click" || d.kind === "jz.change") && d.fields.target === t),
|
|
320
|
+
(i) => ({ name: "hesitation", payload: { target: t, dwell_ms: Math.max(jt, ue(v() - i.first().ts)) } }),
|
|
321
|
+
{ target: t, kind: e }
|
|
322
|
+
), Ft = (t) => J(
|
|
323
|
+
"dead_click",
|
|
324
|
+
t,
|
|
325
|
+
at,
|
|
326
|
+
(e, i) => e.when((s) => s.fields.w === i).notThen((s) => Y(s) || s.kind === "jz.effect"),
|
|
327
|
+
() => ({ name: "dead_click", payload: { target: t } }),
|
|
328
|
+
{ target: t }
|
|
329
|
+
);
|
|
330
|
+
let Ut = 0;
|
|
331
|
+
const ft = [];
|
|
332
|
+
for (const t of r.rules ?? []) {
|
|
333
|
+
if (!yt.test(t.name) || t.name in rt || t.name.startsWith("jz_")) {
|
|
334
|
+
C(`site rule ${t.name} refused (name)`);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
const e = typeof t.when == "function" ? t.when : ee(t.when);
|
|
338
|
+
if (!e) {
|
|
339
|
+
C(`site rule ${t.name} refused (outside the SDK's CEL subset)`);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
ft.push({ rule: t, pred: e });
|
|
343
|
+
}
|
|
344
|
+
const Wt = (t) => he.has(t.kind);
|
|
345
|
+
function Bt(t) {
|
|
346
|
+
for (const { rule: e, pred: i } of ft)
|
|
347
|
+
t.addPattern(
|
|
348
|
+
new Q(`site:${e.name}#${++Ut}`).when((s) => Wt(s) && _(() => i({ kind: s.kind.slice(3), ts: s.ts, fields: { target: s.fields.target } })) === !0).emit((s) => {
|
|
349
|
+
const d = s.first(), f = { target: d.fields.target };
|
|
350
|
+
for (const [g, T] of Object.entries(e.params ?? {})) g !== "target" && (f[g] = ve(d, T));
|
|
351
|
+
return { name: e.name, payload: f };
|
|
352
|
+
})
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
let E;
|
|
356
|
+
const tt = () => {
|
|
357
|
+
const t = o.getContext();
|
|
358
|
+
E && t.journeyId !== E.journey && (O("abandoned_step"), E = void 0);
|
|
359
|
+
const e = ge(n, t, E);
|
|
360
|
+
if (!e || E && e.index <= E.index || (E && P("jz.step", { journey: e.journey, index: e.index }), O("abandoned_step"), E = e, e.last)) return;
|
|
361
|
+
const { journey: i, index: s } = e;
|
|
362
|
+
J(
|
|
363
|
+
"abandoned_step",
|
|
364
|
+
i,
|
|
365
|
+
ie,
|
|
366
|
+
(d, f) => d.when((g) => g.fields.w === f).notThen((g) => Y(g) || g.kind === "jz.step" && g.fields.journey === i && g.fields.index > s),
|
|
367
|
+
() => ({ name: "abandoned_step", payload: { step: s + 1 } }),
|
|
368
|
+
{ journey: i, index: s }
|
|
369
|
+
);
|
|
370
|
+
};
|
|
371
|
+
let ut = 0;
|
|
372
|
+
const q = () => {
|
|
373
|
+
v() > ut || (P("jz.effect"), O("dead_click"));
|
|
374
|
+
}, N = typeof MutationObserver == "function" ? new MutationObserver(q) : void 0;
|
|
375
|
+
let $;
|
|
376
|
+
const et = typeof PerformanceObserver == "function" ? _(() => new PerformanceObserver((t) => t.getEntries().length > 0 && q())) : void 0;
|
|
377
|
+
_(() => et?.observe({ type: "resource" }));
|
|
378
|
+
const nt = (t) => Mt(t.composedPath?.()[0] ?? t.target, U);
|
|
379
|
+
S(document, "click", (t) => {
|
|
380
|
+
const e = nt(t);
|
|
381
|
+
e && (Nt(e), P("jz.click", { target: e }), O("hesitation", e), ut = v() + at, N && (N.observe(document.documentElement, { childList: !0, attributes: !0, subtree: !0 }), $ !== void 0 && clearTimeout($), $ = setTimeout(() => N.disconnect(), at)), Ft(e));
|
|
382
|
+
});
|
|
383
|
+
const G = (t, e) => S(document, t, (i) => {
|
|
384
|
+
e === "jz.focus" && q();
|
|
385
|
+
const s = nt(i);
|
|
386
|
+
s && ((e === "jz.hover" || e === "jz.unhover") && Mt(i.relatedTarget, U) === s || (P(e, { target: s }), e === "jz.hover" || e === "jz.focus" ? $t(s, e) : O("hesitation", s)));
|
|
387
|
+
});
|
|
388
|
+
G("pointerover", "jz.hover"), G("pointerout", "jz.unhover"), G("focusin", "jz.focus"), G("focusout", "jz.blur"), S(document, "change", (t) => {
|
|
389
|
+
const e = nt(t);
|
|
390
|
+
e && (P("jz.change", { target: e }), O("hesitation", e));
|
|
391
|
+
});
|
|
392
|
+
for (const t of ["popstate", "hashchange"]) S(window, t, q);
|
|
393
|
+
let H = !1;
|
|
394
|
+
const ot = () => {
|
|
395
|
+
if (k || H) return;
|
|
396
|
+
H = !0;
|
|
397
|
+
const t = [...a?.signals ?? [], ...p];
|
|
398
|
+
if (t.length === 0) return;
|
|
399
|
+
const e = (a?.dropped ?? 0) + l, i = j(t, Math.min(Gt(), St));
|
|
400
|
+
i.length > 0 && Ht(o.endpoint, "RecordSignals", b(i, e), w) && (a = void 0, p = [], l = t.length - i.length);
|
|
401
|
+
}, pt = () => {
|
|
402
|
+
for (const t of [...z.values()]) X(t);
|
|
403
|
+
E = void 0;
|
|
404
|
+
}, mt = () => {
|
|
405
|
+
pt();
|
|
406
|
+
for (const e of A.values()) _(() => y?.removePattern(e));
|
|
407
|
+
A.clear(), K.clear();
|
|
408
|
+
const t = y;
|
|
409
|
+
y = void 0, _(() => t?.destroy());
|
|
410
|
+
};
|
|
411
|
+
if (S(window, "pagehide", () => {
|
|
412
|
+
mt(), ot();
|
|
413
|
+
}), S(document, "visibilitychange", () => {
|
|
414
|
+
document.visibilityState === "hidden" ? ot() : H = !1;
|
|
415
|
+
}), S(window, "pageshow", (t) => {
|
|
416
|
+
H = !1, !(!t.persisted || y) && dt().then((e) => e && _(tt));
|
|
417
|
+
}), !await dt()) {
|
|
418
|
+
for (const t of R.splice(0)) t();
|
|
419
|
+
N?.disconnect(), et?.disconnect();
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
return _(tt), {
|
|
423
|
+
contextChanged: () => _(tt),
|
|
424
|
+
stop(t) {
|
|
425
|
+
if (!k) {
|
|
426
|
+
pt(), t || ot(), k = !0;
|
|
427
|
+
for (const e of R.splice(0)) e();
|
|
428
|
+
M !== void 0 && clearInterval(M), c !== void 0 && clearTimeout(c), $ !== void 0 && clearTimeout($), N?.disconnect(), et?.disconnect(), p = [], a = void 0, mt();
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
idle: () => h
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
const he = /* @__PURE__ */ new Set(["jz.click", "jz.hover", "jz.unhover", "jz.focus", "jz.blur", "jz.change"]);
|
|
435
|
+
function ge(o, n, r) {
|
|
436
|
+
if (!n.journeyId || !n.journeyStep) return;
|
|
437
|
+
const m = o.publishedJourneys?.find((x) => x.journeyId === n.journeyId)?.stepIds;
|
|
438
|
+
if (!m || m.length === 0) return;
|
|
439
|
+
const v = r && r.journey === n.journeyId ? r.index + 1 : 0;
|
|
440
|
+
let w = m.indexOf(n.journeyStep, v);
|
|
441
|
+
return w < 0 && (w = m.indexOf(n.journeyStep)), w >= 0 ? { journey: n.journeyId, index: w, last: w === m.length - 1 } : void 0;
|
|
442
|
+
}
|
|
443
|
+
function _(o) {
|
|
444
|
+
try {
|
|
445
|
+
return o();
|
|
446
|
+
} catch {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
function ve(o, n) {
|
|
451
|
+
if (n === "event.kind") return o.kind.slice(3);
|
|
452
|
+
const r = /^event\.fields\.([A-Za-z_][A-Za-z0-9_]{0,63})$/.exec(n);
|
|
453
|
+
return r ? o.fields[r[1]] : void 0;
|
|
454
|
+
}
|
|
455
|
+
export {
|
|
456
|
+
ie as ABANDON_MS,
|
|
457
|
+
se as CLOCK_MS,
|
|
458
|
+
at as DEAD_CLICK_MS,
|
|
459
|
+
bt as FLUSH_MS,
|
|
460
|
+
jt as HESITATION_MS,
|
|
461
|
+
kt as MAX_BATCH,
|
|
462
|
+
St as MAX_BATCH_BYTES,
|
|
463
|
+
zt as MAX_QUEUED,
|
|
464
|
+
le as MAX_QUEUED_BYTES,
|
|
465
|
+
ce as MAX_TARGETS,
|
|
466
|
+
me as MAX_WINDOWS,
|
|
467
|
+
ae as PAGE_CAP,
|
|
468
|
+
ke as RAGE_CLICKS,
|
|
469
|
+
_t as RAGE_WINDOW_MS,
|
|
470
|
+
ne as RULE_SET,
|
|
471
|
+
re as THROTTLE_MS,
|
|
472
|
+
Et as hasFloor,
|
|
473
|
+
ge as matchCheckpoint,
|
|
474
|
+
fe as resolveTflo,
|
|
475
|
+
Se as startSignals,
|
|
476
|
+
Mt as trackedId
|
|
477
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { h as j, c as W, C as q } from "./consent-CoKD33Rm.js";
|
|
2
|
+
import { p as Q, j as L, s as V, M as z, m as J, r as Z } from "./transport-B5YJFQEF.js";
|
|
3
|
+
function ee(n, u = globalThis.navigator) {
|
|
4
|
+
return n.respectGlobalPrivacyControl !== !1 && u?.globalPrivacyControl === !0;
|
|
5
|
+
}
|
|
6
|
+
const M = 50, B = 32 * 1024, te = 5e3, ne = 1e3, ie = 1e4, $ = 200, re = 256 * 1024, h = "HELP_EVENT_";
|
|
7
|
+
function T(n, u) {
|
|
8
|
+
return n.version ? { journeyId: n.journeyId, stepIndex: u, guideVersion: n.version } : { journeyId: n.journeyId, stepIndex: u };
|
|
9
|
+
}
|
|
10
|
+
const N = /* @__PURE__ */ new Set([`${h}GUIDE_ABANDONED`]);
|
|
11
|
+
function oe(n) {
|
|
12
|
+
return Math.min(Math.max(n ?? te, ne), ie);
|
|
13
|
+
}
|
|
14
|
+
function se() {
|
|
15
|
+
return crypto.randomUUID();
|
|
16
|
+
}
|
|
17
|
+
function le(n) {
|
|
18
|
+
if (ee(n)) return { checkin: () => {
|
|
19
|
+
}, stop: () => {
|
|
20
|
+
} };
|
|
21
|
+
const u = n.fetchImpl ?? fetch, m = oe(n.flushMs), O = n.random ?? Math.random, k = n.newId ?? se;
|
|
22
|
+
let t = [], r, o, l = !1, y = !1, _ = 0, E = 0, i, A, C = !1, D;
|
|
23
|
+
const c = (e) => {
|
|
24
|
+
l || o || (o = setTimeout(() => {
|
|
25
|
+
o = void 0, H();
|
|
26
|
+
}, e));
|
|
27
|
+
}, K = () => {
|
|
28
|
+
for (t.length > $ && (t = t.slice(-$)); t.length > 0 && L(t) > re; ) t = t.slice(1);
|
|
29
|
+
}, g = (e) => {
|
|
30
|
+
l || (_ = _ + 1 >>> 0 || 1, t.push({ ...e, eventId: k(), seq: _ }), K(), N.has(e.event) ? (o && clearTimeout(o), o = void 0, H()) : c(m));
|
|
31
|
+
}, G = () => {
|
|
32
|
+
if (r) return r;
|
|
33
|
+
if (t.length === 0) return;
|
|
34
|
+
const e = [];
|
|
35
|
+
for (const s of t) {
|
|
36
|
+
if (e.length === M || e.length > 0 && L([...e, s]) > B) break;
|
|
37
|
+
e.push(s);
|
|
38
|
+
}
|
|
39
|
+
return t = t.slice(e.length), { events: e, firstAttempt: Date.now(), retries: 0 };
|
|
40
|
+
}, w = (e) => {
|
|
41
|
+
const s = { siteKey: n.siteKey, consentGiven: !0, events: e };
|
|
42
|
+
return E > 0 && (s.droppedAtUnload = E), s;
|
|
43
|
+
}, H = async () => {
|
|
44
|
+
if (y || l) return;
|
|
45
|
+
if (!j(n.siteKey)) {
|
|
46
|
+
t = [], r = void 0;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (typeof navigator < "u" && navigator.onLine === !1) return;
|
|
50
|
+
const e = G();
|
|
51
|
+
if (!e) return;
|
|
52
|
+
if (r = void 0, Date.now() - e.firstAttempt > z) {
|
|
53
|
+
t.length > 0 && c(m);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
y = !0;
|
|
57
|
+
const s = E;
|
|
58
|
+
try {
|
|
59
|
+
await W(n.endpoint, "RecordHelpEvents", w(e.events), u), E -= s;
|
|
60
|
+
} catch (f) {
|
|
61
|
+
const d = f instanceof q ? f : void 0, a = d?.status ?? 0;
|
|
62
|
+
if (d?.code === "failed_precondition")
|
|
63
|
+
l = !0, t = [];
|
|
64
|
+
else if (J(e.retries, a)) {
|
|
65
|
+
e.retries += 1, r = e, y = !1, c(Z(e.retries, d?.retryAfterMs, O));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
} finally {
|
|
69
|
+
y = !1;
|
|
70
|
+
}
|
|
71
|
+
!l && (t.length > 0 || r) && c(t.length >= M ? 0 : m);
|
|
72
|
+
}, R = () => {
|
|
73
|
+
if (l && t.length === 0 && !r || (o && clearTimeout(o), o = void 0, !j(n.siteKey))) return;
|
|
74
|
+
const e = [...r?.events ?? [], ...t];
|
|
75
|
+
if (e.length === 0) return;
|
|
76
|
+
const s = [...e.filter((a) => N.has(a.event)), ...e.filter((a) => !N.has(a.event))], f = Math.min(Q(), B), d = [];
|
|
77
|
+
for (const a of s) {
|
|
78
|
+
if (d.length === M || L(w([...d, a])) > f) break;
|
|
79
|
+
d.push(a);
|
|
80
|
+
}
|
|
81
|
+
d.length !== 0 && V(n.endpoint, "RecordHelpEvents", w(d), u) && (E += e.length - d.length, t = [], r = void 0);
|
|
82
|
+
};
|
|
83
|
+
let I = !1;
|
|
84
|
+
const S = () => {
|
|
85
|
+
I || (I = !0, R());
|
|
86
|
+
}, U = () => {
|
|
87
|
+
typeof document < "u" && document.visibilityState === "hidden" && S();
|
|
88
|
+
}, p = () => {
|
|
89
|
+
typeof document < "u" && document.visibilityState !== "visible" || (I = !1, (t.length > 0 || r) && c(0));
|
|
90
|
+
}, P = () => {
|
|
91
|
+
(t.length > 0 || r) && c(0);
|
|
92
|
+
}, b = () => {
|
|
93
|
+
i && !i.done && i.last !== void 0 && g({ event: `${h}GUIDE_ABANDONED`, ...T(i.guide, i.last) }), i = void 0, A = void 0;
|
|
94
|
+
}, X = (e) => {
|
|
95
|
+
const s = D;
|
|
96
|
+
if (D = e, s === void 0) return;
|
|
97
|
+
if (e.view === "disabled") {
|
|
98
|
+
l = !0, t = [];
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
s.view === "closed" && (e.view === "index" || e.view === "guide") && g({ event: `${h}HELP_OPENED`, entry: e.view === "index" ? "HELP_ENTRY_LAUNCHER" : "HELP_ENTRY_API" });
|
|
102
|
+
const f = e.view === "guide" || e.view === "finished" ? e.guide : void 0, d = e.view === "guide" ? e.journeyId : f?.journeyId;
|
|
103
|
+
if (i && d !== i.guide.journeyId && b(), e.view === "guide" && e.status === "ready" && e.guide) {
|
|
104
|
+
i || (i = { guide: e.guide, seen: /* @__PURE__ */ new Set(), done: !1 });
|
|
105
|
+
const v = e.guide.steps[e.step], x = v && `${e.guide.journeyId}/${e.step}`;
|
|
106
|
+
v && x !== A && (A = x, i.last = v.index, g({ event: `${h}${i.seen.has(v.index) ? "STEP_REPEATED" : "STEP_REACHED"}`, ...T(e.guide, v.index) }), i.seen.add(v.index));
|
|
107
|
+
} else e.view === "finished" && i && (i.done = !0, b());
|
|
108
|
+
const a = e.view === "index" && e.status === "ready" && e.query.trim() !== "" && e.results.length === 0;
|
|
109
|
+
a && !C && g({ event: `${h}SEARCH_NO_RESULT` }), C = a;
|
|
110
|
+
}, F = n.subscribe(X);
|
|
111
|
+
addEventListener("pagehide", S), addEventListener("visibilitychange", U), addEventListener("visibilitychange", p), addEventListener("pageshow", p), addEventListener("online", P);
|
|
112
|
+
const Y = () => {
|
|
113
|
+
removeEventListener("pagehide", S), removeEventListener("visibilitychange", U), removeEventListener("visibilitychange", p), removeEventListener("pageshow", p), removeEventListener("online", P);
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
checkin(e) {
|
|
117
|
+
g({ event: `${h}CHECKIN_ANSWERED`, ...T(e.guide, e.step.index), answer: e.answer === "confused" ? "CHECKIN_ANSWER_CONFUSED" : "CHECKIN_ANSWER_UNDERSTOOD" });
|
|
118
|
+
},
|
|
119
|
+
stop(e) {
|
|
120
|
+
if (F(), Y(), !l) {
|
|
121
|
+
if (e) {
|
|
122
|
+
t = [], r = void 0, o && clearTimeout(o), o = void 0, l = !0;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
b(), l = !0, R();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
te as FLUSH_MS,
|
|
132
|
+
M as MAX_BATCH,
|
|
133
|
+
B as MAX_BATCH_BYTES,
|
|
134
|
+
ie as MAX_FLUSH_MS,
|
|
135
|
+
$ as MAX_QUEUED,
|
|
136
|
+
re as MAX_QUEUED_BYTES,
|
|
137
|
+
ne as MIN_FLUSH_MS,
|
|
138
|
+
ee as gpcRefusesTelemetry,
|
|
139
|
+
le as startTelemetry
|
|
140
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { r as l, T as d, R as f } from "./consent-CoKD33Rm.js";
|
|
2
|
+
const E = 1e3, p = 5, y = 3, S = 55 * 6e4;
|
|
3
|
+
function h(e) {
|
|
4
|
+
return e === 0 || e === 408 || e === 429 || e === 500 || e === 502 || e === 503 || e === 504;
|
|
5
|
+
}
|
|
6
|
+
function _(e, n) {
|
|
7
|
+
return h(n) && e < (n === 0 ? y : p);
|
|
8
|
+
}
|
|
9
|
+
function T(e, n, o = Math.random) {
|
|
10
|
+
const t = Math.min(E * 2 ** Math.max(e - 1, 0), f) * (0.5 + o());
|
|
11
|
+
return Math.round(Math.max(Math.min(t, f), n ?? 0));
|
|
12
|
+
}
|
|
13
|
+
const m = 32 * 1024;
|
|
14
|
+
function v() {
|
|
15
|
+
try {
|
|
16
|
+
return typeof Request < "u" && "keepalive" in new Request("https://journeeze.invalid/", { method: "POST", keepalive: !0 });
|
|
17
|
+
} catch {
|
|
18
|
+
return !1;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let r = 0, u = !1;
|
|
22
|
+
function R() {
|
|
23
|
+
if (u || typeof addEventListener != "function") return;
|
|
24
|
+
u = !0;
|
|
25
|
+
const e = () => {
|
|
26
|
+
(typeof document > "u" || document.visibilityState === "visible") && (r = 0);
|
|
27
|
+
};
|
|
28
|
+
addEventListener("pageshow", e), addEventListener("visibilitychange", e);
|
|
29
|
+
}
|
|
30
|
+
function g() {
|
|
31
|
+
return R(), Math.max(m - r, 0);
|
|
32
|
+
}
|
|
33
|
+
function A(e, n, o, a = fetch) {
|
|
34
|
+
const t = JSON.stringify(o), i = new TextEncoder().encode(t).length;
|
|
35
|
+
if (i > g()) return !1;
|
|
36
|
+
const c = l(e, n);
|
|
37
|
+
if (v()) {
|
|
38
|
+
r += i;
|
|
39
|
+
try {
|
|
40
|
+
return a(c, { method: "POST", headers: { "content-type": d }, body: t, keepalive: !0, credentials: "omit", cache: "no-store", referrerPolicy: "no-referrer" }).catch(() => {
|
|
41
|
+
}), !0;
|
|
42
|
+
} catch {
|
|
43
|
+
return !1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (typeof navigator > "u" || typeof navigator.sendBeacon != "function") return !1;
|
|
47
|
+
const s = navigator.sendBeacon(c, new Blob([t], { type: d }));
|
|
48
|
+
return s && (r += i), s;
|
|
49
|
+
}
|
|
50
|
+
function b(e) {
|
|
51
|
+
return new TextEncoder().encode(JSON.stringify(e)).length;
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
S as M,
|
|
55
|
+
b as j,
|
|
56
|
+
_ as m,
|
|
57
|
+
g as p,
|
|
58
|
+
T as r,
|
|
59
|
+
A as s
|
|
60
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { JourneezeConfigV1, JourneezeContext } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* The collector base URL (contract §5): `endpoint` (deprecated, wins), else `apiHost` + `apiPath`,
|
|
4
|
+
* else the Journeeze collector itself (direct mode, the v1 default: C0a §5 "Change [J3c]", C0b §1).
|
|
5
|
+
* A v0 host that relied on its own same-origin proxy without `endpoint` must set
|
|
6
|
+
* `apiHost: location.origin`. `apiHost` is an https origin (http only for localhost/127.0.0.1)
|
|
7
|
+
* without path, query or fragment.
|
|
8
|
+
*/
|
|
9
|
+
export declare function collectorBase(config: Pick<JourneezeConfigV1, "endpoint" | "apiHost" | "apiPath">, page?: string): string;
|
|
10
|
+
/** The context fields the collector accepts (§3): an invalid value is dropped, never sent. */
|
|
11
|
+
export declare function checkContext(next: Readonly<JourneezeContext>): JourneezeContext;
|
|
12
|
+
/**
|
|
13
|
+
* The page path feedback carries (contract §3): {@link pagePath} with identifier-like segments
|
|
14
|
+
* replaced by `:id`, since they can name a person or a record. `pagePath: "none"` (Allumata review
|
|
15
|
+
* B7) drops it entirely, in the feedback channel.
|
|
16
|
+
*/
|
|
17
|
+
export declare function sentPath(href: string): string;
|