ua-browser 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -24
- package/README.zh-CN.md +49 -25
- package/dist/index.cjs +9 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -6
- package/dist/index.d.ts +2 -6
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +10 -24
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/constants/browsers.ts","../src/utils/extract.ts","../src/detectors/browser.ts","../src/constants/engines.ts","../src/detectors/engine.ts","../src/constants/os.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/windows-version.ts","../src/utils/env-context.ts","../src/parse-headers.ts","../src/index.ts"],"names":["deriveWindowsVersion"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"ua-browser\",\n \"version\": \"1.1.0\",\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\",\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 { 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: '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\\//, versionPattern: /DuckDuckGo\\/([\\d.]+)/ },\n { name: 'Puffin', priority: 96, detect: /Puffin\\//, versionPattern: /Puffin\\/([\\d.]+)/ },\n { name: 'Arora', priority: 100, detect: /Arora/, versionPattern: /Arora\\/([\\d.]+)/ },\n { name: 'Lunascape', priority: 110, detect: /Lunascape/, versionPattern: /Lunascape[\\s]([\\d.]+)/ },\n { name: 'QupZilla', priority: 120, detect: /QupZilla/, versionPattern: /QupZilla[\\s]([\\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: 'Iceweasel', priority: 150, detect: /Iceweasel/, versionPattern: /Iceweasel\\/([\\d.]+)/ },\n { name: 'Konqueror', priority: 160, detect: /Konqueror/, versionPattern: /Konqueror\\/([\\d.]+)/ },\n { name: 'Iceape', priority: 170, detect: /Iceape/, versionPattern: /Iceape\\/([\\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: /QQBrowser/, versionPattern: /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] 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 } 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}\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' }\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 return { browser: best.name, version: version ?? 'unknown' }\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'\n\n/**\n * Detect the rendering engine, with post-detection upgrades for Blink and EdgeHTML.\n *\n * @param ua - Raw user agent string\n * @param browser - Already-detected browser name (for Blink/EdgeHTML disambiguation)\n * @param version - Already-detected browser version string\n */\nexport function detectEngine(ua: string, browser: string, version: string): EngineName {\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 return engine\n}\n","import type { OsName } from '../types.js'\n\nexport interface OsDef {\n name: OsName\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}\n\n// Detection uses last-match-wins: entries that appear later override earlier matches.\n// More specific OS entries must come AFTER the generic ones they supersede.\nexport const OS_DEFS: readonly OsDef[] = [\n { name: 'WebOS', detect: /hpwOS/, versionPattern: /hpwOS\\/([\\d.]+)/ },\n { name: 'Symbian', detect: /Symbian/, versionPattern: null },\n { name: 'MeeGo', detect: /MeeGo/, versionPattern: null },\n { name: 'BlackBerry', detect: /(BlackBerry|RIM)/, versionPattern: null },\n { name: 'FreeBSD', detect: /FreeBSD/, versionPattern: null },\n { name: 'Debian', detect: /Debian/, versionPattern: /Debian\\/([\\d.]+)/ },\n { name: 'Ubuntu', detect: /Ubuntu/, versionPattern: null },\n // Linux must come before Chrome OS: Chrome OS UAs contain \"X11\", so Linux matches first,\n // then Chrome OS overrides it.\n { name: 'Linux', detect: /(Linux|X11)/, versionPattern: null },\n { name: 'Chrome OS', detect: /CrOS/, versionPattern: null },\n { name: 'Tizen', detect: /Tizen/, versionPattern: /Tizen ([\\d.]+)/ },\n { name: 'iOS', detect: /like Mac OS X/, versionPattern: /OS ([\\d_]+) like/ },\n { name: 'MacOS', detect: /Macintosh/, versionPattern: /Mac OS X -?([\\d_.]+)/ },\n { name: 'Android', detect: /(Android|Adr)/, versionPattern: /(?:Android|Adr) ([\\d.]+)/ },\n // HarmonyOS must come after Android: HarmonyOS UAs include \"Android\", so Android matches\n // first, then HarmonyOS overrides it. versionPattern tries direct extraction first (5.0+\n // pure HarmonyOS UAs don't have Android token), then falls back to Android version + lookup.\n { name: 'HarmonyOS', detect: /HarmonyOS/,\n versionPattern: [/HarmonyOS[\\s/]([\\d.]+)/, /Android ([\\d.]+)[;)]/],\n versionLookup: { '10': '2', '11': '3', '12': '3', '13': '4' } },\n // OpenHarmony (open-source base) must come after HarmonyOS to override any earlier match.\n { name: 'OpenHarmony', detect: /OpenHarmony/, versionPattern: /OpenHarmony[\\s/]([\\d.]+)/ },\n { name: 'KaiOS', detect: /KAIOS/, versionPattern: /KAIOS\\/([\\d.]+)/ },\n // Windows must come before Windows Phone: Windows Phone UAs contain \"Windows\", so Windows\n // matches first, then Windows Phone overrides it.\n { name: 'Windows', 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 { name: 'Windows Phone', detect: /(IEMobile|Windows Phone)/, versionPattern: /Windows Phone(?: OS)? ([\\d.]+)/ },\n] as const\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}\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\n // Iterate in array order; later entries have higher priority (same as BROWSER_DEFS)\n for (const def of OS_DEFS) {\n if (def.detect.test(ua)) {\n matchedDef = def\n }\n }\n\n if (!matchedDef) return { os: 'unknown', osVersion: '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 return { os: matchedDef.name, osVersion }\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\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; used to detect iPad on modern macOS\n * (where the UA reports \"Macintosh\" but maxTouchPoints > 1)\n */\nexport function detectDevice(ua: string, nav?: Pick<NavContext, 'platform' | 'maxTouchPoints'>): DeviceName {\n // Smart TV — must come first; some TV UAs also contain Android/Linux tokens\n if (/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(ua)) {\n return 'TV'\n }\n\n // Modern iPad: platform='MacIntel' with touch points (iPadOS 13+)\n if (nav?.platform === 'MacIntel' && nav.maxTouchPoints > 1) {\n return 'Tablet'\n }\n\n // iPad in UA string (older iPads)\n if (/iPad/.test(ua)) {\n return 'Tablet'\n }\n\n // Android tablet: has Android but no Mobile marker\n if (/Android/.test(ua) && !/Mobile/.test(ua)) {\n return 'Tablet'\n }\n\n for (const def of DEVICE_DEFS) {\n if (def.detect.test(ua)) {\n return def.name as DeviceName\n }\n }\n\n return 'PC'\n}\n","export type BotName =\n | 'Googlebot'\n | 'Bingbot'\n | 'Baiduspider'\n | 'Bytespider'\n | 'YandexBot'\n | 'DuckDuckBot'\n | 'Slurp'\n | 'Sogou'\n | '360Spider'\n | 'Applebot'\n | 'Facebookbot'\n | 'Twitterbot'\n | 'LinkedInBot'\n | 'SemrushBot'\n | 'AhrefsBot'\n | 'MJ12bot'\n | 'PetalBot'\n | 'GPTBot'\n | 'ClaudeBot'\n | 'PerplexityBot'\n | 'CCBot'\n | 'AdsBot'\n | 'GenericBot'\n | 'unknown'\n\nexport interface BotDef {\n name: BotName\n detect: RegExp\n}\n\nexport const BOT_DEFS: readonly BotDef[] = [\n // Search engines\n { name: 'Googlebot', detect: /Googlebot/ },\n { name: 'Bingbot', detect: /(bingbot|BingPreview)/ },\n { name: 'Baiduspider', detect: /(Baiduspider|BaiduMobaider)/ },\n { name: 'Bytespider', detect: /Bytespider/ },\n { name: 'YandexBot', detect: /YandexBot/ },\n { name: 'DuckDuckBot', detect: /DuckDuckBot/ },\n { name: 'Slurp', detect: /Slurp/ },\n { name: 'Sogou', detect: /(Sogou|sogou).*[Ss]pider/ },\n { name: '360Spider', detect: /360Spider/ },\n { name: 'PetalBot', detect: /PetalBot/ },\n { name: 'Applebot', detect: /Applebot/ },\n // Social\n { name: 'Facebookbot', detect: /(facebookexternalhit|FacebookBot)/ },\n { name: 'Twitterbot', detect: /Twitterbot/ },\n { name: 'LinkedInBot', detect: /LinkedInBot/ },\n // SEO tools\n { name: 'SemrushBot', detect: /SemrushBot/ },\n { name: 'AhrefsBot', detect: /AhrefsBot/ },\n { name: 'MJ12bot', detect: /MJ12bot/ },\n // AI / LLM crawlers\n { name: 'GPTBot', detect: /GPTBot/ },\n { name: 'ClaudeBot', detect: /ClaudeBot/ },\n { name: 'PerplexityBot', detect: /PerplexityBot/ },\n { name: 'CCBot', detect: /CCBot/ },\n { name: 'AdsBot', detect: /AdsBot-Google/ },\n // Generic catch-all (must be last)\n { name: 'GenericBot', detect: /(bot|crawler|spider|crawling|scraper)/i }\n] as const\n","import { BOT_DEFS, type BotName } from '../constants/bots.js'\n\nexport interface BotResult {\n isBot: boolean\n botName: BotName\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 */\nexport function detectBot(ua: string): BotResult {\n for (const def of BOT_DEFS) {\n if (def.detect.test(ua)) {\n return { isBot: true, botName: def.name }\n }\n }\n return { isBot: false, botName: '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 { name: 'arm64', detect: /(aarch64|arm64|ARM64)/ },\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 if (/Apple\\s+(M\\d|A\\d{1,2}[A-Z]?)\\b/i.test(renderer) || /APPLE M\\d/i.test(renderer)) {\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?: { saveData?: boolean }\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 } from './types.js'\nimport { detectBrowser } from './detectors/browser.js'\nimport { detectEngine } from './detectors/engine.js'\nimport { detectOs } from './detectors/os.js'\nimport { detectDevice } from './detectors/device.js'\nimport { detectBot } 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}\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: NavContext | undefined = options.ctx ?? options.nav\n const effectiveWindowsVersion = options.ctx?.windowsVersion ?? options.windowsVersion\n\n const { browser: rawBrowser, version: rawVersion } = detectBrowser(ua)\n const { os, osVersion: rawOsVersion } = detectOs(ua, effectiveWindowsVersion)\n let osVersion = rawOsVersion\n const device = detectDevice(ua, effectiveNav)\n const arch = detectArch(ua, options.ctx)\n const nav = effectiveNav\n const { isBot, botName } = detectBot(ua)\n const isHeadless = detectHeadless(ua)\n const language = nav ? getLanguage(nav) : 'unknown'\n const platform = nav?.platform ?? 'unknown'\n\n let browser: BrowserName = rawBrowser\n let version = rawVersion\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 // Generic \"SomethingBrowser/x.y\" catch-all: Chrome-based third-party browsers\n // that embed their own token alongside Chrome\n if (browser === 'Chrome' && /\\S+Browser\\//.test(ua)) {\n const m = /(\\S+Browser)\\/([\\d.]+)/.exec(ua)\n if (m) {\n browser = m[1] as BrowserName\n version = m[2]\n }\n }\n\n // Firefox Nightly detection — only meaningful in a real browser environment.\n // The heuristic checks for globals that exist in Chrome (clientInformation) but\n // not in standard Firefox, or where u2f was removed in Nightly builds.\n // Skip entirely in Node.js (no nav = not a browser).\n if (browser === 'Firefox' && nav) {\n try {\n if (typeof clientInformation !== 'undefined' || typeof u2f === 'undefined') {\n browser = 'Firefox Nightly'\n }\n } catch {\n // globals not accessible — leave as Firefox\n }\n }\n\n // WeChat Miniapp detection\n if (browser === 'Wechat') {\n try {\n if (typeof __wxjs_environment !== 'undefined' && __wxjs_environment === 'miniprogram') {\n browser = 'Wechat Miniapp'\n }\n } catch {\n // not in WeChat miniapp context\n }\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 // When Version/ major > CPU iPhone OS major, use Version/ as the real osVersion.\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 const engine = detectEngine(ua, browser, version)\n\n return {\n browser,\n version,\n engine,\n os,\n osVersion,\n device,\n arch,\n isWebview: isWebview(ua),\n isHeadless,\n isBot,\n botName,\n language,\n platform\n }\n}\n","import type { NavContext } from './navigator.js'\n\n/**\n * Asynchronously detect whether the Windows version is 10 or 11 using the\n * User-Agent Client Hints API (navigator.userAgentData).\n *\n * Returns '11', '10', or null (non-Windows / API unavailable / error).\n *\n * Because this is async, callers that need accurate Windows 11 detection\n * should await this result and pass it to parseUA() as `options.windowsVersion`.\n */\nexport async function getWindowsVersion(nav: NavContext): Promise<string | null> {\n if (!nav.userAgentData || nav.userAgentData.platform !== 'Windows') {\n return null\n }\n try {\n const data = await nav.userAgentData.getHighEntropyValues(['platformVersion'])\n const major = parseInt(data['platformVersion']?.split('.')[0] || '0', 10)\n return major >= 13 ? '11' : '10'\n } catch {\n return null\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 hardwareConcurrency?: number\n deviceMemory?: number\n devicePixelRatio?: number\n pointerType?: 'coarse' | 'fine' | 'none'\n hoverCapability?: boolean\n fontProbes?: Record<string, boolean>\n highEntropyData?: UAHighEntropyValues\n windowsVersion?: string | null\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(): { renderer?: string; vendor?: string } {\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 if (!ext) return {}\n return {\n renderer: gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) as string,\n vendor: gl.getParameter(ext.UNMASKED_VENDOR_WEBGL) as string,\n }\n } catch {\n return {}\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 = { ...base }\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.pointerType = getPointerType()\n ctx.hoverCapability = getHoverCapability()\n ctx.fontProbes = probeFonts()\n const { renderer, vendor } = getWebGLInfo()\n if (renderer !== undefined) ctx.webglRenderer = renderer\n if (vendor !== undefined) ctx.webglVendor = vendor\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 type { EnvOption } from './types.js'\nimport type { UAHighEntropyValues, EnvContext } from './utils/env-context.js'\nimport { parseUA } from './parse.js'\n\n/**\n * The Accept-CH value to send in server responses.\n * After the browser sees this header it will include the corresponding\n * Sec-CH-UA-* headers on subsequent same-origin requests.\n */\nexport const ACCEPT_CH = [\n 'Sec-CH-UA-Arch',\n 'Sec-CH-UA-Bitness',\n 'Sec-CH-UA-Platform-Version',\n 'Sec-CH-UA-Model',\n 'Sec-CH-UA-Full-Version-List',\n].join(', ')\n\n/** Strip the surrounding double-quotes that browsers add to structured header values. */\nfunction unquote(value: string | undefined): string | undefined {\n if (value == null) return undefined\n return value.replace(/^\"|\"$/g, '').trim() || undefined\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 * Parse a browser request's HTTP headers into an EnvOption.\n *\n * Reads the standard `user-agent` header plus any `Sec-CH-UA-*` Client Hints\n * headers the browser sent after receiving an `Accept-CH` response header.\n *\n * Header names are matched case-insensitively, as required by HTTP/1.1 and HTTP/2.\n *\n * @example\n * // Express / Node.js\n * res.setHeader('Accept-CH', ACCEPT_CH)\n * const result = parseHeaders(req.headers)\n */\nexport function parseHeaders(headers: Record<string, string | string[] | undefined>): EnvOption {\n // Normalise all header keys to lowercase for case-insensitive lookup (HTTP spec)\n const normalised: Record<string, string | string[] | undefined> = {}\n for (const key of Object.keys(headers)) {\n normalised[key.toLowerCase()] = headers[key]\n }\n const get = (name: string): string | undefined => {\n const v = normalised[name.toLowerCase()]\n return Array.isArray(v) ? v[0] : v\n }\n\n const ua = get('user-agent') ?? ''\n\n const architecture = unquote(get('sec-ch-ua-arch'))\n const bitness = unquote(get('sec-ch-ua-bitness'))\n const model = unquote(get('sec-ch-ua-model'))\n const platformVersion = unquote(get('sec-ch-ua-platform-version'))\n const platform = unquote(get('sec-ch-ua-platform')) ?? ''\n\n const highEntropyData: UAHighEntropyValues = {}\n if (architecture !== undefined) highEntropyData.architecture = architecture\n if (bitness !== undefined) highEntropyData.bitness = bitness\n if (model !== undefined) highEntropyData.model = model\n if (platformVersion !== undefined) highEntropyData.platformVersion = platformVersion\n\n const isMobile = get('sec-ch-ua-mobile') === '?1'\n\n const windowsVersion = platform === 'Windows'\n ? deriveWindowsVersion(platformVersion)\n : null\n\n const ctx: EnvContext = {\n userAgent: ua,\n platform,\n language: '',\n maxTouchPoints: isMobile ? 1 : 0,\n highEntropyData: Object.keys(highEntropyData).length > 0 ? highEntropyData : undefined,\n windowsVersion,\n }\n\n return parseUA(ua, { ctx })\n}\n","import pkg from '../package.json' with { type: 'json' }\nconst { version: VERSION } = pkg\nimport { parseUA } from './parse.js'\nimport { getNavContext, getLanguage } from './utils/navigator.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 } from './types.js'\nexport { parseUA } from './parse.js'\nexport { getLanguage, getNavContext } from './utils/navigator.js'\nexport { getWindowsVersion } from './utils/windows-version.js'\nexport { getEnvContext } from './utils/env-context.js'\nexport type { EnvContext, UAHighEntropyValues } from './utils/env-context.js'\nexport { detectBot } from './detectors/bot.js'\nexport { detectArch } from './detectors/arch.js'\nexport { detectHeadless } from './detectors/headless.js'\nexport { isWebview } from './detectors/webview.js'\nexport { parseHeaders, ACCEPT_CH } from './parse-headers.js'\nexport { VERSION }\n\n/** Check whether the current context is a WeChat mini-program. */\nexport const isWechatMiniapp = (): boolean => {\n try {\n return typeof __wxjs_environment !== 'undefined' && __wxjs_environment === 'miniprogram'\n } catch {\n return false\n }\n}\n\n// ── Default export — maintains v0.x call signature ──────────────────────────\n\n/**\n * Detect browser, OS, engine and device information.\n *\n * @param ua - Optional UA string override. Defaults to `navigator.userAgent`.\n */\nfunction uaBrowser(ua?: string): EnvOption {\n const nav = getNavContext()\n return parseUA(ua ?? nav.userAgent, { nav })\n}\n\nuaBrowser.isWebview = isWebview\nuaBrowser.isWechatMiniapp = isWechatMiniapp\nuaBrowser.getLanguage = (): string => getLanguage(getNavContext())\nuaBrowser.VERSION = VERSION\n\nexport default uaBrowser\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/constants/browsers.ts","../src/utils/extract.ts","../src/detectors/browser.ts","../src/constants/engines.ts","../src/detectors/engine.ts","../src/constants/os.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/windows-version.ts","../src/utils/env-context.ts","../src/parse-headers.ts","../src/index.ts"],"names":["deriveWindowsVersion"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"ua-browser\",\n \"version\": \"1.3.0\",\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\",\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 { 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: '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\\//, versionPattern: /DuckDuckGo\\/([\\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: /QQBrowser/, versionPattern: /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 } 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}\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' }\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 return { browser: best.name, version: version ?? 'unknown' }\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'\n\n/**\n * Detect the rendering engine, with post-detection upgrades for Blink and EdgeHTML.\n *\n * @param ua - Raw user agent string\n * @param browser - Already-detected browser name (for Blink/EdgeHTML disambiguation)\n * @param version - Already-detected browser version string\n */\nexport function detectEngine(ua: string, browser: string, version: string): EngineName {\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 return engine\n}\n","import type { OsName } from '../types.js'\n\nexport interface OsDef {\n name: OsName\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}\n\n// Detection uses last-match-wins: entries that appear later override earlier matches.\n// More specific OS entries must come AFTER the generic ones they supersede.\nexport const OS_DEFS: readonly OsDef[] = [\n { name: 'WebOS', detect: /hpwOS/, versionPattern: /hpwOS\\/([\\d.]+)/ },\n { name: 'Symbian', detect: /Symbian/, versionPattern: null },\n { name: 'MeeGo', detect: /MeeGo/, versionPattern: null },\n { name: 'BlackBerry', detect: /(BlackBerry|RIM)/, versionPattern: null },\n { name: 'FreeBSD', detect: /FreeBSD/, versionPattern: null },\n { name: 'Debian', detect: /Debian/, versionPattern: /Debian\\/([\\d.]+)/ },\n { name: 'Ubuntu', detect: /Ubuntu/, versionPattern: null },\n // Linux must come before Chrome OS: Chrome OS UAs contain \"X11\", so Linux matches first,\n // then Chrome OS overrides it.\n { name: 'Linux', detect: /(Linux|X11)/, versionPattern: null },\n { name: 'Chrome OS', detect: /CrOS/, versionPattern: null },\n { name: 'Tizen', detect: /Tizen/, versionPattern: /Tizen ([\\d.]+)/ },\n { name: 'iOS', detect: /like Mac OS X/, versionPattern: /OS ([\\d_]+) like/ },\n { name: 'MacOS', detect: /Macintosh/, versionPattern: /Mac OS X -?([\\d_.]+)/ },\n { name: 'Android', detect: /(Android|Adr)/, versionPattern: /(?:Android|Adr) ([\\d.]+)/ },\n // HarmonyOS must come after Android: HarmonyOS UAs include \"Android\", so Android matches\n // first, then HarmonyOS overrides it. versionPattern tries direct extraction first (5.0+\n // pure HarmonyOS UAs don't have Android token), then falls back to Android version + lookup.\n { name: 'HarmonyOS', detect: /HarmonyOS/,\n versionPattern: [/HarmonyOS[\\s/]([\\d.]+)/, /Android ([\\d.]+)[;)]/],\n versionLookup: { '10': '2', '11': '3', '12': '3', '13': '4' } },\n // OpenHarmony (open-source base) must come after HarmonyOS to override any earlier match.\n { name: 'OpenHarmony', detect: /OpenHarmony/, versionPattern: /OpenHarmony[\\s/]([\\d.]+)/ },\n { name: 'KaiOS', detect: /KAIOS/, versionPattern: /KAIOS\\/([\\d.]+)/ },\n // Windows must come before Windows Phone: Windows Phone UAs contain \"Windows\", so Windows\n // matches first, then Windows Phone overrides it.\n { name: 'Windows', 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 { name: 'Windows Phone', detect: /(IEMobile|Windows Phone)/, versionPattern: /Windows Phone(?: OS)? ([\\d.]+)/ },\n] as const\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}\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\n // Iterate in array order; later entries have higher priority (same as BROWSER_DEFS)\n for (const def of OS_DEFS) {\n if (def.detect.test(ua)) {\n matchedDef = def\n }\n }\n\n if (!matchedDef) return { os: 'unknown', osVersion: '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 return { os: matchedDef.name, osVersion }\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\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; used to detect iPad on modern macOS\n * (where the UA reports \"Macintosh\" but maxTouchPoints > 1)\n */\nexport function detectDevice(ua: string, nav?: Pick<NavContext, 'platform' | 'maxTouchPoints'>): DeviceName {\n // Smart TV — must come first; some TV UAs also contain Android/Linux tokens\n if (/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(ua)) {\n return 'TV'\n }\n\n // Modern iPad: platform='MacIntel' with touch points (iPadOS 13+)\n if (nav?.platform === 'MacIntel' && nav.maxTouchPoints > 1) {\n return 'Tablet'\n }\n\n // iPad in UA string (older iPads)\n if (/iPad/.test(ua)) {\n return 'Tablet'\n }\n\n // Android tablet: has Android but no Mobile marker\n if (/Android/.test(ua) && !/Mobile/.test(ua)) {\n return 'Tablet'\n }\n\n for (const def of DEVICE_DEFS) {\n if (def.detect.test(ua)) {\n return def.name as DeviceName\n }\n }\n\n return 'PC'\n}\n","export type BotName =\n | 'Googlebot'\n | 'Bingbot'\n | 'Baiduspider'\n | 'Bytespider'\n | 'YandexBot'\n | 'DuckDuckBot'\n | 'Slurp'\n | 'Sogou'\n | '360Spider'\n | 'Applebot'\n | 'Facebookbot'\n | 'Twitterbot'\n | 'LinkedInBot'\n | 'SemrushBot'\n | 'AhrefsBot'\n | 'MJ12bot'\n | 'PetalBot'\n | 'GPTBot'\n | 'ClaudeBot'\n | 'PerplexityBot'\n | 'CCBot'\n | 'AdsBot'\n | 'GenericBot'\n | 'unknown'\n\nexport interface BotDef {\n name: BotName\n detect: RegExp\n}\n\nexport const BOT_DEFS: readonly BotDef[] = [\n // Search engines\n { name: 'Googlebot', detect: /Googlebot/ },\n { name: 'Bingbot', detect: /(bingbot|BingPreview)/ },\n { name: 'Baiduspider', detect: /(Baiduspider|BaiduMobaider)/ },\n { name: 'Bytespider', detect: /Bytespider/ },\n { name: 'YandexBot', detect: /YandexBot/ },\n { name: 'DuckDuckBot', detect: /DuckDuckBot/ },\n { name: 'Slurp', detect: /Slurp/ },\n { name: 'Sogou', detect: /(Sogou|sogou).*[Ss]pider/ },\n { name: '360Spider', detect: /360Spider/ },\n { name: 'PetalBot', detect: /PetalBot/ },\n { name: 'Applebot', detect: /Applebot/ },\n // Social\n { name: 'Facebookbot', detect: /(facebookexternalhit|FacebookBot)/ },\n { name: 'Twitterbot', detect: /Twitterbot/ },\n { name: 'LinkedInBot', detect: /LinkedInBot/ },\n // SEO tools\n { name: 'SemrushBot', detect: /SemrushBot/ },\n { name: 'AhrefsBot', detect: /AhrefsBot/ },\n { name: 'MJ12bot', detect: /MJ12bot/ },\n // AI / LLM crawlers\n { name: 'GPTBot', detect: /GPTBot/ },\n { name: 'ClaudeBot', detect: /ClaudeBot/ },\n { name: 'PerplexityBot', detect: /PerplexityBot/ },\n { name: 'CCBot', detect: /CCBot/ },\n { name: 'AdsBot', detect: /AdsBot-Google/ },\n // Generic catch-all (must be last)\n { name: 'GenericBot', detect: /(bot|crawler|spider|crawling|scraper)/i }\n] as const\n","import { BOT_DEFS, type BotName } from '../constants/bots.js'\n\nexport interface BotResult {\n isBot: boolean\n botName: BotName\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 */\nexport function detectBot(ua: string): BotResult {\n for (const def of BOT_DEFS) {\n if (def.detect.test(ua)) {\n return { isBot: true, botName: def.name }\n }\n }\n return { isBot: false, botName: '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 { name: 'arm64', detect: /(aarch64|arm64|ARM64)/ },\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 if (/Apple\\s+(M\\d|A\\d{1,2}[A-Z]?)\\b/i.test(renderer) || /APPLE M\\d/i.test(renderer)) {\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?: { saveData?: boolean }\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 } from './types.js'\nimport { detectBrowser } from './detectors/browser.js'\nimport { detectEngine } from './detectors/engine.js'\nimport { detectOs } from './detectors/os.js'\nimport { detectDevice } from './detectors/device.js'\nimport { detectBot } 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}\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: NavContext | undefined = options.ctx ?? options.nav\n const effectiveWindowsVersion = options.ctx?.windowsVersion ?? options.windowsVersion\n\n const { browser: rawBrowser, version: rawVersion } = detectBrowser(ua)\n const { os, osVersion: rawOsVersion } = detectOs(ua, effectiveWindowsVersion)\n let osVersion = rawOsVersion\n const device = detectDevice(ua, effectiveNav)\n const arch = detectArch(ua, options.ctx)\n const nav = effectiveNav\n const { isBot, botName } = detectBot(ua)\n const isHeadless = detectHeadless(ua)\n const language = nav ? getLanguage(nav) : 'unknown'\n const platform = nav?.platform ?? 'unknown'\n\n let browser: BrowserName = rawBrowser\n let version = rawVersion\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 // Generic \"SomethingBrowser/x.y\" catch-all: Chrome-based third-party browsers\n // that embed their own token alongside Chrome\n if (browser === 'Chrome' && /\\S+Browser\\//.test(ua)) {\n const m = /(\\S+Browser)\\/([\\d.]+)/.exec(ua)\n if (m) {\n browser = m[1] as BrowserName\n version = m[2]\n }\n }\n\n // Firefox Nightly detection — only meaningful in a real browser environment.\n // The heuristic checks for globals that exist in Chrome (clientInformation) but\n // not in standard Firefox, or where u2f was removed in Nightly builds.\n // Skip entirely in Node.js (no nav = not a browser).\n if (browser === 'Firefox' && nav) {\n try {\n if (typeof clientInformation !== 'undefined' || typeof u2f === 'undefined') {\n browser = 'Firefox Nightly'\n }\n } catch {\n // globals not accessible — leave as Firefox\n }\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 // When Version/ major > CPU iPhone OS major, use Version/ as the real osVersion.\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 const engine = detectEngine(ua, browser, version)\n\n return {\n browser,\n version,\n engine,\n os,\n osVersion,\n device,\n arch,\n isWebview: isWebview(ua),\n isHeadless,\n isBot,\n botName,\n language,\n platform\n }\n}\n","import type { NavContext } from './navigator.js'\n\n/**\n * Asynchronously detect whether the Windows version is 10 or 11 using the\n * User-Agent Client Hints API (navigator.userAgentData).\n *\n * Returns '11', '10', or null (non-Windows / API unavailable / error).\n *\n * Because this is async, callers that need accurate Windows 11 detection\n * should await this result and pass it to parseUA() as `options.windowsVersion`.\n */\nexport async function getWindowsVersion(nav: NavContext): Promise<string | null> {\n if (!nav.userAgentData || nav.userAgentData.platform !== 'Windows') {\n return null\n }\n try {\n const data = await nav.userAgentData.getHighEntropyValues(['platformVersion'])\n const major = parseInt(data['platformVersion']?.split('.')[0] || '0', 10)\n return major >= 13 ? '11' : '10'\n } catch {\n return null\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 hardwareConcurrency?: number\n deviceMemory?: number\n devicePixelRatio?: number\n pointerType?: 'coarse' | 'fine' | 'none'\n hoverCapability?: boolean\n fontProbes?: Record<string, boolean>\n highEntropyData?: UAHighEntropyValues\n windowsVersion?: string | null\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(): { renderer?: string; vendor?: string } {\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 if (!ext) return {}\n return {\n renderer: gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) as string,\n vendor: gl.getParameter(ext.UNMASKED_VENDOR_WEBGL) as string,\n }\n } catch {\n return {}\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 = { ...base }\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.pointerType = getPointerType()\n ctx.hoverCapability = getHoverCapability()\n ctx.fontProbes = probeFonts()\n const { renderer, vendor } = getWebGLInfo()\n if (renderer !== undefined) ctx.webglRenderer = renderer\n if (vendor !== undefined) ctx.webglVendor = vendor\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 type { EnvOption } from './types.js'\nimport type { UAHighEntropyValues, EnvContext } from './utils/env-context.js'\nimport { parseUA } from './parse.js'\n\n/**\n * The Accept-CH value to send in server responses.\n * After the browser sees this header it will include the corresponding\n * Sec-CH-UA-* headers on subsequent same-origin requests.\n */\nexport const ACCEPT_CH = [\n 'Sec-CH-UA-Arch',\n 'Sec-CH-UA-Bitness',\n 'Sec-CH-UA-Platform-Version',\n 'Sec-CH-UA-Model',\n 'Sec-CH-UA-Full-Version-List',\n].join(', ')\n\n/** Strip the surrounding double-quotes that browsers add to structured header values. */\nfunction unquote(value: string | undefined): string | undefined {\n if (value == null) return undefined\n return value.replace(/^\"|\"$/g, '').trim() || undefined\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 * Parse a browser request's HTTP headers into an EnvOption.\n *\n * Reads the standard `user-agent` header plus any `Sec-CH-UA-*` Client Hints\n * headers the browser sent after receiving an `Accept-CH` response header.\n *\n * Header names are matched case-insensitively, as required by HTTP/1.1 and HTTP/2.\n *\n * @example\n * // Express / Node.js\n * res.setHeader('Accept-CH', ACCEPT_CH)\n * const result = parseHeaders(req.headers)\n */\nexport function parseHeaders(headers: Record<string, string | string[] | undefined>): EnvOption {\n // Normalise all header keys to lowercase for case-insensitive lookup (HTTP spec)\n const normalised: Record<string, string | string[] | undefined> = {}\n for (const key of Object.keys(headers)) {\n normalised[key.toLowerCase()] = headers[key]\n }\n const get = (name: string): string | undefined => {\n const v = normalised[name.toLowerCase()]\n return Array.isArray(v) ? v[0] : v\n }\n\n const ua = get('user-agent') ?? ''\n\n const architecture = unquote(get('sec-ch-ua-arch'))\n const bitness = unquote(get('sec-ch-ua-bitness'))\n const model = unquote(get('sec-ch-ua-model'))\n const platformVersion = unquote(get('sec-ch-ua-platform-version'))\n const platform = unquote(get('sec-ch-ua-platform')) ?? ''\n\n const highEntropyData: UAHighEntropyValues = {}\n if (architecture !== undefined) highEntropyData.architecture = architecture\n if (bitness !== undefined) highEntropyData.bitness = bitness\n if (model !== undefined) highEntropyData.model = model\n if (platformVersion !== undefined) highEntropyData.platformVersion = platformVersion\n\n const isMobile = get('sec-ch-ua-mobile') === '?1'\n\n const windowsVersion = platform === 'Windows'\n ? deriveWindowsVersion(platformVersion)\n : null\n\n const ctx: EnvContext = {\n userAgent: ua,\n platform,\n language: '',\n maxTouchPoints: isMobile ? 1 : 0,\n highEntropyData: Object.keys(highEntropyData).length > 0 ? highEntropyData : undefined,\n windowsVersion,\n }\n\n return parseUA(ua, { ctx })\n}\n","import pkg from '../package.json' with { type: 'json' }\nconst { version: VERSION } = pkg\nimport { parseUA } from './parse.js'\nimport { getNavContext, getLanguage } from './utils/navigator.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 } from './types.js'\nexport { parseUA } from './parse.js'\nexport { getLanguage, getNavContext } from './utils/navigator.js'\nexport { getWindowsVersion } from './utils/windows-version.js'\nexport { getEnvContext } from './utils/env-context.js'\nexport type { EnvContext, UAHighEntropyValues } from './utils/env-context.js'\nexport { detectBot } from './detectors/bot.js'\nexport { detectArch } from './detectors/arch.js'\nexport { detectHeadless } from './detectors/headless.js'\nexport { isWebview } from './detectors/webview.js'\nexport { parseHeaders, ACCEPT_CH } from './parse-headers.js'\nexport { VERSION }\n\n// ── Default export — maintains v0.x call signature ──────────────────────────\n\n/**\n * Detect browser, OS, engine and device information.\n *\n * @param ua - Optional UA string override. Defaults to `navigator.userAgent`.\n */\nfunction uaBrowser(ua?: string): EnvOption {\n const nav = getNavContext()\n return parseUA(ua ?? nav.userAgent, { nav })\n}\n\nuaBrowser.isWebview = isWebview\nuaBrowser.getLanguage = (): string => getLanguage(getNavContext())\nuaBrowser.VERSION = VERSION\n\nexport default uaBrowser\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type EngineName = 'Trident' | 'Presto' | 'WebKit' | 'Gecko' | 'KHTML' | 'Blink' | 'EdgeHTML' | 'ArkWeb' | 'unknown';
|
|
2
|
-
type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | '
|
|
2
|
+
type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
|
|
3
3
|
type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
|
|
4
4
|
type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV';
|
|
5
5
|
type ArchName$1 = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
@@ -20,7 +20,6 @@ interface EnvOption {
|
|
|
20
20
|
platform: string;
|
|
21
21
|
}
|
|
22
22
|
declare global {
|
|
23
|
-
const __wxjs_environment: string;
|
|
24
23
|
var chrome: {
|
|
25
24
|
adblock2345?: unknown;
|
|
26
25
|
common2345?: unknown;
|
|
@@ -185,8 +184,6 @@ declare function parseHeaders(headers: Record<string, string | string[] | undefi
|
|
|
185
184
|
|
|
186
185
|
declare const VERSION: string;
|
|
187
186
|
|
|
188
|
-
/** Check whether the current context is a WeChat mini-program. */
|
|
189
|
-
declare const isWechatMiniapp: () => boolean;
|
|
190
187
|
/**
|
|
191
188
|
* Detect browser, OS, engine and device information.
|
|
192
189
|
*
|
|
@@ -195,9 +192,8 @@ declare const isWechatMiniapp: () => boolean;
|
|
|
195
192
|
declare function uaBrowser(ua?: string): EnvOption;
|
|
196
193
|
declare namespace uaBrowser {
|
|
197
194
|
var isWebview: typeof isWebview;
|
|
198
|
-
var isWechatMiniapp: () => boolean;
|
|
199
195
|
var getLanguage: () => string;
|
|
200
196
|
var VERSION: string;
|
|
201
197
|
}
|
|
202
198
|
|
|
203
|
-
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview,
|
|
199
|
+
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type EngineName = 'Trident' | 'Presto' | 'WebKit' | 'Gecko' | 'KHTML' | 'Blink' | 'EdgeHTML' | 'ArkWeb' | 'unknown';
|
|
2
|
-
type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | '
|
|
2
|
+
type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
|
|
3
3
|
type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
|
|
4
4
|
type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV';
|
|
5
5
|
type ArchName$1 = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
@@ -20,7 +20,6 @@ interface EnvOption {
|
|
|
20
20
|
platform: string;
|
|
21
21
|
}
|
|
22
22
|
declare global {
|
|
23
|
-
const __wxjs_environment: string;
|
|
24
23
|
var chrome: {
|
|
25
24
|
adblock2345?: unknown;
|
|
26
25
|
common2345?: unknown;
|
|
@@ -185,8 +184,6 @@ declare function parseHeaders(headers: Record<string, string | string[] | undefi
|
|
|
185
184
|
|
|
186
185
|
declare const VERSION: string;
|
|
187
186
|
|
|
188
|
-
/** Check whether the current context is a WeChat mini-program. */
|
|
189
|
-
declare const isWechatMiniapp: () => boolean;
|
|
190
187
|
/**
|
|
191
188
|
* Detect browser, OS, engine and device information.
|
|
192
189
|
*
|
|
@@ -195,9 +192,8 @@ declare const isWechatMiniapp: () => boolean;
|
|
|
195
192
|
declare function uaBrowser(ua?: string): EnvOption;
|
|
196
193
|
declare namespace uaBrowser {
|
|
197
194
|
var isWebview: typeof isWebview;
|
|
198
|
-
var isWechatMiniapp: () => boolean;
|
|
199
195
|
var getLanguage: () => string;
|
|
200
196
|
var VERSION: string;
|
|
201
197
|
}
|
|
202
198
|
|
|
203
|
-
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview,
|
|
199
|
+
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA };
|
package/dist/index.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var uaBrowser=(function(){'use strict';var C={version:"1.1.0"};var T=[{name:"Safari",priority:10,detect:/Safari/,versionPattern:/Version\/([\d.]+)/},{name:"Chrome",priority:20,detect:/(Chrome|CriOS)/,versionPattern:[/Chrome\/([\d.]+)/,/CriOS\/([\d.]+)/]},{name:"IE",priority:30,detect:/(MSIE|Trident)/,versionPattern:[/MSIE ([\d.]+)/,/rv:([\d.]+)/]},{name:"Edge",priority:40,detect:/(Edge|Edg\/|EdgA|EdgiOS)/,versionPattern:[/Edge\/([\d.]+)/,/Edg\/([\d.]+)/,/EdgA\/([\d.]+)/,/EdgiOS\/([\d.]+)/]},{name:"Firefox",priority:50,detect:/(Firefox|FxiOS)/,versionPattern:[/Firefox\/([\d.]+)/,/FxiOS\/([\d.]+)/]},{name:"Firefox Focus",priority:55,detect:/Focus/,versionPattern:/Focus\/([\d.]+)/},{name:"Chromium",priority:60,detect:/Chromium/,versionPattern:/Chromium\/([\d.]+)/},{name:"Opera",priority:70,detect:/(Opera|OPR|OPT)/,versionPattern:[/Opera\/([\d.]+)/,/OPR\/([\d.]+)/,/OPT\/([\d.]+)/]},{name:"Vivaldi",priority:80,detect:/Vivaldi/,versionPattern:/Vivaldi\/([\d.]+)/},{name:"Yandex",priority:90,detect:/YaBrowser/,versionPattern:/YaBrowser\/([\d.]+)/},{name:"Samsung Internet",priority:92,detect:/SamsungBrowser/,versionPattern:/SamsungBrowser\/([\d.]+)/},{name:"DuckDuckGo",priority:94,detect:/DuckDuckGo\//,versionPattern:/DuckDuckGo\/([\d.]+)/},{name:"Puffin",priority:96,detect:/Puffin\//,versionPattern:/Puffin\/([\d.]+)/},{name:"Arora",priority:100,detect:/Arora/,versionPattern:/Arora\/([\d.]+)/},{name:"Lunascape",priority:110,detect:/Lunascape/,versionPattern:/Lunascape[\s]([\d.]+)/},{name:"QupZilla",priority:120,detect:/QupZilla/,versionPattern:/QupZilla[\s]([\d.]+)/},{name:"Coc Coc",priority:130,detect:/coc_coc_browser/,versionPattern:/coc_coc_browser\/([\d.]+)/},{name:"Kindle",priority:140,detect:/(Kindle|Silk\/)/,versionPattern:/Version\/([\d.]+)/},{name:"Iceweasel",priority:150,detect:/Iceweasel/,versionPattern:/Iceweasel\/([\d.]+)/},{name:"Konqueror",priority:160,detect:/Konqueror/,versionPattern:/Konqueror\/([\d.]+)/},{name:"Iceape",priority:170,detect:/Iceape/,versionPattern:/Iceape\/([\d.]+)/},{name:"SeaMonkey",priority:180,detect:/SeaMonkey/,versionPattern:/SeaMonkey\/([\d.]+)/},{name:"Epiphany",priority:190,detect:/Epiphany/,versionPattern:/Epiphany\/([\d.]+)/},{name:"Maxthon",priority:200,detect:/Maxthon/,versionPattern:/Maxthon\/([\d.]+)/},{name:"360",priority:300,detect:/(QihooBrowser|QHBrowser)/,versionPattern:/QihooBrowser\/([\d.]+)/},{name:"360SE",priority:310,detect:/360SE/,versionPattern:null,chromeLookup:{108:"14.0",86:"13.0",78:"12.0",69:"11.0",63:"10.0",55:"9.1",45:"8.1",42:"8.0",31:"7.0",21:"6.3"}},{name:"360EE",priority:320,detect:/360EE/,versionPattern:null,chromeLookup:{86:"13.0",78:"12.0",69:"11.0",63:"9.5",55:"9.0",50:"8.7",30:"7.5"}},{name:"UC",priority:330,detect:/(UCBrowser|UBrowser|UCWEB)/,versionPattern:/UC?Browser\/([\d.]+)/},{name:"QQBrowser",priority:340,detect:/QQBrowser/,versionPattern:/QQBrowser\/([\d.]+)/},{name:"QQ",priority:345,detect:/QQ\//,versionPattern:/QQ\/([\d.]+)/},{name:"Baidu",priority:350,detect:/(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/,versionPattern:[/BIDUBrowser[\s/]([\d.]+)/,/baiduboxapp\/([\d.]+)/]},{name:"Sogou",priority:360,detect:/(MetaSr|Sogou)/,versionPattern:[/SE ([\d.X]+)/,/SogouMobileBrowser\/([\d.]+)/]},{name:"Liebao",priority:370,detect:/(LBBROWSER|LieBaoFast)/,versionPattern:/LieBaoFast\/([\d.]+)/,chromeLookup:{57:"6.5",49:"6.0",46:"5.9",42:"5.3",39:"5.2",34:"5.0",29:"4.5",21:"4.0"}},{name:"2345Explorer",priority:380,detect:/2345Explorer/,versionPattern:[/2345Explorer\/([\d.]+)/,/Mb2345Browser\/([\d.]+)/],chromeLookup:{69:"10.0",55:"9.9"}},{name:"115Browser",priority:390,detect:/115Browser/,versionPattern:/115Browser\/([\d.]+)/},{name:"TheWorld",priority:400,detect:/TheWorld/,versionPattern:/TheWorld ([\d.]+)/},{name:"XiaoMi",priority:410,detect:/MiuiBrowser/,versionPattern:/MiuiBrowser\/([\d.]+)/},{name:"Vivo",priority:420,detect:/VivoBrowser/,versionPattern:/VivoBrowser\/([\d.]+)/},{name:"Huawei",priority:430,detect:/HuaweiBrowser/,versionPattern:[/HuaweiBrowser\/([\d.]+)/,/Version\/([\d.]+)/]},{name:"OPPO",priority:440,detect:/HeyTapBrowser/,versionPattern:/HeyTapBrowser\/([\d.]+)/},{name:"Quark",priority:450,detect:/Quark/,versionPattern:/Quark\/([\d.]+)/},{name:"Qiyu",priority:460,detect:/Qiyu/,versionPattern:/Qiyu\/([\d.]+)/},{name:"WechatWork",priority:500,detect:/wxwork\//,versionPattern:/wxwork\/([\d.]+)/},{name:"Wechat",priority:510,detect:/MicroMessenger/,versionPattern:/MicroMessenger\/([\d.]+)/},{name:"Taobao",priority:520,detect:/AliApp\(TB/,versionPattern:/AliApp\(TB\/([\d.]+)/},{name:"Alipay",priority:530,detect:/AliApp\(AP/,versionPattern:/AliApp\(AP\/([\d.]+)/},{name:"Weibo",priority:540,detect:/Weibo/,versionPattern:/weibo__([\d.]+)/},{name:"Douban",priority:550,detect:/com\.douban\.frodo/,versionPattern:/com\.douban\.frodo\/([\d.]+)/},{name:"Suning",priority:560,detect:/SNEBUY-APP/,versionPattern:/SNEBUY-APP([\d.]+)/},{name:"iQiYi",priority:570,detect:/IqiyiApp/,versionPattern:/IqiyiVersion\/([\d.]+)/},{name:"DingTalk",priority:580,detect:/DingTalk/,versionPattern:/DingTalk\/([\d.]+)/},{name:"Douyin",priority:590,detect:/aweme/,versionPattern:/app_version\/([\d.]+)/}];function P(e,t){let r=t.exec(e);if(!r)return null;let n=r[1];return n!=null&&n!==""?n:null}function g(e,t){for(let r of t){let n=P(e,r);if(n!==null)return n}return null}function M(e,t){let r=/Chrome\/([\d]+)/.exec(e);if(!r)return null;let n=r[1];return Object.prototype.hasOwnProperty.call(t,n)?t[n]:null}function R(e){let t=null;for(let n of T)n.detect.test(e)&&(t===null||n.priority>=t.priority)&&(t=n);if(!t)return {browser:"unknown",version:"unknown"};let r=null;if(t.chromeLookup&&(r=M(e,t.chromeLookup)),r===null&&t.versionPattern!==null){let n=Array.isArray(t.versionPattern)?t.versionPattern:[t.versionPattern];r=g(e,n);}return {browser:t.name,version:r!=null?r:"unknown"}}var W=[{name:"KHTML",detect:/KHTML\//},{name:"Trident",detect:/(Trident|NET CLR)/},{name:"Presto",detect:/Presto/},{name:"Gecko",detect:/Gecko\//},{name:"WebKit",detect:/AppleWebKit/},{name:"ArkWeb",detect:/ArkWeb/}];function _(e,t,r){var o,s;let n="unknown";for(let c of W)c.detect.test(e)&&(n=c.name);return (n==="WebKit"&&/(Chrome|CriOS)/.test(e)&&parseInt((s=((o=/Chrome\/([\d]+)/.exec(e))!=null?o:[])[1])!=null?s:"0",10)>27||t==="Opera"&&parseInt(r,10)>12||t==="Yandex")&&(n="Blink"),t==="Edge"&&(n=parseInt(r,10)>75?"Blink":"EdgeHTML"),n}var V=[{name:"WebOS",detect:/hpwOS/,versionPattern:/hpwOS\/([\d.]+)/},{name:"Symbian",detect:/Symbian/,versionPattern:null},{name:"MeeGo",detect:/MeeGo/,versionPattern:null},{name:"BlackBerry",detect:/(BlackBerry|RIM)/,versionPattern:null},{name:"FreeBSD",detect:/FreeBSD/,versionPattern:null},{name:"Debian",detect:/Debian/,versionPattern:/Debian\/([\d.]+)/},{name:"Ubuntu",detect:/Ubuntu/,versionPattern:null},{name:"Linux",detect:/(Linux|X11)/,versionPattern:null},{name:"Chrome OS",detect:/CrOS/,versionPattern:null},{name:"Tizen",detect:/Tizen/,versionPattern:/Tizen ([\d.]+)/},{name:"iOS",detect:/like Mac OS X/,versionPattern:/OS ([\d_]+) like/},{name:"MacOS",detect:/Macintosh/,versionPattern:/Mac OS X -?([\d_.]+)/},{name:"Android",detect:/(Android|Adr)/,versionPattern:/(?:Android|Adr) ([\d.]+)/},{name:"HarmonyOS",detect:/HarmonyOS/,versionPattern:[/HarmonyOS[\s/]([\d.]+)/,/Android ([\d.]+)[;)]/],versionLookup:{10:"2",11:"3",12:"3",13:"4"}},{name:"OpenHarmony",detect:/OpenHarmony/,versionPattern:/OpenHarmony[\s/]([\d.]+)/},{name:"KaiOS",detect:/KAIOS/,versionPattern:/KAIOS\/([\d.]+)/},{name:"Windows",detect:/Windows/,versionPattern:/Windows NT ([\d.]+)/,versionLookup:{10:"10","6.4":"10","6.3":"8.1","6.2":"8","6.1":"7","6.0":"Vista","5.2":"XP","5.1":"XP","5.0":"2000"}},{name:"Windows Phone",detect:/(IEMobile|Windows Phone)/,versionPattern:/Windows Phone(?: OS)? ([\d.]+)/}];function I(e,t){let r=null;for(let o of V)o.detect.test(e)&&(r=o);if(!r)return {os:"unknown",osVersion:"unknown"};let n="unknown";if(r.versionPattern){let o=Array.isArray(r.versionPattern)?g(e,r.versionPattern):P(e,r.versionPattern);if(o!==null){let s=o.replace(/_/g,".");if(r.versionLookup){let c=Object.prototype.hasOwnProperty.call(r.versionLookup,s)?r.versionLookup[s]:null;if(c!==null)n=c;else if(r.name==="Windows"){let f=parseInt(s,10);n=isNaN(f)?"unknown":f.toString();}else n=s;}else n=s;}}return r.name==="Windows"&&t&&(n=t),{os:r.name,osVersion:n}}var L=[{name:"Mobile",detect:/(Mobi|iPh)/},{name:"Tablet",detect:/(Tablet|Pad)/}];function F(e,t){if(/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(e))return "TV";if((t==null?void 0:t.platform)==="MacIntel"&&t.maxTouchPoints>1||/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e))return "Tablet";for(let r of L)if(r.detect.test(e))return r.name;return "PC"}var j=[{name:"Googlebot",detect:/Googlebot/},{name:"Bingbot",detect:/(bingbot|BingPreview)/},{name:"Baiduspider",detect:/(Baiduspider|BaiduMobaider)/},{name:"Bytespider",detect:/Bytespider/},{name:"YandexBot",detect:/YandexBot/},{name:"DuckDuckBot",detect:/DuckDuckBot/},{name:"Slurp",detect:/Slurp/},{name:"Sogou",detect:/(Sogou|sogou).*[Ss]pider/},{name:"360Spider",detect:/360Spider/},{name:"PetalBot",detect:/PetalBot/},{name:"Applebot",detect:/Applebot/},{name:"Facebookbot",detect:/(facebookexternalhit|FacebookBot)/},{name:"Twitterbot",detect:/Twitterbot/},{name:"LinkedInBot",detect:/LinkedInBot/},{name:"SemrushBot",detect:/SemrushBot/},{name:"AhrefsBot",detect:/AhrefsBot/},{name:"MJ12bot",detect:/MJ12bot/},{name:"GPTBot",detect:/GPTBot/},{name:"ClaudeBot",detect:/ClaudeBot/},{name:"PerplexityBot",detect:/PerplexityBot/},{name:"CCBot",detect:/CCBot/},{name:"AdsBot",detect:/AdsBot-Google/},{name:"GenericBot",detect:/(bot|crawler|spider|crawling|scraper)/i}];function H(e){for(let t of j)if(t.detect.test(e))return {isBot:true,botName:t.name};return {isBot:false,botName:"unknown"}}var Q=[{name:"arm64",detect:/(aarch64|arm64|ARM64)/},{name:"arm",detect:/\bARM\b/},{name:"x86_64",detect:/(x86_64|Win64|WOW64|x64;|amd64)/i},{name:"x86",detect:/(i[36]86|i686|x86;)/}];function G(e,t){if(t!=null&&t.highEntropyData){let{architecture:o,bitness:s}=t.highEntropyData;if(o==="arm")return s==="64"?"arm64":"arm";if(o==="x86")return s==="64"?"x86_64":"x86"}let r=t==null?void 0:t.webglRenderer;if(r){if(/Apple\s+(M\d|A\d{1,2}[A-Z]?)\b/i.test(r)||/APPLE M\d/i.test(r))return "arm64";if(/\b(Intel|AMD|NVIDIA|Radeon)\b/i.test(r))return "x86_64"}let n=t==null?void 0:t.platform;if(n){if(/iPhone|iPad|iPod/.test(n)||/arm64|aarch64/i.test(n))return "arm64";if(/arm/i.test(n))return "arm";if(/Win64|WOW64|x86_64/i.test(n))return "x86_64";if(/Win32|i686/i.test(n))return "x86"}for(let o of Q)if(o.detect.test(e))return o.name;return "unknown"}var ne=/(HeadlessChrome|Headless|PhantomJS|Electron\/|Playwright|jsdom\/|Selenium)/;function U(e){return ne.test(e)}function v(e){return !!(/; wv/.test(e)||/like Mac OS X/.test(e)&&!/Version\//.test(e)&&!/Safari\//.test(e))}function B(){return typeof navigator=="undefined"?{userAgent:"",platform:"",language:"",maxTouchPoints:0}:navigator}function p(e,t){var r;try{return !!((r=e.mimeTypes)!=null&&r.namedItem(t))}catch(n){return false}}function y(e){var n,o;return ((o=(n=e.browserLanguage)!=null?n:e.language)!=null?o:"").replace(/-\w+/g,s=>s.toUpperCase())||"unknown"}function K(e,t={}){var b,h,E,S,k,O,A,D;let r=(b=t.ctx)!=null?b:t.nav,n=(E=(h=t.ctx)==null?void 0:h.windowsVersion)!=null?E:t.windowsVersion,{browser:o,version:s}=R(e),{os:c,osVersion:f}=I(e,n),x=f,Y=F(e,r),q=G(e,t.ctx),a=r,{isBot:X,botName:Z}=H(e),z=U(e),J=a?y(a):"unknown",$=(S=a==null?void 0:a.platform)!=null?S:"unknown",d=o,m=s;if(a){let i=typeof chrome!="undefined"?chrome:void 0,N=/Chrome\/([\d]+)/.exec(e),w=N?parseInt(N[1],10):0;if(i)if(i.adblock2345||i.common2345)d="2345Explorer",m="unknown";else {let l=false;if(p(a,"application/360softmgrplugin")||p(a,"application/mozilla-npqihooquicklogin")||w>36&&typeof showModalDialog!="undefined"?l=true:w>45&&(l=p(a,"application/vnd.chromium.remoting-viewer"),!l&&w>=69&&(l=p(a,"application/hwepass2001.installepass2001")||p(a,"application/asx"))),l){let te=((k=a.connection)==null?void 0:k.saveData)===true;p(a,"application/gameplugin")||!te?d="360SE":d="360EE",m="unknown";}}}if(d==="Baidu"&&/(Opera|OPR|OPT)/.test(e)){d="Opera";let i=(A=(O=/OPR\/([\d.]+)/.exec(e))!=null?O:/OPT\/([\d.]+)/.exec(e))!=null?A:/Opera\/([\d.]+)/.exec(e);m=(D=i==null?void 0:i[1])!=null?D:"unknown";}if(d==="Chrome"&&/\S+Browser\//.test(e)){let i=/(\S+Browser)\/([\d.]+)/.exec(e);i&&(d=i[1],m=i[2]);}if(d==="Firefox"&&a)try{(typeof clientInformation!="undefined"||typeof u2f=="undefined")&&(d="Firefox Nightly");}catch(i){}if(d==="Wechat")try{typeof __wxjs_environment!="undefined"&&__wxjs_environment==="miniprogram"&&(d="Wechat Miniapp");}catch(i){}if(c==="iOS"&&d==="Safari"){let i=/Version\/([\d.]+)/.exec(e);i&&parseInt(i[1],10)>parseInt(x,10)&&(x=i[1]);}let ee=_(e,d,m);return {browser:d,version:m,engine:ee,os:c,osVersion:x,device:Y,arch:q,isWebview:v(e),isHeadless:z,isBot:X,botName:Z,language:J,platform:$}}var{version:oe}=C;var ie=()=>{try{return typeof __wxjs_environment!="undefined"&&__wxjs_environment==="miniprogram"}catch(e){return false}};function u(e){let t=B();return K(e!=null?e:t.userAgent,{nav:t})}u.isWebview=v;u.isWechatMiniapp=ie;u.getLanguage=()=>y(B());u.VERSION=oe;var se=u;
|
|
2
|
-
return
|
|
1
|
+
var uaBrowser=(function(){'use strict';var C={version:"1.3.0"};var T=[{name:"Safari",priority:10,detect:/Safari/,versionPattern:/Version\/([\d.]+)/},{name:"Chrome",priority:20,detect:/(Chrome|CriOS)/,versionPattern:[/Chrome\/([\d.]+)/,/CriOS\/([\d.]+)/]},{name:"IE",priority:30,detect:/(MSIE|Trident)/,versionPattern:[/MSIE ([\d.]+)/,/rv:([\d.]+)/]},{name:"Edge",priority:40,detect:/(Edge|Edg\/|EdgA|EdgiOS)/,versionPattern:[/Edge\/([\d.]+)/,/Edg\/([\d.]+)/,/EdgA\/([\d.]+)/,/EdgiOS\/([\d.]+)/]},{name:"Firefox",priority:50,detect:/(Firefox|FxiOS)/,versionPattern:[/Firefox\/([\d.]+)/,/FxiOS\/([\d.]+)/]},{name:"Firefox Focus",priority:55,detect:/Focus/,versionPattern:/Focus\/([\d.]+)/},{name:"Chromium",priority:60,detect:/Chromium/,versionPattern:/Chromium\/([\d.]+)/},{name:"Opera",priority:70,detect:/(Opera|OPR|OPT)/,versionPattern:[/Opera\/([\d.]+)/,/OPR\/([\d.]+)/,/OPT\/([\d.]+)/]},{name:"Vivaldi",priority:80,detect:/Vivaldi/,versionPattern:/Vivaldi\/([\d.]+)/},{name:"Yandex",priority:90,detect:/YaBrowser/,versionPattern:/YaBrowser\/([\d.]+)/},{name:"Samsung Internet",priority:92,detect:/SamsungBrowser/,versionPattern:/SamsungBrowser\/([\d.]+)/},{name:"DuckDuckGo",priority:94,detect:/DuckDuckGo\//,versionPattern:/DuckDuckGo\/([\d.]+)/},{name:"Puffin",priority:96,detect:/Puffin\//,versionPattern:/Puffin\/([\d.]+)/},{name:"Coc Coc",priority:130,detect:/coc_coc_browser/,versionPattern:/coc_coc_browser\/([\d.]+)/},{name:"Kindle",priority:140,detect:/(Kindle|Silk\/)/,versionPattern:/Version\/([\d.]+)/},{name:"Konqueror",priority:160,detect:/Konqueror/,versionPattern:/Konqueror\/([\d.]+)/},{name:"SeaMonkey",priority:180,detect:/SeaMonkey/,versionPattern:/SeaMonkey\/([\d.]+)/},{name:"Epiphany",priority:190,detect:/Epiphany/,versionPattern:/Epiphany\/([\d.]+)/},{name:"Maxthon",priority:200,detect:/Maxthon/,versionPattern:/Maxthon\/([\d.]+)/},{name:"360",priority:300,detect:/(QihooBrowser|QHBrowser)/,versionPattern:/QihooBrowser\/([\d.]+)/},{name:"360SE",priority:310,detect:/360SE/,versionPattern:null,chromeLookup:{108:"14.0",86:"13.0",78:"12.0",69:"11.0",63:"10.0",55:"9.1",45:"8.1",42:"8.0",31:"7.0",21:"6.3"}},{name:"360EE",priority:320,detect:/360EE/,versionPattern:null,chromeLookup:{86:"13.0",78:"12.0",69:"11.0",63:"9.5",55:"9.0",50:"8.7",30:"7.5"}},{name:"UC",priority:330,detect:/(UCBrowser|UBrowser|UCWEB)/,versionPattern:/UC?Browser\/([\d.]+)/},{name:"QQBrowser",priority:340,detect:/QQBrowser/,versionPattern:/QQBrowser\/([\d.]+)/},{name:"QQ",priority:345,detect:/QQ\//,versionPattern:/QQ\/([\d.]+)/},{name:"Baidu",priority:350,detect:/(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/,versionPattern:[/BIDUBrowser[\s/]([\d.]+)/,/baiduboxapp\/([\d.]+)/]},{name:"Sogou",priority:360,detect:/(MetaSr|Sogou)/,versionPattern:[/SE ([\d.X]+)/,/SogouMobileBrowser\/([\d.]+)/]},{name:"Liebao",priority:370,detect:/(LBBROWSER|LieBaoFast)/,versionPattern:/LieBaoFast\/([\d.]+)/,chromeLookup:{57:"6.5",49:"6.0",46:"5.9",42:"5.3",39:"5.2",34:"5.0",29:"4.5",21:"4.0"}},{name:"2345Explorer",priority:380,detect:/2345Explorer/,versionPattern:[/2345Explorer\/([\d.]+)/,/Mb2345Browser\/([\d.]+)/],chromeLookup:{69:"10.0",55:"9.9"}},{name:"115Browser",priority:390,detect:/115Browser/,versionPattern:/115Browser\/([\d.]+)/},{name:"TheWorld",priority:400,detect:/TheWorld/,versionPattern:/TheWorld ([\d.]+)/},{name:"XiaoMi",priority:410,detect:/MiuiBrowser/,versionPattern:/MiuiBrowser\/([\d.]+)/},{name:"Vivo",priority:420,detect:/VivoBrowser/,versionPattern:/VivoBrowser\/([\d.]+)/},{name:"Huawei",priority:430,detect:/HuaweiBrowser/,versionPattern:[/HuaweiBrowser\/([\d.]+)/,/Version\/([\d.]+)/]},{name:"OPPO",priority:440,detect:/HeyTapBrowser/,versionPattern:/HeyTapBrowser\/([\d.]+)/},{name:"Quark",priority:450,detect:/Quark/,versionPattern:/Quark\/([\d.]+)/},{name:"Qiyu",priority:460,detect:/Qiyu/,versionPattern:/Qiyu\/([\d.]+)/},{name:"WechatWork",priority:500,detect:/wxwork\//,versionPattern:/wxwork\/([\d.]+)/},{name:"Wechat",priority:510,detect:/MicroMessenger/,versionPattern:/MicroMessenger\/([\d.]+)/},{name:"Taobao",priority:520,detect:/AliApp\(TB/,versionPattern:/AliApp\(TB\/([\d.]+)/},{name:"Alipay",priority:530,detect:/AliApp\(AP/,versionPattern:/AliApp\(AP\/([\d.]+)/},{name:"Weibo",priority:540,detect:/Weibo/,versionPattern:/weibo__([\d.]+)/},{name:"Douban",priority:550,detect:/com\.douban\.frodo/,versionPattern:/com\.douban\.frodo\/([\d.]+)/},{name:"Suning",priority:560,detect:/SNEBUY-APP/,versionPattern:/SNEBUY-APP([\d.]+)/},{name:"iQiYi",priority:570,detect:/IqiyiApp/,versionPattern:/IqiyiVersion\/([\d.]+)/},{name:"DingTalk",priority:580,detect:/DingTalk/,versionPattern:/DingTalk\/([\d.]+)/},{name:"Douyin",priority:590,detect:/aweme/,versionPattern:/app_version\/([\d.]+)/},{name:"Bilibili",priority:592,detect:/BiliBili\//,versionPattern:/BiliBili\/([\d.]+)/},{name:"Kuaishou",priority:594,detect:/Kwai\//,versionPattern:/Kwai\/([\d.]+)/},{name:"Xiaohongshu",priority:596,detect:/Xiaohongshu\//,versionPattern:/Xiaohongshu\/([\d.]+)/},{name:"Feishu",priority:597,detect:/(Lark|Feishu)\//,versionPattern:[/Lark\/([\d.]+)/,/Feishu\/([\d.]+)/]},{name:"Toutiao",priority:598,detect:/NewsArticle\//,versionPattern:/NewsArticle\/([\d.]+)/},{name:"JD",priority:599,detect:/jdpingou\//,versionPattern:/jdpingou\/([\d.]+)/},{name:"Meituan",priority:600,detect:/MeituanHybrid\//,versionPattern:/MeituanHybrid\/([\d.]+)/}];function w(e,t){let r=t.exec(e);if(!r)return null;let n=r[1];return n!=null&&n!==""?n:null}function f(e,t){for(let r of t){let n=w(e,r);if(n!==null)return n}return null}function M(e,t){let r=/Chrome\/([\d]+)/.exec(e);if(!r)return null;let n=r[1];return Object.prototype.hasOwnProperty.call(t,n)?t[n]:null}function R(e){let t=null;for(let n of T)n.detect.test(e)&&(t===null||n.priority>=t.priority)&&(t=n);if(!t)return {browser:"unknown",version:"unknown"};let r=null;if(t.chromeLookup&&(r=M(e,t.chromeLookup)),r===null&&t.versionPattern!==null){let n=Array.isArray(t.versionPattern)?t.versionPattern:[t.versionPattern];r=f(e,n);}return {browser:t.name,version:r!=null?r:"unknown"}}var V=[{name:"KHTML",detect:/KHTML\//},{name:"Trident",detect:/(Trident|NET CLR)/},{name:"Presto",detect:/Presto/},{name:"Gecko",detect:/Gecko\//},{name:"WebKit",detect:/AppleWebKit/},{name:"ArkWeb",detect:/ArkWeb/}];function W(e,t,r){var o,s;let n="unknown";for(let c of V)c.detect.test(e)&&(n=c.name);return (n==="WebKit"&&/(Chrome|CriOS)/.test(e)&&parseInt((s=((o=/Chrome\/([\d]+)/.exec(e))!=null?o:[])[1])!=null?s:"0",10)>27||t==="Opera"&&parseInt(r,10)>12||t==="Yandex")&&(n="Blink"),t==="Edge"&&(n=parseInt(r,10)>75?"Blink":"EdgeHTML"),n}var F=[{name:"WebOS",detect:/hpwOS/,versionPattern:/hpwOS\/([\d.]+)/},{name:"Symbian",detect:/Symbian/,versionPattern:null},{name:"MeeGo",detect:/MeeGo/,versionPattern:null},{name:"BlackBerry",detect:/(BlackBerry|RIM)/,versionPattern:null},{name:"FreeBSD",detect:/FreeBSD/,versionPattern:null},{name:"Debian",detect:/Debian/,versionPattern:/Debian\/([\d.]+)/},{name:"Ubuntu",detect:/Ubuntu/,versionPattern:null},{name:"Linux",detect:/(Linux|X11)/,versionPattern:null},{name:"Chrome OS",detect:/CrOS/,versionPattern:null},{name:"Tizen",detect:/Tizen/,versionPattern:/Tizen ([\d.]+)/},{name:"iOS",detect:/like Mac OS X/,versionPattern:/OS ([\d_]+) like/},{name:"MacOS",detect:/Macintosh/,versionPattern:/Mac OS X -?([\d_.]+)/},{name:"Android",detect:/(Android|Adr)/,versionPattern:/(?:Android|Adr) ([\d.]+)/},{name:"HarmonyOS",detect:/HarmonyOS/,versionPattern:[/HarmonyOS[\s/]([\d.]+)/,/Android ([\d.]+)[;)]/],versionLookup:{10:"2",11:"3",12:"3",13:"4"}},{name:"OpenHarmony",detect:/OpenHarmony/,versionPattern:/OpenHarmony[\s/]([\d.]+)/},{name:"KaiOS",detect:/KAIOS/,versionPattern:/KAIOS\/([\d.]+)/},{name:"Windows",detect:/Windows/,versionPattern:/Windows NT ([\d.]+)/,versionLookup:{10:"10","6.4":"10","6.3":"8.1","6.2":"8","6.1":"7","6.0":"Vista","5.2":"XP","5.1":"XP","5.0":"2000"}},{name:"Windows Phone",detect:/(IEMobile|Windows Phone)/,versionPattern:/Windows Phone(?: OS)? ([\d.]+)/}];function L(e,t){let r=null;for(let o of F)o.detect.test(e)&&(r=o);if(!r)return {os:"unknown",osVersion:"unknown"};let n="unknown";if(r.versionPattern){let o=Array.isArray(r.versionPattern)?f(e,r.versionPattern):w(e,r.versionPattern);if(o!==null){let s=o.replace(/_/g,".");if(r.versionLookup){let c=Object.prototype.hasOwnProperty.call(r.versionLookup,s)?r.versionLookup[s]:null;if(c!==null)n=c;else if(r.name==="Windows"){let l=parseInt(s,10);n=isNaN(l)?"unknown":l.toString();}else n=s;}else n=s;}}return r.name==="Windows"&&t&&(n=t),{os:r.name,osVersion:n}}var I=[{name:"Mobile",detect:/(Mobi|iPh)/},{name:"Tablet",detect:/(Tablet|Pad)/}];function _(e,t){if(/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(e))return "TV";if((t==null?void 0:t.platform)==="MacIntel"&&t.maxTouchPoints>1||/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e))return "Tablet";for(let r of I)if(r.detect.test(e))return r.name;return "PC"}var H=[{name:"Googlebot",detect:/Googlebot/},{name:"Bingbot",detect:/(bingbot|BingPreview)/},{name:"Baiduspider",detect:/(Baiduspider|BaiduMobaider)/},{name:"Bytespider",detect:/Bytespider/},{name:"YandexBot",detect:/YandexBot/},{name:"DuckDuckBot",detect:/DuckDuckBot/},{name:"Slurp",detect:/Slurp/},{name:"Sogou",detect:/(Sogou|sogou).*[Ss]pider/},{name:"360Spider",detect:/360Spider/},{name:"PetalBot",detect:/PetalBot/},{name:"Applebot",detect:/Applebot/},{name:"Facebookbot",detect:/(facebookexternalhit|FacebookBot)/},{name:"Twitterbot",detect:/Twitterbot/},{name:"LinkedInBot",detect:/LinkedInBot/},{name:"SemrushBot",detect:/SemrushBot/},{name:"AhrefsBot",detect:/AhrefsBot/},{name:"MJ12bot",detect:/MJ12bot/},{name:"GPTBot",detect:/GPTBot/},{name:"ClaudeBot",detect:/ClaudeBot/},{name:"PerplexityBot",detect:/PerplexityBot/},{name:"CCBot",detect:/CCBot/},{name:"AdsBot",detect:/AdsBot-Google/},{name:"GenericBot",detect:/(bot|crawler|spider|crawling|scraper)/i}];function j(e){for(let t of H)if(t.detect.test(e))return {isBot:true,botName:t.name};return {isBot:false,botName:"unknown"}}var Q=[{name:"arm64",detect:/(aarch64|arm64|ARM64)/},{name:"arm",detect:/\bARM\b/},{name:"x86_64",detect:/(x86_64|Win64|WOW64|x64;|amd64)/i},{name:"x86",detect:/(i[36]86|i686|x86;)/}];function G(e,t){if(t!=null&&t.highEntropyData){let{architecture:o,bitness:s}=t.highEntropyData;if(o==="arm")return s==="64"?"arm64":"arm";if(o==="x86")return s==="64"?"x86_64":"x86"}let r=t==null?void 0:t.webglRenderer;if(r){if(/Apple\s+(M\d|A\d{1,2}[A-Z]?)\b/i.test(r)||/APPLE M\d/i.test(r))return "arm64";if(/\b(Intel|AMD|NVIDIA|Radeon)\b/i.test(r))return "x86_64"}let n=t==null?void 0:t.platform;if(n){if(/iPhone|iPad|iPod/.test(n)||/arm64|aarch64/i.test(n))return "arm64";if(/arm/i.test(n))return "arm";if(/Win64|WOW64|x86_64/i.test(n))return "x86_64";if(/Win32|i686/i.test(n))return "x86"}for(let o of Q)if(o.detect.test(e))return o.name;return "unknown"}var ne=/(HeadlessChrome|Headless|PhantomJS|Electron\/|Playwright|jsdom\/|Selenium)/;function K(e){return ne.test(e)}function g(e){return !!(/; wv/.test(e)||/like Mac OS X/.test(e)&&!/Version\//.test(e)&&!/Safari\//.test(e))}function P(){return typeof navigator=="undefined"?{userAgent:"",platform:"",language:"",maxTouchPoints:0}:navigator}function p(e,t){var r;try{return !!((r=e.mimeTypes)!=null&&r.namedItem(t))}catch(n){return false}}function v(e){var n,o;return ((o=(n=e.browserLanguage)!=null?n:e.language)!=null?o:"").replace(/-\w+/g,s=>s.toUpperCase())||"unknown"}function U(e,t={}){var b,h,E,S,k,O,A,D;let r=(b=t.ctx)!=null?b:t.nav,n=(E=(h=t.ctx)==null?void 0:h.windowsVersion)!=null?E:t.windowsVersion,{browser:o,version:s}=R(e),{os:c,osVersion:l}=L(e,n),x=l,X=_(e,r),Y=G(e,t.ctx),a=r,{isBot:q,botName:J}=j(e),z=K(e),Z=a?v(a):"unknown",$=(S=a==null?void 0:a.platform)!=null?S:"unknown",d=o,m=s;if(a){let i=typeof chrome!="undefined"?chrome:void 0,N=/Chrome\/([\d]+)/.exec(e),B=N?parseInt(N[1],10):0;if(i)if(i.adblock2345||i.common2345)d="2345Explorer",m="unknown";else {let u=false;if(p(a,"application/360softmgrplugin")||p(a,"application/mozilla-npqihooquicklogin")||B>36&&typeof showModalDialog!="undefined"?u=true:B>45&&(u=p(a,"application/vnd.chromium.remoting-viewer"),!u&&B>=69&&(u=p(a,"application/hwepass2001.installepass2001")||p(a,"application/asx"))),u){let te=((k=a.connection)==null?void 0:k.saveData)===true;p(a,"application/gameplugin")||!te?d="360SE":d="360EE",m="unknown";}}}if(d==="Baidu"&&/(Opera|OPR|OPT)/.test(e)){d="Opera";let i=(A=(O=/OPR\/([\d.]+)/.exec(e))!=null?O:/OPT\/([\d.]+)/.exec(e))!=null?A:/Opera\/([\d.]+)/.exec(e);m=(D=i==null?void 0:i[1])!=null?D:"unknown";}if(d==="Chrome"&&/\S+Browser\//.test(e)){let i=/(\S+Browser)\/([\d.]+)/.exec(e);i&&(d=i[1],m=i[2]);}if(d==="Firefox"&&a)try{(typeof clientInformation!="undefined"||typeof u2f=="undefined")&&(d="Firefox Nightly");}catch(i){}if(c==="iOS"&&d==="Safari"){let i=/Version\/([\d.]+)/.exec(e);i&&parseInt(i[1],10)>parseInt(x,10)&&(x=i[1]);}let ee=W(e,d,m);return {browser:d,version:m,engine:ee,os:c,osVersion:x,device:X,arch:Y,isWebview:g(e),isHeadless:z,isBot:q,botName:J,language:Z,platform:$}}var{version:oe}=C;function y(e){let t=P();return U(e!=null?e:t.userAgent,{nav:t})}y.isWebview=g;y.getLanguage=()=>v(P());y.VERSION=oe;var ie=y;
|
|
2
|
+
return ie;})();//# sourceMappingURL=index.min.js.map
|
|
3
3
|
//# sourceMappingURL=index.min.js.map
|