@bigbinary/neeto-molecules 4.1.42 → 4.1.44

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