Bump version 2.0.7

This commit is contained in:
Faisal Salman
2025-12-09 13:15:29 +07:00
parent 82d50451a2
commit 7bc177de79
19 changed files with 365 additions and 282 deletions

View File

@@ -54,21 +54,52 @@
- `browser.name`, `browser.type`, `cpu.architecture`, `device.type`, `device.vendor`, `engine.name`, `os.name` - `browser.name`, `browser.type`, `cpu.architecture`, `device.type`, `device.vendor`, `engine.name`, `os.name`
- **`'ua-parser-js/extensions'`**: Predefined extensions for various use cases: - **`'ua-parser-js/extensions'`**: Predefined extensions for various use cases:
- `Bots`, `Crawlers`, `CLIs`, `Emails`, `ExtraDevices`, `Fetchers`, `InApps`, `Libraries`, `Mediaplayers` - `Bots`, `Crawlers`, `CLIs`, `Emails`, `ExtraDevices`, `Fetchers`, `InApps`, `Libraries`, `Mediaplayers`, `Vehicles`
- **`'ua-parser-js/helpers'`**: Provides utility methods to extend detection functionality: - **`'ua-parser-js/helpers'`**: Provides utility methods to extend detection functionality:
- `getDeviceVendor()`: Guesses the device vendor based on its model name - `isFrozenUA()`: Checks if the user-agent matches a frozen/reduced user-agent pattern
- `isAppleSilicon()`: Detects Apple Silicon device properties
- `isAIBot()`: Checks if the user-agent is an AI bot - **`'ua-parser-js/bot-detection'`**:
- `isAIAssistant()`: Checks if the user-agent is an AI assistant
- `isAICrawler()`: Checks if the user-agent is an AI crawler
- `isBot()`: Checks if the user-agent is a bot - `isBot()`: Checks if the user-agent is a bot
- **`'ua-parser-js/browser-detection'`**:
- `isChromeFamily()`: Checks if the browser is Chrome-based (uses Blink engine) — e.g., New Opera, New Edge, Vivaldi, Brave, Arc, etc. - `isChromeFamily()`: Checks if the browser is Chrome-based (uses Blink engine) — e.g., New Opera, New Edge, Vivaldi, Brave, Arc, etc.
- `isElectron()`: Detects if current window is running within Electron - `isElectron()`: Detects if current window is running within Electron
- `isFromEU()`: Detects if current browser's timezone is from an EU country - `isFromEU()`: Detects if current browser's timezone is from an EU country
- `isFrozenUA()`: Checks if the user-agent matches a frozen/reduced user-agent pattern
- `isStandalonePWA()`: Detects if current window is a standalone PWA - `isStandalonePWA()`: Detects if current window is a standalone PWA
- **`'ua-parser-js/device-detection'`**:
- `getDeviceVendor()`: Guesses the device vendor based on its model name
- `isAppleSilicon()`: Detects Apple Silicon device properties
--- ---
## Version 2.0.7
- Add support for chaining `withClientHints()` & `withFeatureCheck()`
- Add new browser: Atlas, Steam
- Add new device vendor: Anbernic, Logitech, Valve
- Improve device detection: Xiaomi
- Improve OS detection: iOS
- Split `helpers` submodule into several new submodules:
- `bot-detection`:
- `isAIAssistant()`
- `isAICrawler()`
- `isBot()`
- `browser-detection`
- `isChromeFamily()`
- `isElectron()`
- `isFromEU()`
- `isStandalonePWA()`
- `device-detection`
- `getDeviceVendor()`
- `isAppleSilicon()`
- Update `extensions` submodule:
- Add new fetcher: Nova Act
- Add new library: Bun, Dart, Deno, hackney, Node.js, rest-client, undici
## Version 2.0.6 ## Version 2.0.6
- Add new CLI feature: processing batch user-agent data from file and output as JSON - Add new CLI feature: processing batch user-agent data from file and output as JSON
- Fix `setUA()`: trim leading space from user-agent string input - Fix `setUA()`: trim leading space from user-agent string input

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

