@tinkoff/user-agent 0.4.365 → 0.4.376
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/lib/__tests__/uaDatasets/not_supported.txt +1 -0
- package/lib/__tests__/uaDatasets/supported.txt +5 -5
- package/lib/__tests__/uaDatasets/supported_force.txt +2 -0
- package/lib/__tests__/uaDatasets/unknown.txt +0 -4
- package/lib/client-hints.d.ts +12 -0
- package/lib/client-hints.es.js +68 -5
- package/lib/client-hints.js +67 -3
- package/lib/constants.es.js +4 -0
- package/lib/constants.js +4 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.es.js +1 -1
- package/lib/index.js +1 -0
- package/lib/satisfies.d.ts +2 -1
- package/lib/satisfies.es.js +28 -1
- package/lib/satisfies.js +28 -1
- package/package.json +5 -4
|
@@ -6,6 +6,7 @@ Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2
|
|
|
6
6
|
Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0
|
|
7
7
|
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MAAU; rv:11.0) like Gecko
|
|
8
8
|
Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Microsoft; Lumia 535 Dual SIM) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Mobile Safari/537.36 Edge/14.14393
|
|
9
|
+
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
|
|
9
10
|
Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Microsoft; Lumia 650) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Mobile Safari/537.36 Edge/15.15254
|
|
10
11
|
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; KTXN)
|
|
11
12
|
Mozilla/5.0 (iPad; CPU OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G36 Safari/601.1
|
|
@@ -129,7 +129,6 @@ Mozilla/5.0 (Linux; Android 9; SM-A307FN Build/PPR1.180610.011) AppleWebKit/537.
|
|
|
129
129
|
Mozilla/5.0 (Linux; Android 9; SM-A307FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.119 Mobile Safari/537.36
|
|
130
130
|
Mozilla/5.0 (Linux; Android 9; SM-A505FN Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36 YaApp_Android/9.85 YaSearchBrowser/9.85
|
|
131
131
|
Mozilla/5.0 (Linux; Android 9; SM-A505FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.96 Mobile Safari/537.36
|
|
132
|
-
Mozilla/5.0 (Linux; Android 9; SM-A505FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36 OPR/57.2.2830.52651
|
|
133
132
|
Mozilla/5.0 (Linux; Android 9; SM-A530F Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.111 Mobile Safari/537.36 YaApp_Android/10.60 YaSearchBrowser/10.60
|
|
134
133
|
Mozilla/5.0 (Linux; Android 9; SM-A605FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.119 Mobile Safari/537.36
|
|
135
134
|
Mozilla/5.0 (Linux; Android 9; SM-A705FN Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36 YaApp_Android/10.44 YaSearchBrowser/10.44
|
|
@@ -137,7 +136,6 @@ Mozilla/5.0 (Linux; Android 9; SM-A750FN Build/PPR1.180610.011) AppleWebKit/537.
|
|
|
137
136
|
Mozilla/5.0 (Linux; Android 9; SM-A750FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36
|
|
138
137
|
Mozilla/5.0 (Linux; Android 9; SM-A750FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36
|
|
139
138
|
Mozilla/5.0 (Linux; Android 9; SM-G950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36
|
|
140
|
-
Mozilla/5.0 (Linux; Android 9; SM-G950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36 OPR/57.1.2830.52480
|
|
141
139
|
Mozilla/5.0 (Linux; Android 9; SM-T725) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36
|
|
142
140
|
Mozilla/5.0 (Linux; Android 9; STF-L09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36
|
|
143
141
|
Mozilla/5.0 (Linux; Android 9; TA-1032) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36
|
|
@@ -245,7 +243,6 @@ Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chro
|
|
|
245
243
|
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 YaBrowser/20.3.2.242 Yowser/2.5 Yptp/1.23 Safari/537.40
|
|
246
244
|
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 YaBrowser/20.3.2.242 Yowser/2.5 Yptp/1.23 Safari/537.41
|
|
247
245
|
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 YaBrowser/20.3.2.242 Yowser/2.5 Yptp/1.23 Safari/537.42
|
|
248
|
-
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
|
|
249
246
|
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362
|
|
250
247
|
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363
|
|
251
248
|
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18364
|
|
@@ -593,5 +590,8 @@ Mozilla/5.0 (Linux; U; Android 5.1; zh-CN; MZ-M3s Build/MRA58K) AppleWebKit/537.
|
|
|
593
590
|
Mozilla/5.0 (Linux; U; Android 6.0; zh-CN; MZ-M5s Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 MZBrowser/8.1.310-2020040818 UWS/2.15.0.4 Mobile Safari/537.360.41
|
|
594
591
|
Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36 DuckDuckGo/5
|
|
595
592
|
Mozilla/5.0 (Linux; Android 6.0; BV6000 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.119 YaBrowser/19.6.0.158 (lite) Mobile Safari/537.36
|
|
596
|
-
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
|
597
|
-
Mozilla/5.0 (Windows NT
|
|
593
|
+
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2526.106 Safari/537.36
|
|
594
|
+
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 YaBrowser/16.4.0.7918 Safari/537.36
|
|
595
|
+
Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-A305FN) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.0 Chrome/75.0.3770.143 Mobile Safari/537.36
|
|
596
|
+
Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-J600F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36
|
|
597
|
+
Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G532F Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.2 Chrome/44.0.2403.133 Mobile Safari/537.36
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Mozilla/5.0 (Linux; Android 9; SM-A505FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36 OPR/57.2.2830.52651
|
|
2
|
+
Mozilla/5.0 (Linux; Android 9; SM-G950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36 OPR/57.1.2830.52480
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-A305FN) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.0 Chrome/75.0.3770.143 Mobile Safari/537.36
|
|
2
|
-
Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-J600F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36
|
|
3
1
|
Mozilla/5.0 (Linux; Android 8.1.0; DUA-L22 Build/HONORDUA-L22; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36
|
|
4
2
|
Mozilla/5.0 (Linux; Android 8.1.0; DUB-LX1 Build/HUAWEIDUB-LX1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36 YandexSearch/6.45
|
|
5
3
|
Mozilla/5.0 (Linux; Android 9; CPH1923 Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 YandexSearch/7.80 YandexSearchBrowser/7.80
|
|
@@ -17,5 +15,3 @@ Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHT
|
|
|
17
15
|
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/8.1.3 Mobile/15E148 Safari/605.1.15
|
|
18
16
|
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Instagram 135.0.0.22.118 (iPhone10,5; iOS 13_3_1; ru_RU; ru-RU; scale=2.61; 1080x1920; 206072690)
|
|
19
17
|
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone12,1;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/2;FBID/phone;FBLC/ru_RU;FBOP/5;FBCR/Mobile TeleSystems]
|
|
20
|
-
Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G532F Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.2 Chrome/44.0.2403.133 Mobile Safari/537.36
|
|
21
|
-
Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G531H Build/LMY48B) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.3 Chrome/38.0.2125.102 Mobile Safari/537.36
|
package/lib/client-hints.d.ts
CHANGED
|
@@ -15,3 +15,15 @@ import type { UserAgent } from './types';
|
|
|
15
15
|
* @returns
|
|
16
16
|
*/
|
|
17
17
|
export declare const parseClientHintsHeaders: (headers: Record<string, string | string[] | undefined>) => UserAgent;
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* @description
|
|
21
|
+
* Some of the data will be available if `UADataValues` were gotten from
|
|
22
|
+
* `getHighEntropyValues` async method, but it's not suitable for all cases.
|
|
23
|
+
*
|
|
24
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API
|
|
25
|
+
* @see https://wicg.github.io/ua-client-hints/#user-agent-model
|
|
26
|
+
*
|
|
27
|
+
* @param payload
|
|
28
|
+
*/
|
|
29
|
+
export declare const parseClientHintsUserAgentData: (payload: UADataValues) => UserAgent;
|
package/lib/client-hints.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getMobileOs, getBrowserEngine } from './utils.es.js';
|
|
2
2
|
|
|
3
3
|
const KNOWN_VENDORS = new Set(['Opera', 'Google Chrome', 'Microsoft Edge', 'Firefox', 'Safari']);
|
|
4
4
|
const KNOWN_ENGINES = new Set(['Chromium']);
|
|
@@ -14,7 +14,7 @@ const parseQuotedString = (str) => {
|
|
|
14
14
|
return str;
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
|
-
const
|
|
17
|
+
const parseBrowserFromString = (brandsList) => {
|
|
18
18
|
const browser = {
|
|
19
19
|
name: undefined,
|
|
20
20
|
version: undefined,
|
|
@@ -44,6 +44,35 @@ const parseBrowser = (brandsList) => {
|
|
|
44
44
|
browser.browserEngine = getBrowserEngine(browser.name, engine.name);
|
|
45
45
|
return { browser, engine };
|
|
46
46
|
};
|
|
47
|
+
const parseBrowserFromUserAgentData = (brands) => {
|
|
48
|
+
const browser = {
|
|
49
|
+
name: undefined,
|
|
50
|
+
version: undefined,
|
|
51
|
+
major: undefined,
|
|
52
|
+
browserEngine: '',
|
|
53
|
+
};
|
|
54
|
+
const engine = {
|
|
55
|
+
name: undefined,
|
|
56
|
+
version: undefined,
|
|
57
|
+
};
|
|
58
|
+
brands.forEach(({ brand, version }) => {
|
|
59
|
+
if (KNOWN_VENDORS.has(brand)) {
|
|
60
|
+
browser.name = brand.toLowerCase();
|
|
61
|
+
browser.version = version;
|
|
62
|
+
[browser.major] = version.split('.');
|
|
63
|
+
}
|
|
64
|
+
if (KNOWN_ENGINES.has(brand)) {
|
|
65
|
+
engine.name = brand.toLowerCase();
|
|
66
|
+
engine.version = version;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
if (!browser.name && engine.name) {
|
|
70
|
+
browser.name = engine.name;
|
|
71
|
+
browser.version = engine.version;
|
|
72
|
+
}
|
|
73
|
+
browser.browserEngine = getBrowserEngine(browser.name, engine.name);
|
|
74
|
+
return { browser, engine };
|
|
75
|
+
};
|
|
47
76
|
/**
|
|
48
77
|
*
|
|
49
78
|
* @description
|
|
@@ -60,7 +89,7 @@ const parseBrowser = (brandsList) => {
|
|
|
60
89
|
* @returns
|
|
61
90
|
*/
|
|
62
91
|
const parseClientHintsHeaders = (headers) => {
|
|
63
|
-
const { browser, engine } =
|
|
92
|
+
const { browser, engine } = parseBrowserFromString(headers['sec-ch-ua-full-version-list'] || headers['sec-ch-ua']);
|
|
64
93
|
const osName = parseQuotedString(headers['sec-ch-ua-platform']);
|
|
65
94
|
const mobileOS = getMobileOs(osName);
|
|
66
95
|
return {
|
|
@@ -79,10 +108,44 @@ const parseClientHintsHeaders = (headers) => {
|
|
|
79
108
|
type: headers['sec-ch-ua-mobile'] === '?1' ? 'mobile' : 'desktop',
|
|
80
109
|
vendor: undefined,
|
|
81
110
|
},
|
|
82
|
-
// basically all
|
|
111
|
+
// basically all the browsers with client-hints support
|
|
112
|
+
// also compatible with SameSite=None
|
|
113
|
+
sameSiteNoneCompatible: true,
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
*
|
|
118
|
+
* @description
|
|
119
|
+
* Some of the data will be available if `UADataValues` were gotten from
|
|
120
|
+
* `getHighEntropyValues` async method, but it's not suitable for all cases.
|
|
121
|
+
*
|
|
122
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API
|
|
123
|
+
* @see https://wicg.github.io/ua-client-hints/#user-agent-model
|
|
124
|
+
*
|
|
125
|
+
* @param payload
|
|
126
|
+
*/
|
|
127
|
+
const parseClientHintsUserAgentData = (payload) => {
|
|
128
|
+
const { browser, engine } = parseBrowserFromUserAgentData(payload.fullVersionList || payload.brands || []);
|
|
129
|
+
return {
|
|
130
|
+
browser,
|
|
131
|
+
engine,
|
|
132
|
+
os: {
|
|
133
|
+
name: payload.platform,
|
|
134
|
+
version: payload.platformVersion,
|
|
135
|
+
},
|
|
136
|
+
cpu: {
|
|
137
|
+
architecture: payload.architecture,
|
|
138
|
+
},
|
|
139
|
+
mobileOS: getMobileOs(payload.platform),
|
|
140
|
+
device: {
|
|
141
|
+
model: payload.model,
|
|
142
|
+
type: payload.mobile ? 'mobile' : 'desktop',
|
|
143
|
+
vendor: undefined,
|
|
144
|
+
},
|
|
145
|
+
// basically all the browsers with client-hints support
|
|
83
146
|
// also compatible with SameSite=None
|
|
84
147
|
sameSiteNoneCompatible: true,
|
|
85
148
|
};
|
|
86
149
|
};
|
|
87
150
|
|
|
88
|
-
export { parseClientHintsHeaders };
|
|
151
|
+
export { parseClientHintsHeaders, parseClientHintsUserAgentData };
|
package/lib/client-hints.js
CHANGED
|
@@ -18,7 +18,7 @@ const parseQuotedString = (str) => {
|
|
|
18
18
|
return str;
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
|
-
const
|
|
21
|
+
const parseBrowserFromString = (brandsList) => {
|
|
22
22
|
const browser = {
|
|
23
23
|
name: undefined,
|
|
24
24
|
version: undefined,
|
|
@@ -48,6 +48,35 @@ const parseBrowser = (brandsList) => {
|
|
|
48
48
|
browser.browserEngine = utils.getBrowserEngine(browser.name, engine.name);
|
|
49
49
|
return { browser, engine };
|
|
50
50
|
};
|
|
51
|
+
const parseBrowserFromUserAgentData = (brands) => {
|
|
52
|
+
const browser = {
|
|
53
|
+
name: undefined,
|
|
54
|
+
version: undefined,
|
|
55
|
+
major: undefined,
|
|
56
|
+
browserEngine: '',
|
|
57
|
+
};
|
|
58
|
+
const engine = {
|
|
59
|
+
name: undefined,
|
|
60
|
+
version: undefined,
|
|
61
|
+
};
|
|
62
|
+
brands.forEach(({ brand, version }) => {
|
|
63
|
+
if (KNOWN_VENDORS.has(brand)) {
|
|
64
|
+
browser.name = brand.toLowerCase();
|
|
65
|
+
browser.version = version;
|
|
66
|
+
[browser.major] = version.split('.');
|
|
67
|
+
}
|
|
68
|
+
if (KNOWN_ENGINES.has(brand)) {
|
|
69
|
+
engine.name = brand.toLowerCase();
|
|
70
|
+
engine.version = version;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
if (!browser.name && engine.name) {
|
|
74
|
+
browser.name = engine.name;
|
|
75
|
+
browser.version = engine.version;
|
|
76
|
+
}
|
|
77
|
+
browser.browserEngine = utils.getBrowserEngine(browser.name, engine.name);
|
|
78
|
+
return { browser, engine };
|
|
79
|
+
};
|
|
51
80
|
/**
|
|
52
81
|
*
|
|
53
82
|
* @description
|
|
@@ -64,7 +93,7 @@ const parseBrowser = (brandsList) => {
|
|
|
64
93
|
* @returns
|
|
65
94
|
*/
|
|
66
95
|
const parseClientHintsHeaders = (headers) => {
|
|
67
|
-
const { browser, engine } =
|
|
96
|
+
const { browser, engine } = parseBrowserFromString(headers['sec-ch-ua-full-version-list'] || headers['sec-ch-ua']);
|
|
68
97
|
const osName = parseQuotedString(headers['sec-ch-ua-platform']);
|
|
69
98
|
const mobileOS = utils.getMobileOs(osName);
|
|
70
99
|
return {
|
|
@@ -83,10 +112,45 @@ const parseClientHintsHeaders = (headers) => {
|
|
|
83
112
|
type: headers['sec-ch-ua-mobile'] === '?1' ? 'mobile' : 'desktop',
|
|
84
113
|
vendor: undefined,
|
|
85
114
|
},
|
|
86
|
-
// basically all
|
|
115
|
+
// basically all the browsers with client-hints support
|
|
116
|
+
// also compatible with SameSite=None
|
|
117
|
+
sameSiteNoneCompatible: true,
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
*
|
|
122
|
+
* @description
|
|
123
|
+
* Some of the data will be available if `UADataValues` were gotten from
|
|
124
|
+
* `getHighEntropyValues` async method, but it's not suitable for all cases.
|
|
125
|
+
*
|
|
126
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API
|
|
127
|
+
* @see https://wicg.github.io/ua-client-hints/#user-agent-model
|
|
128
|
+
*
|
|
129
|
+
* @param payload
|
|
130
|
+
*/
|
|
131
|
+
const parseClientHintsUserAgentData = (payload) => {
|
|
132
|
+
const { browser, engine } = parseBrowserFromUserAgentData(payload.fullVersionList || payload.brands || []);
|
|
133
|
+
return {
|
|
134
|
+
browser,
|
|
135
|
+
engine,
|
|
136
|
+
os: {
|
|
137
|
+
name: payload.platform,
|
|
138
|
+
version: payload.platformVersion,
|
|
139
|
+
},
|
|
140
|
+
cpu: {
|
|
141
|
+
architecture: payload.architecture,
|
|
142
|
+
},
|
|
143
|
+
mobileOS: utils.getMobileOs(payload.platform),
|
|
144
|
+
device: {
|
|
145
|
+
model: payload.model,
|
|
146
|
+
type: payload.mobile ? 'mobile' : 'desktop',
|
|
147
|
+
vendor: undefined,
|
|
148
|
+
},
|
|
149
|
+
// basically all the browsers with client-hints support
|
|
87
150
|
// also compatible with SameSite=None
|
|
88
151
|
sameSiteNoneCompatible: true,
|
|
89
152
|
};
|
|
90
153
|
};
|
|
91
154
|
|
|
92
155
|
exports.parseClientHintsHeaders = parseClientHintsHeaders;
|
|
156
|
+
exports.parseClientHintsUserAgentData = parseClientHintsUserAgentData;
|
package/lib/constants.es.js
CHANGED
package/lib/constants.js
CHANGED
package/lib/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { parseUserAgentHeader } from './userAgent';
|
|
|
2
2
|
export { parseUserAgentHeader as parse } from './userAgent';
|
|
3
3
|
export { satisfies } from './satisfies';
|
|
4
4
|
export { parseClientHintsHeaders as parseClientHints } from './client-hints';
|
|
5
|
+
export { parseClientHintsUserAgentData } from './client-hints';
|
|
5
6
|
export * from './types';
|
package/lib/index.es.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { parseUserAgentHeader as parse, parseUserAgentHeader } from './userAgent.es.js';
|
|
2
2
|
export { satisfies } from './satisfies.es.js';
|
|
3
|
-
export { parseClientHintsHeaders as parseClientHints } from './client-hints.es.js';
|
|
3
|
+
export { parseClientHintsHeaders as parseClientHints, parseClientHintsUserAgentData } from './client-hints.es.js';
|
package/lib/index.js
CHANGED
|
@@ -12,3 +12,4 @@ exports.parse = userAgent.parseUserAgentHeader;
|
|
|
12
12
|
exports.parseUserAgentHeader = userAgent.parseUserAgentHeader;
|
|
13
13
|
exports.satisfies = satisfies.satisfies;
|
|
14
14
|
exports.parseClientHints = clientHints.parseClientHintsHeaders;
|
|
15
|
+
exports.parseClientHintsUserAgentData = clientHints.parseClientHintsUserAgentData;
|
package/lib/satisfies.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { UserAgent } from './types';
|
|
2
|
-
export declare const satisfies: (userAgent: UserAgent | string, browserslistConfig?: string[], { env }?: {
|
|
2
|
+
export declare const satisfies: (userAgent: UserAgent | string, browserslistConfig?: string[], { env, forceMinimumUnknownVersions, }?: {
|
|
3
3
|
env?: "modern" | "defaults" | undefined;
|
|
4
|
+
forceMinimumUnknownVersions?: boolean | undefined;
|
|
4
5
|
}) => boolean | null;
|
package/lib/satisfies.es.js
CHANGED
|
@@ -10,6 +10,12 @@ const deviceTypes = {
|
|
|
10
10
|
tablet: 'mobile',
|
|
11
11
|
desktop: 'desktop',
|
|
12
12
|
};
|
|
13
|
+
const browsersWithoutCompleteStat = {
|
|
14
|
+
Samsung: 'samsung',
|
|
15
|
+
Android: 'android',
|
|
16
|
+
UCAndroid: 'and_uc',
|
|
17
|
+
OperaMobile: 'op_mob',
|
|
18
|
+
};
|
|
13
19
|
const normalizedBrowserslist = (query) => {
|
|
14
20
|
const resolved = browserslist(query, {
|
|
15
21
|
// ставим в true, чтобы browserslist возвращал полный список для мобильных браузеров
|
|
@@ -43,7 +49,7 @@ const normalizedBrowserslist = (query) => {
|
|
|
43
49
|
}
|
|
44
50
|
return result;
|
|
45
51
|
};
|
|
46
|
-
const satisfies = (userAgent, browserslistConfig, { env = 'defaults' } = {}) => {
|
|
52
|
+
const satisfies = (userAgent, browserslistConfig, { env = 'defaults', forceMinimumUnknownVersions = false, } = {}) => {
|
|
47
53
|
var _a, _b;
|
|
48
54
|
const ua = isString(userAgent) ? parseUserAgentHeader(userAgent) : userAgent;
|
|
49
55
|
const { engine: { name: engineName = '', version: engineVersion }, device: { type = '' } = {}, } = ua;
|
|
@@ -65,6 +71,27 @@ const satisfies = (userAgent, browserslistConfig, { env = 'defaults' } = {}) =>
|
|
|
65
71
|
}
|
|
66
72
|
const targets = (_a = browserslistConfig !== null && browserslistConfig !== void 0 ? browserslistConfig : browserslistFileConfig[env]) !== null && _a !== void 0 ? _a : browserslistTinkoffConfig[env];
|
|
67
73
|
const browsers = normalizedBrowserslist(targets);
|
|
74
|
+
// Browsers from query may not be present in https://caniuse.com/usage-table, and browserslist will return higher versions than requested.
|
|
75
|
+
// Example of this problem - https://github.com/babel/babel/issues/8545
|
|
76
|
+
// It is mean, that for this unknown versions babel will not add specific transforms, but still, transpiled code has a chance to work in required old browsers.
|
|
77
|
+
// And if `satisfies` will be used for example for old browser detection, we can force use minimum requested versions instead of minimum from caniuse data.
|
|
78
|
+
if (forceMinimumUnknownVersions) {
|
|
79
|
+
Object.keys(browsersWithoutCompleteStat).forEach((browser) => {
|
|
80
|
+
const target = targets.find((query) => query.startsWith(browser));
|
|
81
|
+
// @todo - respect other browserslist query patterns
|
|
82
|
+
if (target && target.includes('>=')) {
|
|
83
|
+
const [targetBrowser, targetMinVersion] = target.split(' >= ');
|
|
84
|
+
// @ts-expect-error
|
|
85
|
+
const browserKey = browsersWithoutCompleteStat[targetBrowser];
|
|
86
|
+
const mappedBrowser = BROWSERS_LIST_MAP[browserKey];
|
|
87
|
+
if (mappedBrowser && browsers[mappedBrowser.name]) {
|
|
88
|
+
if (Number(targetMinVersion) < Number(browsers[mappedBrowser.name][mappedBrowser.type])) {
|
|
89
|
+
browsers[mappedBrowser.name][mappedBrowser.type] = Number(targetMinVersion);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
68
95
|
let hasEntry = false;
|
|
69
96
|
if (browserName in browsers) {
|
|
70
97
|
const browserInfo = browsers[browserName];
|
package/lib/satisfies.js
CHANGED
|
@@ -21,6 +21,12 @@ const deviceTypes = {
|
|
|
21
21
|
tablet: 'mobile',
|
|
22
22
|
desktop: 'desktop',
|
|
23
23
|
};
|
|
24
|
+
const browsersWithoutCompleteStat = {
|
|
25
|
+
Samsung: 'samsung',
|
|
26
|
+
Android: 'android',
|
|
27
|
+
UCAndroid: 'and_uc',
|
|
28
|
+
OperaMobile: 'op_mob',
|
|
29
|
+
};
|
|
24
30
|
const normalizedBrowserslist = (query) => {
|
|
25
31
|
const resolved = browserslist__default["default"](query, {
|
|
26
32
|
// ставим в true, чтобы browserslist возвращал полный список для мобильных браузеров
|
|
@@ -54,7 +60,7 @@ const normalizedBrowserslist = (query) => {
|
|
|
54
60
|
}
|
|
55
61
|
return result;
|
|
56
62
|
};
|
|
57
|
-
const satisfies = (userAgent$1, browserslistConfig, { env = 'defaults' } = {}) => {
|
|
63
|
+
const satisfies = (userAgent$1, browserslistConfig, { env = 'defaults', forceMinimumUnknownVersions = false, } = {}) => {
|
|
58
64
|
var _a, _b;
|
|
59
65
|
const ua = isString__default["default"](userAgent$1) ? userAgent.parseUserAgentHeader(userAgent$1) : userAgent$1;
|
|
60
66
|
const { engine: { name: engineName = '', version: engineVersion }, device: { type = '' } = {}, } = ua;
|
|
@@ -76,6 +82,27 @@ const satisfies = (userAgent$1, browserslistConfig, { env = 'defaults' } = {}) =
|
|
|
76
82
|
}
|
|
77
83
|
const targets = (_a = browserslistConfig !== null && browserslistConfig !== void 0 ? browserslistConfig : browserslistFileConfig__default["default"][env]) !== null && _a !== void 0 ? _a : browserslistTinkoffConfig__default["default"][env];
|
|
78
84
|
const browsers = normalizedBrowserslist(targets);
|
|
85
|
+
// Browsers from query may not be present in https://caniuse.com/usage-table, and browserslist will return higher versions than requested.
|
|
86
|
+
// Example of this problem - https://github.com/babel/babel/issues/8545
|
|
87
|
+
// It is mean, that for this unknown versions babel will not add specific transforms, but still, transpiled code has a chance to work in required old browsers.
|
|
88
|
+
// And if `satisfies` will be used for example for old browser detection, we can force use minimum requested versions instead of minimum from caniuse data.
|
|
89
|
+
if (forceMinimumUnknownVersions) {
|
|
90
|
+
Object.keys(browsersWithoutCompleteStat).forEach((browser) => {
|
|
91
|
+
const target = targets.find((query) => query.startsWith(browser));
|
|
92
|
+
// @todo - respect other browserslist query patterns
|
|
93
|
+
if (target && target.includes('>=')) {
|
|
94
|
+
const [targetBrowser, targetMinVersion] = target.split(' >= ');
|
|
95
|
+
// @ts-expect-error
|
|
96
|
+
const browserKey = browsersWithoutCompleteStat[targetBrowser];
|
|
97
|
+
const mappedBrowser = constants.BROWSERS_LIST_MAP[browserKey];
|
|
98
|
+
if (mappedBrowser && browsers[mappedBrowser.name]) {
|
|
99
|
+
if (Number(targetMinVersion) < Number(browsers[mappedBrowser.name][mappedBrowser.type])) {
|
|
100
|
+
browsers[mappedBrowser.name][mappedBrowser.type] = Number(targetMinVersion);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
79
106
|
let hasEntry = false;
|
|
80
107
|
if (browserName in browsers) {
|
|
81
108
|
const browserInfo = browsers[browserName];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinkoff/user-agent",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.376",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib/index.es.js",
|
|
@@ -18,17 +18,18 @@
|
|
|
18
18
|
"watch": "tsc -w"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@tinkoff/browserslist-config": "0.2.
|
|
21
|
+
"@tinkoff/browserslist-config": "0.2.7",
|
|
22
22
|
"@tinkoff/utils": "^2.1.2",
|
|
23
23
|
"browserslist": "^4.16.7",
|
|
24
24
|
"tslib": "^2.4.0",
|
|
25
25
|
"ua-parser-js": "0.7.31"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@types/ua-parser-js": "^0.7.33"
|
|
28
|
+
"@types/ua-parser-js": "^0.7.33",
|
|
29
|
+
"user-agent-data-types": "^0.3.1"
|
|
29
30
|
},
|
|
30
31
|
"peerDependencies": {
|
|
31
|
-
"@tramvai/cli": "2.
|
|
32
|
+
"@tramvai/cli": "2.130.2",
|
|
32
33
|
"@types/ua-parser-js": "^0.7.33"
|
|
33
34
|
},
|
|
34
35
|
"license": "Apache-2.0"
|