1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | (function (global, factory) {
|
10 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
11 | typeof define === 'function' && define.amd ? define(factory) :
|
12 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.eg = global.eg || {}, global.eg.agent = factory()));
|
13 | }(this, (function () { 'use strict';
|
14 |
|
15 | function some(arr, callback) {
|
16 | var length = arr.length;
|
17 |
|
18 | for (var i = 0; i < length; ++i) {
|
19 | if (callback(arr[i], i)) {
|
20 | return true;
|
21 | }
|
22 | }
|
23 |
|
24 | return false;
|
25 | }
|
26 | function find(arr, callback) {
|
27 | var length = arr.length;
|
28 |
|
29 | for (var i = 0; i < length; ++i) {
|
30 | if (callback(arr[i], i)) {
|
31 | return arr[i];
|
32 | }
|
33 | }
|
34 |
|
35 | return null;
|
36 | }
|
37 | function getUserAgent(agent) {
|
38 | var userAgent = agent;
|
39 |
|
40 | if (typeof userAgent === "undefined") {
|
41 | if (typeof navigator === "undefined" || !navigator) {
|
42 | return "";
|
43 | }
|
44 |
|
45 | userAgent = navigator.userAgent || "";
|
46 | }
|
47 |
|
48 | return userAgent.toLowerCase();
|
49 | }
|
50 | function execRegExp(pattern, text) {
|
51 | try {
|
52 | return new RegExp(pattern, "g").exec(text);
|
53 | } catch (e) {
|
54 | return null;
|
55 | }
|
56 | }
|
57 | function hasUserAgentData() {
|
58 | if (typeof navigator === "undefined" || !navigator || !navigator.userAgentData) {
|
59 | return false;
|
60 | }
|
61 |
|
62 | var userAgentData = navigator.userAgentData;
|
63 | var brands = userAgentData.brands || userAgentData.uaList;
|
64 | return !!(brands && brands.length);
|
65 | }
|
66 | function findVersion(versionTest, userAgent) {
|
67 | var result = execRegExp("(" + versionTest + ")((?:\\/|\\s|:)([0-9|\\.|_]+))", userAgent);
|
68 | return result ? result[3] : "";
|
69 | }
|
70 | function convertVersion(text) {
|
71 | return text.replace(/_/g, ".");
|
72 | }
|
73 | function findPreset(presets, userAgent) {
|
74 | var userPreset = null;
|
75 | var version = "-1";
|
76 | some(presets, function (preset) {
|
77 | var result = execRegExp("(" + preset.test + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent);
|
78 |
|
79 | if (!result || preset.brand) {
|
80 | return false;
|
81 | }
|
82 |
|
83 | userPreset = preset;
|
84 | version = result[3] || "-1";
|
85 |
|
86 | if (preset.versionAlias) {
|
87 | version = preset.versionAlias;
|
88 | } else if (preset.versionTest) {
|
89 | version = findVersion(preset.versionTest.toLowerCase(), userAgent) || version;
|
90 | }
|
91 |
|
92 | version = convertVersion(version);
|
93 | return true;
|
94 | });
|
95 | return {
|
96 | preset: userPreset,
|
97 | version: version
|
98 | };
|
99 | }
|
100 | function findPresetBrand(presets, brands) {
|
101 | var brandInfo = {
|
102 | brand: "",
|
103 | version: "-1"
|
104 | };
|
105 | some(presets, function (preset) {
|
106 | var result = findBrand(brands, preset);
|
107 |
|
108 | if (!result) {
|
109 | return false;
|
110 | }
|
111 |
|
112 | brandInfo.brand = preset.id;
|
113 | brandInfo.version = preset.versionAlias || result.version;
|
114 | return brandInfo.version !== "-1";
|
115 | });
|
116 | return brandInfo;
|
117 | }
|
118 | function findBrand(brands, preset) {
|
119 | return find(brands, function (_a) {
|
120 | var brand = _a.brand;
|
121 | return execRegExp("" + preset.test, brand.toLowerCase());
|
122 | });
|
123 | }
|
124 |
|
125 | var BROWSER_PRESETS = [{
|
126 | test: "phantomjs",
|
127 | id: "phantomjs"
|
128 | }, {
|
129 | test: "whale",
|
130 | id: "whale"
|
131 | }, {
|
132 | test: "edgios|edge|edg",
|
133 | id: "edge"
|
134 | }, {
|
135 | test: "msie|trident|windows phone",
|
136 | id: "ie",
|
137 | versionTest: "iemobile|msie|rv"
|
138 | }, {
|
139 | test: "miuibrowser",
|
140 | id: "miui browser"
|
141 | }, {
|
142 | test: "samsungbrowser",
|
143 | id: "samsung internet"
|
144 | }, {
|
145 | test: "samsung",
|
146 | id: "samsung internet",
|
147 | versionTest: "version"
|
148 | }, {
|
149 | test: "chrome|crios",
|
150 | id: "chrome"
|
151 | }, {
|
152 | test: "firefox|fxios",
|
153 | id: "firefox"
|
154 | }, {
|
155 | test: "android",
|
156 | id: "android browser",
|
157 | versionTest: "version"
|
158 | }, {
|
159 | test: "safari|iphone|ipad|ipod",
|
160 | id: "safari",
|
161 | versionTest: "version"
|
162 | }];
|
163 |
|
164 | var CHROMIUM_PRESETS = [{
|
165 | test: "(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)",
|
166 | id: "chrome",
|
167 | versionTest: "chrome"
|
168 | }, {
|
169 | test: "chromium",
|
170 | id: "chrome"
|
171 | }, {
|
172 | test: "whale",
|
173 | id: "chrome",
|
174 | versionAlias: "-1",
|
175 | brand: true
|
176 | }];
|
177 | var WEBKIT_PRESETS = [{
|
178 | test: "applewebkit",
|
179 | id: "webkit",
|
180 | versionTest: "applewebkit|safari"
|
181 | }];
|
182 | var WEBVIEW_PRESETS = [{
|
183 | test: "(?=(iphone|ipad))(?!(.*version))",
|
184 | id: "webview"
|
185 | }, {
|
186 | test: "(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))",
|
187 | id: "webview"
|
188 | }, {
|
189 |
|
190 | test: "webview",
|
191 | id: "webview"
|
192 | }];
|
193 | var OS_PRESETS = [{
|
194 | test: "windows phone",
|
195 | id: "windows phone"
|
196 | }, {
|
197 | test: "windows 2000",
|
198 | id: "window",
|
199 | versionAlias: "5.0"
|
200 | }, {
|
201 | test: "windows nt",
|
202 | id: "window"
|
203 | }, {
|
204 | test: "iphone|ipad|ipod",
|
205 | id: "ios",
|
206 | versionTest: "iphone os|cpu os"
|
207 | }, {
|
208 | test: "mac os x",
|
209 | id: "mac"
|
210 | }, {
|
211 | test: "android",
|
212 | id: "android"
|
213 | }, {
|
214 | test: "tizen",
|
215 | id: "tizen"
|
216 | }, {
|
217 | test: "webos|web0s",
|
218 | id: "webos"
|
219 | }];
|
220 |
|
221 | function parseUserAgentData(osData) {
|
222 | var userAgentData = navigator.userAgentData;
|
223 | var brands = (userAgentData.uaList || userAgentData.brands).slice();
|
224 | var isMobile = userAgentData.mobile || false;
|
225 | var firstBrand = brands[0];
|
226 | var browser = {
|
227 | name: firstBrand.brand,
|
228 | version: firstBrand.version,
|
229 | majorVersion: -1,
|
230 | webkit: false,
|
231 | webkitVersion: "-1",
|
232 | chromium: false,
|
233 | chromiumVersion: "-1",
|
234 | webview: !!findPresetBrand(WEBVIEW_PRESETS, brands).brand
|
235 | };
|
236 | var os = {
|
237 | name: "unknown",
|
238 | version: "-1",
|
239 | majorVersion: -1
|
240 | };
|
241 | browser.webkit = !browser.chromium && some(WEBKIT_PRESETS, function (preset) {
|
242 | return findBrand(brands, preset);
|
243 | });
|
244 | var chromiumBrand = findPresetBrand(CHROMIUM_PRESETS, brands);
|
245 | browser.chromium = !!chromiumBrand.brand;
|
246 | browser.chromiumVersion = chromiumBrand.version;
|
247 |
|
248 | if (!browser.chromium) {
|
249 | var webkitBrand = findPresetBrand(WEBKIT_PRESETS, brands);
|
250 | browser.webkit = !!webkitBrand.brand;
|
251 | browser.webkitVersion = webkitBrand.version;
|
252 | }
|
253 |
|
254 | if (osData) {
|
255 | var platform_1 = osData.platform.toLowerCase();
|
256 | var result = find(OS_PRESETS, function (preset) {
|
257 | return new RegExp("" + preset.test, "g").exec(platform_1);
|
258 | });
|
259 | os.name = result ? result.id : platform_1;
|
260 | os.version = osData.platformVersion;
|
261 | }
|
262 |
|
263 | var browserBrand = findPresetBrand(BROWSER_PRESETS, brands);
|
264 |
|
265 | if (browserBrand.brand) {
|
266 | browser.name = browserBrand.brand;
|
267 | browser.version = osData ? osData.uaFullVersion : browserBrand.version;
|
268 | }
|
269 |
|
270 | if (navigator.platform === "Linux armv8l") {
|
271 | os.name = "android";
|
272 | } else if (browser.webkit) {
|
273 | os.name = isMobile ? "ios" : "mac";
|
274 | }
|
275 |
|
276 | if (os.name === "ios" && browser.webview) {
|
277 | browser.version = "-1";
|
278 | }
|
279 |
|
280 | os.version = convertVersion(os.version);
|
281 | browser.version = convertVersion(browser.version);
|
282 | os.majorVersion = parseInt(os.version, 10);
|
283 | browser.majorVersion = parseInt(browser.version, 10);
|
284 | return {
|
285 | browser: browser,
|
286 | os: os,
|
287 | isMobile: isMobile,
|
288 | isHints: true
|
289 | };
|
290 | }
|
291 |
|
292 | function parseUserAgent(userAgent) {
|
293 | var nextAgent = getUserAgent(userAgent);
|
294 | var isMobile = !!/mobi/g.exec(nextAgent);
|
295 | var browser = {
|
296 | name: "unknown",
|
297 | version: "-1",
|
298 | majorVersion: -1,
|
299 | webview: !!findPreset(WEBVIEW_PRESETS, nextAgent).preset,
|
300 | chromium: false,
|
301 | chromiumVersion: "-1",
|
302 | webkit: false,
|
303 | webkitVersion: "-1"
|
304 | };
|
305 | var os = {
|
306 | name: "unknown",
|
307 | version: "-1",
|
308 | majorVersion: -1
|
309 | };
|
310 |
|
311 | var _a = findPreset(BROWSER_PRESETS, nextAgent),
|
312 | browserPreset = _a.preset,
|
313 | browserVersion = _a.version;
|
314 |
|
315 | var _b = findPreset(OS_PRESETS, nextAgent),
|
316 | osPreset = _b.preset,
|
317 | osVersion = _b.version;
|
318 |
|
319 | var chromiumPreset = findPreset(CHROMIUM_PRESETS, nextAgent);
|
320 | browser.chromium = !!chromiumPreset.preset;
|
321 | browser.chromiumVersion = chromiumPreset.version;
|
322 |
|
323 | if (!browser.chromium) {
|
324 | var webkitPreset = findPreset(WEBKIT_PRESETS, nextAgent);
|
325 | browser.webkit = !!webkitPreset.preset;
|
326 | browser.webkitVersion = webkitPreset.version;
|
327 | }
|
328 |
|
329 | if (osPreset) {
|
330 | os.name = osPreset.id;
|
331 | os.version = osVersion;
|
332 | os.majorVersion = parseInt(osVersion, 10);
|
333 | }
|
334 |
|
335 | if (browserPreset) {
|
336 | browser.name = browserPreset.id;
|
337 | browser.version = browserVersion;
|
338 |
|
339 | if (browser.webview && os.name === "ios" && browser.name !== "safari") {
|
340 | browser.webview = false;
|
341 | }
|
342 | }
|
343 |
|
344 | browser.majorVersion = parseInt(browser.version, 10);
|
345 | return {
|
346 | browser: browser,
|
347 | os: os,
|
348 | isMobile: isMobile,
|
349 | isHints: false
|
350 | };
|
351 | }
|
352 |
|
353 | |
354 |
|
355 |
|
356 |
|
357 | |
358 |
|
359 |
|
360 |
|
361 |
|
362 |
|
363 |
|
364 |
|
365 |
|
366 |
|
367 |
|
368 |
|
369 |
|
370 |
|
371 |
|
372 |
|
373 |
|
374 | function getAccurateAgent(callback) {
|
375 | if (hasUserAgentData()) {
|
376 | return navigator.userAgentData.getHighEntropyValues(["architecture", "model", "platform", "platformVersion", "uaFullVersion"]).then(function (info) {
|
377 | var agentInfo = parseUserAgentData(info);
|
378 | callback && callback(agentInfo);
|
379 | return agentInfo;
|
380 | });
|
381 | }
|
382 |
|
383 | callback && callback(agent());
|
384 |
|
385 | if (typeof Promise === "undefined" || !Promise) {
|
386 | return null;
|
387 | }
|
388 |
|
389 | return Promise.resolve(agent());
|
390 | }
|
391 | |
392 |
|
393 |
|
394 |
|
395 |
|
396 |
|
397 |
|
398 |
|
399 |
|
400 |
|
401 |
|
402 |
|
403 | function agent(userAgent) {
|
404 | if (typeof userAgent === "undefined" && hasUserAgentData()) {
|
405 | return parseUserAgentData();
|
406 | } else {
|
407 | return parseUserAgent(userAgent);
|
408 | }
|
409 | }
|
410 |
|
411 | var modules = {
|
412 | __proto__: null,
|
413 | getAccurateAgent: getAccurateAgent,
|
414 | 'default': agent
|
415 | };
|
416 |
|
417 | for (var name in modules) {
|
418 | agent[name] = modules[name];
|
419 | }
|
420 |
|
421 | return agent;
|
422 |
|
423 | })));
|
424 |
|