ua-parser-js 2.0.3 → 2.0.6
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/README.md +62 -33
- package/dist/ua-parser.min.js +2 -2
- package/dist/ua-parser.min.mjs +2 -2
- package/dist/ua-parser.pack.js +2 -2
- package/dist/ua-parser.pack.mjs +2 -2
- package/package.json +7 -9
- package/script/cli.js +92 -2
- package/src/enums/ua-parser-enums.d.ts +734 -364
- package/src/enums/ua-parser-enums.js +371 -16
- package/src/enums/ua-parser-enums.mjs +371 -16
- package/src/extensions/ua-parser-extensions.d.ts +1 -1
- package/src/extensions/ua-parser-extensions.js +89 -24
- package/src/extensions/ua-parser-extensions.mjs +89 -24
- package/src/helpers/ua-parser-helpers.d.ts +10 -22
- package/src/helpers/ua-parser-helpers.js +88 -43
- package/src/helpers/ua-parser-helpers.mjs +88 -43
- package/src/main/ua-parser.d.ts +7 -8
- package/src/main/ua-parser.js +316 -244
- package/src/main/ua-parser.mjs +313 -241
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
///////////////////////////////////////////////
|
|
2
|
-
/* Helpers for UAParser.js v2.0.
|
|
2
|
+
/* Helpers for UAParser.js v2.0.6
|
|
3
3
|
https://github.com/faisalman/ua-parser-js
|
|
4
4
|
Author: Faisal Salman <f@faisalman.com>
|
|
5
5
|
AGPLv3 License */
|
|
@@ -8,11 +8,12 @@
|
|
|
8
8
|
/*jshint esversion: 6 */
|
|
9
9
|
|
|
10
10
|
const { UAParser } = require('../main/ua-parser');
|
|
11
|
-
const {
|
|
12
|
-
const { Bots } = require('../extensions/ua-parser-extensions');
|
|
11
|
+
const { CPUArch, OSName, EngineName, Extension, BrowserType } = require('../enums/ua-parser-enums');
|
|
12
|
+
const { Bots, Crawlers } = require('../extensions/ua-parser-extensions');
|
|
13
13
|
const { isFromEU } = require('detect-europe-js');
|
|
14
14
|
const { isFrozenUA } = require('ua-is-frozen');
|
|
15
15
|
const { isStandalonePWA } = require('is-standalone-pwa');
|
|
16
|
+
const { Crawler } = Extension.BrowserName;
|
|
16
17
|
|
|
17
18
|
const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
|
|
18
19
|
|
|
@@ -20,8 +21,8 @@ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${m
|
|
|
20
21
|
|
|
21
22
|
const isAppleSilicon = (resultOrUA) => {
|
|
22
23
|
const res = toResult(resultOrUA);
|
|
23
|
-
if (res.os.is(
|
|
24
|
-
if (res.cpu.is(
|
|
24
|
+
if (res.os.is(OSName.MACOS)) {
|
|
25
|
+
if (res.cpu.is(CPUArch.ARM)) {
|
|
25
26
|
return true;
|
|
26
27
|
}
|
|
27
28
|
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
|
|
@@ -44,85 +45,129 @@ const isAppleSilicon = (resultOrUA) => {
|
|
|
44
45
|
const isAIBot = (resultOrUA) => [
|
|
45
46
|
|
|
46
47
|
// AI2
|
|
47
|
-
|
|
48
|
+
Crawler.AI2_BOT,
|
|
48
49
|
|
|
49
50
|
// Amazon
|
|
50
|
-
|
|
51
|
+
Crawler.AMAZON_BOT,
|
|
51
52
|
|
|
52
53
|
// Anthropic
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
Crawler.ANTHROPIC_AI,
|
|
55
|
+
Crawler.ANTHROPIC_CLAUDE_BOT,
|
|
56
|
+
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
|
|
57
|
+
Crawler.ANTHROPIC_CLAUDE_WEB,
|
|
56
58
|
|
|
57
59
|
// Apple
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
Crawler.APPLE_BOT,
|
|
61
|
+
Crawler.APPLE_BOT_EXTENDED,
|
|
62
|
+
|
|
63
|
+
// Brave
|
|
64
|
+
Crawler.BRAVE_BOT,
|
|
60
65
|
|
|
61
66
|
// ByteDance
|
|
62
|
-
|
|
67
|
+
Crawler.BYTEDANCE_BYTESPIDER,
|
|
68
|
+
Crawler.BYTEDANCE_TIKTOKSPIDER,
|
|
69
|
+
|
|
70
|
+
// Cohere
|
|
71
|
+
Crawler.COHERE_TRAINING_DATA_CRAWLER,
|
|
63
72
|
|
|
64
73
|
// Common Crawl
|
|
65
|
-
|
|
74
|
+
Crawler.COMMON_CRAWL_CCBOT,
|
|
75
|
+
|
|
76
|
+
// Coveo
|
|
77
|
+
Crawler.COVEO_BOT,
|
|
66
78
|
|
|
67
79
|
// DataForSeo
|
|
68
|
-
|
|
80
|
+
Crawler.DATAFORSEO_BOT,
|
|
81
|
+
|
|
82
|
+
// DeepSeek
|
|
83
|
+
Crawler.DEEPSEEK_BOT,
|
|
69
84
|
|
|
70
85
|
// Diffbot
|
|
71
|
-
|
|
86
|
+
Crawler.DIFFBOT,
|
|
72
87
|
|
|
73
88
|
// Google
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
Crawler.GOOGLE_EXTENDED,
|
|
90
|
+
Crawler.GOOGLE_OTHER,
|
|
91
|
+
Crawler.GOOGLE_OTHER_IMAGE,
|
|
92
|
+
Crawler.GOOGLE_OTHER_VIDEO,
|
|
93
|
+
Crawler.GOOGLE_CLOUDVERTEXBOT,
|
|
78
94
|
|
|
79
95
|
// Hive AI
|
|
80
|
-
|
|
96
|
+
Crawler.HIVE_IMAGESIFTBOT,
|
|
81
97
|
|
|
82
98
|
// Huawei
|
|
83
|
-
|
|
99
|
+
Crawler.HUAWEI_PETALBOT,
|
|
100
|
+
Crawler.HUAWEI_PANGUBOT,
|
|
101
|
+
|
|
102
|
+
// Hugging Face
|
|
103
|
+
Crawler.HUGGINGFACE_BOT,
|
|
104
|
+
|
|
105
|
+
// Kangaroo
|
|
106
|
+
Crawler.KANGAROO_BOT,
|
|
107
|
+
|
|
108
|
+
// Mendable.ai
|
|
109
|
+
Crawler.FIRECRAWL_AGENT,
|
|
84
110
|
|
|
85
111
|
// Meta
|
|
86
|
-
|
|
87
|
-
|
|
112
|
+
Crawler.META_FACEBOOKBOT,
|
|
113
|
+
Crawler.META_EXTERNALAGENT,
|
|
88
114
|
|
|
89
115
|
// OpenAI
|
|
90
|
-
|
|
91
|
-
|
|
116
|
+
Crawler.OPENAI_GPTBOT,
|
|
117
|
+
Crawler.OPENAI_SEARCH_BOT,
|
|
92
118
|
|
|
93
119
|
// Perplexity
|
|
94
|
-
|
|
120
|
+
Crawler.PERPLEXITY_BOT,
|
|
121
|
+
|
|
122
|
+
// Replicate
|
|
123
|
+
Crawler.REPLICATE_BOT,
|
|
124
|
+
|
|
125
|
+
// Runpod
|
|
126
|
+
Crawler.RUNPOD_BOT,
|
|
127
|
+
|
|
128
|
+
// SB Intuitions
|
|
129
|
+
Crawler.SB_INTUITIONS_BOT,
|
|
95
130
|
|
|
96
131
|
// Semrush
|
|
97
|
-
|
|
132
|
+
Crawler.SEMRUSH_BOT_CONTENTSHAKE,
|
|
98
133
|
|
|
99
134
|
// Timpi
|
|
100
|
-
|
|
135
|
+
Crawler.TIMPI_BOT,
|
|
136
|
+
|
|
137
|
+
// Together AI
|
|
138
|
+
Crawler.TOGETHER_BOT,
|
|
101
139
|
|
|
102
140
|
// Velen.io
|
|
103
|
-
|
|
141
|
+
Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
|
|
142
|
+
|
|
143
|
+
// Vercel
|
|
144
|
+
Crawler.VERCEL_V0BOT,
|
|
104
145
|
|
|
105
146
|
// Webz.io
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
147
|
+
Crawler.WEBZIO_OMGILI,
|
|
148
|
+
Crawler.WEBZIO_OMGILI_BOT,
|
|
149
|
+
Crawler.WEBZIO_EXTENDED,
|
|
109
150
|
|
|
110
|
-
//
|
|
111
|
-
|
|
151
|
+
// X
|
|
152
|
+
Crawler.XAI_BOT,
|
|
112
153
|
|
|
113
|
-
//
|
|
114
|
-
|
|
154
|
+
// You.com
|
|
155
|
+
Crawler.YOU_BOT,
|
|
115
156
|
|
|
116
|
-
|
|
157
|
+
// Zhipu AI
|
|
158
|
+
Crawler.ZHIPU_CHATGLM_SPIDER
|
|
159
|
+
]
|
|
160
|
+
.map((s) => s.toLowerCase())
|
|
161
|
+
.includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase());
|
|
117
162
|
|
|
118
163
|
const isBot = (resultOrUA) => [
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
164
|
+
BrowserType.CLI,
|
|
165
|
+
BrowserType.CRAWLER,
|
|
166
|
+
BrowserType.FETCHER,
|
|
167
|
+
BrowserType.LIBRARY
|
|
123
168
|
].includes(toResult(resultOrUA, Bots).browser.type);
|
|
124
169
|
|
|
125
|
-
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(
|
|
170
|
+
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
|
|
126
171
|
|
|
127
172
|
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
|
128
173
|
/ electron\//i.test(navigator?.userAgent)); // browser
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Source: /src/helpers/ua-parser-helpers.js
|
|
4
4
|
|
|
5
5
|
///////////////////////////////////////////////
|
|
6
|
-
/* Helpers for UAParser.js v2.0.
|
|
6
|
+
/* Helpers for UAParser.js v2.0.6
|
|
7
7
|
https://github.com/faisalman/ua-parser-js
|
|
8
8
|
Author: Faisal Salman <f@faisalman.com>
|
|
9
9
|
AGPLv3 License */
|
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
/*jshint esversion: 6 */
|
|
13
13
|
|
|
14
14
|
import { UAParser } from '../main/ua-parser.mjs';
|
|
15
|
-
import {
|
|
16
|
-
import { Bots } from '../extensions/ua-parser-extensions.mjs';
|
|
15
|
+
import { CPUArch, OSName, EngineName, Extension, BrowserType } from '../enums/ua-parser-enums.mjs';
|
|
16
|
+
import { Bots, Crawlers } from '../extensions/ua-parser-extensions.mjs';
|
|
17
17
|
import { isFromEU } from 'detect-europe-js';
|
|
18
18
|
import { isFrozenUA } from 'ua-is-frozen';
|
|
19
19
|
import { isStandalonePWA } from 'is-standalone-pwa';
|
|
20
|
+
const { Crawler } = Extension.BrowserName;
|
|
20
21
|
|
|
21
22
|
const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
|
|
22
23
|
|
|
@@ -24,8 +25,8 @@ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${m
|
|
|
24
25
|
|
|
25
26
|
const isAppleSilicon = (resultOrUA) => {
|
|
26
27
|
const res = toResult(resultOrUA);
|
|
27
|
-
if (res.os.is(
|
|
28
|
-
if (res.cpu.is(
|
|
28
|
+
if (res.os.is(OSName.MACOS)) {
|
|
29
|
+
if (res.cpu.is(CPUArch.ARM)) {
|
|
29
30
|
return true;
|
|
30
31
|
}
|
|
31
32
|
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
|
|
@@ -48,85 +49,129 @@ const isAppleSilicon = (resultOrUA) => {
|
|
|
48
49
|
const isAIBot = (resultOrUA) => [
|
|
49
50
|
|
|
50
51
|
// AI2
|
|
51
|
-
|
|
52
|
+
Crawler.AI2_BOT,
|
|
52
53
|
|
|
53
54
|
// Amazon
|
|
54
|
-
|
|
55
|
+
Crawler.AMAZON_BOT,
|
|
55
56
|
|
|
56
57
|
// Anthropic
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
Crawler.ANTHROPIC_AI,
|
|
59
|
+
Crawler.ANTHROPIC_CLAUDE_BOT,
|
|
60
|
+
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
|
|
61
|
+
Crawler.ANTHROPIC_CLAUDE_WEB,
|
|
60
62
|
|
|
61
63
|
// Apple
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
Crawler.APPLE_BOT,
|
|
65
|
+
Crawler.APPLE_BOT_EXTENDED,
|
|
66
|
+
|
|
67
|
+
// Brave
|
|
68
|
+
Crawler.BRAVE_BOT,
|
|
64
69
|
|
|
65
70
|
// ByteDance
|
|
66
|
-
|
|
71
|
+
Crawler.BYTEDANCE_BYTESPIDER,
|
|
72
|
+
Crawler.BYTEDANCE_TIKTOKSPIDER,
|
|
73
|
+
|
|
74
|
+
// Cohere
|
|
75
|
+
Crawler.COHERE_TRAINING_DATA_CRAWLER,
|
|
67
76
|
|
|
68
77
|
// Common Crawl
|
|
69
|
-
|
|
78
|
+
Crawler.COMMON_CRAWL_CCBOT,
|
|
79
|
+
|
|
80
|
+
// Coveo
|
|
81
|
+
Crawler.COVEO_BOT,
|
|
70
82
|
|
|
71
83
|
// DataForSeo
|
|
72
|
-
|
|
84
|
+
Crawler.DATAFORSEO_BOT,
|
|
85
|
+
|
|
86
|
+
// DeepSeek
|
|
87
|
+
Crawler.DEEPSEEK_BOT,
|
|
73
88
|
|
|
74
89
|
// Diffbot
|
|
75
|
-
|
|
90
|
+
Crawler.DIFFBOT,
|
|
76
91
|
|
|
77
92
|
// Google
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
93
|
+
Crawler.GOOGLE_EXTENDED,
|
|
94
|
+
Crawler.GOOGLE_OTHER,
|
|
95
|
+
Crawler.GOOGLE_OTHER_IMAGE,
|
|
96
|
+
Crawler.GOOGLE_OTHER_VIDEO,
|
|
97
|
+
Crawler.GOOGLE_CLOUDVERTEXBOT,
|
|
82
98
|
|
|
83
99
|
// Hive AI
|
|
84
|
-
|
|
100
|
+
Crawler.HIVE_IMAGESIFTBOT,
|
|
85
101
|
|
|
86
102
|
// Huawei
|
|
87
|
-
|
|
103
|
+
Crawler.HUAWEI_PETALBOT,
|
|
104
|
+
Crawler.HUAWEI_PANGUBOT,
|
|
105
|
+
|
|
106
|
+
// Hugging Face
|
|
107
|
+
Crawler.HUGGINGFACE_BOT,
|
|
108
|
+
|
|
109
|
+
// Kangaroo
|
|
110
|
+
Crawler.KANGAROO_BOT,
|
|
111
|
+
|
|
112
|
+
// Mendable.ai
|
|
113
|
+
Crawler.FIRECRAWL_AGENT,
|
|
88
114
|
|
|
89
115
|
// Meta
|
|
90
|
-
|
|
91
|
-
|
|
116
|
+
Crawler.META_FACEBOOKBOT,
|
|
117
|
+
Crawler.META_EXTERNALAGENT,
|
|
92
118
|
|
|
93
119
|
// OpenAI
|
|
94
|
-
|
|
95
|
-
|
|
120
|
+
Crawler.OPENAI_GPTBOT,
|
|
121
|
+
Crawler.OPENAI_SEARCH_BOT,
|
|
96
122
|
|
|
97
123
|
// Perplexity
|
|
98
|
-
|
|
124
|
+
Crawler.PERPLEXITY_BOT,
|
|
125
|
+
|
|
126
|
+
// Replicate
|
|
127
|
+
Crawler.REPLICATE_BOT,
|
|
128
|
+
|
|
129
|
+
// Runpod
|
|
130
|
+
Crawler.RUNPOD_BOT,
|
|
131
|
+
|
|
132
|
+
// SB Intuitions
|
|
133
|
+
Crawler.SB_INTUITIONS_BOT,
|
|
99
134
|
|
|
100
135
|
// Semrush
|
|
101
|
-
|
|
136
|
+
Crawler.SEMRUSH_BOT_CONTENTSHAKE,
|
|
102
137
|
|
|
103
138
|
// Timpi
|
|
104
|
-
|
|
139
|
+
Crawler.TIMPI_BOT,
|
|
140
|
+
|
|
141
|
+
// Together AI
|
|
142
|
+
Crawler.TOGETHER_BOT,
|
|
105
143
|
|
|
106
144
|
// Velen.io
|
|
107
|
-
|
|
145
|
+
Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
|
|
146
|
+
|
|
147
|
+
// Vercel
|
|
148
|
+
Crawler.VERCEL_V0BOT,
|
|
108
149
|
|
|
109
150
|
// Webz.io
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
151
|
+
Crawler.WEBZIO_OMGILI,
|
|
152
|
+
Crawler.WEBZIO_OMGILI_BOT,
|
|
153
|
+
Crawler.WEBZIO_EXTENDED,
|
|
113
154
|
|
|
114
|
-
//
|
|
115
|
-
|
|
155
|
+
// X
|
|
156
|
+
Crawler.XAI_BOT,
|
|
116
157
|
|
|
117
|
-
//
|
|
118
|
-
|
|
158
|
+
// You.com
|
|
159
|
+
Crawler.YOU_BOT,
|
|
119
160
|
|
|
120
|
-
|
|
161
|
+
// Zhipu AI
|
|
162
|
+
Crawler.ZHIPU_CHATGLM_SPIDER
|
|
163
|
+
]
|
|
164
|
+
.map((s) => s.toLowerCase())
|
|
165
|
+
.includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase());
|
|
121
166
|
|
|
122
167
|
const isBot = (resultOrUA) => [
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
168
|
+
BrowserType.CLI,
|
|
169
|
+
BrowserType.CRAWLER,
|
|
170
|
+
BrowserType.FETCHER,
|
|
171
|
+
BrowserType.LIBRARY
|
|
127
172
|
].includes(toResult(resultOrUA, Bots).browser.type);
|
|
128
173
|
|
|
129
|
-
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(
|
|
174
|
+
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
|
|
130
175
|
|
|
131
176
|
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
|
132
177
|
/ electron\//i.test(navigator?.userAgent)); // browser
|
package/src/main/ua-parser.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
// Type definitions for UAParser.js v2.0.
|
|
1
|
+
// Type definitions for UAParser.js v2.0.6
|
|
2
2
|
// Project: https://github.com/faisalman/ua-parser-js
|
|
3
3
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import type { Headers as FetchAPIHeaders } from 'node-fetch';
|
|
5
|
+
import { BrowserType, CPUArch, DeviceType, EngineName } from "../enums/ua-parser-enums";
|
|
7
6
|
|
|
8
7
|
declare namespace UAParser {
|
|
9
8
|
|
|
@@ -18,21 +17,21 @@ declare namespace UAParser {
|
|
|
18
17
|
name?: string;
|
|
19
18
|
version?: string;
|
|
20
19
|
major?: string;
|
|
21
|
-
type?:
|
|
20
|
+
type?: typeof BrowserType[keyof typeof BrowserType];
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
interface ICPU extends IData<ICPU> {
|
|
25
|
-
architecture?:
|
|
24
|
+
architecture?: typeof CPUArch[keyof typeof CPUArch];
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
interface IDevice extends IData<IDevice> {
|
|
29
|
-
type?:
|
|
28
|
+
type?: typeof DeviceType[keyof typeof DeviceType];
|
|
30
29
|
vendor?: string;
|
|
31
30
|
model?: string;
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
interface IEngine extends IData<IEngine> {
|
|
35
|
-
name?:
|
|
34
|
+
name?: typeof EngineName[keyof typeof EngineName];
|
|
36
35
|
version?: string;
|
|
37
36
|
}
|
|
38
37
|
|
|
@@ -53,7 +52,7 @@ declare namespace UAParser {
|
|
|
53
52
|
type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[];
|
|
54
53
|
type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os';
|
|
55
54
|
type UAParserExt = Partial<Record<UAParserProps, RegexMap>> | Partial<Record<UAParserProps, RegexMap>>[];
|
|
56
|
-
type UAParserHeaders = Record<string, string
|
|
55
|
+
export type UAParserHeaders = Record<string, string | string[] | undefined> | Headers;
|
|
57
56
|
|
|
58
57
|
export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: UAParserHeaders): IResult;
|
|
59
58
|
export function UAParser(uastring?: string, headers?: UAParserHeaders): IResult;
|