Compare commits

..

1 Commits

12 changed files with 720 additions and 1280 deletions

View File

@ -2,18 +2,15 @@
/* jshint esversion: 6 */ /* jshint esversion: 6 */
const fs = require('fs'); const fs = require('fs');
const defaultReplacements = { const generateMJS = (module) => {
mjs: [
[/const (.+?)\s*=\s*require\(\'\.(.+)\'\)/ig, 'import $1 from \'\.$2.mjs\''],
[/const (.+?)\s*=\s*require\(\'(.+)\'\)/ig, 'import $1 from \'$2\''],
[/module\.exports =/ig, 'export']
]
}
const generateFile = (module) => {
let { src, dest, title, replacements } = module; let { src, dest, title, replacements } = module;
let text = fs.readFileSync(src, 'utf-8'); let text = fs.readFileSync(src, 'utf-8');
replacements.push(
[/const (.+?)\s*=\s*require\(\'\.(.+)\'\)/ig, 'import $1 from \'\.$2.mjs\''],
[/const (.+?)\s*=\s*require\(\'(.+)\'\)/ig, 'import $1 from \'$2\''],
[/module\.exports =/ig, 'export']
);
replacements.forEach(rep => { replacements.forEach(rep => {
text = text.replace(rep[0], rep[1]); text = text.replace(rep[0], rep[1]);
}); });
@ -21,54 +18,42 @@ const generateFile = (module) => {
console.log(`Generate ${dest}`); console.log(`Generate ${dest}`);
fs.writeFileSync(dest, fs.writeFileSync(dest,
`// ${title} `// Generated ESM version of ${title}
// DO NOT EDIT THIS FILE! // DO NOT EDIT THIS FILE!
// Source: /${src} // Source: /${src}
${text}`, 'utf-8'); ${text}`, 'utf-8');
}; };
const files = [ const modules = [
{ {
src : 'src/main/ua-parser.js', src : 'src/main/ua-parser.js',
dest : 'src/main/ua-parser.mjs', dest : 'src/main/ua-parser.mjs',
title : 'Generated ESM version of ua-parser-js', title : 'ua-parser-js',
replacements : [ replacements : [
[/\(func[\s\S]+strict\';/ig, ''], [/\(func[\s\S]+strict\';/ig, ''],
[/esversion\: 3/ig, 'esversion: 6'], [/esversion\: 3/ig, 'esversion: 6'],
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'], [/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};']
...defaultReplacements.mjs
] ]
}, },{
{
src : 'src/enums/ua-parser-enums.js', src : 'src/enums/ua-parser-enums.js',
dest :'src/enums/ua-parser-enums.mjs', dest :'src/enums/ua-parser-enums.mjs',
title : 'Generated ESM version of ua-parser-js/enums', title : 'ua-parser-js/enums',
replacements : [...defaultReplacements.mjs] replacements : []
},
{
src : 'src/enums/ua-parser-enums.js',
dest :'src/enums/ua-parser-enums.d.ts',
title : 'Generated type declarations of ua-parser-js/enums',
replacements : [
[/(const .+) = object\.freeze\(/ig, 'export $1: Readonly<'],
[/(const .+) =( .+;)/ig, 'export $1: typeof$2'],
[/}\);/ig, '}>;'],
[/module\.exports =.+/igs, '']
]
}, },
{ {
src : 'src/extensions/ua-parser-extensions.js', src : 'src/extensions/ua-parser-extensions.js',
dest : 'src/extensions/ua-parser-extensions.mjs', dest : 'src/extensions/ua-parser-extensions.mjs',
title : 'Generated ESM version of ua-parser-js/extensions', title : 'ua-parser-js/extensions',
replacements : [...defaultReplacements.mjs] replacements : []
}, },
{ {
src : 'src/helpers/ua-parser-helpers.js', src : 'src/helpers/ua-parser-helpers.js',
dest : 'src/helpers/ua-parser-helpers.mjs', dest : 'src/helpers/ua-parser-helpers.mjs',
title : 'Generated ESM version of ua-parser-js/helpers', title : 'ua-parser-js/helpers',
replacements : [...defaultReplacements.mjs] replacements : []
} }
]; ];
files.forEach(module => generateFile(module)); modules.forEach(module => generateMJS(module));

View File

@ -1,171 +1,160 @@
// Generated type declarations of ua-parser-js/enums // Type definitions for Enums submodule of UAParser.js v2.0.4
// DO NOT EDIT THIS FILE! // Project: https://github.com/faisalman/ua-parser-js
// Source: /src/enums/ua-parser-enums.js // Definitions by: Faisal Salman <https://github.com/faisalman>
///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.4
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
//////////////////////////////////////////////
/*jshint esversion: 6 */
export const BrowserName: Readonly<{ export const BrowserName: Readonly<{
'115': '115', '115': "115",
'2345': '2345', '2345': "2345",
'360': '360', '360': "360",
ALIPAY: 'Alipay', ALIPAY: "Alipay",
AMAYA: 'Amaya', AMAYA: "Amaya",
ANDROID: 'Android Browser', ANDROID: "Android Browser",
ARORA: 'Arora', ARORA: "Arora",
AVANT: 'Avant', AVANT: "Avant",
AVAST: 'Avast Secure Browser', AVAST: "Avast Secure Browser",
AVG: 'AVG Secure Browser', AVG: "AVG Secure Browser",
BAIDU: 'Baidu Browser', BAIDU: "Baidu Browser",
BASILISK: 'Basilisk', BASILISK: "Basilisk",
BLAZER: 'Blazer', BLAZER: "Blazer",
BOLT: 'Bolt', BOLT: "Bolt",
BOWSER: 'Bowser', BOWSER: "Bowser",
BRAVE: 'Brave', BRAVE: "Brave",
CAMINO: 'Camino', CAMINO: "Camino",
CHIMERA: 'Chimera', CHIMERA: "Chimera",
CHROME: 'Chrome', CHROME: "Chrome",
CHROME_HEADLESS: 'Chrome Headless', CHROME_HEADLESS: "Chrome Headless",
CHROME_MOBILE: 'Mobile Chrome', CHROME_MOBILE: "Mobile Chrome",
CHROME_WEBVIEW: 'Chrome WebView', CHROME_WEBVIEW: "Chrome WebView",
CHROMIUM: 'Chromium', CHROMIUM: "Chromium",
COBALT: 'Cobalt', COBALT: "Cobalt",
COC_COC: 'Coc Coc', COC_COC: "Coc Coc",
CONKEROR: 'Conkeror', CONKEROR: "Conkeror",
DAUM: 'Daum', DAUM: "Daum",
DILLO: 'Dillo', DILLO: "Dillo",
DOLPHIN: 'Dolphin', DOLPHIN: "Dolphin",
DOOBLE: 'Dooble', DOOBLE: 'Dooble',
DORIS: 'Doris', DORIS: "Doris",
DRAGON: 'Dragon', DRAGON: "Dragon",
DUCKDUCKGO: 'DuckDuckGo', DUCKDUCKGO: "DuckDuckGo",
ECOSIA: 'Ecosia', ECOSIA: "Ecosia",
EDGE: 'Edge', EDGE: "Edge",
EDGE_WEBVIEW: 'Edge WebView', EDGE_WEBVIEW: "Edge WebView",
EDGE_WEBVIEW2: 'Edge WebView2', EDGE_WEBVIEW2: "Edge WebView2",
EPIPHANY: 'Epiphany', EPIPHANY: "Epiphany",
FACEBOOK: 'Facebook', FACEBOOK: "Facebook",
FALKON: 'Falkon', FALKON: "Falkon",
FIREBIRD: 'Firebird', FIREBIRD: "Firebird",
FIREFOX: 'Firefox', FIREFOX: "Firefox",
FIREFOX_FOCUS: 'Firefox Focus', FIREFOX_FOCUS: "Firefox Focus",
FIREFOX_MOBILE: 'Mobile Firefox', FIREFOX_MOBILE: "Mobile Firefox",
FIREFOX_REALITY: 'Firefox Reality', FIREFOX_REALITY: "Firefox Reality",
FENNEC: 'Fennec', FENNEC: "Fennec",
FLOCK: 'Flock', FLOCK: "Flock",
FLOW: 'Flow', FLOW: "Flow",
GO: 'GoBrowser', GO: "GoBrowser",
GOOGLE_SEARCH: 'GSA', GOOGLE_SEARCH: "GSA",
HELIO: 'Helio', HELIO: "Helio",
HEYTAP: 'HeyTap', HEYTAP: "HeyTap",
HONOR: 'Honor', HONOR: "Honor",
HUAWEI: 'Huawei Browser', HUAWEI: "Huawei Browser",
ICAB: 'iCab', ICAB: "iCab",
ICE: 'ICE Browser', ICE: "ICE Browser",
ICEAPE: 'IceApe', ICEAPE: "IceApe",
ICECAT: 'IceCat', ICECAT: "IceCat",
ICEDRAGON: 'IceDragon', ICEDRAGON: "IceDragon",
ICEWEASEL: 'IceWeasel', ICEWEASEL: "IceWeasel",
IE: 'IE', IE: "IE",
INSTAGRAM: 'Instagram', INSTAGRAM: "Instagram",
IRIDIUM: 'Iridium', IRIDIUM: "Iridium",
IRON: 'Iron', IRON: "Iron",
JASMINE: 'Jasmine', JASMINE: "Jasmine",
KONQUEROR: 'Konqueror', KONQUEROR: "Konqueror",
KAKAO: 'KakaoTalk', KAKAO: "KakaoTalk",
KHTML: 'KHTML', KHTML: "KHTML",
K_MELEON: 'K-Meleon', K_MELEON: "K-Meleon",
KLAR: 'Klar', KLAR: "Klar",
KLARNA: 'Klarna', KLARNA: "Klarna",
KINDLE: 'Kindle', KINDLE: "Kindle",
LENOVO: 'Smart Lenovo Browser', LENOVO: "Smart Lenovo Browser",
LADYBIRD: 'Ladybird', LADYBIRD: "Ladybird",
LG: 'LG Browser', LG: "LG Browser",
LIBREWOLF: 'LibreWolf', LIBREWOLF: "LibreWolf",
LIEBAO: 'LBBROWSER', LIEBAO: "LBBROWSER",
LINE: 'Line', LINE: "Line",
LINKEDIN: 'LinkedIn', LINKEDIN: "LinkedIn",
LINKS: 'Links', LINKS: "Links",
LUNASCAPE: 'Lunascape', LUNASCAPE: "Lunascape",
LYNX: 'Lynx', LYNX: "Lynx",
MAEMO: 'Maemo Browser', MAEMO: "Maemo Browser",
MAXTHON: 'Maxthon', MAXTHON: "Maxthon",
MIDORI: 'Midori', MIDORI: "Midori",
MINIMO: 'Minimo', MINIMO: "Minimo",
MIUI: 'MIUI Browser', MIUI: "MIUI Browser",
MOZILLA: 'Mozilla', MOZILLA: "Mozilla",
MOSAIC: 'Mosaic', MOSAIC: "Mosaic",
NAVER: 'Naver', NAVER: "Naver",
NETFRONT: 'NetFront', NETFRONT: "NetFront",
NETSCAPE: 'Netscape', NETSCAPE: "Netscape",
NETSURF: 'Netsurf', NETSURF: "Netsurf",
NOKIA: 'Nokia Browser', NOKIA: "Nokia Browser",
OBIGO: 'Obigo', OBIGO: "Obigo",
OCULUS: 'Oculus Browser', OCULUS: "Oculus Browser",
OMNIWEB: 'OmniWeb', OMNIWEB: "OmniWeb",
OPERA: 'Opera', OPERA: "Opera",
OPERA_COAST: 'Opera Coast', OPERA_COAST: "Opera Coast",
OPERA_GX: 'Opera GX', OPERA_GX: "Opera GX",
OPERA_MINI: 'Opera Mini', OPERA_MINI: "Opera Mini",
OPERA_MOBI: 'Opera Mobi', OPERA_MOBI: "Opera Mobi",
OPERA_TABLET: 'Opera Tablet', OPERA_TABLET: "Opera Tablet",
OPERA_TOUCH: 'Opera Touch', OPERA_TOUCH: "Opera Touch",
OTTER: 'Otter', OTTER: "Otter",
OVI: 'OviBrowser', OVI: "OviBrowser",
PALEMOON: 'PaleMoon', PALEMOON: "PaleMoon",
PHANTOMJS: 'PhantomJS', PHANTOMJS: "PhantomJS",
PHOENIX: 'Phoenix', PHOENIX: "Phoenix",
PICOBROWSER: 'Pico Browser', PICOBROWSER: "Pico Browser",
POLARIS: 'Polaris', POLARIS: "Polaris",
PUFFIN: 'Puffin', PUFFIN: "Puffin",
QQ: 'QQBrowser', QQ: "QQBrowser",
QQ_LITE: 'QQBrowserLite', QQ_LITE: "QQBrowserLite",
QUARK: 'Quark', QUARK: "Quark",
QUPZILLA: 'QupZilla', QUPZILLA: "QupZilla",
QUTEBROWSER: 'qutebrowser', QUTEBROWSER: "qutebrowser",
REKONQ: 'rekonq', REKONQ: "rekonq",
ROCKMELT: 'Rockmelt', ROCKMELT: "Rockmelt",
SAFARI: 'Safari', SAFARI: "Safari",
SAFARI_MOBILE: 'Mobile Safari', SAFARI_MOBILE: "Mobile Safari",
SAILFISH: 'Sailfish Browser', SAILFISH: "Sailfish Browser",
SAMSUNG: 'Samsung Internet', SAMSUNG: "Samsung Internet",
SEAMONKEY: 'SeaMonkey', SEAMONKEY: "SeaMonkey",
SILK: 'Silk', SILK: "Silk",
SKYFIRE: 'Skyfire', SKYFIRE: "Skyfire",
SLEIPNIR: 'Sleipnir', SLEIPNIR: "Sleipnir",
SLIMBOAT: 'SlimBoat', SLIMBOAT: "SlimBoat",
SLIMBROWSER: 'SlimBrowser', SLIMBROWSER: "SlimBrowser",
SLIMJET: 'Slimjet', SLIMJET: "Slimjet",
SNAPCHAT: 'Snapchat', SNAPCHAT: "Snapchat",
SOGOU_EXPLORER: 'Sogou Explorer', SOGOU_EXPLORER: "Sogou Explorer",
SOGOU_MOBILE: 'Sogou Mobile', SOGOU_MOBILE: "Sogou Mobile",
SURF: 'Surf', SURF: "Surf",
SWIFTFOX: 'Swiftfox', SWIFTFOX: "Swiftfox",
TESLA: 'Tesla', TESLA: "Tesla",
TIKTOK: 'TikTok', TIKTOK: "TikTok",
TIZEN: 'Tizen Browser', TIZEN: "Tizen Browser",
TWITTER: 'Twitter', TWITTER: "Twitter",
UC: 'UCBrowser', UC: "UCBrowser",
UP: 'UP.Browser', UP: "UP.Browser",
VIVALDI: 'Vivaldi', VIVALDI: "Vivaldi",
VIVO: 'Vivo Browser', VIVO: "Vivo Browser",
W3M: 'w3m', W3M: "w3m",
WATERFOX: 'Waterfox', WATERFOX: "Waterfox",
WEBKIT: 'WebKit', WEBKIT: "WebKit",
WECHAT: 'WeChat', WECHAT: "WeChat",
WEIBO: 'Weibo', WEIBO: "Weibo",
WHALE: 'Whale', WHALE: "Whale",
WOLVIC: 'Wolvic', WOLVIC: "Wolvic",
YANDEX: 'Yandex', YANDEX: "Yandex",
ZALO: 'Zalo' ZALO: "Zalo",
// TODO : test!
}>; }>;
/** /**
* @deprecated Use `BrowserName` instead * @deprecated Use `BrowserName` instead
@ -173,34 +162,34 @@ export const BrowserName: Readonly<{
export const Browser: typeof BrowserName; export const Browser: typeof BrowserName;
export const BrowserType: Readonly<{ export const BrowserType: Readonly<{
CRAWLER: 'crawler', CRAWLER: "crawler",
CLI: 'cli', CLI: "cli",
EMAIL: 'email', EMAIL: "email",
FETCHER: 'fetcher', FETCHER: "fetcher",
INAPP: 'inapp', INAPP: "inapp",
MEDIAPLAYER: 'mediaplayer', MEDIAPLAYER: "mediaplayer",
LIBRARY: 'library' LIBRARY: "library",
}>; }>;
export const CPUArch: Readonly<{ export const CPUArch: Readonly<{
'68K': '68k', '68K': "68k",
ALPHA: 'alpha', ALPHA: "alpha",
ARM : 'arm', ARM: "arm",
ARM_64: 'arm64', ARM_64: "arm64",
ARM_HF: 'armhf', ARM_HF: "armhf",
AVR: 'avr', AVR: "avr",
AVR_32: 'avr32', AVR_32: "avr32",
IA64: 'ia64', IA64: "ia64",
IRIX: 'irix', IRIX: "irix",
IRIX_64: 'irix64', IRIX_64: "irix64",
MIPS: 'mips', MIPS: "mips",
MIPS_64: 'mips64', MIPS_64: "mips64",
PA_RISC: 'pa-risc', PA_RISC: "pa-risc",
PPC: 'ppc', PPC: "ppc",
SPARC: 'sparc', SPARC: "sparc",
SPARC_64: 'sparc64', SPARC_64: "sparc64",
X86: 'ia32', X86: "ia32",
X86_64: 'amd64' X86_64: "amd64",
}>; }>;
/** /**
* @deprecated Use `CPUArch` instead * @deprecated Use `CPUArch` instead
@ -208,14 +197,14 @@ export const CPUArch: Readonly<{
export const CPU: typeof CPUArch; export const CPU: typeof CPUArch;
export const DeviceType: Readonly<{ export const DeviceType: Readonly<{
CONSOLE: 'console', CONSOLE: "console",
DESKTOP: 'desktop', DESKTOP: "desktop",
EMBEDDED: 'embedded', EMBEDDED: "embedded",
MOBILE: 'mobile', MOBILE: "mobile",
SMARTTV: 'smarttv', SMARTTV: "smarttv",
TABLET: 'tablet', TABLET: "tablet",
WEARABLE: 'wearable', WEARABLE: "wearable",
XR: 'xr' XR: "xr"
}>; }>;
/** /**
* @deprecated Use `DeviceType` instead * @deprecated Use `DeviceType` instead
@ -223,80 +212,78 @@ export const DeviceType: Readonly<{
export const Device: typeof DeviceType; export const Device: typeof DeviceType;
export const DeviceVendor: Readonly<{ export const DeviceVendor: Readonly<{
ACER: 'Acer', ACER: "Acer",
ADVAN: 'Advan', ADVAN: "Advan",
ALCATEL: 'Alcatel', ALCATEL: "Alcatel",
APPLE: 'Apple', APPLE: "Apple",
AMAZON: 'Amazon', AMAZON: "Amazon",
ARCHOS: 'Archos', ARCHOS: "Archos",
ASUS: 'ASUS', ASUS: "ASUS",
ATT: 'AT&T', ATT: "AT&T",
BENQ: 'BenQ', BENQ: "BenQ",
BLACKBERRY: 'BlackBerry', BLACKBERRY: "BlackBerry",
BLU: 'BLU', BLU: "BLU",
CAT: 'Cat', CAT: "Cat",
DELL: 'Dell', DELL: "Dell",
ENERGIZER: 'Energizer', ENERGIZER: "Energizer",
ESSENTIAL: 'Essential', ESSENTIAL: "Essential",
FACEBOOK: 'Facebook', FACEBOOK: "Facebook",
FAIRPHONE: 'Fairphone', FAIRPHONE: "Fairphone",
GEEKSPHONE: 'GeeksPhone', GEEKSPHONE: "GeeksPhone",
GENERIC: 'Generic', GENERIC: "Generic",
GOOGLE: 'Google', GOOGLE: "Google",
HMD: 'HMD', HMD: "HMD",
HP: 'HP', HP: "HP",
HTC: 'HTC', HTC: "HTC",
HUAWEI: 'Huawei', HUAWEI: "Huawei",
IMO: 'IMO', IMO: "IMO",
INFINIX: 'Infinix', INFINIX: "Infinix",
ITEL: 'itel', ITEL: "itel",
JOLLA: 'Jolla', JOLLA: "Jolla",
KOBO: 'Kobo', KOBO: "Kobo",
LAVA: 'Lava', LAVA: "Lava",
LENOVO: 'Lenovo', LENOVO: "Lenovo",
LG: 'LG', LG: "LG",
MEIZU: 'Meizu', MEIZU: "Meizu",
MICROMAX: 'Micromax', MICROMAX: "Micromax",
MICROSOFT: 'Microsoft', MICROSOFT: "Microsoft",
MOTOROLA: 'Motorola', MOTOROLA: "Motorola",
NEXIAN: 'Nexian', NEXIAN: "Nexian",
NINTENDO: 'Nintendo', NINTENDO: "Nintendo",
NOKIA: 'Nokia', NOKIA: "Nokia",
NOTHING: 'Nothing', NOTHING: "Nothing",
NVIDIA: 'Nvidia', NVIDIA: "Nvidia",
ONEPLUS: 'OnePlus', ONEPLUS: "OnePlus",
OPPO: 'OPPO', OPPO: "OPPO",
OUYA: 'Ouya', OUYA: "Ouya",
PALM: 'Palm', PALM: "Palm",
PANASONIC: 'Panasonic', PANASONIC: "Panasonic",
PEBBLE: 'Pebble', PEBBLE: "Pebble",
PHILIPS: 'Philips', PHILIPS: "Philips",
PICO: 'Pico', PICO: "Pico",
POLYTRON: 'Polytron', POLYTRON: "Polytron",
REALME: 'Realme', REALME: "Realme",
RETROID: 'Retroid', RETROID: "Retroid",
RIM: 'RIM', RIM: "RIM",
ROKU: 'Roku', ROKU: "Roku",
SAMSUNG: 'Samsung', SAMSUNG: "Samsung",
SHARP: 'Sharp', SHARP: "Sharp",
SIEMENS: 'Siemens', SIEMENS: "Siemens",
SMARTFREN: 'Smartfren', SMARTFREN: "Smartfren",
SONY: 'Sony', SONY: "Sony",
SPRINT: 'Sprint', SPRINT: "Sprint",
TCL: 'TCL', TCL: "TCL",
TECHNISAT: 'TechniSAT', TECHNISAT: "TechniSAT",
TECNO: 'Tecno', TECNO: "Tecno",
TESLA: 'Tesla', TESLA: "Tesla",
ULEFONE: 'Ulefone', ULEFONE: "Ulefone",
VIVO: 'Vivo', VIVO: "Vivo",
VIZIO: 'Vizio', VIZIO: "Vizio",
VODAFONE: 'Vodafone', VODAFONE: "Vodafone",
XBOX: 'Xbox', XBOX: "Xbox",
XIAOMI: 'Xiaomi', XIAOMI: "Xiaomi",
ZEBRA: 'Zebra', ZEBRA: "Zebra",
ZTE: 'ZTE', ZTE: "ZTE",
// TODO : test!
}>; }>;
/** /**
* @deprecated Use `DeviceVendor` instead * @deprecated Use `DeviceVendor` instead
@ -304,26 +291,26 @@ export const DeviceVendor: Readonly<{
export const Vendor: typeof DeviceVendor; export const Vendor: typeof DeviceVendor;
export const EngineName: Readonly<{ export const EngineName: Readonly<{
AMAYA: 'Amaya', AMAYA: "Amaya",
ARKWEB: 'ArkWeb', ARKWEB: "ArkWeb",
BLINK: 'Blink', BLINK: "Blink",
EDGEHTML: 'EdgeHTML', EDGEHTML: "EdgeHTML",
FLOW: 'Flow', FLOW: "Flow",
GECKO: 'Gecko', GECKO: "Gecko",
GOANNA: 'Goanna', GOANNA: "Goanna",
ICAB: 'iCab', ICAB: "iCab",
KHTML: 'KHTML', KHTML: "KHTML",
LIBWEB: 'LibWeb', LIBWEB: "LibWeb",
LINKS: 'Links', LINKS: "Links",
LYNX: 'Lynx', LYNX: "Lynx",
NETFRONT: 'NetFront', NETFRONT: "NetFront",
NETSURF: 'NetSurf', NETSURF: "NetSurf",
PRESTO: 'Presto', PRESTO: "Presto",
SERVO: 'Servo', SERVO: "Servo",
TASMAN: 'Tasman', TASMAN: "Tasman",
TRIDENT: 'Trident', TRIDENT: "Trident",
W3M: 'w3m', W3M: "w3m",
WEBKIT: 'WebKit' WEBKIT: "WebKit",
}>; }>;
/** /**
* @deprecated Use `EngineName` instead * @deprecated Use `EngineName` instead
@ -331,100 +318,98 @@ export const EngineName: Readonly<{
export const Engine: typeof EngineName; export const Engine: typeof EngineName;
export const OSName: Readonly<{ export const OSName: Readonly<{
AIX: 'AIX', AIX: "AIX",
AMIGA_OS: 'Amiga OS', AMIGA_OS: "Amiga OS",
ANDROID: 'Android', ANDROID: "Android",
ANDROID_X86: 'Android-x86', ANDROID_X86: "Android-x86",
ARCAOS: 'ArcaOS', ARCAOS: "ArcaOS",
ARCH: 'Arch', ARCH: "Arch",
BADA: 'Bada', BADA: "Bada",
BEOS: 'BeOS', BEOS: "BeOS",
BLACKBERRY: 'BlackBerry', BLACKBERRY: "BlackBerry",
CENTOS: 'CentOS', CENTOS: "CentOS",
CHROME_OS: 'Chrome OS', CHROME_OS: "Chrome OS",
CHROMECAST: 'Chromecast', CHROMECAST: "Chromecast",
CHROMECAST_ANDROID: 'Chromecast Android', CHROMECAST_ANDROID: "Chromecast Android",
CHROMECAST_FUCHSIA: 'Chromecast Fuchsia', CHROMECAST_FUCHSIA: "Chromecast Fuchsia",
CHROMECAST_LINUX: 'Chromecast Linux', CHROMECAST_LINUX: "Chromecast Linux",
CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker', CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker",
CONTIKI: 'Contiki', CONTIKI: "Contiki",
DEBIAN: 'Debian', DEBIAN: "Debian",
DEEPIN: 'Deepin', DEEPIN: "Deepin",
DRAGONFLY: 'DragonFly', DRAGONFLY: "DragonFly",
ELEMENTARY_OS: 'elementary OS', ELEMENTARY_OS: "elementary OS",
FEDORA: 'Fedora', FEDORA: "Fedora",
FIREFOX_OS: 'Firefox OS', FIREFOX_OS: "Firefox OS",
FREEBSD: 'FreeBSD', FREEBSD: "FreeBSD",
FUCHSIA: 'Fuchsia', FUCHSIA: "Fuchsia",
GENTOO: 'Gentoo', GENTOO: "Gentoo",
GHOSTBSD: 'GhostBSD', GHOSTBSD: "GhostBSD",
GNU: 'GNU', GNU: "GNU",
HAIKU: 'Haiku', HAIKU: "Haiku",
HARMONYOS: 'HarmonyOS', HARMONYOS: "HarmonyOS",
HP_UX: 'HP-UX', HP_UX: "HP-UX",
HURD: 'Hurd', HURD: "Hurd",
IOS: 'iOS', IOS: "iOS",
JOLI: 'Joli', JOLI: "Joli",
KAIOS: 'KaiOS', KAIOS: "KaiOS",
KNOPPIX: 'Knoppix', KNOPPIX: "Knoppix",
KUBUNTU: 'Kubuntu', KUBUNTU: "Kubuntu",
LINPUS: 'Linpus', LINPUS: "Linpus",
LINSPIRE: 'Linspire', LINSPIRE: "Linspire",
LINUX: 'Linux', LINUX: "Linux",
MACOS: 'macOS', MACOS: "macOS",
MAEMO: 'Maemo', MAEMO: "Maemo",
MAGEIA: 'Mageia', MAGEIA: "Mageia",
MANDRIVA: 'Mandriva', MANDRIVA: "Mandriva",
MANJARO: 'Manjaro', MANJARO: "Manjaro",
MEEGO: 'MeeGo', MEEGO: "MeeGo",
MINIX: 'Minix', MINIX: "Minix",
MINT: 'Mint', MINT: "Mint",
MORPH_OS: 'Morph OS', MORPH_OS: "Morph OS",
NETBSD: 'NetBSD', NETBSD: "NetBSD",
NETRANGE: 'NetRange', NETRANGE: "NetRange",
NETTV: 'NetTV', NETTV: "NetTV",
NINTENDO: 'Nintendo', NINTENDO: "Nintendo",
OPENHARMONY: 'OpenHarmony', OPENHARMONY: "OpenHarmony",
OPENBSD: 'OpenBSD', OPENBSD: "OpenBSD",
OPENVMS: 'OpenVMS', OPENVMS: "OpenVMS",
OS2: 'OS/2', OS2: "OS/2",
PALM: 'Palm', PALM: "Palm",
PC_BSD: 'PC-BSD', PC_BSD: "PC-BSD",
PCLINUXOS: 'PCLinuxOS', PCLINUXOS: "PCLinuxOS",
PICO: 'Pico', PICO: "Pico",
PLAN9: 'Plan9', PLAN9: "Plan9",
PLAYSTATION: 'PlayStation', PLAYSTATION: "PlayStation",
QNX: 'QNX', QNX: "QNX",
RASPBIAN: 'Raspbian', RASPBIAN: "Raspbian",
REDHAT: 'RedHat', REDHAT: "RedHat",
RIM_TABLET_OS: 'RIM Tablet OS', RIM_TABLET_OS: "RIM Tablet OS",
RISC_OS: 'RISC OS', RISC_OS: "RISC OS",
SABAYON: 'Sabayon', SABAYON: "Sabayon",
SAILFISH: 'Sailfish', SAILFISH: "Sailfish",
SERENITYOS: 'SerenityOS', SERENITYOS: "SerenityOS",
SERIES40: 'Series40', SERIES40: "Series40",
SLACKWARE: 'Slackware', SLACKWARE: "Slackware",
SOLARIS: 'Solaris', SOLARIS: "Solaris",
SUSE: 'SUSE', SUSE: "SUSE",
SYMBIAN: 'Symbian', SYMBIAN: "Symbian",
TIZEN: 'Tizen', TIZEN: "Tizen",
UBUNTU: 'Ubuntu', UBUNTU: "Ubuntu",
UBUNTU_TOUCH: 'Ubuntu Touch', UBUNTU_TOUCH: "Ubuntu Touch",
UNIX: 'Unix', UNIX: "Unix",
VECTORLINUX: 'VectorLinux', VECTORLINUX: "VectorLinux",
WATCHOS: 'watchOS', WATCHOS: "watchOS",
WEBOS: 'WebOS', WEBOS: "WebOS",
WINDOWS: 'Windows', WINDOWS: "Windows",
WINDOWS_CE: 'Windows CE', WINDOWS_CE: "Windows CE",
WINDOWS_IOT: 'Windows IoT', WINDOWS_IOT: "Windows IoT",
WINDOWS_MOBILE: 'Windows Mobile', WINDOWS_MOBILE: "Windows Mobile",
WINDOWS_PHONE: 'Windows Phone', WINDOWS_PHONE: "Windows Phone",
WINDOWS_RT: 'Windows RT', WINDOWS_RT: "Windows RT",
XBOX: 'Xbox', XBOX: "Xbox",
XUBUNTU: 'Xubuntu', XUBUNTU: "Xubuntu",
ZENWALK: 'Zenwalk' ZENWALK: "Zenwalk",
// TODO : test!
}>; }>;
/** /**
* @deprecated Use `OSName` instead * @deprecated Use `OSName` instead
@ -436,7 +421,7 @@ export const OS: typeof OSName;
*/////////////////////////////// *///////////////////////////////
export const Extension: Readonly<{ export const Extension: Readonly<{
BrowserName: { Browser: {
CLIs: { CLIs: {
CURL: 'curl', CURL: 'curl',
ELINKS: 'ELinks', ELINKS: 'ELinks',
@ -456,9 +441,6 @@ export const Extension: Readonly<{
AMAZON_BOT: 'Amazonbot', AMAZON_BOT: 'Amazonbot',
AMAZON_CONTXBOT: 'contxbot', AMAZON_CONTXBOT: 'contxbot',
ANTHROPIC_AI: 'anthropic-ai', ANTHROPIC_AI: 'anthropic-ai',
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
ARCHIVEORG_BOT: 'archive.org_bot', ARCHIVEORG_BOT: 'archive.org_bot',
BAIDU_ADS: 'Baidu-ADS', BAIDU_ADS: 'Baidu-ADS',
BAIDU_SPIDER: 'Baiduspider', BAIDU_SPIDER: 'Baiduspider',
@ -475,6 +457,8 @@ export const Extension: Readonly<{
BYTEDANCE_SPIDER: 'Bytespider', BYTEDANCE_SPIDER: 'Bytespider',
CC_BOT: 'CCBot', CC_BOT: 'CCBot',
CHATGLM_SPIDER: 'ChatGLM-Spider', CHATGLM_SPIDER: 'ChatGLM-Spider',
CLAUDE_WEB: 'Claude-Web',
CLAUDE_BOT: 'ClaudeBot',
COCCOC_BOT_WEB: 'coccocbot-web', COCCOC_BOT_WEB: 'coccocbot-web',
COCCOC_BOT_IMAGE: 'coccocbot-image', COCCOC_BOT_IMAGE: 'coccocbot-image',
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
@ -589,13 +573,11 @@ export const Extension: Readonly<{
}, },
Fetchers: { Fetchers: {
AHREFS_SITEAUDIT: 'AhrefsSiteAudit', AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
ANTHROPIC_CLAUDE_USER: 'Claude-User',
ASANA: 'Asana', ASANA: 'Asana',
BETTER_UPTIME_BOT: 'Better Uptime Bot', BETTER_UPTIME_BOT: 'Better Uptime Bot',
BITLY_BOT: 'bitlybot', BITLY_BOT: 'bitlybot',
BLUESKY: 'Bluesky', BLUESKY: 'Bluesky',
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
COHERE_AI: 'Cohere-AI',
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
@ -685,4 +667,3 @@ export const Extension: Readonly<{
} }
} }
}>; }>;

View File

@ -441,6 +441,7 @@ const Extension = Object.freeze({
WGET: 'wget' WGET: 'wget'
}, },
Crawlers: { Crawlers: {
'360_SPIDER': '360Spider',
AHREFS_BOT: 'AhrefsBot', AHREFS_BOT: 'AhrefsBot',
AI2_BOT: 'AI2Bot', AI2_BOT: 'AI2Bot',
AIHIT_BOT: 'aiHitBot', AIHIT_BOT: 'aiHitBot',
@ -451,9 +452,6 @@ const Extension = Object.freeze({
AMAZON_BOT: 'Amazonbot', AMAZON_BOT: 'Amazonbot',
AMAZON_CONTXBOT: 'contxbot', AMAZON_CONTXBOT: 'contxbot',
ANTHROPIC_AI: 'anthropic-ai', ANTHROPIC_AI: 'anthropic-ai',
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
ARCHIVEORG_BOT: 'archive.org_bot', ARCHIVEORG_BOT: 'archive.org_bot',
BAIDU_ADS: 'Baidu-ADS', BAIDU_ADS: 'Baidu-ADS',
BAIDU_SPIDER: 'Baiduspider', BAIDU_SPIDER: 'Baiduspider',
@ -467,9 +465,11 @@ const Extension = Object.freeze({
BLEX_BOT: 'BLEXBot', BLEX_BOT: 'BLEXBot',
BOTIFY: 'botify', BOTIFY: 'botify',
BRAVE_BOT: 'Bravebot', BRAVE_BOT: 'Bravebot',
BYTEDANCE_BYTESPIDER: 'Bytespider', BYTEDANCE_SPIDER: 'Bytespider',
BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider', CC_BOT: 'CCBot',
COMMON_CRAWL_CCBOT: 'CCBot', CHATGLM_SPIDER: 'ChatGLM-Spider',
CLAUDE_WEB: 'Claude-Web',
CLAUDE_BOT: 'ClaudeBot',
COCCOC_BOT_WEB: 'coccocbot-web', COCCOC_BOT_WEB: 'coccocbot-web',
COCCOC_BOT_IMAGE: 'coccocbot-image', COCCOC_BOT_IMAGE: 'coccocbot-image',
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
@ -491,13 +491,10 @@ const Extension = Object.freeze({
GOOGLE_ADSBOT: 'AdsBot-Google', GOOGLE_ADSBOT: 'AdsBot-Google',
GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile', GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',
GOOGLE_ADSENSE: 'AdSense', GOOGLE_ADSENSE: 'AdSense',
GOOGLE_APIS: 'APIs-Google',
GOOGLE_BOT: 'Googlebot', GOOGLE_BOT: 'Googlebot',
GOOGLE_BOT_IMAGE: 'Googlebot-Image', GOOGLE_BOT_IMAGE: 'Googlebot-Image',
GOOGLE_BOT_NEWS: 'Googlebot-News', GOOGLE_BOT_NEWS: 'Googlebot-News',
GOOGLE_BOT_VIDEO: 'Googlebot-Video', GOOGLE_BOT_VIDEO: 'Googlebot-Video',
GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',
GOOGLE_EXTENDED: 'Google-Extended',
GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool', GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',
GOOGLE_OTHER: 'GoogleOther', GOOGLE_OTHER: 'GoogleOther',
GOOGLE_OTHER_IMAGE: 'GoogleOther-Image', GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',
@ -527,16 +524,16 @@ const Extension = Object.freeze({
MICROSOFT_ADIDXBOT: 'adidxbot', MICROSOFT_ADIDXBOT: 'adidxbot',
MOJEEK_BOT: 'MojeekBot', MOJEEK_BOT: 'MojeekBot',
MOZ_DOTBOT: 'DotBot', MOZ_DOTBOT: 'DotBot',
OMGILI: 'omgili',
OMGILI_BOT: 'omgilibot',
ONCRAWL: 'OnCrawl', ONCRAWL: 'OnCrawl',
ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot', ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',
OPENAI_GPTBOT: 'GPTBot', OPENAI_GPTBOT: 'GPTBot',
OPENAI_SEARCH_BOT: 'OAI-SearchBot', OPENAI_SEARCH: 'OAI-SearchBot',
PERPLEXITY_BOT: 'PerplexityBot', PERPLEXITY_BOT: 'PerplexityBot',
QIHOO_360_SPIDER: '360Spider',
QWANT_BOT: 'Qwantbot', QWANT_BOT: 'Qwantbot',
REPLICATE_BOT: 'Replicate-Bot', REPLICATE_BOT: 'Replicate-Bot',
RUNPOD_BOT: 'RunPod-Bot', RUNPOD_BOT: 'RunPod-Bot',
SB_INTUITIONS_BOT: 'SBIntuitionsBot',
SEEKPORT_BOT: 'SeekportBot', SEEKPORT_BOT: 'SeekportBot',
SEMRUSH_BOT: 'SemrushBot', SEMRUSH_BOT: 'SemrushBot',
SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA', SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',
@ -551,48 +548,15 @@ const Extension = Object.freeze({
TOGETHER_BOT: 'Together-Bot', TOGETHER_BOT: 'Together-Bot',
TURNITIN_BOT: 'TurnitinBot', TURNITIN_BOT: 'TurnitinBot',
TWIN_AGENT: 'TwinAgent', TWIN_AGENT: 'TwinAgent',
VERCEL_V0BOT: 'v0bot',
WEBZIO: 'webzio',
WEBZIO_EXTENDED: 'Webzio-Extended',
WEBZIO_OMGILI: 'omgili',
WEBZIO_OMGILI_BOT: 'omgilibot',
XAI_BOT: 'xAI-Bot', XAI_BOT: 'xAI-Bot',
VERCEL_V0BOT: 'v0bot',
YAHOO_JAPAN: 'Y!J-BRW', YAHOO_JAPAN: 'Y!J-BRW',
YAHOO_SLURP: 'Yahoo! Slurp', YAHOO_SLURP: 'Yahoo! Slurp',
YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',
YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',
YANDEX_ADNET: 'YandexAdNet',
YANDEX_BLOGS: 'YandexBlogs',
YANDEX_BOT: 'YandexBot', YANDEX_BOT: 'YandexBot',
YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',
YANDEX_COMBOT: 'YandexComBot',
YANDEX_FAVICONS: 'YandexFavicons',
YANDEX_IMAGE_RESIZER: 'YandexImageResizer',
YANDEX_IMAGES: 'YandexImages',
YANDEX_MARKET: 'YandexMarket',
YANDEX_MEDIA: 'YandexMedia',
YANDEX_METRIKA: 'YandexMetrika',
YANDEX_MOBILE_BOT: 'YandexMobileBot',
YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',
YANDEX_NEWS: 'YandexNews',
YANDEX_ONTODB: 'YandexOntoDB',
YANDEX_ONTODB_API: 'YandexOntoDBAPI',
YANDEX_PARTNER: 'YandexPartner',
YANDEX_RCA: 'YandexRCA',
YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',
YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',
YANDEX_SPRAV_BOT: 'YandexSpravBot',
YANDEX_TRACKER: 'YandexTracker',
YANDEX_VERTICALS: 'YandexVerticals',
YANDEX_VERTIS: 'YandexVertis',
YANDEX_VIDEO: 'YandexVideo',
YANDEX_VIDEO_PARSER: 'YandexVideoParser',
YANDEX_WEBMASTER: 'YandexWebmaster',
YEP_BOT: 'YepBot', YEP_BOT: 'YepBot',
YETI: 'Yeti', YETI: 'Yeti',
YISOU_SPIDER: 'YisouSpider', YISOU_SPIDER: 'YisouSpider',
YOU_BOT: 'YouBot', YOU_BOT: 'YouBot',
ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',
ZUM_BOT: 'ZumBot' ZUM_BOT: 'ZumBot'
}, },
Emails: { Emails: {
@ -620,18 +584,16 @@ const Extension = Object.freeze({
}, },
Fetchers: { Fetchers: {
AHREFS_SITEAUDIT: 'AhrefsSiteAudit', AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
ANTHROPIC_CLAUDE_USER: 'Claude-User',
ASANA: 'Asana', ASANA: 'Asana',
BETTER_UPTIME_BOT: 'Better Uptime Bot', BETTER_UPTIME_BOT: 'Better Uptime Bot',
BITLY_BOT: 'bitlybot', BITLY_BOT: 'bitlybot',
BLUESKY: 'Bluesky', BLUESKY: 'Bluesky',
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
COHERE_AI: 'Cohere-AI',
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research', GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',
GOOGLE_IMAGEPROXY: 'GoogleImageProxy', GOOGLE_IMAGE_PROXY: 'GoogleImageProxy',
GOOGLE_PAGERENDERER: 'Google-PageRenderer', GOOGLE_PAGERENDERER: 'Google-PageRenderer',
GOOGLE_READ_ALOUD: 'Google-Read-Aloud', GOOGLE_READ_ALOUD: 'Google-Read-Aloud',
GOOGLE_PRODUCER: 'GoogleProducer', GOOGLE_PRODUCER: 'GoogleProducer',
@ -659,15 +621,6 @@ const Extension = Object.freeze({
VERCEL_BOT: 'Vercelbot', VERCEL_BOT: 'Vercelbot',
VERCEL_FLAGS: 'vercelflags', VERCEL_FLAGS: 'vercelflags',
VERCEL_TRACING: 'verceltracing', VERCEL_TRACING: 'verceltracing',
YANDEX_CALENDAR: 'YandexCalendar',
YANDEX_DIRECT: 'YandexDirect',
YANDEX_DIRECTDYN: 'YandexDirectDyn',
YANDEX_DIRECTFETCHER: 'YaDirectFetcher',
YANDEX_FORDOMAIN: 'YandexForDomain',
YANDEX_PAGECHECKER: 'YandexPagechecker',
YANDEX_SEARCHSHOP: 'YandexSearchShop',
YANDEX_SITELINKS: 'YandexSitelinks',
YANDEX_USERPROXY: 'YandexUserproxy',
WHATSAPP: 'WhatsApp', WHATSAPP: 'WhatsApp',
ZOOMINFO_BOT: 'Zoombot' ZOOMINFO_BOT: 'Zoombot'
}, },

View File

@ -61,10 +61,9 @@ const Crawlers = Object.freeze({
// Onespot - https://www.onespot.com/identifying-traffic.html // Onespot - https://www.onespot.com/identifying-traffic.html
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
// PerplexityBot - https://perplexity.ai/perplexitybot // PerplexityBot - https://perplexity.ai/perplexitybot
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
// YepBot - https://yep.com/yepbot/ // YepBot - https://yep.com/yepbot/
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|yep)bot)\/([\w\.-]+)/i, /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|semrush|seznam|yep)bot)\/([\w\.-]+)/i,
// Algolia Crawler // Algolia Crawler
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i, /(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
@ -110,7 +109,7 @@ const Crawlers = Object.freeze({
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i, /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
// Yandex Bots - https://yandex.com/bots // Yandex Bots - https://yandex.com/bots
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i, /(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i,
// Yeti (Naver) // Yeti (Naver)
/(yeti)\/([\w\.]+)/i, /(yeti)\/([\w\.]+)/i,
@ -120,13 +119,8 @@ const Crawlers = Object.freeze({
// Freespoke - https://docs.freespoke.com/search/bot/ // Freespoke - https://docs.freespoke.com/search/bot/
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
], ],
[NAME, VERSION, [TYPE, CRAWLER]],
[ [NAME, VERSION, [TYPE, CRAWLER]],
// YandexBot MirrorDetector
/(yandexbot\/([\w\.]+); mirrordetector)/i
],
[[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],
[ [
// Google Bots // Google Bots
@ -140,8 +134,8 @@ const Crawlers = Object.freeze({
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
// v0bot - https://vercel.com/docs/bot-management // v0bot - https://vercel.com/docs/bot-management
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i /\b((?:ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(?:image|video)?|baidu-ads|botify|bytespider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|yahoo! slurp)/i
], ],
[NAME, [TYPE, CRAWLER]] [NAME, [TYPE, CRAWLER]]
] ]
@ -256,7 +250,7 @@ const Emails = Object.freeze({
const Fetchers = Object.freeze({ const Fetchers = Object.freeze({
browser : [ browser : [
[ [
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
@ -266,7 +260,7 @@ const Fetchers = Object.freeze({
// Perplexity-User - https://docs.perplexity.ai/guides/bots // Perplexity-User - https://docs.perplexity.ai/guides/bots
// MistralAI-User - https://docs.mistral.ai/robots/ // MistralAI-User - https://docs.mistral.ai/robots/
// Yandex Bots - https://yandex.com/bots // Yandex Bots - https://yandex.com/bots
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i, /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
// Bluesky // Bluesky
/(bluesky) cardyb\/([\w\.]+)/i, /(bluesky) cardyb\/([\w\.]+)/i,
@ -283,8 +277,8 @@ const Fetchers = Object.freeze({
[NAME, VERSION, [TYPE, FETCHER]], [NAME, VERSION, [TYPE, FETCHER]],
[ [
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / Snapchat / TikTokSpider / Vercelbot / Yandex Bots // Google Bots / Chrome-Lighthouse / Cohere / Gemini-Deep-Research / Snapchat / TikTokSpider / Vercelbot / Yandex Bots
/((?:better uptime |telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|tiktokspider|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i /((?:better uptime |telegram|vercel)bot|chrome-lighthouse|cohere-ai|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|tiktokspider|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
], ],
[NAME, [TYPE, FETCHER]], [NAME, [TYPE, FETCHER]],
], ],

View File

@ -4,12 +4,24 @@
import type { IResult } from "../main/ua-parser"; import type { IResult } from "../main/ua-parser";
export function getDeviceVendor(model: string): string | undefined; declare function getDeviceVendor(model: string): string | undefined;
export function isAppleSilicon(resultOrUA: IResult | string): boolean; declare function isAppleSilicon(resultOrUA: IResult | string): boolean;
export function isAIBot(resultOrUA: IResult | string): boolean; declare function isAIBot(resultOrUA: IResult | string): boolean;
export function isBot(resultOrUA: IResult | string): boolean; declare function isBot(resultOrUA: IResult | string): boolean;
export function isChromeFamily(resultOrUA: IResult | string): boolean; declare function isChromeFamily(resultOrUA: IResult | string): boolean;
export function isElectron(): boolean; declare function isElectron(): boolean;
export function isFromEU(): boolean; declare function isFromEU(): boolean;
export function isFrozenUA(ua: string): boolean; declare function isFrozenUA(ua: string): boolean;
export function isStandalonePWA(): boolean; declare function isStandalonePWA(): boolean;
export {
getDeviceVendor,
isAppleSilicon,
isAIBot,
isBot,
isChromeFamily,
isElectron,
isFromEU,
isFrozenUA,
isStandalonePWA
}

View File

@ -8,7 +8,7 @@
/*jshint esversion: 6 */ /*jshint esversion: 6 */
const { UAParser } = require('../main/ua-parser'); const { UAParser } = require('../main/ua-parser');
const { CPUArch, OSName, EngineName, Extension } = require('../enums/ua-parser-enums'); const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
const { Bots } = require('../extensions/ua-parser-extensions'); const { Bots } = require('../extensions/ua-parser-extensions');
const { isFromEU } = require('detect-europe-js'); const { isFromEU } = require('detect-europe-js');
const { isFrozenUA } = require('ua-is-frozen'); const { isFrozenUA } = require('ua-is-frozen');
@ -20,8 +20,8 @@ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${m
const isAppleSilicon = (resultOrUA) => { const isAppleSilicon = (resultOrUA) => {
const res = toResult(resultOrUA); const res = toResult(resultOrUA);
if (res.os.is(OSName.MACOS)) { if (res.os.is(OS.MACOS)) {
if (res.cpu.is(CPUArch.ARM)) { if (res.cpu.is(CPU.ARM)) {
return true; return true;
} }
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') { if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
@ -41,124 +41,121 @@ const isAppleSilicon = (resultOrUA) => {
return false; return false;
} }
const Crawler = Extension.BrowserName.Crawlers;
const isAIBot = (resultOrUA) => [ const isAIBot = (resultOrUA) => [
// AI2 // AI2
Crawler.AI2_BOT, 'ai2bot',
// Amazon // Amazon
Crawler.AMAZON_BOT, 'amazonbot',
// Anthropic // Anthropic
Crawler.ANTHROPIC_AI, 'anthropic-ai',
Crawler.ANTHROPIC_CLAUDE_BOT, 'claude-web',
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT, 'claude-searchbot',
Crawler.ANTHROPIC_CLAUDE_WEB, 'claudebot',
// Apple // Apple
Crawler.APPLE_BOT, 'applebot',
Crawler.APPLE_BOT_EXTENDED, 'applebot-extended',
// Brave // Brave
Crawler.BRAVE_BOT, 'bravebot',
// ByteDance // ByteDance
Crawler.BYTEDANCE_BYTESPIDER, 'bytespider',
Crawler.BYTEDANCE_TIKTOKSPIDER, 'tiktokspider',
// Cohere // Cohere
Crawler.COHERE_TRAINING_DATA_CRAWLER, 'cohere-training-data-crawler',
// Common Crawl // Common Crawl
Crawler.COMMON_CRAWL_CCBOT, 'ccbot',
// Coveo // Coveo
Crawler.COVEO_BOT, 'coveobot',
// DataForSeo // DataForSeo
Crawler.DATAFORSEO_BOT, 'dataforseobot',
// DeepSeek // DeepSeek
Crawler.DEEPSEEK_BOT, 'deepseekbot',
// Diffbot // Diffbot
Crawler.DIFFBOT, 'diffbot',
// Google // Google
Crawler.GOOGLE_EXTENDED, 'googleother',
Crawler.GOOGLE_OTHER, 'googleother-image',
Crawler.GOOGLE_OTHER_IMAGE, 'googleother-video',
Crawler.GOOGLE_OTHER_VIDEO, 'google-extended',
Crawler.GOOGLE_CLOUDVERTEXBOT,
// Hive AI // Hive AI
Crawler.HIVE_IMAGESIFTBOT, 'imagesiftbot',
// Huawei // Huawei
Crawler.HUAWEI_PETALBOT, 'petalbot',
Crawler.HUAWEI_PANGUBOT, 'pangubot',
// Hugging Face // Hugging Face
Crawler.HUGGINGFACE_BOT, 'huggingface-bot',
// Kangaroo // Kangaroo
Crawler.KANGAROO_BOT, 'kangaroo bot',
// Mendable.ai // Mendable.ai
Crawler.FIRECRAWL_AGENT, 'firecrawlagent',
// Meta // Meta
Crawler.META_FACEBOOKBOT, 'facebookbot',
Crawler.META_EXTERNALAGENT, 'meta-externalagent',
// OpenAI // OpenAI
Crawler.OPENAI_GPTBOT, 'gptbot',
Crawler.OPENAI_SEARCH_BOT, 'oai-searchbot',
// Perplexity // Perplexity
Crawler.PERPLEXITY_BOT, 'perplexitybot',
// Replicate // Replicate
Crawler.REPLICATE_BOT, 'replicate-bot',
// Runpod // Runpod
Crawler.RUNPOD_BOT, 'runpod-bot',
// SB Intuitions
Crawler.SB_INTUITIONS_BOT,
// Semrush // Semrush
Crawler.SEMRUSH_BOT_CONTENTSHAKE, 'semrushbot-ocob',
// Timpi // Timpi
Crawler.TIMPI_BOT, 'timpibot',
// Together AI // Together AI
Crawler.TOGETHER_BOT, 'together-bot',
// Velen.io // Velen.io
Crawler.HUNTER_VELENPUBLICWEBCRAWLER, 'velenpublicwebcrawler',
// Vercel // Vercel
Crawler.VERCEL_V0BOT, 'v0bot',
// Webz.io // Webz.io
Crawler.WEBZIO_OMGILI, 'omgili',
Crawler.WEBZIO_OMGILI_BOT, 'omgilibot',
Crawler.WEBZIO_EXTENDED, 'webzio-extended',
// X // X
Crawler.XAI_BOT, 'xai-bot',
// You.com // You.com
Crawler.YOU_BOT, 'youbot',
// Zhipu AI // Zhipu AI
Crawler.ZHIPU_CHATGLM_SPIDER 'chatglm-spider',
]
.map((s) => s.toLowerCase()) // Zyte
.includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase()); 'scrapy'
].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase());
const isBot = (resultOrUA) => [ const isBot = (resultOrUA) => [
'cli', 'cli',
@ -167,7 +164,7 @@ const isBot = (resultOrUA) => [
'library' 'library'
].includes(toResult(resultOrUA, Bots).browser.type); ].includes(toResult(resultOrUA, Bots).browser.type);
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK); const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK);
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
/ electron\//i.test(navigator?.userAgent)); // browser / electron\//i.test(navigator?.userAgent)); // browser

View File

@ -3,7 +3,7 @@
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>
import type { Headers } from "undici"; import type { Headers } from "undici";
import { BrowserType, CPUArch, DeviceType, EngineName } from "../enums/ua-parser-enums"; import { BrowserType, CPU as CPUArch, Device as DeviceType, Engine as EngineName } from "../enums/ua-parser-enums";
declare namespace UAParser { declare namespace UAParser {

View File

@ -1,242 +0,0 @@
const UACHTests = [
{
desc: 'Avast Secure Browser',
headers : {
'sec-ch-ua': '"Avast Secure Browser";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
},
expect: {
browser : {
name : 'Avast Secure Browser',
version : '131',
major : '131',
type : undefined
}
}
},
{
desc: 'Brave',
headers : {
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"'
},
expect: {
browser : {
name : 'Brave',
version : '132',
major : '132',
type : undefined
}
}
},
{
desc: 'Chrome',
headers : {
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"'
},
expect: {
browser : {
name : 'Chrome',
version : '111',
major : '111',
type : undefined
}
}
},
{
desc: 'Chrome Headless',
headers : {
'sec-ch-ua': '"Chromium";v="124", "HeadlessChrome";v="124", "Not-A.Brand";v="99"'
},
expect: {
browser : {
name : 'Chrome Headless',
version : '124',
major : '124',
type : undefined
}
}
},
{
desc: 'Chrome WebView',
headers : {
'sec-ch-ua': '"Android WebView";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
},
expect: {
browser : {
name : 'Chrome WebView',
version : '123',
major : '123',
type : undefined
}
}
},
{
desc: 'DuckDuckGo',
headers : {
'sec-ch-ua': '"DuckDuckGo";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
},
expect : {
browser : {
name : 'DuckDuckGo',
version : '131',
major : '131',
type : undefined
}
}
},
{
desc: 'Edge',
headers : {
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"'
},
expect: {
browser : {
name : 'Edge',
version : '120',
major : '120',
type : undefined
}
}
},
{
desc: 'Edge WebView2',
headers : {
'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103", "Microsoft Edge WebView2";v="104"'
},
expect: {
browser : {
name : 'Edge WebView2',
version : '104',
major : '104',
type : undefined
}
}
},
{
desc: 'Huawei Browser',
headers : {
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "HuaweiBrowser";v="114"'
},
expect: {
browser : {
name : 'Huawei Browser',
version : '114',
major : '114',
type : undefined
}
}
},
{
desc: 'MIUI Browser',
headers : {
'sec-ch-ua': '"Miui Browser";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
},
expect: {
browser : {
name : 'MIUI Browser',
version : '123',
major : '123',
type : undefined
}
}
},
{
desc: 'Oculus Browser',
headers : {
'sec-ch-ua': '"Chromium";v="130", "Oculus Browser";v="36", "Not?A_Brand";v="99"'
},
expect: {
browser : {
name : 'Oculus Browser',
version : '36',
major : '36',
type : undefined
}
}
},
{
desc: 'Opera',
headers : {
'sec-ch-ua': '"Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24"'
},
expect: {
browser : {
name : 'Opera',
version : '116',
major : '116',
type : undefined
}
}
},
{
desc: 'Opera GX',
headers : {
'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Opera GX";v="114"'
},
expect: {
browser : {
name : 'Opera GX',
version : '114',
major : '114',
type : undefined
}
}
},
{
desc: 'Opera Mobi',
headers : {
'sec-ch-ua': '"OperaMobile";v="86", ";Not A Brand";v="99", "Opera";v="115", "Chromium";v="130"'
},
expect: {
browser : {
name : 'Opera Mobi',
version : '86',
major : '86',
type : undefined
}
}
},
{
desc: 'Opera Mobi',
headers : {
'sec-ch-ua': '"Chromium";v="132", "OperaMobile";v="87", "Opera";v="117", " Not A;Brand";v="99"'
},
expect: {
browser : {
name : 'Opera Mobi',
version : '87',
major : '87',
type : undefined
}
}
},
{
desc: 'Samsung Internet',
headers : {
'sec-ch-ua': '"Chromium";v="125", "Not.A/Brand";v="24", "Samsung Internet";v="27.0"'
},
expect: {
browser : {
name : 'Samsung Internet',
version : '27.0',
major : '27',
type : undefined
}
}
},
{
desc: 'Yandex',
headers : {
'sec-ch-ua': '"Chromium";v="130", "YaBrowser";v="24.12", "Not?A_Brand";v="99", "Yowser";v="2.5"'
},
expect: {
browser : {
name : 'Yandex',
version : '24.12',
major : '24',
type : undefined
}
}
}
];
module.exports = UACHTests;

View File

@ -329,16 +329,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "Claude-SearchBot",
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +Claude-SearchBot@anthropic.com)",
"expect" :
{
"name" : "Claude-SearchBot",
"version" : "1.0",
"type" : "crawler"
}
},
{ {
"desc" : "ClaudeWeb", "desc" : "ClaudeWeb",
"ua" : "Claude-Web/1.0 (web crawler; +https://www.anthropic.com/; bots@anthropic.com)", "ua" : "Claude-Web/1.0 (web crawler; +https://www.anthropic.com/; bots@anthropic.com)",
@ -579,16 +569,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "APIs-Google",
"ua" : "APIs-Google (+https://developers.google.com/webmasters/APIs-Google.html)",
"expect" :
{
"name" : "APIs-Google",
"version" : "undefined",
"type" : "crawler"
}
},
{ {
"desc" : "Googlebot-Video", "desc" : "Googlebot-Video",
"ua" : "Googlebot-Video/1.0", "ua" : "Googlebot-Video/1.0",
@ -689,16 +669,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "Google-CloudVertexBot",
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.7204.183 Mobile Safari/537.36 (compatible; Google-CloudVertexBot; +https://cloud.google.com/enterprise-search)",
"expect" :
{
"name" : "Google-CloudVertexBot",
"version" : "undefined",
"type" : "crawler"
}
},
{ {
"desc" : "Google-Safety", "desc" : "Google-Safety",
"ua" : "Google-Safety", "ua" : "Google-Safety",
@ -990,16 +960,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "SBIntuitionsBot",
"ua" : "Mozilla/5.0 (compatible; SBIntuitionsBot/0.1;+https://www.sbintuitions.co.jp/bot/)",
"expect" :
{
"name" : "SBIntuitionsBot",
"version" : "0.1",
"type" : "crawler"
}
},
{ {
"desc" : "SeekportBot", "desc" : "SeekportBot",
"ua" : "Mozilla/5.0 (compatible; SeekportBot; +https://bot.seekport.com)", "ua" : "Mozilla/5.0 (compatible; SeekportBot; +https://bot.seekport.com)",
@ -1110,16 +1070,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "TikTokSpider",
"ua" : "Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; TikTokSpider; ttspider-feedback@tiktok.com)",
"expect" :
{
"name" : "TikTokSpider",
"version" : "undefined",
"type" : "crawler"
}
},
{ {
"desc" : "Timpibot", "desc" : "Timpibot",
"ua" : "Timpibot/0.8 (+http://www.timpi.io)", "ua" : "Timpibot/0.8 (+http://www.timpi.io)",
@ -1190,26 +1140,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "webzio",
"ua" : "webzio (+https://webz.io/bot.html)",
"expect" :
{
"name" : "webzio",
"version" : "undefined",
"type" : "crawler"
}
},
{
"desc" : "Webzio-Extended",
"ua" : "Mozilla/5.0 (compatible; Webzio-Extended/1.0; +https://www.webzio.com/bot.html)",
"expect" :
{
"name" : "Webzio-Extended",
"version" : "1.0",
"type" : "crawler"
}
},
{ {
"desc" : "Yahoo! Japan", "desc" : "Yahoo! Japan",
"ua" : "Y!J-BRW/1.0 (https://www.yahoo-help.jp/app/answers/detail/p/595/a_id/42716)", "ua" : "Y!J-BRW/1.0 (https://www.yahoo-help.jp/app/answers/detail/p/595/a_id/42716)",
@ -1230,46 +1160,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "YandexAccessibilityBot",
"ua" : "Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexAccessibilityBot",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexAdditionalBot",
"ua" : "Mozilla/5.0 (compatible; YandexAdditionalBot/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexAdditionalBot",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexAdNet",
"ua" : "Mozilla/5.0 (compatible; YandexAdNet/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexAdNet",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexBlogs",
"ua" : "Mozilla/5.0 (compatible; YandexBlogs/0.99; robot; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexBlogs",
"version" : "0.99",
"type" : "crawler"
}
},
{ {
"desc" : "YandexBot", "desc" : "YandexBot",
"ua" : "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)", "ua" : "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)",
@ -1280,246 +1170,6 @@
"type" : "crawler" "type" : "crawler"
} }
}, },
{
"desc" : "YandexBot MirrorDetector",
"ua" : "Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexBot MirrorDetector",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexComBot",
"ua" : "Mozilla/5.0 (compatible; YandexComBot/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexComBot",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexFavicons",
"ua" : "Mozilla/5.0 (compatible; YandexFavicons/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexFavicons",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexImageResizer",
"ua" : "Mozilla/5.0 (compatible; YandexImageResizer/2.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexImageResizer",
"version" : "2.0",
"type" : "crawler"
}
},
{
"desc" : "YandexImages",
"ua" : "Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexImages",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexMarket",
"ua" : "Mozilla/5.0 (compatible; YandexMarket/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexMarket",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexMetrika",
"ua" : "Mozilla/5.0 (compatible; YandexMetrika/2.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexMetrika",
"version" : "2.0",
"type" : "crawler"
}
},
{
"desc" : "YandexMedia",
"ua" : "Mozilla/5.0 (compatible; YandexMedia/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexMedia",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexMobileBot",
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4 (compatible; YandexMobileBot/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexMobileBot",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexMobileScreenShotBot",
"ua" : "Mozilla/5.0 (compatible; YandexMobileScreenShotBot/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexMobileScreenShotBot",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexNews",
"ua" : "Mozilla/5.0 (compatible; YandexNews/4.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexNews",
"version" : "4.0",
"type" : "crawler"
}
},
{
"desc" : "YandexOntoDB",
"ua" : "Mozilla/5.0 (compatible; YandexOntoDB/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexOntoDB",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexOntoDBAPI",
"ua" : "Mozilla/5.0 (compatible; YandexOntoDBAPI/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexOntoDBAPI",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexPartner",
"ua" : "Mozilla/5.0 (compatible; YandexPartner/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexPartner",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexRCA",
"ua" : "Mozilla/5.0 (compatible; YandexRCA/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexRCA",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexRenderResourcesBot",
"ua" : "Mozilla/5.0 (compatible; YandexRenderResourcesBot/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexRenderResourcesBot",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexScreenshotBot",
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36 (compatible; YandexScreenshotBot/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexScreenshotBot",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexSpravBot",
"ua" : "Mozilla/5.0 (compatible; YandexSpravBot/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexSpravBot",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexTracker",
"ua" : "Mozilla/5.0 (compatible; YandexTracker/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexTracker",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexVertis",
"ua" : "Mozilla/5.0 (compatible; YandexVertis/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexVertis",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexVerticals",
"ua" : "Mozilla/5.0 (compatible; YandexVerticals/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexVerticals",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexVideo",
"ua" : "Mozilla/5.0 (compatible; YandexVideo/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexVideo",
"version" : "3.0",
"type" : "crawler"
}
},
{
"desc" : "YandexVideoParser",
"ua" : "Mozilla/5.0 (compatible; YandexVideoParser/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexVideoParser",
"version" : "1.0",
"type" : "crawler"
}
},
{
"desc" : "YandexWebmaster",
"ua" : "Mozilla/5.0 (compatible; YandexWebmaster/2.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexWebmaster",
"version" : "2.0",
"type" : "crawler"
}
},
{ {
"desc" : "YepBot", "desc" : "YepBot",
"ua" : "Mozilla/5.0 (compatible; YepBot/1.0; +http://yep.com/yepbot/)", "ua" : "Mozilla/5.0 (compatible; YepBot/1.0; +http://yep.com/yepbot/)",

View File

@ -99,26 +99,6 @@
"type" : "fetcher" "type" : "fetcher"
} }
}, },
{
"desc" : "Claude-User",
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)",
"expect" :
{
"name" : "Claude-User",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "Cohere-AI",
"ua" : "Mozilla/5.0 (compatible; Cohere-AI/1.0; +https://cohere.com/)",
"expect" :
{
"name" : "Cohere-AI",
"version" : "1.0",
"type" : "fetcher"
}
},
{ {
"desc" : "DuckAssistBot", "desc" : "DuckAssistBot",
"ua" : "DuckAssistBot/1.2; (+http://duckduckgo.com/duckassistbot.html)", "ua" : "DuckAssistBot/1.2; (+http://duckduckgo.com/duckassistbot.html)",
@ -419,96 +399,6 @@
"type" : "fetcher" "type" : "fetcher"
} }
}, },
{
"desc" : "YaDirectFetcher",
"ua" : "Mozilla/5.0 (compatible; YaDirectFetcher/1.0; Dyatel; +http://yandex.com/bots)",
"expect" :
{
"name" : "YaDirectFetcher",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexCalendar",
"ua" : "Mozilla/5.0 (compatible; YandexCalendar/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexCalendar",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexDirect",
"ua" : "Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexDirect",
"version" : "3.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexDirectDyn",
"ua" : "Mozilla/5.0 (compatible; YandexDirectDyn/1.0; +http://yandex.com/bots",
"expect" :
{
"name" : "YandexDirectDyn",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexForDomain",
"ua" : "Mozilla/5.0 (compatible; YandexForDomain/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexForDomain",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexPagechecker",
"ua" : "Mozilla/5.0 (compatible; YandexPagechecker/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexPagechecker",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexSearchShop",
"ua" : "Mozilla/5.0 (compatible; YandexSearchShop/1.0; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexSearchShop",
"version" : "1.0",
"type" : "fetcher"
}
},
{
"desc" : "YandexSitelinks",
"ua" : "Mozilla/5.0 (compatible; YandexSitelinks; Dyatel; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexSitelinks",
"version" : "undefined",
"type" : "fetcher"
}
},
{
"desc" : "YandexUserproxy",
"ua" : "Mozilla/5.0 (compatible; YandexUserproxy; robot; +http://yandex.com/bots)",
"expect" :
{
"name" : "YandexUserproxy",
"version" : "undefined",
"type" : "fetcher"
}
},
{ {
"desc" : "Zoombot", "desc" : "Zoombot",
"ua" : "Mozilla/5.0 (compatible; Zoombot/1.0; +https://zoom.us; crawler@domain.com)", "ua" : "Mozilla/5.0 (compatible; Zoombot/1.0; +https://zoom.us; crawler@domain.com)",

View File

@ -1,5 +1,5 @@
import { UAParser } from '../../src/main/ua-parser.mjs'; import { UAParser } from '../../src/main/ua-parser.mjs';
import { CPUArch, DeviceType, EngineName } from '../../src/enums/ua-parser-enums.mjs'; import { CPU, Device, Engine } from '../../src/enums/ua-parser-enums.mjs';
import * as assert from 'assert'; import * as assert from 'assert';
describe('Returns', () => { describe('Returns', () => {
@ -19,8 +19,8 @@ describe('Returns', () => {
describe('Enums', () => { describe('Enums', () => {
it('Can use enum', () => { it('Can use enum', () => {
const { cpu, device, engine } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900'); const { cpu, device, engine } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
assert.strictEqual(cpu.is(CPUArch.ARM), true); assert.strictEqual(cpu.is(CPU.ARM), true);
assert.strictEqual(device.is(DeviceType.MOBILE), true); assert.strictEqual(device.is(Device.MOBILE), true);
assert.strictEqual(engine.is(EngineName.GECKO), true); assert.strictEqual(engine.is(Engine.GECKO), true);
}); });
}); });

View File

@ -1,6 +1,5 @@
const assert = require('assert'); const assert = require('assert');
const { UAParser } = require('../../src/main/ua-parser'); const { UAParser } = require('../../src/main/ua-parser');
const UACHTests = require('../data/ua-ch/headers');
describe('Map UA-CH headers', () => { describe('Map UA-CH headers', () => {
@ -222,13 +221,234 @@ describe('Map UA-CH headers', () => {
}); });
describe('UA-CH Headers tests', () => { describe('UA-CH Headers tests', () => {
UACHTests.forEach(test => { [
it(`Test for ${test.desc}`, () => { {
headers : {
'sec-ch-ua': '"Avast Secure Browser";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
},
expect: {
browser : {
name : 'Avast Secure Browser',
version : '131',
major : '131',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"'
},
expect: {
browser : {
name : 'Brave',
version : '132',
major : '132',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"'
},
expect: {
browser : {
name : 'Chrome',
version : '111',
major : '111',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Chromium";v="124", "HeadlessChrome";v="124", "Not-A.Brand";v="99"'
},
expect: {
browser : {
name : 'Chrome Headless',
version : '124',
major : '124',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Android WebView";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
},
expect: {
browser : {
name : 'Chrome WebView',
version : '123',
major : '123',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"DuckDuckGo";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
},
expect : {
browser : {
name : 'DuckDuckGo',
version : '131',
major : '131',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"'
},
expect: {
browser : {
name : 'Edge',
version : '120',
major : '120',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103", "Microsoft Edge WebView2";v="104"'
},
expect: {
browser : {
name : 'Edge WebView2',
version : '104',
major : '104',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "HuaweiBrowser";v="114"'
},
expect: {
browser : {
name : 'Huawei Browser',
version : '114',
major : '114',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Miui Browser";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
},
expect: {
browser : {
name : 'MIUI Browser',
version : '123',
major : '123',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Chromium";v="130", "Oculus Browser";v="36", "Not?A_Brand";v="99"'
},
expect: {
browser : {
name : 'Oculus Browser',
version : '36',
major : '36',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24"'
},
expect: {
browser : {
name : 'Opera',
version : '116',
major : '116',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Opera GX";v="114"'
},
expect: {
browser : {
name : 'Opera GX',
version : '114',
major : '114',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"OperaMobile";v="86", ";Not A Brand";v="99", "Opera";v="115", "Chromium";v="130"'
},
expect: {
browser : {
name : 'Opera Mobi',
version : '86',
major : '86',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Chromium";v="132", "OperaMobile";v="87", "Opera";v="117", " Not A;Brand";v="99"'
},
expect: {
browser : {
name : 'Opera Mobi',
version : '87',
major : '87',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Chromium";v="125", "Not.A/Brand";v="24", "Samsung Internet";v="27.0"'
},
expect: {
browser : {
name : 'Samsung Internet',
version : '27.0',
major : '27',
type : undefined
}
}
},
{
headers : {
'sec-ch-ua': '"Chromium";v="130", "YaBrowser";v="24.12", "Not?A_Brand";v="99", "Yowser";v="2.5"'
},
expect: {
browser : {
name : 'Yandex',
version : '24.12',
major : '24',
type : undefined
}
}
},
]
.forEach(test => {
const { browser } = UAParser(test.headers).withClientHints(); const { browser } = UAParser(test.headers).withClientHints();
assert.deepEqual(browser, test.expect.browser); assert.deepEqual(browser, test.expect.browser);
}); });
}); });
});
describe('Identify vendor & type of device from given model name', () => { describe('Identify vendor & type of device from given model name', () => {
[ [