ua-parser-js 1.0.37 → 2.0.2

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.
Files changed (205) hide show
  1. package/LICENSE.md +616 -0
  2. package/README.md +251 -0
  3. package/dist/icons/color/LICENSE.md +3 -0
  4. package/dist/icons/color/browser/android-browser.svg +1 -0
  5. package/dist/icons/color/browser/avant.png +0 -0
  6. package/dist/icons/color/browser/basilisk.png +0 -0
  7. package/dist/icons/color/browser/basilisk.svg +1 -0
  8. package/dist/icons/color/browser/brave.png +0 -0
  9. package/dist/icons/color/browser/brave.svg +1 -0
  10. package/dist/icons/color/browser/chrome.png +0 -0
  11. package/dist/icons/color/browser/chrome.svg +1 -0
  12. package/dist/icons/color/browser/chromium.png +0 -0
  13. package/dist/icons/color/browser/chromium.svg +1 -0
  14. package/dist/icons/color/browser/coc-coc.png +0 -0
  15. package/dist/icons/color/browser/default.png +0 -0
  16. package/dist/icons/color/browser/default.svg +1 -0
  17. package/dist/icons/color/browser/dolphin.png +0 -0
  18. package/dist/icons/color/browser/edge.png +0 -0
  19. package/dist/icons/color/browser/edge.svg +1 -0
  20. package/dist/icons/color/browser/electron.png +0 -0
  21. package/dist/icons/color/browser/electron.svg +1 -0
  22. package/dist/icons/color/browser/falkon.png +0 -0
  23. package/dist/icons/color/browser/falkon.svg +1 -0
  24. package/dist/icons/color/browser/firefox-reality.png +0 -0
  25. package/dist/icons/color/browser/firefox-reality.svg +1 -0
  26. package/dist/icons/color/browser/firefox.png +0 -0
  27. package/dist/icons/color/browser/firefox.svg +1 -0
  28. package/dist/icons/color/browser/gsa.svg +9 -0
  29. package/dist/icons/color/browser/icecat.png +0 -0
  30. package/dist/icons/color/browser/ie.svg +6 -0
  31. package/dist/icons/color/browser/konqueror.png +0 -0
  32. package/dist/icons/color/browser/konqueror.svg +1 -0
  33. package/dist/icons/color/browser/maxthon.png +0 -0
  34. package/dist/icons/color/browser/midori.png +0 -0
  35. package/dist/icons/color/browser/midori.svg +1 -0
  36. package/dist/icons/color/browser/netsurf.png +0 -0
  37. package/dist/icons/color/browser/netsurf.svg +1 -0
  38. package/dist/icons/color/browser/opera-gx.png +0 -0
  39. package/dist/icons/color/browser/opera-gx.svg +1 -0
  40. package/dist/icons/color/browser/opera-mini.png +0 -0
  41. package/dist/icons/color/browser/opera-touch.png +0 -0
  42. package/dist/icons/color/browser/opera.png +0 -0
  43. package/dist/icons/color/browser/opera.svg +1 -0
  44. package/dist/icons/color/browser/palemoon.png +0 -0
  45. package/dist/icons/color/browser/puffin.png +0 -0
  46. package/dist/icons/color/browser/safari.png +0 -0
  47. package/dist/icons/color/browser/safari.svg +1 -0
  48. package/dist/icons/color/browser/samsung-internet.png +0 -0
  49. package/dist/icons/color/browser/samsung-internet.svg +1 -0
  50. package/dist/icons/color/browser/seamonkey.png +0 -0
  51. package/dist/icons/color/browser/silk.png +0 -0
  52. package/dist/icons/color/browser/sogou-mobile.png +0 -0
  53. package/dist/icons/color/browser/ucbrowser.png +0 -0
  54. package/dist/icons/color/browser/ucbrowser.svg +1 -0
  55. package/dist/icons/color/browser/vivaldi.png +0 -0
  56. package/dist/icons/color/browser/vivaldi.svg +1 -0
  57. package/dist/icons/color/browser/webkit.png +0 -0
  58. package/dist/icons/color/browser/webkit.svg +1 -0
  59. package/dist/icons/color/browser/yandex.png +0 -0
  60. package/dist/icons/color/os/centos.svg +1 -0
  61. package/dist/icons/mono/LICENSE.md +3 -0
  62. package/dist/icons/mono/browser/alipay.svg +1 -0
  63. package/dist/icons/mono/browser/android-browser.svg +1 -0
  64. package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
  65. package/dist/icons/mono/browser/baidu-browser.svg +1 -0
  66. package/dist/icons/mono/browser/brave.svg +1 -0
  67. package/dist/icons/mono/browser/chrome-headless.svg +1 -0
  68. package/dist/icons/mono/browser/chrome-webview.svg +1 -0
  69. package/dist/icons/mono/browser/chrome.svg +1 -0
  70. package/dist/icons/mono/browser/chromium.svg +1 -0
  71. package/dist/icons/mono/browser/duckduckgo.svg +1 -0
  72. package/dist/icons/mono/browser/edge.svg +1 -0
  73. package/dist/icons/mono/browser/electron.svg +1 -0
  74. package/dist/icons/mono/browser/facebook.svg +1 -0
  75. package/dist/icons/mono/browser/firefox-focus.svg +1 -0
  76. package/dist/icons/mono/browser/firefox-reality.svg +1 -0
  77. package/dist/icons/mono/browser/firefox.svg +1 -0
  78. package/dist/icons/mono/browser/gsa.svg +1 -0
  79. package/dist/icons/mono/browser/huawei-browser.svg +1 -0
  80. package/dist/icons/mono/browser/icecat.svg +1 -0
  81. package/dist/icons/mono/browser/ie.svg +1 -0
  82. package/dist/icons/mono/browser/instagram.svg +1 -0
  83. package/dist/icons/mono/browser/jasmine.svg +1 -0
  84. package/dist/icons/mono/browser/kakaotalk.svg +1 -0
  85. package/dist/icons/mono/browser/klarna.svg +1 -0
  86. package/dist/icons/mono/browser/line.svg +1 -0
  87. package/dist/icons/mono/browser/linkedin.svg +1 -0
  88. package/dist/icons/mono/browser/miui-browser.svg +1 -0
  89. package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
  90. package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
  91. package/dist/icons/mono/browser/mobile-safari.svg +1 -0
  92. package/dist/icons/mono/browser/mozilla.svg +1 -0
  93. package/dist/icons/mono/browser/naver.svg +1 -0
  94. package/dist/icons/mono/browser/nokia-browser.svg +1 -0
  95. package/dist/icons/mono/browser/oculus-browser.svg +1 -0
  96. package/dist/icons/mono/browser/opera-coast.svg +1 -0
  97. package/dist/icons/mono/browser/opera-gx.svg +1 -0
  98. package/dist/icons/mono/browser/opera-mini.svg +1 -0
  99. package/dist/icons/mono/browser/opera-mobi.svg +1 -0
  100. package/dist/icons/mono/browser/opera-tablet.svg +1 -0
  101. package/dist/icons/mono/browser/opera-touch.svg +1 -0
  102. package/dist/icons/mono/browser/opera.svg +1 -0
  103. package/dist/icons/mono/browser/qqbrowser.svg +1 -0
  104. package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
  105. package/dist/icons/mono/browser/safari.svg +1 -0
  106. package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
  107. package/dist/icons/mono/browser/samsung-internet.svg +1 -0
  108. package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
  109. package/dist/icons/mono/browser/snapchat.svg +1 -0
  110. package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
  111. package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
  112. package/dist/icons/mono/browser/tesla.svg +1 -0
  113. package/dist/icons/mono/browser/tiktok.svg +1 -0
  114. package/dist/icons/mono/browser/twitter.svg +1 -0
  115. package/dist/icons/mono/browser/vivaldi.svg +1 -0
  116. package/dist/icons/mono/browser/vivo-browser.svg +1 -0
  117. package/dist/icons/mono/browser/wechat.svg +1 -0
  118. package/dist/icons/mono/browser/weibo.svg +1 -0
  119. package/dist/icons/mono/browser/yandex.svg +1 -0
  120. package/dist/icons/mono/device/acer.svg +1 -0
  121. package/dist/icons/mono/device/amazon.svg +1 -0
  122. package/dist/icons/mono/device/apple.svg +1 -0
  123. package/dist/icons/mono/device/asus.svg +1 -0
  124. package/dist/icons/mono/device/att.svg +1 -0
  125. package/dist/icons/mono/device/blackberry.svg +1 -0
  126. package/dist/icons/mono/device/dell.svg +1 -0
  127. package/dist/icons/mono/device/facebook.svg +1 -0
  128. package/dist/icons/mono/device/fairphone.svg +1 -0
  129. package/dist/icons/mono/device/google.svg +1 -0
  130. package/dist/icons/mono/device/hp.svg +1 -0
  131. package/dist/icons/mono/device/huawei.svg +1 -0
  132. package/dist/icons/mono/device/lenovo.svg +1 -0
  133. package/dist/icons/mono/device/lg.svg +1 -0
  134. package/dist/icons/mono/device/meizu.svg +1 -0
  135. package/dist/icons/mono/device/microsoft.svg +1 -0
  136. package/dist/icons/mono/device/motorola.svg +1 -0
  137. package/dist/icons/mono/device/nintendo.svg +1 -0
  138. package/dist/icons/mono/device/nokia.svg +1 -0
  139. package/dist/icons/mono/device/nvidia.svg +1 -0
  140. package/dist/icons/mono/device/oneplus.svg +1 -0
  141. package/dist/icons/mono/device/oppo.svg +1 -0
  142. package/dist/icons/mono/device/panasonic.svg +1 -0
  143. package/dist/icons/mono/device/roku.svg +1 -0
  144. package/dist/icons/mono/device/samsung.svg +1 -0
  145. package/dist/icons/mono/device/siemens.svg +1 -0
  146. package/dist/icons/mono/device/sony.svg +1 -0
  147. package/dist/icons/mono/device/tesla.svg +1 -0
  148. package/dist/icons/mono/device/vivo.svg +1 -0
  149. package/dist/icons/mono/device/vodafone.svg +1 -0
  150. package/dist/icons/mono/device/xiaomi.svg +1 -0
  151. package/dist/icons/mono/device/zebra.svg +1 -0
  152. package/dist/icons/mono/os/android.svg +1 -0
  153. package/dist/icons/mono/os/arch.svg +1 -0
  154. package/dist/icons/mono/os/blackberry.svg +1 -0
  155. package/dist/icons/mono/os/centos.svg +1 -0
  156. package/dist/icons/mono/os/chrome-os.svg +1 -0
  157. package/dist/icons/mono/os/chromecast.svg +1 -0
  158. package/dist/icons/mono/os/debian.svg +1 -0
  159. package/dist/icons/mono/os/deepin.svg +1 -0
  160. package/dist/icons/mono/os/elementary-os.svg +1 -0
  161. package/dist/icons/mono/os/fedora.svg +1 -0
  162. package/dist/icons/mono/os/firefox.svg +1 -0
  163. package/dist/icons/mono/os/freebsd.svg +1 -0
  164. package/dist/icons/mono/os/gentoo.svg +1 -0
  165. package/dist/icons/mono/os/gnu.svg +1 -0
  166. package/dist/icons/mono/os/harmonyos.svg +1 -0
  167. package/dist/icons/mono/os/ios.svg +1 -0
  168. package/dist/icons/mono/os/kaios.svg +1 -0
  169. package/dist/icons/mono/os/linux.svg +1 -0
  170. package/dist/icons/mono/os/macos.svg +1 -0
  171. package/dist/icons/mono/os/manjaro.svg +1 -0
  172. package/dist/icons/mono/os/mint.svg +1 -0
  173. package/dist/icons/mono/os/netbsd.svg +1 -0
  174. package/dist/icons/mono/os/nintendo.svg +1 -0
  175. package/dist/icons/mono/os/openbsd.svg +1 -0
  176. package/dist/icons/mono/os/playstation.svg +1 -0
  177. package/dist/icons/mono/os/raspbian.svg +1 -0
  178. package/dist/icons/mono/os/redhat.svg +1 -0
  179. package/dist/icons/mono/os/sailfish.svg +1 -0
  180. package/dist/icons/mono/os/slackware.svg +1 -0
  181. package/dist/icons/mono/os/suse.svg +1 -0
  182. package/dist/icons/mono/os/ubuntu.svg +1 -0
  183. package/dist/icons/mono/os/windows.svg +1 -0
  184. package/dist/icons/mono/os/xbox.svg +1 -0
  185. package/dist/ua-parser.min.js +4 -4
  186. package/dist/ua-parser.min.mjs +4 -0
  187. package/dist/ua-parser.pack.js +4 -4
  188. package/dist/ua-parser.pack.mjs +4 -0
  189. package/package.json +86 -36
  190. package/script/cli.js +4 -0
  191. package/src/enums/ua-parser-enums.d.ts +366 -0
  192. package/src/enums/ua-parser-enums.js +393 -0
  193. package/src/enums/ua-parser-enums.mjs +397 -0
  194. package/src/extensions/ua-parser-extensions.d.ts +16 -0
  195. package/src/extensions/ua-parser-extensions.js +366 -0
  196. package/src/extensions/ua-parser-extensions.mjs +370 -0
  197. package/src/helpers/ua-parser-helpers.d.ts +27 -0
  198. package/src/helpers/ua-parser-helpers.js +137 -0
  199. package/src/helpers/ua-parser-helpers.mjs +141 -0
  200. package/src/main/ua-parser.d.ts +113 -0
  201. package/src/main/ua-parser.js +1439 -0
  202. package/src/main/ua-parser.mjs +1397 -0
  203. package/license.md +0 -21
  204. package/readme.md +0 -385
  205. package/src/ua-parser.js +0 -946
