ua-parser-js 2.0.0-alpha.2 → 2.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ua-parser.min.js +2 -2
- package/dist/ua-parser.pack.js +2 -2
- package/package.json +29 -30
- package/readme.md +107 -57
- package/src/{enum/ua-parser-enum.js → enums/ua-parser-enums.js} +4 -2
- package/src/{enum/ua-parser-enum.mjs → enums/ua-parser-enums.mjs} +5 -3
- package/src/extensions/ua-parser-extensions.js +248 -0
- package/src/extensions/ua-parser-extensions.mjs +252 -0
- package/src/helpers/ua-parser-helpers.js +42 -0
- package/src/helpers/ua-parser-helpers.mjs +46 -0
- package/src/{ua-parser.js → main/ua-parser.js} +242 -199
- package/src/{ua-parser.mjs → main/ua-parser.mjs} +243 -202
- package/src/extension/ua-parser-extension.js +0 -120
- package/src/extension/ua-parser-extension.mjs +0 -124
@@ -1,11 +1,9 @@
|
|
1
|
-
// Generated ESM version of UAParser.js
|
1
|
+
// Generated ESM version of UAParser.js
|
2
2
|
// DO NOT EDIT THIS FILE!
|
3
|
-
// Source: /src/ua-parser.js
|
4
|
-
|
5
|
-
const window = undefined;
|
3
|
+
// Source: /src/main/ua-parser.js
|
6
4
|
|
7
5
|
/////////////////////////////////////////////////////////////////////////////////
|
8
|
-
/* UAParser.js v2.0.0-alpha.
|
6
|
+
/* UAParser.js v2.0.0-alpha.3
|
9
7
|
Copyright © 2012-2023 Faisal Salman <f@faisalman.com>
|
10
8
|
MIT License *//*
|
11
9
|
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
@@ -14,14 +12,17 @@ const window = undefined;
|
|
14
12
|
Source : https://github.com/faisalman/ua-parser-js */
|
15
13
|
/////////////////////////////////////////////////////////////////////////////////
|
16
14
|
|
15
|
+
/* jshint esversion: 6 */
|
16
|
+
/* globals window */
|
17
17
|
|
18
18
|
|
19
|
+
|
19
20
|
//////////////
|
20
21
|
// Constants
|
21
22
|
/////////////
|
22
23
|
|
23
24
|
|
24
|
-
var LIBVERSION = '2.0.0-alpha.
|
25
|
+
var LIBVERSION = '2.0.0-alpha.3',
|
25
26
|
EMPTY = '',
|
26
27
|
UNKNOWN = '?',
|
27
28
|
FUNC_TYPE = 'function',
|
@@ -51,12 +52,12 @@ const window = undefined;
|
|
51
52
|
CH_HEADER = 'sec-ch-ua',
|
52
53
|
CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',
|
53
54
|
CH_HEADER_ARCH = CH_HEADER + '-arch',
|
54
|
-
CH_HEADER_BITNESS = CH_HEADER + '-
|
55
|
-
CH_HEADER_MOBILE = CH_HEADER + '-
|
56
|
-
CH_HEADER_MODEL = CH_HEADER + '-
|
57
|
-
CH_HEADER_PLATFORM = CH_HEADER + '-
|
55
|
+
CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,
|
56
|
+
CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,
|
57
|
+
CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,
|
58
|
+
CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
|
58
59
|
CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
|
59
|
-
CH_ALL_VALUES = [
|
60
|
+
CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, BITNESS],
|
60
61
|
UA_BROWSER = 'browser',
|
61
62
|
UA_CPU = 'cpu',
|
62
63
|
UA_DEVICE = 'device',
|
@@ -97,18 +98,7 @@ const window = undefined;
|
|
97
98
|
// Helper
|
98
99
|
//////////
|
99
100
|
|
100
|
-
var
|
101
|
-
for (var i in arr) {
|
102
|
-
var propName = arr[i];
|
103
|
-
if (typeof propName == OBJ_TYPE && propName.length == 2) {
|
104
|
-
this[propName[0]] = propName[1];
|
105
|
-
} else {
|
106
|
-
this[propName] = undefined;
|
107
|
-
}
|
108
|
-
}
|
109
|
-
return this;
|
110
|
-
},
|
111
|
-
extend = function (regexes, extensions) {
|
101
|
+
var extend = function (regexes, extensions) {
|
112
102
|
var mergedRegexes = {};
|
113
103
|
for (var i in regexes) {
|
114
104
|
mergedRegexes[i] = extensions[i] && extensions[i].length % 2 === 0 ? extensions[i].concat(regexes[i]) : regexes[i];
|
@@ -152,6 +142,17 @@ const window = undefined;
|
|
152
142
|
majorize = function (version) {
|
153
143
|
return typeof(version) === STR_TYPE ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
|
154
144
|
},
|
145
|
+
setProps = function (arr) {
|
146
|
+
for (var i in arr) {
|
147
|
+
var propName = arr[i];
|
148
|
+
if (typeof propName == OBJ_TYPE && propName.length == 2) {
|
149
|
+
this[propName[0]] = propName[1];
|
150
|
+
} else {
|
151
|
+
this[propName] = undefined;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
return this;
|
155
|
+
},
|
155
156
|
strip = function (pattern, str) {
|
156
157
|
return str.replace(pattern, EMPTY);
|
157
158
|
},
|
@@ -245,18 +246,7 @@ const window = undefined;
|
|
245
246
|
// String map
|
246
247
|
//////////////
|
247
248
|
|
248
|
-
|
249
|
-
var oldSafariMap = {
|
250
|
-
'1.0' : '/8',
|
251
|
-
'1.2' : '/1',
|
252
|
-
'1.3' : '/3',
|
253
|
-
'2.0' : '/412',
|
254
|
-
'2.0.2' : '/416',
|
255
|
-
'2.0.3' : '/417',
|
256
|
-
'2.0.4' : '/419',
|
257
|
-
'?' : '/'
|
258
|
-
},
|
259
|
-
windowsVersionMap = {
|
249
|
+
var windowsVersionMap = {
|
260
250
|
'ME' : '4.90',
|
261
251
|
'NT 3.11' : 'NT3.51',
|
262
252
|
'NT 4.0' : 'NT4.0',
|
@@ -359,7 +349,7 @@ const window = undefined;
|
|
359
349
|
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
|
360
350
|
/safari (line)\/([\w\.]+)/i, // Line App for iOS
|
361
351
|
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
|
362
|
-
/(chromium|instagram)[\/ ]([-\w\.]+)/i
|
352
|
+
/(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
|
363
353
|
], [NAME, VERSION], [
|
364
354
|
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
|
365
355
|
], [VERSION, [NAME, 'GSA']], [
|
@@ -388,7 +378,7 @@ const window = undefined;
|
|
388
378
|
/version\/([\w\.\,]+) .*(safari)/i // Safari
|
389
379
|
], [VERSION, NAME], [
|
390
380
|
/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
391
|
-
], [NAME, [VERSION,
|
381
|
+
], [NAME, [VERSION, '1']], [
|
392
382
|
|
393
383
|
/(webkit|khtml)\/([\w\.]+)/i
|
394
384
|
], [NAME, VERSION], [
|
@@ -429,7 +419,7 @@ const window = undefined;
|
|
429
419
|
/((?:i[346]|x)86)[;\)]/i // IA32 (x86)
|
430
420
|
], [[ARCHITECTURE, 'ia32']], [
|
431
421
|
|
432
|
-
/\b(aarch64|arm(v?8e?l?|_?64))\b/i
|
422
|
+
/\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
|
433
423
|
], [[ARCHITECTURE, 'arm64']], [
|
434
424
|
|
435
425
|
/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
|
@@ -486,7 +476,7 @@ const window = undefined;
|
|
486
476
|
], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
|
487
477
|
|
488
478
|
// Xiaomi
|
489
|
-
/\b(poco[\w ]
|
479
|
+
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
|
490
480
|
/\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
491
481
|
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
|
492
482
|
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
|
@@ -594,7 +584,7 @@ const window = undefined;
|
|
594
584
|
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
|
595
585
|
|
596
586
|
// MIXED
|
597
|
-
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
|
587
|
+
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
|
598
588
|
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
599
589
|
/(hp) ([\w ]+\w)/i, // HP iPAQ
|
600
590
|
/(asus)-?(\w+)/i, // Asus
|
@@ -639,7 +629,7 @@ const window = undefined;
|
|
639
629
|
], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
|
640
630
|
/crkey/i // Google Chromecast
|
641
631
|
], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
642
|
-
/droid.+aft(\w)( bui|\))/i
|
632
|
+
/droid.+aft(\w+)( bui|\))/i // Fire TV
|
643
633
|
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
|
644
634
|
/\(dtv[\);].+(aquos)/i,
|
645
635
|
/(aquos-tv[\w ]+)\)/i // Sharp
|
@@ -744,7 +734,7 @@ const window = undefined;
|
|
744
734
|
|
745
735
|
// iOS/macOS
|
746
736
|
/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
|
747
|
-
/ios;fbsv\/([\d\.]+)/i,
|
737
|
+
/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
|
748
738
|
/cfnetwork\/.+darwin/i
|
749
739
|
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
750
740
|
/(mac os x) ?([\w\. ]*)/i,
|
@@ -813,23 +803,23 @@ const window = undefined;
|
|
813
803
|
|
814
804
|
var defaultProps = (function () {
|
815
805
|
var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
|
816
|
-
|
806
|
+
setProps.call(props.init, [
|
817
807
|
[UA_BROWSER, [NAME, VERSION, MAJOR]],
|
818
808
|
[UA_CPU, [ARCHITECTURE]],
|
819
809
|
[UA_DEVICE, [TYPE, MODEL, VENDOR]],
|
820
810
|
[UA_ENGINE, [NAME, VERSION]],
|
821
811
|
[UA_OS, [NAME, VERSION]]
|
822
812
|
]);
|
823
|
-
|
813
|
+
setProps.call(props.isIgnore, [
|
824
814
|
[UA_BROWSER, [VERSION, MAJOR]],
|
825
815
|
[UA_ENGINE, [VERSION]],
|
826
816
|
[UA_OS, [VERSION]]
|
827
817
|
]);
|
828
|
-
|
818
|
+
setProps.call(props.isIgnoreRgx, [
|
829
819
|
[UA_BROWSER, / ?browser$/i],
|
830
820
|
[UA_OS, / ?os$/i]
|
831
821
|
]);
|
832
|
-
|
822
|
+
setProps.call(props.toString, [
|
833
823
|
[UA_BROWSER, [NAME, VERSION]],
|
834
824
|
[UA_CPU, [ARCHITECTURE]],
|
835
825
|
[UA_DEVICE, [VENDOR, MODEL]],
|
@@ -839,34 +829,47 @@ const window = undefined;
|
|
839
829
|
return props;
|
840
830
|
})();
|
841
831
|
|
842
|
-
var
|
832
|
+
var createIData = function (item, itemType) {
|
843
833
|
|
844
834
|
var init_props = defaultProps.init[itemType],
|
845
835
|
is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
|
846
836
|
is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
|
847
837
|
toString_props = defaultProps.toString[itemType] || 0;
|
848
838
|
|
849
|
-
function
|
850
|
-
|
839
|
+
function IData () {
|
840
|
+
setProps.call(this, init_props);
|
851
841
|
}
|
852
|
-
|
853
|
-
|
842
|
+
|
843
|
+
IData.prototype.getItem = function () {
|
844
|
+
return item;
|
845
|
+
};
|
846
|
+
|
847
|
+
IData.prototype.withClientHints = function () {
|
848
|
+
|
854
849
|
// nodejs / non-client-hints browsers
|
855
850
|
if (!NAVIGATOR_UADATA) {
|
856
|
-
return
|
851
|
+
return item
|
852
|
+
.parseCH()
|
853
|
+
.get();
|
857
854
|
}
|
858
855
|
|
859
856
|
// browsers based on chromium 85+
|
860
857
|
return NAVIGATOR_UADATA
|
861
858
|
.getHighEntropyValues(CH_ALL_VALUES)
|
862
859
|
.then(function (res) {
|
863
|
-
|
864
|
-
|
860
|
+
return item
|
861
|
+
.setCH(new UACHData(res, false))
|
862
|
+
.parseCH()
|
863
|
+
.get();
|
865
864
|
});
|
866
865
|
};
|
867
866
|
|
867
|
+
IData.prototype.withFeatureCheck = function () {
|
868
|
+
return item.detectFeature().get();
|
869
|
+
};
|
870
|
+
|
868
871
|
if (itemType != UA_RESULT) {
|
869
|
-
|
872
|
+
IData.prototype.is = function (strToCheck) {
|
870
873
|
var is = false;
|
871
874
|
for (var i in this) {
|
872
875
|
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)) {
|
@@ -879,7 +882,7 @@ const window = undefined;
|
|
879
882
|
}
|
880
883
|
return is;
|
881
884
|
};
|
882
|
-
|
885
|
+
IData.prototype.toString = function () {
|
883
886
|
var str = EMPTY;
|
884
887
|
for (var i in toString_props) {
|
885
888
|
if (typeof(this[toString_props[i]]) !== UNDEF_TYPE) {
|
@@ -891,40 +894,39 @@ const window = undefined;
|
|
891
894
|
}
|
892
895
|
|
893
896
|
if (!NAVIGATOR_UADATA) {
|
894
|
-
|
897
|
+
IData.prototype.then = function (cb) {
|
895
898
|
var that = this;
|
896
|
-
var
|
899
|
+
var IDataResolve = function () {
|
897
900
|
for (var prop in that) {
|
898
901
|
if (that.hasOwnProperty(prop)) {
|
899
902
|
this[prop] = that[prop];
|
900
903
|
}
|
901
904
|
}
|
902
905
|
};
|
903
|
-
|
904
|
-
is :
|
905
|
-
toString :
|
906
|
+
IDataResolve.prototype = {
|
907
|
+
is : IData.prototype.is,
|
908
|
+
toString : IData.prototype.toString
|
906
909
|
};
|
907
|
-
var resolveData = new
|
910
|
+
var resolveData = new IDataResolve();
|
908
911
|
cb(resolveData);
|
909
912
|
return resolveData;
|
910
913
|
};
|
911
914
|
}
|
912
915
|
|
913
|
-
return new
|
916
|
+
return new IData();
|
914
917
|
};
|
915
918
|
|
916
919
|
/////////////////
|
917
920
|
// Constructor
|
918
921
|
////////////////
|
919
922
|
|
920
|
-
function
|
923
|
+
function UACHData (uach, isHttpUACH) {
|
921
924
|
uach = uach || {};
|
922
|
-
|
923
|
-
if (
|
924
|
-
|
925
|
+
setProps.call(this, CH_ALL_VALUES);
|
926
|
+
if (isHttpUACH) {
|
927
|
+
setProps.call(this, [
|
925
928
|
[BRANDS, itemListToArray(uach[CH_HEADER])],
|
926
929
|
[FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],
|
927
|
-
[BRANDS, itemListToArray(uach[CH_HEADER])],
|
928
930
|
[MOBILE, /\?1/.test(uach[CH_HEADER_MOBILE])],
|
929
931
|
[MODEL, stripQuotes(uach[CH_HEADER_MODEL])],
|
930
932
|
[PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
|
@@ -937,127 +939,151 @@ const window = undefined;
|
|
937
939
|
if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];
|
938
940
|
}
|
939
941
|
}
|
940
|
-
return this;
|
941
942
|
}
|
942
943
|
|
943
|
-
function
|
944
|
-
|
944
|
+
function UAItem (itemType, ua, rgxMap, uaCH) {
|
945
|
+
|
946
|
+
this.get = function (prop) {
|
947
|
+
if (!prop) return this.data;
|
948
|
+
return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
|
949
|
+
};
|
950
|
+
|
951
|
+
this.set = function (prop, val) {
|
952
|
+
this.data[prop] = val;
|
953
|
+
return this;
|
954
|
+
};
|
955
|
+
|
956
|
+
this.setCH = function (ch) {
|
957
|
+
this.uaCH = ch;
|
958
|
+
return this;
|
959
|
+
};
|
960
|
+
|
961
|
+
this.detectFeature = function () {
|
962
|
+
if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
|
963
|
+
switch (this.itemType) {
|
964
|
+
case UA_BROWSER:
|
965
|
+
// Brave-specific detection
|
966
|
+
if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
|
967
|
+
this.set(NAME, 'Brave');
|
968
|
+
}
|
969
|
+
break;
|
970
|
+
case UA_DEVICE:
|
971
|
+
// Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
|
972
|
+
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
|
973
|
+
this.set(TYPE, MOBILE);
|
974
|
+
}
|
975
|
+
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties
|
976
|
+
if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
|
977
|
+
this.set(MODEL, 'iPad')
|
978
|
+
.set(TYPE, TABLET);
|
979
|
+
}
|
980
|
+
break;
|
981
|
+
case UA_OS:
|
982
|
+
// Chrome-specific detection: check for 'platform' value of navigator.userAgentData
|
983
|
+
if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
|
984
|
+
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
|
985
|
+
}
|
986
|
+
break;
|
987
|
+
case UA_RESULT:
|
988
|
+
var data = this.data;
|
989
|
+
var detect = function (itemType) {
|
990
|
+
return data[itemType]
|
991
|
+
.getItem()
|
992
|
+
.detectFeature()
|
993
|
+
.get();
|
994
|
+
};
|
995
|
+
this.set(UA_BROWSER, detect(UA_BROWSER))
|
996
|
+
.set(UA_CPU, detect(UA_CPU))
|
997
|
+
.set(UA_DEVICE, detect(UA_DEVICE))
|
998
|
+
.set(UA_ENGINE, detect(UA_ENGINE))
|
999
|
+
.set(UA_OS, detect(UA_OS));
|
1000
|
+
}
|
1001
|
+
}
|
1002
|
+
return this;
|
1003
|
+
};
|
1004
|
+
|
1005
|
+
this.parseUA = function () {
|
1006
|
+
if (this.itemType != UA_RESULT) {
|
1007
|
+
rgxMapper.call(this.data, this.ua, this.rgxMap);
|
1008
|
+
}
|
1009
|
+
if (this.itemType == UA_BROWSER) {
|
1010
|
+
this.set(MAJOR, majorize(this.get(VERSION)));
|
1011
|
+
}
|
1012
|
+
return this;
|
1013
|
+
};
|
1014
|
+
|
1015
|
+
this.parseCH = function () {
|
1016
|
+
var ua = this.ua,
|
1017
|
+
uaCH = this.uaCH,
|
1018
|
+
rgxMap = this.rgxMap;
|
1019
|
+
|
1020
|
+
switch (this.itemType) {
|
1021
|
+
case UA_BROWSER:
|
1022
|
+
var brands = uaCH[FULLVERLIST] || uaCH[BRANDS];
|
1023
|
+
if (brands) {
|
1024
|
+
for (var i in brands) {
|
1025
|
+
var brandName = brands[i].brand,
|
1026
|
+
brandVersion = brands[i].version;
|
1027
|
+
if (!/not.a.brand/i.test(brandName) && (i < 1 || /chromi/i.test(this.get(NAME)))) {
|
1028
|
+
this.set(NAME, strip(GOOGLE+' ', brandName))
|
1029
|
+
.set(VERSION, brandVersion)
|
1030
|
+
.set(MAJOR, majorize(brandVersion));
|
1031
|
+
}
|
1032
|
+
}
|
1033
|
+
}
|
1034
|
+
break;
|
1035
|
+
case UA_CPU:
|
1036
|
+
var archName = uaCH[ARCHITECTURE];
|
1037
|
+
if (archName) {
|
1038
|
+
if (archName && uaCH[BITNESS] == '64') archName += '64';
|
1039
|
+
rgxMapper.call(this.data, archName + ';', rgxMap);
|
1040
|
+
}
|
1041
|
+
break;
|
1042
|
+
case UA_DEVICE:
|
1043
|
+
if (uaCH[MOBILE]) {
|
1044
|
+
this.set(TYPE, MOBILE);
|
1045
|
+
}
|
1046
|
+
if (uaCH[MODEL]) {
|
1047
|
+
this.set(MODEL, uaCH[MODEL]);
|
1048
|
+
}
|
1049
|
+
break;
|
1050
|
+
case UA_OS:
|
1051
|
+
var osName = uaCH[PLATFORM];
|
1052
|
+
if(osName) {
|
1053
|
+
var osVersion = uaCH[PLATFORMVER];
|
1054
|
+
if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
|
1055
|
+
this.set(NAME, osName)
|
1056
|
+
.set(VERSION, osVersion);
|
1057
|
+
}
|
1058
|
+
break;
|
1059
|
+
case UA_RESULT:
|
1060
|
+
var data = this.data;
|
1061
|
+
var parse = function (itemType) {
|
1062
|
+
return data[itemType]
|
1063
|
+
.getItem()
|
1064
|
+
.setCH(uaCH)
|
1065
|
+
.parseCH()
|
1066
|
+
.get();
|
1067
|
+
};
|
1068
|
+
this.set(UA_BROWSER, parse(UA_BROWSER))
|
1069
|
+
.set(UA_CPU, parse(UA_CPU))
|
1070
|
+
.set(UA_DEVICE, parse(UA_DEVICE))
|
1071
|
+
.set(UA_ENGINE, parse(UA_ENGINE))
|
1072
|
+
.set(UA_OS, parse(UA_OS));
|
1073
|
+
}
|
1074
|
+
return this;
|
1075
|
+
};
|
1076
|
+
|
1077
|
+
setProps.call(this, [
|
945
1078
|
['itemType', itemType],
|
946
1079
|
['ua', ua],
|
947
1080
|
['uaCH', uaCH],
|
948
1081
|
['rgxMap', rgxMap],
|
949
|
-
['data',
|
1082
|
+
['data', createIData(this, itemType)]
|
950
1083
|
]);
|
951
|
-
|
952
|
-
var isSelfNav = NAVIGATOR && NAVIGATOR.userAgent == ua;
|
953
|
-
switch(this.itemType) {
|
954
|
-
case UA_BROWSER:
|
955
|
-
// Brave-specific detection
|
956
|
-
if (isSelfNav && NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
|
957
|
-
this.set(NAME, 'Brave');
|
958
|
-
}
|
959
|
-
this.set(MAJOR, majorize(this.get(VERSION)));
|
960
|
-
break;
|
961
|
-
case UA_DEVICE:
|
962
|
-
if (isSelfNav && !this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
|
963
|
-
this.set(TYPE, MOBILE);
|
964
|
-
}
|
965
|
-
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties
|
966
|
-
if (isSelfNav && this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
|
967
|
-
this.set(MODEL, 'iPad')
|
968
|
-
.set(TYPE, TABLET);
|
969
|
-
}
|
970
|
-
break;
|
971
|
-
case UA_OS:
|
972
|
-
if (isSelfNav && !this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
|
973
|
-
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
|
974
|
-
}
|
975
|
-
break;
|
976
|
-
case UA_RESULT:
|
977
|
-
var createUAParserItem = function (itemType) {
|
978
|
-
return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).get();
|
979
|
-
};
|
980
|
-
this.set('ua', ua)
|
981
|
-
.set(UA_BROWSER, createUAParserItem(UA_BROWSER))
|
982
|
-
.set(UA_CPU, createUAParserItem(UA_CPU))
|
983
|
-
.set(UA_DEVICE, createUAParserItem(UA_DEVICE))
|
984
|
-
.set(UA_ENGINE, createUAParserItem(UA_ENGINE))
|
985
|
-
.set(UA_OS, createUAParserItem(UA_OS))
|
986
|
-
.get();
|
987
|
-
}
|
1084
|
+
|
988
1085
|
return this;
|
989
1086
|
}
|
990
|
-
UAParserItem.prototype.get = function (prop) {
|
991
|
-
if (!prop) return this.data;
|
992
|
-
return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
|
993
|
-
};
|
994
|
-
UAParserItem.prototype.parse = function () {
|
995
|
-
if (this.itemType != UA_RESULT) {
|
996
|
-
rgxMapper.call(this.data, this.ua, this.rgxMap);
|
997
|
-
}
|
998
|
-
return this;
|
999
|
-
};
|
1000
|
-
UAParserItem.prototype.parseCH = function () {
|
1001
|
-
var ua = this.ua,
|
1002
|
-
uaCH = this.uaCH,
|
1003
|
-
rgxMap = this.rgxMap;
|
1004
|
-
|
1005
|
-
switch (this.itemType) {
|
1006
|
-
case UA_BROWSER:
|
1007
|
-
var brands = uaCH[FULLVERLIST] || uaCH[BRANDS];
|
1008
|
-
if (brands) {
|
1009
|
-
for (var i in brands) {
|
1010
|
-
var brandName = brands[i].brand,
|
1011
|
-
brandVersion = brands[i].version;
|
1012
|
-
if (!/not.a.brand/i.test(brandName) && (i < 1 || /chromi/i.test(this.get(NAME)))) {
|
1013
|
-
this.set(NAME, strip(GOOGLE+' ', brandName))
|
1014
|
-
.set(VERSION, brandVersion)
|
1015
|
-
.set(MAJOR, majorize(brandVersion));
|
1016
|
-
}
|
1017
|
-
}
|
1018
|
-
}
|
1019
|
-
break;
|
1020
|
-
case UA_CPU:
|
1021
|
-
var archName = uaCH[ARCHITECTURE];
|
1022
|
-
if (archName) {
|
1023
|
-
if (archName && uaCH[BITNESS] == '64') archName += '64';
|
1024
|
-
rgxMapper.call(this.data, archName + ';', rgxMap);
|
1025
|
-
}
|
1026
|
-
break;
|
1027
|
-
case UA_DEVICE:
|
1028
|
-
if (uaCH[MOBILE]) {
|
1029
|
-
this.set(TYPE, MOBILE);
|
1030
|
-
}
|
1031
|
-
if (uaCH[MODEL]) {
|
1032
|
-
this.set(MODEL, uaCH[MODEL]);
|
1033
|
-
}
|
1034
|
-
break;
|
1035
|
-
case UA_OS:
|
1036
|
-
var osName = uaCH[PLATFORM];
|
1037
|
-
if(osName) {
|
1038
|
-
var osVersion = uaCH[PLATFORMVER];
|
1039
|
-
if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
|
1040
|
-
this.set(NAME, osName)
|
1041
|
-
.set(VERSION, osVersion);
|
1042
|
-
}
|
1043
|
-
break;
|
1044
|
-
case UA_RESULT:
|
1045
|
-
var createUAParserItemWithCH = function (itemType) {
|
1046
|
-
return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).parseCH().get();
|
1047
|
-
};
|
1048
|
-
this.set('ua', ua)
|
1049
|
-
.set(UA_BROWSER, createUAParserItemWithCH(UA_BROWSER))
|
1050
|
-
.set(UA_CPU, createUAParserItemWithCH(UA_CPU))
|
1051
|
-
.set(UA_DEVICE, createUAParserItemWithCH(UA_DEVICE))
|
1052
|
-
.set(UA_ENGINE, createUAParserItemWithCH(UA_ENGINE))
|
1053
|
-
.set(UA_OS, createUAParserItemWithCH(UA_OS));
|
1054
|
-
}
|
1055
|
-
return this;
|
1056
|
-
};
|
1057
|
-
UAParserItem.prototype.set = function (prop, val) {
|
1058
|
-
this.data[prop] = val;
|
1059
|
-
return this;
|
1060
|
-
};
|
1061
1087
|
|
1062
1088
|
function UAParser (ua, extensions, headers) {
|
1063
1089
|
|
@@ -1081,39 +1107,54 @@ const window = undefined;
|
|
1081
1107
|
return new UAParser(ua, extensions, headers).getResult();
|
1082
1108
|
}
|
1083
1109
|
|
1084
|
-
var userAgent = ua
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
headers[USER_AGENT] :
|
1089
|
-
EMPTY)),
|
1090
|
-
|
1091
|
-
HTTP_UACH = new UAParserDataCH(headers, true),
|
1110
|
+
var userAgent = typeof ua === STR_TYPE ? ua : // Passed user-agent string
|
1111
|
+
((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
|
1112
|
+
(headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
|
1113
|
+
EMPTY)), // empty string
|
1092
1114
|
|
1115
|
+
httpUACH = new UACHData(headers, true),
|
1093
1116
|
regexMap = extensions ?
|
1094
1117
|
extend(defaultRegexes, extensions) :
|
1095
1118
|
defaultRegexes,
|
1096
1119
|
|
1097
|
-
|
1098
|
-
|
1099
|
-
return
|
1100
|
-
|
1120
|
+
createItemFunc = function (itemType) {
|
1121
|
+
if (itemType == UA_RESULT) {
|
1122
|
+
return function () {
|
1123
|
+
return new UAItem(itemType, userAgent, regexMap, httpUACH)
|
1124
|
+
.set('ua', userAgent)
|
1125
|
+
.set(UA_BROWSER, this.getBrowser())
|
1126
|
+
.set(UA_CPU, this.getCPU())
|
1127
|
+
.set(UA_DEVICE, this.getDevice())
|
1128
|
+
.set(UA_ENGINE, this.getEngine())
|
1129
|
+
.set(UA_OS, this.getOS())
|
1130
|
+
.get();
|
1131
|
+
};
|
1132
|
+
} else {
|
1133
|
+
return function () {
|
1134
|
+
return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
|
1135
|
+
.parseUA()
|
1136
|
+
.get();
|
1137
|
+
};
|
1138
|
+
}
|
1101
1139
|
};
|
1102
|
-
|
1140
|
+
|
1103
1141
|
// public methods
|
1104
|
-
|
1105
|
-
['getBrowser',
|
1106
|
-
['getCPU',
|
1107
|
-
['getDevice',
|
1108
|
-
['getEngine',
|
1109
|
-
['getOS',
|
1110
|
-
['getResult',
|
1142
|
+
setProps.call(this, [
|
1143
|
+
['getBrowser', createItemFunc(UA_BROWSER)],
|
1144
|
+
['getCPU', createItemFunc(UA_CPU)],
|
1145
|
+
['getDevice', createItemFunc(UA_DEVICE)],
|
1146
|
+
['getEngine', createItemFunc(UA_ENGINE)],
|
1147
|
+
['getOS', createItemFunc(UA_OS)],
|
1148
|
+
['getResult', createItemFunc(UA_RESULT)],
|
1111
1149
|
['getUA', function () { return userAgent; }],
|
1112
1150
|
['setUA', function (ua) {
|
1113
|
-
|
1151
|
+
if (typeof ua === STR_TYPE)
|
1152
|
+
userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
|
1114
1153
|
return this;
|
1115
1154
|
}]
|
1116
|
-
])
|
1155
|
+
])
|
1156
|
+
.setUA(userAgent);
|
1157
|
+
|
1117
1158
|
return this;
|
1118
1159
|
}
|
1119
1160
|
|