@tinkoff/user-agent 0.4.365 → 0.4.378

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.
@@ -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/47.0.2526.106 Safari/537.36
597
- Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12785 YaBrowser/13.12.1599.12785 Safari/537.36
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
@@ -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;
@@ -1,4 +1,4 @@
1
- import { getBrowserEngine, getMobileOs } from './utils.es.js';
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 parseBrowser = (brandsList) => {
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 } = parseBrowser(headers['sec-ch-ua-full-version-list'] || headers['sec-ch-ua']);
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 of the browsers with client-hints support
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 };
@@ -18,7 +18,7 @@ const parseQuotedString = (str) => {
18
18
  return str;
19
19
  }
20
20
  };
21
- const parseBrowser = (brandsList) => {
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 } = parseBrowser(headers['sec-ch-ua-full-version-list'] || headers['sec-ch-ua']);
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 of the browsers with client-hints support
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;
@@ -47,6 +47,10 @@ const BROWSERS_LIST_MAP = {
47
47
  type: 'mobile',
48
48
  name: 'firefox',
49
49
  },
50
+ samsung: {
51
+ type: 'mobile',
52
+ name: 'samsung browser',
53
+ },
50
54
  };
51
55
  const CHROMIUM_BASED_BROWSERS = [
52
56
  'android browser',
package/lib/constants.js CHANGED
@@ -51,6 +51,10 @@ const BROWSERS_LIST_MAP = {
51
51
  type: 'mobile',
52
52
  name: 'firefox',
53
53
  },
54
+ samsung: {
55
+ type: 'mobile',
56
+ name: 'samsung browser',
57
+ },
54
58
  };
55
59
  const CHROMIUM_BASED_BROWSERS = [
56
60
  'android browser',
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;
@@ -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;
@@ -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.365",
3
+ "version": "0.4.378",
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.5",
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.125.4",
32
+ "@tramvai/cli": "2.130.4",
32
33
  "@types/ua-parser-js": "^0.7.33"
33
34
  },
34
35
  "license": "Apache-2.0"