Compare commits

..

2 Commits

Author SHA1 Message Date
Faisal Salman
638e237c8d [device-utils] Add new method: getMarketingName() 2024-12-02 16:15:35 +07:00
Faisal Salman
d177b83965 NEW SUBMODULE: device-utils 2024-12-02 10:45:39 +07:00
44 changed files with 456 additions and 1128 deletions

View File

@@ -65,41 +65,6 @@
--- ---
## Version 2.0.2
- Fix TypeScript dependency issue
## Version 2.0.1
- Add new browser: Ladybird, Daum
- Add new device: Apple HomePod
- Add new device vendor: HMD
- Add new OS: Ubuntu Touch, Windows IoT
- Improve CPU detection: ARM, x86
- Improve device detection: Lenovo, Nokia, Nvidia, Xiaomi
- Tablet: Google, Honor, Huawei, Infinix, Nokia, OnePlus, Xiaomi
- Wearable: Asus, Google, LG, Motorola, OnePlus, Oppo, Samsung, Sony
- Smart-TV: Xiaomi, unidentified vendors
- Improve detection for unknown VR devices
- Improve device model detection for Generic devices
- Improve OS detection: Linux, Symbian
- Improve TypeScript definitions for Headers
- Improve `withClientHints()`:
- `engine.version` also get updated
- Infer `device.vendor` & `device.type` by guessing from `device.model`
- Browser naming adjustments:
- `Google Chrome` => `Chrome`
- `Microsoft Edge` => `Edge`
- `Android WebView` => `Chrome WebView`
- `HeadlessChrome` => `Chrome Headless`
- `enums` submodule:
- Add TypeScript definitions
- `extensions` submodule:
- Add new list:
- `Vehicles`: BYD, Rivian, Volvo
- Add new Fetcher: Bluesky
- Add new Library: Apache-HttpClient, go-http-client, got, GuzzleHttp, Java-http-client, libwww-perl, lua-resty-http, Needle, OkHttp, node-fetch, PHP-SOAP, PostmanRuntime, superagent
## Version 2.0.0 ## Version 2.0.0
- `ua-parser-js/extensions` submodule: - `ua-parser-js/extensions` submodule:
@@ -201,15 +166,6 @@
--- ---
## Version 0.7.40 / 1.0.40
- Add new browser: 115, LibreWolf, Slimboat, Slimjet
- Add new device: Advan, Cat, Energizer, IMO, Micromax, Smartfren
- Add new engine: ArkWeb, Servo
- Add new os: OpenHarmony
- Improve browser detection: 2345, 360, Dragon, Iron, Maxthon
- Recognize Honor as a separate device vendor from Huawei
- Fix Python Request mistakenly identified as Meta Quest
## Version 0.7.39 / 1.0.39 ## Version 0.7.39 / 1.0.39
- Add new feature: executable command using `npx ua-parser-js "[INSERT-UA-HERE]"` - Add new feature: executable command using `npx ua-parser-js "[INSERT-UA-HERE]"`
- Add new browser: Helio, Pico Browser, Wolvic - Add new browser: Helio, Pico Browser, Wolvic

View File

