@tinkoff/user-agent 0.3.303 → 0.3.309

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/index.es.js CHANGED
@@ -7,6 +7,50 @@ import browserslist from 'browserslist';
7
7
  import browserslistTinkoffConfig from '@tinkoff/browserslist-config';
8
8
  import browserslistFileConfig from '@tramvai/cli/lib/external/browserslist-normalized-file-config';
9
9
 
10
+ const processUserAgentAttributeName = (attributeName = '') => attributeName.toLowerCase();
11
+ const splitUserAgentAttributeVersion = (attributeVersion = '-1.-1.-1') => attributeVersion.split('.').map(Number);
12
+ // https://www.chromium.org/updates/same-site/incompatible-clients
13
+ const isSameSiteNoneCompatible = (userAgent) => {
14
+ // На случай неполных данных из ua-parser-js
15
+ try {
16
+ const browserName = processUserAgentAttributeName(userAgent.browser.name);
17
+ const [browserMajor, browserMinor, browserBuild] = splitUserAgentAttributeVersion(userAgent.browser.version);
18
+ const osName = processUserAgentAttributeName(userAgent.os.name);
19
+ const [osMajor, osMinor] = splitUserAgentAttributeVersion(userAgent.os.version);
20
+ const engineName = processUserAgentAttributeName(userAgent.engine.name);
21
+ const [engineMajor] = splitUserAgentAttributeVersion(userAgent.engine.version);
22
+ if (osName === 'ios') {
23
+ // На iOS 12 все браузеры не совместимы с samesite=none
24
+ // При этом полагается, что если на iOS!=12 - любые браузеры совместимы с samesite=none, включая UCBrowser<12.13.2 и 51<=Chrome<=66 (WebKit)
25
+ return osMajor !== 12;
26
+ }
27
+ // Встроенный браузер Mac OS парсится как Webkit
28
+ if (browserName === 'safari' || browserName === 'webkit') {
29
+ return !(osName === 'mac os' && osMajor === 10 && osMinor === 14);
30
+ }
31
+ if (browserName === 'ucbrowser') {
32
+ const [major, minor, build] = [12, 13, 2];
33
+ if (browserMajor !== major) {
34
+ return browserMajor > major;
35
+ }
36
+ if (browserMinor !== minor) {
37
+ return browserMinor > minor;
38
+ }
39
+ return browserBuild >= build;
40
+ }
41
+ if (browserName === 'chrome' || browserName === 'chromium') {
42
+ return browserMajor < 51 || browserMajor > 66;
43
+ }
44
+ if (engineName === 'blink') {
45
+ return engineMajor < 51 || engineMajor > 66;
46
+ }
47
+ return true;
48
+ }
49
+ catch {
50
+ return true;
51
+ }
52
+ };
53
+
10
54
  const toLowerName = compose(toLower, propOr('name', ''));
