ua-parser-js 0.7.18 → 0.7.22

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.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * UAParser.js v0.7.18
2
+ * UAParser.js v0.7.22
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
6
- * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
7
- * Dual licensed under GPLv2 or MIT
6
+ * Copyright © 2012-2019 Faisal Salman <f@faisalman.com>
7
+ * Licensed under MIT License
8
8
  */
9
9
 
10
10
  (function (window, undefined) {
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.18',
19
+ var LIBVERSION = '0.7.22',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -45,15 +45,15 @@
45
45
 
46
46
  var util = {
47
47
  extend : function (regexes, extensions) {
48
- var margedRegexes = {};
48
+ var mergedRegexes = {};
49
49
  for (var i in regexes) {
50
50
  if (extensions[i] && extensions[i].length % 2 === 0) {
51
- margedRegexes[i] = extensions[i].concat(regexes[i]);
51
+ mergedRegexes[i] = extensions[i].concat(regexes[i]);
52
52
  } else {
53
- margedRegexes[i] = regexes[i];
53
+ mergedRegexes[i] = regexes[i];
54
54
  }
55
55
  }
56
- return margedRegexes;
56
+ return mergedRegexes;
57
57
  },
58
58
  has : function (str1, str2) {
59
59
  if (typeof str1 === "string") {
@@ -83,14 +83,7 @@
83
83
 
84
84
  rgx : function (ua, arrays) {
85
85
 
86
- //var result = {},
87
- var i = 0, j, k, p, q, matches, match;//, args = arguments;
88
-
89
- /*// construct object barebones
90
- for (p = 0; p < args[1].length; p++) {
91
- q = args[1][p];
92
- result[typeof q === OBJ_TYPE ? q[0] : q] = undefined;
93
- }*/
86
+ var i = 0, j, k, p, q, matches, match;
94
87
 
95
88
  // loop through all regexes maps
96
89
  while (i < arrays.length && !matches) {
@@ -138,8 +131,6 @@
138
131
  }
139
132
  i += 2;
140
133
  }
141
- // console.log(this);
142
- //return this;
143
134
  },
144
135
 
145
136
  str : function (str, map) {
@@ -246,40 +237,60 @@
246
237
  /(kindle)\/([\w\.]+)/i, // Kindle
247
238
  /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
248
239
  // Lunascape/Maxthon/Netfront/Jasmine/Blazer
249
-
250
240
  // Trident based
251
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
252
- // Avant/IEMobile/SlimBrowser/Baidu
241
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,
242
+ // Avant/IEMobile/SlimBrowser
243
+ /(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
253
244
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
254
245
 
255
246
  // Webkit/KHTML based
256
247
  /(rekonq)\/([\w\.]*)/i, // Rekonq
257
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark)\/([\w\.-]+)/i
258
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
248
+ /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i
249
+ // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
259
250
  ], [NAME, VERSION], [
260
251
 
252
+ /(konqueror)\/([\w\.]+)/i // Konqueror
253
+ ], [[NAME, 'Konqueror'], VERSION], [
254
+
261
255
  /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
262
256
  ], [[NAME, 'IE'], VERSION], [
263
257
 
264
- /(edge|edgios|edgea)\/((\d+)?[\w\.]+)/i // Microsoft Edge
258
+ /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
265
259
  ], [[NAME, 'Edge'], VERSION], [
266
260
 
267
261
  /(yabrowser)\/([\w\.]+)/i // Yandex
268
262
  ], [[NAME, 'Yandex'], VERSION], [
269
263
 
264
+ /(Avast)\/([\w\.]+)/i // Avast Secure Browser
265
+ ], [[NAME, 'Avast Secure Browser'], VERSION], [
266
+
267
+ /(AVG)\/([\w\.]+)/i // AVG Secure Browser
268
+ ], [[NAME, 'AVG Secure Browser'], VERSION], [
269
+
270
270
  /(puffin)\/([\w\.]+)/i // Puffin
271
271
  ], [[NAME, 'Puffin'], VERSION], [
272
272
 
273
- /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
274
- // UCBrowser
273
+ /(focus)\/([\w\.]+)/i // Firefox Focus
274
+ ], [[NAME, 'Firefox Focus'], VERSION], [
275
+
276
+ /(opt)\/([\w\.]+)/i // Opera Touch
277
+ ], [[NAME, 'Opera Touch'], VERSION], [
278
+
279
+ /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
275
280
  ], [[NAME, 'UCBrowser'], VERSION], [
276
281
 
277
282
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
278
283
  ], [[NAME, /_/g, ' '], VERSION], [
279
284
 
285
+ /(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
286
+ ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
287
+
280
288
  /(micromessenger)\/([\w\.]+)/i // WeChat
281
289
  ], [[NAME, 'WeChat'], VERSION], [
282
290
 
291
+ /(brave)\/([\w\.]+)/i // Brave browser
292
+ ], [[NAME, 'Brave'], VERSION], [
293
+
283
294
  /(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
284
295
  ], [NAME, VERSION], [
285
296
 
@@ -289,7 +300,7 @@
289
300
  /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
290
301
  ], [NAME, VERSION], [
291
302
 
292
- /(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
303
+ /(baiduboxapp)[\/\s]?([\w\.]+)/i // Baidu App
293
304
  ], [NAME, VERSION], [
294
305
 
295
306
  /(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
@@ -298,7 +309,7 @@
298
309
  /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
299
310
  ], [NAME], [
300
311
 
301
- /(LBBROWSER)/i // LieBao Browser
312
+ /(LBBROWSER)/i // LieBao Browser
302
313
  ], [NAME], [
303
314
 
304
315
  /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
@@ -307,6 +318,10 @@
307
318
  /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
308
319
  ], [VERSION, [NAME, 'Facebook']], [
309
320
 
321
+ /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
322
+ /android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
323
+ ], [NAME, VERSION], [
324
+
310
325
  /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
311
326
  ], [VERSION, [NAME, 'Chrome Headless']], [
312
327
 
@@ -319,6 +334,9 @@
319
334
  /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
320
335
  ], [VERSION, [NAME, 'Android Browser']], [
321
336
 
337
+ /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
338
+ ], [[NAME, 'Sailfish Browser'], VERSION], [
339
+
322
340
  /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
323
341
  // Chrome/OmniWeb/Arora/Tizen/Nokia
324
342
  ], [NAME, VERSION], [
@@ -326,6 +344,9 @@
326
344
  /(dolfin)\/([\w\.]+)/i // Dolphin
327
345
  ], [[NAME, 'Dolphin'], VERSION], [
328
346
 
347
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
348
+ ], [[NAME, '360 Browser']], [
349
+
329
350
  /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
330
351
  ], [[NAME, 'Chrome'], VERSION], [
331
352
 
@@ -347,7 +368,6 @@
347
368
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
348
369
  ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
349
370
 
350
- /(konqueror)\/([\w\.]+)/i, // Konqueror
351
371
  /(webkit|khtml)\/([\w\.]+)/i
352
372
  ], [NAME, VERSION], [
353
373
 
@@ -370,117 +390,6 @@
370
390
  /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
371
391
  /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
372
392
  ], [NAME, VERSION]
373
-
374
- /* /////////////////////
375
- // Media players BEGIN
376
- ////////////////////////
377
-
378
- , [
379
-
380
- /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
381
- /(coremedia) v((\d+)[\w\._]+)/i
382
- ], [NAME, VERSION], [
383
-
384
- /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
385
- ], [NAME, VERSION], [
386
-
387
- /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
388
- ], [NAME, VERSION], [
389
-
390
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
391
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
392
- // NSPlayer/PSP-InternetRadioPlayer/Videos
393
- /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
394
- /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
395
- /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
396
- ], [NAME, VERSION], [
397
- /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
398
- ], [NAME, VERSION], [
399
-
400
- /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
401
- ], [[NAME, 'Flip Player'], VERSION], [
402
-
403
- /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
404
- // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
405
- ], [NAME], [
406
-
407
- /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
408
- // Gstreamer
409
- ], [NAME, VERSION], [
410
-
411
- /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
412
- /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
413
- // Java/urllib/requests/wget/cURL
414
- /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
415
- ], [NAME, VERSION], [
416
-
417
- /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
418
- ], [[NAME, /_/g, ' '], VERSION], [
419
-
420
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
421
- // MPlayer SVN
422
- ], [NAME, VERSION], [
423
-
424
- /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
425
- ], [NAME, VERSION], [
426
-
427
- /(mplayer)/i, // MPlayer (no other info)
428
- /(yourmuze)/i, // YourMuze
429
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
430
- ], [NAME], [
431
-
432
- /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
433
- ], [NAME, VERSION], [
434
-
435
- /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
436
- ], [NAME, VERSION], [
437
-
438
- /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
439
- ], [NAME, VERSION], [
440
-
441
- /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
442
- /(winamp)\s((\d+)[\w\.-]+)/i,
443
- /(winamp)mpeg\/((\d+)[\w\.-]+)/i
444
- ], [NAME, VERSION], [
445
-
446
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
447
- // inlight radio
448
- ], [NAME], [
449
-
450
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
451
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
452
- // SoundTap/Totem/Stagefright/Streamium
453
- ], [NAME, VERSION], [
454
-
455
- /(smp)((\d+)[\d\.]+)/i // SMP
456
- ], [NAME, VERSION], [
457
-
458
- /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
459
- /(vlc)\/((\d+)[\w\.-]+)/i,
460
- /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
461
- /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
462
- /(itunes)\/((\d+)[\d\.]+)/i // iTunes
463
- ], [NAME, VERSION], [
464
-
465
- /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
466
- /(windows-media-player)\/((\d+)[\w\.-]+)/i
467
- ], [[NAME, /-/g, ' '], VERSION], [
468
-
469
- /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
470
- // Windows Media Server
471
- ], [VERSION, [NAME, 'Windows']], [
472
-
473
- /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
474
- ], [NAME, VERSION], [
475
-
476
- /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
477
- /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
478
- ], [[NAME, 'rad.io'], VERSION]
479
-
480
- //////////////////////
481
- // Media players END
482
- ////////////////////*/
483
-
484
393
  ],
485
394
 
486
395
  cpu : [[
@@ -504,21 +413,21 @@
504
413
  /(sun4\w)[;\)]/i // SPARC
505
414
  ], [[ARCHITECTURE, 'sparc']], [
506
415
 
507
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
416
+ /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
508
417
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
509
418
  ], [[ARCHITECTURE, util.lowerize]]
510
419
  ],
511
420
 
512
421
  device : [[
513
422
 
514
- /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
423
+ /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
515
424
  ], [MODEL, VENDOR, [TYPE, TABLET]], [
516
425
 
517
426
  /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
518
427
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
519
428
 
520
429
  /(apple\s{0,1}tv)/i // Apple TV
521
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
430
+ ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [
522
431
 
523
432
  /(archos)\s(gamepad2?)/i, // Archos
524
433
  /(hp).+(touchpad)/i, // HP TouchPad
@@ -532,6 +441,8 @@
532
441
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
533
442
  /(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
534
443
  ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
444
+ /android.+aft([bms])\sbuild/i // Fire TV
445
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
535
446
 
536
447
  /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
537
448
  ], [MODEL, VENDOR, [TYPE, MOBILE]], [
@@ -547,13 +458,13 @@
547
458
  /\(bb10;\s(\w+)/i // BlackBerry 10
548
459
  ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
549
460
  // Asus Tablets
550
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
461
+ /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
551
462
  ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
552
463
 
553
464
  /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
554
465
  /(sony)?(?:sgp.+)\sbuild\//i
555
466
  ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
556
- /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
467
+ /android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
557
468
  ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
558
469
 
559
470
  /\s(ouya)\s/i, // Ouya
@@ -569,22 +480,22 @@
569
480
  /(sprint\s(\w+))/i // Sprint Phones
570
481
  ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
571
482
 
572
- /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
573
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
574
-
575
- /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
483
+ /(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
576
484
  /(zte)-(\w*)/i, // ZTE
577
- /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
578
- // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
485
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
486
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
579
487
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
580
488
 
581
489
  /(nexus\s9)/i // HTC Nexus 9
582
490
  ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
583
491
 
584
492
  /d\/huawei([\w\s-]+)[;\)]/i,
585
- /(nexus\s6p)/i // Huawei
493
+ /(nexus\s6p|vog-l29|ane-lx1|eml-l29|ele-l29)/i // Huawei
586
494
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
587
495
 
496
+ /android.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
497
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
498
+
588
499
  /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
589
500
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
590
501
 
@@ -628,7 +539,7 @@
628
539
  /(nokia)[\s_-]?([\w-]*)/i
629
540
  ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
630
541
 
631
- /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
542
+ /android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
632
543
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
633
544
 
634
545
  /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
@@ -642,8 +553,12 @@
642
553
  /android.+lg(\-?[\d\w]+)\s+build/i
643
554
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
644
555
 
556
+ /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
557
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
645
558
  /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
646
559
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
560
+ /(lenovo)[_\s-]?([\w-]+)/i
561
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
647
562
 
648
563
  /linux;.+((jolla));/i // Jolla
649
564
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
@@ -655,29 +570,32 @@
655
570
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
656
571
 
657
572
  /crkey/i // Google Chromecast
658
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
573
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
659
574
 
660
575
  /android.+;\s(glass)\s\d/i // Google Glass
661
576
  ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
662
577
 
663
- /android.+;\s(pixel c)\s/i // Google Pixel C
578
+ /android.+;\s(pixel c)[\s)]/i // Google Pixel C
664
579
  ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
665
580
 
666
- /android.+;\s(pixel xl|pixel)\s/i // Google Pixel
581
+ /android.+;\s(pixel( [23])?( xl)?)[\s)]/i // Google Pixel
667
582
  ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
668
583
 
669
584
  /android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
670
585
  /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
671
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i, // Xiaomi Mi
672
- /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
586
+ /android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,
587
+ // Xiaomi Mi
588
+ /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]?[\w\s]+))\s+build/i // Redmi Phones
673
589
  ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
674
- /android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
590
+ /android.+(mi[\s\-_]*(?:pad)(?:[\s_]?[\w\s]+))\s+build/i // Mi Pad tablets
675
591
  ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
676
- /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
677
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
592
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
593
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
594
+ /(mz)-([\w-]{2,})/i
595
+ ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
678
596
 
679
597
  /android.+a000(1)\s+build/i, // OnePlus
680
- /android.+oneplus\s(a\d{4})\s+build/i
598
+ /android.+oneplus\s(a\d{4})[\s)]/i
681
599
  ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
682
600
 
683
601
  /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
@@ -723,6 +641,9 @@
723
641
  /android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
724
642
  ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
725
643
 
644
+ /android.+;\s(PH-1)\s/i
645
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
646
+
726
647
  /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
727
648
  ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
728
649
 
@@ -748,60 +669,11 @@
748
669
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
749
670
  ], [[TYPE, util.lowerize], VENDOR, MODEL], [
750
671
 
672
+ /[\s\/\(](smart-?tv)[;\)]/i // SmartTV
673
+ ], [[TYPE, SMARTTV]], [
674
+
751
675
  /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
752
676
  ], [MODEL, [VENDOR, 'Generic']]
753
-
754
-
755
- /*//////////////////////////
756
- // TODO: move to string map
757
- ////////////////////////////
758
-
759
- /(C6603)/i // Sony Xperia Z C6603
760
- ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
761
- /(C6903)/i // Sony Xperia Z 1
762
- ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
763
-
764
- /(SM-G900[F|H])/i // Samsung Galaxy S5
765
- ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
766
- /(SM-G7102)/i // Samsung Galaxy Grand 2
767
- ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
768
- /(SM-G530H)/i // Samsung Galaxy Grand Prime
769
- ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
770
- /(SM-G313HZ)/i // Samsung Galaxy V
771
- ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
772
- /(SM-T805)/i // Samsung Galaxy Tab S 10.5
773
- ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
774
- /(SM-G800F)/i // Samsung Galaxy S5 Mini
775
- ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
776
- /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
777
- ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
778
-
779
- /(T3C)/i // Advan Vandroid T3C
780
- ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
781
- /(ADVAN T1J\+)/i // Advan Vandroid T1J+
782
- ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
783
- /(ADVAN S4A)/i // Advan Vandroid S4A
784
- ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
785
-
786
- /(V972M)/i // ZTE V972M
787
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
788
-
789
- /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
790
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
791
- /(IQ6.3)/i // i-mobile IQ IQ 6.3
792
- ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
793
- /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
794
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
795
- /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
796
- ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
797
-
798
- /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
799
- ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
800
-
801
- /////////////
802
- // END TODO
803
- ///////////*/
804
-
805
677
  ],
806
678
 
807
679
  engine : [[
@@ -809,8 +681,12 @@
809
681
  /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
810
682
  ], [VERSION, [NAME, 'EdgeHTML']], [
811
683
 
684
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
685
+ ], [VERSION, [NAME, 'Blink']], [
686
+
812
687
  /(presto)\/([\w\.]+)/i, // Presto
813
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
688
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
689
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
814
690
  /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
815
691
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
816
692
  ], [NAME, VERSION], [
@@ -835,10 +711,9 @@
835
711
  /\((bb)(10);/i // BlackBerry 10
836
712
  ], [[NAME, 'BlackBerry'], VERSION], [
837
713
  /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
838
- /(tizen)[\/\s]([\w\.]+)/i, // Tizen
839
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]*)/i,
840
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
841
- /linux;.+(sailfish);/i // Sailfish OS
714
+ /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
715
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
716
+ // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
842
717
  ], [NAME, VERSION], [
843
718
  /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
844
719
  ], [[NAME, 'Symbian'], VERSION], [
@@ -885,8 +760,8 @@
885
760
  // Other
886
761
  /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
887
762
  /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
888
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
889
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
763
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
764
+ // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
890
765
  /(unix)\s?([\w\.]*)/i // UNIX
891
766
  ], [NAME, VERSION]
892
767
  ]
@@ -896,22 +771,6 @@
896
771
  /////////////////
897
772
  // Constructor
898
773
  ////////////////
899
- /*
900
- var Browser = function (name, version) {
901
- this[NAME] = name;
902
- this[VERSION] = version;
903
- };
904
- var CPU = function (arch) {
905
- this[ARCHITECTURE] = arch;
906
- };
907
- var Device = function (vendor, model, type) {
908
- this[VENDOR] = vendor;
909
- this[MODEL] = model;
910
- this[TYPE] = type;
911
- };
912
- var Engine = Browser;
913
- var OS = Browser;
914
- */
915
774
  var UAParser = function (uastring, extensions) {
916
775
 
917
776
  if (typeof uastring === 'object') {
@@ -925,11 +784,6 @@
925
784
 
926
785
  var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
927
786
  var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
928
- //var browser = new Browser();
929
- //var cpu = new CPU();
930
- //var device = new Device();
931
- //var engine = new Engine();
932
- //var os = new OS();
933
787
 
934
788
  this.getBrowser = function () {
935
789
  var browser = { name: undefined, version: undefined };
@@ -972,11 +826,6 @@
972
826
  };
973
827
  this.setUA = function (uastring) {
974
828
  ua = uastring;
975
- //browser = new Browser();
976
- //cpu = new CPU();
977
- //device = new Device();
978
- //engine = new Engine();
979
- //os = new OS();
980
829
  return this;
981
830
  };
982
831
  return this;
@@ -1010,7 +859,6 @@
1010
859
  NAME : NAME,
1011
860
  VERSION : VERSION
1012
861
  };
1013
- //UAParser.Utils = util;
1014
862
 
1015
863
  ///////////
1016
864
  // Export
@@ -1023,39 +871,10 @@
1023
871
  if (typeof module !== UNDEF_TYPE && module.exports) {
1024
872
  exports = module.exports = UAParser;
1025
873
  }
1026
- // TODO: test!!!!!!!!
1027
- /*
1028
- if (require && require.main === module && process) {
1029
- // cli
1030
- var jsonize = function (arr) {
1031
- var res = [];
1032
- for (var i in arr) {
1033
- res.push(new UAParser(arr[i]).getResult());
1034
- }
1035
- process.stdout.write(JSON.stringify(res, null, 2) + '\n');
1036
- };
1037
- if (process.stdin.isTTY) {
1038
- // via args
1039
- jsonize(process.argv.slice(2));
1040
- } else {
1041
- // via pipe
1042
- var str = '';
1043
- process.stdin.on('readable', function() {
1044
- var read = process.stdin.read();
1045
- if (read !== null) {
1046
- str += read;
1047
- }
1048
- });
1049
- process.stdin.on('end', function () {
1050
- jsonize(str.replace(/\n$/, '').split('\n'));
1051
- });
1052
- }
1053
- }
1054
- */
1055
874
  exports.UAParser = UAParser;
1056
875
  } else {
1057
876
  // requirejs env (optional)
1058
- if (typeof(define) === FUNC_TYPE && define.amd) {
877
+ if (typeof(define) === 'function' && define.amd) {
1059
878
  define(function () {
1060
879
  return UAParser;
1061
880
  });
@@ -1071,7 +890,7 @@
1071
890
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
1072
891
  // and we should catch that.
1073
892
  var $ = window && (window.jQuery || window.Zepto);
1074
- if (typeof $ !== UNDEF_TYPE) {
893
+ if ($ && !$.ua) {
1075
894
  var parser = new UAParser();
1076
895
  $.ua = parser.getResult();
1077
896
  $.ua.get = function () {