From 5b375b90d540642a4243a5c1eb24e7f493e21d3c Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Sat, 16 Nov 2024 21:17:51 +0700 Subject: [PATCH] [submodule:helpers] Enable directly pass user-agent as an input to `isAppleSilicon()` / `isBot()` / `isChromeFamily()` --- src/helpers/ua-parser-helpers.d.ts | 6 +++--- src/helpers/ua-parser-helpers.js | 17 +++++++++++++---- test/mocha-test-helpers.js | 9 +++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/helpers/ua-parser-helpers.d.ts b/src/helpers/ua-parser-helpers.d.ts index 10398d6..0e61477 100644 --- a/src/helpers/ua-parser-helpers.d.ts +++ b/src/helpers/ua-parser-helpers.d.ts @@ -5,9 +5,9 @@ import { IResult } from "../main/ua-parser"; declare function getDeviceVendor(model: string): string | undefined; -declare function isAppleSilicon(res: IResult, useFeatureDetection?: boolean): boolean; -declare function isBot(res: IResult): boolean; -declare function isChromeFamily(res: IResult): boolean; +declare function isAppleSilicon(resultOrUA: IResult | string): boolean; +declare function isBot(resultOrUA: IResult | string): boolean; +declare function isChromeFamily(resultOrUA: IResult | string): boolean; declare function isElectron(): boolean; declare function isFromEU(): boolean; declare function isFrozenUA(ua: string): boolean; diff --git a/src/helpers/ua-parser-helpers.js b/src/helpers/ua-parser-helpers.js index 4a09605..f3f19c8 100644 --- a/src/helpers/ua-parser-helpers.js +++ b/src/helpers/ua-parser-helpers.js @@ -9,18 +9,22 @@ const { UAParser } = require('../main/ua-parser'); const { CPU, OS, Engine } = require('../enums/ua-parser-enums'); +const { Bots } = require('../extensions/ua-parser-extensions'); const { isFromEU } = require('detect-europe-js'); const { isFrozenUA } = require('ua-is-frozen'); const { isStandalonePWA } = require('is-standalone-pwa'); +const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value; + const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor; -const isAppleSilicon = (res) => { +const isAppleSilicon = (resultOrUA) => { + const res = toResult(resultOrUA); if (res.os.is(OS.MACOS)) { if (res.cpu.is(CPU.ARM)) { return true; } - if (typeof window !== 'undefined') { + if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') { try { const canvas = document.createElement('canvas'); const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); @@ -37,9 +41,14 @@ const isAppleSilicon = (res) => { return false; } -const isBot = (res) => ['cli', 'crawler', 'fetcher', 'library'].includes(res.browser.type); +const isBot = (resultOrUA) => [ + 'cli', + 'crawler', + 'fetcher', + 'library' + ].includes(toResult(resultOrUA, Bots).browser.type); -const isChromeFamily = (res) => res.engine.is(Engine.BLINK); +const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK); const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js / electron\//i.test(navigator?.userAgent)); // browser diff --git a/test/mocha-test-helpers.js b/test/mocha-test-helpers.js index ab61cd9..a2f25cd 100644 --- a/test/mocha-test-helpers.js +++ b/test/mocha-test-helpers.js @@ -28,7 +28,9 @@ describe('isAppleSilicon', () => { const macIntel = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0'; assert.equal(isAppleSilicon(UAParser(macIntel)), false); + assert.equal(isAppleSilicon(macIntel), false); assert.equal(isAppleSilicon(UAParser(macARM)), true); + assert.equal(isAppleSilicon(macARM), true); }); }); @@ -46,6 +48,11 @@ describe('isBot', () => { assert.equal(isBot(botParser.setUA(ahrefsBot).getResult()), true); assert.equal(isBot(botParser.setUA(scrapy).getResult()), true); assert.equal(isBot(botParser.setUA(thunderbird).getResult()), false); + + assert.equal(isBot(ahrefsBot), true); + assert.equal(isBot(firefox), false); + assert.equal(isBot(scrapy), true); + assert.equal(isBot(thunderbird), false); }); }); @@ -57,5 +64,7 @@ describe('isChromeFamily', () => { assert.equal(isChromeFamily(UAParser(edge)), true); assert.equal(isChromeFamily(UAParser(firefox)), false); + assert.equal(isChromeFamily(edge), true); + assert.equal(isChromeFamily(firefox), false); }); }); \ No newline at end of file