ua-parser-js 2.0.6 → 2.0.9

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.
@@ -1,5 +1,5 @@
1
1
  ///////////////////////////////////////////////
2
- /* Extensions for UAParser.js v2.0.6
2
+ /* Extensions for UAParser.js v2.0.9
3
3
  https://github.com/faisalman/ua-parser-js
4
4
  Author: Faisal Salman <f@faisalman.com>
5
5
  AGPLv3 License */
@@ -22,14 +22,27 @@ const INAPP = 'inapp';
22
22
  const MEDIAPLAYER = 'mediaplayer';
23
23
  const LIBRARY = 'library';
24
24
 
25
+ // Helper to normalize specific email client names
26
+ const normalizeEmailName = function (str) {
27
+ const map = {
28
+ 'YahooMobile': 'Yahoo Mail',
29
+ 'YahooMail': 'Yahoo Mail',
30
+ 'K-9': 'K-9 Mail',
31
+ 'K-9 Mail': 'K-9 Mail',
32
+ 'Zdesktop': 'Zimbra',
33
+ 'zdesktop': 'Zimbra'
34
+ };
35
+ return map[str] || str;
36
+ };
37
+
25
38
  //////////////////////
26
39
  // COMMAND LINE APPS
27
40
  /////////////////////
28
41
 
