mirror of
https://github.com/umami-software/umami.git
synced 2025-12-06 01:18:00 +01:00
Adds a CLI tool to generate realistic analytics data for local development and testing. Creates two demo websites with varying traffic patterns and realistic user behavior distributions.
80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
import { weightedRandom, pickRandom, type WeightedOption } from '../utils.js';
|
|
|
|
export type DeviceType = 'desktop' | 'mobile' | 'tablet';
|
|
|
|
const deviceWeights: WeightedOption<DeviceType>[] = [
|
|
{ value: 'desktop', weight: 0.55 },
|
|
{ value: 'mobile', weight: 0.4 },
|
|
{ value: 'tablet', weight: 0.05 },
|
|
];
|
|
|
|
const browsersByDevice: Record<DeviceType, WeightedOption<string>[]> = {
|
|
desktop: [
|
|
{ value: 'Chrome', weight: 0.65 },
|
|
{ value: 'Safari', weight: 0.12 },
|
|
{ value: 'Firefox', weight: 0.1 },
|
|
{ value: 'Edge', weight: 0.1 },
|
|
{ value: 'Opera', weight: 0.03 },
|
|
],
|
|
mobile: [
|
|
{ value: 'Chrome', weight: 0.55 },
|
|
{ value: 'Safari', weight: 0.35 },
|
|
{ value: 'Samsung', weight: 0.05 },
|
|
{ value: 'Firefox', weight: 0.03 },
|
|
{ value: 'Opera', weight: 0.02 },
|
|
],
|
|
tablet: [
|
|
{ value: 'Safari', weight: 0.6 },
|
|
{ value: 'Chrome', weight: 0.35 },
|
|
{ value: 'Firefox', weight: 0.05 },
|
|
],
|
|
};
|
|
|
|
const osByDevice: Record<DeviceType, WeightedOption<string>[]> = {
|
|
desktop: [
|
|
{ value: 'Windows 10', weight: 0.5 },
|
|
{ value: 'Mac OS', weight: 0.3 },
|
|
{ value: 'Linux', weight: 0.12 },
|
|
{ value: 'Chrome OS', weight: 0.05 },
|
|
{ value: 'Windows 11', weight: 0.03 },
|
|
],
|
|
mobile: [
|
|
{ value: 'iOS', weight: 0.45 },
|
|
{ value: 'Android', weight: 0.55 },
|
|
],
|
|
tablet: [
|
|
{ value: 'iOS', weight: 0.75 },
|
|
{ value: 'Android', weight: 0.25 },
|
|
],
|
|
};
|
|
|
|
const screensByDevice: Record<DeviceType, string[]> = {
|
|
desktop: [
|
|
'1920x1080',
|
|
'2560x1440',
|
|
'1366x768',
|
|
'1440x900',
|
|
'3840x2160',
|
|
'1536x864',
|
|
'1680x1050',
|
|
'2560x1080',
|
|
],
|
|
mobile: ['390x844', '414x896', '375x812', '360x800', '428x926', '393x873', '412x915', '360x780'],
|
|
tablet: ['1024x768', '768x1024', '834x1194', '820x1180', '810x1080', '800x1280'],
|
|
};
|
|
|
|
export interface DeviceInfo {
|
|
device: DeviceType;
|
|
browser: string;
|
|
os: string;
|
|
screen: string;
|
|
}
|
|
|
|
export function getRandomDevice(): DeviceInfo {
|
|
const device = weightedRandom(deviceWeights);
|
|
const browser = weightedRandom(browsersByDevice[device]);
|
|
const os = weightedRandom(osByDevice[device]);
|
|
const screen = pickRandom(screensByDevice[device]);
|
|
|
|
return { device, browser, os, screen };
|
|
}
|