From 0a46ac396a351ce168d5e459e0daf9671b6a2035 Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Thu, 6 Jun 2024 20:02:22 +0700 Subject: [PATCH] Fix #718 - Extension param now accept multiple extensions --- src/main/ua-parser.d.ts | 2 +- src/main/ua-parser.js | 27 ++++++++++++++++++--------- test/mocha-test-extension.js | 6 ++++++ test/mocha-test.js | 7 +++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/ua-parser.d.ts b/src/main/ua-parser.d.ts index 9f06b21..7af0dfd 100644 --- a/src/main/ua-parser.d.ts +++ b/src/main/ua-parser.d.ts @@ -49,7 +49,7 @@ declare namespace UAParser { type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[]; type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os'; - type UAParserExt = Partial>; + type UAParserExt = Partial> | Partial>[]; export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: Record): IResult; export function UAParser(uastring?: string, headers?: Record): IResult; diff --git a/src/main/ua-parser.js b/src/main/ua-parser.js index d97570a..eda9ba4 100755 --- a/src/main/ua-parser.js +++ b/src/main/ua-parser.js @@ -101,12 +101,21 @@ // Helper ////////// - 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]; + var extend = function (defaultRgx, extensions) { + var mergedRgx = {}; + var extraRgx = extensions; + if (!isExtensions(extensions)) { + extraRgx = {}; + for (var i in extensions) { + for (var j in extensions[i]) { + extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []); + } + } } - return mergedRegexes; + for (var k in defaultRgx) { + mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k]; + } + return mergedRgx; }, enumerize = function (arr) { var enums = {}; @@ -124,9 +133,9 @@ } return isString(str1) ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false; }, - isExtensions = function (obj) { + isExtensions = function (obj, deep) { for (var prop in obj) { - return /^(browser|cpu|device|engine|os)$/.test(prop); + return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false); } }, isString = function (val) { @@ -1163,7 +1172,7 @@ function UAParser (ua, extensions, headers) { if (typeof ua === OBJ_TYPE) { - if (isExtensions(ua)) { + if (isExtensions(ua, true)) { if (typeof extensions === OBJ_TYPE) { headers = extensions; // case UAParser(extensions, headers) } @@ -1173,7 +1182,7 @@ extensions = undefined; } ua = undefined; - } else if (typeof ua === STR_TYPE && !isExtensions(extensions)) { + } else if (typeof ua === STR_TYPE && !isExtensions(extensions, true)) { headers = extensions; // case UAParser(ua, headers) extensions = undefined; } diff --git a/test/mocha-test-extension.js b/test/mocha-test-extension.js index 939802f..6c66502 100644 --- a/test/mocha-test-extension.js +++ b/test/mocha-test-extension.js @@ -34,6 +34,12 @@ describe('Bots', () => { assert.deepEqual(botsAndCLIsParser.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"}); assert.deepEqual(botsAndCLIsParser.setUA(facebookBot).getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"bot"}); + // alternative merge options + const botsAndCLIsParser2 = new UAParser([Bots, CLIs]); + const botsAndCLIsParser3 = new UAParser(facebookBot, [Bots, CLIs]); + assert.deepEqual(botsAndCLIsParser2.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"}); + assert.deepEqual(botsAndCLIsParser3.getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"bot"}); + const emailParser = new UAParser(Emails); assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: "Microsoft Outlook", version: "16.0.9126", major: "16", type: "email"}); assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: "Thunderbird", version: "78.13.0", major: "78", type: "email"}); diff --git a/test/mocha-test.js b/test/mocha-test.js index ead59a8..7b5e711 100644 --- a/test/mocha-test.js +++ b/test/mocha-test.js @@ -126,6 +126,13 @@ describe('Extending Regex', function () { }); let myUA2 = 'Mozilla/5.0 MyTab 14 Pro Max'; assert.deepEqual(myParser2.setUA(myUA2).getDevice(), {vendor: "MyTab", model: "14 Pro Max", type: "tablet"}); + + let myParser3 = new UAParser([{ + browser: myOwnListOfBrowsers + }, { + device: myOwnListOfDevices + }]); + assert.deepEqual(myParser3.setUA(myUA2).getDevice(), {vendor: "MyTab", model: "14 Pro Max", type: "tablet"}); }); describe('User-agent length', function () {