@tinkoff/user-agent 0.7.115 → 0.8.102

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.
Files changed (78) hide show
  1. package/README.md +190 -1
  2. package/lib/client-hints/constants.d.ts +7 -0
  3. package/lib/client-hints/constants.es.js +23 -0
  4. package/lib/client-hints/constants.js +32 -0
  5. package/lib/client-hints/parse-client-hints-headers/consts.d.ts +11 -0
  6. package/lib/client-hints/parse-client-hints-headers/consts.es.js +11 -0
  7. package/lib/client-hints/parse-client-hints-headers/consts.js +15 -0
  8. package/lib/client-hints/parse-client-hints-headers/parseClientHintsHeaders.d.ts +18 -0
  9. package/lib/client-hints/parse-client-hints-headers/parseClientHintsHeaders.es.js +54 -0
  10. package/lib/client-hints/parse-client-hints-headers/parseClientHintsHeaders.js +58 -0
  11. package/lib/client-hints/parse-client-hints-user-agent-data/parseClientHintsUserAgentData.d.ts +17 -0
  12. package/lib/client-hints/parse-client-hints-user-agent-data/parseClientHintsUserAgentData.es.js +47 -0
  13. package/lib/client-hints/parse-client-hints-user-agent-data/parseClientHintsUserAgentData.js +51 -0
  14. package/lib/client-hints/utils/getBackwardCompatibleOsName.d.ts +2 -0
  15. package/lib/client-hints/utils/getBackwardCompatibleOsName.es.js +10 -0
  16. package/lib/client-hints/utils/getBackwardCompatibleOsName.js +14 -0
  17. package/lib/client-hints/utils/parseBrowserFromString.d.ts +6 -0
  18. package/lib/client-hints/utils/parseBrowserFromString.es.js +42 -0
  19. package/lib/client-hints/utils/parseBrowserFromString.js +46 -0
  20. package/lib/client-hints/utils/parseBrowserFromUserAgentData.d.ts +6 -0
  21. package/lib/client-hints/utils/parseBrowserFromUserAgentData.es.js +39 -0
  22. package/lib/client-hints/utils/parseBrowserFromUserAgentData.js +43 -0
  23. package/lib/client-hints/utils/parseQuotedString.d.ts +2 -0
  24. package/lib/client-hints/utils/parseQuotedString.es.js +18 -0
  25. package/lib/client-hints/utils/parseQuotedString.js +22 -0
  26. package/lib/constants.d.ts +15 -6
  27. package/lib/constants.es.js +16 -60
  28. package/lib/constants.js +18 -61
  29. package/lib/index.d.ts +7 -5
  30. package/lib/index.es.js +5 -3
  31. package/lib/index.js +12 -8
  32. package/lib/parse-user-agent-header/consts.d.ts +2 -0
  33. package/lib/parse-user-agent-header/consts.es.js +27 -0
  34. package/lib/parse-user-agent-header/consts.js +31 -0
  35. package/lib/parse-user-agent-header/parseUserAgentHeader.d.ts +3 -0
  36. package/lib/parse-user-agent-header/parseUserAgentHeader.es.js +29 -0
  37. package/lib/parse-user-agent-header/parseUserAgentHeader.js +33 -0
  38. package/lib/{isSameSiteNoneCompatible.es.js → parse-user-agent-header/utils/is-same-site-none-compatible/isSameSiteNoneCompatible.es.js} +6 -1
  39. package/lib/{isSameSiteNoneCompatible.js → parse-user-agent-header/utils/is-same-site-none-compatible/isSameSiteNoneCompatible.js} +6 -1
  40. package/lib/parse-user-agent-header/utils/toLowerName.d.ts +2 -0
  41. package/lib/parse-user-agent-header/utils/toLowerName.es.js +14 -0
  42. package/lib/parse-user-agent-header/utils/toLowerName.js +24 -0
  43. package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/not_supported.txt +24 -2
  44. package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/supported.txt +7 -136
  45. package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/supported_force.txt +0 -1
  46. package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/supported_modern.txt +1 -1
  47. package/lib/satisfies/constants.d.ts +16 -0
  48. package/lib/satisfies/constants.es.js +75 -0
  49. package/lib/satisfies/constants.js +82 -0
  50. package/lib/satisfies/is-browser-satisfies-requirements.d.ts +4 -0
  51. package/lib/satisfies/is-browser-satisfies-requirements.es.js +74 -0
  52. package/lib/satisfies/is-browser-satisfies-requirements.js +84 -0
  53. package/lib/satisfies/types.d.ts +6 -0
  54. package/lib/satisfies/utils/normalizeBrowserslist.d.ts +3 -0
  55. package/lib/satisfies/utils/normalizeBrowserslist.es.js +42 -0
  56. package/lib/satisfies/utils/normalizeBrowserslist.js +50 -0
  57. package/lib/types.d.ts +4 -0
  58. package/lib/utils/getBrowserEngine.d.ts +9 -0
  59. package/lib/{utils.es.js → utils/getBrowserEngine.es.js} +14 -18
  60. package/lib/{utils.js → utils/getBrowserEngine.js} +13 -18
  61. package/lib/utils/getMobileOs.d.ts +9 -0
  62. package/lib/utils/getMobileOs.es.js +24 -0
  63. package/lib/utils/getMobileOs.js +28 -0
  64. package/package.json +3 -3
  65. package/lib/client-hints.d.ts +0 -33
  66. package/lib/client-hints.es.js +0 -177
  67. package/lib/client-hints.js +0 -182
  68. package/lib/satisfies.d.ts +0 -8
  69. package/lib/satisfies.es.js +0 -107
  70. package/lib/satisfies.js +0 -118
  71. package/lib/userAgent.d.ts +0 -3
  72. package/lib/userAgent.es.js +0 -48
  73. package/lib/userAgent.js +0 -58
  74. package/lib/utils.d.ts +0 -3
  75. /package/lib/{isSameSiteNoneCompatible.d.ts → parse-user-agent-header/utils/is-same-site-none-compatible/isSameSiteNoneCompatible.d.ts} +0 -0
  76. /package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/bots.txt +0 -0
  77. /package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/not_supported_modern.txt +0 -0
  78. /package/lib/{__tests__ → satisfies/__tests__}/uaDatasets/unknown.txt +0 -0
