ua-parser-js 2.0.0-alpha.1 → 2.0.0-alpha.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.1
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.1',
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 + '-bitness',
55
- CH_HEADER_MOBILE = CH_HEADER + '-mobile',
56
- CH_HEADER_MODEL = CH_HEADER + '-model',
57
- CH_HEADER_PLATFORM = CH_HEADER + '-platform',
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 = ['brands', 'fullVersionList', MOBILE, MODEL, 'platform', 'platformVersion', ARCHITECTURE, 'bitness'],
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 assignFromEntries = function (arr) {
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
- // Safari < 3.0
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',
@@ -336,7 +326,7 @@ const window = undefined;
336
326
  /miuibrowser\/([\w\.]+)/i // MIUI Browser
337
327
  ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
338
328
  /fxios\/([\w\.-]+)/i // Firefox for iOS
339
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Firefox']], [
329
+ ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
340
330
  /\bqihu|(qi?ho?o?|360)browser/i // 360
341
331
  ], [[NAME, '360' + SUFFIX_BROWSER]], [
342
332
  /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i
@@ -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 // Chromium/Instagram
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,14 +378,14 @@ 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, strMapper, oldSafariMap]], [
381
+ ], [NAME, [VERSION, '1']], [
392
382
 
393
383
  /(webkit|khtml)\/([\w\.]+)/i
394
384
  ], [NAME, VERSION], [
395
385
 
396
386
  // Gecko based
397
387
  /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
398
- ], [[NAME, PREFIX_MOBILE + 'Firefox'], VERSION], [
388
+ ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
399
389
  /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
400
390
  ], [[NAME, 'Netscape'], VERSION], [
401
391
  /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
@@ -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 // ARM64
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 ]+)(?: bui|\))/i, // Xiaomi POCO
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 // Fire TV
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
- assignFromEntries.call(props.init, [
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
- assignFromEntries.call(props.isIgnore, [
813
+ setProps.call(props.isIgnore, [
824
814
  [UA_BROWSER, [VERSION, MAJOR]],
825
815
  [UA_ENGINE, [VERSION]],
826
816
  [UA_OS, [VERSION]]
827
817
  ]);
828
- assignFromEntries.call(props.isIgnoreRgx, [
818
+ setProps.call(props.isIgnoreRgx, [
829
819
  [UA_BROWSER, / ?browser$/i],
830
820
  [UA_OS, / ?os$/i]
831
821
  ]);
832
- assignFromEntries.call(props.toString, [
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 createUAParserData = function (itemType, ua, rgxMap, uaCH) {
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 UAParserData () {
850
- assignFromEntries.call(this, init_props);
839
+ function IData () {
840
+ setProps.call(this, init_props);
851
841
  }
852
- UAParserData.prototype.withClientHints = function () {
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 new UAParserItem(itemType, ua, rgxMap, uaCH).parseCH().get();
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
- var JS_UACH = new UAParserDataCH(res, false);
864
- return new UAParserItem(itemType, ua, rgxMap, JS_UACH).parseCH().get();
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
- UAParserData.prototype.is = function (strToCheck) {
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
- UAParserData.prototype.toString = function () {
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,27 +894,39 @@ const window = undefined;
891
894
  }
892
895
 
893
896
  if (!NAVIGATOR_UADATA) {
894
- UAParserData.prototype.then = function (cb) {
895
- cb(this);
896
- return this;
897
+ IData.prototype.then = function (cb) {
898
+ var that = this;
899
+ var IDataResolve = function () {
900
+ for (var prop in that) {
901
+ if (that.hasOwnProperty(prop)) {
902
+ this[prop] = that[prop];
903
+ }
904
+ }
905
+ };
906
+ IDataResolve.prototype = {
907
+ is : IData.prototype.is,
908
+ toString : IData.prototype.toString
909
+ };
910
+ var resolveData = new IDataResolve();
911
+ cb(resolveData);
912
+ return resolveData;
897
913
  };
898
914
  }
899
915
 
900
- return new UAParserData();
916
+ return new IData();
901
917
  };
902
918
 
903
919
  /////////////////
904
920
  // Constructor
905
921
  ////////////////
906
922
 
907
- function UAParserDataCH (uach, isHTTP_UACH) {
923
+ function UACHData (uach, isHttpUACH) {
908
924
  uach = uach || {};
909
- assignFromEntries.call(this, CH_ALL_VALUES);
910
- if (isHTTP_UACH) {
911
- assignFromEntries.call(this, [
925
+ setProps.call(this, CH_ALL_VALUES);
926
+ if (isHttpUACH) {
927
+ setProps.call(this, [
912
928
  [BRANDS, itemListToArray(uach[CH_HEADER])],
913
929
  [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],
914
- [BRANDS, itemListToArray(uach[CH_HEADER])],
915
930
  [MOBILE, /\?1/.test(uach[CH_HEADER_MOBILE])],
916
931
  [MODEL, stripQuotes(uach[CH_HEADER_MODEL])],
917
932
  [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
@@ -924,126 +939,151 @@ const window = undefined;
924
939
  if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];
925
940
  }
926
941
  }
927
- return this;
928
942
  }
929
943
 
930
- function UAParserItem (itemType, ua, rgxMap, uaCH) {
931
- assignFromEntries.call(this, [
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, [
932
1078
  ['itemType', itemType],
933
1079
  ['ua', ua],
934
1080
  ['uaCH', uaCH],
935
1081
  ['rgxMap', rgxMap],
936
- ['data', createUAParserData(itemType, ua, rgxMap, uaCH)]
1082
+ ['data', createIData(this, itemType)]
937
1083
  ]);
938
- this.parse();
939
- switch(this.itemType) {
940
- case UA_BROWSER:
941
- // Brave-specific detection
942
- if (NAVIGATOR && NAVIGATOR.userAgent == ua && NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
943
- this.set(NAME, 'Brave');
944
- }
945
- this.set(MAJOR, majorize(this.get(VERSION)));
946
- break;
947
- case UA_DEVICE:
948
- if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
949
- this.set(TYPE, MOBILE);
950
- }
951
- // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
952
- if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
953
- this.set(MODEL, 'iPad')
954
- .set(TYPE, TABLET);
955
- }
956
- break;
957
- case UA_OS:
958
- if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM] && NAVIGATOR_UADATA[PLATFORM] != 'Unknown') {
959
- this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
960
- }
961
- break;
962
- case UA_RESULT:
963
- var createUAParserItem = function (itemType) {
964
- return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).get();
965
- };
966
- this.set('ua', ua)
967
- .set(UA_BROWSER, createUAParserItem(UA_BROWSER))
968
- .set(UA_CPU, createUAParserItem(UA_CPU))
969
- .set(UA_DEVICE, createUAParserItem(UA_DEVICE))
970
- .set(UA_ENGINE, createUAParserItem(UA_ENGINE))
971
- .set(UA_OS, createUAParserItem(UA_OS))
972
- .get();
973
- }
1084
+
974
1085
  return this;
975
1086
  }
976
- UAParserItem.prototype.get = function (prop) {
977
- if (!prop) return this.data;
978
- return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
979
- };
980
- UAParserItem.prototype.parse = function () {
981
- if (this.itemType != UA_RESULT) {
982
- rgxMapper.call(this.data, this.ua, this.rgxMap);
983
- }
984
- return this;
985
- };
986
- UAParserItem.prototype.parseCH = function () {
987
- var ua = this.ua,
988
- uaCH = this.uaCH,
989
- rgxMap = this.rgxMap;
990
-
991
- switch (this.itemType) {
992
- case UA_BROWSER:
993
- var brands = uaCH[FULLVERLIST] || uaCH[BRANDS];
994
- if (brands) {
995
- for (var i in brands) {
996
- var brandName = brands[i].brand,
997
- brandVersion = brands[i].version;
998
- if (!/not.a.brand/i.test(brandName) || /chromi/i.test(this.get(NAME))) {
999
- this.set(NAME, strip(GOOGLE+' ', brandName))
1000
- .set(VERSION, brandVersion)
1001
- .set(MAJOR, majorize(brandVersion));
1002
- }
1003
- }
1004
- }
1005
- break;
1006
- case UA_CPU:
1007
- var archName = uaCH[ARCHITECTURE];
1008
- if (archName) {
1009
- if (archName && uaCH[BITNESS] == '64') archName += '64';
1010
- rgxMapper.call(this.data, archName + ';', rgxMap);
1011
- }
1012
- break;
1013
- case UA_DEVICE:
1014
- if (uaCH[MOBILE]) {
1015
- this.set(TYPE, MOBILE);
1016
- }
1017
- if (uaCH[MODEL]) {
1018
- this.set(MODEL, uaCH[MODEL]);
1019
- }
1020
- break;
1021
- case UA_OS:
1022
- var osName = uaCH[PLATFORM];
1023
- if(osName) {
1024
- var osVersion = uaCH[PLATFORMVER];
1025
- if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
1026
- this.set(NAME, osName)
1027
- .set(VERSION, osVersion);
1028
- }
1029
- break;
1030
- case UA_RESULT:
1031
- var createUAParserItemWithCH = function (itemType) {
1032
- return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).parseCH().get();
1033
- };
1034
- this.set('ua', ua)
1035
- .set(UA_BROWSER, createUAParserItemWithCH(UA_BROWSER))
1036
- .set(UA_CPU, createUAParserItemWithCH(UA_CPU))
1037
- .set(UA_DEVICE, createUAParserItemWithCH(UA_DEVICE))
1038
- .set(UA_ENGINE, createUAParserItemWithCH(UA_ENGINE))
1039
- .set(UA_OS, createUAParserItemWithCH(UA_OS));
1040
- }
1041
- return this;
1042
- };
1043
- UAParserItem.prototype.set = function (prop, val) {
1044
- this.data[prop] = val;
1045
- return this;
1046
- };
1047
1087
 
1048
1088
  function UAParser (ua, extensions, headers) {
1049
1089
 
@@ -1067,39 +1107,54 @@ const window = undefined;
1067
1107
  return new UAParser(ua, extensions, headers).getResult();
1068
1108
  }
1069
1109
 
1070
- var userAgent = ua ||
1071
- ((NAVIGATOR && NAVIGATOR.userAgent) ?
1072
- NAVIGATOR.userAgent :
1073
- (headers && headers[USER_AGENT] ?
1074
- headers[USER_AGENT] :
1075
- EMPTY)),
1076
-
1077
- 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
1078
1114
 
1115
+ httpUACH = new UACHData(headers, true),
1079
1116
  regexMap = extensions ?
1080
1117
  extend(defaultRegexes, extensions) :
1081
1118
  defaultRegexes,
1082
1119
 
1083
- createUAParserItemFunc = function (itemType) {
1084
- return function () {
1085
- return new UAParserItem(itemType, userAgent, itemType == UA_RESULT ? regexMap : regexMap[itemType], HTTP_UACH).get();
1086
- };
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
+ }
1087
1139
  };
1088
-
1140
+
1089
1141
  // public methods
1090
- assignFromEntries.call(this, [
1091
- ['getBrowser', createUAParserItemFunc(UA_BROWSER)],
1092
- ['getCPU', createUAParserItemFunc(UA_CPU)],
1093
- ['getDevice', createUAParserItemFunc(UA_DEVICE)],
1094
- ['getEngine', createUAParserItemFunc(UA_ENGINE)],
1095
- ['getOS', createUAParserItemFunc(UA_OS)],
1096
- ['getResult', createUAParserItemFunc(UA_RESULT)],
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)],
1097
1149
  ['getUA', function () { return userAgent; }],
1098
1150
  ['setUA', function (ua) {
1099
- userAgent = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;
1151
+ if (typeof ua === STR_TYPE)
1152
+ userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
1100
1153
  return this;
1101
1154
  }]
1102
- ]).setUA(userAgent);
1155
+ ])
1156
+ .setUA(userAgent);
1157
+
1103
1158
  return this;
1104
1159
  }
1105
1160