32
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.6", "version": "2.0.7",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.6", "version": "2.0.7",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -33,7 +33,7 @@
"devDependencies": { "devDependencies": {
"@babel/parser": "7.15.8", "@babel/parser": "7.15.8",
"@babel/traverse": "7.23.2", "@babel/traverse": "7.23.2",
"@playwright/test": "^1.49.0", "@playwright/test": "^1.57.0",
"jshint": "~2.13.6", "jshint": "~2.13.6",
"mocha": "~8.2.0", "mocha": "~8.2.0",
"requirejs": "2.3.2", "requirejs": "2.3.2",
@@ -343,12 +343,13 @@
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
"version": "1.49.0", "version": "1.57.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz",
"integrity": "sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==", "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"playwright": "1.49.0" "playwright": "1.57.0"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@@ -2042,12 +2043,13 @@
} }
}, },
"node_modules/playwright": { "node_modules/playwright": {
"version": "1.49.0", "version": "1.57.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz",
"integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"playwright-core": "1.49.0" "playwright-core": "1.57.0"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@@ -2060,10 +2062,11 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.49.0", "version": "1.57.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz",
"integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"bin": { "bin": {
"playwright-core": "cli.js" "playwright-core": "cli.js"
}, },
@@ -2077,6 +2080,7 @@
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"

View File