@@ -1,182 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var utils = require('./utils.js');
6
-
7
- const KNOWN_VENDORS = new Set(['Opera', 'Google Chrome', 'Microsoft Edge', 'Firefox', 'Safari']);
8
- const KNOWN_ENGINES = new Set(['Chromium']);
9
- const BACKWARD_COMPATIBILITY_BROWSER_NAME = {
10
- 'Google Chrome': 'chrome',
11
- 'Microsoft Edge': 'edge',
12
- };
13
- const BACKWARD_COMPATIBILITY_ENGINE_NAME = {
14
- Chromium: 'Blink',
15
- };
16
- const BACKWARD_COMPATIBILITY_ARCH = {
17
- x86: 'amd64',
18
- };
19
- const BACKWARD_COMPATIBILITY_OS_NAME = {
20
- macOS: 'Mac OS',
21
- };
22
- const parseQuotedString = (str) => {
23
- if (!str) {
24
- return str;
25
- }
26
- try {
27
- return JSON.parse(str)?.trim();
28
- }
29
- catch (err) {
30
- return str;
31
- }
32
- };
33
- const parseBrowserFromString = (brandsList) => {
34
- const browser = {
35
- name: undefined,
36
- version: undefined,
37
- major: undefined,
38
- browserEngine: '',
39
- };
40
- const engine = {
41
- name: undefined,
42
- version: undefined,
43
- };
44
- brandsList.split(',').forEach((entry) => {
45
- const [name, version] = entry.split(/;\s*v=/).map(parseQuotedString);
46
- if (name && KNOWN_VENDORS.has(name)) {
47
- browser.name = BACKWARD_COMPATIBILITY_BROWSER_NAME[name] ?? name.toLowerCase();
48
- browser.version = version;
49
- browser.major = version;
50
- }
51
- if (name && KNOWN_ENGINES.has(name)) {
52
- engine.name = BACKWARD_COMPATIBILITY_ENGINE_NAME[name] ?? name.toLowerCase();
53
- engine.version = version;
54
- }
55
- });
56
- if (!browser.name && engine.name) {
57
- browser.name = engine.name;
58
- browser.version = engine.version;
59
- }
60
- browser.browserEngine = utils.getBrowserEngine(browser.name?.toLowerCase(), engine.name?.toLowerCase());
61
- return { browser, engine };
62
- };
63
- const parseBrowserFromUserAgentData = (brands) => {
64
- const browser = {
65
- name: undefined,
66
- version: undefined,
67
- major: undefined,
68
- browserEngine: '',
69
- };
70
- const engine = {
71
- name: undefined,
72
- version: undefined,
73
- };
74
- brands.forEach(({ brand, version }) => {
75
- if (KNOWN_VENDORS.has(brand)) {
76
- browser.name = BACKWARD_COMPATIBILITY_BROWSER_NAME[brand] ?? brand.toLowerCase();
77
- browser.version = version;
78
- [browser.major] = version.split('.');
79
- }
80
- if (KNOWN_ENGINES.has(brand)) {
81
- engine.name = BACKWARD_COMPATIBILITY_ENGINE_NAME[brand] ?? brand.toLowerCase();
82
- engine.version = version;
83
- }
84
- });
85
- if (!browser.name && engine.name) {
86
- browser.name = engine.name;
87
- browser.version = engine.version;
88
- }
89
- browser.browserEngine = utils.getBrowserEngine(browser.name?.toLowerCase(), engine.name?.toLowerCase());
90
- return { browser, engine };
91
- };
92
- const getBackwardCompatibleOsName = (payload) => {
93
- if (payload === undefined) {
94
- return undefined;
95
- }
96
- return BACKWARD_COMPATIBILITY_OS_NAME[payload] ?? payload;
97
- };
98
- /**
99
- *
100
- * @description
101
- *
102
- * Some of the data are available only when additional headers for client-hints were sent from server:
103
- * - full browser version (only major version is available by default)
104
- * - OS version
105
- * - CPU architecture
106
- * - device model
107
- *
108
- * To be able to use data you should first provide header `Accept-CH` with the list of headers that client should send.
109
- *
110
- * @param headers
111
- * @returns
112
- */
113
- const parseClientHintsHeaders = (headers) => {
114
- const { browser, engine } = parseBrowserFromString(headers['sec-ch-ua-full-version-list'] || headers['sec-ch-ua']);
115
- const osName = parseQuotedString(headers['sec-ch-ua-platform']);
116
- const mobileOS = utils.getMobileOs(osName);
117
- const architecture = parseQuotedString(headers['sec-ch-ua-arch']);
118
- return {
119
- browser,
120
- engine,
121
- os: {
122
- name: getBackwardCompatibleOsName(osName),
123
- version: parseQuotedString(headers['sec-ch-ua-platform-version']),
124
- },
125
- cpu: {
126
- architecture: architecture
127
- ? (BACKWARD_COMPATIBILITY_ARCH[architecture] ?? architecture)
128
- : architecture,
129
- },
130
- mobileOS,
131
- device: {
132
- model: parseQuotedString(headers['sec-ch-ua-model']),
133
- type: headers['sec-ch-ua-mobile'] === '?1' ? 'mobile' : 'desktop',
134
- vendor: undefined,
135
- },
136
- // basically all the browsers with client-hints support
137
- // also compatible with SameSite=None
138
- sameSiteNoneCompatible: true,
139
- };
140
- };
141
- /**
142
- *
143
- * @description
144
- * Some of the data will be available if `UADataValues` were gotten from
145
- * `getHighEntropyValues` async method, but it's not suitable for all cases.
146
- *
147
- * @see https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API
148
- * @see https://wicg.github.io/ua-client-hints/#http-ua-hints
149
- *
150
- * @param payload
151
- *
152
- * @example
153
- * const clientHints = parseClientHintsUserAgentData(window.navigator.userAgentData)
154
- */
155
- const parseClientHintsUserAgentData = (payload) => {
156
- const { browser, engine } = parseBrowserFromUserAgentData(payload.fullVersionList || payload.brands || []);
157
- return {
158
- browser,
159
- engine,
160
- os: {
161
- name: getBackwardCompatibleOsName(payload.platform),
162
- version: payload.platformVersion,
163
- },
164
- cpu: {
165
- architecture: payload.architecture
166
- ? (BACKWARD_COMPATIBILITY_ARCH[payload.architecture] ?? payload.architecture)
167
- : payload.architecture,
168
- },
169
- mobileOS: utils.getMobileOs(payload.platform),
170
- device: {
171
- model: payload.model,
172
- type: payload.mobile ? 'mobile' : 'desktop',
173
- vendor: undefined,
174
- },
175
- // basically all the browsers with client-hints support
176
- // also compatible with SameSite=None
177
- sameSiteNoneCompatible: true,
178
- };
179
- };
180
-
181
- exports.parseClientHintsHeaders = parseClientHintsHeaders;
182
- exports.parseClientHintsUserAgentData = parseClientHintsUserAgentData;
@@ -1,8 +0,0 @@
1
- import type { UserAgent } from './types';
2
- interface SatisfiesOptions {
3
- env?: 'modern' | 'defaults';
4
- forceMinimumUnknownVersions?: boolean;
5
- }
6
- export declare const satisfies: (userAgent: UserAgent | string, browserslistConfig?: string[], { env, forceMinimumUnknownVersions }?: SatisfiesOptions) => boolean | null;
7
- export {};
8
- //# sourceMappingURL=satisfies.d.ts.map
@@ -1,107 +0,0 @@
1
- import isString from '@tinkoff/utils/is/string';
2
- import browserslist from 'browserslist';
3
- import browserslistTinkoffConfig from '@tinkoff/browserslist-config';
4
- import browserslistFileConfig from '@tramvai/cli/lib/external/browserslist-normalized-file-config';
5
- import { parseUserAgentHeader } from './userAgent.es.js';
6
- import { CHROMIUM_BASED_BROWSERS, BROWSERS_LIST_MAP } from './constants.es.js';
7
-
8
- const deviceTypes = {
9
- mobile: 'mobile',
10
- tablet: 'mobile',
11
- desktop: 'desktop',
12
- };
13
- const browsersWithoutCompleteStat = {
14
- Samsung: 'samsung',
15
- Android: 'android',
16
- UCAndroid: 'and_uc',
17
- OperaMobile: 'op_mob',
18
- };
19
- const normalizedBrowserslist = (query) => {
20
- const resolved = browserslist(query, {
21
- // ставим в true, чтобы browserslist возвращал полный список для мобильных браузеров
22
- // т.к. по умолчанию, из-за того что `Can I use` хранит только последнюю версию мобильных браузеров
23
- // то и browserslist возвращал только самую последнюю версию для мобилок, а так он будет маппить
24
- // соответствие к десктопной версии
25
- mobileToDesktop: true,
26
- })
27
- // так как ie убрали из конфига @tinkoff/browserslist-config, то для того чтобы отсечь ie
28
- // добавляем фиктивную версию, чтобы вся функция вернула false для любой версии ie
29
- // причем если обычная версия ie была задана в кастомном конфиге или в конфиге переданном как аргумент
30
- // эта фиктивная версия ни на что не повлияет и будет использована кастомная конфигурация
31
- .concat(['ie 999']);
32
- const result = {};
33
- for (let i = 0; i < resolved.length; i++) {
34
- const [name, version] = resolved[i].split(' ');
35
- if (BROWSERS_LIST_MAP[name]) {
36
- const { type: mapType, name: mapName } = BROWSERS_LIST_MAP[name];
37
- const mapVersion = parseFloat(version);
38
- if (result[mapName]) {
39
- if (!result[mapName][mapType] || result[mapName][mapType] > mapVersion) {
40
- result[mapName][mapType] = mapVersion;
41
- }
42
- }
43
- else {
44
- result[mapName] = {
45
- [mapType]: mapVersion,
46
- };
47
- }
48
- }
49
- }
50
- return result;
51
- };
52
- const satisfies = (userAgent, browserslistConfig, { env = 'defaults', forceMinimumUnknownVersions = false } = {}) => {
53
- const ua = isString(userAgent) ? parseUserAgentHeader(userAgent) : userAgent;
54
- const { engine: { name: engineName = '', version: engineVersion }, device: { type = '' } = {}, } = ua;
55
- let { browser: { name: browserName = '', version: browserVersion = '' } = {} } = ua;
56
- // Chromium based браузеры (yandex, samsung, opera, vivaldi, edge) указывают версию движка как `Chrome/*`.
57
- // А версия движка (blink) матчится в версию chromium один к одному
58
- // https://github.com/faisalman/ua-parser-js/pull/390
59
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#Rendering_engine
60
- if (engineName === 'chromium' ||
61
- (engineName.toLowerCase() === 'blink' &&
62
- CHROMIUM_BASED_BROWSERS.indexOf(browserName.toLowerCase()) !== -1)) {
63
- browserName = 'chrome';
64
- browserVersion = engineVersion || '';
65
- }
66
- // parseFloat - заберет мажорную + минорную версии, остальное отбросит
67
- const checkVersion = parseFloat(browserVersion);
68
- const deviceType = deviceTypes[type] || type || deviceTypes.desktop; // по умолчанию считаем устройство десктопом
69
- if (!browserName) {
70
- return null;
71
- }
72
- const targets = browserslistConfig ?? browserslistFileConfig[env] ?? browserslistTinkoffConfig[env];
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
- }
95
- let hasEntry = false;
96
- if (browserName in browsers) {
97
- const browserInfo = browsers[browserName];
98
- const browserInfoVersion = browserInfo.any ?? browserInfo[deviceType];
99
- hasEntry = !!browserInfoVersion;
100
- if (checkVersion >= browserInfoVersion) {
101
- return true;
102
- }
103
- }
104
- return hasEntry ? false : null; // null означает что не нашли соответствия браузеру в списке browserslist
105
- };
106
-
107
- export { satisfies };
package/lib/satisfies.js DELETED
@@ -1,118 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var isString = require('@tinkoff/utils/is/string');
6
- var browserslist = require('browserslist');
7
- var browserslistTinkoffConfig = require('@tinkoff/browserslist-config');
8
- var browserslistFileConfig = require('@tramvai/cli/lib/external/browserslist-normalized-file-config');
9
- var userAgent = require('./userAgent.js');
10
- var constants = require('./constants.js');
11
-
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
-
14
- var isString__default = /*#__PURE__*/_interopDefaultLegacy(isString);
15
- var browserslist__default = /*#__PURE__*/_interopDefaultLegacy(browserslist);
16
- var browserslistTinkoffConfig__default = /*#__PURE__*/_interopDefaultLegacy(browserslistTinkoffConfig);
17
- var browserslistFileConfig__default = /*#__PURE__*/_interopDefaultLegacy(browserslistFileConfig);
18
-
19
- const deviceTypes = {
20
- mobile: 'mobile',
21
- tablet: 'mobile',
22
- desktop: 'desktop',
23
- };
24
- const browsersWithoutCompleteStat = {
25
- Samsung: 'samsung',
26
- Android: 'android',
27
- UCAndroid: 'and_uc',
28
- OperaMobile: 'op_mob',
29
- };
30
- const normalizedBrowserslist = (query) => {
31
- const resolved = browserslist__default["default"](query, {
32
- // ставим в true, чтобы browserslist возвращал полный список для мобильных браузеров
33
- // т.к. по умолчанию, из-за того что `Can I use` хранит только последнюю версию мобильных браузеров
34
- // то и browserslist возвращал только самую последнюю версию для мобилок, а так он будет маппить
35
- // соответствие к десктопной версии
36
- mobileToDesktop: true,
37
- })
38
- // так как ie убрали из конфига @tinkoff/browserslist-config, то для того чтобы отсечь ie
39
- // добавляем фиктивную версию, чтобы вся функция вернула false для любой версии ie
40
- // причем если обычная версия ie была задана в кастомном конфиге или в конфиге переданном как аргумент
41
- // эта фиктивная версия ни на что не повлияет и будет использована кастомная конфигурация
42
- .concat(['ie 999']);
43
- const result = {};
44
- for (let i = 0; i < resolved.length; i++) {
45
- const [name, version] = resolved[i].split(' ');
46
- if (constants.BROWSERS_LIST_MAP[name]) {
47
- const { type: mapType, name: mapName } = constants.BROWSERS_LIST_MAP[name];
48
- const mapVersion = parseFloat(version);
49
- if (result[mapName]) {
50
- if (!result[mapName][mapType] || result[mapName][mapType] > mapVersion) {
51
- result[mapName][mapType] = mapVersion;
52
- }
53
- }
54
- else {
55
- result[mapName] = {
56
- [mapType]: mapVersion,
57
- };
58
- }
59
- }
60
- }
61
- return result;
62
- };
63
- const satisfies = (userAgent$1, browserslistConfig, { env = 'defaults', forceMinimumUnknownVersions = false } = {}) => {
64
- const ua = isString__default["default"](userAgent$1) ? userAgent.parseUserAgentHeader(userAgent$1) : userAgent$1;
65
- const { engine: { name: engineName = '', version: engineVersion }, device: { type = '' } = {}, } = ua;
66
- let { browser: { name: browserName = '', version: browserVersion = '' } = {} } = ua;
67
- // Chromium based браузеры (yandex, samsung, opera, vivaldi, edge) указывают версию движка как `Chrome/*`.
68
- // А версия движка (blink) матчится в версию chromium один к одному
69
- // https://github.com/faisalman/ua-parser-js/pull/390
70
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#Rendering_engine
71
- if (engineName === 'chromium' ||
72
- (engineName.toLowerCase() === 'blink' &&
73
- constants.CHROMIUM_BASED_BROWSERS.indexOf(browserName.toLowerCase()) !== -1)) {
74
- browserName = 'chrome';
75
- browserVersion = engineVersion || '';
76
- }
77
- // parseFloat - заберет мажорную + минорную версии, остальное отбросит
78
- const checkVersion = parseFloat(browserVersion);
79
- const deviceType = deviceTypes[type] || type || deviceTypes.desktop; // по умолчанию считаем устройство десктопом
80
- if (!browserName) {
81
- return null;
82
- }
83
- const targets = browserslistConfig ?? browserslistFileConfig__default["default"][env] ?? browserslistTinkoffConfig__default["default"][env];
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
- }
106
- let hasEntry = false;
107
- if (browserName in browsers) {
108
- const browserInfo = browsers[browserName];
109
- const browserInfoVersion = browserInfo.any ?? browserInfo[deviceType];
110
- hasEntry = !!browserInfoVersion;
111
- if (checkVersion >= browserInfoVersion) {
112
- return true;
113
- }
114
- }
115
- return hasEntry ? false : null; // null означает что не нашли соответствия браузеру в списке browserslist
116
- };
117
-
118
- exports.satisfies = satisfies;
@@ -1,3 +0,0 @@
1
- import type { UserAgent } from './types';
2
- export declare const parseUserAgentHeader: (userAgent: string) => UserAgent;
3
- //# sourceMappingURL=userAgent.d.ts.map
@@ -1,48 +0,0 @@
1
- import propOr from '@tinkoff/utils/object/propOr';
2
- import compose from '@tinkoff/utils/function/compose';
3
- import toLower from '@tinkoff/utils/string/toLower';
4
- import { UAParser } from 'ua-parser-js';
5
- import { isSameSiteNoneCompatible } from './isSameSiteNoneCompatible.es.js';
6
- import { getMobileOs, getBrowserEngine } from './utils.es.js';
7
-
8
- const toLowerName = compose(toLower, propOr('name', ''));
9
- const uaParserExtensions = [
10
- // добавляем отдельные регекспы для ботов гугла и т.п.
11
- // это позволит для них получить отдельное имя браузера и обработать специальным образом
12
- // https://github.com/faisalman/ua-parser-js/issues/227
13
- // google page preloading agent
14
- [/developers\.google\.com\/\+\/web\/snippet/i],
15
- [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']],
16
- // google, bing, msn
17
- [/((?:\S+)bot(?:-[imagevdo]{5})?)\/([\w.]+)/i],
18
- [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']],
19
- // google adsbot под видом обычного браузера
20
- [/[\s;(](adsbot[-\w]*?[\s;)])/i],
21
- [UAParser.BROWSER.NAME, [UAParser.BROWSER.VERSION, 'unknown'], ['type', 'bot']],
22
- // добавляем регекспы для браузеров которые пытаются казаться другими браузерами
23
- // например ua-parser-js Firefox Focus для ios считает как просто Firefox, что ломает проверки на версии
24
- // Firefox for iOS
25
- [/fxios\/([\w\\.-]+)/i],
26
- [[UAParser.BROWSER.NAME, 'Firefox Focus'], UAParser.BROWSER.VERSION],
27
- ];
28
- const parseUserAgentHeader = (userAgent) => {
29
- const { ua, ...result } = new UAParser(userAgent, { browser: uaParserExtensions }).getResult();
30
- const { browser, os, engine } = result;
31
- const browserName = toLowerName(browser);
32
- const engineName = toLowerName(engine);
33
- if (browserName === 'opera mobi') {
34
- result.device.type = 'mobile';
35
- }
36
- return {
37
- ...result,
38
- mobileOS: getMobileOs(os.name),
39
- sameSiteNoneCompatible: isSameSiteNoneCompatible(result),
40
- browser: {
41
- ...browser,
42
- browserEngine: getBrowserEngine(browserName, engineName),
43
- name: browserName,
44
- },
45
- };
46
- };
47
-
48
- export { parseUserAgentHeader };
package/lib/userAgent.js DELETED
@@ -1,58 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var propOr = require('@tinkoff/utils/object/propOr');
6
- var compose = require('@tinkoff/utils/function/compose');
7
- var toLower = require('@tinkoff/utils/string/toLower');
8
- var uaParserJs = require('ua-parser-js');
9
- var isSameSiteNoneCompatible = require('./isSameSiteNoneCompatible.js');
10
- var utils = require('./utils.js');
11
-
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
-
14
- var propOr__default = /*#__PURE__*/_interopDefaultLegacy(propOr);
15
- var compose__default = /*#__PURE__*/_interopDefaultLegacy(compose);
16
- var toLower__default = /*#__PURE__*/_interopDefaultLegacy(toLower);
17
-
18
- const toLowerName = compose__default["default"](toLower__default["default"], propOr__default["default"]('name', ''));
19
- const uaParserExtensions = [
20
- // добавляем отдельные регекспы для ботов гугла и т.п.
21
- // это позволит для них получить отдельное имя браузера и обработать специальным образом
22
- // https://github.com/faisalman/ua-parser-js/issues/227
23
- // google page preloading agent
24
- [/developers\.google\.com\/\+\/web\/snippet/i],
25
- [uaParserJs.UAParser.BROWSER.NAME, uaParserJs.UAParser.BROWSER.VERSION, ['type', 'bot']],
26
- // google, bing, msn
27
- [/((?:\S+)bot(?:-[imagevdo]{5})?)\/([\w.]+)/i],
28
- [uaParserJs.UAParser.BROWSER.NAME, uaParserJs.UAParser.BROWSER.VERSION, ['type', 'bot']],
29
- // google adsbot под видом обычного браузера
30
- [/[\s;(](adsbot[-\w]*?[\s;)])/i],
31
- [uaParserJs.UAParser.BROWSER.NAME, [uaParserJs.UAParser.BROWSER.VERSION, 'unknown'], ['type', 'bot']],
32
- // добавляем регекспы для браузеров которые пытаются казаться другими браузерами
33
- // например ua-parser-js Firefox Focus для ios считает как просто Firefox, что ломает проверки на версии
34
- // Firefox for iOS
35
- [/fxios\/([\w\\.-]+)/i],
36
- [[uaParserJs.UAParser.BROWSER.NAME, 'Firefox Focus'], uaParserJs.UAParser.BROWSER.VERSION],
37
- ];
38
- const parseUserAgentHeader = (userAgent) => {
39
- const { ua, ...result } = new uaParserJs.UAParser(userAgent, { browser: uaParserExtensions }).getResult();
40
- const { browser, os, engine } = result;
41
- const browserName = toLowerName(browser);
42
- const engineName = toLowerName(engine);
43
- if (browserName === 'opera mobi') {
44
- result.device.type = 'mobile';
45
- }
46
- return {
47
- ...result,
48
- mobileOS: utils.getMobileOs(os.name),
49
- sameSiteNoneCompatible: isSameSiteNoneCompatible.isSameSiteNoneCompatible(result),
50
- browser: {
51
- ...browser,
52
- browserEngine: utils.getBrowserEngine(browserName, engineName),
53
- name: browserName,
54
- },
55
- };
56
- };
57
-
58
- exports.parseUserAgentHeader = parseUserAgentHeader;
package/lib/utils.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export declare const getMobileOs: (osName?: string) => string | undefined;
2
- export declare const getBrowserEngine: (browserName?: string, engineName?: string) => string;
3
- //# sourceMappingURL=utils.d.ts.map