export const CURRENT_VERSION = process.env.currentVersion; export const AUTH_TOKEN = 'umami.auth'; export const LOCALE_CONFIG = 'umami.locale'; export const TIMEZONE_CONFIG = 'umami.timezone'; export const DATE_RANGE_CONFIG = 'umami.date-range'; export const THEME_CONFIG = 'umami.theme'; export const DASHBOARD_CONFIG = 'umami.dashboard'; export const LAST_TEAM_CONFIG = 'umami.last-team'; export const VERSION_CHECK = 'umami.version-check'; export const SHARE_TOKEN_HEADER = 'x-umami-share-token'; export const HOMEPAGE_URL = 'https://umami.is'; export const DOCS_URL = 'https://umami.is/docs'; export const REPO_URL = 'https://github.com/umami-software/umami'; export const UPDATES_URL = 'https://api.umami.is/v1/updates'; export const TELEMETRY_PIXEL = 'https://i.umami.is/a.png'; export const FAVICON_URL = 'https://icons.duckduckgo.com/ip3/{{domain}}.ico'; export const LINKS_URL = `${globalThis?.location?.origin}/q`; export const PIXELS_URL = `${globalThis?.location?.origin}/p`; export const DEFAULT_LOCALE = 'en-US'; export const DEFAULT_THEME = 'light'; export const DEFAULT_ANIMATION_DURATION = 300; export const DEFAULT_DATE_RANGE_VALUE = '24hour'; export const DEFAULT_WEBSITE_LIMIT = 10; export const DEFAULT_RESET_DATE = '2000-01-01'; export const DEFAULT_PAGE_SIZE = 20; export const DEFAULT_DATE_COMPARE = 'prev'; export const REALTIME_RANGE = 30; export const REALTIME_INTERVAL = 10000; export const UNIT_TYPES = ['year', 'month', 'hour', 'day', 'minute']; export const EVENT_COLUMNS = [ 'path', 'entry', 'exit', 'referrer', 'domain', 'title', 'query', 'event', 'tag', 'hostname', ]; export const SESSION_COLUMNS = [ 'browser', 'os', 'device', 'screen', 'language', 'country', 'city', 'region', ]; export const SEGMENT_TYPES = { segment: 'segment', cohort: 'cohort', }; export const FILTER_COLUMNS = { path: 'url_path', entry: 'url_path', exit: 'url_path', referrer: 'referrer_domain', domain: 'referrer_domain', hostname: 'hostname', title: 'page_title', query: 'url_query', os: 'os', browser: 'browser', device: 'device', country: 'country', region: 'region', city: 'city', language: 'language', event: 'event_name', tag: 'tag', eventType: 'event_type', }; export const COLLECTION_TYPE = { event: 'event', identify: 'identify', } as const; export const EVENT_TYPE = { pageView: 1, customEvent: 2, linkEvent: 3, pixelEvent: 4, } as const; export const DATA_TYPE = { string: 1, number: 2, boolean: 3, date: 4, array: 5, } as const; export const OPERATORS = { equals: 'eq', notEquals: 'neq', set: 's', notSet: 'ns', contains: 'c', doesNotContain: 'dnc', true: 't', false: 'f', greaterThan: 'gt', lessThan: 'lt', greaterThanEquals: 'gte', lessThanEquals: 'lte', before: 'bf', after: 'af', } as const; export const DATA_TYPES = { [DATA_TYPE.string]: 'string', [DATA_TYPE.number]: 'number', [DATA_TYPE.boolean]: 'boolean', [DATA_TYPE.date]: 'date', [DATA_TYPE.array]: 'array', } as const; export const ROLES = { admin: 'admin', user: 'user', viewOnly: 'view-only', teamOwner: 'team-owner', teamManager: 'team-manager', teamMember: 'team-member', teamViewOnly: 'team-view-only', } as const; export const PERMISSIONS = { all: 'all', websiteCreate: 'website:create', websiteUpdate: 'website:update', websiteDelete: 'website:delete', websiteTransferToTeam: 'website:transfer-to-team', websiteTransferToUser: 'website:transfer-to-user', teamCreate: 'team:create', teamUpdate: 'team:update', teamDelete: 'team:delete', } as const; export const ROLE_PERMISSIONS = { [ROLES.admin]: [PERMISSIONS.all], [ROLES.user]: [ PERMISSIONS.websiteCreate, PERMISSIONS.websiteUpdate, PERMISSIONS.websiteDelete, PERMISSIONS.teamCreate, ], [ROLES.viewOnly]: [], [ROLES.teamOwner]: [ PERMISSIONS.teamUpdate, PERMISSIONS.teamDelete, PERMISSIONS.websiteCreate, PERMISSIONS.websiteUpdate, PERMISSIONS.websiteDelete, PERMISSIONS.websiteTransferToTeam, PERMISSIONS.websiteTransferToUser, ], [ROLES.teamManager]: [ PERMISSIONS.teamUpdate, PERMISSIONS.websiteCreate, PERMISSIONS.websiteUpdate, PERMISSIONS.websiteDelete, PERMISSIONS.websiteTransferToTeam, ], [ROLES.teamMember]: [ PERMISSIONS.websiteCreate, PERMISSIONS.websiteUpdate, PERMISSIONS.websiteDelete, ], [ROLES.teamViewOnly]: [], } as const; export const THEME_COLORS = { light: { primary: '#2680eb', text: '#838383', line: '#d9d9d9', fill: '#f9f9f9', }, dark: { primary: '#2680eb', text: '#7b7b7b', line: '#3a3a3a', fill: '#191919', }, } as const; export const CHART_COLORS = [ '#2680eb', '#9256d9', '#44b556', '#e68619', '#e34850', '#f7bd12', '#01bad7', '#6734bc', '#89c541', '#ffc301', '#ec1562', '#ffec16', ]; export const DOMAIN_REGEX = /^(localhost(:[1-9]\d{0,4})?|((?=[a-z0-9-_]{1,63}\.)(xn--)?[a-z0-9-_]+(-[a-z0-9-_]+)*\.)+(xn--)?[a-z0-9-_]{2,63})$/; export const SHARE_ID_REGEX = /^[a-zA-Z0-9]{8,50}$/; export const DATETIME_REGEX = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{3}(Z|\+[0-9]{2}:[0-9]{2})?)?$/; export const URL_LENGTH = 500; export const PAGE_TITLE_LENGTH = 500; export const EVENT_NAME_LENGTH = 50; export const UTM_PARAMS = ['utm_campaign', 'utm_content', 'utm_medium', 'utm_source', 'utm_term']; export const OS_NAMES = { 'Android OS': 'Android', 'Chrome OS': 'ChromeOS', 'Mac OS': 'macOS', 'Sun OS': 'SunOS', 'Windows 10': 'Windows 10/11', } as const; export const BROWSERS = { android: 'Android', aol: 'AOL', bb10: 'BlackBerry 10', beaker: 'Beaker', chrome: 'Chrome', 'chromium-webview': 'Chrome (webview)', crios: 'Chrome (iOS)', curl: 'Curl', edge: 'Edge', 'edge-chromium': 'Edge (Chromium)', 'edge-ios': 'Edge (iOS)', facebook: 'Facebook', firefox: 'Firefox', fxios: 'Firefox (iOS)', ie: 'IE', instagram: 'Instagram', ios: 'iOS', 'ios-webview': 'iOS (webview)', kakaotalk: 'KakaoTalk', miui: 'MIUI', opera: 'Opera', 'opera-mini': 'Opera Mini', phantomjs: 'PhantomJS', safari: 'Safari', samsung: 'Samsung', searchbot: 'Searchbot', silk: 'Silk', yandexbrowser: 'Yandex', } as const; export const SOCIAL_DOMAINS = [ 'bsky.app', 'facebook.com', 'fb.com', 'ig.com', 'instagram.com', 'linkedin.', 'news.ycombinator.com', 'pinterest.', 'reddit.', 'snapchat.', 't.co', 'threads.net', 'tiktok.', 'twitter.com', 'x.com', ]; export const SEARCH_DOMAINS = [ 'baidu.com', 'bing.com', 'chatgpt.com', 'duckduckgo.com', 'ecosia.org', 'google.', 'msn.com', 'perplexity.ai', 'search.brave.com', 'yandex.', ]; export const SHOPPING_DOMAINS = [ 'alibaba.com', 'aliexpress.com', 'amazon.', 'bestbuy.com', 'ebay.com', 'etsy.com', 'newegg.com', 'target.com', 'walmart.com', ]; export const EMAIL_DOMAINS = [ 'gmail.', 'hotmail.', 'mail.yahoo.', 'outlook.', 'proton.me', 'protonmail.', ]; export const VIDEO_DOMAINS = ['twitch.', 'youtube.']; export const PAID_AD_PARAMS = [ 'ad_id=', 'aid=', 'dclid=', 'epik=', 'fbclid=', 'gclid=', 'li_fat_id=', 'msclkid=', 'ob_click_id=', 'pc_id=', 'rdt_cid=', 'scid=', 'ttclid=', 'twclid=', 'utm_medium=cpc', 'utm_medium=paid', 'utm_medium=paid_social', 'utm_source=google', ]; export const GROUPED_DOMAINS = [ { name: 'Baidu', domain: 'baidu.com', match: 'baidu.' }, { name: 'Bing', domain: 'bing.com', match: 'bing.' }, { name: 'Brave', domain: 'brave.com', match: 'brave.' }, { name: 'ChatGPT', domain: 'chatgpt.com', match: 'chatgpt.' }, { name: 'DuckDuckGo', domain: 'duckduckgo.com', match: 'duckduckgo.' }, { name: 'Facebook', domain: 'facebook.com', match: 'facebook.' }, { name: 'GitHub', domain: 'github.com', match: 'github.' }, { name: 'Google', domain: 'google.com', match: 'google.' }, { name: 'Hacker News', domain: 'news.ycombinator.com', match: 'news.ycombinator.com' }, { name: 'Instagram', domain: 'instagram.com', match: ['instagram.', 'ig.com'] }, { name: 'LinkedIn', domain: 'linkedin.com', match: 'linkedin.' }, { name: 'Pinterest', domain: 'pinterest.com', match: 'pinterest.' }, { name: 'Reddit', domain: 'reddit.com', match: 'reddit.' }, { name: 'Snapchat', domain: 'snapchat.com', match: 'snapchat.' }, { name: 'Twitter', domain: 'twitter.com', match: ['twitter.', 't.co', 'x.com'] }, { name: 'Yahoo', domain: 'yahoo.com', match: 'yahoo.' }, { name: 'Yandex', domain: 'yandex.ru', match: 'yandex.' }, ]; export const MAP_FILE = '/datamaps.world.json'; export const ISO_COUNTRIES = { ABW: 'AW', AFG: 'AF', AGO: 'AO', AIA: 'AI', ALA: 'AX', ALB: 'AL', AND: 'AD', ANT: 'AN', ARE: 'AE', ARG: 'AR', ARM: 'AM', ASM: 'AS', ATF: 'TF', ATG: 'AG', AUS: 'AU', AUT: 'AT', AZE: 'AZ', BDI: 'BI', BEL: 'BE', BEN: 'BJ', BFA: 'BF', BGD: 'BD', BGR: 'BG', BHR: 'BH', BHS: 'BS', BIH: 'BA', BLR: 'BY', BLZ: 'BZ', BLM: 'BL', BMU: 'BM', BOL: 'BO', BRA: 'BR', BRB: 'BB', BRN: 'BN', BTN: 'BT', BVT: 'BV', BWA: 'BW', CAF: 'CF', CAN: 'CA', CCK: 'CC', CHE: 'CH', CHL: 'CL', CHN: 'CN', CIV: 'CI', CMR: 'CM', COD: 'CD', COG: 'CG', COK: 'CK', COL: 'CO', COM: 'KM', CPV: 'CV', CRI: 'CR', CUB: 'CU', CXR: 'CX', CYM: 'KY', CYP: 'CY', CZE: 'CZ', DEU: 'DE', DJI: 'DJ', DMA: 'DM', DNK: 'DK', DOM: 'DO', DZA: 'DZ', ECU: 'EC', EGY: 'EG', ERI: 'ER', ESH: 'EH', ESP: 'ES', EST: 'EE', ETH: 'ET', FIN: 'FI', FJI: 'FJ', FLK: 'FK', FRA: 'FR', FRO: 'FO', FSM: 'FM', GAB: 'GA', GBR: 'GB', GEO: 'GE', GGY: 'GG', GHA: 'GH', GIB: 'GI', GIN: 'GN', GLP: 'GP', GMB: 'GM', GNB: 'GW', GNQ: 'GQ', GRC: 'GR', GRD: 'GD', GRL: 'GL', GTM: 'GT', GUF: 'GF', GUM: 'GU', GUY: 'GY', HKG: 'HK', HMD: 'HM', HND: 'HN', HRV: 'HR', HTI: 'HT', HUN: 'HU', IDN: 'ID', IMN: 'IM', IND: 'IN', IOT: 'IO', IRL: 'IE', IRN: 'IR', IRQ: 'IQ', ISL: 'IS', ISR: 'IL', ITA: 'IT', JAM: 'JM', JEY: 'JE', JOR: 'JO', JPN: 'JP', KAZ: 'KZ', KEN: 'KE', KGZ: 'KG', KHM: 'KH', KIR: 'KI', KNA: 'KN', KOR: 'KR', KWT: 'KW', LAO: 'LA', LBN: 'LB', LBR: 'LR', LBY: 'LY', LCA: 'LC', LIE: 'LI', LKA: 'LK', LSO: 'LS', LTU: 'LT', LUX: 'LU', LVA: 'LV', MAF: 'MF', MAR: 'MA', MCO: 'MC', MDA: 'MD', MDG: 'MG', MDV: 'MV', MEX: 'MX', MHL: 'MH', MKD: 'MK', MLI: 'ML', MLT: 'MT', MMR: 'MM', MNE: 'ME', MNG: 'MN', MNP: 'MP', MOZ: 'MZ', MRT: 'MR', MSR: 'MS', MTQ: 'MQ', MUS: 'MU', MWI: 'MW', MYS: 'MY', MYT: 'YT', NAM: 'NA', NCL: 'NC', NER: 'NE', NFK: 'NF', NGA: 'NG', NIC: 'NI', NIU: 'NU', NLD: 'NL', NOR: 'NO', NPL: 'NP', NRU: 'NR', NZL: 'NZ', OMN: 'OM', PAK: 'PK', PAN: 'PA', PCN: 'PN', PER: 'PE', PHL: 'PH', PLW: 'PW', PNG: 'PG', POL: 'PL', PRI: 'PR', PRK: 'KP', PRT: 'PT', PRY: 'PY', PSE: 'PS', PYF: 'PF', QAT: 'QA', REU: 'RE', ROU: 'RO', RUS: 'RU', RWA: 'RW', SAU: 'SA', SDN: 'SD', SEN: 'SN', SGP: 'SG', SGS: 'GS', SHN: 'SH', SJM: 'SJ', SLB: 'SB', SLE: 'SL', SLV: 'SV', SMR: 'SM', SOM: 'SO', SPM: 'PM', SRB: 'RS', SUR: 'SR', STP: 'ST', SVK: 'SK', SVN: 'SI', SWE: 'SE', SWZ: 'SZ', SYC: 'SC', SYR: 'SY', TCA: 'TC', TCD: 'TD', TGO: 'TG', THA: 'TH', TJK: 'TJ', TKL: 'TK', TKM: 'TM', TLS: 'TL', TON: 'TO', TTO: 'TT', TUN: 'TN', TUR: 'TR', TUV: 'TV', TWN: 'TW', TZA: 'TZ', UGA: 'UG', UKR: 'UA', UMI: 'UM', URY: 'UY', USA: 'US', UZB: 'UZ', VAT: 'VA', VCT: 'VC', VEN: 'VE', VGB: 'VG', VIR: 'VI', VNM: 'VN', VUT: 'VU', WLF: 'WF', WSM: 'WS', XKX: 'XK', YEM: 'YE', ZAF: 'ZA', ZMB: 'ZM', ZWE: 'ZW', }; export const CURRENCIES = [ { id: 'USD', name: 'US Dollar' }, { id: 'EUR', name: 'Euro' }, { id: 'GBP', name: 'British Pound' }, { id: 'JPY', name: 'Japanese Yen' }, { id: 'CNY', name: 'Chinese Renminbi (Yuan)' }, { id: 'CAD', name: 'Canadian Dollar' }, { id: 'HKD', name: 'Hong Kong Dollar' }, { id: 'AUD', name: 'Australian Dollar' }, { id: 'SGD', name: 'Singapore Dollar' }, { id: 'CHF', name: 'Swiss Franc' }, { id: 'SEK', name: 'Swedish Krona' }, { id: 'PLN', name: 'Polish Złoty' }, { id: 'NOK', name: 'Norwegian Krone' }, { id: 'DKK', name: 'Danish Krone' }, { id: 'NZD', name: 'New Zealand Dollar' }, { id: 'ZAR', name: 'South African Rand' }, { id: 'MXN', name: 'Mexican Peso' }, { id: 'THB', name: 'Thai Baht' }, { id: 'HUF', name: 'Hungarian Forint' }, { id: 'MYR', name: 'Malaysian Ringgit' }, { id: 'INR', name: 'Indian Rupee' }, { id: 'KRW', name: 'South Korean Won' }, { id: 'BRL', name: 'Brazilian Real' }, { id: 'TRY', name: 'Turkish Lira' }, { id: 'CZK', name: 'Czech Koruna' }, { id: 'ILS', name: 'Israeli New Shekel' }, { id: 'RUB', name: 'Russian Ruble' }, { id: 'AED', name: 'United Arab Emirates Dirham' }, { id: 'IDR', name: 'Indonesian Rupiah' }, { id: 'PHP', name: 'Philippine Peso' }, { id: 'RON', name: 'Romanian Leu' }, { id: 'COP', name: 'Colombian Peso' }, { id: 'SAR', name: 'Saudi Riyal' }, { id: 'ARS', name: 'Argentine Peso' }, { id: 'VND', name: 'Vietnamese Dong' }, { id: 'CLP', name: 'Chilean Peso' }, { id: 'EGP', name: 'Egyptian Pound' }, { id: 'KWD', name: 'Kuwaiti Dinar' }, { id: 'PKR', name: 'Pakistani Rupee' }, { id: 'QAR', name: 'Qatari Riyal' }, { id: 'BHD', name: 'Bahraini Dinar' }, { id: 'UAH', name: 'Ukrainian Hryvnia' }, { id: 'PEN', name: 'Peruvian Sol' }, { id: 'BDT', name: 'Bangladeshi Taka' }, { id: 'MAD', name: 'Moroccan Dirham' }, { id: 'KES', name: 'Kenyan Shilling' }, { id: 'NGN', name: 'Nigerian Naira' }, { id: 'TND', name: 'Tunisian Dinar' }, { id: 'OMR', name: 'Omani Rial' }, { id: 'GHS', name: 'Ghanaian Cedi' }, ]; export const TIMEZONE_LEGACY: Record = { 'Asia/Batavia': 'Asia/Jakarta', 'Asia/Calcutta': 'Asia/Kolkata', 'Asia/Chongqing': 'Asia/Shanghai', 'Asia/Harbin': 'Asia/Shanghai', 'Asia/Jayapura': 'Asia/Pontianak', 'Asia/Katmandu': 'Asia/Kathmandu', 'Asia/Macao': 'Asia/Macau', 'Asia/Rangoon': 'Asia/Yangon', 'Asia/Saigon': 'Asia/Ho_Chi_Minh', 'Europe/Kiev': 'Europe/Kyiv', 'Europe/Zaporozhye': 'Europe/Kyiv', 'Etc/UTC': 'UTC', 'US/Arizona': 'America/Phoenix', 'US/Central': 'America/Chicago', 'US/Eastern': 'America/New_York', 'US/Mountain': 'America/Denver', 'US/Pacific': 'America/Los_Angeles', 'US/Samoa': 'Pacific/Pago_Pago', };