ua-parser-js 1.0.34 → 2.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ua-parser.min.js +3 -3
- package/dist/ua-parser.pack.js +3 -3
- package/license.md +1 -1
- package/package.json +24 -4
- package/readme.md +267 -64
- package/src/enum/ua-parser-enum.js +101 -0
- package/src/enum/ua-parser-enum.mjs +105 -0
- package/src/extension/ua-parser-extension.js +120 -0
- package/src/extension/ua-parser-extension.mjs +124 -0
- package/src/ua-parser.js +426 -198
- package/src/ua-parser.mjs +1112 -0
package/readme.md
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
# UAParser.js
|
14
14
|
|
15
|
-
JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model from User-Agent
|
15
|
+
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).
|
16
16
|
|
17
17
|
* Author : Faisal Salman <<f@faisalman.com>>
|
18
18
|
* Demo : https://faisalman.github.io/ua-parser-js
|
@@ -26,7 +26,7 @@ JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model fro
|
|
26
26
|
</thead>
|
27
27
|
<tbody>
|
28
28
|
<tr>
|
29
|
-
<td align="center" width="200px" rowspan="
|
29
|
+
<td align="center" width="200px" rowspan="2"><a href="https://www.npmjs.com/package/@51degrees/ua-parser-js"><img src="images/51degrees.svg" alt="51degrees" width="75%" height="75%" ></a></td>
|
30
30
|
<td align="left" width="400px"><a href="https://www.npmjs.com/package/@51degrees/ua-parser-js">↗ @51degrees/ua-parser-js</a></td>
|
31
31
|
</tr>
|
32
32
|
<tr>
|
@@ -34,46 +34,45 @@ JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model fro
|
|
34
34
|
</td>
|
35
35
|
</tr>
|
36
36
|
<tr>
|
37
|
-
<td>
|
38
|
-
<
|
37
|
+
<td colspan="2">
|
38
|
+
<a href="https://opencollective.com/ua-parser-js">↗ Become a sponsor</a>
|
39
|
+
</td>
|
39
40
|
</tr>
|
40
41
|
</tbody>
|
41
42
|
</table>
|
42
43
|
|
43
44
|
---
|
44
45
|
|
45
|
-
#
|
46
|
-
|
47
|
-
typeof `user-agent` "string".
|
46
|
+
# Version 2.0
|
47
|
+
What's new & breaking, please read [CHANGELOG](changelog.md) before upgrading.
|
48
48
|
|
49
|
-
|
49
|
+
# Documentation
|
50
|
+
### UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)])
|
50
51
|
|
51
|
-
In
|
52
|
-
Usually you can find the user agent in:
|
53
|
-
`request.headers["user-agent"]`.
|
52
|
+
In the browser environment you dont need to pass the user-agent string to the function, you can just call the funtion and it should automatically get the string from the `window.navigator.userAgent`, but that is not the case in nodejs. The user-agent string must be passed in' nodejs for the function to work. Usually you can find the user agent in: `request.headers["user-agent"]`.
|
54
53
|
|
55
54
|
|
56
55
|
## Constructor
|
57
|
-
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.
|
56
|
+
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.
|
58
57
|
Like so:
|
59
|
-
* `new UAParser([
|
58
|
+
* `new UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)])`
|
60
59
|
```js
|
61
|
-
let parser = new UAParser("user-agent"); // you need to pass the user-agent for nodejs
|
60
|
+
let parser = new UAParser("your user-agent here"); // you need to pass the user-agent for nodejs
|
62
61
|
console.log(parser); // {}
|
63
62
|
let parserResults = parser.getResult();
|
64
63
|
console.log(parserResults);
|
65
64
|
/** {
|
66
|
-
"ua": "",
|
67
|
-
"browser": {},
|
68
|
-
"engine": {},
|
69
|
-
"os": {},
|
70
|
-
"device": {},
|
71
|
-
"cpu": {}
|
65
|
+
"ua" : "",
|
66
|
+
"browser" : {},
|
67
|
+
"engine" : {},
|
68
|
+
"os" : {},
|
69
|
+
"device" : {},
|
70
|
+
"cpu" : {}
|
72
71
|
} */
|
73
72
|
```
|
74
73
|
|
75
74
|
When you call UAParser without the `new` keyword, it will automatically call `getResult()` function and return the parsed results.
|
76
|
-
* `UAParser([
|
75
|
+
* `UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)])`
|
77
76
|
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
78
77
|
|
79
78
|
## Methods
|
@@ -91,7 +90,6 @@ The methods are self explanatory, here's a small overview on all the available m
|
|
91
90
|
* `getUA()` - returns the user-agent string.
|
92
91
|
* `setUA(user-agent)` - set a custom user-agent to be parsed.
|
93
92
|
|
94
|
-
|
95
93
|
---
|
96
94
|
|
97
95
|
* `getResult()`
|
@@ -104,19 +102,19 @@ The methods are self explanatory, here's a small overview on all the available m
|
|
104
102
|
# Possible 'browser.name':
|
105
103
|
2345Explorer, 360 Browser, Amaya, Android Browser, Arora, Avant, Avast, AVG,
|
106
104
|
BIDUBrowser, Baidu, Basilisk, Blazer, Bolt, Brave, Bowser, Camino, Chimera,
|
107
|
-
Chrome Headless
|
105
|
+
[Mobile] Chrome [Headless/WebView], Chromium, Cobalt, Comodo Dragon, Dillo,
|
108
106
|
Dolphin, Doris, DuckDuckGo, Edge, Electron, Epiphany, Facebook, Falkon, Fennec,
|
109
|
-
Firebird, Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser,
|
110
|
-
ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceweasel,
|
111
|
-
Iridium, Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar,
|
112
|
-
LBBROWSER, Line, LinkedIn, Links, Lunascape, Lynx, MIUI Browser,
|
113
|
-
Maemo, Maxthon, MetaSr Midori, Minimo,
|
107
|
+
Firebird, [Mobile] Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, HeyTap,
|
108
|
+
Huawei Browser, ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceweasel,
|
109
|
+
Instagram, Iridium, Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar,
|
110
|
+
Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, Lynx, MIUI Browser,
|
111
|
+
Maemo Browser, Maemo, Maxthon, MetaSr Midori, Minimo, Mosaic, Mozilla, NetFront,
|
114
112
|
NetSurf, Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, OmniWeb,
|
115
113
|
Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, PhantomJS, Phoenix, Polaris,
|
116
|
-
Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, Safari,
|
114
|
+
Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari,
|
117
115
|
Sailfish Browser, Samsung Browser, SeaMonkey, Silk, Skyfire, Sleipnir, Slim,
|
118
|
-
SlimBrowser, Swiftfox, Tesla, Tizen Browser, UCBrowser, UP.Browser, Viera,
|
119
|
-
Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, Whale Browser...
|
116
|
+
SlimBrowser, Swiftfox, Tesla, TikTok, Tizen Browser, UCBrowser, UP.Browser, Viera,
|
117
|
+
Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, Whale Browser, ...
|
120
118
|
|
121
119
|
# 'browser.version' determined dynamically
|
122
120
|
```
|
@@ -150,8 +148,8 @@ Siemens, Sony[Ericsson], Sprint, Tesla, Vivo, Vodafone, Xbox, Xiaomi, Zebra, ZTE
|
|
150
148
|
|
151
149
|
```sh
|
152
150
|
# Possible 'engine.name'
|
153
|
-
Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, KHTML, Links, Lynx,
|
154
|
-
NetSurf, Presto, Tasman, Trident, w3m, WebKit
|
151
|
+
Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, KHTML, LibWeb, Links, Lynx,
|
152
|
+
NetFront, NetSurf, Presto, Tasman, Trident, w3m, WebKit
|
155
153
|
|
156
154
|
# 'engine.version' determined dynamically
|
157
155
|
```
|
@@ -167,8 +165,9 @@ Fuchsia, Gentoo, GhostBSD, GNU, Haiku, HarmonyOS, HP-UX, Hurd, iOS, Joli, KaiOS,
|
|
167
165
|
Linpus, Linspire,Linux, Mac OS, Maemo, Mageia, Mandriva, Manjaro, MeeGo, Minix,
|
168
166
|
Mint, Morph OS, NetBSD, NetRange, NetTV, Nintendo, OpenBSD, OpenVMS, OS/2, Palm,
|
169
167
|
PC-BSD, PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS,
|
170
|
-
RISC OS, Sabayon, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian,
|
171
|
-
Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile],
|
168
|
+
RISC OS, Sabayon, Sailfish, SerenityOS, Series40, Slackware, Solaris, SUSE, Symbian,
|
169
|
+
Tizen, Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile],
|
170
|
+
Zenwalk, ...
|
172
171
|
|
173
172
|
# 'os.version' determined dynamically
|
174
173
|
```
|
@@ -188,6 +187,198 @@ Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], Zenwal
|
|
188
187
|
* set UA string to be parsed
|
189
188
|
* returns current instance
|
190
189
|
|
190
|
+
#### * `is():boolean` utility `since@2.0`
|
191
|
+
|
192
|
+
```js
|
193
|
+
// Is just a shorthand comparison to check whether the value of specified item equals one of its properties (in a case-insensitive way)
|
194
|
+
// so that instead of write it using `==` operator like this:
|
195
|
+
|
196
|
+
let ua = UAParser();
|
197
|
+
let device = ua.device;
|
198
|
+
let os = ua.os;
|
199
|
+
|
200
|
+
if (device.type == "mobile" && os.name != "iOS") {}
|
201
|
+
if (device.type == "smarttv" || device.vendor == "Samsung") {}
|
202
|
+
|
203
|
+
// we can also write the comparison above into as follow:
|
204
|
+
|
205
|
+
if (device.is("mobile") && !os.is("iOS")) {}
|
206
|
+
if (device.is("SmartTV") || device.is("SaMsUnG")) {}
|
207
|
+
|
208
|
+
/*
|
209
|
+
For device, properties will be checked in this particular order: type, model, vendor
|
210
|
+
*/
|
211
|
+
|
212
|
+
// Another examples:
|
213
|
+
|
214
|
+
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');
|
215
|
+
|
216
|
+
uap.getBrowser().name; // "IEMobile"
|
217
|
+
uap.getBrowser().is("IEMobile"); // true
|
218
|
+
uap.getCPU().is("ARM"); // true
|
219
|
+
|
220
|
+
uap.getOS().name; // "Windows Phone"
|
221
|
+
uap.getOS().is("Windows Phone"); // true
|
222
|
+
|
223
|
+
uap.getDevice(); // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
|
224
|
+
uap.getResult().device; // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
|
225
|
+
|
226
|
+
let device = uap.getDevice();
|
227
|
+
device.is("mobile"); // true
|
228
|
+
device.is("Lumia 635"); // true
|
229
|
+
device.is("Nokia"); // true
|
230
|
+
device.is("iPhone"); // false
|
231
|
+
uap.getResult().device.is("Nokia"); // true
|
232
|
+
uap.getResult().device.model; // "Lumia 635"
|
233
|
+
|
234
|
+
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");
|
235
|
+
|
236
|
+
let browser = uap.getBrowser();
|
237
|
+
browser.is("IEMobile"); // false
|
238
|
+
browser.is("Chrome"); // true
|
239
|
+
|
240
|
+
uap.getResult().browser.is("Edge"); // false
|
241
|
+
uap.getResult().os.name // "Mac OS"
|
242
|
+
uap.getResult().os.is("Mac OS"); // true
|
243
|
+
uap.getResult().os.version; // "10.6.8"
|
244
|
+
|
245
|
+
let engine = uap.getEngine();
|
246
|
+
engine.is("Blink"); // true
|
247
|
+
```
|
248
|
+
|
249
|
+
#### * `toString():string` utility `since@2.0`
|
250
|
+
|
251
|
+
```js
|
252
|
+
// Retrieve full-name values as a string
|
253
|
+
|
254
|
+
/*
|
255
|
+
Values will be concatenated following this pattern:
|
256
|
+
* browser : name + version
|
257
|
+
* cpu : architecture
|
258
|
+
* device : vendor + model
|
259
|
+
* engine : name + version
|
260
|
+
* os : name + version
|
261
|
+
*/
|
262
|
+
|
263
|
+
// Usage examples
|
264
|
+
|
265
|
+
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');
|
266
|
+
|
267
|
+
uap.getDevice(); // {
|
268
|
+
// vendor: "Nokia",
|
269
|
+
// model: "Lumia 635",
|
270
|
+
// type: "mobile"
|
271
|
+
// }
|
272
|
+
uap.getDevice().toString(); // "Nokia Lumia 635"
|
273
|
+
|
274
|
+
uap.getResult().os.name; // "Windows Phone"
|
275
|
+
uap.getResult().os.version; // "8.1"
|
276
|
+
uap.getResult().os.toString(); // "Windows Phone 8.1"
|
277
|
+
|
278
|
+
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");
|
279
|
+
uap.getBrowser().name; // "Chrome"
|
280
|
+
uap.getBrowser().version; // "28.0.1500.95"
|
281
|
+
uap.getBrowser().major; // "28"
|
282
|
+
uap.getBrowser().toString(); // "Chrome 28.0.1500.95"
|
283
|
+
|
284
|
+
let engine = uap.getEngine();
|
285
|
+
engine.name; // "Blink"
|
286
|
+
engine.version; // "28.0.1500.95"
|
287
|
+
engine.toString(); // "Blink 28.0.1500.95"
|
288
|
+
```
|
289
|
+
|
290
|
+
#### * `withClientHints():Promise<object>|Thenable<object>` `since@2.0`
|
291
|
+
|
292
|
+
Recently Chrome limits the information exposed through user-agent and introduces a new experimental set of data called "client-hints". In browser-environment, obtaining the client-hints data via JavaScript must be done in an asynchronous way. In `UAParser` you can chain the result object from `get*` method with `withClientHints()` to also read the client-hints data from the browser and return the updated data as a `Promise`.
|
293
|
+
|
294
|
+
```js
|
295
|
+
// client-side example
|
296
|
+
(async function () {
|
297
|
+
let ua = new UAParser();
|
298
|
+
|
299
|
+
// get browser data from user-agent only :
|
300
|
+
let browser = ua.getBrowser();
|
301
|
+
console.log('Using User-Agent: ', browser);
|
302
|
+
|
303
|
+
// get browser data from client-hints (with user-agent as fallback) :
|
304
|
+
browser = await ua.getBrowser().withClientHints();
|
305
|
+
console.log('Using Client-Hints: ', browser);
|
306
|
+
|
307
|
+
// alternatively :
|
308
|
+
ua.getBrowser().withClientHints().then(function (browser) {
|
309
|
+
console.log('Using Client-Hints: ', browser);
|
310
|
+
});
|
311
|
+
})();
|
312
|
+
```
|
313
|
+
|
314
|
+
Along with `User-Agent` HTTP header, Chrome also sends this client-hints data by default under `Sec-CH-UA-*` HTTP headers in each request. In server-side development, you can capture this extra information by passing the `req.headers` to `UAParser()` (see examples below). When using `withClientHints()` in nodejs environment and browser without client-hints support (basically anything that's not Chromium-based) the updated data will be returned as a `Thenable` (has `then()` method).
|
315
|
+
|
316
|
+
```js
|
317
|
+
// server-side example
|
318
|
+
|
319
|
+
// Suppose we got a request having these HTTP headers:
|
320
|
+
const request = {
|
321
|
+
headers : {
|
322
|
+
'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
|
323
|
+
|
324
|
+
'sec-ch-ua-mobile' : '?1',
|
325
|
+
'sec-ch-ua-model' : 'Galaxy S3 Marketing',
|
326
|
+
'sec-ch-ua-platform' : 'Android'
|
327
|
+
}
|
328
|
+
};
|
329
|
+
|
330
|
+
const result1 = UAParser(request.headers); // parse only "user-agent" header
|
331
|
+
const result2 = UAParser(request.headers).withClientHints(); // update with "sec-ch-ua" headers
|
332
|
+
|
333
|
+
console.log(result1.os.name); // "Linux"
|
334
|
+
console.log(result1.device.type); // undefined
|
335
|
+
console.log(result1.device.model); // undefined
|
336
|
+
|
337
|
+
console.log(result2.os.name); // "Android"
|
338
|
+
console.log(result2.device.type); // "mobile"
|
339
|
+
console.log(result2.device.model); // "Galaxy S3 Marketing"
|
340
|
+
|
341
|
+
new UAParser(request.headers).getBrowser().withClientHints().then((browser) => {
|
342
|
+
console.log(browser.toString()); // Chrome 110.0.0.0
|
343
|
+
});
|
344
|
+
```
|
345
|
+
|
346
|
+
## Extending Regex
|
347
|
+
|
348
|
+
If you want to detect something that's not currently provided by UAParser.js (eg: `bots`, specific apps, etc), you can pass a list of regexes to extend internal UAParser.js regexes with your own.
|
349
|
+
|
350
|
+
* `UAParser([uastring,] extensions [,headers:object(since@2.0)])`
|
351
|
+
|
352
|
+
```js
|
353
|
+
// Example:
|
354
|
+
const myOwnListOfBrowsers = [
|
355
|
+
[/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']]
|
356
|
+
];
|
357
|
+
|
358
|
+
const myUA = 'Mozilla/5.0 MyBrowser/1.3';
|
359
|
+
|
360
|
+
let myParser = new UAParser({ browser: myOwnListOfBrowsers });
|
361
|
+
|
362
|
+
console.log(myParser.setUA(myUA).getBrowser()); // {name: "MyBrowser", version: "1.3", major: "1", type : "bot"}
|
363
|
+
console.log(myParser.getBrowser().is('bot')); // true
|
364
|
+
|
365
|
+
// Another example:
|
366
|
+
const myOwnListOfDevices = [
|
367
|
+
[/(mytab) ([\w ]+)/i], [UAParser.DEVICE.VENDOR, UAParser.DEVICE.MODEL, [UAParser.DEVICE.TYPE, UAParser.DEVICE.TABLET]],
|
368
|
+
[/(myphone)/i], [UAParser.DEVICE.VENDOR, [UAParser.DEVICE.TYPE, UAParser.DEVICE.MOBILE]]
|
369
|
+
];
|
370
|
+
|
371
|
+
const myUA2 = 'Mozilla/5.0 MyTab 14 Pro Max';
|
372
|
+
|
373
|
+
let myParser2 = new UAParser({
|
374
|
+
browser: myOwnListOfBrowsers,
|
375
|
+
device: myOwnListOfDevices
|
376
|
+
});
|
377
|
+
|
378
|
+
console.log(myParser2.setUA(myUA2).getDevice()); // {vendor: "MyTab", model: "14 Pro Max", type: "tablet"}
|
379
|
+
```
|
380
|
+
|
381
|
+
|
191
382
|
# Usage
|
192
383
|
|
193
384
|
## Using HTML
|
@@ -199,8 +390,8 @@ Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], Zenwal
|
|
199
390
|
<script src="ua-parser.min.js"></script>
|
200
391
|
<script>
|
201
392
|
|
202
|
-
var
|
203
|
-
console.log(
|
393
|
+
var uap = new UAParser();
|
394
|
+
console.log(uap.getResult());
|
204
395
|
/*
|
205
396
|
/// This will print an object structured like this:
|
206
397
|
{
|
@@ -208,7 +399,7 @@ Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], Zenwal
|
|
208
399
|
browser: {
|
209
400
|
name: "",
|
210
401
|
version: "",
|
211
|
-
major: ""
|
402
|
+
major: ""
|
212
403
|
},
|
213
404
|
engine: {
|
214
405
|
name: "",
|
@@ -232,10 +423,10 @@ Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], Zenwal
|
|
232
423
|
|
233
424
|
// Now let's try a custom user-agent string as an example
|
234
425
|
var uastring1 = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2";
|
235
|
-
|
236
|
-
var result =
|
426
|
+
uap.setUA(uastring1);
|
427
|
+
var result = uap.getResult();
|
237
428
|
// You can also use UAParser constructor directly without having to create an instance:
|
238
|
-
// var
|
429
|
+
// var ua = UAParser(uastring1);
|
239
430
|
|
240
431
|
console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"}
|
241
432
|
console.log(result.device); // {model: undefined, type: undefined, vendor: undefined}
|
@@ -246,14 +437,14 @@ Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], Zenwal
|
|
246
437
|
|
247
438
|
// Do some other tests
|
248
439
|
var uastring2 = "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)";
|
249
|
-
console.log(
|
250
|
-
console.log(
|
251
|
-
console.log(
|
440
|
+
console.log(uap.setUA(uastring2).getBrowser().name); // "Konqueror"
|
441
|
+
console.log(uap.getOS()); // {name: "OpenBSD", version: undefined}
|
442
|
+
console.log(uap.getEngine()); // {name: "KHTML", version: "4.1.4"}
|
252
443
|
|
253
444
|
var uastring3 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11';
|
254
|
-
console.log(
|
255
|
-
console.log(
|
256
|
-
console.log(
|
445
|
+
console.log(uap.setUA(uastring3).getDevice().model); // "PlayBook"
|
446
|
+
console.log(uap.getOS()) // {name: "RIM Tablet OS", version: "1.0.0"}
|
447
|
+
console.log(uap.getBrowser().name); // "Safari"
|
257
448
|
|
258
449
|
</script>
|
259
450
|
</head>
|
@@ -272,11 +463,24 @@ $ npm install ua-parser-js
|
|
272
463
|
|
273
464
|
```js
|
274
465
|
var http = require('http');
|
275
|
-
var
|
466
|
+
var uap = require('ua-parser-js');
|
276
467
|
|
277
468
|
http.createServer(function (req, res) {
|
278
469
|
// get user-agent header
|
279
|
-
var ua =
|
470
|
+
var ua = uap(req.headers['user-agent']);
|
471
|
+
|
472
|
+
/* // BEGIN since@2.0 - you can also pass client-hints data to UAParser
|
473
|
+
|
474
|
+
// note: only works in secure context (https:// or localhost or file://)
|
475
|
+
|
476
|
+
var getHighEntropyValues = 'Sec-CH-UA-Full-Version-List, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-Bitness';
|
477
|
+
res.setHeader('Accept-CH', getHighEntropyValues);
|
478
|
+
res.setHeader('Critical-CH', getHighEntropyValues);
|
479
|
+
|
480
|
+
var ua = uap(req.headers);
|
481
|
+
|
482
|
+
// END since@2.0 */
|
483
|
+
|
280
484
|
// write the result as response
|
281
485
|
res.end(JSON.stringify(ua, null, ' '));
|
282
486
|
})
|
@@ -285,6 +489,19 @@ http.createServer(function (req, res) {
|
|
285
489
|
console.log('Server running at http://127.0.0.1:1337/');
|
286
490
|
```
|
287
491
|
|
492
|
+
## Using ES Modules
|
493
|
+
|
494
|
+
```js
|
495
|
+
import { UAParser } from 'ua-parser-js';
|
496
|
+
|
497
|
+
const { browser, cpu, device } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
|
498
|
+
|
499
|
+
console.log(browser.name); // Maemo Browser
|
500
|
+
console.log(cpu.is('arm')); // true
|
501
|
+
console.log(device.is('mobile')); // true
|
502
|
+
console.log(device.model); // N900
|
503
|
+
```
|
504
|
+
|
288
505
|
## Using TypeScript
|
289
506
|
|
290
507
|
```sh
|
@@ -320,20 +537,6 @@ console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
|
|
320
537
|
$('body').addClass('ua-browser-' + $.ua.browser.name + ' ua-devicetype-' + $.ua.device.type);
|
321
538
|
```
|
322
539
|
|
323
|
-
## Using Extension
|
324
|
-
|
325
|
-
* `UAParser([uastring,] extensions)`
|
326
|
-
|
327
|
-
```js
|
328
|
-
// Example:
|
329
|
-
var myOwnListOfBrowsers = [
|
330
|
-
[/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]
|
331
|
-
];
|
332
|
-
var myParser = new UAParser({ browser: myOwnListOfBrowsers });
|
333
|
-
var myUA = 'Mozilla/5.0 MyBrowser/1.3';
|
334
|
-
console.log(myParser.setUA(myUA).getBrowser()); // {name: "MyBrowser", version: "1.3"}
|
335
|
-
```
|
336
|
-
|
337
540
|
# Development
|
338
541
|
|
339
542
|
## Backers & Sponsors
|
@@ -363,7 +566,7 @@ Made with [contributors-img](https://contrib.rocks).
|
|
363
566
|
|
364
567
|
MIT License
|
365
568
|
|
366
|
-
Copyright (c) 2012-
|
569
|
+
Copyright (c) 2012-2023 Faisal Salman <<f@faisalman.com>>
|
367
570
|
|
368
571
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
369
572
|
of this software and associated documentation files (the "Software"), to deal
|
@@ -0,0 +1,101 @@
|
|
1
|
+
///////////////////////////////////////////////
|
2
|
+
/* Enums for UAParser.js v2.0.0-alpha.1
|
3
|
+
https://github.com/faisalman/ua-parser-js
|
4
|
+
Author: Faisal Salman <f@faisalman.com>
|
5
|
+
MIT License */
|
6
|
+
//////////////////////////////////////////////
|
7
|
+
|
8
|
+
const BrowserName = Object.freeze({
|
9
|
+
CHROME : 'Chrome',
|
10
|
+
EDGE : 'Edge',
|
11
|
+
SAFARI : 'Safari',
|
12
|
+
FIREFOX : 'Firefox',
|
13
|
+
OPERA : 'Opera',
|
14
|
+
MOBILE_CHROME : 'Mobile Chrome',
|
15
|
+
MOBILE_SAFARI : 'Mobile Safari',
|
16
|
+
MOBILE_FIREFOX : 'Mobile Firefox',
|
17
|
+
ANDROID_BROWSER : 'Android Browser'
|
18
|
+
|
19
|
+
// TODO : test!
|
20
|
+
});
|
21
|
+
|
22
|
+
const CPUArch = Object.freeze({
|
23
|
+
IA32 : 'ia32',
|
24
|
+
AMD64 : 'amd64',
|
25
|
+
IA64 : 'ia64',
|
26
|
+
ARM : 'arm',
|
27
|
+
ARM64 : 'arm64',
|
28
|
+
ARMHF : 'armhf',
|
29
|
+
_68K : '68k',
|
30
|
+
AVR : 'avr',
|
31
|
+
IRIX : 'irix',
|
32
|
+
IRIX64 : 'irix64',
|
33
|
+
MIPS : 'mips',
|
34
|
+
MIPS64 : 'mips64',
|
35
|
+
PPC : 'ppc',
|
36
|
+
SPARC : 'sparc',
|
37
|
+
SPARC64 : 'sparc64'
|
38
|
+
});
|
39
|
+
|
40
|
+
const DeviceType = Object.freeze({
|
41
|
+
MOBILE : 'mobile',
|
42
|
+
TABLET : 'tablet',
|
43
|
+
SMARTTV : 'smarttv',
|
44
|
+
CONSOLE : 'console',
|
45
|
+
WEARABLE: 'wearable',
|
46
|
+
EMBEDDED: 'embedded'
|
47
|
+
});
|
48
|
+
|
49
|
+
const DeviceVendor = Object.freeze({
|
50
|
+
APPLE : 'Apple',
|
51
|
+
SAMSUNG : 'Samsung',
|
52
|
+
HUAWEI : 'Huawei',
|
53
|
+
XIAOMI : 'Xiaomi',
|
54
|
+
OPPO : 'OPPO',
|
55
|
+
VIVO : 'Vivo',
|
56
|
+
REALME : 'Realme',
|
57
|
+
LENOVO : 'Lenovo',
|
58
|
+
LG : 'LG'
|
59
|
+
|
60
|
+
// TODO : test!
|
61
|
+
});
|
62
|
+
|
63
|
+
const EngineName = Object.freeze({
|
64
|
+
AMAYA : 'Amaya',
|
65
|
+
BLINK : 'Blink',
|
66
|
+
EDGEHTML: 'EdgeHTML',
|
67
|
+
FLOW : 'Flow',
|
68
|
+
GECKO : 'Gecko',
|
69
|
+
GOANNA : 'Goanna',
|
70
|
+
ICAB : 'iCab',
|
71
|
+
LIBWEB : 'LibWeb',
|
72
|
+
KHTML : 'KHTML',
|
73
|
+
LINKS : 'Links',
|
74
|
+
LYNX : 'Lynx',
|
75
|
+
NETFRONT: 'NetFront',
|
76
|
+
NETSURF : 'NetSurf',
|
77
|
+
PRESTO : 'Presto',
|
78
|
+
TASMAN : 'Tasman',
|
79
|
+
TRIDENT : 'Trident',
|
80
|
+
W3M : 'w3m',
|
81
|
+
WEBKIT : 'WebKit'
|
82
|
+
});
|
83
|
+
|
84
|
+
const OSName = Object.freeze({
|
85
|
+
WINDOWS : 'Windows',
|
86
|
+
LINUX : 'Linux',
|
87
|
+
MACOS : 'macOS',
|
88
|
+
IOS : 'iOS',
|
89
|
+
ANDROID : 'Android'
|
90
|
+
|
91
|
+
// TODO : test!
|
92
|
+
});
|
93
|
+
|
94
|
+
module.exports = {
|
95
|
+
BrowserName,
|
96
|
+
CPUArch,
|
97
|
+
DeviceType,
|
98
|
+
DeviceVendor,
|
99
|
+
EngineName,
|
100
|
+
OSName
|
101
|
+
}
|
@@ -0,0 +1,105 @@
|
|
1
|
+
// Generated ESM version of UAParser.js enums
|
2
|
+
// DO NOT EDIT THIS FILE!
|
3
|
+
// Source: /src/enum/ua-parser-enum.js
|
4
|
+
|
5
|
+
///////////////////////////////////////////////
|
6
|
+
/* Enums for UAParser.js v2.0.0-alpha.1
|
7
|
+
https://github.com/faisalman/ua-parser-js
|
8
|
+
Author: Faisal Salman <f@faisalman.com>
|
9
|
+
MIT License */
|
10
|
+
//////////////////////////////////////////////
|
11
|
+
|
12
|
+
const BrowserName = Object.freeze({
|
13
|
+
CHROME : 'Chrome',
|
14
|
+
EDGE : 'Edge',
|
15
|
+
SAFARI : 'Safari',
|
16
|
+
FIREFOX : 'Firefox',
|
17
|
+
OPERA : 'Opera',
|
18
|
+
MOBILE_CHROME : 'Mobile Chrome',
|
19
|
+
MOBILE_SAFARI : 'Mobile Safari',
|
20
|
+
MOBILE_FIREFOX : 'Mobile Firefox',
|
21
|
+
ANDROID_BROWSER : 'Android Browser'
|
22
|
+
|
23
|
+
// TODO : test!
|
24
|
+
});
|
25
|
+
|
26
|
+
const CPUArch = Object.freeze({
|
27
|
+
IA32 : 'ia32',
|
28
|
+
AMD64 : 'amd64',
|
29
|
+
IA64 : 'ia64',
|
30
|
+
ARM : 'arm',
|
31
|
+
ARM64 : 'arm64',
|
32
|
+
ARMHF : 'armhf',
|
33
|
+
_68K : '68k',
|
34
|
+
AVR : 'avr',
|
35
|
+
IRIX : 'irix',
|
36
|
+
IRIX64 : 'irix64',
|
37
|
+
MIPS : 'mips',
|
38
|
+
MIPS64 : 'mips64',
|
39
|
+
PPC : 'ppc',
|
40
|
+
SPARC : 'sparc',
|
41
|
+
SPARC64 : 'sparc64'
|
42
|
+
});
|
43
|
+
|
44
|
+
const DeviceType = Object.freeze({
|
45
|
+
MOBILE : 'mobile',
|
46
|
+
TABLET : 'tablet',
|
47
|
+
SMARTTV : 'smarttv',
|
48
|
+
CONSOLE : 'console',
|
49
|
+
WEARABLE: 'wearable',
|
50
|
+
EMBEDDED: 'embedded'
|
51
|
+
});
|
52
|
+
|
53
|
+
const DeviceVendor = Object.freeze({
|
54
|
+
APPLE : 'Apple',
|
55
|
+
SAMSUNG : 'Samsung',
|
56
|
+
HUAWEI : 'Huawei',
|
57
|
+
XIAOMI : 'Xiaomi',
|
58
|
+
OPPO : 'OPPO',
|
59
|
+
VIVO : 'Vivo',
|
60
|
+
REALME : 'Realme',
|
61
|
+
LENOVO : 'Lenovo',
|
62
|
+
LG : 'LG'
|
63
|
+
|
64
|
+
// TODO : test!
|
65
|
+
});
|
66
|
+
|
67
|
+
const EngineName = Object.freeze({
|
68
|
+
AMAYA : 'Amaya',
|
69
|
+
BLINK : 'Blink',
|
70
|
+
EDGEHTML: 'EdgeHTML',
|
71
|
+
FLOW : 'Flow',
|
72
|
+
GECKO : 'Gecko',
|
73
|
+
GOANNA : 'Goanna',
|
74
|
+
ICAB : 'iCab',
|
75
|
+
LIBWEB : 'LibWeb',
|
76
|
+
KHTML : 'KHTML',
|
77
|
+
LINKS : 'Links',
|
78
|
+
LYNX : 'Lynx',
|
79
|
+
NETFRONT: 'NetFront',
|
80
|
+
NETSURF : 'NetSurf',
|
81
|
+
PRESTO : 'Presto',
|
82
|
+
TASMAN : 'Tasman',
|
83
|
+
TRIDENT : 'Trident',
|
84
|
+
W3M : 'w3m',
|
85
|
+
WEBKIT : 'WebKit'
|
86
|
+
});
|
87
|
+
|
88
|
+
const OSName = Object.freeze({
|
89
|
+
WINDOWS : 'Windows',
|
90
|
+
LINUX : 'Linux',
|
91
|
+
MACOS : 'macOS',
|
92
|
+
IOS : 'iOS',
|
93
|
+
ANDROID : 'Android'
|
94
|
+
|
95
|
+
// TODO : test!
|
96
|
+
});
|
97
|
+
|
98
|
+
export {
|
99
|
+
BrowserName,
|
100
|
+
CPUArch,
|
101
|
+
DeviceType,
|
102
|
+
DeviceVendor,
|
103
|
+
EngineName,
|
104
|
+
OSName
|
105
|
+
}
|