11
55
  const uaParserExtensions = [
12
56
  // добавляем отдельные регекспы для ботов гугла и т.п.
@@ -30,6 +74,7 @@ const parse = (userAgent) => {
30
74
  const { browser, os, engine } = result;
31
75
  const browserName = toLowerName(browser);
32
76
  const engineName = toLowerName(engine);
77
+ const sameSiteNoneCompatible = isSameSiteNoneCompatible(result);
33
78
  let mobileOS;
34
79
  if (browserName === 'opera mobi') {
35
80
  result.device.type = 'mobile';
@@ -66,6 +111,7 @@ const parse = (userAgent) => {
66
111
  return {
67
112
  ...result,
68
113
  mobileOS,
114
+ sameSiteNoneCompatible,
69
115
  browser: {
70
116
  ...browser,
71
117
  browserEngine,
package/lib/index.js CHANGED
@@ -21,6 +21,50 @@ var browserslist__default = /*#__PURE__*/_interopDefaultLegacy(browserslist);
21
21
  var browserslistTinkoffConfig__default = /*#__PURE__*/_interopDefaultLegacy(browserslistTinkoffConfig);
22
22
  var browserslistFileConfig__default = /*#__PURE__*/_interopDefaultLegacy(browserslistFileConfig);
23
23
 
24
+ const processUserAgentAttributeName = (attributeName = '') => attributeName.toLowerCase();
25
+ const splitUserAgentAttributeVersion = (attributeVersion = '-1.-1.-1') => attributeVersion.split('.').map(Number);
26
+ // https://www.chromium.org/updates/same-site/incompatible-clients
27
+ const isSameSiteNoneCompatible = (userAgent) => {
28
+ // На случай неполных данных из ua-parser-js
29
+ try {
30
+ const browserName = processUserAgentAttributeName(userAgent.browser.name);
31
+ const [browserMajor, browserMinor, browserBuild] = splitUserAgentAttributeVersion(userAgent.browser.version);
32
+ const osName = processUserAgentAttributeName(userAgent.os.name);
33
+ const [osMajor, osMinor] = splitUserAgentAttributeVersion(userAgent.os.version);
34
+ const engineName = processUserAgentAttributeName(userAgent.engine.name);
35
+ const [engineMajor] = splitUserAgentAttributeVersion(userAgent.engine.version);
36
+ if (osName === 'ios') {
37
+ // На iOS 12 все браузеры не совместимы с samesite=none
38
+ // При этом полагается, что если на iOS!=12 - любые браузеры совместимы с samesite=none, включая UCBrowser<12.13.2 и 51<=Chrome<=66 (WebKit)
39
+ return osMajor !== 12;
40
+ }
41
+ // Встроенный браузер Mac OS парсится как Webkit
42
+ if (browserName === 'safari' || browserName === 'webkit') {
43
+ return !(osName === 'mac os' && osMajor === 10 && osMinor === 14);
44
+ }
45
+ if (browserName === 'ucbrowser') {
46
+ const [major, minor, build] = [12, 13, 2];
47
+ if (browserMajor !== major) {
48
+ return browserMajor > major;
49
+ }
50
+ if (browserMinor !== minor) {
51
+ return browserMinor > minor;
52
+ }
53
+ return browserBuild >= build;
54
+ }
55
+ if (browserName === 'chrome' || browserName === 'chromium') {
56
+ return browserMajor < 51 || browserMajor > 66;
57
+ }
58
+ if (engineName === 'blink') {
59
+ return engineMajor < 51 || engineMajor > 66;
60
+ }
61
+ return true;
62
+ }
63
+ catch {
64
+ return true;
65
+ }
66
+ };
67
+
24
68
  const toLowerName = compose__default["default"](toLower__default["default"], propOr__default["default"]('name', ''));
25
69
  const uaParserExtensions = [
26
70
  // добавляем отдельные регекспы для ботов гугла и т.п.
@@ -44,6 +88,7 @@ const parse = (userAgent) => {
44
88
  const { browser, os, engine } = result;
45
89
  const browserName = toLowerName(browser);
46
90
  const engineName = toLowerName(engine);
91
+ const sameSiteNoneCompatible = isSameSiteNoneCompatible(result);
47
92
  let mobileOS;
48
93
  if (browserName === 'opera mobi') {
49
94
  result.device.type = 'mobile';
@@ -80,6 +125,7 @@ const parse = (userAgent) => {
80
125
  return {
81
126
  ...result,
82
127
  mobileOS,
128
+ sameSiteNoneCompatible,
83
129
  browser: {
84
130
  ...browser,
85
131
  browserEngine,
@@ -0,0 +1,2 @@
1
+ import type UAParser from 'ua-parser-js';
2
+ export declare const isSameSiteNoneCompatible: (userAgent: Omit<UAParser.IResult, 'ua'>) => boolean;
package/lib/types.d.ts CHANGED
@@ -5,5 +5,6 @@ export interface UserAgent extends Omit<ParserResult, 'ua'> {
5
5
  browserEngine: string;
6
6
  };
7
7
  mobileOS?: string;
8
+ sameSiteNoneCompatible: boolean;
8
9
  }
9
10
  export type { UAParser };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinkoff/user-agent",
3
- "version": "0.3.303",
3
+ "version": "0.3.309",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.es.js",
@@ -29,7 +29,7 @@
29
29
  "@types/ua-parser-js": "^0.7.33"
30
30
  },
31
31
  "peerDependencies": {
32
- "@tramvai/cli": "1.90.2",
32
+ "@tramvai/cli": "1.91.0",
33
33
  "@types/ua-parser-js": "^0.7.33"
34
34
  },
35
35
  "license": "Apache-2.0"