@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
@@ -5,8 +5,8 @@
5
5
  // Source: /src/main/ua-parser.js
6
6
 
7
7
  /////////////////////////////////////////////////////////////////////////////////
8
- /* UAParser.js v2.0.5
9
- Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
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.5',
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
- // typeof
33
- FUNC_TYPE = 'function',
34
- UNDEF_TYPE = 'undefined',
35
- OBJ_TYPE = 'object',
36
- STR_TYPE = 'string',
31
+ TYPEOF = {
32
+ FUNCTION : 'function',
33
+ OBJECT : 'object',
34
+ STRING : 'string',
35
+ UNDEFINED : 'undefined'
36
+ },
37
37
 
38
38
  // properties
39
- UA_BROWSER = 'browser',
40
- UA_CPU = 'cpu',
41
- UA_DEVICE = 'device',
42
- UA_ENGINE = 'engine',
43
- UA_OS = 'os',
44
- UA_RESULT = 'result',
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
- CH_HEADER = 'sec-ch-ua',
74
- CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',
75
- CH_HEADER_ARCH = CH_HEADER + '-arch',
76
- CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,
77
- CH_HEADER_FORM_FACTORS = CH_HEADER + '-form-factors',
78
- CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,
79
- CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,
80
- CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
81
- CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
82
- CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
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 !== UNDEF_TYPE,
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 === OBJ_TYPE && str1.length > 0) {
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 === STR_TYPE;
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 == OBJ_TYPE && propName.length == 2) {
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
- if (isString(str)) {
214
- str = strip(/^\s\s*/, str);
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 === OBJ_TYPE && q.length > 0) {
246
+ if (typeof q === TYPEOF.OBJECT && q.length > 0) {
248
247
  if (q.length === 2) {
249
- if (typeof q[1] == FUNC_TYPE) {
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] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
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] === OBJ_TYPE && map[i].length > 0) {
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|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,
386
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
387
- /(heytap|ovi|115|surf)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
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
- /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
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
- /\bopt\/([\w\.]+)/i // Opera Touch
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 // LieBao Browser/Rekonq
445
+ /(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Luakit/Rekonq/Steam
441
446
  ], [NAME], [
442
- /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
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 // TikTok
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|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
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\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
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, ]*)(?:\/|;)/i // iPod/iPhone
583
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i // iPod/iPhone
574
584
  ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
575
- /\((ipad);[-\w\),; ]+apple/i, // iPad
576
- /applecoremedia\/[\w\.]+ \((ipad)/i,
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][012359c][adn]?)\b(?!.+d\/s)/i
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 // Mi Pad tablets
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
- /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
608
- /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
609
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i, // Xiaomi Mi
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-k]\w[1m]10)\b/i,
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
- /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
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\. ]*))/i
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
- /\(bb10; (\w+)/i // BlackBerry 10
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
- /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL
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 // Retroid Pocket
857
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
858
- /droid.+; (shield)( bui|\))/i // Nvidia Portable
859
- ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [
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 // Asus ZenWatch / LG Watch / Pixel Watch
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, // KHTML/Tasman/Links
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\/|iphone.+ios[\/ ])([\d\.]+)/i,
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|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
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
- /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1017
- ], [[NAME, "Chrome OS"], VERSION],[
1028
+ /cros [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1029
+ ], [VERSION, [NAME, 'Chrome OS']],[
1018
1030
 
1019
1031
  // Smart TVs
1020
- /panasonic;(viera)/i, // Panasonic Viera
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
- [UA_BROWSER, [NAME, VERSION, MAJOR, TYPE]],
1058
- [UA_CPU, [ARCHITECTURE]],
1059
- [UA_DEVICE, [TYPE, MODEL, VENDOR]],
1060
- [UA_ENGINE, [NAME, VERSION]],
1061
- [UA_OS, [NAME, VERSION]]
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
- [UA_BROWSER, [VERSION, MAJOR]],
1065
- [UA_ENGINE, [VERSION]],
1066
- [UA_OS, [VERSION]]
1077
+ [BROWSER, [VERSION, MAJOR]],
1078
+ [ENGINE, [VERSION]],
1079
+ [OS, [VERSION]]
1067
1080
  ]);
1068
1081
  setProps.call(props.isIgnoreRgx, [
1069
- [UA_BROWSER, / ?browser$/i],
1070
- [UA_OS, / ?os$/i]
1082
+ [BROWSER, / ?browser$/i],
1083
+ [OS, / ?os$/i]
1071
1084
  ]);
1072
1085
  setProps.call(props.toString, [
1073
- [UA_BROWSER, [NAME, VERSION]],
1074
- [UA_CPU, [ARCHITECTURE]],
1075
- [UA_DEVICE, [VENDOR, MODEL]],
1076
- [UA_ENGINE, [NAME, VERSION]],
1077
- [UA_OS, [NAME, VERSION]]
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 != UA_RESULT) {
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 != UNDEF_TYPE) break;
1128
- } else if (strToCheck == UNDEF_TYPE && is) {
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]]) !== UNDEF_TYPE) {
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 || UNDEF_TYPE;
1155
+ return str || TYPEOF.UNDEFINED;
1143
1156
  };
