diff --git a/src/constants.js b/src/constants.js index b2b3017..2d06c97 100644 --- a/src/constants.js +++ b/src/constants.js @@ -7,6 +7,7 @@ export const BROWSER_ALIASES_MAP = { BaiduSpider: 'baiduspider', Bada: 'bada', BingCrawler: 'bingcrawler', + Brave: 'brave', BlackBerry: 'blackberry', 'ChatGPT-User': 'chatgpt_user', Chrome: 'chrome', @@ -78,6 +79,7 @@ export const BROWSER_MAP = { bada: 'Bada', bingcrawler: 'BingCrawler', blackberry: 'BlackBerry', + brave: 'Brave', chatgpt_user: 'ChatGPT-User', chrome: 'Chrome', claudebot: 'ClaudeBot', diff --git a/src/parser-browsers.js b/src/parser-browsers.js index 41bae20..a6567e1 100644 --- a/src/parser-browsers.js +++ b/src/parser-browsers.js @@ -1037,6 +1037,28 @@ const browsersList = [ return browser; }, }, + /* Brave Browser */ + { + test(parser) { + // Check Client Hints brands for Brave + return parser.hasBrand('Brave'); + }, + describe(ua, parser) { + const browser = { + name: 'Brave', + }; + + if (parser) { + const hintsVersion = parser.getBrandVersion('Brave'); + if (hintsVersion) { + browser.version = hintsVersion; + return browser; + } + } + + return browser; + }, + }, { test: [/chromium/i], describe(ua) { diff --git a/test/unit/parser.js b/test/unit/parser.js index 3a78014..b86fe25 100644 --- a/test/unit/parser.js +++ b/test/unit/parser.js @@ -383,3 +383,33 @@ test('Parser with Edge client hints', (t) => { t.true(p.hasBrand('Chromium')); t.is(p.getBrandVersion('Microsoft Edge'), '131'); }); + +const BRAVE_HINTS = { + brands: [ + { brand: 'Brave', version: '144' }, + { brand: 'Chromium', version: '131' }, + { brand: 'Not_A Brand', version: '24' }, + ], + mobile: false, + platform: 'Windows', + platformVersion: '15.0.0', +}; + +const BRAVE_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'; + +test('Parser detects Brave from client hints brands', (t) => { + const p = new Parser(BRAVE_UA, false, BRAVE_HINTS); + t.is(p.getBrowserName(), 'Brave'); + t.is(p.getBrowserVersion(), '144'); +}); + +test('Parser.hasBrand detects Brave', (t) => { + const p = new Parser(BRAVE_UA, false, BRAVE_HINTS); + t.true(p.hasBrand('Brave')); + t.true(p.hasBrand('brave')); +}); + +test('Parser.getBrandVersion returns version for Brave', (t) => { + const p = new Parser(BRAVE_UA, false, BRAVE_HINTS); + t.is(p.getBrandVersion('Brave'), '144'); +});