From 072a82b87ba35cc15ae10fd02d905f4b78a8ce05 Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Sat, 27 May 2023 20:45:43 +0700 Subject: [PATCH] Add a new submodule: `ua-parser-helpers` with a method: `isFrozenUA()` to match a string with a frozen user-agent pattern --- package.json | 4 +++ script/build-module.js | 10 +++++++- src/helpers/ua-parser-helpers.js | 42 ++++++++++++++++++++++++++++++++ test/mocha-test-helpers.js | 35 ++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/helpers/ua-parser-helpers.js create mode 100644 test/mocha-test-helpers.js diff --git a/package.json b/package.json index 9913e2e9..ea8379f8 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,10 @@ "./extensions": { "require": "./src/extensions/ua-parser-extensions.js", "import": "./src/extensions/ua-parser-extensions.mjs" + }, + "./helpers": { + "require": "./src/helpers/ua-parser-helpers.js", + "import": "./src/helpers/ua-parser-helpers.mjs" } }, "files": [ diff --git a/script/build-module.js b/script/build-module.js index bbeb72cc..d7f5a59a 100755 --- a/script/build-module.js +++ b/script/build-module.js @@ -16,6 +16,11 @@ const PATH = { src : 'src/extensions/ua-parser-extensions.js', dest : 'src/extensions/ua-parser-extensions.mjs', title : 'extensions' + }, + helpers : { + src : 'src/helpers/ua-parser-helpers.js', + dest : 'src/helpers/ua-parser-helpers.mjs', + title : 'helpers' } }; const generateMJS = (module, replacers) => { @@ -46,4 +51,7 @@ generateMJS('main', [ generateMJS('enums', [[/module\.exports =/ig, 'export']]); // ua-parser-extension.mjs -generateMJS('extensions', [[/module\.exports =/ig, 'export']]); \ No newline at end of file +generateMJS('extensions', [[/module\.exports =/ig, 'export']]); + +// ua-parser-helpers.mjs +generateMJS('helpers', [[/module\.exports =/ig, 'export']]); \ No newline at end of file diff --git a/src/helpers/ua-parser-helpers.js b/src/helpers/ua-parser-helpers.js new file mode 100644 index 00000000..9e6c3395 --- /dev/null +++ b/src/helpers/ua-parser-helpers.js @@ -0,0 +1,42 @@ +/////////////////////////////////////////////// +/* Helpers for UAParser.js v2.0.0-alpha.2 + https://github.com/faisalman/ua-parser-js + Author: Faisal Salman + MIT License */ +////////////////////////////////////////////// + +/*jshint esversion: 6 */ + +/* + # Reference: + https://www.chromium.org/updates/ua-reduction/ + + # Desktop + --- + Format: + Mozilla/5.0 () AppleWebKit/537.36 (KHTML, like Gecko) Chrome/.0.0.0 Safari/537.36 + + Possible values: + - Windows NT 10.0; Win64; x64 + - Macintosh; Intel Mac OS X 10_15_7 + - X11; Linux x86_64 + - X11; CrOS x86_64 14541.0.0 + - Fuchsia + + # Mobile & Tablet: (except iOS/Android WebView) + --- + Format: + Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/.0.0.0 Safari/537.36 + + Possible values: + - "Mobile" + - "" (empty string for Tablets & Desktop) +*/ + +const frozenUA = /Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/; + +const isFrozenUA = str => frozenUA.test(str); + +module.exports = { + isFrozenUA +}; \ No newline at end of file diff --git a/test/mocha-test-helpers.js b/test/mocha-test-helpers.js new file mode 100644 index 00000000..b954e73c --- /dev/null +++ b/test/mocha-test-helpers.js @@ -0,0 +1,35 @@ +const { isFrozenUA } = require('ua-parser-js/helpers'); +const assert = require('assert'); + +describe('isFrozenUA', () => { + it('Returns whether a user agent is frozen', () => { + + const regularWindowsUA = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.1234.56 Safari/537.36"; + const freezedWindowsUA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36"; + + const regularMacUA = ""; + const freezedMacUA = ""; + + const regularLinuxUA = ""; + const freezedLinuxUA = ""; + + const regularCrOSUA = ""; + const freezedCrOSUA = ""; + + const regularFuchsiaUA = ""; + const freezedFuchsiaUA = ""; + + const regularMobileUA = "Mozilla/5.0 (Linux; Android 9; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.1234.56 Mobile Safari/537.36"; + const freezedMobileUA = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36"; + + const regularTabletUA = "Mozilla/5.0 (Linux; Android 9; SM-T810) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.1234.56 Safari/537.36"; + const freezedTabletUA = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36"; + + assert.strictEqual(isFrozenUA(regularWindowsUA), false); + assert.strictEqual(isFrozenUA(freezedWindowsUA), true); + assert.strictEqual(isFrozenUA(regularMobileUA), false); + assert.strictEqual(isFrozenUA(freezedMobileUA), true); + assert.strictEqual(isFrozenUA(regularTabletUA), false); + assert.strictEqual(isFrozenUA(freezedTabletUA), true); + }); +}); \ No newline at end of file