@@ -0,0 +1,366 @@
1
+ ///////////////////////////////////////////////
2
+ /* Extensions for UAParser.js v2.0.2
3
+ https://github.com/faisalman/ua-parser-js
4
+ Author: Faisal Salman <f@faisalman.com>
5
+ AGPLv3 License */
6
+ //////////////////////////////////////////////
7
+
8
+ /*jshint esversion: 6 */
9
+
10
+ const MODEL = 'model';
11
+ const NAME = 'name';
12
+ const TYPE = 'type';
13
+ const VENDOR = 'vendor';
14
+ const VERSION = 'version';
15
+ const MOBILE = 'mobile';
16
+ const TABLET = 'tablet';
17
+ const CRAWLER = 'crawler';
18
+ const CLI = 'cli';
19
+ const EMAIL = 'email';
20
+ const FETCHER = 'fetcher';
21
+ const INAPP = 'inapp';
22
+ const MEDIAPLAYER = 'mediaplayer';
23
+ const LIBRARY = 'library';
24
+
25
+ //////////////////////
26
+ // COMMAND LINE APPS
27
+ /////////////////////
28
+
29
+ const CLIs = Object.freeze({
30
+ browser : [
31
+ // wget / curl / Lynx / ELinks / HTTPie
32
+ [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
33
+ ]
34
+ });
35
+
36
+ ////////////////////////
37
+ // CRAWLERS / SPIDERS
38
+ ///////////////////////
39
+
40
+ const Crawlers = Object.freeze({
41
+ browser : [
42
+ [
43
+ // AhrefsBot - https://ahrefs.com/robot
44
+ // Amazonbot - https://developer.amazon.com/amazonbot
45
+ // Bingbot - http://www.bing.com/bingbot.htm
46
+ // CCBot - https://commoncrawl.org/faq
47
+ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
48
+ // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
49
+ // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
50
+ // GPTBot - https://platform.openai.com/docs/gptbot
51
+ // MJ12bot - https://mj12bot.com/
52
+ // MojeekBot - https://www.mojeek.com/bot.html
53
+ // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
54
+ // PerplexityBot - https://perplexity.ai/perplexitybot
55
+ // SemrushBot - http://www.semrush.com/bot.html
56
+ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
57
+ /((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
58
+
59
+ // Applebot - http://apple.com/go/applebot
60
+ /(applebot(?:-extended)?)\/([\w\.]+)/i,
61
+
62
+ // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
63
+ /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
64
+
65
+ // ClaudeBot (Anthropic)
66
+ /(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i,
67
+
68
+ // Coc Coc Bot - https://help.coccoc.com/en/search-engine
69
+ /(coccocbot-(?:image|web))\/([\w\.]+)/i,
70
+
71
+ // Facebook / Meta
72
+ // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
73
+ /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
74
+
75
+ // Googlebot - http://www.google.com/bot.html
76
+ /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,
77
+
78
+ // Internet Archive (archive.org)
79
+ /(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
80
+
81
+ // Sogou Spider
82
+ /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
83
+
84
+ // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
85
+ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
86
+
87
+ // Yandex Bots - https://yandex.com/bots
88
+ /(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i,
89
+
90
+ // Yeti (Naver)
91
+ /(yeti)\/([\w\.]+)/i,
92
+
93
+ // aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
94
+ /((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
95
+ ],
96
+
97
+ [NAME, VERSION, [TYPE, CRAWLER]],
98
+
99
+ [
100
+ // Google Bots
101
+ /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
102
+
103
+ // AI2Bot - https://allenai.org/crawler
104
+ // Bytespider
105
+ // DataForSeoBot - https://dataforseo.com/dataforseo-bot
106
+ // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
107
+ // ImagesiftBot - https://imagesift.com/about
108
+ // Qihoo 360Spider
109
+ // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
110
+ // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
111
+ /\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
112
+ ],
113
+ [NAME, [TYPE, CRAWLER]]
114
+ ]
115
+ });
116
+
117
+ //////////////////
118
+ // EXTRA DEVICES
119
+ /////////////////
120
+
121
+ const ExtraDevices = Object.freeze({
122
+ device : [[
123
+ /(nook)[\w ]+build\/(\w+)/i, // Nook
124
+ /(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
125
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
126
+ /(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
127
+ /(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
128
+ /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
129
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
130
+
131
+ /(u304aa)/i // AT&T
132
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
133
+
134
+ /\bsie-(\w*)/i // Siemens
135
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
136
+
137
+ /\b(rct\w+) b/i // RCA Tablets
138
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
139
+
140
+ /\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
141
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
142
+
143
+ /\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
144
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
145
+
146
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
147
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
148
+
149
+ /\b(tm\d{3}\w+) b/i
150
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
151
+
152
+ /\b(k88) b/i // ZTE K Series Tablet
153
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
154
+
155
+ /\b(nx\d{3}j) b/i // ZTE Nubia
156
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
157
+
158
+ /\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
159
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
160
+
161
+ /\b(zur\d{3}) b/i // Swiss ZUR Tablet
162
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
163
+
164
+ /^((zeki)?tb.*\b) b/i // Zeki Tablets
165
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
166
+
167
+ /\b([yr]\d{2}) b/i,
168
+ /\b(?:dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
169
+ ], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [
170
+
171
+ /\b(ns-?\w{0,9}) b/i // Insignia Tablets
172
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
173
+
174
+ /\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
175
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
176
+
177
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
178
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
179
+
180
+ /\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
181
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
182
+
183
+ /\b(ph-1) /i // Essential PH-1
184
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
185
+
186
+ /\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
187
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
188
+
189
+ /\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
190
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
191
+
192
+ /\btu_(1491) b/i // Rotor Tablets
193
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]
194
+ ]
195
+ });
196
+
197
+ ///////////////
198
+ // EMAIL APPS
199
+ //////////////
200
+
201
+ const Emails = Object.freeze({
202
+ browser : [
203
+ [
204
+ // Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
205
+ /(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
206
+ ], [NAME, VERSION, [TYPE, EMAIL]]
207
+ ]
208
+ });
209
+
210
+ ///////////////////////
211
+ // ON-DEMAND SCRAPERS
212
+ //////////////////////
213
+
214
+ const Fetchers = Object.freeze({
215
+ browser : [
216
+ [
217
+ // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
218
+ // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
219
+ // DuckAssistBot - https://duckduckgo.com/duckassistbot/
220
+ // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
221
+ // Google Site Verifier / Meta / Yahoo! Japan
222
+ // Yandex Bots - https://yandex.com/bots
223
+ /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
224
+
225
+ // Bluesky
226
+ /(bluesky) cardyb\/([\w\.]+)/i,
227
+
228
+ // Slackbot - https://api.slack.com/robots
229
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
230
+
231
+ // WhatsApp
232
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i
233
+ ],
234
+ [NAME, VERSION, [TYPE, FETCHER]],
235
+
236
+ [
237
+ // Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
238
+ /(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
239
+ ],
240
+ [NAME, [TYPE, FETCHER]],
241
+ ]
242
+ });
243
+
244
+ ////////////////////
245
+ // IN-APP BROWSERS
246
+ ///////////////////
247
+
248
+ const InApps = Object.freeze({
249
+ browser : [
250
+ // Slack
251
+ [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
252
+
253
+ // Yahoo! Japan
254
+ [/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
255
+ ]
256
+ });
257
+
258
+ //////////////////////
259
+ // MEDIA PLAYER APPS
260
+ /////////////////////
261
+
262
+ const MediaPlayers = Object.freeze({
263
+ browser : [[
264
+ /(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
265
+ /(coremedia) v([\w\._]+)/i,
266
+ // Ares/Nexplayer/OSSProxy
267
+ /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
268
+ // Aqualung/Lyssna/BSPlayer/Clementine/MPD
269
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
270
+ // NSPlayer/PSP-InternetRadioPlayer/Videos
271
+ // Nero Home/Nero Scout/Nokia
272
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
273
+ // SoundTap/Totem/Stagefright/Streamium
274
+ // XBMC/gvfs/Xine/XMMS/irapp
275
+ /^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,
276
+ /(lg player|nexplayer) ([\d\.]+)/i,
277
+ /player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
278
+ /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
279
+ /(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
280
+ /(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
281
+ // MPlayer SVN
282
+ /(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
283
+ / (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
284
+ /(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
285
+ /(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
286
+ /^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
287
+ /com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
288
+ /(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
289
+ // Windows Media Server
290
+ /(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
291
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
292
+
293
+ /(flrp)\/([\w\.-]+)/i // Flip Player
294
+ ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
295
+ // FStream/NativeHost/QuerySeekSpider
296
+ // MPlayer (no other info)/Media Player Classic/Nero ShowTime
297
+ // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
298
+ // inlight radio / YourMuze
299
+ /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
300
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
301
+
302
+ /(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player
303
+ ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
304
+
305
+ /(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io
306
+ ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
307
+ ]
308
+ });
309
+
310
+ /////////////
311
+ // LIBRARIES
312
+ //////////////
313
+
314
+ const Libraries = Object.freeze({
315
+ browser : [
316
+ // 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
317
+ [
318
+ /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:urllib|requests)|scrapy)\/([\w\.]+)/i,
319
+ /(jsdom|(?<=\()java)\/([\w\.]+)/i
320
+ ], [NAME, VERSION, [TYPE, LIBRARY]]
321
+ ]
322
+ });
323
+
324
+ /////////////
325
+ // VEHICLES
326
+ ////////////
327
+
328
+ const Vehicles = Object.freeze({
329
+ device : [
330
+ [
331
+ /dilink.+(byd) auto/i, // BYD
332
+ ], [VENDOR], [
333
+
334
+ /(rivian) (r1t)/i, // Rivian
335
+ ], [VENDOR, MODEL], [
336
+
337
+ /vcc.+netfront/i, // Volvo
338
+ ], [[VENDOR, 'Volvo']]
339
+ ]
340
+ });
341
+
342
+ //////////
343
+ // BOTS
344
+ /////////
345
+
346
+ const Bots = Object.freeze({
347
+ browser : [
348
+ ...CLIs.browser,
349
+ ...Crawlers.browser,
350
+ ...Fetchers.browser,
351
+ ...Libraries.browser
352
+ ]
353
+ });
354
+
355
+ module.exports = {
356
+ Bots,
357
+ CLIs,
358
+ Crawlers,
359
+ ExtraDevices,
360
+ Emails,
361
+ Fetchers,
362
+ InApps,
363
+ Libraries,
364
+ MediaPlayers,
365
+ Vehicles
366
+ };