diff --git a/script/build-esm.js b/script/build-esm.js index 98f7ffb..78321dd 100755 --- a/script/build-esm.js +++ b/script/build-esm.js @@ -2,15 +2,18 @@ /* jshint esversion: 6 */ const fs = require('fs'); -const generateMJS = (module) => { - let { src, dest, title, replacements } = module; - let text = fs.readFileSync(src, 'utf-8'); - - replacements.push( +const defaultReplacements = { + 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 text = fs.readFileSync(src, 'utf-8'); + replacements.forEach(rep => { text = text.replace(rep[0], rep[1]); }); @@ -18,42 +21,54 @@ const generateMJS = (module) => { console.log(`Generate ${dest}`); fs.writeFileSync(dest, -`// Generated ESM version of ${title} +`// ${title} // DO NOT EDIT THIS FILE! // Source: /${src} ${text}`, 'utf-8'); - }; -const modules = [ +const files = [ { src : 'src/main/ua-parser.js', dest : 'src/main/ua-parser.mjs', - title : 'ua-parser-js', + title : 'Generated ESM version of ua-parser-js', replacements : [ [/\(func[\s\S]+strict\';/ig, ''], [/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', dest :'src/enums/ua-parser-enums.mjs', - title : 'ua-parser-js/enums', - replacements : [] + title : 'Generated ESM version of ua-parser-js/enums', + replacements : [...defaultReplacements.mjs] + }, + { + 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', dest : 'src/extensions/ua-parser-extensions.mjs', - title : 'ua-parser-js/extensions', - replacements : [] + title : 'Generated ESM version of ua-parser-js/extensions', + replacements : [...defaultReplacements.mjs] }, { src : 'src/helpers/ua-parser-helpers.js', dest : 'src/helpers/ua-parser-helpers.mjs', - title : 'ua-parser-js/helpers', - replacements : [] + title : 'Generated ESM version of ua-parser-js/helpers', + replacements : [...defaultReplacements.mjs] } ]; -modules.forEach(module => generateMJS(module)); \ No newline at end of file +files.forEach(module => generateFile(module)); \ No newline at end of file diff --git a/src/enums/ua-parser-enums.d.ts b/src/enums/ua-parser-enums.d.ts index 5d25f94..b748ea9 100644 --- a/src/enums/ua-parser-enums.d.ts +++ b/src/enums/ua-parser-enums.d.ts @@ -1,160 +1,171 @@ -// Type definitions for Enums submodule of UAParser.js v2.0.4 -// Project: https://github.com/faisalman/ua-parser-js -// Definitions by: Faisal Salman +// Generated type declarations of ua-parser-js/enums +// DO NOT EDIT THIS FILE! +// Source: /src/enums/ua-parser-enums.js + +/////////////////////////////////////////////// +/* Enums for UAParser.js v2.0.4 + https://github.com/faisalman/ua-parser-js + Author: Faisal Salman + AGPLv3 License */ +////////////////////////////////////////////// + +/*jshint esversion: 6 */ export const BrowserName: Readonly<{ - '115': "115", - '2345': "2345", - '360': "360", - ALIPAY: "Alipay", - AMAYA: "Amaya", - ANDROID: "Android Browser", - ARORA: "Arora", - AVANT: "Avant", - AVAST: "Avast Secure Browser", - AVG: "AVG Secure Browser", - BAIDU: "Baidu Browser", - BASILISK: "Basilisk", - BLAZER: "Blazer", - BOLT: "Bolt", - BOWSER: "Bowser", - BRAVE: "Brave", - CAMINO: "Camino", - CHIMERA: "Chimera", - CHROME: "Chrome", - CHROME_HEADLESS: "Chrome Headless", - CHROME_MOBILE: "Mobile Chrome", - CHROME_WEBVIEW: "Chrome WebView", - CHROMIUM: "Chromium", - COBALT: "Cobalt", - COC_COC: "Coc Coc", - CONKEROR: "Conkeror", - DAUM: "Daum", - DILLO: "Dillo", - DOLPHIN: "Dolphin", + '115': '115', + '2345': '2345', + '360': '360', + ALIPAY: 'Alipay', + AMAYA: 'Amaya', + ANDROID: 'Android Browser', + ARORA: 'Arora', + AVANT: 'Avant', + AVAST: 'Avast Secure Browser', + AVG: 'AVG Secure Browser', + BAIDU: 'Baidu Browser', + BASILISK: 'Basilisk', + BLAZER: 'Blazer', + BOLT: 'Bolt', + BOWSER: 'Bowser', + BRAVE: 'Brave', + CAMINO: 'Camino', + CHIMERA: 'Chimera', + CHROME: 'Chrome', + CHROME_HEADLESS: 'Chrome Headless', + CHROME_MOBILE: 'Mobile Chrome', + CHROME_WEBVIEW: 'Chrome WebView', + CHROMIUM: 'Chromium', + COBALT: 'Cobalt', + COC_COC: 'Coc Coc', + CONKEROR: 'Conkeror', + DAUM: 'Daum', + DILLO: 'Dillo', + DOLPHIN: 'Dolphin', DOOBLE: 'Dooble', - DORIS: "Doris", - DRAGON: "Dragon", - DUCKDUCKGO: "DuckDuckGo", - ECOSIA: "Ecosia", - EDGE: "Edge", - EDGE_WEBVIEW: "Edge WebView", - EDGE_WEBVIEW2: "Edge WebView2", - EPIPHANY: "Epiphany", - FACEBOOK: "Facebook", - FALKON: "Falkon", - FIREBIRD: "Firebird", - FIREFOX: "Firefox", - FIREFOX_FOCUS: "Firefox Focus", - FIREFOX_MOBILE: "Mobile Firefox", - FIREFOX_REALITY: "Firefox Reality", - FENNEC: "Fennec", - FLOCK: "Flock", - FLOW: "Flow", - GO: "GoBrowser", - GOOGLE_SEARCH: "GSA", - HELIO: "Helio", - HEYTAP: "HeyTap", - HONOR: "Honor", - HUAWEI: "Huawei Browser", - ICAB: "iCab", - ICE: "ICE Browser", - ICEAPE: "IceApe", - ICECAT: "IceCat", - ICEDRAGON: "IceDragon", - ICEWEASEL: "IceWeasel", - IE: "IE", - INSTAGRAM: "Instagram", - IRIDIUM: "Iridium", - IRON: "Iron", - JASMINE: "Jasmine", - KONQUEROR: "Konqueror", - KAKAO: "KakaoTalk", - KHTML: "KHTML", - K_MELEON: "K-Meleon", - KLAR: "Klar", - KLARNA: "Klarna", - KINDLE: "Kindle", - LENOVO: "Smart Lenovo Browser", - LADYBIRD: "Ladybird", - LG: "LG Browser", - LIBREWOLF: "LibreWolf", - LIEBAO: "LBBROWSER", - LINE: "Line", - LINKEDIN: "LinkedIn", - LINKS: "Links", - LUNASCAPE: "Lunascape", - LYNX: "Lynx", - MAEMO: "Maemo Browser", - MAXTHON: "Maxthon", - MIDORI: "Midori", - MINIMO: "Minimo", - MIUI: "MIUI Browser", - MOZILLA: "Mozilla", - MOSAIC: "Mosaic", - NAVER: "Naver", - NETFRONT: "NetFront", - NETSCAPE: "Netscape", - NETSURF: "Netsurf", - NOKIA: "Nokia Browser", - OBIGO: "Obigo", - OCULUS: "Oculus Browser", - OMNIWEB: "OmniWeb", - OPERA: "Opera", - OPERA_COAST: "Opera Coast", - OPERA_GX: "Opera GX", - OPERA_MINI: "Opera Mini", - OPERA_MOBI: "Opera Mobi", - OPERA_TABLET: "Opera Tablet", - OPERA_TOUCH: "Opera Touch", - OTTER: "Otter", - OVI: "OviBrowser", - PALEMOON: "PaleMoon", - PHANTOMJS: "PhantomJS", - PHOENIX: "Phoenix", - PICOBROWSER: "Pico Browser", - POLARIS: "Polaris", - PUFFIN: "Puffin", - QQ: "QQBrowser", - QQ_LITE: "QQBrowserLite", - QUARK: "Quark", - QUPZILLA: "QupZilla", - QUTEBROWSER: "qutebrowser", - REKONQ: "rekonq", - ROCKMELT: "Rockmelt", - SAFARI: "Safari", - SAFARI_MOBILE: "Mobile Safari", - SAILFISH: "Sailfish Browser", - SAMSUNG: "Samsung Internet", - SEAMONKEY: "SeaMonkey", - SILK: "Silk", - SKYFIRE: "Skyfire", - SLEIPNIR: "Sleipnir", - SLIMBOAT: "SlimBoat", - SLIMBROWSER: "SlimBrowser", - SLIMJET: "Slimjet", - SNAPCHAT: "Snapchat", - SOGOU_EXPLORER: "Sogou Explorer", - SOGOU_MOBILE: "Sogou Mobile", - SURF: "Surf", - SWIFTFOX: "Swiftfox", - TESLA: "Tesla", - TIKTOK: "TikTok", - TIZEN: "Tizen Browser", - TWITTER: "Twitter", - UC: "UCBrowser", - UP: "UP.Browser", - VIVALDI: "Vivaldi", - VIVO: "Vivo Browser", - W3M: "w3m", - WATERFOX: "Waterfox", - WEBKIT: "WebKit", - WECHAT: "WeChat", - WEIBO: "Weibo", - WHALE: "Whale", - WOLVIC: "Wolvic", - YANDEX: "Yandex", - ZALO: "Zalo", + DORIS: 'Doris', + DRAGON: 'Dragon', + DUCKDUCKGO: 'DuckDuckGo', + ECOSIA: 'Ecosia', + EDGE: 'Edge', + EDGE_WEBVIEW: 'Edge WebView', + EDGE_WEBVIEW2: 'Edge WebView2', + EPIPHANY: 'Epiphany', + FACEBOOK: 'Facebook', + FALKON: 'Falkon', + FIREBIRD: 'Firebird', + FIREFOX: 'Firefox', + FIREFOX_FOCUS: 'Firefox Focus', + FIREFOX_MOBILE: 'Mobile Firefox', + FIREFOX_REALITY: 'Firefox Reality', + FENNEC: 'Fennec', + FLOCK: 'Flock', + FLOW: 'Flow', + GO: 'GoBrowser', + GOOGLE_SEARCH: 'GSA', + HELIO: 'Helio', + HEYTAP: 'HeyTap', + HONOR: 'Honor', + HUAWEI: 'Huawei Browser', + ICAB: 'iCab', + ICE: 'ICE Browser', + ICEAPE: 'IceApe', + ICECAT: 'IceCat', + ICEDRAGON: 'IceDragon', + ICEWEASEL: 'IceWeasel', + IE: 'IE', + INSTAGRAM: 'Instagram', + IRIDIUM: 'Iridium', + IRON: 'Iron', + JASMINE: 'Jasmine', + KONQUEROR: 'Konqueror', + KAKAO: 'KakaoTalk', + KHTML: 'KHTML', + K_MELEON: 'K-Meleon', + KLAR: 'Klar', + KLARNA: 'Klarna', + KINDLE: 'Kindle', + LENOVO: 'Smart Lenovo Browser', + LADYBIRD: 'Ladybird', + LG: 'LG Browser', + LIBREWOLF: 'LibreWolf', + LIEBAO: 'LBBROWSER', + LINE: 'Line', + LINKEDIN: 'LinkedIn', + LINKS: 'Links', + LUNASCAPE: 'Lunascape', + LYNX: 'Lynx', + MAEMO: 'Maemo Browser', + MAXTHON: 'Maxthon', + MIDORI: 'Midori', + MINIMO: 'Minimo', + MIUI: 'MIUI Browser', + MOZILLA: 'Mozilla', + MOSAIC: 'Mosaic', + NAVER: 'Naver', + NETFRONT: 'NetFront', + NETSCAPE: 'Netscape', + NETSURF: 'Netsurf', + NOKIA: 'Nokia Browser', + OBIGO: 'Obigo', + OCULUS: 'Oculus Browser', + OMNIWEB: 'OmniWeb', + OPERA: 'Opera', + OPERA_COAST: 'Opera Coast', + OPERA_GX: 'Opera GX', + OPERA_MINI: 'Opera Mini', + OPERA_MOBI: 'Opera Mobi', + OPERA_TABLET: 'Opera Tablet', + OPERA_TOUCH: 'Opera Touch', + OTTER: 'Otter', + OVI: 'OviBrowser', + PALEMOON: 'PaleMoon', + PHANTOMJS: 'PhantomJS', + PHOENIX: 'Phoenix', + PICOBROWSER: 'Pico Browser', + POLARIS: 'Polaris', + PUFFIN: 'Puffin', + QQ: 'QQBrowser', + QQ_LITE: 'QQBrowserLite', + QUARK: 'Quark', + QUPZILLA: 'QupZilla', + QUTEBROWSER: 'qutebrowser', + REKONQ: 'rekonq', + ROCKMELT: 'Rockmelt', + SAFARI: 'Safari', + SAFARI_MOBILE: 'Mobile Safari', + SAILFISH: 'Sailfish Browser', + SAMSUNG: 'Samsung Internet', + SEAMONKEY: 'SeaMonkey', + SILK: 'Silk', + SKYFIRE: 'Skyfire', + SLEIPNIR: 'Sleipnir', + SLIMBOAT: 'SlimBoat', + SLIMBROWSER: 'SlimBrowser', + SLIMJET: 'Slimjet', + SNAPCHAT: 'Snapchat', + SOGOU_EXPLORER: 'Sogou Explorer', + SOGOU_MOBILE: 'Sogou Mobile', + SURF: 'Surf', + SWIFTFOX: 'Swiftfox', + TESLA: 'Tesla', + TIKTOK: 'TikTok', + TIZEN: 'Tizen Browser', + TWITTER: 'Twitter', + UC: 'UCBrowser', + UP: 'UP.Browser', + VIVALDI: 'Vivaldi', + VIVO: 'Vivo Browser', + W3M: 'w3m', + WATERFOX: 'Waterfox', + WEBKIT: 'WebKit', + WECHAT: 'WeChat', + WEIBO: 'Weibo', + WHALE: 'Whale', + WOLVIC: 'Wolvic', + YANDEX: 'Yandex', + ZALO: 'Zalo' + + // TODO : test! }>; /** * @deprecated Use `BrowserName` instead @@ -162,34 +173,34 @@ export const BrowserName: Readonly<{ export const Browser: typeof BrowserName; export const BrowserType: Readonly<{ - CRAWLER: "crawler", - CLI: "cli", - EMAIL: "email", - FETCHER: "fetcher", - INAPP: "inapp", - MEDIAPLAYER: "mediaplayer", - LIBRARY: "library", + CRAWLER: 'crawler', + CLI: 'cli', + EMAIL: 'email', + FETCHER: 'fetcher', + INAPP: 'inapp', + MEDIAPLAYER: 'mediaplayer', + LIBRARY: 'library' }>; export const CPUArch: Readonly<{ - '68K': "68k", - ALPHA: "alpha", - ARM: "arm", - ARM_64: "arm64", - ARM_HF: "armhf", - AVR: "avr", - AVR_32: "avr32", - IA64: "ia64", - IRIX: "irix", - IRIX_64: "irix64", - MIPS: "mips", - MIPS_64: "mips64", - PA_RISC: "pa-risc", - PPC: "ppc", - SPARC: "sparc", - SPARC_64: "sparc64", - X86: "ia32", - X86_64: "amd64", + '68K': '68k', + ALPHA: 'alpha', + ARM : 'arm', + ARM_64: 'arm64', + ARM_HF: 'armhf', + AVR: 'avr', + AVR_32: 'avr32', + IA64: 'ia64', + IRIX: 'irix', + IRIX_64: 'irix64', + MIPS: 'mips', + MIPS_64: 'mips64', + PA_RISC: 'pa-risc', + PPC: 'ppc', + SPARC: 'sparc', + SPARC_64: 'sparc64', + X86: 'ia32', + X86_64: 'amd64' }>; /** * @deprecated Use `CPUArch` instead @@ -197,14 +208,14 @@ export const CPUArch: Readonly<{ export const CPU: typeof CPUArch; export const DeviceType: Readonly<{ - CONSOLE: "console", - DESKTOP: "desktop", - EMBEDDED: "embedded", - MOBILE: "mobile", - SMARTTV: "smarttv", - TABLET: "tablet", - WEARABLE: "wearable", - XR: "xr" + CONSOLE: 'console', + DESKTOP: 'desktop', + EMBEDDED: 'embedded', + MOBILE: 'mobile', + SMARTTV: 'smarttv', + TABLET: 'tablet', + WEARABLE: 'wearable', + XR: 'xr' }>; /** * @deprecated Use `DeviceType` instead @@ -212,78 +223,80 @@ export const DeviceType: Readonly<{ export const Device: typeof DeviceType; export const DeviceVendor: Readonly<{ - ACER: "Acer", - ADVAN: "Advan", - ALCATEL: "Alcatel", - APPLE: "Apple", - AMAZON: "Amazon", - ARCHOS: "Archos", - ASUS: "ASUS", - ATT: "AT&T", - BENQ: "BenQ", - BLACKBERRY: "BlackBerry", - BLU: "BLU", - CAT: "Cat", - DELL: "Dell", - ENERGIZER: "Energizer", - ESSENTIAL: "Essential", - FACEBOOK: "Facebook", - FAIRPHONE: "Fairphone", - GEEKSPHONE: "GeeksPhone", - GENERIC: "Generic", - GOOGLE: "Google", - HMD: "HMD", - HP: "HP", - HTC: "HTC", - HUAWEI: "Huawei", - IMO: "IMO", - INFINIX: "Infinix", - ITEL: "itel", - JOLLA: "Jolla", - KOBO: "Kobo", - LAVA: "Lava", - LENOVO: "Lenovo", - LG: "LG", - MEIZU: "Meizu", - MICROMAX: "Micromax", - MICROSOFT: "Microsoft", - MOTOROLA: "Motorola", - NEXIAN: "Nexian", - NINTENDO: "Nintendo", - NOKIA: "Nokia", - NOTHING: "Nothing", - NVIDIA: "Nvidia", - ONEPLUS: "OnePlus", - OPPO: "OPPO", - OUYA: "Ouya", - PALM: "Palm", - PANASONIC: "Panasonic", - PEBBLE: "Pebble", - PHILIPS: "Philips", - PICO: "Pico", - POLYTRON: "Polytron", - REALME: "Realme", - RETROID: "Retroid", - RIM: "RIM", - ROKU: "Roku", - SAMSUNG: "Samsung", - SHARP: "Sharp", - SIEMENS: "Siemens", - SMARTFREN: "Smartfren", - SONY: "Sony", - SPRINT: "Sprint", - TCL: "TCL", - TECHNISAT: "TechniSAT", - TECNO: "Tecno", - TESLA: "Tesla", - ULEFONE: "Ulefone", - VIVO: "Vivo", - VIZIO: "Vizio", - VODAFONE: "Vodafone", - XBOX: "Xbox", - XIAOMI: "Xiaomi", - ZEBRA: "Zebra", - ZTE: "ZTE", + ACER: 'Acer', + ADVAN: 'Advan', + ALCATEL: 'Alcatel', + APPLE: 'Apple', + AMAZON: 'Amazon', + ARCHOS: 'Archos', + ASUS: 'ASUS', + ATT: 'AT&T', + BENQ: 'BenQ', + BLACKBERRY: 'BlackBerry', + BLU: 'BLU', + CAT: 'Cat', + DELL: 'Dell', + ENERGIZER: 'Energizer', + ESSENTIAL: 'Essential', + FACEBOOK: 'Facebook', + FAIRPHONE: 'Fairphone', + GEEKSPHONE: 'GeeksPhone', + GENERIC: 'Generic', + GOOGLE: 'Google', + HMD: 'HMD', + HP: 'HP', + HTC: 'HTC', + HUAWEI: 'Huawei', + IMO: 'IMO', + INFINIX: 'Infinix', + ITEL: 'itel', + JOLLA: 'Jolla', + KOBO: 'Kobo', + LAVA: 'Lava', + LENOVO: 'Lenovo', + LG: 'LG', + MEIZU: 'Meizu', + MICROMAX: 'Micromax', + MICROSOFT: 'Microsoft', + MOTOROLA: 'Motorola', + NEXIAN: 'Nexian', + NINTENDO: 'Nintendo', + NOKIA: 'Nokia', + NOTHING: 'Nothing', + NVIDIA: 'Nvidia', + ONEPLUS: 'OnePlus', + OPPO: 'OPPO', + OUYA: 'Ouya', + PALM: 'Palm', + PANASONIC: 'Panasonic', + PEBBLE: 'Pebble', + PHILIPS: 'Philips', + PICO: 'Pico', + POLYTRON: 'Polytron', + REALME: 'Realme', + RETROID: 'Retroid', + RIM: 'RIM', + ROKU: 'Roku', + SAMSUNG: 'Samsung', + SHARP: 'Sharp', + SIEMENS: 'Siemens', + SMARTFREN: 'Smartfren', + SONY: 'Sony', + SPRINT: 'Sprint', + TCL: 'TCL', + TECHNISAT: 'TechniSAT', + TECNO: 'Tecno', + TESLA: 'Tesla', + ULEFONE: 'Ulefone', + VIVO: 'Vivo', + VIZIO: 'Vizio', + VODAFONE: 'Vodafone', + XBOX: 'Xbox', + XIAOMI: 'Xiaomi', + ZEBRA: 'Zebra', + ZTE: 'ZTE', + + // TODO : test! }>; /** * @deprecated Use `DeviceVendor` instead @@ -291,26 +304,26 @@ export const DeviceVendor: Readonly<{ export const Vendor: typeof DeviceVendor; export const EngineName: Readonly<{ - AMAYA: "Amaya", - ARKWEB: "ArkWeb", - BLINK: "Blink", - EDGEHTML: "EdgeHTML", - FLOW: "Flow", - GECKO: "Gecko", - GOANNA: "Goanna", - ICAB: "iCab", - KHTML: "KHTML", - LIBWEB: "LibWeb", - LINKS: "Links", - LYNX: "Lynx", - NETFRONT: "NetFront", - NETSURF: "NetSurf", - PRESTO: "Presto", - SERVO: "Servo", - TASMAN: "Tasman", - TRIDENT: "Trident", - W3M: "w3m", - WEBKIT: "WebKit", + AMAYA: 'Amaya', + ARKWEB: 'ArkWeb', + BLINK: 'Blink', + EDGEHTML: 'EdgeHTML', + FLOW: 'Flow', + GECKO: 'Gecko', + GOANNA: 'Goanna', + ICAB: 'iCab', + KHTML: 'KHTML', + LIBWEB: 'LibWeb', + LINKS: 'Links', + LYNX: 'Lynx', + NETFRONT: 'NetFront', + NETSURF: 'NetSurf', + PRESTO: 'Presto', + SERVO: 'Servo', + TASMAN: 'Tasman', + TRIDENT: 'Trident', + W3M: 'w3m', + WEBKIT: 'WebKit' }>; /** * @deprecated Use `EngineName` instead @@ -318,98 +331,100 @@ export const EngineName: Readonly<{ export const Engine: typeof EngineName; export const OSName: Readonly<{ - AIX: "AIX", - AMIGA_OS: "Amiga OS", - ANDROID: "Android", - ANDROID_X86: "Android-x86", - ARCAOS: "ArcaOS", - ARCH: "Arch", - BADA: "Bada", - BEOS: "BeOS", - BLACKBERRY: "BlackBerry", - CENTOS: "CentOS", - CHROME_OS: "Chrome OS", - CHROMECAST: "Chromecast", - CHROMECAST_ANDROID: "Chromecast Android", - CHROMECAST_FUCHSIA: "Chromecast Fuchsia", - CHROMECAST_LINUX: "Chromecast Linux", - CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker", - CONTIKI: "Contiki", - DEBIAN: "Debian", - DEEPIN: "Deepin", - DRAGONFLY: "DragonFly", - ELEMENTARY_OS: "elementary OS", - FEDORA: "Fedora", - FIREFOX_OS: "Firefox OS", - FREEBSD: "FreeBSD", - FUCHSIA: "Fuchsia", - GENTOO: "Gentoo", - GHOSTBSD: "GhostBSD", - GNU: "GNU", - HAIKU: "Haiku", - HARMONYOS: "HarmonyOS", - HP_UX: "HP-UX", - HURD: "Hurd", - IOS: "iOS", - JOLI: "Joli", - KAIOS: "KaiOS", - KNOPPIX: "Knoppix", - KUBUNTU: "Kubuntu", - LINPUS: "Linpus", - LINSPIRE: "Linspire", - LINUX: "Linux", - MACOS: "macOS", - MAEMO: "Maemo", - MAGEIA: "Mageia", - MANDRIVA: "Mandriva", - MANJARO: "Manjaro", - MEEGO: "MeeGo", - MINIX: "Minix", - MINT: "Mint", - MORPH_OS: "Morph OS", - NETBSD: "NetBSD", - NETRANGE: "NetRange", - NETTV: "NetTV", - NINTENDO: "Nintendo", - OPENHARMONY: "OpenHarmony", - OPENBSD: "OpenBSD", - OPENVMS: "OpenVMS", - OS2: "OS/2", - PALM: "Palm", - PC_BSD: "PC-BSD", - PCLINUXOS: "PCLinuxOS", - PICO: "Pico", - PLAN9: "Plan9", - PLAYSTATION: "PlayStation", - QNX: "QNX", - RASPBIAN: "Raspbian", - REDHAT: "RedHat", - RIM_TABLET_OS: "RIM Tablet OS", - RISC_OS: "RISC OS", - SABAYON: "Sabayon", - SAILFISH: "Sailfish", - SERENITYOS: "SerenityOS", - SERIES40: "Series40", - SLACKWARE: "Slackware", - SOLARIS: "Solaris", - SUSE: "SUSE", - SYMBIAN: "Symbian", - TIZEN: "Tizen", - UBUNTU: "Ubuntu", - UBUNTU_TOUCH: "Ubuntu Touch", - UNIX: "Unix", - VECTORLINUX: "VectorLinux", - WATCHOS: "watchOS", - WEBOS: "WebOS", - WINDOWS: "Windows", - WINDOWS_CE: "Windows CE", - WINDOWS_IOT: "Windows IoT", - WINDOWS_MOBILE: "Windows Mobile", - WINDOWS_PHONE: "Windows Phone", - WINDOWS_RT: "Windows RT", - XBOX: "Xbox", - XUBUNTU: "Xubuntu", - ZENWALK: "Zenwalk", + AIX: 'AIX', + AMIGA_OS: 'Amiga OS', + ANDROID: 'Android', + ANDROID_X86: 'Android-x86', + ARCAOS: 'ArcaOS', + ARCH: 'Arch', + BADA: 'Bada', + BEOS: 'BeOS', + BLACKBERRY: 'BlackBerry', + CENTOS: 'CentOS', + CHROME_OS: 'Chrome OS', + CHROMECAST: 'Chromecast', + CHROMECAST_ANDROID: 'Chromecast Android', + CHROMECAST_FUCHSIA: 'Chromecast Fuchsia', + CHROMECAST_LINUX: 'Chromecast Linux', + CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker', + CONTIKI: 'Contiki', + DEBIAN: 'Debian', + DEEPIN: 'Deepin', + DRAGONFLY: 'DragonFly', + ELEMENTARY_OS: 'elementary OS', + FEDORA: 'Fedora', + FIREFOX_OS: 'Firefox OS', + FREEBSD: 'FreeBSD', + FUCHSIA: 'Fuchsia', + GENTOO: 'Gentoo', + GHOSTBSD: 'GhostBSD', + GNU: 'GNU', + HAIKU: 'Haiku', + HARMONYOS: 'HarmonyOS', + HP_UX: 'HP-UX', + HURD: 'Hurd', + IOS: 'iOS', + JOLI: 'Joli', + KAIOS: 'KaiOS', + KNOPPIX: 'Knoppix', + KUBUNTU: 'Kubuntu', + LINPUS: 'Linpus', + LINSPIRE: 'Linspire', + LINUX: 'Linux', + MACOS: 'macOS', + MAEMO: 'Maemo', + MAGEIA: 'Mageia', + MANDRIVA: 'Mandriva', + MANJARO: 'Manjaro', + MEEGO: 'MeeGo', + MINIX: 'Minix', + MINT: 'Mint', + MORPH_OS: 'Morph OS', + NETBSD: 'NetBSD', + NETRANGE: 'NetRange', + NETTV: 'NetTV', + NINTENDO: 'Nintendo', + OPENHARMONY: 'OpenHarmony', + OPENBSD: 'OpenBSD', + OPENVMS: 'OpenVMS', + OS2: 'OS/2', + PALM: 'Palm', + PC_BSD: 'PC-BSD', + PCLINUXOS: 'PCLinuxOS', + PICO: 'Pico', + PLAN9: 'Plan9', + PLAYSTATION: 'PlayStation', + QNX: 'QNX', + RASPBIAN: 'Raspbian', + REDHAT: 'RedHat', + RIM_TABLET_OS: 'RIM Tablet OS', + RISC_OS: 'RISC OS', + SABAYON: 'Sabayon', + SAILFISH: 'Sailfish', + SERENITYOS: 'SerenityOS', + SERIES40: 'Series40', + SLACKWARE: 'Slackware', + SOLARIS: 'Solaris', + SUSE: 'SUSE', + SYMBIAN: 'Symbian', + TIZEN: 'Tizen', + UBUNTU: 'Ubuntu', + UBUNTU_TOUCH: 'Ubuntu Touch', + UNIX: 'Unix', + VECTORLINUX: 'VectorLinux', + WATCHOS: 'watchOS', + WEBOS: 'WebOS', + WINDOWS: 'Windows', + WINDOWS_CE: 'Windows CE', + WINDOWS_IOT: 'Windows IoT', + WINDOWS_MOBILE: 'Windows Mobile', + WINDOWS_PHONE: 'Windows Phone', + WINDOWS_RT: 'Windows RT', + XBOX: 'Xbox', + XUBUNTU: 'Xubuntu', + ZENWALK: 'Zenwalk' + + // TODO : test! }>; /** * @deprecated Use `OSName` instead @@ -421,7 +436,7 @@ export const OS: typeof OSName; */////////////////////////////// export const Extension: Readonly<{ - Browser: { + BrowserName: { CLIs: { CURL: 'curl', ELINKS: 'ELinks', @@ -441,6 +456,9 @@ export const Extension: Readonly<{ AMAZON_BOT: 'Amazonbot', AMAZON_CONTXBOT: 'contxbot', ANTHROPIC_AI: 'anthropic-ai', + ANTHROPIC_CLAUDE_BOT: 'ClaudeBot', + ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot', + ANTHROPIC_CLAUDE_WEB: 'Claude-Web', ARCHIVEORG_BOT: 'archive.org_bot', BAIDU_ADS: 'Baidu-ADS', BAIDU_SPIDER: 'Baiduspider', @@ -457,8 +475,6 @@ export const Extension: Readonly<{ BYTEDANCE_SPIDER: 'Bytespider', CC_BOT: 'CCBot', CHATGLM_SPIDER: 'ChatGLM-Spider', - CLAUDE_WEB: 'Claude-Web', - CLAUDE_BOT: 'ClaudeBot', COCCOC_BOT_WEB: 'coccocbot-web', COCCOC_BOT_IMAGE: 'coccocbot-image', COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', @@ -573,11 +589,13 @@ export const Extension: Readonly<{ }, Fetchers: { AHREFS_SITEAUDIT: 'AhrefsSiteAudit', + ANTHROPIC_CLAUDE_USER: 'Claude-User', ASANA: 'Asana', BETTER_UPTIME_BOT: 'Better Uptime Bot', BITLY_BOT: 'bitlybot', BLUESKY: 'Bluesky', BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', + COHERE_AI: 'Cohere-AI', DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', @@ -666,4 +684,5 @@ export const Extension: Readonly<{ VOLVO: 'Volvo' } } -}>; \ No newline at end of file +}>; + diff --git a/src/enums/ua-parser-enums.js b/src/enums/ua-parser-enums.js index 94b1f12..bb3b83c 100644 --- a/src/enums/ua-parser-enums.js +++ b/src/enums/ua-parser-enums.js @@ -452,6 +452,9 @@ const Extension = Object.freeze({ AMAZON_BOT: 'Amazonbot', AMAZON_CONTXBOT: 'contxbot', ANTHROPIC_AI: 'anthropic-ai', + ANTHROPIC_CLAUDE_BOT: 'ClaudeBot', + ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot', + ANTHROPIC_CLAUDE_WEB: 'Claude-Web', ARCHIVEORG_BOT: 'archive.org_bot', BAIDU_ADS: 'Baidu-ADS', BAIDU_SPIDER: 'Baiduspider', @@ -468,8 +471,6 @@ const Extension = Object.freeze({ BYTEDANCE_SPIDER: 'Bytespider', CC_BOT: 'CCBot', CHATGLM_SPIDER: 'ChatGLM-Spider', - CLAUDE_WEB: 'Claude-Web', - CLAUDE_BOT: 'ClaudeBot', COCCOC_BOT_WEB: 'coccocbot-web', COCCOC_BOT_IMAGE: 'coccocbot-image', COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', @@ -584,11 +585,13 @@ const Extension = Object.freeze({ }, Fetchers: { AHREFS_SITEAUDIT: 'AhrefsSiteAudit', + ANTHROPIC_CLAUDE_USER: 'Claude-User', ASANA: 'Asana', BETTER_UPTIME_BOT: 'Better Uptime Bot', BITLY_BOT: 'bitlybot', BLUESKY: 'Bluesky', BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', + COHERE_AI: 'Cohere-AI', DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', diff --git a/src/extensions/ua-parser-extensions.js b/src/extensions/ua-parser-extensions.js index 6346b9f..3d6c9fc 100644 --- a/src/extensions/ua-parser-extensions.js +++ b/src/extensions/ua-parser-extensions.js @@ -250,7 +250,7 @@ const Emails = Object.freeze({ const Fetchers = Object.freeze({ browser : [ [ - // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot + // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot // ChatGPT-User - https://platform.openai.com/docs/plugins/bot @@ -260,7 +260,7 @@ const Fetchers = Object.freeze({ // Perplexity-User - https://docs.perplexity.ai/guides/bots // MistralAI-User - https://docs.mistral.ai/robots/ // Yandex Bots - https://yandex.com/bots - /(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, + /(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)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i, // Bluesky /(bluesky) cardyb\/([\w\.]+)/i, @@ -277,8 +277,8 @@ const Fetchers = Object.freeze({ [NAME, VERSION, [TYPE, FETCHER]], [ - // Google Bots / Chrome-Lighthouse / Cohere / Gemini-Deep-Research / Snapchat / TikTokSpider / Vercelbot / Yandex Bots - /((?: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 + // Google Bots / Chrome-Lighthouse / 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 ], [NAME, [TYPE, FETCHER]], ], diff --git a/src/helpers/ua-parser-helpers.d.ts b/src/helpers/ua-parser-helpers.d.ts index fc53c61..c860fd2 100644 --- a/src/helpers/ua-parser-helpers.d.ts +++ b/src/helpers/ua-parser-helpers.d.ts @@ -4,24 +4,12 @@ import type { IResult } from "../main/ua-parser"; -declare function getDeviceVendor(model: string): string | undefined; -declare function isAppleSilicon(resultOrUA: IResult | string): boolean; -declare function isAIBot(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; -declare function isStandalonePWA(): boolean; - -export { - getDeviceVendor, - isAppleSilicon, - isAIBot, - isBot, - isChromeFamily, - isElectron, - isFromEU, - isFrozenUA, - isStandalonePWA -} \ No newline at end of file +export function getDeviceVendor(model: string): string | undefined; +export function isAppleSilicon(resultOrUA: IResult | string): boolean; +export function isAIBot(resultOrUA: IResult | string): boolean; +export function isBot(resultOrUA: IResult | string): boolean; +export function isChromeFamily(resultOrUA: IResult | string): boolean; +export function isElectron(): boolean; +export function isFromEU(): boolean; +export function isFrozenUA(ua: string): boolean; +export function isStandalonePWA(): boolean; diff --git a/src/helpers/ua-parser-helpers.js b/src/helpers/ua-parser-helpers.js index 912ccdb..6626ad5 100644 --- a/src/helpers/ua-parser-helpers.js +++ b/src/helpers/ua-parser-helpers.js @@ -8,7 +8,7 @@ /*jshint esversion: 6 */ const { UAParser } = require('../main/ua-parser'); -const { CPU, OS, Engine } = require('../enums/ua-parser-enums'); +const { CPUArch, OSName, EngineName } = require('../enums/ua-parser-enums'); const { Bots } = require('../extensions/ua-parser-extensions'); const { isFromEU } = require('detect-europe-js'); 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 res = toResult(resultOrUA); - if (res.os.is(OS.MACOS)) { - if (res.cpu.is(CPU.ARM)) { + if (res.os.is(OSName.MACOS)) { + if (res.cpu.is(CPUArch.ARM)) { return true; } if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') { @@ -164,7 +164,7 @@ const isBot = (resultOrUA) => [ 'library' ].includes(toResult(resultOrUA, Bots).browser.type); -const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK); +const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK); const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js / electron\//i.test(navigator?.userAgent)); // browser diff --git a/src/main/ua-parser.d.ts b/src/main/ua-parser.d.ts index 9d49448..6fd0ef5 100644 --- a/src/main/ua-parser.d.ts +++ b/src/main/ua-parser.d.ts @@ -3,7 +3,7 @@ // Definitions by: Faisal Salman import type { Headers } from "undici"; -import { BrowserType, CPU as CPUArch, Device as DeviceType, Engine as EngineName } from "../enums/ua-parser-enums"; +import { BrowserType, CPUArch, DeviceType, EngineName } from "../enums/ua-parser-enums"; declare namespace UAParser { diff --git a/test/data/ua/extension/crawler.json b/test/data/ua/extension/crawler.json index 3506077..61d6a21 100644 --- a/test/data/ua/extension/crawler.json +++ b/test/data/ua/extension/crawler.json @@ -329,6 +329,16 @@ "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", "ua" : "Claude-Web/1.0 (web crawler; +https://www.anthropic.com/; bots@anthropic.com)", diff --git a/test/data/ua/extension/fetcher.json b/test/data/ua/extension/fetcher.json index c1c8989..33df886 100644 --- a/test/data/ua/extension/fetcher.json +++ b/test/data/ua/extension/fetcher.json @@ -99,6 +99,26 @@ "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", "ua" : "DuckAssistBot/1.2; (+http://duckduckgo.com/duckassistbot.html)", diff --git a/test/unit/es6.mjs b/test/unit/es6.mjs index 8e26908..9f3ba26 100644 --- a/test/unit/es6.mjs +++ b/test/unit/es6.mjs @@ -1,5 +1,5 @@ import { UAParser } from '../../src/main/ua-parser.mjs'; -import { CPU, Device, Engine } from '../../src/enums/ua-parser-enums.mjs'; +import { CPUArch, DeviceType, EngineName } from '../../src/enums/ua-parser-enums.mjs'; import * as assert from 'assert'; describe('Returns', () => { @@ -19,8 +19,8 @@ describe('Returns', () => { describe('Enums', () => { 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'); - assert.strictEqual(cpu.is(CPU.ARM), true); - assert.strictEqual(device.is(Device.MOBILE), true); - assert.strictEqual(engine.is(Engine.GECKO), true); + assert.strictEqual(cpu.is(CPUArch.ARM), true); + assert.strictEqual(device.is(DeviceType.MOBILE), true); + assert.strictEqual(engine.is(EngineName.GECKO), true); }); }); \ No newline at end of file