ua-parser-js 0.7.20 → 0.7.28
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/.github/FUNDING.yml +12 -0
- package/.github/workflows/run-test.yml +17 -0
- package/.travis.yml +5 -0
- package/bower.json +1 -1
- package/changelog.md +3 -0
- package/dist/ua-parser.min.js +4 -4
- package/dist/ua-parser.pack.js +4 -4
- package/license.md +1 -1
- package/package.js +1 -1
- package/package.json +69 -13
- package/readme.md +89 -117
- package/src/ua-parser.js +419 -414
- package/test/browser-test.json +195 -5
- package/test/cpu-test.json +65 -1
- package/test/device-test.json +1532 -131
- package/test/engine-test.json +55 -1
- package/test/os-test.json +372 -111
- package/test/test.js +57 -11
- package/.npmignore +0 -28
package/src/ua-parser.js
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
|
2
|
-
* UAParser.js v0.7.
|
1
|
+
/*!@license
|
2
|
+
* UAParser.js v0.7.28
|
3
3
|
* Lightweight JavaScript-based User-Agent string parser
|
4
4
|
* https://github.com/faisalman/ua-parser-js
|
5
5
|
*
|
6
|
-
* Copyright © 2012-
|
6
|
+
* Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
|
7
7
|
* Licensed under MIT License
|
8
8
|
*/
|
9
9
|
|
@@ -16,7 +16,7 @@
|
|
16
16
|
/////////////
|
17
17
|
|
18
18
|
|
19
|
-
var LIBVERSION = '0.7.
|
19
|
+
var LIBVERSION = '0.7.28',
|
20
20
|
EMPTY = '',
|
21
21
|
UNKNOWN = '?',
|
22
22
|
FUNC_TYPE = 'function',
|
@@ -35,7 +35,8 @@
|
|
35
35
|
TABLET = 'tablet',
|
36
36
|
SMARTTV = 'smarttv',
|
37
37
|
WEARABLE = 'wearable',
|
38
|
-
EMBEDDED = 'embedded'
|
38
|
+
EMBEDDED = 'embedded',
|
39
|
+
UA_MAX_LENGTH = 255;
|
39
40
|
|
40
41
|
|
41
42
|
///////////
|
@@ -56,11 +57,7 @@
|
|
56
57
|
return mergedRegexes;
|
57
58
|
},
|
58
59
|
has : function (str1, str2) {
|
59
|
-
|
60
|
-
return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
|
61
|
-
} else {
|
62
|
-
return false;
|
63
|
-
}
|
60
|
+
return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
|
64
61
|
},
|
65
62
|
lowerize : function (str) {
|
66
63
|
return str.toLowerCase();
|
@@ -68,8 +65,9 @@
|
|
68
65
|
major : function (version) {
|
69
66
|
return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
|
70
67
|
},
|
71
|
-
trim : function (str) {
|
72
|
-
|
68
|
+
trim : function (str, len) {
|
69
|
+
str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
70
|
+
return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
|
73
71
|
}
|
74
72
|
};
|
75
73
|
|
@@ -160,7 +158,8 @@
|
|
160
158
|
var maps = {
|
161
159
|
|
162
160
|
browser : {
|
163
|
-
|
161
|
+
// Safari < 3.0
|
162
|
+
oldSafari : {
|
164
163
|
version : {
|
165
164
|
'1.0' : '/8',
|
166
165
|
'1.2' : '/1',
|
@@ -171,22 +170,16 @@
|
|
171
170
|
'2.0.4' : '/419',
|
172
171
|
'?' : '/'
|
173
172
|
}
|
174
|
-
}
|
175
|
-
},
|
176
|
-
|
177
|
-
device : {
|
178
|
-
amazon : {
|
179
|
-
model : {
|
180
|
-
'Fire Phone' : ['SD', 'KF']
|
181
|
-
}
|
182
173
|
},
|
183
|
-
|
184
|
-
|
185
|
-
'
|
186
|
-
|
187
|
-
|
188
|
-
'
|
189
|
-
'
|
174
|
+
oldEdge : {
|
175
|
+
version : {
|
176
|
+
'0.1' : '12.',
|
177
|
+
'21' : '13.',
|
178
|
+
'31' : '14.',
|
179
|
+
'39' : '15.',
|
180
|
+
'41' : '16.',
|
181
|
+
'42' : '17.',
|
182
|
+
'44' : '18.'
|
190
183
|
}
|
191
184
|
}
|
192
185
|
},
|
@@ -220,144 +213,110 @@
|
|
220
213
|
|
221
214
|
browser : [[
|
222
215
|
|
216
|
+
/\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
217
|
+
], [VERSION, [NAME, 'Chrome']], [
|
218
|
+
/edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
|
219
|
+
], [VERSION, [NAME, 'Edge']], [
|
220
|
+
// breaking change (reserved for next major release):
|
221
|
+
///edge\/([\w\.]+)/i // Old Edge (Trident)
|
222
|
+
//], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
|
223
|
+
|
223
224
|
// Presto based
|
224
225
|
/(opera\smini)\/([\w\.-]+)/i, // Opera Mini
|
225
|
-
/(opera\s[mobiletab]
|
226
|
-
/(opera)
|
227
|
-
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
|
226
|
+
/(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
|
227
|
+
/(opera)(?:.+version\/|[\/\s]+)([\w\.]+)/i, // Opera
|
228
228
|
], [NAME, VERSION], [
|
229
|
-
|
230
|
-
|
231
|
-
]
|
232
|
-
|
233
|
-
/\s(opr)\/([\w\.]+)/i // Opera Webkit
|
234
|
-
], [[NAME, 'Opera'], VERSION], [
|
229
|
+
/opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
|
230
|
+
], [VERSION, [NAME, 'Opera Mini']], [
|
231
|
+
/\sopr\/([\w\.]+)/i // Opera Webkit
|
232
|
+
], [VERSION, [NAME, 'Opera']], [
|
235
233
|
|
236
234
|
// Mixed
|
237
235
|
/(kindle)\/([\w\.]+)/i, // Kindle
|
238
|
-
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
|
239
|
-
// Lunascape/Maxthon/Netfront/Jasmine/Blazer
|
240
|
-
|
236
|
+
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
|
241
237
|
// Trident based
|
242
|
-
/(avant\s|iemobile|slim
|
243
|
-
|
238
|
+
/(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
|
239
|
+
/(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
|
244
240
|
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
|
245
241
|
|
246
242
|
// Webkit/KHTML based
|
247
|
-
/(
|
248
|
-
|
249
|
-
|
243
|
+
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
|
244
|
+
// Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
245
|
+
/(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
|
246
|
+
/(weibo)__([\d\.]+)/i // Weibo
|
250
247
|
], [NAME, VERSION], [
|
251
|
-
|
252
|
-
|
253
|
-
]
|
254
|
-
|
255
|
-
/(
|
256
|
-
], [[NAME, '
|
257
|
-
|
258
|
-
|
259
|
-
]
|
260
|
-
|
261
|
-
/
|
262
|
-
], [[NAME, 'Yandex']
|
263
|
-
|
264
|
-
/(
|
265
|
-
|
266
|
-
|
267
|
-
/
|
268
|
-
], [[NAME, '
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
/
|
274
|
-
], [[NAME, '
|
275
|
-
|
248
|
+
/(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
|
249
|
+
], [VERSION, [NAME, 'UCBrowser']], [
|
250
|
+
/(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
|
251
|
+
], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
|
252
|
+
/micromessenger\/([\w\.]+)/i // WeChat
|
253
|
+
], [VERSION, [NAME, 'WeChat']], [
|
254
|
+
/konqueror\/([\w\.]+)/i // Konqueror
|
255
|
+
], [VERSION, [NAME, 'Konqueror']], [
|
256
|
+
/trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
|
257
|
+
], [VERSION, [NAME, 'IE']], [
|
258
|
+
/yabrowser\/([\w\.]+)/i // Yandex
|
259
|
+
], [VERSION, [NAME, 'Yandex']], [
|
260
|
+
/(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
|
261
|
+
], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
|
262
|
+
/focus\/([\w\.]+)/i // Firefox Focus
|
263
|
+
], [VERSION, [NAME, 'Firefox Focus']], [
|
264
|
+
/opt\/([\w\.]+)/i // Opera Touch
|
265
|
+
], [VERSION, [NAME, 'Opera Touch']], [
|
266
|
+
/coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
|
267
|
+
], [VERSION, [NAME, 'Coc Coc']], [
|
268
|
+
/dolfin\/([\w\.]+)/i // Dolphin
|
269
|
+
], [VERSION, [NAME, 'Dolphin']], [
|
270
|
+
/coast\/([\w\.]+)/i // Opera Coast
|
271
|
+
], [VERSION, [NAME, 'Opera Coast']],
|
272
|
+
[/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
273
|
+
], [VERSION, [NAME, 'MIUI Browser']], [
|
274
|
+
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
275
|
+
], [VERSION, [NAME, 'Firefox']], [
|
276
|
+
/(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
|
277
|
+
], [[NAME, '360 Browser']], [
|
278
|
+
/(oculus|samsung|sailfish)browser\/([\w\.]+)/i
|
279
|
+
], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
|
276
280
|
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
277
281
|
], [[NAME, /_/g, ' '], VERSION], [
|
278
|
-
|
279
|
-
/(
|
280
|
-
]
|
281
|
-
|
282
|
-
/(micromessenger)\/([\w\.]+)/i // WeChat
|
283
|
-
], [[NAME, 'WeChat'], VERSION], [
|
284
|
-
|
285
|
-
/(brave)\/([\w\.]+)/i // Brave browser
|
286
|
-
], [[NAME, 'Brave'], VERSION], [
|
287
|
-
|
288
|
-
/(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
|
289
|
-
], [NAME, VERSION], [
|
290
|
-
|
291
|
-
/(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
|
292
|
-
], [NAME, VERSION], [
|
293
|
-
|
294
|
-
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
295
|
-
], [NAME, VERSION], [
|
296
|
-
|
297
|
-
/(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
|
282
|
+
/\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
|
283
|
+
/(tesla)(?:\sqtcarbrowser|\/(20[12]\d\.[\w\.-]+))/i, // Tesla
|
284
|
+
/m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
|
298
285
|
], [NAME, VERSION], [
|
299
|
-
|
300
|
-
/(
|
301
|
-
], [NAME, VERSION], [
|
302
|
-
|
303
|
-
/(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
|
304
|
-
], [NAME], [
|
305
|
-
|
306
|
-
/(LBBROWSER)/i // LieBao Browser
|
286
|
+
/(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
|
287
|
+
/(LBBROWSER)/i // LieBao Browser
|
307
288
|
], [NAME], [
|
308
289
|
|
309
|
-
|
310
|
-
]
|
311
|
-
|
312
|
-
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
|
290
|
+
// WebView
|
291
|
+
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
|
313
292
|
], [VERSION, [NAME, 'Facebook']], [
|
314
|
-
|
293
|
+
/FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
|
294
|
+
], [[NAME, 'Facebook']], [
|
315
295
|
/safari\s(line)\/([\w\.]+)/i, // Line App for iOS
|
316
|
-
|
296
|
+
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
|
297
|
+
/(chromium|instagram)[\/\s]([\w\.-]+)/i // Chromium/Instagram
|
317
298
|
], [NAME, VERSION], [
|
299
|
+
/\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
|
300
|
+
], [VERSION, [NAME, 'GSA']], [
|
318
301
|
|
319
302
|
/headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
|
320
303
|
], [VERSION, [NAME, 'Chrome Headless']], [
|
321
304
|
|
322
305
|
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
|
323
|
-
], [[NAME,
|
306
|
+
], [[NAME, 'Chrome WebView'], VERSION], [
|
324
307
|
|
325
|
-
/
|
326
|
-
], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
|
327
|
-
|
328
|
-
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
308
|
+
/droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
|
329
309
|
], [VERSION, [NAME, 'Android Browser']], [
|
330
310
|
|
331
|
-
/(
|
332
|
-
], [[NAME, 'Sailfish Browser'], VERSION], [
|
333
|
-
|
334
|
-
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
|
335
|
-
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
311
|
+
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
|
336
312
|
], [NAME, VERSION], [
|
337
313
|
|
338
|
-
/
|
339
|
-
], [[NAME, 'Dolphin'], VERSION], [
|
340
|
-
|
341
|
-
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
342
|
-
], [[NAME, 'Chrome'], VERSION], [
|
343
|
-
|
344
|
-
/(coast)\/([\w\.]+)/i // Opera Coast
|
345
|
-
], [[NAME, 'Opera Coast'], VERSION], [
|
346
|
-
|
347
|
-
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
348
|
-
], [VERSION, [NAME, 'Firefox']], [
|
349
|
-
|
350
|
-
/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
|
314
|
+
/version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
|
351
315
|
], [VERSION, [NAME, 'Mobile Safari']], [
|
352
|
-
|
353
|
-
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
|
316
|
+
/version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
|
354
317
|
], [VERSION, NAME], [
|
355
|
-
|
356
|
-
/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
|
357
|
-
], [[NAME, 'GSA'], VERSION], [
|
358
|
-
|
359
318
|
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
360
|
-
], [NAME, [VERSION, mapper.str, maps.browser.
|
319
|
+
], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
|
361
320
|
|
362
321
|
/(webkit|khtml)\/([\w\.]+)/i
|
363
322
|
], [NAME, VERSION], [
|
@@ -365,13 +324,16 @@
|
|
365
324
|
// Gecko based
|
366
325
|
/(navigator|netscape)\/([\w\.-]+)/i // Netscape
|
367
326
|
], [[NAME, 'Netscape'], VERSION], [
|
327
|
+
/ile\svr;\srv:([\w\.]+)\).+firefox/i // Firefox Reality
|
328
|
+
], [VERSION, [NAME, 'Firefox Reality']], [
|
329
|
+
/ekiohf.+(flow)\/([\w\.]+)/i, // Flow
|
368
330
|
/(swiftfox)/i, // Swiftfox
|
369
331
|
/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
|
370
332
|
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
371
333
|
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
|
372
|
-
|
373
334
|
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
374
|
-
/(
|
335
|
+
/(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
|
336
|
+
/(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
|
375
337
|
|
376
338
|
// Other
|
377
339
|
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
|
@@ -385,15 +347,21 @@
|
|
385
347
|
|
386
348
|
cpu : [[
|
387
349
|
|
388
|
-
/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
|
350
|
+
/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
|
389
351
|
], [[ARCHITECTURE, 'amd64']], [
|
390
352
|
|
391
353
|
/(ia32(?=;))/i // IA32 (quicktime)
|
392
354
|
], [[ARCHITECTURE, util.lowerize]], [
|
393
355
|
|
394
|
-
/((?:i[346]|x)86)[;\)]/i // IA32
|
356
|
+
/((?:i[346]|x)86)[;\)]/i // IA32 (x86)
|
395
357
|
], [[ARCHITECTURE, 'ia32']], [
|
396
358
|
|
359
|
+
/\b(aarch64|armv?8e?l?)\b/i // ARM64
|
360
|
+
], [[ARCHITECTURE, 'arm64']], [
|
361
|
+
|
362
|
+
/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
|
363
|
+
], [[ARCHITECTURE, 'armhf']], [
|
364
|
+
|
397
365
|
// PocketPC mistakenly identified as PowerPC
|
398
366
|
/windows\s(ce|mobile);\sppc;/i
|
399
367
|
], [[ARCHITECTURE, 'arm']], [
|
@@ -404,264 +372,301 @@
|
|
404
372
|
/(sun4\w)[;\)]/i // SPARC
|
405
373
|
], [[ARCHITECTURE, 'sparc']], [
|
406
374
|
|
407
|
-
/((?:avr32|ia64(?=;))|68k(?=\))
|
375
|
+
/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
|
408
376
|
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
|
409
377
|
], [[ARCHITECTURE, util.lowerize]]
|
410
378
|
],
|
411
379
|
|
412
380
|
device : [[
|
413
381
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
], [
|
422
|
-
|
423
|
-
|
424
|
-
/(
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
430
|
-
|
431
|
-
/(kf[A-z]+)\sbuild\/.+silk\//i // Kindle Fire HD
|
432
|
-
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
|
433
|
-
/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
|
434
|
-
], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
|
435
|
-
/android.+aft([bms])\sbuild/i // Fire TV
|
436
|
-
], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
|
437
|
-
|
438
|
-
/\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
|
439
|
-
], [MODEL, VENDOR, [TYPE, MOBILE]], [
|
440
|
-
/\((ip[honed|\s\w*]+);/i // iPod/iPhone
|
382
|
+
//////////////////////////
|
383
|
+
// MOBILES & TABLETS
|
384
|
+
// Ordered by popularity
|
385
|
+
/////////////////////////
|
386
|
+
|
387
|
+
// Samsung
|
388
|
+
/\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus\s10)/i
|
389
|
+
], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
390
|
+
/\b((?:s[cgp]h|gt|sm)-\w+|galaxy\snexus)/i,
|
391
|
+
/\ssamsung[\s-]([\w-]+)/i,
|
392
|
+
/sec-(sgh\w+)/i
|
393
|
+
], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
394
|
+
|
395
|
+
// Apple
|
396
|
+
/\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
|
441
397
|
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
|
398
|
+
/\((ipad);[\w\s\),;-]+apple/i, // iPad
|
399
|
+
/applecoremedia\/[\w\.]+\s\((ipad)/i,
|
400
|
+
/\b(ipad)\d\d?,\d\d?[;\]].+ios/i
|
401
|
+
], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
|
442
402
|
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
|
447
|
-
/(asus)-?(\w+)/i // Asus
|
448
|
-
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
449
|
-
/\(bb10;\s(\w+)/i // BlackBerry 10
|
450
|
-
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
|
451
|
-
// Asus Tablets
|
452
|
-
/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
|
453
|
-
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
|
454
|
-
|
455
|
-
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
|
456
|
-
/(sony)?(?:sgp.+)\sbuild\//i
|
457
|
-
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
|
458
|
-
/android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
459
|
-
], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
460
|
-
|
461
|
-
/\s(ouya)\s/i, // Ouya
|
462
|
-
/(nintendo)\s([wids3u]+)/i // Nintendo
|
463
|
-
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
|
464
|
-
|
465
|
-
/android.+;\s(shield)\sbuild/i // Nvidia
|
466
|
-
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
|
467
|
-
|
468
|
-
/(playstation\s[34portablevi]+)/i // Playstation
|
469
|
-
], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
|
470
|
-
|
471
|
-
/(sprint\s(\w+))/i // Sprint Phones
|
472
|
-
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
|
473
|
-
|
474
|
-
/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
|
475
|
-
/(zte)-(\w*)/i, // ZTE
|
476
|
-
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
|
477
|
-
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
478
|
-
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
479
|
-
|
480
|
-
/(nexus\s9)/i // HTC Nexus 9
|
481
|
-
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
482
|
-
|
403
|
+
// Huawei
|
404
|
+
/\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\d{2})/i,
|
405
|
+
], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
|
483
406
|
/d\/huawei([\w\s-]+)[;\)]/i,
|
484
|
-
|
407
|
+
/\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i,
|
408
|
+
/\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
|
485
409
|
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
486
410
|
|
487
|
-
|
488
|
-
],
|
489
|
-
|
490
|
-
|
491
|
-
]
|
492
|
-
|
493
|
-
], [[MODEL,
|
494
|
-
|
495
|
-
|
496
|
-
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
|
497
|
-
/mot[\s-]?(\w*)/i,
|
498
|
-
/(XT\d{3,4}) build\//i,
|
499
|
-
/(nexus\s6)/i
|
500
|
-
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
|
501
|
-
/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
|
502
|
-
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
|
503
|
-
|
504
|
-
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
|
505
|
-
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
|
506
|
-
|
507
|
-
/hbbtv.+maple;(\d+)/i
|
508
|
-
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
|
509
|
-
|
510
|
-
/\(dtv[\);].+(aquos)/i // Sharp
|
511
|
-
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
|
411
|
+
// Xiaomi
|
412
|
+
/\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
|
413
|
+
/\b;\s(\w+)\sbuild\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
414
|
+
/\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
|
415
|
+
/\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
|
416
|
+
/\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
|
417
|
+
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
418
|
+
/\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
|
419
|
+
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
|
512
420
|
|
513
|
-
|
514
|
-
|
515
|
-
]
|
516
|
-
|
517
|
-
], [VENDOR, [TYPE, SMARTTV], MODEL], [
|
518
|
-
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
|
519
|
-
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,
|
520
|
-
/sec-((sgh\w+))/i
|
521
|
-
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
|
421
|
+
// OPPO
|
422
|
+
/;\s(\w+)\sbuild.+\soppo/i,
|
423
|
+
/\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
|
424
|
+
], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
|
522
425
|
|
523
|
-
|
524
|
-
|
426
|
+
// Vivo
|
427
|
+
/\svivo\s(\w+)(?:\sbuild|\))/i,
|
428
|
+
/\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
|
429
|
+
], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
|
525
430
|
|
526
|
-
|
527
|
-
|
528
|
-
], [[VENDOR, '
|
431
|
+
// Realme
|
432
|
+
/\s(rmx[12]\d{3})(?:\sbuild|;)/i
|
433
|
+
], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
|
529
434
|
|
530
|
-
|
531
|
-
|
435
|
+
// Motorola
|
436
|
+
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
|
437
|
+
/\smot(?:orola)?[\s-](\w*)/i,
|
438
|
+
/((?:moto[\s\w\(\)]+|xt\d{3,4}|nexus\s6)(?=\sbuild|\)))/i
|
439
|
+
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
|
440
|
+
/\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
|
441
|
+
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
|
532
442
|
|
533
|
-
|
443
|
+
// LG
|
444
|
+
/((?=lg)?[vl]k\-?\d{3})\sbuild|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
|
534
445
|
], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
|
535
|
-
/
|
536
|
-
|
537
|
-
|
538
|
-
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
|
539
|
-
/(nexus\s[45])/i, // LG
|
540
|
-
/lg[e;\s\/-]+(\w*)/i,
|
541
|
-
/android.+lg(\-?[\d\w]+)\s+build/i
|
446
|
+
/(lm-?f100[nv]?|nexus\s[45])/i,
|
447
|
+
/lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
|
448
|
+
/\blg(\-?[\d\w]+)\sbuild/i
|
542
449
|
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
543
450
|
|
544
|
-
|
545
|
-
|
546
|
-
/
|
451
|
+
// Lenovo
|
452
|
+
/(ideatab[\w\-\s]+)/i,
|
453
|
+
/lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|yt[\d\w-]{6}|tb[\d\w-]{6})/i // Lenovo tablets
|
547
454
|
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
|
548
|
-
/(lenovo)[_\s-]?([\w-]+)/i
|
549
|
-
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
550
455
|
|
551
|
-
|
552
|
-
|
456
|
+
// Nokia
|
457
|
+
/(?:maemo|nokia).*(n900|lumia\s\d+)/i,
|
458
|
+
/nokia[\s_-]?([\w\.-]*)/i
|
459
|
+
], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
|
553
460
|
|
554
|
-
|
555
|
-
]
|
461
|
+
// Google
|
462
|
+
/droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
|
463
|
+
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
464
|
+
/droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
|
465
|
+
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
|
556
466
|
|
557
|
-
|
558
|
-
]
|
467
|
+
// Sony
|
468
|
+
/droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
469
|
+
], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
470
|
+
/sony\stablet\s[ps]\sbuild\//i,
|
471
|
+
/(?:sony)?sgp\w+(?:\sbuild\/|\))/i
|
472
|
+
], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
|
473
|
+
|
474
|
+
// OnePlus
|
475
|
+
/\s(kb2005|in20[12]5|be20[12][59])\b/i,
|
476
|
+
/\ba000(1)\sbuild/i, // OnePlus
|
477
|
+
/\boneplus\s(a\d{4})[\s)]/i
|
478
|
+
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
559
479
|
|
560
|
-
|
561
|
-
|
480
|
+
// Amazon
|
481
|
+
/(alexa)webm/i,
|
482
|
+
/(kf[a-z]{2}wi)(\sbuild\/|\))/i, // Kindle Fire without Silk
|
483
|
+
/(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
|
484
|
+
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
|
485
|
+
/(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
|
486
|
+
], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
|
562
487
|
|
563
|
-
|
564
|
-
|
488
|
+
// BlackBerry
|
489
|
+
/\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
|
490
|
+
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
491
|
+
/((?:bb[a-f]|st[hv])100-\d)/i,
|
492
|
+
/\(bb10;\s(\w+)/i // BlackBerry 10
|
493
|
+
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
|
565
494
|
|
566
|
-
|
567
|
-
|
495
|
+
// Asus
|
496
|
+
/(?:\b|asus_)(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00[cj])/i
|
497
|
+
], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
|
498
|
+
/\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
|
499
|
+
], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
|
568
500
|
|
569
|
-
|
570
|
-
|
501
|
+
// HTC
|
502
|
+
/(nexus\s9)/i // HTC Nexus 9
|
503
|
+
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
504
|
+
/(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
|
571
505
|
|
572
|
-
|
573
|
-
/
|
574
|
-
/
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
/
|
579
|
-
],[
|
580
|
-
|
506
|
+
// ZTE
|
507
|
+
/(zte)-(\w*)/i,
|
508
|
+
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
509
|
+
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
510
|
+
|
511
|
+
// Acer
|
512
|
+
/droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
|
513
|
+
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
514
|
+
|
515
|
+
// Meizu
|
516
|
+
/droid.+;\s(m[1-5]\snote)\sbuild/i,
|
517
|
+
/\bmz-([\w-]{2,})/i
|
581
518
|
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
|
582
|
-
/(mz)-([\w-]{2,})/i
|
583
|
-
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
|
584
519
|
|
585
|
-
|
586
|
-
/
|
587
|
-
|
520
|
+
// MIXED
|
521
|
+
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
|
522
|
+
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
523
|
+
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
|
524
|
+
/(asus)-?(\w+)/i, // Asus
|
525
|
+
/(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
|
526
|
+
/(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
|
527
|
+
/linux;.+(jolla);/i, // Jolla
|
528
|
+
/droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
|
529
|
+
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
588
530
|
|
589
|
-
/
|
590
|
-
|
531
|
+
/(archos)\s(gamepad2?)/i, // Archos
|
532
|
+
/(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
|
533
|
+
/(kindle)\/([\w\.]+)/i, // Kindle
|
534
|
+
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook
|
535
|
+
/(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
|
536
|
+
/[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
|
537
|
+
/[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
|
538
|
+
/\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
|
539
|
+
/\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
|
540
|
+
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
591
541
|
|
592
|
-
|
542
|
+
/\s(surface\sduo)\s/i // Surface Duo
|
543
|
+
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
|
544
|
+
/droid\s[\d\.]+;\s(fp\du?)\sbuild/i
|
545
|
+
], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
|
546
|
+
/\s(u304aa)\sbuild/i // AT&T
|
547
|
+
], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
|
548
|
+
/sie-(\w*)/i // Siemens
|
549
|
+
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
550
|
+
/[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
|
551
|
+
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
552
|
+
/[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
|
593
553
|
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
594
|
-
|
595
|
-
/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
|
554
|
+
/[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
|
596
555
|
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
|
556
|
+
/[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
|
557
|
+
], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
|
558
|
+
/[;\/]\s(tm\d{3}\w+)\sbuild/i
|
602
559
|
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
603
|
-
|
604
|
-
/android.+;\s(k88)\sbuild/i // ZTE K Series Tablet
|
560
|
+
/;\s(k88)\sbuild/i // ZTE K Series Tablet
|
605
561
|
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
|
606
|
-
|
607
|
-
|
562
|
+
/;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
|
563
|
+
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
564
|
+
/[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
|
608
565
|
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
609
|
-
|
610
|
-
/android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
|
566
|
+
/[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
|
611
567
|
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
612
|
-
|
613
|
-
/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
|
568
|
+
/[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
|
614
569
|
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
615
|
-
|
616
|
-
/
|
617
|
-
/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
|
570
|
+
/[;\/]\s([yr]\d{2})\sbuild/i,
|
571
|
+
/[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
|
618
572
|
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
|
619
|
-
|
620
|
-
/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
|
573
|
+
/[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
|
621
574
|
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
622
|
-
|
623
|
-
/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i // NextBook Tablets
|
575
|
+
/[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
|
624
576
|
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
625
|
-
|
626
|
-
/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
|
577
|
+
/[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
|
627
578
|
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
|
628
|
-
|
629
|
-
/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
|
579
|
+
/[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
|
630
580
|
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
631
|
-
|
632
|
-
/android.+;\s(PH-1)\s/i
|
581
|
+
/;\s(ph-1)\s/i
|
633
582
|
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
|
634
|
-
|
635
|
-
/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
|
583
|
+
/[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
|
636
584
|
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
585
|
+
/[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
|
586
|
+
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
587
|
+
/[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
|
588
|
+
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
|
589
|
+
/(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
|
590
|
+
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
|
591
|
+
/(sprint)\s(\w+)/i // Sprint Phones
|
592
|
+
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
593
|
+
/(kin\.[onetw]{3})/i // Microsoft Kin
|
594
|
+
], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
|
595
|
+
/droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
|
596
|
+
], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
|
597
|
+
/droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
|
598
|
+
], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
|
637
599
|
|
638
|
-
|
639
|
-
|
600
|
+
///////////////////
|
601
|
+
// CONSOLES
|
602
|
+
///////////////////
|
640
603
|
|
641
|
-
|
642
|
-
|
604
|
+
/\s(ouya)\s/i, // Ouya
|
605
|
+
/(nintendo)\s([wids3utch]+)/i // Nintendo
|
606
|
+
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
|
607
|
+
/droid.+;\s(shield)\sbuild/i // Nvidia
|
608
|
+
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
|
609
|
+
/(playstation\s[345portablevi]+)/i // Playstation
|
610
|
+
], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
|
611
|
+
/[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
|
612
|
+
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
|
643
613
|
|
644
|
-
|
645
|
-
|
614
|
+
///////////////////
|
615
|
+
// SMARTTVS
|
616
|
+
///////////////////
|
646
617
|
|
647
|
-
/
|
648
|
-
], [
|
618
|
+
/smart-tv.+(samsung)/i // Samsung
|
619
|
+
], [VENDOR, [TYPE, SMARTTV]], [
|
620
|
+
/hbbtv.+maple;(\d+)/i
|
621
|
+
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
|
622
|
+
/(?:linux;\snetcast.+smarttv|lg\snetcast\.tv-201\d)/i, // LG SmartTV
|
623
|
+
], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [
|
624
|
+
/(apple)\s?tv/i // Apple TV
|
625
|
+
], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
|
626
|
+
/crkey/i // Google Chromecast
|
627
|
+
], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
|
628
|
+
/droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
|
629
|
+
], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
|
630
|
+
/\(dtv[\);].+(aquos)/i // Sharp
|
631
|
+
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
|
632
|
+
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
|
633
|
+
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
|
634
|
+
/[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
|
635
|
+
], [[TYPE, SMARTTV]], [
|
649
636
|
|
650
|
-
|
651
|
-
|
637
|
+
///////////////////
|
638
|
+
// WEARABLES
|
639
|
+
///////////////////
|
652
640
|
|
653
|
-
/
|
654
|
-
], [VENDOR, MODEL, [TYPE,
|
641
|
+
/((pebble))app\/[\d\.]+\s/i // Pebble
|
642
|
+
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
643
|
+
/droid.+;\s(glass)\s\d/i // Google Glass
|
644
|
+
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
|
645
|
+
/droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
|
646
|
+
], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
|
655
647
|
|
656
|
-
|
657
|
-
|
658
|
-
|
648
|
+
///////////////////
|
649
|
+
// EMBEDDED
|
650
|
+
///////////////////
|
659
651
|
|
660
|
-
/[\
|
661
|
-
], [[TYPE,
|
652
|
+
/(tesla)(?:\sqtcarbrowser|\/20[12]\d\.[\w\.-]+)/i // Tesla
|
653
|
+
], [VENDOR, [TYPE, EMBEDDED]], [
|
654
|
+
|
655
|
+
////////////////////
|
656
|
+
// MIXED (GENERIC)
|
657
|
+
///////////////////
|
662
658
|
|
659
|
+
/droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
|
660
|
+
], [MODEL, [TYPE, MOBILE]], [
|
661
|
+
/droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
|
662
|
+
], [MODEL, [TYPE, TABLET]], [
|
663
|
+
/\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
|
664
|
+
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
665
|
+
], [[TYPE, util.lowerize]], [
|
663
666
|
/(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
|
664
|
-
], [MODEL, [VENDOR, 'Generic']]
|
667
|
+
], [MODEL, [VENDOR, 'Generic']], [
|
668
|
+
/(phone)/i
|
669
|
+
], [[TYPE, MOBILE]]
|
665
670
|
],
|
666
671
|
|
667
672
|
engine : [[
|
@@ -669,87 +674,86 @@
|
|
669
674
|
/windows.+\sedge\/([\w\.]+)/i // EdgeHTML
|
670
675
|
], [VERSION, [NAME, 'EdgeHTML']], [
|
671
676
|
|
672
|
-
/webkit\/537\.36.+chrome\/(?!27)/i
|
673
|
-
], [[NAME, 'Blink']], [
|
677
|
+
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
678
|
+
], [VERSION, [NAME, 'Blink']], [
|
674
679
|
|
675
680
|
/(presto)\/([\w\.]+)/i, // Presto
|
676
|
-
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
|
677
|
-
|
681
|
+
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
|
682
|
+
/ekioh(flow)\/([\w\.]+)/i, // Flow
|
678
683
|
/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
|
679
684
|
/(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
|
680
685
|
], [NAME, VERSION], [
|
681
686
|
|
682
|
-
/rv\:([\w\.]{1,9}).+(gecko)/i
|
687
|
+
/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
|
683
688
|
], [VERSION, NAME]
|
684
689
|
],
|
685
690
|
|
686
691
|
os : [[
|
687
692
|
|
688
|
-
// Windows
|
693
|
+
// Windows
|
689
694
|
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
|
690
695
|
], [NAME, VERSION], [
|
691
696
|
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
|
692
697
|
/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
|
693
|
-
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
|
698
|
+
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
|
694
699
|
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
|
695
700
|
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
|
696
701
|
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
|
697
702
|
|
698
|
-
//
|
699
|
-
|
700
|
-
|
701
|
-
/
|
702
|
-
/(
|
703
|
-
/(
|
704
|
-
|
705
|
-
|
706
|
-
/
|
707
|
-
]
|
703
|
+
// iOS/macOS
|
704
|
+
/ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
|
705
|
+
/cfnetwork\/.+darwin/i
|
706
|
+
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
707
|
+
/(mac\sos\sx)\s?([\w\s\.]*)/i,
|
708
|
+
/(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
|
709
|
+
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
|
710
|
+
|
711
|
+
// Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
|
712
|
+
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
|
713
|
+
/(blackberry)\w*\/([\w\.]*)/i, // Blackberry
|
714
|
+
/(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
|
708
715
|
/\((series40);/i // Series 40
|
709
|
-
], [NAME], [
|
716
|
+
], [NAME, VERSION], [
|
717
|
+
/\(bb(10);/i // BlackBerry 10
|
718
|
+
], [VERSION, [NAME, 'BlackBerry']], [
|
719
|
+
/(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
|
720
|
+
], [VERSION, [NAME, 'Symbian']], [
|
710
721
|
/mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
|
711
|
-
], [[NAME, 'Firefox OS']
|
722
|
+
], [[NAME, 'Firefox OS']], [
|
723
|
+
/web0s;.+rt(tv)/i,
|
724
|
+
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
|
725
|
+
], [VERSION, [NAME, 'webOS']], [
|
726
|
+
|
727
|
+
// Google Chromecast
|
728
|
+
/crkey\/([\d\.]+)/i // Google Chromecast
|
729
|
+
], [VERSION, [NAME, 'Chromecast']], [
|
730
|
+
/(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
|
731
|
+
], [[NAME, 'Chromium OS'], VERSION],[
|
712
732
|
|
713
733
|
// Console
|
714
|
-
/(nintendo|playstation)\s([
|
734
|
+
/(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
|
735
|
+
/(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
|
715
736
|
|
716
737
|
// GNU/Linux based
|
717
|
-
/(mint)[\/\s\(]?(\w*)/i,
|
738
|
+
/(mint)[\/\s\(\)]?(\w*)/i, // Mint
|
718
739
|
/(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
|
719
|
-
/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\
|
740
|
+
/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
|
720
741
|
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
|
721
742
|
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
|
722
743
|
/(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
|
723
|
-
/(gnu)\s?([\w\.]*)/i
|
724
|
-
], [NAME, VERSION], [
|
725
|
-
|
726
|
-
/(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
|
727
|
-
], [[NAME, 'Chromium OS'], VERSION],[
|
728
|
-
|
729
|
-
// Solaris
|
730
|
-
/(sunos)\s?([\w\.\d]*)/i // Solaris
|
731
|
-
], [[NAME, 'Solaris'], VERSION], [
|
744
|
+
/(gnu)\s?([\w\.]*)/i, // GNU
|
732
745
|
|
733
746
|
// BSD based
|
734
|
-
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i
|
735
|
-
], [NAME, VERSION],[
|
736
|
-
|
747
|
+
/\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
|
737
748
|
/(haiku)\s(\w+)/i // Haiku
|
738
|
-
], [NAME, VERSION],[
|
739
|
-
|
740
|
-
/cfnetwork\/.+darwin/i,
|
741
|
-
/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
|
742
|
-
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
743
|
-
|
744
|
-
/(mac\sos\sx)\s?([\w\s\.]*)/i,
|
745
|
-
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS
|
746
|
-
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
|
749
|
+
], [NAME, VERSION], [
|
747
750
|
|
748
751
|
// Other
|
752
|
+
/(sunos)\s?([\w\.\d]*)/i // Solaris
|
753
|
+
], [[NAME, 'Solaris'], VERSION], [
|
749
754
|
/((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
|
750
755
|
/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
|
751
|
-
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
|
752
|
-
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
|
756
|
+
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
|
753
757
|
/(unix)\s?([\w\.]*)/i // UNIX
|
754
758
|
], [NAME, VERSION]
|
755
759
|
]
|
@@ -759,45 +763,45 @@
|
|
759
763
|
/////////////////
|
760
764
|
// Constructor
|
761
765
|
////////////////
|
762
|
-
var UAParser = function (
|
766
|
+
var UAParser = function (ua, extensions) {
|
763
767
|
|
764
|
-
if (typeof
|
765
|
-
extensions =
|
766
|
-
|
768
|
+
if (typeof ua === 'object') {
|
769
|
+
extensions = ua;
|
770
|
+
ua = undefined;
|
767
771
|
}
|
768
772
|
|
769
773
|
if (!(this instanceof UAParser)) {
|
770
|
-
return new UAParser(
|
774
|
+
return new UAParser(ua, extensions).getResult();
|
771
775
|
}
|
772
776
|
|
773
|
-
var
|
774
|
-
var
|
777
|
+
var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
|
778
|
+
var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
|
775
779
|
|
776
780
|
this.getBrowser = function () {
|
777
|
-
var
|
778
|
-
mapper.rgx.call(
|
779
|
-
|
780
|
-
return
|
781
|
+
var _browser = { name: undefined, version: undefined };
|
782
|
+
mapper.rgx.call(_browser, _ua, _rgxmap.browser);
|
783
|
+
_browser.major = util.major(_browser.version); // deprecated
|
784
|
+
return _browser;
|
781
785
|
};
|
782
786
|
this.getCPU = function () {
|
783
|
-
var
|
784
|
-
mapper.rgx.call(
|
785
|
-
return
|
787
|
+
var _cpu = { architecture: undefined };
|
788
|
+
mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
|
789
|
+
return _cpu;
|
786
790
|
};
|
787
791
|
this.getDevice = function () {
|
788
|
-
var
|
789
|
-
mapper.rgx.call(
|
790
|
-
return
|
792
|
+
var _device = { vendor: undefined, model: undefined, type: undefined };
|
793
|
+
mapper.rgx.call(_device, _ua, _rgxmap.device);
|
794
|
+
return _device;
|
791
795
|
};
|
792
796
|
this.getEngine = function () {
|
793
|
-
var
|
794
|
-
mapper.rgx.call(
|
795
|
-
return
|
797
|
+
var _engine = { name: undefined, version: undefined };
|
798
|
+
mapper.rgx.call(_engine, _ua, _rgxmap.engine);
|
799
|
+
return _engine;
|
796
800
|
};
|
797
801
|
this.getOS = function () {
|
798
|
-
var
|
799
|
-
mapper.rgx.call(
|
800
|
-
return
|
802
|
+
var _os = { name: undefined, version: undefined };
|
803
|
+
mapper.rgx.call(_os, _ua, _rgxmap.os);
|
804
|
+
return _os;
|
801
805
|
};
|
802
806
|
this.getResult = function () {
|
803
807
|
return {
|
@@ -810,12 +814,13 @@
|
|
810
814
|
};
|
811
815
|
};
|
812
816
|
this.getUA = function () {
|
813
|
-
return
|
817
|
+
return _ua;
|
814
818
|
};
|
815
|
-
this.setUA = function (
|
816
|
-
|
819
|
+
this.setUA = function (ua) {
|
820
|
+
_ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;
|
817
821
|
return this;
|
818
822
|
};
|
823
|
+
this.setUA(_ua);
|
819
824
|
return this;
|
820
825
|
};
|
821
826
|
|
@@ -866,7 +871,7 @@
|
|
866
871
|
define(function () {
|
867
872
|
return UAParser;
|
868
873
|
});
|
869
|
-
} else if (window) {
|
874
|
+
} else if (typeof window !== 'undefined') {
|
870
875
|
// browser env
|
871
876
|
window.UAParser = UAParser;
|
872
877
|
}
|
@@ -877,8 +882,8 @@
|
|
877
882
|
// In AMD env the global scope should be kept clean, but jQuery is an exception.
|
878
883
|
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
|
879
884
|
// and we should catch that.
|
880
|
-
var $ = window && (window.jQuery || window.Zepto);
|
881
|
-
if (
|
885
|
+
var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);
|
886
|
+
if ($ && !$.ua) {
|
882
887
|
var parser = new UAParser();
|
883
888
|
$.ua = parser.getResult();
|
884
889
|
$.ua.get = function () {
|