1144
1157
  }
1145
1158
 
1146
- if (!NAVIGATOR_UADATA) {
1147
- IData.prototype.then = function (cb) {
1148
- var that = this;
1149
- var IDataResolve = function () {
1150
- for (var prop in that) {
1151
- if (that.hasOwnProperty(prop)) {
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[CH_HEADER])],
1179
- [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],
1180
- [MOBILE, /\?1/.test(uach[CH_HEADER_MOBILE])],
1181
- [MODEL, stripQuotes(uach[CH_HEADER_MODEL])],
1182
- [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
1183
- [PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],
1184
- [ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],
1185
- [FORMFACTORS, itemListToArray(uach[CH_HEADER_FORM_FACTORS])],
1186
- [BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]
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] !== UNDEF_TYPE) this[prop] = 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
- this.get = function (prop) {
1198
- if (!prop) return this.data;
1199
- return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
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
- this.detectFeature = function () {
1213
- if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
1214
- switch (this.itemType) {
1215
- case UA_BROWSER:
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
- this.parseUA = function () {
1257
- if (this.itemType != UA_RESULT) {
1258
- rgxMapper.call(this.data, this.ua, this.rgxMap);
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
- this.parseCH = function () {
1267
- var uaCH = this.uaCH,
1268
- rgxMap = this.rgxMap;
1269
-
1234
+ UAItem.prototype.detectFeature = function () {
1235
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
1270
1236
  switch (this.itemType) {
1271
- case UA_BROWSER:
1272
- case UA_ENGINE:
1273
- var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1274
- if (brands) {
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 UA_CPU:
1300
- var archName = uaCH[ARCHITECTURE];
1301
- if (archName) {
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
- if (uaCH[MODEL]) {
1311
- this.set(MODEL, uaCH[MODEL]);
1312
- if (!this.get(TYPE) || !this.get(VENDOR)) {
1313
- var reParse = {};
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 UA_OS:
1337
- var osName = uaCH[PLATFORM];
1338
- if(osName) {
1339
- var osVersion = uaCH[PLATFORMVER];
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 UA_RESULT:
1260
+ case RESULT:
1351
1261
  var data = this.data;
1352
- var parse = function (itemType) {
1262
+ var detect = function (itemType) {
1353
1263
  return data[itemType]
1354
1264
  .getItem()
1355
- .setCH(uaCH)
1356
- .parseCH()
1265
+ .detectFeature()
1357
1266
  .get();
1358
1267
  };
1359
- this.set(UA_BROWSER, parse(UA_BROWSER))
1360
- .set(UA_CPU, parse(UA_CPU))
1361
- .set(UA_DEVICE, parse(UA_DEVICE))
1362
- .set(UA_ENGINE, parse(UA_ENGINE))
1363
- .set(UA_OS, parse(UA_OS));
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
- return this;
1366
- };
1274
+ }
1275
+ return this;
1276
+ };
1367
1277
 
1368
- setProps.call(this, [
1369
- ['itemType', itemType],
1370
- ['ua', ua],
1371
- ['uaCH', uaCH],
1372
- ['rgxMap', rgxMap],
1373
- ['data', createIData(this, itemType)]
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 === OBJ_TYPE) {
1403
+ if (typeof ua === TYPEOF.OBJECT) {
1382
1404
  if (isExtensions(ua, true)) {
1383
- if (typeof extensions === OBJ_TYPE) {
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 === STR_TYPE && !isExtensions(extensions, true)) {
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 === FUNC_TYPE) {
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 === STR_TYPE ? ua : // Passed user-agent string
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 == UA_RESULT) {
1452
+ if (itemType == RESULT) {
1431
1453
  return function () {
1432
1454
  return new UAItem(itemType, userAgent, regexMap, httpUACH)
1433
1455
  .set('ua', userAgent)
1434
- .set(UA_BROWSER, this.getBrowser())
1435
- .set(UA_CPU, this.getCPU())
1436
- .set(UA_DEVICE, this.getDevice())
1437
- .set(UA_ENGINE, this.getEngine())
1438
- .set(UA_OS, this.getOS())
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(UA_BROWSER)],
1453
- ['getCPU', createItemFunc(UA_CPU)],
1454
- ['getDevice', createItemFunc(UA_DEVICE)],
1455
- ['getEngine', createItemFunc(UA_ENGINE)],
1456
- ['getOS', createItemFunc(UA_OS)],
1457
- ['getResult', createItemFunc(UA_RESULT)],
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-E0eEtHJZ.js.map
1498
+ //# sourceMappingURL=ua-parser-DgQ3nYoO.js.map