Rearrange test files & config

This commit is contained in:
Faisal Salman 2023-04-08 06:44:30 +07:00
parent e01663b48f
commit 625ece73e2
18 changed files with 262 additions and 305 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -143,19 +143,19 @@
], ],
"type": "commonjs", "type": "commonjs",
"main": "src/ua-parser.js", "main": "src/ua-parser.js",
"module": "src/ua-parser.mjs", "module": "src/module/ua-parser.mjs",
"exports": { "exports": {
".": { ".": {
"require": "./src/ua-parser.js", "require": "./src/ua-parser.js",
"import": "./src/ua-parser.mjs" "import": "./src/module/ua-parser.mjs"
}, },
"./enums": { "./enums": {
"require": "./src/enum/ua-parser-enum.js", "require": "./src/ua-parser-enum.js",
"import": "./src/enum/ua-parser-enum.mjs" "import": "./src/module/ua-parser-enum.mjs"
}, },
"./extensions": { "./extensions": {
"require": "./src/extension/ua-parser-extension.js", "require": "./src/ua-parser-extension.js",
"import": "./src/extension/ua-parser-extension.mjs" "import": "./src/module/ua-parser-extension.mjs"
} }
}, },
"files": [ "files": [
@ -163,11 +163,9 @@
"src" "src"
], ],
"scripts": { "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')\"", "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/ua-parser.js && mocha -R nyan test", "test": "jshint src/ && mocha -R nyan test",
"test-ci": "jshint src/ua-parser.js && mocha -R spec test", "test-ci": "jshint src/ && mocha -R spec test"
"verup": "node ./node_modules/verup",
"version": "node ./node_modules/verup 0"
}, },
"devDependencies": { "devDependencies": {
"@babel/parser": "7.15.8", "@babel/parser": "7.15.8",

39
script/build-module.js Normal file
View File

@ -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');

View File

@ -1,6 +1,6 @@
// Generated ESM version of UAParser.js enums // Generated ESM version of UAParser.js enums
// DO NOT EDIT THIS FILE! // 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 /* Enums for UAParser.js v2.0.0-alpha.2
@ -9,6 +9,8 @@
MIT License */ MIT License */
////////////////////////////////////////////// //////////////////////////////////////////////
/*jshint esversion: 6 */
const BrowserName = Object.freeze({ const BrowserName = Object.freeze({
CHROME : 'Chrome', CHROME : 'Chrome',
EDGE : 'Edge', EDGE : 'Edge',
@ -102,4 +104,4 @@ export {
DeviceVendor, DeviceVendor,
EngineName, EngineName,
OSName OSName
} };

View File

@ -1,6 +1,6 @@
// Generated ESM version of UAParser.js extensions // Generated ESM version of UAParser.js extensions
// DO NOT EDIT THIS FILE! // 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 /* Extensions for UAParser.js v2.0.0-alpha.2
@ -9,6 +9,8 @@
MIT License */ MIT License */
////////////////////////////////////////////// //////////////////////////////////////////////
/*jshint esversion: 6 */
const MODEL = 'model'; const MODEL = 'model';
const NAME = 'name'; const NAME = 'name';
const TYPE = 'type'; const TYPE = 'type';
@ -121,4 +123,4 @@ export {
ExtraDevices, ExtraDevices,
Emails, Emails,
Tools Tools
} };

View File

@ -2,8 +2,6 @@
// DO NOT EDIT THIS FILE! // DO NOT EDIT THIS FILE!
// Source: /src/ua-parser.js // Source: /src/ua-parser.js
const window = undefined;
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.0-alpha.2 /* UAParser.js v2.0.0-alpha.2
Copyright © 2012-2023 Faisal Salman <f@faisalman.com> Copyright © 2012-2023 Faisal Salman <f@faisalman.com>
@ -14,6 +12,9 @@ const window = undefined;
Source : https://github.com/faisalman/ua-parser-js */ Source : https://github.com/faisalman/ua-parser-js */
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* jshint esversion: 6 */
/* globals window */
////////////// //////////////
@ -97,18 +98,7 @@ const window = undefined;
// Helper // Helper
////////// //////////
var assignFromEntries = function (arr) { var extend = function (regexes, extensions) {
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 = {}; var mergedRegexes = {};
for (var i in regexes) { for (var i in regexes) {
mergedRegexes[i] = extensions[i] && extensions[i].length % 2 === 0 ? extensions[i].concat(regexes[i]) : regexes[i]; 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) { majorize = function (version) {
return typeof(version) === STR_TYPE ? strip(/[^\d\.]/g, version).split('.')[0] : undefined; 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) { strip = function (pattern, str) {
return str.replace(pattern, EMPTY); return str.replace(pattern, EMPTY);
}, },
@ -245,18 +246,7 @@ const window = undefined;
// String map // String map
////////////// //////////////
// Safari < 3.0 var windowsVersionMap = {
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 = {
'ME' : '4.90', 'ME' : '4.90',
'NT 3.11' : 'NT3.51', 'NT 3.11' : 'NT3.51',
'NT 4.0' : 'NT4.0', 'NT 4.0' : 'NT4.0',
@ -388,7 +378,7 @@ const window = undefined;
/version\/([\w\.\,]+) .*(safari)/i // Safari /version\/([\w\.\,]+) .*(safari)/i // Safari
], [VERSION, NAME], [ ], [VERSION, NAME], [
/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
], [NAME, [VERSION, strMapper, oldSafariMap]], [ ], [NAME, [VERSION, '1']], [
/(webkit|khtml)\/([\w\.]+)/i /(webkit|khtml)\/([\w\.]+)/i
], [NAME, VERSION], [ ], [NAME, VERSION], [
@ -813,23 +803,23 @@ const window = undefined;
var defaultProps = (function () { var defaultProps = (function () {
var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}}; var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
assignFromEntries.call(props.init, [ setProps.call(props.init, [
[UA_BROWSER, [NAME, VERSION, MAJOR]], [UA_BROWSER, [NAME, VERSION, MAJOR]],
[UA_CPU, [ARCHITECTURE]], [UA_CPU, [ARCHITECTURE]],
[UA_DEVICE, [TYPE, MODEL, VENDOR]], [UA_DEVICE, [TYPE, MODEL, VENDOR]],
[UA_ENGINE, [NAME, VERSION]], [UA_ENGINE, [NAME, VERSION]],
[UA_OS, [NAME, VERSION]] [UA_OS, [NAME, VERSION]]
]); ]);
assignFromEntries.call(props.isIgnore, [ setProps.call(props.isIgnore, [
[UA_BROWSER, [VERSION, MAJOR]], [UA_BROWSER, [VERSION, MAJOR]],
[UA_ENGINE, [VERSION]], [UA_ENGINE, [VERSION]],
[UA_OS, [VERSION]] [UA_OS, [VERSION]]
]); ]);
assignFromEntries.call(props.isIgnoreRgx, [ setProps.call(props.isIgnoreRgx, [
[UA_BROWSER, / ?browser$/i], [UA_BROWSER, / ?browser$/i],
[UA_OS, / ?os$/i] [UA_OS, / ?os$/i]
]); ]);
assignFromEntries.call(props.toString, [ setProps.call(props.toString, [
[UA_BROWSER, [NAME, VERSION]], [UA_BROWSER, [NAME, VERSION]],
[UA_CPU, [ARCHITECTURE]], [UA_CPU, [ARCHITECTURE]],
[UA_DEVICE, [VENDOR, MODEL]], [UA_DEVICE, [VENDOR, MODEL]],
@ -839,7 +829,7 @@ const window = undefined;
return props; return props;
})(); })();
var createUAParserData = function (itemType, ua, rgxMap, uaCH) { var createUAParserData = function (item, itemType) {
var init_props = defaultProps.init[itemType], var init_props = defaultProps.init[itemType],
is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
@ -847,21 +837,30 @@ const window = undefined;
toString_props = defaultProps.toString[itemType] || 0; toString_props = defaultProps.toString[itemType] || 0;
function UAParserData () { function UAParserData () {
assignFromEntries.call(this, init_props); setProps.call(this, init_props);
} }
UAParserData.prototype.getItem = function () {
return item;
};
UAParserData.prototype.withClientHints = function () { UAParserData.prototype.withClientHints = function () {
// nodejs / non-client-hints browsers // nodejs / non-client-hints browsers
if (!NAVIGATOR_UADATA) { if (!NAVIGATOR_UADATA) {
return new UAParserItem(itemType, ua, rgxMap, uaCH).parseCH().get(); return item
.parseCH()
.get();
} }
// browsers based on chromium 85+ // browsers based on chromium 85+
return NAVIGATOR_UADATA return NAVIGATOR_UADATA
.getHighEntropyValues(CH_ALL_VALUES) .getHighEntropyValues(CH_ALL_VALUES)
.then(function (res) { .then(function (res) {
var JS_UACH = new UAParserDataCH(res, false); return item
return new UAParserItem(itemType, ua, rgxMap, JS_UACH).parseCH().get(); .setCH(new UAParserDataCH(res, false))
.parseCH()
.get();
}); });
}; };
@ -919,9 +918,9 @@ const window = undefined;
function UAParserDataCH (uach, isHTTP_UACH) { function UAParserDataCH (uach, isHTTP_UACH) {
uach = uach || {}; uach = uach || {};
assignFromEntries.call(this, CH_ALL_VALUES); setProps.call(this, CH_ALL_VALUES);
if (isHTTP_UACH) { if (isHTTP_UACH) {
assignFromEntries.call(this, [ setProps.call(this, [
[BRANDS, itemListToArray(uach[CH_HEADER])], [BRANDS, itemListToArray(uach[CH_HEADER])],
[FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])], [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],
[BRANDS, itemListToArray(uach[CH_HEADER])], [BRANDS, itemListToArray(uach[CH_HEADER])],
@ -937,67 +936,66 @@ const window = undefined;
if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop]; if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];
} }
} }
return this;
} }
function UAParserItem (itemType, ua, rgxMap, uaCH) { function UAParserItem (itemType, ua, rgxMap, uaCH) {
assignFromEntries.call(this, [
['itemType', itemType], this.get = function (prop) {
['ua', ua], if (!prop) return this.data;
['uaCH', uaCH], return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
['rgxMap', rgxMap], };
['data', createUAParserData(itemType, ua, rgxMap, uaCH)]
]); this.set = function (prop, val) {
this.parse(); this.data[prop] = val;
var isSelfNav = NAVIGATOR && NAVIGATOR.userAgent == ua; return this;
switch(this.itemType) { };
this.setCH = function (ch) {
this.uaCH = ch;
return this;
};
this.detectFeature = function () {
if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
switch (this.itemType) {
case UA_BROWSER: case UA_BROWSER:
// Brave-specific detection // Brave-specific detection
if (isSelfNav && NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) { if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
this.set(NAME, 'Brave'); this.set(NAME, 'Brave');
} }
this.set(MAJOR, majorize(this.get(VERSION)));
break; break;
case UA_DEVICE: case UA_DEVICE:
if (isSelfNav && !this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) { // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
this.set(TYPE, MOBILE); this.set(TYPE, MOBILE);
} }
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties // 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) { if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
this.set(MODEL, 'iPad') this.set(MODEL, 'iPad')
.set(TYPE, TABLET); .set(TYPE, TABLET);
} }
break; break;
case UA_OS: case UA_OS:
if (isSelfNav && !this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) { // 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]); 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; 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 () {
this.parseUA = function () {
if (this.itemType != UA_RESULT) { if (this.itemType != UA_RESULT) {
rgxMapper.call(this.data, this.ua, this.rgxMap); rgxMapper.call(this.data, this.ua, this.rgxMap);
} }
if (this.itemType == UA_BROWSER) {
this.set(MAJOR, majorize(this.get(VERSION)));
}
return this; return this;
}; };
UAParserItem.prototype.parseCH = function () {
this.parseCH = function () {
var ua = this.ua, var ua = this.ua,
uaCH = this.uaCH, uaCH = this.uaCH,
rgxMap = this.rgxMap; rgxMap = this.rgxMap;
@ -1042,22 +1040,34 @@ const window = undefined;
} }
break; break;
case UA_RESULT: case UA_RESULT:
var createUAParserItemWithCH = function (itemType) { var data = this.data;
return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).parseCH().get(); var parse = function (itemType) {
return data[itemType]
.getItem()
.setCH(uaCH)
.parseCH()
.get();
}; };
this.set('ua', ua) this.set('ua', ua)
.set(UA_BROWSER, createUAParserItemWithCH(UA_BROWSER)) .set(UA_BROWSER, parse(UA_BROWSER))
.set(UA_CPU, createUAParserItemWithCH(UA_CPU)) .set(UA_CPU, parse(UA_CPU))
.set(UA_DEVICE, createUAParserItemWithCH(UA_DEVICE)) .set(UA_DEVICE, parse(UA_DEVICE))
.set(UA_ENGINE, createUAParserItemWithCH(UA_ENGINE)) .set(UA_ENGINE, parse(UA_ENGINE))
.set(UA_OS, createUAParserItemWithCH(UA_OS)); .set(UA_OS, parse(UA_OS));
} }
return this; return this;
}; };
UAParserItem.prototype.set = function (prop, val) {
this.data[prop] = val; setProps.call(this, [
['itemType', itemType],
['ua', ua],
['uaCH', uaCH],
['rgxMap', rgxMap],
['data', createUAParserData(this, itemType)]
]);
return this; return this;
}; }
function UAParser (ua, extensions, headers) { function UAParser (ua, extensions, headers) {
@ -1094,26 +1104,44 @@ const window = undefined;
extend(defaultRegexes, extensions) : extend(defaultRegexes, extensions) :
defaultRegexes, defaultRegexes,
createUAParserItemFunc = function (itemType) { createItemFunc = function (itemType) {
if (itemType == UA_RESULT) {
return function () { return function () {
return new UAParserItem(itemType, userAgent, itemType == UA_RESULT ? regexMap : regexMap[itemType], HTTP_UACH).get(); 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 // public methods
assignFromEntries.call(this, [ setProps.call(this, [
['getBrowser', createUAParserItemFunc(UA_BROWSER)], ['getBrowser', createItemFunc(UA_BROWSER)],
['getCPU', createUAParserItemFunc(UA_CPU)], ['getCPU', createItemFunc(UA_CPU)],
['getDevice', createUAParserItemFunc(UA_DEVICE)], ['getDevice', createItemFunc(UA_DEVICE)],
['getEngine', createUAParserItemFunc(UA_ENGINE)], ['getEngine', createItemFunc(UA_ENGINE)],
['getOS', createUAParserItemFunc(UA_OS)], ['getOS', createItemFunc(UA_OS)],
['getResult', createUAParserItemFunc(UA_RESULT)], ['getResult', createItemFunc(UA_RESULT)],
['getUA', function () { return userAgent; }], ['getUA', function () { return userAgent; }],
['setUA', function (ua) { ['setUA', function (ua) {
userAgent = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua; userAgent = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;
return this; return this;
}] }]
]).setUA(userAgent); ])
.setUA(userAgent);
return this; return this;
} }

View File

@ -5,6 +5,8 @@
MIT License */ MIT License */
////////////////////////////////////////////// //////////////////////////////////////////////
/*jshint esversion: 6 */
const BrowserName = Object.freeze({ const BrowserName = Object.freeze({
CHROME : 'Chrome', CHROME : 'Chrome',
EDGE : 'Edge', EDGE : 'Edge',
@ -98,4 +100,4 @@ module.exports = {
DeviceVendor, DeviceVendor,
EngineName, EngineName,
OSName OSName
} };

View File

@ -5,6 +5,8 @@
MIT License */ MIT License */
////////////////////////////////////////////// //////////////////////////////////////////////
/*jshint esversion: 6 */
const MODEL = 'model'; const MODEL = 'model';
const NAME = 'name'; const NAME = 'name';
const TYPE = 'type'; const TYPE = 'type';
@ -117,4 +119,4 @@ module.exports = {
ExtraDevices, ExtraDevices,
Emails, Emails,
Tools Tools
} };

View File

@ -8,7 +8,8 @@
Source : https://github.com/faisalman/ua-parser-js */ Source : https://github.com/faisalman/ua-parser-js */
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/*jshint esversion: 3 */ /* jshint esversion: 3 */
/* globals window */
(function (window, undefined) { (function (window, undefined) {

View File

@ -5,11 +5,11 @@ var requirejs = require('requirejs');
var parseJS = require('@babel/parser').parse; var parseJS = require('@babel/parser').parse;
var traverse = require('@babel/traverse').default; var traverse = require('@babel/traverse').default;
var UAParser = require('./../src/ua-parser'); var UAParser = require('./../src/ua-parser');
var browsers = require('./browser-test.json'); var browsers = require('./specs/browser-all.json');
var cpus = require('./cpu-test.json'); var cpus = require('./specs/cpu-all.json');
var devices = require('./device-test.json'); var devices = require('./specs/device-all.json');
var engines = require('./engine-test.json'); var engines = require('./specs/engine-all.json');
var os = require('./os-test.json'); var os = require('./specs/os-all.json');
var parser = new UAParser(); var parser = new UAParser();
var methods = [ var methods = [
{ {
@ -82,7 +82,6 @@ describe('Returns', function () {
assert.deepEqual(new UAParser('').getResult(), assert.deepEqual(new UAParser('').getResult(),
{ {
ua : '', 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 }, browser: { name: undefined, version: undefined, major: undefined },
cpu: { architecture: undefined }, cpu: { architecture: undefined },
device: { vendor: undefined, model: undefined, type: 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 engine = new UAParser(headers).getEngine().withClientHints();
let os = new UAParser(headers).getOS().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 () { it('Can read from client-hints headers using `withClientHints()`', function () {
//assert.deepEqual(uap.ua_ch, ua_ch); //assert.deepEqual(uap.ua_ch, ua_ch);
@ -436,7 +398,6 @@ describe('Map UA-CH headers', function () {
engine = new UAParser(headers).getEngine(); engine = new UAParser(headers).getEngine();
os = new UAParser(headers).getOS(); os = new UAParser(headers).getOS();
//assert.deepEqual(uap.ua_ch, ua_ch);
assert.strictEqual(uap.browser.name, "Chrome"); assert.strictEqual(uap.browser.name, "Chrome");
assert.strictEqual(uap.browser.version, "110.0.0.0"); assert.strictEqual(uap.browser.version, "110.0.0.0");
assert.strictEqual(uap.browser.major, "110"); assert.strictEqual(uap.browser.major, "110");
@ -459,18 +420,6 @@ describe('Map UA-CH headers', function () {
uap = UAParser(headers2).withClientHints(); 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.name, "Chrome");
assert.strictEqual(uap.browser.version, "110.0.0.0"); assert.strictEqual(uap.browser.version, "110.0.0.0");
assert.strictEqual(uap.browser.major, "110"); assert.strictEqual(uap.browser.major, "110");
@ -514,69 +463,3 @@ describe('Map UA-CH headers', function () {
}); });
}); });
}); });
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
});
});