diff --git a/CHANGELOG.md b/CHANGELOG.md index e56ee43..84bcaf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,33 +2,19 @@ # Version 2.0 - What's breaking: - - Dual-licensed under AGPL v3 or Commercial License + - Dual-licensed under AGPLv3 or PRO License - Browser detection on mobile device: `"Chrome" => "Mobile Chrome"`, `"Firefox" => "Mobile Firefox"` - OS detection: `"Mac OS" => "macOS"`, `"Chromium OS" => "Chrome OS"` - What's new: - - Add some new methods in result object: - - Add support for client hints: `withClientHints()` - - Add support for feature detection: `withFeatureCheck()` + - Some new methods in result object: + - Support for client hints: `withClientHints()` + - Support for feature detection: `withFeatureCheck()` - Utility for easy comparison: `is()` - Utility to print full-name: `toString()` - - Add support for ES module `import { UAParser } from 'ua-parser-js'` - - Provide Enums `'ua-parser-js/enums'` - - Provide Extensions `'ua-parser-js/extensions'` - - Provide Helpers `'ua-parser-js/helpers'` - -## Version 2.0.0-alpha.3 -- Add `withFeatureCheck()` method -- Add `isFrozenUA()` method in `helpers` submodule -- Add `MediaPlayers` & `Modules` in `extensions` submodule -- Fix issue with ESM import - -## Version 2.0.0-alpha.2 -- Fix browser result always returning Chromium when using `withClientHints()` -- Fix infinite-loop when await-ing `withClientHints()` in non-client-hints browser - -## Version 2.0.0-alpha.1 -- Initial work on new major version - + - Support for ES module `import { UAParser } from 'ua-parser-js'` + - Provided Enums submodule `'ua-parser-js/enums'` + - Provided Extensions submodule `'ua-parser-js/extensions'` + - Provided Helpers submodule `'ua-parser-js/helpers'` # Version 0.7 / 1.0 diff --git a/README.md b/README.md index d24cb53..039902b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
@@ -15,622 +15,40 @@
# UAParser.js
-JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client-Hints data that can be used either in browser (client-side) or node.js (server-side).
-
-* Author : Faisal Salman <
-
-
-
-
-
----
+The most comprehensive, compact, & up-to-date JavaScript library to detect
+user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
+(client-side) or node.js (server-side).
# Version 2.0
-What's new & breaking, please read [CHANGELOG](CHANGELOG.md) before upgrading.
+Before upgrading from `v0.7` / `v1.0`, please read [CHANGELOG](CHANGELOG.md) to
+see what's new & breaking.
# Documentation
-### `UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)]):IData`
-In browser environment you don't need to pass the user-agent string to the function, as it should automatically get the string from the `window.navigator.userAgent`. Whereas in nodejs environment, the user-agent string must be passed in order for the function to work (usually you can find the user-agent in: `request.headers["user-agent"]`).
-
-## Constructor
-
-#### * `new UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)]):UAParser`
-
-When you call `UAParser` with the `new` keyword, `UAParser` will return a new instance with an empty result object, you have to call one of the available methods to get the information from the user-agent string.
-Like so:
-
-```js
-let parser = new UAParser("your user-agent here"); // you need to pass the user-agent for nodejs
-console.log(parser); // {}
-let parserResults = parser.getResult();
-console.log(parserResults);
-/*
- {
- ua : "",
- browser : {},
- engine : {},
- os : {},
- device : {},
- cpu : {}
- }
-*/
-```
-
-#### * `UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)]):IData`
-
-When you call `UAParser` without the `new` keyword, it will automatically call `getResult()` function and return the parsed results.
-
-```sh
-returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
-```
-
-## `UAParser`:
-
-#### Methods table
-The methods are self explanatory, here's a small overview on all the available methods:
- * `getResult()` - returns all function object calls, user-agent string, browser info, cpu, device, engine, os:
-`{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`.
-
- * `getBrowser()` - returns the browser name and version.
- * `getDevice()` - returns the device model, type, vendor.
- * `getEngine()` - returns the current browser engine name and version.
- * `getOS()` - returns the running operating system name and version.
- * `getCPU()` - returns CPU architectural design name.
- * `getUA()` - returns the user-agent string.
- * `setUA(ua)` - set a custom user-agent to be parsed.
-
----
-
-#### * `getResult():IData`
-
-```sh
-returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
-```
-
-#### * `getBrowser():IData`
-
-```sh
-returns `{ name: '', version: '' }`
-
-# Possible 'browser.name':
-2345Explorer, 360 Browser, Amaya, Android Browser, Arora, Avant, Avast, AVG,
-BIDUBrowser, Baidu, Basilisk, Blazer, Bolt, Brave, Bowser, Camino, Chimera,
-[Mobile] Chrome [Headless/WebView], Chromium, Cobalt, Comodo Dragon, Dillo,
-Dolphin, Doris, DuckDuckGo, Edge, Electron, Epiphany, Facebook, Falkon, Fennec,
-Firebird, [Mobile] Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, HeyTap,
-Huawei Browser, ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceweasel,
-Instagram, Iridium, Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar,
-Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, Lynx, MIUI Browser,
-Maemo Browser, Maemo, Maxthon, MetaSr Midori, Minimo, Mosaic, Mozilla, NetFront,
-NetSurf, Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, OmniWeb,
-Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, PhantomJS, Phoenix, Polaris,
-Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari,
-Sailfish Browser, Samsung Browser, SeaMonkey, Silk, Skyfire, Sleipnir, Slim,
-SlimBrowser, Snapchat, Swiftfox, Tesla, TikTok, Tizen Browser, UCBrowser,
-UP.Browser, Viera, Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m,
-Whale Browser, ...
-
-# 'browser.version' determined dynamically
-```
-
-#### * `getDevice():IData`
-
-```sh
-returns `{ model: '', type: '', vendor: '' }`
-
-# Possible 'device.type':
-console, mobile, tablet, smarttv, wearable, embedded
-
-##########
-# NOTE: 'desktop' is not a possible device type.
-# UAParser only reports info directly available from the UA string, which is not the case for 'desktop' device type.
-# If you wish to detect desktop devices, you must handle the needed logic yourself.
-# You can read more about it in this issue: https://github.com/faisalman/ua-parser-js/issues/182
-##########
-
-# Possible 'device.vendor':
-Acer, Alcatel, Amazon, Apple, Archos, ASUS, AT&T, BenQ, BlackBerry, Dell,
-Essential, Facebook, Fairphone, GeeksPhone, Google, HP, HTC, Huawei, Infinix, Jolla,
-Kobo, Lenovo, LG, Meizu, Microsoft, Motorola, Nexian, Nintendo, Nokia, Nvidia,
-OnePlus, OPPO, Ouya, Palm, Panasonic, Pebble, Polytron, Realme, RIM, Roku, Samsung,
-Sharp, Siemens, Sony[Ericsson], Sprint, Tecno, Tesla, Vivo, Vodafone, Xbox, Xiaomi,
-Zebra, ZTE, ...
-
-# 'device.model' determined dynamically
-```
-
-#### * `getEngine():IData`
-
-```sh
-returns `{ name: '', version: '' }`
-
-# Possible 'engine.name'
-Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, KHTML, LibWeb, Links, Lynx,
-NetFront, NetSurf, Presto, Tasman, Trident, w3m, WebKit
-
-# 'engine.version' determined dynamically
-```
-
-#### * `getOS():IData`
-
-```sh
-returns `{ name: '', version: '' }`
-
-# Possible 'os.name'
-AIX, Amiga OS, Android[-x86], Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
-Contiki, Fedora, Firefox OS, FreeBSD, Debian, Deepin, DragonFly, elementary OS,
-Fuchsia, Gentoo, GhostBSD, GNU, Haiku, HarmonyOS, HP-UX, Hurd, iOS, Joli, KaiOS,
-Linpus, Linspire,Linux, Mac OS, Maemo, Mageia, Mandriva, Manjaro, MeeGo, Minix,
-Mint, Morph OS, NetBSD, NetRange, NetTV, Nintendo, OpenBSD, OpenVMS, OS/2, Palm,
-PC-BSD, PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS,
-RISC OS, Sabayon, Sailfish, SerenityOS, Series40, Slackware, Solaris, SUSE, Symbian,
-Tizen, Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile],
-Zenwalk, ...
-
-# 'os.version' determined dynamically
-```
-
-#### * `getCPU():IData`
-
-```sh
-returns `{ architecture: '' }`
-
-# Possible 'cpu.architecture'
-68k, amd64, arm[64/hf], avr, ia[32/64], irix[64], mips[64], pa-risc, ppc, sparc[64]
-```
-
-#### * `getUA():string`
-
-```sh
-returns user-agent string of current instance
-```
-
-#### * `setUA(ua:string):UAParser`
-
-```sh
-set user-agent string to be parsed
-returns current instance
-```
-
----
-
-## `IData`: `since@2.0`
-
-#### Methods table
-The methods are self explanatory, here's a small overview on all the available methods:
- * `is(value)` - returns `true` if the passed value matches a value of current object, `false` otherwise
- * `toString()` - returns the full-name values of current object as a string
- * `withClientHints()` - returns an object with re-updated data from client hints
- * `withFeatureCheck()` - returns an object with re-updated data from feature detection
-
----
-
-#### * `is(value:string):boolean`
-
-```js
-// Is just a shorthand comparison to check whether the value of specified item equals one of its properties (in a case-insensitive way)
-// so that instead of write it using `==` operator like this:
-
-let ua = UAParser();
-let device = ua.device;
-let os = ua.os;
-
-if (device.type == "mobile" && os.name != "iOS") {}
-if (device.type == "smarttv" || device.vendor == "Samsung") {}
-
-// we can also write the comparison above into as follow:
-
-if (device.is("mobile") && !os.is("iOS")) {}
-if (device.is("SmartTV") || device.is("SaMsUnG")) {}
-
-/*
- For device, properties will be checked in this particular order: type, model, vendor
-*/
-
-// Another examples:
-
-let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537');
-
-uap.getBrowser().name; // "IEMobile"
-uap.getBrowser().is("IEMobile"); // true
-uap.getCPU().is("ARM"); // true
-
-uap.getOS().name; // "Windows Phone"
-uap.getOS().is("Windows Phone"); // true
-
-uap.getDevice(); // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
-uap.getResult().device; // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
-
-let device = uap.getDevice();
-device.is("mobile"); // true
-device.is("Lumia 635"); // true
-device.is("Nokia"); // true
-device.is("iPhone"); // false
-uap.getResult().device.is("Nokia"); // true
-uap.getResult().device.model; // "Lumia 635"
-
-uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
-
-let browser = uap.getBrowser();
-browser.is("IEMobile"); // false
-browser.is("Chrome"); // true
-
-uap.getResult().browser.is("Edge"); // false
-uap.getResult().os.name // "Mac OS"
-uap.getResult().os.is("Mac OS"); // true
-uap.getResult().os.version; // "10.6.8"
-
-let engine = uap.getEngine();
-engine.is("Blink"); // true
-```
-
-#### * `toString():string`
-
-```js
-// Retrieve full-name values as a string
-
-/*
- Values will be concatenated following this pattern:
- * browser : name + version
- * cpu : architecture
- * device : vendor + model
- * engine : name + version
- * os : name + version
-*/
-
-// Usage examples
-
-let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537');
-
-uap.getDevice(); // {
- // vendor: "Nokia",
- // model: "Lumia 635",
- // type: "mobile"
- // }
-uap.getDevice().toString(); // "Nokia Lumia 635"
-
-uap.getResult().os.name; // "Windows Phone"
-uap.getResult().os.version; // "8.1"
-uap.getResult().os.toString(); // "Windows Phone 8.1"
-
-uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
-uap.getBrowser().name; // "Chrome"
-uap.getBrowser().version; // "28.0.1500.95"
-uap.getBrowser().major; // "28"
-uap.getBrowser().toString(); // "Chrome 28.0.1500.95"
-
-let engine = uap.getEngine();
-engine.name; // "Blink"
-engine.version; // "28.0.1500.95"
-engine.toString(); // "Blink 28.0.1500.95"
-```
-
-#### * `withClientHints():Promise
-
-
-
-↗ Become a sponsor
-
-
-
-
-
-
## Contributors
+Large or small, your contribution is valuable here. Please read [CONTRIBUTING](CONTRIBUTING.md)
+guide first for the instruction details.
+
Made with [contributors-img](https://contrib.rocks).
-## How To Contribute
+## Backers & Sponsors
-* Fork and clone this repository
-* Make some changes as required
-* Write unit test to showcase its functionality
-* Run the test suites to make sure it's not breaking anything `$ npm test`
-* Submit a pull request under `develop` branch
+
+
# License
-AGPL v3 License
+AGPLv3 License
Copyright (c) 2012-2023 Faisal Salman <