ua-browser 1.4.2 → 1.4.3
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.en.md +1 -1
- package/README.md +1 -1
- package/dist/index.cjs +18 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +18 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/constants/os.ts","../src/constants/browsers.ts","../src/utils/extract.ts","../src/detectors/browser.ts","../src/constants/engines.ts","../src/detectors/engine.ts","../src/detectors/os.ts","../src/constants/devices.ts","../src/detectors/device.ts","../src/constants/bots.ts","../src/detectors/bot.ts","../src/constants/arch.ts","../src/detectors/arch.ts","../src/detectors/headless.ts","../src/detectors/webview.ts","../src/utils/navigator.ts","../src/parse.ts","../src/utils/env-context.ts","../src/index.ts"],"names":["package_default","OS_DEFS","BROWSER_DEFS","extractVersion","ua","pattern","m","v","extractVersionFromPatterns","patterns","p","lookupFromChromeVersion","table","major","detectBrowser","best","def","version","browserType","ENGINE_DEFS","ENGINE_VERSION_RE","detectEngine","browser","_a","_b","_c","_d","b","engine","engineVersion","lookupVersionName","map","parts","len","key","detectOs","windowsVersion","matchedDef","bestPriority","osVersion","raw","normalised","mapped","n","osVersionName","DEVICE_DEFS","detectDevice","nav","uaDetect","hwDetect","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","w","VENDOR_MAP","ANDROID_MODEL_RE","detectVendorModel","model","re","vendor","BOT_DEFS","detectBot","customDefs","defs","ARCH_DEFS","detectArch","ctx","architecture","bitness","renderer","platform","HEADLESS_PATTERN","detectHeadless","isWebview","getNavContext","getMimeType","type","e","getLanguage","BRAND_TO_BROWSER","osFromHardware","chPlatform","platformVersion","hasPlatformVersion","platformFromUA","normalizeBCP47","i","ISO_639_1","languageFromUA","kwMatch","bare","parseUA","options","effectiveNav","effectiveWindowsVersion","rawBrowser","rawVersion","rawOs","rawOsVersion","os","device","arch","isBot","botName","botCategory","isHeadless","language","chromeGlobal","chromeMatch","chromeMajor","is360","saveDataEnabled","opVer","hwOs","pv","fullVersionList","brand","browserName","entry","versionMajor","connectionType","finalOsVersionName","d","OS_FONTS","probeFonts","TEST","baseline","result","font","getWebGLInfo","canvas","gl","ext","getSafeAreaInsetTop","el","top","getAudioSampleRate","AC","ac","rate","getPointerType","getHoverCapability","deriveWindowsVersion","getEnvContext","base","maxTextureSize","fragPrecision","compressedFormats","data","VERSION","uaBrowser","src_default"],"mappings":"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","file":"index.min.js","sourcesContent":["{\n \"name\": \"ua-browser\",\n \"version\": \"1.4.2\",\n \"description\": \"uaBrowser - Browser, OS, engine and device detection from user agent strings. Supports Node.js. Zero dependencies.\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n },\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.mjs\"\n }\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"sideEffects\": false,\n \"browserslist\": [\n \"chrome >= 63\",\n \"safari >= 12\",\n \"firefox >= 55\",\n \"edge >= 79\"\n ],\n \"scripts\": {\n \"release\": \"pnpm build && changeset publish\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint src --ext .ts\",\n \"typecheck\": \"tsc -p tsconfig.build.json --noEmit\",\n \"docs:dev\": \"pnpm build && vitepress dev docs --host 0.0.0.0 --port 61199\",\n \"docs:build\": \"pnpm build && vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/yangtianxia/ua-browser.git\"\n },\n \"keywords\": [\n \"uaBrowser\",\n \"userAgent\",\n \"javascript\",\n \"typescript\",\n \"browser-detection\",\n \"user-agent-parser\"\n ],\n \"author\": \"yangtianxia\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/yangtianxia/ua-browser/issues\"\n },\n \"homepage\": \"https://github.com/yangtianxia/ua-browser#readme\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.29.4\",\n \"@typescript-eslint/eslint-plugin\": \"^7.0.0\",\n \"@typescript-eslint/parser\": \"^7.0.0\",\n \"@vitest/coverage-v8\": \"^1.6.0\",\n \"eslint\": \"^8.57.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.0\",\n \"vitepress\": \"^1.6.4\",\n \"vitest\": \"^1.6.0\",\n \"vue\": \"^3.5.32\"\n }\n}\n","import type { OsName } from '../types.js'\n\nexport interface OsDef {\n name: OsName\n /** Higher priority wins when multiple entries match the same UA. */\n priority: number\n detect: RegExp\n /** Capture-group regex(es) for OS version extraction. Tried in order; null = no version. */\n versionPattern: RegExp | RegExp[] | null\n /** Lookup table: raw version token → display version. */\n versionLookup?: Record<string, string>\n /** Human-readable version names: display version → name (e.g. '14' → 'Sonoma'). */\n versionNames?: Record<string, string>\n}\n\n// Priority 10: broad patterns that act as catch-alls (Linux, Windows).\n// Priority 20: standard OS entries with specific-enough patterns.\n// Priority 30: entries that must override a lower-priority match on the same UA\n// (Chrome OS over Linux; visionOS/tvOS over iOS; HarmonyOS/OpenHarmony over Android;\n// Windows Phone over Windows).\nexport const OS_DEFS: readonly OsDef[] = [\n { name: 'WebOS', priority: 20, detect: /hpwOS/, versionPattern: /hpwOS\\/([\\d.]+)/ },\n { name: 'Symbian', priority: 20, detect: /Symbian/, versionPattern: null },\n { name: 'MeeGo', priority: 20, detect: /MeeGo/, versionPattern: null },\n { name: 'BlackBerry', priority: 20, detect: /(BlackBerry|RIM)/, versionPattern: null },\n { name: 'FreeBSD', priority: 20, detect: /FreeBSD/, versionPattern: null },\n { name: 'Debian', priority: 20, detect: /Debian/, versionPattern: /Debian\\/([\\d.]+)/ },\n { name: 'Ubuntu', priority: 20, detect: /Ubuntu/, versionPattern: null },\n { name: 'Linux', priority: 10, detect: /(Linux|X11)/, versionPattern: null },\n { name: 'Chrome OS', priority: 30, detect: /CrOS/, versionPattern: null },\n { name: 'Tizen', priority: 20, detect: /Tizen/, versionPattern: /Tizen ([\\d.]+)/ },\n { name: 'iOS', priority: 20, detect: /like Mac OS X/, versionPattern: /OS ([\\d_]+) like/ },\n { name: 'MacOS', priority: 20, detect: /Macintosh/, versionPattern: /Mac OS X -?([\\d_.]+)/,\n versionNames: {\n '10.9': 'Mavericks', '10.10': 'Yosemite', '10.11': 'El Capitan',\n '10.12': 'Sierra', '10.13': 'High Sierra', '10.14': 'Mojave',\n '10.15': 'Catalina', '11': 'Big Sur', '12': 'Monterey',\n '13': 'Ventura', '14': 'Sonoma', '15': 'Sequoia',\n } },\n { name: 'visionOS', priority: 30, detect: /visionOS/, versionPattern: /visionOS ([\\d_]+)/ },\n { name: 'tvOS', priority: 30, detect: /Apple TV/, versionPattern: /OS ([\\d_]+) like/ },\n { name: 'Android', priority: 20, detect: /(Android|Adr)/, versionPattern: /(?:Android|Adr) ([\\d.]+)/ },\n { name: 'HarmonyOS', priority: 30, detect: /HarmonyOS/,\n versionPattern: [/HarmonyOS[\\s/]([\\d.]+)/, /Android ([\\d.]+)[;)]/],\n versionLookup: { '10': '2', '11': '3', '12': '3', '13': '4', '14': '4' } },\n { name: 'OpenHarmony', priority: 30, detect: /OpenHarmony/, versionPattern: /OpenHarmony[\\s/]([\\d.]+)/ },\n { name: 'KaiOS', priority: 30, detect: /KAIOS/, versionPattern: /KAIOS\\/([\\d.]+)/ },\n { name: 'Windows', priority: 10, detect: /Windows/, versionPattern: /Windows NT ([\\d.]+)/,\n versionLookup: {\n '10': '10', '6.4': '10', '6.3': '8.1', '6.2': '8',\n '6.1': '7', '6.0': 'Vista', '5.2': 'XP', '5.1': 'XP', '5.0': '2000'\n },\n versionNames: {\n '7': 'Windows 7', '8': 'Windows 8', '8.1': 'Windows 8.1',\n '10': 'Windows 10', '11': 'Windows 11',\n } },\n { name: 'Windows Phone', priority: 30, detect: /(IEMobile|Windows Phone)/, versionPattern: /Windows Phone(?: OS)? ([\\d.]+)/ },\n] as const\n","import type { BrowserName } from '../types.js'\n\nexport interface BrowserDef {\n name: BrowserName\n /** Detection regex — must match the UA for this browser to be a candidate. */\n detect: RegExp\n /**\n * Version extraction: capture-group regex (or array tried in order).\n * null = no direct version pattern (use chromeLookup only, or lookup table browsers).\n */\n versionPattern: RegExp | RegExp[] | null\n /** Chrome major-version → browser display version lookup (e.g. 360SE/EE, Liebao). */\n chromeLookup?: Record<string, string>\n /**\n * Detection priority. When multiple entries match the same UA, the one with\n * the highest priority wins. Explicit and verifiable — no reverse-iteration magic.\n */\n priority: number\n}\n\nexport const BROWSER_DEFS: readonly BrowserDef[] = [\n // ── Generic / low-priority base browsers ──────────────────────────────────\n { name: 'Safari', priority: 10, detect: /Safari/, versionPattern: /Version\\/([\\d.]+)/ },\n { name: 'Chrome', priority: 20, detect: /(Chrome|CriOS)/, versionPattern: [/Chrome\\/([\\d.]+)/, /CriOS\\/([\\d.]+)/] },\n { name: 'Arc', priority: 35, detect: /Arc\\//, versionPattern: /Arc\\/([\\d.]+)/ },\n { name: 'IE', priority: 30, detect: /(MSIE|Trident)/, versionPattern: [/MSIE ([\\d.]+)/, /rv:([\\d.]+)/] },\n { name: 'Edge', priority: 40, detect: /(Edge|Edg\\/|EdgA|EdgiOS)/, versionPattern: [/Edge\\/([\\d.]+)/, /Edg\\/([\\d.]+)/, /EdgA\\/([\\d.]+)/, /EdgiOS\\/([\\d.]+)/] },\n { name: 'Firefox', priority: 50, detect: /(Firefox|FxiOS)/, versionPattern: [/Firefox\\/([\\d.]+)/, /FxiOS\\/([\\d.]+)/] },\n { name: 'Firefox Focus', priority: 55, detect: /Focus/, versionPattern: /Focus\\/([\\d.]+)/ },\n { name: 'Chromium', priority: 60, detect: /Chromium/, versionPattern: /Chromium\\/([\\d.]+)/ },\n { name: 'Opera', priority: 70, detect: /(Opera|OPR|OPT)/, versionPattern: [/Opera\\/([\\d.]+)/, /OPR\\/([\\d.]+)/, /OPT\\/([\\d.]+)/] },\n { name: 'Vivaldi', priority: 80, detect: /Vivaldi/, versionPattern: /Vivaldi\\/([\\d.]+)/ },\n { name: 'Yandex', priority: 90, detect: /YaBrowser/, versionPattern: /YaBrowser\\/([\\d.]+)/ },\n { name: 'Samsung Internet', priority: 92, detect: /SamsungBrowser/, versionPattern: /SamsungBrowser\\/([\\d.]+)/ },\n { name: 'DuckDuckGo', priority: 94, detect: /(DuckDuckGo|Ddg)\\//, versionPattern: [/DuckDuckGo\\/([\\d.]+)/, /Ddg\\/([\\d.]+)/] },\n { name: 'Puffin', priority: 96, detect: /Puffin\\//, versionPattern: /Puffin\\/([\\d.]+)/ },\n { name: 'Coc Coc', priority: 130, detect: /coc_coc_browser/, versionPattern: /coc_coc_browser\\/([\\d.]+)/ },\n { name: 'Kindle', priority: 140, detect: /(Kindle|Silk\\/)/, versionPattern: /Version\\/([\\d.]+)/ },\n { name: 'Konqueror', priority: 160, detect: /Konqueror/, versionPattern: /Konqueror\\/([\\d.]+)/ },\n { name: 'SeaMonkey', priority: 180, detect: /SeaMonkey/, versionPattern: /SeaMonkey\\/([\\d.]+)/ },\n { name: 'Epiphany', priority: 190, detect: /Epiphany/, versionPattern: /Epiphany\\/([\\d.]+)/ },\n { name: 'Maxthon', priority: 200, detect: /Maxthon/, versionPattern: /Maxthon\\/([\\d.]+)/ },\n\n // ── Chinese / Asian browsers — higher priority than generic Chrome ─────────\n { name: '360', priority: 300, detect: /(QihooBrowser|QHBrowser)/, versionPattern: /QihooBrowser\\/([\\d.]+)/ },\n { name: '360SE', priority: 310, detect: /360SE/, versionPattern: null,\n chromeLookup: { '108': '14.0', '86': '13.0', '78': '12.0', '69': '11.0',\n '63': '10.0', '55': '9.1', '45': '8.1', '42': '8.0', '31': '7.0', '21': '6.3' } },\n { name: '360EE', priority: 320, detect: /360EE/, versionPattern: null,\n chromeLookup: { '86': '13.0', '78': '12.0', '69': '11.0', '63': '9.5',\n '55': '9.0', '50': '8.7', '30': '7.5' } },\n { name: 'UC', priority: 330, detect: /(UCBrowser|UBrowser|UCWEB)/, versionPattern: /UC?Browser\\/([\\d.]+)/ },\n { name: 'QQBrowser', priority: 340, detect: /(MQQBrowser|QQBrowser)/, versionPattern: [/MQQBrowser\\/([\\d.]+)/, /QQBrowser\\/([\\d.]+)/] },\n { name: 'QQ', priority: 345, detect: /QQ\\//, versionPattern: /QQ\\/([\\d.]+)/ },\n { name: 'Baidu', priority: 350, detect: /(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/, versionPattern: [/BIDUBrowser[\\s/]([\\d.]+)/, /baiduboxapp\\/([\\d.]+)/] },\n { name: 'Sogou', priority: 360, detect: /(MetaSr|Sogou)/, versionPattern: [/SE ([\\d.X]+)/, /SogouMobileBrowser\\/([\\d.]+)/] },\n { name: 'Liebao', priority: 370, detect: /(LBBROWSER|LieBaoFast)/, versionPattern: /LieBaoFast\\/([\\d.]+)/,\n chromeLookup: { '57': '6.5', '49': '6.0', '46': '5.9', '42': '5.3',\n '39': '5.2', '34': '5.0', '29': '4.5', '21': '4.0' } },\n { name: '2345Explorer', priority: 380, detect: /2345Explorer/, versionPattern: [/2345Explorer\\/([\\d.]+)/, /Mb2345Browser\\/([\\d.]+)/],\n chromeLookup: { '69': '10.0', '55': '9.9' } },\n { name: '115Browser', priority: 390, detect: /115Browser/, versionPattern: /115Browser\\/([\\d.]+)/ },\n { name: 'TheWorld', priority: 400, detect: /TheWorld/, versionPattern: /TheWorld ([\\d.]+)/ },\n { name: 'XiaoMi', priority: 410, detect: /MiuiBrowser/, versionPattern: /MiuiBrowser\\/([\\d.]+)/ },\n { name: 'Vivo', priority: 420, detect: /VivoBrowser/, versionPattern: /VivoBrowser\\/([\\d.]+)/ },\n { name: 'Huawei', priority: 430, detect: /HuaweiBrowser/, versionPattern: [/HuaweiBrowser\\/([\\d.]+)/, /Version\\/([\\d.]+)/] },\n { name: 'OPPO', priority: 440, detect: /HeyTapBrowser/, versionPattern: /HeyTapBrowser\\/([\\d.]+)/ },\n { name: 'Quark', priority: 450, detect: /Quark/, versionPattern: /Quark\\/([\\d.]+)/ },\n { name: 'Qiyu', priority: 460, detect: /Qiyu/, versionPattern: /Qiyu\\/([\\d.]+)/ },\n\n // ── App webviews — highest priority ───────────────────────────────────────\n { name: 'WechatWork', priority: 500, detect: /wxwork\\//, versionPattern: /wxwork\\/([\\d.]+)/ },\n { name: 'Wechat', priority: 510, detect: /MicroMessenger/, versionPattern: /MicroMessenger\\/([\\d.]+)/ },\n { name: 'Taobao', priority: 520, detect: /AliApp\\(TB/, versionPattern: /AliApp\\(TB\\/([\\d.]+)/ },\n { name: 'Alipay', priority: 530, detect: /AliApp\\(AP/, versionPattern: /AliApp\\(AP\\/([\\d.]+)/ },\n { name: 'Weibo', priority: 540, detect: /Weibo/, versionPattern: /weibo__([\\d.]+)/ },\n { name: 'Douban', priority: 550, detect: /com\\.douban\\.frodo/, versionPattern: /com\\.douban\\.frodo\\/([\\d.]+)/ },\n { name: 'Suning', priority: 560, detect: /SNEBUY-APP/, versionPattern: /SNEBUY-APP([\\d.]+)/ },\n { name: 'iQiYi', priority: 570, detect: /IqiyiApp/, versionPattern: /IqiyiVersion\\/([\\d.]+)/ },\n { name: 'DingTalk', priority: 580, detect: /DingTalk/, versionPattern: /DingTalk\\/([\\d.]+)/ },\n { name: 'Douyin', priority: 590, detect: /aweme/, versionPattern: /app_version\\/([\\d.]+)/ },\n { name: 'Bilibili', priority: 592, detect: /BiliBili\\//, versionPattern: /BiliBili\\/([\\d.]+)/ },\n { name: 'Kuaishou', priority: 594, detect: /Kwai\\//, versionPattern: /Kwai\\/([\\d.]+)/ },\n { name: 'Xiaohongshu', priority: 596, detect: /Xiaohongshu\\//, versionPattern: /Xiaohongshu\\/([\\d.]+)/ },\n { name: 'Feishu', priority: 597, detect: /(Lark|Feishu)\\//, versionPattern: [/Lark\\/([\\d.]+)/, /Feishu\\/([\\d.]+)/] },\n { name: 'Toutiao', priority: 598, detect: /NewsArticle\\//, versionPattern: /NewsArticle\\/([\\d.]+)/ },\n { name: 'JD', priority: 599, detect: /jdpingou\\//, versionPattern: /jdpingou\\/([\\d.]+)/ },\n { name: 'Meituan', priority: 600, detect: /MeituanHybrid\\//, versionPattern: /MeituanHybrid\\/([\\d.]+)/ }\n] as const\n","/**\n * Extract the first capture group from `ua` using `pattern`.\n * Returns the matched string, or null if the pattern does not match.\n * Unlike String.replace(), this never returns the original input on no-match.\n */\nexport function extractVersion(ua: string, pattern: RegExp): string | null {\n const m = pattern.exec(ua)\n if (!m) return null\n const v = m[1]\n return v != null && v !== '' ? v : null\n}\n\n/**\n * Try each pattern in order; return the first non-null match, or null.\n */\nexport function extractVersionFromPatterns(ua: string, patterns: RegExp[]): string | null {\n for (const p of patterns) {\n const v = extractVersion(ua, p)\n if (v !== null) return v\n }\n return null\n}\n\n/**\n * Extract the Chrome major version from `ua` and look it up in a table.\n * Returns the mapped string on hit, or null on miss / no Chrome token.\n */\nexport function lookupFromChromeVersion(ua: string, table: Record<string, string>): string | null {\n const m = /Chrome\\/([\\d]+)/.exec(ua)\n if (!m) return null\n const major = m[1]\n return Object.prototype.hasOwnProperty.call(table, major) ? table[major] : null\n}\n","import type { BrowserName, BrowserType } from '../types.js'\nimport { BROWSER_DEFS } from '../constants/browsers.js'\nimport { extractVersionFromPatterns, lookupFromChromeVersion } from '../utils/extract.js'\n\nexport interface BrowserResult {\n browser: BrowserName\n version: string\n browserType: BrowserType\n priority: number\n}\n\n/**\n * Detect the browser name and version from a user agent string.\n *\n * When multiple BROWSER_DEFS entries match the same UA, the one with\n * the highest `priority` value wins (ties go to the later definition).\n */\nexport function detectBrowser(ua: string): BrowserResult {\n let best: (typeof BROWSER_DEFS)[number] | null = null\n\n for (const def of BROWSER_DEFS) {\n if (def.detect.test(ua)) {\n if (best === null || def.priority >= best.priority) {\n best = def\n }\n }\n }\n\n if (!best) return { browser: 'unknown', version: 'unknown', browserType: 'unknown', priority: 0 }\n\n let version: string | null = null\n\n // 1. Try Chrome-version lookup table (for browsers like 360SE/EE that version by Chrome major)\n if (best.chromeLookup) {\n version = lookupFromChromeVersion(ua, best.chromeLookup)\n }\n\n // 2. Fall back to direct regex extraction\n if (version === null && best.versionPattern !== null) {\n const patterns = Array.isArray(best.versionPattern)\n ? best.versionPattern\n : [best.versionPattern]\n version = extractVersionFromPatterns(ua, patterns)\n }\n\n const p = best.priority\n const browserType: BrowserType = p >= 500 ? 'app' : p >= 300 ? 'brand' : 'browser'\n return { browser: best.name, version: version ?? 'unknown', browserType, priority: p }\n}\n","export interface EngineDef {\n name: string\n detect: RegExp\n}\n\nexport const ENGINE_DEFS: readonly EngineDef[] = [\n { name: 'KHTML', detect: /KHTML\\// },\n { name: 'Trident', detect: /(Trident|NET CLR)/ },\n { name: 'Presto', detect: /Presto/ },\n { name: 'Gecko', detect: /Gecko\\// },\n { name: 'WebKit', detect: /AppleWebKit/ },\n // ArkWeb is HarmonyOS Next's rendering engine; only present in UAs that explicitly contain the\n // token. It must come last so it overrides the WebKit entry that also matches those UAs.\n { name: 'ArkWeb', detect: /ArkWeb/ },\n] as const\n","import type { EngineName } from '../types.js'\nimport { ENGINE_DEFS } from '../constants/engines.js'\nimport { detectBrowser } from './browser.js'\n\nexport interface EngineResult {\n engine: EngineName\n engineVersion: string\n}\n\nconst ENGINE_VERSION_RE: Record<string, RegExp> = {\n WebKit: /AppleWebKit\\/([\\d.]+)/,\n Blink: /AppleWebKit\\/([\\d.]+)/,\n ArkWeb: /AppleWebKit\\/([\\d.]+)/,\n Gecko: /Gecko\\/([\\d.]+)/,\n Trident: /Trident\\/([\\d.]+)/,\n Presto: /Presto\\/([\\d.]+)/,\n KHTML: /KHTML\\/([\\d.]+)/,\n}\n\n/**\n * Detect the rendering engine from a user agent string.\n *\n * @param ua - Raw user agent string\n * @param browser - Pre-detected browser name; auto-detected when omitted\n * @param version - Pre-detected browser version; auto-detected when omitted\n */\nexport function detectEngine(ua: string, browser?: string, version?: string): EngineResult {\n if (browser === undefined || version === undefined) {\n const b = detectBrowser(ua)\n browser = browser ?? b.browser\n version = version ?? b.version\n }\n let engine: EngineName = 'unknown'\n\n for (const def of ENGINE_DEFS) {\n if (def.detect.test(ua)) {\n engine = def.name as EngineName\n }\n }\n\n // Upgrade WebKit to Blink for Chrome 28+, Opera 15+, Yandex\n if (\n engine === 'WebKit' &&\n /(Chrome|CriOS)/.test(ua) &&\n parseInt((/Chrome\\/([\\d]+)/.exec(ua) ?? [])[1] ?? '0', 10) > 27\n ) {\n engine = 'Blink'\n } else if (browser === 'Opera' && parseInt(version, 10) > 12) {\n engine = 'Blink'\n } else if (browser === 'Yandex') {\n engine = 'Blink'\n }\n\n // Edge: Chromium-based Edge uses Blink (version > 75), legacy EdgeHTML below that\n if (browser === 'Edge') {\n engine = parseInt(version, 10) > 75 ? 'Blink' : 'EdgeHTML'\n }\n\n const engineVersion = ENGINE_VERSION_RE[engine]\n ? (ENGINE_VERSION_RE[engine]!.exec(ua)?.[1] ?? 'unknown')\n : 'unknown'\n\n return { engine, engineVersion }\n}\n","import type { OsName } from '../types.js'\nimport { OS_DEFS } from '../constants/os.js'\nimport { extractVersion, extractVersionFromPatterns } from '../utils/extract.js'\n\nexport interface OsResult {\n os: OsName\n osVersion: string\n osVersionName: string\n}\n\n/**\n * Look up a human-readable name for a version string, trying progressively shorter prefixes.\n * e.g. '14.3' tries '14.3' → '14'; '10.15.7' tries '10.15.7' → '10.15' → '10'.\n */\nfunction lookupVersionName(map: Record<string, string>, version: string): string {\n const parts = version.split('.')\n for (let len = parts.length; len >= 1; len--) {\n const key = parts.slice(0, len).join('.')\n if (Object.prototype.hasOwnProperty.call(map, key)) return map[key]!\n }\n return 'unknown'\n}\n\n/**\n * Detect the operating system and its version from a user agent string.\n *\n * @param ua - Raw user agent string\n * @param windowsVersion - Pre-resolved Windows 11/10 string from getWindowsVersion()\n * (avoids the async race condition of the old implementation)\n */\nexport function detectOs(ua: string, windowsVersion?: string | null): OsResult {\n let matchedDef: (typeof OS_DEFS)[number] | null = null\n let bestPriority = -1\n\n for (const def of OS_DEFS) {\n if (def.detect.test(ua) && def.priority > bestPriority) {\n matchedDef = def\n bestPriority = def.priority\n }\n }\n\n if (!matchedDef) return { os: 'unknown', osVersion: 'unknown', osVersionName: 'unknown' }\n\n let osVersion = 'unknown'\n\n if (matchedDef.versionPattern) {\n const raw = Array.isArray(matchedDef.versionPattern)\n ? extractVersionFromPatterns(ua, matchedDef.versionPattern)\n : extractVersion(ua, matchedDef.versionPattern)\n\n if (raw !== null) {\n // Normalise iOS underscore-separated version: \"17_4_1\" → \"17.4.1\"\n const normalised = raw.replace(/_/g, '.')\n\n if (matchedDef.versionLookup) {\n // Use lookup table if available (Windows NT, HarmonyOS)\n const mapped = Object.prototype.hasOwnProperty.call(matchedDef.versionLookup, normalised)\n ? matchedDef.versionLookup[normalised]\n : null\n\n if (mapped !== null) {\n osVersion = mapped\n } else if (matchedDef.name === 'Windows') {\n // For unknown Windows NT versions, fall back to the integer part\n const n = parseInt(normalised, 10)\n osVersion = isNaN(n) ? 'unknown' : n.toString()\n } else {\n // For other OS types (e.g. HarmonyOS Next), use raw version directly\n osVersion = normalised\n }\n } else {\n osVersion = normalised\n }\n }\n }\n\n // Windows 11 override — provided externally to avoid async race\n if (matchedDef.name === 'Windows' && windowsVersion) {\n osVersion = windowsVersion\n }\n\n const osVersionName = matchedDef.versionNames\n ? lookupVersionName(matchedDef.versionNames, osVersion)\n : 'unknown'\n return { os: matchedDef.name, osVersion, osVersionName }\n}\n","export interface DeviceDef {\n name: string\n detect: RegExp\n}\n\nexport const DEVICE_DEFS: readonly DeviceDef[] = [\n { name: 'Mobile', detect: /(Mobi|iPh)/ },\n { name: 'Tablet', detect: /(Tablet|Pad)/ }\n] as const\n","import type { DeviceName } from '../types.js'\nimport { DEVICE_DEFS } from '../constants/devices.js'\nimport type { NavContext } from '../utils/navigator.js'\n\ntype DeviceNav = Pick<NavContext, 'platform' | 'maxTouchPoints'> & {\n pointerType?: 'coarse' | 'fine' | 'none'\n hoverCapability?: boolean\n screenWidth?: number\n webglRenderer?: string\n webglMaxTextureSize?: number\n webglFragPrecision?: number\n webglCompressedFormats?: { s3tc: boolean; pvrtc: boolean; etc2: boolean; astc: boolean }\n safeAreaInsetTop?: number\n devicePixelRatio?: number\n hasVibration?: boolean\n hasDeviceMotion?: boolean\n connection?: { effectiveType?: string }\n}\n\n/**\n * Detect the device type from a user agent string.\n *\n * @param ua - Raw user agent string\n * @param nav - Optional nav context; hardware signals take precedence over UA when available\n */\nexport function detectDevice(ua: string, nav?: DeviceNav): DeviceName {\n // ── UA-only detection (pure UA string signals) ───────────────────────────\n function uaDetect(): DeviceName | null {\n if (/PlayStation|Xbox|Nintendo/.test(ua)) return 'Console'\n if (/visionOS|Quest/.test(ua)) return 'XR'\n if (/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(ua)) return 'TV'\n if (/iPad/.test(ua)) return 'Tablet'\n if (/Android/.test(ua) && !/Mobile/.test(ua)) return 'Tablet'\n for (const def of DEVICE_DEFS) {\n if (def.detect.test(ua)) return def.name as DeviceName\n }\n return null\n }\n\n // ── Hardware signal detection ────────────────────────────────────────────\n // Signals ordered from most reliable (GPU renderer) to softest (pointer type).\n function hwDetect(): DeviceName | null {\n if (!nav) return null\n\n if (nav.webglRenderer) {\n // ANGLE prefix = desktop Chrome/Firefox translating WebGL via D3D or Metal.\n // Mobile devices use native GLES/Metal directly — ANGLE never appears there.\n // Check ANGLE first — it definitively identifies desktop and prevents\n // the MacIntel+touch check below from firing for DevTools emulation on Mac.\n if (/^ANGLE\\b/.test(nav.webglRenderer)) return 'PC'\n // Adreno = Qualcomm (Android), Mali = ARM (Android)\n if (/Adreno/i.test(nav.webglRenderer) || /Mali[-\\s]/i.test(nav.webglRenderer)) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n // Apple GPU appears on iPhone, iPad, and Apple Silicon Macs.\n // Use screenWidth to separate them: ≤1366 = iPhone/iPad footprint, >1366 = Mac display.\n if (/Apple GPU/i.test(nav.webglRenderer)) {\n const w = nav.screenWidth ?? 0\n if (w <= 1366) return w >= 768 ? 'Tablet' : 'Mobile'\n return 'PC'\n }\n }\n\n // iPadOS 13+ desktop mode reports MacIntel platform with real touch points.\n // Placed after GPU checks so DevTools emulation (which spoofs maxTouchPoints\n // but keeps ANGLE renderer) does not false-fire here.\n // Default to Tablet when screenWidth is unknown — iPads are almost always ≥768px.\n if (nav.platform === 'MacIntel' && (nav.maxTouchPoints ?? 0) > 1) {\n return (nav.screenWidth !== undefined && nav.screenWidth < 768) ? 'Mobile' : 'Tablet'\n }\n\n // WebGL MAX_TEXTURE_SIZE: mobile GPUs cap at ≤8192; desktop GPUs report ≥16384.\n if (\n nav.webglMaxTextureSize !== undefined && nav.webglMaxTextureSize <= 8192 &&\n (nav.maxTouchPoints ?? 0) > 1 &&\n (nav.screenWidth ?? 9999) < 1367\n ) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Compressed texture formats: pvrtc is PowerVR (iOS-only GPU family).\n if (nav.webglCompressedFormats?.pvrtc && !nav.webglCompressedFormats.s3tc) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // CSS env(safe-area-inset-top) > 0 means iOS with notch / Dynamic Island.\n if (nav.safeAreaInsetTop !== undefined && nav.safeAreaInsetTop > 0) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Mobile-exclusive browser APIs: vibration and device-motion are not\n // implemented in any desktop browser.\n if (nav.hasVibration || nav.hasDeviceMotion) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Mobile network type: 2G/3G connections are virtually absent on desktop.\n if (\n nav.connection?.effectiveType &&\n ['2g', '3g', 'slow-2g'].includes(nav.connection.effectiveType)\n ) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // High DPR (>2) + touch: desktop Retina (MacBook) tops at DPR=2; phones/tablets\n // start at DPR=3.\n if ((nav.devicePixelRatio ?? 0) > 2 && (nav.maxTouchPoints ?? 0) > 1) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Soft signal: touch-primary pointer with no hover capability.\n if (nav.pointerType === 'coarse' && nav.hoverCapability === false) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n return null\n }\n\n return hwDetect() ?? uaDetect() ?? 'PC'\n}\n\nexport interface VendorModelResult {\n vendor: string\n model: string\n}\n\nconst VENDOR_MAP: [RegExp, string][] = [\n [/^SM-|^GT-|^SGH-|^SCH-|^SHW-|^SPH-|^SAMSUNG /i, 'Samsung'],\n [/^Pixel |^Nexus /, 'Google'],\n [/^moto |^motorola /i, 'Motorola'],\n [/^HONOR /i, 'Honor'],\n [/^ELS-|^LYA-|^HMA-|^VOG-|^ANA-|^CLT-|^JNY-|^NOH-|^PLK-|^BAH-|^BKL-|^COL-|^DUB-|^FIG-|^KIW-|^MAR-|^VTR-|^WAS-/i, 'Huawei'],\n [/^CPH/, 'OPPO'],\n [/^RMX/, 'Realme'],\n [/^V\\d{4}[A-Z]|^vivo /i, 'Vivo'],\n [/^iqoo/i, 'Vivo'],\n [/^Redmi |^POCO |^Mi /, 'Xiaomi'],\n [/^2\\d{9}|^2\\d{3}[A-Z]/, 'Xiaomi'],\n [/^OnePlus |^IN2|^KB2|^LE2/i, 'OnePlus'],\n [/^LM-|^LGE |^LG-/i, 'LG'],\n [/^HTC/i, 'HTC'],\n [/^Nokia/i, 'Nokia'],\n [/^XQ-/, 'Sony'],\n [/^ASUS_|^ZB6|^ZS6|^ZE[56]/i, 'Asus'],\n [/^Quest /i, 'Meta'],\n]\n\nconst ANDROID_MODEL_RE = /Android [0-9.]+;(?:\\s*U;)?(?:\\s*[a-z]{2}[-_][a-zA-Z]{2,4};)?\\s*([^;)]+?)(?:\\s+Build\\/|[;)])/\n\n/**\n * Extract device vendor and model from a user agent string.\n * Returns 'unknown' for both when the UA does not carry recognisable device info.\n */\nexport function detectVendorModel(ua: string): VendorModelResult {\n // iOS / visionOS — vendor is always Apple\n if (/visionOS/.test(ua)) return { vendor: 'Apple', model: 'Apple Vision Pro' }\n if (/iPhone/.test(ua)) return { vendor: 'Apple', model: 'iPhone' }\n if (/iPad/.test(ua)) return { vendor: 'Apple', model: 'iPad' }\n if (/iPod/.test(ua)) return { vendor: 'Apple', model: 'iPod touch' }\n\n // Android — extract model string then infer vendor\n const m = ANDROID_MODEL_RE.exec(ua)\n if (m) {\n const model = m[1]!.trim()\n for (const [re, vendor] of VENDOR_MAP) {\n if (re.test(model)) return { vendor, model }\n }\n return { vendor: 'unknown', model }\n }\n\n return { vendor: 'unknown', model: 'unknown' }\n}\n","import type { BotCategory } from '../types.js'\n\nexport type BotName =\n | 'Googlebot'\n | 'Bingbot'\n | 'Baiduspider'\n | 'Bytespider'\n | 'YandexBot'\n | 'DuckDuckBot'\n | 'Slurp'\n | 'Sogou'\n | '360Spider'\n | 'Applebot-Extended'\n | 'Applebot'\n | 'Facebookbot'\n | 'Twitterbot'\n | 'LinkedInBot'\n | 'PinterestBot'\n | 'Slackbot'\n | 'Discordbot'\n | 'TelegramBot'\n | 'WhatsApp'\n | 'SemrushBot'\n | 'AhrefsBot'\n | 'MJ12bot'\n | 'PetalBot'\n | 'ScreamingFrog'\n | 'DataForSeoBot'\n | 'GPTBot'\n | 'OAI-SearchBot'\n | 'ChatGPT-User'\n | 'ClaudeBot'\n | 'Claude-User'\n | 'Claude-SearchBot'\n | 'PerplexityBot'\n | 'CCBot'\n | 'AdsBot'\n | 'Google-Extended'\n | 'Meta-ExternalAgent'\n | 'Amazonbot'\n | 'Diffbot'\n | 'cohere-ai'\n | 'MistralAI-User'\n | 'DeepSeekBot'\n | 'XAI-Crawler'\n | 'YouBot'\n | 'UptimeRobot'\n | 'ia_archiver'\n | 'GenericBot'\n | 'unknown'\n\nexport interface BotDef {\n name: BotName\n detect: RegExp\n category: BotCategory\n}\n\nexport const BOT_DEFS: readonly BotDef[] = [\n // Search engines\n { name: 'Googlebot', detect: /Googlebot/, category: 'search-engine' },\n { name: 'Bingbot', detect: /(bingbot|BingPreview)/, category: 'search-engine' },\n { name: 'Baiduspider', detect: /(Baiduspider|BaiduMobaider)/, category: 'search-engine' },\n { name: 'Bytespider', detect: /Bytespider/, category: 'search-engine' },\n { name: 'YandexBot', detect: /YandexBot/, category: 'search-engine' },\n { name: 'DuckDuckBot', detect: /DuckDuckBot/, category: 'search-engine' },\n { name: 'Slurp', detect: /Slurp/, category: 'search-engine' },\n { name: 'Sogou', detect: /(Sogou|sogou).*[Ss]pider/, category: 'search-engine' },\n { name: '360Spider', detect: /360Spider/, category: 'search-engine' },\n { name: 'PetalBot', detect: /PetalBot/, category: 'search-engine' },\n { name: 'Applebot-Extended', detect: /Applebot-Extended/, category: 'search-engine' },\n { name: 'Applebot', detect: /Applebot/, category: 'search-engine' },\n // Social media crawlers\n { name: 'Facebookbot', detect: /(facebookexternalhit|FacebookBot)/, category: 'social' },\n { name: 'Twitterbot', detect: /Twitterbot/, category: 'social' },\n { name: 'LinkedInBot', detect: /LinkedInBot/, category: 'social' },\n { name: 'PinterestBot', detect: /Pinterestbot/i, category: 'social' },\n // Messaging link preview bots\n { name: 'Slackbot', detect: /Slackbot/, category: 'link-preview' },\n { name: 'Discordbot', detect: /Discordbot/, category: 'link-preview' },\n { name: 'TelegramBot', detect: /TelegramBot/, category: 'link-preview' },\n { name: 'WhatsApp', detect: /WhatsApp/, category: 'link-preview' },\n // SEO tools\n { name: 'SemrushBot', detect: /SemrushBot/, category: 'seo-tool' },\n { name: 'AhrefsBot', detect: /AhrefsBot/, category: 'seo-tool' },\n { name: 'MJ12bot', detect: /MJ12bot/, category: 'seo-tool' },\n { name: 'ScreamingFrog', detect: /Screaming Frog/, category: 'seo-tool' },\n { name: 'DataForSeoBot', detect: /DataForSeoBot/, category: 'seo-tool' },\n // AI / LLM crawlers\n { name: 'GPTBot', detect: /GPTBot/, category: 'ai-llm' },\n { name: 'OAI-SearchBot', detect: /OAI-SearchBot/, category: 'ai-llm' },\n { name: 'ChatGPT-User', detect: /ChatGPT-User/, category: 'ai-llm' },\n { name: 'ClaudeBot', detect: /ClaudeBot/, category: 'ai-llm' },\n { name: 'Claude-User', detect: /Claude-User/, category: 'ai-llm' },\n { name: 'Claude-SearchBot', detect: /Claude-SearchBot/, category: 'ai-llm' },\n { name: 'PerplexityBot', detect: /PerplexityBot/, category: 'ai-llm' },\n { name: 'CCBot', detect: /CCBot/, category: 'ai-llm' },\n { name: 'AdsBot', detect: /AdsBot-Google/, category: 'search-engine' },\n { name: 'Google-Extended', detect: /Google-Extended/, category: 'ai-llm' },\n { name: 'Meta-ExternalAgent', detect: /meta-externalagent/i, category: 'ai-llm' },\n { name: 'Amazonbot', detect: /Amazonbot/, category: 'ai-llm' },\n { name: 'Diffbot', detect: /Diffbot/, category: 'ai-llm' },\n { name: 'cohere-ai', detect: /cohere-ai/, category: 'ai-llm' },\n { name: 'MistralAI-User', detect: /MistralAI-User/, category: 'ai-llm' },\n { name: 'DeepSeekBot', detect: /DeepSeekBot/, category: 'ai-llm' },\n { name: 'XAI-Crawler', detect: /XAI-Crawler/, category: 'ai-llm' },\n { name: 'YouBot', detect: /YouBot/, category: 'ai-llm' },\n // Monitoring / archiving\n { name: 'UptimeRobot', detect: /UptimeRobot/, category: 'monitoring' },\n { name: 'ia_archiver', detect: /ia_archiver/, category: 'monitoring' },\n // Generic catch-all (must be last)\n { name: 'GenericBot', detect: /(bot|crawler|spider|crawling|scraper)/i, category: 'generic' },\n] as const\n","import { BOT_DEFS, type BotDef, type BotName } from '../constants/bots.js'\nimport type { BotCategory } from '../types.js'\n\nexport type { BotDef }\n\nexport interface BotResult {\n isBot: boolean\n botName: BotName\n botCategory: BotCategory\n}\n\n/**\n * Detect whether the UA belongs to a bot, crawler, or spider.\n * Returns the specific bot name when recognised, 'GenericBot' for generic patterns,\n * or 'unknown' for regular user agents.\n *\n * Pass `customDefs` to prepend project-specific bot rules before the GenericBot catch-all.\n */\nexport function detectBot(ua: string, customDefs?: readonly BotDef[]): BotResult {\n const defs = customDefs\n ? [...BOT_DEFS.slice(0, -1), ...customDefs, BOT_DEFS[BOT_DEFS.length - 1]!]\n : BOT_DEFS\n for (const def of defs) {\n if (def.detect.test(ua)) {\n return { isBot: true, botName: def.name, botCategory: def.category }\n }\n }\n return { isBot: false, botName: 'unknown', botCategory: 'unknown' }\n}\n","export type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown'\n\nexport interface ArchDef {\n name: ArchName\n detect: RegExp\n}\n\n/**\n * Ordered from most specific to least specific.\n * First match wins (unlike browser/OS detection which keeps highest priority).\n */\nexport const ARCH_DEFS: readonly ArchDef[] = [\n // aarch64/arm64 explicit tokens + iOS devices (iPhone 5S+/iPad Air+ are exclusively arm64)\n { name: 'arm64', detect: /(aarch64|arm64|ARM64|iPhone|iPad|iPod)/ },\n { name: 'arm', detect: /\\bARM\\b/ },\n { name: 'x86_64', detect: /(x86_64|Win64|WOW64|x64;|amd64)/i },\n { name: 'x86', detect: /(i[36]86|i686|x86;)/ },\n] as const\n","import { ARCH_DEFS, type ArchName } from '../constants/arch.js'\nimport type { EnvContext } from '../utils/env-context.js'\n\n/**\n * Detect the CPU architecture using a 4-layer priority chain.\n *\n * Layer 1 (highest): UA Client Hints — precise, Chrome/Edge only\n * Layer 2: WebGL renderer string — resolves Apple Silicon vs Intel Mac\n * Layer 3: navigator.platform — synchronous, covers iPhone/iPad/Linux aarch64\n * Layer 4 (lowest): UA string pattern matching — existing behaviour, fallback\n */\nexport function detectArch(ua: string, ctx?: EnvContext): ArchName {\n // Layer 1: UA Client Hints (most reliable when available)\n if (ctx?.highEntropyData) {\n const { architecture, bitness } = ctx.highEntropyData\n if (architecture === 'arm') {\n return bitness === '64' ? 'arm64' : 'arm'\n }\n if (architecture === 'x86') {\n return bitness === '64' ? 'x86_64' : 'x86'\n }\n }\n\n // Layer 2: WebGL renderer — disambiguates Apple Silicon vs Intel Mac\n const renderer = ctx?.webglRenderer\n if (renderer) {\n // \"Apple M1/M2/M3\" (Chrome/Edge ANGLE) or \"Apple GPU\" (Safari Metal, no model exposed)\n // are exclusive to M-series / A-series hardware; Intel Macs never show \"Apple GPU\".\n if (\n /Apple\\s+(M\\d|A\\d{1,2}[A-Z]?)\\b/i.test(renderer) ||\n /APPLE M\\d/i.test(renderer) ||\n /^Apple GPU$/i.test(renderer)\n ) {\n return 'arm64'\n }\n if (/\\b(Intel|AMD|NVIDIA|Radeon)\\b/i.test(renderer)) {\n return 'x86_64'\n }\n }\n\n // Layer 3: navigator.platform — synchronous, broad coverage\n const platform = ctx?.platform\n if (platform) {\n if (/iPhone|iPad|iPod/.test(platform)) return 'arm64'\n if (/arm64|aarch64/i.test(platform)) return 'arm64'\n if (/arm/i.test(platform)) return 'arm'\n if (/Win64|WOW64|x86_64/i.test(platform)) return 'x86_64'\n if (/Win32|i686/i.test(platform)) return 'x86'\n }\n\n // Layer 4: UA string pattern matching (original behaviour)\n for (const def of ARCH_DEFS) {\n if (def.detect.test(ua)) {\n return def.name\n }\n }\n\n return 'unknown'\n}\n","/**\n * Patterns that indicate a headless, automated, or embedded browser environment.\n *\n * | Pattern | Source |\n * |------------------|-----------------------------------------------------|\n * | HeadlessChrome | Chrome launched with --headless flag |\n * | Headless | Generic headless marker in some frameworks |\n * | PhantomJS | PhantomJS (deprecated but still used) |\n * | Electron | Electron apps (not strictly headless, but automated)|\n * | Playwright | Playwright automation framework |\n * | jsdom | Node.js DOM simulation (vitest, jest-environment) |\n * | Selenium | Some WebDriver/Selenium setups inject this token |\n */\nconst HEADLESS_PATTERN = /(HeadlessChrome|Headless|PhantomJS|Electron\\/|Playwright|jsdom\\/|Selenium)/\n\n/**\n * Detect whether the UA belongs to a headless or automation-driven browser.\n *\n * Note: modern Puppeteer/Playwright using stealth mode can hide these markers.\n * This catches the common/unmodified cases only.\n */\nexport function detectHeadless(ua: string): boolean {\n return HEADLESS_PATTERN.test(ua)\n}\n","/**\n * Detect whether the UA is running inside a native app webview.\n *\n * - Android WebView: always includes \"; wv\" in the UA string.\n * - iOS WKWebView: iOS UA (contains \"like Mac OS X\") without Version/ and without Safari/\n * CriOS, FxiOS, and DuckDuckGo all include \"Safari/\" so they are not affected.\n */\nexport function isWebview(ua: string): boolean {\n if (/; wv/.test(ua)) return true\n if (/like Mac OS X/.test(ua) && !/Version\\//.test(ua) && !/Safari\\//.test(ua)) return true\n return false\n}\n","/**\n * A subset of the Navigator interface that our detectors need.\n * Accepting NavContext as a parameter makes every detector pure and testable.\n */\nexport interface NavContext {\n userAgent: string\n platform: string\n language: string\n browserLanguage?: string\n maxTouchPoints: number\n mimeTypes?: MimeTypeArray\n connection?: {\n saveData?: boolean\n effectiveType?: '4g' | '3g' | '2g' | 'slow-2g'\n rtt?: number\n downlink?: number\n }\n userAgentData?: {\n platform: string\n getHighEntropyValues(hints: string[]): Promise<Record<string, string>>\n }\n}\n\n/** Build a NavContext from the real browser `navigator`, or return a safe default for Node.js. */\nexport function getNavContext(): NavContext {\n if (typeof navigator === 'undefined') {\n return { userAgent: '', platform: '', language: '', maxTouchPoints: 0 }\n }\n return navigator as unknown as NavContext\n}\n\n/** Safely query a MIME type from the nav context. Returns false in non-browser envs. */\nexport function getMimeType(nav: NavContext, type: string): boolean {\n try {\n return !!nav.mimeTypes?.namedItem(type)\n } catch {\n return false\n }\n}\n\n/** Returns the normalised browser language (e.g. \"zh-CN\" → \"zh-CN\", \"en-us\" → \"en-US\"). */\nexport function getLanguage(nav: NavContext): string {\n const raw = nav.browserLanguage ?? nav.language ?? ''\n const normalised = raw.replace(/-\\w+/g, (w) => w.toUpperCase())\n return normalised || 'unknown'\n}\n","import type { EnvOption, BrowserName, OsName } from './types.js'\nimport { OS_DEFS } from './constants/os.js'\nimport { detectBrowser } from './detectors/browser.js'\nimport { detectEngine } from './detectors/engine.js'\nimport { detectOs } from './detectors/os.js'\nimport { detectDevice, detectVendorModel } from './detectors/device.js'\nimport { detectBot, type BotDef } from './detectors/bot.js'\nimport { detectArch } from './detectors/arch.js'\nimport { detectHeadless } from './detectors/headless.js'\nimport { isWebview } from './detectors/webview.js'\nimport { getMimeType, getLanguage, type NavContext } from './utils/navigator.js'\nimport type { EnvContext } from './utils/env-context.js'\n\nexport interface ParseOptions {\n /** Nav context to use for language, platform, MIME-type checks, and device detection. */\n nav?: NavContext\n /** Pre-resolved Windows version string (from getWindowsVersion()). Pass to avoid async races. */\n windowsVersion?: string | null\n /** Full env context from getEnvContext() — supersedes nav and windowsVersion when provided. */\n ctx?: EnvContext\n /** Additional bot definitions prepended before the GenericBot catch-all. */\n customBotDefs?: readonly BotDef[]\n /**\n * Explicit language override (BCP47, e.g. \"zh-CN\"). Useful for server-side parsing\n * where the Accept-Language header is available but no browser context exists.\n * Takes precedence over language derived from ctx/nav or UA string.\n */\n language?: string\n}\n\n// Priority-ordered brand → browser, derived from Client Hints fullVersionList.\n// More specific brands (Edge, Opera, Vivaldi) listed before the generic Chrome/Chromium\n// so that e.g. an Edge UA with both 'Microsoft Edge' and 'Chromium' resolves to Edge.\nconst BRAND_TO_BROWSER: ReadonlyArray<[string, BrowserName]> = [\n ['Microsoft Edge', 'Edge'],\n ['Opera', 'Opera'],\n ['Vivaldi', 'Vivaldi'],\n ['Brave', 'Brave'],\n ['Google Chrome', 'Chrome'],\n ['Chromium', 'Chromium'],\n]\n\n/**\n * Infer the OS from hardware context using a tiered trust model.\n *\n * Tier 1 — WebGL (unspoofable by DevTools):\n * pvrtc = PowerVR GPU → iOS only; ANGLE → desktop (blocks DevTools mobile emulation);\n * Adreno/Mali → Android.\n * Tier 2 — Client Hints with platformVersion (getHighEntropyValues call, harder to fake consistently).\n * Tier 3 — navigator.platform (reliable for Mac/Win/iOS; DevTools rarely changes this).\n * Tier 4 — Additional hardware signals: CSS safe-area-inset (iOS notch/Dynamic Island).\n * Tier 5 — chPlatform alone with Linux ARM corroboration (last-resort Android fallback).\n *\n * Generic 'Linux' is intentionally not returned — too ambiguous for server vs. desktop.\n */\nfunction osFromHardware(ctx: EnvContext): OsName | null {\n const p = (ctx.platform ?? '').toLowerCase()\n const chPlatform = ctx.userAgentData?.platform\n const platformVersion = ctx.highEntropyData?.platformVersion\n const hasPlatformVersion = !!(platformVersion && platformVersion !== '0.0.0')\n\n // Tier 1: WebGL — cannot be spoofed by DevTools device emulation\n // pvrtc = PowerVR GPU, exclusive to iOS; never present on Android or any desktop GPU\n if (ctx.webglCompressedFormats?.pvrtc && !ctx.webglCompressedFormats.s3tc) return 'iOS'\n // ANGLE = desktop Chromium translating WebGL via D3D/Metal — definitively not mobile.\n // Returning null when Mac/Win/ChromeOS can't be confirmed prevents DevTools iOS/Android\n // platform signals from leaking through when the real GPU exposes a desktop renderer.\n if (ctx.webglRenderer && /^ANGLE\\b/.test(ctx.webglRenderer)) {\n if (p.startsWith('mac') || chPlatform === 'macOS') return 'MacOS'\n if (p.startsWith('win') || chPlatform === 'Windows') return 'Windows'\n if (chPlatform === 'Chrome OS') return 'Chrome OS'\n // Cannot confirm which desktop OS — null blocks DevTools-spoofed os/osVersion from\n // leaking through. Note: if platformVersion were available, Tier 2 would already\n // have returned a specific OS before reaching this point, so null is safe here.\n return null\n }\n // Adreno (Qualcomm) and Mali (ARM) are Android-exclusive mobile GPU families\n if (ctx.webglRenderer && (/Adreno/i.test(ctx.webglRenderer) || /Mali[-\\s]/i.test(ctx.webglRenderer))) {\n return 'Android'\n }\n\n // Tier 2: Client Hints platform + platformVersion — requires getHighEntropyValues(),\n // harder to fake consistently across both fields simultaneously\n if (chPlatform && hasPlatformVersion) {\n const chMap: Partial<Record<string, OsName>> = {\n Windows: 'Windows', macOS: 'MacOS', Android: 'Android',\n iOS: 'iOS', 'Chrome OS': 'Chrome OS',\n }\n const mapped = chMap[chPlatform]\n if (mapped) return mapped\n }\n\n // Tier 3: navigator.platform — reliable for Mac/Win/iOS; DevTools rarely spoofs this\n if (p.startsWith('mac')) return 'MacOS'\n if (p.startsWith('win')) return 'Windows'\n if (p === 'iphone' || p === 'ipad' || p === 'ipod') return 'iOS'\n\n // Tier 4: Additional hardware signals\n // CSS env(safe-area-inset-top) > 0: iOS notch/Dynamic Island — OS-level, not fakeable by JS\n if ((ctx.safeAreaInsetTop ?? 0) > 0) return 'iOS'\n\n // Tier 5: chPlatform alone (easily spoofed) — minimal fallback\n if (chPlatform === 'Chrome OS') return 'Chrome OS'\n // Android: require Linux ARM corroboration — pure chPlatform='Android' alone is too easy to spoof\n if (chPlatform === 'Android' && (p.includes('android') || /^linux arm/i.test(ctx.platform ?? ''))) {\n return 'Android'\n }\n if (p.includes('android') || /^linux arm/i.test(ctx.platform ?? '')) return 'Android'\n\n return null\n}\n\n/**\n * Approximate navigator.platform from the UA string for UA-only mode.\n * Matches what real browsers return: 'MacIntel', 'Win32'/'Win64', 'iPhone', etc.\n */\nfunction platformFromUA(ua: string): string {\n if (/iPhone/.test(ua)) return 'iPhone'\n if (/iPad/.test(ua)) return 'iPad'\n if (/iPod/.test(ua)) return 'iPod'\n if (/Macintosh/.test(ua)) return 'MacIntel'\n if (/Windows NT/.test(ua)) return /Win64|WOW64/i.test(ua) ? 'Win64' : 'Win32'\n if (/CrOS/.test(ua)) return 'Linux x86_64'\n if (/Android/.test(ua)) return /aarch64|arm64/i.test(ua) ? 'Linux aarch64' : 'Linux armv8l'\n if (/Linux/.test(ua)) {\n if (/x86_64/i.test(ua)) return 'Linux x86_64'\n if (/aarch64|arm64/i.test(ua)) return 'Linux aarch64'\n return 'Linux'\n }\n return 'unknown'\n}\n\n/**\n * Extract a BCP47 locale from UA strings that embed it (e.g. some Android OEM browsers:\n * \"Linux; Android 10; zh-CN; ...\"). Standard Chrome/Firefox/Safari desktop UAs do not\n * include locale, so this returns 'unknown' for them.\n */\nfunction normalizeBCP47(raw: string): string {\n const parts = raw.replace(/_/g, '-').split('-')\n return parts.map((p, i) => {\n if (i === 0) return p.toLowerCase()\n if (p.length === 4) return p[0].toUpperCase() + p.slice(1).toLowerCase() // script subtag: TitleCase\n return p.toUpperCase() // region subtag: UPPERCASE\n }).join('-')\n}\n\n// ISO 639-1 whitelist — prevents false-positives on non-language UA tokens (arm, wv, rv…).\nconst ISO_639_1 = new Set([\n 'af','am','ar','az','be','bg','bn','bs','ca','cs','cy','da','de','el','en',\n 'es','et','eu','fa','fi','fr','ga','gl','gu','he','hi','hr','hu','hy','id',\n 'is','it','ja','ka','kk','km','kn','ko','lt','lv','mk','ml','mn','mr','ms',\n 'mt','my','nb','ne','nl','no','pa','pl','pt','ro','ru','si','sk','sl','sq',\n 'sr','sv','sw','ta','te','th','tl','tr','uk','ur','uz','vi','zh','zu',\n])\n\nfunction languageFromUA(ua: string): string {\n // WeChat / many app UAs: \"Language/zh_CN\", \"Language/zh-Hans-CN\", etc.\n const kwMatch = /\\bLanguage\\/([a-zA-Z]{2,3}(?:[-_][a-zA-Z]{2,4}){1,2})\\b/i.exec(ua)\n if (kwMatch) return normalizeBCP47(kwMatch[1])\n\n // Standard: \"; zh-CN;\" / \"; en-us;\" / \"; zh_CN;\" between delimiters.\n // Initial segment must be lowercase (filters OS names, Build strings, etc.).\n const re = /[;(]\\s*([a-z]{2,3}(?:[-_][A-Za-z]{2,4})+)\\s*[;)]/g\n let m\n while ((m = re.exec(ua)) !== null) {\n const parts = m[1].replace(/_/g, '-').split('-')\n if (parts.length >= 2) return normalizeBCP47(m[1])\n }\n\n // Bare 2-letter codes: \"; en;\" in older Android OEM UAs.\n // Whitelisted against ISO 639-1 to avoid matching architecture tokens (arm, wv…).\n const bare = /[;(]\\s*([a-z]{2,3})\\s*[;)]/g\n while ((m = bare.exec(ua)) !== null) {\n if (ISO_639_1.has(m[1])) return m[1]\n }\n\n return 'unknown'\n}\n\n/**\n * Parse a user agent string into a full browser/OS/engine/device description.\n *\n * Pure function — no global state, no singletons. All environment access is\n * supplied through `options.nav`; omit it for Node.js / testing contexts.\n */\nexport function parseUA(ua: string, options: ParseOptions = {}): EnvOption {\n const effectiveNav: EnvContext | NavContext | undefined = options.ctx ?? options.nav\n const effectiveWindowsVersion = options.ctx?.windowsVersion ?? options.windowsVersion\n\n const { browser: rawBrowser, version: rawVersion, browserType } = detectBrowser(ua)\n const { os: rawOs, osVersion: rawOsVersion, osVersionName } = detectOs(ua, effectiveWindowsVersion)\n let os: OsName = rawOs\n let osVersion: string = rawOsVersion\n const device = detectDevice(ua, effectiveNav)\n const { vendor, model } = detectVendorModel(ua)\n const arch = detectArch(ua, options.ctx ?? effectiveNav as EnvContext | undefined)\n const nav = effectiveNav\n const { isBot, botName, botCategory } = detectBot(ua, options.customBotDefs)\n const isHeadless = detectHeadless(ua)\n const language = options.language\n || (nav?.language || nav?.browserLanguage ? getLanguage(nav) : '')\n || languageFromUA(ua)\n const platform = nav?.platform || platformFromUA(ua)\n\n let browser: BrowserName = rawBrowser\n let version = rawVersion\n\n // Brave cannot be detected via UA (it mimics Chrome). Override when the\n // browser-side navigator.brave.isBrave() signal is available.\n if (options.ctx?.hasBrave) browser = 'Brave'\n\n // ── Post-detection overrides ────────────────────────────────────────────────\n\n // 360 browser disambiguation via Chrome global APIs and MIME types.\n // Only runs when a nav context is provided (browser environment).\n if (nav) {\n const chromeGlobal = typeof chrome !== 'undefined' ? chrome : undefined\n const chromeMatch = /Chrome\\/([\\d]+)/.exec(ua)\n const chromeMajor = chromeMatch ? parseInt(chromeMatch[1], 10) : 0\n\n if (chromeGlobal) {\n if (chromeGlobal.adblock2345 || chromeGlobal.common2345) {\n browser = '2345Explorer'\n version = 'unknown'\n } else {\n let is360 = false\n\n if (\n getMimeType(nav, 'application/360softmgrplugin') ||\n getMimeType(nav, 'application/mozilla-npqihooquicklogin') ||\n (chromeMajor > 36 && typeof showModalDialog !== 'undefined')\n ) {\n is360 = true\n } else if (chromeMajor > 45) {\n is360 = getMimeType(nav, 'application/vnd.chromium.remoting-viewer')\n if (!is360 && chromeMajor >= 69) {\n is360 =\n getMimeType(nav, 'application/hwepass2001.installepass2001') ||\n getMimeType(nav, 'application/asx')\n }\n }\n\n if (is360) {\n // 360EE only when saveData is explicitly enabled; default to 360SE\n const saveDataEnabled = nav.connection?.saveData === true\n if (getMimeType(nav, 'application/gameplugin') || !saveDataEnabled) {\n browser = '360SE'\n } else {\n browser = '360EE'\n }\n version = 'unknown' // re-derived below via browser lookup\n }\n }\n }\n }\n\n // Baidu UA can include Opera token — Opera takes priority\n if (browser === 'Baidu' && /(Opera|OPR|OPT)/.test(ua)) {\n browser = 'Opera'\n const opVer = /OPR\\/([\\d.]+)/.exec(ua) ?? /OPT\\/([\\d.]+)/.exec(ua) ?? /Opera\\/([\\d.]+)/.exec(ua)\n version = opVer?.[1] ?? 'unknown'\n }\n\n // Firefox Nightly: version string carries an 'a1' pre-release suffix (e.g. Firefox/128.0a1).\n if (browser === 'Firefox' && /Firefox\\/[\\d.]+a\\d/.test(ua)) {\n browser = 'Firefox Nightly'\n }\n\n // iOS 26+: Apple freezes \"CPU iPhone OS\" at the last iOS 18 value for web compatibility.\n // The Version/ token reliably reflects the real Safari/iOS version.\n if (os === 'iOS' && browser === 'Safari') {\n const m = /Version\\/([\\d.]+)/.exec(ua)\n if (m && parseInt(m[1], 10) > parseInt(osVersion, 10)) {\n osVersion = m[1]\n }\n }\n\n // macOS 26+: Apple unified version numbering — Safari major version = macOS major version.\n // UA still freezes \"Mac OS X 10_15_7\"; Version/ carries the real macOS version from 26+.\n if (os === 'MacOS' && browser === 'Safari') {\n const m = /Version\\/([\\d.]+)/.exec(ua)\n if (m && parseInt(m[1], 10) >= 26) {\n osVersion = m[1]\n }\n }\n\n // ── Hardware context: OS + osVersion + browser + version ──────────────────\n if (options.ctx) {\n const hwOs = osFromHardware(options.ctx)\n if (hwOs !== null) {\n if (hwOs !== rawOs) {\n os = hwOs\n osVersion = 'unknown'\n }\n // UA freezes macOS at 10.15.7 and Android version is often stale;\n // platformVersion carries the real value. Skip Windows — already resolved via getWindowsVersion().\n if (os !== 'Windows') {\n const pv = options.ctx.highEntropyData?.platformVersion\n if (pv && pv !== '0.0.0') {\n const parts = pv.split('.').map(Number)\n while (parts.length > 1 && parts[parts.length - 1] === 0) parts.pop()\n if (parts[0]) osVersion = parts.join('.')\n }\n }\n }\n\n const fullVersionList = options.ctx.highEntropyData?.fullVersionList\n if (fullVersionList) {\n for (const [brand, browserName] of BRAND_TO_BROWSER) {\n const entry = fullVersionList.find(e => e.brand === brand)\n if (entry?.version) {\n browser = browserName\n version = entry.version\n break\n }\n }\n }\n }\n\n const { engine, engineVersion } = detectEngine(ua, browser, version)\n\n const major = parseInt(version.split('.')[0] ?? '', 10)\n const versionMajor = Number.isNaN(major) ? 0 : major\n const connectionType = (options.ctx ?? options.nav)?.connection?.effectiveType ?? 'unknown'\n\n // Recompute osVersionName after any Windows 11 override in options.\n // Use tiered lookup: try '14.3' → '14' so that versionNames keyed on major version match too.\n const finalOsVersionName = (os === 'MacOS' || os === 'Windows')\n ? (() => {\n const map = OS_DEFS.find(d => d.name === os)?.versionNames\n if (!map) return 'unknown'\n const parts = osVersion.split('.')\n for (let len = parts.length; len >= 1; len--) {\n const key = parts.slice(0, len).join('.')\n if (Object.prototype.hasOwnProperty.call(map, key)) return map[key]!\n }\n return 'unknown'\n })()\n : osVersionName\n\n return {\n browser,\n version,\n versionMajor,\n browserType: browser === 'Brave' ? 'browser' : browserType,\n engine,\n engineVersion,\n os,\n osVersion,\n osVersionName: finalOsVersionName,\n device,\n vendor,\n model,\n arch,\n isWebview: isWebview(ua),\n isHeadless,\n isBot,\n botName,\n botCategory,\n language,\n platform,\n connectionType,\n }\n}\n","import type { NavContext } from './navigator.js'\nimport { getNavContext } from './navigator.js'\n\nexport interface UAHighEntropyValues {\n architecture?: string\n bitness?: string\n model?: string\n platformVersion?: string\n fullVersionList?: Array<{ brand: string; version: string }>\n}\n\nexport interface EnvContext extends NavContext {\n webglRenderer?: string\n webglVendor?: string\n webglMaxTextureSize?: number\n webglFragPrecision?: number\n webglCompressedFormats?: {\n s3tc: boolean // DXT/BC — desktop GPU\n pvrtc: boolean // PowerVR — iOS only\n etc2: boolean // GLES 3.0+ — Android mainstream\n astc: boolean // Adreno 4xx+ / Mali Txx+ — modern mobile\n }\n hardwareConcurrency?: number\n deviceMemory?: number\n devicePixelRatio?: number\n screenWidth?: number\n screenHeight?: number\n safeAreaInsetTop?: number\n audioSampleRate?: number\n hasVibration?: boolean\n hasDeviceMotion?: boolean\n pointerType?: 'coarse' | 'fine' | 'none'\n hoverCapability?: boolean\n fontProbes?: Record<string, boolean>\n highEntropyData?: UAHighEntropyValues\n windowsVersion?: string | null\n hasBrave?: boolean\n}\n\n// OS-specific system fonts used to cross-confirm UA-based OS detection.\n// Only ~5 fonts; each measureText() call is < 1ms total overhead < 5ms.\nconst OS_FONTS = [\n '.AppleSystemUIFont',\n 'Segoe UI',\n 'Noto Color Emoji',\n 'Ubuntu',\n 'HarmonyOS Sans',\n]\n\nfunction probeFonts(): Record<string, boolean> {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return {}\n const TEST = 'mmmmmmmmmmlli'\n ctx.font = '72px monospace'\n const baseline = ctx.measureText(TEST).width\n const result: Record<string, boolean> = {}\n for (const font of OS_FONTS) {\n ctx.font = `72px '${font}', monospace`\n result[font] = ctx.measureText(TEST).width !== baseline\n }\n return result\n } catch {\n return {}\n }\n}\n\nfunction getWebGLInfo(): {\n renderer?: string\n vendor?: string\n maxTextureSize?: number\n fragPrecision?: number\n compressedFormats?: { s3tc: boolean; pvrtc: boolean; etc2: boolean; astc: boolean }\n} {\n try {\n const canvas = document.createElement('canvas')\n const gl = (canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl')) as WebGLRenderingContext | null\n if (!gl) return {}\n const ext = gl.getExtension('WEBGL_debug_renderer_info')\n const result: ReturnType<typeof getWebGLInfo> = {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE) as number,\n fragPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT)?.rangeMax,\n compressedFormats: {\n s3tc: !!gl.getExtension('WEBGL_compressed_texture_s3tc'),\n pvrtc: !!gl.getExtension('WEBGL_compressed_texture_pvrtc'),\n etc2: !!gl.getExtension('WEBGL_compressed_texture_etc'),\n astc: !!gl.getExtension('WEBGL_compressed_texture_astc_ldr'),\n },\n }\n if (ext) {\n result.renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) as string\n result.vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL) as string\n }\n return result\n } catch {\n return {}\n }\n}\n\n// Probe CSS env(safe-area-inset-top). On iOS devices with notch / Dynamic Island\n// this returns a hardware-defined pixel value (47–59px). Desktop always returns 0.\n// The value originates from the OS rendering pipeline — it cannot be overridden via JS.\nfunction getSafeAreaInsetTop(): number {\n try {\n const el = document.createElement('div')\n el.style.cssText = 'position:fixed;top:env(safe-area-inset-top,0px);visibility:hidden;pointer-events:none'\n document.body.appendChild(el)\n const top = parseFloat(getComputedStyle(el).top)\n document.body.removeChild(el)\n return isNaN(top) ? 0 : top\n } catch {\n return 0\n }\n}\n\nfunction getAudioSampleRate(): number | undefined {\n try {\n const AC = window.AudioContext ?? (window as any).webkitAudioContext\n if (!AC) return undefined\n const ac = new AC() as AudioContext\n const rate = ac.sampleRate\n void ac.close()\n return rate\n } catch {\n return undefined\n }\n}\n\nfunction getPointerType(): 'coarse' | 'fine' | 'none' | undefined {\n try {\n if (window.matchMedia('(pointer: coarse)').matches) return 'coarse'\n if (window.matchMedia('(pointer: fine)').matches) return 'fine'\n if (window.matchMedia('(pointer: none)').matches) return 'none'\n } catch {\n // matchMedia unavailable\n }\n return undefined\n}\n\nfunction getHoverCapability(): boolean | undefined {\n try {\n return window.matchMedia('(hover: hover)').matches\n } catch {\n return undefined\n }\n}\n\nfunction deriveWindowsVersion(platformVersion: string | undefined): string | null {\n if (!platformVersion) return null\n const major = parseInt(platformVersion.split('.')[0] ?? '0', 10)\n return isNaN(major) ? null : major >= 13 ? '11' : '10'\n}\n\n/**\n * Collect all available browser signals into a single EnvContext.\n * Safe to call in Node.js/SSR — missing APIs degrade gracefully.\n * Await this once at app start, then pass the result to parseUA() as `options.ctx`.\n */\nexport async function getEnvContext(): Promise<EnvContext> {\n const base = getNavContext()\n\n const ctx: EnvContext = {\n userAgent: base.userAgent,\n platform: base.platform,\n language: base.language,\n maxTouchPoints: base.maxTouchPoints,\n }\n if (base.browserLanguage !== undefined) ctx.browserLanguage = base.browserLanguage\n if (base.mimeTypes !== undefined) ctx.mimeTypes = base.mimeTypes\n if (base.connection !== undefined) ctx.connection = base.connection\n if (base.userAgentData !== undefined) ctx.userAgentData = base.userAgentData\n\n if (typeof navigator !== 'undefined') {\n ctx.hardwareConcurrency = navigator.hardwareConcurrency\n ctx.deviceMemory = navigator.deviceMemory\n }\n\n if (typeof window !== 'undefined') {\n ctx.devicePixelRatio = window.devicePixelRatio\n ctx.screenWidth = window.screen?.width\n ctx.screenHeight = window.screen?.height\n ctx.safeAreaInsetTop = getSafeAreaInsetTop()\n ctx.pointerType = getPointerType()\n ctx.hoverCapability = getHoverCapability()\n ctx.fontProbes = probeFonts()\n ctx.audioSampleRate = getAudioSampleRate()\n ctx.hasVibration = 'vibrate' in navigator\n ctx.hasDeviceMotion = 'DeviceMotionEvent' in window\n try {\n ctx.hasBrave = await (navigator as unknown as { brave?: { isBrave?(): Promise<boolean> } }).brave?.isBrave?.() ?? false\n } catch {\n ctx.hasBrave = false\n }\n const { renderer, vendor, maxTextureSize, fragPrecision, compressedFormats } = getWebGLInfo()\n if (renderer !== undefined) ctx.webglRenderer = renderer\n if (vendor !== undefined) ctx.webglVendor = vendor\n if (maxTextureSize !== undefined) ctx.webglMaxTextureSize = maxTextureSize\n if (fragPrecision !== undefined) ctx.webglFragPrecision = fragPrecision\n if (compressedFormats !== undefined) ctx.webglCompressedFormats = compressedFormats\n }\n\n if (base.userAgentData) {\n try {\n const data = await base.userAgentData.getHighEntropyValues([\n 'architecture', 'bitness', 'model', 'platformVersion', 'fullVersionList',\n ])\n ctx.highEntropyData = {\n architecture: data['architecture'],\n bitness: data['bitness'],\n model: data['model'],\n platformVersion: data['platformVersion'],\n fullVersionList: data['fullVersionList'] as unknown as Array<{ brand: string; version: string }>,\n }\n if (base.userAgentData.platform === 'Windows') {\n ctx.windowsVersion = deriveWindowsVersion(data['platformVersion'])\n }\n } catch {\n // High entropy values unavailable (non-Chrome, permission denied, etc.)\n }\n }\n\n return ctx\n}\n","import pkg from '../package.json' with { type: 'json' }\nimport { parseUA } from './parse.js'\nimport { getNavContext, getLanguage } from './utils/navigator.js'\nimport { getEnvContext } from './utils/env-context.js'\nimport { isWebview } from './detectors/webview.js'\nimport type { EnvOption } from './types.js'\n\n// ── Named exports (tree-shakeable) ──────────────────────────────────────────\nexport type { EnvOption, BrowserName, OsName, EngineName, DeviceName, ArchName, BotName, BotCategory, BrowserType } from './types.js'\nexport { parseUA } from './parse.js'\nexport { getLanguage, getNavContext } from './utils/navigator.js'\nexport { getWindowsVersion } from './utils/windows-version.js'\nexport { getEnvContext, type EnvContext, type UAHighEntropyValues } from './utils/env-context.js'\nexport { detectBot } from './detectors/bot.js'\nexport type { BotDef } from './detectors/bot.js'\nexport { detectBrowser } from './detectors/browser.js'\nexport { detectOs as detectOS } from './detectors/os.js'\nexport { detectArch } from './detectors/arch.js'\nexport { detectEngine } from './detectors/engine.js'\nexport { detectDevice, detectVendorModel } from './detectors/device.js'\nexport type { VendorModelResult } from './detectors/device.js'\nexport { detectHeadless } from './detectors/headless.js'\nexport { isWebview } from './detectors/webview.js'\nexport { satisfies } from './utils/satisfies.js'\nexport { parseHeaders, ACCEPT_CH } from './parse-headers.js'\n\nconst { version: VERSION } = pkg\nexport { VERSION }\n\n// ── Default export — maintains v0.x call signature ──────────────────────────\n\n/**\n * Detect browser, OS, engine and device information from the current browser environment.\n */\nfunction uaBrowser(): EnvOption {\n const nav = getNavContext()\n return parseUA(nav.userAgent, { nav })\n}\n\n/**\n * Collect full hardware context and detect browser, OS, engine and device information.\n *\n * Hardware signals (Client Hints, WebGL, platform) take precedence over the UA string.\n * Async because Client Hints high-entropy values require a browser API call.\n */\nuaBrowser.detect = async (ua?: string): Promise<EnvOption> => {\n const ctx = await getEnvContext()\n return parseUA(ua ?? ctx.userAgent, { ctx })\n}\n\nuaBrowser.isWebview = isWebview\nuaBrowser.getLanguage = (): string => getLanguage(getNavContext())\nuaBrowser.VERSION = VERSION\n\nexport default uaBrowser\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/constants/os.ts","../src/constants/browsers.ts","../src/utils/extract.ts","../src/detectors/browser.ts","../src/constants/engines.ts","../src/detectors/engine.ts","../src/detectors/os.ts","../src/constants/devices.ts","../src/detectors/device.ts","../src/constants/bots.ts","../src/detectors/bot.ts","../src/constants/arch.ts","../src/detectors/arch.ts","../src/detectors/headless.ts","../src/detectors/webview.ts","../src/utils/navigator.ts","../src/parse.ts","../src/utils/env-context.ts","../src/index.ts"],"names":["package_default","OS_DEFS","BROWSER_DEFS","extractVersion","ua","pattern","m","v","extractVersionFromPatterns","patterns","p","lookupFromChromeVersion","table","major","detectBrowser","best","def","version","browserType","ENGINE_DEFS","ENGINE_VERSION_RE","detectEngine","browser","_a","_b","_c","_d","b","engine","engineVersion","lookupVersionName","map","parts","len","key","detectOs","windowsVersion","matchedDef","bestPriority","osVersion","raw","normalised","mapped","n","osVersionName","DEVICE_DEFS","detectDevice","nav","uaDetect","hwDetect","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","w","VENDOR_MAP","ANDROID_MODEL_RE","detectVendorModel","model","re","vendor","BOT_DEFS","detectBot","customDefs","defs","ARCH_DEFS","detectArch","ctx","architecture","bitness","renderer","platform","HEADLESS_PATTERN","detectHeadless","isWebview","getNavContext","getMimeType","type","e","getLanguage","BRAND_TO_BROWSER","osFromHardware","chPlatform","platformVersion","hasPlatformVersion","platformFromUA","normalizeBCP47","i","ISO_639_1","languageFromUA","kwMatch","bare","parseUA","options","effectiveNav","effectiveWindowsVersion","rawBrowser","rawVersion","rawOs","rawOsVersion","os","device","arch","isBot","botName","botCategory","isHeadless","language","chromeGlobal","chromeMatch","chromeMajor","is360","saveDataEnabled","opVer","hwOs","pv","fullVersionList","brand","browserName","entry","versionMajor","connectionType","finalOsVersionName","d","OS_FONTS","probeFonts","TEST","baseline","result","font","getWebGLInfo","canvas","gl","ext","getSafeAreaInsetTop","el","top","getAudioSampleRate","AC","ac","rate","getPointerType","getHoverCapability","deriveWindowsVersion","getEnvContext","base","maxTextureSize","fragPrecision","compressedFormats","data","VERSION","uaBrowser","src_default"],"mappings":"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","file":"index.min.js","sourcesContent":["{\n \"name\": \"ua-browser\",\n \"version\": \"1.4.3\",\n \"description\": \"uaBrowser - Browser, OS, engine and device detection from user agent strings. Supports Node.js. Zero dependencies.\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n },\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.mjs\"\n }\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"sideEffects\": false,\n \"browserslist\": [\n \"chrome >= 63\",\n \"safari >= 12\",\n \"firefox >= 55\",\n \"edge >= 79\"\n ],\n \"scripts\": {\n \"release\": \"pnpm build && changeset publish\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint src --ext .ts\",\n \"typecheck\": \"tsc -p tsconfig.build.json --noEmit\",\n \"docs:dev\": \"pnpm build && vitepress dev docs --host 0.0.0.0 --port 61199\",\n \"docs:build\": \"pnpm build && vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/yangtianxia/ua-browser.git\"\n },\n \"keywords\": [\n \"uaBrowser\",\n \"userAgent\",\n \"javascript\",\n \"typescript\",\n \"browser-detection\",\n \"user-agent-parser\"\n ],\n \"author\": \"yangtianxia\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/yangtianxia/ua-browser/issues\"\n },\n \"homepage\": \"https://github.com/yangtianxia/ua-browser#readme\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.29.4\",\n \"@typescript-eslint/eslint-plugin\": \"^7.0.0\",\n \"@typescript-eslint/parser\": \"^7.0.0\",\n \"@vitest/coverage-v8\": \"^1.6.0\",\n \"eslint\": \"^8.57.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.0\",\n \"vitepress\": \"^1.6.4\",\n \"vitest\": \"^1.6.0\",\n \"vue\": \"^3.5.32\"\n }\n}\n","import type { OsName } from '../types.js'\n\nexport interface OsDef {\n name: OsName\n /** Higher priority wins when multiple entries match the same UA. */\n priority: number\n detect: RegExp\n /** Capture-group regex(es) for OS version extraction. Tried in order; null = no version. */\n versionPattern: RegExp | RegExp[] | null\n /** Lookup table: raw version token → display version. */\n versionLookup?: Record<string, string>\n /** Human-readable version names: display version → name (e.g. '14' → 'Sonoma'). */\n versionNames?: Record<string, string>\n}\n\n// Priority 10: broad patterns that act as catch-alls (Linux, Windows).\n// Priority 20: standard OS entries with specific-enough patterns.\n// Priority 30: entries that must override a lower-priority match on the same UA\n// (Chrome OS over Linux; visionOS/tvOS over iOS; HarmonyOS/OpenHarmony over Android;\n// Windows Phone over Windows).\nexport const OS_DEFS: readonly OsDef[] = [\n { name: 'WebOS', priority: 20, detect: /hpwOS/, versionPattern: /hpwOS\\/([\\d.]+)/ },\n { name: 'Symbian', priority: 20, detect: /Symbian/, versionPattern: null },\n { name: 'MeeGo', priority: 20, detect: /MeeGo/, versionPattern: null },\n { name: 'BlackBerry', priority: 20, detect: /(BlackBerry|RIM)/, versionPattern: null },\n { name: 'FreeBSD', priority: 20, detect: /FreeBSD/, versionPattern: null },\n { name: 'Debian', priority: 20, detect: /Debian/, versionPattern: /Debian\\/([\\d.]+)/ },\n { name: 'Ubuntu', priority: 20, detect: /Ubuntu/, versionPattern: null },\n { name: 'Linux', priority: 10, detect: /(Linux|X11)/, versionPattern: null },\n { name: 'Chrome OS', priority: 30, detect: /CrOS/, versionPattern: null },\n { name: 'Tizen', priority: 20, detect: /Tizen/, versionPattern: /Tizen ([\\d.]+)/ },\n { name: 'iOS', priority: 20, detect: /like Mac OS X/, versionPattern: /OS ([\\d_]+) like/ },\n { name: 'MacOS', priority: 20, detect: /Macintosh/, versionPattern: /Mac OS X -?([\\d_.]+)/,\n versionNames: {\n '10.9': 'Mavericks', '10.10': 'Yosemite', '10.11': 'El Capitan',\n '10.12': 'Sierra', '10.13': 'High Sierra', '10.14': 'Mojave',\n '10.15': 'Catalina', '11': 'Big Sur', '12': 'Monterey',\n '13': 'Ventura', '14': 'Sonoma', '15': 'Sequoia',\n } },\n { name: 'visionOS', priority: 30, detect: /visionOS/, versionPattern: /visionOS ([\\d_]+)/ },\n { name: 'tvOS', priority: 30, detect: /Apple TV/, versionPattern: /OS ([\\d_]+) like/ },\n { name: 'Android', priority: 20, detect: /(Android|Adr)/, versionPattern: /(?:Android|Adr) ([\\d.]+)/ },\n { name: 'HarmonyOS', priority: 30, detect: /HarmonyOS/,\n versionPattern: [/HarmonyOS[\\s/]([\\d.]+)/, /Android ([\\d.]+)[;)]/],\n versionLookup: { '10': '2', '11': '3', '12': '3', '13': '4', '14': '4' } },\n { name: 'OpenHarmony', priority: 30, detect: /OpenHarmony/, versionPattern: /OpenHarmony[\\s/]([\\d.]+)/ },\n { name: 'KaiOS', priority: 30, detect: /KAIOS/, versionPattern: /KAIOS\\/([\\d.]+)/ },\n { name: 'Windows', priority: 10, detect: /Windows/, versionPattern: /Windows NT ([\\d.]+)/,\n versionLookup: {\n '10': '10', '6.4': '10', '6.3': '8.1', '6.2': '8',\n '6.1': '7', '6.0': 'Vista', '5.2': 'XP', '5.1': 'XP', '5.0': '2000'\n },\n versionNames: {\n '7': 'Windows 7', '8': 'Windows 8', '8.1': 'Windows 8.1',\n '10': 'Windows 10', '11': 'Windows 11',\n } },\n { name: 'Windows Phone', priority: 30, detect: /(IEMobile|Windows Phone)/, versionPattern: /Windows Phone(?: OS)? ([\\d.]+)/ },\n] as const\n","import type { BrowserName } from '../types.js'\n\nexport interface BrowserDef {\n name: BrowserName\n /** Detection regex — must match the UA for this browser to be a candidate. */\n detect: RegExp\n /**\n * Version extraction: capture-group regex (or array tried in order).\n * null = no direct version pattern (use chromeLookup only, or lookup table browsers).\n */\n versionPattern: RegExp | RegExp[] | null\n /** Chrome major-version → browser display version lookup (e.g. 360SE/EE, Liebao). */\n chromeLookup?: Record<string, string>\n /**\n * Detection priority. When multiple entries match the same UA, the one with\n * the highest priority wins. Explicit and verifiable — no reverse-iteration magic.\n */\n priority: number\n}\n\nexport const BROWSER_DEFS: readonly BrowserDef[] = [\n // ── Generic / low-priority base browsers ──────────────────────────────────\n { name: 'Safari', priority: 10, detect: /Safari/, versionPattern: /Version\\/([\\d.]+)/ },\n { name: 'Chrome', priority: 20, detect: /(Chrome|CriOS)/, versionPattern: [/Chrome\\/([\\d.]+)/, /CriOS\\/([\\d.]+)/] },\n { name: 'Arc', priority: 35, detect: /Arc\\//, versionPattern: /Arc\\/([\\d.]+)/ },\n { name: 'IE', priority: 30, detect: /(MSIE|Trident)/, versionPattern: [/MSIE ([\\d.]+)/, /rv:([\\d.]+)/] },\n { name: 'Edge', priority: 40, detect: /(Edge|Edg\\/|EdgA|EdgiOS)/, versionPattern: [/Edge\\/([\\d.]+)/, /Edg\\/([\\d.]+)/, /EdgA\\/([\\d.]+)/, /EdgiOS\\/([\\d.]+)/] },\n { name: 'Firefox', priority: 50, detect: /(Firefox|FxiOS)/, versionPattern: [/Firefox\\/([\\d.]+)/, /FxiOS\\/([\\d.]+)/] },\n { name: 'Firefox Focus', priority: 55, detect: /Focus/, versionPattern: /Focus\\/([\\d.]+)/ },\n { name: 'Chromium', priority: 60, detect: /Chromium/, versionPattern: /Chromium\\/([\\d.]+)/ },\n { name: 'Opera', priority: 70, detect: /(Opera|OPR|OPT)/, versionPattern: [/Opera\\/([\\d.]+)/, /OPR\\/([\\d.]+)/, /OPT\\/([\\d.]+)/] },\n { name: 'Vivaldi', priority: 80, detect: /Vivaldi/, versionPattern: /Vivaldi\\/([\\d.]+)/ },\n { name: 'Yandex', priority: 90, detect: /YaBrowser/, versionPattern: /YaBrowser\\/([\\d.]+)/ },\n { name: 'Samsung Internet', priority: 92, detect: /SamsungBrowser/, versionPattern: /SamsungBrowser\\/([\\d.]+)/ },\n { name: 'DuckDuckGo', priority: 94, detect: /(DuckDuckGo|Ddg)\\//, versionPattern: [/DuckDuckGo\\/([\\d.]+)/, /Ddg\\/([\\d.]+)/] },\n { name: 'Puffin', priority: 96, detect: /Puffin\\//, versionPattern: /Puffin\\/([\\d.]+)/ },\n { name: 'Coc Coc', priority: 130, detect: /coc_coc_browser/, versionPattern: /coc_coc_browser\\/([\\d.]+)/ },\n { name: 'Kindle', priority: 140, detect: /(Kindle|Silk\\/)/, versionPattern: /Version\\/([\\d.]+)/ },\n { name: 'Konqueror', priority: 160, detect: /Konqueror/, versionPattern: /Konqueror\\/([\\d.]+)/ },\n { name: 'SeaMonkey', priority: 180, detect: /SeaMonkey/, versionPattern: /SeaMonkey\\/([\\d.]+)/ },\n { name: 'Epiphany', priority: 190, detect: /Epiphany/, versionPattern: /Epiphany\\/([\\d.]+)/ },\n { name: 'Maxthon', priority: 200, detect: /Maxthon/, versionPattern: /Maxthon\\/([\\d.]+)/ },\n\n // ── Chinese / Asian browsers — higher priority than generic Chrome ─────────\n { name: '360', priority: 300, detect: /(QihooBrowser|QHBrowser)/, versionPattern: /QihooBrowser\\/([\\d.]+)/ },\n { name: '360SE', priority: 310, detect: /360SE/, versionPattern: null,\n chromeLookup: { '108': '14.0', '86': '13.0', '78': '12.0', '69': '11.0',\n '63': '10.0', '55': '9.1', '45': '8.1', '42': '8.0', '31': '7.0', '21': '6.3' } },\n { name: '360EE', priority: 320, detect: /360EE/, versionPattern: null,\n chromeLookup: { '86': '13.0', '78': '12.0', '69': '11.0', '63': '9.5',\n '55': '9.0', '50': '8.7', '30': '7.5' } },\n { name: 'UC', priority: 330, detect: /(UCBrowser|UBrowser|UCWEB)/, versionPattern: /UC?Browser\\/([\\d.]+)/ },\n { name: 'QQBrowser', priority: 340, detect: /(MQQBrowser|QQBrowser)/, versionPattern: [/MQQBrowser\\/([\\d.]+)/, /QQBrowser\\/([\\d.]+)/] },\n { name: 'QQ', priority: 345, detect: /QQ\\//, versionPattern: /QQ\\/([\\d.]+)/ },\n { name: 'Baidu', priority: 350, detect: /(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/, versionPattern: [/BIDUBrowser[\\s/]([\\d.]+)/, /baiduboxapp\\/([\\d.]+)/] },\n { name: 'Sogou', priority: 360, detect: /(MetaSr|Sogou)/, versionPattern: [/SE ([\\d.X]+)/, /SogouMobileBrowser\\/([\\d.]+)/] },\n { name: 'Liebao', priority: 370, detect: /(LBBROWSER|LieBaoFast)/, versionPattern: /LieBaoFast\\/([\\d.]+)/,\n chromeLookup: { '57': '6.5', '49': '6.0', '46': '5.9', '42': '5.3',\n '39': '5.2', '34': '5.0', '29': '4.5', '21': '4.0' } },\n { name: '2345Explorer', priority: 380, detect: /2345Explorer/, versionPattern: [/2345Explorer\\/([\\d.]+)/, /Mb2345Browser\\/([\\d.]+)/],\n chromeLookup: { '69': '10.0', '55': '9.9' } },\n { name: '115Browser', priority: 390, detect: /115Browser/, versionPattern: /115Browser\\/([\\d.]+)/ },\n { name: 'TheWorld', priority: 400, detect: /TheWorld/, versionPattern: /TheWorld ([\\d.]+)/ },\n { name: 'XiaoMi', priority: 410, detect: /MiuiBrowser/, versionPattern: /MiuiBrowser\\/([\\d.]+)/ },\n { name: 'Vivo', priority: 420, detect: /VivoBrowser/, versionPattern: /VivoBrowser\\/([\\d.]+)/ },\n { name: 'Huawei', priority: 430, detect: /HuaweiBrowser/, versionPattern: [/HuaweiBrowser\\/([\\d.]+)/, /Version\\/([\\d.]+)/] },\n { name: 'OPPO', priority: 440, detect: /HeyTapBrowser/, versionPattern: /HeyTapBrowser\\/([\\d.]+)/ },\n { name: 'Quark', priority: 450, detect: /Quark/, versionPattern: /Quark\\/([\\d.]+)/ },\n { name: 'Qiyu', priority: 460, detect: /Qiyu/, versionPattern: /Qiyu\\/([\\d.]+)/ },\n\n // ── App webviews — highest priority ───────────────────────────────────────\n { name: 'WechatWork', priority: 500, detect: /wxwork\\//, versionPattern: /wxwork\\/([\\d.]+)/ },\n { name: 'Wechat', priority: 510, detect: /MicroMessenger/, versionPattern: /MicroMessenger\\/([\\d.]+)/ },\n { name: 'Taobao', priority: 520, detect: /AliApp\\(TB/, versionPattern: /AliApp\\(TB\\/([\\d.]+)/ },\n { name: 'Alipay', priority: 530, detect: /AliApp\\(AP/, versionPattern: /AliApp\\(AP\\/([\\d.]+)/ },\n { name: 'Weibo', priority: 540, detect: /Weibo/, versionPattern: /weibo__([\\d.]+)/ },\n { name: 'Douban', priority: 550, detect: /com\\.douban\\.frodo/, versionPattern: /com\\.douban\\.frodo\\/([\\d.]+)/ },\n { name: 'Suning', priority: 560, detect: /SNEBUY-APP/, versionPattern: /SNEBUY-APP([\\d.]+)/ },\n { name: 'iQiYi', priority: 570, detect: /IqiyiApp/, versionPattern: /IqiyiVersion\\/([\\d.]+)/ },\n { name: 'DingTalk', priority: 580, detect: /DingTalk/, versionPattern: /DingTalk\\/([\\d.]+)/ },\n { name: 'Douyin', priority: 590, detect: /aweme/, versionPattern: /app_version\\/([\\d.]+)/ },\n { name: 'Bilibili', priority: 592, detect: /BiliBili\\//, versionPattern: /BiliBili\\/([\\d.]+)/ },\n { name: 'Kuaishou', priority: 594, detect: /Kwai\\//, versionPattern: /Kwai\\/([\\d.]+)/ },\n { name: 'Xiaohongshu', priority: 596, detect: /Xiaohongshu\\//, versionPattern: /Xiaohongshu\\/([\\d.]+)/ },\n { name: 'Feishu', priority: 597, detect: /(Lark|Feishu)\\//, versionPattern: [/Lark\\/([\\d.]+)/, /Feishu\\/([\\d.]+)/] },\n { name: 'Toutiao', priority: 598, detect: /NewsArticle\\//, versionPattern: /NewsArticle\\/([\\d.]+)/ },\n { name: 'JD', priority: 599, detect: /(jdpingou\\/|jdapp;)/, versionPattern: [/jdpingou\\/([\\d.]+)/, /jdapp;[^;]+;([\\d.]+)/] },\n { name: 'Meituan', priority: 600, detect: /MeituanHybrid\\//, versionPattern: /MeituanHybrid\\/([\\d.]+)/ },\n { name: 'Pinduoduo', priority: 601, detect: /Pinduoduo\\//, versionPattern: /Pinduoduo\\/([\\d.]+)/ },\n { name: 'Tmall', priority: 602, detect: /AliApp\\(TM/, versionPattern: /AliApp\\(TM\\/([\\d.]+)/ },\n { name: 'Eleme', priority: 603, detect: /AliApp\\(EM/, versionPattern: /AliApp\\(EM\\/([\\d.]+)/ },\n { name: 'Xianyu', priority: 604, detect: /AliApp\\(IDLEFISH/, versionPattern: /AliApp\\(IDLEFISH\\/([\\d.]+)/ },\n { name: 'Zhihu', priority: 605, detect: /(Zhihu\\/|osee2unifiedRelease\\/)/, versionPattern: [/Zhihu\\/([\\d.]+)/, /osee2unifiedRelease\\/([\\d.]+)/] },\n { name: 'NetEaseMusic', priority: 606, detect: /NeteaseMusic\\//, versionPattern: /NeteaseMusic\\/([\\d.]+)/ },\n { name: 'NetEaseNews', priority: 607, detect: /NTESnr\\//, versionPattern: /NTESnr\\/([\\d.]+)/ },\n { name: 'TencentVideo', priority: 608, detect: /qqlive\\//, versionPattern: /qqlive\\/([\\d.]+)/ },\n { name: 'Youku', priority: 609, detect: /Youku(?:HD|App)?\\/[\\d.]/, versionPattern: /Youku(?:HD|App)?\\/([\\d.]+)/ },\n { name: 'Ctrip', priority: 610, detect: /Ctrip\\//, versionPattern: /Ctrip\\/([\\d.]+)/ },\n { name: 'WeRead', priority: 611, detect: /(WeRead|wxread)\\//, versionPattern: [/WeRead\\/([\\d.]+)/, /wxread\\/([\\d.]+)/] },\n { name: 'Dianping', priority: 612, detect: /Dianping\\//, versionPattern: /Dianping\\/([\\d.]+)/ },\n { name: 'Mafengwo', priority: 613, detect: /Mafengwo\\//, versionPattern: /Mafengwo\\/([\\d.]+)/ },\n { name: 'Maoyan', priority: 614, detect: /MaoyanApp\\//, versionPattern: /MaoyanApp\\/([\\d.]+)/ },\n { name: 'WPSOffice', priority: 615, detect: /(wps_android|wps_ios|WPSOffice)\\//i, versionPattern: [/wps_(?:android|ios)\\/([\\d.]+)/i, /WPSOffice\\/([\\d.]+)/i] }\n] as const\n","/**\n * Extract the first capture group from `ua` using `pattern`.\n * Returns the matched string, or null if the pattern does not match.\n * Unlike String.replace(), this never returns the original input on no-match.\n */\nexport function extractVersion(ua: string, pattern: RegExp): string | null {\n const m = pattern.exec(ua)\n if (!m) return null\n const v = m[1]\n return v != null && v !== '' ? v : null\n}\n\n/**\n * Try each pattern in order; return the first non-null match, or null.\n */\nexport function extractVersionFromPatterns(ua: string, patterns: RegExp[]): string | null {\n for (const p of patterns) {\n const v = extractVersion(ua, p)\n if (v !== null) return v\n }\n return null\n}\n\n/**\n * Extract the Chrome major version from `ua` and look it up in a table.\n * Returns the mapped string on hit, or null on miss / no Chrome token.\n */\nexport function lookupFromChromeVersion(ua: string, table: Record<string, string>): string | null {\n const m = /Chrome\\/([\\d]+)/.exec(ua)\n if (!m) return null\n const major = m[1]\n return Object.prototype.hasOwnProperty.call(table, major) ? table[major] : null\n}\n","import type { BrowserName, BrowserType } from '../types.js'\nimport { BROWSER_DEFS } from '../constants/browsers.js'\nimport { extractVersionFromPatterns, lookupFromChromeVersion } from '../utils/extract.js'\n\nexport interface BrowserResult {\n browser: BrowserName\n version: string\n browserType: BrowserType\n priority: number\n}\n\n/**\n * Detect the browser name and version from a user agent string.\n *\n * When multiple BROWSER_DEFS entries match the same UA, the one with\n * the highest `priority` value wins (ties go to the later definition).\n */\nexport function detectBrowser(ua: string): BrowserResult {\n let best: (typeof BROWSER_DEFS)[number] | null = null\n\n for (const def of BROWSER_DEFS) {\n if (def.detect.test(ua)) {\n if (best === null || def.priority >= best.priority) {\n best = def\n }\n }\n }\n\n if (!best) return { browser: 'unknown', version: 'unknown', browserType: 'unknown', priority: 0 }\n\n let version: string | null = null\n\n // 1. Try Chrome-version lookup table (for browsers like 360SE/EE that version by Chrome major)\n if (best.chromeLookup) {\n version = lookupFromChromeVersion(ua, best.chromeLookup)\n }\n\n // 2. Fall back to direct regex extraction\n if (version === null && best.versionPattern !== null) {\n const patterns = Array.isArray(best.versionPattern)\n ? best.versionPattern\n : [best.versionPattern]\n version = extractVersionFromPatterns(ua, patterns)\n }\n\n const p = best.priority\n const browserType: BrowserType = p >= 500 ? 'app' : p >= 300 ? 'brand' : 'browser'\n return { browser: best.name, version: version ?? 'unknown', browserType, priority: p }\n}\n","export interface EngineDef {\n name: string\n detect: RegExp\n}\n\nexport const ENGINE_DEFS: readonly EngineDef[] = [\n { name: 'KHTML', detect: /KHTML\\// },\n { name: 'Trident', detect: /(Trident|NET CLR)/ },\n { name: 'Presto', detect: /Presto/ },\n { name: 'Gecko', detect: /Gecko\\// },\n { name: 'WebKit', detect: /AppleWebKit/ },\n // ArkWeb is HarmonyOS Next's rendering engine; only present in UAs that explicitly contain the\n // token. It must come last so it overrides the WebKit entry that also matches those UAs.\n { name: 'ArkWeb', detect: /ArkWeb/ },\n] as const\n","import type { EngineName } from '../types.js'\nimport { ENGINE_DEFS } from '../constants/engines.js'\nimport { detectBrowser } from './browser.js'\n\nexport interface EngineResult {\n engine: EngineName\n engineVersion: string\n}\n\nconst ENGINE_VERSION_RE: Record<string, RegExp> = {\n WebKit: /AppleWebKit\\/([\\d.]+)/,\n Blink: /AppleWebKit\\/([\\d.]+)/,\n ArkWeb: /AppleWebKit\\/([\\d.]+)/,\n Gecko: /Gecko\\/([\\d.]+)/,\n Trident: /Trident\\/([\\d.]+)/,\n Presto: /Presto\\/([\\d.]+)/,\n KHTML: /KHTML\\/([\\d.]+)/,\n}\n\n/**\n * Detect the rendering engine from a user agent string.\n *\n * @param ua - Raw user agent string\n * @param browser - Pre-detected browser name; auto-detected when omitted\n * @param version - Pre-detected browser version; auto-detected when omitted\n */\nexport function detectEngine(ua: string, browser?: string, version?: string): EngineResult {\n if (browser === undefined || version === undefined) {\n const b = detectBrowser(ua)\n browser = browser ?? b.browser\n version = version ?? b.version\n }\n let engine: EngineName = 'unknown'\n\n for (const def of ENGINE_DEFS) {\n if (def.detect.test(ua)) {\n engine = def.name as EngineName\n }\n }\n\n // Upgrade WebKit to Blink for Chrome 28+, Opera 15+, Yandex\n if (\n engine === 'WebKit' &&\n /(Chrome|CriOS)/.test(ua) &&\n parseInt((/Chrome\\/([\\d]+)/.exec(ua) ?? [])[1] ?? '0', 10) > 27\n ) {\n engine = 'Blink'\n } else if (browser === 'Opera' && parseInt(version, 10) > 12) {\n engine = 'Blink'\n } else if (browser === 'Yandex') {\n engine = 'Blink'\n }\n\n // Edge: Chromium-based Edge uses Blink (version > 75), legacy EdgeHTML below that\n if (browser === 'Edge') {\n engine = parseInt(version, 10) > 75 ? 'Blink' : 'EdgeHTML'\n }\n\n const engineVersion = ENGINE_VERSION_RE[engine]\n ? (ENGINE_VERSION_RE[engine]!.exec(ua)?.[1] ?? 'unknown')\n : 'unknown'\n\n return { engine, engineVersion }\n}\n","import type { OsName } from '../types.js'\nimport { OS_DEFS } from '../constants/os.js'\nimport { extractVersion, extractVersionFromPatterns } from '../utils/extract.js'\n\nexport interface OsResult {\n os: OsName\n osVersion: string\n osVersionName: string\n}\n\n/**\n * Look up a human-readable name for a version string, trying progressively shorter prefixes.\n * e.g. '14.3' tries '14.3' → '14'; '10.15.7' tries '10.15.7' → '10.15' → '10'.\n */\nfunction lookupVersionName(map: Record<string, string>, version: string): string {\n const parts = version.split('.')\n for (let len = parts.length; len >= 1; len--) {\n const key = parts.slice(0, len).join('.')\n if (Object.prototype.hasOwnProperty.call(map, key)) return map[key]!\n }\n return 'unknown'\n}\n\n/**\n * Detect the operating system and its version from a user agent string.\n *\n * @param ua - Raw user agent string\n * @param windowsVersion - Pre-resolved Windows 11/10 string from getWindowsVersion()\n * (avoids the async race condition of the old implementation)\n */\nexport function detectOs(ua: string, windowsVersion?: string | null): OsResult {\n let matchedDef: (typeof OS_DEFS)[number] | null = null\n let bestPriority = -1\n\n for (const def of OS_DEFS) {\n if (def.detect.test(ua) && def.priority > bestPriority) {\n matchedDef = def\n bestPriority = def.priority\n }\n }\n\n if (!matchedDef) return { os: 'unknown', osVersion: 'unknown', osVersionName: 'unknown' }\n\n let osVersion = 'unknown'\n\n if (matchedDef.versionPattern) {\n const raw = Array.isArray(matchedDef.versionPattern)\n ? extractVersionFromPatterns(ua, matchedDef.versionPattern)\n : extractVersion(ua, matchedDef.versionPattern)\n\n if (raw !== null) {\n // Normalise iOS underscore-separated version: \"17_4_1\" → \"17.4.1\"\n const normalised = raw.replace(/_/g, '.')\n\n if (matchedDef.versionLookup) {\n // Use lookup table if available (Windows NT, HarmonyOS)\n const mapped = Object.prototype.hasOwnProperty.call(matchedDef.versionLookup, normalised)\n ? matchedDef.versionLookup[normalised]\n : null\n\n if (mapped !== null) {\n osVersion = mapped\n } else if (matchedDef.name === 'Windows') {\n // For unknown Windows NT versions, fall back to the integer part\n const n = parseInt(normalised, 10)\n osVersion = isNaN(n) ? 'unknown' : n.toString()\n } else {\n // For other OS types (e.g. HarmonyOS Next), use raw version directly\n osVersion = normalised\n }\n } else {\n osVersion = normalised\n }\n }\n }\n\n // Windows 11 override — provided externally to avoid async race\n if (matchedDef.name === 'Windows' && windowsVersion) {\n osVersion = windowsVersion\n }\n\n const osVersionName = matchedDef.versionNames\n ? lookupVersionName(matchedDef.versionNames, osVersion)\n : 'unknown'\n return { os: matchedDef.name, osVersion, osVersionName }\n}\n","export interface DeviceDef {\n name: string\n detect: RegExp\n}\n\nexport const DEVICE_DEFS: readonly DeviceDef[] = [\n { name: 'Mobile', detect: /(Mobi|iPh)/ },\n { name: 'Tablet', detect: /(Tablet|Pad)/ }\n] as const\n","import type { DeviceName } from '../types.js'\nimport { DEVICE_DEFS } from '../constants/devices.js'\nimport type { NavContext } from '../utils/navigator.js'\n\ntype DeviceNav = Pick<NavContext, 'platform' | 'maxTouchPoints'> & {\n pointerType?: 'coarse' | 'fine' | 'none'\n hoverCapability?: boolean\n screenWidth?: number\n webglRenderer?: string\n webglMaxTextureSize?: number\n webglFragPrecision?: number\n webglCompressedFormats?: { s3tc: boolean; pvrtc: boolean; etc2: boolean; astc: boolean }\n safeAreaInsetTop?: number\n devicePixelRatio?: number\n hasVibration?: boolean\n hasDeviceMotion?: boolean\n connection?: { effectiveType?: string }\n}\n\n/**\n * Detect the device type from a user agent string.\n *\n * @param ua - Raw user agent string\n * @param nav - Optional nav context; hardware signals take precedence over UA when available\n */\nexport function detectDevice(ua: string, nav?: DeviceNav): DeviceName {\n // ── UA-only detection (pure UA string signals) ───────────────────────────\n function uaDetect(): DeviceName | null {\n if (/PlayStation|Xbox|Nintendo/.test(ua)) return 'Console'\n if (/visionOS|Quest/.test(ua)) return 'XR'\n if (/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(ua)) return 'TV'\n if (/iPad/.test(ua)) return 'Tablet'\n if (/Android/.test(ua) && !/Mobile/.test(ua)) return 'Tablet'\n for (const def of DEVICE_DEFS) {\n if (def.detect.test(ua)) return def.name as DeviceName\n }\n return null\n }\n\n // ── Hardware signal detection ────────────────────────────────────────────\n // Signals ordered from most reliable (GPU renderer) to softest (pointer type).\n function hwDetect(): DeviceName | null {\n if (!nav) return null\n\n if (nav.webglRenderer) {\n // ANGLE prefix = desktop Chrome/Firefox translating WebGL via D3D or Metal.\n // Mobile devices use native GLES/Metal directly — ANGLE never appears there.\n // Check ANGLE first — it definitively identifies desktop and prevents\n // the MacIntel+touch check below from firing for DevTools emulation on Mac.\n if (/^ANGLE\\b/.test(nav.webglRenderer)) return 'PC'\n // Adreno = Qualcomm (Android), Mali = ARM (Android)\n if (/Adreno/i.test(nav.webglRenderer) || /Mali[-\\s]/i.test(nav.webglRenderer)) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n // Apple GPU appears on iPhone, iPad, and Apple Silicon Macs.\n // Use screenWidth to separate them: ≤1366 = iPhone/iPad footprint, >1366 = Mac display.\n if (/Apple GPU/i.test(nav.webglRenderer)) {\n const w = nav.screenWidth ?? 0\n if (w <= 1366) return w >= 768 ? 'Tablet' : 'Mobile'\n return 'PC'\n }\n }\n\n // iPadOS 13+ desktop mode reports MacIntel platform with real touch points.\n // Placed after GPU checks so DevTools emulation (which spoofs maxTouchPoints\n // but keeps ANGLE renderer) does not false-fire here.\n // Default to Tablet when screenWidth is unknown — iPads are almost always ≥768px.\n if (nav.platform === 'MacIntel' && (nav.maxTouchPoints ?? 0) > 1) {\n return (nav.screenWidth !== undefined && nav.screenWidth < 768) ? 'Mobile' : 'Tablet'\n }\n\n // WebGL MAX_TEXTURE_SIZE: mobile GPUs cap at ≤8192; desktop GPUs report ≥16384.\n if (\n nav.webglMaxTextureSize !== undefined && nav.webglMaxTextureSize <= 8192 &&\n (nav.maxTouchPoints ?? 0) > 1 &&\n (nav.screenWidth ?? 9999) < 1367\n ) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Compressed texture formats: pvrtc is PowerVR (iOS-only GPU family).\n if (nav.webglCompressedFormats?.pvrtc && !nav.webglCompressedFormats.s3tc) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // CSS env(safe-area-inset-top) > 0 means iOS with notch / Dynamic Island.\n if (nav.safeAreaInsetTop !== undefined && nav.safeAreaInsetTop > 0) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Mobile-exclusive browser APIs: vibration and device-motion are not\n // implemented in any desktop browser.\n if (nav.hasVibration || nav.hasDeviceMotion) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Mobile network type: 2G/3G connections are virtually absent on desktop.\n if (\n nav.connection?.effectiveType &&\n ['2g', '3g', 'slow-2g'].includes(nav.connection.effectiveType)\n ) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // High DPR (>2) + touch: desktop Retina (MacBook) tops at DPR=2; phones/tablets\n // start at DPR=3.\n if ((nav.devicePixelRatio ?? 0) > 2 && (nav.maxTouchPoints ?? 0) > 1) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n // Soft signal: touch-primary pointer with no hover capability.\n if (nav.pointerType === 'coarse' && nav.hoverCapability === false) {\n return (nav.screenWidth ?? 0) >= 768 ? 'Tablet' : 'Mobile'\n }\n\n return null\n }\n\n return hwDetect() ?? uaDetect() ?? 'PC'\n}\n\nexport interface VendorModelResult {\n vendor: string\n model: string\n}\n\nconst VENDOR_MAP: [RegExp, string][] = [\n [/^SM-|^GT-|^SGH-|^SCH-|^SHW-|^SPH-|^SAMSUNG /i, 'Samsung'],\n [/^Pixel |^Nexus /, 'Google'],\n [/^moto |^motorola /i, 'Motorola'],\n [/^HONOR /i, 'Honor'],\n [/^ELS-|^LYA-|^HMA-|^VOG-|^ANA-|^CLT-|^JNY-|^NOH-|^PLK-|^BAH-|^BKL-|^COL-|^DUB-|^FIG-|^KIW-|^MAR-|^VTR-|^WAS-/i, 'Huawei'],\n [/^CPH/, 'OPPO'],\n [/^RMX/, 'Realme'],\n [/^V\\d{4}[A-Z]|^vivo /i, 'Vivo'],\n [/^iqoo/i, 'Vivo'],\n [/^Redmi |^POCO |^Mi /, 'Xiaomi'],\n [/^2\\d{9}|^2\\d{3}[A-Z]/, 'Xiaomi'],\n [/^OnePlus |^IN2|^KB2|^LE2/i, 'OnePlus'],\n [/^LM-|^LGE |^LG-/i, 'LG'],\n [/^HTC/i, 'HTC'],\n [/^Nokia/i, 'Nokia'],\n [/^XQ-/, 'Sony'],\n [/^ASUS_|^ZB6|^ZS6|^ZE[56]/i, 'Asus'],\n [/^Quest /i, 'Meta'],\n]\n\nconst ANDROID_MODEL_RE = /Android [0-9.]+;(?:\\s*U;)?(?:\\s*[a-z]{2}[-_][a-zA-Z]{2,4};)?\\s*([^;)]+?)(?:\\s+Build\\/|[;)])/\n\n/**\n * Extract device vendor and model from a user agent string.\n * Returns 'unknown' for both when the UA does not carry recognisable device info.\n */\nexport function detectVendorModel(ua: string): VendorModelResult {\n // iOS / visionOS — vendor is always Apple\n if (/visionOS/.test(ua)) return { vendor: 'Apple', model: 'Apple Vision Pro' }\n if (/iPhone/.test(ua)) return { vendor: 'Apple', model: 'iPhone' }\n if (/iPad/.test(ua)) return { vendor: 'Apple', model: 'iPad' }\n if (/iPod/.test(ua)) return { vendor: 'Apple', model: 'iPod touch' }\n\n // Android — extract model string then infer vendor\n const m = ANDROID_MODEL_RE.exec(ua)\n if (m) {\n const model = m[1]!.trim()\n for (const [re, vendor] of VENDOR_MAP) {\n if (re.test(model)) return { vendor, model }\n }\n return { vendor: 'unknown', model }\n }\n\n return { vendor: 'unknown', model: 'unknown' }\n}\n","import type { BotCategory } from '../types.js'\n\nexport type BotName =\n | 'Googlebot'\n | 'Bingbot'\n | 'Baiduspider'\n | 'Bytespider'\n | 'YandexBot'\n | 'DuckDuckBot'\n | 'Slurp'\n | 'Sogou'\n | '360Spider'\n | 'Applebot-Extended'\n | 'Applebot'\n | 'Facebookbot'\n | 'Twitterbot'\n | 'LinkedInBot'\n | 'PinterestBot'\n | 'Slackbot'\n | 'Discordbot'\n | 'TelegramBot'\n | 'WhatsApp'\n | 'SemrushBot'\n | 'AhrefsBot'\n | 'MJ12bot'\n | 'PetalBot'\n | 'ScreamingFrog'\n | 'DataForSeoBot'\n | 'GPTBot'\n | 'OAI-SearchBot'\n | 'ChatGPT-User'\n | 'ClaudeBot'\n | 'Claude-User'\n | 'Claude-SearchBot'\n | 'PerplexityBot'\n | 'CCBot'\n | 'AdsBot'\n | 'Google-Extended'\n | 'Meta-ExternalAgent'\n | 'Amazonbot'\n | 'Diffbot'\n | 'cohere-ai'\n | 'MistralAI-User'\n | 'DeepSeekBot'\n | 'XAI-Crawler'\n | 'YouBot'\n | 'UptimeRobot'\n | 'ia_archiver'\n | 'GenericBot'\n | 'unknown'\n\nexport interface BotDef {\n name: BotName\n detect: RegExp\n category: BotCategory\n}\n\nexport const BOT_DEFS: readonly BotDef[] = [\n // Search engines\n { name: 'Googlebot', detect: /Googlebot/, category: 'search-engine' },\n { name: 'Bingbot', detect: /(bingbot|BingPreview)/, category: 'search-engine' },\n { name: 'Baiduspider', detect: /(Baiduspider|BaiduMobaider)/, category: 'search-engine' },\n { name: 'Bytespider', detect: /Bytespider/, category: 'search-engine' },\n { name: 'YandexBot', detect: /YandexBot/, category: 'search-engine' },\n { name: 'DuckDuckBot', detect: /DuckDuckBot/, category: 'search-engine' },\n { name: 'Slurp', detect: /Slurp/, category: 'search-engine' },\n { name: 'Sogou', detect: /(Sogou|sogou).*[Ss]pider/, category: 'search-engine' },\n { name: '360Spider', detect: /360Spider/, category: 'search-engine' },\n { name: 'PetalBot', detect: /PetalBot/, category: 'search-engine' },\n { name: 'Applebot-Extended', detect: /Applebot-Extended/, category: 'search-engine' },\n { name: 'Applebot', detect: /Applebot/, category: 'search-engine' },\n // Social media crawlers\n { name: 'Facebookbot', detect: /(facebookexternalhit|FacebookBot)/, category: 'social' },\n { name: 'Twitterbot', detect: /Twitterbot/, category: 'social' },\n { name: 'LinkedInBot', detect: /LinkedInBot/, category: 'social' },\n { name: 'PinterestBot', detect: /Pinterestbot/i, category: 'social' },\n // Messaging link preview bots\n { name: 'Slackbot', detect: /Slackbot/, category: 'link-preview' },\n { name: 'Discordbot', detect: /Discordbot/, category: 'link-preview' },\n { name: 'TelegramBot', detect: /TelegramBot/, category: 'link-preview' },\n { name: 'WhatsApp', detect: /WhatsApp/, category: 'link-preview' },\n // SEO tools\n { name: 'SemrushBot', detect: /SemrushBot/, category: 'seo-tool' },\n { name: 'AhrefsBot', detect: /AhrefsBot/, category: 'seo-tool' },\n { name: 'MJ12bot', detect: /MJ12bot/, category: 'seo-tool' },\n { name: 'ScreamingFrog', detect: /Screaming Frog/, category: 'seo-tool' },\n { name: 'DataForSeoBot', detect: /DataForSeoBot/, category: 'seo-tool' },\n // AI / LLM crawlers\n { name: 'GPTBot', detect: /GPTBot/, category: 'ai-llm' },\n { name: 'OAI-SearchBot', detect: /OAI-SearchBot/, category: 'ai-llm' },\n { name: 'ChatGPT-User', detect: /ChatGPT-User/, category: 'ai-llm' },\n { name: 'ClaudeBot', detect: /ClaudeBot/, category: 'ai-llm' },\n { name: 'Claude-User', detect: /Claude-User/, category: 'ai-llm' },\n { name: 'Claude-SearchBot', detect: /Claude-SearchBot/, category: 'ai-llm' },\n { name: 'PerplexityBot', detect: /PerplexityBot/, category: 'ai-llm' },\n { name: 'CCBot', detect: /CCBot/, category: 'ai-llm' },\n { name: 'AdsBot', detect: /AdsBot-Google/, category: 'search-engine' },\n { name: 'Google-Extended', detect: /Google-Extended/, category: 'ai-llm' },\n { name: 'Meta-ExternalAgent', detect: /meta-externalagent/i, category: 'ai-llm' },\n { name: 'Amazonbot', detect: /Amazonbot/, category: 'ai-llm' },\n { name: 'Diffbot', detect: /Diffbot/, category: 'ai-llm' },\n { name: 'cohere-ai', detect: /cohere-ai/, category: 'ai-llm' },\n { name: 'MistralAI-User', detect: /MistralAI-User/, category: 'ai-llm' },\n { name: 'DeepSeekBot', detect: /DeepSeekBot/, category: 'ai-llm' },\n { name: 'XAI-Crawler', detect: /XAI-Crawler/, category: 'ai-llm' },\n { name: 'YouBot', detect: /YouBot/, category: 'ai-llm' },\n // Monitoring / archiving\n { name: 'UptimeRobot', detect: /UptimeRobot/, category: 'monitoring' },\n { name: 'ia_archiver', detect: /ia_archiver/, category: 'monitoring' },\n // Generic catch-all (must be last)\n { name: 'GenericBot', detect: /(bot|crawler|spider|crawling|scraper)/i, category: 'generic' },\n] as const\n","import { BOT_DEFS, type BotDef, type BotName } from '../constants/bots.js'\nimport type { BotCategory } from '../types.js'\n\nexport type { BotDef }\n\nexport interface BotResult {\n isBot: boolean\n botName: BotName\n botCategory: BotCategory\n}\n\n/**\n * Detect whether the UA belongs to a bot, crawler, or spider.\n * Returns the specific bot name when recognised, 'GenericBot' for generic patterns,\n * or 'unknown' for regular user agents.\n *\n * Pass `customDefs` to prepend project-specific bot rules before the GenericBot catch-all.\n */\nexport function detectBot(ua: string, customDefs?: readonly BotDef[]): BotResult {\n const defs = customDefs\n ? [...BOT_DEFS.slice(0, -1), ...customDefs, BOT_DEFS[BOT_DEFS.length - 1]!]\n : BOT_DEFS\n for (const def of defs) {\n if (def.detect.test(ua)) {\n return { isBot: true, botName: def.name, botCategory: def.category }\n }\n }\n return { isBot: false, botName: 'unknown', botCategory: 'unknown' }\n}\n","export type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown'\n\nexport interface ArchDef {\n name: ArchName\n detect: RegExp\n}\n\n/**\n * Ordered from most specific to least specific.\n * First match wins (unlike browser/OS detection which keeps highest priority).\n */\nexport const ARCH_DEFS: readonly ArchDef[] = [\n // aarch64/arm64 explicit tokens + iOS devices (iPhone 5S+/iPad Air+ are exclusively arm64)\n { name: 'arm64', detect: /(aarch64|arm64|ARM64|iPhone|iPad|iPod)/ },\n { name: 'arm', detect: /\\bARM\\b/ },\n { name: 'x86_64', detect: /(x86_64|Win64|WOW64|x64;|amd64)/i },\n { name: 'x86', detect: /(i[36]86|i686|x86;)/ },\n] as const\n","import { ARCH_DEFS, type ArchName } from '../constants/arch.js'\nimport type { EnvContext } from '../utils/env-context.js'\n\n/**\n * Detect the CPU architecture using a 4-layer priority chain.\n *\n * Layer 1 (highest): UA Client Hints — precise, Chrome/Edge only\n * Layer 2: WebGL renderer string — resolves Apple Silicon vs Intel Mac\n * Layer 3: navigator.platform — synchronous, covers iPhone/iPad/Linux aarch64\n * Layer 4 (lowest): UA string pattern matching — existing behaviour, fallback\n */\nexport function detectArch(ua: string, ctx?: EnvContext): ArchName {\n // Layer 1: UA Client Hints (most reliable when available)\n if (ctx?.highEntropyData) {\n const { architecture, bitness } = ctx.highEntropyData\n if (architecture === 'arm') {\n return bitness === '64' ? 'arm64' : 'arm'\n }\n if (architecture === 'x86') {\n return bitness === '64' ? 'x86_64' : 'x86'\n }\n }\n\n // Layer 2: WebGL renderer — disambiguates Apple Silicon vs Intel Mac\n const renderer = ctx?.webglRenderer\n if (renderer) {\n // \"Apple M1/M2/M3\" (Chrome/Edge ANGLE) or \"Apple GPU\" (Safari Metal, no model exposed)\n // are exclusive to M-series / A-series hardware; Intel Macs never show \"Apple GPU\".\n if (\n /Apple\\s+(M\\d|A\\d{1,2}[A-Z]?)\\b/i.test(renderer) ||\n /APPLE M\\d/i.test(renderer) ||\n /^Apple GPU$/i.test(renderer)\n ) {\n return 'arm64'\n }\n if (/\\b(Intel|AMD|NVIDIA|Radeon)\\b/i.test(renderer)) {\n return 'x86_64'\n }\n }\n\n // Layer 3: navigator.platform — synchronous, broad coverage\n const platform = ctx?.platform\n if (platform) {\n if (/iPhone|iPad|iPod/.test(platform)) return 'arm64'\n if (/arm64|aarch64/i.test(platform)) return 'arm64'\n if (/arm/i.test(platform)) return 'arm'\n if (/Win64|WOW64|x86_64/i.test(platform)) return 'x86_64'\n if (/Win32|i686/i.test(platform)) return 'x86'\n }\n\n // Layer 4: UA string pattern matching (original behaviour)\n for (const def of ARCH_DEFS) {\n if (def.detect.test(ua)) {\n return def.name\n }\n }\n\n return 'unknown'\n}\n","/**\n * Patterns that indicate a headless, automated, or embedded browser environment.\n *\n * | Pattern | Source |\n * |------------------|-----------------------------------------------------|\n * | HeadlessChrome | Chrome launched with --headless flag |\n * | Headless | Generic headless marker in some frameworks |\n * | PhantomJS | PhantomJS (deprecated but still used) |\n * | Electron | Electron apps (not strictly headless, but automated)|\n * | Playwright | Playwright automation framework |\n * | jsdom | Node.js DOM simulation (vitest, jest-environment) |\n * | Selenium | Some WebDriver/Selenium setups inject this token |\n */\nconst HEADLESS_PATTERN = /(HeadlessChrome|Headless|PhantomJS|Electron\\/|Playwright|jsdom\\/|Selenium)/\n\n/**\n * Detect whether the UA belongs to a headless or automation-driven browser.\n *\n * Note: modern Puppeteer/Playwright using stealth mode can hide these markers.\n * This catches the common/unmodified cases only.\n */\nexport function detectHeadless(ua: string): boolean {\n return HEADLESS_PATTERN.test(ua)\n}\n","/**\n * Detect whether the UA is running inside a native app webview.\n *\n * - Android WebView: always includes \"; wv\" in the UA string.\n * - iOS WKWebView: iOS UA (contains \"like Mac OS X\") without Version/ and without Safari/\n * CriOS, FxiOS, and DuckDuckGo all include \"Safari/\" so they are not affected.\n */\nexport function isWebview(ua: string): boolean {\n if (/; wv/.test(ua)) return true\n if (/like Mac OS X/.test(ua) && !/Version\\//.test(ua) && !/Safari\\//.test(ua)) return true\n return false\n}\n","/**\n * A subset of the Navigator interface that our detectors need.\n * Accepting NavContext as a parameter makes every detector pure and testable.\n */\nexport interface NavContext {\n userAgent: string\n platform: string\n language: string\n browserLanguage?: string\n maxTouchPoints: number\n mimeTypes?: MimeTypeArray\n connection?: {\n saveData?: boolean\n effectiveType?: '4g' | '3g' | '2g' | 'slow-2g'\n rtt?: number\n downlink?: number\n }\n userAgentData?: {\n platform: string\n getHighEntropyValues(hints: string[]): Promise<Record<string, string>>\n }\n}\n\n/** Build a NavContext from the real browser `navigator`, or return a safe default for Node.js. */\nexport function getNavContext(): NavContext {\n if (typeof navigator === 'undefined') {\n return { userAgent: '', platform: '', language: '', maxTouchPoints: 0 }\n }\n return navigator as unknown as NavContext\n}\n\n/** Safely query a MIME type from the nav context. Returns false in non-browser envs. */\nexport function getMimeType(nav: NavContext, type: string): boolean {\n try {\n return !!nav.mimeTypes?.namedItem(type)\n } catch {\n return false\n }\n}\n\n/** Returns the normalised browser language (e.g. \"zh-CN\" → \"zh-CN\", \"en-us\" → \"en-US\"). */\nexport function getLanguage(nav: NavContext): string {\n const raw = nav.browserLanguage ?? nav.language ?? ''\n const normalised = raw.replace(/-\\w+/g, (w) => w.toUpperCase())\n return normalised || 'unknown'\n}\n","import type { EnvOption, BrowserName, OsName } from './types.js'\nimport { OS_DEFS } from './constants/os.js'\nimport { detectBrowser } from './detectors/browser.js'\nimport { detectEngine } from './detectors/engine.js'\nimport { detectOs } from './detectors/os.js'\nimport { detectDevice, detectVendorModel } from './detectors/device.js'\nimport { detectBot, type BotDef } from './detectors/bot.js'\nimport { detectArch } from './detectors/arch.js'\nimport { detectHeadless } from './detectors/headless.js'\nimport { isWebview } from './detectors/webview.js'\nimport { getMimeType, getLanguage, type NavContext } from './utils/navigator.js'\nimport type { EnvContext } from './utils/env-context.js'\n\nexport interface ParseOptions {\n /** Nav context to use for language, platform, MIME-type checks, and device detection. */\n nav?: NavContext\n /** Pre-resolved Windows version string (from getWindowsVersion()). Pass to avoid async races. */\n windowsVersion?: string | null\n /** Full env context from getEnvContext() — supersedes nav and windowsVersion when provided. */\n ctx?: EnvContext\n /** Additional bot definitions prepended before the GenericBot catch-all. */\n customBotDefs?: readonly BotDef[]\n /**\n * Explicit language override (BCP47, e.g. \"zh-CN\"). Useful for server-side parsing\n * where the Accept-Language header is available but no browser context exists.\n * Takes precedence over language derived from ctx/nav or UA string.\n */\n language?: string\n}\n\n// Priority-ordered brand → browser, derived from Client Hints fullVersionList.\n// More specific brands (Edge, Opera, Vivaldi) listed before the generic Chrome/Chromium\n// so that e.g. an Edge UA with both 'Microsoft Edge' and 'Chromium' resolves to Edge.\nconst BRAND_TO_BROWSER: ReadonlyArray<[string, BrowserName]> = [\n ['Microsoft Edge', 'Edge'],\n ['Opera', 'Opera'],\n ['Vivaldi', 'Vivaldi'],\n ['Brave', 'Brave'],\n ['Google Chrome', 'Chrome'],\n ['Chromium', 'Chromium'],\n]\n\n/**\n * Infer the OS from hardware context using a tiered trust model.\n *\n * Tier 1 — WebGL (unspoofable by DevTools):\n * pvrtc = PowerVR GPU → iOS only; ANGLE → desktop (blocks DevTools mobile emulation);\n * Adreno/Mali → Android.\n * Tier 2 — Client Hints with platformVersion (getHighEntropyValues call, harder to fake consistently).\n * Tier 3 — navigator.platform (reliable for Mac/Win/iOS; DevTools rarely changes this).\n * Tier 4 — Additional hardware signals: CSS safe-area-inset (iOS notch/Dynamic Island).\n * Tier 5 — chPlatform alone with Linux ARM corroboration (last-resort Android fallback).\n *\n * Generic 'Linux' is intentionally not returned — too ambiguous for server vs. desktop.\n */\nfunction osFromHardware(ctx: EnvContext): OsName | null {\n const p = (ctx.platform ?? '').toLowerCase()\n const chPlatform = ctx.userAgentData?.platform\n const platformVersion = ctx.highEntropyData?.platformVersion\n const hasPlatformVersion = !!(platformVersion && platformVersion !== '0.0.0')\n\n // Tier 1: WebGL — cannot be spoofed by DevTools device emulation\n // pvrtc = PowerVR GPU, exclusive to iOS; never present on Android or any desktop GPU\n if (ctx.webglCompressedFormats?.pvrtc && !ctx.webglCompressedFormats.s3tc) return 'iOS'\n // ANGLE = desktop Chromium translating WebGL via D3D/Metal — definitively not mobile.\n // Returning null when Mac/Win/ChromeOS can't be confirmed prevents DevTools iOS/Android\n // platform signals from leaking through when the real GPU exposes a desktop renderer.\n if (ctx.webglRenderer && /^ANGLE\\b/.test(ctx.webglRenderer)) {\n if (p.startsWith('mac') || chPlatform === 'macOS') return 'MacOS'\n if (p.startsWith('win') || chPlatform === 'Windows') return 'Windows'\n if (chPlatform === 'Chrome OS') return 'Chrome OS'\n // Cannot confirm which desktop OS — null blocks DevTools-spoofed os/osVersion from\n // leaking through. Note: if platformVersion were available, Tier 2 would already\n // have returned a specific OS before reaching this point, so null is safe here.\n return null\n }\n // Adreno (Qualcomm) and Mali (ARM) are Android-exclusive mobile GPU families\n if (ctx.webglRenderer && (/Adreno/i.test(ctx.webglRenderer) || /Mali[-\\s]/i.test(ctx.webglRenderer))) {\n return 'Android'\n }\n\n // Tier 2: Client Hints platform + platformVersion — requires getHighEntropyValues(),\n // harder to fake consistently across both fields simultaneously\n if (chPlatform && hasPlatformVersion) {\n const chMap: Partial<Record<string, OsName>> = {\n Windows: 'Windows', macOS: 'MacOS', Android: 'Android',\n iOS: 'iOS', 'Chrome OS': 'Chrome OS',\n }\n const mapped = chMap[chPlatform]\n if (mapped) return mapped\n }\n\n // Tier 3: navigator.platform — reliable for Mac/Win/iOS; DevTools rarely spoofs this\n if (p.startsWith('mac')) return 'MacOS'\n if (p.startsWith('win')) return 'Windows'\n if (p === 'iphone' || p === 'ipad' || p === 'ipod') return 'iOS'\n\n // Tier 4: Additional hardware signals\n // CSS env(safe-area-inset-top) > 0: iOS notch/Dynamic Island — OS-level, not fakeable by JS\n if ((ctx.safeAreaInsetTop ?? 0) > 0) return 'iOS'\n\n // Tier 5: chPlatform alone (easily spoofed) — minimal fallback\n if (chPlatform === 'Chrome OS') return 'Chrome OS'\n // Android: require Linux ARM corroboration — pure chPlatform='Android' alone is too easy to spoof\n if (chPlatform === 'Android' && (p.includes('android') || /^linux arm/i.test(ctx.platform ?? ''))) {\n return 'Android'\n }\n if (p.includes('android') || /^linux arm/i.test(ctx.platform ?? '')) return 'Android'\n\n return null\n}\n\n/**\n * Approximate navigator.platform from the UA string for UA-only mode.\n * Matches what real browsers return: 'MacIntel', 'Win32'/'Win64', 'iPhone', etc.\n */\nfunction platformFromUA(ua: string): string {\n if (/iPhone/.test(ua)) return 'iPhone'\n if (/iPad/.test(ua)) return 'iPad'\n if (/iPod/.test(ua)) return 'iPod'\n if (/Macintosh/.test(ua)) return 'MacIntel'\n if (/Windows NT/.test(ua)) return /Win64|WOW64/i.test(ua) ? 'Win64' : 'Win32'\n if (/CrOS/.test(ua)) return 'Linux x86_64'\n if (/Android/.test(ua)) return /aarch64|arm64/i.test(ua) ? 'Linux aarch64' : 'Linux armv8l'\n if (/Linux/.test(ua)) {\n if (/x86_64/i.test(ua)) return 'Linux x86_64'\n if (/aarch64|arm64/i.test(ua)) return 'Linux aarch64'\n return 'Linux'\n }\n return 'unknown'\n}\n\n/**\n * Extract a BCP47 locale from UA strings that embed it (e.g. some Android OEM browsers:\n * \"Linux; Android 10; zh-CN; ...\"). Standard Chrome/Firefox/Safari desktop UAs do not\n * include locale, so this returns 'unknown' for them.\n */\nfunction normalizeBCP47(raw: string): string {\n const parts = raw.replace(/_/g, '-').split('-')\n return parts.map((p, i) => {\n if (i === 0) return p.toLowerCase()\n if (p.length === 4) return p[0].toUpperCase() + p.slice(1).toLowerCase() // script subtag: TitleCase\n return p.toUpperCase() // region subtag: UPPERCASE\n }).join('-')\n}\n\n// ISO 639-1 whitelist — prevents false-positives on non-language UA tokens (arm, wv, rv…).\nconst ISO_639_1 = new Set([\n 'af','am','ar','az','be','bg','bn','bs','ca','cs','cy','da','de','el','en',\n 'es','et','eu','fa','fi','fr','ga','gl','gu','he','hi','hr','hu','hy','id',\n 'is','it','ja','ka','kk','km','kn','ko','lt','lv','mk','ml','mn','mr','ms',\n 'mt','my','nb','ne','nl','no','pa','pl','pt','ro','ru','si','sk','sl','sq',\n 'sr','sv','sw','ta','te','th','tl','tr','uk','ur','uz','vi','zh','zu',\n])\n\nfunction languageFromUA(ua: string): string {\n // WeChat / many app UAs: \"Language/zh_CN\", \"Language/zh-Hans-CN\", etc.\n const kwMatch = /\\bLanguage\\/([a-zA-Z]{2,3}(?:[-_][a-zA-Z]{2,4}){1,2})\\b/i.exec(ua)\n if (kwMatch) return normalizeBCP47(kwMatch[1])\n\n // Standard: \"; zh-CN;\" / \"; en-us;\" / \"; zh_CN;\" between delimiters.\n // Initial segment must be lowercase (filters OS names, Build strings, etc.).\n const re = /[;(]\\s*([a-z]{2,3}(?:[-_][A-Za-z]{2,4})+)\\s*[;)]/g\n let m\n while ((m = re.exec(ua)) !== null) {\n const parts = m[1].replace(/_/g, '-').split('-')\n if (parts.length >= 2) return normalizeBCP47(m[1])\n }\n\n // Bare 2-letter codes: \"; en;\" in older Android OEM UAs.\n // Whitelisted against ISO 639-1 to avoid matching architecture tokens (arm, wv…).\n const bare = /[;(]\\s*([a-z]{2,3})\\s*[;)]/g\n while ((m = bare.exec(ua)) !== null) {\n if (ISO_639_1.has(m[1])) return m[1]\n }\n\n return 'unknown'\n}\n\n/**\n * Parse a user agent string into a full browser/OS/engine/device description.\n *\n * Pure function — no global state, no singletons. All environment access is\n * supplied through `options.nav`; omit it for Node.js / testing contexts.\n */\nexport function parseUA(ua: string, options: ParseOptions = {}): EnvOption {\n const effectiveNav: EnvContext | NavContext | undefined = options.ctx ?? options.nav\n const effectiveWindowsVersion = options.ctx?.windowsVersion ?? options.windowsVersion\n\n const { browser: rawBrowser, version: rawVersion, browserType } = detectBrowser(ua)\n const { os: rawOs, osVersion: rawOsVersion, osVersionName } = detectOs(ua, effectiveWindowsVersion)\n let os: OsName = rawOs\n let osVersion: string = rawOsVersion\n const device = detectDevice(ua, effectiveNav)\n const { vendor, model } = detectVendorModel(ua)\n const arch = detectArch(ua, options.ctx ?? effectiveNav as EnvContext | undefined)\n const nav = effectiveNav\n const { isBot, botName, botCategory } = detectBot(ua, options.customBotDefs)\n const isHeadless = detectHeadless(ua)\n const language = options.language\n || (nav?.language || nav?.browserLanguage ? getLanguage(nav) : '')\n || languageFromUA(ua)\n const platform = nav?.platform || platformFromUA(ua)\n\n let browser: BrowserName = rawBrowser\n let version = rawVersion\n\n // Brave cannot be detected via UA (it mimics Chrome). Override when the\n // browser-side navigator.brave.isBrave() signal is available.\n if (options.ctx?.hasBrave) browser = 'Brave'\n\n // ── Post-detection overrides ────────────────────────────────────────────────\n\n // 360 browser disambiguation via Chrome global APIs and MIME types.\n // Only runs when a nav context is provided (browser environment).\n if (nav) {\n const chromeGlobal = typeof chrome !== 'undefined' ? chrome : undefined\n const chromeMatch = /Chrome\\/([\\d]+)/.exec(ua)\n const chromeMajor = chromeMatch ? parseInt(chromeMatch[1], 10) : 0\n\n if (chromeGlobal) {\n if (chromeGlobal.adblock2345 || chromeGlobal.common2345) {\n browser = '2345Explorer'\n version = 'unknown'\n } else {\n let is360 = false\n\n if (\n getMimeType(nav, 'application/360softmgrplugin') ||\n getMimeType(nav, 'application/mozilla-npqihooquicklogin') ||\n (chromeMajor > 36 && typeof showModalDialog !== 'undefined')\n ) {\n is360 = true\n } else if (chromeMajor > 45) {\n is360 = getMimeType(nav, 'application/vnd.chromium.remoting-viewer')\n if (!is360 && chromeMajor >= 69) {\n is360 =\n getMimeType(nav, 'application/hwepass2001.installepass2001') ||\n getMimeType(nav, 'application/asx')\n }\n }\n\n if (is360) {\n // 360EE only when saveData is explicitly enabled; default to 360SE\n const saveDataEnabled = nav.connection?.saveData === true\n if (getMimeType(nav, 'application/gameplugin') || !saveDataEnabled) {\n browser = '360SE'\n } else {\n browser = '360EE'\n }\n version = 'unknown' // re-derived below via browser lookup\n }\n }\n }\n }\n\n // Baidu UA can include Opera token — Opera takes priority\n if (browser === 'Baidu' && /(Opera|OPR|OPT)/.test(ua)) {\n browser = 'Opera'\n const opVer = /OPR\\/([\\d.]+)/.exec(ua) ?? /OPT\\/([\\d.]+)/.exec(ua) ?? /Opera\\/([\\d.]+)/.exec(ua)\n version = opVer?.[1] ?? 'unknown'\n }\n\n // Firefox Nightly: version string carries an 'a1' pre-release suffix (e.g. Firefox/128.0a1).\n if (browser === 'Firefox' && /Firefox\\/[\\d.]+a\\d/.test(ua)) {\n browser = 'Firefox Nightly'\n }\n\n // iOS 26+: Apple freezes \"CPU iPhone OS\" at the last iOS 18 value for web compatibility.\n // The Version/ token reliably reflects the real Safari/iOS version.\n if (os === 'iOS' && browser === 'Safari') {\n const m = /Version\\/([\\d.]+)/.exec(ua)\n if (m && parseInt(m[1], 10) > parseInt(osVersion, 10)) {\n osVersion = m[1]\n }\n }\n\n // macOS 26+: Apple unified version numbering — Safari major version = macOS major version.\n // UA still freezes \"Mac OS X 10_15_7\"; Version/ carries the real macOS version from 26+.\n if (os === 'MacOS' && browser === 'Safari') {\n const m = /Version\\/([\\d.]+)/.exec(ua)\n if (m && parseInt(m[1], 10) >= 26) {\n osVersion = m[1]\n }\n }\n\n // ── Hardware context: OS + osVersion + browser + version ──────────────────\n if (options.ctx) {\n const hwOs = osFromHardware(options.ctx)\n if (hwOs !== null) {\n if (hwOs !== rawOs) {\n os = hwOs\n osVersion = 'unknown'\n }\n // UA freezes macOS at 10.15.7 and Android version is often stale;\n // platformVersion carries the real value. Skip Windows — already resolved via getWindowsVersion().\n if (os !== 'Windows') {\n const pv = options.ctx.highEntropyData?.platformVersion\n if (pv && pv !== '0.0.0') {\n const parts = pv.split('.').map(Number)\n while (parts.length > 1 && parts[parts.length - 1] === 0) parts.pop()\n if (parts[0]) osVersion = parts.join('.')\n }\n }\n }\n\n const fullVersionList = options.ctx.highEntropyData?.fullVersionList\n if (fullVersionList) {\n for (const [brand, browserName] of BRAND_TO_BROWSER) {\n const entry = fullVersionList.find(e => e.brand === brand)\n if (entry?.version) {\n browser = browserName\n version = entry.version\n break\n }\n }\n }\n }\n\n const { engine, engineVersion } = detectEngine(ua, browser, version)\n\n const major = parseInt(version.split('.')[0] ?? '', 10)\n const versionMajor = Number.isNaN(major) ? 0 : major\n const connectionType = (options.ctx ?? options.nav)?.connection?.effectiveType ?? 'unknown'\n\n // Recompute osVersionName after any Windows 11 override in options.\n // Use tiered lookup: try '14.3' → '14' so that versionNames keyed on major version match too.\n const finalOsVersionName = (os === 'MacOS' || os === 'Windows')\n ? (() => {\n const map = OS_DEFS.find(d => d.name === os)?.versionNames\n if (!map) return 'unknown'\n const parts = osVersion.split('.')\n for (let len = parts.length; len >= 1; len--) {\n const key = parts.slice(0, len).join('.')\n if (Object.prototype.hasOwnProperty.call(map, key)) return map[key]!\n }\n return 'unknown'\n })()\n : osVersionName\n\n return {\n browser,\n version,\n versionMajor,\n browserType: browser === 'Brave' ? 'browser' : browserType,\n engine,\n engineVersion,\n os,\n osVersion,\n osVersionName: finalOsVersionName,\n device,\n vendor,\n model,\n arch,\n isWebview: isWebview(ua),\n isHeadless,\n isBot,\n botName,\n botCategory,\n language,\n platform,\n connectionType,\n }\n}\n","import type { NavContext } from './navigator.js'\nimport { getNavContext } from './navigator.js'\n\nexport interface UAHighEntropyValues {\n architecture?: string\n bitness?: string\n model?: string\n platformVersion?: string\n fullVersionList?: Array<{ brand: string; version: string }>\n}\n\nexport interface EnvContext extends NavContext {\n webglRenderer?: string\n webglVendor?: string\n webglMaxTextureSize?: number\n webglFragPrecision?: number\n webglCompressedFormats?: {\n s3tc: boolean // DXT/BC — desktop GPU\n pvrtc: boolean // PowerVR — iOS only\n etc2: boolean // GLES 3.0+ — Android mainstream\n astc: boolean // Adreno 4xx+ / Mali Txx+ — modern mobile\n }\n hardwareConcurrency?: number\n deviceMemory?: number\n devicePixelRatio?: number\n screenWidth?: number\n screenHeight?: number\n safeAreaInsetTop?: number\n audioSampleRate?: number\n hasVibration?: boolean\n hasDeviceMotion?: boolean\n pointerType?: 'coarse' | 'fine' | 'none'\n hoverCapability?: boolean\n fontProbes?: Record<string, boolean>\n highEntropyData?: UAHighEntropyValues\n windowsVersion?: string | null\n hasBrave?: boolean\n}\n\n// OS-specific system fonts used to cross-confirm UA-based OS detection.\n// Only ~5 fonts; each measureText() call is < 1ms total overhead < 5ms.\nconst OS_FONTS = [\n '.AppleSystemUIFont',\n 'Segoe UI',\n 'Noto Color Emoji',\n 'Ubuntu',\n 'HarmonyOS Sans',\n]\n\nfunction probeFonts(): Record<string, boolean> {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return {}\n const TEST = 'mmmmmmmmmmlli'\n ctx.font = '72px monospace'\n const baseline = ctx.measureText(TEST).width\n const result: Record<string, boolean> = {}\n for (const font of OS_FONTS) {\n ctx.font = `72px '${font}', monospace`\n result[font] = ctx.measureText(TEST).width !== baseline\n }\n return result\n } catch {\n return {}\n }\n}\n\nfunction getWebGLInfo(): {\n renderer?: string\n vendor?: string\n maxTextureSize?: number\n fragPrecision?: number\n compressedFormats?: { s3tc: boolean; pvrtc: boolean; etc2: boolean; astc: boolean }\n} {\n try {\n const canvas = document.createElement('canvas')\n const gl = (canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl')) as WebGLRenderingContext | null\n if (!gl) return {}\n const ext = gl.getExtension('WEBGL_debug_renderer_info')\n const result: ReturnType<typeof getWebGLInfo> = {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE) as number,\n fragPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT)?.rangeMax,\n compressedFormats: {\n s3tc: !!gl.getExtension('WEBGL_compressed_texture_s3tc'),\n pvrtc: !!gl.getExtension('WEBGL_compressed_texture_pvrtc'),\n etc2: !!gl.getExtension('WEBGL_compressed_texture_etc'),\n astc: !!gl.getExtension('WEBGL_compressed_texture_astc_ldr'),\n },\n }\n if (ext) {\n result.renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) as string\n result.vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL) as string\n }\n return result\n } catch {\n return {}\n }\n}\n\n// Probe CSS env(safe-area-inset-top). On iOS devices with notch / Dynamic Island\n// this returns a hardware-defined pixel value (47–59px). Desktop always returns 0.\n// The value originates from the OS rendering pipeline — it cannot be overridden via JS.\nfunction getSafeAreaInsetTop(): number {\n try {\n const el = document.createElement('div')\n el.style.cssText = 'position:fixed;top:env(safe-area-inset-top,0px);visibility:hidden;pointer-events:none'\n document.body.appendChild(el)\n const top = parseFloat(getComputedStyle(el).top)\n document.body.removeChild(el)\n return isNaN(top) ? 0 : top\n } catch {\n return 0\n }\n}\n\nfunction getAudioSampleRate(): number | undefined {\n try {\n const AC = window.AudioContext ?? (window as any).webkitAudioContext\n if (!AC) return undefined\n const ac = new AC() as AudioContext\n const rate = ac.sampleRate\n void ac.close()\n return rate\n } catch {\n return undefined\n }\n}\n\nfunction getPointerType(): 'coarse' | 'fine' | 'none' | undefined {\n try {\n if (window.matchMedia('(pointer: coarse)').matches) return 'coarse'\n if (window.matchMedia('(pointer: fine)').matches) return 'fine'\n if (window.matchMedia('(pointer: none)').matches) return 'none'\n } catch {\n // matchMedia unavailable\n }\n return undefined\n}\n\nfunction getHoverCapability(): boolean | undefined {\n try {\n return window.matchMedia('(hover: hover)').matches\n } catch {\n return undefined\n }\n}\n\nfunction deriveWindowsVersion(platformVersion: string | undefined): string | null {\n if (!platformVersion) return null\n const major = parseInt(platformVersion.split('.')[0] ?? '0', 10)\n return isNaN(major) ? null : major >= 13 ? '11' : '10'\n}\n\n/**\n * Collect all available browser signals into a single EnvContext.\n * Safe to call in Node.js/SSR — missing APIs degrade gracefully.\n * Await this once at app start, then pass the result to parseUA() as `options.ctx`.\n */\nexport async function getEnvContext(): Promise<EnvContext> {\n const base = getNavContext()\n\n const ctx: EnvContext = {\n userAgent: base.userAgent,\n platform: base.platform,\n language: base.language,\n maxTouchPoints: base.maxTouchPoints,\n }\n if (base.browserLanguage !== undefined) ctx.browserLanguage = base.browserLanguage\n if (base.mimeTypes !== undefined) ctx.mimeTypes = base.mimeTypes\n if (base.connection !== undefined) ctx.connection = base.connection\n if (base.userAgentData !== undefined) ctx.userAgentData = base.userAgentData\n\n if (typeof navigator !== 'undefined') {\n ctx.hardwareConcurrency = navigator.hardwareConcurrency\n ctx.deviceMemory = navigator.deviceMemory\n }\n\n if (typeof window !== 'undefined') {\n ctx.devicePixelRatio = window.devicePixelRatio\n ctx.screenWidth = window.screen?.width\n ctx.screenHeight = window.screen?.height\n ctx.safeAreaInsetTop = getSafeAreaInsetTop()\n ctx.pointerType = getPointerType()\n ctx.hoverCapability = getHoverCapability()\n ctx.fontProbes = probeFonts()\n ctx.audioSampleRate = getAudioSampleRate()\n ctx.hasVibration = 'vibrate' in navigator\n ctx.hasDeviceMotion = 'DeviceMotionEvent' in window\n try {\n ctx.hasBrave = await (navigator as unknown as { brave?: { isBrave?(): Promise<boolean> } }).brave?.isBrave?.() ?? false\n } catch {\n ctx.hasBrave = false\n }\n const { renderer, vendor, maxTextureSize, fragPrecision, compressedFormats } = getWebGLInfo()\n if (renderer !== undefined) ctx.webglRenderer = renderer\n if (vendor !== undefined) ctx.webglVendor = vendor\n if (maxTextureSize !== undefined) ctx.webglMaxTextureSize = maxTextureSize\n if (fragPrecision !== undefined) ctx.webglFragPrecision = fragPrecision\n if (compressedFormats !== undefined) ctx.webglCompressedFormats = compressedFormats\n }\n\n if (base.userAgentData) {\n try {\n const data = await base.userAgentData.getHighEntropyValues([\n 'architecture', 'bitness', 'model', 'platformVersion', 'fullVersionList',\n ])\n ctx.highEntropyData = {\n architecture: data['architecture'],\n bitness: data['bitness'],\n model: data['model'],\n platformVersion: data['platformVersion'],\n fullVersionList: data['fullVersionList'] as unknown as Array<{ brand: string; version: string }>,\n }\n if (base.userAgentData.platform === 'Windows') {\n ctx.windowsVersion = deriveWindowsVersion(data['platformVersion'])\n }\n } catch {\n // High entropy values unavailable (non-Chrome, permission denied, etc.)\n }\n }\n\n return ctx\n}\n","import pkg from '../package.json' with { type: 'json' }\nimport { parseUA } from './parse.js'\nimport { getNavContext, getLanguage } from './utils/navigator.js'\nimport { getEnvContext } from './utils/env-context.js'\nimport { isWebview } from './detectors/webview.js'\nimport type { EnvOption } from './types.js'\n\n// ── Named exports (tree-shakeable) ──────────────────────────────────────────\nexport type { EnvOption, BrowserName, OsName, EngineName, DeviceName, ArchName, BotName, BotCategory, BrowserType } from './types.js'\nexport { parseUA } from './parse.js'\nexport { getLanguage, getNavContext } from './utils/navigator.js'\nexport { getWindowsVersion } from './utils/windows-version.js'\nexport { getEnvContext, type EnvContext, type UAHighEntropyValues } from './utils/env-context.js'\nexport { detectBot } from './detectors/bot.js'\nexport type { BotDef } from './detectors/bot.js'\nexport { detectBrowser } from './detectors/browser.js'\nexport { detectOs as detectOS } from './detectors/os.js'\nexport { detectArch } from './detectors/arch.js'\nexport { detectEngine } from './detectors/engine.js'\nexport { detectDevice, detectVendorModel } from './detectors/device.js'\nexport type { VendorModelResult } from './detectors/device.js'\nexport { detectHeadless } from './detectors/headless.js'\nexport { isWebview } from './detectors/webview.js'\nexport { satisfies } from './utils/satisfies.js'\nexport { parseHeaders, ACCEPT_CH } from './parse-headers.js'\n\nconst { version: VERSION } = pkg\nexport { VERSION }\n\n// ── Default export — maintains v0.x call signature ──────────────────────────\n\n/**\n * Detect browser, OS, engine and device information from the current browser environment.\n */\nfunction uaBrowser(): EnvOption {\n const nav = getNavContext()\n return parseUA(nav.userAgent, { nav })\n}\n\n/**\n * Collect full hardware context and detect browser, OS, engine and device information.\n *\n * Hardware signals (Client Hints, WebGL, platform) take precedence over the UA string.\n * Async because Client Hints high-entropy values require a browser API call.\n */\nuaBrowser.detect = async (ua?: string): Promise<EnvOption> => {\n const ctx = await getEnvContext()\n return parseUA(ua ?? ctx.userAgent, { ctx })\n}\n\nuaBrowser.isWebview = isWebview\nuaBrowser.getLanguage = (): string => getLanguage(getNavContext())\nuaBrowser.VERSION = VERSION\n\nexport default uaBrowser\n"]}
|