29
42
  const CLIs = Object.freeze({
30
43
  browser : [
31
- // wget / curl / Lynx / ELinks / HTTPie
32
- [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
44
+ // wget / curl / Lynx / ELinks / HTTPie / PowerShell
45
+ [/(wget|curl|lynx|elinks|httpie|powershell)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
33
46
  ]
34
47
  });
35
48
 
@@ -117,10 +130,10 @@ const Crawlers = Object.freeze({
117
130
  // Yeti (Naver)
118
131
  /(yeti)\/([\w\.]+)/i,
119
132
 
120
- // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
133
+ // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
121
134
  // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
122
135
  // Freespoke - https://docs.freespoke.com/search/bot/
123
- /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
136
+ /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i
124
137
  ],
125
138
  [NAME, VERSION, [TYPE, CRAWLER]],
126
139
 
@@ -132,7 +145,7 @@ const Crawlers = Object.freeze({
132
145
 
133
146
  [
134
147
  // Google Bots
135
- /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
148
+ /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|notebooklm|safety))/i,
136
149
 
137
150
  // AI2Bot - https://allenai.org/crawler
138
151
  // DataForSeoBot - https://dataforseo.com/dataforseo-bot
@@ -143,7 +156,7 @@ const Crawlers = Object.freeze({
143
156
  // v0bot - https://vercel.com/docs/bot-management
144
157
  // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
145
158
  // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
146
- /\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
159
+ /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
147
160
  ],
148
161
  [NAME, [TYPE, CRAWLER]]
149
162
  ]
@@ -229,25 +242,55 @@ const ExtraDevices = Object.freeze({
229
242
  ]
230
243
  });
231
244
 
232
- ///////////////
245
+ //////////////
233
246
  // EMAIL APPS
234
247
  //////////////
235
248
 
236
249
  const Emails = Object.freeze({
237
250
  browser : [
251
+ // 1. Specific Android Mail Rule
252
+ [/(android)\/([\w\.-]+email)/i],
253
+ [NAME, VERSION, [TYPE, EMAIL]],
254
+
255
+ // 2. Standard Email Clients
256
+ [
257
+ new RegExp(
258
+ '(' +
259
+ // Clients ending in 'mail' (Case 1: Prefix + optional space + [e]mail)
260
+ // Covers: AirMail, Claws Mail, FairEmail, SamsungEmail, Yahoo Mail, etc.
261
+ '(?:air|aqua|blue|claws|daum|fair|fox|k-9|mac|nylas|pegasus|poco|poly|proton|samsung|squirrel|yahoo) ?e?mail(?:-desktop| app| bridge)?|' +
262
+ // Standalone / Specific Names
263
+ 'microsoft outlook|r2mail2|spicebird|turnpike|yahoomobile|' +
264
+ // Microsoft & Outlook Variants
265
+ '(?:microsoft )?outlook(?:-express)?|macoutlook|windows-live-mail|' +
266
+ // Specific Clients
267
+ 'alpine|balsa|barca|canary|emclient|eudora|evolution|geary|gnus|' +
268
+ 'horde::imp|incredimail|kmail2?|kontact|lotus-notes|' +
269
+ 'mail(?:bird|mate|spring)|mutt|navermailapp|newton|nine|postbox|' +
270
+ 'rainloop|roundcube webmail|spar(?:row|kdesktop)|sylpheed|' +
271
+ 'the bat!|thunderbird|trojita|tutanota-desktop|wanderlust|' +
272
+ 'zdesktop|zohomail-desktop' +
273
+ ')' +
274
+ // Separator
275
+ '(?:m.+ail; |[\\/ ])' +
276
+ // Version (Updated to allow hyphens for Turnpike)
277
+ '([\\w\\.-]+)',
278
+ 'i'
279
+ )
280
+ ],
238
281
  [
239
- // Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
240
- // Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
241
- // ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
242
- /((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
243
-
244
- // Apple's Mail
245
- /(mail)\/([\w\.]+) cf/i
246
- ], [NAME, VERSION, [TYPE, EMAIL]], [
282
+ [NAME, normalizeEmailName],
283
+ VERSION,
284
+ [TYPE, EMAIL]
285
+ ],
286
+
287
+ // 3. Apple Mail Context
288
+ [/(mail)\/([\w\.]+) cf/i],
289
+ [NAME, VERSION, [TYPE, EMAIL]],
247
290
 
248
- // Zimbra
249
- /zdesktop\/([\w\.]+)/i
250
- ], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
291
+ // 4. Zimbra Server
292
+ [/(zimbra)\/([\w\.-]+)/i],
293
+ [NAME, VERSION, [TYPE, EMAIL]]
251
294
  ]
252
295
  });
253
296
 
@@ -258,35 +301,36 @@ const Emails = Object.freeze({
258
301
  const Fetchers = Object.freeze({
259
302
  browser : [
260
303
  [
261
- // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
304
+ // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot / WhatsApp
262
305
  // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
263
306
  // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
264
307
  // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
265
308
  // DuckAssistBot - https://duckduckgo.com/duckassistbot/
309
+ // FlipboardProxy - https://about.flipboard.com/proxy-service/
266
310
  // Google Site Verifier / Meta / Yahoo! Japan
267
311
  // Iframely - https://iframely.com/docs/about
268
312
  // Perplexity-User - https://docs.perplexity.ai/guides/bots
269
313
  // MistralAI-User - https://docs.mistral.ai/robots/
270
314
  // Yandex Bots - https://yandex.com/bots
271
- /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
315
+ /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,
272
316
 
273
317
  // Bluesky
274
318
  /(bluesky) cardyb\/([\w\.]+)/i,
275
319
 
320
+ // Nova Act - https://github.com/aws/nova-act
321
+ /agent-(novaact)\/([\w\.]+)/i,
322
+
276
323
  // Skype
277
324
  /(skypeuripreview) preview\/([\w\.]+)/i,
278
325
 
279
326
  // Slackbot - https://api.slack.com/robots
280
- /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
281
-
282
- // WhatsApp
283
- /(whatsapp)\/([\w\.]+)/i
327
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i
284
328
  ],
285
329
  [NAME, VERSION, [TYPE, FETCHER]],
286
330
 
287
331
  [
288
332
  // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
289
- /((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
333
+ /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
290
334
  ],
291
335
  [NAME, [TYPE, FETCHER]],
292
336
  ],
@@ -389,13 +433,15 @@ const MediaPlayers = Object.freeze({
389
433
 
390
434
  const Libraries = Object.freeze({
391
435
  browser : [
392
- // Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
393
436
  [
394
- /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
437
+ // Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/http.rb/Java[-HttpClient]/Jetty/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/ocaml-cohttp/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent
438
+ /^((?:apache|go|java)-http-?client|axios|bun|dart|deno|got|(?:guzzle|lua-resty-|ocaml-co|ok)http|hackney|http\.rb|java|jetty|libwww-perl|needle|node(?:\.js|-fetch|-superagent)|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i,
395
439
  /(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
396
440
  /(nutch)-([\w\.-]+)(\(|$)/i,
397
441
  /\((java)\/([\w\.]+)/i
398
- ], [NAME, VERSION, [TYPE, LIBRARY]]
442
+ ], [NAME, VERSION, [TYPE, LIBRARY]], [
443
+ /(node-fetch|undici)/i
444
+ ], [NAME, [TYPE, LIBRARY]]
399
445
  ]
400
446
  });
401
447
 
@@ -449,4 +495,4 @@ module.exports = {
449
495
  Libraries,
450
496
  MediaPlayers,
451
497
  Vehicles
452
- };
498
+ };
@@ -3,7 +3,7 @@
3
3
  // Source: /src/extensions/ua-parser-extensions.js
4
4
 
5
5
  ///////////////////////////////////////////////
6
- /* Extensions for UAParser.js v2.0.6
6
+ /* Extensions for UAParser.js v2.0.9
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -26,14 +26,27 @@ const INAPP = 'inapp';
26
26
  const MEDIAPLAYER = 'mediaplayer';
27
27
  const LIBRARY = 'library';
28
28
 
29
+ // Helper to normalize specific email client names
30
+ const normalizeEmailName = function (str) {
31
+ const map = {
32
+ 'YahooMobile': 'Yahoo Mail',
33
+ 'YahooMail': 'Yahoo Mail',
34
+ 'K-9': 'K-9 Mail',
35
+ 'K-9 Mail': 'K-9 Mail',
36
+ 'Zdesktop': 'Zimbra',
37
+ 'zdesktop': 'Zimbra'
38
+ };
39
+ return map[str] || str;
40
+ };
41
+
29
42
  //////////////////////
30
43
  // COMMAND LINE APPS
31
44
  /////////////////////
32
45
 
33
46
  const CLIs = Object.freeze({
34
47
  browser : [
35
- // wget / curl / Lynx / ELinks / HTTPie
36
- [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
48
+ // wget / curl / Lynx / ELinks / HTTPie / PowerShell
49
+ [/(wget|curl|lynx|elinks|httpie|powershell)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
37
50
  ]
38
51
  });
39
52
 
@@ -121,10 +134,10 @@ const Crawlers = Object.freeze({
121
134
  // Yeti (Naver)
122
135
  /(yeti)\/([\w\.]+)/i,
123
136
 
124
- // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
137
+ // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
125
138
  // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
126
139
  // Freespoke - https://docs.freespoke.com/search/bot/
127
- /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
140
+ /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i
128
141
  ],
129
142
  [NAME, VERSION, [TYPE, CRAWLER]],
130
143
 
@@ -136,7 +149,7 @@ const Crawlers = Object.freeze({
136
149
 
137
150
  [
138
151
  // Google Bots
139
- /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
152
+ /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|notebooklm|safety))/i,
140
153
 
141
154
  // AI2Bot - https://allenai.org/crawler
142
155
  // DataForSeoBot - https://dataforseo.com/dataforseo-bot
@@ -147,7 +160,7 @@ const Crawlers = Object.freeze({
147
160
  // v0bot - https://vercel.com/docs/bot-management
148
161
  // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
149
162
  // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
150
- /\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
163
+ /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
151
164
  ],
152
165
  [NAME, [TYPE, CRAWLER]]
153
166
  ]
@@ -233,25 +246,55 @@ const ExtraDevices = Object.freeze({
233
246
  ]
234
247
  });
235
248
 
236
- ///////////////
249
+ //////////////
237
250
  // EMAIL APPS
238
251
  //////////////
239
252
 
240
253
  const Emails = Object.freeze({
241
254
  browser : [
255
+ // 1. Specific Android Mail Rule
256
+ [/(android)\/([\w\.-]+email)/i],
257
+ [NAME, VERSION, [TYPE, EMAIL]],
258
+
259
+ // 2. Standard Email Clients
260
+ [
261
+ new RegExp(
262
+ '(' +
263
+ // Clients ending in 'mail' (Case 1: Prefix + optional space + [e]mail)
264
+ // Covers: AirMail, Claws Mail, FairEmail, SamsungEmail, Yahoo Mail, etc.
265
+ '(?:air|aqua|blue|claws|daum|fair|fox|k-9|mac|nylas|pegasus|poco|poly|proton|samsung|squirrel|yahoo) ?e?mail(?:-desktop| app| bridge)?|' +
266
+ // Standalone / Specific Names
267
+ 'microsoft outlook|r2mail2|spicebird|turnpike|yahoomobile|' +
268
+ // Microsoft & Outlook Variants
269
+ '(?:microsoft )?outlook(?:-express)?|macoutlook|windows-live-mail|' +
270
+ // Specific Clients
271
+ 'alpine|balsa|barca|canary|emclient|eudora|evolution|geary|gnus|' +
272
+ 'horde::imp|incredimail|kmail2?|kontact|lotus-notes|' +
273
+ 'mail(?:bird|mate|spring)|mutt|navermailapp|newton|nine|postbox|' +
274
+ 'rainloop|roundcube webmail|spar(?:row|kdesktop)|sylpheed|' +
275
+ 'the bat!|thunderbird|trojita|tutanota-desktop|wanderlust|' +
276
+ 'zdesktop|zohomail-desktop' +
277
+ ')' +
278
+ // Separator
279
+ '(?:m.+ail; |[\\/ ])' +
280
+ // Version (Updated to allow hyphens for Turnpike)
281
+ '([\\w\\.-]+)',
282
+ 'i'
283
+ )
284
+ ],
242
285
  [
243
- // Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
244
- // Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
245
- // ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
246
- /((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
247
-
248
- // Apple's Mail
249
- /(mail)\/([\w\.]+) cf/i
250
- ], [NAME, VERSION, [TYPE, EMAIL]], [
286
+ [NAME, normalizeEmailName],
287
+ VERSION,
288
+ [TYPE, EMAIL]
289
+ ],
290
+
291
+ // 3. Apple Mail Context
292
+ [/(mail)\/([\w\.]+) cf/i],
293
+ [NAME, VERSION, [TYPE, EMAIL]],
251
294
 
252
- // Zimbra
253
- /zdesktop\/([\w\.]+)/i
254
- ], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
295
+ // 4. Zimbra Server
296
+ [/(zimbra)\/([\w\.-]+)/i],
297
+ [NAME, VERSION, [TYPE, EMAIL]]
255
298
  ]
256
299
  });
257
300
 
@@ -262,35 +305,36 @@ const Emails = Object.freeze({
262
305
  const Fetchers = Object.freeze({
263
306
  browser : [
264
307
  [
265
- // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
308
+ // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot / WhatsApp
266
309
  // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
267
310
  // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
268
311
  // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
269
312
  // DuckAssistBot - https://duckduckgo.com/duckassistbot/
313
+ // FlipboardProxy - https://about.flipboard.com/proxy-service/
270
314
  // Google Site Verifier / Meta / Yahoo! Japan
271
315
  // Iframely - https://iframely.com/docs/about
272
316
  // Perplexity-User - https://docs.perplexity.ai/guides/bots
273
317
  // MistralAI-User - https://docs.mistral.ai/robots/
274
318
  // Yandex Bots - https://yandex.com/bots
275
- /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
319
+ /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,
276
320
 
277
321
  // Bluesky
278
322
  /(bluesky) cardyb\/([\w\.]+)/i,
279
323
 
324
+ // Nova Act - https://github.com/aws/nova-act
325
+ /agent-(novaact)\/([\w\.]+)/i,
326
+
280
327
  // Skype
281
328
  /(skypeuripreview) preview\/([\w\.]+)/i,
282
329
 
283
330
  // Slackbot - https://api.slack.com/robots
284
- /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
285
-
286
- // WhatsApp
287
- /(whatsapp)\/([\w\.]+)/i
331
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i
288
332
  ],
289
333
  [NAME, VERSION, [TYPE, FETCHER]],
290
334
 
291
335
  [
292
336
  // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
293
- /((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
337
+ /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
294
338
  ],
295
339
  [NAME, [TYPE, FETCHER]],
296
340
  ],
@@ -393,13 +437,15 @@ const MediaPlayers = Object.freeze({
393
437
 
394
438
  const Libraries = Object.freeze({
395
439
  browser : [
396
- // Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
397
440
  [
398
- /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
441
+ // Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/http.rb/Java[-HttpClient]/Jetty/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/ocaml-cohttp/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent
442
+ /^((?:apache|go|java)-http-?client|axios|bun|dart|deno|got|(?:guzzle|lua-resty-|ocaml-co|ok)http|hackney|http\.rb|java|jetty|libwww-perl|needle|node(?:\.js|-fetch|-superagent)|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i,
399
443
  /(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
400
444
  /(nutch)-([\w\.-]+)(\(|$)/i,
401
445
  /\((java)\/([\w\.]+)/i
402
- ], [NAME, VERSION, [TYPE, LIBRARY]]
446
+ ], [NAME, VERSION, [TYPE, LIBRARY]], [
447
+ /(node-fetch|undici)/i
448
+ ], [NAME, [TYPE, LIBRARY]]
403
449
  ]
404
450
  });
405
451
 
@@ -453,4 +499,4 @@ export {
453
499
  Libraries,
454
500
  MediaPlayers,
455
501
  Vehicles
456
- };
502
+ };
@@ -1,15 +1,41 @@
1
- // Type definitions for Helpers submodule of UAParser.js v2.0.5
1
+ // Type definitions for Helpers submodule of UAParser.js v2.0.9
2
2
  // Project: https://github.com/faisalman/ua-parser-js
3
3
  // Definitions by: Faisal Salman <https://github.com/faisalman>
4
4
 
5
5
  import type { IResult } from "../main/ua-parser";
6
6
 
7
+ export function getOutlookEdition(name: string, version: string): string;
8
+ export function isFrozenUA(ua: string): boolean;
9
+
10
+ /**
11
+ * @deprecated Moved to `device-detection` submodule
12
+ */
7
13
  export function getDeviceVendor(model: string): string | undefined;
14
+ /**
15
+ * @deprecated Moved to `device-detection` submodule
16
+ */
8
17
  export function isAppleSilicon(resultOrUA: IResult | string): boolean;
18
+ /**
19
+ * @deprecated Moved to `bot-detection` submodule
20
+ */
9
21
  export function isAIBot(resultOrUA: IResult | string): boolean;
22
+ /**
23
+ * @deprecated Moved to `bot-detection` submodule
24
+ */
10
25
  export function isBot(resultOrUA: IResult | string): boolean;
26
+ /**
27
+ * @deprecated Moved to `browser-detection` submodule
28
+ */
11
29
  export function isChromeFamily(resultOrUA: IResult | string): boolean;
30
+ /**
31
+ * @deprecated Moved to `browser-detection` submodule
32
+ */
12
33
  export function isElectron(): boolean;
34
+ /**
35
+ * @deprecated Moved to `browser-detection` submodule
36
+ */
13
37
  export function isFromEU(): boolean;
14
- export function isFrozenUA(ua: string): boolean;
15
- export function isStandalonePWA(): boolean;
38
+ /**
39
+ * @deprecated Moved to `browser-detection` submodule
40
+ */
41
+ export function isStandalonePWA(): boolean;