@levo-so/insights 0.3.10 → 0.3.12

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.
@@ -1,604 +0,0 @@
1
- import { atom as e, computed as t, map as n } from "nanostores";
2
- import { onUserActivity as r } from "@analytics/activity-utils";
3
- import { getLevoError as i } from "@levo-so/core";
4
- import { debounce as a } from "lodash-es";
5
- //#region src/stores/config.ts
6
- var o = n({
7
- workspace: null,
8
- page_id: null,
9
- site_id: null,
10
- debug: !1,
11
- insightsUrl: null
12
- }), s = () => o.get(), c = (e) => o.set({
13
- ...s(),
14
- ...e
15
- }), l = (e, t) => o.setKey(e, t), u = ({ deviceToken: e, sessionToken: t, mode: n }) => {
16
- let r = {};
17
- return n === "direct" && (e && (r["Levo-Audience-Device"] = e), t && (r["Levo-Audience-Session"] = t)), r;
18
- }, d = {
19
- identify: "lock:lv_aud_identify",
20
- open_tabs: "lv_insights_ot",
21
- current_tab: "lv_insights_ct",
22
- device_token: "lv_aud_device",
23
- session_token: "lv_aud_session",
24
- mode: "lv_aud_mode",
25
- session: "lv_insights_session",
26
- session_flags: "lv_insights_sf",
27
- attribution: "lv_insights_attr"
28
- }, f = () => {
29
- if (typeof window > "u" || !("localStorage" in window)) return !1;
30
- try {
31
- let e = "__levo_test__";
32
- return window.localStorage.setItem(e, "test"), window.localStorage.removeItem(e), !0;
33
- } catch {
34
- return !1;
35
- }
36
- }, p = {
37
- isIdentified: !1,
38
- isIdentifying: !1,
39
- sessionId: null,
40
- deviceId: null,
41
- deviceToken: null,
42
- sessionToken: null,
43
- mode: "proxy",
44
- insightsBaseUrl: null,
45
- identity: null
46
- }, m = JSON.stringify, h = (e) => {
47
- if (!e) return p;
48
- try {
49
- return JSON.parse(e);
50
- } catch {
51
- return p;
52
- }
53
- }, g = e(p), _ = g.set, v = e(!1), y = () => {
54
- v.get() || v.set(!0);
55
- };
56
- if (f()) {
57
- let e = () => {
58
- try {
59
- let e = sessionStorage.getItem(d.session_flags);
60
- if (!e) return { isIdentified: !1 };
61
- let t = JSON.parse(e);
62
- return t.v === 1 ? { isIdentified: t.isIdentified ?? !1 } : { isIdentified: !1 };
63
- } catch {
64
- return { isIdentified: !1 };
65
- }
66
- }, t = (e) => {
67
- try {
68
- sessionStorage.setItem(d.session_flags, m({
69
- v: 1,
70
- isIdentified: e
71
- }));
72
- } catch {}
73
- }, n = localStorage.getItem(d.session), r = e();
74
- _({
75
- ...p,
76
- ...h(n),
77
- isIdentified: r.isIdentified,
78
- isIdentifying: !1
79
- }), y(), g.set = (e) => {
80
- _(e);
81
- try {
82
- localStorage.setItem(d.session, m(e));
83
- } catch {}
84
- t(e.isIdentified);
85
- }, window.addEventListener("storage", (e) => {
86
- if (e.key === d.session) {
87
- let n = h(e.newValue);
88
- _(n), t(n.isIdentified);
89
- }
90
- });
91
- } else if (typeof BroadcastChannel < "u") {
92
- let e = new BroadcastChannel(d.session);
93
- e.onmessage = (t) => {
94
- let { type: n, value: r } = t.data;
95
- n === "UPDATE" && r ? _(r) : n === "QUERY" ? v.get() && e.postMessage({
96
- type: "RESPONSE",
97
- value: g.get()
98
- }) : n === "RESPONSE" && r && (_(r), y());
99
- }, g.set = (t) => {
100
- _(t), e.postMessage({
101
- type: "UPDATE",
102
- value: t
103
- });
104
- }, e.postMessage({ type: "QUERY" }), setTimeout(() => {
105
- y();
106
- }, 150);
107
- } else y();
108
- var b = () => g.get(), ee = (e) => {
109
- g.set({
110
- ...b(),
111
- ...e
112
- });
113
- }, te = 10, ne = 2e3, x = 1e3, S = e([]), C = e(0), w = t(S, (e) => e.length ?? 0), T = e(null), E = () => S.get(), re = () => w.get(), D = (e) => {
114
- let { workspace: t, debug: n, site_id: r } = s(), { isIdentified: i, mode: a, sessionId: o, deviceId: c, sessionToken: l, deviceToken: d, insightsBaseUrl: f } = b();
115
- if (e.length === 0 || !i || !f || !t) return;
116
- let p = e.map((e) => ({
117
- workspace_id: t,
118
- site_id: r ?? void 0,
119
- session_id: o ?? void 0,
120
- device_id: c ?? void 0,
121
- ...e
122
- }));
123
- if (S.set([]), n) {
124
- console.log("[@levo-so/insights] Debug mode enabled. Events batch:", p);
125
- return;
126
- }
127
- let m = new URLSearchParams({ workspace: t });
128
- a === "direct" && (d && m.set("device_token", d), l && m.set("session_token", l));
129
- let h = `${f}/v1/insights/event/bulk?${m.toString()}`;
130
- if (navigator.sendBeacon && navigator.sendBeacon(h, JSON.stringify(p))) return;
131
- let g = {
132
- "Content-Type": "application/json",
133
- ...u({
134
- deviceToken: d,
135
- sessionToken: l,
136
- mode: a
137
- })
138
- };
139
- fetch(h, {
140
- method: "POST",
141
- body: JSON.stringify(p),
142
- headers: g,
143
- keepalive: !0,
144
- credentials: a === "proxy" ? "include" : "omit"
145
- }).catch((e) => {
146
- console.warn("[@levo-so/insights] Event flush failed, batch lost:", e);
147
- });
148
- }, O = () => {
149
- if (T.get()) return;
150
- let e = setTimeout(() => {
151
- D(E()), T.set(null);
152
- }, ne);
153
- T.set(e);
154
- }, k = () => {
155
- let e = T.get();
156
- e && (clearTimeout(e), T.set(null));
157
- }, ie = (e) => {
158
- let { debug: t, insightsUrl: n } = s();
159
- if (!n) {
160
- t && console.warn("[@levo-so/insights] Event dropped — insightsUrl not configured.", {
161
- event: e.event,
162
- resource: e.resource
163
- });
164
- return;
165
- }
166
- let r = C.get();
167
- if (r >= x) {
168
- t && console.warn(`[@levo-so/core] Event limit (${x}) reached for this page`);
169
- return;
170
- }
171
- C.set(r + 1);
172
- let i = S.get();
173
- S.set([...i, e]);
174
- let { isIdentified: a } = b();
175
- re() >= te ? (k(), D(E())) : a && O();
176
- }, ae = () => C.set(0), oe = g.get().isIdentified;
177
- g.subscribe((e) => {
178
- e.isIdentified && !oe && S.get().length > 0 && (e.insightsBaseUrl ? D(E()) : O()), oe = e.isIdentified;
179
- });
180
- var se = g.get().insightsBaseUrl;
181
- g.subscribe((e) => {
182
- e.insightsBaseUrl && !se && e.isIdentified && S.get().length > 0 && D(E()), se = e.insightsBaseUrl;
183
- });
184
- var ce = () => {
185
- S.set([]), C.set(0), k();
186
- }, le = e(!1), A = e(!1), j = t([v, le], (e, t) => e && t), ue = t([j, A], (e, t) => e && t), M = n({
187
- status: "active",
188
- seconds: 0
189
- }), de = (e) => {
190
- if (typeof window > "u") return () => {};
191
- let t = r({
192
- timeout: 6e4,
193
- throttle: 1e3,
194
- onIdle: (e) => {
195
- M.set({
196
- status: "idle",
197
- seconds: e
198
- });
199
- },
200
- onWakeUp: (e) => {
201
- M.set({
202
- status: "active",
203
- seconds: e
204
- });
205
- }
206
- }), n = M.listen((t) => {
207
- t.seconds > 0 && (t.status === "idle" ? e.track("user.idle", { seconds_active: t.seconds }) : e.track("user.active", { seconds_idle: t.seconds }));
208
- });
209
- return () => {
210
- n(), t.disable(), M.set({
211
- status: "active",
212
- seconds: 0
213
- });
214
- };
215
- }, fe = () => M.get(), N = /* @__PURE__ */ function(e) {
216
- return e.ACTIVE = "active", e.PASSIVE = "passive", e.HIDDEN = "hidden", e.FROZEN = "frozen", e.TERMINATED = "terminated", e;
217
- }(N || {}), P = e(N.ACTIVE), pe = () => typeof document > "u" ? N.ACTIVE : document.visibilityState === "hidden" ? N.HIDDEN : document.hasFocus() ? N.ACTIVE : N.PASSIVE, me = (e) => {
218
- if (typeof window > "u") return () => {};
219
- let t = !1, n = (n) => {
220
- if (t) return;
221
- t = !0;
222
- let r = fe(), a = {};
223
- r.seconds > 0 && (r.status === "idle" ? a.seconds_active = r.seconds : a.seconds_idle = r.seconds);
224
- try {
225
- e.track("page.bounce", {
226
- resource: "page",
227
- ...a,
228
- ...n
229
- }, {}, () => D(E()));
230
- } catch (e) {
231
- console.error("[insights] Failed to send bounce event", i(e));
232
- }
233
- }, r = () => {
234
- let e = performance.getEntriesByType("navigation")?.[0], t = e?.type === "navigate";
235
- if (!t) try {
236
- let e = document.activeElement;
237
- e?.tagName === "A" && e.href && new URL(e.href).origin !== window.location.origin && (t = !0);
238
- } catch (e) {
239
- console.warn("[insights] Failed to parse link destination", i(e));
240
- }
241
- n({
242
- is_navigating_away: t,
243
- navigation_type: e?.type,
244
- trigger: "beforeunload"
245
- });
246
- }, a = (e) => {
247
- switch (e.type) {
248
- case "pageshow":
249
- case "resume":
250
- case "blur":
251
- case "focus":
252
- case "visibilitychange":
253
- P.set(pe());
254
- break;
255
- case "freeze":
256
- P.set(N.FROZEN);
257
- break;
258
- case "pagehide":
259
- P.set(e.persisted ? N.FROZEN : N.TERMINATED);
260
- break;
261
- }
262
- }, s = [
263
- "pageshow",
264
- "pagehide",
265
- "focus",
266
- "blur",
267
- "visibilitychange",
268
- "resume",
269
- "freeze"
270
- ];
271
- s.forEach((e) => {
272
- window.addEventListener(e, a, { capture: !0 });
273
- }), window.addEventListener("beforeunload", r);
274
- let c = P.listen((e) => {
275
- e === N.FROZEN || e === N.TERMINATED ? n({
276
- state: e,
277
- trigger: "lifecycle"
278
- }) : e === N.HIDDEN && D(E());
279
- }), l = o.get().page_id, u = o.listen((e) => {
280
- e.page_id !== l && (t = !1, l = e.page_id);
281
- }), d = C.listen((e) => {
282
- e === 0 && (t = !1);
283
- });
284
- return () => {
285
- s.forEach((e) => {
286
- window.removeEventListener(e, a, { capture: !0 });
287
- }), window.removeEventListener("beforeunload", r), c(), u(), d(), t = !1, P.set(N.ACTIVE);
288
- };
289
- }, F = (e) => Object.prototype.toString.call(e) == "[object String]", he = (e, t) => e.indexOf(t) !== -1, I = (e) => e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""), L = (e) => e === void 0, ge = (e) => e === null, R = (e) => L(e) || ge(e), z = (e) => !!e && e?.nodeType === 3;
290
- function _e(e) {
291
- return !!e && e?.nodeType === 1;
292
- }
293
- function ve(e, t) {
294
- return !!e && !!e?.tagName && e?.tagName.toLowerCase() === t.toLowerCase();
295
- }
296
- function ye(e) {
297
- return e ? I(e).split(/\s+/) : [];
298
- }
299
- function be(e) {
300
- let t = "";
301
- switch (typeof e?.className) {
302
- case "string":
303
- t = e?.className;
304
- break;
305
- case "object":
306
- t = (e?.className && "baseVal" in e.className ? (e?.className).baseVal : null) || e?.getAttribute("class") || "";
307
- break;
308
- default: t = "";
309
- }
310
- return ye(t);
311
- }
312
- var B = (e, t = 255) => R(e) ? "" : I(e).split(/(\s+)/).filter((e) => K(e)).join("").replace(/[\r\n]/g, " ").replace(/[ ]+/g, " ").substring(0, t), V = [
313
- "span",
314
- "strong",
315
- "em",
316
- "i",
317
- "b",
318
- "mark",
319
- "code",
320
- "small",
321
- "sub",
322
- "sup",
323
- "label"
324
- ], H = (e) => {
325
- let t = "";
326
- if (Ce(e) && e?.childNodes && e?.childNodes.length) {
327
- for (let n of e.childNodes) z(n) && n.textContent && (t += B(n.textContent) ?? "");
328
- if (!I(t)) {
329
- let n = e.querySelectorAll(V.join(", "));
330
- for (let e of n) {
331
- let n = e.textContent;
332
- n && (t += `${B(n)} `);
333
- }
334
- }
335
- if (!I(t) && e instanceof HTMLElement) {
336
- let n = e.innerText;
337
- n && (t = B(n.substring(0, 500)));
338
- }
339
- }
340
- return I(t);
341
- }, U = (e) => L(e.target) ? e?.srcElement || null : e?.composedPath?.()[0] || e?.target || null, xe = (e, t) => {
342
- if (!window || !e || ve(e, "html") || !_e(e)) return !1;
343
- let n = window.getComputedStyle(e);
344
- if (n && n.getPropertyValue("cursor") === "pointer" && t.type === "click") return !0;
345
- switch (e?.tagName.toLowerCase()) {
346
- case "html": return !1;
347
- case "form": return t.type === "submit";
348
- case "input":
349
- case "select":
350
- case "textarea": return ["change", "click"].includes(t.type);
351
- default: return t.type === "click";
352
- }
353
- }, Se = new Set([
354
- "password",
355
- "passwd",
356
- "pwd",
357
- "creditcard",
358
- "cardnumber",
359
- "ccnum",
360
- "ccnumber",
361
- "cvv",
362
- "cvc",
363
- "csc",
364
- "securitycode",
365
- "ssn",
366
- "socialsecurity",
367
- "routingnumber",
368
- "accountnumber",
369
- "bankaccount",
370
- "secretkey",
371
- "apikey",
372
- "accesstoken"
373
- ]);
374
- function Ce(e) {
375
- if (he(be(e), "ph-include")) return !0;
376
- let t = e.type || "";
377
- if (F(t)) switch (t.toLowerCase()) {
378
- case "hidden": return !1;
379
- case "password": return !1;
380
- }
381
- let n = e.name || e?.id || "";
382
- if (F(n)) {
383
- let e = n.toLowerCase().replace(/[^a-z]/g, "");
384
- if (Se.has(e)) return !1;
385
- }
386
- return !0;
387
- }
388
- var W = "(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11})", we = RegExp(`^(?:${W})$`), Te = new RegExp(W), G = "\\d{3}-?\\d{2}-?\\d{4}", Ee = RegExp(`^(${G})$`), De = RegExp(`(${G})`), K = (e, t = !0) => !(R(e) || F(e) && (e = I(e), (t ? we : Te).test((e || "").replace(/[- ]/g, "")) || (t ? Ee : De).test(e))), Oe = (e) => F(e) ? e.substring(0, 10) === "_ngcontent" || e.substring(0, 7) === "_nghost" : !1, ke = (e) => {
389
- let t = H(e);
390
- return t = `${t} ${q(e)}`.trim(), K(t) ? t : "";
391
- };
392
- function q(e) {
393
- let t = "";
394
- if (e?.childNodes.length) for (let n of e.childNodes) {
395
- let e = n.tagName?.toLowerCase();
396
- if (n && e && V.includes(e)) try {
397
- let e = H(n);
398
- t = `${t} ${e}`.trim(), n?.childNodes.length && (t = `${t} ${q(n)}`.trim());
399
- } catch {}
400
- }
401
- return t;
402
- }
403
- var Ae = (e) => {
404
- let t = e.tagName?.toLowerCase(), n = t === "a" || t === "button" ? ke(e) : H(e);
405
- if (n) return {
406
- text: n,
407
- source: "text"
408
- };
409
- let r = e.getAttribute("aria-label");
410
- if (r) return {
411
- text: B(r),
412
- source: "aria-label"
413
- };
414
- let i = e.getAttribute("title");
415
- if (i) return {
416
- text: B(i),
417
- source: "title"
418
- };
419
- let a = e.getAttribute("data-track-label");
420
- if (a) return {
421
- text: B(a),
422
- source: "data-track-label"
423
- };
424
- let o = e.querySelector("img[alt], svg[aria-label]");
425
- if (o) {
426
- let e = o.getAttribute("alt") || o.getAttribute("aria-label");
427
- if (e) return {
428
- text: B(e),
429
- source: "alt"
430
- };
431
- }
432
- let s = e.getAttribute("placeholder");
433
- if (s) return {
434
- text: B(s),
435
- source: "placeholder"
436
- };
437
- if (e instanceof HTMLElement && e.innerText) {
438
- let t = e.innerText.substring(0, 500);
439
- if (t.trim()) return {
440
- text: B(t),
441
- source: "innerText"
442
- };
443
- }
444
- return {
445
- text: "",
446
- source: "none"
447
- };
448
- }, je = [
449
- "input",
450
- "textarea",
451
- "select"
452
- ], J = (e) => {
453
- let t = e?.tagName?.toLowerCase(), n = { element: t }, r = Ae(e);
454
- n.text = r.text, n.text_source = r.source;
455
- let i = e.getAttribute("aria-label");
456
- i && (n.aria_label = B(i));
457
- let a = e.getAttribute("role");
458
- a && (n.role = a);
459
- let o = {};
460
- for (let t of e.attributes) (t.name.startsWith("data-track-") || t.name.startsWith("data-analytics-")) && (o[t.name] = B(t.value));
461
- if (Object.keys(o).length && (n.tracking_data = o), n.attributes = Array.from(e.attributes).reduce((e, t) => {
462
- if (K(t.value) && !Oe(t.name)) {
463
- if (t.name === "class" || t.name.startsWith("data-track-") || t.name.startsWith("data-analytics-")) return e;
464
- e[t.name] = typeof t?.value == "string" ? B(t.value) : t.value;
465
- }
466
- return e;
467
- }, {}), je.includes(t) || e?.getAttribute("contenteditable") === "true") {
468
- let t;
469
- e.matches("input[type=\"checkbox\"], input[type=\"radio\"]") ? t = e.checked : e.matches("input, select, textarea") && !e.matches("input[type=\"password\"]") && (t = e.value), t !== void 0 && (n.value = typeof t == "string" || t === null ? B(t, 1024) : t);
470
- let r = "";
471
- n?.attributes.id && (r = B(document.querySelector(`label[for="${n?.attributes.id}"]`)?.textContent?.trim() || ""));
472
- let i = e.closest("label");
473
- r ||= B(i?.textContent?.trim() || ""), r && (n.label = r);
474
- }
475
- return n;
476
- }, Me = (e, t) => {
477
- let n = U(e);
478
- z(n) && (n = n.parentNode || null);
479
- let r = ["copy", "cut"].includes(t);
480
- if (n && (r || xe(n, e))) {
481
- let t = J(n);
482
- if (r) {
483
- let n = B(window?.getSelection()?.toString()), r = e?.type || "clipboard";
484
- t.copy_text = n ?? "", t.copy_type = r ?? "";
485
- }
486
- return t;
487
- }
488
- return null;
489
- }, Y = e(null), Ne = 3e3, Pe = 1e4, Fe = `${d.open_tabs}:`, X = (e) => `${Fe}${e}`, Ie = (e) => {
490
- try {
491
- localStorage.setItem(X(e), String(Date.now()));
492
- } catch {}
493
- }, Z = (e) => {
494
- try {
495
- localStorage.removeItem(X(e));
496
- } catch {}
497
- }, Le = (e) => {
498
- try {
499
- let t = Number(localStorage.getItem(X(e)));
500
- return Number.isFinite(t) && Date.now() - t <= Pe;
501
- } catch {
502
- return !1;
503
- }
504
- }, Re = () => {
505
- try {
506
- let e = Date.now(), t = 0, n = [];
507
- for (let r = 0; r < localStorage.length; r++) {
508
- let i = localStorage.key(r);
509
- if (!i || !i.startsWith(Fe)) continue;
510
- let a = Number(localStorage.getItem(i));
511
- Number.isFinite(a) && e - a <= Pe ? t += 1 : n.push(i);
512
- }
513
- for (let e of n) try {
514
- localStorage.removeItem(e);
515
- } catch {}
516
- return Math.max(1, t);
517
- } catch {
518
- return 1;
519
- }
520
- }, ze = 1, Be = () => {
521
- ze = Re();
522
- }, Ve = (e) => {
523
- if (typeof window > "u") return () => {};
524
- let t = null;
525
- try {
526
- t = sessionStorage.getItem(d.current_tab);
527
- } catch {}
528
- if (t && Le(t) && (t = null), !t) {
529
- t = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
530
- try {
531
- sessionStorage.setItem(d.current_tab, t);
532
- } catch {}
533
- }
534
- let n = t;
535
- Y.set(n), Ie(n), Be();
536
- let r = window.setInterval(() => {
537
- Ie(n), Be();
538
- }, Ne), i = (e) => {
539
- e.persisted || Z(n);
540
- };
541
- return window.addEventListener("beforeunload", i), window.addEventListener("pagehide", i), () => {
542
- window.clearInterval(r), window.removeEventListener("beforeunload", i), window.removeEventListener("pagehide", i), Z(n), Y.set(null);
543
- };
544
- }, He = () => Y.get(), Ue = () => ze, Q = n({
545
- depth: 0,
546
- milestone: 0,
547
- speedCategory: "read",
548
- direction: "down"
549
- }), We = (e) => {
550
- if (typeof window > "u") return () => {};
551
- let t = {
552
- prevMilestone: -1,
553
- prevScrollY: 0,
554
- prevTime: Date.now()
555
- }, n = () => {
556
- let e = window.scrollY, n = document.documentElement.scrollHeight - window.innerHeight;
557
- if (n <= 0) return;
558
- let r = Math.round(e / n * 100), i = Math.max(0, Math.min(100, r)), a = Math.floor(i / 5) * 5, { prevScrollY: o, prevTime: s } = t, c = Date.now(), l = (c - s) / 1e3, u = Math.abs(e - o), d = l > 0 ? u / l : 0, f = i > t.prevScrollY / n * 100 ? "down" : "up", p = d > 300 ? "scan" : "read";
559
- Q.set({
560
- depth: i,
561
- milestone: a,
562
- speedCategory: p,
563
- direction: f
564
- }), t = {
565
- prevMilestone: a,
566
- prevScrollY: e,
567
- prevTime: c
568
- };
569
- }, r = a(n, 250);
570
- window.addEventListener("scroll", r);
571
- let i = 0, o = Q.listen((t) => {
572
- t.milestone !== i && (i = t.milestone, e.track("page.scroll", {
573
- depth: t.milestone,
574
- speed_category: t.speedCategory,
575
- direction: t.direction
576
- }));
577
- });
578
- return typeof window.requestIdleCallback == "function" ? window.requestIdleCallback(() => n()) : setTimeout(n, 0), () => {
579
- window.removeEventListener("scroll", r), r.cancel(), o(), Q.set({
580
- depth: 0,
581
- milestone: 0,
582
- speedCategory: "read",
583
- direction: "down"
584
- });
585
- };
586
- }, $ = e(null), Ge = (e) => {
587
- if (typeof window > "u") return () => {};
588
- let t = a(() => {
589
- let e = window.getSelection();
590
- if (e && e.rangeCount > 0) {
591
- let t = e.toString().trim();
592
- t && $.set(t);
593
- }
594
- }, 1e3);
595
- document.addEventListener("selectionchange", t);
596
- let n = $.listen((t) => {
597
- t && e.track("page.selection", { text: B(t) });
598
- });
599
- return () => {
600
- document.removeEventListener("selectionchange", t), t.cancel(), n(), $.set(null);
601
- };
602
- };
603
- //#endregion
604
- export { b as A, ce as C, ae as D, ie as E, s as F, c as I, l as L, d as M, u as N, v as O, o as P, w as S, E as T, j as _, Y as a, S as b, Ve as c, Me as d, P as f, A as g, de as h, We as i, ee as j, g as k, J as l, M as m, Ge as n, He as o, me as p, Q as r, Ue as s, $ as t, U as u, le as v, D as w, C as x, ue as y };
@@ -1,4 +0,0 @@
1
- /**
2
- * Ping an endpoint to check if it's reachable.
3
- */
4
- export declare const pingEndpoint: (url: string, timeout: number) => Promise<boolean>;