ua-browser 1.1.0 → 1.2.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/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // package.json
2
2
  var package_default = {
3
- version: "1.1.0"};
3
+ version: "1.2.0"};
4
4
 
5
5
  // src/constants/browsers.ts
6
6
  var BROWSER_DEFS = [
@@ -18,14 +18,9 @@ var BROWSER_DEFS = [
18
18
  { name: "Samsung Internet", priority: 92, detect: /SamsungBrowser/, versionPattern: /SamsungBrowser\/([\d.]+)/ },
19
19
  { name: "DuckDuckGo", priority: 94, detect: /DuckDuckGo\//, versionPattern: /DuckDuckGo\/([\d.]+)/ },
20
20
  { name: "Puffin", priority: 96, detect: /Puffin\//, versionPattern: /Puffin\/([\d.]+)/ },
21
- { name: "Arora", priority: 100, detect: /Arora/, versionPattern: /Arora\/([\d.]+)/ },
22
- { name: "Lunascape", priority: 110, detect: /Lunascape/, versionPattern: /Lunascape[\s]([\d.]+)/ },
23
- { name: "QupZilla", priority: 120, detect: /QupZilla/, versionPattern: /QupZilla[\s]([\d.]+)/ },
24
21
  { name: "Coc Coc", priority: 130, detect: /coc_coc_browser/, versionPattern: /coc_coc_browser\/([\d.]+)/ },
25
22
  { name: "Kindle", priority: 140, detect: /(Kindle|Silk\/)/, versionPattern: /Version\/([\d.]+)/ },
26
- { name: "Iceweasel", priority: 150, detect: /Iceweasel/, versionPattern: /Iceweasel\/([\d.]+)/ },
27
23
  { name: "Konqueror", priority: 160, detect: /Konqueror/, versionPattern: /Konqueror\/([\d.]+)/ },
28
- { name: "Iceape", priority: 170, detect: /Iceape/, versionPattern: /Iceape\/([\d.]+)/ },
29
24
  { name: "SeaMonkey", priority: 180, detect: /SeaMonkey/, versionPattern: /SeaMonkey\/([\d.]+)/ },
30
25
  { name: "Epiphany", priority: 190, detect: /Epiphany/, versionPattern: /Epiphany\/([\d.]+)/ },
31
26
  { name: "Maxthon", priority: 200, detect: /Maxthon/, versionPattern: /Maxthon\/([\d.]+)/ },
@@ -110,7 +105,14 @@ var BROWSER_DEFS = [
110
105
  { name: "Suning", priority: 560, detect: /SNEBUY-APP/, versionPattern: /SNEBUY-APP([\d.]+)/ },
111
106
  { name: "iQiYi", priority: 570, detect: /IqiyiApp/, versionPattern: /IqiyiVersion\/([\d.]+)/ },
112
107
  { name: "DingTalk", priority: 580, detect: /DingTalk/, versionPattern: /DingTalk\/([\d.]+)/ },
113
- { name: "Douyin", priority: 590, detect: /aweme/, versionPattern: /app_version\/([\d.]+)/ }
108
+ { name: "Douyin", priority: 590, detect: /aweme/, versionPattern: /app_version\/([\d.]+)/ },
109
+ { name: "Bilibili", priority: 592, detect: /BiliBili\//, versionPattern: /BiliBili\/([\d.]+)/ },
110
+ { name: "Kuaishou", priority: 594, detect: /Kwai\//, versionPattern: /Kwai\/([\d.]+)/ },
111
+ { name: "Xiaohongshu", priority: 596, detect: /Xiaohongshu\//, versionPattern: /Xiaohongshu\/([\d.]+)/ },
112
+ { name: "Feishu", priority: 597, detect: /(Lark|Feishu)\//, versionPattern: [/Lark\/([\d.]+)/, /Feishu\/([\d.]+)/] },
113
+ { name: "Toutiao", priority: 598, detect: /NewsArticle\//, versionPattern: /NewsArticle\/([\d.]+)/ },
114
+ { name: "JD", priority: 599, detect: /jdpingou\//, versionPattern: /jdpingou\/([\d.]+)/ },
115
+ { name: "Meituan", priority: 600, detect: /MeituanHybrid\//, versionPattern: /MeituanHybrid\/([\d.]+)/ }
114
116
  ];
115
117
 
116
118
  // src/utils/extract.ts
@@ -426,7 +428,7 @@ function getLanguage(nav) {
426
428
 
427
429
  // src/parse.ts
428
430
  function parseUA(ua, options = {}) {
429
- var _a, _b, _c, _d, _e, _f, _g, _h;
431
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
430
432
  const effectiveNav = (_a = options.ctx) != null ? _a : options.nav;
431
433
  const effectiveWindowsVersion = (_c = (_b = options.ctx) == null ? void 0 : _b.windowsVersion) != null ? _c : options.windowsVersion;
432
434
  const { browser: rawBrowser, version: rawVersion } = detectBrowser(ua);
@@ -499,6 +501,46 @@ function parseUA(ua, options = {}) {
499
501
  } catch (e) {
500
502
  }
501
503
  }
504
+ if (browser === "Alipay") {
505
+ try {
506
+ if (typeof window !== "undefined" && typeof ((_i = window.my) == null ? void 0 : _i.getSystemInfo) === "function") {
507
+ browser = "Alipay Miniapp";
508
+ }
509
+ } catch (e) {
510
+ }
511
+ }
512
+ if (browser === "Baidu") {
513
+ try {
514
+ if (typeof swan !== "undefined" && typeof (swan == null ? void 0 : swan.getSystemInfo) === "function") {
515
+ browser = "Baidu Miniapp";
516
+ }
517
+ } catch (e) {
518
+ }
519
+ }
520
+ if (browser === "Douyin") {
521
+ try {
522
+ if (typeof tt !== "undefined" && typeof (tt == null ? void 0 : tt.getSystemInfo) === "function") {
523
+ browser = "Douyin Miniapp";
524
+ }
525
+ } catch (e) {
526
+ }
527
+ }
528
+ if (browser === "QQ") {
529
+ try {
530
+ if (typeof qq !== "undefined" && typeof (qq == null ? void 0 : qq.getSystemInfo) === "function") {
531
+ browser = "QQ Miniapp";
532
+ }
533
+ } catch (e) {
534
+ }
535
+ }
536
+ if (browser === "Kuaishou") {
537
+ try {
538
+ if (typeof ks !== "undefined" && typeof (ks == null ? void 0 : ks.getSystemInfo) === "function") {
539
+ browser = "Kuaishou Miniapp";
540
+ }
541
+ } catch (e) {
542
+ }
543
+ }
502
544
  if (os === "iOS" && browser === "Safari") {
503
545
  const m = /Version\/([\d.]+)/.exec(ua);
504
546
  if (m && parseInt(m[1], 10) > parseInt(osVersion, 10)) {
@@ -704,16 +746,57 @@ var isWechatMiniapp = () => {
704
746
  return false;
705
747
  }
706
748
  };
749
+ var isAlipayMiniapp = () => {
750
+ var _a;
751
+ try {
752
+ return typeof window !== "undefined" && typeof ((_a = window.my) == null ? void 0 : _a.getSystemInfo) === "function";
753
+ } catch (e) {
754
+ return false;
755
+ }
756
+ };
757
+ var isBaiduMiniapp = () => {
758
+ try {
759
+ return typeof swan !== "undefined" && typeof (swan == null ? void 0 : swan.getSystemInfo) === "function";
760
+ } catch (e) {
761
+ return false;
762
+ }
763
+ };
764
+ var isDouyinMiniapp = () => {
765
+ try {
766
+ return typeof tt !== "undefined" && typeof (tt == null ? void 0 : tt.getSystemInfo) === "function";
767
+ } catch (e) {
768
+ return false;
769
+ }
770
+ };
771
+ var isQQMiniapp = () => {
772
+ try {
773
+ return typeof qq !== "undefined" && typeof (qq == null ? void 0 : qq.getSystemInfo) === "function";
774
+ } catch (e) {
775
+ return false;
776
+ }
777
+ };
778
+ var isKuaishouMiniapp = () => {
779
+ try {
780
+ return typeof ks !== "undefined" && typeof (ks == null ? void 0 : ks.getSystemInfo) === "function";
781
+ } catch (e) {
782
+ return false;
783
+ }
784
+ };
707
785
  function uaBrowser(ua) {
708
786
  const nav = getNavContext();
709
787
  return parseUA(ua != null ? ua : nav.userAgent, { nav });
710
788
  }
711
789
  uaBrowser.isWebview = isWebview;
712
790
  uaBrowser.isWechatMiniapp = isWechatMiniapp;
791
+ uaBrowser.isAlipayMiniapp = isAlipayMiniapp;
792
+ uaBrowser.isBaiduMiniapp = isBaiduMiniapp;
793
+ uaBrowser.isDouyinMiniapp = isDouyinMiniapp;
794
+ uaBrowser.isQQMiniapp = isQQMiniapp;
795
+ uaBrowser.isKuaishouMiniapp = isKuaishouMiniapp;
713
796
  uaBrowser.getLanguage = () => getLanguage(getNavContext());
714
797
  uaBrowser.VERSION = VERSION;
715
798
  var src_default = uaBrowser;
716
799
 
717
- export { ACCEPT_CH, VERSION, src_default as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, isWechatMiniapp, parseHeaders, parseUA };
800
+ export { ACCEPT_CH, VERSION, src_default as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isAlipayMiniapp, isBaiduMiniapp, isDouyinMiniapp, isKuaishouMiniapp, isQQMiniapp, isWebview, isWechatMiniapp, parseHeaders, parseUA };
718
801
  //# sourceMappingURL=index.mjs.map
719
802
  //# sourceMappingURL=index.mjs.map
@@ -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.mjs","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.mjs","sourcesContent":["{\n \"name\": \"ua-browser\",\n \"version\": \"1.2.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 // 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 // Alipay Miniapp — my is a reserved word; accessed via window.my\n if (browser === 'Alipay') {\n try {\n if (typeof window !== 'undefined' &&\n typeof (window as unknown as { my?: { getSystemInfo?: unknown } }).my?.getSystemInfo === 'function') {\n browser = 'Alipay Miniapp'\n }\n } catch {\n // not in Alipay miniapp context\n }\n }\n\n // Baidu Smart Miniapp (swan)\n if (browser === 'Baidu') {\n try {\n if (typeof swan !== 'undefined' && typeof swan?.getSystemInfo === 'function') {\n browser = 'Baidu Miniapp'\n }\n } catch {\n // not in Baidu miniapp context\n }\n }\n\n // Douyin Miniapp (tt)\n if (browser === 'Douyin') {\n try {\n if (typeof tt !== 'undefined' && typeof tt?.getSystemInfo === 'function') {\n browser = 'Douyin Miniapp'\n }\n } catch {\n // not in Douyin miniapp context\n }\n }\n\n // QQ Miniapp (qq)\n if (browser === 'QQ') {\n try {\n if (typeof qq !== 'undefined' && typeof qq?.getSystemInfo === 'function') {\n browser = 'QQ Miniapp'\n }\n } catch {\n // not in QQ miniapp context\n }\n }\n\n // Kuaishou Miniapp (ks)\n if (browser === 'Kuaishou') {\n try {\n if (typeof ks !== 'undefined' && typeof ks?.getSystemInfo === 'function') {\n browser = 'Kuaishou Miniapp'\n }\n } catch {\n // not in Kuaishou 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/** Check whether the current context is an Alipay mini-program. */\nexport const isAlipayMiniapp = (): boolean => {\n try {\n return typeof window !== 'undefined' &&\n typeof (window as unknown as { my?: { getSystemInfo?: unknown } }).my?.getSystemInfo === 'function'\n } catch {\n return false\n }\n}\n\n/** Check whether the current context is a Baidu Smart mini-program. */\nexport const isBaiduMiniapp = (): boolean => {\n try {\n return typeof swan !== 'undefined' && typeof swan?.getSystemInfo === 'function'\n } catch {\n return false\n }\n}\n\n/** Check whether the current context is a Douyin mini-program. */\nexport const isDouyinMiniapp = (): boolean => {\n try {\n return typeof tt !== 'undefined' && typeof tt?.getSystemInfo === 'function'\n } catch {\n return false\n }\n}\n\n/** Check whether the current context is a QQ mini-program. */\nexport const isQQMiniapp = (): boolean => {\n try {\n return typeof qq !== 'undefined' && typeof qq?.getSystemInfo === 'function'\n } catch {\n return false\n }\n}\n\n/** Check whether the current context is a Kuaishou mini-program. */\nexport const isKuaishouMiniapp = (): boolean => {\n try {\n return typeof ks !== 'undefined' && typeof ks?.getSystemInfo === 'function'\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.isAlipayMiniapp = isAlipayMiniapp\nuaBrowser.isBaiduMiniapp = isBaiduMiniapp\nuaBrowser.isDouyinMiniapp = isDouyinMiniapp\nuaBrowser.isQQMiniapp = isQQMiniapp\nuaBrowser.isKuaishouMiniapp = isKuaishouMiniapp\nuaBrowser.getLanguage = (): string => getLanguage(getNavContext())\nuaBrowser.VERSION = VERSION\n\nexport default uaBrowser\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ua-browser",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "uaBrowser - Browser, OS, engine and device detection from user agent strings. Supports Node.js. Zero dependencies.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",