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,370 @@
1
+ // Generated ESM version of ua-parser-js/extensions
2
+ // DO NOT EDIT THIS FILE!
3
+ // Source: /src/extensions/ua-parser-extensions.js
4
+
5
+ ///////////////////////////////////////////////
6
+ /* Extensions for UAParser.js v2.0.2
7
+ https://github.com/faisalman/ua-parser-js
8
+ Author: Faisal Salman <f@faisalman.com>
9
+ AGPLv3 License */
10
+ //////////////////////////////////////////////
11
+
12
+ /*jshint esversion: 6 */
13
+
14
+ const MODEL = 'model';
15
+ const NAME = 'name';
16
+ const TYPE = 'type';
17
+ const VENDOR = 'vendor';
18
+ const VERSION = 'version';
19
+ const MOBILE = 'mobile';
20
+ const TABLET = 'tablet';
21
+ const CRAWLER = 'crawler';
22
+ const CLI = 'cli';
23
+ const EMAIL = 'email';
24
+ const FETCHER = 'fetcher';
25
+ const INAPP = 'inapp';
26
+ const MEDIAPLAYER = 'mediaplayer';
27
+ const LIBRARY = 'library';
28
+
29
+ //////////////////////
30
+ // COMMAND LINE APPS
31
+ /////////////////////
32
+
33
+ const CLIs = Object.freeze({
34
+ browser : [
35
+ // wget / curl / Lynx / ELinks / HTTPie
36
+ [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
37
+ ]
38
+ });
39
+
40
+ ////////////////////////
41
+ // CRAWLERS / SPIDERS
42
+ ///////////////////////
43
+
44
+ const Crawlers = Object.freeze({
45
+ browser : [
46
+ [
47
+ // AhrefsBot - https://ahrefs.com/robot
48
+ // Amazonbot - https://developer.amazon.com/amazonbot
49
+ // Bingbot - http://www.bing.com/bingbot.htm
50
+ // CCBot - https://commoncrawl.org/faq
51
+ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
52
+ // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
53
+ // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
54
+ // GPTBot - https://platform.openai.com/docs/gptbot
55
+ // MJ12bot - https://mj12bot.com/
56
+ // MojeekBot - https://www.mojeek.com/bot.html
57
+ // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
58
+ // PerplexityBot - https://perplexity.ai/perplexitybot
59
+ // SemrushBot - http://www.semrush.com/bot.html
60
+ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
61
+ /((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
62
+
63
+ // Applebot - http://apple.com/go/applebot
64
+ /(applebot(?:-extended)?)\/([\w\.]+)/i,
65
+
66
+ // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
67
+ /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
68
+
69
+ // ClaudeBot (Anthropic)
70
+ /(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i,
71
+
72
+ // Coc Coc Bot - https://help.coccoc.com/en/search-engine
73
+ /(coccocbot-(?:image|web))\/([\w\.]+)/i,
74
+
75
+ // Facebook / Meta
76
+ // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
77
+ /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
78
+
79
+ // Googlebot - http://www.google.com/bot.html
80
+ /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,
81
+
82
+ // Internet Archive (archive.org)
83
+ /(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
84
+
85
+ // Sogou Spider
86
+ /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
87
+
88
+ // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
89
+ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
90
+
91
+ // Yandex Bots - https://yandex.com/bots
92
+ /(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,
93
+
94
+ // Yeti (Naver)
95
+ /(yeti)\/([\w\.]+)/i,
96
+
97
+ // aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
98
+ /((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
99
+ ],
100
+
101
+ [NAME, VERSION, [TYPE, CRAWLER]],
102
+
103
+ [
104
+ // Google Bots
105
+ /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
106
+
107
+ // AI2Bot - https://allenai.org/crawler
108
+ // Bytespider
109
+ // DataForSeoBot - https://dataforseo.com/dataforseo-bot
110
+ // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
111
+ // ImagesiftBot - https://imagesift.com/about
112
+ // Qihoo 360Spider
113
+ // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
114
+ // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
115
+ /\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
116
+ ],
117
+ [NAME, [TYPE, CRAWLER]]
118
+ ]
119
+ });
120
+
121
+ //////////////////
122
+ // EXTRA DEVICES
123
+ /////////////////
124
+
125
+ const ExtraDevices = Object.freeze({
126
+ device : [[
127
+ /(nook)[\w ]+build\/(\w+)/i, // Nook
128
+ /(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
129
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
130
+ /(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
131
+ /(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
132
+ /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
133
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
134
+
135
+ /(u304aa)/i // AT&T
136
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
137
+
138
+ /\bsie-(\w*)/i // Siemens
139
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
140
+
141
+ /\b(rct\w+) b/i // RCA Tablets
142
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
143
+
144
+ /\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
145
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
146
+
147
+ /\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
148
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
149
+
150
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
151
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
152
+
153
+ /\b(tm\d{3}\w+) b/i
154
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
155
+
156
+ /\b(k88) b/i // ZTE K Series Tablet
157
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
158
+
159
+ /\b(nx\d{3}j) b/i // ZTE Nubia
160
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
161
+
162
+ /\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
163
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
164
+
165
+ /\b(zur\d{3}) b/i // Swiss ZUR Tablet
166
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
167
+
168
+ /^((zeki)?tb.*\b) b/i // Zeki Tablets
169
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
170
+
171
+ /\b([yr]\d{2}) b/i,
172
+ /\b(?:dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
173
+ ], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [
174
+
175
+ /\b(ns-?\w{0,9}) b/i // Insignia Tablets
176
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
177
+
178
+ /\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
179
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
180
+
181
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
182
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
183
+
184
+ /\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
185
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
186
+
187
+ /\b(ph-1) /i // Essential PH-1
188
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
189
+
190
+ /\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
191
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
192
+
193
+ /\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
194
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
195
+
196
+ /\btu_(1491) b/i // Rotor Tablets
197
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]
198
+ ]
199
+ });
200
+
201
+ ///////////////
202
+ // EMAIL APPS
203
+ //////////////
204
+
205
+ const Emails = Object.freeze({
206
+ browser : [
207
+ [
208
+ // Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
209
+ /(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
210
+ ], [NAME, VERSION, [TYPE, EMAIL]]
211
+ ]
212
+ });
213
+
214
+ ///////////////////////
215
+ // ON-DEMAND SCRAPERS
216
+ //////////////////////
217
+
218
+ const Fetchers = Object.freeze({
219
+ browser : [
220
+ [
221
+ // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
222
+ // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
223
+ // DuckAssistBot - https://duckduckgo.com/duckassistbot/
224
+ // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
225
+ // Google Site Verifier / Meta / Yahoo! Japan
226
+ // Yandex Bots - https://yandex.com/bots
227
+ /(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,
228
+
229
+ // Bluesky
230
+ /(bluesky) cardyb\/([\w\.]+)/i,
231
+
232
+ // Slackbot - https://api.slack.com/robots
233
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
234
+
235
+ // WhatsApp
236
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i
237
+ ],
238
+ [NAME, VERSION, [TYPE, FETCHER]],
239
+
240
+ [
241
+ // Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
242
+ /(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
243
+ ],
244
+ [NAME, [TYPE, FETCHER]],
245
+ ]
246
+ });
247
+
248
+ ////////////////////
249
+ // IN-APP BROWSERS
250
+ ///////////////////
251
+
252
+ const InApps = Object.freeze({
253
+ browser : [
254
+ // Slack
255
+ [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
256
+
257
+ // Yahoo! Japan
258
+ [/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
259
+ ]
260
+ });
261
+
262
+ //////////////////////
263
+ // MEDIA PLAYER APPS
264
+ /////////////////////
265
+
266
+ const MediaPlayers = Object.freeze({
267
+ browser : [[
268
+ /(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
269
+ /(coremedia) v([\w\._]+)/i,
270
+ // Ares/Nexplayer/OSSProxy
271
+ /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
272
+ // Aqualung/Lyssna/BSPlayer/Clementine/MPD
273
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
274
+ // NSPlayer/PSP-InternetRadioPlayer/Videos
275
+ // Nero Home/Nero Scout/Nokia
276
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
277
+ // SoundTap/Totem/Stagefright/Streamium
278
+ // XBMC/gvfs/Xine/XMMS/irapp
279
+ /^(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,
280
+ /(lg player|nexplayer) ([\d\.]+)/i,
281
+ /player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
282
+ /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
283
+ /(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
284
+ /(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
285
+ // MPlayer SVN
286
+ /(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
287
+ / (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
288
+ /(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
289
+ /(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
290
+ /^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
291
+ /com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
292
+ /(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
293
+ // Windows Media Server
294
+ /(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
295
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
296
+
297
+ /(flrp)\/([\w\.-]+)/i // Flip Player
298
+ ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
299
+ // FStream/NativeHost/QuerySeekSpider
300
+ // MPlayer (no other info)/Media Player Classic/Nero ShowTime
301
+ // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
302
+ // inlight radio / YourMuze
303
+ /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
304
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
305
+
306
+ /(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player
307
+ ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
308
+
309
+ /(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io
310
+ ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
311
+ ]
312
+ });
313
+
314
+ /////////////
315
+ // LIBRARIES
316
+ //////////////
317
+
318
+ const Libraries = Object.freeze({
319
+ browser : [
320
+ // 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
321
+ [
322
+ /^(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,
323
+ /(jsdom|(?<=\()java)\/([\w\.]+)/i
324
+ ], [NAME, VERSION, [TYPE, LIBRARY]]
325
+ ]
326
+ });
327
+
328
+ /////////////
329
+ // VEHICLES
330
+ ////////////
331
+
332
+ const Vehicles = Object.freeze({
333
+ device : [
334
+ [
335
+ /dilink.+(byd) auto/i, // BYD
336
+ ], [VENDOR], [
337
+
338
+ /(rivian) (r1t)/i, // Rivian
339
+ ], [VENDOR, MODEL], [
340
+
341
+ /vcc.+netfront/i, // Volvo
342
+ ], [[VENDOR, 'Volvo']]
343
+ ]
344
+ });
345
+
346
+ //////////
347
+ // BOTS
348
+ /////////
349
+
350
+ const Bots = Object.freeze({
351
+ browser : [
352
+ ...CLIs.browser,
353
+ ...Crawlers.browser,
354
+ ...Fetchers.browser,
355
+ ...Libraries.browser
356
+ ]
357
+ });
358
+
359
+ export {
360
+ Bots,
361
+ CLIs,
362
+ Crawlers,
363
+ ExtraDevices,
364
+ Emails,
365
+ Fetchers,
366
+ InApps,
367
+ Libraries,
368
+ MediaPlayers,
369
+ Vehicles
370
+ };
@@ -0,0 +1,27 @@
1
+ // Type definitions for Helpers submodule of UAParser.js v2.0.2
2
+ // Project: https://github.com/faisalman/ua-parser-js
3
+ // Definitions by: Faisal Salman <https://github.com/faisalman>
4
+
5
+ import type { IResult } from "../main/ua-parser";
6
+
7
+ declare function getDeviceVendor(model: string): string | undefined;
8
+ declare function isAppleSilicon(resultOrUA: IResult | string): boolean;
9
+ declare function isAIBot(resultOrUA: IResult | string): boolean;
10
+ declare function isBot(resultOrUA: IResult | string): boolean;
11
+ declare function isChromeFamily(resultOrUA: IResult | string): boolean;
12
+ declare function isElectron(): boolean;
13
+ declare function isFromEU(): boolean;
14
+ declare function isFrozenUA(ua: string): boolean;
15
+ declare function isStandalonePWA(): boolean;
16
+
17
+ export {
18
+ getDeviceVendor,
19
+ isAppleSilicon,
20
+ isAIBot,
21
+ isBot,
22
+ isChromeFamily,
23
+ isElectron,
24
+ isFromEU,
25
+ isFrozenUA,
26
+ isStandalonePWA
27
+ }
@@ -0,0 +1,137 @@
1
+ ///////////////////////////////////////////////
2
+ /* Helpers 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 { UAParser } = require('../main/ua-parser');
11
+ const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
12
+ const { Bots } = require('../extensions/ua-parser-extensions');
13
+ const { isFromEU } = require('detect-europe-js');
14
+ const { isFrozenUA } = require('ua-is-frozen');
15
+ const { isStandalonePWA } = require('is-standalone-pwa');
16
+
17
+ const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
18
+
19
+ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
20
+
21
+ const isAppleSilicon = (resultOrUA) => {
22
+ const res = toResult(resultOrUA);
23
+ if (res.os.is(OS.MACOS)) {
24
+ if (res.cpu.is(CPU.ARM)) {
25
+ return true;
26
+ }
27
+ if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
28
+ try {
29
+ const canvas = document.createElement('canvas');
30
+ const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
31
+ const debug = webgl.getExtension('WEBGL_debug_renderer_info');
32
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
33
+ if (renderer.match(/apple m\d/i)) {
34
+ return true;
35
+ }
36
+ } catch {
37
+ return false;
38
+ }
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+
44
+ const isAIBot = (resultOrUA) => [
45
+
46
+ // AI2
47
+ 'ai2bot',
48
+
49
+ // Amazon
50
+ 'amazonbot',
51
+
52
+ // Anthropic
53
+ 'anthropic-ai',
54
+ 'claude-web',
55
+ 'claudebot',
56
+
57
+ // Apple
58
+ 'applebot',
59
+ 'applebot-extended',
60
+
61
+ // ByteDance
62
+ 'bytespider',
63
+
64
+ // Common Crawl
65
+ 'ccbot',
66
+
67
+ // DataForSeo
68
+ 'dataforseobot',
69
+
70
+ // Diffbot
71
+ 'diffbot',
72
+
73
+ // Google
74
+ 'googleother',
75
+ 'googleother-image',
76
+ 'googleother-video',
77
+ 'google-extended',
78
+
79
+ // Hive AI
80
+ 'imagesiftbot',
81
+
82
+ // Huawei
83
+ 'petalbot',
84
+
85
+ // Meta
86
+ 'facebookbot',
87
+ 'meta-externalagent',
88
+
89
+ // OpenAI
90
+ 'gptbot',
91
+ 'oai-searchbot',
92
+
93
+ // Perplexity
94
+ 'perplexitybot',
95
+
96
+ // Timpi
97
+ 'timpibot',
98
+
99
+ // Velen.io
100
+ 'velenpublicwebcrawler',
101
+
102
+ // Webz.io
103
+ 'omgili',
104
+ 'omgilibot',
105
+ 'webzio-extended',
106
+
107
+ // You.com
108
+ 'youbot',
109
+
110
+ // Zyte
111
+ 'scrapy'
112
+
113
+ ].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase());
114
+
115
+ const isBot = (resultOrUA) => [
116
+ 'cli',
117
+ 'crawler',
118
+ 'fetcher',
119
+ 'library'
120
+ ].includes(toResult(resultOrUA, Bots).browser.type);
121
+
122
+ const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK);
123
+
124
+ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
125
+ / electron\//i.test(navigator?.userAgent)); // browser
126
+
127
+ module.exports = {
128
+ getDeviceVendor,
129
+ isAppleSilicon,
130
+ isAIBot,
131
+ isBot,
132
+ isChromeFamily,
133
+ isElectron,
134
+ isFromEU,
135
+ isFrozenUA,
136
+ isStandalonePWA
137
+ }
@@ -0,0 +1,141 @@
1
+ // Generated ESM version of ua-parser-js/helpers
2
+ // DO NOT EDIT THIS FILE!
3
+ // Source: /src/helpers/ua-parser-helpers.js
4
+
5
+ ///////////////////////////////////////////////
6
+ /* Helpers for UAParser.js v2.0.2
7
+ https://github.com/faisalman/ua-parser-js
8
+ Author: Faisal Salman <f@faisalman.com>
9
+ AGPLv3 License */
10
+ //////////////////////////////////////////////
11
+
12
+ /*jshint esversion: 6 */
13
+
14
+ import { UAParser } from '../main/ua-parser.mjs';
15
+ import { CPU, OS, Engine } from '../enums/ua-parser-enums.mjs';
16
+ import { Bots } from '../extensions/ua-parser-extensions.mjs';
17
+ import { isFromEU } from 'detect-europe-js';
18
+ import { isFrozenUA } from 'ua-is-frozen';
19
+ import { isStandalonePWA } from 'is-standalone-pwa';
20
+
21
+ const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
22
+
23
+ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
24
+
25
+ const isAppleSilicon = (resultOrUA) => {
26
+ const res = toResult(resultOrUA);
27
+ if (res.os.is(OS.MACOS)) {
28
+ if (res.cpu.is(CPU.ARM)) {
29
+ return true;
30
+ }
31
+ if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
32
+ try {
33
+ const canvas = document.createElement('canvas');
34
+ const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
35
+ const debug = webgl.getExtension('WEBGL_debug_renderer_info');
36
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
37
+ if (renderer.match(/apple m\d/i)) {
38
+ return true;
39
+ }
40
+ } catch {
41
+ return false;
42
+ }
43
+ }
44
+ }
45
+ return false;
46
+ }
47
+
48
+ const isAIBot = (resultOrUA) => [
49
+
50
+ // AI2
51
+ 'ai2bot',
52
+
53
+ // Amazon
54
+ 'amazonbot',
55
+
56
+ // Anthropic
57
+ 'anthropic-ai',
58
+ 'claude-web',
59
+ 'claudebot',
60
+
61
+ // Apple
62
+ 'applebot',
63
+ 'applebot-extended',
64
+
65
+ // ByteDance
66
+ 'bytespider',
67
+
68
+ // Common Crawl
69
+ 'ccbot',
70
+
71
+ // DataForSeo
72
+ 'dataforseobot',
73
+
74
+ // Diffbot
75
+ 'diffbot',
76
+
77
+ // Google
78
+ 'googleother',
79
+ 'googleother-image',
80
+ 'googleother-video',
81
+ 'google-extended',
82
+
83
+ // Hive AI
84
+ 'imagesiftbot',
85
+
86
+ // Huawei
87
+ 'petalbot',
88
+
89
+ // Meta
90
+ 'facebookbot',
91
+ 'meta-externalagent',
92
+
93
+ // OpenAI
94
+ 'gptbot',
95
+ 'oai-searchbot',
96
+
97
+ // Perplexity
98
+ 'perplexitybot',
99
+
100
+ // Timpi
101
+ 'timpibot',
102
+
103
+ // Velen.io
104
+ 'velenpublicwebcrawler',
105
+
106
+ // Webz.io
107
+ 'omgili',
108
+ 'omgilibot',
109
+ 'webzio-extended',
110
+
111
+ // You.com
112
+ 'youbot',
113
+
114
+ // Zyte
115
+ 'scrapy'
116
+
117
+ ].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase());
118
+
119
+ const isBot = (resultOrUA) => [
120
+ 'cli',
121
+ 'crawler',
122
+ 'fetcher',
123
+ 'library'
124
+ ].includes(toResult(resultOrUA, Bots).browser.type);
125
+
126
+ const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK);
127
+
128
+ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
129
+ / electron\//i.test(navigator?.userAgent)); // browser
130
+
131
+ export {
132
+ getDeviceVendor,
133
+ isAppleSilicon,
134
+ isAIBot,
135
+ isBot,
136
+ isChromeFamily,
137
+ isElectron,
138
+ isFromEU,
139
+ isFrozenUA,
140
+ isStandalonePWA
141
+ }