UNPKG

express-useragent

Version:

JS Library & ExpressJS user-agent middleware exposing

1 lines 47.4 kB
{"version":3,"sources":["../src/express-useragent.ts","../src/index.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from 'http';\n\nconst BOTS = [\n '\\\\+https:\\\\/\\\\/developers.google.com\\\\/\\\\+\\\\/web\\\\/snippet\\\\/',\n 'ad\\\\smonitoring',\n 'adsbot',\n 'apex',\n 'applebot',\n 'archive.org_bot',\n 'baiduspider',\n 'bingbot',\n 'chromeheadless',\n 'cloudflare',\n 'cloudinary',\n 'crawler',\n 'curl',\n 'discordbot',\n 'duckduckbot',\n 'embedly',\n 'exabot',\n 'facebookexternalhit',\n 'facebot',\n 'flipboard',\n 'google',\n 'googlebot',\n 'gsa-crawler',\n 'gurujibot',\n 'guzzlehttp',\n 'heritrix',\n 'ia_archiver',\n 'insights',\n 'linkedinbot',\n 'ltx71',\n 'mediapartners',\n 'msnbot',\n 'odklbot',\n 'phantom\\\\.js',\n 'phantomjs',\n 'pingdom',\n 'pinterest',\n 'python',\n 'rtlnieuws',\n 'skypeuripreview',\n 'slackbot',\n 'slurp',\n 'spbot',\n 'telegrambot',\n 'test\\\\scertificate',\n 'testing',\n 'tiabot',\n 'tumblr ',\n 'twitterbot',\n 'vkshare',\n 'web\\\\sscraper',\n 'wget',\n 'yandexbot',\n 'whatsapp',\n 'orangebot',\n 'smtbot',\n 'qwantify',\n 'mj12bot',\n 'ahrefsbot',\n 'seznambot',\n 'panscient\\\\.com',\n 'duckduckgo-favicons-bot',\n 'uptimerobot',\n 'semrushbot',\n 'postman',\n 'dotbot',\n 'zoominfobot',\n 'ifttt',\n 'sogou',\n 'ru_bot',\n 'researchscan',\n 'nimbostratus-bot',\n 'slack-imgproxy',\n 'node-superagent',\n 'go-http-client',\n 'jersey',\n 'dataprovider.com',\n 'github-camo',\n 'dispatch',\n 'checkmarknetwork',\n 'screaming frog',\n 'whatweb',\n 'daum',\n 'netcraftsurveyagent',\n 'mojeekbot',\n 'surdotlybot',\n 'springbot',\n] as const;\n\nconst IS_BOT_REGEXP = new RegExp(`^.*(${BOTS.join('|')}).*$`, 'i');\nconst SILK_REGEXP = /silk/i;\nconst SILK_ACCELERATED_REGEXP = /Silk-Accelerated=true/i;\nconst SMART_TV_REGEXP = /smart-tv|smarttv|googletv|appletv|hbbtv|pov_tv|netcast.tv/i;\nconst ANDROID_TABLET_REGEXP = /mobile/i;\nconst MOBILE_REGEXP = /mobile|^ios-/i;\nconst DALVIK_REGEXP = /dalvik/i;\nconst IOS_SCALE_REGEXP = /scale/i;\nconst WEBKIT_REGEXP = /applewebkit/i;\nconst WECHAT_REGEXP = /micromessenger/i;\n\nexport interface AgentDetails extends Record<string, unknown> {\n isYaBrowser: boolean;\n isAuthoritative: boolean;\n isMobile: boolean;\n isMobileNative: boolean;\n isTablet: boolean;\n isiPad: boolean;\n isiPod: boolean;\n isiPhone: boolean;\n isiPhoneNative: boolean;\n isAndroid: boolean;\n isAndroidNative: boolean;\n isBlackberry: boolean;\n isOpera: boolean;\n isIE: boolean;\n isEdge: boolean;\n isIECompatibilityMode: boolean;\n isSafari: boolean;\n isFirefox: boolean;\n isWebkit: boolean;\n isChrome: boolean;\n isKonqueror: boolean;\n isOmniWeb: boolean;\n isSeaMonkey: boolean;\n isFlock: boolean;\n isAmaya: boolean;\n isPhantomJS: boolean;\n isEpiphany: boolean;\n isDesktop: boolean;\n isWindows: boolean;\n isLinux: boolean;\n isLinux64: boolean;\n isMac: boolean;\n isChromeOS: boolean;\n isBada: boolean;\n isSamsung: boolean;\n isRaspberry: boolean;\n isBot: boolean | string;\n isCurl: boolean;\n isAndroidTablet: boolean;\n isWinJs: boolean;\n isKindleFire: boolean;\n isSilk: boolean;\n isCaptive: boolean;\n isSmartTV: boolean;\n isUC: boolean;\n isFacebook: boolean;\n isAlamoFire: boolean;\n isElectron: boolean;\n silkAccelerated: boolean;\n browser: string;\n version: string | number;\n os: string;\n platform: string;\n geoIp: Record<string, string | string[]>;\n source: string;\n isWechat: boolean;\n isWindowsPhone: boolean;\n electronVersion: string;\n SilkAccelerated?: boolean;\n}\n\nexport type HeadersLike = Partial<Record<string, string | string[] | undefined>>;\n\nconst DEFAULT_AGENT: AgentDetails = {\n isYaBrowser: false,\n isAuthoritative: true,\n isMobile: false,\n isMobileNative: false,\n isTablet: false,\n isiPad: false,\n isiPod: false,\n isiPhone: false,\n isiPhoneNative: false,\n isAndroid: false,\n isAndroidNative: false,\n isBlackberry: false,\n isOpera: false,\n isIE: false,\n isEdge: false,\n isIECompatibilityMode: false,\n isSafari: false,\n isFirefox: false,\n isWebkit: false,\n isChrome: false,\n isKonqueror: false,\n isOmniWeb: false,\n isSeaMonkey: false,\n isFlock: false,\n isAmaya: false,\n isPhantomJS: false,\n isEpiphany: false,\n isDesktop: false,\n isWindows: false,\n isLinux: false,\n isLinux64: false,\n isMac: false,\n isChromeOS: false,\n isBada: false,\n isSamsung: false,\n isRaspberry: false,\n isBot: false,\n isCurl: false,\n isAndroidTablet: false,\n isWinJs: false,\n isKindleFire: false,\n isSilk: false,\n isCaptive: false,\n isSmartTV: false,\n isUC: false,\n isFacebook: false,\n isAlamoFire: false,\n isElectron: false,\n silkAccelerated: false,\n browser: 'unknown',\n version: 'unknown',\n os: 'unknown',\n platform: 'unknown',\n isWechat: false,\n isWindowsPhone: false,\n SilkAccelerated: false,\n geoIp: {},\n source: '',\n electronVersion: '',\n};\n\nfunction createDefaultAgent(): AgentDetails {\n return {\n ...DEFAULT_AGENT,\n geoIp: {},\n source: '',\n electronVersion: '',\n };\n}\n\nexport class UserAgent {\n private readonly versions: Record<string, RegExp> = {\n Edge: /(?:edge|edga|edgios|edg)\\/([\\d\\w.-]+)/i,\n Firefox: /(?:firefox|fxios)\\/([\\d\\w.-]+)/i,\n IE: /msie\\s([\\d.]+[\\d])|trident\\/\\d+\\.\\d+;.*[rv:]+(\\d+\\.\\d)/i,\n Chrome: /(?:chrome|crios)\\/([\\d\\w.-]+)/i,\n Chromium: /chromium\\/([\\d\\w.-]+)/i,\n Safari: /(version|safari)\\/([\\d\\w.-]+)/i,\n Opera: /version\\/([\\d\\w.-]+)|OPR\\/([\\d\\w.-]+)/i,\n Ps3: /([\\d\\w.-]+)\\)\\s*$/i,\n Psp: /([\\d\\w.-]+)\\)?\\s*$/i,\n Amaya: /amaya\\/([\\d\\w.-]+)/i,\n SeaMonkey: /seamonkey\\/([\\d\\w.-]+)/i,\n OmniWeb: /omniweb\\/v([\\d\\w.-]+)/i,\n Flock: /flock\\/([\\d\\w.-]+)/i,\n Epiphany: /epiphany\\/([\\d\\w.-]+)/i,\n WinJs: /msapphost\\/([\\d\\w.-]+)/i,\n PhantomJS: /phantomjs\\/([\\d\\w.-]+)/i,\n AlamoFire: /alamofire\\/([\\d\\w.-]+)/i,\n UC: /ucbrowser\\/([\\d\\w.]+)/i,\n Facebook: /FBAV\\/([\\d\\w.]+)/i,\n WebKit: /applewebkit\\/([\\d\\w.]+)/i,\n Wechat: /micromessenger\\/([\\d\\w.]+)/i,\n Electron: /Electron\\/([\\d\\w.]+)/i,\n };\n\n private readonly browsers: Record<string, RegExp> = {\n YaBrowser: /yabrowser/i,\n Edge: /edge|edga|edgios|edg/i,\n Amaya: /amaya/i,\n Konqueror: /konqueror/i,\n Epiphany: /epiphany/i,\n SeaMonkey: /seamonkey/i,\n Flock: /flock/i,\n OmniWeb: /omniweb/i,\n Chromium: /chromium/i,\n Chrome: /chrome|crios/i,\n Safari: /safari/i,\n IE: /msie|trident/i,\n Opera: /opera|OPR\\//i,\n PS3: /playstation 3/i,\n PSP: /playstation portable/i,\n Firefox: /firefox|fxios/i,\n WinJs: /msapphost/i,\n PhantomJS: /phantomjs/i,\n AlamoFire: /alamofire/i,\n UC: /UCBrowser/i,\n Facebook: /FBA[NV]/,\n };\n\n private readonly os: Record<string, RegExp> = {\n Windows11: /\\bwindows(?:\\s|_|)11(?:\\.\\d+)?/i,\n Windows10: /windows nt 10\\.0/i,\n Windows81: /windows nt 6\\.3/i,\n Windows8: /windows nt 6\\.2/i,\n Windows7: /windows nt 6\\.1/i,\n UnknownWindows: /windows nt 6\\.\\d+/i,\n WindowsVista: /windows nt 6\\.0/i,\n Windows2003: /windows nt 5\\.2/i,\n WindowsXP: /windows nt 5\\.1/i,\n Windows2000: /windows nt 5\\.0/i,\n WindowsPhone81: /windows phone 8\\.1/i,\n WindowsPhone80: /windows phone 8\\.0/i,\n OSXCheetah: /os x 10[._]0/i,\n OSXPuma: /os x 10[._]1(\\D|$)/i,\n OSXJaguar: /os x 10[._]2/i,\n OSXPanther: /os x 10[._]3/i,\n OSXTiger: /os x 10[._]4/i,\n OSXLeopard: /os x 10[._]5/i,\n OSXSnowLeopard: /os x 10[._]6/i,\n OSXLion: /os x 10[._]7/i,\n OSXMountainLion: /os x 10[._]8/i,\n OSXMavericks: /os x 10[._]9/i,\n OSXYosemite: /os x 10[._]10/i,\n OSXElCapitan: /os x 10[._]11/i,\n MacOSSierra: /os x 10[._]12/i,\n MacOSHighSierra: /os x 10[._]13/i,\n MacOSMojave: /os x 10[._]14/i,\n MacOSCatalina: /os x 10[._]15/i,\n MacOSBigSur: /(mac os x 10[._]16(?:[._]\\d+)?|mac os (?:x )?11[._]\\d+)/i,\n MacOSMonterey: /mac os (?:x )?12[._]\\d+/i,\n MacOSVentura: /mac os (?:x )?13[._]\\d+/i,\n MacOSSonoma: /mac os (?:x )?14[._]\\d+/i,\n MacOSSequoia: /mac os (?:x )?15[._]\\d+/i,\n MacOSTahoe: /mac os (?:x )?26[._]\\d+/i,\n Mac: /os x/i,\n Linux: /linux/i,\n Linux64: /linux x86_64/i,\n ChromeOS: /cros/i,\n Wii: /wii/i,\n PS3: /playstation 3/i,\n PSP: /playstation portable/i,\n iPad: /\\(iPad.*os (\\d+)[._](\\d+)/i,\n iPhone: /\\(iPhone.*os (\\d+)[._](\\d+)/i,\n iOS: /ios/i,\n Bada: /Bada\\/(\\d+)\\.(\\d+)/i,\n Curl: /curl\\/(\\d+)\\.(\\d+)\\.(\\d+)/i,\n Electron: /Electron\\/(\\d+)\\.(\\d+)\\.(\\d+)/i,\n };\n\n private readonly platform: Record<string, RegExp> = {\n Windows: /windows nt/i,\n WindowsPhone: /windows phone/i,\n Mac: /macintosh/i,\n Linux: /linux/i,\n Wii: /wii/i,\n Playstation: /playstation/i,\n iPad: /ipad/i,\n iPod: /ipod/i,\n iPhone: /iphone/i,\n Android: /android/i,\n Blackberry: /blackberry/i,\n Samsung: /samsung/i,\n Curl: /curl/i,\n Electron: /Electron/i,\n iOS: /^ios-/i,\n };\n\n public Agent: AgentDetails;\n\n constructor() {\n this.Agent = createDefaultAgent();\n }\n\n public reset(): this {\n this.Agent = createDefaultAgent();\n return this;\n }\n\n public testNginxGeoIP(headers: HeadersLike | IncomingHttpHeaders): this {\n Object.entries(headers ?? {}).forEach(([key, value]) => {\n if (/^GEOIP/i.test(key) && value !== undefined) {\n this.Agent.geoIp[key] = Array.isArray(value) ? value.join(',') : value;\n }\n });\n return this;\n }\n\n public testBot(): void {\n const match = IS_BOT_REGEXP.exec(this.Agent.source.toLowerCase());\n if (match) {\n this.Agent.isBot = match[1];\n } else if (!this.Agent.isAuthoritative) {\n this.Agent.isBot = /bot/i.test(this.Agent.source);\n }\n }\n\n public testSmartTV(): void {\n this.Agent.isSmartTV = SMART_TV_REGEXP.test(this.Agent.source.toLowerCase());\n }\n\n public testMobile(): void {\n if (this.Agent.isWindows || this.Agent.isLinux || this.Agent.isMac || this.Agent.isChromeOS) {\n this.Agent.isDesktop = true;\n } else if (this.Agent.isAndroid || this.Agent.isSamsung) {\n this.Agent.isMobile = true;\n }\n\n if (\n this.Agent.isiPad ||\n this.Agent.isiPod ||\n this.Agent.isiPhone ||\n this.Agent.isBada ||\n this.Agent.isBlackberry ||\n this.Agent.isAndroid ||\n this.Agent.isWindowsPhone\n ) {\n this.Agent.isMobile = true;\n this.Agent.isDesktop = false;\n }\n\n if (MOBILE_REGEXP.test(this.Agent.source)) {\n this.Agent.isMobile = true;\n this.Agent.isDesktop = false;\n }\n\n if (DALVIK_REGEXP.test(this.Agent.source)) {\n this.Agent.isAndroidNative = true;\n this.Agent.isMobileNative = true;\n }\n\n if (IOS_SCALE_REGEXP.test(this.Agent.source)) {\n this.Agent.isiPhoneNative = true;\n this.Agent.isMobileNative = true;\n }\n }\n\n public testAndroidTablet(): void {\n if (this.Agent.isAndroid && !ANDROID_TABLET_REGEXP.test(this.Agent.source)) {\n this.Agent.isAndroidTablet = true;\n }\n }\n\n public testTablet(): void {\n if (this.Agent.isiPad || this.Agent.isAndroidTablet || this.Agent.isKindleFire) {\n this.Agent.isTablet = true;\n }\n\n if (/tablet/i.test(this.Agent.source)) {\n this.Agent.isTablet = true;\n }\n }\n\n public testCompatibilityMode(): void {\n if (!this.Agent.isIE) {\n return;\n }\n\n const tridentMatch = /Trident\\/(\\d)\\.0/i.exec(this.Agent.source);\n if (!tridentMatch) {\n return;\n }\n\n const tridentVersion = parseInt(tridentMatch[1], 10);\n const version = parseInt(String(this.Agent.version), 10);\n\n if (version === 7 && tridentVersion === 7) {\n this.Agent.isIECompatibilityMode = true;\n this.Agent.version = '11.0';\n }\n if (version === 7 && tridentVersion === 6) {\n this.Agent.isIECompatibilityMode = true;\n this.Agent.version = '10.0';\n }\n if (version === 7 && tridentVersion === 5) {\n this.Agent.isIECompatibilityMode = true;\n this.Agent.version = '9.0';\n }\n if (version === 7 && tridentVersion === 4) {\n this.Agent.isIECompatibilityMode = true;\n this.Agent.version = '8.0';\n }\n }\n\n public testSilk(): string | false {\n if (SILK_REGEXP.test(this.Agent.source)) {\n this.Agent.isSilk = true;\n }\n\n if (SILK_ACCELERATED_REGEXP.test(this.Agent.source)) {\n this.Agent.silkAccelerated = true;\n this.Agent.SilkAccelerated = true;\n }\n\n return this.Agent.isSilk ? 'Silk' : false;\n }\n\n public testKindleFire(): string | false {\n const { source } = this.Agent;\n if (/KFOT/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire';\n }\n if (/KFTT/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HD';\n }\n if (/KFJWI/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HD 8.9';\n }\n if (/KFJWA/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HD 8.9 4G';\n }\n if (/KFSOWI/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HD 7';\n }\n if (/KFTHWI/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HDX 7';\n }\n if (/KFTHWA/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HDX 7 4G';\n }\n if (/KFAPWI/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HDX 8.9';\n }\n if (/KFAPWA/gi.test(source)) {\n this.Agent.isKindleFire = true;\n return 'Kindle Fire HDX 8.9 4G';\n }\n return false;\n }\n\n public testCaptiveNetwork(): string | false {\n if (/CaptiveNetwork/gi.test(this.Agent.source)) {\n this.Agent.isCaptive = true;\n this.Agent.isMac = true;\n this.Agent.platform = 'Apple Mac';\n return 'CaptiveNetwork';\n }\n return false;\n }\n\n public testWebkit(): void {\n if (this.Agent.browser === 'unknown' && WEBKIT_REGEXP.test(this.Agent.source)) {\n this.Agent.browser = 'Apple WebKit';\n this.Agent.isWebkit = true;\n }\n }\n\n public testWechat(): void {\n if (WECHAT_REGEXP.test(this.Agent.source)) {\n this.Agent.isWechat = true;\n this.Agent.version = this.getWechatVersion(this.Agent.source);\n }\n }\n\n public parse(source: string): AgentDetails {\n return new UserAgent().hydrate(source).Agent;\n }\n\n public hydrate(source: string): this {\n this.Agent = createDefaultAgent();\n this.Agent.source = source.trim();\n this.Agent.os = this.getOS(this.Agent.source);\n this.Agent.platform = this.getPlatform(this.Agent.source);\n this.Agent.browser = this.getBrowser(this.Agent.source);\n this.Agent.version = this.getBrowserVersion(this.Agent.source);\n this.Agent.electronVersion = this.getElectronVersion(this.Agent.source);\n this.testBot();\n this.testSmartTV();\n this.testMobile();\n this.testAndroidTablet();\n this.testTablet();\n this.testCompatibilityMode();\n this.testSilk();\n this.testKindleFire();\n this.testCaptiveNetwork();\n this.testWebkit();\n this.testWechat();\n return this;\n }\n\n private getBrowser(string: string): string {\n const agent = this.Agent;\n if (this.browsers.YaBrowser.test(string)) {\n agent.isYaBrowser = true;\n return 'YaBrowser';\n }\n if (this.browsers.AlamoFire.test(string)) {\n agent.isAlamoFire = true;\n return 'AlamoFire';\n }\n if (this.browsers.Edge.test(string)) {\n agent.isEdge = true;\n return 'Edge';\n }\n if (this.browsers.PhantomJS.test(string)) {\n agent.isPhantomJS = true;\n return 'PhantomJS';\n }\n if (this.browsers.Konqueror.test(string)) {\n agent.isKonqueror = true;\n return 'Konqueror';\n }\n if (this.browsers.Amaya.test(string)) {\n agent.isAmaya = true;\n return 'Amaya';\n }\n if (this.browsers.Epiphany.test(string)) {\n agent.isEpiphany = true;\n return 'Epiphany';\n }\n if (this.browsers.SeaMonkey.test(string)) {\n agent.isSeaMonkey = true;\n return 'SeaMonkey';\n }\n if (this.browsers.Flock.test(string)) {\n agent.isFlock = true;\n return 'Flock';\n }\n if (this.browsers.OmniWeb.test(string)) {\n agent.isOmniWeb = true;\n return 'OmniWeb';\n }\n if (this.browsers.Opera.test(string)) {\n agent.isOpera = true;\n return 'Opera';\n }\n if (this.browsers.Chromium.test(string)) {\n agent.isChrome = true;\n return 'Chromium';\n }\n if (this.browsers.Facebook.test(string)) {\n agent.isFacebook = true;\n return 'Facebook';\n }\n if (this.browsers.Chrome.test(string)) {\n agent.isChrome = true;\n return 'Chrome';\n }\n if (this.browsers.WinJs.test(string)) {\n agent.isWinJs = true;\n return 'WinJs';\n }\n if (this.browsers.IE.test(string)) {\n agent.isIE = true;\n return 'IE';\n }\n if (this.browsers.Firefox.test(string)) {\n agent.isFirefox = true;\n return 'Firefox';\n }\n if (this.browsers.Safari.test(string)) {\n agent.isSafari = true;\n return 'Safari';\n }\n if (this.browsers.PS3.test(string)) {\n return 'ps3';\n }\n if (this.browsers.PSP.test(string)) {\n return 'psp';\n }\n if (this.browsers.UC.test(string)) {\n agent.isUC = true;\n return 'UCBrowser';\n }\n\n if (string.includes('Dalvik')) {\n return 'unknown';\n }\n\n if (!string.startsWith('Mozilla')) {\n const guess = /^([\\d\\w.-]+)\\/[\\d\\w.-]+/i.exec(string);\n if (guess) {\n agent.isAuthoritative = false;\n return guess[1];\n }\n }\n\n return 'unknown';\n }\n\n private getBrowserVersion(string: string): string {\n const agent = this.Agent;\n const browser = agent.browser;\n\n const match = (exp: RegExp, index = 1) => {\n const result = string.match(exp);\n return result ? (result[index] ?? result[1] ?? 'unknown') : null;\n };\n\n switch (browser) {\n case 'Edge':\n return match(this.versions.Edge) ?? 'unknown';\n case 'PhantomJS':\n return match(this.versions.PhantomJS) ?? 'unknown';\n case 'Chrome':\n return match(this.versions.Chrome) ?? 'unknown';\n case 'Chromium':\n return match(this.versions.Chromium) ?? 'unknown';\n case 'Safari':\n return match(this.versions.Safari, 2) ?? 'unknown';\n case 'Opera': {\n const operaMatch = string.match(this.versions.Opera);\n if (operaMatch) {\n return operaMatch[1] || operaMatch[2] || 'unknown';\n }\n return 'unknown';\n }\n case 'Firefox':\n return match(this.versions.Firefox) ?? 'unknown';\n case 'WinJs':\n return match(this.versions.WinJs) ?? 'unknown';\n case 'IE': {\n const ieMatch = string.match(this.versions.IE);\n if (ieMatch) {\n return ieMatch[2] ?? ieMatch[1] ?? 'unknown';\n }\n return 'unknown';\n }\n case 'ps3':\n return match(this.versions.Ps3) ?? 'unknown';\n case 'psp':\n return match(this.versions.Psp) ?? 'unknown';\n case 'Amaya':\n return match(this.versions.Amaya) ?? 'unknown';\n case 'Epiphany':\n return match(this.versions.Epiphany) ?? 'unknown';\n case 'SeaMonkey':\n return match(this.versions.SeaMonkey) ?? 'unknown';\n case 'Flock':\n return match(this.versions.Flock) ?? 'unknown';\n case 'OmniWeb':\n return match(this.versions.OmniWeb) ?? 'unknown';\n case 'UCBrowser':\n return match(this.versions.UC) ?? 'unknown';\n case 'Facebook':\n return match(this.versions.Facebook) ?? 'unknown';\n default:\n if (browser !== 'unknown') {\n const regex = new RegExp(`${browser}[\\\\/ ]([\\\\d\\\\w.\\\\-]+)`, 'i');\n const genericMatch = string.match(regex);\n if (genericMatch) {\n return genericMatch[1];\n }\n } else {\n this.testWebkit();\n if (this.Agent.isWebkit) {\n const webkitMatch = string.match(this.versions.WebKit);\n if (webkitMatch) {\n return webkitMatch[1];\n }\n }\n }\n }\n\n return 'unknown';\n }\n\n private getWechatVersion(string: string): string {\n const match = string.match(this.versions.Wechat);\n return match ? match[1] : 'unknown';\n }\n\n private getElectronVersion(string: string): string {\n const match = string.match(this.versions.Electron);\n if (match) {\n this.Agent.isElectron = true;\n return match[1];\n }\n return '';\n }\n\n private getOS(string: string): string {\n if (this.os.WindowsVista.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows Vista';\n }\n if (this.os.Windows7.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 7';\n }\n if (this.os.Windows8.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 8';\n }\n if (this.os.Windows81.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 8.1';\n }\n if (this.os.Windows11.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 11';\n }\n if (this.os.Windows10.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 10.0';\n }\n if (this.os.Windows2003.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 2003';\n }\n if (this.os.WindowsXP.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows XP';\n }\n if (this.os.Windows2000.test(string)) {\n this.Agent.isWindows = true;\n return 'Windows 2000';\n }\n if (this.os.WindowsPhone81.test(string)) {\n this.Agent.isWindowsPhone = true;\n return 'Windows Phone 8.1';\n }\n if (this.os.WindowsPhone80.test(string)) {\n this.Agent.isWindowsPhone = true;\n return 'Windows Phone 8.0';\n }\n if (this.os.Linux64.test(string)) {\n this.Agent.isLinux = true;\n this.Agent.isLinux64 = true;\n return 'Linux 64';\n }\n if (this.os.Linux.test(string)) {\n this.Agent.isLinux = true;\n return 'Linux';\n }\n if (this.os.ChromeOS.test(string)) {\n this.Agent.isChromeOS = true;\n return 'Chrome OS';\n }\n if (this.os.Wii.test(string)) {\n return 'Wii';\n }\n if (this.os.PS3.test(string)) {\n return 'Playstation';\n }\n if (this.os.PSP.test(string)) {\n return 'Playstation';\n }\n if (this.os.OSXCheetah.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Cheetah';\n }\n if (this.os.OSXPuma.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Puma';\n }\n if (this.os.OSXJaguar.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Jaguar';\n }\n if (this.os.OSXPanther.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Panther';\n }\n if (this.os.OSXTiger.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Tiger';\n }\n if (this.os.OSXLeopard.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Leopard';\n }\n if (this.os.OSXSnowLeopard.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Snow Leopard';\n }\n if (this.os.OSXLion.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Lion';\n }\n if (this.os.OSXMountainLion.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Mountain Lion';\n }\n if (this.os.OSXMavericks.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Mavericks';\n }\n if (this.os.OSXYosemite.test(string)) {\n this.Agent.isMac = true;\n return 'OS X Yosemite';\n }\n if (this.os.OSXElCapitan.test(string)) {\n this.Agent.isMac = true;\n return 'OS X El Capitan';\n }\n if (this.os.MacOSSierra.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Sierra';\n }\n if (this.os.MacOSHighSierra.test(string)) {\n this.Agent.isMac = true;\n return 'macOS High Sierra';\n }\n if (this.os.MacOSMojave.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Mojave';\n }\n if (this.os.MacOSCatalina.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Catalina';\n }\n if (this.os.MacOSBigSur.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Big Sur';\n }\n if (this.os.MacOSMonterey.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Monterey';\n }\n if (this.os.MacOSVentura.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Ventura';\n }\n if (this.os.MacOSSonoma.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Sonoma';\n }\n if (this.os.MacOSSequoia.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Sequoia';\n }\n if (this.os.MacOSTahoe.test(string)) {\n this.Agent.isMac = true;\n return 'macOS Tahoe';\n }\n if (this.os.Mac.test(string)) {\n this.Agent.isMac = true;\n return 'OS X';\n }\n const iPadMatch = string.match(this.os.iPad);\n if (iPadMatch) {\n this.Agent.isiPad = true;\n return iPadMatch[0].replace('_', '.');\n }\n const iPhoneMatch = string.match(this.os.iPhone);\n if (iPhoneMatch) {\n this.Agent.isiPhone = true;\n return iPhoneMatch[0].replace('_', '.');\n }\n if (this.os.Bada.test(string)) {\n this.Agent.isBada = true;\n return 'Bada';\n }\n if (this.os.Curl.test(string)) {\n this.Agent.isCurl = true;\n return 'Curl';\n }\n if (this.os.iOS.test(string)) {\n this.Agent.isiPhone = true;\n return 'iOS';\n }\n if (this.os.Electron.test(string)) {\n this.Agent.isElectron = true;\n return 'Electron';\n }\n return 'unknown';\n }\n\n private getPlatform(string: string): string {\n if (this.platform.Windows.test(string)) {\n return 'Microsoft Windows';\n }\n if (this.platform.WindowsPhone.test(string)) {\n this.Agent.isWindowsPhone = true;\n return 'Microsoft Windows Phone';\n }\n if (this.platform.Mac.test(string)) {\n return 'Apple Mac';\n }\n if (this.platform.Curl.test(string)) {\n return 'Curl';\n }\n if (this.platform.Electron.test(string)) {\n this.Agent.isElectron = true;\n return 'Electron';\n }\n if (this.platform.Android.test(string)) {\n this.Agent.isAndroid = true;\n return 'Android';\n }\n if (this.platform.Blackberry.test(string)) {\n this.Agent.isBlackberry = true;\n return 'Blackberry';\n }\n if (this.platform.Linux.test(string)) {\n return 'Linux';\n }\n if (this.platform.Wii.test(string)) {\n return 'Wii';\n }\n if (this.platform.Playstation.test(string)) {\n return 'Playstation';\n }\n if (this.platform.iPad.test(string)) {\n this.Agent.isiPad = true;\n return 'iPad';\n }\n if (this.platform.iPod.test(string)) {\n this.Agent.isiPod = true;\n return 'iPod';\n }\n if (this.platform.iPhone.test(string)) {\n this.Agent.isiPhone = true;\n return 'iPhone';\n }\n if (this.platform.Samsung.test(string)) {\n this.Agent.isSamsung = true;\n return 'Samsung';\n }\n if (this.platform.iOS.test(string)) {\n return 'Apple iOS';\n }\n return 'unknown';\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\nimport type { IncomingHttpHeaders } from 'http';\nimport { UserAgent } from './express-useragent';\n\nexport type { AgentDetails, HeadersLike } from './express-useragent';\nexport { UserAgent } from './express-useragent';\n\nexport interface UserAgentAugmentedRequest extends Request {\n useragent?: ReturnType<UserAgent['parse']>;\n headers: IncomingHttpHeaders & Record<string, string | string[] | undefined>;\n}\n\nexport const useragent = new UserAgent();\n\nexport type UserAgentMiddleware = (req: Request, res: Response, next: NextFunction) => void;\n\nexport const express = (): UserAgentMiddleware => {\n return (req: UserAgentAugmentedRequest, res: Response, next: NextFunction) => {\n const headers = req.headers || {};\n const resolveHeader = (value: string | string[] | undefined): string => {\n if (Array.isArray(value)) {\n return value.join(' ');\n }\n return value ?? '';\n };\n\n const uaHeader = resolveHeader(headers['user-agent']);\n const ucHeader = resolveHeader(headers['x-ucbrowser-ua']);\n const source = (ucHeader || uaHeader || 'unknown').trim() || 'unknown';\n\n const parser = new UserAgent().hydrate(source);\n parser.testNginxGeoIP(headers);\n // middleware duplicates tests to match legacy behaviour\n parser.testBot();\n parser.testMobile();\n parser.testAndroidTablet();\n parser.testTablet();\n parser.testCompatibilityMode();\n parser.testSilk();\n parser.testKindleFire();\n parser.testWechat();\n\n req.useragent = parser.Agent;\n res.locals.useragent = parser.Agent;\n\n next();\n };\n};\nexport const useragentMiddleware = express;\n\nexport default useragent;\n"],"mappings":"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","names":[]}