ua-parser-js 2.0.0-beta.2 → 2.0.0-rc.1

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 (198) hide show
  1. package/README.md +26 -22
  2. package/dist/icons/color/LICENSE.md +3 -0
  3. package/dist/icons/color/browser/android-browser.svg +1 -0
  4. package/dist/icons/color/browser/avant.png +0 -0
  5. package/dist/icons/color/browser/basilisk.png +0 -0
  6. package/dist/icons/color/browser/basilisk.svg +1 -0
  7. package/dist/icons/color/browser/brave.png +0 -0
  8. package/dist/icons/color/browser/brave.svg +1 -0
  9. package/dist/icons/color/browser/chrome.png +0 -0
  10. package/dist/icons/color/browser/chrome.svg +1 -0
  11. package/dist/icons/color/browser/chromium.png +0 -0
  12. package/dist/icons/color/browser/chromium.svg +1 -0
  13. package/dist/icons/color/browser/coc-coc.png +0 -0
  14. package/dist/icons/color/browser/default.png +0 -0
  15. package/dist/icons/color/browser/default.svg +1 -0
  16. package/dist/icons/color/browser/dolphin.png +0 -0
  17. package/dist/icons/color/browser/edge.png +0 -0
  18. package/dist/icons/color/browser/edge.svg +1 -0
  19. package/dist/icons/color/browser/electron.png +0 -0
  20. package/dist/icons/color/browser/electron.svg +1 -0
  21. package/dist/icons/color/browser/falkon.png +0 -0
  22. package/dist/icons/color/browser/falkon.svg +1 -0
  23. package/dist/icons/color/browser/firefox-reality.png +0 -0
  24. package/dist/icons/color/browser/firefox-reality.svg +1 -0
  25. package/dist/icons/color/browser/firefox.png +0 -0
  26. package/dist/icons/color/browser/firefox.svg +1 -0
  27. package/dist/icons/color/browser/gsa.svg +9 -0
  28. package/dist/icons/color/browser/icecat.png +0 -0
  29. package/dist/icons/color/browser/ie.svg +6 -0
  30. package/dist/icons/color/browser/konqueror.png +0 -0
  31. package/dist/icons/color/browser/konqueror.svg +1 -0
  32. package/dist/icons/color/browser/maxthon.png +0 -0
  33. package/dist/icons/color/browser/midori.png +0 -0
  34. package/dist/icons/color/browser/midori.svg +1 -0
  35. package/dist/icons/color/browser/netsurf.png +0 -0
  36. package/dist/icons/color/browser/netsurf.svg +1 -0
  37. package/dist/icons/color/browser/opera-gx.png +0 -0
  38. package/dist/icons/color/browser/opera-gx.svg +1 -0
  39. package/dist/icons/color/browser/opera-mini.png +0 -0
  40. package/dist/icons/color/browser/opera-touch.png +0 -0
  41. package/dist/icons/color/browser/opera.png +0 -0
  42. package/dist/icons/color/browser/opera.svg +1 -0
  43. package/dist/icons/color/browser/palemoon.png +0 -0
  44. package/dist/icons/color/browser/puffin.png +0 -0
  45. package/dist/icons/color/browser/safari.png +0 -0
  46. package/dist/icons/color/browser/safari.svg +1 -0
  47. package/dist/icons/color/browser/samsung-internet.png +0 -0
  48. package/dist/icons/color/browser/samsung-internet.svg +1 -0
  49. package/dist/icons/color/browser/seamonkey.png +0 -0
  50. package/dist/icons/color/browser/silk.png +0 -0
  51. package/dist/icons/color/browser/sogou-mobile.png +0 -0
  52. package/dist/icons/color/browser/ucbrowser.png +0 -0
  53. package/dist/icons/color/browser/ucbrowser.svg +1 -0
  54. package/dist/icons/color/browser/vivaldi.png +0 -0
  55. package/dist/icons/color/browser/vivaldi.svg +1 -0
  56. package/dist/icons/color/browser/webkit.png +0 -0
  57. package/dist/icons/color/browser/webkit.svg +1 -0
  58. package/dist/icons/color/browser/yandex.png +0 -0
  59. package/dist/icons/color/os/centos.svg +1 -0
  60. package/dist/icons/mono/LICENSE.md +3 -0
  61. package/dist/icons/mono/browser/alipay.svg +1 -0
  62. package/dist/icons/mono/browser/android-browser.svg +1 -0
  63. package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
  64. package/dist/icons/mono/browser/baidu-browser.svg +1 -0
  65. package/dist/icons/mono/browser/brave.svg +1 -0
  66. package/dist/icons/mono/browser/chrome-headless.svg +1 -0
  67. package/dist/icons/mono/browser/chrome-webview.svg +1 -0
  68. package/dist/icons/mono/browser/chrome.svg +1 -0
  69. package/dist/icons/mono/browser/chromium.svg +1 -0
  70. package/dist/icons/mono/browser/duckduckgo.svg +1 -0
  71. package/dist/icons/mono/browser/edge.svg +1 -0
  72. package/dist/icons/mono/browser/electron.svg +1 -0
  73. package/dist/icons/mono/browser/facebook.svg +1 -0
  74. package/dist/icons/mono/browser/firefox-focus.svg +1 -0
  75. package/dist/icons/mono/browser/firefox-reality.svg +1 -0
  76. package/dist/icons/mono/browser/firefox.svg +1 -0
  77. package/dist/icons/mono/browser/gsa.svg +1 -0
  78. package/dist/icons/mono/browser/huawei-browser.svg +1 -0
  79. package/dist/icons/mono/browser/icecat.svg +1 -0
  80. package/dist/icons/mono/browser/ie.svg +1 -0
  81. package/dist/icons/mono/browser/instagram.svg +1 -0
  82. package/dist/icons/mono/browser/jasmine.svg +1 -0
  83. package/dist/icons/mono/browser/kakaotalk.svg +1 -0
  84. package/dist/icons/mono/browser/klarna.svg +1 -0
  85. package/dist/icons/mono/browser/line.svg +1 -0
  86. package/dist/icons/mono/browser/linkedin.svg +1 -0
  87. package/dist/icons/mono/browser/miui-browser.svg +1 -0
  88. package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
  89. package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
  90. package/dist/icons/mono/browser/mobile-safari.svg +1 -0
  91. package/dist/icons/mono/browser/mozilla.svg +1 -0
  92. package/dist/icons/mono/browser/naver.svg +1 -0
  93. package/dist/icons/mono/browser/nokia-browser.svg +1 -0
  94. package/dist/icons/mono/browser/oculus-browser.svg +1 -0
  95. package/dist/icons/mono/browser/opera-coast.svg +1 -0
  96. package/dist/icons/mono/browser/opera-gx.svg +1 -0
  97. package/dist/icons/mono/browser/opera-mini.svg +1 -0
  98. package/dist/icons/mono/browser/opera-mobi.svg +1 -0
  99. package/dist/icons/mono/browser/opera-tablet.svg +1 -0
  100. package/dist/icons/mono/browser/opera-touch.svg +1 -0
  101. package/dist/icons/mono/browser/opera.svg +1 -0
  102. package/dist/icons/mono/browser/qqbrowser.svg +1 -0
  103. package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
  104. package/dist/icons/mono/browser/safari.svg +1 -0
  105. package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
  106. package/dist/icons/mono/browser/samsung-internet.svg +1 -0
  107. package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
  108. package/dist/icons/mono/browser/snapchat.svg +1 -0
  109. package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
  110. package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
  111. package/dist/icons/mono/browser/tesla.svg +1 -0
  112. package/dist/icons/mono/browser/tiktok.svg +1 -0
  113. package/dist/icons/mono/browser/twitter.svg +1 -0
  114. package/dist/icons/mono/browser/vivaldi.svg +1 -0
  115. package/dist/icons/mono/browser/vivo-browser.svg +1 -0
  116. package/dist/icons/mono/browser/wechat.svg +1 -0
  117. package/dist/icons/mono/browser/weibo.svg +1 -0
  118. package/dist/icons/mono/browser/yandex.svg +1 -0
  119. package/dist/icons/mono/device/acer.svg +1 -0
  120. package/dist/icons/mono/device/amazon.svg +1 -0
  121. package/dist/icons/mono/device/apple.svg +1 -0
  122. package/dist/icons/mono/device/asus.svg +1 -0
  123. package/dist/icons/mono/device/att.svg +1 -0
  124. package/dist/icons/mono/device/blackberry.svg +1 -0
  125. package/dist/icons/mono/device/dell.svg +1 -0
  126. package/dist/icons/mono/device/facebook.svg +1 -0
  127. package/dist/icons/mono/device/fairphone.svg +1 -0
  128. package/dist/icons/mono/device/google.svg +1 -0
  129. package/dist/icons/mono/device/hp.svg +1 -0
  130. package/dist/icons/mono/device/huawei.svg +1 -0
  131. package/dist/icons/mono/device/lenovo.svg +1 -0
  132. package/dist/icons/mono/device/lg.svg +1 -0
  133. package/dist/icons/mono/device/meizu.svg +1 -0
  134. package/dist/icons/mono/device/microsoft.svg +1 -0
  135. package/dist/icons/mono/device/motorola.svg +1 -0
  136. package/dist/icons/mono/device/nintendo.svg +1 -0
  137. package/dist/icons/mono/device/nokia.svg +1 -0
  138. package/dist/icons/mono/device/nvidia.svg +1 -0
  139. package/dist/icons/mono/device/oneplus.svg +1 -0
  140. package/dist/icons/mono/device/oppo.svg +1 -0
  141. package/dist/icons/mono/device/panasonic.svg +1 -0
  142. package/dist/icons/mono/device/roku.svg +1 -0
  143. package/dist/icons/mono/device/samsung.svg +1 -0
  144. package/dist/icons/mono/device/siemens.svg +1 -0
  145. package/dist/icons/mono/device/sony.svg +1 -0
  146. package/dist/icons/mono/device/tesla.svg +1 -0
  147. package/dist/icons/mono/device/vivo.svg +1 -0
  148. package/dist/icons/mono/device/vodafone.svg +1 -0
  149. package/dist/icons/mono/device/xiaomi.svg +1 -0
  150. package/dist/icons/mono/device/zebra.svg +1 -0
  151. package/dist/icons/mono/os/android.svg +1 -0
  152. package/dist/icons/mono/os/arch.svg +1 -0
  153. package/dist/icons/mono/os/blackberry.svg +1 -0
  154. package/dist/icons/mono/os/centos.svg +1 -0
  155. package/dist/icons/mono/os/chrome-os.svg +1 -0
  156. package/dist/icons/mono/os/chromecast.svg +1 -0
  157. package/dist/icons/mono/os/debian.svg +1 -0
  158. package/dist/icons/mono/os/deepin.svg +1 -0
  159. package/dist/icons/mono/os/elementary-os.svg +1 -0
  160. package/dist/icons/mono/os/fedora.svg +1 -0
  161. package/dist/icons/mono/os/firefox.svg +1 -0
  162. package/dist/icons/mono/os/freebsd.svg +1 -0
  163. package/dist/icons/mono/os/gentoo.svg +1 -0
  164. package/dist/icons/mono/os/gnu.svg +1 -0
  165. package/dist/icons/mono/os/harmonyos.svg +1 -0
  166. package/dist/icons/mono/os/ios.svg +1 -0
  167. package/dist/icons/mono/os/kaios.svg +1 -0
  168. package/dist/icons/mono/os/linux.svg +1 -0
  169. package/dist/icons/mono/os/macos.svg +1 -0
  170. package/dist/icons/mono/os/manjaro.svg +1 -0
  171. package/dist/icons/mono/os/mint.svg +1 -0
  172. package/dist/icons/mono/os/netbsd.svg +1 -0
  173. package/dist/icons/mono/os/nintendo.svg +1 -0
  174. package/dist/icons/mono/os/openbsd.svg +1 -0
  175. package/dist/icons/mono/os/playstation.svg +1 -0
  176. package/dist/icons/mono/os/raspbian.svg +1 -0
  177. package/dist/icons/mono/os/redhat.svg +1 -0
  178. package/dist/icons/mono/os/sailfish.svg +1 -0
  179. package/dist/icons/mono/os/slackware.svg +1 -0
  180. package/dist/icons/mono/os/suse.svg +1 -0
  181. package/dist/icons/mono/os/ubuntu.svg +1 -0
  182. package/dist/icons/mono/os/windows.svg +1 -0
  183. package/dist/icons/mono/os/xbox.svg +1 -0
  184. package/dist/ua-parser.min.js +3 -3
  185. package/dist/ua-parser.pack.js +3 -3
  186. package/package.json +11 -6
  187. package/script/cli.js +4 -0
  188. package/src/enums/ua-parser-enums.js +30 -9
  189. package/src/enums/ua-parser-enums.mjs +30 -9
  190. package/src/extensions/ua-parser-extensions.d.ts +4 -2
  191. package/src/extensions/ua-parser-extensions.js +169 -48
  192. package/src/extensions/ua-parser-extensions.mjs +169 -48
  193. package/src/helpers/ua-parser-helpers.d.ts +12 -4
  194. package/src/helpers/ua-parser-helpers.js +44 -5
  195. package/src/helpers/ua-parser-helpers.mjs +45 -6
  196. package/src/main/ua-parser.d.ts +7 -4
  197. package/src/main/ua-parser.js +121 -54
  198. package/src/main/ua-parser.mjs +121 -54
