@semiont/graph 0.5.4 → 0.5.6
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 +0 -6
- package/dist/bowser-D72SKZAH.js +2820 -0
- package/dist/bowser-D72SKZAH.js.map +1 -0
- package/dist/chunk-27S56UPF.js +4754 -0
- package/dist/chunk-27S56UPF.js.map +1 -0
- package/dist/chunk-4UP2SG3N.js +2095 -0
- package/dist/chunk-4UP2SG3N.js.map +1 -0
- package/dist/chunk-6DEJAFBY.js +125 -0
- package/dist/chunk-6DEJAFBY.js.map +1 -0
- package/dist/chunk-7UD62TQI.js +3317 -0
- package/dist/chunk-7UD62TQI.js.map +1 -0
- package/dist/chunk-B2W57CWL.js +47 -0
- package/dist/chunk-B2W57CWL.js.map +1 -0
- package/dist/chunk-DCLCNCC5.js +1051 -0
- package/dist/chunk-DCLCNCC5.js.map +1 -0
- package/dist/chunk-KE4TRQI4.js +576 -0
- package/dist/chunk-KE4TRQI4.js.map +1 -0
- package/dist/chunk-MWZWSKZD.js +1166 -0
- package/dist/chunk-MWZWSKZD.js.map +1 -0
- package/dist/chunk-V4VXQDJC.js +436 -0
- package/dist/chunk-V4VXQDJC.js.map +1 -0
- package/dist/dist-es-2CKOZ7UJ.js +69 -0
- package/dist/dist-es-2CKOZ7UJ.js.map +1 -0
- package/dist/dist-es-CUJAAJXF.js +6632 -0
- package/dist/dist-es-CUJAAJXF.js.map +1 -0
- package/dist/dist-es-LM7J2FUI.js +87 -0
- package/dist/dist-es-LM7J2FUI.js.map +1 -0
- package/dist/dist-es-QTXLRLLM.js +169 -0
- package/dist/dist-es-QTXLRLLM.js.map +1 -0
- package/dist/dist-es-R223S2WP.js +484 -0
- package/dist/dist-es-R223S2WP.js.map +1 -0
- package/dist/dist-es-SI3C7IEH.js +22 -0
- package/dist/dist-es-SI3C7IEH.js.map +1 -0
- package/dist/dist-es-XNPYIYQW.js +314 -0
- package/dist/dist-es-XNPYIYQW.js.map +1 -0
- package/dist/dist-es-ZYIOCGDF.js +376 -0
- package/dist/dist-es-ZYIOCGDF.js.map +1 -0
- package/dist/event-streams-AI5RIQ2F.js +1376 -0
- package/dist/event-streams-AI5RIQ2F.js.map +1 -0
- package/dist/index.d.ts +359 -17
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/loadSso-6PVX5KA7.js +576 -0
- package/dist/loadSso-6PVX5KA7.js.map +1 -0
- package/dist/signin-GV4P4PGF.js +662 -0
- package/dist/signin-GV4P4PGF.js.map +1 -0
- package/dist/sso-oidc-WFVKSVW6.js +829 -0
- package/dist/sso-oidc-WFVKSVW6.js.map +1 -0
- package/dist/sts-7N7QMJRQ.js +1244 -0
- package/dist/sts-7N7QMJRQ.js.map +1 -0
- package/package.json +15 -8
- package/dist/factory.d.ts +0 -21
- package/dist/factory.d.ts.map +0 -1
- package/dist/implementations/janusgraph.d.ts +0 -72
- package/dist/implementations/janusgraph.d.ts.map +0 -1
- package/dist/implementations/memorygraph.d.ts +0 -70
- package/dist/implementations/memorygraph.d.ts.map +0 -1
- package/dist/implementations/neo4j.d.ts +0 -80
- package/dist/implementations/neo4j.d.ts.map +0 -1
- package/dist/implementations/neptune.d.ts +0 -78
- package/dist/implementations/neptune.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/interface.d.ts +0 -57
- package/dist/interface.d.ts.map +0 -1
|
@@ -0,0 +1,2820 @@
|
|
|
1
|
+
// ../../node_modules/bowser/src/constants.js
|
|
2
|
+
var BROWSER_ALIASES_MAP = {
|
|
3
|
+
AmazonBot: "amazonbot",
|
|
4
|
+
"Amazon Silk": "amazon_silk",
|
|
5
|
+
"Android Browser": "android",
|
|
6
|
+
BaiduSpider: "baiduspider",
|
|
7
|
+
Bada: "bada",
|
|
8
|
+
BingCrawler: "bingcrawler",
|
|
9
|
+
Brave: "brave",
|
|
10
|
+
BlackBerry: "blackberry",
|
|
11
|
+
"ChatGPT-User": "chatgpt_user",
|
|
12
|
+
Chrome: "chrome",
|
|
13
|
+
ClaudeBot: "claudebot",
|
|
14
|
+
Chromium: "chromium",
|
|
15
|
+
Diffbot: "diffbot",
|
|
16
|
+
DuckDuckBot: "duckduckbot",
|
|
17
|
+
DuckDuckGo: "duckduckgo",
|
|
18
|
+
Electron: "electron",
|
|
19
|
+
Epiphany: "epiphany",
|
|
20
|
+
FacebookExternalHit: "facebookexternalhit",
|
|
21
|
+
Firefox: "firefox",
|
|
22
|
+
Focus: "focus",
|
|
23
|
+
Generic: "generic",
|
|
24
|
+
"Google Search": "google_search",
|
|
25
|
+
Googlebot: "googlebot",
|
|
26
|
+
GPTBot: "gptbot",
|
|
27
|
+
"Internet Explorer": "ie",
|
|
28
|
+
InternetArchiveCrawler: "internetarchivecrawler",
|
|
29
|
+
"K-Meleon": "k_meleon",
|
|
30
|
+
LibreWolf: "librewolf",
|
|
31
|
+
Linespider: "linespider",
|
|
32
|
+
Maxthon: "maxthon",
|
|
33
|
+
"Meta-ExternalAds": "meta_externalads",
|
|
34
|
+
"Meta-ExternalAgent": "meta_externalagent",
|
|
35
|
+
"Meta-ExternalFetcher": "meta_externalfetcher",
|
|
36
|
+
"Meta-WebIndexer": "meta_webindexer",
|
|
37
|
+
"Microsoft Edge": "edge",
|
|
38
|
+
"MZ Browser": "mz",
|
|
39
|
+
"NAVER Whale Browser": "naver",
|
|
40
|
+
"OAI-SearchBot": "oai_searchbot",
|
|
41
|
+
Omgilibot: "omgilibot",
|
|
42
|
+
Opera: "opera",
|
|
43
|
+
"Opera Coast": "opera_coast",
|
|
44
|
+
"Pale Moon": "pale_moon",
|
|
45
|
+
PerplexityBot: "perplexitybot",
|
|
46
|
+
"Perplexity-User": "perplexity_user",
|
|
47
|
+
PhantomJS: "phantomjs",
|
|
48
|
+
PingdomBot: "pingdombot",
|
|
49
|
+
Puffin: "puffin",
|
|
50
|
+
QQ: "qq",
|
|
51
|
+
QQLite: "qqlite",
|
|
52
|
+
QupZilla: "qupzilla",
|
|
53
|
+
Roku: "roku",
|
|
54
|
+
Safari: "safari",
|
|
55
|
+
Sailfish: "sailfish",
|
|
56
|
+
"Samsung Internet for Android": "samsung_internet",
|
|
57
|
+
SlackBot: "slackbot",
|
|
58
|
+
SeaMonkey: "seamonkey",
|
|
59
|
+
Sleipnir: "sleipnir",
|
|
60
|
+
"Sogou Browser": "sogou",
|
|
61
|
+
Swing: "swing",
|
|
62
|
+
Tizen: "tizen",
|
|
63
|
+
"UC Browser": "uc",
|
|
64
|
+
Vivaldi: "vivaldi",
|
|
65
|
+
"WebOS Browser": "webos",
|
|
66
|
+
WeChat: "wechat",
|
|
67
|
+
YahooSlurp: "yahooslurp",
|
|
68
|
+
"Yandex Browser": "yandex",
|
|
69
|
+
YandexBot: "yandexbot",
|
|
70
|
+
YouBot: "youbot"
|
|
71
|
+
};
|
|
72
|
+
var BROWSER_MAP = {
|
|
73
|
+
amazonbot: "AmazonBot",
|
|
74
|
+
amazon_silk: "Amazon Silk",
|
|
75
|
+
android: "Android Browser",
|
|
76
|
+
baiduspider: "BaiduSpider",
|
|
77
|
+
bada: "Bada",
|
|
78
|
+
bingcrawler: "BingCrawler",
|
|
79
|
+
blackberry: "BlackBerry",
|
|
80
|
+
brave: "Brave",
|
|
81
|
+
chatgpt_user: "ChatGPT-User",
|
|
82
|
+
chrome: "Chrome",
|
|
83
|
+
claudebot: "ClaudeBot",
|
|
84
|
+
chromium: "Chromium",
|
|
85
|
+
diffbot: "Diffbot",
|
|
86
|
+
duckduckbot: "DuckDuckBot",
|
|
87
|
+
duckduckgo: "DuckDuckGo",
|
|
88
|
+
edge: "Microsoft Edge",
|
|
89
|
+
electron: "Electron",
|
|
90
|
+
epiphany: "Epiphany",
|
|
91
|
+
facebookexternalhit: "FacebookExternalHit",
|
|
92
|
+
firefox: "Firefox",
|
|
93
|
+
focus: "Focus",
|
|
94
|
+
generic: "Generic",
|
|
95
|
+
google_search: "Google Search",
|
|
96
|
+
googlebot: "Googlebot",
|
|
97
|
+
gptbot: "GPTBot",
|
|
98
|
+
ie: "Internet Explorer",
|
|
99
|
+
internetarchivecrawler: "InternetArchiveCrawler",
|
|
100
|
+
k_meleon: "K-Meleon",
|
|
101
|
+
librewolf: "LibreWolf",
|
|
102
|
+
linespider: "Linespider",
|
|
103
|
+
maxthon: "Maxthon",
|
|
104
|
+
meta_externalads: "Meta-ExternalAds",
|
|
105
|
+
meta_externalagent: "Meta-ExternalAgent",
|
|
106
|
+
meta_externalfetcher: "Meta-ExternalFetcher",
|
|
107
|
+
meta_webindexer: "Meta-WebIndexer",
|
|
108
|
+
mz: "MZ Browser",
|
|
109
|
+
naver: "NAVER Whale Browser",
|
|
110
|
+
oai_searchbot: "OAI-SearchBot",
|
|
111
|
+
omgilibot: "Omgilibot",
|
|
112
|
+
opera: "Opera",
|
|
113
|
+
opera_coast: "Opera Coast",
|
|
114
|
+
pale_moon: "Pale Moon",
|
|
115
|
+
perplexitybot: "PerplexityBot",
|
|
116
|
+
perplexity_user: "Perplexity-User",
|
|
117
|
+
phantomjs: "PhantomJS",
|
|
118
|
+
pingdombot: "PingdomBot",
|
|
119
|
+
puffin: "Puffin",
|
|
120
|
+
qq: "QQ Browser",
|
|
121
|
+
qqlite: "QQ Browser Lite",
|
|
122
|
+
qupzilla: "QupZilla",
|
|
123
|
+
roku: "Roku",
|
|
124
|
+
safari: "Safari",
|
|
125
|
+
sailfish: "Sailfish",
|
|
126
|
+
samsung_internet: "Samsung Internet for Android",
|
|
127
|
+
seamonkey: "SeaMonkey",
|
|
128
|
+
slackbot: "SlackBot",
|
|
129
|
+
sleipnir: "Sleipnir",
|
|
130
|
+
sogou: "Sogou Browser",
|
|
131
|
+
swing: "Swing",
|
|
132
|
+
tizen: "Tizen",
|
|
133
|
+
uc: "UC Browser",
|
|
134
|
+
vivaldi: "Vivaldi",
|
|
135
|
+
webos: "WebOS Browser",
|
|
136
|
+
wechat: "WeChat",
|
|
137
|
+
yahooslurp: "YahooSlurp",
|
|
138
|
+
yandex: "Yandex Browser",
|
|
139
|
+
yandexbot: "YandexBot",
|
|
140
|
+
youbot: "YouBot"
|
|
141
|
+
};
|
|
142
|
+
var PLATFORMS_MAP = {
|
|
143
|
+
bot: "bot",
|
|
144
|
+
desktop: "desktop",
|
|
145
|
+
mobile: "mobile",
|
|
146
|
+
tablet: "tablet",
|
|
147
|
+
tv: "tv"
|
|
148
|
+
};
|
|
149
|
+
var OS_MAP = {
|
|
150
|
+
Android: "Android",
|
|
151
|
+
Bada: "Bada",
|
|
152
|
+
BlackBerry: "BlackBerry",
|
|
153
|
+
ChromeOS: "Chrome OS",
|
|
154
|
+
HarmonyOS: "HarmonyOS",
|
|
155
|
+
iOS: "iOS",
|
|
156
|
+
Linux: "Linux",
|
|
157
|
+
MacOS: "macOS",
|
|
158
|
+
PlayStation4: "PlayStation 4",
|
|
159
|
+
Roku: "Roku",
|
|
160
|
+
Tizen: "Tizen",
|
|
161
|
+
WebOS: "WebOS",
|
|
162
|
+
Windows: "Windows",
|
|
163
|
+
WindowsPhone: "Windows Phone"
|
|
164
|
+
};
|
|
165
|
+
var ENGINE_MAP = {
|
|
166
|
+
Blink: "Blink",
|
|
167
|
+
EdgeHTML: "EdgeHTML",
|
|
168
|
+
Gecko: "Gecko",
|
|
169
|
+
Presto: "Presto",
|
|
170
|
+
Trident: "Trident",
|
|
171
|
+
WebKit: "WebKit"
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// ../../node_modules/bowser/src/utils.js
|
|
175
|
+
var Utils = class _Utils {
|
|
176
|
+
/**
|
|
177
|
+
* Get first matched item for a string
|
|
178
|
+
* @param {RegExp} regexp
|
|
179
|
+
* @param {String} ua
|
|
180
|
+
* @return {Array|{index: number, input: string}|*|boolean|string}
|
|
181
|
+
*/
|
|
182
|
+
static getFirstMatch(regexp, ua) {
|
|
183
|
+
const match = ua.match(regexp);
|
|
184
|
+
return match && match.length > 0 && match[1] || "";
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get second matched item for a string
|
|
188
|
+
* @param regexp
|
|
189
|
+
* @param {String} ua
|
|
190
|
+
* @return {Array|{index: number, input: string}|*|boolean|string}
|
|
191
|
+
*/
|
|
192
|
+
static getSecondMatch(regexp, ua) {
|
|
193
|
+
const match = ua.match(regexp);
|
|
194
|
+
return match && match.length > 1 && match[2] || "";
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Match a regexp and return a constant or undefined
|
|
198
|
+
* @param {RegExp} regexp
|
|
199
|
+
* @param {String} ua
|
|
200
|
+
* @param {*} _const Any const that will be returned if regexp matches the string
|
|
201
|
+
* @return {*}
|
|
202
|
+
*/
|
|
203
|
+
static matchAndReturnConst(regexp, ua, _const) {
|
|
204
|
+
if (regexp.test(ua)) {
|
|
205
|
+
return _const;
|
|
206
|
+
}
|
|
207
|
+
return void 0;
|
|
208
|
+
}
|
|
209
|
+
static getWindowsVersionName(version) {
|
|
210
|
+
switch (version) {
|
|
211
|
+
case "NT":
|
|
212
|
+
return "NT";
|
|
213
|
+
case "XP":
|
|
214
|
+
return "XP";
|
|
215
|
+
case "NT 5.0":
|
|
216
|
+
return "2000";
|
|
217
|
+
case "NT 5.1":
|
|
218
|
+
return "XP";
|
|
219
|
+
case "NT 5.2":
|
|
220
|
+
return "2003";
|
|
221
|
+
case "NT 6.0":
|
|
222
|
+
return "Vista";
|
|
223
|
+
case "NT 6.1":
|
|
224
|
+
return "7";
|
|
225
|
+
case "NT 6.2":
|
|
226
|
+
return "8";
|
|
227
|
+
case "NT 6.3":
|
|
228
|
+
return "8.1";
|
|
229
|
+
case "NT 10.0":
|
|
230
|
+
return "10";
|
|
231
|
+
default:
|
|
232
|
+
return void 0;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get macOS version name
|
|
237
|
+
* 10.5 - Leopard
|
|
238
|
+
* 10.6 - Snow Leopard
|
|
239
|
+
* 10.7 - Lion
|
|
240
|
+
* 10.8 - Mountain Lion
|
|
241
|
+
* 10.9 - Mavericks
|
|
242
|
+
* 10.10 - Yosemite
|
|
243
|
+
* 10.11 - El Capitan
|
|
244
|
+
* 10.12 - Sierra
|
|
245
|
+
* 10.13 - High Sierra
|
|
246
|
+
* 10.14 - Mojave
|
|
247
|
+
* 10.15 - Catalina
|
|
248
|
+
* 11 - Big Sur
|
|
249
|
+
* 12 - Monterey
|
|
250
|
+
* 13 - Ventura
|
|
251
|
+
* 14 - Sonoma
|
|
252
|
+
* 15 - Sequoia
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* getMacOSVersionName("10.14") // 'Mojave'
|
|
256
|
+
*
|
|
257
|
+
* @param {string} version
|
|
258
|
+
* @return {string} versionName
|
|
259
|
+
*/
|
|
260
|
+
static getMacOSVersionName(version) {
|
|
261
|
+
const v = version.split(".").splice(0, 2).map((s) => parseInt(s, 10) || 0);
|
|
262
|
+
v.push(0);
|
|
263
|
+
const major = v[0];
|
|
264
|
+
const minor = v[1];
|
|
265
|
+
if (major === 10) {
|
|
266
|
+
switch (minor) {
|
|
267
|
+
case 5:
|
|
268
|
+
return "Leopard";
|
|
269
|
+
case 6:
|
|
270
|
+
return "Snow Leopard";
|
|
271
|
+
case 7:
|
|
272
|
+
return "Lion";
|
|
273
|
+
case 8:
|
|
274
|
+
return "Mountain Lion";
|
|
275
|
+
case 9:
|
|
276
|
+
return "Mavericks";
|
|
277
|
+
case 10:
|
|
278
|
+
return "Yosemite";
|
|
279
|
+
case 11:
|
|
280
|
+
return "El Capitan";
|
|
281
|
+
case 12:
|
|
282
|
+
return "Sierra";
|
|
283
|
+
case 13:
|
|
284
|
+
return "High Sierra";
|
|
285
|
+
case 14:
|
|
286
|
+
return "Mojave";
|
|
287
|
+
case 15:
|
|
288
|
+
return "Catalina";
|
|
289
|
+
default:
|
|
290
|
+
return void 0;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
switch (major) {
|
|
294
|
+
case 11:
|
|
295
|
+
return "Big Sur";
|
|
296
|
+
case 12:
|
|
297
|
+
return "Monterey";
|
|
298
|
+
case 13:
|
|
299
|
+
return "Ventura";
|
|
300
|
+
case 14:
|
|
301
|
+
return "Sonoma";
|
|
302
|
+
case 15:
|
|
303
|
+
return "Sequoia";
|
|
304
|
+
default:
|
|
305
|
+
return void 0;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Get Android version name
|
|
310
|
+
* 1.5 - Cupcake
|
|
311
|
+
* 1.6 - Donut
|
|
312
|
+
* 2.0 - Eclair
|
|
313
|
+
* 2.1 - Eclair
|
|
314
|
+
* 2.2 - Froyo
|
|
315
|
+
* 2.x - Gingerbread
|
|
316
|
+
* 3.x - Honeycomb
|
|
317
|
+
* 4.0 - Ice Cream Sandwich
|
|
318
|
+
* 4.1 - Jelly Bean
|
|
319
|
+
* 4.4 - KitKat
|
|
320
|
+
* 5.x - Lollipop
|
|
321
|
+
* 6.x - Marshmallow
|
|
322
|
+
* 7.x - Nougat
|
|
323
|
+
* 8.x - Oreo
|
|
324
|
+
* 9.x - Pie
|
|
325
|
+
*
|
|
326
|
+
* @example
|
|
327
|
+
* getAndroidVersionName("7.0") // 'Nougat'
|
|
328
|
+
*
|
|
329
|
+
* @param {string} version
|
|
330
|
+
* @return {string} versionName
|
|
331
|
+
*/
|
|
332
|
+
static getAndroidVersionName(version) {
|
|
333
|
+
const v = version.split(".").splice(0, 2).map((s) => parseInt(s, 10) || 0);
|
|
334
|
+
v.push(0);
|
|
335
|
+
if (v[0] === 1 && v[1] < 5) return void 0;
|
|
336
|
+
if (v[0] === 1 && v[1] < 6) return "Cupcake";
|
|
337
|
+
if (v[0] === 1 && v[1] >= 6) return "Donut";
|
|
338
|
+
if (v[0] === 2 && v[1] < 2) return "Eclair";
|
|
339
|
+
if (v[0] === 2 && v[1] === 2) return "Froyo";
|
|
340
|
+
if (v[0] === 2 && v[1] > 2) return "Gingerbread";
|
|
341
|
+
if (v[0] === 3) return "Honeycomb";
|
|
342
|
+
if (v[0] === 4 && v[1] < 1) return "Ice Cream Sandwich";
|
|
343
|
+
if (v[0] === 4 && v[1] < 4) return "Jelly Bean";
|
|
344
|
+
if (v[0] === 4 && v[1] >= 4) return "KitKat";
|
|
345
|
+
if (v[0] === 5) return "Lollipop";
|
|
346
|
+
if (v[0] === 6) return "Marshmallow";
|
|
347
|
+
if (v[0] === 7) return "Nougat";
|
|
348
|
+
if (v[0] === 8) return "Oreo";
|
|
349
|
+
if (v[0] === 9) return "Pie";
|
|
350
|
+
return void 0;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Get version precisions count
|
|
354
|
+
*
|
|
355
|
+
* @example
|
|
356
|
+
* getVersionPrecision("1.10.3") // 3
|
|
357
|
+
*
|
|
358
|
+
* @param {string} version
|
|
359
|
+
* @return {number}
|
|
360
|
+
*/
|
|
361
|
+
static getVersionPrecision(version) {
|
|
362
|
+
return version.split(".").length;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Calculate browser version weight
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* compareVersions('1.10.2.1', '1.8.2.1.90') // 1
|
|
369
|
+
* compareVersions('1.010.2.1', '1.09.2.1.90'); // 1
|
|
370
|
+
* compareVersions('1.10.2.1', '1.10.2.1'); // 0
|
|
371
|
+
* compareVersions('1.10.2.1', '1.0800.2'); // -1
|
|
372
|
+
* compareVersions('1.10.2.1', '1.10', true); // 0
|
|
373
|
+
*
|
|
374
|
+
* @param {String} versionA versions versions to compare
|
|
375
|
+
* @param {String} versionB versions versions to compare
|
|
376
|
+
* @param {boolean} [isLoose] enable loose comparison
|
|
377
|
+
* @return {Number} comparison result: -1 when versionA is lower,
|
|
378
|
+
* 1 when versionA is bigger, 0 when both equal
|
|
379
|
+
*/
|
|
380
|
+
/* eslint consistent-return: 1 */
|
|
381
|
+
static compareVersions(versionA, versionB, isLoose = false) {
|
|
382
|
+
const versionAPrecision = _Utils.getVersionPrecision(versionA);
|
|
383
|
+
const versionBPrecision = _Utils.getVersionPrecision(versionB);
|
|
384
|
+
let precision = Math.max(versionAPrecision, versionBPrecision);
|
|
385
|
+
let lastPrecision = 0;
|
|
386
|
+
const chunks = _Utils.map([versionA, versionB], (version) => {
|
|
387
|
+
const delta = precision - _Utils.getVersionPrecision(version);
|
|
388
|
+
const _version = version + new Array(delta + 1).join(".0");
|
|
389
|
+
return _Utils.map(_version.split("."), (chunk) => new Array(20 - chunk.length).join("0") + chunk).reverse();
|
|
390
|
+
});
|
|
391
|
+
if (isLoose) {
|
|
392
|
+
lastPrecision = precision - Math.min(versionAPrecision, versionBPrecision);
|
|
393
|
+
}
|
|
394
|
+
precision -= 1;
|
|
395
|
+
while (precision >= lastPrecision) {
|
|
396
|
+
if (chunks[0][precision] > chunks[1][precision]) {
|
|
397
|
+
return 1;
|
|
398
|
+
}
|
|
399
|
+
if (chunks[0][precision] === chunks[1][precision]) {
|
|
400
|
+
if (precision === lastPrecision) {
|
|
401
|
+
return 0;
|
|
402
|
+
}
|
|
403
|
+
precision -= 1;
|
|
404
|
+
} else if (chunks[0][precision] < chunks[1][precision]) {
|
|
405
|
+
return -1;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return void 0;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Array::map polyfill
|
|
412
|
+
*
|
|
413
|
+
* @param {Array} arr
|
|
414
|
+
* @param {Function} iterator
|
|
415
|
+
* @return {Array}
|
|
416
|
+
*/
|
|
417
|
+
static map(arr, iterator) {
|
|
418
|
+
const result = [];
|
|
419
|
+
let i;
|
|
420
|
+
if (Array.prototype.map) {
|
|
421
|
+
return Array.prototype.map.call(arr, iterator);
|
|
422
|
+
}
|
|
423
|
+
for (i = 0; i < arr.length; i += 1) {
|
|
424
|
+
result.push(iterator(arr[i]));
|
|
425
|
+
}
|
|
426
|
+
return result;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Array::find polyfill
|
|
430
|
+
*
|
|
431
|
+
* @param {Array} arr
|
|
432
|
+
* @param {Function} predicate
|
|
433
|
+
* @return {Array}
|
|
434
|
+
*/
|
|
435
|
+
static find(arr, predicate) {
|
|
436
|
+
let i;
|
|
437
|
+
let l;
|
|
438
|
+
if (Array.prototype.find) {
|
|
439
|
+
return Array.prototype.find.call(arr, predicate);
|
|
440
|
+
}
|
|
441
|
+
for (i = 0, l = arr.length; i < l; i += 1) {
|
|
442
|
+
const value = arr[i];
|
|
443
|
+
if (predicate(value, i)) {
|
|
444
|
+
return value;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return void 0;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Object::assign polyfill
|
|
451
|
+
*
|
|
452
|
+
* @param {Object} obj
|
|
453
|
+
* @param {Object} ...objs
|
|
454
|
+
* @return {Object}
|
|
455
|
+
*/
|
|
456
|
+
static assign(obj, ...assigners) {
|
|
457
|
+
const result = obj;
|
|
458
|
+
let i;
|
|
459
|
+
let l;
|
|
460
|
+
if (Object.assign) {
|
|
461
|
+
return Object.assign(obj, ...assigners);
|
|
462
|
+
}
|
|
463
|
+
for (i = 0, l = assigners.length; i < l; i += 1) {
|
|
464
|
+
const assigner = assigners[i];
|
|
465
|
+
if (typeof assigner === "object" && assigner !== null) {
|
|
466
|
+
const keys = Object.keys(assigner);
|
|
467
|
+
keys.forEach((key) => {
|
|
468
|
+
result[key] = assigner[key];
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return obj;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Get short version/alias for a browser name
|
|
476
|
+
*
|
|
477
|
+
* @example
|
|
478
|
+
* getBrowserAlias('Microsoft Edge') // edge
|
|
479
|
+
*
|
|
480
|
+
* @param {string} browserName
|
|
481
|
+
* @return {string}
|
|
482
|
+
*/
|
|
483
|
+
static getBrowserAlias(browserName) {
|
|
484
|
+
return BROWSER_ALIASES_MAP[browserName];
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Get browser name for a short version/alias
|
|
488
|
+
*
|
|
489
|
+
* @example
|
|
490
|
+
* getBrowserTypeByAlias('edge') // Microsoft Edge
|
|
491
|
+
*
|
|
492
|
+
* @param {string} browserAlias
|
|
493
|
+
* @return {string}
|
|
494
|
+
*/
|
|
495
|
+
static getBrowserTypeByAlias(browserAlias) {
|
|
496
|
+
return BROWSER_MAP[browserAlias] || "";
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
// ../../node_modules/bowser/src/parser-browsers.js
|
|
501
|
+
var commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i;
|
|
502
|
+
var browsersList = [
|
|
503
|
+
/* GPTBot */
|
|
504
|
+
{
|
|
505
|
+
test: [/gptbot/i],
|
|
506
|
+
describe(ua) {
|
|
507
|
+
const browser = {
|
|
508
|
+
name: "GPTBot"
|
|
509
|
+
};
|
|
510
|
+
const version = Utils.getFirstMatch(/gptbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
511
|
+
if (version) {
|
|
512
|
+
browser.version = version;
|
|
513
|
+
}
|
|
514
|
+
return browser;
|
|
515
|
+
}
|
|
516
|
+
},
|
|
517
|
+
/* ChatGPT-User */
|
|
518
|
+
{
|
|
519
|
+
test: [/chatgpt-user/i],
|
|
520
|
+
describe(ua) {
|
|
521
|
+
const browser = {
|
|
522
|
+
name: "ChatGPT-User"
|
|
523
|
+
};
|
|
524
|
+
const version = Utils.getFirstMatch(/chatgpt-user\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
525
|
+
if (version) {
|
|
526
|
+
browser.version = version;
|
|
527
|
+
}
|
|
528
|
+
return browser;
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
/* OAI-SearchBot */
|
|
532
|
+
{
|
|
533
|
+
test: [/oai-searchbot/i],
|
|
534
|
+
describe(ua) {
|
|
535
|
+
const browser = {
|
|
536
|
+
name: "OAI-SearchBot"
|
|
537
|
+
};
|
|
538
|
+
const version = Utils.getFirstMatch(/oai-searchbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
539
|
+
if (version) {
|
|
540
|
+
browser.version = version;
|
|
541
|
+
}
|
|
542
|
+
return browser;
|
|
543
|
+
}
|
|
544
|
+
},
|
|
545
|
+
/* ClaudeBot */
|
|
546
|
+
{
|
|
547
|
+
test: [/claudebot/i, /claude-web/i, /claude-user/i, /claude-searchbot/i],
|
|
548
|
+
describe(ua) {
|
|
549
|
+
const browser = {
|
|
550
|
+
name: "ClaudeBot"
|
|
551
|
+
};
|
|
552
|
+
const version = Utils.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
553
|
+
if (version) {
|
|
554
|
+
browser.version = version;
|
|
555
|
+
}
|
|
556
|
+
return browser;
|
|
557
|
+
}
|
|
558
|
+
},
|
|
559
|
+
/* Omgilibot */
|
|
560
|
+
{
|
|
561
|
+
test: [/omgilibot/i, /webzio-extended/i],
|
|
562
|
+
describe(ua) {
|
|
563
|
+
const browser = {
|
|
564
|
+
name: "Omgilibot"
|
|
565
|
+
};
|
|
566
|
+
const version = Utils.getFirstMatch(/(?:omgilibot|webzio-extended)\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
567
|
+
if (version) {
|
|
568
|
+
browser.version = version;
|
|
569
|
+
}
|
|
570
|
+
return browser;
|
|
571
|
+
}
|
|
572
|
+
},
|
|
573
|
+
/* Diffbot */
|
|
574
|
+
{
|
|
575
|
+
test: [/diffbot/i],
|
|
576
|
+
describe(ua) {
|
|
577
|
+
const browser = {
|
|
578
|
+
name: "Diffbot"
|
|
579
|
+
};
|
|
580
|
+
const version = Utils.getFirstMatch(/diffbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
581
|
+
if (version) {
|
|
582
|
+
browser.version = version;
|
|
583
|
+
}
|
|
584
|
+
return browser;
|
|
585
|
+
}
|
|
586
|
+
},
|
|
587
|
+
/* PerplexityBot */
|
|
588
|
+
{
|
|
589
|
+
test: [/perplexitybot/i],
|
|
590
|
+
describe(ua) {
|
|
591
|
+
const browser = {
|
|
592
|
+
name: "PerplexityBot"
|
|
593
|
+
};
|
|
594
|
+
const version = Utils.getFirstMatch(/perplexitybot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
595
|
+
if (version) {
|
|
596
|
+
browser.version = version;
|
|
597
|
+
}
|
|
598
|
+
return browser;
|
|
599
|
+
}
|
|
600
|
+
},
|
|
601
|
+
/* Perplexity-User */
|
|
602
|
+
{
|
|
603
|
+
test: [/perplexity-user/i],
|
|
604
|
+
describe(ua) {
|
|
605
|
+
const browser = {
|
|
606
|
+
name: "Perplexity-User"
|
|
607
|
+
};
|
|
608
|
+
const version = Utils.getFirstMatch(/perplexity-user\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
609
|
+
if (version) {
|
|
610
|
+
browser.version = version;
|
|
611
|
+
}
|
|
612
|
+
return browser;
|
|
613
|
+
}
|
|
614
|
+
},
|
|
615
|
+
/* YouBot */
|
|
616
|
+
{
|
|
617
|
+
test: [/youbot/i],
|
|
618
|
+
describe(ua) {
|
|
619
|
+
const browser = {
|
|
620
|
+
name: "YouBot"
|
|
621
|
+
};
|
|
622
|
+
const version = Utils.getFirstMatch(/youbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
623
|
+
if (version) {
|
|
624
|
+
browser.version = version;
|
|
625
|
+
}
|
|
626
|
+
return browser;
|
|
627
|
+
}
|
|
628
|
+
},
|
|
629
|
+
/* Meta-WebIndexer */
|
|
630
|
+
{
|
|
631
|
+
test: [/meta-webindexer/i],
|
|
632
|
+
describe(ua) {
|
|
633
|
+
const browser = {
|
|
634
|
+
name: "Meta-WebIndexer"
|
|
635
|
+
};
|
|
636
|
+
const version = Utils.getFirstMatch(/meta-webindexer\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
637
|
+
if (version) {
|
|
638
|
+
browser.version = version;
|
|
639
|
+
}
|
|
640
|
+
return browser;
|
|
641
|
+
}
|
|
642
|
+
},
|
|
643
|
+
/* Meta-ExternalAds */
|
|
644
|
+
{
|
|
645
|
+
test: [/meta-externalads/i],
|
|
646
|
+
describe(ua) {
|
|
647
|
+
const browser = {
|
|
648
|
+
name: "Meta-ExternalAds"
|
|
649
|
+
};
|
|
650
|
+
const version = Utils.getFirstMatch(/meta-externalads\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
651
|
+
if (version) {
|
|
652
|
+
browser.version = version;
|
|
653
|
+
}
|
|
654
|
+
return browser;
|
|
655
|
+
}
|
|
656
|
+
},
|
|
657
|
+
/* Meta-ExternalAgent */
|
|
658
|
+
{
|
|
659
|
+
test: [/meta-externalagent/i],
|
|
660
|
+
describe(ua) {
|
|
661
|
+
const browser = {
|
|
662
|
+
name: "Meta-ExternalAgent"
|
|
663
|
+
};
|
|
664
|
+
const version = Utils.getFirstMatch(/meta-externalagent\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
665
|
+
if (version) {
|
|
666
|
+
browser.version = version;
|
|
667
|
+
}
|
|
668
|
+
return browser;
|
|
669
|
+
}
|
|
670
|
+
},
|
|
671
|
+
/* Meta-ExternalFetcher */
|
|
672
|
+
{
|
|
673
|
+
test: [/meta-externalfetcher/i],
|
|
674
|
+
describe(ua) {
|
|
675
|
+
const browser = {
|
|
676
|
+
name: "Meta-ExternalFetcher"
|
|
677
|
+
};
|
|
678
|
+
const version = Utils.getFirstMatch(/meta-externalfetcher\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
679
|
+
if (version) {
|
|
680
|
+
browser.version = version;
|
|
681
|
+
}
|
|
682
|
+
return browser;
|
|
683
|
+
}
|
|
684
|
+
},
|
|
685
|
+
/* Googlebot */
|
|
686
|
+
{
|
|
687
|
+
test: [/googlebot/i],
|
|
688
|
+
describe(ua) {
|
|
689
|
+
const browser = {
|
|
690
|
+
name: "Googlebot"
|
|
691
|
+
};
|
|
692
|
+
const version = Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
693
|
+
if (version) {
|
|
694
|
+
browser.version = version;
|
|
695
|
+
}
|
|
696
|
+
return browser;
|
|
697
|
+
}
|
|
698
|
+
},
|
|
699
|
+
/* Linespider */
|
|
700
|
+
{
|
|
701
|
+
test: [/linespider/i],
|
|
702
|
+
describe(ua) {
|
|
703
|
+
const browser = {
|
|
704
|
+
name: "Linespider"
|
|
705
|
+
};
|
|
706
|
+
const version = Utils.getFirstMatch(/(?:linespider)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
707
|
+
if (version) {
|
|
708
|
+
browser.version = version;
|
|
709
|
+
}
|
|
710
|
+
return browser;
|
|
711
|
+
}
|
|
712
|
+
},
|
|
713
|
+
/* AmazonBot */
|
|
714
|
+
{
|
|
715
|
+
test: [/amazonbot/i],
|
|
716
|
+
describe(ua) {
|
|
717
|
+
const browser = {
|
|
718
|
+
name: "AmazonBot"
|
|
719
|
+
};
|
|
720
|
+
const version = Utils.getFirstMatch(/amazonbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
721
|
+
if (version) {
|
|
722
|
+
browser.version = version;
|
|
723
|
+
}
|
|
724
|
+
return browser;
|
|
725
|
+
}
|
|
726
|
+
},
|
|
727
|
+
/* BingCrawler */
|
|
728
|
+
{
|
|
729
|
+
test: [/bingbot/i],
|
|
730
|
+
describe(ua) {
|
|
731
|
+
const browser = {
|
|
732
|
+
name: "BingCrawler"
|
|
733
|
+
};
|
|
734
|
+
const version = Utils.getFirstMatch(/bingbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
735
|
+
if (version) {
|
|
736
|
+
browser.version = version;
|
|
737
|
+
}
|
|
738
|
+
return browser;
|
|
739
|
+
}
|
|
740
|
+
},
|
|
741
|
+
/* BaiduSpider */
|
|
742
|
+
{
|
|
743
|
+
test: [/baiduspider/i],
|
|
744
|
+
describe(ua) {
|
|
745
|
+
const browser = {
|
|
746
|
+
name: "BaiduSpider"
|
|
747
|
+
};
|
|
748
|
+
const version = Utils.getFirstMatch(/baiduspider\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
749
|
+
if (version) {
|
|
750
|
+
browser.version = version;
|
|
751
|
+
}
|
|
752
|
+
return browser;
|
|
753
|
+
}
|
|
754
|
+
},
|
|
755
|
+
/* DuckDuckBot */
|
|
756
|
+
{
|
|
757
|
+
test: [/duckduckbot/i],
|
|
758
|
+
describe(ua) {
|
|
759
|
+
const browser = {
|
|
760
|
+
name: "DuckDuckBot"
|
|
761
|
+
};
|
|
762
|
+
const version = Utils.getFirstMatch(/duckduckbot\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
763
|
+
if (version) {
|
|
764
|
+
browser.version = version;
|
|
765
|
+
}
|
|
766
|
+
return browser;
|
|
767
|
+
}
|
|
768
|
+
},
|
|
769
|
+
/* InternetArchiveCrawler */
|
|
770
|
+
{
|
|
771
|
+
test: [/ia_archiver/i],
|
|
772
|
+
describe(ua) {
|
|
773
|
+
const browser = {
|
|
774
|
+
name: "InternetArchiveCrawler"
|
|
775
|
+
};
|
|
776
|
+
const version = Utils.getFirstMatch(/ia_archiver\/(\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
777
|
+
if (version) {
|
|
778
|
+
browser.version = version;
|
|
779
|
+
}
|
|
780
|
+
return browser;
|
|
781
|
+
}
|
|
782
|
+
},
|
|
783
|
+
/* FacebookExternalHit */
|
|
784
|
+
{
|
|
785
|
+
test: [/facebookexternalhit/i, /facebookcatalog/i],
|
|
786
|
+
describe() {
|
|
787
|
+
return {
|
|
788
|
+
name: "FacebookExternalHit"
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
},
|
|
792
|
+
/* SlackBot */
|
|
793
|
+
{
|
|
794
|
+
test: [/slackbot/i, /slack-imgProxy/i],
|
|
795
|
+
describe(ua) {
|
|
796
|
+
const browser = {
|
|
797
|
+
name: "SlackBot"
|
|
798
|
+
};
|
|
799
|
+
const version = Utils.getFirstMatch(/(?:slackbot|slack-imgproxy)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
800
|
+
if (version) {
|
|
801
|
+
browser.version = version;
|
|
802
|
+
}
|
|
803
|
+
return browser;
|
|
804
|
+
}
|
|
805
|
+
},
|
|
806
|
+
/* YahooSlurp */
|
|
807
|
+
{
|
|
808
|
+
test: [/yahoo!?[\s/]*slurp/i],
|
|
809
|
+
describe() {
|
|
810
|
+
return {
|
|
811
|
+
name: "YahooSlurp"
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
},
|
|
815
|
+
/* YandexBot */
|
|
816
|
+
{
|
|
817
|
+
test: [/yandexbot/i, /yandexmobilebot/i],
|
|
818
|
+
describe() {
|
|
819
|
+
return {
|
|
820
|
+
name: "YandexBot"
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
},
|
|
824
|
+
/* PingdomBot */
|
|
825
|
+
{
|
|
826
|
+
test: [/pingdom/i],
|
|
827
|
+
describe() {
|
|
828
|
+
return {
|
|
829
|
+
name: "PingdomBot"
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
},
|
|
833
|
+
/* Opera < 13.0 */
|
|
834
|
+
{
|
|
835
|
+
test: [/opera/i],
|
|
836
|
+
describe(ua) {
|
|
837
|
+
const browser = {
|
|
838
|
+
name: "Opera"
|
|
839
|
+
};
|
|
840
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
841
|
+
if (version) {
|
|
842
|
+
browser.version = version;
|
|
843
|
+
}
|
|
844
|
+
return browser;
|
|
845
|
+
}
|
|
846
|
+
},
|
|
847
|
+
/* Opera > 13.0 */
|
|
848
|
+
{
|
|
849
|
+
test: [/opr\/|opios/i],
|
|
850
|
+
describe(ua) {
|
|
851
|
+
const browser = {
|
|
852
|
+
name: "Opera"
|
|
853
|
+
};
|
|
854
|
+
const version = Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
855
|
+
if (version) {
|
|
856
|
+
browser.version = version;
|
|
857
|
+
}
|
|
858
|
+
return browser;
|
|
859
|
+
}
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
test: [/SamsungBrowser/i],
|
|
863
|
+
describe(ua) {
|
|
864
|
+
const browser = {
|
|
865
|
+
name: "Samsung Internet for Android"
|
|
866
|
+
};
|
|
867
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
868
|
+
if (version) {
|
|
869
|
+
browser.version = version;
|
|
870
|
+
}
|
|
871
|
+
return browser;
|
|
872
|
+
}
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
test: [/Whale/i],
|
|
876
|
+
describe(ua) {
|
|
877
|
+
const browser = {
|
|
878
|
+
name: "NAVER Whale Browser"
|
|
879
|
+
};
|
|
880
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, ua);
|
|
881
|
+
if (version) {
|
|
882
|
+
browser.version = version;
|
|
883
|
+
}
|
|
884
|
+
return browser;
|
|
885
|
+
}
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
test: [/PaleMoon/i],
|
|
889
|
+
describe(ua) {
|
|
890
|
+
const browser = {
|
|
891
|
+
name: "Pale Moon"
|
|
892
|
+
};
|
|
893
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:PaleMoon)[\s/](\d+(?:\.\d+)+)/i, ua);
|
|
894
|
+
if (version) {
|
|
895
|
+
browser.version = version;
|
|
896
|
+
}
|
|
897
|
+
return browser;
|
|
898
|
+
}
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
test: [/MZBrowser/i],
|
|
902
|
+
describe(ua) {
|
|
903
|
+
const browser = {
|
|
904
|
+
name: "MZ Browser"
|
|
905
|
+
};
|
|
906
|
+
const version = Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
907
|
+
if (version) {
|
|
908
|
+
browser.version = version;
|
|
909
|
+
}
|
|
910
|
+
return browser;
|
|
911
|
+
}
|
|
912
|
+
},
|
|
913
|
+
{
|
|
914
|
+
test: [/focus/i],
|
|
915
|
+
describe(ua) {
|
|
916
|
+
const browser = {
|
|
917
|
+
name: "Focus"
|
|
918
|
+
};
|
|
919
|
+
const version = Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
920
|
+
if (version) {
|
|
921
|
+
browser.version = version;
|
|
922
|
+
}
|
|
923
|
+
return browser;
|
|
924
|
+
}
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
test: [/swing/i],
|
|
928
|
+
describe(ua) {
|
|
929
|
+
const browser = {
|
|
930
|
+
name: "Swing"
|
|
931
|
+
};
|
|
932
|
+
const version = Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
933
|
+
if (version) {
|
|
934
|
+
browser.version = version;
|
|
935
|
+
}
|
|
936
|
+
return browser;
|
|
937
|
+
}
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
test: [/coast/i],
|
|
941
|
+
describe(ua) {
|
|
942
|
+
const browser = {
|
|
943
|
+
name: "Opera Coast"
|
|
944
|
+
};
|
|
945
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
946
|
+
if (version) {
|
|
947
|
+
browser.version = version;
|
|
948
|
+
}
|
|
949
|
+
return browser;
|
|
950
|
+
}
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
test: [/opt\/\d+(?:.?_?\d+)+/i],
|
|
954
|
+
describe(ua) {
|
|
955
|
+
const browser = {
|
|
956
|
+
name: "Opera Touch"
|
|
957
|
+
};
|
|
958
|
+
const version = Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
959
|
+
if (version) {
|
|
960
|
+
browser.version = version;
|
|
961
|
+
}
|
|
962
|
+
return browser;
|
|
963
|
+
}
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
test: [/yabrowser/i],
|
|
967
|
+
describe(ua) {
|
|
968
|
+
const browser = {
|
|
969
|
+
name: "Yandex Browser"
|
|
970
|
+
};
|
|
971
|
+
const version = Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
972
|
+
if (version) {
|
|
973
|
+
browser.version = version;
|
|
974
|
+
}
|
|
975
|
+
return browser;
|
|
976
|
+
}
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
test: [/ucbrowser/i],
|
|
980
|
+
describe(ua) {
|
|
981
|
+
const browser = {
|
|
982
|
+
name: "UC Browser"
|
|
983
|
+
};
|
|
984
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
985
|
+
if (version) {
|
|
986
|
+
browser.version = version;
|
|
987
|
+
}
|
|
988
|
+
return browser;
|
|
989
|
+
}
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
test: [/Maxthon|mxios/i],
|
|
993
|
+
describe(ua) {
|
|
994
|
+
const browser = {
|
|
995
|
+
name: "Maxthon"
|
|
996
|
+
};
|
|
997
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
998
|
+
if (version) {
|
|
999
|
+
browser.version = version;
|
|
1000
|
+
}
|
|
1001
|
+
return browser;
|
|
1002
|
+
}
|
|
1003
|
+
},
|
|
1004
|
+
{
|
|
1005
|
+
test: [/epiphany/i],
|
|
1006
|
+
describe(ua) {
|
|
1007
|
+
const browser = {
|
|
1008
|
+
name: "Epiphany"
|
|
1009
|
+
};
|
|
1010
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1011
|
+
if (version) {
|
|
1012
|
+
browser.version = version;
|
|
1013
|
+
}
|
|
1014
|
+
return browser;
|
|
1015
|
+
}
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
test: [/puffin/i],
|
|
1019
|
+
describe(ua) {
|
|
1020
|
+
const browser = {
|
|
1021
|
+
name: "Puffin"
|
|
1022
|
+
};
|
|
1023
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1024
|
+
if (version) {
|
|
1025
|
+
browser.version = version;
|
|
1026
|
+
}
|
|
1027
|
+
return browser;
|
|
1028
|
+
}
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
test: [/sleipnir/i],
|
|
1032
|
+
describe(ua) {
|
|
1033
|
+
const browser = {
|
|
1034
|
+
name: "Sleipnir"
|
|
1035
|
+
};
|
|
1036
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1037
|
+
if (version) {
|
|
1038
|
+
browser.version = version;
|
|
1039
|
+
}
|
|
1040
|
+
return browser;
|
|
1041
|
+
}
|
|
1042
|
+
},
|
|
1043
|
+
{
|
|
1044
|
+
test: [/k-meleon/i],
|
|
1045
|
+
describe(ua) {
|
|
1046
|
+
const browser = {
|
|
1047
|
+
name: "K-Meleon"
|
|
1048
|
+
};
|
|
1049
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1050
|
+
if (version) {
|
|
1051
|
+
browser.version = version;
|
|
1052
|
+
}
|
|
1053
|
+
return browser;
|
|
1054
|
+
}
|
|
1055
|
+
},
|
|
1056
|
+
{
|
|
1057
|
+
test: [/micromessenger/i],
|
|
1058
|
+
describe(ua) {
|
|
1059
|
+
const browser = {
|
|
1060
|
+
name: "WeChat"
|
|
1061
|
+
};
|
|
1062
|
+
const version = Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1063
|
+
if (version) {
|
|
1064
|
+
browser.version = version;
|
|
1065
|
+
}
|
|
1066
|
+
return browser;
|
|
1067
|
+
}
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
test: [/qqbrowser/i],
|
|
1071
|
+
describe(ua) {
|
|
1072
|
+
const browser = {
|
|
1073
|
+
name: /qqbrowserlite/i.test(ua) ? "QQ Browser Lite" : "QQ Browser"
|
|
1074
|
+
};
|
|
1075
|
+
const version = Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1076
|
+
if (version) {
|
|
1077
|
+
browser.version = version;
|
|
1078
|
+
}
|
|
1079
|
+
return browser;
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
test: [/msie|trident/i],
|
|
1084
|
+
describe(ua) {
|
|
1085
|
+
const browser = {
|
|
1086
|
+
name: "Internet Explorer"
|
|
1087
|
+
};
|
|
1088
|
+
const version = Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, ua);
|
|
1089
|
+
if (version) {
|
|
1090
|
+
browser.version = version;
|
|
1091
|
+
}
|
|
1092
|
+
return browser;
|
|
1093
|
+
}
|
|
1094
|
+
},
|
|
1095
|
+
{
|
|
1096
|
+
test: [/\sedg\//i],
|
|
1097
|
+
describe(ua) {
|
|
1098
|
+
const browser = {
|
|
1099
|
+
name: "Microsoft Edge"
|
|
1100
|
+
};
|
|
1101
|
+
const version = Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1102
|
+
if (version) {
|
|
1103
|
+
browser.version = version;
|
|
1104
|
+
}
|
|
1105
|
+
return browser;
|
|
1106
|
+
}
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
test: [/edg([ea]|ios)/i],
|
|
1110
|
+
describe(ua) {
|
|
1111
|
+
const browser = {
|
|
1112
|
+
name: "Microsoft Edge"
|
|
1113
|
+
};
|
|
1114
|
+
const version = Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1115
|
+
if (version) {
|
|
1116
|
+
browser.version = version;
|
|
1117
|
+
}
|
|
1118
|
+
return browser;
|
|
1119
|
+
}
|
|
1120
|
+
},
|
|
1121
|
+
{
|
|
1122
|
+
test: [/vivaldi/i],
|
|
1123
|
+
describe(ua) {
|
|
1124
|
+
const browser = {
|
|
1125
|
+
name: "Vivaldi"
|
|
1126
|
+
};
|
|
1127
|
+
const version = Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1128
|
+
if (version) {
|
|
1129
|
+
browser.version = version;
|
|
1130
|
+
}
|
|
1131
|
+
return browser;
|
|
1132
|
+
}
|
|
1133
|
+
},
|
|
1134
|
+
{
|
|
1135
|
+
test: [/seamonkey/i],
|
|
1136
|
+
describe(ua) {
|
|
1137
|
+
const browser = {
|
|
1138
|
+
name: "SeaMonkey"
|
|
1139
|
+
};
|
|
1140
|
+
const version = Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1141
|
+
if (version) {
|
|
1142
|
+
browser.version = version;
|
|
1143
|
+
}
|
|
1144
|
+
return browser;
|
|
1145
|
+
}
|
|
1146
|
+
},
|
|
1147
|
+
{
|
|
1148
|
+
test: [/sailfish/i],
|
|
1149
|
+
describe(ua) {
|
|
1150
|
+
const browser = {
|
|
1151
|
+
name: "Sailfish"
|
|
1152
|
+
};
|
|
1153
|
+
const version = Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, ua);
|
|
1154
|
+
if (version) {
|
|
1155
|
+
browser.version = version;
|
|
1156
|
+
}
|
|
1157
|
+
return browser;
|
|
1158
|
+
}
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
test: [/silk/i],
|
|
1162
|
+
describe(ua) {
|
|
1163
|
+
const browser = {
|
|
1164
|
+
name: "Amazon Silk"
|
|
1165
|
+
};
|
|
1166
|
+
const version = Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1167
|
+
if (version) {
|
|
1168
|
+
browser.version = version;
|
|
1169
|
+
}
|
|
1170
|
+
return browser;
|
|
1171
|
+
}
|
|
1172
|
+
},
|
|
1173
|
+
{
|
|
1174
|
+
test: [/phantom/i],
|
|
1175
|
+
describe(ua) {
|
|
1176
|
+
const browser = {
|
|
1177
|
+
name: "PhantomJS"
|
|
1178
|
+
};
|
|
1179
|
+
const version = Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1180
|
+
if (version) {
|
|
1181
|
+
browser.version = version;
|
|
1182
|
+
}
|
|
1183
|
+
return browser;
|
|
1184
|
+
}
|
|
1185
|
+
},
|
|
1186
|
+
{
|
|
1187
|
+
test: [/slimerjs/i],
|
|
1188
|
+
describe(ua) {
|
|
1189
|
+
const browser = {
|
|
1190
|
+
name: "SlimerJS"
|
|
1191
|
+
};
|
|
1192
|
+
const version = Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1193
|
+
if (version) {
|
|
1194
|
+
browser.version = version;
|
|
1195
|
+
}
|
|
1196
|
+
return browser;
|
|
1197
|
+
}
|
|
1198
|
+
},
|
|
1199
|
+
{
|
|
1200
|
+
test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
|
|
1201
|
+
describe(ua) {
|
|
1202
|
+
const browser = {
|
|
1203
|
+
name: "BlackBerry"
|
|
1204
|
+
};
|
|
1205
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1206
|
+
if (version) {
|
|
1207
|
+
browser.version = version;
|
|
1208
|
+
}
|
|
1209
|
+
return browser;
|
|
1210
|
+
}
|
|
1211
|
+
},
|
|
1212
|
+
{
|
|
1213
|
+
test: [/(web|hpw)[o0]s/i],
|
|
1214
|
+
describe(ua) {
|
|
1215
|
+
const browser = {
|
|
1216
|
+
name: "WebOS Browser"
|
|
1217
|
+
};
|
|
1218
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1219
|
+
if (version) {
|
|
1220
|
+
browser.version = version;
|
|
1221
|
+
}
|
|
1222
|
+
return browser;
|
|
1223
|
+
}
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
test: [/bada/i],
|
|
1227
|
+
describe(ua) {
|
|
1228
|
+
const browser = {
|
|
1229
|
+
name: "Bada"
|
|
1230
|
+
};
|
|
1231
|
+
const version = Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1232
|
+
if (version) {
|
|
1233
|
+
browser.version = version;
|
|
1234
|
+
}
|
|
1235
|
+
return browser;
|
|
1236
|
+
}
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
test: [/tizen/i],
|
|
1240
|
+
describe(ua) {
|
|
1241
|
+
const browser = {
|
|
1242
|
+
name: "Tizen"
|
|
1243
|
+
};
|
|
1244
|
+
const version = Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1245
|
+
if (version) {
|
|
1246
|
+
browser.version = version;
|
|
1247
|
+
}
|
|
1248
|
+
return browser;
|
|
1249
|
+
}
|
|
1250
|
+
},
|
|
1251
|
+
{
|
|
1252
|
+
test: [/qupzilla/i],
|
|
1253
|
+
describe(ua) {
|
|
1254
|
+
const browser = {
|
|
1255
|
+
name: "QupZilla"
|
|
1256
|
+
};
|
|
1257
|
+
const version = Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1258
|
+
if (version) {
|
|
1259
|
+
browser.version = version;
|
|
1260
|
+
}
|
|
1261
|
+
return browser;
|
|
1262
|
+
}
|
|
1263
|
+
},
|
|
1264
|
+
{
|
|
1265
|
+
test: [/librewolf/i],
|
|
1266
|
+
describe(ua) {
|
|
1267
|
+
const browser = {
|
|
1268
|
+
name: "LibreWolf"
|
|
1269
|
+
};
|
|
1270
|
+
const version = Utils.getFirstMatch(/(?:librewolf)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1271
|
+
if (version) {
|
|
1272
|
+
browser.version = version;
|
|
1273
|
+
}
|
|
1274
|
+
return browser;
|
|
1275
|
+
}
|
|
1276
|
+
},
|
|
1277
|
+
{
|
|
1278
|
+
test: [/firefox|iceweasel|fxios/i],
|
|
1279
|
+
describe(ua) {
|
|
1280
|
+
const browser = {
|
|
1281
|
+
name: "Firefox"
|
|
1282
|
+
};
|
|
1283
|
+
const version = Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1284
|
+
if (version) {
|
|
1285
|
+
browser.version = version;
|
|
1286
|
+
}
|
|
1287
|
+
return browser;
|
|
1288
|
+
}
|
|
1289
|
+
},
|
|
1290
|
+
{
|
|
1291
|
+
test: [/electron/i],
|
|
1292
|
+
describe(ua) {
|
|
1293
|
+
const browser = {
|
|
1294
|
+
name: "Electron"
|
|
1295
|
+
};
|
|
1296
|
+
const version = Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1297
|
+
if (version) {
|
|
1298
|
+
browser.version = version;
|
|
1299
|
+
}
|
|
1300
|
+
return browser;
|
|
1301
|
+
}
|
|
1302
|
+
},
|
|
1303
|
+
{
|
|
1304
|
+
test: [/sogoumobilebrowser/i, /metasr/i, /se 2\.[x]/i],
|
|
1305
|
+
describe(ua) {
|
|
1306
|
+
const browser = {
|
|
1307
|
+
name: "Sogou Browser"
|
|
1308
|
+
};
|
|
1309
|
+
const sogouMobileVersion = Utils.getFirstMatch(/(?:sogoumobilebrowser)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1310
|
+
const chromiumVersion = Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1311
|
+
const seVersion = Utils.getFirstMatch(/se ([\d.]+)x/i, ua);
|
|
1312
|
+
const version = sogouMobileVersion || chromiumVersion || seVersion;
|
|
1313
|
+
if (version) {
|
|
1314
|
+
browser.version = version;
|
|
1315
|
+
}
|
|
1316
|
+
return browser;
|
|
1317
|
+
}
|
|
1318
|
+
},
|
|
1319
|
+
{
|
|
1320
|
+
test: [/MiuiBrowser/i],
|
|
1321
|
+
describe(ua) {
|
|
1322
|
+
const browser = {
|
|
1323
|
+
name: "Miui"
|
|
1324
|
+
};
|
|
1325
|
+
const version = Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua);
|
|
1326
|
+
if (version) {
|
|
1327
|
+
browser.version = version;
|
|
1328
|
+
}
|
|
1329
|
+
return browser;
|
|
1330
|
+
}
|
|
1331
|
+
},
|
|
1332
|
+
/* DuckDuckGo Browser */
|
|
1333
|
+
{
|
|
1334
|
+
test(parser) {
|
|
1335
|
+
if (parser.hasBrand("DuckDuckGo")) {
|
|
1336
|
+
return true;
|
|
1337
|
+
}
|
|
1338
|
+
return parser.test(/\sDdg\/[\d.]+$/i);
|
|
1339
|
+
},
|
|
1340
|
+
describe(ua, parser) {
|
|
1341
|
+
const browser = {
|
|
1342
|
+
name: "DuckDuckGo"
|
|
1343
|
+
};
|
|
1344
|
+
if (parser) {
|
|
1345
|
+
const hintsVersion = parser.getBrandVersion("DuckDuckGo");
|
|
1346
|
+
if (hintsVersion) {
|
|
1347
|
+
browser.version = hintsVersion;
|
|
1348
|
+
return browser;
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
const uaVersion = Utils.getFirstMatch(/\sDdg\/([\d.]+)$/i, ua);
|
|
1352
|
+
if (uaVersion) {
|
|
1353
|
+
browser.version = uaVersion;
|
|
1354
|
+
}
|
|
1355
|
+
return browser;
|
|
1356
|
+
}
|
|
1357
|
+
},
|
|
1358
|
+
/* Brave Browser */
|
|
1359
|
+
{
|
|
1360
|
+
test(parser) {
|
|
1361
|
+
return parser.hasBrand("Brave");
|
|
1362
|
+
},
|
|
1363
|
+
describe(ua, parser) {
|
|
1364
|
+
const browser = {
|
|
1365
|
+
name: "Brave"
|
|
1366
|
+
};
|
|
1367
|
+
if (parser) {
|
|
1368
|
+
const hintsVersion = parser.getBrandVersion("Brave");
|
|
1369
|
+
if (hintsVersion) {
|
|
1370
|
+
browser.version = hintsVersion;
|
|
1371
|
+
return browser;
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
return browser;
|
|
1375
|
+
}
|
|
1376
|
+
},
|
|
1377
|
+
{
|
|
1378
|
+
test: [/chromium/i],
|
|
1379
|
+
describe(ua) {
|
|
1380
|
+
const browser = {
|
|
1381
|
+
name: "Chromium"
|
|
1382
|
+
};
|
|
1383
|
+
const version = Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1384
|
+
if (version) {
|
|
1385
|
+
browser.version = version;
|
|
1386
|
+
}
|
|
1387
|
+
return browser;
|
|
1388
|
+
}
|
|
1389
|
+
},
|
|
1390
|
+
{
|
|
1391
|
+
test: [/chrome|crios|crmo/i],
|
|
1392
|
+
describe(ua) {
|
|
1393
|
+
const browser = {
|
|
1394
|
+
name: "Chrome"
|
|
1395
|
+
};
|
|
1396
|
+
const version = Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1397
|
+
if (version) {
|
|
1398
|
+
browser.version = version;
|
|
1399
|
+
}
|
|
1400
|
+
return browser;
|
|
1401
|
+
}
|
|
1402
|
+
},
|
|
1403
|
+
{
|
|
1404
|
+
test: [/GSA/i],
|
|
1405
|
+
describe(ua) {
|
|
1406
|
+
const browser = {
|
|
1407
|
+
name: "Google Search"
|
|
1408
|
+
};
|
|
1409
|
+
const version = Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, ua);
|
|
1410
|
+
if (version) {
|
|
1411
|
+
browser.version = version;
|
|
1412
|
+
}
|
|
1413
|
+
return browser;
|
|
1414
|
+
}
|
|
1415
|
+
},
|
|
1416
|
+
/* Android Browser */
|
|
1417
|
+
{
|
|
1418
|
+
test(parser) {
|
|
1419
|
+
const notLikeAndroid = !parser.test(/like android/i);
|
|
1420
|
+
const butAndroid = parser.test(/android/i);
|
|
1421
|
+
return notLikeAndroid && butAndroid;
|
|
1422
|
+
},
|
|
1423
|
+
describe(ua) {
|
|
1424
|
+
const browser = {
|
|
1425
|
+
name: "Android Browser"
|
|
1426
|
+
};
|
|
1427
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1428
|
+
if (version) {
|
|
1429
|
+
browser.version = version;
|
|
1430
|
+
}
|
|
1431
|
+
return browser;
|
|
1432
|
+
}
|
|
1433
|
+
},
|
|
1434
|
+
/* PlayStation 4 */
|
|
1435
|
+
{
|
|
1436
|
+
test: [/playstation 4/i],
|
|
1437
|
+
describe(ua) {
|
|
1438
|
+
const browser = {
|
|
1439
|
+
name: "PlayStation 4"
|
|
1440
|
+
};
|
|
1441
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1442
|
+
if (version) {
|
|
1443
|
+
browser.version = version;
|
|
1444
|
+
}
|
|
1445
|
+
return browser;
|
|
1446
|
+
}
|
|
1447
|
+
},
|
|
1448
|
+
/* Safari */
|
|
1449
|
+
{
|
|
1450
|
+
test: [/safari|applewebkit/i],
|
|
1451
|
+
describe(ua) {
|
|
1452
|
+
const browser = {
|
|
1453
|
+
name: "Safari"
|
|
1454
|
+
};
|
|
1455
|
+
const version = Utils.getFirstMatch(commonVersionIdentifier, ua);
|
|
1456
|
+
if (version) {
|
|
1457
|
+
browser.version = version;
|
|
1458
|
+
}
|
|
1459
|
+
return browser;
|
|
1460
|
+
}
|
|
1461
|
+
},
|
|
1462
|
+
/* Something else */
|
|
1463
|
+
{
|
|
1464
|
+
test: [/.*/i],
|
|
1465
|
+
describe(ua) {
|
|
1466
|
+
const regexpWithoutDeviceSpec = /^(.*)\/(.*) /;
|
|
1467
|
+
const regexpWithDeviceSpec = /^(.*)\/(.*)[ \t]\((.*)/;
|
|
1468
|
+
const hasDeviceSpec = ua.search("\\(") !== -1;
|
|
1469
|
+
const regexp = hasDeviceSpec ? regexpWithDeviceSpec : regexpWithoutDeviceSpec;
|
|
1470
|
+
return {
|
|
1471
|
+
name: Utils.getFirstMatch(regexp, ua),
|
|
1472
|
+
version: Utils.getSecondMatch(regexp, ua)
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1475
|
+
}
|
|
1476
|
+
];
|
|
1477
|
+
var parser_browsers_default = browsersList;
|
|
1478
|
+
|
|
1479
|
+
// ../../node_modules/bowser/src/parser-os.js
|
|
1480
|
+
var parser_os_default = [
|
|
1481
|
+
/* Roku */
|
|
1482
|
+
{
|
|
1483
|
+
test: [/Roku\/DVP/],
|
|
1484
|
+
describe(ua) {
|
|
1485
|
+
const version = Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, ua);
|
|
1486
|
+
return {
|
|
1487
|
+
name: OS_MAP.Roku,
|
|
1488
|
+
version
|
|
1489
|
+
};
|
|
1490
|
+
}
|
|
1491
|
+
},
|
|
1492
|
+
/* Windows Phone */
|
|
1493
|
+
{
|
|
1494
|
+
test: [/windows phone/i],
|
|
1495
|
+
describe(ua) {
|
|
1496
|
+
const version = Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, ua);
|
|
1497
|
+
return {
|
|
1498
|
+
name: OS_MAP.WindowsPhone,
|
|
1499
|
+
version
|
|
1500
|
+
};
|
|
1501
|
+
}
|
|
1502
|
+
},
|
|
1503
|
+
/* Windows */
|
|
1504
|
+
{
|
|
1505
|
+
test: [/windows /i],
|
|
1506
|
+
describe(ua) {
|
|
1507
|
+
const version = Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, ua);
|
|
1508
|
+
const versionName = Utils.getWindowsVersionName(version);
|
|
1509
|
+
return {
|
|
1510
|
+
name: OS_MAP.Windows,
|
|
1511
|
+
version,
|
|
1512
|
+
versionName
|
|
1513
|
+
};
|
|
1514
|
+
}
|
|
1515
|
+
},
|
|
1516
|
+
/* Firefox on iPad */
|
|
1517
|
+
{
|
|
1518
|
+
test: [/Macintosh(.*?) FxiOS(.*?)\//],
|
|
1519
|
+
describe(ua) {
|
|
1520
|
+
const result = {
|
|
1521
|
+
name: OS_MAP.iOS
|
|
1522
|
+
};
|
|
1523
|
+
const version = Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/, ua);
|
|
1524
|
+
if (version) {
|
|
1525
|
+
result.version = version;
|
|
1526
|
+
}
|
|
1527
|
+
return result;
|
|
1528
|
+
}
|
|
1529
|
+
},
|
|
1530
|
+
/* macOS */
|
|
1531
|
+
{
|
|
1532
|
+
test: [/macintosh/i],
|
|
1533
|
+
describe(ua) {
|
|
1534
|
+
const version = Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, ua).replace(/[_\s]/g, ".");
|
|
1535
|
+
const versionName = Utils.getMacOSVersionName(version);
|
|
1536
|
+
const os = {
|
|
1537
|
+
name: OS_MAP.MacOS,
|
|
1538
|
+
version
|
|
1539
|
+
};
|
|
1540
|
+
if (versionName) {
|
|
1541
|
+
os.versionName = versionName;
|
|
1542
|
+
}
|
|
1543
|
+
return os;
|
|
1544
|
+
}
|
|
1545
|
+
},
|
|
1546
|
+
/* iOS */
|
|
1547
|
+
{
|
|
1548
|
+
test: [/(ipod|iphone|ipad)/i],
|
|
1549
|
+
describe(ua) {
|
|
1550
|
+
const version = Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, ua).replace(/[_\s]/g, ".");
|
|
1551
|
+
return {
|
|
1552
|
+
name: OS_MAP.iOS,
|
|
1553
|
+
version
|
|
1554
|
+
};
|
|
1555
|
+
}
|
|
1556
|
+
},
|
|
1557
|
+
/* HarmonyOS */
|
|
1558
|
+
{
|
|
1559
|
+
test: [/OpenHarmony/i],
|
|
1560
|
+
describe(ua) {
|
|
1561
|
+
const version = Utils.getFirstMatch(/OpenHarmony\s+(\d+(\.\d+)*)/i, ua);
|
|
1562
|
+
return {
|
|
1563
|
+
name: OS_MAP.HarmonyOS,
|
|
1564
|
+
version
|
|
1565
|
+
};
|
|
1566
|
+
}
|
|
1567
|
+
},
|
|
1568
|
+
/* Android */
|
|
1569
|
+
{
|
|
1570
|
+
test(parser) {
|
|
1571
|
+
const notLikeAndroid = !parser.test(/like android/i);
|
|
1572
|
+
const butAndroid = parser.test(/android/i);
|
|
1573
|
+
return notLikeAndroid && butAndroid;
|
|
1574
|
+
},
|
|
1575
|
+
describe(ua) {
|
|
1576
|
+
const version = Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, ua);
|
|
1577
|
+
const versionName = Utils.getAndroidVersionName(version);
|
|
1578
|
+
const os = {
|
|
1579
|
+
name: OS_MAP.Android,
|
|
1580
|
+
version
|
|
1581
|
+
};
|
|
1582
|
+
if (versionName) {
|
|
1583
|
+
os.versionName = versionName;
|
|
1584
|
+
}
|
|
1585
|
+
return os;
|
|
1586
|
+
}
|
|
1587
|
+
},
|
|
1588
|
+
/* WebOS */
|
|
1589
|
+
{
|
|
1590
|
+
test: [/(web|hpw)[o0]s/i],
|
|
1591
|
+
describe(ua) {
|
|
1592
|
+
const version = Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, ua);
|
|
1593
|
+
const os = {
|
|
1594
|
+
name: OS_MAP.WebOS
|
|
1595
|
+
};
|
|
1596
|
+
if (version && version.length) {
|
|
1597
|
+
os.version = version;
|
|
1598
|
+
}
|
|
1599
|
+
return os;
|
|
1600
|
+
}
|
|
1601
|
+
},
|
|
1602
|
+
/* BlackBerry */
|
|
1603
|
+
{
|
|
1604
|
+
test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
|
|
1605
|
+
describe(ua) {
|
|
1606
|
+
const version = Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, ua) || Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, ua) || Utils.getFirstMatch(/\bbb(\d+)/i, ua);
|
|
1607
|
+
return {
|
|
1608
|
+
name: OS_MAP.BlackBerry,
|
|
1609
|
+
version
|
|
1610
|
+
};
|
|
1611
|
+
}
|
|
1612
|
+
},
|
|
1613
|
+
/* Bada */
|
|
1614
|
+
{
|
|
1615
|
+
test: [/bada/i],
|
|
1616
|
+
describe(ua) {
|
|
1617
|
+
const version = Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, ua);
|
|
1618
|
+
return {
|
|
1619
|
+
name: OS_MAP.Bada,
|
|
1620
|
+
version
|
|
1621
|
+
};
|
|
1622
|
+
}
|
|
1623
|
+
},
|
|
1624
|
+
/* Tizen */
|
|
1625
|
+
{
|
|
1626
|
+
test: [/tizen/i],
|
|
1627
|
+
describe(ua) {
|
|
1628
|
+
const version = Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, ua);
|
|
1629
|
+
return {
|
|
1630
|
+
name: OS_MAP.Tizen,
|
|
1631
|
+
version
|
|
1632
|
+
};
|
|
1633
|
+
}
|
|
1634
|
+
},
|
|
1635
|
+
/* Linux */
|
|
1636
|
+
{
|
|
1637
|
+
test: [/linux/i],
|
|
1638
|
+
describe() {
|
|
1639
|
+
return {
|
|
1640
|
+
name: OS_MAP.Linux
|
|
1641
|
+
};
|
|
1642
|
+
}
|
|
1643
|
+
},
|
|
1644
|
+
/* Chrome OS */
|
|
1645
|
+
{
|
|
1646
|
+
test: [/CrOS/],
|
|
1647
|
+
describe() {
|
|
1648
|
+
return {
|
|
1649
|
+
name: OS_MAP.ChromeOS
|
|
1650
|
+
};
|
|
1651
|
+
}
|
|
1652
|
+
},
|
|
1653
|
+
/* Playstation 4 */
|
|
1654
|
+
{
|
|
1655
|
+
test: [/PlayStation 4/],
|
|
1656
|
+
describe(ua) {
|
|
1657
|
+
const version = Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, ua);
|
|
1658
|
+
return {
|
|
1659
|
+
name: OS_MAP.PlayStation4,
|
|
1660
|
+
version
|
|
1661
|
+
};
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
];
|
|
1665
|
+
|
|
1666
|
+
// ../../node_modules/bowser/src/parser-platforms.js
|
|
1667
|
+
var parser_platforms_default = [
|
|
1668
|
+
/* Googlebot */
|
|
1669
|
+
{
|
|
1670
|
+
test: [/googlebot/i],
|
|
1671
|
+
describe() {
|
|
1672
|
+
return {
|
|
1673
|
+
type: PLATFORMS_MAP.bot,
|
|
1674
|
+
vendor: "Google"
|
|
1675
|
+
};
|
|
1676
|
+
}
|
|
1677
|
+
},
|
|
1678
|
+
/* LineSpider */
|
|
1679
|
+
{
|
|
1680
|
+
test: [/linespider/i],
|
|
1681
|
+
describe() {
|
|
1682
|
+
return {
|
|
1683
|
+
type: PLATFORMS_MAP.bot,
|
|
1684
|
+
vendor: "Line"
|
|
1685
|
+
};
|
|
1686
|
+
}
|
|
1687
|
+
},
|
|
1688
|
+
/* AmazonBot */
|
|
1689
|
+
{
|
|
1690
|
+
test: [/amazonbot/i],
|
|
1691
|
+
describe() {
|
|
1692
|
+
return {
|
|
1693
|
+
type: PLATFORMS_MAP.bot,
|
|
1694
|
+
vendor: "Amazon"
|
|
1695
|
+
};
|
|
1696
|
+
}
|
|
1697
|
+
},
|
|
1698
|
+
/* GPTBot */
|
|
1699
|
+
{
|
|
1700
|
+
test: [/gptbot/i],
|
|
1701
|
+
describe() {
|
|
1702
|
+
return {
|
|
1703
|
+
type: PLATFORMS_MAP.bot,
|
|
1704
|
+
vendor: "OpenAI"
|
|
1705
|
+
};
|
|
1706
|
+
}
|
|
1707
|
+
},
|
|
1708
|
+
/* ChatGPT-User */
|
|
1709
|
+
{
|
|
1710
|
+
test: [/chatgpt-user/i],
|
|
1711
|
+
describe() {
|
|
1712
|
+
return {
|
|
1713
|
+
type: PLATFORMS_MAP.bot,
|
|
1714
|
+
vendor: "OpenAI"
|
|
1715
|
+
};
|
|
1716
|
+
}
|
|
1717
|
+
},
|
|
1718
|
+
/* OAI-SearchBot */
|
|
1719
|
+
{
|
|
1720
|
+
test: [/oai-searchbot/i],
|
|
1721
|
+
describe() {
|
|
1722
|
+
return {
|
|
1723
|
+
type: PLATFORMS_MAP.bot,
|
|
1724
|
+
vendor: "OpenAI"
|
|
1725
|
+
};
|
|
1726
|
+
}
|
|
1727
|
+
},
|
|
1728
|
+
/* Baidu */
|
|
1729
|
+
{
|
|
1730
|
+
test: [/baiduspider/i],
|
|
1731
|
+
describe() {
|
|
1732
|
+
return {
|
|
1733
|
+
type: PLATFORMS_MAP.bot,
|
|
1734
|
+
vendor: "Baidu"
|
|
1735
|
+
};
|
|
1736
|
+
}
|
|
1737
|
+
},
|
|
1738
|
+
/* Bingbot */
|
|
1739
|
+
{
|
|
1740
|
+
test: [/bingbot/i],
|
|
1741
|
+
describe() {
|
|
1742
|
+
return {
|
|
1743
|
+
type: PLATFORMS_MAP.bot,
|
|
1744
|
+
vendor: "Bing"
|
|
1745
|
+
};
|
|
1746
|
+
}
|
|
1747
|
+
},
|
|
1748
|
+
/* DuckDuckBot */
|
|
1749
|
+
{
|
|
1750
|
+
test: [/duckduckbot/i],
|
|
1751
|
+
describe() {
|
|
1752
|
+
return {
|
|
1753
|
+
type: PLATFORMS_MAP.bot,
|
|
1754
|
+
vendor: "DuckDuckGo"
|
|
1755
|
+
};
|
|
1756
|
+
}
|
|
1757
|
+
},
|
|
1758
|
+
/* ClaudeBot */
|
|
1759
|
+
{
|
|
1760
|
+
test: [/claudebot/i, /claude-web/i, /claude-user/i, /claude-searchbot/i],
|
|
1761
|
+
describe() {
|
|
1762
|
+
return {
|
|
1763
|
+
type: PLATFORMS_MAP.bot,
|
|
1764
|
+
vendor: "Anthropic"
|
|
1765
|
+
};
|
|
1766
|
+
}
|
|
1767
|
+
},
|
|
1768
|
+
/* Omgilibot */
|
|
1769
|
+
{
|
|
1770
|
+
test: [/omgilibot/i, /webzio-extended/i],
|
|
1771
|
+
describe() {
|
|
1772
|
+
return {
|
|
1773
|
+
type: PLATFORMS_MAP.bot,
|
|
1774
|
+
vendor: "Webz.io"
|
|
1775
|
+
};
|
|
1776
|
+
}
|
|
1777
|
+
},
|
|
1778
|
+
/* Diffbot */
|
|
1779
|
+
{
|
|
1780
|
+
test: [/diffbot/i],
|
|
1781
|
+
describe() {
|
|
1782
|
+
return {
|
|
1783
|
+
type: PLATFORMS_MAP.bot,
|
|
1784
|
+
vendor: "Diffbot"
|
|
1785
|
+
};
|
|
1786
|
+
}
|
|
1787
|
+
},
|
|
1788
|
+
/* PerplexityBot */
|
|
1789
|
+
{
|
|
1790
|
+
test: [/perplexitybot/i],
|
|
1791
|
+
describe() {
|
|
1792
|
+
return {
|
|
1793
|
+
type: PLATFORMS_MAP.bot,
|
|
1794
|
+
vendor: "Perplexity AI"
|
|
1795
|
+
};
|
|
1796
|
+
}
|
|
1797
|
+
},
|
|
1798
|
+
/* Perplexity-User */
|
|
1799
|
+
{
|
|
1800
|
+
test: [/perplexity-user/i],
|
|
1801
|
+
describe() {
|
|
1802
|
+
return {
|
|
1803
|
+
type: PLATFORMS_MAP.bot,
|
|
1804
|
+
vendor: "Perplexity AI"
|
|
1805
|
+
};
|
|
1806
|
+
}
|
|
1807
|
+
},
|
|
1808
|
+
/* YouBot */
|
|
1809
|
+
{
|
|
1810
|
+
test: [/youbot/i],
|
|
1811
|
+
describe() {
|
|
1812
|
+
return {
|
|
1813
|
+
type: PLATFORMS_MAP.bot,
|
|
1814
|
+
vendor: "You.com"
|
|
1815
|
+
};
|
|
1816
|
+
}
|
|
1817
|
+
},
|
|
1818
|
+
/* Internet Archive Crawler */
|
|
1819
|
+
{
|
|
1820
|
+
test: [/ia_archiver/i],
|
|
1821
|
+
describe() {
|
|
1822
|
+
return {
|
|
1823
|
+
type: PLATFORMS_MAP.bot,
|
|
1824
|
+
vendor: "Internet Archive"
|
|
1825
|
+
};
|
|
1826
|
+
}
|
|
1827
|
+
},
|
|
1828
|
+
/* Meta-WebIndexer */
|
|
1829
|
+
{
|
|
1830
|
+
test: [/meta-webindexer/i],
|
|
1831
|
+
describe() {
|
|
1832
|
+
return {
|
|
1833
|
+
type: PLATFORMS_MAP.bot,
|
|
1834
|
+
vendor: "Meta"
|
|
1835
|
+
};
|
|
1836
|
+
}
|
|
1837
|
+
},
|
|
1838
|
+
/* Meta-ExternalAds */
|
|
1839
|
+
{
|
|
1840
|
+
test: [/meta-externalads/i],
|
|
1841
|
+
describe() {
|
|
1842
|
+
return {
|
|
1843
|
+
type: PLATFORMS_MAP.bot,
|
|
1844
|
+
vendor: "Meta"
|
|
1845
|
+
};
|
|
1846
|
+
}
|
|
1847
|
+
},
|
|
1848
|
+
/* Meta-ExternalAgent */
|
|
1849
|
+
{
|
|
1850
|
+
test: [/meta-externalagent/i],
|
|
1851
|
+
describe() {
|
|
1852
|
+
return {
|
|
1853
|
+
type: PLATFORMS_MAP.bot,
|
|
1854
|
+
vendor: "Meta"
|
|
1855
|
+
};
|
|
1856
|
+
}
|
|
1857
|
+
},
|
|
1858
|
+
/* Meta-ExternalFetcher */
|
|
1859
|
+
{
|
|
1860
|
+
test: [/meta-externalfetcher/i],
|
|
1861
|
+
describe() {
|
|
1862
|
+
return {
|
|
1863
|
+
type: PLATFORMS_MAP.bot,
|
|
1864
|
+
vendor: "Meta"
|
|
1865
|
+
};
|
|
1866
|
+
}
|
|
1867
|
+
},
|
|
1868
|
+
/* Meta Web Crawler */
|
|
1869
|
+
{
|
|
1870
|
+
test: [/facebookexternalhit/i, /facebookcatalog/i],
|
|
1871
|
+
describe() {
|
|
1872
|
+
return {
|
|
1873
|
+
type: PLATFORMS_MAP.bot,
|
|
1874
|
+
vendor: "Meta"
|
|
1875
|
+
};
|
|
1876
|
+
}
|
|
1877
|
+
},
|
|
1878
|
+
/* SlackBot */
|
|
1879
|
+
{
|
|
1880
|
+
test: [/slackbot/i, /slack-imgProxy/i],
|
|
1881
|
+
describe() {
|
|
1882
|
+
return {
|
|
1883
|
+
type: PLATFORMS_MAP.bot,
|
|
1884
|
+
vendor: "Slack"
|
|
1885
|
+
};
|
|
1886
|
+
}
|
|
1887
|
+
},
|
|
1888
|
+
/* Yahoo! Slurp */
|
|
1889
|
+
{
|
|
1890
|
+
test: [/yahoo/i],
|
|
1891
|
+
describe() {
|
|
1892
|
+
return {
|
|
1893
|
+
type: PLATFORMS_MAP.bot,
|
|
1894
|
+
vendor: "Yahoo"
|
|
1895
|
+
};
|
|
1896
|
+
}
|
|
1897
|
+
},
|
|
1898
|
+
/* Yandex */
|
|
1899
|
+
{
|
|
1900
|
+
test: [/yandexbot/i, /yandexmobilebot/i],
|
|
1901
|
+
describe() {
|
|
1902
|
+
return {
|
|
1903
|
+
type: PLATFORMS_MAP.bot,
|
|
1904
|
+
vendor: "Yandex"
|
|
1905
|
+
};
|
|
1906
|
+
}
|
|
1907
|
+
},
|
|
1908
|
+
/* Pingdom */
|
|
1909
|
+
{
|
|
1910
|
+
test: [/pingdom/i],
|
|
1911
|
+
describe() {
|
|
1912
|
+
return {
|
|
1913
|
+
type: PLATFORMS_MAP.bot,
|
|
1914
|
+
vendor: "Pingdom"
|
|
1915
|
+
};
|
|
1916
|
+
}
|
|
1917
|
+
},
|
|
1918
|
+
/* Huawei */
|
|
1919
|
+
{
|
|
1920
|
+
test: [/huawei/i],
|
|
1921
|
+
describe(ua) {
|
|
1922
|
+
const model = Utils.getFirstMatch(/(can-l01)/i, ua) && "Nova";
|
|
1923
|
+
const platform = {
|
|
1924
|
+
type: PLATFORMS_MAP.mobile,
|
|
1925
|
+
vendor: "Huawei"
|
|
1926
|
+
};
|
|
1927
|
+
if (model) {
|
|
1928
|
+
platform.model = model;
|
|
1929
|
+
}
|
|
1930
|
+
return platform;
|
|
1931
|
+
}
|
|
1932
|
+
},
|
|
1933
|
+
/* Nexus Tablet */
|
|
1934
|
+
{
|
|
1935
|
+
test: [/nexus\s*(?:7|8|9|10).*/i],
|
|
1936
|
+
describe() {
|
|
1937
|
+
return {
|
|
1938
|
+
type: PLATFORMS_MAP.tablet,
|
|
1939
|
+
vendor: "Nexus"
|
|
1940
|
+
};
|
|
1941
|
+
}
|
|
1942
|
+
},
|
|
1943
|
+
/* iPad */
|
|
1944
|
+
{
|
|
1945
|
+
test: [/ipad/i],
|
|
1946
|
+
describe() {
|
|
1947
|
+
return {
|
|
1948
|
+
type: PLATFORMS_MAP.tablet,
|
|
1949
|
+
vendor: "Apple",
|
|
1950
|
+
model: "iPad"
|
|
1951
|
+
};
|
|
1952
|
+
}
|
|
1953
|
+
},
|
|
1954
|
+
/* Firefox on iPad */
|
|
1955
|
+
{
|
|
1956
|
+
test: [/Macintosh(.*?) FxiOS(.*?)\//],
|
|
1957
|
+
describe() {
|
|
1958
|
+
return {
|
|
1959
|
+
type: PLATFORMS_MAP.tablet,
|
|
1960
|
+
vendor: "Apple",
|
|
1961
|
+
model: "iPad"
|
|
1962
|
+
};
|
|
1963
|
+
}
|
|
1964
|
+
},
|
|
1965
|
+
/* Amazon Kindle Fire */
|
|
1966
|
+
{
|
|
1967
|
+
test: [/kftt build/i],
|
|
1968
|
+
describe() {
|
|
1969
|
+
return {
|
|
1970
|
+
type: PLATFORMS_MAP.tablet,
|
|
1971
|
+
vendor: "Amazon",
|
|
1972
|
+
model: "Kindle Fire HD 7"
|
|
1973
|
+
};
|
|
1974
|
+
}
|
|
1975
|
+
},
|
|
1976
|
+
/* Another Amazon Tablet with Silk */
|
|
1977
|
+
{
|
|
1978
|
+
test: [/silk/i],
|
|
1979
|
+
describe() {
|
|
1980
|
+
return {
|
|
1981
|
+
type: PLATFORMS_MAP.tablet,
|
|
1982
|
+
vendor: "Amazon"
|
|
1983
|
+
};
|
|
1984
|
+
}
|
|
1985
|
+
},
|
|
1986
|
+
/* Tablet */
|
|
1987
|
+
{
|
|
1988
|
+
test: [/tablet(?! pc)/i],
|
|
1989
|
+
describe() {
|
|
1990
|
+
return {
|
|
1991
|
+
type: PLATFORMS_MAP.tablet
|
|
1992
|
+
};
|
|
1993
|
+
}
|
|
1994
|
+
},
|
|
1995
|
+
/* iPod/iPhone */
|
|
1996
|
+
{
|
|
1997
|
+
test(parser) {
|
|
1998
|
+
const iDevice = parser.test(/ipod|iphone/i);
|
|
1999
|
+
const likeIDevice = parser.test(/like (ipod|iphone)/i);
|
|
2000
|
+
return iDevice && !likeIDevice;
|
|
2001
|
+
},
|
|
2002
|
+
describe(ua) {
|
|
2003
|
+
const model = Utils.getFirstMatch(/(ipod|iphone)/i, ua);
|
|
2004
|
+
return {
|
|
2005
|
+
type: PLATFORMS_MAP.mobile,
|
|
2006
|
+
vendor: "Apple",
|
|
2007
|
+
model
|
|
2008
|
+
};
|
|
2009
|
+
}
|
|
2010
|
+
},
|
|
2011
|
+
/* Nexus Mobile */
|
|
2012
|
+
{
|
|
2013
|
+
test: [/nexus\s*[0-6].*/i, /galaxy nexus/i],
|
|
2014
|
+
describe() {
|
|
2015
|
+
return {
|
|
2016
|
+
type: PLATFORMS_MAP.mobile,
|
|
2017
|
+
vendor: "Nexus"
|
|
2018
|
+
};
|
|
2019
|
+
}
|
|
2020
|
+
},
|
|
2021
|
+
/* Nokia */
|
|
2022
|
+
{
|
|
2023
|
+
test: [/Nokia/i],
|
|
2024
|
+
describe(ua) {
|
|
2025
|
+
const model = Utils.getFirstMatch(/Nokia\s+([0-9]+(\.[0-9]+)?)/i, ua);
|
|
2026
|
+
const platform = {
|
|
2027
|
+
type: PLATFORMS_MAP.mobile,
|
|
2028
|
+
vendor: "Nokia"
|
|
2029
|
+
};
|
|
2030
|
+
if (model) {
|
|
2031
|
+
platform.model = model;
|
|
2032
|
+
}
|
|
2033
|
+
return platform;
|
|
2034
|
+
}
|
|
2035
|
+
},
|
|
2036
|
+
/* Mobile */
|
|
2037
|
+
{
|
|
2038
|
+
test: [/[^-]mobi/i],
|
|
2039
|
+
describe() {
|
|
2040
|
+
return {
|
|
2041
|
+
type: PLATFORMS_MAP.mobile
|
|
2042
|
+
};
|
|
2043
|
+
}
|
|
2044
|
+
},
|
|
2045
|
+
/* BlackBerry */
|
|
2046
|
+
{
|
|
2047
|
+
test(parser) {
|
|
2048
|
+
return parser.getBrowserName(true) === "blackberry";
|
|
2049
|
+
},
|
|
2050
|
+
describe() {
|
|
2051
|
+
return {
|
|
2052
|
+
type: PLATFORMS_MAP.mobile,
|
|
2053
|
+
vendor: "BlackBerry"
|
|
2054
|
+
};
|
|
2055
|
+
}
|
|
2056
|
+
},
|
|
2057
|
+
/* Bada */
|
|
2058
|
+
{
|
|
2059
|
+
test(parser) {
|
|
2060
|
+
return parser.getBrowserName(true) === "bada";
|
|
2061
|
+
},
|
|
2062
|
+
describe() {
|
|
2063
|
+
return {
|
|
2064
|
+
type: PLATFORMS_MAP.mobile
|
|
2065
|
+
};
|
|
2066
|
+
}
|
|
2067
|
+
},
|
|
2068
|
+
/* Windows Phone */
|
|
2069
|
+
{
|
|
2070
|
+
test(parser) {
|
|
2071
|
+
return parser.getBrowserName() === "windows phone";
|
|
2072
|
+
},
|
|
2073
|
+
describe() {
|
|
2074
|
+
return {
|
|
2075
|
+
type: PLATFORMS_MAP.mobile,
|
|
2076
|
+
vendor: "Microsoft"
|
|
2077
|
+
};
|
|
2078
|
+
}
|
|
2079
|
+
},
|
|
2080
|
+
/* Android Tablet */
|
|
2081
|
+
{
|
|
2082
|
+
test(parser) {
|
|
2083
|
+
const osMajorVersion = Number(String(parser.getOSVersion()).split(".")[0]);
|
|
2084
|
+
return parser.getOSName(true) === "android" && osMajorVersion >= 3;
|
|
2085
|
+
},
|
|
2086
|
+
describe() {
|
|
2087
|
+
return {
|
|
2088
|
+
type: PLATFORMS_MAP.tablet
|
|
2089
|
+
};
|
|
2090
|
+
}
|
|
2091
|
+
},
|
|
2092
|
+
/* Android Mobile */
|
|
2093
|
+
{
|
|
2094
|
+
test(parser) {
|
|
2095
|
+
return parser.getOSName(true) === "android";
|
|
2096
|
+
},
|
|
2097
|
+
describe() {
|
|
2098
|
+
return {
|
|
2099
|
+
type: PLATFORMS_MAP.mobile
|
|
2100
|
+
};
|
|
2101
|
+
}
|
|
2102
|
+
},
|
|
2103
|
+
/* Smart TV */
|
|
2104
|
+
{
|
|
2105
|
+
test: [/smart-?tv|smarttv/i],
|
|
2106
|
+
describe() {
|
|
2107
|
+
return {
|
|
2108
|
+
type: PLATFORMS_MAP.tv
|
|
2109
|
+
};
|
|
2110
|
+
}
|
|
2111
|
+
},
|
|
2112
|
+
/* NetCast (LG Smart TV) */
|
|
2113
|
+
{
|
|
2114
|
+
test: [/netcast/i],
|
|
2115
|
+
describe() {
|
|
2116
|
+
return {
|
|
2117
|
+
type: PLATFORMS_MAP.tv
|
|
2118
|
+
};
|
|
2119
|
+
}
|
|
2120
|
+
},
|
|
2121
|
+
/* desktop */
|
|
2122
|
+
{
|
|
2123
|
+
test(parser) {
|
|
2124
|
+
return parser.getOSName(true) === "macos";
|
|
2125
|
+
},
|
|
2126
|
+
describe() {
|
|
2127
|
+
return {
|
|
2128
|
+
type: PLATFORMS_MAP.desktop,
|
|
2129
|
+
vendor: "Apple"
|
|
2130
|
+
};
|
|
2131
|
+
}
|
|
2132
|
+
},
|
|
2133
|
+
/* Windows */
|
|
2134
|
+
{
|
|
2135
|
+
test(parser) {
|
|
2136
|
+
return parser.getOSName(true) === "windows";
|
|
2137
|
+
},
|
|
2138
|
+
describe() {
|
|
2139
|
+
return {
|
|
2140
|
+
type: PLATFORMS_MAP.desktop
|
|
2141
|
+
};
|
|
2142
|
+
}
|
|
2143
|
+
},
|
|
2144
|
+
/* Linux */
|
|
2145
|
+
{
|
|
2146
|
+
test(parser) {
|
|
2147
|
+
return parser.getOSName(true) === "linux";
|
|
2148
|
+
},
|
|
2149
|
+
describe() {
|
|
2150
|
+
return {
|
|
2151
|
+
type: PLATFORMS_MAP.desktop
|
|
2152
|
+
};
|
|
2153
|
+
}
|
|
2154
|
+
},
|
|
2155
|
+
/* PlayStation 4 */
|
|
2156
|
+
{
|
|
2157
|
+
test(parser) {
|
|
2158
|
+
return parser.getOSName(true) === "playstation 4";
|
|
2159
|
+
},
|
|
2160
|
+
describe() {
|
|
2161
|
+
return {
|
|
2162
|
+
type: PLATFORMS_MAP.tv
|
|
2163
|
+
};
|
|
2164
|
+
}
|
|
2165
|
+
},
|
|
2166
|
+
/* Roku */
|
|
2167
|
+
{
|
|
2168
|
+
test(parser) {
|
|
2169
|
+
return parser.getOSName(true) === "roku";
|
|
2170
|
+
},
|
|
2171
|
+
describe() {
|
|
2172
|
+
return {
|
|
2173
|
+
type: PLATFORMS_MAP.tv
|
|
2174
|
+
};
|
|
2175
|
+
}
|
|
2176
|
+
}
|
|
2177
|
+
];
|
|
2178
|
+
|
|
2179
|
+
// ../../node_modules/bowser/src/parser-engines.js
|
|
2180
|
+
var parser_engines_default = [
|
|
2181
|
+
/* EdgeHTML */
|
|
2182
|
+
{
|
|
2183
|
+
test(parser) {
|
|
2184
|
+
return parser.getBrowserName(true) === "microsoft edge";
|
|
2185
|
+
},
|
|
2186
|
+
describe(ua) {
|
|
2187
|
+
const isBlinkBased = /\sedg\//i.test(ua);
|
|
2188
|
+
if (isBlinkBased) {
|
|
2189
|
+
return {
|
|
2190
|
+
name: ENGINE_MAP.Blink
|
|
2191
|
+
};
|
|
2192
|
+
}
|
|
2193
|
+
const version = Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, ua);
|
|
2194
|
+
return {
|
|
2195
|
+
name: ENGINE_MAP.EdgeHTML,
|
|
2196
|
+
version
|
|
2197
|
+
};
|
|
2198
|
+
}
|
|
2199
|
+
},
|
|
2200
|
+
/* Trident */
|
|
2201
|
+
{
|
|
2202
|
+
test: [/trident/i],
|
|
2203
|
+
describe(ua) {
|
|
2204
|
+
const engine = {
|
|
2205
|
+
name: ENGINE_MAP.Trident
|
|
2206
|
+
};
|
|
2207
|
+
const version = Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, ua);
|
|
2208
|
+
if (version) {
|
|
2209
|
+
engine.version = version;
|
|
2210
|
+
}
|
|
2211
|
+
return engine;
|
|
2212
|
+
}
|
|
2213
|
+
},
|
|
2214
|
+
/* Presto */
|
|
2215
|
+
{
|
|
2216
|
+
test(parser) {
|
|
2217
|
+
return parser.test(/presto/i);
|
|
2218
|
+
},
|
|
2219
|
+
describe(ua) {
|
|
2220
|
+
const engine = {
|
|
2221
|
+
name: ENGINE_MAP.Presto
|
|
2222
|
+
};
|
|
2223
|
+
const version = Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, ua);
|
|
2224
|
+
if (version) {
|
|
2225
|
+
engine.version = version;
|
|
2226
|
+
}
|
|
2227
|
+
return engine;
|
|
2228
|
+
}
|
|
2229
|
+
},
|
|
2230
|
+
/* Gecko */
|
|
2231
|
+
{
|
|
2232
|
+
test(parser) {
|
|
2233
|
+
const isGecko = parser.test(/gecko/i);
|
|
2234
|
+
const likeGecko = parser.test(/like gecko/i);
|
|
2235
|
+
return isGecko && !likeGecko;
|
|
2236
|
+
},
|
|
2237
|
+
describe(ua) {
|
|
2238
|
+
const engine = {
|
|
2239
|
+
name: ENGINE_MAP.Gecko
|
|
2240
|
+
};
|
|
2241
|
+
const version = Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, ua);
|
|
2242
|
+
if (version) {
|
|
2243
|
+
engine.version = version;
|
|
2244
|
+
}
|
|
2245
|
+
return engine;
|
|
2246
|
+
}
|
|
2247
|
+
},
|
|
2248
|
+
/* Blink */
|
|
2249
|
+
{
|
|
2250
|
+
test: [/(apple)?webkit\/537\.36/i],
|
|
2251
|
+
describe() {
|
|
2252
|
+
return {
|
|
2253
|
+
name: ENGINE_MAP.Blink
|
|
2254
|
+
};
|
|
2255
|
+
}
|
|
2256
|
+
},
|
|
2257
|
+
/* WebKit */
|
|
2258
|
+
{
|
|
2259
|
+
test: [/(apple)?webkit/i],
|
|
2260
|
+
describe(ua) {
|
|
2261
|
+
const engine = {
|
|
2262
|
+
name: ENGINE_MAP.WebKit
|
|
2263
|
+
};
|
|
2264
|
+
const version = Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, ua);
|
|
2265
|
+
if (version) {
|
|
2266
|
+
engine.version = version;
|
|
2267
|
+
}
|
|
2268
|
+
return engine;
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
];
|
|
2272
|
+
|
|
2273
|
+
// ../../node_modules/bowser/src/parser.js
|
|
2274
|
+
var Parser = class {
|
|
2275
|
+
/**
|
|
2276
|
+
* Create instance of Parser
|
|
2277
|
+
*
|
|
2278
|
+
* @param {String} UA User-Agent string
|
|
2279
|
+
* @param {Boolean|ClientHints} [skipParsingOrHints=false] Either a boolean to skip parsing,
|
|
2280
|
+
* or a ClientHints object containing User-Agent Client Hints data
|
|
2281
|
+
* @param {ClientHints} [clientHints] User-Agent Client Hints data (navigator.userAgentData)
|
|
2282
|
+
*
|
|
2283
|
+
* @throw {Error} in case of empty UA String
|
|
2284
|
+
*
|
|
2285
|
+
* @constructor
|
|
2286
|
+
*/
|
|
2287
|
+
constructor(UA, skipParsingOrHints = false, clientHints = null) {
|
|
2288
|
+
if (UA === void 0 || UA === null || UA === "") {
|
|
2289
|
+
throw new Error("UserAgent parameter can't be empty");
|
|
2290
|
+
}
|
|
2291
|
+
this._ua = UA;
|
|
2292
|
+
let skipParsing = false;
|
|
2293
|
+
if (typeof skipParsingOrHints === "boolean") {
|
|
2294
|
+
skipParsing = skipParsingOrHints;
|
|
2295
|
+
this._hints = clientHints;
|
|
2296
|
+
} else if (skipParsingOrHints != null && typeof skipParsingOrHints === "object") {
|
|
2297
|
+
this._hints = skipParsingOrHints;
|
|
2298
|
+
} else {
|
|
2299
|
+
this._hints = null;
|
|
2300
|
+
}
|
|
2301
|
+
this.parsedResult = {};
|
|
2302
|
+
if (skipParsing !== true) {
|
|
2303
|
+
this.parse();
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
2306
|
+
/**
|
|
2307
|
+
* Get Client Hints data
|
|
2308
|
+
* @return {ClientHints|null}
|
|
2309
|
+
*
|
|
2310
|
+
* @public
|
|
2311
|
+
* @example
|
|
2312
|
+
* const parser = Bowser.getParser(UA, clientHints);
|
|
2313
|
+
* const hints = parser.getHints();
|
|
2314
|
+
* console.log(hints.platform); // 'Windows'
|
|
2315
|
+
* console.log(hints.mobile); // false
|
|
2316
|
+
*/
|
|
2317
|
+
getHints() {
|
|
2318
|
+
return this._hints;
|
|
2319
|
+
}
|
|
2320
|
+
/**
|
|
2321
|
+
* Check if a brand exists in Client Hints brands array
|
|
2322
|
+
* @param {string} brandName The brand name to check for
|
|
2323
|
+
* @return {boolean}
|
|
2324
|
+
*
|
|
2325
|
+
* @public
|
|
2326
|
+
* @example
|
|
2327
|
+
* const parser = Bowser.getParser(UA, clientHints);
|
|
2328
|
+
* if (parser.hasBrand('Google Chrome')) {
|
|
2329
|
+
* console.log('Chrome detected!');
|
|
2330
|
+
* }
|
|
2331
|
+
*/
|
|
2332
|
+
hasBrand(brandName) {
|
|
2333
|
+
if (!this._hints || !Array.isArray(this._hints.brands)) {
|
|
2334
|
+
return false;
|
|
2335
|
+
}
|
|
2336
|
+
const brandLower = brandName.toLowerCase();
|
|
2337
|
+
return this._hints.brands.some(
|
|
2338
|
+
(b) => b.brand && b.brand.toLowerCase() === brandLower
|
|
2339
|
+
);
|
|
2340
|
+
}
|
|
2341
|
+
/**
|
|
2342
|
+
* Get brand version from Client Hints
|
|
2343
|
+
* @param {string} brandName The brand name to get version for
|
|
2344
|
+
* @return {string|undefined}
|
|
2345
|
+
*
|
|
2346
|
+
* @public
|
|
2347
|
+
* @example
|
|
2348
|
+
* const parser = Bowser.getParser(UA, clientHints);
|
|
2349
|
+
* const version = parser.getBrandVersion('Google Chrome');
|
|
2350
|
+
* console.log(version); // '131'
|
|
2351
|
+
*/
|
|
2352
|
+
getBrandVersion(brandName) {
|
|
2353
|
+
if (!this._hints || !Array.isArray(this._hints.brands)) {
|
|
2354
|
+
return void 0;
|
|
2355
|
+
}
|
|
2356
|
+
const brandLower = brandName.toLowerCase();
|
|
2357
|
+
const brand = this._hints.brands.find(
|
|
2358
|
+
(b) => b.brand && b.brand.toLowerCase() === brandLower
|
|
2359
|
+
);
|
|
2360
|
+
return brand ? brand.version : void 0;
|
|
2361
|
+
}
|
|
2362
|
+
/**
|
|
2363
|
+
* Get UserAgent string of current Parser instance
|
|
2364
|
+
* @return {String} User-Agent String of the current <Parser> object
|
|
2365
|
+
*
|
|
2366
|
+
* @public
|
|
2367
|
+
*/
|
|
2368
|
+
getUA() {
|
|
2369
|
+
return this._ua;
|
|
2370
|
+
}
|
|
2371
|
+
/**
|
|
2372
|
+
* Test a UA string for a regexp
|
|
2373
|
+
* @param {RegExp} regex
|
|
2374
|
+
* @return {Boolean}
|
|
2375
|
+
*/
|
|
2376
|
+
test(regex) {
|
|
2377
|
+
return regex.test(this._ua);
|
|
2378
|
+
}
|
|
2379
|
+
/**
|
|
2380
|
+
* Get parsed browser object
|
|
2381
|
+
* @return {Object}
|
|
2382
|
+
*/
|
|
2383
|
+
parseBrowser() {
|
|
2384
|
+
this.parsedResult.browser = {};
|
|
2385
|
+
const browserDescriptor = Utils.find(parser_browsers_default, (_browser) => {
|
|
2386
|
+
if (typeof _browser.test === "function") {
|
|
2387
|
+
return _browser.test(this);
|
|
2388
|
+
}
|
|
2389
|
+
if (Array.isArray(_browser.test)) {
|
|
2390
|
+
return _browser.test.some((condition) => this.test(condition));
|
|
2391
|
+
}
|
|
2392
|
+
throw new Error("Browser's test function is not valid");
|
|
2393
|
+
});
|
|
2394
|
+
if (browserDescriptor) {
|
|
2395
|
+
this.parsedResult.browser = browserDescriptor.describe(this.getUA(), this);
|
|
2396
|
+
}
|
|
2397
|
+
return this.parsedResult.browser;
|
|
2398
|
+
}
|
|
2399
|
+
/**
|
|
2400
|
+
* Get parsed browser object
|
|
2401
|
+
* @return {Object}
|
|
2402
|
+
*
|
|
2403
|
+
* @public
|
|
2404
|
+
*/
|
|
2405
|
+
getBrowser() {
|
|
2406
|
+
if (this.parsedResult.browser) {
|
|
2407
|
+
return this.parsedResult.browser;
|
|
2408
|
+
}
|
|
2409
|
+
return this.parseBrowser();
|
|
2410
|
+
}
|
|
2411
|
+
/**
|
|
2412
|
+
* Get browser's name
|
|
2413
|
+
* @return {String} Browser's name or an empty string
|
|
2414
|
+
*
|
|
2415
|
+
* @public
|
|
2416
|
+
*/
|
|
2417
|
+
getBrowserName(toLowerCase) {
|
|
2418
|
+
if (toLowerCase) {
|
|
2419
|
+
return String(this.getBrowser().name).toLowerCase() || "";
|
|
2420
|
+
}
|
|
2421
|
+
return this.getBrowser().name || "";
|
|
2422
|
+
}
|
|
2423
|
+
/**
|
|
2424
|
+
* Get browser's version
|
|
2425
|
+
* @return {String} version of browser
|
|
2426
|
+
*
|
|
2427
|
+
* @public
|
|
2428
|
+
*/
|
|
2429
|
+
getBrowserVersion() {
|
|
2430
|
+
return this.getBrowser().version;
|
|
2431
|
+
}
|
|
2432
|
+
/**
|
|
2433
|
+
* Get OS
|
|
2434
|
+
* @return {Object}
|
|
2435
|
+
*
|
|
2436
|
+
* @example
|
|
2437
|
+
* this.getOS();
|
|
2438
|
+
* {
|
|
2439
|
+
* name: 'macOS',
|
|
2440
|
+
* version: '10.11.12'
|
|
2441
|
+
* }
|
|
2442
|
+
*/
|
|
2443
|
+
getOS() {
|
|
2444
|
+
if (this.parsedResult.os) {
|
|
2445
|
+
return this.parsedResult.os;
|
|
2446
|
+
}
|
|
2447
|
+
return this.parseOS();
|
|
2448
|
+
}
|
|
2449
|
+
/**
|
|
2450
|
+
* Parse OS and save it to this.parsedResult.os
|
|
2451
|
+
* @return {*|{}}
|
|
2452
|
+
*/
|
|
2453
|
+
parseOS() {
|
|
2454
|
+
this.parsedResult.os = {};
|
|
2455
|
+
const os = Utils.find(parser_os_default, (_os) => {
|
|
2456
|
+
if (typeof _os.test === "function") {
|
|
2457
|
+
return _os.test(this);
|
|
2458
|
+
}
|
|
2459
|
+
if (Array.isArray(_os.test)) {
|
|
2460
|
+
return _os.test.some((condition) => this.test(condition));
|
|
2461
|
+
}
|
|
2462
|
+
throw new Error("Browser's test function is not valid");
|
|
2463
|
+
});
|
|
2464
|
+
if (os) {
|
|
2465
|
+
this.parsedResult.os = os.describe(this.getUA());
|
|
2466
|
+
}
|
|
2467
|
+
return this.parsedResult.os;
|
|
2468
|
+
}
|
|
2469
|
+
/**
|
|
2470
|
+
* Get OS name
|
|
2471
|
+
* @param {Boolean} [toLowerCase] return lower-cased value
|
|
2472
|
+
* @return {String} name of the OS — macOS, Windows, Linux, etc.
|
|
2473
|
+
*/
|
|
2474
|
+
getOSName(toLowerCase) {
|
|
2475
|
+
const { name } = this.getOS();
|
|
2476
|
+
if (toLowerCase) {
|
|
2477
|
+
return String(name).toLowerCase() || "";
|
|
2478
|
+
}
|
|
2479
|
+
return name || "";
|
|
2480
|
+
}
|
|
2481
|
+
/**
|
|
2482
|
+
* Get OS version
|
|
2483
|
+
* @return {String} full version with dots ('10.11.12', '5.6', etc)
|
|
2484
|
+
*/
|
|
2485
|
+
getOSVersion() {
|
|
2486
|
+
return this.getOS().version;
|
|
2487
|
+
}
|
|
2488
|
+
/**
|
|
2489
|
+
* Get parsed platform
|
|
2490
|
+
* @return {{}}
|
|
2491
|
+
*/
|
|
2492
|
+
getPlatform() {
|
|
2493
|
+
if (this.parsedResult.platform) {
|
|
2494
|
+
return this.parsedResult.platform;
|
|
2495
|
+
}
|
|
2496
|
+
return this.parsePlatform();
|
|
2497
|
+
}
|
|
2498
|
+
/**
|
|
2499
|
+
* Get platform name
|
|
2500
|
+
* @param {Boolean} [toLowerCase=false]
|
|
2501
|
+
* @return {*}
|
|
2502
|
+
*/
|
|
2503
|
+
getPlatformType(toLowerCase = false) {
|
|
2504
|
+
const { type } = this.getPlatform();
|
|
2505
|
+
if (toLowerCase) {
|
|
2506
|
+
return String(type).toLowerCase() || "";
|
|
2507
|
+
}
|
|
2508
|
+
return type || "";
|
|
2509
|
+
}
|
|
2510
|
+
/**
|
|
2511
|
+
* Get parsed platform
|
|
2512
|
+
* @return {{}}
|
|
2513
|
+
*/
|
|
2514
|
+
parsePlatform() {
|
|
2515
|
+
this.parsedResult.platform = {};
|
|
2516
|
+
const platform = Utils.find(parser_platforms_default, (_platform) => {
|
|
2517
|
+
if (typeof _platform.test === "function") {
|
|
2518
|
+
return _platform.test(this);
|
|
2519
|
+
}
|
|
2520
|
+
if (Array.isArray(_platform.test)) {
|
|
2521
|
+
return _platform.test.some((condition) => this.test(condition));
|
|
2522
|
+
}
|
|
2523
|
+
throw new Error("Browser's test function is not valid");
|
|
2524
|
+
});
|
|
2525
|
+
if (platform) {
|
|
2526
|
+
this.parsedResult.platform = platform.describe(this.getUA());
|
|
2527
|
+
}
|
|
2528
|
+
return this.parsedResult.platform;
|
|
2529
|
+
}
|
|
2530
|
+
/**
|
|
2531
|
+
* Get parsed engine
|
|
2532
|
+
* @return {{}}
|
|
2533
|
+
*/
|
|
2534
|
+
getEngine() {
|
|
2535
|
+
if (this.parsedResult.engine) {
|
|
2536
|
+
return this.parsedResult.engine;
|
|
2537
|
+
}
|
|
2538
|
+
return this.parseEngine();
|
|
2539
|
+
}
|
|
2540
|
+
/**
|
|
2541
|
+
* Get engines's name
|
|
2542
|
+
* @return {String} Engines's name or an empty string
|
|
2543
|
+
*
|
|
2544
|
+
* @public
|
|
2545
|
+
*/
|
|
2546
|
+
getEngineName(toLowerCase) {
|
|
2547
|
+
if (toLowerCase) {
|
|
2548
|
+
return String(this.getEngine().name).toLowerCase() || "";
|
|
2549
|
+
}
|
|
2550
|
+
return this.getEngine().name || "";
|
|
2551
|
+
}
|
|
2552
|
+
/**
|
|
2553
|
+
* Get parsed platform
|
|
2554
|
+
* @return {{}}
|
|
2555
|
+
*/
|
|
2556
|
+
parseEngine() {
|
|
2557
|
+
this.parsedResult.engine = {};
|
|
2558
|
+
const engine = Utils.find(parser_engines_default, (_engine) => {
|
|
2559
|
+
if (typeof _engine.test === "function") {
|
|
2560
|
+
return _engine.test(this);
|
|
2561
|
+
}
|
|
2562
|
+
if (Array.isArray(_engine.test)) {
|
|
2563
|
+
return _engine.test.some((condition) => this.test(condition));
|
|
2564
|
+
}
|
|
2565
|
+
throw new Error("Browser's test function is not valid");
|
|
2566
|
+
});
|
|
2567
|
+
if (engine) {
|
|
2568
|
+
this.parsedResult.engine = engine.describe(this.getUA());
|
|
2569
|
+
}
|
|
2570
|
+
return this.parsedResult.engine;
|
|
2571
|
+
}
|
|
2572
|
+
/**
|
|
2573
|
+
* Parse full information about the browser
|
|
2574
|
+
* @returns {Parser}
|
|
2575
|
+
*/
|
|
2576
|
+
parse() {
|
|
2577
|
+
this.parseBrowser();
|
|
2578
|
+
this.parseOS();
|
|
2579
|
+
this.parsePlatform();
|
|
2580
|
+
this.parseEngine();
|
|
2581
|
+
return this;
|
|
2582
|
+
}
|
|
2583
|
+
/**
|
|
2584
|
+
* Get parsed result
|
|
2585
|
+
* @return {ParsedResult}
|
|
2586
|
+
*/
|
|
2587
|
+
getResult() {
|
|
2588
|
+
return Utils.assign({}, this.parsedResult);
|
|
2589
|
+
}
|
|
2590
|
+
/**
|
|
2591
|
+
* Check if parsed browser matches certain conditions
|
|
2592
|
+
*
|
|
2593
|
+
* @param {Object} checkTree It's one or two layered object,
|
|
2594
|
+
* which can include a platform or an OS on the first layer
|
|
2595
|
+
* and should have browsers specs on the bottom-laying layer
|
|
2596
|
+
*
|
|
2597
|
+
* @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not.
|
|
2598
|
+
* Returns `undefined` when the browser is no described in the checkTree object.
|
|
2599
|
+
*
|
|
2600
|
+
* @example
|
|
2601
|
+
* const browser = Bowser.getParser(window.navigator.userAgent);
|
|
2602
|
+
* if (browser.satisfies({chrome: '>118.01.1322' }))
|
|
2603
|
+
* // or with os
|
|
2604
|
+
* if (browser.satisfies({windows: { chrome: '>118.01.1322' } }))
|
|
2605
|
+
* // or with platforms
|
|
2606
|
+
* if (browser.satisfies({desktop: { chrome: '>118.01.1322' } }))
|
|
2607
|
+
*/
|
|
2608
|
+
satisfies(checkTree) {
|
|
2609
|
+
const platformsAndOSes = {};
|
|
2610
|
+
let platformsAndOSCounter = 0;
|
|
2611
|
+
const browsers = {};
|
|
2612
|
+
let browsersCounter = 0;
|
|
2613
|
+
const allDefinitions = Object.keys(checkTree);
|
|
2614
|
+
allDefinitions.forEach((key) => {
|
|
2615
|
+
const currentDefinition = checkTree[key];
|
|
2616
|
+
if (typeof currentDefinition === "string") {
|
|
2617
|
+
browsers[key] = currentDefinition;
|
|
2618
|
+
browsersCounter += 1;
|
|
2619
|
+
} else if (typeof currentDefinition === "object") {
|
|
2620
|
+
platformsAndOSes[key] = currentDefinition;
|
|
2621
|
+
platformsAndOSCounter += 1;
|
|
2622
|
+
}
|
|
2623
|
+
});
|
|
2624
|
+
if (platformsAndOSCounter > 0) {
|
|
2625
|
+
const platformsAndOSNames = Object.keys(platformsAndOSes);
|
|
2626
|
+
const OSMatchingDefinition = Utils.find(platformsAndOSNames, (name) => this.isOS(name));
|
|
2627
|
+
if (OSMatchingDefinition) {
|
|
2628
|
+
const osResult = this.satisfies(platformsAndOSes[OSMatchingDefinition]);
|
|
2629
|
+
if (osResult !== void 0) {
|
|
2630
|
+
return osResult;
|
|
2631
|
+
}
|
|
2632
|
+
}
|
|
2633
|
+
const platformMatchingDefinition = Utils.find(
|
|
2634
|
+
platformsAndOSNames,
|
|
2635
|
+
(name) => this.isPlatform(name)
|
|
2636
|
+
);
|
|
2637
|
+
if (platformMatchingDefinition) {
|
|
2638
|
+
const platformResult = this.satisfies(platformsAndOSes[platformMatchingDefinition]);
|
|
2639
|
+
if (platformResult !== void 0) {
|
|
2640
|
+
return platformResult;
|
|
2641
|
+
}
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
if (browsersCounter > 0) {
|
|
2645
|
+
const browserNames = Object.keys(browsers);
|
|
2646
|
+
const matchingDefinition = Utils.find(browserNames, (name) => this.isBrowser(name, true));
|
|
2647
|
+
if (matchingDefinition !== void 0) {
|
|
2648
|
+
return this.compareVersion(browsers[matchingDefinition]);
|
|
2649
|
+
}
|
|
2650
|
+
}
|
|
2651
|
+
return void 0;
|
|
2652
|
+
}
|
|
2653
|
+
/**
|
|
2654
|
+
* Check if the browser name equals the passed string
|
|
2655
|
+
* @param {string} browserName The string to compare with the browser name
|
|
2656
|
+
* @param [includingAlias=false] The flag showing whether alias will be included into comparison
|
|
2657
|
+
* @returns {boolean}
|
|
2658
|
+
*/
|
|
2659
|
+
isBrowser(browserName, includingAlias = false) {
|
|
2660
|
+
const defaultBrowserName = this.getBrowserName().toLowerCase();
|
|
2661
|
+
let browserNameLower = browserName.toLowerCase();
|
|
2662
|
+
const alias = Utils.getBrowserTypeByAlias(browserNameLower);
|
|
2663
|
+
if (includingAlias && alias) {
|
|
2664
|
+
browserNameLower = alias.toLowerCase();
|
|
2665
|
+
}
|
|
2666
|
+
return browserNameLower === defaultBrowserName;
|
|
2667
|
+
}
|
|
2668
|
+
compareVersion(version) {
|
|
2669
|
+
let expectedResults = [0];
|
|
2670
|
+
let comparableVersion = version;
|
|
2671
|
+
let isLoose = false;
|
|
2672
|
+
const currentBrowserVersion = this.getBrowserVersion();
|
|
2673
|
+
if (typeof currentBrowserVersion !== "string") {
|
|
2674
|
+
return void 0;
|
|
2675
|
+
}
|
|
2676
|
+
if (version[0] === ">" || version[0] === "<") {
|
|
2677
|
+
comparableVersion = version.substr(1);
|
|
2678
|
+
if (version[1] === "=") {
|
|
2679
|
+
isLoose = true;
|
|
2680
|
+
comparableVersion = version.substr(2);
|
|
2681
|
+
} else {
|
|
2682
|
+
expectedResults = [];
|
|
2683
|
+
}
|
|
2684
|
+
if (version[0] === ">") {
|
|
2685
|
+
expectedResults.push(1);
|
|
2686
|
+
} else {
|
|
2687
|
+
expectedResults.push(-1);
|
|
2688
|
+
}
|
|
2689
|
+
} else if (version[0] === "=") {
|
|
2690
|
+
comparableVersion = version.substr(1);
|
|
2691
|
+
} else if (version[0] === "~") {
|
|
2692
|
+
isLoose = true;
|
|
2693
|
+
comparableVersion = version.substr(1);
|
|
2694
|
+
}
|
|
2695
|
+
return expectedResults.indexOf(
|
|
2696
|
+
Utils.compareVersions(currentBrowserVersion, comparableVersion, isLoose)
|
|
2697
|
+
) > -1;
|
|
2698
|
+
}
|
|
2699
|
+
/**
|
|
2700
|
+
* Check if the OS name equals the passed string
|
|
2701
|
+
* @param {string} osName The string to compare with the OS name
|
|
2702
|
+
* @returns {boolean}
|
|
2703
|
+
*/
|
|
2704
|
+
isOS(osName) {
|
|
2705
|
+
return this.getOSName(true) === String(osName).toLowerCase();
|
|
2706
|
+
}
|
|
2707
|
+
/**
|
|
2708
|
+
* Check if the platform type equals the passed string
|
|
2709
|
+
* @param {string} platformType The string to compare with the platform type
|
|
2710
|
+
* @returns {boolean}
|
|
2711
|
+
*/
|
|
2712
|
+
isPlatform(platformType) {
|
|
2713
|
+
return this.getPlatformType(true) === String(platformType).toLowerCase();
|
|
2714
|
+
}
|
|
2715
|
+
/**
|
|
2716
|
+
* Check if the engine name equals the passed string
|
|
2717
|
+
* @param {string} engineName The string to compare with the engine name
|
|
2718
|
+
* @returns {boolean}
|
|
2719
|
+
*/
|
|
2720
|
+
isEngine(engineName) {
|
|
2721
|
+
return this.getEngineName(true) === String(engineName).toLowerCase();
|
|
2722
|
+
}
|
|
2723
|
+
/**
|
|
2724
|
+
* Is anything? Check if the browser is called "anything",
|
|
2725
|
+
* the OS called "anything" or the platform called "anything"
|
|
2726
|
+
* @param {String} anything
|
|
2727
|
+
* @param [includingAlias=false] The flag showing whether alias will be included into comparison
|
|
2728
|
+
* @returns {Boolean}
|
|
2729
|
+
*/
|
|
2730
|
+
is(anything, includingAlias = false) {
|
|
2731
|
+
return this.isBrowser(anything, includingAlias) || this.isOS(anything) || this.isPlatform(anything);
|
|
2732
|
+
}
|
|
2733
|
+
/**
|
|
2734
|
+
* Check if any of the given values satisfies this.is(anything)
|
|
2735
|
+
* @param {String[]} anythings
|
|
2736
|
+
* @returns {Boolean}
|
|
2737
|
+
*/
|
|
2738
|
+
some(anythings = []) {
|
|
2739
|
+
return anythings.some((anything) => this.is(anything));
|
|
2740
|
+
}
|
|
2741
|
+
};
|
|
2742
|
+
var parser_default = Parser;
|
|
2743
|
+
|
|
2744
|
+
// ../../node_modules/bowser/src/bowser.js
|
|
2745
|
+
var Bowser = class {
|
|
2746
|
+
/**
|
|
2747
|
+
* Creates a {@link Parser} instance
|
|
2748
|
+
*
|
|
2749
|
+
* @param {String} UA UserAgent string
|
|
2750
|
+
* @param {Boolean|Object} [skipParsingOrHints=false] Either a boolean to skip parsing,
|
|
2751
|
+
* or a ClientHints object (navigator.userAgentData)
|
|
2752
|
+
* @param {Object} [clientHints] User-Agent Client Hints data (navigator.userAgentData)
|
|
2753
|
+
* @returns {Parser}
|
|
2754
|
+
* @throws {Error} when UA is not a String
|
|
2755
|
+
*
|
|
2756
|
+
* @example
|
|
2757
|
+
* const parser = Bowser.getParser(window.navigator.userAgent);
|
|
2758
|
+
* const result = parser.getResult();
|
|
2759
|
+
*
|
|
2760
|
+
* @example
|
|
2761
|
+
* // With User-Agent Client Hints
|
|
2762
|
+
* const parser = Bowser.getParser(
|
|
2763
|
+
* window.navigator.userAgent,
|
|
2764
|
+
* window.navigator.userAgentData
|
|
2765
|
+
* );
|
|
2766
|
+
*/
|
|
2767
|
+
static getParser(UA, skipParsingOrHints = false, clientHints = null) {
|
|
2768
|
+
if (typeof UA !== "string") {
|
|
2769
|
+
throw new Error("UserAgent should be a string");
|
|
2770
|
+
}
|
|
2771
|
+
return new parser_default(UA, skipParsingOrHints, clientHints);
|
|
2772
|
+
}
|
|
2773
|
+
/**
|
|
2774
|
+
* Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately
|
|
2775
|
+
*
|
|
2776
|
+
* @param {String} UA UserAgent string
|
|
2777
|
+
* @param {Object} [clientHints] User-Agent Client Hints data (navigator.userAgentData)
|
|
2778
|
+
* @return {ParsedResult}
|
|
2779
|
+
*
|
|
2780
|
+
* @example
|
|
2781
|
+
* const result = Bowser.parse(window.navigator.userAgent);
|
|
2782
|
+
*
|
|
2783
|
+
* @example
|
|
2784
|
+
* // With User-Agent Client Hints
|
|
2785
|
+
* const result = Bowser.parse(
|
|
2786
|
+
* window.navigator.userAgent,
|
|
2787
|
+
* window.navigator.userAgentData
|
|
2788
|
+
* );
|
|
2789
|
+
*/
|
|
2790
|
+
static parse(UA, clientHints = null) {
|
|
2791
|
+
return new parser_default(UA, clientHints).getResult();
|
|
2792
|
+
}
|
|
2793
|
+
static get BROWSER_MAP() {
|
|
2794
|
+
return BROWSER_MAP;
|
|
2795
|
+
}
|
|
2796
|
+
static get ENGINE_MAP() {
|
|
2797
|
+
return ENGINE_MAP;
|
|
2798
|
+
}
|
|
2799
|
+
static get OS_MAP() {
|
|
2800
|
+
return OS_MAP;
|
|
2801
|
+
}
|
|
2802
|
+
static get PLATFORMS_MAP() {
|
|
2803
|
+
return PLATFORMS_MAP;
|
|
2804
|
+
}
|
|
2805
|
+
};
|
|
2806
|
+
var bowser_default = Bowser;
|
|
2807
|
+
export {
|
|
2808
|
+
bowser_default as default
|
|
2809
|
+
};
|
|
2810
|
+
/*! Bundled license information:
|
|
2811
|
+
|
|
2812
|
+
bowser/src/bowser.js:
|
|
2813
|
+
(*!
|
|
2814
|
+
* Bowser - a browser detector
|
|
2815
|
+
* https://github.com/bowser-js/bowser
|
|
2816
|
+
* MIT License | (c) Dustin Diaz 2012-2015
|
|
2817
|
+
* MIT License | (c) Denis Demchenko 2015-2019
|
|
2818
|
+
*)
|
|
2819
|
+
*/
|
|
2820
|
+
//# sourceMappingURL=bowser-D72SKZAH.js.map
|