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.
- package/README.md +26 -22
- package/dist/icons/color/LICENSE.md +3 -0
- package/dist/icons/color/browser/android-browser.svg +1 -0
- package/dist/icons/color/browser/avant.png +0 -0
- package/dist/icons/color/browser/basilisk.png +0 -0
- package/dist/icons/color/browser/basilisk.svg +1 -0
- package/dist/icons/color/browser/brave.png +0 -0
- package/dist/icons/color/browser/brave.svg +1 -0
- package/dist/icons/color/browser/chrome.png +0 -0
- package/dist/icons/color/browser/chrome.svg +1 -0
- package/dist/icons/color/browser/chromium.png +0 -0
- package/dist/icons/color/browser/chromium.svg +1 -0
- package/dist/icons/color/browser/coc-coc.png +0 -0
- package/dist/icons/color/browser/default.png +0 -0
- package/dist/icons/color/browser/default.svg +1 -0
- package/dist/icons/color/browser/dolphin.png +0 -0
- package/dist/icons/color/browser/edge.png +0 -0
- package/dist/icons/color/browser/edge.svg +1 -0
- package/dist/icons/color/browser/electron.png +0 -0
- package/dist/icons/color/browser/electron.svg +1 -0
- package/dist/icons/color/browser/falkon.png +0 -0
- package/dist/icons/color/browser/falkon.svg +1 -0
- package/dist/icons/color/browser/firefox-reality.png +0 -0
- package/dist/icons/color/browser/firefox-reality.svg +1 -0
- package/dist/icons/color/browser/firefox.png +0 -0
- package/dist/icons/color/browser/firefox.svg +1 -0
- package/dist/icons/color/browser/gsa.svg +9 -0
- package/dist/icons/color/browser/icecat.png +0 -0
- package/dist/icons/color/browser/ie.svg +6 -0
- package/dist/icons/color/browser/konqueror.png +0 -0
- package/dist/icons/color/browser/konqueror.svg +1 -0
- package/dist/icons/color/browser/maxthon.png +0 -0
- package/dist/icons/color/browser/midori.png +0 -0
- package/dist/icons/color/browser/midori.svg +1 -0
- package/dist/icons/color/browser/netsurf.png +0 -0
- package/dist/icons/color/browser/netsurf.svg +1 -0
- package/dist/icons/color/browser/opera-gx.png +0 -0
- package/dist/icons/color/browser/opera-gx.svg +1 -0
- package/dist/icons/color/browser/opera-mini.png +0 -0
- package/dist/icons/color/browser/opera-touch.png +0 -0
- package/dist/icons/color/browser/opera.png +0 -0
- package/dist/icons/color/browser/opera.svg +1 -0
- package/dist/icons/color/browser/palemoon.png +0 -0
- package/dist/icons/color/browser/puffin.png +0 -0
- package/dist/icons/color/browser/safari.png +0 -0
- package/dist/icons/color/browser/safari.svg +1 -0
- package/dist/icons/color/browser/samsung-internet.png +0 -0
- package/dist/icons/color/browser/samsung-internet.svg +1 -0
- package/dist/icons/color/browser/seamonkey.png +0 -0
- package/dist/icons/color/browser/silk.png +0 -0
- package/dist/icons/color/browser/sogou-mobile.png +0 -0
- package/dist/icons/color/browser/ucbrowser.png +0 -0
- package/dist/icons/color/browser/ucbrowser.svg +1 -0
- package/dist/icons/color/browser/vivaldi.png +0 -0
- package/dist/icons/color/browser/vivaldi.svg +1 -0
- package/dist/icons/color/browser/webkit.png +0 -0
- package/dist/icons/color/browser/webkit.svg +1 -0
- package/dist/icons/color/browser/yandex.png +0 -0
- package/dist/icons/color/os/centos.svg +1 -0
- package/dist/icons/mono/LICENSE.md +3 -0
- package/dist/icons/mono/browser/alipay.svg +1 -0
- package/dist/icons/mono/browser/android-browser.svg +1 -0
- package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
- package/dist/icons/mono/browser/baidu-browser.svg +1 -0
- package/dist/icons/mono/browser/brave.svg +1 -0
- package/dist/icons/mono/browser/chrome-headless.svg +1 -0
- package/dist/icons/mono/browser/chrome-webview.svg +1 -0
- package/dist/icons/mono/browser/chrome.svg +1 -0
- package/dist/icons/mono/browser/chromium.svg +1 -0
- package/dist/icons/mono/browser/duckduckgo.svg +1 -0
- package/dist/icons/mono/browser/edge.svg +1 -0
- package/dist/icons/mono/browser/electron.svg +1 -0
- package/dist/icons/mono/browser/facebook.svg +1 -0
- package/dist/icons/mono/browser/firefox-focus.svg +1 -0
- package/dist/icons/mono/browser/firefox-reality.svg +1 -0
- package/dist/icons/mono/browser/firefox.svg +1 -0
- package/dist/icons/mono/browser/gsa.svg +1 -0
- package/dist/icons/mono/browser/huawei-browser.svg +1 -0
- package/dist/icons/mono/browser/icecat.svg +1 -0
- package/dist/icons/mono/browser/ie.svg +1 -0
- package/dist/icons/mono/browser/instagram.svg +1 -0
- package/dist/icons/mono/browser/jasmine.svg +1 -0
- package/dist/icons/mono/browser/kakaotalk.svg +1 -0
- package/dist/icons/mono/browser/klarna.svg +1 -0
- package/dist/icons/mono/browser/line.svg +1 -0
- package/dist/icons/mono/browser/linkedin.svg +1 -0
- package/dist/icons/mono/browser/miui-browser.svg +1 -0
- package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
- package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
- package/dist/icons/mono/browser/mobile-safari.svg +1 -0
- package/dist/icons/mono/browser/mozilla.svg +1 -0
- package/dist/icons/mono/browser/naver.svg +1 -0
- package/dist/icons/mono/browser/nokia-browser.svg +1 -0
- package/dist/icons/mono/browser/oculus-browser.svg +1 -0
- package/dist/icons/mono/browser/opera-coast.svg +1 -0
- package/dist/icons/mono/browser/opera-gx.svg +1 -0
- package/dist/icons/mono/browser/opera-mini.svg +1 -0
- package/dist/icons/mono/browser/opera-mobi.svg +1 -0
- package/dist/icons/mono/browser/opera-tablet.svg +1 -0
- package/dist/icons/mono/browser/opera-touch.svg +1 -0
- package/dist/icons/mono/browser/opera.svg +1 -0
- package/dist/icons/mono/browser/qqbrowser.svg +1 -0
- package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
- package/dist/icons/mono/browser/safari.svg +1 -0
- package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
- package/dist/icons/mono/browser/samsung-internet.svg +1 -0
- package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
- package/dist/icons/mono/browser/snapchat.svg +1 -0
- package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
- package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
- package/dist/icons/mono/browser/tesla.svg +1 -0
- package/dist/icons/mono/browser/tiktok.svg +1 -0
- package/dist/icons/mono/browser/twitter.svg +1 -0
- package/dist/icons/mono/browser/vivaldi.svg +1 -0
- package/dist/icons/mono/browser/vivo-browser.svg +1 -0
- package/dist/icons/mono/browser/wechat.svg +1 -0
- package/dist/icons/mono/browser/weibo.svg +1 -0
- package/dist/icons/mono/browser/yandex.svg +1 -0
- package/dist/icons/mono/device/acer.svg +1 -0
- package/dist/icons/mono/device/amazon.svg +1 -0
- package/dist/icons/mono/device/apple.svg +1 -0
- package/dist/icons/mono/device/asus.svg +1 -0
- package/dist/icons/mono/device/att.svg +1 -0
- package/dist/icons/mono/device/blackberry.svg +1 -0
- package/dist/icons/mono/device/dell.svg +1 -0
- package/dist/icons/mono/device/facebook.svg +1 -0
- package/dist/icons/mono/device/fairphone.svg +1 -0
- package/dist/icons/mono/device/google.svg +1 -0
- package/dist/icons/mono/device/hp.svg +1 -0
- package/dist/icons/mono/device/huawei.svg +1 -0
- package/dist/icons/mono/device/lenovo.svg +1 -0
- package/dist/icons/mono/device/lg.svg +1 -0
- package/dist/icons/mono/device/meizu.svg +1 -0
- package/dist/icons/mono/device/microsoft.svg +1 -0
- package/dist/icons/mono/device/motorola.svg +1 -0
- package/dist/icons/mono/device/nintendo.svg +1 -0
- package/dist/icons/mono/device/nokia.svg +1 -0
- package/dist/icons/mono/device/nvidia.svg +1 -0
- package/dist/icons/mono/device/oneplus.svg +1 -0
- package/dist/icons/mono/device/oppo.svg +1 -0
- package/dist/icons/mono/device/panasonic.svg +1 -0
- package/dist/icons/mono/device/roku.svg +1 -0
- package/dist/icons/mono/device/samsung.svg +1 -0
- package/dist/icons/mono/device/siemens.svg +1 -0
- package/dist/icons/mono/device/sony.svg +1 -0
- package/dist/icons/mono/device/tesla.svg +1 -0
- package/dist/icons/mono/device/vivo.svg +1 -0
- package/dist/icons/mono/device/vodafone.svg +1 -0
- package/dist/icons/mono/device/xiaomi.svg +1 -0
- package/dist/icons/mono/device/zebra.svg +1 -0
- package/dist/icons/mono/os/android.svg +1 -0
- package/dist/icons/mono/os/arch.svg +1 -0
- package/dist/icons/mono/os/blackberry.svg +1 -0
- package/dist/icons/mono/os/centos.svg +1 -0
- package/dist/icons/mono/os/chrome-os.svg +1 -0
- package/dist/icons/mono/os/chromecast.svg +1 -0
- package/dist/icons/mono/os/debian.svg +1 -0
- package/dist/icons/mono/os/deepin.svg +1 -0
- package/dist/icons/mono/os/elementary-os.svg +1 -0
- package/dist/icons/mono/os/fedora.svg +1 -0
- package/dist/icons/mono/os/firefox.svg +1 -0
- package/dist/icons/mono/os/freebsd.svg +1 -0
- package/dist/icons/mono/os/gentoo.svg +1 -0
- package/dist/icons/mono/os/gnu.svg +1 -0
- package/dist/icons/mono/os/harmonyos.svg +1 -0
- package/dist/icons/mono/os/ios.svg +1 -0
- package/dist/icons/mono/os/kaios.svg +1 -0
- package/dist/icons/mono/os/linux.svg +1 -0
- package/dist/icons/mono/os/macos.svg +1 -0
- package/dist/icons/mono/os/manjaro.svg +1 -0
- package/dist/icons/mono/os/mint.svg +1 -0
- package/dist/icons/mono/os/netbsd.svg +1 -0
- package/dist/icons/mono/os/nintendo.svg +1 -0
- package/dist/icons/mono/os/openbsd.svg +1 -0
- package/dist/icons/mono/os/playstation.svg +1 -0
- package/dist/icons/mono/os/raspbian.svg +1 -0
- package/dist/icons/mono/os/redhat.svg +1 -0
- package/dist/icons/mono/os/sailfish.svg +1 -0
- package/dist/icons/mono/os/slackware.svg +1 -0
- package/dist/icons/mono/os/suse.svg +1 -0
- package/dist/icons/mono/os/ubuntu.svg +1 -0
- package/dist/icons/mono/os/windows.svg +1 -0
- package/dist/icons/mono/os/xbox.svg +1 -0
- package/dist/ua-parser.min.js +3 -3
- package/dist/ua-parser.pack.js +3 -3
- package/package.json +11 -6
- package/script/cli.js +4 -0
- package/src/enums/ua-parser-enums.js +30 -9
- package/src/enums/ua-parser-enums.mjs +30 -9
- package/src/extensions/ua-parser-extensions.d.ts +4 -2
- package/src/extensions/ua-parser-extensions.js +169 -48
- package/src/extensions/ua-parser-extensions.mjs +169 -48
- package/src/helpers/ua-parser-helpers.d.ts +12 -4
- package/src/helpers/ua-parser-helpers.js +44 -5
- package/src/helpers/ua-parser-helpers.mjs +45 -6
- package/src/main/ua-parser.d.ts +7 -4
- package/src/main/ua-parser.js +121 -54
- 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-
|
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
|
33
|
+
const CLIs = Object.freeze({
|
23
34
|
browser : [
|
24
|
-
|
35
|
+
// wget / curl / lynx
|
36
|
+
[/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
25
37
|
]
|
26
38
|
});
|
27
39
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
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
|
-
|
44
|
-
|
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
|
-
|
127
|
-
[/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE,
|
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
|
-
|
240
|
-
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE,
|
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.
|
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
|
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
|
-
|
14
|
-
|
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-
|
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
|
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
|
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
|
-
|
21
|
-
|
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-
|
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 '
|
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
|
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
|
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
|
-
|
25
|
-
|
60
|
+
isChromeFamily,
|
61
|
+
isElectron,
|
62
|
+
isFromEU,
|
63
|
+
isFrozenUA,
|
64
|
+
isStandalonePWA
|
26
65
|
}
|
package/src/main/ua-parser.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Type definitions for UAParser.js v2.0.0-beta.
|
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: {
|