From 625ece73e2d1adb3dca1c85defbc1a5069dd68de Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Sat, 8 Apr 2023 06:44:30 +0700 Subject: [PATCH] Rearrange test files & config --- dist/ua-parser.min.js | 2 +- dist/ua-parser.pack.js | 2 +- package.json | 20 +- script/build-module.js | 39 ++ src/{enum => module}/ua-parser-enum.mjs | 6 +- .../ua-parser-extension.mjs | 6 +- src/{ => module}/ua-parser.mjs | 354 ++++++++++-------- src/{enum => }/ua-parser-enum.js | 4 +- src/{extension => }/ua-parser-extension.js | 4 +- src/ua-parser.js | 3 +- .../browser-all.json} | 0 test/{cpu-test.json => specs/cpu-all.json} | 0 .../device-all.json} | 0 .../engine-all.json} | 0 .../extension-device.json} | 0 .../extension-mediaplayer.json} | 0 test/{os-test.json => specs/os-all.json} | 0 test/test.js | 127 +------ 18 files changed, 262 insertions(+), 305 deletions(-) create mode 100644 script/build-module.js rename src/{enum => module}/ua-parser-enum.mjs (97%) rename src/{extension => module}/ua-parser-extension.mjs (98%) rename src/{ => module}/ua-parser.mjs (86%) rename src/{enum => }/ua-parser-enum.js (98%) rename src/{extension => }/ua-parser-extension.js (99%) rename test/{browser-test.json => specs/browser-all.json} (100%) rename test/{cpu-test.json => specs/cpu-all.json} (100%) rename test/{device-test.json => specs/device-all.json} (100%) rename test/{engine-test.json => specs/engine-all.json} (100%) rename test/{test-extension.json => specs/extension-device.json} (100%) rename test/{mediaplayer-test.json => specs/extension-mediaplayer.json} (100%) rename test/{os-test.json => specs/os-all.json} (100%) diff --git a/dist/ua-parser.min.js b/dist/ua-parser.min.js index f928f05..d5b153c 100644 --- a/dist/ua-parser.min.js +++ b/dist/ua-parser.min.js @@ -1,4 +1,4 @@ /* UAParser.js v2.0.0-alpha.2 Copyright © 2012-2023 Faisal Salman MIT License */ -(function(window,undefined){"use strict";var LIBVERSION="2.0.0-alpha.2",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",USER_AGENT="user-agent",UA_MAX_LENGTH=350,BRANDS="brands",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-bitness",CH_HEADER_MOBILE=CH_HEADER+"-mobile",CH_HEADER_MODEL=CH_HEADER+"-model",CH_HEADER_PLATFORM=CH_HEADER+"-platform",CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=["brands","fullVersionList",MOBILE,MODEL,"platform","platformVersion",ARCHITECTURE,"bitness"],UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",WINDOWS="Windows";var NAVIGATOR=typeof window!==UNDEF_TYPE&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var assignFromEntries=function(arr){for(var i in arr){var propName=arr[i];if(typeof propName==OBJ_TYPE&&propName.length==2){this[propName[0]]=propName[1]}else{this[propName]=undefined}}return this},extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){mergedRegexes[i]=extensions[i]&&extensions[i].length%2===0?extensions[i].concat(regexes[i]):regexes[i]}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str1[i])==lowerize(str2))return true}return false}return typeof str1===STR_TYPE?lowerize(str2).indexOf(lowerize(str1))!==-1:false},isExtensions=function(obj){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)}},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(", ");for(var i=0;i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(isSelfNav&&!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var createUAParserItem=function(itemType){return new UAParserItem(itemType,ua,rgxMap[itemType],uaCH).get()};this.set("ua",ua).set(UA_BROWSER,createUAParserItem(UA_BROWSER)).set(UA_CPU,createUAParserItem(UA_CPU)).set(UA_DEVICE,createUAParserItem(UA_DEVICE)).set(UA_ENGINE,createUAParserItem(UA_ENGINE)).set(UA_OS,createUAParserItem(UA_OS)).get()}return this}UAParserItem.prototype.get=function(prop){if(!prop)return this.data;return this.data.hasOwnProperty(prop)?this.data[prop]:undefined};UAParserItem.prototype.parse=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}return this};UAParserItem.prototype.parseCH=function(){var ua=this.ua,uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS];if(brands){for(var i in brands){var brandName=brands[i].brand,brandVersion=brands[i].version;if(!/not.a.brand/i.test(brandName)&&(i<1||/chromi/i.test(this.get(NAME)))){this.set(NAME,strip(GOOGLE+" ",brandName)).set(VERSION,brandVersion).set(MAJOR,majorize(brandVersion))}}}break;case UA_CPU:var archName=uaCH[ARCHITECTURE];if(archName){if(archName&&uaCH[BITNESS]=="64")archName+="64";rgxMapper.call(this.data,archName+";",rgxMap)}break;case UA_DEVICE:if(uaCH[MOBILE]){this.set(TYPE,MOBILE)}if(uaCH[MODEL]){this.set(MODEL,uaCH[MODEL])}break;case UA_OS:var osName=uaCH[PLATFORM];if(osName){var osVersion=uaCH[PLATFORMVER];if(osName==WINDOWS)osVersion=parseInt(majorize(osVersion),10)>=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}break;case UA_RESULT:var createUAParserItemWithCH=function(itemType){return new UAParserItem(itemType,ua,rgxMap[itemType],uaCH).parseCH().get()};this.set("ua",ua).set(UA_BROWSER,createUAParserItemWithCH(UA_BROWSER)).set(UA_CPU,createUAParserItemWithCH(UA_CPU)).set(UA_DEVICE,createUAParserItemWithCH(UA_DEVICE)).set(UA_ENGINE,createUAParserItemWithCH(UA_ENGINE)).set(UA_OS,createUAParserItemWithCH(UA_OS))}return this};UAParserItem.prototype.set=function(prop,val){this.data[prop]=val;return this};function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions)){headers=extensions;extensions=undefined}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=ua||(NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:headers&&headers[USER_AGENT]?headers[USER_AGENT]:EMPTY),HTTP_UACH=new UAParserDataCH(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createUAParserItemFunc=function(itemType){return function(){return new UAParserItem(itemType,userAgent,itemType==UA_RESULT?regexMap:regexMap[itemType],HTTP_UACH).get()}};assignFromEntries.call(this,[["getBrowser",createUAParserItemFunc(UA_BROWSER)],["getCPU",createUAParserItemFunc(UA_CPU)],["getDevice",createUAParserItemFunc(UA_DEVICE)],["getEngine",createUAParserItemFunc(UA_ENGINE)],["getOS",createUAParserItemFunc(UA_OS)],["getResult",createUAParserItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){userAgent=typeof ua===STR_TYPE&&ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(typeof window!==UNDEF_TYPE){window.UAParser=UAParser}}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); \ No newline at end of file +(function(window,undefined){"use strict";var LIBVERSION="2.0.0-alpha.2",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",USER_AGENT="user-agent",UA_MAX_LENGTH=350,BRANDS="brands",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-bitness",CH_HEADER_MOBILE=CH_HEADER+"-mobile",CH_HEADER_MODEL=CH_HEADER+"-model",CH_HEADER_PLATFORM=CH_HEADER+"-platform",CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=["brands","fullVersionList",MOBILE,MODEL,"platform","platformVersion",ARCHITECTURE,"bitness"],UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",WINDOWS="Windows";var NAVIGATOR=typeof window!==UNDEF_TYPE&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){mergedRegexes[i]=extensions[i]&&extensions[i].length%2===0?extensions[i].concat(regexes[i]):regexes[i]}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str1[i])==lowerize(str2))return true}return false}return typeof str1===STR_TYPE?lowerize(str2).indexOf(lowerize(str1))!==-1:false},isExtensions=function(obj){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)}},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(", ");for(var i=0;i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}}}return this};this.parseUA=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}if(this.itemType==UA_BROWSER){this.set(MAJOR,majorize(this.get(VERSION)))}return this};this.parseCH=function(){var ua=this.ua,uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS];if(brands){for(var i in brands){var brandName=brands[i].brand,brandVersion=brands[i].version;if(!/not.a.brand/i.test(brandName)&&(i<1||/chromi/i.test(this.get(NAME)))){this.set(NAME,strip(GOOGLE+" ",brandName)).set(VERSION,brandVersion).set(MAJOR,majorize(brandVersion))}}}break;case UA_CPU:var archName=uaCH[ARCHITECTURE];if(archName){if(archName&&uaCH[BITNESS]=="64")archName+="64";rgxMapper.call(this.data,archName+";",rgxMap)}break;case UA_DEVICE:if(uaCH[MOBILE]){this.set(TYPE,MOBILE)}if(uaCH[MODEL]){this.set(MODEL,uaCH[MODEL])}break;case UA_OS:var osName=uaCH[PLATFORM];if(osName){var osVersion=uaCH[PLATFORMVER];if(osName==WINDOWS)osVersion=parseInt(majorize(osVersion),10)>=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}break;case UA_RESULT:var data=this.data;var parse=function(itemType){return data[itemType].getItem().setCH(uaCH).parseCH().get()};this.set("ua",ua).set(UA_BROWSER,parse(UA_BROWSER)).set(UA_CPU,parse(UA_CPU)).set(UA_DEVICE,parse(UA_DEVICE)).set(UA_ENGINE,parse(UA_ENGINE)).set(UA_OS,parse(UA_OS))}return this};setProps.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createUAParserData(this,itemType)]]);return this}function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions)){headers=extensions;extensions=undefined}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=ua||(NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:headers&&headers[USER_AGENT]?headers[USER_AGENT]:EMPTY),HTTP_UACH=new UAParserDataCH(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createItemFunc=function(itemType){if(itemType==UA_RESULT){return function(){return new UAParserItem(itemType,userAgent,regexMap,HTTP_UACH).set("ua",userAgent).set(UA_BROWSER,this.getBrowser()).set(UA_CPU,this.getCPU()).set(UA_DEVICE,this.getDevice()).set(UA_ENGINE,this.getEngine()).set(UA_OS,this.getOS()).get()}}else{return function(){return new UAParserItem(itemType,userAgent,regexMap[itemType],HTTP_UACH).parseUA().detectFeature().get()}}};setProps.call(this,[["getBrowser",createItemFunc(UA_BROWSER)],["getCPU",createItemFunc(UA_CPU)],["getDevice",createItemFunc(UA_DEVICE)],["getEngine",createItemFunc(UA_ENGINE)],["getOS",createItemFunc(UA_OS)],["getResult",createItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){userAgent=typeof ua===STR_TYPE&&ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(typeof window!==UNDEF_TYPE){window.UAParser=UAParser}}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); \ No newline at end of file diff --git a/dist/ua-parser.pack.js b/dist/ua-parser.pack.js index 50850b5..141057c 100644 --- a/dist/ua-parser.pack.js +++ b/dist/ua-parser.pack.js @@ -1,4 +1,4 @@ /* UAParser.js v2.0.0-alpha.2 Copyright © 2012-2023 Faisal Salman MIT License */ -!function(i,u){"use strict";function e(i){for(var e={},t=0;tT?yi(i,T):i,this}]]).setUA(o),this}Ni.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:u:this.data},Ni.prototype.parse=function(){return this.itemType!=W&&l.call(this.data,this.ua,this.rgxMap),this},Ni.prototype.parseCH=function(){var e=this.ua,t=this.uaCH,o=this.rgxMap;switch(this.itemType){case V:var i=t[C]||t[q];if(i)for(var r in i){var a=i[r].brand,s=i[r].version;!/not.a.brand/i.test(a)&&(r<1||/chromi/i.test(this.get(g)))&&this.set(g,xi(K+" ",a)).set(x,s).set(f,vi(s))}break;case B:var n=t[k];n&&(n&&"64"==t[A]&&(n+="64"),l.call(this.data,n+";",o));break;case $:t[y]&&this.set(v,y),t[m]&&this.set(m,t[m]);break;case L:n=t[N];n&&(w=t[z],n==ui&&(w=13<=parseInt(vi(w),10)?"11":"10"),this.set(g,n).set(x,w));break;case W:var w=function(i){return new Ni(i,e,o[i],t).parseCH().get()};this.set("ua",e).set(V,w(V)).set(B,w(B)).set($,w($)).set(D,w(D)).set(L,w(L))}return this},Ni.prototype.set=function(i,e){return this.data[i]=e,this},zi.VERSION="2.0.0-alpha.2",zi.BROWSER=e([g,x,f]),zi.CPU=e([k]),zi.DEVICE=e([m,o,v,r,y,a,n,w,_]),zi.ENGINE=zi.OS=e([g,x]),typeof exports!==p?(typeof module!==p&&module.exports&&(exports=module.exports=zi),exports.UAParser=zi):typeof define===d&&define.amd?define(function(){return zi}):typeof i!==p&&(i.UAParser=zi);var Ai,Oi=typeof i!==p&&(i.jQuery||i.Zepto);Oi&&!Oi.ua&&(Ai=new zi,Oi.ua=Ai.getResult(),Oi.ua.get=function(){return Ai.getUA()},Oi.ua.set=function(i){Ai.setUA(i);var e,t=Ai.getResult();for(e in t)Oi.ua[e]=t[e]})}("object"==typeof window?window:this); \ No newline at end of file +!function(i,u){"use strict";function e(i){for(var e={},t=0;tS?ki(i,S):i,this}]]).setUA(o),this}Ni.VERSION="2.0.0-alpha.2",Ni.BROWSER=e([h,m,l]),Ni.CPU=e([g]),Ni.DEVICE=e([p,o,f,r,v,x,a,k,y]),Ni.ENGINE=Ni.OS=e([h,m]),typeof exports!==b?(typeof module!==b&&module.exports&&(exports=module.exports=Ni),exports.UAParser=Ni):typeof define===c&&define.amd?define(function(){return Ni}):typeof i!==b&&(i.UAParser=Ni);var Oi,zi=typeof i!==b&&(i.jQuery||i.Zepto);zi&&!zi.ua&&(Oi=new Ni,zi.ua=Oi.getResult(),zi.ua.get=function(){return Oi.getUA()},zi.ua.set=function(i){Oi.setUA(i);var e,t=Oi.getResult();for(e in t)zi.ua[e]=t[e]})}("object"==typeof window?window:this); \ No newline at end of file diff --git a/package.json b/package.json index cdd0bb2..259988c 100644 --- a/package.json +++ b/package.json @@ -143,19 +143,19 @@ ], "type": "commonjs", "main": "src/ua-parser.js", - "module": "src/ua-parser.mjs", + "module": "src/module/ua-parser.mjs", "exports": { ".": { "require": "./src/ua-parser.js", - "import": "./src/ua-parser.mjs" + "import": "./src/module/ua-parser.mjs" }, "./enums": { - "require": "./src/enum/ua-parser-enum.js", - "import": "./src/enum/ua-parser-enum.mjs" + "require": "./src/ua-parser-enum.js", + "import": "./src/module/ua-parser-enum.mjs" }, "./extensions": { - "require": "./src/extension/ua-parser-extension.js", - "import": "./src/extension/ua-parser-extension.mjs" + "require": "./src/ua-parser-extension.js", + "import": "./src/module/ua-parser-extension.mjs" } }, "files": [ @@ -163,11 +163,9 @@ "src" ], "scripts": { - "build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/^ UA/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/^ UA/' --compress --mangle && node -e \"const fs=require('fs');fs.writeFileSync('src/ua-parser.mjs','// Generated ESM version of UAParser.js\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/ua-parser.js\\n\\nconst window = undefined;\\n\\n'+fs.readFileSync('src/ua-parser.js','utf-8').replace(/\\/\\*jshint[\\s\\S]+strict\\';/ig,'').replace(/\\/[\\/\\s]+export[\\s\\S]+/ig,'export {UAParser};'),'utf-8');fs.writeFileSync('src/enum/ua-parser-enum.mjs','// Generated ESM version of UAParser.js enums\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/enum/ua-parser-enum.js\\n\\n'+fs.readFileSync('src/enum/ua-parser-enum.js','utf-8').replace(/module\\.exports =/ig,'export'),'utf-8');fs.writeFileSync('src/extension/ua-parser-extension.mjs','// Generated ESM version of UAParser.js extensions\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/extension/ua-parser-extension.js\\n\\n'+fs.readFileSync('src/extension/ua-parser-extension.js','utf-8').replace(/const UA.+\\)/ig,'import UAParser from \\'ua-parser-js\\'').replace(/module\\.exports =/ig,'export'),'utf-8')\"", - "test": "jshint src/ua-parser.js && mocha -R nyan test", - "test-ci": "jshint src/ua-parser.js && mocha -R spec test", - "verup": "node ./node_modules/verup", - "version": "node ./node_modules/verup 0" + "build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/^ UA/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/^ UA/' --compress --mangle && node script/build-module.js", + "test": "jshint src/ && mocha -R nyan test", + "test-ci": "jshint src/ && mocha -R spec test" }, "devDependencies": { "@babel/parser": "7.15.8", diff --git a/script/build-module.js b/script/build-module.js new file mode 100644 index 0000000..e002e55 --- /dev/null +++ b/script/build-module.js @@ -0,0 +1,39 @@ +const fs = require('fs'); + +/*/////////////// +// ua-parser.mjs +//////////////*/ + +fs.writeFileSync('src/module/ua-parser.mjs', +`// Generated ESM version of UAParser.js +// DO NOT EDIT THIS FILE! +// Source: /src/ua-parser.js + +` + fs.readFileSync('src/ua-parser.js','utf-8').replace(/\(func[\s\S]+strict\';/ig,'') + .replace(/esversion\: 3/ig, 'esversion: 6') + .replace(/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'),'utf-8'); + +/*///////////////////// +// ua-parser-enum.mjs +////////////////////*/ + +fs.writeFileSync('src/module/ua-parser-enum.mjs', +`// Generated ESM version of UAParser.js enums +// DO NOT EDIT THIS FILE! +// Source: /src/ua-parser-enum.js + +` + fs.readFileSync('src/ua-parser-enum.js','utf-8') + .replace(/module\.exports =/ig,'export'),'utf-8'); + +/*////////////////////////// +// ua-parser-extension.mjs +/////////////////////////*/ + +fs.writeFileSync('src/module/ua-parser-extension.mjs', +`// Generated ESM version of UAParser.js extensions +// DO NOT EDIT THIS FILE! +// Source: /src/ua-parser-extension.js + +` + fs.readFileSync('src/ua-parser-extension.js','utf-8') + .replace(/const UA.+\)/ig,'import UAParser from \'ua-parser-js\'') + .replace(/module\.exports =/ig,'export'),'utf-8'); \ No newline at end of file diff --git a/src/enum/ua-parser-enum.mjs b/src/module/ua-parser-enum.mjs similarity index 97% rename from src/enum/ua-parser-enum.mjs rename to src/module/ua-parser-enum.mjs index 07b791a..2081f10 100644 --- a/src/enum/ua-parser-enum.mjs +++ b/src/module/ua-parser-enum.mjs @@ -1,6 +1,6 @@ // Generated ESM version of UAParser.js enums // DO NOT EDIT THIS FILE! -// Source: /src/enum/ua-parser-enum.js +// Source: /src/ua-parser-enum.js /////////////////////////////////////////////// /* Enums for UAParser.js v2.0.0-alpha.2 @@ -9,6 +9,8 @@ MIT License */ ////////////////////////////////////////////// +/*jshint esversion: 6 */ + const BrowserName = Object.freeze({ CHROME : 'Chrome', EDGE : 'Edge', @@ -102,4 +104,4 @@ export { DeviceVendor, EngineName, OSName -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/extension/ua-parser-extension.mjs b/src/module/ua-parser-extension.mjs similarity index 98% rename from src/extension/ua-parser-extension.mjs rename to src/module/ua-parser-extension.mjs index 7a2f42a..44932a2 100644 --- a/src/extension/ua-parser-extension.mjs +++ b/src/module/ua-parser-extension.mjs @@ -1,6 +1,6 @@ // Generated ESM version of UAParser.js extensions // DO NOT EDIT THIS FILE! -// Source: /src/extension/ua-parser-extension.js +// Source: /src/ua-parser-extension.js /////////////////////////////////////////////// /* Extensions for UAParser.js v2.0.0-alpha.2 @@ -9,6 +9,8 @@ MIT License */ ////////////////////////////////////////////// +/*jshint esversion: 6 */ + const MODEL = 'model'; const NAME = 'name'; const TYPE = 'type'; @@ -121,4 +123,4 @@ export { ExtraDevices, Emails, Tools -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/ua-parser.mjs b/src/module/ua-parser.mjs similarity index 86% rename from src/ua-parser.mjs rename to src/module/ua-parser.mjs index 9b7dfc5..ba554e3 100644 --- a/src/ua-parser.mjs +++ b/src/module/ua-parser.mjs @@ -2,8 +2,6 @@ // DO NOT EDIT THIS FILE! // Source: /src/ua-parser.js -const window = undefined; - ///////////////////////////////////////////////////////////////////////////////// /* UAParser.js v2.0.0-alpha.2 Copyright © 2012-2023 Faisal Salman @@ -14,8 +12,11 @@ const window = undefined; Source : https://github.com/faisalman/ua-parser-js */ ///////////////////////////////////////////////////////////////////////////////// +/* jshint esversion: 6 */ +/* globals window */ + ////////////// // Constants ///////////// @@ -97,18 +98,7 @@ const window = undefined; // Helper ////////// - var assignFromEntries = function (arr) { - for (var i in arr) { - var propName = arr[i]; - if (typeof propName == OBJ_TYPE && propName.length == 2) { - this[propName[0]] = propName[1]; - } else { - this[propName] = undefined; - } - } - return this; - }, - extend = function (regexes, extensions) { + var extend = function (regexes, extensions) { var mergedRegexes = {}; for (var i in regexes) { mergedRegexes[i] = extensions[i] && extensions[i].length % 2 === 0 ? extensions[i].concat(regexes[i]) : regexes[i]; @@ -152,6 +142,17 @@ const window = undefined; majorize = function (version) { return typeof(version) === STR_TYPE ? strip(/[^\d\.]/g, version).split('.')[0] : undefined; }, + setProps = function (arr) { + for (var i in arr) { + var propName = arr[i]; + if (typeof propName == OBJ_TYPE && propName.length == 2) { + this[propName[0]] = propName[1]; + } else { + this[propName] = undefined; + } + } + return this; + }, strip = function (pattern, str) { return str.replace(pattern, EMPTY); }, @@ -245,18 +246,7 @@ const window = undefined; // String map ////////////// - // Safari < 3.0 - var oldSafariMap = { - '1.0' : '/8', - '1.2' : '/1', - '1.3' : '/3', - '2.0' : '/412', - '2.0.2' : '/416', - '2.0.3' : '/417', - '2.0.4' : '/419', - '?' : '/' - }, - windowsVersionMap = { + var windowsVersionMap = { 'ME' : '4.90', 'NT 3.11' : 'NT3.51', 'NT 4.0' : 'NT4.0', @@ -388,7 +378,7 @@ const window = undefined; /version\/([\w\.\,]+) .*(safari)/i // Safari ], [VERSION, NAME], [ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 - ], [NAME, [VERSION, strMapper, oldSafariMap]], [ + ], [NAME, [VERSION, '1']], [ /(webkit|khtml)\/([\w\.]+)/i ], [NAME, VERSION], [ @@ -429,7 +419,7 @@ const window = undefined; /((?:i[346]|x)86)[;\)]/i // IA32 (x86) ], [[ARCHITECTURE, 'ia32']], [ - /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64 + /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64 ], [[ARCHITECTURE, 'arm64']], [ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF @@ -813,23 +803,23 @@ const window = undefined; var defaultProps = (function () { var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}}; - assignFromEntries.call(props.init, [ + setProps.call(props.init, [ [UA_BROWSER, [NAME, VERSION, MAJOR]], [UA_CPU, [ARCHITECTURE]], [UA_DEVICE, [TYPE, MODEL, VENDOR]], [UA_ENGINE, [NAME, VERSION]], [UA_OS, [NAME, VERSION]] ]); - assignFromEntries.call(props.isIgnore, [ + setProps.call(props.isIgnore, [ [UA_BROWSER, [VERSION, MAJOR]], [UA_ENGINE, [VERSION]], [UA_OS, [VERSION]] ]); - assignFromEntries.call(props.isIgnoreRgx, [ + setProps.call(props.isIgnoreRgx, [ [UA_BROWSER, / ?browser$/i], [UA_OS, / ?os$/i] ]); - assignFromEntries.call(props.toString, [ + setProps.call(props.toString, [ [UA_BROWSER, [NAME, VERSION]], [UA_CPU, [ARCHITECTURE]], [UA_DEVICE, [VENDOR, MODEL]], @@ -839,7 +829,7 @@ const window = undefined; return props; })(); - var createUAParserData = function (itemType, ua, rgxMap, uaCH) { + var createUAParserData = function (item, itemType) { var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, @@ -847,21 +837,30 @@ const window = undefined; toString_props = defaultProps.toString[itemType] || 0; function UAParserData () { - assignFromEntries.call(this, init_props); + setProps.call(this, init_props); } + + UAParserData.prototype.getItem = function () { + return item; + }; + UAParserData.prototype.withClientHints = function () { - + // nodejs / non-client-hints browsers if (!NAVIGATOR_UADATA) { - return new UAParserItem(itemType, ua, rgxMap, uaCH).parseCH().get(); + return item + .parseCH() + .get(); } // browsers based on chromium 85+ return NAVIGATOR_UADATA .getHighEntropyValues(CH_ALL_VALUES) .then(function (res) { - var JS_UACH = new UAParserDataCH(res, false); - return new UAParserItem(itemType, ua, rgxMap, JS_UACH).parseCH().get(); + return item + .setCH(new UAParserDataCH(res, false)) + .parseCH() + .get(); }); }; @@ -919,9 +918,9 @@ const window = undefined; function UAParserDataCH (uach, isHTTP_UACH) { uach = uach || {}; - assignFromEntries.call(this, CH_ALL_VALUES); + setProps.call(this, CH_ALL_VALUES); if (isHTTP_UACH) { - assignFromEntries.call(this, [ + setProps.call(this, [ [BRANDS, itemListToArray(uach[CH_HEADER])], [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])], [BRANDS, itemListToArray(uach[CH_HEADER])], @@ -937,127 +936,138 @@ const window = undefined; if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop]; } } - return this; } function UAParserItem (itemType, ua, rgxMap, uaCH) { - assignFromEntries.call(this, [ + + this.get = function (prop) { + if (!prop) return this.data; + return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined; + }; + + this.set = function (prop, val) { + this.data[prop] = val; + return this; + }; + + this.setCH = function (ch) { + this.uaCH = ch; + return this; + }; + + this.detectFeature = function () { + if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) { + switch (this.itemType) { + case UA_BROWSER: + // Brave-specific detection + if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) { + this.set(NAME, 'Brave'); + } + break; + case UA_DEVICE: + // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData + if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) { + this.set(TYPE, MOBILE); + } + // iPadOS-specific detection: identified as Mac, but has some iOS-only properties + if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) { + this.set(MODEL, 'iPad') + .set(TYPE, TABLET); + } + break; + case UA_OS: + // Chrome-specific detection: check for 'platform' value of navigator.userAgentData + if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) { + this.set(NAME, NAVIGATOR_UADATA[PLATFORM]); + } + } + } + return this; + }; + + this.parseUA = function () { + if (this.itemType != UA_RESULT) { + rgxMapper.call(this.data, this.ua, this.rgxMap); + } + if (this.itemType == UA_BROWSER) { + this.set(MAJOR, majorize(this.get(VERSION))); + } + return this; + }; + + this.parseCH = function () { + var ua = this.ua, + uaCH = this.uaCH, + rgxMap = this.rgxMap; + + switch (this.itemType) { + case UA_BROWSER: + var brands = uaCH[FULLVERLIST] || uaCH[BRANDS]; + if (brands) { + for (var i in brands) { + var brandName = brands[i].brand, + brandVersion = brands[i].version; + if (!/not.a.brand/i.test(brandName) && (i < 1 || /chromi/i.test(this.get(NAME)))) { + this.set(NAME, strip(GOOGLE+' ', brandName)) + .set(VERSION, brandVersion) + .set(MAJOR, majorize(brandVersion)); + } + } + } + break; + case UA_CPU: + var archName = uaCH[ARCHITECTURE]; + if (archName) { + if (archName && uaCH[BITNESS] == '64') archName += '64'; + rgxMapper.call(this.data, archName + ';', rgxMap); + } + break; + case UA_DEVICE: + if (uaCH[MOBILE]) { + this.set(TYPE, MOBILE); + } + if (uaCH[MODEL]) { + this.set(MODEL, uaCH[MODEL]); + } + break; + case UA_OS: + var osName = uaCH[PLATFORM]; + if(osName) { + var osVersion = uaCH[PLATFORMVER]; + if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10'); + this.set(NAME, osName) + .set(VERSION, osVersion); + } + break; + case UA_RESULT: + var data = this.data; + var parse = function (itemType) { + return data[itemType] + .getItem() + .setCH(uaCH) + .parseCH() + .get(); + }; + this.set('ua', ua) + .set(UA_BROWSER, parse(UA_BROWSER)) + .set(UA_CPU, parse(UA_CPU)) + .set(UA_DEVICE, parse(UA_DEVICE)) + .set(UA_ENGINE, parse(UA_ENGINE)) + .set(UA_OS, parse(UA_OS)); + } + return this; + }; + + setProps.call(this, [ ['itemType', itemType], ['ua', ua], ['uaCH', uaCH], ['rgxMap', rgxMap], - ['data', createUAParserData(itemType, ua, rgxMap, uaCH)] + ['data', createUAParserData(this, itemType)] ]); - this.parse(); - var isSelfNav = NAVIGATOR && NAVIGATOR.userAgent == ua; - switch(this.itemType) { - case UA_BROWSER: - // Brave-specific detection - if (isSelfNav && NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) { - this.set(NAME, 'Brave'); - } - this.set(MAJOR, majorize(this.get(VERSION))); - break; - case UA_DEVICE: - if (isSelfNav && !this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) { - this.set(TYPE, MOBILE); - } - // iPadOS-specific detection: identified as Mac, but has some iOS-only properties - if (isSelfNav && this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) { - this.set(MODEL, 'iPad') - .set(TYPE, TABLET); - } - break; - case UA_OS: - if (isSelfNav && !this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) { - this.set(NAME, NAVIGATOR_UADATA[PLATFORM]); - } - break; - case UA_RESULT: - var createUAParserItem = function (itemType) { - return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).get(); - }; - this.set('ua', ua) - .set(UA_BROWSER, createUAParserItem(UA_BROWSER)) - .set(UA_CPU, createUAParserItem(UA_CPU)) - .set(UA_DEVICE, createUAParserItem(UA_DEVICE)) - .set(UA_ENGINE, createUAParserItem(UA_ENGINE)) - .set(UA_OS, createUAParserItem(UA_OS)) - .get(); - } + return this; } - UAParserItem.prototype.get = function (prop) { - if (!prop) return this.data; - return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined; - }; - UAParserItem.prototype.parse = function () { - if (this.itemType != UA_RESULT) { - rgxMapper.call(this.data, this.ua, this.rgxMap); - } - return this; - }; - UAParserItem.prototype.parseCH = function () { - var ua = this.ua, - uaCH = this.uaCH, - rgxMap = this.rgxMap; - - switch (this.itemType) { - case UA_BROWSER: - var brands = uaCH[FULLVERLIST] || uaCH[BRANDS]; - if (brands) { - for (var i in brands) { - var brandName = brands[i].brand, - brandVersion = brands[i].version; - if (!/not.a.brand/i.test(brandName) && (i < 1 || /chromi/i.test(this.get(NAME)))) { - this.set(NAME, strip(GOOGLE+' ', brandName)) - .set(VERSION, brandVersion) - .set(MAJOR, majorize(brandVersion)); - } - } - } - break; - case UA_CPU: - var archName = uaCH[ARCHITECTURE]; - if (archName) { - if (archName && uaCH[BITNESS] == '64') archName += '64'; - rgxMapper.call(this.data, archName + ';', rgxMap); - } - break; - case UA_DEVICE: - if (uaCH[MOBILE]) { - this.set(TYPE, MOBILE); - } - if (uaCH[MODEL]) { - this.set(MODEL, uaCH[MODEL]); - } - break; - case UA_OS: - var osName = uaCH[PLATFORM]; - if(osName) { - var osVersion = uaCH[PLATFORMVER]; - if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10'); - this.set(NAME, osName) - .set(VERSION, osVersion); - } - break; - case UA_RESULT: - var createUAParserItemWithCH = function (itemType) { - return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).parseCH().get(); - }; - this.set('ua', ua) - .set(UA_BROWSER, createUAParserItemWithCH(UA_BROWSER)) - .set(UA_CPU, createUAParserItemWithCH(UA_CPU)) - .set(UA_DEVICE, createUAParserItemWithCH(UA_DEVICE)) - .set(UA_ENGINE, createUAParserItemWithCH(UA_ENGINE)) - .set(UA_OS, createUAParserItemWithCH(UA_OS)); - } - return this; - }; - UAParserItem.prototype.set = function (prop, val) { - this.data[prop] = val; - return this; - }; function UAParser (ua, extensions, headers) { @@ -1094,26 +1104,44 @@ const window = undefined; extend(defaultRegexes, extensions) : defaultRegexes, - createUAParserItemFunc = function (itemType) { - return function () { - return new UAParserItem(itemType, userAgent, itemType == UA_RESULT ? regexMap : regexMap[itemType], HTTP_UACH).get(); - }; + createItemFunc = function (itemType) { + if (itemType == UA_RESULT) { + return function () { + return new UAParserItem(itemType, userAgent, regexMap, HTTP_UACH) + .set('ua', userAgent) + .set(UA_BROWSER, this.getBrowser()) + .set(UA_CPU, this.getCPU()) + .set(UA_DEVICE, this.getDevice()) + .set(UA_ENGINE, this.getEngine()) + .set(UA_OS, this.getOS()) + .get(); + }; + } else { + return function () { + return new UAParserItem(itemType, userAgent, regexMap[itemType], HTTP_UACH) + .parseUA() + .detectFeature() + .get(); + }; + } }; // public methods - assignFromEntries.call(this, [ - ['getBrowser', createUAParserItemFunc(UA_BROWSER)], - ['getCPU', createUAParserItemFunc(UA_CPU)], - ['getDevice', createUAParserItemFunc(UA_DEVICE)], - ['getEngine', createUAParserItemFunc(UA_ENGINE)], - ['getOS', createUAParserItemFunc(UA_OS)], - ['getResult', createUAParserItemFunc(UA_RESULT)], + setProps.call(this, [ + ['getBrowser', createItemFunc(UA_BROWSER)], + ['getCPU', createItemFunc(UA_CPU)], + ['getDevice', createItemFunc(UA_DEVICE)], + ['getEngine', createItemFunc(UA_ENGINE)], + ['getOS', createItemFunc(UA_OS)], + ['getResult', createItemFunc(UA_RESULT)], ['getUA', function () { return userAgent; }], ['setUA', function (ua) { userAgent = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua; return this; }] - ]).setUA(userAgent); + ]) + .setUA(userAgent); + return this; } diff --git a/src/enum/ua-parser-enum.js b/src/ua-parser-enum.js similarity index 98% rename from src/enum/ua-parser-enum.js rename to src/ua-parser-enum.js index 9276b9a..6d88e81 100644 --- a/src/enum/ua-parser-enum.js +++ b/src/ua-parser-enum.js @@ -5,6 +5,8 @@ MIT License */ ////////////////////////////////////////////// +/*jshint esversion: 6 */ + const BrowserName = Object.freeze({ CHROME : 'Chrome', EDGE : 'Edge', @@ -98,4 +100,4 @@ module.exports = { DeviceVendor, EngineName, OSName -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/extension/ua-parser-extension.js b/src/ua-parser-extension.js similarity index 99% rename from src/extension/ua-parser-extension.js rename to src/ua-parser-extension.js index 8b10366..fed987e 100644 --- a/src/extension/ua-parser-extension.js +++ b/src/ua-parser-extension.js @@ -5,6 +5,8 @@ MIT License */ ////////////////////////////////////////////// +/*jshint esversion: 6 */ + const MODEL = 'model'; const NAME = 'name'; const TYPE = 'type'; @@ -117,4 +119,4 @@ module.exports = { ExtraDevices, Emails, Tools -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/ua-parser.js b/src/ua-parser.js index ffa73ea..1e04b59 100755 --- a/src/ua-parser.js +++ b/src/ua-parser.js @@ -8,7 +8,8 @@ Source : https://github.com/faisalman/ua-parser-js */ ///////////////////////////////////////////////////////////////////////////////// -/*jshint esversion: 3 */ +/* jshint esversion: 3 */ +/* globals window */ (function (window, undefined) { diff --git a/test/browser-test.json b/test/specs/browser-all.json similarity index 100% rename from test/browser-test.json rename to test/specs/browser-all.json diff --git a/test/cpu-test.json b/test/specs/cpu-all.json similarity index 100% rename from test/cpu-test.json rename to test/specs/cpu-all.json diff --git a/test/device-test.json b/test/specs/device-all.json similarity index 100% rename from test/device-test.json rename to test/specs/device-all.json diff --git a/test/engine-test.json b/test/specs/engine-all.json similarity index 100% rename from test/engine-test.json rename to test/specs/engine-all.json diff --git a/test/test-extension.json b/test/specs/extension-device.json similarity index 100% rename from test/test-extension.json rename to test/specs/extension-device.json diff --git a/test/mediaplayer-test.json b/test/specs/extension-mediaplayer.json similarity index 100% rename from test/mediaplayer-test.json rename to test/specs/extension-mediaplayer.json diff --git a/test/os-test.json b/test/specs/os-all.json similarity index 100% rename from test/os-test.json rename to test/specs/os-all.json diff --git a/test/test.js b/test/test.js index a7dbeea..c998088 100644 --- a/test/test.js +++ b/test/test.js @@ -5,11 +5,11 @@ var requirejs = require('requirejs'); var parseJS = require('@babel/parser').parse; var traverse = require('@babel/traverse').default; var UAParser = require('./../src/ua-parser'); -var browsers = require('./browser-test.json'); -var cpus = require('./cpu-test.json'); -var devices = require('./device-test.json'); -var engines = require('./engine-test.json'); -var os = require('./os-test.json'); +var browsers = require('./specs/browser-all.json'); +var cpus = require('./specs/cpu-all.json'); +var devices = require('./specs/device-all.json'); +var engines = require('./specs/engine-all.json'); +var os = require('./specs/os-all.json'); var parser = new UAParser(); var methods = [ { @@ -82,7 +82,6 @@ describe('Returns', function () { assert.deepEqual(new UAParser('').getResult(), { ua : '', - //ua_ch : { architecture: undefined, bitness: undefined, brands: undefined, fullVersionList: undefined, mobile: false, model: undefined, platform: undefined, platformVersion: undefined }, browser: { name: undefined, version: undefined, major: undefined }, cpu: { architecture: undefined }, device: { vendor: undefined, model: undefined, type: undefined }, @@ -362,43 +361,6 @@ describe('Map UA-CH headers', function () { let engine = new UAParser(headers).getEngine().withClientHints(); let os = new UAParser(headers).getOS().withClientHints(); -/* let ua_ch = { - "architecture": "ARM", - "bitness": "64", - "brands": [ - { - "brand": "Chromium", - "version": "93" - }, - { - "brand": "Google Chrome", - "version": "93" - }, - { - "brand": " Not;A Brand", - "version": "99" - } - ], - "fullVersionList": [ - { - "brand": "Chromium", - "version": "93.0.1.2" - }, - { - "brand": "Google Chrome", - "version": "93.0.1.2" - }, - { - "brand": " Not;A Brand", - "version": "99.0.1.2" - } - ], - "mobile": true, - "model": "Pixel 99", - "platform": "Windows", - "platformVersion": "13" - };*/ - it('Can read from client-hints headers using `withClientHints()`', function () { //assert.deepEqual(uap.ua_ch, ua_ch); @@ -436,7 +398,6 @@ describe('Map UA-CH headers', function () { engine = new UAParser(headers).getEngine(); os = new UAParser(headers).getOS(); - //assert.deepEqual(uap.ua_ch, ua_ch); assert.strictEqual(uap.browser.name, "Chrome"); assert.strictEqual(uap.browser.version, "110.0.0.0"); assert.strictEqual(uap.browser.major, "110"); @@ -459,18 +420,6 @@ describe('Map UA-CH headers', function () { uap = UAParser(headers2).withClientHints(); -/* ua_ch = { - "architecture": undefined, - "bitness": undefined, - "brands": undefined, - "fullVersionList": undefined, - "mobile": true, - "model": undefined, - "platform": undefined, - "platformVersion": undefined - }; - - assert.deepEqual(uap.ua_ch, ua_ch);*/ assert.strictEqual(uap.browser.name, "Chrome"); assert.strictEqual(uap.browser.version, "110.0.0.0"); assert.strictEqual(uap.browser.major, "110"); @@ -513,70 +462,4 @@ describe('Map UA-CH headers', function () { assert.strictEqual(ua.device.is("tablet"), false); }); }); -}); - -describe('Map UA-CH JS', () => { - - it('does not throw when using withClientHints() in non-supported environment', () => { - assert.doesNotThrow(() => { - new UAParser().getResult().withClientHints(); - }); - }); - - window = { navigator : { userAgent : '' , userAgentData : new NavigatorUAData() } }; - function NavigatorUAData () { - this.mobile = false; - this.platform = ''; - this.brands = [{ brand : 'A Chromium-based Browser', version : '1' }]; - this.getHighEntropyValues = (values) => { - return new Promise((resolve) => { - const result = { - brands : [{ brand : 'A Chromium-based Browser', version : '1' }], - fullVersionList : [{ brand : 'A Chromium-based Browser', version : '1.2.3' }], - architecture : 'x86', - bitness : '64', - mobile : true, - model : 'Galaxy S3', - platform : 'Android', - platformVersion : '1000' - }; - resolve(result); - }); - } - }; - delete require.cache[require.resolve('./../src/ua-parser')]; - const UAParserWithWindow = require('./../src/ua-parser'); - - it('Can read client hints from browser', async () => { - - let uap = new UAParserWithWindow() - - let os = await uap.getOS().withClientHints(); - - assert.strictEqual(os.name, 'Android'); - assert.strictEqual(os.is('Android'), true); - assert.strictEqual(os.toString(), 'Android 1000'); - - let result = await uap.getResult().withClientHints(); - - assert.strictEqual(result.browser.name, 'A Chromium-based Browser'); - assert.strictEqual(result.browser.version, '1.2.3'); - assert.strictEqual(result.cpu.architecture, 'amd64'); - assert.strictEqual(result.os.name, 'Android'); - - await uap.getDevice().withClientHints().then((device) => { - assert.strictEqual(device.type, 'mobile'); - assert.strictEqual(device.vendor, undefined); - assert.strictEqual(device.model, 'Galaxy S3'); - }); - - let result_without_ch = uap.getResult(); - - assert.strictEqual(result_without_ch.browser.name, undefined); - - uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"); - assert.strictEqual(uap.getOS().name, "macOS"); - - // TODO : create full tests - }); }); \ No newline at end of file