ua-browser 1.3.1 → 1.4.0-beta.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.d.cts CHANGED
@@ -1,12 +1,13 @@
1
1
  type EngineName = 'Trident' | 'Presto' | 'WebKit' | 'Gecko' | 'KHTML' | 'Blink' | 'EdgeHTML' | 'ArkWeb' | 'unknown';
2
- type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
3
- type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
4
- type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV';
2
+ type BrowserName = 'Safari' | 'Chrome' | 'Arc' | 'Brave' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
3
+ type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'visionOS' | 'tvOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
4
+ type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV' | 'Console' | 'XR' | 'unknown';
5
5
  type ArchName$1 = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
6
- type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'GPTBot' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'GenericBot' | 'unknown';
6
+ type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
7
7
  interface EnvOption {
8
8
  browser: BrowserName;
9
9
  version: string;
10
+ versionMajor: number;
10
11
  engine: EngineName;
11
12
  os: OsName;
12
13
  osVersion: string;
@@ -18,6 +19,7 @@ interface EnvOption {
18
19
  botName: BotName$1;
19
20
  language: string;
20
21
  platform: string;
22
+ connectionType: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';
21
23
  }
22
24
  declare global {
23
25
  var chrome: {
@@ -39,6 +41,25 @@ declare global {
39
41
  }
40
42
  }
41
43
 
44
+ type BotName = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
45
+ interface BotDef {
46
+ name: BotName;
47
+ detect: RegExp;
48
+ }
49
+
50
+ interface BotResult {
51
+ isBot: boolean;
52
+ botName: BotName;
53
+ }
54
+ /**
55
+ * Detect whether the UA belongs to a bot, crawler, or spider.
56
+ * Returns the specific bot name when recognised, 'GenericBot' for generic patterns,
57
+ * or 'unknown' for regular user agents.
58
+ *
59
+ * Pass `customDefs` to prepend project-specific bot rules before the GenericBot catch-all.
60
+ */
61
+ declare function detectBot(ua: string, customDefs?: readonly BotDef[]): BotResult;
62
+
42
63
  /**
43
64
  * A subset of the Navigator interface that our detectors need.
44
65
  * Accepting NavContext as a parameter makes every detector pure and testable.
@@ -52,6 +73,9 @@ interface NavContext {
52
73
  mimeTypes?: MimeTypeArray;
53
74
  connection?: {
54
75
  saveData?: boolean;
76
+ effectiveType?: '4g' | '3g' | '2g' | 'slow-2g';
77
+ rtt?: number;
78
+ downlink?: number;
55
79
  };
56
80
  userAgentData?: {
57
81
  platform: string;
@@ -76,14 +100,29 @@ interface UAHighEntropyValues {
76
100
  interface EnvContext extends NavContext {
77
101
  webglRenderer?: string;
78
102
  webglVendor?: string;
103
+ webglMaxTextureSize?: number;
104
+ webglFragPrecision?: number;
105
+ webglCompressedFormats?: {
106
+ s3tc: boolean;
107
+ pvrtc: boolean;
108
+ etc2: boolean;
109
+ astc: boolean;
110
+ };
79
111
  hardwareConcurrency?: number;
80
112
  deviceMemory?: number;
81
113
  devicePixelRatio?: number;
114
+ screenWidth?: number;
115
+ screenHeight?: number;
116
+ safeAreaInsetTop?: number;
117
+ audioSampleRate?: number;
118
+ hasVibration?: boolean;
119
+ hasDeviceMotion?: boolean;
82
120
  pointerType?: 'coarse' | 'fine' | 'none';
83
121
  hoverCapability?: boolean;
84
122
  fontProbes?: Record<string, boolean>;
85
123
  highEntropyData?: UAHighEntropyValues;
86
124
  windowsVersion?: string | null;
125
+ hasBrave?: boolean;
87
126
  }
88
127
  /**
89
128
  * Collect all available browser signals into a single EnvContext.
@@ -99,6 +138,14 @@ interface ParseOptions {
99
138
  windowsVersion?: string | null;
100
139
  /** Full env context from getEnvContext() — supersedes nav and windowsVersion when provided. */
101
140
  ctx?: EnvContext;
141
+ /** Additional bot definitions prepended before the GenericBot catch-all. */
142
+ customBotDefs?: readonly BotDef[];
143
+ /**
144
+ * Explicit language override (BCP47, e.g. "zh-CN"). Useful for server-side parsing
145
+ * where the Accept-Language header is available but no browser context exists.
146
+ * Takes precedence over language derived from ctx/nav or UA string.
147
+ */
148
+ language?: string;
102
149
  }
103
150
  /**
104
151
  * Parse a user agent string into a full browser/OS/engine/device description.
@@ -119,18 +166,30 @@ declare function parseUA(ua: string, options?: ParseOptions): EnvOption;
119
166
  */
120
167
  declare function getWindowsVersion(nav: NavContext): Promise<string | null>;
121
168
 
122
- type BotName = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'GPTBot' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'GenericBot' | 'unknown';
169
+ interface BrowserResult {
170
+ browser: BrowserName;
171
+ version: string;
172
+ }
173
+ /**
174
+ * Detect the browser name and version from a user agent string.
175
+ *
176
+ * When multiple BROWSER_DEFS entries match the same UA, the one with
177
+ * the highest `priority` value wins (ties go to the later definition).
178
+ */
179
+ declare function detectBrowser(ua: string): BrowserResult;
123
180
 
124
- interface BotResult {
125
- isBot: boolean;
126
- botName: BotName;
181
+ interface OsResult {
182
+ os: OsName;
183
+ osVersion: string;
127
184
  }
128
185
  /**
129
- * Detect whether the UA belongs to a bot, crawler, or spider.
130
- * Returns the specific bot name when recognised, 'GenericBot' for generic patterns,
131
- * or 'unknown' for regular user agents.
186
+ * Detect the operating system and its version from a user agent string.
187
+ *
188
+ * @param ua - Raw user agent string
189
+ * @param windowsVersion - Pre-resolved Windows 11/10 string from getWindowsVersion()
190
+ * (avoids the async race condition of the old implementation)
132
191
  */
133
- declare function detectBot(ua: string): BotResult;
192
+ declare function detectOs(ua: string, windowsVersion?: string | null): OsResult;
134
193
 
135
194
  type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
136
195
 
@@ -161,6 +220,14 @@ declare function detectHeadless(ua: string): boolean;
161
220
  */
162
221
  declare function isWebview(ua: string): boolean;
163
222
 
223
+ /**
224
+ * Returns true if every key in `criteria` matches the corresponding value in `info`.
225
+ *
226
+ * @example
227
+ * satisfies(info, { os: 'iOS', device: 'Mobile' })
228
+ */
229
+ declare function satisfies(info: EnvOption, criteria: Partial<EnvOption>): boolean;
230
+
164
231
  /**
165
232
  * The Accept-CH value to send in server responses.
166
233
  * After the browser sees this header it will include the corresponding
@@ -185,11 +252,9 @@ declare function parseHeaders(headers: Record<string, string | string[] | undefi
185
252
  declare const VERSION: string;
186
253
 
187
254
  /**
188
- * Detect browser, OS, engine and device information.
189
- *
190
- * @param ua - Optional UA string override. Defaults to `navigator.userAgent`.
255
+ * Detect browser, OS, engine and device information from the current browser environment.
191
256
  */
192
- declare function uaBrowser(ua?: string): EnvOption;
257
+ declare function uaBrowser(): EnvOption;
193
258
  declare namespace uaBrowser {
194
259
  var detect: (ua?: string) => Promise<EnvOption>;
195
260
  var isWebview: typeof isWebview;
@@ -197,4 +262,4 @@ declare namespace uaBrowser {
197
262
  var VERSION: string;
198
263
  }
199
264
 
200
- export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA };
265
+ export { ACCEPT_CH, type ArchName$1 as ArchName, type BotDef, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectBrowser, detectHeadless, detectOs as detectOS, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA, satisfies };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  type EngineName = 'Trident' | 'Presto' | 'WebKit' | 'Gecko' | 'KHTML' | 'Blink' | 'EdgeHTML' | 'ArkWeb' | 'unknown';
2
- type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
3
- type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
4
- type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV';
2
+ type BrowserName = 'Safari' | 'Chrome' | 'Arc' | 'Brave' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
3
+ type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'visionOS' | 'tvOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
4
+ type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV' | 'Console' | 'XR' | 'unknown';
5
5
  type ArchName$1 = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
6
- type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'GPTBot' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'GenericBot' | 'unknown';
6
+ type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
7
7
  interface EnvOption {
8
8
  browser: BrowserName;
9
9
  version: string;
10
+ versionMajor: number;
10
11
  engine: EngineName;
11
12
  os: OsName;
12
13
  osVersion: string;
@@ -18,6 +19,7 @@ interface EnvOption {
18
19
  botName: BotName$1;
19
20
  language: string;
20
21
  platform: string;
22
+ connectionType: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';
21
23
  }
22
24
  declare global {
23
25
  var chrome: {
@@ -39,6 +41,25 @@ declare global {
39
41
  }
40
42
  }
41
43
 
44
+ type BotName = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
45
+ interface BotDef {
46
+ name: BotName;
47
+ detect: RegExp;
48
+ }
49
+
50
+ interface BotResult {
51
+ isBot: boolean;
52
+ botName: BotName;
53
+ }
54
+ /**
55
+ * Detect whether the UA belongs to a bot, crawler, or spider.
56
+ * Returns the specific bot name when recognised, 'GenericBot' for generic patterns,
57
+ * or 'unknown' for regular user agents.
58
+ *
59
+ * Pass `customDefs` to prepend project-specific bot rules before the GenericBot catch-all.
60
+ */
61
+ declare function detectBot(ua: string, customDefs?: readonly BotDef[]): BotResult;
62
+
42
63
  /**
43
64
  * A subset of the Navigator interface that our detectors need.
44
65
  * Accepting NavContext as a parameter makes every detector pure and testable.
@@ -52,6 +73,9 @@ interface NavContext {
52
73
  mimeTypes?: MimeTypeArray;
53
74
  connection?: {
54
75
  saveData?: boolean;
76
+ effectiveType?: '4g' | '3g' | '2g' | 'slow-2g';
77
+ rtt?: number;
78
+ downlink?: number;
55
79
  };
56
80
  userAgentData?: {
57
81
  platform: string;
@@ -76,14 +100,29 @@ interface UAHighEntropyValues {
76
100
  interface EnvContext extends NavContext {
77
101
  webglRenderer?: string;
78
102
  webglVendor?: string;
103
+ webglMaxTextureSize?: number;
104
+ webglFragPrecision?: number;
105
+ webglCompressedFormats?: {
106
+ s3tc: boolean;
107
+ pvrtc: boolean;
108
+ etc2: boolean;
109
+ astc: boolean;
110
+ };
79
111
  hardwareConcurrency?: number;
80
112
  deviceMemory?: number;
81
113
  devicePixelRatio?: number;
114
+ screenWidth?: number;
115
+ screenHeight?: number;
116
+ safeAreaInsetTop?: number;
117
+ audioSampleRate?: number;
118
+ hasVibration?: boolean;
119
+ hasDeviceMotion?: boolean;
82
120
  pointerType?: 'coarse' | 'fine' | 'none';
83
121
  hoverCapability?: boolean;
84
122
  fontProbes?: Record<string, boolean>;
85
123
  highEntropyData?: UAHighEntropyValues;
86
124
  windowsVersion?: string | null;
125
+ hasBrave?: boolean;
87
126
  }
88
127
  /**
89
128
  * Collect all available browser signals into a single EnvContext.
@@ -99,6 +138,14 @@ interface ParseOptions {
99
138
  windowsVersion?: string | null;
100
139
  /** Full env context from getEnvContext() — supersedes nav and windowsVersion when provided. */
101
140
  ctx?: EnvContext;
141
+ /** Additional bot definitions prepended before the GenericBot catch-all. */
142
+ customBotDefs?: readonly BotDef[];
143
+ /**
144
+ * Explicit language override (BCP47, e.g. "zh-CN"). Useful for server-side parsing
145
+ * where the Accept-Language header is available but no browser context exists.
146
+ * Takes precedence over language derived from ctx/nav or UA string.
147
+ */
148
+ language?: string;
102
149
  }
103
150
  /**
104
151
  * Parse a user agent string into a full browser/OS/engine/device description.
@@ -119,18 +166,30 @@ declare function parseUA(ua: string, options?: ParseOptions): EnvOption;
119
166
  */
120
167
  declare function getWindowsVersion(nav: NavContext): Promise<string | null>;
121
168
 
122
- type BotName = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'GPTBot' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'GenericBot' | 'unknown';
169
+ interface BrowserResult {
170
+ browser: BrowserName;
171
+ version: string;
172
+ }
173
+ /**
174
+ * Detect the browser name and version from a user agent string.
175
+ *
176
+ * When multiple BROWSER_DEFS entries match the same UA, the one with
177
+ * the highest `priority` value wins (ties go to the later definition).
178
+ */
179
+ declare function detectBrowser(ua: string): BrowserResult;
123
180
 
124
- interface BotResult {
125
- isBot: boolean;
126
- botName: BotName;
181
+ interface OsResult {
182
+ os: OsName;
183
+ osVersion: string;
127
184
  }
128
185
  /**
129
- * Detect whether the UA belongs to a bot, crawler, or spider.
130
- * Returns the specific bot name when recognised, 'GenericBot' for generic patterns,
131
- * or 'unknown' for regular user agents.
186
+ * Detect the operating system and its version from a user agent string.
187
+ *
188
+ * @param ua - Raw user agent string
189
+ * @param windowsVersion - Pre-resolved Windows 11/10 string from getWindowsVersion()
190
+ * (avoids the async race condition of the old implementation)
132
191
  */
133
- declare function detectBot(ua: string): BotResult;
192
+ declare function detectOs(ua: string, windowsVersion?: string | null): OsResult;
134
193
 
135
194
  type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
136
195
 
@@ -161,6 +220,14 @@ declare function detectHeadless(ua: string): boolean;
161
220
  */
162
221
  declare function isWebview(ua: string): boolean;
163
222
 
223
+ /**
224
+ * Returns true if every key in `criteria` matches the corresponding value in `info`.
225
+ *
226
+ * @example
227
+ * satisfies(info, { os: 'iOS', device: 'Mobile' })
228
+ */
229
+ declare function satisfies(info: EnvOption, criteria: Partial<EnvOption>): boolean;
230
+
164
231
  /**
165
232
  * The Accept-CH value to send in server responses.
166
233
  * After the browser sees this header it will include the corresponding
@@ -185,11 +252,9 @@ declare function parseHeaders(headers: Record<string, string | string[] | undefi
185
252
  declare const VERSION: string;
186
253
 
187
254
  /**
188
- * Detect browser, OS, engine and device information.
189
- *
190
- * @param ua - Optional UA string override. Defaults to `navigator.userAgent`.
255
+ * Detect browser, OS, engine and device information from the current browser environment.
191
256
  */
192
- declare function uaBrowser(ua?: string): EnvOption;
257
+ declare function uaBrowser(): EnvOption;
193
258
  declare namespace uaBrowser {
194
259
  var detect: (ua?: string) => Promise<EnvOption>;
195
260
  var isWebview: typeof isWebview;
@@ -197,4 +262,4 @@ declare namespace uaBrowser {
197
262
  var VERSION: string;
198
263
  }
199
264
 
200
- export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA };
265
+ export { ACCEPT_CH, type ArchName$1 as ArchName, type BotDef, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectBrowser, detectHeadless, detectOs as detectOS, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA, satisfies };
package/dist/index.min.js CHANGED
@@ -1,3 +1,3 @@
1
- var uaBrowser=(function(){'use strict';var T={version:"1.3.1"};var M=[{name:"Safari",priority:10,detect:/Safari/,versionPattern:/Version\/([\d.]+)/},{name:"Chrome",priority:20,detect:/(Chrome|CriOS)/,versionPattern:[/Chrome\/([\d.]+)/,/CriOS\/([\d.]+)/]},{name:"IE",priority:30,detect:/(MSIE|Trident)/,versionPattern:[/MSIE ([\d.]+)/,/rv:([\d.]+)/]},{name:"Edge",priority:40,detect:/(Edge|Edg\/|EdgA|EdgiOS)/,versionPattern:[/Edge\/([\d.]+)/,/Edg\/([\d.]+)/,/EdgA\/([\d.]+)/,/EdgiOS\/([\d.]+)/]},{name:"Firefox",priority:50,detect:/(Firefox|FxiOS)/,versionPattern:[/Firefox\/([\d.]+)/,/FxiOS\/([\d.]+)/]},{name:"Firefox Focus",priority:55,detect:/Focus/,versionPattern:/Focus\/([\d.]+)/},{name:"Chromium",priority:60,detect:/Chromium/,versionPattern:/Chromium\/([\d.]+)/},{name:"Opera",priority:70,detect:/(Opera|OPR|OPT)/,versionPattern:[/Opera\/([\d.]+)/,/OPR\/([\d.]+)/,/OPT\/([\d.]+)/]},{name:"Vivaldi",priority:80,detect:/Vivaldi/,versionPattern:/Vivaldi\/([\d.]+)/},{name:"Yandex",priority:90,detect:/YaBrowser/,versionPattern:/YaBrowser\/([\d.]+)/},{name:"Samsung Internet",priority:92,detect:/SamsungBrowser/,versionPattern:/SamsungBrowser\/([\d.]+)/},{name:"DuckDuckGo",priority:94,detect:/DuckDuckGo\//,versionPattern:/DuckDuckGo\/([\d.]+)/},{name:"Puffin",priority:96,detect:/Puffin\//,versionPattern:/Puffin\/([\d.]+)/},{name:"Coc Coc",priority:130,detect:/coc_coc_browser/,versionPattern:/coc_coc_browser\/([\d.]+)/},{name:"Kindle",priority:140,detect:/(Kindle|Silk\/)/,versionPattern:/Version\/([\d.]+)/},{name:"Konqueror",priority:160,detect:/Konqueror/,versionPattern:/Konqueror\/([\d.]+)/},{name:"SeaMonkey",priority:180,detect:/SeaMonkey/,versionPattern:/SeaMonkey\/([\d.]+)/},{name:"Epiphany",priority:190,detect:/Epiphany/,versionPattern:/Epiphany\/([\d.]+)/},{name:"Maxthon",priority:200,detect:/Maxthon/,versionPattern:/Maxthon\/([\d.]+)/},{name:"360",priority:300,detect:/(QihooBrowser|QHBrowser)/,versionPattern:/QihooBrowser\/([\d.]+)/},{name:"360SE",priority:310,detect:/360SE/,versionPattern:null,chromeLookup:{108:"14.0",86:"13.0",78:"12.0",69:"11.0",63:"10.0",55:"9.1",45:"8.1",42:"8.0",31:"7.0",21:"6.3"}},{name:"360EE",priority:320,detect:/360EE/,versionPattern:null,chromeLookup:{86:"13.0",78:"12.0",69:"11.0",63:"9.5",55:"9.0",50:"8.7",30:"7.5"}},{name:"UC",priority:330,detect:/(UCBrowser|UBrowser|UCWEB)/,versionPattern:/UC?Browser\/([\d.]+)/},{name:"QQBrowser",priority:340,detect:/QQBrowser/,versionPattern:/QQBrowser\/([\d.]+)/},{name:"QQ",priority:345,detect:/QQ\//,versionPattern:/QQ\/([\d.]+)/},{name:"Baidu",priority:350,detect:/(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/,versionPattern:[/BIDUBrowser[\s/]([\d.]+)/,/baiduboxapp\/([\d.]+)/]},{name:"Sogou",priority:360,detect:/(MetaSr|Sogou)/,versionPattern:[/SE ([\d.X]+)/,/SogouMobileBrowser\/([\d.]+)/]},{name:"Liebao",priority:370,detect:/(LBBROWSER|LieBaoFast)/,versionPattern:/LieBaoFast\/([\d.]+)/,chromeLookup:{57:"6.5",49:"6.0",46:"5.9",42:"5.3",39:"5.2",34:"5.0",29:"4.5",21:"4.0"}},{name:"2345Explorer",priority:380,detect:/2345Explorer/,versionPattern:[/2345Explorer\/([\d.]+)/,/Mb2345Browser\/([\d.]+)/],chromeLookup:{69:"10.0",55:"9.9"}},{name:"115Browser",priority:390,detect:/115Browser/,versionPattern:/115Browser\/([\d.]+)/},{name:"TheWorld",priority:400,detect:/TheWorld/,versionPattern:/TheWorld ([\d.]+)/},{name:"XiaoMi",priority:410,detect:/MiuiBrowser/,versionPattern:/MiuiBrowser\/([\d.]+)/},{name:"Vivo",priority:420,detect:/VivoBrowser/,versionPattern:/VivoBrowser\/([\d.]+)/},{name:"Huawei",priority:430,detect:/HuaweiBrowser/,versionPattern:[/HuaweiBrowser\/([\d.]+)/,/Version\/([\d.]+)/]},{name:"OPPO",priority:440,detect:/HeyTapBrowser/,versionPattern:/HeyTapBrowser\/([\d.]+)/},{name:"Quark",priority:450,detect:/Quark/,versionPattern:/Quark\/([\d.]+)/},{name:"Qiyu",priority:460,detect:/Qiyu/,versionPattern:/Qiyu\/([\d.]+)/},{name:"WechatWork",priority:500,detect:/wxwork\//,versionPattern:/wxwork\/([\d.]+)/},{name:"Wechat",priority:510,detect:/MicroMessenger/,versionPattern:/MicroMessenger\/([\d.]+)/},{name:"Taobao",priority:520,detect:/AliApp\(TB/,versionPattern:/AliApp\(TB\/([\d.]+)/},{name:"Alipay",priority:530,detect:/AliApp\(AP/,versionPattern:/AliApp\(AP\/([\d.]+)/},{name:"Weibo",priority:540,detect:/Weibo/,versionPattern:/weibo__([\d.]+)/},{name:"Douban",priority:550,detect:/com\.douban\.frodo/,versionPattern:/com\.douban\.frodo\/([\d.]+)/},{name:"Suning",priority:560,detect:/SNEBUY-APP/,versionPattern:/SNEBUY-APP([\d.]+)/},{name:"iQiYi",priority:570,detect:/IqiyiApp/,versionPattern:/IqiyiVersion\/([\d.]+)/},{name:"DingTalk",priority:580,detect:/DingTalk/,versionPattern:/DingTalk\/([\d.]+)/},{name:"Douyin",priority:590,detect:/aweme/,versionPattern:/app_version\/([\d.]+)/},{name:"Bilibili",priority:592,detect:/BiliBili\//,versionPattern:/BiliBili\/([\d.]+)/},{name:"Kuaishou",priority:594,detect:/Kwai\//,versionPattern:/Kwai\/([\d.]+)/},{name:"Xiaohongshu",priority:596,detect:/Xiaohongshu\//,versionPattern:/Xiaohongshu\/([\d.]+)/},{name:"Feishu",priority:597,detect:/(Lark|Feishu)\//,versionPattern:[/Lark\/([\d.]+)/,/Feishu\/([\d.]+)/]},{name:"Toutiao",priority:598,detect:/NewsArticle\//,versionPattern:/NewsArticle\/([\d.]+)/},{name:"JD",priority:599,detect:/jdpingou\//,versionPattern:/jdpingou\/([\d.]+)/},{name:"Meituan",priority:600,detect:/MeituanHybrid\//,versionPattern:/MeituanHybrid\/([\d.]+)/}];function P(e,t){let r=t.exec(e);if(!r)return null;let n=r[1];return n!=null&&n!==""?n:null}function v(e,t){for(let r of t){let n=P(e,r);if(n!==null)return n}return null}function V(e,t){let r=/Chrome\/([\d]+)/.exec(e);if(!r)return null;let n=r[1];return Object.prototype.hasOwnProperty.call(t,n)?t[n]:null}function R(e){let t=null;for(let n of M)n.detect.test(e)&&(t===null||n.priority>=t.priority)&&(t=n);if(!t)return {browser:"unknown",version:"unknown"};let r=null;if(t.chromeLookup&&(r=V(e,t.chromeLookup)),r===null&&t.versionPattern!==null){let n=Array.isArray(t.versionPattern)?t.versionPattern:[t.versionPattern];r=v(e,n);}return {browser:t.name,version:r!=null?r:"unknown"}}var L=[{name:"KHTML",detect:/KHTML\//},{name:"Trident",detect:/(Trident|NET CLR)/},{name:"Presto",detect:/Presto/},{name:"Gecko",detect:/Gecko\//},{name:"WebKit",detect:/AppleWebKit/},{name:"ArkWeb",detect:/ArkWeb/}];function W(e,t,r){var o,i;let n="unknown";for(let c of L)c.detect.test(e)&&(n=c.name);return (n==="WebKit"&&/(Chrome|CriOS)/.test(e)&&parseInt((i=((o=/Chrome\/([\d]+)/.exec(e))!=null?o:[])[1])!=null?i:"0",10)>27||t==="Opera"&&parseInt(r,10)>12||t==="Yandex")&&(n="Blink"),t==="Edge"&&(n=parseInt(r,10)>75?"Blink":"EdgeHTML"),n}var F=[{name:"WebOS",detect:/hpwOS/,versionPattern:/hpwOS\/([\d.]+)/},{name:"Symbian",detect:/Symbian/,versionPattern:null},{name:"MeeGo",detect:/MeeGo/,versionPattern:null},{name:"BlackBerry",detect:/(BlackBerry|RIM)/,versionPattern:null},{name:"FreeBSD",detect:/FreeBSD/,versionPattern:null},{name:"Debian",detect:/Debian/,versionPattern:/Debian\/([\d.]+)/},{name:"Ubuntu",detect:/Ubuntu/,versionPattern:null},{name:"Linux",detect:/(Linux|X11)/,versionPattern:null},{name:"Chrome OS",detect:/CrOS/,versionPattern:null},{name:"Tizen",detect:/Tizen/,versionPattern:/Tizen ([\d.]+)/},{name:"iOS",detect:/like Mac OS X/,versionPattern:/OS ([\d_]+) like/},{name:"MacOS",detect:/Macintosh/,versionPattern:/Mac OS X -?([\d_.]+)/},{name:"Android",detect:/(Android|Adr)/,versionPattern:/(?:Android|Adr) ([\d.]+)/},{name:"HarmonyOS",detect:/HarmonyOS/,versionPattern:[/HarmonyOS[\s/]([\d.]+)/,/Android ([\d.]+)[;)]/],versionLookup:{10:"2",11:"3",12:"3",13:"4"}},{name:"OpenHarmony",detect:/OpenHarmony/,versionPattern:/OpenHarmony[\s/]([\d.]+)/},{name:"KaiOS",detect:/KAIOS/,versionPattern:/KAIOS\/([\d.]+)/},{name:"Windows",detect:/Windows/,versionPattern:/Windows NT ([\d.]+)/,versionLookup:{10:"10","6.4":"10","6.3":"8.1","6.2":"8","6.1":"7","6.0":"Vista","5.2":"XP","5.1":"XP","5.0":"2000"}},{name:"Windows Phone",detect:/(IEMobile|Windows Phone)/,versionPattern:/Windows Phone(?: OS)? ([\d.]+)/}];function _(e,t){let r=null;for(let o of F)o.detect.test(e)&&(r=o);if(!r)return {os:"unknown",osVersion:"unknown"};let n="unknown";if(r.versionPattern){let o=Array.isArray(r.versionPattern)?v(e,r.versionPattern):P(e,r.versionPattern);if(o!==null){let i=o.replace(/_/g,".");if(r.versionLookup){let c=Object.prototype.hasOwnProperty.call(r.versionLookup,i)?r.versionLookup[i]:null;if(c!==null)n=c;else if(r.name==="Windows"){let g=parseInt(i,10);n=isNaN(g)?"unknown":g.toString();}else n=i;}else n=i;}}return r.name==="Windows"&&t&&(n=t),{os:r.name,osVersion:n}}var I=[{name:"Mobile",detect:/(Mobi|iPh)/},{name:"Tablet",detect:/(Tablet|Pad)/}];function H(e,t){if(/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(e))return "TV";if((t==null?void 0:t.platform)==="MacIntel"&&t.maxTouchPoints>1||/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e))return "Tablet";for(let r of I)if(r.detect.test(e))return r.name;return "PC"}var j=[{name:"Googlebot",detect:/Googlebot/},{name:"Bingbot",detect:/(bingbot|BingPreview)/},{name:"Baiduspider",detect:/(Baiduspider|BaiduMobaider)/},{name:"Bytespider",detect:/Bytespider/},{name:"YandexBot",detect:/YandexBot/},{name:"DuckDuckBot",detect:/DuckDuckBot/},{name:"Slurp",detect:/Slurp/},{name:"Sogou",detect:/(Sogou|sogou).*[Ss]pider/},{name:"360Spider",detect:/360Spider/},{name:"PetalBot",detect:/PetalBot/},{name:"Applebot",detect:/Applebot/},{name:"Facebookbot",detect:/(facebookexternalhit|FacebookBot)/},{name:"Twitterbot",detect:/Twitterbot/},{name:"LinkedInBot",detect:/LinkedInBot/},{name:"SemrushBot",detect:/SemrushBot/},{name:"AhrefsBot",detect:/AhrefsBot/},{name:"MJ12bot",detect:/MJ12bot/},{name:"GPTBot",detect:/GPTBot/},{name:"ClaudeBot",detect:/ClaudeBot/},{name:"PerplexityBot",detect:/PerplexityBot/},{name:"CCBot",detect:/CCBot/},{name:"AdsBot",detect:/AdsBot-Google/},{name:"GenericBot",detect:/(bot|crawler|spider|crawling|scraper)/i}];function G(e){for(let t of j)if(t.detect.test(e))return {isBot:true,botName:t.name};return {isBot:false,botName:"unknown"}}var U=[{name:"arm64",detect:/(aarch64|arm64|ARM64)/},{name:"arm",detect:/\bARM\b/},{name:"x86_64",detect:/(x86_64|Win64|WOW64|x64;|amd64)/i},{name:"x86",detect:/(i[36]86|i686|x86;)/}];function Q(e,t){if(t!=null&&t.highEntropyData){let{architecture:o,bitness:i}=t.highEntropyData;if(o==="arm")return i==="64"?"arm64":"arm";if(o==="x86")return i==="64"?"x86_64":"x86"}let r=t==null?void 0:t.webglRenderer;if(r){if(/Apple\s+(M\d|A\d{1,2}[A-Z]?)\b/i.test(r)||/APPLE M\d/i.test(r))return "arm64";if(/\b(Intel|AMD|NVIDIA|Radeon)\b/i.test(r))return "x86_64"}let n=t==null?void 0:t.platform;if(n){if(/iPhone|iPad|iPod/.test(n)||/arm64|aarch64/i.test(n))return "arm64";if(/arm/i.test(n))return "arm";if(/Win64|WOW64|x86_64/i.test(n))return "x86_64";if(/Win32|i686/i.test(n))return "x86"}for(let o of U)if(o.detect.test(e))return o.name;return "unknown"}var oe=/(HeadlessChrome|Headless|PhantomJS|Electron\/|Playwright|jsdom\/|Selenium)/;function K(e){return oe.test(e)}function y(e){return !!(/; wv/.test(e)||/like Mac OS X/.test(e)&&!/Version\//.test(e)&&!/Safari\//.test(e))}function l(){return typeof navigator=="undefined"?{userAgent:"",platform:"",language:"",maxTouchPoints:0}:navigator}function m(e,t){var r;try{return !!((r=e.mimeTypes)!=null&&r.namedItem(t))}catch(n){return false}}function w(e){var n,o;return ((o=(n=e.browserLanguage)!=null?n:e.language)!=null?o:"").replace(/-\w+/g,i=>i.toUpperCase())||"unknown"}function h(e,t={}){var B,E,S,A,k,O,D,C;let r=(B=t.ctx)!=null?B:t.nav,n=(S=(E=t.ctx)==null?void 0:E.windowsVersion)!=null?S:t.windowsVersion,{browser:o,version:i}=R(e),{os:c,osVersion:g}=_(e,n),x=g,Y=H(e,r),q=Q(e,t.ctx),a=r,{isBot:J,botName:z}=G(e),Z=K(e),$=a?w(a):"unknown",ee=(A=a==null?void 0:a.platform)!=null?A:"unknown",d=o,p=i;if(a){let s=typeof chrome!="undefined"?chrome:void 0,N=/Chrome\/([\d]+)/.exec(e),b=N?parseInt(N[1],10):0;if(s)if(s.adblock2345||s.common2345)d="2345Explorer",p="unknown";else {let u=false;if(m(a,"application/360softmgrplugin")||m(a,"application/mozilla-npqihooquicklogin")||b>36&&typeof showModalDialog!="undefined"?u=true:b>45&&(u=m(a,"application/vnd.chromium.remoting-viewer"),!u&&b>=69&&(u=m(a,"application/hwepass2001.installepass2001")||m(a,"application/asx"))),u){let re=((k=a.connection)==null?void 0:k.saveData)===true;m(a,"application/gameplugin")||!re?d="360SE":d="360EE",p="unknown";}}}if(d==="Baidu"&&/(Opera|OPR|OPT)/.test(e)){d="Opera";let s=(D=(O=/OPR\/([\d.]+)/.exec(e))!=null?O:/OPT\/([\d.]+)/.exec(e))!=null?D:/Opera\/([\d.]+)/.exec(e);p=(C=s==null?void 0:s[1])!=null?C:"unknown";}if(d==="Chrome"&&/\S+Browser\//.test(e)){let s=/(\S+Browser)\/([\d.]+)/.exec(e);s&&(d=s[1],p=s[2]);}if(d==="Firefox"&&a)try{(typeof clientInformation!="undefined"||typeof u2f=="undefined")&&(d="Firefox Nightly");}catch(s){}if(c==="iOS"&&d==="Safari"){let s=/Version\/([\d.]+)/.exec(e);s&&parseInt(s[1],10)>parseInt(x,10)&&(x=s[1]);}let te=W(e,d,p);return {browser:d,version:p,engine:te,os:c,osVersion:x,device:Y,arch:q,isWebview:y(e),isHeadless:Z,isBot:J,botName:z,language:$,platform:ee}}var ie=[".AppleSystemUIFont","Segoe UI","Noto Color Emoji","Ubuntu","HarmonyOS Sans"];function se(){try{let t=document.createElement("canvas").getContext("2d");if(!t)return {};let r="mmmmmmmmmmlli";t.font="72px monospace";let n=t.measureText(r).width,o={};for(let i of ie)t.font=`72px '${i}', monospace`,o[i]=t.measureText(r).width!==n;return o}catch(e){return {}}}function ae(){var e;try{let t=document.createElement("canvas"),r=(e=t.getContext("webgl"))!=null?e:t.getContext("experimental-webgl");if(!r)return {};let n=r.getExtension("WEBGL_debug_renderer_info");return n?{renderer:r.getParameter(n.UNMASKED_RENDERER_WEBGL),vendor:r.getParameter(n.UNMASKED_VENDOR_WEBGL)}:{}}catch(t){return {}}}function de(){try{if(window.matchMedia("(pointer: coarse)").matches)return "coarse";if(window.matchMedia("(pointer: fine)").matches)return "fine";if(window.matchMedia("(pointer: none)").matches)return "none"}catch(e){}}function ce(){try{return window.matchMedia("(hover: hover)").matches}catch(e){return}}function me(e){var r;if(!e)return null;let t=parseInt((r=e.split(".")[0])!=null?r:"0",10);return isNaN(t)?null:t>=13?"11":"10"}async function X(){let e=l(),t={userAgent:e.userAgent,platform:e.platform,language:e.language,maxTouchPoints:e.maxTouchPoints};if(e.browserLanguage!==void 0&&(t.browserLanguage=e.browserLanguage),e.mimeTypes!==void 0&&(t.mimeTypes=e.mimeTypes),e.connection!==void 0&&(t.connection=e.connection),e.userAgentData!==void 0&&(t.userAgentData=e.userAgentData),typeof navigator!="undefined"&&(t.hardwareConcurrency=navigator.hardwareConcurrency,t.deviceMemory=navigator.deviceMemory),typeof window!="undefined"){t.devicePixelRatio=window.devicePixelRatio,t.pointerType=de(),t.hoverCapability=ce(),t.fontProbes=se();let{renderer:r,vendor:n}=ae();r!==void 0&&(t.webglRenderer=r),n!==void 0&&(t.webglVendor=n);}if(e.userAgentData)try{let r=await e.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]);t.highEntropyData={architecture:r.architecture,bitness:r.bitness,model:r.model,platformVersion:r.platformVersion,fullVersionList:r.fullVersionList},e.userAgentData.platform==="Windows"&&(t.windowsVersion=me(r.platformVersion));}catch(r){}return t}var{version:pe}=T;function f(e){let t=l();return h(e!=null?e:t.userAgent,{nav:t})}f.detect=async e=>{let t=await X();return h(e!=null?e:t.userAgent,{ctx:t})};f.isWebview=y;f.getLanguage=()=>w(l());f.VERSION=pe;var ue=f;
2
- return ue;})();//# sourceMappingURL=index.min.js.map
1
+ var uaBrowser=(function(){'use strict';var $={version:"1.4.0-beta.0"};var ee=[{name:"Safari",priority:10,detect:/Safari/,versionPattern:/Version\/([\d.]+)/},{name:"Chrome",priority:20,detect:/(Chrome|CriOS)/,versionPattern:[/Chrome\/([\d.]+)/,/CriOS\/([\d.]+)/]},{name:"Arc",priority:35,detect:/Arc\//,versionPattern:/Arc\/([\d.]+)/},{name:"IE",priority:30,detect:/(MSIE|Trident)/,versionPattern:[/MSIE ([\d.]+)/,/rv:([\d.]+)/]},{name:"Edge",priority:40,detect:/(Edge|Edg\/|EdgA|EdgiOS)/,versionPattern:[/Edge\/([\d.]+)/,/Edg\/([\d.]+)/,/EdgA\/([\d.]+)/,/EdgiOS\/([\d.]+)/]},{name:"Firefox",priority:50,detect:/(Firefox|FxiOS)/,versionPattern:[/Firefox\/([\d.]+)/,/FxiOS\/([\d.]+)/]},{name:"Firefox Focus",priority:55,detect:/Focus/,versionPattern:/Focus\/([\d.]+)/},{name:"Chromium",priority:60,detect:/Chromium/,versionPattern:/Chromium\/([\d.]+)/},{name:"Opera",priority:70,detect:/(Opera|OPR|OPT)/,versionPattern:[/Opera\/([\d.]+)/,/OPR\/([\d.]+)/,/OPT\/([\d.]+)/]},{name:"Vivaldi",priority:80,detect:/Vivaldi/,versionPattern:/Vivaldi\/([\d.]+)/},{name:"Yandex",priority:90,detect:/YaBrowser/,versionPattern:/YaBrowser\/([\d.]+)/},{name:"Samsung Internet",priority:92,detect:/SamsungBrowser/,versionPattern:/SamsungBrowser\/([\d.]+)/},{name:"DuckDuckGo",priority:94,detect:/(DuckDuckGo|Ddg)\//,versionPattern:[/DuckDuckGo\/([\d.]+)/,/Ddg\/([\d.]+)/]},{name:"Puffin",priority:96,detect:/Puffin\//,versionPattern:/Puffin\/([\d.]+)/},{name:"Coc Coc",priority:130,detect:/coc_coc_browser/,versionPattern:/coc_coc_browser\/([\d.]+)/},{name:"Kindle",priority:140,detect:/(Kindle|Silk\/)/,versionPattern:/Version\/([\d.]+)/},{name:"Konqueror",priority:160,detect:/Konqueror/,versionPattern:/Konqueror\/([\d.]+)/},{name:"SeaMonkey",priority:180,detect:/SeaMonkey/,versionPattern:/SeaMonkey\/([\d.]+)/},{name:"Epiphany",priority:190,detect:/Epiphany/,versionPattern:/Epiphany\/([\d.]+)/},{name:"Maxthon",priority:200,detect:/Maxthon/,versionPattern:/Maxthon\/([\d.]+)/},{name:"360",priority:300,detect:/(QihooBrowser|QHBrowser)/,versionPattern:/QihooBrowser\/([\d.]+)/},{name:"360SE",priority:310,detect:/360SE/,versionPattern:null,chromeLookup:{108:"14.0",86:"13.0",78:"12.0",69:"11.0",63:"10.0",55:"9.1",45:"8.1",42:"8.0",31:"7.0",21:"6.3"}},{name:"360EE",priority:320,detect:/360EE/,versionPattern:null,chromeLookup:{86:"13.0",78:"12.0",69:"11.0",63:"9.5",55:"9.0",50:"8.7",30:"7.5"}},{name:"UC",priority:330,detect:/(UCBrowser|UBrowser|UCWEB)/,versionPattern:/UC?Browser\/([\d.]+)/},{name:"QQBrowser",priority:340,detect:/(MQQBrowser|QQBrowser)/,versionPattern:[/MQQBrowser\/([\d.]+)/,/QQBrowser\/([\d.]+)/]},{name:"QQ",priority:345,detect:/QQ\//,versionPattern:/QQ\/([\d.]+)/},{name:"Baidu",priority:350,detect:/(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/,versionPattern:[/BIDUBrowser[\s/]([\d.]+)/,/baiduboxapp\/([\d.]+)/]},{name:"Sogou",priority:360,detect:/(MetaSr|Sogou)/,versionPattern:[/SE ([\d.X]+)/,/SogouMobileBrowser\/([\d.]+)/]},{name:"Liebao",priority:370,detect:/(LBBROWSER|LieBaoFast)/,versionPattern:/LieBaoFast\/([\d.]+)/,chromeLookup:{57:"6.5",49:"6.0",46:"5.9",42:"5.3",39:"5.2",34:"5.0",29:"4.5",21:"4.0"}},{name:"2345Explorer",priority:380,detect:/2345Explorer/,versionPattern:[/2345Explorer\/([\d.]+)/,/Mb2345Browser\/([\d.]+)/],chromeLookup:{69:"10.0",55:"9.9"}},{name:"115Browser",priority:390,detect:/115Browser/,versionPattern:/115Browser\/([\d.]+)/},{name:"TheWorld",priority:400,detect:/TheWorld/,versionPattern:/TheWorld ([\d.]+)/},{name:"XiaoMi",priority:410,detect:/MiuiBrowser/,versionPattern:/MiuiBrowser\/([\d.]+)/},{name:"Vivo",priority:420,detect:/VivoBrowser/,versionPattern:/VivoBrowser\/([\d.]+)/},{name:"Huawei",priority:430,detect:/HuaweiBrowser/,versionPattern:[/HuaweiBrowser\/([\d.]+)/,/Version\/([\d.]+)/]},{name:"OPPO",priority:440,detect:/HeyTapBrowser/,versionPattern:/HeyTapBrowser\/([\d.]+)/},{name:"Quark",priority:450,detect:/Quark/,versionPattern:/Quark\/([\d.]+)/},{name:"Qiyu",priority:460,detect:/Qiyu/,versionPattern:/Qiyu\/([\d.]+)/},{name:"WechatWork",priority:500,detect:/wxwork\//,versionPattern:/wxwork\/([\d.]+)/},{name:"Wechat",priority:510,detect:/MicroMessenger/,versionPattern:/MicroMessenger\/([\d.]+)/},{name:"Taobao",priority:520,detect:/AliApp\(TB/,versionPattern:/AliApp\(TB\/([\d.]+)/},{name:"Alipay",priority:530,detect:/AliApp\(AP/,versionPattern:/AliApp\(AP\/([\d.]+)/},{name:"Weibo",priority:540,detect:/Weibo/,versionPattern:/weibo__([\d.]+)/},{name:"Douban",priority:550,detect:/com\.douban\.frodo/,versionPattern:/com\.douban\.frodo\/([\d.]+)/},{name:"Suning",priority:560,detect:/SNEBUY-APP/,versionPattern:/SNEBUY-APP([\d.]+)/},{name:"iQiYi",priority:570,detect:/IqiyiApp/,versionPattern:/IqiyiVersion\/([\d.]+)/},{name:"DingTalk",priority:580,detect:/DingTalk/,versionPattern:/DingTalk\/([\d.]+)/},{name:"Douyin",priority:590,detect:/aweme/,versionPattern:/app_version\/([\d.]+)/},{name:"Bilibili",priority:592,detect:/BiliBili\//,versionPattern:/BiliBili\/([\d.]+)/},{name:"Kuaishou",priority:594,detect:/Kwai\//,versionPattern:/Kwai\/([\d.]+)/},{name:"Xiaohongshu",priority:596,detect:/Xiaohongshu\//,versionPattern:/Xiaohongshu\/([\d.]+)/},{name:"Feishu",priority:597,detect:/(Lark|Feishu)\//,versionPattern:[/Lark\/([\d.]+)/,/Feishu\/([\d.]+)/]},{name:"Toutiao",priority:598,detect:/NewsArticle\//,versionPattern:/NewsArticle\/([\d.]+)/},{name:"JD",priority:599,detect:/jdpingou\//,versionPattern:/jdpingou\/([\d.]+)/},{name:"Meituan",priority:600,detect:/MeituanHybrid\//,versionPattern:/MeituanHybrid\/([\d.]+)/}];function W(t,e){let n=e.exec(t);if(!n)return null;let r=n[1];return r!=null&&r!==""?r:null}function k(t,e){for(let n of e){let r=W(t,n);if(r!==null)return r}return null}function te(t,e){let n=/Chrome\/([\d]+)/.exec(t);if(!n)return null;let r=n[1];return Object.prototype.hasOwnProperty.call(e,r)?e[r]:null}function re(t){let e=null;for(let r of ee)r.detect.test(t)&&(e===null||r.priority>=e.priority)&&(e=r);if(!e)return {browser:"unknown",version:"unknown"};let n=null;if(e.chromeLookup&&(n=te(t,e.chromeLookup)),n===null&&e.versionPattern!==null){let r=Array.isArray(e.versionPattern)?e.versionPattern:[e.versionPattern];n=k(t,r);}return {browser:e.name,version:n!=null?n:"unknown"}}var ne=[{name:"KHTML",detect:/KHTML\//},{name:"Trident",detect:/(Trident|NET CLR)/},{name:"Presto",detect:/Presto/},{name:"Gecko",detect:/Gecko\//},{name:"WebKit",detect:/AppleWebKit/},{name:"ArkWeb",detect:/ArkWeb/}];function oe(t,e,n){var o,i;let r="unknown";for(let c of ne)c.detect.test(t)&&(r=c.name);return (r==="WebKit"&&/(Chrome|CriOS)/.test(t)&&parseInt((i=((o=/Chrome\/([\d]+)/.exec(t))!=null?o:[])[1])!=null?i:"0",10)>27||e==="Opera"&&parseInt(n,10)>12||e==="Yandex")&&(r="Blink"),e==="Edge"&&(r=parseInt(n,10)>75?"Blink":"EdgeHTML"),r}var ie=[{name:"WebOS",detect:/hpwOS/,versionPattern:/hpwOS\/([\d.]+)/},{name:"Symbian",detect:/Symbian/,versionPattern:null},{name:"MeeGo",detect:/MeeGo/,versionPattern:null},{name:"BlackBerry",detect:/(BlackBerry|RIM)/,versionPattern:null},{name:"FreeBSD",detect:/FreeBSD/,versionPattern:null},{name:"Debian",detect:/Debian/,versionPattern:/Debian\/([\d.]+)/},{name:"Ubuntu",detect:/Ubuntu/,versionPattern:null},{name:"Linux",detect:/(Linux|X11)/,versionPattern:null},{name:"Chrome OS",detect:/CrOS/,versionPattern:null},{name:"Tizen",detect:/Tizen/,versionPattern:/Tizen ([\d.]+)/},{name:"iOS",detect:/like Mac OS X/,versionPattern:/OS ([\d_]+) like/},{name:"MacOS",detect:/Macintosh/,versionPattern:/Mac OS X -?([\d_.]+)/},{name:"visionOS",detect:/visionOS/,versionPattern:/visionOS ([\d_]+)/},{name:"tvOS",detect:/Apple TV/,versionPattern:/OS ([\d_]+) like/},{name:"Android",detect:/(Android|Adr)/,versionPattern:/(?:Android|Adr) ([\d.]+)/},{name:"HarmonyOS",detect:/HarmonyOS/,versionPattern:[/HarmonyOS[\s/]([\d.]+)/,/Android ([\d.]+)[;)]/],versionLookup:{10:"2",11:"3",12:"3",13:"4"}},{name:"OpenHarmony",detect:/OpenHarmony/,versionPattern:/OpenHarmony[\s/]([\d.]+)/},{name:"KaiOS",detect:/KAIOS/,versionPattern:/KAIOS\/([\d.]+)/},{name:"Windows",detect:/Windows/,versionPattern:/Windows NT ([\d.]+)/,versionLookup:{10:"10","6.4":"10","6.3":"8.1","6.2":"8","6.1":"7","6.0":"Vista","5.2":"XP","5.1":"XP","5.0":"2000"}},{name:"Windows Phone",detect:/(IEMobile|Windows Phone)/,versionPattern:/Windows Phone(?: OS)? ([\d.]+)/}];function ae(t,e){let n=null;for(let o of ie)o.detect.test(t)&&(n=o);if(!n)return {os:"unknown",osVersion:"unknown"};let r="unknown";if(n.versionPattern){let o=Array.isArray(n.versionPattern)?k(t,n.versionPattern):W(t,n.versionPattern);if(o!==null){let i=o.replace(/_/g,".");if(n.versionLookup){let c=Object.prototype.hasOwnProperty.call(n.versionLookup,i)?n.versionLookup[i]:null;if(c!==null)r=c;else if(n.name==="Windows"){let d=parseInt(i,10);r=isNaN(d)?"unknown":d.toString();}else r=i;}else r=i;}}return n.name==="Windows"&&e&&(r=e),{os:n.name,osVersion:r}}var se=[{name:"Mobile",detect:/(Mobi|iPh)/},{name:"Tablet",detect:/(Tablet|Pad)/}];function de(t,e){var o,i;function n(){if(/PlayStation|Xbox|Nintendo/.test(t))return "Console";if(/visionOS|Quest/.test(t))return "XR";if(/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(t))return "TV";if(/iPad/.test(t)||/Android/.test(t)&&!/Mobile/.test(t))return "Tablet";for(let c of se)if(c.detect.test(t))return c.name;return null}function r(){var c,d,l,p,g,b,a,w,S,A,O,T,m,f,C,D;if(!e)return null;if(e.webglRenderer){if(/^ANGLE\b/.test(e.webglRenderer))return "PC";if(/Adreno/i.test(e.webglRenderer)||/Mali[-\s]/i.test(e.webglRenderer))return ((c=e.screenWidth)!=null?c:0)>=768?"Tablet":"Mobile";if(/Apple GPU/i.test(e.webglRenderer)){let M=(d=e.screenWidth)!=null?d:0;return M<=1366?M>=768?"Tablet":"Mobile":"PC"}}return e.platform==="MacIntel"&&((l=e.maxTouchPoints)!=null?l:0)>1?e.screenWidth!==void 0&&e.screenWidth<768?"Mobile":"Tablet":e.webglMaxTextureSize!==void 0&&e.webglMaxTextureSize<=8192&&((p=e.maxTouchPoints)!=null?p:0)>1&&((g=e.screenWidth)!=null?g:9999)<1367?((b=e.screenWidth)!=null?b:0)>=768?"Tablet":"Mobile":(a=e.webglCompressedFormats)!=null&&a.pvrtc&&!e.webglCompressedFormats.s3tc?((w=e.screenWidth)!=null?w:0)>=768?"Tablet":"Mobile":e.safeAreaInsetTop!==void 0&&e.safeAreaInsetTop>0?((S=e.screenWidth)!=null?S:0)>=768?"Tablet":"Mobile":e.hasVibration||e.hasDeviceMotion?((A=e.screenWidth)!=null?A:0)>=768?"Tablet":"Mobile":(O=e.connection)!=null&&O.effectiveType&&["2g","3g","slow-2g"].includes(e.connection.effectiveType)?((T=e.screenWidth)!=null?T:0)>=768?"Tablet":"Mobile":((m=e.devicePixelRatio)!=null?m:0)>2&&((f=e.maxTouchPoints)!=null?f:0)>1?((C=e.screenWidth)!=null?C:0)>=768?"Tablet":"Mobile":e.pointerType==="coarse"&&e.hoverCapability===false?((D=e.screenWidth)!=null?D:0)>=768?"Tablet":"Mobile":null}return (i=(o=r())!=null?o:n())!=null?i:"PC"}var P=[{name:"Googlebot",detect:/Googlebot/},{name:"Bingbot",detect:/(bingbot|BingPreview)/},{name:"Baiduspider",detect:/(Baiduspider|BaiduMobaider)/},{name:"Bytespider",detect:/Bytespider/},{name:"YandexBot",detect:/YandexBot/},{name:"DuckDuckBot",detect:/DuckDuckBot/},{name:"Slurp",detect:/Slurp/},{name:"Sogou",detect:/(Sogou|sogou).*[Ss]pider/},{name:"360Spider",detect:/360Spider/},{name:"PetalBot",detect:/PetalBot/},{name:"Applebot-Extended",detect:/Applebot-Extended/},{name:"Applebot",detect:/Applebot/},{name:"Facebookbot",detect:/(facebookexternalhit|FacebookBot)/},{name:"Twitterbot",detect:/Twitterbot/},{name:"LinkedInBot",detect:/LinkedInBot/},{name:"PinterestBot",detect:/Pinterest/},{name:"Slackbot",detect:/Slackbot/},{name:"Discordbot",detect:/Discordbot/},{name:"TelegramBot",detect:/TelegramBot/},{name:"WhatsApp",detect:/WhatsApp/},{name:"SemrushBot",detect:/SemrushBot/},{name:"AhrefsBot",detect:/AhrefsBot/},{name:"MJ12bot",detect:/MJ12bot/},{name:"ScreamingFrog",detect:/Screaming Frog/},{name:"DataForSeoBot",detect:/DataForSeoBot/},{name:"GPTBot",detect:/GPTBot/},{name:"OAI-SearchBot",detect:/OAI-SearchBot/},{name:"ChatGPT-User",detect:/ChatGPT-User/},{name:"ClaudeBot",detect:/ClaudeBot/},{name:"PerplexityBot",detect:/PerplexityBot/},{name:"CCBot",detect:/CCBot/},{name:"AdsBot",detect:/AdsBot-Google/},{name:"Google-Extended",detect:/Google-Extended/},{name:"Meta-ExternalAgent",detect:/meta-externalagent/i},{name:"Amazonbot",detect:/Amazonbot/},{name:"Diffbot",detect:/Diffbot/},{name:"cohere-ai",detect:/cohere-ai/},{name:"YouBot",detect:/YouBot/},{name:"UptimeRobot",detect:/UptimeRobot/},{name:"ia_archiver",detect:/ia_archiver/},{name:"GenericBot",detect:/(bot|crawler|spider|crawling|scraper)/i}];function ce(t,e){let n=e?[...P.slice(0,-1),...e,P[P.length-1]]:P;for(let r of n)if(r.detect.test(t))return {isBot:true,botName:r.name};return {isBot:false,botName:"unknown"}}var me=[{name:"arm64",detect:/(aarch64|arm64|ARM64|iPhone|iPad|iPod)/},{name:"arm",detect:/\bARM\b/},{name:"x86_64",detect:/(x86_64|Win64|WOW64|x64;|amd64)/i},{name:"x86",detect:/(i[36]86|i686|x86;)/}];function pe(t,e){if(e!=null&&e.highEntropyData){let{architecture:o,bitness:i}=e.highEntropyData;if(o==="arm")return i==="64"?"arm64":"arm";if(o==="x86")return i==="64"?"x86_64":"x86"}let n=e==null?void 0:e.webglRenderer;if(n){if(/Apple\s+(M\d|A\d{1,2}[A-Z]?)\b/i.test(n)||/APPLE M\d/i.test(n)||/^Apple GPU$/i.test(n))return "arm64";if(/\b(Intel|AMD|NVIDIA|Radeon)\b/i.test(n))return "x86_64"}let r=e==null?void 0:e.platform;if(r){if(/iPhone|iPad|iPod/.test(r)||/arm64|aarch64/i.test(r))return "arm64";if(/arm/i.test(r))return "arm";if(/Win64|WOW64|x86_64/i.test(r))return "x86_64";if(/Win32|i686/i.test(r))return "x86"}for(let o of me)if(o.detect.test(t))return o.name;return "unknown"}var be=/(HeadlessChrome|Headless|PhantomJS|Electron\/|Playwright|jsdom\/|Selenium)/;function le(t){return be.test(t)}function N(t){return !!(/; wv/.test(t)||/like Mac OS X/.test(t)&&!/Version\//.test(t)&&!/Safari\//.test(t))}function B(){return typeof navigator=="undefined"?{userAgent:"",platform:"",language:"",maxTouchPoints:0}:navigator}function v(t,e){var n;try{return !!((n=t.mimeTypes)!=null&&n.namedItem(e))}catch(r){return false}}function R(t){var r,o;return ((o=(r=t.browserLanguage)!=null?r:t.language)!=null?o:"").replace(/-\w+/g,i=>i.toUpperCase())||"unknown"}var he=[["Microsoft Edge","Edge"],["Opera","Opera"],["Vivaldi","Vivaldi"],["Google Chrome","Chrome"],["Chromium","Chromium"]];function we(t){var i,c,d,l,p,g,b;let e=((i=t.platform)!=null?i:"").toLowerCase(),n=(c=t.userAgentData)==null?void 0:c.platform,r=(d=t.highEntropyData)==null?void 0:d.platformVersion,o=!!(r&&r!=="0.0.0");if((l=t.webglCompressedFormats)!=null&&l.pvrtc&&!t.webglCompressedFormats.s3tc)return "iOS";if(t.webglRenderer&&/^ANGLE\b/.test(t.webglRenderer))return e.startsWith("mac")||n==="macOS"?"MacOS":e.startsWith("win")||n==="Windows"?"Windows":n==="Chrome OS"?"Chrome OS":null;if(t.webglRenderer&&(/Adreno/i.test(t.webglRenderer)||/Mali[-\s]/i.test(t.webglRenderer)))return "Android";if(n&&o){let w={Windows:"Windows",macOS:"MacOS",Android:"Android",iOS:"iOS","Chrome OS":"Chrome OS"}[n];if(w)return w}return e.startsWith("mac")?"MacOS":e.startsWith("win")?"Windows":e==="iphone"||e==="ipad"||e==="ipod"||((p=t.safeAreaInsetTop)!=null?p:0)>0?"iOS":n==="Chrome OS"?"Chrome OS":n==="Android"&&(e.includes("android")||/^linux arm/i.test((g=t.platform)!=null?g:""))||e.includes("android")||/^linux arm/i.test((b=t.platform)!=null?b:"")?"Android":null}function ve(t){return /iPhone/.test(t)?"iPhone":/iPad/.test(t)?"iPad":/iPod/.test(t)?"iPod":/Macintosh/.test(t)?"MacIntel":/Windows NT/.test(t)?/Win64|WOW64/i.test(t)?"Win64":"Win32":/CrOS/.test(t)?"Linux x86_64":/Android/.test(t)?/aarch64|arm64/i.test(t)?"Linux aarch64":"Linux armv8l":/Linux/.test(t)?/x86_64/i.test(t)?"Linux x86_64":/aarch64|arm64/i.test(t)?"Linux aarch64":"Linux":"unknown"}function xe(t){let e=/[;(]\s*([a-z]{2,3}(?:[-_][A-Za-z]{2,4})+)\s*[;)]/g,n;for(;(n=e.exec(t))!==null;){let r=n[1].replace(/_/g,"-").split("-");if(r.length>=2)return `${r[0].toLowerCase()}-${r.slice(1).map(o=>o.toUpperCase()).join("-")}`}return "unknown"}function V(t,e={}){var _,F,L,I,G,H,U,j,Q,K,z,X,Y,q,J,Z;let n=(_=e.ctx)!=null?_:e.nav,r=(L=(F=e.ctx)==null?void 0:F.windowsVersion)!=null?L:e.windowsVersion,{browser:o,version:i}=re(t),{os:c,osVersion:d}=ae(t,r),l=c,p=d,g=de(t,n),b=pe(t,(I=e.ctx)!=null?I:n),a=n,{isBot:w,botName:S}=ce(t,e.customBotDefs),A=le(t),O=e.language||(a!=null&&a.language||a!=null&&a.browserLanguage?R(a):"")||xe(t),T=(a==null?void 0:a.platform)||ve(t),m=o,f=i;if((G=e.ctx)!=null&&G.hasBrave&&(m="Brave"),a){let s=typeof chrome!="undefined"?chrome:void 0,y=/Chrome\/([\d]+)/.exec(t),h=y?parseInt(y[1],10):0;if(s)if(s.adblock2345||s.common2345)m="2345Explorer",f="unknown";else {let u=false;if(v(a,"application/360softmgrplugin")||v(a,"application/mozilla-npqihooquicklogin")||h>36&&typeof showModalDialog!="undefined"?u=true:h>45&&(u=v(a,"application/vnd.chromium.remoting-viewer"),!u&&h>=69&&(u=v(a,"application/hwepass2001.installepass2001")||v(a,"application/asx"))),u){let x=((H=a.connection)==null?void 0:H.saveData)===true;v(a,"application/gameplugin")||!x?m="360SE":m="360EE",f="unknown";}}}if(m==="Baidu"&&/(Opera|OPR|OPT)/.test(t)){m="Opera";let s=(j=(U=/OPR\/([\d.]+)/.exec(t))!=null?U:/OPT\/([\d.]+)/.exec(t))!=null?j:/Opera\/([\d.]+)/.exec(t);f=(Q=s==null?void 0:s[1])!=null?Q:"unknown";}if(m==="Chrome"&&/\S+Browser\//.test(t)){let s=/(\S+Browser)\/([\d.]+)/.exec(t);s&&(m=s[1],f=s[2]);}if(m==="Firefox"&&a)try{(typeof clientInformation!="undefined"||typeof u2f=="undefined")&&(m="Firefox Nightly");}catch(s){}if(l==="iOS"&&m==="Safari"){let s=/Version\/([\d.]+)/.exec(t);s&&parseInt(s[1],10)>parseInt(p,10)&&(p=s[1]);}if(l==="MacOS"&&m==="Safari"){let s=/Version\/([\d.]+)/.exec(t);s&&parseInt(s[1],10)>=26&&(p=s[1]);}if(e.ctx){let s=we(e.ctx);if(s!==null&&(s!==c&&(l=s,p="unknown"),l!=="Windows")){let h=(K=e.ctx.highEntropyData)==null?void 0:K.platformVersion;if(h&&h!=="0.0.0"){let u=h.split(".").map(Number);for(;u.length>1&&u[u.length-1]===0;)u.pop();u[0]&&(p=u.join("."));}}let y=(z=e.ctx.highEntropyData)==null?void 0:z.fullVersionList;if(y)for(let[h,u]of he){let x=y.find(fe=>fe.brand===h);if(x!=null&&x.version){m=u,f=x.version;break}}}let C=oe(t,m,f),D=parseInt((X=f.split(".")[0])!=null?X:"0",10)||0,M=(Z=(J=(q=(Y=e.ctx)!=null?Y:e.nav)==null?void 0:q.connection)==null?void 0:J.effectiveType)!=null?Z:"unknown";return {browser:m,version:f,versionMajor:D,engine:C,os:l,osVersion:p,device:g,arch:b,isWebview:N(t),isHeadless:A,isBot:w,botName:S,language:O,platform:T,connectionType:M}}var ye=[".AppleSystemUIFont","Segoe UI","Noto Color Emoji","Ubuntu","HarmonyOS Sans"];function Pe(){try{let e=document.createElement("canvas").getContext("2d");if(!e)return {};let n="mmmmmmmmmmlli";e.font="72px monospace";let r=e.measureText(n).width,o={};for(let i of ye)e.font=`72px '${i}', monospace`,o[i]=e.measureText(n).width!==r;return o}catch(t){return {}}}function Be(){var t,e;try{let n=document.createElement("canvas"),r=(t=n.getContext("webgl"))!=null?t:n.getContext("experimental-webgl");if(!r)return {};let o=r.getExtension("WEBGL_debug_renderer_info"),i={maxTextureSize:r.getParameter(r.MAX_TEXTURE_SIZE),fragPrecision:(e=r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_FLOAT))==null?void 0:e.rangeMax,compressedFormats:{s3tc:!!r.getExtension("WEBGL_compressed_texture_s3tc"),pvrtc:!!r.getExtension("WEBGL_compressed_texture_pvrtc"),etc2:!!r.getExtension("WEBGL_compressed_texture_etc"),astc:!!r.getExtension("WEBGL_compressed_texture_astc_ldr")}};return o&&(i.renderer=r.getParameter(o.UNMASKED_RENDERER_WEBGL),i.vendor=r.getParameter(o.UNMASKED_VENDOR_WEBGL)),i}catch(n){return {}}}function Ee(){try{let t=document.createElement("div");t.style.cssText="position:fixed;top:env(safe-area-inset-top,0px);visibility:hidden;pointer-events:none",document.body.appendChild(t);let e=parseFloat(getComputedStyle(t).top);return document.body.removeChild(t),isNaN(e)?0:e}catch(t){return 0}}function Se(){var t;try{let e=(t=window.AudioContext)!=null?t:window.webkitAudioContext;if(!e)return;let n=new e,r=n.sampleRate;return n.close(),r}catch(e){return}}function Ae(){try{if(window.matchMedia("(pointer: coarse)").matches)return "coarse";if(window.matchMedia("(pointer: fine)").matches)return "fine";if(window.matchMedia("(pointer: none)").matches)return "none"}catch(t){}}function Oe(){try{return window.matchMedia("(hover: hover)").matches}catch(t){return}}function Te(t){var n;if(!t)return null;let e=parseInt((n=t.split(".")[0])!=null?n:"0",10);return isNaN(e)?null:e>=13?"11":"10"}async function ue(){var n,r,o,i,c;let t=B(),e={userAgent:t.userAgent,platform:t.platform,language:t.language,maxTouchPoints:t.maxTouchPoints};if(t.browserLanguage!==void 0&&(e.browserLanguage=t.browserLanguage),t.mimeTypes!==void 0&&(e.mimeTypes=t.mimeTypes),t.connection!==void 0&&(e.connection=t.connection),t.userAgentData!==void 0&&(e.userAgentData=t.userAgentData),typeof navigator!="undefined"&&(e.hardwareConcurrency=navigator.hardwareConcurrency,e.deviceMemory=navigator.deviceMemory),typeof window!="undefined"){e.devicePixelRatio=window.devicePixelRatio,e.screenWidth=(n=window.screen)==null?void 0:n.width,e.screenHeight=(r=window.screen)==null?void 0:r.height,e.safeAreaInsetTop=Ee(),e.pointerType=Ae(),e.hoverCapability=Oe(),e.fontProbes=Pe(),e.audioSampleRate=Se(),e.hasVibration="vibrate"in navigator,e.hasDeviceMotion="DeviceMotionEvent"in window;try{e.hasBrave=(c=await((i=(o=navigator.brave)==null?void 0:o.isBrave)==null?void 0:i.call(o)))!=null?c:!1;}catch(a){e.hasBrave=false;}let{renderer:d,vendor:l,maxTextureSize:p,fragPrecision:g,compressedFormats:b}=Be();d!==void 0&&(e.webglRenderer=d),l!==void 0&&(e.webglVendor=l),p!==void 0&&(e.webglMaxTextureSize=p),g!==void 0&&(e.webglFragPrecision=g),b!==void 0&&(e.webglCompressedFormats=b);}if(t.userAgentData)try{let d=await t.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]);e.highEntropyData={architecture:d.architecture,bitness:d.bitness,model:d.model,platformVersion:d.platformVersion,fullVersionList:d.fullVersionList},t.userAgentData.platform==="Windows"&&(e.windowsVersion=Te(d.platformVersion));}catch(d){}return e}var{version:Ce}=$;function E(){let t=B();return V(t.userAgent,{nav:t})}E.detect=async t=>{let e=await ue();return V(t!=null?t:e.userAgent,{ctx:e})};E.isWebview=N;E.getLanguage=()=>R(B());E.VERSION=Ce;var De=E;
2
+ return De;})();//# sourceMappingURL=index.min.js.map
3
3
  //# sourceMappingURL=index.min.js.map