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",
"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",

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
// 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
}
};

View File

@ -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
}
};

View File

@ -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 <f@faisalman.com>
@ -14,6 +12,9 @@ const window = undefined;
Source : https://github.com/faisalman/ua-parser-js */
/////////////////////////////////////////////////////////////////////////////////
/* jshint esversion: 6 */
/* globals window */
//////////////
@ -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;
}

View File

@ -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
}
};

View File

@ -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
}
};

View File

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

View File

@ -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");
@ -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
});
});