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.
@@ -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