ua-parser-js 2.0.6 → 2.0.9

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.
@@ -1,5 +1,5 @@
1
1
  ///////////////////////////////////////////////
2
- /* Helpers for UAParser.js v2.0.6
2
+ /* Helpers for UAParser.js v2.0.9
3
3
  https://github.com/faisalman/ua-parser-js
4
4
  Author: Faisal Salman <f@faisalman.com>
5
5
  AGPLv3 License */
@@ -7,170 +7,95 @@
7
7
 
8
8
  /*jshint esversion: 6 */
9
9
 
10
- const { UAParser } = require('../main/ua-parser');
11
- const { CPUArch, OSName, EngineName, Extension, BrowserType } = require('../enums/ua-parser-enums');
12
- const { Bots, Crawlers } = require('../extensions/ua-parser-extensions');
13
- const { isFromEU } = require('detect-europe-js');
10
+ const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection');
11
+ const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection');
12
+ const { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection');
13
+ const { isFromEU: _isFromEU } = require('../browser-detection/browser-detection');
14
14
  const { isFrozenUA } = require('ua-is-frozen');
15
- const { isStandalonePWA } = require('is-standalone-pwa');
16
- const { Crawler } = Extension.BrowserName;
17
15
 
18
- const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
19
-
20
- const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
16
+ /**
17
+ * @deprecated Moved to `device-detection` submodule
18
+ */
19
+ const getDeviceVendor = _getDeviceVendor;
20
+
21
+ /**
22
+ * @deprecated Moved to `device-detection` submodule
23
+ */
24
+ const isAppleSilicon = _isAppleSilicon;
25
+
26
+ /**
27
+ * @deprecated Moved to `bot-detection` submodule
28
+ */
29
+ const isAIBot = isAICrawler;
30
+
31
+ /**
32
+ * @deprecated Moved to `bot-detection` submodule
33
+ */
34
+ const isBot = _isBot;
35
+
36
+ /**
37
+ * @deprecated Moved to `browser-detection` submodule
38
+ */
39
+ const isChromeFamily = _isChromeFamily;
40
+
41
+ /**
42
+ * @deprecated Moved to `browser-detection` submodule
43
+ */
44
+ const isElectron = () => _isElectron;
45
+
46
+ /**
47
+ * @deprecated Moved to `browser-detection` submodule
48
+ */
49
+ const isFromEU = _isFromEU;
50
+
51
+ /**
52
+ * @deprecated Moved to `browser-detection` submodule
53
+ */
54
+ const isStandalonePWA = _isStandalonePWA;
55
+
56
+ /**
57
+ * Translates a raw Outlook User-Agent name/version into a
58
+ * Developer-friendly Edition (e.g., "Outlook 2019 (Modern Word)").
59
+ */
60
+ const getOutlookEdition = (name, version) => {
61
+ if (!name || !version) return name;
62
+ const cleanName = name.toLowerCase().replace(/microsoft\s+/, '');
63
+
64
+ // 1. Handle Mac Separately (Different Rendering Engine)
65
+ if (cleanName === 'macoutlook') {
66
+ const major = parseInt(version.split('.')[0], 10);
67
+ if (major >= 16) return "Outlook for Mac (Modern)";
68
+ return "Outlook for Mac (Legacy)";
69
+ }
21
70
 
22
- const isAppleSilicon = (resultOrUA) => {
23
- const res = toResult(resultOrUA);
24
- if (res.os.is(OSName.MACOS)) {
25
- if (res.cpu.is(CPUArch.ARM)) {
26
- return true;
27
- }
28
- if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
29
- try {
30
- const canvas = document.createElement('canvas');
31
- const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
32
- const debug = webgl.getExtension('WEBGL_debug_renderer_info');
33
- const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
34
- if (renderer.match(/apple m\d/i)) {
35
- return true;
36
- }
37
- } catch {
38
- return false;
71
+ // 2. Handle Windows Outlook
72
+ if (cleanName === 'outlook') {
73
+ const parts = version.split('.').map(Number);
74
+ const major = parts[0];
75
+ const build = parts[2] || 0; // Build number is usually the 3rd part
76
+
77
+ // Pre-2016 Versions (Clear Major Version mapping)
78
+ if (major === 15) return "Outlook 2013";
79
+ if (major === 14) return "Outlook 2010";
80
+ if (major === 12) return "Outlook 2007";
81
+ if (major < 12) return "Outlook (Legacy)";
82
+
83
+ // The Version 16.0 Confusion
84
+ if (major === 16) {
85
+ // Build < 10000 = MSI (Volume License 2016/2019)
86
+ // These render poorly (No SVG, older bugs)
87
+ if (build < 10000) {
88
+ return "Outlook 2016 (MSI / Volume License)";
39
89
  }
90
+ // Build >= 10000 = Click-to-Run (Retail 2016 / 2019 / 365)
91
+ // These render well (SVG support, modern CSS)
92
+ return "Outlook 365 / 2019+ (Modern)";
40
93
  }
41
94
  }
42
- return false;
43
- }
44
-
45
- const isAIBot = (resultOrUA) => [
46
-
47
- // AI2
48
- Crawler.AI2_BOT,
49
-
50
- // Amazon
51
- Crawler.AMAZON_BOT,
52
-
53
- // Anthropic
54
- Crawler.ANTHROPIC_AI,
55
- Crawler.ANTHROPIC_CLAUDE_BOT,
56
- Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
57
- Crawler.ANTHROPIC_CLAUDE_WEB,
58
-
59
- // Apple
60
- Crawler.APPLE_BOT,
61
- Crawler.APPLE_BOT_EXTENDED,
62
-
63
- // Brave
64
- Crawler.BRAVE_BOT,
65
-
66
- // ByteDance
67
- Crawler.BYTEDANCE_BYTESPIDER,
68
- Crawler.BYTEDANCE_TIKTOKSPIDER,
69
-
70
- // Cohere
71
- Crawler.COHERE_TRAINING_DATA_CRAWLER,
72
-
73
- // Common Crawl
74
- Crawler.COMMON_CRAWL_CCBOT,
75
-
76
- // Coveo
77
- Crawler.COVEO_BOT,
78
-
79
- // DataForSeo
80
- Crawler.DATAFORSEO_BOT,
81
-
82
- // DeepSeek
83
- Crawler.DEEPSEEK_BOT,
84
-
85
- // Diffbot
86
- Crawler.DIFFBOT,
87
-
88
- // Google
89
- Crawler.GOOGLE_EXTENDED,
90
- Crawler.GOOGLE_OTHER,
91
- Crawler.GOOGLE_OTHER_IMAGE,
92
- Crawler.GOOGLE_OTHER_VIDEO,
93
- Crawler.GOOGLE_CLOUDVERTEXBOT,
94
-
95
- // Hive AI
96
- Crawler.HIVE_IMAGESIFTBOT,
97
-
98
- // Huawei
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,
110
-
111
- // Meta
112
- Crawler.META_FACEBOOKBOT,
113
- Crawler.META_EXTERNALAGENT,
114
-
115
- // OpenAI
116
- Crawler.OPENAI_GPTBOT,
117
- Crawler.OPENAI_SEARCH_BOT,
118
-
119
- // Perplexity
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,
130
-
131
- // Semrush
132
- Crawler.SEMRUSH_BOT_CONTENTSHAKE,
133
-
134
- // Timpi
135
- Crawler.TIMPI_BOT,
136
-
137
- // Together AI
138
- Crawler.TOGETHER_BOT,
139
-
140
- // Velen.io
141
- Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
142
-
143
- // Vercel
144
- Crawler.VERCEL_V0BOT,
145
-
146
- // Webz.io
147
- Crawler.WEBZIO_OMGILI,
148
- Crawler.WEBZIO_OMGILI_BOT,
149
- Crawler.WEBZIO_EXTENDED,
150
-
151
- // X
152
- Crawler.XAI_BOT,
153
-
154
- // You.com
155
- Crawler.YOU_BOT,
156
-
157
- // Zhipu AI
158
- Crawler.ZHIPU_CHATGLM_SPIDER
159
- ]
160
- .map((s) => s.toLowerCase())
161
- .includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase());
162
-
163
- const isBot = (resultOrUA) => [
164
- BrowserType.CLI,
165
- BrowserType.CRAWLER,
166
- BrowserType.FETCHER,
167
- BrowserType.LIBRARY
168
- ].includes(toResult(resultOrUA, Bots).browser.type);
169
-
170
- const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
171
95
 
172
- const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
173
- / electron\//i.test(navigator?.userAgent)); // browser
96
+ // 3. Fallback for 'Outlook Express' or 'New Outlook' (Browser)
97
+ return name;
98
+ };
174
99
 
175
100
  module.exports = {
176
101
  getDeviceVendor,
@@ -181,5 +106,6 @@ module.exports = {
181
106
  isElectron,
182
107
  isFromEU,
183
108
  isFrozenUA,
184
- isStandalonePWA
109
+ isStandalonePWA,
110
+ getOutlookEdition
185
111
  }
@@ -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
6
+ /* Helpers for UAParser.js v2.0.9
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -11,170 +11,95 @@
11
11
 
12
12
  /*jshint esversion: 6 */
13
13
 
14
- import { UAParser } from '../main/ua-parser.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
- import { isFromEU } from 'detect-europe-js';
14
+ import { getDeviceVendor as _getDeviceVendor, isAppleSilicon as _isAppleSilicon } from '../device-detection/device-detection.mjs';
15
+ import { isBot as _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs';
16
+ import { isChromeFamily as _isChromeFamily, isElectron as _isElectron, isStandalonePWA as _isStandalonePWA } from '../browser-detection/browser-detection.mjs';
17
+ import { isFromEU as _isFromEU } from '../browser-detection/browser-detection.mjs';
18
18
  import { isFrozenUA } from 'ua-is-frozen';
19
- import { isStandalonePWA } from 'is-standalone-pwa';
20
- const { Crawler } = Extension.BrowserName;
21
19
 
22
- const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
23
-
24
- const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
20
+ /**
21
+ * @deprecated Moved to `device-detection` submodule
22
+ */
23
+ const getDeviceVendor = _getDeviceVendor;
24
+
25
+ /**
26
+ * @deprecated Moved to `device-detection` submodule
27
+ */
28
+ const isAppleSilicon = _isAppleSilicon;
29
+
30
+ /**
31
+ * @deprecated Moved to `bot-detection` submodule
32
+ */
33
+ const isAIBot = isAICrawler;
34
+
35
+ /**
36
+ * @deprecated Moved to `bot-detection` submodule
37
+ */
38
+ const isBot = _isBot;
39
+
40
+ /**
41
+ * @deprecated Moved to `browser-detection` submodule
42
+ */
43
+ const isChromeFamily = _isChromeFamily;
44
+
45
+ /**
46
+ * @deprecated Moved to `browser-detection` submodule
47
+ */
48
+ const isElectron = () => _isElectron;
49
+
50
+ /**
51
+ * @deprecated Moved to `browser-detection` submodule
52
+ */
53
+ const isFromEU = _isFromEU;
54
+
55
+ /**
56
+ * @deprecated Moved to `browser-detection` submodule
57
+ */
58
+ const isStandalonePWA = _isStandalonePWA;
59
+
60
+ /**
61
+ * Translates a raw Outlook User-Agent name/version into a
62
+ * Developer-friendly Edition (e.g., "Outlook 2019 (Modern Word)").
63
+ */
64
+ const getOutlookEdition = (name, version) => {
65
+ if (!name || !version) return name;
66
+ const cleanName = name.toLowerCase().replace(/microsoft\s+/, '');
67
+
68
+ // 1. Handle Mac Separately (Different Rendering Engine)
69
+ if (cleanName === 'macoutlook') {
70
+ const major = parseInt(version.split('.')[0], 10);
71
+ if (major >= 16) return "Outlook for Mac (Modern)";
72
+ return "Outlook for Mac (Legacy)";
73
+ }
25
74
 
26
- const isAppleSilicon = (resultOrUA) => {
27
- const res = toResult(resultOrUA);
28
- if (res.os.is(OSName.MACOS)) {
29
- if (res.cpu.is(CPUArch.ARM)) {
30
- return true;
31
- }
32
- if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
33
- try {
34
- const canvas = document.createElement('canvas');
35
- const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
36
- const debug = webgl.getExtension('WEBGL_debug_renderer_info');
37
- const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
38
- if (renderer.match(/apple m\d/i)) {
39
- return true;
40
- }
41
- } catch {
42
- return false;
75
+ // 2. Handle Windows Outlook
76
+ if (cleanName === 'outlook') {
77
+ const parts = version.split('.').map(Number);
78
+ const major = parts[0];
79
+ const build = parts[2] || 0; // Build number is usually the 3rd part
80
+
81
+ // Pre-2016 Versions (Clear Major Version mapping)
82
+ if (major === 15) return "Outlook 2013";
83
+ if (major === 14) return "Outlook 2010";
84
+ if (major === 12) return "Outlook 2007";
85
+ if (major < 12) return "Outlook (Legacy)";
86
+
87
+ // The Version 16.0 Confusion
88
+ if (major === 16) {
89
+ // Build < 10000 = MSI (Volume License 2016/2019)
90
+ // These render poorly (No SVG, older bugs)
91
+ if (build < 10000) {
92
+ return "Outlook 2016 (MSI / Volume License)";
43
93
  }
94
+ // Build >= 10000 = Click-to-Run (Retail 2016 / 2019 / 365)
95
+ // These render well (SVG support, modern CSS)
96
+ return "Outlook 365 / 2019+ (Modern)";
44
97
  }
45
98
  }
46
- return false;
47
- }
48
-
49
- const isAIBot = (resultOrUA) => [
50
-
51
- // AI2
52
- Crawler.AI2_BOT,
53
-
54
- // Amazon
55
- Crawler.AMAZON_BOT,
56
-
57
- // Anthropic
58
- Crawler.ANTHROPIC_AI,
59
- Crawler.ANTHROPIC_CLAUDE_BOT,
60
- Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
61
- Crawler.ANTHROPIC_CLAUDE_WEB,
62
-
63
- // Apple
64
- Crawler.APPLE_BOT,
65
- Crawler.APPLE_BOT_EXTENDED,
66
-
67
- // Brave
68
- Crawler.BRAVE_BOT,
69
-
70
- // ByteDance
71
- Crawler.BYTEDANCE_BYTESPIDER,
72
- Crawler.BYTEDANCE_TIKTOKSPIDER,
73
-
74
- // Cohere
75
- Crawler.COHERE_TRAINING_DATA_CRAWLER,
76
-
77
- // Common Crawl
78
- Crawler.COMMON_CRAWL_CCBOT,
79
-
80
- // Coveo
81
- Crawler.COVEO_BOT,
82
-
83
- // DataForSeo
84
- Crawler.DATAFORSEO_BOT,
85
-
86
- // DeepSeek
87
- Crawler.DEEPSEEK_BOT,
88
-
89
- // Diffbot
90
- Crawler.DIFFBOT,
91
-
92
- // Google
93
- Crawler.GOOGLE_EXTENDED,
94
- Crawler.GOOGLE_OTHER,
95
- Crawler.GOOGLE_OTHER_IMAGE,
96
- Crawler.GOOGLE_OTHER_VIDEO,
97
- Crawler.GOOGLE_CLOUDVERTEXBOT,
98
-
99
- // Hive AI
100
- Crawler.HIVE_IMAGESIFTBOT,
101
-
102
- // Huawei
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,
114
-
115
- // Meta
116
- Crawler.META_FACEBOOKBOT,
117
- Crawler.META_EXTERNALAGENT,
118
-
119
- // OpenAI
120
- Crawler.OPENAI_GPTBOT,
121
- Crawler.OPENAI_SEARCH_BOT,
122
-
123
- // Perplexity
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,
134
-
135
- // Semrush
136
- Crawler.SEMRUSH_BOT_CONTENTSHAKE,
137
-
138
- // Timpi
139
- Crawler.TIMPI_BOT,
140
-
141
- // Together AI
142
- Crawler.TOGETHER_BOT,
143
-
144
- // Velen.io
145
- Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
146
-
147
- // Vercel
148
- Crawler.VERCEL_V0BOT,
149
-
150
- // Webz.io
151
- Crawler.WEBZIO_OMGILI,
152
- Crawler.WEBZIO_OMGILI_BOT,
153
- Crawler.WEBZIO_EXTENDED,
154
-
155
- // X
156
- Crawler.XAI_BOT,
157
-
158
- // You.com
159
- Crawler.YOU_BOT,
160
-
161
- // Zhipu AI
162
- Crawler.ZHIPU_CHATGLM_SPIDER
163
- ]
164
- .map((s) => s.toLowerCase())
165
- .includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase());
166
-
167
- const isBot = (resultOrUA) => [
168
- BrowserType.CLI,
169
- BrowserType.CRAWLER,
170
- BrowserType.FETCHER,
171
- BrowserType.LIBRARY
172
- ].includes(toResult(resultOrUA, Bots).browser.type);
173
-
174
- const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
175
99
 
176
- const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
177
- / electron\//i.test(navigator?.userAgent)); // browser
100
+ // 3. Fallback for 'Outlook Express' or 'New Outlook' (Browser)
101
+ return name;
102
+ };
178
103
 
179
104
  export {
180
105
  getDeviceVendor,
@@ -185,5 +110,6 @@ export {
185
110
  isElectron,
186
111
  isFromEU,
187
112
  isFrozenUA,
188
- isStandalonePWA
113
+ isStandalonePWA,
114
+ getOutlookEdition
189
115
  }
@@ -1,4 +1,4 @@
1
- // Type definitions for UAParser.js v2.0.6
1
+ // Type definitions for UAParser.js v2.0.9
2
2
  // Project: https://github.com/faisalman/ua-parser-js
3
3
  // Definitions by: Faisal Salman <https://github.com/faisalman>
4
4