ua-parser-js 2.0.0-alpha.2 → 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.2
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.2',
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',
@@ -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,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, strMapper, oldSafariMap]], [
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 // 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,40 +894,39 @@ const window = undefined;
891
894
  }
892
895
 
893
896
  if (!NAVIGATOR_UADATA) {
894
- UAParserData.prototype.then = function (cb) {
897
+ IData.prototype.then = function (cb) {
895
898
  var that = this;
896
- var UAParserDataResolve = function () {
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
- UAParserDataResolve.prototype = {
904
- is : UAParserData.prototype.is,
905
- toString : UAParserData.prototype.toString
906
+ IDataResolve.prototype = {
907
+ is : IData.prototype.is,
908
+ toString : IData.prototype.toString
906
909
  };
907
- var resolveData = new UAParserDataResolve();
910
+ var resolveData = new IDataResolve();
908
911
  cb(resolveData);
909
912
  return resolveData;
910
913
  };
911
914
  }
912
915
 
913
- return new UAParserData();
916
+ return new IData();
914
917
  };
915
918
 
916
919
  /////////////////
917
920
  // Constructor
918
921
  ////////////////
919
922
 
920
- function UAParserDataCH (uach, isHTTP_UACH) {
923
+ function UACHData (uach, isHttpUACH) {
921
924
  uach = uach || {};
922
- assignFromEntries.call(this, CH_ALL_VALUES);
923
- if (isHTTP_UACH) {
924
- assignFromEntries.call(this, [
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 UAParserItem (itemType, ua, rgxMap, uaCH) {
944
- 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, [
945
1078
  ['itemType', itemType],
946
1079
  ['ua', ua],
947
1080
  ['uaCH', uaCH],
948
1081
  ['rgxMap', rgxMap],
949
- ['data', createUAParserData(itemType, ua, rgxMap, uaCH)]
1082
+ ['data', createIData(this, itemType)]
950
1083
  ]);
951
- this.parse();
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
- ((NAVIGATOR && NAVIGATOR.userAgent) ?
1086
- NAVIGATOR.userAgent :
1087
- (headers && headers[USER_AGENT] ?
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
- createUAParserItemFunc = function (itemType) {
1098
- return function () {
1099
- return new UAParserItem(itemType, userAgent, itemType == UA_RESULT ? regexMap : regexMap[itemType], HTTP_UACH).get();
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
- assignFromEntries.call(this, [
1105
- ['getBrowser', createUAParserItemFunc(UA_BROWSER)],
1106
- ['getCPU', createUAParserItemFunc(UA_CPU)],
1107
- ['getDevice', createUAParserItemFunc(UA_DEVICE)],
1108
- ['getEngine', createUAParserItemFunc(UA_ENGINE)],
1109
- ['getOS', createUAParserItemFunc(UA_OS)],
1110
- ['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)],
1111
1149
  ['getUA', function () { return userAgent; }],
1112
1150
  ['setUA', function (ua) {
1113
- 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;
1114
1153
  return this;
1115
1154
  }]
1116
- ]).setUA(userAgent);
1155
+ ])
1156
+ .setUA(userAgent);
1157
+
1117
1158
  return this;
1118
1159
  }
1119
1160