diff options
Diffstat (limited to 'src/lib/constants.ts')
| -rw-r--r-- | src/lib/constants.ts | 682 |
1 files changed, 682 insertions, 0 deletions
diff --git a/src/lib/constants.ts b/src/lib/constants.ts new file mode 100644 index 0000000..e5090c3 --- /dev/null +++ b/src/lib/constants.ts @@ -0,0 +1,682 @@ +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<string, string> = { + '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', +}; |