@@ -3,7 +3,7 @@
3
3
  // Source: /src/extensions/ua-parser-extensions.js
4
4
 
5
5
  ///////////////////////////////////////////////
6
- /* Extensions for UAParser.js v2.0.0-beta.2
6
+ /* Extensions for UAParser.js v2.0.0-rc.1
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -18,33 +18,80 @@ const VENDOR = 'vendor';
18
18
  const VERSION = 'version';
19
19
  const MOBILE = 'mobile';
20
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 MODULE = 'module';
28
+
29
+ //////////////////////
30
+ // COMMAND LINE APPS
31
+ /////////////////////
21
32
 
22
- const Apps = Object.freeze({
33
+ const CLIs = Object.freeze({
23
34
  browser : [
24
- [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, 'app']]
35
+ // wget / curl / lynx
36
+ [/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
25
37
  ]
26
38
  });
27
39
 
28
- const Bots = Object.freeze({
29
- browser : [
30
- // Googlebot / BingBot / MSNBot / FacebookBot
31
- [/((?:google|bing|msn|facebook)bot(?:[\-imagevdo]{0,6})|bingpreview)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']],
32
-
33
- // GPTBot - https://platform.openai.com/docs/gptbot
34
- [/(gptbot)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']],
40
+ ////////////////////////
41
+ // CRAWLERS / SPIDERS
42
+ ///////////////////////
35
43
 
36
- // Slackbot - https://api.slack.com/robots
37
- [/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']]
38
- ]
39
- });
40
-
41
- const CLIs = Object.freeze({
44
+ const Crawlers = Object.freeze({
42
45
  browser : [
43
- // wget / curl / lynx
44
- [/(wget|curl|lynx)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'cli']]
46
+ [
47
+ // AhrefsBot - https://ahrefs.com/robot
48
+ // Amazonbot - https://developer.amazon.com/amazonbot
49
+ // Applebot - http://apple.com/go/applebot
50
+ // Bingbot - http://www.bing.com/bingbot.htm
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
+ // OpenAI Search - https://platform.openai.com/docs/bots
57
+ // SemrushBot - http://www.semrush.com/bot.html
58
+ /((?:ahrefs|amazon|apple|bing|dot|duckduck|facebook|gpt|mj12|oai-search|semrush)bot)\/([\w\.]+)/i,
59
+
60
+ // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
61
+ /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
62
+
63
+ // ClaudeBot
64
+ /(claude(?:bot|-web))\/([\w\.]+)/i,
65
+
66
+ // Coc Coc Bot - https://help.coccoc.com/en/search-engine
67
+ /(coccocbot-(?:image|web))\/([\w\.]+)/i,
68
+
69
+ // Googlebot - http://www.google.com/bot.html
70
+ /(google(?:bot|other)(?:-image|-video|-news|-extended)?|(?:storebot-)?google(?:-inspectiontool)?)\/?([\w\.]*)/i,
71
+
72
+ // Sogou Spider
73
+ /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
74
+
75
+ // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
76
+ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
77
+
78
+ // Yandex Bots - https://yandex.com/bots
79
+ /(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
80
+ ],
81
+
82
+ [NAME, VERSION, [TYPE, CRAWLER]],
83
+
84
+ // Bytespider
85
+ // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
86
+ [/((?:bytespider|(?=yahoo! )slurp))/i],
87
+ [NAME, [TYPE, CRAWLER]]
45
88
  ]
46
89
  });
47
90
 
91
+ //////////////////
92
+ // EXTRA DEVICES
93
+ /////////////////
94
+
48
95
  const ExtraDevices = Object.freeze({
49
96
  device : [[
50
97
  /(nook)[\w ]+build\/(\w+)/i, // Nook
@@ -121,25 +168,80 @@ const ExtraDevices = Object.freeze({
121
168
  ]
122
169
  });
123
170
 
171
+ ///////////////
172
+ // EMAIL APPS
173
+ //////////////
174
+
124
175
  const Emails = Object.freeze({
125
176
  browser : [
126
- // Microsoft Outlook / Thunderbird
127
- [/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, 'email']]
177
+ // Microsoft Outlook / Thunderbird
178
+ [/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
179
+ ]
180
+ });
181
+
182
+ ///////////////////////
183
+ // ON-DEMAND SCRAPERS
184
+ //////////////////////
185
+
186
+ const Fetchers = Object.freeze({
187
+ browser : [
188
+ [
189
+ // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
190
+ // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
191
+ // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
192
+ /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
193
+
194
+ // Slackbot - https://api.slack.com/robots
195
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
196
+
197
+ // WhatsApp
198
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
199
+
200
+ // Yahoo! Japan
201
+ /(y!?j-dlc)\/([\w\.]+)/i,
202
+
203
+ // Yandex Bots - https://yandex.com/bots
204
+ /(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
205
+ /(yandex(?:sitelinks|userproxy))/i
206
+ ],
207
+ [NAME, VERSION, [TYPE, FETCHER]],
208
+
209
+ // Google Bots / Snapchat
210
+ [/(feedfetcher-google|google-read-aloud|(?=bot; )snapchat)/i],
211
+ [NAME, [TYPE, FETCHER]],
128
212
  ]
129
213
  });
130
214
 
215
+ ////////////////////
216
+ // IN-APP BROWSERS
217
+ ///////////////////
218
+
219
+ const InApps = Object.freeze({
220
+ browser : [
221
+ // Slack
222
+ [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
223
+
224
+ // Yahoo! Japan
225
+ [/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
226
+ ]
227
+ });
228
+
229
+ //////////////////////
230
+ // MEDIA PLAYER APPS
231
+ /////////////////////
232
+
131
233
  const MediaPlayers = Object.freeze({
132
234
  browser : [[
133
235
 
134
236
  /(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
135
237
  /(coremedia) v([\w\._]+)/i
136
- ], [NAME, VERSION], [
238
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
137
239
 
138
240
  /(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
139
- ], [NAME, VERSION], [
241
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
140
242
 
141
243
  /(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
142
- ], [NAME, VERSION], [
244
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
143
245
 
144
246
  /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
145
247
  // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
@@ -147,106 +249,125 @@ const MediaPlayers = Object.freeze({
147
249
  /(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
148
250
  /(lg player|nexplayer)\s([\d\.]+)/i,
149
251
  /player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
150
- ], [NAME, VERSION], [
252
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
151
253
  /(nexplayer)\s([\w\.-]+)/i // Nexplayer
152
- ], [NAME, VERSION], [
254
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
153
255
 
154
256
  /(flrp)\/([\w\.-]+)/i // Flip Player
155
- ], [[NAME, 'Flip Player'], VERSION], [
257
+ ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
156
258
 
157
259
  /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
158
260
  // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
159
- ], [NAME], [
261
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
160
262
 
161
263
  /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
162
264
  // Gstreamer
163
- ], [NAME, VERSION], [
265
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
164
266
 
165
267
  /(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
166
268
  /(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
167
269
  // Java/urllib/requests/wget/cURL
168
270
  /(lavf)([\d\.]+)/i // Lavf (FFMPEG)
169
- ], [NAME, VERSION], [
271
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
170
272
 
171
273
  /(htc_one_s)\/([\d\.]+)/i, // HTC One S
172
- ], [[NAME, /_/g, ' '], VERSION], [
274
+ ], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
173
275
 
174
276
  /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
175
277
  // MPlayer SVN
176
- ], [NAME, VERSION], [
278
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
177
279
 
178
280
  /(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
179
281
  /(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
180
- ], [NAME, VERSION], [
282
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
181
283
 
182
284
  /(mplayer)/i, // MPlayer (no other info)
183
285
  /(yourmuze)/i, // YourMuze
184
286
  /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
185
- ], [NAME], [
287
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
186
288
 
187
289
  /(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
188
- ], [NAME, VERSION], [
290
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
189
291
 
190
292
  /(nokia\d+)\/([\w\.-]+)/i // Nokia
191
- ], [NAME, VERSION], [
293
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
192
294
 
193
295
  /\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
194
- ], [NAME, VERSION], [
296
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
195
297
 
196
298
  /(winamp)3 version ([\w\.-]+)/i, // Winamp
197
299
  /(winamp)\s([\w\.-]+)/i,
198
300
  /(winamp)mpeg\/([\w\.-]+)/i
199
- ], [NAME, VERSION], [
301
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
200
302
 
201
303
  /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
202
304
  // inlight radio
203
- ], [NAME], [
305
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
204
306
 
205
307
  /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
206
308
  // QuickTime/RealMedia/RadioApp/RadioClientApplication/
207
309
  // SoundTap/Totem/Stagefright/Streamium
208
- ], [NAME, VERSION], [
310
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
209
311
 
210
312
  /(smp)([\d\.]+)/i // SMP
211
- ], [NAME, VERSION], [
313
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
212
314
 
213
315
  /(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
214
316
  /(vlc)\/([\w\.-]+)/i,
215
317
  /(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
216
318
  /(foobar2000)\/([\d\.]+)/i, // Foobar2000
217
319
  /(itunes)\/([\d\.]+)/i // iTunes
218
- ], [NAME, VERSION], [
320
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
219
321
 
220
322
  /(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
221
323
  /(windows-media-player)\/([\w\.-]+)/i
222
- ], [[NAME, /-/g, ' '], VERSION], [
324
+ ], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
223
325
 
224
326
  /windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
225
327
  // Windows Media Server
226
- ], [VERSION, [NAME, 'Windows']], [
328
+ ], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
227
329
 
228
330
  /(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
229
- ], [NAME, VERSION], [
331
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
230
332
 
231
333
  /(rad.io)\s([\d\.]+)/i, // Rad.io
232
334
  /(radio.(?:de|at|fr))\s([\d\.]+)/i
233
- ], [[NAME, 'rad.io'], VERSION]
335
+ ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
234
336
  ]
235
337
  });
236
338
 
339
+ ////////////////////////
340
+ // MODULES / LIBRARIES
341
+ ///////////////////////
342
+
237
343
  const Modules = Object.freeze({
238
344
  browser : [
239
- // Axios/jsdom/Scrapy
240
- [/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'module']]
345
+ // Axios/jsdom/Scrapy
346
+ [/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, MODULE]]
347
+ ]
348
+ });
349
+
350
+ //////////
351
+ // BOTS
352
+ /////////
353
+
354
+ const Bots = Object.freeze({
355
+ browser : [
356
+ ...CLIs.browser,
357
+ ...Crawlers.browser,
358
+ ...Fetchers.browser,
359
+ ...Modules.browser
241
360
  ]
242
361
  });
243
362
 
244
363
  export {
245
- Apps,
246
364
  Bots,
247
365
  CLIs,
366
+ Crawlers,
248
367
  ExtraDevices,
249
368
  Emails,
369
+ Fetchers,
370
+ InApps,
250
371
  MediaPlayers,
251
372
  Modules
252
373
  };
@@ -1,15 +1,23 @@
1
- // Type definitions for Helpers submodule of UAParser.js v2.0.0-beta.2
1
+ // Type definitions for Helpers submodule of UAParser.js v2.0.0-beta.3
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 { IResult } from "../main/ua-parser";
6
6
 
7
+ declare function getDeviceVendor(model: string): string | undefined;
7
8
  declare function isAppleSilicon(res: IResult): boolean;
8
- declare function isChromiumBased(res: IResult): boolean;
9
+ declare function isChromeFamily(res: IResult): boolean;
10
+ declare function isElectron(): boolean;
11
+ declare function isFromEU(): boolean;
9
12
  declare function isFrozenUA(ua: string): boolean;
13
+ declare function isStandalonePWA(): boolean;
10
14
 
11
15
  export {
16
+ getDeviceVendor,
12
17
  isAppleSilicon,
13
- isChromiumBased,
14
- isFrozenUA
18
+ isChromeFamily,
19
+ isElectron,
20
+ isFromEU,
21
+ isFrozenUA,
22
+ isStandalonePWA
15
23
  }
@@ -1,5 +1,5 @@
1
1
  ///////////////////////////////////////////////
2
- /* Helpers for UAParser.js v2.0.0-beta.2
2
+ /* Helpers for UAParser.js v2.0.0-rc.1
3
3
  https://github.com/faisalman/ua-parser-js
4
4
  Author: Faisal Salman <f@faisalman.com>
5
5
  AGPLv3 License */
