UNPKG

4.3 kBJavaScriptView Raw
1/**
2 * Browser detection.
3 *
4 * @copyright Realeyes OU. All rights reserved.
5 */
6
7
8import getFirstMatch from './utils/getFirstMatch';
9
10
11/**
12 * Enum for the browsers that we can detect.
13 *
14 * @enum {string}
15 */
16const names = {
17 OPERA: 'Opera',
18 SAMSUNG_BROWSER: 'Samsung Internet for Android',
19 YANDEX_BROWSER: 'Yandex Browser',
20 PUFFIN: 'Puffin',
21 K_MELEON: 'K-Meleon',
22 WINDOWS_PHONE: 'Windows Phone',
23 INTERNET_EXPLORER: 'Internet Explorer',
24 MICROSOFT_EDGE: 'Microsoft Edge',
25 FIREFOX: 'Firefox',
26 AMAZON_SILK: 'Amazon Silk',
27 PHANTOM_JS: 'PhantomJS',
28 CHROMIUM: 'Chromium',
29 CHROME: 'Chrome',
30 ANDROID: 'Android',
31 SAFARI: 'Safari',
32 VIVALDI: 'Vivaldi',
33 UC_BROWSER: 'UC Browser',
34 SEAMONKEY: 'SeaMonkey',
35 IOS_WEBVIEW: 'iOS WebView',
36 UNKNOWN: 'Unknown',
37};
38
39
40/**
41 * List of tests.
42 */
43const tests = [
44 {
45 browserName: names.VIVALDI,
46 testRegex: /vivaldi/i,
47 versionRegex: /(?:vivaldi)[\s/](\d+(\.\d+)?)/i,
48 },
49 {
50 browserName: names.UC_BROWSER,
51 testRegex: /ucbrowser/i,
52 versionRegex: /(?:ucbrowser)[\s/](\d+(\.\d+)?)/i,
53 },
54 {
55 browserName: names.SEAMONKEY,
56 testRegex: /seamonkey/i,
57 versionRegex: /(?:seamonkey)[\s/](\d+(\.\d+)?)/i,
58 },
59 {
60 browserName: names.OPERA,
61 testRegex: /opera|opios|opr\//i,
62 versionRegex: /(?:opera |opios\/|opr\/)(\d+(\.\d+)?)/i,
63 },
64 {
65 browserName: names.SAMSUNG_BROWSER,
66 testRegex: /SamsungBrowser/i,
67 versionRegex: /(?:SamsungBrowser)[\s/](\d+(\.\d+)?)/i,
68 },
69 {
70 browserName: names.YANDEX_BROWSER,
71 testRegex: /yabrowser/i,
72 versionRegex: /(?:yabrowser)[\s/](\d+(\.\d+)?)/i,
73 },
74 {
75 browserName: names.PUFFIN,
76 testRegex: /puffin/i,
77 versionRegex: /(?:puffin)[\s/](\d+(?:\.\d+)?)/i,
78 },
79 {
80 browserName: names.K_MELEON,
81 testRegex: /k-meleon/i,
82 versionRegex: /(?:k-meleon)[\s/](\d+(?:\.\d+)+)/i,
83 },
84 {
85 browserName: names.WINDOWS_PHONE,
86 testRegex: /windows phone/i,
87 versionRegex: /(?:iemobile|edge)\/(\d+(\.\d+)?)/i,
88 },
89 {
90 browserName: names.INTERNET_EXPLORER,
91 testRegex: /msie|trident/i,
92 versionRegex: /(?:msie |rv:)(\d+(\.\d+)?)/i,
93 },
94 {
95 browserName: names.MICROSOFT_EDGE,
96 testRegex: /chrome.+? edge/i,
97 versionRegex: /edge\/(\d+(\.\d+)?)/i,
98 },
99 {
100 browserName: names.FIREFOX,
101 testRegex: /firefox|iceweasel|fxios/i,
102 versionRegex: /(?:firefox|iceweasel|fxios)[ /](\d+(\.\d+)?)/i,
103 },
104 {
105 browserName: names.AMAZON_SILK,
106 testRegex: /silk/i,
107 versionRegex: /silk\/(\d+(\.\d+)?)/i,
108 },
109 {
110 browserName: names.PHANTOM_JS,
111 testRegex: /phantom/i,
112 versionRegex: /phantomjs\/(\d+(\.\d+)?)/i,
113 },
114 {
115 browserName: names.CHROMIUM,
116 testRegex: /chromium/i,
117 versionRegex: /(?:chromium)[\s/](\d+(?:\.\d+)?)/i,
118 },
119 {
120 browserName: names.CHROME,
121 testRegex: /chrome|crios|crmo/i,
122 versionRegex: /(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i,
123 },
124 {
125 browserName: names.ANDROID,
126 testRegex: /android/i,
127 versionRegex: null,
128 },
129 {
130 browserName: names.SAFARI,
131 testRegex: /safari/i,
132 versionRegex: /version\/(\d+(\.\d+)?)/i,
133 },
134 {
135 browserName: names.IOS_WEBVIEW,
136 testRegex: /(iPhone|iPad).*AppleWebKit(?!.*Safari)/i,
137 versionRegex: null,
138 },
139];
140
141
142export default {
143 names,
144
145 /**
146 * Detects current browser name and version.
147 *
148 * @param {string} ua User Agent string
149 * @return {{
150 * name: string,
151 * version: ?string
152 * }}
153 */
154 detect(ua) {
155 for (let i = 0; i < tests.length; i++) {
156 if (tests[i].testRegex.test(ua)) {
157 return {
158 name: tests[i].browserName,
159 version: getFirstMatch(ua, tests[i].versionRegex) ||
160 getFirstMatch(ua, /version\/(\d+(\.\d+)?)/i) ||
161 null,
162 };
163 }
164 }
165
166 return {
167 name: names.UNKNOWN,
168 version: null,
169 };
170 },
171};