@@ -239,13 +239,4 @@ Made with [contributors-img](https://contrib.rocks).
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/organizations.svg?avatarHeight=64"></a> <a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/organizations.svg?avatarHeight=64"></a>
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/individuals.svg?avatarHeight=64"></a> <a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/individuals.svg?avatarHeight=64"></a>
You can support the open-source editions of UAParser.js through one of the following options: Support the open-source editions of UAParser.js on [OpenCollective](https://opencollective.com/ua-parser-js) or [GitHub Sponsors](https://github.com/sponsors/faisalman).
[![OpenCollective](https://img.shields.io/badge/OpenCollective-dddddd?style=for-the-badge&logo=opencollective&color=dddddd
)](https://opencollective.com/ua-parser-js)
[![GitHub Sponsors](https://img.shields.io/badge/GitHub_Sponsors-333333?style=for-the-badge&logo=githubsponsors&color=333333
)](https://github.com/sponsors/faisalman)
[![PayPal](https://img.shields.io/badge/Paypal-003087?style=for-the-badge&logo=paypal&color=003087
)](https://paypal.me/faisalman)
[![WeChat/Alipay](https://img.shields.io/badge/Other_Payment_Methods-Alipay_/_WeChat_Pay-09b83e?style=for-the-badge&logo=mastercard&color=09b83e
)](https://store.faisalman.com/buy/3d71f2f3-cf4d-473c-892a-9d4497c890be)

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

34
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.2", "version": "2.0.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.2", "version": "2.0.0",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -23,7 +23,6 @@
], ],
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@types/node-fetch": "^2.6.12",
"detect-europe-js": "^0.1.2", "detect-europe-js": "^0.1.2",
"is-standalone-pwa": "^0.1.1", "is-standalone-pwa": "^0.1.1",
"ua-is-frozen": "^0.1.2" "ua-is-frozen": "^0.1.2"
@@ -36,13 +35,15 @@
"@babel/traverse": "7.23.2", "@babel/traverse": "7.23.2",
"@jazzer.js/core": "^1.4.0", "@jazzer.js/core": "^1.4.0",
"@playwright/test": "^1.49.0", "@playwright/test": "^1.49.0",
"@types/node": "^22.9.1",
"@types/node-fetch": "^2.6.12",
"jshint": "~2.13.6", "jshint": "~2.13.6",
"mocha": "~8.2.0", "mocha": "~8.2.0",
"node-fetch": "^2.7.0", "node-fetch": "^2.7.0",
"requirejs": "2.3.2", "requirejs": "2.3.2",
"safe-regex": "^2.1.1", "safe-regex": "^2.1.1",
"tsd": "^0.29.0", "tsd": "^0.29.0",
"uglify-js": "~3.19.3" "uglify-js": "~3.12.0"
}, },
"engines": { "engines": {
"node": "*" "node": "*"
@@ -725,9 +726,10 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.13.1", "version": "22.10.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz",
"integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==",
"dev": true,
"dependencies": { "dependencies": {
"undici-types": "~6.20.0" "undici-types": "~6.20.0"
} }
@@ -736,6 +738,7 @@
"version": "2.6.12", "version": "2.6.12",
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz",
"integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==",
"dev": true,
"dependencies": { "dependencies": {
"@types/node": "*", "@types/node": "*",
"form-data": "^4.0.0" "form-data": "^4.0.0"
@@ -899,7 +902,8 @@
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.8", "version": "1.7.8",
@@ -1272,6 +1276,7 @@
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"dependencies": { "dependencies": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
}, },
@@ -1412,6 +1417,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"engines": { "engines": {
"node": ">=0.4.0" "node": ">=0.4.0"
} }
@@ -1744,6 +1750,7 @@
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"dev": true,
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
@@ -2651,6 +2658,7 @@
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
@@ -2659,6 +2667,7 @@
"version": "2.1.35", "version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"dependencies": { "dependencies": {
"mime-db": "1.52.0" "mime-db": "1.52.0"
}, },
@@ -4256,9 +4265,9 @@
] ]
}, },
"node_modules/uglify-js": { "node_modules/uglify-js": {
"version": "3.19.3", "version": "3.12.8",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz",
"integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==",
"dev": true, "dev": true,
"bin": { "bin": {
"uglifyjs": "bin/uglifyjs" "uglifyjs": "bin/uglifyjs"
@@ -4270,7 +4279,8 @@
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "6.20.0", "version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"dev": true
}, },
"node_modules/universalify": { "node_modules/universalify": {
"version": "2.0.1", "version": "2.0.1",

View File

@@ -1,7 +1,7 @@
{ {
"title": "UAParser.js", "title": "UAParser.js",
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.2", "version": "2.0.0",
"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": [
@@ -178,6 +178,11 @@
"import": "./src/main/ua-parser.mjs", "import": "./src/main/ua-parser.mjs",
"types": "./src/main/ua-parser.d.ts" "types": "./src/main/ua-parser.d.ts"
}, },
"./device-utils": {
"require": "./src/device-utils/ua-parser-device-utils.js",
"import": "./src/device-utils/ua-parser-device-utils.mjs",
"types": "./src/device-utils/ua-parser-device-utils.d.ts"
},
"./enums": { "./enums": {
"require": "./src/enums/ua-parser-enums.js", "require": "./src/enums/ua-parser-enums.js",
"import": "./src/enums/ua-parser-enums.mjs", "import": "./src/enums/ua-parser-enums.mjs",
@@ -214,21 +219,22 @@
"dependencies": { "dependencies": {
"detect-europe-js": "^0.1.2", "detect-europe-js": "^0.1.2",
"is-standalone-pwa": "^0.1.1", "is-standalone-pwa": "^0.1.1",
"ua-is-frozen": "^0.1.2", "ua-is-frozen": "^0.1.2"
"node-fetch": "^2.7.0",
"@types/node-fetch": "^2.6.12"
}, },
"devDependencies": { "devDependencies": {
"@babel/parser": "7.15.8", "@babel/parser": "7.15.8",
"@babel/traverse": "7.23.2", "@babel/traverse": "7.23.2",
"@jazzer.js/core": "^1.4.0", "@jazzer.js/core": "^1.4.0",
"@playwright/test": "^1.49.0", "@playwright/test": "^1.49.0",
"@types/node": "^22.9.1",
"@types/node-fetch": "^2.6.12",
"jshint": "~2.13.6", "jshint": "~2.13.6",
"mocha": "~8.2.0", "mocha": "~8.2.0",
"node-fetch": "^2.7.0",
"requirejs": "2.3.2", "requirejs": "2.3.2",
"safe-regex": "^2.1.1", "safe-regex": "^2.1.1",
"tsd": "^0.29.0", "tsd": "^0.29.0",
"uglify-js": "~3.19.3" "uglify-js": "~3.12.0"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -4,20 +4,10 @@ SRC_PATH="src/main/ua-parser.js"
MIN_PATH="dist/ua-parser.min.js" MIN_PATH="dist/ua-parser.min.js"
PACK_PATH="dist/ua-parser.pack.js" PACK_PATH="dist/ua-parser.pack.js"
SRC_PATH_MJS="src/main/ua-parser.mjs"
MIN_PATH_MJS="dist/ua-parser.min.mjs"
PACK_PATH_MJS="dist/ua-parser.pack.mjs"
# minified # minified
echo "Generate ${MIN_PATH}" echo "Generate ${MIN_PATH}"
uglifyjs $SRC_PATH -o $MIN_PATH --comments "/^ UA/" uglifyjs $SRC_PATH -o $MIN_PATH --comments "/^ UA/"
echo "Generate ${MIN_PATH_MJS}"
uglifyjs $SRC_PATH_MJS -o $MIN_PATH_MJS --comments "/^ UA/" --module
# packed # packed
echo "Generate ${PACK_PATH}" echo "Generate ${PACK_PATH}"
uglifyjs $SRC_PATH -o $PACK_PATH --comments "/^ UA/" --compress --mangle uglifyjs $SRC_PATH -o $PACK_PATH --comments "/^ UA/" --compress --mangle
echo "Generate ${PACK_PATH_MJS}"
uglifyjs $SRC_PATH_MJS -o $PACK_PATH_MJS --comments "/^ UA/" --compress --mangle --module

View File

@@ -36,7 +36,14 @@ const modules = [
[/esversion\: 3/ig, 'esversion: 6'], [/esversion\: 3/ig, 'esversion: 6'],
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'] [/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};']
] ]
},{ },
{
src : 'src/device-utils/ua-parser-device-utils.js',
dest :'src/device-utils/ua-parser-device-utils.mjs',
title : 'ua-parser-js/device-utils',
replacements : []
},
{
src : 'src/enums/ua-parser-enums.js', src : 'src/enums/ua-parser-enums.js',
dest :'src/enums/ua-parser-enums.mjs', dest :'src/enums/ua-parser-enums.mjs',
title : 'ua-parser-js/enums', title : 'ua-parser-js/enums',

View File

@@ -0,0 +1,5 @@
[
{
"SM-S928N" : "Galaxy S24 Ultra"
}
]

View File

@@ -0,0 +1,5 @@
[
{
"M2101K9C" : "Mi 11 Lite 5G"
}
]

View File

@@ -0,0 +1,21 @@
// Type definitions for Device Utils submodule of UAParser.js v2.0.0
// Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman>
import type { IResult, IDevice } from "../main/ua-parser";
declare function getMarketingName(model: string, vendor: string): boolean;
declare function isMobile(val: IResult | IDevice | string): boolean;
declare function isSmartTV(val: IResult | IDevice | string): boolean;
declare function isTablet(val: IResult | IDevice | string): boolean;
declare function isWearable(val: IResult | IDevice | string): boolean;
declare function isXR(val: IResult | IDevice | string): boolean;
export {
getMarketingName,
isMobile,
isSmartTV,
isTablet,
isWearable,
isXR
};

View File

@@ -0,0 +1,51 @@
//////////////////////////////////////////////////
/* Device Utils Submodule for UAParser.js v2.0.0
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
/////////////////////////////////////////////////
/*jshint esversion: 6 */
const fs = require('fs');
const path = require('path');
const UAParser = require('../main/ua-parser');
const { Device: DeviceType } = require('../enums/ua-parser-enums');
const isDeviceType = (val, expectedType) => {
const uap = typeof val == 'string' ? UAParser(val) : val; // string
let actualType;
if (uap.hasOwnProperty('device')) { // IResult
actualType = uap.device?.type;
} else if (uap.hasOwnProperty('type')) { // IDevice
actualType = uap.type;
}
return actualType == expectedType;
};
const getMarketingName = (model, vendor) => {
const normalizedVendor = vendor.toLowerCase();
const filePath = path.resolve(__dirname, `./data/marketing-name/${normalizedVendor}.json`);
if (fs.existsSync(filePath)) {
const map = require(`./data/marketing-name/${normalizedVendor}.json`)[0];
if (model in map) {
return map[model];
}
}
return model;
};
const isMobile = val => isDeviceType(val, DeviceType.MOBILE);
const isSmartTV = val => isDeviceType(val, DeviceType.SMARTTV);
const isTablet = val => isDeviceType(val, DeviceType.TABLET);
const isWearable = val => isDeviceType(val, DeviceType.WEARABLE);
const isXR = val => isDeviceType(val, DeviceType.XR);
module.exports = {
getMarketingName,
isMobile,
isSmartTV,
isTablet,
isWearable,
isXR
};

View File

@@ -1,366 +0,0 @@
// Type definitions for Enums submodule of UAParser.js v2.0.2
// Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman>
export const Browser: 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";
DORIS: "Doris";
DRAGON: "Dragon";
DUCKDUCKGO: "DuckDuckGo";
EDGE: "Edge";
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";
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_MINI: "Opera Mini";
OPERA_MOBI: "Opera Mobi";
OPERA_TABLET: "Opera Tablet";
OPERA_TOUCH: "Opera Touch";
OVI: "OviBrowser";
PALEMOON: "PaleMoon";
PHANTOMJS: "PhantomJS";
PHOENIX: "Phoenix";
PICOBROWSER: "Pico Browser";
POLARIS: "Polaris";
PUFFIN: "Puffin";
QQ: "QQBrowser";
QQ_LITE: "QQBrowserLite";
QUARK: "Quark";
QUPZILLA: "QupZilla";
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";
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";
}>;
export const BrowserType: Readonly<{
CRAWLER: "crawler";
CLI: "cli";
EMAIL: "email";
FETCHER: "fetcher";
INAPP: "inapp";
MEDIAPLAYER: "mediaplayer";
LIBRARY: "library";
}>;
export const CPU: Readonly<{
'68K': "68k";
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";
}>;
export const Device: Readonly<{
CONSOLE: "console";
DESKTOP: "desktop";
EMBEDDED: "embedded";
MOBILE: "mobile";
SMARTTV: "smarttv";
TABLET: "tablet";
WEARABLE: "wearable";
XR: "xr";
}>;
export const Vendor: Readonly<{
ACER: "Acer";
ADVAN: "Advan";
ALCATEL: "Alcatel";
APPLE: "Apple";
AMAZON: "Amazon";
ARCHOS: "Archos";
ASUS: "ASUS";
ATT: "AT&T";
BENQ: "BenQ";
BLACKBERRY: "BlackBerry";
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";
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";
PICO: "Pico";
POLYTRON: "Polytron";
REALME: "Realme";
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";
VODAFONE: "Vodafone";
XBOX: "Xbox";
XIAOMI: "Xiaomi";
ZEBRA: "Zebra";
ZTE: "ZTE";
}>;
export const Engine: 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";
}>;
export const OS: Readonly<{
AIX: "AIX";
AMIGA_OS: "Amiga OS";
ANDROID: "Android";
ANDROID_X86: "Android-x86";
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";
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_IOT: "Windows IoT";
WINDOWS_MOBILE: "Windows Mobile";
WINDOWS_PHONE: "Windows Phone";
XBOX: "Xbox";
ZENWALK: "Zenwalk";
}>;

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.2 /* Enums for UAParser.js v2.0.0
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 */
@@ -34,7 +34,6 @@ const Browser = Object.freeze({
COBALT: 'Cobalt', COBALT: 'Cobalt',
COC_COC: 'Coc Coc', COC_COC: 'Coc Coc',
CONKEROR: 'Conkeror', CONKEROR: 'Conkeror',
DAUM: 'Daum',
DILLO: 'Dillo', DILLO: 'Dillo',
DOLPHIN: 'Dolphin', DOLPHIN: 'Dolphin',
DORIS: 'Doris', DORIS: 'Doris',
@@ -77,7 +76,6 @@ const Browser = Object.freeze({
KLARNA: 'Klarna', KLARNA: 'Klarna',
KINDLE: 'Kindle', KINDLE: 'Kindle',
LENOVO: 'Smart Lenovo Browser', LENOVO: 'Smart Lenovo Browser',
LADYBIRD: 'Ladybird',
LIBREWOLF: 'LibreWolf', LIBREWOLF: 'LibreWolf',
LIEBAO: 'LBBROWSER', LIEBAO: 'LBBROWSER',
LINE: 'Line', LINE: 'Line',
@@ -367,13 +365,11 @@ const OS = Object.freeze({
SYMBIAN: 'Symbian', SYMBIAN: 'Symbian',
TIZEN: 'Tizen', TIZEN: 'Tizen',
UBUNTU: 'Ubuntu', UBUNTU: 'Ubuntu',
UBUNTU_TOUCH: 'Ubuntu Touch',
UNIX: 'Unix', UNIX: 'Unix',
VECTORLINUX: 'VectorLinux', VECTORLINUX: 'VectorLinux',
WATCHOS: 'watchOS', WATCHOS: 'watchOS',
WEBOS: 'WebOS', WEBOS: 'WebOS',
WINDOWS: 'Windows', WINDOWS: 'Windows',
WINDOWS_IOT: 'Windows IoT',
WINDOWS_MOBILE: 'Windows Mobile', WINDOWS_MOBILE: 'Windows Mobile',
WINDOWS_PHONE: 'Windows Phone', WINDOWS_PHONE: 'Windows Phone',
XBOX: 'Xbox', XBOX: 'Xbox',

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.2 /* Enums for UAParser.js v2.0.0
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 */
@@ -38,7 +38,6 @@ const Browser = Object.freeze({
COBALT: 'Cobalt', COBALT: 'Cobalt',
COC_COC: 'Coc Coc', COC_COC: 'Coc Coc',
CONKEROR: 'Conkeror', CONKEROR: 'Conkeror',
DAUM: 'Daum',
DILLO: 'Dillo', DILLO: 'Dillo',
DOLPHIN: 'Dolphin', DOLPHIN: 'Dolphin',
DORIS: 'Doris', DORIS: 'Doris',
@@ -81,7 +80,6 @@ const Browser = Object.freeze({
KLARNA: 'Klarna', KLARNA: 'Klarna',
KINDLE: 'Kindle', KINDLE: 'Kindle',
LENOVO: 'Smart Lenovo Browser', LENOVO: 'Smart Lenovo Browser',
LADYBIRD: 'Ladybird',
LIBREWOLF: 'LibreWolf', LIBREWOLF: 'LibreWolf',
LIEBAO: 'LBBROWSER', LIEBAO: 'LBBROWSER',
LINE: 'Line', LINE: 'Line',
@@ -219,7 +217,6 @@ const Vendor = Object.freeze({
GEEKSPHONE: 'GeeksPhone', GEEKSPHONE: 'GeeksPhone',
GENERIC: 'Generic', GENERIC: 'Generic',
GOOGLE: 'Google', GOOGLE: 'Google',
HMD: 'HMD',
HP: 'HP', HP: 'HP',
HTC: 'HTC', HTC: 'HTC',
HUAWEI: 'Huawei', HUAWEI: 'Huawei',
@@ -329,7 +326,6 @@ const OS = Object.freeze({
IOS: 'iOS', IOS: 'iOS',
JOLI: 'Joli', JOLI: 'Joli',
KAIOS: 'KaiOS', KAIOS: 'KaiOS',
KUBUNTU: 'Kubuntu',
LINPUS: 'Linpus', LINPUS: 'Linpus',
LINSPIRE: 'Linspire', LINSPIRE: 'Linspire',
LINUX: 'Linux', LINUX: 'Linux',
@@ -371,13 +367,11 @@ const OS = Object.freeze({
SYMBIAN: 'Symbian', SYMBIAN: 'Symbian',
TIZEN: 'Tizen', TIZEN: 'Tizen',
UBUNTU: 'Ubuntu', UBUNTU: 'Ubuntu',
UBUNTU_TOUCH: 'Ubuntu Touch',
UNIX: 'Unix', UNIX: 'Unix',
VECTORLINUX: 'VectorLinux', VECTORLINUX: 'VectorLinux',
WATCHOS: 'watchOS', WATCHOS: 'watchOS',
WEBOS: 'WebOS', WEBOS: 'WebOS',
WINDOWS: 'Windows', WINDOWS: 'Windows',
WINDOWS_IOT: 'Windows IoT',
WINDOWS_MOBILE: 'Windows Mobile', WINDOWS_MOBILE: 'Windows Mobile',
WINDOWS_PHONE: 'Windows Phone', WINDOWS_PHONE: 'Windows Phone',
XBOX: 'Xbox', XBOX: 'Xbox',

View File

@@ -1,4 +1,4 @@
// Type definitions for Helpers submodule of UAParser.js v2.0.2 // Type definitions for Helpers submodule of UAParser.js v2.0.0
// 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>
@@ -12,5 +12,4 @@ export const Emails: UAParserExt;
export const Fetchers: UAParserExt; export const Fetchers: UAParserExt;
export const InApps: UAParserExt; export const InApps: UAParserExt;
export const Libraries: UAParserExt; export const Libraries: UAParserExt;
export const MediaPlayers: UAParserExt; export const MediaPlayers: UAParserExt;
export const Vehicles: UAParserExt;

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.2 /* Extensions for UAParser.js v2.0.0
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 */
@@ -218,25 +218,31 @@ const Fetchers = Object.freeze({
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
// DuckAssistBot - https://duckduckgo.com/duckassistbot/ // DuckAssistBot - https://duckduckgo.com/duckassistbot/
// BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
// Google Site Verifier / Meta / Yahoo! Japan /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
// Yandex Bots - https://yandex.com/bots
/(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
// Bluesky // Google Site Verifier
/(bluesky) cardyb\/([\w\.]+)/i, /(google-site-verification)\/([\w\.]+)/i,
// Meta
/(meta-externalfetcher)\/([\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
/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
// Yahoo! Japan
/(y!?j-dlc)\/([\w\.]+)/i,
// Yandex Bots - https://yandex.com/bots
/(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
/(yandex(?:sitelinks|userproxy))/i
], ],
[NAME, VERSION, [TYPE, FETCHER]], [NAME, VERSION, [TYPE, FETCHER]],
[ // Google Bots / Cohere / Snapchat / Vercelbot
// Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots [/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
],
[NAME, [TYPE, FETCHER]], [NAME, [TYPE, FETCHER]],
] ]
}); });
@@ -321,24 +327,6 @@ const Libraries = Object.freeze({
] ]
}); });
/////////////
// VEHICLES
////////////
const Vehicles = Object.freeze({
device : [
[
/dilink.+(byd) auto/i, // BYD
], [VENDOR], [
/(rivian) (r1t)/i, // Rivian
], [VENDOR, MODEL], [
/vcc.+netfront/i, // Volvo
], [[VENDOR, 'Volvo']]
]
});
////////// //////////
// BOTS // BOTS
///////// /////////
@@ -361,6 +349,5 @@ module.exports = {
Fetchers, Fetchers,
InApps, InApps,
Libraries, Libraries,
MediaPlayers, MediaPlayers
Vehicles
}; };

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.2 /* Extensions for UAParser.js v2.0.0
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 */
@@ -165,7 +165,7 @@ const ExtraDevices = Object.freeze({
/\b(zur\d{3}) b/i // Swiss ZUR Tablet /\b(zur\d{3}) b/i // Swiss ZUR Tablet
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
/^((zeki)?tb.*\b) b/i // Zeki Tablets /\b((zeki)?tb.*\b) b/i // Zeki Tablets
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
/\b([yr]\d{2}) b/i, /\b([yr]\d{2}) b/i,
@@ -222,25 +222,31 @@ const Fetchers = Object.freeze({
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
// DuckAssistBot - https://duckduckgo.com/duckassistbot/ // DuckAssistBot - https://duckduckgo.com/duckassistbot/
// BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
// Google Site Verifier / Meta / Yahoo! Japan /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
// Yandex Bots - https://yandex.com/bots
/(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
// Bluesky // Google Site Verifier
/(bluesky) cardyb\/([\w\.]+)/i, /(google-site-verification)\/([\w\.]+)/i,
// Meta
/(meta-externalfetcher)\/([\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
/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
// Yahoo! Japan
/(y!?j-dlc)\/([\w\.]+)/i,
// Yandex Bots - https://yandex.com/bots
/(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
/(yandex(?:sitelinks|userproxy))/i
], ],
[NAME, VERSION, [TYPE, FETCHER]], [NAME, VERSION, [TYPE, FETCHER]],
[ // Google Bots / Cohere / Snapchat / Vercelbot
// Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots [/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
],
[NAME, [TYPE, FETCHER]], [NAME, [TYPE, FETCHER]],
] ]
}); });
@@ -265,48 +271,104 @@ const InApps = Object.freeze({
const MediaPlayers = Object.freeze({ const MediaPlayers = Object.freeze({
browser : [[ browser : [[
/(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
/(coremedia) v([\w\._]+)/i, /(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
// Ares/Nexplayer/OSSProxy /(coremedia) v([\w\._]+)/i
/(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i, ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
// Aqualung/Lyssna/BSPlayer/Clementine/MPD
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC /(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
// NSPlayer/PSP-InternetRadioPlayer/Videos // NSPlayer/PSP-InternetRadioPlayer/Videos
// Nero Home/Nero Scout/Nokia /(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
// QuickTime/RealMedia/RadioApp/RadioClientApplication/ /(lg player|nexplayer)\s([\d\.]+)/i,
// SoundTap/Totem/Stagefright/Streamium /player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
// XBMC/gvfs/Xine/XMMS/irapp ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i, /(nexplayer)\s([\w\.-]+)/i // Nexplayer
/(lg player|nexplayer) ([\d\.]+)/i,
/player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
/(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
/(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
// MPlayer SVN
/(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
/ (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
/(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
/(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
/^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
/com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
/(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
// Windows Media Server
/(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(flrp)\/([\w\.-]+)/i // Flip Player /(flrp)\/([\w\.-]+)/i // Flip Player
], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [ ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
/(fstream|nativehost|queryseekspider)/i
// FStream/NativeHost/QuerySeekSpider // FStream/NativeHost/QuerySeekSpider
// MPlayer (no other info)/Media Player Classic/Nero ShowTime
// OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
// inlight radio / YourMuze
/(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
], [NAME, [TYPE, MEDIAPLAYER]], [ ], [NAME, [TYPE, MEDIAPLAYER]], [
/(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [ // Gstreamer
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io /(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(htc_one_s)\/([\d\.]+)/i, // HTC One S
], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
// MPlayer SVN
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
/(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(mplayer)/i, // MPlayer (no other info)
/(yourmuze)/i, // YourMuze
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
], [NAME, [TYPE, MEDIAPLAYER]], [
/(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(nokia\d+)\/([\w\.-]+)/i // Nokia
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(winamp)3 version ([\w\.-]+)/i, // Winamp
/(winamp)\s([\w\.-]+)/i,
/(winamp)mpeg\/([\w\.-]+)/i
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
// inlight radio
], [NAME, [TYPE, MEDIAPLAYER]], [
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
// SoundTap/Totem/Stagefright/Streamium
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(smp)([\d\.]+)/i // SMP
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
/(vlc)\/([\w\.-]+)/i,
/(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
/(foobar2000)\/([\d\.]+)/i, // Foobar2000
/(itunes)\/([\d\.]+)/i // iTunes
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
/(windows-media-player)\/([\w\.-]+)/i
], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
/windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
// Windows Media Server
], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
/(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
/(rad.io)\s([\d\.]+)/i, // Rad.io
/(radio.(?:de|at|fr))\s([\d\.]+)/i
], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]] ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
] ]
}); });
@@ -325,24 +387,6 @@ const Libraries = Object.freeze({
] ]
}); });
/////////////
// VEHICLES
////////////
const Vehicles = Object.freeze({
device : [
[
/dilink.+(byd) auto/i, // BYD
], [VENDOR], [
/(rivian) (r1t)/i, // Rivian
], [VENDOR, MODEL], [
/vcc.+netfront/i, // Volvo
], [[VENDOR, 'Volvo']]
]
});
////////// //////////
// BOTS // BOTS
///////// /////////
@@ -365,6 +409,5 @@ export {
Fetchers, Fetchers,
InApps, InApps,
Libraries, Libraries,
MediaPlayers, MediaPlayers
Vehicles
}; };

View File

@@ -1,8 +1,8 @@
// Type definitions for Helpers submodule of UAParser.js v2.0.2 // Type definitions for Helpers submodule of UAParser.js v2.0.0
// 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>
import type { IResult } from "../main/ua-parser"; import { IResult } from "../main/ua-parser";
declare function getDeviceVendor(model: string): string | undefined; declare function getDeviceVendor(model: string): string | undefined;
declare function isAppleSilicon(resultOrUA: IResult | string): boolean; declare function isAppleSilicon(resultOrUA: IResult | string): boolean;

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.2 /* Helpers for UAParser.js v2.0.0
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/helpers/ua-parser-helpers.js // Source: /src/helpers/ua-parser-helpers.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.2 /* Helpers for UAParser.js v2.0.0
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

@@ -1,4 +1,4 @@
// Type definitions for UAParser.js v2.0.2 // Type definitions for UAParser.js v2.0.0
// 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.2 /* UAParser.js v2.0.0
Copyright © 2012-2024 Faisal Salman <f@faisalman.com> Copyright © 2012-2024 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,35 +19,20 @@
// Constants // Constants
///////////// /////////////
var LIBVERSION = '2.0.2', var LIBVERSION = '2.0.0',
UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent',
EMPTY = '', EMPTY = '',
UNKNOWN = '?', UNKNOWN = '?',
// typeof
FUNC_TYPE = 'function', FUNC_TYPE = 'function',
UNDEF_TYPE = 'undefined', UNDEF_TYPE = 'undefined',
OBJ_TYPE = 'object', OBJ_TYPE = 'object',
STR_TYPE = 'string', STR_TYPE = 'string',
MAJOR = 'major',
// properties MODEL = 'model',
UA_BROWSER = 'browser',
UA_CPU = 'cpu',
UA_DEVICE = 'device',
UA_ENGINE = 'engine',
UA_OS = 'os',
UA_RESULT = 'result',
NAME = 'name', NAME = 'name',
TYPE = 'type', TYPE = 'type',
VENDOR = 'vendor', VENDOR = 'vendor',
VERSION = 'version', VERSION = 'version',
ARCHITECTURE= 'architecture', ARCHITECTURE= 'architecture',
MAJOR = 'major',
MODEL = 'model',
// device types
CONSOLE = 'console', CONSOLE = 'console',
MOBILE = 'mobile', MOBILE = 'mobile',
TABLET = 'tablet', TABLET = 'tablet',
@@ -55,11 +40,9 @@
WEARABLE = 'wearable', WEARABLE = 'wearable',
XR = 'xr', XR = 'xr',
EMBEDDED = 'embedded', EMBEDDED = 'embedded',
// browser types
INAPP = 'inapp', INAPP = 'inapp',
USER_AGENT = 'user-agent',
// client hints UA_MAX_LENGTH = 500,
BRANDS = 'brands', BRANDS = 'brands',
FORMFACTORS = 'formFactors', FORMFACTORS = 'formFactors',
FULLVERLIST = 'fullVersionList', FULLVERLIST = 'fullVersionList',
@@ -76,8 +59,12 @@
CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM, CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version', CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS], CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
UA_BROWSER = 'browser',
// device vendors UA_CPU = 'cpu',
UA_DEVICE = 'device',
UA_ENGINE = 'engine',
UA_OS = 'os',
UA_RESULT = 'result',
AMAZON = 'Amazon', AMAZON = 'Amazon',
APPLE = 'Apple', APPLE = 'Apple',
ASUS = 'ASUS', ASUS = 'ASUS',
@@ -89,7 +76,6 @@
LG = 'LG', LG = 'LG',
MICROSOFT = 'Microsoft', MICROSOFT = 'Microsoft',
MOTOROLA = 'Motorola', MOTOROLA = 'Motorola',
NVIDIA = 'Nvidia',
ONEPLUS = 'OnePlus', ONEPLUS = 'OnePlus',
OPPO = 'OPPO', OPPO = 'OPPO',
SAMSUNG = 'Samsung', SAMSUNG = 'Samsung',
@@ -97,8 +83,8 @@
SONY = 'Sony', SONY = 'Sony',
XIAOMI = 'Xiaomi', XIAOMI = 'Xiaomi',
ZEBRA = 'Zebra', ZEBRA = 'Zebra',
PREFIX_MOBILE = 'Mobile ',
// browsers SUFFIX_BROWSER = ' Browser',
CHROME = 'Chrome', CHROME = 'Chrome',
CHROMIUM = 'Chromium', CHROMIUM = 'Chromium',
CHROMECAST = 'Chromecast', CHROMECAST = 'Chromecast',
@@ -107,11 +93,6 @@
OPERA = 'Opera', OPERA = 'Opera',
FACEBOOK = 'Facebook', FACEBOOK = 'Facebook',
SOGOU = 'Sogou', SOGOU = 'Sogou',
PREFIX_MOBILE = 'Mobile ',
SUFFIX_BROWSER = ' Browser',
// os
WINDOWS = 'Windows'; WINDOWS = 'Windows';
var isWindow = typeof window !== UNDEF_TYPE, var isWindow = typeof window !== UNDEF_TYPE,
@@ -421,7 +402,6 @@
/(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
/(daum)apps[\/ ]([\w\.]+)/i, // Daum App
/safari (line)\/([\w\.]+)/i, // Line App for iOS /safari (line)\/([\w\.]+)/i, // Line App for iOS
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
/(alipay)client\/([\w\.]+)/i, // Alipay /(alipay)client\/([\w\.]+)/i, // Alipay
@@ -484,8 +464,8 @@
/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
// Other // Other
/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
/\b(links) \(([\w\.]+)/i // Links /\b(links) \(([\w\.]+)/i // Links
], [NAME, [VERSION, /_/g, '.']], [ ], [NAME, [VERSION, /_/g, '.']], [
@@ -495,30 +475,30 @@
cpu : [[ cpu : [[
/\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64) /\b(?:(amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
], [[ARCHITECTURE, 'amd64']], [ ], [[ARCHITECTURE, 'amd64']], [
/(ia32(?=;))/i, // IA32 (quicktime) /(ia32(?=;))/i, // IA32 (quicktime)
/\b((i[346]|x)86)(pc)?\b/i // IA32 (x86) /\b((?:i[346]|x)86)\b/i // IA32 (x86)
], [[ARCHITECTURE, 'ia32']], [ ], [[ARCHITECTURE, 'ia32']], [
/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64 /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
], [[ARCHITECTURE, 'arm64']], [ ], [[ARCHITECTURE, 'arm64']], [
/\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
], [[ARCHITECTURE, 'armhf']], [ ], [[ARCHITECTURE, 'armhf']], [
// PocketPC mistakenly identified as PowerPC // PocketPC mistakenly identified as PowerPC
/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i /windows (ce|mobile); ppc;/i
], [[ARCHITECTURE, 'arm']], [ ], [[ARCHITECTURE, 'arm']], [
/((ppc|powerpc)(64)?)( mac|;|\))/i // PowerPC /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
/ sun4\w[;\)]/i // SPARC /(sun4\w)[;\)]/i // SPARC
], [[ARCHITECTURE, 'sparc']], [ ], [[ARCHITECTURE, 'sparc']], [
/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
], [[ARCHITECTURE, lowerize]] ], [[ARCHITECTURE, lowerize]]
], ],
@@ -618,8 +598,8 @@
// Nokia // Nokia
/(nokia) (t[12][01])/i /(nokia) (t[12][01])/i
], [VENDOR, MODEL, [TYPE, TABLET]], [ ], [VENDOR, MODEL, [TYPE, TABLET]], [
/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i, /(?:maemo|nokia).*(n900|lumia \d+)/i,
/nokia[-_ ]?(([-\w\. ]*))/i /nokia[-_ ]?(([-\w\.]*))/i
], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [ ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
// Google // Google
@@ -737,8 +717,8 @@
], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
/droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets /(shield[\w ]+) b/i // Nvidia Shield Tablets
], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
/(sprint) (\w+)/i // Sprint Phones /(sprint) (\w+)/i // Sprint Phones
], [VENDOR, MODEL, [TYPE, MOBILE]], [ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
/(kin\.[onetw]{3})/i // Microsoft Kin /(kin\.[onetw]{3})/i // Microsoft Kin
@@ -770,8 +750,6 @@
], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
/droid.+aft(\w+)( bui|\))/i // Fire TV /droid.+aft(\w+)( bui|\))/i // Fire TV
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
/(shield \w+ tv)/i // Nvidia Shield TV
], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
/\(dtv[\);].+(aquos)/i, /\(dtv[\);].+(aquos)/i,
/(aquos-tv[\w ]+)\)/i // Sharp /(aquos-tv[\w ]+)\)/i // Sharp
], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
@@ -784,10 +762,7 @@
/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [ ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
// SmartTV from Unidentified Vendors /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
/droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i
], [MODEL, [TYPE, SMARTTV]], [
/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i
], [[TYPE, SMARTTV]], [ ], [[TYPE, SMARTTV]], [
/////////////////// ///////////////////
@@ -797,8 +772,8 @@
/(ouya)/i, // Ouya /(ouya)/i, // Ouya
/(nintendo) (\w+)/i // Nintendo /(nintendo) (\w+)/i // Nintendo
], [VENDOR, MODEL, [TYPE, CONSOLE]], [ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
/droid.+; (shield)( bui|\))/i // Nvidia Portable /droid.+; (shield) bui/i // Nvidia
], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
/(playstation \w+)/i // Playstation /(playstation \w+)/i // Playstation
], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
/\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
@@ -847,22 +822,20 @@
], [VENDOR, [TYPE, EMBEDDED]], [ ], [VENDOR, [TYPE, EMBEDDED]], [
/(aeobc)\b/i // Echo Dot /(aeobc)\b/i // Echo Dot
], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
/(homepod).+mac os/i // Apple HomePod
], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
/windows iot/i
], [[TYPE, EMBEDDED]], [
//////////////////// ////////////////////
// MIXED (GENERIC) // MIXED (GENERIC)
/////////////////// ///////////////////
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [ ], [MODEL, [TYPE, MOBILE]], [
/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
], [MODEL, [TYPE, TABLET]], [
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
], [[TYPE, TABLET]], [ ], [[TYPE, TABLET]], [
/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
], [[TYPE, MOBILE]], [ ], [[TYPE, MOBILE]], [
/droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
], [MODEL, [VENDOR, 'Generic']] ], [MODEL, [VENDOR, 'Generic']]
], ],
@@ -882,11 +855,8 @@
/ekioh(flow)\/([\w\.]+)/i, // Flow /ekioh(flow)\/([\w\.]+)/i, // Flow
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
/\b(libweb)/i
/\b(libweb)/i // LibWeb
], [NAME, VERSION], [ ], [NAME, VERSION], [
/ladybird\//i
], [[NAME, 'LibWeb']], [
/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
], [VERSION, NAME] ], [VERSION, NAME]
@@ -897,15 +867,15 @@
// Windows // Windows
/microsoft (windows) (vista|xp)/i // Windows (iTunes) /microsoft (windows) (vista|xp)/i // Windows (iTunes)
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(windows (?:phone(?: os)?|mobile|iot))[\/ ]?([\d\.\w ]*)/i // Windows Phone /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
], [NAME, [VERSION, strMapper, windowsVersionMap]], [ ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
/windows nt 6\.2; (arm)/i, // Windows RT /windows nt 6\.2; (arm)/i, // Windows RT
/windows[\/ ]([ntce\d\. ]+\w)(?!.+xbox)/i, /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
/(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [ ], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [
// iOS/macOS // iOS/macOS
/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i, /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
/cfnetwork\/.+darwin/i /cfnetwork\/.+darwin/i
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
@@ -927,15 +897,15 @@
// Mobile OSes // Mobile OSes
/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
], [VERSION, NAME], [ ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
/(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
], [[NAME, /(.+)/, '$1 Touch'], VERSION], [ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
// Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen|webos)\w*[-\/; ]?([\d\.]*)/i /\((series40);/i // Series 40
], [NAME, VERSION], [ ], [NAME, VERSION], [
/\(bb(10);/i // BlackBerry 10 /\(bb(10);/i // BlackBerry 10
], [VERSION, [NAME, BLACKBERRY]], [ ], [VERSION, [NAME, BLACKBERRY]], [
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
], [VERSION, [NAME, 'Symbian']], [ ], [VERSION, [NAME, 'Symbian']], [
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
], [VERSION, [NAME, FIREFOX+' OS']], [ ], [VERSION, [NAME, FIREFOX+' OS']], [
@@ -965,7 +935,7 @@
/(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i, /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
// Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
/(hurd|linux)(?: arm\w*| x86\w*| ?)([\w\.]*)/i, // Hurd/Linux /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
/(gnu) ?([\w\.]*)/i, // GNU /(gnu) ?([\w\.]*)/i, // GNU
/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
/(haiku) (\w+)/i // Haiku /(haiku) (\w+)/i // Haiku

View File

@@ -3,7 +3,7 @@
// Source: /src/main/ua-parser.js // Source: /src/main/ua-parser.js
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.2 /* UAParser.js v2.0.0
Copyright © 2012-2024 Faisal Salman <f@faisalman.com> Copyright © 2012-2024 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,35 +21,20 @@
// Constants // Constants
///////////// /////////////
var LIBVERSION = '2.0.2', var LIBVERSION = '2.0.0',
UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent',
EMPTY = '', EMPTY = '',
UNKNOWN = '?', UNKNOWN = '?',
// typeof
FUNC_TYPE = 'function', FUNC_TYPE = 'function',
UNDEF_TYPE = 'undefined', UNDEF_TYPE = 'undefined',
OBJ_TYPE = 'object', OBJ_TYPE = 'object',
STR_TYPE = 'string', STR_TYPE = 'string',
MAJOR = 'major',
// properties MODEL = 'model',
UA_BROWSER = 'browser',
UA_CPU = 'cpu',
UA_DEVICE = 'device',
UA_ENGINE = 'engine',
UA_OS = 'os',
UA_RESULT = 'result',
NAME = 'name', NAME = 'name',
TYPE = 'type', TYPE = 'type',
VENDOR = 'vendor', VENDOR = 'vendor',
VERSION = 'version', VERSION = 'version',
ARCHITECTURE= 'architecture', ARCHITECTURE= 'architecture',
MAJOR = 'major',
MODEL = 'model',
// device types
CONSOLE = 'console', CONSOLE = 'console',
MOBILE = 'mobile', MOBILE = 'mobile',
TABLET = 'tablet', TABLET = 'tablet',
@@ -57,11 +42,9 @@
WEARABLE = 'wearable', WEARABLE = 'wearable',
XR = 'xr', XR = 'xr',
EMBEDDED = 'embedded', EMBEDDED = 'embedded',
// browser types
INAPP = 'inapp', INAPP = 'inapp',
USER_AGENT = 'user-agent',
// client hints UA_MAX_LENGTH = 500,
BRANDS = 'brands', BRANDS = 'brands',
FORMFACTORS = 'formFactors', FORMFACTORS = 'formFactors',
FULLVERLIST = 'fullVersionList', FULLVERLIST = 'fullVersionList',
@@ -78,8 +61,12 @@
CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM, CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version', CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS], CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
UA_BROWSER = 'browser',
// device vendors UA_CPU = 'cpu',
UA_DEVICE = 'device',
UA_ENGINE = 'engine',
UA_OS = 'os',
UA_RESULT = 'result',
AMAZON = 'Amazon', AMAZON = 'Amazon',
APPLE = 'Apple', APPLE = 'Apple',
ASUS = 'ASUS', ASUS = 'ASUS',
@@ -91,29 +78,20 @@
LG = 'LG', LG = 'LG',
MICROSOFT = 'Microsoft', MICROSOFT = 'Microsoft',
MOTOROLA = 'Motorola', MOTOROLA = 'Motorola',
NVIDIA = 'Nvidia',
ONEPLUS = 'OnePlus',
OPPO = 'OPPO',
SAMSUNG = 'Samsung', SAMSUNG = 'Samsung',
SHARP = 'Sharp', SHARP = 'Sharp',
SONY = 'Sony', SONY = 'Sony',
XIAOMI = 'Xiaomi', XIAOMI = 'Xiaomi',
ZEBRA = 'Zebra', ZEBRA = 'Zebra',
PREFIX_MOBILE = 'Mobile ',
// browsers SUFFIX_BROWSER = ' Browser',
CHROME = 'Chrome', CHROME = 'Chrome',
CHROMIUM = 'Chromium',
CHROMECAST = 'Chromecast', CHROMECAST = 'Chromecast',
EDGE = 'Edge', EDGE = 'Edge',
FIREFOX = 'Firefox', FIREFOX = 'Firefox',
OPERA = 'Opera', OPERA = 'Opera',
FACEBOOK = 'Facebook', FACEBOOK = 'Facebook',
SOGOU = 'Sogou', SOGOU = 'Sogou',
PREFIX_MOBILE = 'Mobile ',
SUFFIX_BROWSER = ' Browser',
// os
WINDOWS = 'Windows'; WINDOWS = 'Windows';
var isWindow = typeof window !== UNDEF_TYPE, var isWindow = typeof window !== UNDEF_TYPE,
@@ -423,7 +401,6 @@
/(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
/(daum)apps[\/ ]([\w\.]+)/i, // Daum App
/safari (line)\/([\w\.]+)/i, // Line App for iOS /safari (line)\/([\w\.]+)/i, // Line App for iOS
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
/(alipay)client\/([\w\.]+)/i, // Alipay /(alipay)client\/([\w\.]+)/i, // Alipay
@@ -486,8 +463,8 @@
/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
// Other // Other
/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
/\b(links) \(([\w\.]+)/i // Links /\b(links) \(([\w\.]+)/i // Links
], [NAME, [VERSION, /_/g, '.']], [ ], [NAME, [VERSION, /_/g, '.']], [
@@ -497,30 +474,30 @@
cpu : [[ cpu : [[
/\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64) /\b(?:(amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
], [[ARCHITECTURE, 'amd64']], [ ], [[ARCHITECTURE, 'amd64']], [
/(ia32(?=;))/i, // IA32 (quicktime) /(ia32(?=;))/i, // IA32 (quicktime)
/\b((i[346]|x)86)(pc)?\b/i // IA32 (x86) /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
], [[ARCHITECTURE, 'ia32']], [ ], [[ARCHITECTURE, 'ia32']], [
/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64 /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
], [[ARCHITECTURE, 'arm64']], [ ], [[ARCHITECTURE, 'arm64']], [
/\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
], [[ARCHITECTURE, 'armhf']], [ ], [[ARCHITECTURE, 'armhf']], [
// PocketPC mistakenly identified as PowerPC // PocketPC mistakenly identified as PowerPC
/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i /windows (ce|mobile); ppc;/i
], [[ARCHITECTURE, 'arm']], [ ], [[ARCHITECTURE, 'arm']], [
/((ppc|powerpc)(64)?)( mac|;|\))/i // PowerPC /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
/ sun4\w[;\)]/i // SPARC /(sun4\w)[;\)]/i // SPARC
], [[ARCHITECTURE, 'sparc']], [ ], [[ARCHITECTURE, 'sparc']], [
/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
], [[ARCHITECTURE, lowerize]] ], [[ARCHITECTURE, lowerize]]
], ],
@@ -554,38 +531,34 @@
], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
// Honor // Honor
/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i /(?:honor)([-\w ]+)[;\)]/i
], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
/honor([-\w ]+)[;\)]/i
], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
// Huawei // Huawei
/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
/(?:huawei)([-\w ]+)[;\)]/i, /(?:huawei)([-\w ]+)[;\)]/i,
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
// Xiaomi // Xiaomi
/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
/\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO /\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 /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i, // Xiaomi Mi /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
/ ([\w ]+) miui\/v?\d/i
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
// OPPO // OPPO
/; (\w+) bui.+ oppo/i, /; (\w+) bui.+ oppo/i,
/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
/\b(opd2(\d{3}a?))(?: bui|\))/i /\b(opd2\d{3}a?) bui/i
], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['304', '403', '203'], '*' : OPPO }], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, TABLET]], [
// Vivo // Vivo
/vivo (\w+)(?: bui|\))/i, /vivo (\w+)(?: bui|\))/i,
@@ -599,7 +572,7 @@
// Motorola // Motorola
/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i, /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
/\bmot(?:orola)?[- ](\w*)/i, /\bmot(?:orola)?[- ](\w*)/i,
/((?:moto(?! 360)[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
/\b(mz60\d|xoom[2 ]{0,2}) build\//i /\b(mz60\d|xoom[2 ]{0,2}) build\//i
], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
@@ -608,24 +581,22 @@
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i, /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
/\blg[-e;\/ ]+((?!browser|netcast|android tv|watch)\w+)/i, /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
/\blg-?([\d\w]+) bui/i /\blg-?([\d\w]+) bui/i
], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
// Lenovo // Lenovo
/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i, /(ideatab[-\w ]+)/i,
/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
// Nokia // Nokia
/(nokia) (t[12][01])/i /(?:maemo|nokia).*(n900|lumia \d+)/i,
], [VENDOR, MODEL, [TYPE, TABLET]], [ /nokia[-_ ]?([-\w\.]*)/i
/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i, ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
/nokia[-_ ]?(([-\w\. ]*))/i
], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
// Google // Google
/(pixel (c|tablet))\b/i // Google Pixel C/Tablet /(pixel c)\b/i // Google Pixel C
], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
@@ -640,7 +611,7 @@
// OnePlus // OnePlus
/ (kb2005|in20[12]5|be20[12][59])\b/i, / (kb2005|in20[12]5|be20[12][59])\b/i,
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
// Amazon // Amazon
/(alexa)webm/i, /(alexa)webm/i,
@@ -716,19 +687,18 @@
], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
// MIXED // MIXED
/(imo) (tab \w+)/i, // IMO /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
/(infinix) (x1101b?)/i // Infinix XPad
], [VENDOR, MODEL, [TYPE, TABLET]], [
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan
/; (hmd|imo) ([\w ]+?)(?: bui|\))/i, // HMD/IMO /; (imo) ((?!tab)[\w ]+?)(?: bui|\))/i, // IMO
/(hp) ([\w ]+\w)/i, // HP iPAQ /(hp) ([\w ]+\w)/i, // HP iPAQ
/(asus)-?(\w+)/i, // Asus
/(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
/(lenovo)[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i, // Lenovo /(lenovo)[-_ ]?([-\w]+)/i, // Lenovo
/(jolla)/i, // Jolla
/(oppo) ?([\w ]+) bui/i // OPPO /(oppo) ?([\w ]+) bui/i // OPPO
], [VENDOR, MODEL, [TYPE, MOBILE]], [ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
/(imo) (tab \w+)/i, // IMO
/(kobo)\s(ereader|touch)/i, // Kobo /(kobo)\s(ereader|touch)/i, // Kobo
/(archos) (gamepad2?)/i, // Archos /(archos) (gamepad2?)/i, // Archos
/(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
@@ -739,8 +709,8 @@
], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
/droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets /(shield[\w ]+) b/i // Nvidia Shield Tablets
], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
/(sprint) (\w+)/i // Sprint Phones /(sprint) (\w+)/i // Sprint Phones
], [VENDOR, MODEL, [TYPE, MOBILE]], [ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
/(kin\.[onetw]{3})/i // Microsoft Kin /(kin\.[onetw]{3})/i // Microsoft Kin
@@ -772,24 +742,19 @@
], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
/droid.+aft(\w+)( bui|\))/i // Fire TV /droid.+aft(\w+)( bui|\))/i // Fire TV
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
/(shield \w+ tv)/i // Nvidia Shield TV
], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
/\(dtv[\);].+(aquos)/i, /\(dtv[\);].+(aquos)/i,
/(aquos-tv[\w ]+)\)/i // Sharp /(aquos-tv[\w ]+)\)/i // Sharp
], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
/(bravia[\w ]+)( bui|\))/i // Sony /(bravia[\w ]+)( bui|\))/i // Sony
], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
/(mi(tv|box)-?\w+) bui/i // Xiaomi /(mitv-\w{5}) bui/i // Xiaomi
], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
/Hbbtv.*(technisat) (.*);/i // TechniSAT /Hbbtv.*(technisat) (.*);/i // TechniSAT
], [VENDOR, MODEL, [TYPE, SMARTTV]], [ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [ ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
// SmartTV from Unidentified Vendors /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
/droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i
], [MODEL, [TYPE, SMARTTV]], [
/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i
], [[TYPE, SMARTTV]], [ ], [[TYPE, SMARTTV]], [
/////////////////// ///////////////////
@@ -799,8 +764,8 @@
/(ouya)/i, // Ouya /(ouya)/i, // Ouya
/(nintendo) (\w+)/i // Nintendo /(nintendo) (\w+)/i // Nintendo
], [VENDOR, MODEL, [TYPE, CONSOLE]], [ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
/droid.+; (shield)( bui|\))/i // Nvidia Portable /droid.+; (shield) bui/i // Nvidia
], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
/(playstation \w+)/i // Playstation /(playstation \w+)/i // Playstation
], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
/\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
@@ -810,23 +775,12 @@
// WEARABLES // WEARABLES
/////////////////// ///////////////////
/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch /\b(sm-[lr]\d\d[05][fnuw]?s?)\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
], [VENDOR, MODEL, [TYPE, WEARABLE]], [ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
/(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
/(opwwe\d{3})/i // OnePlus Watch
], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
/(moto 360)/i // Motorola 360
], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
/(smartwatch 3)/i // Sony SmartWatch
], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
/(g watch r)/i // LG G Watch R
], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
/droid.+; (wt63?0{2,3})\)/i /droid.+; (wt63?0{2,3})\)/i
], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
@@ -849,22 +803,20 @@
], [VENDOR, [TYPE, EMBEDDED]], [ ], [VENDOR, [TYPE, EMBEDDED]], [
/(aeobc)\b/i // Echo Dot /(aeobc)\b/i // Echo Dot
], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
/(homepod).+mac os/i // Apple HomePod
], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
/windows iot/i
], [[TYPE, EMBEDDED]], [
//////////////////// ////////////////////
// MIXED (GENERIC) // MIXED (GENERIC)
/////////////////// ///////////////////
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [ ], [MODEL, [TYPE, MOBILE]], [
/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
], [MODEL, [TYPE, TABLET]], [
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
], [[TYPE, TABLET]], [ ], [[TYPE, TABLET]], [
/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
], [[TYPE, MOBILE]], [ ], [[TYPE, MOBILE]], [
/droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
], [MODEL, [VENDOR, 'Generic']] ], [MODEL, [VENDOR, 'Generic']]
], ],
@@ -884,11 +836,8 @@
/ekioh(flow)\/([\w\.]+)/i, // Flow /ekioh(flow)\/([\w\.]+)/i, // Flow
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
/\b(libweb)/i
/\b(libweb)/i // LibWeb
], [NAME, VERSION], [ ], [NAME, VERSION], [
/ladybird\//i
], [[NAME, 'LibWeb']], [
/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
], [VERSION, NAME] ], [VERSION, NAME]
@@ -899,15 +848,15 @@
// Windows // Windows
/microsoft (windows) (vista|xp)/i // Windows (iTunes) /microsoft (windows) (vista|xp)/i // Windows (iTunes)
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(windows (?:phone(?: os)?|mobile|iot))[\/ ]?([\d\.\w ]*)/i // Windows Phone /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
], [NAME, [VERSION, strMapper, windowsVersionMap]], [ ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
/windows nt 6\.2; (arm)/i, // Windows RT /windows nt 6\.2; (arm)/i, // Windows RT
/windows[\/ ]([ntce\d\. ]+\w)(?!.+xbox)/i, /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
/(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [ ], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [
// iOS/macOS // iOS/macOS
/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i, /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
/cfnetwork\/.+darwin/i /cfnetwork\/.+darwin/i
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
@@ -929,15 +878,15 @@
// Mobile OSes // Mobile OSes
/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
], [VERSION, NAME], [ ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
/(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
], [[NAME, /(.+)/, '$1 Touch'], VERSION], [ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
// Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen|webos)\w*[-\/; ]?([\d\.]*)/i /\((series40);/i // Series 40
], [NAME, VERSION], [ ], [NAME, VERSION], [
/\(bb(10);/i // BlackBerry 10 /\(bb(10);/i // BlackBerry 10
], [VERSION, [NAME, BLACKBERRY]], [ ], [VERSION, [NAME, BLACKBERRY]], [
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
], [VERSION, [NAME, 'Symbian']], [ ], [VERSION, [NAME, 'Symbian']], [
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
], [VERSION, [NAME, FIREFOX+' OS']], [ ], [VERSION, [NAME, FIREFOX+' OS']], [
@@ -967,7 +916,7 @@
/(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i, /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
// Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
/(hurd|linux)(?: arm\w*| x86\w*| ?)([\w\.]*)/i, // Hurd/Linux /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
/(gnu) ?([\w\.]*)/i, // GNU /(gnu) ?([\w\.]*)/i, // GNU
/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
/(haiku) (\w+)/i // Haiku /(haiku) (\w+)/i // Haiku
@@ -1204,27 +1153,17 @@
switch (this.itemType) { switch (this.itemType) {
case UA_BROWSER: case UA_BROWSER:
case UA_ENGINE:
var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName; var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
if (brands) { if (brands) {
for (var i in brands) { for (var i in brands) {
var brandName = brands[i].brand || brands[i], var brandName = strip(/(Google|Microsoft) /, brands[i].brand || brands[i]),
brandVersion = brands[i].version; brandVersion = brands[i].version;
if (this.itemType == UA_BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || (/chrom/i.test(prevName) && brandName != CHROMIUM))) { if (!/not.a.brand/i.test(brandName) && (!prevName || (/chrom/i.test(prevName) && !/chromi/i.test(brandName)))) {
brandName = strMapper(brandName, {
'Chrome' : 'Google Chrome',
'Edge' : 'Microsoft Edge',
'Chrome WebView' : 'Android WebView',
'Chrome Headless' : 'HeadlessChrome'
});
this.set(NAME, brandName) this.set(NAME, brandName)
.set(VERSION, brandVersion) .set(VERSION, brandVersion)
.set(MAJOR, majorize(brandVersion)); .set(MAJOR, majorize(brandVersion));
prevName = brandName; prevName = brandName;
} }
if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {
this.set(VERSION, brandVersion);
}
} }
} }
break; break;
@@ -1241,16 +1180,11 @@
} }
if (uaCH[MODEL]) { if (uaCH[MODEL]) {
this.set(MODEL, uaCH[MODEL]); this.set(MODEL, uaCH[MODEL]);
if (!this.get(TYPE) || !this.get(VENDOR)) { }
var reParse = {}; // Xbox-Specific Detection
rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap); if (uaCH[MODEL] == 'Xbox') {
if (!this.get(TYPE) && !!reParse.type) { this.set(TYPE, CONSOLE)
this.set(TYPE, reParse.type); .set(VENDOR, MICROSOFT);
}
if (!this.get(VENDOR) && !!reParse.vendor) {
this.set(VENDOR, reParse.vendor);
}
}
} }
if (uaCH[FORMFACTORS]) { if (uaCH[FORMFACTORS]) {
var ff; var ff;

View File

@@ -1076,16 +1076,6 @@
"major" : "91" "major" : "91"
} }
}, },
{
"desc" : "Ladybird",
"ua" : "Mozilla/5.0 (Linux; x86_64) Ladybird/1.0",
"expect" :
{
"name" : "Ladybird",
"version" : "1.0",
"major" : "1"
}
},
{ {
"desc" : "LibreWolf", "desc" : "LibreWolf",
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0 LibreWolf/97.0.1", "ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0 LibreWolf/97.0.1",
@@ -2503,26 +2493,6 @@
"type" : "inapp" "type" : "inapp"
} }
}, },
{
"desc" : "Daum App Android",
"ua" : "Mozilla/5.0 (Linux; Android 11; SM-G970N Build/RP1A.200720.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 DaumApps/7.5.0 DaumDevice/mobile",
"expect" : {
"name" : "Daum",
"version": "7.5.0",
"major" : "7",
"type" : "inapp"
}
},
{
"desc" : "Daum App iOS",
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Safari/605.1.15 Mobile/15E148 DaumApps/7.5.1 DaumDevice/mobile",
"expect" : {
"name" : "Daum",
"version": "7.5.1",
"major" : "7",
"type" : "inapp"
}
},
{ {
"desc" : "TikTok", "desc" : "TikTok",
"ua" : "Mozilla/5.0 (Linux; Android 11; 21061119AG Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 trill_2022109040 JsSdk/1.0 NetType/MOBILE Channel/googleplay AppName/musical_ly app_version/21.9.4 ByteLocale/ru-RU ByteFullLocale/ru-RU Region/KG BytedanceWebview/d8a21c6", "ua" : "Mozilla/5.0 (Linux; Android 11; 21061119AG Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 trill_2022109040 JsSdk/1.0 NetType/MOBILE Channel/googleplay AppName/musical_ly app_version/21.9.4 ByteLocale/ru-RU ByteFullLocale/ru-RU Region/KG BytedanceWebview/d8a21c6",

View File

@@ -175,14 +175,6 @@
"architecture" : "arm64" "architecture" : "arm64"
} }
}, },
{
"desc" : "Google Search App",
"ua" : "Mozilla/5.0 (Linux; Android 9; JAT-LX1 Build/HONORJAT-LX1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.96 Mobile Safari/537.36 GoogleApp/11.11.10.21.arm",
"expect" :
{
"architecture" : "arm"
}
},
{ {
"desc" : "Google Search App", "desc" : "Google Search App",
"ua" : "Mozilla/5.0 (Linux; Android 6.0; M5s Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.147 Mobile Safari/537.36 GSA/12.40.17.23.arm64", "ua" : "Mozilla/5.0 (Linux; Android 6.0; M5s Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.147 Mobile Safari/537.36 GSA/12.40.17.23.arm64",
@@ -278,13 +270,5 @@
{ {
"architecture" : "68k" "architecture" : "68k"
} }
},
{
"desc" : "x86",
"ua" : "Mozilla/5.0 (Photon; U; QNX x86pc; en-US; rv:1.8.1.20) Gecko/20090127 BonEcho/2.0.0.20",
"expect" :
{
"architecture" : "ia32"
}
} }
] ]

View File

@@ -1,18 +1,10 @@
[ [
{
"desc": "Generic Android Device",
"ua": "Dalvik/2.1.0 (Linux; U; Android 9; X96mini_RP Build/X96mini_RP)",
"expect": {
"vendor": "Generic",
"model": "X96mini_RP"
}
},
{ {
"desc": "Generic Android Device", "desc": "Generic Android Device",
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; i980 Build/MRA58K)", "ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; i980 Build/MRA58K)",
"expect": { "expect": {
"vendor": "Generic", "vendor": "Generic",
"model": "i980" "model": "Android 6.0.1"
} }
}, },
{ {
@@ -24,14 +16,6 @@
"type": "mobile" "type": "mobile"
} }
}, },
{
"desc": "Unknown VR Device",
"ua": "Mozilla/5.0 (Linux; Android 5.0.2; Unknown Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile VR Safari/537.36",
"expect": {
"model": "Unknown",
"type": "xr"
}
},
{ {
"desc": "Desktop (IE11 with Tablet string)", "desc": "Desktop (IE11 with Tablet string)",
"ua": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; GWX:MANAGED; rv:11.0) like Gecko", "ua": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; GWX:MANAGED; rv:11.0) like Gecko",
@@ -50,33 +34,6 @@
"type": "mobile" "type": "mobile"
} }
}, },
{
"desc": "ChangHong Android TV",
"ua": "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; ChangHong Android TV Build/LMY49J) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.8 Mobile Safari/537.36",
"expect": {
"vendor": "undefined",
"model": "ChangHong",
"type": "smarttv"
}
},
{
"desc": "MStar Android TV",
"ua": "Mozilla/5.0 (Linux; Android 4.3.1; MStar Android TV Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.95 Safari/537.36",
"expect": {
"vendor": "undefined",
"model": "MStar",
"type": "smarttv"
}
},
{
"desc": "ONIDA Android TV",
"ua": "Mozilla/5.0 (Linux; Android 6.0; ONIDA Android TV Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2542.0 Mobile Safari/537.36",
"expect": {
"vendor": "undefined",
"model": "ONIDA",
"type": "smarttv"
}
},
{ {
"desc": "JVC LT-43V55LFA Smart TV", "desc": "JVC LT-43V55LFA Smart TV",
"ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 OPR/40.0.2207.0 OMI/4.9.0.237.DOM3-OPT.245 Model/Vestel-MB211 VSTVB MB200 HbbTV/1.2.1 (; JVC; MB211; 3.19.4.2; _TV_NT72563_2017 SmartTvA/3.0.0", "ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 OPR/40.0.2207.0 OMI/4.9.0.237.DOM3-OPT.245 Model/Vestel-MB211 VSTVB MB200 HbbTV/1.2.1 (; JVC; MB211; 3.19.4.2; _TV_NT72563_2017 SmartTvA/3.0.0",
@@ -289,14 +246,5 @@
"model": "undefined", "model": "undefined",
"type": "mobile" "type": "mobile"
} }
},
{
"desc" : "Windows IoT",
"ua" : "Mozilla/5.0 (Windows IoT 10.0; Android 6.0.1; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763",
"expect": {
"vendor": "undefined",
"model": "undefined",
"type": "embedded"
}
} }
] ]

View File

@@ -116,15 +116,6 @@
"type": "mobile" "type": "mobile"
} }
}, },
{
"desc": "Apple HomePod",
"ua": "AppleCoreMedia/1.0.0.15D61 (HomePod; U; CPU OS 11_2_5 like Mac OS X; en_us)",
"expect": {
"vendor": "Apple",
"model": "HomePod",
"type": "embedded"
}
},
{ {
"desc": "Issue #519", "desc": "Issue #519",
"ua": "ios/iPhone/14.2/SOME_CUSTOM_APP_VERSION", "ua": "ios/iPhone/14.2/SOME_CUSTOM_APP_VERSION",

View File

@@ -17,15 +17,6 @@
"type": "mobile" "type": "mobile"
} }
}, },
{
"desc": "Nokia 5800 XpressMusic",
"ua": "Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Nokia5800d-1/10.4.016; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
"expect": {
"vendor": "Nokia",
"model": "5800d-1",
"type": "mobile"
}
},
{ {
"desc": "Nokia 7", "desc": "Nokia 7",
"ua": "Mozilla/5.0 (Linux; Android 11; Nokia 7.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36", "ua": "Mozilla/5.0 (Linux; Android 11; Nokia 7.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
@@ -35,33 +26,6 @@
"type": "mobile" "type": "mobile"
} }
}, },
{
"desc": "Nokia 808 PureView",
"ua": "Mozilla/5.0 (Symbian; U; Nokia808 PureView; en-GB) AppleWebKit/534.3 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Mobile Safari/534.3",
"expect": {
"vendor": "Nokia",
"model": "808 PureView",
"type": "mobile"
}
},
{
"desc": "Nokia 808 PureView",
"ua": "Mozilla/5.0 (Symbian/3; Series60/5.5 Nokia808PureView/113.010.1508; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.2.21 Mobile Safari/535.1 3gpp-gba",
"expect": {
"vendor": "Nokia",
"model": "808PureView",
"type": "mobile"
}
},
{
"desc": "Nokia Lumia 630",
"ua": "UCWEB/2.0 (Windows; U; wds 8.10; en-IN; NOKIA; RM-978_1046) U2/1.0.0 UCBrowser/4.2.0.524 U2/1.0.0 Mobile",
"expect": {
"vendor": "Nokia",
"model": "RM-978",
"type": "mobile"
}
},
{ {
"desc": "Nokia N9", "desc": "Nokia N9",
"ua": "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13", "ua": "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
@@ -71,15 +35,6 @@
"type": "mobile" "type": "mobile"
} }
}, },
{
"desc": "Nokia N900",
"ua": "Mozilla/5.0 (Linux; Maemo 5.0; Nokia N900; Build/4.0.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36",
"expect": {
"vendor": "Nokia",
"model": "N900",
"type": "mobile"
}
},
{ {
"desc": "Nokia T20", "desc": "Nokia T20",
"ua": "Mozilla/5.0 (Linux; Android 12; Nokia T20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", "ua": "Mozilla/5.0 (Linux; Android 12; Nokia T20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",

View File

@@ -1,22 +1,4 @@
[ [
{
"desc": "Tegra Note 7",
"ua": "Mozilla/5.0 (Linux; Android 5.1; TegraNote-P1640 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36",
"expect": {
"vendor": "Nvidia",
"model": "TegraNote-P1640",
"type": "tablet"
}
},
{
"desc": "Nvidia Shield",
"ua": "Mozilla/5.0 (Linux; Android 5.1; SHIELD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36",
"expect": {
"vendor": "Nvidia",
"model": "SHIELD",
"type": "console"
}
},
{ {
"desc": "Nvidia Shield Tablet", "desc": "Nvidia Shield Tablet",
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; SHIELD Tablet Build/LVY48E; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/45.0.2454.19 Safari/537.36", "ua": "Mozilla/5.0 (Linux; Android 5.1.1; SHIELD Tablet Build/LVY48E; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/45.0.2454.19 Safari/537.36",
@@ -25,23 +7,5 @@
"model": "SHIELD Tablet", "model": "SHIELD Tablet",
"type": "tablet" "type": "tablet"
} }
},
{
"desc": "Nvidia Shield Tablet K1",
"ua": "Mozilla/5.0 (Linux; Android 7.0; SHIELD Tablet K1 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Safari/537.36",
"expect": {
"vendor": "Nvidia",
"model": "SHIELD Tablet K1",
"type": "tablet"
}
},
{
"desc": "Nvidia Shield TV",
"ua": "Mozilla/5.0 (Linux; Android 11; SHIELD Android TV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 ",
"expect": {
"vendor": "Nvidia",
"model": "SHIELD Android TV",
"type": "smarttv"
}
} }
] ]

View File

@@ -62,15 +62,6 @@
"version" : "4.5.4" "version" : "4.5.4"
} }
}, },
{
"desc" : "LibWeb",
"ua" : "Mozilla/5.0 (Linux; x86_64) Ladybird/1.0",
"expect" :
{
"name" : "LibWeb",
"version" : "undefined"
}
},
{ {
"desc" : "LibWeb", "desc" : "LibWeb",
"ua" : "Mozilla/4.0 (SerenityOS; x86) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb", "ua" : "Mozilla/4.0 (SerenityOS; x86) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb",

View File

@@ -19,16 +19,6 @@
"type" : "fetcher" "type" : "fetcher"
} }
}, },
{
"desc" : "Bluesky",
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app) Chrome/100.0.0.0 Safari/537.36",
"expect" :
{
"name" : "Bluesky",
"version" : "1.1",
"type" : "fetcher"
}
},
{ {
"desc" : "ChatGPT-User", "desc" : "ChatGPT-User",
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot", "ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",

View File

@@ -52,14 +52,5 @@
"name" : "iOS", "name" : "iOS",
"version" : "7.0.2" "version" : "7.0.2"
} }
},
{
"desc": "Apple HomePod",
"ua": "AppleCoreMedia/1.0.0.15D61 (HomePod; U; CPU OS 11_2_5 like Mac OS X; en_us)",
"expect" :
{
"name" : "iOS",
"version" : "11.2.5"
}
} }
] ]

View File

@@ -5,16 +5,7 @@
"expect" : "expect" :
{ {
"name" : "Linux", "name" : "Linux",
"version" : "undefined" "version" : "x86_64"
}
},
{
"desc" : "Linux",
"ua" : "Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1",
"expect" :
{
"name" : "Linux",
"version" : "undefined"
} }
} }
] ]

View File

@@ -7,23 +7,5 @@
"name" : "Maemo", "name" : "Maemo",
"version" : "undefined" "version" : "undefined"
} }
},
{
"desc" : "Nokia N900 Linux mobile, on the Maemo browser",
"ua" : "Mozilla/5.0(X11; U; Linux armv7l; fr-FR; rv:1.9.2a1pre) Gecko/20091127 Firefox/3.5 Maemo Browser 1.5.6 RX-51 N900",
"expect" :
{
"name" : "Maemo",
"version" : "undefined"
}
},
{
"desc" : "Nokia N900 Linux mobile, on the Maemo browser",
"ua" : "Mozilla/5.0 (Linux; Maemo 5.0; Nokia N900; Build/4.0.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36",
"expect" :
{
"name" : "Maemo",
"version" : "5.0"
}
} }
] ]

View File

@@ -5,7 +5,7 @@
"expect" : "expect" :
{ {
"name" : "QNX", "name" : "QNX",
"version" : "undefined" "version" : "x86pc"
} }
} }
] ]

View File

@@ -1,6 +1,6 @@
[ [
{ {
"desc" : "Nokia 5250", "desc" : "Symbian",
"ua" : "Nokia5250/10.0.011 (SymbianOS/9.4; U; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Safari/525 3gpp-gba", "ua" : "Nokia5250/10.0.011 (SymbianOS/9.4; U; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Safari/525 3gpp-gba",
"expect" : "expect" :
{ {
@@ -9,57 +9,12 @@
} }
}, },
{ {
"desc" : "Nokia N79", "desc" : "Symbian",
"ua" : "Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaN79-1/32.001; Profile/MIDP-2.1 Configuration/CLDC-1",
"expect" :
{
"name" : "Symbian",
"version" : "9.3"
}
},
{
"desc" : "Nokia E71",
"ua" : "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE71-1/110.07.127; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
"expect" :
{
"name" : "Symbian",
"version" : "9.2"
}
},
{
"desc" : "Opera Mini on S60",
"ua" : "Opera/9.80 (Series 60; Opera Mini/7.1.32444/191.361; U; de) Presto/2.12.423 Version/12.16",
"expect" :
{
"name" : "Symbian",
"version" : "undefined"
}
},
{
"desc" : "NokiaBrowser on Nokia C7",
"ua" : "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/024.001; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba", "ua" : "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/024.001; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba",
"expect" : "expect" :
{ {
"name" : "Symbian", "name" : "Symbian",
"version" : "3" "version" : "5.2"
}
},
{
"desc" : "Nokia 808 PureView",
"ua" : "Mozilla/5.0 (Symbian/3; Series60/5.5 Nokia808PureView/113.010.1508; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.2.21 Mobile Safari/535.1 3gpp-gba",
"expect" :
{
"name" : "Symbian",
"version" : "3"
}
},
{
"desc" : "Nokia 808 PureView",
"ua" : "Mozilla/5.0 (Symbian; U; Nokia808 PureView; en-GB) AppleWebKit/534.3 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Mobile Safari/534.3",
"expect" :
{
"name" : "Symbian",
"version" : "undefined"
} }
} }
] ]

View File

@@ -1,11 +0,0 @@
[
{
"desc" : "Ubuntu Touch",
"ua" : "Mozilla/5.0 (Linux; Ubuntu 16.04 like Android 4.4) AppleWebKit/537.36 Chromium/65.0.3325.151 Mobile Safari/537.36",
"expect" :
{
"name" : "Ubuntu Touch",
"version" : "16.04"
}
}
]

View File

@@ -1,11 +0,0 @@
[
{
"desc" : "Windows IoT",
"ua" : "Mozilla/5.0 (Windows IoT 10.0; Android 6.0.1; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763",
"expect" :
{
"name" : "Windows IoT",
"version" : "10.0"
}
}
]

56
test/unit/device-utils.js Normal file
View File

@@ -0,0 +1,56 @@
const assert = require('assert');
const { UAParser } = require('../../src/main/ua-parser');
const { getMarketingName, isMobile, isSmartTV, isTablet, isWearable, isXR } = require('../../src/device-utils/ua-parser-device-utils');
const { Vendor } = require('../../src/enums/ua-parser-enums');
describe('Device type check', () => {
const advanM4 = 'Mozilla/5.0 (Linux; U; Android 6.0; ADVAN M4 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.119 Mobile Safari/537.36 OPR/28.0.2254.119214';
const galaxyWatch5 = 'Mozilla/5.0 (Linux; Android 11; SAMSUNG SM-R925U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2. Chrome/111.0.5563.116 Mobile Safari/537.36';
const miTV = 'Mozilla/5.0 (Linux; Android 10; MiTV-MOOQ0 Build/QTG3.200305.006; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/94.0.4606.61 Mobile Safari/537.36';
const nokiaT20 = 'Mozilla/5.0 (Linux; Android 11; Nokia T20 Build/RP1A.201005.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/93.0.4577.62 Safari/537.36';
const questPro = 'Mozilla/5.0 (X11; Linux x86_64; Quest Pro) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/24.4.0.22.60.426469926 SamsungBrowser/4.0 Chrome/106.0.5249.181 VR Safari/537.36';
it('isMobile()', () => {
assert.strictEqual(isMobile(advanM4), true);
assert.strictEqual(isMobile(galaxyWatch5), false);
assert.strictEqual(isMobile(nokiaT20), false);
assert.strictEqual(isMobile(miTV), false);
const uaResult = UAParser(advanM4);
const { device: uaDevice } = uaResult;
assert.strictEqual(isMobile(uaResult), true);
assert.strictEqual(isMobile(uaDevice), true);
assert.strictEqual(isMobile(isMobile), false);
});
it('isSmartTV()', () => {
assert.strictEqual(isSmartTV(nokiaT20), false);
assert.strictEqual(isSmartTV(galaxyWatch5), false);
assert.strictEqual(isSmartTV(miTV), true);
});
it('isTablet()', () => {
assert.strictEqual(isTablet(nokiaT20), true);
assert.strictEqual(isTablet(questPro), false);
});
it('isWearable()', () => {
assert.strictEqual(isWearable(advanM4), false);
assert.strictEqual(isWearable(galaxyWatch5), true);
assert.strictEqual(isWearable(miTV), false);
});
it('isXR()', () => {
assert.strictEqual(isXR(advanM4), false);
assert.strictEqual(isXR(questPro), true);
});
});
describe('getMarketingName()', () => {
it('Returns marketing name from given model name', () => {
assert.strictEqual(getMarketingName('M2101K9C', Vendor.XIAOMI), 'Mi 11 Lite 5G');
assert.strictEqual(getMarketingName('SM-S928N', Vendor.SAMSUNG), 'Galaxy S24 Ultra');
});
});

View File

@@ -48,15 +48,6 @@ describe('Extensions', () => {
assert.deepEqual(libraryParser.setUA(axios).getBrowser(), {name: "axios", version: "1.3.5", major: "1", type: "library"}); assert.deepEqual(libraryParser.setUA(axios).getBrowser(), {name: "axios", version: "1.3.5", major: "1", type: "library"});
assert.deepEqual(libraryParser.setUA(jsdom).getBrowser(), {name: "jsdom", version: "20.0.3", major: "20", type: "library"}); assert.deepEqual(libraryParser.setUA(jsdom).getBrowser(), {name: "jsdom", version: "20.0.3", major: "20", type: "library"});
assert.deepEqual(libraryParser.setUA(scrapy).getBrowser(), {name: "Scrapy", version: "1.5.0", major: "1", type: "library"}); assert.deepEqual(libraryParser.setUA(scrapy).getBrowser(), {name: "Scrapy", version: "1.5.0", major: "1", type: "library"});
// Bluesky
const bluesky = 'Mozilla/5.0 (compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app)';
assert.deepEqual(new UAParser(bluesky, Bots).getBrowser(), {
name: 'Bluesky',
version: '1.1',
major: '1',
type: 'fetcher'
});
}); });
describe('Merge', () => { describe('Merge', () => {

View File

@@ -68,7 +68,7 @@ describe('Map UA-CH headers', () => {
assert.strictEqual(uap.engine.name, 'Blink'); assert.strictEqual(uap.engine.name, 'Blink');
assert.strictEqual(uap.engine.version, '110.0.0.0'); assert.strictEqual(uap.engine.version, '110.0.0.0');
assert.strictEqual(uap.os.name, "Linux"); assert.strictEqual(uap.os.name, "Linux");
assert.strictEqual(uap.os.version, undefined); assert.strictEqual(uap.os.version, "x86_64");
}); });
it('Fallback to user-agent header when using `withClientHints()` but found no client hints-related headers', () => { it('Fallback to user-agent header when using `withClientHints()` but found no client hints-related headers', () => {
@@ -90,7 +90,7 @@ describe('Map UA-CH headers', () => {
assert.strictEqual(uap.engine.name, 'Blink'); assert.strictEqual(uap.engine.name, 'Blink');
assert.strictEqual(uap.engine.version, '110.0.0.0'); assert.strictEqual(uap.engine.version, '110.0.0.0');
assert.strictEqual(uap.os.name, "Linux"); assert.strictEqual(uap.os.name, "Linux");
assert.strictEqual(uap.os.version, undefined); assert.strictEqual(uap.os.version, "x86_64");
}); });
it('Can detect Apple silicon from client hints data', () => { it('Can detect Apple silicon from client hints data', () => {