@@ -8,15 +8,54 @@
8
8
  /*jshint esversion: 6 */
9
9
 
10
10
  const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
11
+ const { UAParser } = require('../main/ua-parser');
12
+ const { isFromEU } = require('detect-europe-js');
11
13
 
12
- const isAppleSilicon = (res) => res.os.is(OS.MACOS) && res.cpu.is(CPU.ARM);
14
+ 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;
13
15
 
14
- const isChromiumBased = (res) => res.engine.is(Engine.BLINK);
16
+ const isAppleSilicon = (res) => {
17
+ if (res.os.is(OS.MACOS)) {
18
+ if (res.cpu.is(CPU.ARM)) {
19
+ return true;
20
+ }
21
+ try {
22
+ const canvas = document.createElement('canvas');
23
+ const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
24
+ const debug = webgl.getExtension('WEBGL_debug_renderer_info');
25
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
26
+ if (renderer.match(/apple m\d/i)) {
27
+ return true;
28
+ }
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+ return false;
34
+ }
35
+
36
+ const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
37
+
38
+ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
39
+ / electron\//i.test(navigator?.userAgent)); // browser
15
40
 
16
41
  const isFrozenUA = (ua) => /^Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/.test(ua);
17
42
 
43
+ const isStandalonePWA = () => window && (window.matchMedia('(display-mode: standalone)').matches ||
44
+ // iOS
45
+ navigator.standalone ||
46
+ // Android
47
+ document.referrer.startsWith('android-app://') ||
48
+ // Windows
49
+ window.Windows ||
50
+ /trident.+(msapphost|webview)\//i.test(navigator.userAgent) ||
51
+ document.referrer.startsWith('app-info://platform/microsoft-store'));
52
+
18
53
  module.exports = {
54
+ getDeviceVendor,
19
55
  isAppleSilicon,
20
- isChromiumBased,
21
- isFrozenUA
56
+ isChromeFamily,
57
+ isElectron,
58
+ isFromEU,
59
+ isFrozenUA,
60
+ isStandalonePWA
22
61
  }
@@ -3,7 +3,7 @@
3
3
  // Source: /src/helpers/ua-parser-helpers.js
4
4
 
5
5
  ///////////////////////////////////////////////
6
- /* Helpers for UAParser.js v2.0.0-beta.2
6
+ /* Helpers for UAParser.js v2.0.0-rc.1
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -11,16 +11,55 @@
11
11
 
12
12
  /*jshint esversion: 6 */
13
13
 
14
- import { CPU, OS, Engine } from '../enums/ua-parser-enums';
14
+ import { CPU, OS, Engine } from './enums/ua-parser-enums.mjs';
15
+ import { UAParser } from './main/ua-parser.mjs';
16
+ import { isFromEU } from 'detect-europe-js';
15
17
 
16
- const isAppleSilicon = (res) => res.os.is(OS.MACOS) && res.cpu.is(CPU.ARM);
18
+ 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;
17
19
 
18
- const isChromiumBased = (res) => res.engine.is(Engine.BLINK);
20
+ const isAppleSilicon = (res) => {
21
+ if (res.os.is(OS.MACOS)) {
22
+ if (res.cpu.is(CPU.ARM)) {
23
+ return true;
24
+ }
25
+ try {
26
+ const canvas = document.createElement('canvas');
27
+ const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
28
+ const debug = webgl.getExtension('WEBGL_debug_renderer_info');
29
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
30
+ if (renderer.match(/apple m\d/i)) {
31
+ return true;
32
+ }
33
+ } catch {
34
+ return false;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+
40
+ const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
41
+
42
+ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
43
+ / electron\//i.test(navigator?.userAgent)); // browser
19
44
 
20
45
  const isFrozenUA = (ua) => /^Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/.test(ua);
21
46
 
47
+ const isStandalonePWA = () => window && (window.matchMedia('(display-mode: standalone)').matches ||
48
+ // iOS
49
+ navigator.standalone ||
50
+ // Android
51
+ document.referrer.startsWith('android-app://') ||
52
+ // Windows
53
+ window.Windows ||
54
+ /trident.+(msapphost|webview)\//i.test(navigator.userAgent) ||
55
+ document.referrer.startsWith('app-info://platform/microsoft-store'));
56
+
22
57
  export {
58
+ getDeviceVendor,
23
59
  isAppleSilicon,
24
- isChromiumBased,
25
- isFrozenUA
60
+ isChromeFamily,
61
+ isElectron,
62
+ isFromEU,
63
+ isFrozenUA,
64
+ isStandalonePWA
26
65
  }
@@ -1,4 +1,4 @@
1
- // Type definitions for UAParser.js v2.0.0-beta.2
1
+ // Type definitions for UAParser.js v2.0.0-beta.3
2
2
  // Project: https://github.com/faisalman/ua-parser-js
3
3
  // Definitions by: Faisal Salman <https://github.com/faisalman>
4
4
 
@@ -8,13 +8,14 @@ declare namespace UAParser {
8
8
  is(val: string): boolean;
9
9
  toString(): string;
10
10
  withClientHints(): PromiseLike<T> | T;
11
- withFeatureCheck(): T;
11
+ withFeatureCheck(): PromiseLike<T> | T;
12
12
  }
13
13
 
14
14
  interface IBrowser extends IData<IBrowser> {
15
15
  name?: string;
16
16
  version?: string;
17
17
  major?: string;
18
+ type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'mediaplayer' | 'module';
18
19
  }
19
20
 
20
21
  interface ICPU extends IData<ICPU> {
@@ -22,7 +23,7 @@ declare namespace UAParser {
22
23
  }
23
24
 
24
25
  interface IDevice extends IData<IDevice> {
25
- type?: 'mobile' | 'tablet' | 'console' | 'smarttv' | 'wearable';
26
+ type?: 'mobile' | 'tablet' | 'console' | 'smarttv' | 'wearable' | 'xr' | 'embedded';
26
27
  vendor?: string;
27
28
  model?: string;
28
29
  }
@@ -48,7 +49,7 @@ declare namespace UAParser {
48
49
 
49
50
  type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[];
50
51
  type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os';
51
- type UAParserExt = Partial<Record<UAParserProps, RegexMap>>;
52
+ type UAParserExt = Partial<Record<UAParserProps, RegexMap>> | Partial<Record<UAParserProps, RegexMap>>[];
52
53
 
53
54
  export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: Record<string, string>): IResult;
54
55
  export function UAParser(uastring?: string, headers?: Record<string, string>): IResult;
@@ -61,6 +62,7 @@ declare namespace UAParser {
61
62
  NAME: 'name';
62
63
  VERSION: 'version';
63
64
  MAJOR: 'major';
65
+ TYPE: 'type';
64
66
  };
65
67
  static readonly CPU: {
66
68
  ARCHITECTURE: 'architecture';
@@ -74,6 +76,7 @@ declare namespace UAParser {
74
76
  SMARTTV: 'smarttv';
75
77
  TABLET: 'tablet';
76
78
  WEARABLE: 'wearable';
79
+ XR: 'xr';
77
80
  EMBEDDED: 'embedded';
78
81
  };
79
82
  static readonly ENGINE: {