solo-analytics 0.1.1 → 0.3.0
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/README.md +73 -344
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +125 -0
- package/dist/index.d.ts +125 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -22
- package/dist/solo-analytics.js +0 -442
- package/dist/solo-analytics.js.map +0 -1
- package/dist/solo-analytics.umd.cjs +0 -2
- package/dist/solo-analytics.umd.cjs.map +0 -1
- package/dist/vite.svg +0 -1
package/dist/solo-analytics.js
DELETED
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
function x(e) {
|
|
2
|
-
const r = () => {
|
|
3
|
-
const t = [
|
|
4
|
-
{ name: "Edge", regex: /Edg(?:e|A|iOS)\/([0-9\.]+)/ },
|
|
5
|
-
{ name: "Samsung Browser", regex: /SamsungBrowser\/([0-9\.]+)/ },
|
|
6
|
-
{ name: "Opera", regex: /(?:Opera|OPR)\/([0-9\.]+)/ },
|
|
7
|
-
{ name: "Firefox", regex: /Firefox\/([0-9\.]+)/ },
|
|
8
|
-
{ name: "Chrome", regex: /Chrome\/([0-9\.]+)/ },
|
|
9
|
-
{ name: "Safari", regex: /Version\/([0-9\.]+).*Safari/ },
|
|
10
|
-
{ name: "IE", regex: /MSIE|Trident/ }
|
|
11
|
-
];
|
|
12
|
-
for (const o of t) {
|
|
13
|
-
const i = e.match(o.regex);
|
|
14
|
-
if (i) {
|
|
15
|
-
const a = i[1] || "", s = a.split(".")[0] || "";
|
|
16
|
-
let l = "Unknown", f = "";
|
|
17
|
-
if (e.includes("AppleWebKit")) {
|
|
18
|
-
const d = e.match(/AppleWebKit\/([0-9\.]+)/);
|
|
19
|
-
l = "WebKit", f = d ? d[1] : "";
|
|
20
|
-
} else if (e.includes("Gecko")) {
|
|
21
|
-
l = "Gecko";
|
|
22
|
-
const d = e.match(/rv:([0-9\.]+)/);
|
|
23
|
-
f = d ? d[1] : "";
|
|
24
|
-
} else if (e.includes("Trident")) {
|
|
25
|
-
l = "Trident";
|
|
26
|
-
const d = e.match(/Trident\/([0-9\.]+)/);
|
|
27
|
-
f = d ? d[1] : "";
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
name: o.name,
|
|
31
|
-
version: a,
|
|
32
|
-
major: s,
|
|
33
|
-
userAgent: e,
|
|
34
|
-
vendor: navigator.vendor || "",
|
|
35
|
-
engine: l,
|
|
36
|
-
engineVersion: f
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return {
|
|
41
|
-
name: "Unknown",
|
|
42
|
-
version: "",
|
|
43
|
-
major: "",
|
|
44
|
-
userAgent: e,
|
|
45
|
-
vendor: navigator.vendor || "",
|
|
46
|
-
engine: "Unknown",
|
|
47
|
-
engineVersion: ""
|
|
48
|
-
};
|
|
49
|
-
}, c = () => {
|
|
50
|
-
const t = [
|
|
51
|
-
{ name: "iOS", regex: /iPhone|iPad|iPod/ },
|
|
52
|
-
{ name: "Android", regex: /Android ([0-9\.]+)/ },
|
|
53
|
-
{ name: "Windows", regex: /Windows NT ([0-9\.]+)/ },
|
|
54
|
-
{ name: "macOS", regex: /Mac OS X ([0-9_\.]+)/ },
|
|
55
|
-
{ name: "Linux", regex: /Linux/ }
|
|
56
|
-
];
|
|
57
|
-
for (const o of t) {
|
|
58
|
-
const i = e.match(o.regex);
|
|
59
|
-
if (i) {
|
|
60
|
-
let a = "";
|
|
61
|
-
return i[1] && (a = o.name === "macOS" ? i[1].replace(/_/g, ".") : i[1]), {
|
|
62
|
-
name: o.name,
|
|
63
|
-
version: a,
|
|
64
|
-
architecture: e.includes("x64") || e.includes("x86_64") ? "64-bit" : "32-bit"
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
name: "Unknown",
|
|
70
|
-
version: "",
|
|
71
|
-
architecture: e.includes("x64") || e.includes("x86_64") ? "64-bit" : "32-bit"
|
|
72
|
-
};
|
|
73
|
-
}, n = () => {
|
|
74
|
-
const t = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e), o = /iPad|Android(?!.*Mobile)/i.test(e);
|
|
75
|
-
let i = "Unknown", a = "Unknown";
|
|
76
|
-
if (e.includes("iPhone") || e.includes("iPad") || e.includes("iPod"))
|
|
77
|
-
i = "Apple", e.includes("iPhone") && (a = "iPhone"), e.includes("iPad") && (a = "iPad"), e.includes("iPod") && (a = "iPod");
|
|
78
|
-
else if (e.includes("Samsung"))
|
|
79
|
-
i = "Samsung";
|
|
80
|
-
else if (e.includes("Pixel")) {
|
|
81
|
-
i = "Google";
|
|
82
|
-
const l = e.match(/Pixel ([0-9XL]+)/);
|
|
83
|
-
l && (a = `Pixel ${l[1]}`);
|
|
84
|
-
}
|
|
85
|
-
const s = o ? "tablet" : t ? "mobile" : "desktop";
|
|
86
|
-
return {
|
|
87
|
-
type: s,
|
|
88
|
-
vendor: i,
|
|
89
|
-
model: a,
|
|
90
|
-
orientation: typeof window < "u" && window.innerHeight > window.innerWidth ? "portrait" : "landscape",
|
|
91
|
-
isMobile: s === "mobile",
|
|
92
|
-
isTablet: s === "tablet",
|
|
93
|
-
isDesktop: s === "desktop",
|
|
94
|
-
touch: typeof navigator < "u" && "maxTouchPoints" in navigator ? navigator.maxTouchPoints > 0 : !1
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
|
-
return {
|
|
98
|
-
browser: r(),
|
|
99
|
-
os: c(),
|
|
100
|
-
device: n()
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
function I() {
|
|
104
|
-
const e = () => !window.performance || !window.performance.navigation ? { type: "Unknown", redirectCount: 0 } : {
|
|
105
|
-
type: ["navigate", "reload", "back_forward", "prerender"][window.performance.navigation.type] || "Unknown",
|
|
106
|
-
redirectCount: window.performance.navigation.redirectCount
|
|
107
|
-
}, r = () => {
|
|
108
|
-
if (!window.performance || !window.performance.timing)
|
|
109
|
-
return {
|
|
110
|
-
loadTime: 0,
|
|
111
|
-
domContentLoaded: 0,
|
|
112
|
-
firstPaint: null,
|
|
113
|
-
firstContentfulPaint: null
|
|
114
|
-
};
|
|
115
|
-
const n = window.performance.timing, t = n.loadEventEnd - n.navigationStart, o = n.domContentLoadedEventEnd - n.navigationStart;
|
|
116
|
-
let i = null, a = null;
|
|
117
|
-
if (window.performance && typeof window.performance.getEntriesByType == "function") {
|
|
118
|
-
const s = window.performance.getEntriesByType("paint"), l = s.find((d) => d.name === "first-paint"), f = s.find((d) => d.name === "first-contentful-paint");
|
|
119
|
-
l && (i = l.startTime), f && (a = f.startTime);
|
|
120
|
-
}
|
|
121
|
-
return {
|
|
122
|
-
loadTime: t,
|
|
123
|
-
domContentLoaded: o,
|
|
124
|
-
firstPaint: i,
|
|
125
|
-
firstContentfulPaint: a
|
|
126
|
-
};
|
|
127
|
-
};
|
|
128
|
-
return {
|
|
129
|
-
memory: (() => {
|
|
130
|
-
if (window.performance && window.performance.memory) {
|
|
131
|
-
const n = window.performance.memory;
|
|
132
|
-
return {
|
|
133
|
-
jsHeapSizeLimit: n.jsHeapSizeLimit,
|
|
134
|
-
totalJSHeapSize: n.totalJSHeapSize,
|
|
135
|
-
usedJSHeapSize: n.usedJSHeapSize
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
return null;
|
|
139
|
-
})(),
|
|
140
|
-
navigation: e(),
|
|
141
|
-
timing: r()
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
function C() {
|
|
145
|
-
const e = typeof navigator < "u" ? navigator.onLine : !1;
|
|
146
|
-
let r = "unknown", c = 0, n = 0, t = !1;
|
|
147
|
-
if (navigator && navigator.connection) {
|
|
148
|
-
const o = navigator.connection;
|
|
149
|
-
r = o.effectiveType || r, c = o.downlink || c, n = o.rtt || n, t = o.saveData || t;
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
online: e,
|
|
153
|
-
effectiveType: r,
|
|
154
|
-
downlink: c,
|
|
155
|
-
rtt: n,
|
|
156
|
-
saveData: t
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
function D() {
|
|
160
|
-
if (typeof window > "u" || typeof screen > "u")
|
|
161
|
-
return {
|
|
162
|
-
width: 0,
|
|
163
|
-
height: 0,
|
|
164
|
-
availWidth: 0,
|
|
165
|
-
availHeight: 0,
|
|
166
|
-
colorDepth: 0,
|
|
167
|
-
orientation: "unknown",
|
|
168
|
-
pixelRatio: 1,
|
|
169
|
-
touchPoints: 0
|
|
170
|
-
};
|
|
171
|
-
let e = "unknown";
|
|
172
|
-
window.innerHeight > window.innerWidth ? e = "portrait" : e = "landscape", screen.orientation && screen.orientation.type && (e = screen.orientation.type);
|
|
173
|
-
const r = window.devicePixelRatio || 1, c = navigator.maxTouchPoints || 0;
|
|
174
|
-
return {
|
|
175
|
-
width: screen.width,
|
|
176
|
-
height: screen.height,
|
|
177
|
-
availWidth: screen.availWidth,
|
|
178
|
-
availHeight: screen.availHeight,
|
|
179
|
-
colorDepth: screen.colorDepth,
|
|
180
|
-
orientation: e,
|
|
181
|
-
pixelRatio: r,
|
|
182
|
-
touchPoints: c
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
function M() {
|
|
186
|
-
if (typeof window > "u" || typeof navigator > "u")
|
|
187
|
-
return {
|
|
188
|
-
timeZone: "",
|
|
189
|
-
language: "",
|
|
190
|
-
languages: [],
|
|
191
|
-
isRestricted: !1,
|
|
192
|
-
doNotTrack: null,
|
|
193
|
-
cookiesEnabled: !1,
|
|
194
|
-
localStorage: !1,
|
|
195
|
-
sessionStorage: !1
|
|
196
|
-
};
|
|
197
|
-
const e = Intl.DateTimeFormat().resolvedOptions().timeZone, r = navigator.language || "", c = navigator.languages ? Array.from(navigator.languages) : [r];
|
|
198
|
-
let n = !1;
|
|
199
|
-
try {
|
|
200
|
-
n = window.self !== window.top;
|
|
201
|
-
} catch {
|
|
202
|
-
n = !0;
|
|
203
|
-
}
|
|
204
|
-
let t = null;
|
|
205
|
-
navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" ? t = !0 : (navigator.doNotTrack === "0" || navigator.doNotTrack === "no") && (t = !1);
|
|
206
|
-
const o = navigator.cookieEnabled, i = (a) => {
|
|
207
|
-
try {
|
|
208
|
-
const s = window[a], l = `__test_${a}__`;
|
|
209
|
-
return s.setItem(l, "test"), s.removeItem(l), !0;
|
|
210
|
-
} catch {
|
|
211
|
-
return !1;
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
return {
|
|
215
|
-
timeZone: e,
|
|
216
|
-
language: r,
|
|
217
|
-
languages: c,
|
|
218
|
-
isRestricted: n,
|
|
219
|
-
doNotTrack: t,
|
|
220
|
-
cookiesEnabled: o,
|
|
221
|
-
localStorage: i("localStorage"),
|
|
222
|
-
sessionStorage: i("sessionStorage")
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
async function E() {
|
|
226
|
-
return new Promise((e) => {
|
|
227
|
-
if (typeof window > "u") {
|
|
228
|
-
e(!1);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
const r = indexedDB.open("test");
|
|
232
|
-
r.onerror = () => e(!0), r.onsuccess = () => e(!1), setTimeout(() => e(!1), 1e3);
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
async function L() {
|
|
236
|
-
if (typeof navigator > "u" || !navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices)
|
|
237
|
-
return { hasCamera: null, hasMicrophone: null };
|
|
238
|
-
try {
|
|
239
|
-
const e = await navigator.mediaDevices.enumerateDevices(), r = e.some((n) => n.kind === "videoinput"), c = e.some((n) => n.kind === "audioinput");
|
|
240
|
-
return { hasCamera: r, hasMicrophone: c };
|
|
241
|
-
} catch {
|
|
242
|
-
return { hasCamera: null, hasMicrophone: null };
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
async function A() {
|
|
246
|
-
if (typeof navigator > "u" || !navigator.getBattery)
|
|
247
|
-
return { hasBattery: null, level: null, charging: null };
|
|
248
|
-
try {
|
|
249
|
-
const e = await navigator.getBattery();
|
|
250
|
-
return {
|
|
251
|
-
hasBattery: !0,
|
|
252
|
-
level: e.level,
|
|
253
|
-
charging: e.charging
|
|
254
|
-
};
|
|
255
|
-
} catch {
|
|
256
|
-
return { hasBattery: null, level: null, charging: null };
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
async function B() {
|
|
260
|
-
if (typeof navigator > "u" || !navigator.permissions || !navigator.permissions.query)
|
|
261
|
-
return {};
|
|
262
|
-
const e = {}, r = [
|
|
263
|
-
"geolocation",
|
|
264
|
-
"notifications",
|
|
265
|
-
"push",
|
|
266
|
-
"midi",
|
|
267
|
-
"camera",
|
|
268
|
-
"microphone",
|
|
269
|
-
"background-sync",
|
|
270
|
-
"accelerometer",
|
|
271
|
-
"gyroscope",
|
|
272
|
-
"magnetometer"
|
|
273
|
-
], c = async (n) => {
|
|
274
|
-
try {
|
|
275
|
-
return (await navigator.permissions.query({ name: n })).state;
|
|
276
|
-
} catch {
|
|
277
|
-
return "not-supported";
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
for (const n of r)
|
|
281
|
-
e[n] = await c(n);
|
|
282
|
-
return e;
|
|
283
|
-
}
|
|
284
|
-
function O(e = {}) {
|
|
285
|
-
const {
|
|
286
|
-
autoRefresh: r = !1,
|
|
287
|
-
refreshInterval: c = 3e4,
|
|
288
|
-
// 30 seconds
|
|
289
|
-
trackVisibility: n = !0
|
|
290
|
-
} = e, t = {
|
|
291
|
-
browser: {
|
|
292
|
-
name: "",
|
|
293
|
-
version: "",
|
|
294
|
-
major: "",
|
|
295
|
-
userAgent: "",
|
|
296
|
-
vendor: "",
|
|
297
|
-
engine: "",
|
|
298
|
-
engineVersion: ""
|
|
299
|
-
},
|
|
300
|
-
os: {
|
|
301
|
-
name: "",
|
|
302
|
-
version: "",
|
|
303
|
-
architecture: ""
|
|
304
|
-
},
|
|
305
|
-
device: {
|
|
306
|
-
type: "unknown",
|
|
307
|
-
vendor: "",
|
|
308
|
-
model: "",
|
|
309
|
-
orientation: "portrait",
|
|
310
|
-
isMobile: !1,
|
|
311
|
-
isTablet: !1,
|
|
312
|
-
isDesktop: !1,
|
|
313
|
-
touch: !1
|
|
314
|
-
},
|
|
315
|
-
network: {
|
|
316
|
-
online: !1,
|
|
317
|
-
effectiveType: "",
|
|
318
|
-
downlink: 0,
|
|
319
|
-
rtt: 0,
|
|
320
|
-
saveData: !1
|
|
321
|
-
},
|
|
322
|
-
screen: {
|
|
323
|
-
width: 0,
|
|
324
|
-
height: 0,
|
|
325
|
-
availWidth: 0,
|
|
326
|
-
availHeight: 0,
|
|
327
|
-
colorDepth: 0,
|
|
328
|
-
orientation: "",
|
|
329
|
-
pixelRatio: 1,
|
|
330
|
-
touchPoints: 0
|
|
331
|
-
},
|
|
332
|
-
performance: {
|
|
333
|
-
memory: null,
|
|
334
|
-
navigation: {
|
|
335
|
-
type: "",
|
|
336
|
-
redirectCount: 0
|
|
337
|
-
},
|
|
338
|
-
timing: {
|
|
339
|
-
loadTime: 0,
|
|
340
|
-
domContentLoaded: 0,
|
|
341
|
-
firstPaint: null,
|
|
342
|
-
firstContentfulPaint: null
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
location: {
|
|
346
|
-
timeZone: "",
|
|
347
|
-
language: "",
|
|
348
|
-
languages: [],
|
|
349
|
-
isRestricted: !1,
|
|
350
|
-
doNotTrack: null,
|
|
351
|
-
cookiesEnabled: !1,
|
|
352
|
-
localStorage: !1,
|
|
353
|
-
sessionStorage: !1
|
|
354
|
-
},
|
|
355
|
-
pageVisibility: "visible",
|
|
356
|
-
referrer: "",
|
|
357
|
-
isIncognito: !1,
|
|
358
|
-
hasCamera: null,
|
|
359
|
-
hasMicrophone: null,
|
|
360
|
-
hasBattery: null,
|
|
361
|
-
batteryLevel: null,
|
|
362
|
-
batteryCharging: null,
|
|
363
|
-
permissions: {}
|
|
364
|
-
};
|
|
365
|
-
let o = null, i = null;
|
|
366
|
-
const a = async () => {
|
|
367
|
-
if (typeof navigator > "u" || typeof window > "u")
|
|
368
|
-
return;
|
|
369
|
-
const g = navigator.userAgent, { browser: u, os: m, device: p } = x(g), v = D(), h = M(), w = await E(), { hasCamera: y, hasMicrophone: b } = await L(), { hasBattery: k, level: S, charging: T } = await A(), P = await B();
|
|
370
|
-
Object.assign(t, {
|
|
371
|
-
browser: u,
|
|
372
|
-
os: m,
|
|
373
|
-
device: p,
|
|
374
|
-
screen: v,
|
|
375
|
-
location: h,
|
|
376
|
-
referrer: document.referrer,
|
|
377
|
-
isIncognito: w,
|
|
378
|
-
hasCamera: y,
|
|
379
|
-
hasMicrophone: b,
|
|
380
|
-
hasBattery: k,
|
|
381
|
-
batteryLevel: S,
|
|
382
|
-
batteryCharging: T,
|
|
383
|
-
permissions: P
|
|
384
|
-
});
|
|
385
|
-
}, s = () => {
|
|
386
|
-
if (typeof navigator > "u" || typeof window > "u")
|
|
387
|
-
return;
|
|
388
|
-
const g = C(), u = I();
|
|
389
|
-
Object.assign(t, {
|
|
390
|
-
network: g,
|
|
391
|
-
performance: u,
|
|
392
|
-
pageVisibility: document.visibilityState === "visible" ? "visible" : "hidden"
|
|
393
|
-
});
|
|
394
|
-
};
|
|
395
|
-
if (n && typeof document < "u") {
|
|
396
|
-
const g = () => {
|
|
397
|
-
t.pageVisibility = document.visibilityState === "visible" ? "visible" : "hidden";
|
|
398
|
-
};
|
|
399
|
-
document.addEventListener && (document.addEventListener("visibilitychange", g), o = g);
|
|
400
|
-
}
|
|
401
|
-
return r && typeof window < "u" && (i = window.setInterval(() => {
|
|
402
|
-
s();
|
|
403
|
-
}, c)), (async () => {
|
|
404
|
-
await a(), s();
|
|
405
|
-
})(), {
|
|
406
|
-
// Full analytics data
|
|
407
|
-
data: t,
|
|
408
|
-
// Utility methods
|
|
409
|
-
refresh: async () => {
|
|
410
|
-
await a(), s();
|
|
411
|
-
},
|
|
412
|
-
destroy: () => {
|
|
413
|
-
i !== null && (clearInterval(i), i = null), o && typeof document < "u" && (document.removeEventListener("visibilitychange", o), o = null);
|
|
414
|
-
},
|
|
415
|
-
// Common properties for quick access
|
|
416
|
-
get isMobile() {
|
|
417
|
-
return t.device.isMobile;
|
|
418
|
-
},
|
|
419
|
-
get isTablet() {
|
|
420
|
-
return t.device.isTablet;
|
|
421
|
-
},
|
|
422
|
-
get isDesktop() {
|
|
423
|
-
return t.device.isDesktop;
|
|
424
|
-
},
|
|
425
|
-
get isOnline() {
|
|
426
|
-
return t.network.online;
|
|
427
|
-
},
|
|
428
|
-
get isVisible() {
|
|
429
|
-
return t.pageVisibility === "visible";
|
|
430
|
-
},
|
|
431
|
-
get browserName() {
|
|
432
|
-
return t.browser.name;
|
|
433
|
-
},
|
|
434
|
-
get osName() {
|
|
435
|
-
return t.os.name;
|
|
436
|
-
}
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
|
-
export {
|
|
440
|
-
O as useSoloAnalytics
|
|
441
|
-
};
|
|
442
|
-
//# sourceMappingURL=solo-analytics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"solo-analytics.js","sources":["../src/utils/parseUserAgent.ts","../src/utils/performance.ts","../src/utils/network.ts","../src/utils/screen.ts","../src/utils/location.ts","../src/utils/features.ts","../src/composables/useSoloAnalytics.ts"],"sourcesContent":["import { BrowserInfo, OSInfo, DeviceInfo } from '../types/analytics';\n\n/**\n * Parses the user agent string and returns detailed information about browser, OS, and device\n */\nexport function parseUserAgent(ua: string): {\n browser: BrowserInfo;\n os: OSInfo;\n device: DeviceInfo;\n} {\n // Browser detection\n const getBrowser = (): BrowserInfo => {\n const browsers = [\n { name: 'Edge', regex: /Edg(?:e|A|iOS)\\/([0-9\\.]+)/ },\n { name: 'Samsung Browser', regex: /SamsungBrowser\\/([0-9\\.]+)/ },\n { name: 'Opera', regex: /(?:Opera|OPR)\\/([0-9\\.]+)/ },\n { name: 'Firefox', regex: /Firefox\\/([0-9\\.]+)/ },\n { name: 'Chrome', regex: /Chrome\\/([0-9\\.]+)/ },\n { name: 'Safari', regex: /Version\\/([0-9\\.]+).*Safari/ },\n { name: 'IE', regex: /MSIE|Trident/ }\n ];\n\n for (const browser of browsers) {\n const match = ua.match(browser.regex);\n if (match) {\n const version = match[1] || '';\n const major = version.split('.')[0] || '';\n\n // Engine detection\n let engine = 'Unknown';\n let engineVersion = '';\n \n if (ua.includes('AppleWebKit')) {\n const webkitMatch = ua.match(/AppleWebKit\\/([0-9\\.]+)/);\n engine = 'WebKit';\n engineVersion = webkitMatch ? webkitMatch[1] : '';\n } else if (ua.includes('Gecko')) {\n engine = 'Gecko';\n const geckoMatch = ua.match(/rv:([0-9\\.]+)/);\n engineVersion = geckoMatch ? geckoMatch[1] : '';\n } else if (ua.includes('Trident')) {\n engine = 'Trident';\n const tridentMatch = ua.match(/Trident\\/([0-9\\.]+)/);\n engineVersion = tridentMatch ? tridentMatch[1] : '';\n }\n \n return {\n name: browser.name,\n version,\n major,\n userAgent: ua,\n vendor: navigator.vendor || '',\n engine,\n engineVersion\n };\n }\n }\n\n return {\n name: 'Unknown',\n version: '',\n major: '',\n userAgent: ua,\n vendor: navigator.vendor || '',\n engine: 'Unknown',\n engineVersion: ''\n };\n };\n\n // OS detection\n const getOS = (): OSInfo => {\n const osMatchers = [\n { name: 'iOS', regex: /iPhone|iPad|iPod/ },\n { name: 'Android', regex: /Android ([0-9\\.]+)/ },\n { name: 'Windows', regex: /Windows NT ([0-9\\.]+)/ },\n { name: 'macOS', regex: /Mac OS X ([0-9_\\.]+)/ },\n { name: 'Linux', regex: /Linux/ }\n ];\n\n for (const os of osMatchers) {\n const match = ua.match(os.regex);\n if (match) {\n let version = '';\n if (match[1]) {\n version = os.name === 'macOS' \n ? match[1].replace(/_/g, '.') \n : match[1];\n }\n \n return {\n name: os.name,\n version,\n architecture: ua.includes('x64') || ua.includes('x86_64') ? '64-bit' : '32-bit'\n };\n }\n }\n\n return {\n name: 'Unknown',\n version: '',\n architecture: ua.includes('x64') || ua.includes('x86_64') ? '64-bit' : '32-bit'\n };\n };\n\n // Device detection\n const getDevice = (): DeviceInfo => {\n const isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);\n const isTablet = /iPad|Android(?!.*Mobile)/i.test(ua);\n \n let vendor = 'Unknown';\n let model = 'Unknown';\n \n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) {\n vendor = 'Apple';\n if (ua.includes('iPhone')) model = 'iPhone';\n if (ua.includes('iPad')) model = 'iPad';\n if (ua.includes('iPod')) model = 'iPod';\n } else if (ua.includes('Samsung')) {\n vendor = 'Samsung';\n } else if (ua.includes('Pixel')) {\n vendor = 'Google';\n const pixelMatch = ua.match(/Pixel ([0-9XL]+)/);\n if (pixelMatch) model = `Pixel ${pixelMatch[1]}`;\n }\n \n const deviceType = isTablet ? 'tablet' : (isMobileDevice ? 'mobile' : 'desktop');\n \n return {\n type: deviceType,\n vendor,\n model,\n orientation: typeof window !== 'undefined' && window.innerHeight > window.innerWidth ? 'portrait' : 'landscape',\n isMobile: deviceType === 'mobile',\n isTablet: deviceType === 'tablet',\n isDesktop: deviceType === 'desktop',\n touch: typeof navigator !== 'undefined' && 'maxTouchPoints' in navigator ? navigator.maxTouchPoints > 0 : false\n };\n };\n\n return {\n browser: getBrowser(),\n os: getOS(),\n device: getDevice()\n };\n}","import { PerformanceInfo } from '../types/analytics';\n\n/**\n * Collects performance metrics from browser APIs\n */\nexport function getPerformanceInfo(): PerformanceInfo {\n const getNavigationInfo = () => {\n if (!window.performance || !window.performance.navigation) {\n return { type: 'Unknown', redirectCount: 0 };\n }\n \n const navTypes = ['navigate', 'reload', 'back_forward', 'prerender'];\n const navType = navTypes[window.performance.navigation.type] || 'Unknown';\n \n return {\n type: navType,\n redirectCount: window.performance.navigation.redirectCount\n };\n };\n\n const getTimingInfo = () => {\n if (!window.performance || !window.performance.timing) {\n return {\n loadTime: 0,\n domContentLoaded: 0,\n firstPaint: null,\n firstContentfulPaint: null\n };\n }\n\n const timing = window.performance.timing;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domContentLoaded = timing.domContentLoadedEventEnd - timing.navigationStart;\n\n // Get first paint and first contentful paint\n let firstPaint = null;\n let firstContentfulPaint = null;\n\n if (window.performance && typeof window.performance.getEntriesByType === 'function') {\n const paintMetrics = window.performance.getEntriesByType('paint');\n \n const fp = paintMetrics.find(entry => entry.name === 'first-paint');\n const fcp = paintMetrics.find(entry => entry.name === 'first-contentful-paint');\n \n if (fp) firstPaint = fp.startTime;\n if (fcp) firstContentfulPaint = fcp.startTime;\n }\n\n return {\n loadTime,\n domContentLoaded,\n firstPaint,\n firstContentfulPaint\n };\n };\n\n const getMemoryInfo = () => {\n // @ts-ignore: performance.memory is non-standard (Chrome only)\n if (window.performance && window.performance.memory) {\n // @ts-ignore\n const memory = window.performance.memory;\n return {\n jsHeapSizeLimit: memory.jsHeapSizeLimit,\n totalJSHeapSize: memory.totalJSHeapSize,\n usedJSHeapSize: memory.usedJSHeapSize\n };\n }\n return null;\n };\n\n return {\n memory: getMemoryInfo(),\n navigation: getNavigationInfo(),\n timing: getTimingInfo()\n };\n} ","import { NetworkInfo } from '../types/analytics';\n\n/**\n * Collects network information from browser APIs\n */\nexport function getNetworkInfo(): NetworkInfo {\n const online = typeof navigator !== 'undefined' ? navigator.onLine : false;\n \n // Default values\n let effectiveType = 'unknown';\n let downlink = 0;\n let rtt = 0;\n let saveData = false;\n\n // NetworkInformation API (limited browser support)\n // @ts-ignore: connection property is non-standard\n if (navigator && navigator.connection) {\n // @ts-ignore\n const connection = navigator.connection;\n \n effectiveType = connection.effectiveType || effectiveType;\n downlink = connection.downlink || downlink;\n rtt = connection.rtt || rtt;\n saveData = connection.saveData || saveData;\n }\n\n return {\n online,\n effectiveType,\n downlink,\n rtt,\n saveData\n };\n} ","import { ScreenInfo } from '../types/analytics';\n\n/**\n * Collects screen information from browser APIs\n */\nexport function getScreenInfo(): ScreenInfo {\n if (typeof window === 'undefined' || typeof screen === 'undefined') {\n return {\n width: 0,\n height: 0,\n availWidth: 0,\n availHeight: 0,\n colorDepth: 0,\n orientation: 'unknown',\n pixelRatio: 1,\n touchPoints: 0\n };\n }\n\n // Get screen orientation\n let orientation = 'unknown';\n if (window.innerHeight > window.innerWidth) {\n orientation = 'portrait';\n } else {\n orientation = 'landscape';\n }\n\n // Try to get more precise orientation if available\n // @ts-ignore: screen.orientation is non-standard\n if (screen.orientation && screen.orientation.type) {\n // @ts-ignore\n orientation = screen.orientation.type;\n }\n\n // Get pixel ratio\n const pixelRatio = window.devicePixelRatio || 1;\n\n // Get touch points\n const touchPoints = navigator.maxTouchPoints || 0;\n\n return {\n width: screen.width,\n height: screen.height,\n availWidth: screen.availWidth,\n availHeight: screen.availHeight,\n colorDepth: screen.colorDepth,\n orientation,\n pixelRatio,\n touchPoints\n };\n} ","import { LocationInfo } from '../types/analytics';\n\n/**\n * Collects location and environment information from browser APIs\n */\nexport function getLocationInfo(): LocationInfo {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return {\n timeZone: '',\n language: '',\n languages: [],\n isRestricted: false,\n doNotTrack: null,\n cookiesEnabled: false,\n localStorage: false,\n sessionStorage: false\n };\n }\n\n // Get timezone\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n // Get language info\n const language = navigator.language || '';\n const languages = navigator.languages ? Array.from(navigator.languages) : [language];\n\n // Check if window is restricted (e.g., iframe with restricted access)\n let isRestricted = false;\n try {\n isRestricted = window.self !== window.top;\n } catch (e) {\n isRestricted = true;\n }\n\n // Check Do Not Track setting\n let doNotTrack = null;\n if (navigator.doNotTrack === '1' || navigator.doNotTrack === 'yes') {\n doNotTrack = true;\n } else if (navigator.doNotTrack === '0' || navigator.doNotTrack === 'no') {\n doNotTrack = false;\n }\n\n // Check if cookies are enabled\n const cookiesEnabled = navigator.cookieEnabled;\n\n // Check for storage availability\n const checkStorage = (type: 'localStorage' | 'sessionStorage'): boolean => {\n try {\n const storage = window[type];\n const testKey = `__test_${type}__`;\n storage.setItem(testKey, 'test');\n storage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n return {\n timeZone,\n language,\n languages,\n isRestricted,\n doNotTrack,\n cookiesEnabled,\n localStorage: checkStorage('localStorage'),\n sessionStorage: checkStorage('sessionStorage')\n };\n} ","/**\n * Detects if the current browser is running in incognito/private mode\n */\nexport async function detectIncognito(): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n // First attempt: Test IndexedDB availability\n if (typeof window === 'undefined') {\n resolve(false);\n return;\n }\n\n const db = indexedDB.open('test');\n db.onerror = () => resolve(true);\n db.onsuccess = () => resolve(false);\n\n // Fallback: If no response after a timeout, assume not incognito\n setTimeout(() => resolve(false), 1000);\n });\n}\n\n/**\n * Checks for device media capabilities (camera/microphone)\n */\nexport async function checkMediaCapabilities(): Promise<{ \n hasCamera: boolean | null; \n hasMicrophone: boolean | null \n}> {\n if (typeof navigator === 'undefined' || !navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return { hasCamera: null, hasMicrophone: null };\n }\n\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const hasCamera = devices.some(device => device.kind === 'videoinput');\n const hasMicrophone = devices.some(device => device.kind === 'audioinput');\n\n return { hasCamera, hasMicrophone };\n } catch (e) {\n return { hasCamera: null, hasMicrophone: null };\n }\n}\n\n/**\n * Checks for device battery status\n */\nexport async function getBatteryInfo(): Promise<{\n hasBattery: boolean | null;\n level: number | null;\n charging: boolean | null;\n}> {\n // @ts-ignore: getBattery method is non-standard\n if (typeof navigator === 'undefined' || !navigator.getBattery) {\n return { hasBattery: null, level: null, charging: null };\n }\n\n try {\n // @ts-ignore\n const battery = await navigator.getBattery();\n return {\n hasBattery: true,\n level: battery.level,\n charging: battery.charging\n };\n } catch (e) {\n return { hasBattery: null, level: null, charging: null };\n }\n}\n\n/**\n * Checks permission status for various browser features\n */\nexport async function checkPermissions(): Promise<Record<string, string>> {\n if (typeof navigator === 'undefined' || !navigator.permissions || !navigator.permissions.query) {\n return {};\n }\n\n const permissions: Record<string, string> = {};\n const featuresToCheck = [\n 'geolocation', \n 'notifications', \n 'push', \n 'midi', \n 'camera', \n 'microphone', \n 'background-sync', \n 'accelerometer', \n 'gyroscope', \n 'magnetometer'\n ];\n\n const checkPermission = async (name: string) => {\n try {\n const result = await navigator.permissions.query({ name: name as any });\n return result.state;\n } catch {\n return 'not-supported';\n }\n };\n\n for (const feature of featuresToCheck) {\n permissions[feature] = await checkPermission(feature);\n }\n\n return permissions;\n} ","import { SoloAnalyticsInfo } from '../types/analytics';\n\nimport { parseUserAgent } from '../utils/parseUserAgent';\nimport { getPerformanceInfo } from '../utils/performance';\nimport { getNetworkInfo } from '../utils/network';\nimport { getScreenInfo } from '../utils/screen';\nimport { getLocationInfo } from '../utils/location';\nimport { \n detectIncognito, \n checkMediaCapabilities, \n getBatteryInfo, \n checkPermissions \n} from '../utils/features';\n\n/**\n * Type definition for analytics options\n */\nexport interface SoloAnalyticsOptions {\n autoRefresh?: boolean;\n refreshInterval?: number;\n trackVisibility?: boolean;\n}\n\n/**\n * Type definition for the return value of useSoloAnalytics\n */\nexport interface SoloAnalyticsReturn {\n data: SoloAnalyticsInfo;\n refresh: () => Promise<void>;\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n isOnline: boolean;\n isVisible: boolean;\n browserName: string;\n osName: string;\n destroy: () => void;\n}\n\n/**\n * A function that provides comprehensive browser, device, and performance analytics.\n * @param options Configuration options\n * @returns Object with analytics data and helper methods\n */\nexport function useSoloAnalytics(options: SoloAnalyticsOptions = {}): SoloAnalyticsReturn {\n const {\n autoRefresh = false,\n refreshInterval = 30000, // 30 seconds\n trackVisibility = true\n } = options;\n \n // Initialize analytics data structure\n const analyticsData: SoloAnalyticsInfo = {\n browser: {\n name: '',\n version: '',\n major: '',\n userAgent: '',\n vendor: '',\n engine: '',\n engineVersion: ''\n },\n os: {\n name: '',\n version: '',\n architecture: ''\n },\n device: {\n type: 'unknown',\n vendor: '',\n model: '',\n orientation: 'portrait',\n isMobile: false,\n isTablet: false,\n isDesktop: false,\n touch: false\n },\n network: {\n online: false,\n effectiveType: '',\n downlink: 0,\n rtt: 0,\n saveData: false\n },\n screen: {\n width: 0,\n height: 0,\n availWidth: 0,\n availHeight: 0,\n colorDepth: 0,\n orientation: '',\n pixelRatio: 1,\n touchPoints: 0\n },\n performance: {\n memory: null,\n navigation: {\n type: '',\n redirectCount: 0\n },\n timing: {\n loadTime: 0,\n domContentLoaded: 0,\n firstPaint: null,\n firstContentfulPaint: null\n }\n },\n location: {\n timeZone: '',\n language: '',\n languages: [],\n isRestricted: false,\n doNotTrack: null,\n cookiesEnabled: false,\n localStorage: false,\n sessionStorage: false\n },\n pageVisibility: 'visible',\n referrer: '',\n isIncognito: false,\n hasCamera: null,\n hasMicrophone: null,\n hasBattery: null,\n batteryLevel: null,\n batteryCharging: null,\n permissions: {}\n };\n\n // Variables to store event listeners and timers\n let visibilityChangeListener: (() => void) | null = null;\n let refreshTimer: number | null = null;\n\n // Function to collect static data (doesn't change during page lifecycle)\n const collectStaticData = async (): Promise<void> => {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const userAgent = navigator.userAgent;\n const { browser, os, device } = parseUserAgent(userAgent);\n const screenInfo = getScreenInfo();\n const locationInfo = getLocationInfo();\n \n // Check if the browser is in incognito mode\n const isIncognito = await detectIncognito();\n \n // Check for device capabilities\n const { hasCamera, hasMicrophone } = await checkMediaCapabilities();\n \n // Check battery info\n const { hasBattery, level, charging } = await getBatteryInfo();\n \n // Check permissions\n const permissions = await checkPermissions();\n\n // Update analytics data\n Object.assign(analyticsData, {\n browser,\n os,\n device,\n screen: screenInfo,\n location: locationInfo,\n referrer: document.referrer,\n isIncognito,\n hasCamera,\n hasMicrophone,\n hasBattery,\n batteryLevel: level,\n batteryCharging: charging,\n permissions\n });\n };\n\n // Function to collect dynamic data (changes during page lifecycle)\n const collectDynamicData = (): void => {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const networkInfo = getNetworkInfo();\n const performanceInfo = getPerformanceInfo();\n \n // Update analytics data\n Object.assign(analyticsData, {\n network: networkInfo,\n performance: performanceInfo,\n pageVisibility: document.visibilityState === 'visible' ? 'visible' : 'hidden'\n });\n };\n\n // Set up visibility tracking\n if (trackVisibility && typeof document !== 'undefined') {\n const handleVisibilityChange = (): void => {\n analyticsData.pageVisibility = document.visibilityState === 'visible' ? 'visible' : 'hidden';\n };\n \n if (document.addEventListener) {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n visibilityChangeListener = handleVisibilityChange;\n }\n }\n\n // Set up auto-refresh for dynamic data\n if (autoRefresh && typeof window !== 'undefined') {\n refreshTimer = window.setInterval(() => {\n collectDynamicData();\n }, refreshInterval);\n }\n\n // Initial data collection\n const init = async (): Promise<void> => {\n await collectStaticData();\n collectDynamicData();\n };\n\n // Initialize data collection\n init();\n\n // Utility function to manually trigger data collection\n const refresh = async (): Promise<void> => {\n await collectStaticData();\n collectDynamicData();\n };\n\n // Clean up function\n const destroy = (): void => {\n if (refreshTimer !== null) {\n clearInterval(refreshTimer);\n refreshTimer = null;\n }\n\n if (visibilityChangeListener && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', visibilityChangeListener);\n visibilityChangeListener = null;\n }\n };\n\n // Return the analytics object with getter functions\n return {\n // Full analytics data\n data: analyticsData,\n \n // Utility methods\n refresh,\n destroy,\n \n // Common properties for quick access\n get isMobile(): boolean { return analyticsData.device.isMobile; },\n get isTablet(): boolean { return analyticsData.device.isTablet; },\n get isDesktop(): boolean { return analyticsData.device.isDesktop; },\n get isOnline(): boolean { return analyticsData.network.online; },\n get isVisible(): boolean { return analyticsData.pageVisibility === 'visible'; },\n get browserName(): string { return analyticsData.browser.name; },\n get osName(): string { return analyticsData.os.name; }\n };\n} "],"names":["parseUserAgent","ua","getBrowser","browsers","browser","match","version","major","engine","engineVersion","webkitMatch","geckoMatch","tridentMatch","getOS","osMatchers","os","getDevice","isMobileDevice","isTablet","vendor","model","pixelMatch","deviceType","getPerformanceInfo","getNavigationInfo","getTimingInfo","timing","loadTime","domContentLoaded","firstPaint","firstContentfulPaint","paintMetrics","fp","entry","fcp","memory","getNetworkInfo","online","effectiveType","downlink","rtt","saveData","connection","getScreenInfo","orientation","pixelRatio","touchPoints","getLocationInfo","timeZone","language","languages","isRestricted","doNotTrack","cookiesEnabled","checkStorage","type","storage","testKey","detectIncognito","resolve","db","checkMediaCapabilities","devices","hasCamera","device","hasMicrophone","getBatteryInfo","battery","checkPermissions","permissions","featuresToCheck","checkPermission","name","feature","useSoloAnalytics","options","autoRefresh","refreshInterval","trackVisibility","analyticsData","visibilityChangeListener","refreshTimer","collectStaticData","userAgent","screenInfo","locationInfo","isIncognito","hasBattery","level","charging","collectDynamicData","networkInfo","performanceInfo","handleVisibilityChange"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
(function(u,m){typeof exports=="object"&&typeof module<"u"?m(exports):typeof define=="function"&&define.amd?define(["exports"],m):(u=typeof globalThis<"u"?globalThis:u||self,m(u.SoloAnalytics={}))})(this,function(u){"use strict";function m(e){const r=()=>{const t=[{name:"Edge",regex:/Edg(?:e|A|iOS)\/([0-9\.]+)/},{name:"Samsung Browser",regex:/SamsungBrowser\/([0-9\.]+)/},{name:"Opera",regex:/(?:Opera|OPR)\/([0-9\.]+)/},{name:"Firefox",regex:/Firefox\/([0-9\.]+)/},{name:"Chrome",regex:/Chrome\/([0-9\.]+)/},{name:"Safari",regex:/Version\/([0-9\.]+).*Safari/},{name:"IE",regex:/MSIE|Trident/}];for(const o of t){const i=e.match(o.regex);if(i){const a=i[1]||"",s=a.split(".")[0]||"";let l="Unknown",f="";if(e.includes("AppleWebKit")){const d=e.match(/AppleWebKit\/([0-9\.]+)/);l="WebKit",f=d?d[1]:""}else if(e.includes("Gecko")){l="Gecko";const d=e.match(/rv:([0-9\.]+)/);f=d?d[1]:""}else if(e.includes("Trident")){l="Trident";const d=e.match(/Trident\/([0-9\.]+)/);f=d?d[1]:""}return{name:o.name,version:a,major:s,userAgent:e,vendor:navigator.vendor||"",engine:l,engineVersion:f}}}return{name:"Unknown",version:"",major:"",userAgent:e,vendor:navigator.vendor||"",engine:"Unknown",engineVersion:""}},c=()=>{const t=[{name:"iOS",regex:/iPhone|iPad|iPod/},{name:"Android",regex:/Android ([0-9\.]+)/},{name:"Windows",regex:/Windows NT ([0-9\.]+)/},{name:"macOS",regex:/Mac OS X ([0-9_\.]+)/},{name:"Linux",regex:/Linux/}];for(const o of t){const i=e.match(o.regex);if(i){let a="";return i[1]&&(a=o.name==="macOS"?i[1].replace(/_/g,"."):i[1]),{name:o.name,version:a,architecture:e.includes("x64")||e.includes("x86_64")?"64-bit":"32-bit"}}}return{name:"Unknown",version:"",architecture:e.includes("x64")||e.includes("x86_64")?"64-bit":"32-bit"}},n=()=>{const t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e),o=/iPad|Android(?!.*Mobile)/i.test(e);let i="Unknown",a="Unknown";if(e.includes("iPhone")||e.includes("iPad")||e.includes("iPod"))i="Apple",e.includes("iPhone")&&(a="iPhone"),e.includes("iPad")&&(a="iPad"),e.includes("iPod")&&(a="iPod");else if(e.includes("Samsung"))i="Samsung";else if(e.includes("Pixel")){i="Google";const l=e.match(/Pixel ([0-9XL]+)/);l&&(a=`Pixel ${l[1]}`)}const s=o?"tablet":t?"mobile":"desktop";return{type:s,vendor:i,model:a,orientation:typeof window<"u"&&window.innerHeight>window.innerWidth?"portrait":"landscape",isMobile:s==="mobile",isTablet:s==="tablet",isDesktop:s==="desktop",touch:typeof navigator<"u"&&"maxTouchPoints"in navigator?navigator.maxTouchPoints>0:!1}};return{browser:r(),os:c(),device:n()}}function v(){const e=()=>!window.performance||!window.performance.navigation?{type:"Unknown",redirectCount:0}:{type:["navigate","reload","back_forward","prerender"][window.performance.navigation.type]||"Unknown",redirectCount:window.performance.navigation.redirectCount},r=()=>{if(!window.performance||!window.performance.timing)return{loadTime:0,domContentLoaded:0,firstPaint:null,firstContentfulPaint:null};const n=window.performance.timing,t=n.loadEventEnd-n.navigationStart,o=n.domContentLoadedEventEnd-n.navigationStart;let i=null,a=null;if(window.performance&&typeof window.performance.getEntriesByType=="function"){const s=window.performance.getEntriesByType("paint"),l=s.find(d=>d.name==="first-paint"),f=s.find(d=>d.name==="first-contentful-paint");l&&(i=l.startTime),f&&(a=f.startTime)}return{loadTime:t,domContentLoaded:o,firstPaint:i,firstContentfulPaint:a}};return{memory:(()=>{if(window.performance&&window.performance.memory){const n=window.performance.memory;return{jsHeapSizeLimit:n.jsHeapSizeLimit,totalJSHeapSize:n.totalJSHeapSize,usedJSHeapSize:n.usedJSHeapSize}}return null})(),navigation:e(),timing:r()}}function h(){const e=typeof navigator<"u"?navigator.onLine:!1;let r="unknown",c=0,n=0,t=!1;if(navigator&&navigator.connection){const o=navigator.connection;r=o.effectiveType||r,c=o.downlink||c,n=o.rtt||n,t=o.saveData||t}return{online:e,effectiveType:r,downlink:c,rtt:n,saveData:t}}function w(){if(typeof window>"u"||typeof screen>"u")return{width:0,height:0,availWidth:0,availHeight:0,colorDepth:0,orientation:"unknown",pixelRatio:1,touchPoints:0};let e="unknown";window.innerHeight>window.innerWidth?e="portrait":e="landscape",screen.orientation&&screen.orientation.type&&(e=screen.orientation.type);const r=window.devicePixelRatio||1,c=navigator.maxTouchPoints||0;return{width:screen.width,height:screen.height,availWidth:screen.availWidth,availHeight:screen.availHeight,colorDepth:screen.colorDepth,orientation:e,pixelRatio:r,touchPoints:c}}function y(){if(typeof window>"u"||typeof navigator>"u")return{timeZone:"",language:"",languages:[],isRestricted:!1,doNotTrack:null,cookiesEnabled:!1,localStorage:!1,sessionStorage:!1};const e=Intl.DateTimeFormat().resolvedOptions().timeZone,r=navigator.language||"",c=navigator.languages?Array.from(navigator.languages):[r];let n=!1;try{n=window.self!==window.top}catch{n=!0}let t=null;navigator.doNotTrack==="1"||navigator.doNotTrack==="yes"?t=!0:(navigator.doNotTrack==="0"||navigator.doNotTrack==="no")&&(t=!1);const o=navigator.cookieEnabled,i=a=>{try{const s=window[a],l=`__test_${a}__`;return s.setItem(l,"test"),s.removeItem(l),!0}catch{return!1}};return{timeZone:e,language:r,languages:c,isRestricted:n,doNotTrack:t,cookiesEnabled:o,localStorage:i("localStorage"),sessionStorage:i("sessionStorage")}}async function b(){return new Promise(e=>{if(typeof window>"u"){e(!1);return}const r=indexedDB.open("test");r.onerror=()=>e(!0),r.onsuccess=()=>e(!1),setTimeout(()=>e(!1),1e3)})}async function k(){if(typeof navigator>"u"||!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices)return{hasCamera:null,hasMicrophone:null};try{const e=await navigator.mediaDevices.enumerateDevices(),r=e.some(n=>n.kind==="videoinput"),c=e.some(n=>n.kind==="audioinput");return{hasCamera:r,hasMicrophone:c}}catch{return{hasCamera:null,hasMicrophone:null}}}async function S(){if(typeof navigator>"u"||!navigator.getBattery)return{hasBattery:null,level:null,charging:null};try{const e=await navigator.getBattery();return{hasBattery:!0,level:e.level,charging:e.charging}}catch{return{hasBattery:null,level:null,charging:null}}}async function T(){if(typeof navigator>"u"||!navigator.permissions||!navigator.permissions.query)return{};const e={},r=["geolocation","notifications","push","midi","camera","microphone","background-sync","accelerometer","gyroscope","magnetometer"],c=async n=>{try{return(await navigator.permissions.query({name:n})).state}catch{return"not-supported"}};for(const n of r)e[n]=await c(n);return e}function P(e={}){const{autoRefresh:r=!1,refreshInterval:c=3e4,trackVisibility:n=!0}=e,t={browser:{name:"",version:"",major:"",userAgent:"",vendor:"",engine:"",engineVersion:""},os:{name:"",version:"",architecture:""},device:{type:"unknown",vendor:"",model:"",orientation:"portrait",isMobile:!1,isTablet:!1,isDesktop:!1,touch:!1},network:{online:!1,effectiveType:"",downlink:0,rtt:0,saveData:!1},screen:{width:0,height:0,availWidth:0,availHeight:0,colorDepth:0,orientation:"",pixelRatio:1,touchPoints:0},performance:{memory:null,navigation:{type:"",redirectCount:0},timing:{loadTime:0,domContentLoaded:0,firstPaint:null,firstContentfulPaint:null}},location:{timeZone:"",language:"",languages:[],isRestricted:!1,doNotTrack:null,cookiesEnabled:!1,localStorage:!1,sessionStorage:!1},pageVisibility:"visible",referrer:"",isIncognito:!1,hasCamera:null,hasMicrophone:null,hasBattery:null,batteryLevel:null,batteryCharging:null,permissions:{}};let o=null,i=null;const a=async()=>{if(typeof navigator>"u"||typeof window>"u")return;const g=navigator.userAgent,{browser:p,os:x,device:I}=m(g),M=w(),C=y(),D=await b(),{hasCamera:A,hasMicrophone:E}=await k(),{hasBattery:L,level:B,charging:O}=await S(),H=await T();Object.assign(t,{browser:p,os:x,device:I,screen:M,location:C,referrer:document.referrer,isIncognito:D,hasCamera:A,hasMicrophone:E,hasBattery:L,batteryLevel:B,batteryCharging:O,permissions:H})},s=()=>{if(typeof navigator>"u"||typeof window>"u")return;const g=h(),p=v();Object.assign(t,{network:g,performance:p,pageVisibility:document.visibilityState==="visible"?"visible":"hidden"})};if(n&&typeof document<"u"){const g=()=>{t.pageVisibility=document.visibilityState==="visible"?"visible":"hidden"};document.addEventListener&&(document.addEventListener("visibilitychange",g),o=g)}return r&&typeof window<"u"&&(i=window.setInterval(()=>{s()},c)),(async()=>{await a(),s()})(),{data:t,refresh:async()=>{await a(),s()},destroy:()=>{i!==null&&(clearInterval(i),i=null),o&&typeof document<"u"&&(document.removeEventListener("visibilitychange",o),o=null)},get isMobile(){return t.device.isMobile},get isTablet(){return t.device.isTablet},get isDesktop(){return t.device.isDesktop},get isOnline(){return t.network.online},get isVisible(){return t.pageVisibility==="visible"},get browserName(){return t.browser.name},get osName(){return t.os.name}}}u.useSoloAnalytics=P,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
-
//# sourceMappingURL=solo-analytics.umd.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"solo-analytics.umd.cjs","sources":["../src/utils/parseUserAgent.ts","../src/utils/performance.ts","../src/utils/network.ts","../src/utils/screen.ts","../src/utils/location.ts","../src/utils/features.ts","../src/composables/useSoloAnalytics.ts"],"sourcesContent":["import { BrowserInfo, OSInfo, DeviceInfo } from '../types/analytics';\n\n/**\n * Parses the user agent string and returns detailed information about browser, OS, and device\n */\nexport function parseUserAgent(ua: string): {\n browser: BrowserInfo;\n os: OSInfo;\n device: DeviceInfo;\n} {\n // Browser detection\n const getBrowser = (): BrowserInfo => {\n const browsers = [\n { name: 'Edge', regex: /Edg(?:e|A|iOS)\\/([0-9\\.]+)/ },\n { name: 'Samsung Browser', regex: /SamsungBrowser\\/([0-9\\.]+)/ },\n { name: 'Opera', regex: /(?:Opera|OPR)\\/([0-9\\.]+)/ },\n { name: 'Firefox', regex: /Firefox\\/([0-9\\.]+)/ },\n { name: 'Chrome', regex: /Chrome\\/([0-9\\.]+)/ },\n { name: 'Safari', regex: /Version\\/([0-9\\.]+).*Safari/ },\n { name: 'IE', regex: /MSIE|Trident/ }\n ];\n\n for (const browser of browsers) {\n const match = ua.match(browser.regex);\n if (match) {\n const version = match[1] || '';\n const major = version.split('.')[0] || '';\n\n // Engine detection\n let engine = 'Unknown';\n let engineVersion = '';\n \n if (ua.includes('AppleWebKit')) {\n const webkitMatch = ua.match(/AppleWebKit\\/([0-9\\.]+)/);\n engine = 'WebKit';\n engineVersion = webkitMatch ? webkitMatch[1] : '';\n } else if (ua.includes('Gecko')) {\n engine = 'Gecko';\n const geckoMatch = ua.match(/rv:([0-9\\.]+)/);\n engineVersion = geckoMatch ? geckoMatch[1] : '';\n } else if (ua.includes('Trident')) {\n engine = 'Trident';\n const tridentMatch = ua.match(/Trident\\/([0-9\\.]+)/);\n engineVersion = tridentMatch ? tridentMatch[1] : '';\n }\n \n return {\n name: browser.name,\n version,\n major,\n userAgent: ua,\n vendor: navigator.vendor || '',\n engine,\n engineVersion\n };\n }\n }\n\n return {\n name: 'Unknown',\n version: '',\n major: '',\n userAgent: ua,\n vendor: navigator.vendor || '',\n engine: 'Unknown',\n engineVersion: ''\n };\n };\n\n // OS detection\n const getOS = (): OSInfo => {\n const osMatchers = [\n { name: 'iOS', regex: /iPhone|iPad|iPod/ },\n { name: 'Android', regex: /Android ([0-9\\.]+)/ },\n { name: 'Windows', regex: /Windows NT ([0-9\\.]+)/ },\n { name: 'macOS', regex: /Mac OS X ([0-9_\\.]+)/ },\n { name: 'Linux', regex: /Linux/ }\n ];\n\n for (const os of osMatchers) {\n const match = ua.match(os.regex);\n if (match) {\n let version = '';\n if (match[1]) {\n version = os.name === 'macOS' \n ? match[1].replace(/_/g, '.') \n : match[1];\n }\n \n return {\n name: os.name,\n version,\n architecture: ua.includes('x64') || ua.includes('x86_64') ? '64-bit' : '32-bit'\n };\n }\n }\n\n return {\n name: 'Unknown',\n version: '',\n architecture: ua.includes('x64') || ua.includes('x86_64') ? '64-bit' : '32-bit'\n };\n };\n\n // Device detection\n const getDevice = (): DeviceInfo => {\n const isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);\n const isTablet = /iPad|Android(?!.*Mobile)/i.test(ua);\n \n let vendor = 'Unknown';\n let model = 'Unknown';\n \n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) {\n vendor = 'Apple';\n if (ua.includes('iPhone')) model = 'iPhone';\n if (ua.includes('iPad')) model = 'iPad';\n if (ua.includes('iPod')) model = 'iPod';\n } else if (ua.includes('Samsung')) {\n vendor = 'Samsung';\n } else if (ua.includes('Pixel')) {\n vendor = 'Google';\n const pixelMatch = ua.match(/Pixel ([0-9XL]+)/);\n if (pixelMatch) model = `Pixel ${pixelMatch[1]}`;\n }\n \n const deviceType = isTablet ? 'tablet' : (isMobileDevice ? 'mobile' : 'desktop');\n \n return {\n type: deviceType,\n vendor,\n model,\n orientation: typeof window !== 'undefined' && window.innerHeight > window.innerWidth ? 'portrait' : 'landscape',\n isMobile: deviceType === 'mobile',\n isTablet: deviceType === 'tablet',\n isDesktop: deviceType === 'desktop',\n touch: typeof navigator !== 'undefined' && 'maxTouchPoints' in navigator ? navigator.maxTouchPoints > 0 : false\n };\n };\n\n return {\n browser: getBrowser(),\n os: getOS(),\n device: getDevice()\n };\n}","import { PerformanceInfo } from '../types/analytics';\n\n/**\n * Collects performance metrics from browser APIs\n */\nexport function getPerformanceInfo(): PerformanceInfo {\n const getNavigationInfo = () => {\n if (!window.performance || !window.performance.navigation) {\n return { type: 'Unknown', redirectCount: 0 };\n }\n \n const navTypes = ['navigate', 'reload', 'back_forward', 'prerender'];\n const navType = navTypes[window.performance.navigation.type] || 'Unknown';\n \n return {\n type: navType,\n redirectCount: window.performance.navigation.redirectCount\n };\n };\n\n const getTimingInfo = () => {\n if (!window.performance || !window.performance.timing) {\n return {\n loadTime: 0,\n domContentLoaded: 0,\n firstPaint: null,\n firstContentfulPaint: null\n };\n }\n\n const timing = window.performance.timing;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domContentLoaded = timing.domContentLoadedEventEnd - timing.navigationStart;\n\n // Get first paint and first contentful paint\n let firstPaint = null;\n let firstContentfulPaint = null;\n\n if (window.performance && typeof window.performance.getEntriesByType === 'function') {\n const paintMetrics = window.performance.getEntriesByType('paint');\n \n const fp = paintMetrics.find(entry => entry.name === 'first-paint');\n const fcp = paintMetrics.find(entry => entry.name === 'first-contentful-paint');\n \n if (fp) firstPaint = fp.startTime;\n if (fcp) firstContentfulPaint = fcp.startTime;\n }\n\n return {\n loadTime,\n domContentLoaded,\n firstPaint,\n firstContentfulPaint\n };\n };\n\n const getMemoryInfo = () => {\n // @ts-ignore: performance.memory is non-standard (Chrome only)\n if (window.performance && window.performance.memory) {\n // @ts-ignore\n const memory = window.performance.memory;\n return {\n jsHeapSizeLimit: memory.jsHeapSizeLimit,\n totalJSHeapSize: memory.totalJSHeapSize,\n usedJSHeapSize: memory.usedJSHeapSize\n };\n }\n return null;\n };\n\n return {\n memory: getMemoryInfo(),\n navigation: getNavigationInfo(),\n timing: getTimingInfo()\n };\n} ","import { NetworkInfo } from '../types/analytics';\n\n/**\n * Collects network information from browser APIs\n */\nexport function getNetworkInfo(): NetworkInfo {\n const online = typeof navigator !== 'undefined' ? navigator.onLine : false;\n \n // Default values\n let effectiveType = 'unknown';\n let downlink = 0;\n let rtt = 0;\n let saveData = false;\n\n // NetworkInformation API (limited browser support)\n // @ts-ignore: connection property is non-standard\n if (navigator && navigator.connection) {\n // @ts-ignore\n const connection = navigator.connection;\n \n effectiveType = connection.effectiveType || effectiveType;\n downlink = connection.downlink || downlink;\n rtt = connection.rtt || rtt;\n saveData = connection.saveData || saveData;\n }\n\n return {\n online,\n effectiveType,\n downlink,\n rtt,\n saveData\n };\n} ","import { ScreenInfo } from '../types/analytics';\n\n/**\n * Collects screen information from browser APIs\n */\nexport function getScreenInfo(): ScreenInfo {\n if (typeof window === 'undefined' || typeof screen === 'undefined') {\n return {\n width: 0,\n height: 0,\n availWidth: 0,\n availHeight: 0,\n colorDepth: 0,\n orientation: 'unknown',\n pixelRatio: 1,\n touchPoints: 0\n };\n }\n\n // Get screen orientation\n let orientation = 'unknown';\n if (window.innerHeight > window.innerWidth) {\n orientation = 'portrait';\n } else {\n orientation = 'landscape';\n }\n\n // Try to get more precise orientation if available\n // @ts-ignore: screen.orientation is non-standard\n if (screen.orientation && screen.orientation.type) {\n // @ts-ignore\n orientation = screen.orientation.type;\n }\n\n // Get pixel ratio\n const pixelRatio = window.devicePixelRatio || 1;\n\n // Get touch points\n const touchPoints = navigator.maxTouchPoints || 0;\n\n return {\n width: screen.width,\n height: screen.height,\n availWidth: screen.availWidth,\n availHeight: screen.availHeight,\n colorDepth: screen.colorDepth,\n orientation,\n pixelRatio,\n touchPoints\n };\n} ","import { LocationInfo } from '../types/analytics';\n\n/**\n * Collects location and environment information from browser APIs\n */\nexport function getLocationInfo(): LocationInfo {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return {\n timeZone: '',\n language: '',\n languages: [],\n isRestricted: false,\n doNotTrack: null,\n cookiesEnabled: false,\n localStorage: false,\n sessionStorage: false\n };\n }\n\n // Get timezone\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n // Get language info\n const language = navigator.language || '';\n const languages = navigator.languages ? Array.from(navigator.languages) : [language];\n\n // Check if window is restricted (e.g., iframe with restricted access)\n let isRestricted = false;\n try {\n isRestricted = window.self !== window.top;\n } catch (e) {\n isRestricted = true;\n }\n\n // Check Do Not Track setting\n let doNotTrack = null;\n if (navigator.doNotTrack === '1' || navigator.doNotTrack === 'yes') {\n doNotTrack = true;\n } else if (navigator.doNotTrack === '0' || navigator.doNotTrack === 'no') {\n doNotTrack = false;\n }\n\n // Check if cookies are enabled\n const cookiesEnabled = navigator.cookieEnabled;\n\n // Check for storage availability\n const checkStorage = (type: 'localStorage' | 'sessionStorage'): boolean => {\n try {\n const storage = window[type];\n const testKey = `__test_${type}__`;\n storage.setItem(testKey, 'test');\n storage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n return {\n timeZone,\n language,\n languages,\n isRestricted,\n doNotTrack,\n cookiesEnabled,\n localStorage: checkStorage('localStorage'),\n sessionStorage: checkStorage('sessionStorage')\n };\n} ","/**\n * Detects if the current browser is running in incognito/private mode\n */\nexport async function detectIncognito(): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n // First attempt: Test IndexedDB availability\n if (typeof window === 'undefined') {\n resolve(false);\n return;\n }\n\n const db = indexedDB.open('test');\n db.onerror = () => resolve(true);\n db.onsuccess = () => resolve(false);\n\n // Fallback: If no response after a timeout, assume not incognito\n setTimeout(() => resolve(false), 1000);\n });\n}\n\n/**\n * Checks for device media capabilities (camera/microphone)\n */\nexport async function checkMediaCapabilities(): Promise<{ \n hasCamera: boolean | null; \n hasMicrophone: boolean | null \n}> {\n if (typeof navigator === 'undefined' || !navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return { hasCamera: null, hasMicrophone: null };\n }\n\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const hasCamera = devices.some(device => device.kind === 'videoinput');\n const hasMicrophone = devices.some(device => device.kind === 'audioinput');\n\n return { hasCamera, hasMicrophone };\n } catch (e) {\n return { hasCamera: null, hasMicrophone: null };\n }\n}\n\n/**\n * Checks for device battery status\n */\nexport async function getBatteryInfo(): Promise<{\n hasBattery: boolean | null;\n level: number | null;\n charging: boolean | null;\n}> {\n // @ts-ignore: getBattery method is non-standard\n if (typeof navigator === 'undefined' || !navigator.getBattery) {\n return { hasBattery: null, level: null, charging: null };\n }\n\n try {\n // @ts-ignore\n const battery = await navigator.getBattery();\n return {\n hasBattery: true,\n level: battery.level,\n charging: battery.charging\n };\n } catch (e) {\n return { hasBattery: null, level: null, charging: null };\n }\n}\n\n/**\n * Checks permission status for various browser features\n */\nexport async function checkPermissions(): Promise<Record<string, string>> {\n if (typeof navigator === 'undefined' || !navigator.permissions || !navigator.permissions.query) {\n return {};\n }\n\n const permissions: Record<string, string> = {};\n const featuresToCheck = [\n 'geolocation', \n 'notifications', \n 'push', \n 'midi', \n 'camera', \n 'microphone', \n 'background-sync', \n 'accelerometer', \n 'gyroscope', \n 'magnetometer'\n ];\n\n const checkPermission = async (name: string) => {\n try {\n const result = await navigator.permissions.query({ name: name as any });\n return result.state;\n } catch {\n return 'not-supported';\n }\n };\n\n for (const feature of featuresToCheck) {\n permissions[feature] = await checkPermission(feature);\n }\n\n return permissions;\n} ","import { SoloAnalyticsInfo } from '../types/analytics';\n\nimport { parseUserAgent } from '../utils/parseUserAgent';\nimport { getPerformanceInfo } from '../utils/performance';\nimport { getNetworkInfo } from '../utils/network';\nimport { getScreenInfo } from '../utils/screen';\nimport { getLocationInfo } from '../utils/location';\nimport { \n detectIncognito, \n checkMediaCapabilities, \n getBatteryInfo, \n checkPermissions \n} from '../utils/features';\n\n/**\n * Type definition for analytics options\n */\nexport interface SoloAnalyticsOptions {\n autoRefresh?: boolean;\n refreshInterval?: number;\n trackVisibility?: boolean;\n}\n\n/**\n * Type definition for the return value of useSoloAnalytics\n */\nexport interface SoloAnalyticsReturn {\n data: SoloAnalyticsInfo;\n refresh: () => Promise<void>;\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n isOnline: boolean;\n isVisible: boolean;\n browserName: string;\n osName: string;\n destroy: () => void;\n}\n\n/**\n * A function that provides comprehensive browser, device, and performance analytics.\n * @param options Configuration options\n * @returns Object with analytics data and helper methods\n */\nexport function useSoloAnalytics(options: SoloAnalyticsOptions = {}): SoloAnalyticsReturn {\n const {\n autoRefresh = false,\n refreshInterval = 30000, // 30 seconds\n trackVisibility = true\n } = options;\n \n // Initialize analytics data structure\n const analyticsData: SoloAnalyticsInfo = {\n browser: {\n name: '',\n version: '',\n major: '',\n userAgent: '',\n vendor: '',\n engine: '',\n engineVersion: ''\n },\n os: {\n name: '',\n version: '',\n architecture: ''\n },\n device: {\n type: 'unknown',\n vendor: '',\n model: '',\n orientation: 'portrait',\n isMobile: false,\n isTablet: false,\n isDesktop: false,\n touch: false\n },\n network: {\n online: false,\n effectiveType: '',\n downlink: 0,\n rtt: 0,\n saveData: false\n },\n screen: {\n width: 0,\n height: 0,\n availWidth: 0,\n availHeight: 0,\n colorDepth: 0,\n orientation: '',\n pixelRatio: 1,\n touchPoints: 0\n },\n performance: {\n memory: null,\n navigation: {\n type: '',\n redirectCount: 0\n },\n timing: {\n loadTime: 0,\n domContentLoaded: 0,\n firstPaint: null,\n firstContentfulPaint: null\n }\n },\n location: {\n timeZone: '',\n language: '',\n languages: [],\n isRestricted: false,\n doNotTrack: null,\n cookiesEnabled: false,\n localStorage: false,\n sessionStorage: false\n },\n pageVisibility: 'visible',\n referrer: '',\n isIncognito: false,\n hasCamera: null,\n hasMicrophone: null,\n hasBattery: null,\n batteryLevel: null,\n batteryCharging: null,\n permissions: {}\n };\n\n // Variables to store event listeners and timers\n let visibilityChangeListener: (() => void) | null = null;\n let refreshTimer: number | null = null;\n\n // Function to collect static data (doesn't change during page lifecycle)\n const collectStaticData = async (): Promise<void> => {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const userAgent = navigator.userAgent;\n const { browser, os, device } = parseUserAgent(userAgent);\n const screenInfo = getScreenInfo();\n const locationInfo = getLocationInfo();\n \n // Check if the browser is in incognito mode\n const isIncognito = await detectIncognito();\n \n // Check for device capabilities\n const { hasCamera, hasMicrophone } = await checkMediaCapabilities();\n \n // Check battery info\n const { hasBattery, level, charging } = await getBatteryInfo();\n \n // Check permissions\n const permissions = await checkPermissions();\n\n // Update analytics data\n Object.assign(analyticsData, {\n browser,\n os,\n device,\n screen: screenInfo,\n location: locationInfo,\n referrer: document.referrer,\n isIncognito,\n hasCamera,\n hasMicrophone,\n hasBattery,\n batteryLevel: level,\n batteryCharging: charging,\n permissions\n });\n };\n\n // Function to collect dynamic data (changes during page lifecycle)\n const collectDynamicData = (): void => {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const networkInfo = getNetworkInfo();\n const performanceInfo = getPerformanceInfo();\n \n // Update analytics data\n Object.assign(analyticsData, {\n network: networkInfo,\n performance: performanceInfo,\n pageVisibility: document.visibilityState === 'visible' ? 'visible' : 'hidden'\n });\n };\n\n // Set up visibility tracking\n if (trackVisibility && typeof document !== 'undefined') {\n const handleVisibilityChange = (): void => {\n analyticsData.pageVisibility = document.visibilityState === 'visible' ? 'visible' : 'hidden';\n };\n \n if (document.addEventListener) {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n visibilityChangeListener = handleVisibilityChange;\n }\n }\n\n // Set up auto-refresh for dynamic data\n if (autoRefresh && typeof window !== 'undefined') {\n refreshTimer = window.setInterval(() => {\n collectDynamicData();\n }, refreshInterval);\n }\n\n // Initial data collection\n const init = async (): Promise<void> => {\n await collectStaticData();\n collectDynamicData();\n };\n\n // Initialize data collection\n init();\n\n // Utility function to manually trigger data collection\n const refresh = async (): Promise<void> => {\n await collectStaticData();\n collectDynamicData();\n };\n\n // Clean up function\n const destroy = (): void => {\n if (refreshTimer !== null) {\n clearInterval(refreshTimer);\n refreshTimer = null;\n }\n\n if (visibilityChangeListener && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', visibilityChangeListener);\n visibilityChangeListener = null;\n }\n };\n\n // Return the analytics object with getter functions\n return {\n // Full analytics data\n data: analyticsData,\n \n // Utility methods\n refresh,\n destroy,\n \n // Common properties for quick access\n get isMobile(): boolean { return analyticsData.device.isMobile; },\n get isTablet(): boolean { return analyticsData.device.isTablet; },\n get isDesktop(): boolean { return analyticsData.device.isDesktop; },\n get isOnline(): boolean { return analyticsData.network.online; },\n get isVisible(): boolean { return analyticsData.pageVisibility === 'visible'; },\n get browserName(): string { return analyticsData.browser.name; },\n get osName(): string { return analyticsData.os.name; }\n };\n} "],"names":["parseUserAgent","ua","getBrowser","browsers","browser","match","version","major","engine","engineVersion","webkitMatch","geckoMatch","tridentMatch","getOS","osMatchers","os","getDevice","isMobileDevice","isTablet","vendor","model","pixelMatch","deviceType","getPerformanceInfo","getNavigationInfo","getTimingInfo","timing","loadTime","domContentLoaded","firstPaint","firstContentfulPaint","paintMetrics","fp","entry","fcp","memory","getNetworkInfo","online","effectiveType","downlink","rtt","saveData","connection","getScreenInfo","orientation","pixelRatio","touchPoints","getLocationInfo","timeZone","language","languages","isRestricted","doNotTrack","cookiesEnabled","checkStorage","type","storage","testKey","detectIncognito","resolve","db","checkMediaCapabilities","devices","hasCamera","device","hasMicrophone","getBatteryInfo","battery","checkPermissions","permissions","featuresToCheck","checkPermission","name","feature","useSoloAnalytics","options","autoRefresh","refreshInterval","trackVisibility","analyticsData","visibilityChangeListener","refreshTimer","collectStaticData","userAgent","screenInfo","locationInfo","isIncognito","hasBattery","level","charging","collectDynamicData","networkInfo","performanceInfo","handleVisibilityChange"],"mappings":"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"}
|
package/dist/vite.svg
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|