@@ -1,7 +1,7 @@
{ {
"title": "UAParser.js", "title": "UAParser.js",
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.6", "version": "2.0.7",
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)", "author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
"description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment", "description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment",
"keywords": [ "keywords": [
@@ -246,7 +246,7 @@
"devDependencies": { "devDependencies": {
"@babel/parser": "7.15.8", "@babel/parser": "7.15.8",
"@babel/traverse": "7.23.2", "@babel/traverse": "7.23.2",
"@playwright/test": "^1.49.0", "@playwright/test": "^1.57.0",
"jshint": "~2.13.6", "jshint": "~2.13.6",
"mocha": "~8.2.0", "mocha": "~8.2.0",
"requirejs": "2.3.2", "requirejs": "2.3.2",

View File

@@ -12,8 +12,8 @@
/*jshint esversion: 6 */ /*jshint esversion: 6 */
import { UAParser } from '../main/ua-parser.mjs'; import { UAParser } from '../main/ua-parser.mjs';
import { Extension, BrowserType } from '../enums/ua-parser-enums.mjs';
import { Bots, Crawlers, Fetchers } from '../extensions/ua-parser-extensions.mjs'; import { Bots, Crawlers, Fetchers } from '../extensions/ua-parser-extensions.mjs';
import { BrowserType, Extension } from '../enums/ua-parser-enums.mjs';
const { Crawler, Fetcher } = Extension.BrowserName; const { Crawler, Fetcher } = Extension.BrowserName;
class BotList { class BotList {
@@ -40,6 +40,9 @@ const BotTypes = new BotList(Bots, 'type', [
const AIAssistants = new BotList(Fetchers, 'name', [ const AIAssistants = new BotList(Fetchers, 'name', [
// Amazon
Fetcher.AMAZON_NOVA_ACT,
// Anthropic // Anthropic
Fetcher.ANTHROPIC_CLAUDE_USER, Fetcher.ANTHROPIC_CLAUDE_USER,

View File

@@ -12,7 +12,9 @@
/*jshint esversion: 6 */ /*jshint esversion: 6 */
import { UAParser } from '../main/ua-parser.mjs'; import { UAParser } from '../main/ua-parser.mjs';
import { EngineName } from '../enums/ua-parser-enums.mjs';
import { isStandalonePWA } from 'is-standalone-pwa'; import { isStandalonePWA } from 'is-standalone-pwa';
import { isFromEU } from 'detect-europe-js';
const isChromeFamily = val => !!( const isChromeFamily = val => !!(
(typeof val === 'string' ? (typeof val === 'string' ?
@@ -20,11 +22,13 @@ const isChromeFamily = val => !!(
val.engine val.engine
)?.is(EngineName.BLINK)); )?.is(EngineName.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
export { export {
isChromeFamily, isChromeFamily,
isElectron, isElectron,
isFromEU,
isStandalonePWA isStandalonePWA
} }

View File

@@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js // Source: /src/enums/ua-parser-enums.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.6 /* Enums for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -19,6 +19,7 @@ export const BrowserName: Readonly<{
AMAYA: 'Amaya', AMAYA: 'Amaya',
ANDROID: 'Android Browser', ANDROID: 'Android Browser',
ARORA: 'Arora', ARORA: 'Arora',
ATLAS: 'Atlas',
AVANT: 'Avant', AVANT: 'Avant',
AVAST: 'Avast Secure Browser', AVAST: 'Avast Secure Browser',
AVG: 'AVG Secure Browser', AVG: 'AVG Secure Browser',
@@ -147,6 +148,7 @@ export const BrowserName: Readonly<{
SNAPCHAT: 'Snapchat', SNAPCHAT: 'Snapchat',
SOGOU_EXPLORER: 'Sogou Explorer', SOGOU_EXPLORER: 'Sogou Explorer',
SOGOU_MOBILE: 'Sogou Mobile', SOGOU_MOBILE: 'Sogou Mobile',
STEAM: 'Steam',
SURF: 'Surf', SURF: 'Surf',
SWIFTFOX: 'Swiftfox', SWIFTFOX: 'Swiftfox',
TESLA: 'Tesla', TESLA: 'Tesla',
@@ -228,8 +230,9 @@ export const DeviceVendor: Readonly<{
ACER: 'Acer', ACER: 'Acer',
ADVAN: 'Advan', ADVAN: 'Advan',
ALCATEL: 'Alcatel', ALCATEL: 'Alcatel',
APPLE: 'Apple',
AMAZON: 'Amazon', AMAZON: 'Amazon',
ANBERNIC: 'Anbernic',
APPLE: 'Apple',
ARCHOS: 'Archos', ARCHOS: 'Archos',
ASUS: 'ASUS', ASUS: 'ASUS',
ATT: 'AT&T', ATT: 'AT&T',
@@ -258,6 +261,7 @@ export const DeviceVendor: Readonly<{
LAVA: 'Lava', LAVA: 'Lava',
LENOVO: 'Lenovo', LENOVO: 'Lenovo',
LG: 'LG', LG: 'LG',
LOGITECH: 'Logitech',
MEIZU: 'Meizu', MEIZU: 'Meizu',
MICROMAX: 'Micromax', MICROMAX: 'Micromax',
MICROSOFT: 'Microsoft', MICROSOFT: 'Microsoft',
@@ -291,6 +295,7 @@ export const DeviceVendor: Readonly<{
TECNO: 'TECNO', TECNO: 'TECNO',
TESLA: 'Tesla', TESLA: 'Tesla',
ULEFONE: 'Ulefone', ULEFONE: 'Ulefone',
VALVE: 'Valve',
VIVO: 'Vivo', VIVO: 'Vivo',
VIZIO: 'Vizio', VIZIO: 'Vizio',
VODAFONE: 'Vodafone', VODAFONE: 'Vodafone',
@@ -631,6 +636,7 @@ export const Extension: Readonly<{
}, },
Fetcher: { Fetcher: {
AHREFS_SITEAUDIT: 'AhrefsSiteAudit', AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
AMAZON_NOVA_ACT: 'NovaAct',
ANTHROPIC_CLAUDE_USER: 'Claude-User', ANTHROPIC_CLAUDE_USER: 'Claude-User',
ASANA: 'Asana', ASANA: 'Asana',
BETTER_UPTIME_BOT: 'Better Uptime Bot', BETTER_UPTIME_BOT: 'Better Uptime Bot',
@@ -708,9 +714,13 @@ export const Extension: Readonly<{
AIOHTTP: 'aiohttp', AIOHTTP: 'aiohttp',
APACHE_HTTPCLIENT: 'Apache-HttpClient', APACHE_HTTPCLIENT: 'Apache-HttpClient',
AXIOS: 'axios', AXIOS: 'axios',
BUN: 'Bun',
DART: 'Dart',
DENO: 'Deno',
GO_HTTP_CLIENT: 'go-http-client', GO_HTTP_CLIENT: 'go-http-client',
GOT: 'got', GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp', GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney',
JAVA: 'Java', JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client', JAVA_HTTPCLIENT: 'Java-http-client',
JSDOM: 'jsdom', JSDOM: 'jsdom',
@@ -718,16 +728,19 @@ export const Extension: Readonly<{
LUA_RESTY_HTTP: 'lua-resty-http', LUA_RESTY_HTTP: 'lua-resty-http',
NEEDLE: 'Needle', NEEDLE: 'Needle',
NUTCH: 'Nutch', NUTCH: 'Nutch',
OKHTTP: 'OkHttp',
NODE_FETCH: 'node-fetch', NODE_FETCH: 'node-fetch',
NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent', NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp',
PHP_SOAP: 'PHP-SOAP', PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime', POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx', PYTHON_HTTPX: 'python-httpx',
PYTHON_URLLIB: 'python-urllib', PYTHON_URLLIB: 'python-urllib',
PYTHON_URLLIB3: 'python-urllib3', PYTHON_URLLIB3: 'python-urllib3',
PYTHON_REQUESTS: 'python-requests', PYTHON_REQUESTS: 'python-requests',
SCRAPY: 'Scrapy' REST_CLIENT: 'rest-client',
SCRAPY: 'Scrapy',
UNDICI: 'undici'
} }
}, },
DeviceVendor: { DeviceVendor: {

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.6 /* Enums for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js // Source: /src/enums/ua-parser-enums.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.6 /* Enums for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -19,6 +19,7 @@ const BrowserName = Object.freeze({
AMAYA: 'Amaya', AMAYA: 'Amaya',
ANDROID: 'Android Browser', ANDROID: 'Android Browser',
ARORA: 'Arora', ARORA: 'Arora',
ATLAS: 'Atlas',
AVANT: 'Avant', AVANT: 'Avant',
AVAST: 'Avast Secure Browser', AVAST: 'Avast Secure Browser',
AVG: 'AVG Secure Browser', AVG: 'AVG Secure Browser',
@@ -147,6 +148,7 @@ const BrowserName = Object.freeze({
SNAPCHAT: 'Snapchat', SNAPCHAT: 'Snapchat',
SOGOU_EXPLORER: 'Sogou Explorer', SOGOU_EXPLORER: 'Sogou Explorer',
SOGOU_MOBILE: 'Sogou Mobile', SOGOU_MOBILE: 'Sogou Mobile',
STEAM: 'Steam',
SURF: 'Surf', SURF: 'Surf',
SWIFTFOX: 'Swiftfox', SWIFTFOX: 'Swiftfox',
TESLA: 'Tesla', TESLA: 'Tesla',
@@ -228,8 +230,9 @@ const DeviceVendor = Object.freeze({
ACER: 'Acer', ACER: 'Acer',
ADVAN: 'Advan', ADVAN: 'Advan',
ALCATEL: 'Alcatel', ALCATEL: 'Alcatel',
APPLE: 'Apple',
AMAZON: 'Amazon', AMAZON: 'Amazon',
ANBERNIC: 'Anbernic',
APPLE: 'Apple',
ARCHOS: 'Archos', ARCHOS: 'Archos',
ASUS: 'ASUS', ASUS: 'ASUS',
ATT: 'AT&T', ATT: 'AT&T',
@@ -258,6 +261,7 @@ const DeviceVendor = Object.freeze({
LAVA: 'Lava', LAVA: 'Lava',
LENOVO: 'Lenovo', LENOVO: 'Lenovo',
LG: 'LG', LG: 'LG',
LOGITECH: 'Logitech',
MEIZU: 'Meizu', MEIZU: 'Meizu',
MICROMAX: 'Micromax', MICROMAX: 'Micromax',
MICROSOFT: 'Microsoft', MICROSOFT: 'Microsoft',
@@ -291,6 +295,7 @@ const DeviceVendor = Object.freeze({
TECNO: 'TECNO', TECNO: 'TECNO',
TESLA: 'Tesla', TESLA: 'Tesla',
ULEFONE: 'Ulefone', ULEFONE: 'Ulefone',
VALVE: 'Valve',
VIVO: 'Vivo', VIVO: 'Vivo',
VIZIO: 'Vizio', VIZIO: 'Vizio',
VODAFONE: 'Vodafone', VODAFONE: 'Vodafone',
@@ -631,6 +636,7 @@ const Extension = Object.freeze({
}, },
Fetcher: { Fetcher: {
AHREFS_SITEAUDIT: 'AhrefsSiteAudit', AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
AMAZON_NOVA_ACT: 'NovaAct',
ANTHROPIC_CLAUDE_USER: 'Claude-User', ANTHROPIC_CLAUDE_USER: 'Claude-User',
ASANA: 'Asana', ASANA: 'Asana',
BETTER_UPTIME_BOT: 'Better Uptime Bot', BETTER_UPTIME_BOT: 'Better Uptime Bot',
@@ -708,9 +714,13 @@ const Extension = Object.freeze({
AIOHTTP: 'aiohttp', AIOHTTP: 'aiohttp',
APACHE_HTTPCLIENT: 'Apache-HttpClient', APACHE_HTTPCLIENT: 'Apache-HttpClient',
AXIOS: 'axios', AXIOS: 'axios',
BUN: 'Bun',
DART: 'Dart',
DENO: 'Deno',
GO_HTTP_CLIENT: 'go-http-client', GO_HTTP_CLIENT: 'go-http-client',
GOT: 'got', GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp', GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney',
JAVA: 'Java', JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client', JAVA_HTTPCLIENT: 'Java-http-client',
JSDOM: 'jsdom', JSDOM: 'jsdom',
@@ -718,16 +728,19 @@ const Extension = Object.freeze({
LUA_RESTY_HTTP: 'lua-resty-http', LUA_RESTY_HTTP: 'lua-resty-http',
NEEDLE: 'Needle', NEEDLE: 'Needle',
NUTCH: 'Nutch', NUTCH: 'Nutch',
OKHTTP: 'OkHttp',
NODE_FETCH: 'node-fetch', NODE_FETCH: 'node-fetch',
NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent', NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp',
PHP_SOAP: 'PHP-SOAP', PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime', POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx', PYTHON_HTTPX: 'python-httpx',
PYTHON_URLLIB: 'python-urllib', PYTHON_URLLIB: 'python-urllib',
PYTHON_URLLIB3: 'python-urllib3', PYTHON_URLLIB3: 'python-urllib3',
PYTHON_REQUESTS: 'python-requests', PYTHON_REQUESTS: 'python-requests',
SCRAPY: 'Scrapy' REST_CLIENT: 'rest-client',
SCRAPY: 'Scrapy',
UNDICI: 'undici'
} }
}, },
DeviceVendor: { DeviceVendor: {

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.6 /* Extensions for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/extensions/ua-parser-extensions.js // Source: /src/extensions/ua-parser-extensions.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.6 /* Extensions for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -262,7 +262,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 / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot / WhatsApp
// 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
@@ -272,19 +272,19 @@ 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|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|whatsapp)\/([\w\.]+)/i,
// Bluesky // Bluesky
/(bluesky) cardyb\/([\w\.]+)/i, /(bluesky) cardyb\/([\w\.]+)/i,
// Nova Act - https://github.com/aws/nova-act
/agent-(novaact)\/([\w\.]+)/i,
// Skype // Skype
/(skypeuripreview) preview\/([\w\.]+)/i, /(skypeuripreview) preview\/([\w\.]+)/i,
// Slackbot - https://api.slack.com/robots // Slackbot - https://api.slack.com/robots
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i, /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i
// WhatsApp
/(whatsapp)\/([\w\.]+)/i
], ],
[NAME, VERSION, [TYPE, FETCHER]], [NAME, VERSION, [TYPE, FETCHER]],
@@ -393,13 +393,15 @@ const MediaPlayers = Object.freeze({
const Libraries = Object.freeze({ const Libraries = Object.freeze({
browser : [ browser : [
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
[ [
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i, // Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent
/^(apache-httpclient|axios|bun|dart|deno|(?:go|java)-http-client|got|guzzlehttp|hackney|java|libwww-perl|lua-resty-http|needle|node(?:\.js|-fetch|-superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i,
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i, /(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
/(nutch)-([\w\.-]+)(\(|$)/i, /(nutch)-([\w\.-]+)(\(|$)/i,
/\((java)\/([\w\.]+)/i /\((java)\/([\w\.]+)/i
], [NAME, VERSION, [TYPE, LIBRARY]] ], [NAME, VERSION, [TYPE, LIBRARY]], [
/(node-fetch|undici)/i
], [NAME, [TYPE, LIBRARY]]
] ]
}); });

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.6 /* Helpers for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -11,7 +11,7 @@ const { UAParser } = require('../main/ua-parser');
const { EngineName } = require('../enums/ua-parser-enums'); const { EngineName } = require('../enums/ua-parser-enums');
const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection'); const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection');
const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection'); const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection');
const { isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection'); const { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection');
const { isFromEU: _isFromEU } = require('../browser-detection/browser-detection'); const { isFromEU: _isFromEU } = require('../browser-detection/browser-detection');
const { isFrozenUA } = require('ua-is-frozen'); const { isFrozenUA } = require('ua-is-frozen');
@@ -38,13 +38,12 @@ const isBot = _isBot;
/** /**
* @deprecated Moved to `browser-detection` submodule * @deprecated Moved to `browser-detection` submodule
*/ */
const isChromeFamily = val => !!((typeof val === 'string' ? new UAParser(val).getEngine() : val.engine)?.is(EngineName.BLINK)); const isChromeFamily = _isChromeFamily;
/** /**
* @deprecated Moved to `browser-detection` submodule * @deprecated Moved to `browser-detection` submodule
*/ */
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js const isElectron = () => _isElectron;
/ electron\//i.test(navigator?.userAgent)); // browser
/** /**
* @deprecated Moved to `browser-detection` submodule * @deprecated Moved to `browser-detection` submodule

View File

@@ -3,7 +3,7 @@
// Source: /src/helpers/ua-parser-helpers.js // Source: /src/helpers/ua-parser-helpers.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.6 /* Helpers for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -15,9 +15,9 @@ import { UAParser } from '../main/ua-parser.mjs';
import { EngineName } from '../enums/ua-parser-enums.mjs'; import { EngineName } from '../enums/ua-parser-enums.mjs';
import { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } from '../device-detection/device-detection.mjs'; import { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } from '../device-detection/device-detection.mjs';
import { isBot: _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs'; import { isBot: _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs';
import { isFromEU } from 'detect-europe-js'; import { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } from '../browser-detection/browser-detection.mjs';
import { isFromEU: _isFromEU } from '../browser-detection/browser-detection.mjs';
import { isFrozenUA } from 'ua-is-frozen'; import { isFrozenUA } from 'ua-is-frozen';
import { isStandalonePWA } from 'is-standalone-pwa';
/** /**
* @deprecated Moved to `device-detection` submodule * @deprecated Moved to `device-detection` submodule
@@ -39,10 +39,25 @@ const isAIBot = isAICrawler;
*/ */
const isBot = _isBot; const isBot = _isBot;
const isChromeFamily = val => !!((typeof val === 'string' ? new UAParser(val).getEngine() : val.engine)?.is(EngineName.BLINK)); /**
* @deprecated Moved to `browser-detection` submodule
*/
const isChromeFamily = _isChromeFamily;
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js /**
/ electron\//i.test(navigator?.userAgent)); // browser * @deprecated Moved to `browser-detection` submodule
*/
const isElectron = () => _isElectron;
/**
* @deprecated Moved to `browser-detection` submodule
*/
const isFromEU = _isFromEU;
/**
* @deprecated Moved to `browser-detection` submodule
*/
const isStandalonePWA = _isStandalonePWA;
export { export {
getDeviceVendor, getDeviceVendor,

View File

@@ -1,4 +1,4 @@
// Type definitions for UAParser.js v2.0.6 // Type definitions for UAParser.js v2.0.7
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.6 /* UAParser.js v2.0.7
Copyright © 2012-2025 Faisal Salman <f@faisalman.com> Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//* AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -19,7 +19,7 @@
// Constants // Constants
///////////// /////////////
var LIBVERSION = '2.0.6', var LIBVERSION = '2.0.7',
UA_MAX_LENGTH = 500, UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent', USER_AGENT = 'user-agent',
EMPTY = '', EMPTY = '',

View File

@@ -3,7 +3,7 @@
// Source: /src/main/ua-parser.js // Source: /src/main/ua-parser.js
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.6 /* UAParser.js v2.0.7
Copyright © 2012-2025 Faisal Salman <f@faisalman.com> Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//* AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -21,7 +21,7 @@
// Constants // Constants
///////////// /////////////
var LIBVERSION = '2.0.6', var LIBVERSION = '2.0.7',
UA_MAX_LENGTH = 500, UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent', USER_AGENT = 'user-agent',
EMPTY = '', EMPTY = '',
@@ -378,8 +378,8 @@
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i, /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon // Atlas/Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
/(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
@@ -434,7 +434,7 @@
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345 /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(lbbrowser|rekonq)/i // LieBao Browser/Rekonq /(lbbrowser|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Rekonq/Steam
], [NAME], [ ], [NAME], [
/ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
/ome\/([\w\.]+).+qihu (360)[es]e/i // 360 /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
@@ -600,12 +600,12 @@
/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
/\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi // Xiaomi Redmi / POCO / Black Shark / Qin
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i, // Xiaomi Mi // Xiaomi Mi
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
/ ([\w ]+) miui\/v?\d/i / ([\w ]+) miui\/v?\d/i
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
@@ -854,10 +854,10 @@
], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
/(ouya)/i, // Ouya /(ouya)/i, // Ouya
/(nintendo) (\w+)/i, // Nintendo /(nintendo) (\w+)/i, // Nintendo
/(retroid) (pocket ([^\)]+))/i // Retroid Pocket /(retroid) (pocket ([^\)]+))/i, // Retroid Pocket
], [VENDOR, MODEL, [TYPE, CONSOLE]], [ /(valve).+(steam deck)/i,
/droid.+; (shield)( bui|\))/i // Nvidia Portable /droid.+; ((shield|rgcube|gr0006))( bui|\))/i // Nvidia Portable/Anbernic/Logitech
], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [ ], [[VENDOR, strMapper, { 'Nvidia': 'Shield', 'Anbernic': 'RGCUBE', 'Logitech': 'GR0006' }], MODEL, [TYPE, CONSOLE]], [
/////////////////// ///////////////////
// WEARABLES // WEARABLES
@@ -866,7 +866,7 @@
/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
/((pebble))app/i, // Pebble /((pebble))app/i, // Pebble
/(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch / Xiaomi Watch
], [VENDOR, MODEL, [TYPE, WEARABLE]], [ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
/(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [ ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
@@ -970,7 +970,8 @@
// iOS/macOS // iOS/macOS
/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
/(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i, /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
/\btvos ?([\w\.]+)/i,
/cfnetwork\/.+darwin/i /cfnetwork\/.+darwin/i
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
/(mac os x) ?([\w\. ]*)/i, /(mac os x) ?([\w\. ]*)/i,
@@ -1144,7 +1145,6 @@
}; };
} }
if (!NAVIGATOR_UADATA) {
IData.prototype.then = function (cb) { IData.prototype.then = function (cb) {
var that = this; var that = this;
var IDataResolve = function () { var IDataResolve = function () {
@@ -1156,13 +1156,14 @@
}; };
IDataResolve.prototype = { IDataResolve.prototype = {
is : IData.prototype.is, is : IData.prototype.is,
toString : IData.prototype.toString toString : IData.prototype.toString,
withClientHints : IData.prototype.withClientHints,
withFeatureCheck : IData.prototype.withFeatureCheck
}; };
var resolveData = new IDataResolve(); var resolveData = new IDataResolve();
cb(resolveData); cb(resolveData);
return resolveData; return resolveData;
}; };
}
return new IData(); return new IData();
}; };
@@ -1194,23 +1195,32 @@
} }
function UAItem (itemType, ua, rgxMap, uaCH) { function UAItem (itemType, ua, rgxMap, uaCH) {
setProps.call(this, [
['itemType', itemType],
['ua', ua],
['uaCH', uaCH],
['rgxMap', rgxMap],
['data', createIData(this, itemType)]
]);
return this;
}
this.get = function (prop) { UAItem.prototype.get = function (prop) {
if (!prop) return this.data; if (!prop) return this.data;
return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined; return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
}; };
this.set = function (prop, val) { UAItem.prototype.set = function (prop, val) {
this.data[prop] = val; this.data[prop] = val;
return this; return this;
}; };
this.setCH = function (ch) { UAItem.prototype.setCH = function (ch) {
this.uaCH = ch; this.uaCH = ch;
return this; return this;
}; };
this.detectFeature = function () { UAItem.prototype.detectFeature = function () {
if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) { if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
switch (this.itemType) { switch (this.itemType) {
case BROWSER: case BROWSER:
@@ -1254,7 +1264,7 @@
return this; return this;
}; };
this.parseUA = function () { UAItem.prototype.parseUA = function () {
if (this.itemType != RESULT) { if (this.itemType != RESULT) {
rgxMapper.call(this.data, this.ua, this.rgxMap); rgxMapper.call(this.data, this.ua, this.rgxMap);
} }
@@ -1275,7 +1285,7 @@
return this; return this;
}; };
this.parseCH = function () { UAItem.prototype.parseCH = function () {
var uaCH = this.uaCH, var uaCH = this.uaCH,
rgxMap = this.rgxMap; rgxMap = this.rgxMap;
@@ -1377,17 +1387,6 @@
return this; return this;
}; };
setProps.call(this, [
['itemType', itemType],
['ua', ua],
['uaCH', uaCH],
['rgxMap', rgxMap],
['data', createIData(this, itemType)]
]);
return this;
}
function UAParser (ua, extensions, headers) { function UAParser (ua, extensions, headers) {
if (typeof ua === TYPEOF.OBJECT) { if (typeof ua === TYPEOF.OBJECT) {