@bigbinary/neeto-molecules 4.1.41 → 4.1.43
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/dist/BrowserSupport.js +1 -1
- package/dist/DownloadMobileAppCallout.js +1 -1
- package/dist/ErrorPage.js +3 -3
- package/dist/ErrorPage.js.map +1 -1
- package/dist/FloatingActionMenu.js +3 -3
- package/dist/FloatingActionMenu.js.map +1 -1
- package/dist/KeyboardShortcuts.js +2 -2
- package/dist/ProductEmbed.js +15 -15
- package/dist/ProductEmbed.js.map +1 -1
- package/dist/ShareViaLink.js +446 -179
- package/dist/ShareViaLink.js.map +1 -1
- package/dist/Sidebar.js +1 -1
- package/dist/StickyRibbonsContainer.js +3 -3
- package/dist/StickyRibbonsContainer.js.map +1 -1
- package/dist/cjs/BrowserSupport.js +1 -1
- package/dist/cjs/DownloadMobileAppCallout.js +1 -1
- package/dist/cjs/ErrorPage.js +2 -2
- package/dist/cjs/ErrorPage.js.map +1 -1
- package/dist/cjs/FloatingActionMenu.js +3 -3
- package/dist/cjs/FloatingActionMenu.js.map +1 -1
- package/dist/cjs/KeyboardShortcuts.js +2 -2
- package/dist/cjs/ProductEmbed.js +14 -14
- package/dist/cjs/ProductEmbed.js.map +1 -1
- package/dist/cjs/ShareViaLink.js +446 -179
- package/dist/cjs/ShareViaLink.js.map +1 -1
- package/dist/cjs/Sidebar.js +1 -1
- package/dist/cjs/StickyRibbonsContainer.js +2 -2
- package/dist/cjs/StickyRibbonsContainer.js.map +1 -1
- package/dist/cjs/{ua-parser-E0eEtHJZ.js → ua-parser-DgQ3nYoO.js} +327 -306
- package/dist/cjs/ua-parser-DgQ3nYoO.js.map +1 -0
- package/dist/cjs/{useKeyboardShortcutsPaneState-YnXpWOcs.js → useKeyboardShortcutsPaneState-BrgdLb9F.js} +3 -3
- package/dist/cjs/{useKeyboardShortcutsPaneState-YnXpWOcs.js.map → useKeyboardShortcutsPaneState-BrgdLb9F.js.map} +1 -1
- package/dist/{ua-parser-rRwDJPFB.js → ua-parser-OzUiuIwt.js} +327 -306
- package/dist/ua-parser-OzUiuIwt.js.map +1 -0
- package/dist/{useKeyboardShortcutsPaneState-C_eLceJQ.js → useKeyboardShortcutsPaneState-Ckzn5mVZ.js} +4 -4
- package/dist/{useKeyboardShortcutsPaneState-C_eLceJQ.js.map → useKeyboardShortcutsPaneState-Ckzn5mVZ.js.map} +1 -1
- package/package.json +57 -57
- package/src/translations/ar.json +7 -0
- package/src/translations/bg.json +7 -0
- package/src/translations/ca.json +7 -0
- package/src/translations/cs.json +7 -0
- package/src/translations/da.json +7 -0
- package/src/translations/de.json +7 -0
- package/src/translations/es-MX.json +7 -0
- package/src/translations/es.json +7 -0
- package/src/translations/et.json +7 -0
- package/src/translations/fi.json +7 -0
- package/src/translations/fil.json +7 -0
- package/src/translations/fr.json +7 -0
- package/src/translations/he.json +7 -0
- package/src/translations/hi.json +7 -0
- package/src/translations/hr.json +7 -0
- package/src/translations/hu.json +7 -0
- package/src/translations/id.json +7 -0
- package/src/translations/it.json +7 -0
- package/src/translations/ja.json +7 -0
- package/src/translations/ko.json +7 -0
- package/src/translations/nl.json +7 -0
- package/src/translations/pl.json +7 -0
- package/src/translations/pt-BR.json +7 -0
- package/src/translations/pt.json +7 -0
- package/src/translations/ro.json +7 -0
- package/src/translations/ru.json +7 -0
- package/src/translations/sk.json +7 -0
- package/src/translations/sl.json +7 -0
- package/src/translations/sv.json +7 -0
- package/src/translations/th.json +7 -0
- package/src/translations/tr.json +7 -0
- package/src/translations/uk.json +7 -0
- package/src/translations/vi.json +7 -0
- package/src/translations/zh-CN.json +7 -0
- package/src/translations/zh-TW.json +7 -0
- package/dist/cjs/ua-parser-E0eEtHJZ.js.map +0 -1
- package/dist/ua-parser-rRwDJPFB.js.map +0 -1
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// Source: /src/main/ua-parser.js
|
|
6
6
|
|
|
7
7
|
/////////////////////////////////////////////////////////////////////////////////
|
|
8
|
-
/* UAParser.js v2.0.
|
|
9
|
-
Copyright © 2012-
|
|
8
|
+
/* UAParser.js v2.0.9
|
|
9
|
+
Copyright © 2012-2026 Faisal Salman <f@faisalman.com>
|
|
10
10
|
AGPLv3 License *//*
|
|
11
11
|
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
|
12
12
|
Supports browser & node.js environment.
|
|
@@ -23,26 +23,26 @@
|
|
|
23
23
|
// Constants
|
|
24
24
|
/////////////
|
|
25
25
|
|
|
26
|
-
var LIBVERSION = '2.0.
|
|
26
|
+
var LIBVERSION = '2.0.9',
|
|
27
27
|
UA_MAX_LENGTH = 500,
|
|
28
28
|
USER_AGENT = 'user-agent',
|
|
29
29
|
EMPTY = '',
|
|
30
30
|
UNKNOWN = '?',
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
TYPEOF = {
|
|
32
|
+
FUNCTION : 'function',
|
|
33
|
+
OBJECT : 'object',
|
|
34
|
+
STRING : 'string',
|
|
35
|
+
UNDEFINED : 'undefined'
|
|
36
|
+
},
|
|
37
37
|
|
|
38
38
|
// properties
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
BROWSER = 'browser',
|
|
40
|
+
CPU = 'cpu',
|
|
41
|
+
DEVICE = 'device',
|
|
42
|
+
ENGINE = 'engine',
|
|
43
|
+
OS = 'os',
|
|
44
|
+
RESULT = 'result',
|
|
45
|
+
|
|
46
46
|
NAME = 'name',
|
|
47
47
|
TYPE = 'type',
|
|
48
48
|
VENDOR = 'vendor',
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
EMBEDDED = 'embedded',
|
|
62
62
|
|
|
63
63
|
// browser types
|
|
64
|
+
FETCHER = 'fetcher',
|
|
64
65
|
INAPP = 'inapp',
|
|
65
66
|
|
|
66
67
|
// client hints
|
|
@@ -70,16 +71,16 @@
|
|
|
70
71
|
PLATFORM = 'platform',
|
|
71
72
|
PLATFORMVER = 'platformVersion',
|
|
72
73
|
BITNESS = 'bitness',
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
CH_ALL_VALUES
|
|
74
|
+
CH = 'sec-ch-ua',
|
|
75
|
+
CH_FULL_VER_LIST= CH + '-full-version-list',
|
|
76
|
+
CH_ARCH = CH + '-arch',
|
|
77
|
+
CH_BITNESS = CH + '-' + BITNESS,
|
|
78
|
+
CH_FORM_FACTORS = CH + '-form-factors',
|
|
79
|
+
CH_MOBILE = CH + '-' + MOBILE,
|
|
80
|
+
CH_MODEL = CH + '-' + MODEL,
|
|
81
|
+
CH_PLATFORM = CH + '-' + PLATFORM,
|
|
82
|
+
CH_PLATFORM_VER = CH_PLATFORM + '-version',
|
|
83
|
+
CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
|
|
83
84
|
|
|
84
85
|
// device vendors
|
|
85
86
|
AMAZON = 'Amazon',
|
|
@@ -118,7 +119,7 @@
|
|
|
118
119
|
// os
|
|
119
120
|
WINDOWS = 'Windows';
|
|
120
121
|
|
|
121
|
-
var isWindow = typeof window !==
|
|
122
|
+
var isWindow = typeof window !== TYPEOF.UNDEFINED,
|
|
122
123
|
NAVIGATOR = (isWindow && window.navigator) ?
|
|
123
124
|
window.navigator :
|
|
124
125
|
undefined,
|
|
@@ -154,7 +155,7 @@
|
|
|
154
155
|
return enums;
|
|
155
156
|
},
|
|
156
157
|
has = function (str1, str2) {
|
|
157
|
-
if (typeof str1 ===
|
|
158
|
+
if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
|
|
158
159
|
for (var i in str1) {
|
|
159
160
|
if (lowerize(str2) == lowerize(str1[i])) return true;
|
|
160
161
|
}
|
|
@@ -168,7 +169,7 @@
|
|
|
168
169
|
}
|
|
169
170
|
},
|
|
170
171
|
isString = function (val) {
|
|
171
|
-
return typeof val ===
|
|
172
|
+
return typeof val === TYPEOF.STRING;
|
|
172
173
|
},
|
|
173
174
|
itemListToArray = function (header) {
|
|
174
175
|
if (!header) return undefined;
|
|
@@ -195,7 +196,7 @@
|
|
|
195
196
|
if (!arr.hasOwnProperty(i)) continue;
|
|
196
197
|
|
|
197
198
|
var propName = arr[i];
|
|
198
|
-
if (typeof propName ==
|
|
199
|
+
if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
|
|
199
200
|
this[propName[0]] = propName[1];
|
|
200
201
|
} else {
|
|
201
202
|
this[propName] = undefined;
|
|
@@ -210,10 +211,8 @@
|
|
|
210
211
|
return strip(/\\?\"/g, str);
|
|
211
212
|
},
|
|
212
213
|
trim = function (str, len) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
|
|
216
|
-
}
|
|
214
|
+
str = strip(/^\s\s*/, String(str));
|
|
215
|
+
return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
|
|
217
216
|
};
|
|
218
217
|
|
|
219
218
|
///////////////
|
|
@@ -244,9 +243,9 @@
|
|
|
244
243
|
match = matches[++k];
|
|
245
244
|
q = props[p];
|
|
246
245
|
// check if given property is actually array
|
|
247
|
-
if (typeof q ===
|
|
246
|
+
if (typeof q === TYPEOF.OBJECT && q.length > 0) {
|
|
248
247
|
if (q.length === 2) {
|
|
249
|
-
if (typeof q[1] ==
|
|
248
|
+
if (typeof q[1] == TYPEOF.FUNCTION) {
|
|
250
249
|
// assign modified match
|
|
251
250
|
this[q[0]] = q[1].call(this, match);
|
|
252
251
|
} else {
|
|
@@ -255,7 +254,7 @@
|
|
|
255
254
|
}
|
|
256
255
|
} else if (q.length >= 3) {
|
|
257
256
|
// Check whether q[1] FUNCTION or REGEX
|
|
258
|
-
if (typeof q[1] ===
|
|
257
|
+
if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
|
|
259
258
|
if (q.length > 3) {
|
|
260
259
|
this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
|
|
261
260
|
} else {
|
|
@@ -287,7 +286,7 @@
|
|
|
287
286
|
|
|
288
287
|
for (var i in map) {
|
|
289
288
|
// check if current value is array
|
|
290
|
-
if (typeof map[i] ===
|
|
289
|
+
if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
|
|
291
290
|
for (var j = 0; j < map[i].length; j++) {
|
|
292
291
|
if (has(map[i][j], str)) {
|
|
293
292
|
return (i === UNKNOWN) ? undefined : i;
|
|
@@ -381,10 +380,12 @@
|
|
|
381
380
|
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
|
|
382
381
|
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
|
|
383
382
|
|
|
384
|
-
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble
|
|
385
|
-
/(flock|rockmelt|midori|epiphany|silk|skyfire|
|
|
386
|
-
// Rekonq/Puffin/
|
|
387
|
-
/(
|
|
383
|
+
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon/HiBrowser
|
|
384
|
+
/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
|
|
385
|
+
// Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
|
|
386
|
+
/(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
|
|
387
|
+
/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // Aloha/HeyTap/Ovi/115/Surf
|
|
388
|
+
/(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
|
|
388
389
|
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
|
|
389
390
|
], [NAME, VERSION], [
|
|
390
391
|
/quark(?:pc)?\/([-\w\.]+)/i // Quark
|
|
@@ -405,11 +406,15 @@
|
|
|
405
406
|
], [VERSION, [NAME, 'Yandex']], [
|
|
406
407
|
/slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
|
|
407
408
|
], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
|
|
408
|
-
/(
|
|
409
|
+
/(av(?:ast|g|ira))\/([\w\.]+)/i // Avast/AVG/Avira Secure Browser
|
|
409
410
|
], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
|
|
411
|
+
/norton\/([\w\.]+)/i // Norton Private Browser
|
|
412
|
+
], [VERSION, [NAME, 'Norton Private' + SUFFIX_BROWSER]], [
|
|
410
413
|
/\bfocus\/([\w\.]+)/i // Firefox Focus
|
|
411
414
|
], [VERSION, [NAME, FIREFOX+' Focus']], [
|
|
412
|
-
|
|
415
|
+
/ mms\/([\w\.]+)$/i // Opera Neon
|
|
416
|
+
], [VERSION, [NAME, OPERA+' Neon']], [
|
|
417
|
+
/ opt\/([\w\.]+)$/i // Opera Touch
|
|
413
418
|
], [VERSION, [NAME, OPERA+' Touch']], [
|
|
414
419
|
/coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
|
|
415
420
|
], [VERSION, [NAME, 'Coc Coc']], [
|
|
@@ -437,10 +442,9 @@
|
|
|
437
442
|
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
|
|
438
443
|
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
|
|
439
444
|
], [NAME, VERSION], [
|
|
440
|
-
/(lbbrowser|rekonq)/i
|
|
445
|
+
/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Luakit/Rekonq/Steam
|
|
441
446
|
], [NAME], [
|
|
442
|
-
/ome\/([\w\.]+)
|
|
443
|
-
/ome\/([\w\.]+).+qihu (360)[es]e/i // 360
|
|
447
|
+
/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i // Iron / 360
|
|
444
448
|
], [VERSION, NAME], [
|
|
445
449
|
|
|
446
450
|
// WebView
|
|
@@ -453,11 +457,12 @@
|
|
|
453
457
|
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
|
|
454
458
|
/(alipay)client\/([\w\.]+)/i, // Alipay
|
|
455
459
|
/(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
|
|
460
|
+
/(bing)(?:web|sapphire)\/([\w\.]+)/i, // Bing
|
|
456
461
|
/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
|
|
457
462
|
], [NAME, VERSION, [TYPE, INAPP]], [
|
|
458
463
|
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
|
|
459
464
|
], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
|
|
460
|
-
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
|
|
465
|
+
/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
|
|
461
466
|
], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
|
|
462
467
|
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android
|
|
463
468
|
], [NAME, [TYPE, INAPP]], [
|
|
@@ -467,6 +472,9 @@
|
|
|
467
472
|
/(chromium)[\/ ]([-\w\.]+)/i // Chromium
|
|
468
473
|
], [NAME, VERSION], [
|
|
469
474
|
|
|
475
|
+
/ome-(lighthouse)$/i // Chrome Lighthouse
|
|
476
|
+
], [NAME, [TYPE, FETCHER]], [
|
|
477
|
+
|
|
470
478
|
/headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
|
|
471
479
|
], [VERSION, [NAME, CHROME+' Headless']], [
|
|
472
480
|
|
|
@@ -510,10 +518,10 @@
|
|
|
510
518
|
/(swiftfox)/i, // Swiftfox
|
|
511
519
|
/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
|
|
512
520
|
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
|
513
|
-
/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|
|
|
521
|
+
/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
|
|
514
522
|
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
|
515
523
|
/(firefox)\/([\w\.]+)/i, // Other Firefox-based
|
|
516
|
-
/(mozilla)\/([\w\.]+
|
|
524
|
+
/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i, // Mozilla
|
|
517
525
|
|
|
518
526
|
// Other
|
|
519
527
|
/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
|
@@ -551,6 +559,8 @@
|
|
|
551
559
|
/((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC
|
|
552
560
|
/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha
|
|
553
561
|
], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
|
|
562
|
+
/mc680.0/i
|
|
563
|
+
], [[ARCHITECTURE, '68k']], [
|
|
554
564
|
/winnt.+\[axp/i
|
|
555
565
|
], [[ARCHITECTURE, 'alpha']]
|
|
556
566
|
],
|
|
@@ -570,11 +580,10 @@
|
|
|
570
580
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
|
|
571
581
|
|
|
572
582
|
// Apple
|
|
573
|
-
/(?:\/|\()(ip(?:hone|od)[\w, ]*)
|
|
583
|
+
/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i // iPod/iPhone
|
|
574
584
|
], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
|
|
575
|
-
/\(
|
|
576
|
-
|
|
577
|
-
/\b(ipad)\d\d?,\d\d?[;\]].+ios/i
|
|
585
|
+
/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, // iPad
|
|
586
|
+
/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
|
|
578
587
|
], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
|
|
579
588
|
/(macintosh);/i
|
|
580
589
|
], [MODEL, [VENDOR, APPLE]], [
|
|
@@ -592,26 +601,26 @@
|
|
|
592
601
|
// Huawei
|
|
593
602
|
/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
|
|
594
603
|
], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
|
|
595
|
-
/(?:huawei)([-\w ]+)[;\)]/i,
|
|
596
|
-
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][
|
|
604
|
+
/(?:huawei) ?([-\w ]+)[;\)]/i,
|
|
605
|
+
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
|
|
597
606
|
], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
|
|
598
607
|
|
|
599
608
|
// Xiaomi
|
|
600
609
|
/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
|
|
601
|
-
/\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i
|
|
610
|
+
/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
|
|
602
611
|
],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
|
|
603
612
|
|
|
604
|
-
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
|
|
605
613
|
/\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
|
606
614
|
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
|
|
607
|
-
|
|
608
|
-
/oid[^\)]+; (m?[12][
|
|
609
|
-
|
|
615
|
+
// Xiaomi Redmi / POCO / Black Shark / Qin
|
|
616
|
+
/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
|
|
617
|
+
// Xiaomi Mi
|
|
618
|
+
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
|
|
610
619
|
/ ([\w ]+) miui\/v?\d/i
|
|
611
620
|
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
|
|
612
621
|
|
|
613
622
|
// OnePlus
|
|
614
|
-
/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-
|
|
623
|
+
/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,
|
|
615
624
|
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
|
|
616
625
|
], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
|
|
617
626
|
|
|
@@ -651,7 +660,7 @@
|
|
|
651
660
|
], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
|
|
652
661
|
|
|
653
662
|
// LG
|
|
654
|
-
|
|
663
|
+
/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
|
|
655
664
|
], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
|
|
656
665
|
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
|
|
657
666
|
/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
|
|
@@ -662,7 +671,7 @@
|
|
|
662
671
|
/(nokia) (t[12][01])/i
|
|
663
672
|
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
|
664
673
|
/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
|
|
665
|
-
/nokia[-_ ]?(([-\w\. ]
|
|
674
|
+
/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
|
|
666
675
|
], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
|
|
667
676
|
|
|
668
677
|
// Google
|
|
@@ -693,7 +702,7 @@
|
|
|
693
702
|
/(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
|
|
694
703
|
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
|
695
704
|
/\b((?:bb[a-f]|st[hv])100-\d)/i,
|
|
696
|
-
|
|
705
|
+
/(?:blackberry|\(bb10;) (\w+)/i
|
|
697
706
|
], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
|
|
698
707
|
|
|
699
708
|
// Asus
|
|
@@ -773,10 +782,12 @@
|
|
|
773
782
|
|
|
774
783
|
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
|
|
775
784
|
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
|
|
776
|
-
|
|
785
|
+
// BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
|
|
786
|
+
/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
|
|
777
787
|
/(hp) ([\w ]+\w)/i, // HP iPAQ
|
|
778
788
|
/(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
|
|
779
789
|
/(oppo) ?([\w ]+) bui/i, // OPPO
|
|
790
|
+
/(hisense) ([ehv][\w ]+)\)/i, // Hisense
|
|
780
791
|
/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips
|
|
781
792
|
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
|
782
793
|
|
|
@@ -853,10 +864,10 @@
|
|
|
853
864
|
], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
|
|
854
865
|
/(ouya)/i, // Ouya
|
|
855
866
|
/(nintendo) (\w+)/i, // Nintendo
|
|
856
|
-
/(retroid) (pocket ([^\)]+))/i
|
|
857
|
-
|
|
858
|
-
/droid.+; (shield)( bui|\))/i
|
|
859
|
-
], [
|
|
867
|
+
/(retroid) (pocket ([^\)]+))/i, // Retroid Pocket
|
|
868
|
+
/(valve).+(steam deck)/i,
|
|
869
|
+
/droid.+; ((shield|rgcube|gr0006))( bui|\))/i // Nvidia Portable/Anbernic/Logitech
|
|
870
|
+
], [[VENDOR, strMapper, { 'Nvidia': 'Shield', 'Anbernic': 'RGCUBE', 'Logitech': 'GR0006' }], MODEL, [TYPE, CONSOLE]], [
|
|
860
871
|
|
|
861
872
|
///////////////////
|
|
862
873
|
// WEARABLES
|
|
@@ -865,7 +876,7 @@
|
|
|
865
876
|
/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
|
|
866
877
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
|
|
867
878
|
/((pebble))app/i, // Pebble
|
|
868
|
-
/(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i
|
|
879
|
+
/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch / Xiaomi Watch
|
|
869
880
|
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
|
870
881
|
/(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
|
|
871
882
|
], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
|
|
@@ -916,7 +927,7 @@
|
|
|
916
927
|
], [MODEL, [TYPE, SMARTTV]], [
|
|
917
928
|
/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
|
|
918
929
|
], [[TYPE, SMARTTV]], [
|
|
919
|
-
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i
|
|
930
|
+
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
|
|
920
931
|
], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
|
|
921
932
|
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
|
|
922
933
|
], [[TYPE, TABLET]], [
|
|
@@ -940,7 +951,7 @@
|
|
|
940
951
|
/(presto)\/([\w\.]+)/i, // Presto
|
|
941
952
|
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
|
|
942
953
|
/ekioh(flow)\/([\w\.]+)/i, // Flow
|
|
943
|
-
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
|
|
954
|
+
/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links/Dillo
|
|
944
955
|
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
|
|
945
956
|
|
|
946
957
|
/\b(libweb)/i // LibWeb
|
|
@@ -969,7 +980,8 @@
|
|
|
969
980
|
|
|
970
981
|
// iOS/macOS
|
|
971
982
|
/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
|
|
972
|
-
/(?:ios;fbsv
|
|
983
|
+
/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
|
|
984
|
+
/\btvos ?([\w\.]+)/i,
|
|
973
985
|
/cfnetwork\/.+darwin/i
|
|
974
986
|
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
|
975
987
|
/(mac os x) ?([\w\. ]*)/i,
|
|
@@ -1001,7 +1013,7 @@
|
|
|
1001
1013
|
], [VERSION, [NAME, BLACKBERRY]], [
|
|
1002
1014
|
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
|
|
1003
1015
|
], [VERSION, [NAME, 'Symbian']], [
|
|
1004
|
-
/mozilla\/[\d\.]+ \((?:mobile
|
|
1016
|
+
/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i // Firefox OS
|
|
1005
1017
|
], [VERSION, [NAME, FIREFOX+' OS']], [
|
|
1006
1018
|
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
|
|
1007
1019
|
/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
|
|
@@ -1009,15 +1021,16 @@
|
|
|
1009
1021
|
/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
|
|
1010
1022
|
// https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
|
|
1011
1023
|
], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
|
|
1012
|
-
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
|
|
1024
|
+
/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i // watchOS
|
|
1013
1025
|
], [VERSION, [NAME, 'watchOS']], [
|
|
1014
1026
|
|
|
1015
1027
|
// Google ChromeOS
|
|
1016
|
-
/
|
|
1017
|
-
], [[NAME,
|
|
1028
|
+
/cros [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
|
|
1029
|
+
], [VERSION, [NAME, 'Chrome OS']],[
|
|
1018
1030
|
|
|
1019
1031
|
// Smart TVs
|
|
1020
|
-
/
|
|
1032
|
+
/kepler ([\w\.]+); (aft|aeo)/i // Vega OS
|
|
1033
|
+
], [VERSION, [NAME, 'Vega OS']],[
|
|
1021
1034
|
/(netrange)mmh/i, // Netrange
|
|
1022
1035
|
/(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
|
|
1023
1036
|
|
|
@@ -1054,27 +1067,27 @@
|
|
|
1054
1067
|
var defaultProps = (function () {
|
|
1055
1068
|
var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
|
|
1056
1069
|
setProps.call(props.init, [
|
|
1057
|
-
[
|
|
1058
|
-
[
|
|
1059
|
-
[
|
|
1060
|
-
[
|
|
1061
|
-
[
|
|
1070
|
+
[BROWSER, [NAME, VERSION, MAJOR, TYPE]],
|
|
1071
|
+
[CPU, [ARCHITECTURE]],
|
|
1072
|
+
[DEVICE, [TYPE, MODEL, VENDOR]],
|
|
1073
|
+
[ENGINE, [NAME, VERSION]],
|
|
1074
|
+
[OS, [NAME, VERSION]]
|
|
1062
1075
|
]);
|
|
1063
1076
|
setProps.call(props.isIgnore, [
|
|
1064
|
-
[
|
|
1065
|
-
[
|
|
1066
|
-
[
|
|
1077
|
+
[BROWSER, [VERSION, MAJOR]],
|
|
1078
|
+
[ENGINE, [VERSION]],
|
|
1079
|
+
[OS, [VERSION]]
|
|
1067
1080
|
]);
|
|
1068
1081
|
setProps.call(props.isIgnoreRgx, [
|
|
1069
|
-
[
|
|
1070
|
-
[
|
|
1082
|
+
[BROWSER, / ?browser$/i],
|
|
1083
|
+
[OS, / ?os$/i]
|
|
1071
1084
|
]);
|
|
1072
1085
|
setProps.call(props.toString, [
|
|
1073
|
-
[
|
|
1074
|
-
[
|
|
1075
|
-
[
|
|
1076
|
-
[
|
|
1077
|
-
[
|
|
1086
|
+
[BROWSER, [NAME, VERSION]],
|
|
1087
|
+
[CPU, [ARCHITECTURE]],
|
|
1088
|
+
[DEVICE, [VENDOR, MODEL]],
|
|
1089
|
+
[ENGINE, [NAME, VERSION]],
|
|
1090
|
+
[OS, [NAME, VERSION]]
|
|
1078
1091
|
]);
|
|
1079
1092
|
return props;
|
|
1080
1093
|
})();
|
|
@@ -1118,14 +1131,14 @@
|
|
|
1118
1131
|
return item.detectFeature().get();
|
|
1119
1132
|
};
|
|
1120
1133
|
|
|
1121
|
-
if (itemType !=
|
|
1134
|
+
if (itemType != RESULT) {
|
|
1122
1135
|
IData.prototype.is = function (strToCheck) {
|
|
1123
1136
|
var is = false;
|
|
1124
1137
|
for (var i in this) {
|
|
1125
1138
|
if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
|
|
1126
1139
|
is = true;
|
|
1127
|
-
if (strToCheck !=
|
|
1128
|
-
} else if (strToCheck ==
|
|
1140
|
+
if (strToCheck != TYPEOF.UNDEFINED) break;
|
|
1141
|
+
} else if (strToCheck == TYPEOF.UNDEFINED && is) {
|
|
1129
1142
|
is = !is;
|
|
1130
1143
|
break;
|
|
1131
1144
|
}
|
|
@@ -1135,33 +1148,33 @@
|
|
|
1135
1148
|
IData.prototype.toString = function () {
|
|
1136
1149
|
var str = EMPTY;
|
|
1137
1150
|
for (var i in toString_props) {
|
|
1138
|
-
if (typeof(this[toString_props[i]]) !==
|
|
1151
|
+
if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {
|
|
1139
1152
|
str += (str ? ' ' : EMPTY) + this[toString_props[i]];
|
|
1140
1153
|
}
|
|
1141
1154
|
}
|
|
1142
|
-
return str ||
|
|
1155
|
+
return str || TYPEOF.UNDEFINED;
|
|
1143
1156
|
};
|
|
1144
1157
|
}
|
|
1145
1158
|
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
var
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
this[prop] = that[prop];
|
|
1153
|
-
}
|
|
1159
|
+
IData.prototype.then = function (cb) {
|
|
1160
|
+
var that = this;
|
|
1161
|
+
var IDataResolve = function () {
|
|
1162
|
+
for (var prop in that) {
|
|
1163
|
+
if (that.hasOwnProperty(prop)) {
|
|
1164
|
+
this[prop] = that[prop];
|
|
1154
1165
|
}
|
|
1155
|
-
}
|
|
1156
|
-
IDataResolve.prototype = {
|
|
1157
|
-
is : IData.prototype.is,
|
|
1158
|
-
toString : IData.prototype.toString
|
|
1159
|
-
};
|
|
1160
|
-
var resolveData = new IDataResolve();
|
|
1161
|
-
cb(resolveData);
|
|
1162
|
-
return resolveData;
|
|
1166
|
+
}
|
|
1163
1167
|
};
|
|
1164
|
-
|
|
1168
|
+
IDataResolve.prototype = {
|
|
1169
|
+
is : IData.prototype.is,
|
|
1170
|
+
toString : IData.prototype.toString,
|
|
1171
|
+
withClientHints : IData.prototype.withClientHints,
|
|
1172
|
+
withFeatureCheck : IData.prototype.withFeatureCheck
|
|
1173
|
+
};
|
|
1174
|
+
var resolveData = new IDataResolve();
|
|
1175
|
+
cb(resolveData);
|
|
1176
|
+
return resolveData;
|
|
1177
|
+
};
|
|
1165
1178
|
|
|
1166
1179
|
return new IData();
|
|
1167
1180
|
};
|
|
@@ -1175,212 +1188,221 @@
|
|
|
1175
1188
|
setProps.call(this, CH_ALL_VALUES);
|
|
1176
1189
|
if (isHttpUACH) {
|
|
1177
1190
|
setProps.call(this, [
|
|
1178
|
-
[BRANDS, itemListToArray(uach[
|
|
1179
|
-
[FULLVERLIST, itemListToArray(uach[
|
|
1180
|
-
[MOBILE, /\?1/.test(uach[
|
|
1181
|
-
[MODEL, stripQuotes(uach[
|
|
1182
|
-
[PLATFORM, stripQuotes(uach[
|
|
1183
|
-
[PLATFORMVER, stripQuotes(uach[
|
|
1184
|
-
[ARCHITECTURE, stripQuotes(uach[
|
|
1185
|
-
[FORMFACTORS, itemListToArray(uach[
|
|
1186
|
-
[BITNESS, stripQuotes(uach[
|
|
1191
|
+
[BRANDS, itemListToArray(uach[CH])],
|
|
1192
|
+
[FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
|
|
1193
|
+
[MOBILE, /\?1/.test(uach[CH_MOBILE])],
|
|
1194
|
+
[MODEL, stripQuotes(uach[CH_MODEL])],
|
|
1195
|
+
[PLATFORM, stripQuotes(uach[CH_PLATFORM])],
|
|
1196
|
+
[PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
|
|
1197
|
+
[ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
|
|
1198
|
+
[FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
|
|
1199
|
+
[BITNESS, stripQuotes(uach[CH_BITNESS])]
|
|
1187
1200
|
]);
|
|
1188
1201
|
} else {
|
|
1189
1202
|
for (var prop in uach) {
|
|
1190
|
-
if(this.hasOwnProperty(prop) && typeof uach[prop] !==
|
|
1203
|
+
if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
|
|
1191
1204
|
}
|
|
1192
1205
|
}
|
|
1193
1206
|
}
|
|
1194
1207
|
|
|
1195
1208
|
function UAItem (itemType, ua, rgxMap, uaCH) {
|
|
1209
|
+
setProps.call(this, [
|
|
1210
|
+
['itemType', itemType],
|
|
1211
|
+
['ua', ua],
|
|
1212
|
+
['uaCH', uaCH],
|
|
1213
|
+
['rgxMap', rgxMap],
|
|
1214
|
+
['data', createIData(this, itemType)]
|
|
1215
|
+
]);
|
|
1216
|
+
return this;
|
|
1217
|
+
}
|
|
1196
1218
|
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
this.set = function (prop, val) {
|
|
1203
|
-
this.data[prop] = val;
|
|
1204
|
-
return this;
|
|
1205
|
-
};
|
|
1206
|
-
|
|
1207
|
-
this.setCH = function (ch) {
|
|
1208
|
-
this.uaCH = ch;
|
|
1209
|
-
return this;
|
|
1210
|
-
};
|
|
1219
|
+
UAItem.prototype.get = function (prop) {
|
|
1220
|
+
if (!prop) return this.data;
|
|
1221
|
+
return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
|
|
1222
|
+
};
|
|
1211
1223
|
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
// Brave-specific detection
|
|
1217
|
-
if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
|
|
1218
|
-
this.set(NAME, 'Brave');
|
|
1219
|
-
}
|
|
1220
|
-
break;
|
|
1221
|
-
case UA_DEVICE:
|
|
1222
|
-
// Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
|
|
1223
|
-
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
|
|
1224
|
-
this.set(TYPE, MOBILE);
|
|
1225
|
-
}
|
|
1226
|
-
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties
|
|
1227
|
-
if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
|
|
1228
|
-
this.set(MODEL, 'iPad')
|
|
1229
|
-
.set(TYPE, TABLET);
|
|
1230
|
-
}
|
|
1231
|
-
break;
|
|
1232
|
-
case UA_OS:
|
|
1233
|
-
// Chrome-specific detection: check for 'platform' value of navigator.userAgentData
|
|
1234
|
-
if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
|
|
1235
|
-
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
|
|
1236
|
-
}
|
|
1237
|
-
break;
|
|
1238
|
-
case UA_RESULT:
|
|
1239
|
-
var data = this.data;
|
|
1240
|
-
var detect = function (itemType) {
|
|
1241
|
-
return data[itemType]
|
|
1242
|
-
.getItem()
|
|
1243
|
-
.detectFeature()
|
|
1244
|
-
.get();
|
|
1245
|
-
};
|
|
1246
|
-
this.set(UA_BROWSER, detect(UA_BROWSER))
|
|
1247
|
-
.set(UA_CPU, detect(UA_CPU))
|
|
1248
|
-
.set(UA_DEVICE, detect(UA_DEVICE))
|
|
1249
|
-
.set(UA_ENGINE, detect(UA_ENGINE))
|
|
1250
|
-
.set(UA_OS, detect(UA_OS));
|
|
1251
|
-
}
|
|
1252
|
-
}
|
|
1253
|
-
return this;
|
|
1254
|
-
};
|
|
1224
|
+
UAItem.prototype.set = function (prop, val) {
|
|
1225
|
+
this.data[prop] = val;
|
|
1226
|
+
return this;
|
|
1227
|
+
};
|
|
1255
1228
|
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
if (this.itemType == UA_BROWSER) {
|
|
1261
|
-
this.set(MAJOR, majorize(this.get(VERSION)));
|
|
1262
|
-
}
|
|
1263
|
-
return this;
|
|
1264
|
-
};
|
|
1229
|
+
UAItem.prototype.setCH = function (ch) {
|
|
1230
|
+
this.uaCH = ch;
|
|
1231
|
+
return this;
|
|
1232
|
+
};
|
|
1265
1233
|
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
rgxMap = this.rgxMap;
|
|
1269
|
-
|
|
1234
|
+
UAItem.prototype.detectFeature = function () {
|
|
1235
|
+
if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
|
|
1270
1236
|
switch (this.itemType) {
|
|
1271
|
-
case
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
for (var i=0; i<brands.length; i++) {
|
|
1276
|
-
var brandName = brands[i].brand || brands[i],
|
|
1277
|
-
brandVersion = brands[i].version;
|
|
1278
|
-
if (this.itemType == UA_BROWSER &&
|
|
1279
|
-
!/not.a.brand/i.test(brandName) &&
|
|
1280
|
-
(!prevName ||
|
|
1281
|
-
(/Chrom/.test(prevName) && brandName != CHROMIUM) ||
|
|
1282
|
-
(prevName == EDGE && /WebView2/.test(brandName))
|
|
1283
|
-
)) {
|
|
1284
|
-
brandName = strMapper(brandName, browserHintsMap);
|
|
1285
|
-
prevName = this.get(NAME);
|
|
1286
|
-
if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
|
|
1287
|
-
this.set(NAME, brandName)
|
|
1288
|
-
.set(VERSION, brandVersion)
|
|
1289
|
-
.set(MAJOR, majorize(brandVersion));
|
|
1290
|
-
}
|
|
1291
|
-
prevName = brandName;
|
|
1292
|
-
}
|
|
1293
|
-
if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {
|
|
1294
|
-
this.set(VERSION, brandVersion);
|
|
1295
|
-
}
|
|
1296
|
-
}
|
|
1237
|
+
case BROWSER:
|
|
1238
|
+
// Brave-specific detection
|
|
1239
|
+
if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
|
|
1240
|
+
this.set(NAME, 'Brave');
|
|
1297
1241
|
}
|
|
1298
1242
|
break;
|
|
1299
|
-
case
|
|
1300
|
-
|
|
1301
|
-
if (
|
|
1302
|
-
if (archName && uaCH[BITNESS] == '64') archName += '64';
|
|
1303
|
-
rgxMapper.call(this.data, archName + ';', rgxMap);
|
|
1304
|
-
}
|
|
1305
|
-
break;
|
|
1306
|
-
case UA_DEVICE:
|
|
1307
|
-
if (uaCH[MOBILE]) {
|
|
1243
|
+
case DEVICE:
|
|
1244
|
+
// Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
|
|
1245
|
+
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
|
|
1308
1246
|
this.set(TYPE, MOBILE);
|
|
1309
1247
|
}
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
|
|
1315
|
-
if (!this.get(TYPE) && !!reParse.type) {
|
|
1316
|
-
this.set(TYPE, reParse.type);
|
|
1317
|
-
}
|
|
1318
|
-
if (!this.get(VENDOR) && !!reParse.vendor) {
|
|
1319
|
-
this.set(VENDOR, reParse.vendor);
|
|
1320
|
-
}
|
|
1321
|
-
}
|
|
1322
|
-
}
|
|
1323
|
-
if (uaCH[FORMFACTORS]) {
|
|
1324
|
-
var ff;
|
|
1325
|
-
if (typeof uaCH[FORMFACTORS] !== 'string') {
|
|
1326
|
-
var idx = 0;
|
|
1327
|
-
while (!ff && idx < uaCH[FORMFACTORS].length) {
|
|
1328
|
-
ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
|
|
1329
|
-
}
|
|
1330
|
-
} else {
|
|
1331
|
-
ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
|
|
1332
|
-
}
|
|
1333
|
-
this.set(TYPE, ff);
|
|
1248
|
+
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties
|
|
1249
|
+
if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
|
|
1250
|
+
this.set(MODEL, 'iPad')
|
|
1251
|
+
.set(TYPE, TABLET);
|
|
1334
1252
|
}
|
|
1335
1253
|
break;
|
|
1336
|
-
case
|
|
1337
|
-
|
|
1338
|
-
if(
|
|
1339
|
-
|
|
1340
|
-
if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
|
|
1341
|
-
this.set(NAME, osName)
|
|
1342
|
-
.set(VERSION, osVersion);
|
|
1254
|
+
case OS:
|
|
1255
|
+
// Chrome-specific detection: check for 'platform' value of navigator.userAgentData
|
|
1256
|
+
if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
|
|
1257
|
+
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
|
|
1343
1258
|
}
|
|
1344
|
-
// Xbox-Specific Detection
|
|
1345
|
-
if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
|
|
1346
|
-
this.set(NAME, 'Xbox')
|
|
1347
|
-
.set(VERSION, undefined);
|
|
1348
|
-
}
|
|
1349
1259
|
break;
|
|
1350
|
-
case
|
|
1260
|
+
case RESULT:
|
|
1351
1261
|
var data = this.data;
|
|
1352
|
-
var
|
|
1262
|
+
var detect = function (itemType) {
|
|
1353
1263
|
return data[itemType]
|
|
1354
1264
|
.getItem()
|
|
1355
|
-
.
|
|
1356
|
-
.parseCH()
|
|
1265
|
+
.detectFeature()
|
|
1357
1266
|
.get();
|
|
1358
1267
|
};
|
|
1359
|
-
this.set(
|
|
1360
|
-
.set(
|
|
1361
|
-
.set(
|
|
1362
|
-
.set(
|
|
1363
|
-
.set(
|
|
1268
|
+
this.set(BROWSER, detect(BROWSER))
|
|
1269
|
+
.set(CPU, detect(CPU))
|
|
1270
|
+
.set(DEVICE, detect(DEVICE))
|
|
1271
|
+
.set(ENGINE, detect(ENGINE))
|
|
1272
|
+
.set(OS, detect(OS));
|
|
1364
1273
|
}
|
|
1365
|
-
|
|
1366
|
-
|
|
1274
|
+
}
|
|
1275
|
+
return this;
|
|
1276
|
+
};
|
|
1367
1277
|
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1278
|
+
UAItem.prototype.parseUA = function () {
|
|
1279
|
+
if (this.itemType != RESULT) {
|
|
1280
|
+
rgxMapper.call(this.data, this.ua, this.rgxMap);
|
|
1281
|
+
}
|
|
1282
|
+
switch (this.itemType) {
|
|
1283
|
+
case BROWSER:
|
|
1284
|
+
this.set(MAJOR, majorize(this.get(VERSION)));
|
|
1285
|
+
break;
|
|
1286
|
+
case OS:
|
|
1287
|
+
if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {
|
|
1288
|
+
// Based on the assumption that iOS version is tightly coupled with Safari version
|
|
1289
|
+
var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version
|
|
1290
|
+
if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {
|
|
1291
|
+
this.set(VERSION, realVersion[1]); // Set as iOS version
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
break;
|
|
1295
|
+
}
|
|
1296
|
+
return this;
|
|
1297
|
+
};
|
|
1375
1298
|
|
|
1299
|
+
UAItem.prototype.parseCH = function () {
|
|
1300
|
+
var uaCH = this.uaCH,
|
|
1301
|
+
rgxMap = this.rgxMap;
|
|
1302
|
+
|
|
1303
|
+
switch (this.itemType) {
|
|
1304
|
+
case BROWSER:
|
|
1305
|
+
case ENGINE:
|
|
1306
|
+
var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
|
|
1307
|
+
if (brands) {
|
|
1308
|
+
for (var i=0; i<brands.length; i++) {
|
|
1309
|
+
var brandName = brands[i].brand || brands[i],
|
|
1310
|
+
brandVersion = brands[i].version;
|
|
1311
|
+
if (this.itemType == BROWSER &&
|
|
1312
|
+
!/not.a.brand/i.test(brandName) &&
|
|
1313
|
+
(!prevName ||
|
|
1314
|
+
(/Chrom/.test(prevName) && brandName != CHROMIUM) ||
|
|
1315
|
+
(prevName == EDGE && /WebView2/.test(brandName))
|
|
1316
|
+
)) {
|
|
1317
|
+
brandName = strMapper(brandName, browserHintsMap);
|
|
1318
|
+
prevName = this.get(NAME);
|
|
1319
|
+
if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
|
|
1320
|
+
this.set(NAME, brandName)
|
|
1321
|
+
.set(VERSION, brandVersion)
|
|
1322
|
+
.set(MAJOR, majorize(brandVersion));
|
|
1323
|
+
}
|
|
1324
|
+
prevName = brandName;
|
|
1325
|
+
}
|
|
1326
|
+
if (this.itemType == ENGINE && brandName == CHROMIUM) {
|
|
1327
|
+
this.set(VERSION, brandVersion);
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
break;
|
|
1332
|
+
case CPU:
|
|
1333
|
+
var archName = uaCH[ARCHITECTURE];
|
|
1334
|
+
if (archName) {
|
|
1335
|
+
if (archName && uaCH[BITNESS] == '64') archName += '64';
|
|
1336
|
+
rgxMapper.call(this.data, archName + ';', rgxMap);
|
|
1337
|
+
}
|
|
1338
|
+
break;
|
|
1339
|
+
case DEVICE:
|
|
1340
|
+
if (uaCH[MOBILE]) {
|
|
1341
|
+
this.set(TYPE, MOBILE);
|
|
1342
|
+
}
|
|
1343
|
+
if (uaCH[MODEL]) {
|
|
1344
|
+
this.set(MODEL, uaCH[MODEL]);
|
|
1345
|
+
if (!this.get(TYPE) || !this.get(VENDOR)) {
|
|
1346
|
+
var reParse = {};
|
|
1347
|
+
rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
|
|
1348
|
+
if (!this.get(TYPE) && !!reParse.type) {
|
|
1349
|
+
this.set(TYPE, reParse.type);
|
|
1350
|
+
}
|
|
1351
|
+
if (!this.get(VENDOR) && !!reParse.vendor) {
|
|
1352
|
+
this.set(VENDOR, reParse.vendor);
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
if (uaCH[FORMFACTORS]) {
|
|
1357
|
+
var ff;
|
|
1358
|
+
if (typeof uaCH[FORMFACTORS] !== 'string') {
|
|
1359
|
+
var idx = 0;
|
|
1360
|
+
while (!ff && idx < uaCH[FORMFACTORS].length) {
|
|
1361
|
+
ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
|
|
1362
|
+
}
|
|
1363
|
+
} else {
|
|
1364
|
+
ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
|
|
1365
|
+
}
|
|
1366
|
+
this.set(TYPE, ff);
|
|
1367
|
+
}
|
|
1368
|
+
break;
|
|
1369
|
+
case OS:
|
|
1370
|
+
var osName = uaCH[PLATFORM];
|
|
1371
|
+
if(osName) {
|
|
1372
|
+
var osVersion = uaCH[PLATFORMVER];
|
|
1373
|
+
if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
|
|
1374
|
+
this.set(NAME, osName)
|
|
1375
|
+
.set(VERSION, osVersion);
|
|
1376
|
+
}
|
|
1377
|
+
// Xbox-Specific Detection
|
|
1378
|
+
if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
|
|
1379
|
+
this.set(NAME, 'Xbox')
|
|
1380
|
+
.set(VERSION, undefined);
|
|
1381
|
+
}
|
|
1382
|
+
break;
|
|
1383
|
+
case RESULT:
|
|
1384
|
+
var data = this.data;
|
|
1385
|
+
var parse = function (itemType) {
|
|
1386
|
+
return data[itemType]
|
|
1387
|
+
.getItem()
|
|
1388
|
+
.setCH(uaCH)
|
|
1389
|
+
.parseCH()
|
|
1390
|
+
.get();
|
|
1391
|
+
};
|
|
1392
|
+
this.set(BROWSER, parse(BROWSER))
|
|
1393
|
+
.set(CPU, parse(CPU))
|
|
1394
|
+
.set(DEVICE, parse(DEVICE))
|
|
1395
|
+
.set(ENGINE, parse(ENGINE))
|
|
1396
|
+
.set(OS, parse(OS));
|
|
1397
|
+
}
|
|
1376
1398
|
return this;
|
|
1377
|
-
}
|
|
1399
|
+
};
|
|
1378
1400
|
|
|
1379
1401
|
function UAParser (ua, extensions, headers) {
|
|
1380
1402
|
|
|
1381
|
-
if (typeof ua ===
|
|
1403
|
+
if (typeof ua === TYPEOF.OBJECT) {
|
|
1382
1404
|
if (isExtensions(ua, true)) {
|
|
1383
|
-
if (typeof extensions ===
|
|
1405
|
+
if (typeof extensions === TYPEOF.OBJECT) {
|
|
1384
1406
|
headers = extensions; // case UAParser(extensions, headers)
|
|
1385
1407
|
}
|
|
1386
1408
|
extensions = ua; // case UAParser(extensions)
|
|
@@ -1389,13 +1411,13 @@
|
|
|
1389
1411
|
extensions = undefined;
|
|
1390
1412
|
}
|
|
1391
1413
|
ua = undefined;
|
|
1392
|
-
} else if (typeof ua ===
|
|
1414
|
+
} else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
|
|
1393
1415
|
headers = extensions; // case UAParser(ua, headers)
|
|
1394
1416
|
extensions = undefined;
|
|
1395
1417
|
}
|
|
1396
1418
|
|
|
1397
1419
|
if (headers) {
|
|
1398
|
-
if (typeof headers.append ===
|
|
1420
|
+
if (typeof headers.append === TYPEOF.FUNCTION) {
|
|
1399
1421
|
// Convert Headers object into a plain object
|
|
1400
1422
|
var kv = {};
|
|
1401
1423
|
headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });
|
|
@@ -1416,7 +1438,7 @@
|
|
|
1416
1438
|
return new UAParser(ua, extensions, headers).getResult();
|
|
1417
1439
|
}
|
|
1418
1440
|
|
|
1419
|
-
var userAgent = typeof ua ===
|
|
1441
|
+
var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string
|
|
1420
1442
|
(headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
|
|
1421
1443
|
((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
|
|
1422
1444
|
EMPTY)), // empty string
|
|
@@ -1427,15 +1449,15 @@
|
|
|
1427
1449
|
defaultRegexes,
|
|
1428
1450
|
|
|
1429
1451
|
createItemFunc = function (itemType) {
|
|
1430
|
-
if (itemType ==
|
|
1452
|
+
if (itemType == RESULT) {
|
|
1431
1453
|
return function () {
|
|
1432
1454
|
return new UAItem(itemType, userAgent, regexMap, httpUACH)
|
|
1433
1455
|
.set('ua', userAgent)
|
|
1434
|
-
.set(
|
|
1435
|
-
.set(
|
|
1436
|
-
.set(
|
|
1437
|
-
.set(
|
|
1438
|
-
.set(
|
|
1456
|
+
.set(BROWSER, this.getBrowser())
|
|
1457
|
+
.set(CPU, this.getCPU())
|
|
1458
|
+
.set(DEVICE, this.getDevice())
|
|
1459
|
+
.set(ENGINE, this.getEngine())
|
|
1460
|
+
.set(OS, this.getOS())
|
|
1439
1461
|
.get();
|
|
1440
1462
|
};
|
|
1441
1463
|
} else {
|
|
@@ -1449,16 +1471,15 @@
|
|
|
1449
1471
|
|
|
1450
1472
|
// public methods
|
|
1451
1473
|
setProps.call(this, [
|
|
1452
|
-
['getBrowser', createItemFunc(
|
|
1453
|
-
['getCPU', createItemFunc(
|
|
1454
|
-
['getDevice', createItemFunc(
|
|
1455
|
-
['getEngine', createItemFunc(
|
|
1456
|
-
['getOS', createItemFunc(
|
|
1457
|
-
['getResult', createItemFunc(
|
|
1474
|
+
['getBrowser', createItemFunc(BROWSER)],
|
|
1475
|
+
['getCPU', createItemFunc(CPU)],
|
|
1476
|
+
['getDevice', createItemFunc(DEVICE)],
|
|
1477
|
+
['getEngine', createItemFunc(ENGINE)],
|
|
1478
|
+
['getOS', createItemFunc(OS)],
|
|
1479
|
+
['getResult', createItemFunc(RESULT)],
|
|
1458
1480
|
['getUA', function () { return userAgent; }],
|
|
1459
1481
|
['setUA', function (ua) {
|
|
1460
|
-
if (isString(ua))
|
|
1461
|
-
userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
|
|
1482
|
+
if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);
|
|
1462
1483
|
return this;
|
|
1463
1484
|
}]
|
|
1464
1485
|
])
|
|
@@ -1474,4 +1495,4 @@
|
|
|
1474
1495
|
UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
|
|
1475
1496
|
|
|
1476
1497
|
exports.UAParser = UAParser;
|
|
1477
|
-
//# sourceMappingURL=ua-parser-
|
|
1498
|
+
//# sourceMappingURL=ua-parser-DgQ3nYoO.js.map
|