@tagadapay/plugin-sdk 3.0.12 → 3.0.14
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/dist/external-tracker.js +3593 -111
- package/dist/external-tracker.min.js +25 -2
- package/dist/external-tracker.min.js.map +4 -4
- package/dist/react/types.d.ts +2 -0
- package/dist/v2/core/client.d.ts +4 -0
- package/dist/v2/core/client.js +110 -26
- package/dist/v2/core/config/environment.js +6 -0
- package/dist/v2/core/funnelClient.d.ts +18 -1
- package/dist/v2/core/funnelClient.js +90 -17
- package/dist/v2/core/resources/checkout.d.ts +44 -1
- package/dist/v2/core/resources/checkout.js +48 -1
- package/dist/v2/core/resources/funnel.d.ts +44 -4
- package/dist/v2/core/resources/offers.d.ts +26 -0
- package/dist/v2/core/resources/offers.js +37 -0
- package/dist/v2/core/types.d.ts +3 -1
- package/dist/v2/core/utils/authHandoff.d.ts +60 -0
- package/dist/v2/core/utils/authHandoff.js +154 -0
- package/dist/v2/core/utils/deviceInfo.d.ts +20 -3
- package/dist/v2/core/utils/deviceInfo.js +62 -94
- package/dist/v2/core/utils/previewMode.d.ts +4 -0
- package/dist/v2/core/utils/previewMode.js +4 -0
- package/dist/v2/react/hooks/useCheckoutQuery.d.ts +0 -1
- package/dist/v2/react/hooks/useCheckoutQuery.js +12 -4
- package/dist/v2/react/hooks/useFunnelLegacy.js +39 -11
- package/dist/v2/react/hooks/usePreviewOffer.d.ts +3 -3
- package/dist/v2/react/hooks/usePreviewOffer.js +20 -15
- package/dist/v2/react/hooks/useTranslation.js +12 -4
- package/dist/v2/standalone/index.d.ts +2 -1
- package/dist/v2/standalone/index.js +2 -1
- package/package.json +3 -1
package/dist/external-tracker.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TagadaPay External Tracker v3.0.
|
|
2
|
+
* TagadaPay External Tracker v3.0.14
|
|
3
3
|
* CDN Bundle - Standalone tracking for external pages (Debug Build)
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
@@ -110,7 +110,9 @@ var TagadaTrackerBundle = (() => {
|
|
|
110
110
|
endpoints: {
|
|
111
111
|
checkout: {
|
|
112
112
|
sessionInit: "/api/v1/checkout/session/init",
|
|
113
|
-
|
|
113
|
+
sessionInitAsync: "/api/v1/checkout/session/init-async",
|
|
114
|
+
sessionStatus: "/api/v1/checkout/session/status",
|
|
115
|
+
asyncStatus: "/api/public/v1/checkout/async-status"
|
|
114
116
|
},
|
|
115
117
|
customer: {
|
|
116
118
|
profile: "/api/v1/customer/profile",
|
|
@@ -126,7 +128,9 @@ var TagadaTrackerBundle = (() => {
|
|
|
126
128
|
endpoints: {
|
|
127
129
|
checkout: {
|
|
128
130
|
sessionInit: "/api/v1/checkout/session/init",
|
|
129
|
-
|
|
131
|
+
sessionInitAsync: "/api/v1/checkout/session/init-async",
|
|
132
|
+
sessionStatus: "/api/v1/checkout/session/status",
|
|
133
|
+
asyncStatus: "/api/public/v1/checkout/async-status"
|
|
130
134
|
},
|
|
131
135
|
customer: {
|
|
132
136
|
profile: "/api/v1/customer/profile",
|
|
@@ -142,7 +146,9 @@ var TagadaTrackerBundle = (() => {
|
|
|
142
146
|
endpoints: {
|
|
143
147
|
checkout: {
|
|
144
148
|
sessionInit: "/api/v1/checkout/session/init",
|
|
145
|
-
|
|
149
|
+
sessionInitAsync: "/api/v1/checkout/session/init-async",
|
|
150
|
+
sessionStatus: "/api/v1/checkout/session/status",
|
|
151
|
+
asyncStatus: "/api/public/v1/checkout/async-status"
|
|
146
152
|
},
|
|
147
153
|
customer: {
|
|
148
154
|
profile: "/api/v1/customer/profile",
|
|
@@ -649,21 +655,26 @@ var TagadaTrackerBundle = (() => {
|
|
|
649
655
|
}
|
|
650
656
|
const injectedFunnelId = getAssignedFunnelId();
|
|
651
657
|
const funnelVariantId = getAssignedFunnelVariant();
|
|
652
|
-
const
|
|
658
|
+
const injectedStepId = getAssignedFunnelStep();
|
|
653
659
|
const sdkParams = getSDKParams();
|
|
654
|
-
const finalFunnelId = injectedFunnelId || effectiveFunnelId;
|
|
660
|
+
const finalFunnelId = this.config.funnelId || injectedFunnelId || effectiveFunnelId;
|
|
661
|
+
const finalStepId = this.config.stepId || injectedStepId;
|
|
655
662
|
if (this.config.debugMode) {
|
|
656
663
|
console.log("\u{1F680} [FunnelClient] Auto-initializing...", {
|
|
657
664
|
existingSessionId,
|
|
658
665
|
effectiveFunnelId: finalFunnelId,
|
|
659
666
|
funnelVariantId,
|
|
660
667
|
// 🎯 Log variant ID for debugging
|
|
661
|
-
funnelStepId,
|
|
668
|
+
funnelStepId: finalStepId,
|
|
662
669
|
// 🎯 Log step ID for debugging
|
|
663
670
|
draft: sdkParams.draft,
|
|
664
671
|
// 🎯 Log draft mode
|
|
665
|
-
funnelTracking: sdkParams.funnelTracking
|
|
672
|
+
funnelTracking: sdkParams.funnelTracking,
|
|
666
673
|
// 🎯 Log tracking flag
|
|
674
|
+
source: {
|
|
675
|
+
funnelId: this.config.funnelId ? "config" : injectedFunnelId ? "injected" : effectiveFunnelId ? "url/prop" : "none",
|
|
676
|
+
stepId: this.config.stepId ? "config" : injectedStepId ? "injected" : "none"
|
|
677
|
+
}
|
|
667
678
|
});
|
|
668
679
|
}
|
|
669
680
|
const response = await this.resource.initialize({
|
|
@@ -678,8 +689,8 @@ var TagadaTrackerBundle = (() => {
|
|
|
678
689
|
currentUrl: typeof window !== "undefined" ? window.location.href : void 0,
|
|
679
690
|
funnelVariantId,
|
|
680
691
|
// 🎯 Pass A/B test variant ID to backend
|
|
681
|
-
funnelStepId,
|
|
682
|
-
// 🎯 Pass step ID to backend
|
|
692
|
+
funnelStepId: finalStepId,
|
|
693
|
+
// 🎯 Pass step ID to backend (with config override)
|
|
683
694
|
draft: sdkParams.draft,
|
|
684
695
|
// 🎯 Pass draft mode explicitly (more robust than URL parsing)
|
|
685
696
|
funnelTracking: sdkParams.funnelTracking
|
|
@@ -745,30 +756,90 @@ var TagadaTrackerBundle = (() => {
|
|
|
745
756
|
}
|
|
746
757
|
/**
|
|
747
758
|
* Navigate
|
|
759
|
+
* @param event - Navigation event/action
|
|
760
|
+
* @param options - Navigation options
|
|
761
|
+
* @param options.fireAndForget - If true, queues navigation to QStash and returns immediately without waiting for result
|
|
762
|
+
* @param options.customerTags - Customer tags to set (merged with existing customer tags)
|
|
763
|
+
* @param options.deviceId - Device ID for geo/device tag enrichment (optional, rarely needed)
|
|
748
764
|
*/
|
|
749
|
-
async navigate(event) {
|
|
750
|
-
var _a;
|
|
765
|
+
async navigate(event, options) {
|
|
766
|
+
var _a, _b, _c;
|
|
751
767
|
if (!((_a = this.state.context) == null ? void 0 : _a.sessionId)) throw new Error("No active session");
|
|
752
768
|
this.updateState({ isNavigating: true, isLoading: true });
|
|
753
769
|
try {
|
|
770
|
+
let funnelVariantId = getAssignedFunnelVariant();
|
|
771
|
+
let funnelStepId = getAssignedFunnelStep();
|
|
772
|
+
const currentUrl = typeof window !== "undefined" ? window.location.href : void 0;
|
|
773
|
+
if (!funnelStepId && this.config.stepId) {
|
|
774
|
+
funnelStepId = this.config.stepId;
|
|
775
|
+
if (this.config.debugMode) {
|
|
776
|
+
console.log("\u{1F50D} [FunnelClient.navigate] Using stepId from config (no injection):", funnelStepId);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
if (!funnelVariantId && this.config.variantId) {
|
|
780
|
+
funnelVariantId = this.config.variantId;
|
|
781
|
+
if (this.config.debugMode) {
|
|
782
|
+
console.log("\u{1F50D} [FunnelClient.navigate] Using variantId from config (no injection):", funnelVariantId);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
if (this.config.debugMode) {
|
|
786
|
+
console.log("\u{1F50D} [FunnelClient.navigate] Sending to backend:", {
|
|
787
|
+
sessionId: this.state.context.sessionId,
|
|
788
|
+
currentUrl,
|
|
789
|
+
funnelStepId: funnelStepId || "(not found)",
|
|
790
|
+
funnelVariantId: funnelVariantId || "(not found)",
|
|
791
|
+
hasInjectedStepId: !!getAssignedFunnelStep(),
|
|
792
|
+
hasInjectedVariantId: !!getAssignedFunnelVariant(),
|
|
793
|
+
usedConfigFallback: !getAssignedFunnelStep() && !!this.config.stepId,
|
|
794
|
+
customerTags: (options == null ? void 0 : options.customerTags) || "(none)",
|
|
795
|
+
deviceId: (options == null ? void 0 : options.deviceId) || "(none)"
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
const fireAndForget = (options == null ? void 0 : options.fireAndForget) || false;
|
|
754
799
|
const response = await this.resource.navigate({
|
|
755
800
|
sessionId: this.state.context.sessionId,
|
|
756
|
-
event
|
|
801
|
+
event,
|
|
802
|
+
currentUrl,
|
|
803
|
+
funnelStepId,
|
|
804
|
+
funnelVariantId,
|
|
805
|
+
fireAndForget,
|
|
806
|
+
customerTags: options == null ? void 0 : options.customerTags,
|
|
807
|
+
deviceId: options == null ? void 0 : options.deviceId
|
|
757
808
|
});
|
|
758
|
-
if (response.success
|
|
759
|
-
|
|
809
|
+
if (!response.success || !response.result) {
|
|
810
|
+
throw new Error(response.error || "Navigation failed");
|
|
811
|
+
}
|
|
812
|
+
const result = response.result;
|
|
813
|
+
if (result.queued) {
|
|
760
814
|
this.updateState({ isNavigating: false, isLoading: false });
|
|
761
|
-
|
|
762
|
-
const shouldAutoRedirect = this.config.autoRedirect !== false;
|
|
763
|
-
if (shouldAutoRedirect && (result == null ? void 0 : result.url) && typeof window !== "undefined") {
|
|
815
|
+
if (result.sessionId && result.sessionId !== ((_b = this.state.context) == null ? void 0 : _b.sessionId)) {
|
|
764
816
|
if (this.config.debugMode) {
|
|
765
|
-
console.log("\u{
|
|
817
|
+
console.log("\u{1F525} [FunnelClient] Session ID updated: ".concat((_c = this.state.context) == null ? void 0 : _c.sessionId, " \u2192 ").concat(result.sessionId));
|
|
818
|
+
}
|
|
819
|
+
if (this.state.context) {
|
|
820
|
+
this.state.context.sessionId = result.sessionId;
|
|
766
821
|
}
|
|
767
|
-
|
|
822
|
+
}
|
|
823
|
+
if (this.config.debugMode) {
|
|
824
|
+
console.log("\u{1F525} [FunnelClient] Navigation queued (fire-and-forget mode)");
|
|
768
825
|
}
|
|
769
826
|
return result;
|
|
770
827
|
}
|
|
771
|
-
|
|
828
|
+
const shouldAutoRedirect = this.config.autoRedirect !== false;
|
|
829
|
+
if (!shouldAutoRedirect) {
|
|
830
|
+
if (this.config.debugMode) {
|
|
831
|
+
console.log("\u{1F504} [FunnelClient] Refreshing session (no auto-redirect)");
|
|
832
|
+
}
|
|
833
|
+
await this.refreshSession();
|
|
834
|
+
}
|
|
835
|
+
this.updateState({ isNavigating: false, isLoading: false });
|
|
836
|
+
if (shouldAutoRedirect && (result == null ? void 0 : result.url) && typeof window !== "undefined") {
|
|
837
|
+
if (this.config.debugMode) {
|
|
838
|
+
console.log("\u{1F680} [FunnelClient] Auto-redirecting to:", result.url, "(skipped session refresh - next page will initialize)");
|
|
839
|
+
}
|
|
840
|
+
window.location.href = result.url;
|
|
841
|
+
}
|
|
842
|
+
return result;
|
|
772
843
|
} catch (error) {
|
|
773
844
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
774
845
|
this.updateState({ error: err, isNavigating: false, isLoading: false });
|
|
@@ -3638,70 +3709,3240 @@ var TagadaTrackerBundle = (() => {
|
|
|
3638
3709
|
}
|
|
3639
3710
|
};
|
|
3640
3711
|
|
|
3641
|
-
//
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3712
|
+
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/main/ua-parser.mjs
|
|
3713
|
+
var LIBVERSION = "2.0.6";
|
|
3714
|
+
var UA_MAX_LENGTH = 500;
|
|
3715
|
+
var USER_AGENT = "user-agent";
|
|
3716
|
+
var EMPTY = "";
|
|
3717
|
+
var UNKNOWN = "?";
|
|
3718
|
+
var TYPEOF = {
|
|
3719
|
+
FUNCTION: "function",
|
|
3720
|
+
OBJECT: "object",
|
|
3721
|
+
STRING: "string",
|
|
3722
|
+
UNDEFINED: "undefined"
|
|
3723
|
+
};
|
|
3724
|
+
var BROWSER = "browser";
|
|
3725
|
+
var CPU = "cpu";
|
|
3726
|
+
var DEVICE = "device";
|
|
3727
|
+
var ENGINE = "engine";
|
|
3728
|
+
var OS = "os";
|
|
3729
|
+
var RESULT = "result";
|
|
3730
|
+
var NAME = "name";
|
|
3731
|
+
var TYPE = "type";
|
|
3732
|
+
var VENDOR = "vendor";
|
|
3733
|
+
var VERSION3 = "version";
|
|
3734
|
+
var ARCHITECTURE = "architecture";
|
|
3735
|
+
var MAJOR = "major";
|
|
3736
|
+
var MODEL = "model";
|
|
3737
|
+
var CONSOLE = "console";
|
|
3738
|
+
var MOBILE = "mobile";
|
|
3739
|
+
var TABLET = "tablet";
|
|
3740
|
+
var SMARTTV = "smarttv";
|
|
3741
|
+
var WEARABLE = "wearable";
|
|
3742
|
+
var XR = "xr";
|
|
3743
|
+
var EMBEDDED = "embedded";
|
|
3744
|
+
var INAPP = "inapp";
|
|
3745
|
+
var BRANDS = "brands";
|
|
3746
|
+
var FORMFACTORS = "formFactors";
|
|
3747
|
+
var FULLVERLIST = "fullVersionList";
|
|
3748
|
+
var PLATFORM = "platform";
|
|
3749
|
+
var PLATFORMVER = "platformVersion";
|
|
3750
|
+
var BITNESS = "bitness";
|
|
3751
|
+
var CH = "sec-ch-ua";
|
|
3752
|
+
var CH_FULL_VER_LIST = CH + "-full-version-list";
|
|
3753
|
+
var CH_ARCH = CH + "-arch";
|
|
3754
|
+
var CH_BITNESS = CH + "-" + BITNESS;
|
|
3755
|
+
var CH_FORM_FACTORS = CH + "-form-factors";
|
|
3756
|
+
var CH_MOBILE = CH + "-" + MOBILE;
|
|
3757
|
+
var CH_MODEL = CH + "-" + MODEL;
|
|
3758
|
+
var CH_PLATFORM = CH + "-" + PLATFORM;
|
|
3759
|
+
var CH_PLATFORM_VER = CH_PLATFORM + "-version";
|
|
3760
|
+
var CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS];
|
|
3761
|
+
var AMAZON = "Amazon";
|
|
3762
|
+
var APPLE = "Apple";
|
|
3763
|
+
var ASUS = "ASUS";
|
|
3764
|
+
var BLACKBERRY = "BlackBerry";
|
|
3765
|
+
var GOOGLE = "Google";
|
|
3766
|
+
var HUAWEI = "Huawei";
|
|
3767
|
+
var LENOVO = "Lenovo";
|
|
3768
|
+
var HONOR = "Honor";
|
|
3769
|
+
var LG = "LG";
|
|
3770
|
+
var MICROSOFT = "Microsoft";
|
|
3771
|
+
var MOTOROLA = "Motorola";
|
|
3772
|
+
var NVIDIA = "Nvidia";
|
|
3773
|
+
var ONEPLUS = "OnePlus";
|
|
3774
|
+
var OPPO = "OPPO";
|
|
3775
|
+
var SAMSUNG = "Samsung";
|
|
3776
|
+
var SHARP = "Sharp";
|
|
3777
|
+
var SONY = "Sony";
|
|
3778
|
+
var XIAOMI = "Xiaomi";
|
|
3779
|
+
var ZEBRA = "Zebra";
|
|
3780
|
+
var CHROME = "Chrome";
|
|
3781
|
+
var CHROMIUM = "Chromium";
|
|
3782
|
+
var CHROMECAST = "Chromecast";
|
|
3783
|
+
var EDGE = "Edge";
|
|
3784
|
+
var FIREFOX = "Firefox";
|
|
3785
|
+
var OPERA = "Opera";
|
|
3786
|
+
var FACEBOOK = "Facebook";
|
|
3787
|
+
var SOGOU = "Sogou";
|
|
3788
|
+
var PREFIX_MOBILE = "Mobile ";
|
|
3789
|
+
var SUFFIX_BROWSER = " Browser";
|
|
3790
|
+
var WINDOWS = "Windows";
|
|
3791
|
+
var isWindow = typeof window !== TYPEOF.UNDEFINED;
|
|
3792
|
+
var NAVIGATOR = isWindow && window.navigator ? window.navigator : void 0;
|
|
3793
|
+
var NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
|
|
3794
|
+
var extend2 = function(defaultRgx, extensions) {
|
|
3795
|
+
var mergedRgx = {};
|
|
3796
|
+
var extraRgx = extensions;
|
|
3797
|
+
if (!isExtensions(extensions)) {
|
|
3798
|
+
extraRgx = {};
|
|
3799
|
+
for (var i in extensions) {
|
|
3800
|
+
for (var j in extensions[i]) {
|
|
3801
|
+
extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
|
|
3802
|
+
}
|
|
3803
|
+
}
|
|
3647
3804
|
}
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
return { name: "Firefox", version: match ? match[1] : "unknown" };
|
|
3805
|
+
for (var k in defaultRgx) {
|
|
3806
|
+
mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
|
|
3651
3807
|
}
|
|
3652
|
-
|
|
3653
|
-
|
|
3654
|
-
|
|
3808
|
+
return mergedRgx;
|
|
3809
|
+
};
|
|
3810
|
+
var enumerize = function(arr) {
|
|
3811
|
+
var enums = {};
|
|
3812
|
+
for (var i = 0; i < arr.length; i++) {
|
|
3813
|
+
enums[arr[i].toUpperCase()] = arr[i];
|
|
3655
3814
|
}
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3815
|
+
return enums;
|
|
3816
|
+
};
|
|
3817
|
+
var has = function(str1, str2) {
|
|
3818
|
+
if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
|
|
3819
|
+
for (var i in str1) {
|
|
3820
|
+
if (lowerize(str2) == lowerize(str1[i])) return true;
|
|
3821
|
+
}
|
|
3822
|
+
return false;
|
|
3659
3823
|
}
|
|
3660
|
-
return
|
|
3661
|
-
}
|
|
3662
|
-
function
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
if (userAgent.includes("Windows NT 10.0")) return { name: "Windows", version: "10" };
|
|
3666
|
-
if (userAgent.includes("Windows NT 6.3")) return { name: "Windows", version: "8.1" };
|
|
3667
|
-
if (userAgent.includes("Windows NT 6.2")) return { name: "Windows", version: "8" };
|
|
3668
|
-
if (userAgent.includes("Windows NT 6.1")) return { name: "Windows", version: "7" };
|
|
3669
|
-
return { name: "Windows", version: "unknown" };
|
|
3670
|
-
}
|
|
3671
|
-
if (userAgent.includes("Mac OS X")) {
|
|
3672
|
-
const match = /Mac OS X (\d+[._]\d+)/.exec(userAgent);
|
|
3673
|
-
return { name: "macOS", version: match ? match[1].replace("_", ".") : "unknown" };
|
|
3674
|
-
}
|
|
3675
|
-
if (userAgent.includes("iPhone") || userAgent.includes("iPad")) {
|
|
3676
|
-
const match = /OS (\d+[._]\d+)/.exec(userAgent);
|
|
3677
|
-
return { name: "iOS", version: match ? match[1].replace("_", ".") : "unknown" };
|
|
3678
|
-
}
|
|
3679
|
-
if (userAgent.includes("Android")) {
|
|
3680
|
-
const match = /Android (\d+[.\d]*)/.exec(userAgent);
|
|
3681
|
-
return { name: "Android", version: match ? match[1] : "unknown" };
|
|
3682
|
-
}
|
|
3683
|
-
if (userAgent.includes("Linux")) {
|
|
3684
|
-
return { name: "Linux", version: "unknown" };
|
|
3685
|
-
}
|
|
3686
|
-
return { name: "unknown", version: "unknown" };
|
|
3687
|
-
}
|
|
3688
|
-
function getDeviceInfo() {
|
|
3689
|
-
const userAgent = navigator.userAgent;
|
|
3690
|
-
if (userAgent.includes("iPhone")) {
|
|
3691
|
-
return { type: "mobile", model: "iPhone" };
|
|
3824
|
+
return isString2(str1) ? lowerize(str2) == lowerize(str1) : false;
|
|
3825
|
+
};
|
|
3826
|
+
var isExtensions = function(obj, deep) {
|
|
3827
|
+
for (var prop in obj) {
|
|
3828
|
+
return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
|
|
3692
3829
|
}
|
|
3693
|
-
|
|
3694
|
-
|
|
3830
|
+
};
|
|
3831
|
+
var isString2 = function(val) {
|
|
3832
|
+
return typeof val === TYPEOF.STRING;
|
|
3833
|
+
};
|
|
3834
|
+
var itemListToArray = function(header) {
|
|
3835
|
+
if (!header) return void 0;
|
|
3836
|
+
var arr = [];
|
|
3837
|
+
var tokens = strip(/\\?\"/g, header).split(",");
|
|
3838
|
+
for (var i = 0; i < tokens.length; i++) {
|
|
3839
|
+
if (tokens[i].indexOf(";") > -1) {
|
|
3840
|
+
var token = trim2(tokens[i]).split(";v=");
|
|
3841
|
+
arr[i] = { brand: token[0], version: token[1] };
|
|
3842
|
+
} else {
|
|
3843
|
+
arr[i] = trim2(tokens[i]);
|
|
3844
|
+
}
|
|
3695
3845
|
}
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3846
|
+
return arr;
|
|
3847
|
+
};
|
|
3848
|
+
var lowerize = function(str) {
|
|
3849
|
+
return isString2(str) ? str.toLowerCase() : str;
|
|
3850
|
+
};
|
|
3851
|
+
var majorize = function(version) {
|
|
3852
|
+
return isString2(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
|
|
3853
|
+
};
|
|
3854
|
+
var setProps = function(arr) {
|
|
3855
|
+
for (var i in arr) {
|
|
3856
|
+
if (!arr.hasOwnProperty(i)) continue;
|
|
3857
|
+
var propName = arr[i];
|
|
3858
|
+
if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
|
|
3859
|
+
this[propName[0]] = propName[1];
|
|
3699
3860
|
} else {
|
|
3700
|
-
|
|
3861
|
+
this[propName] = void 0;
|
|
3701
3862
|
}
|
|
3702
3863
|
}
|
|
3703
|
-
return
|
|
3864
|
+
return this;
|
|
3865
|
+
};
|
|
3866
|
+
var strip = function(pattern, str) {
|
|
3867
|
+
return isString2(str) ? str.replace(pattern, EMPTY) : str;
|
|
3868
|
+
};
|
|
3869
|
+
var stripQuotes = function(str) {
|
|
3870
|
+
return strip(/\\?\"/g, str);
|
|
3871
|
+
};
|
|
3872
|
+
var trim2 = function(str, len) {
|
|
3873
|
+
str = strip(/^\s\s*/, String(str));
|
|
3874
|
+
return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
|
|
3875
|
+
};
|
|
3876
|
+
var rgxMapper = function(ua, arrays) {
|
|
3877
|
+
if (!ua || !arrays) return;
|
|
3878
|
+
var i = 0, j, k, p, q, matches, match;
|
|
3879
|
+
while (i < arrays.length && !matches) {
|
|
3880
|
+
var regex = arrays[i], props = arrays[i + 1];
|
|
3881
|
+
j = k = 0;
|
|
3882
|
+
while (j < regex.length && !matches) {
|
|
3883
|
+
if (!regex[j]) {
|
|
3884
|
+
break;
|
|
3885
|
+
}
|
|
3886
|
+
matches = regex[j++].exec(ua);
|
|
3887
|
+
if (!!matches) {
|
|
3888
|
+
for (p = 0; p < props.length; p++) {
|
|
3889
|
+
match = matches[++k];
|
|
3890
|
+
q = props[p];
|
|
3891
|
+
if (typeof q === TYPEOF.OBJECT && q.length > 0) {
|
|
3892
|
+
if (q.length === 2) {
|
|
3893
|
+
if (typeof q[1] == TYPEOF.FUNCTION) {
|
|
3894
|
+
this[q[0]] = q[1].call(this, match);
|
|
3895
|
+
} else {
|
|
3896
|
+
this[q[0]] = q[1];
|
|
3897
|
+
}
|
|
3898
|
+
} else if (q.length >= 3) {
|
|
3899
|
+
if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
|
|
3900
|
+
if (q.length > 3) {
|
|
3901
|
+
this[q[0]] = match ? q[1].apply(this, q.slice(2)) : void 0;
|
|
3902
|
+
} else {
|
|
3903
|
+
this[q[0]] = match ? q[1].call(this, match, q[2]) : void 0;
|
|
3904
|
+
}
|
|
3905
|
+
} else {
|
|
3906
|
+
if (q.length == 3) {
|
|
3907
|
+
this[q[0]] = match ? match.replace(q[1], q[2]) : void 0;
|
|
3908
|
+
} else if (q.length == 4) {
|
|
3909
|
+
this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : void 0;
|
|
3910
|
+
} else if (q.length > 4) {
|
|
3911
|
+
this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : void 0;
|
|
3912
|
+
}
|
|
3913
|
+
}
|
|
3914
|
+
}
|
|
3915
|
+
} else {
|
|
3916
|
+
this[q] = match ? match : void 0;
|
|
3917
|
+
}
|
|
3918
|
+
}
|
|
3919
|
+
}
|
|
3920
|
+
}
|
|
3921
|
+
i += 2;
|
|
3922
|
+
}
|
|
3923
|
+
};
|
|
3924
|
+
var strMapper = function(str, map) {
|
|
3925
|
+
for (var i in map) {
|
|
3926
|
+
if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
|
|
3927
|
+
for (var j = 0; j < map[i].length; j++) {
|
|
3928
|
+
if (has(map[i][j], str)) {
|
|
3929
|
+
return i === UNKNOWN ? void 0 : i;
|
|
3930
|
+
}
|
|
3931
|
+
}
|
|
3932
|
+
} else if (has(map[i], str)) {
|
|
3933
|
+
return i === UNKNOWN ? void 0 : i;
|
|
3934
|
+
}
|
|
3935
|
+
}
|
|
3936
|
+
return map.hasOwnProperty("*") ? map["*"] : str;
|
|
3937
|
+
};
|
|
3938
|
+
var windowsVersionMap = {
|
|
3939
|
+
"ME": "4.90",
|
|
3940
|
+
"NT 3.51": "3.51",
|
|
3941
|
+
"NT 4.0": "4.0",
|
|
3942
|
+
"2000": ["5.0", "5.01"],
|
|
3943
|
+
"XP": ["5.1", "5.2"],
|
|
3944
|
+
"Vista": "6.0",
|
|
3945
|
+
"7": "6.1",
|
|
3946
|
+
"8": "6.2",
|
|
3947
|
+
"8.1": "6.3",
|
|
3948
|
+
"10": ["6.4", "10.0"],
|
|
3949
|
+
"NT": ""
|
|
3950
|
+
};
|
|
3951
|
+
var formFactorsMap = {
|
|
3952
|
+
"embedded": "Automotive",
|
|
3953
|
+
"mobile": "Mobile",
|
|
3954
|
+
"tablet": ["Tablet", "EInk"],
|
|
3955
|
+
"smarttv": "TV",
|
|
3956
|
+
"wearable": "Watch",
|
|
3957
|
+
"xr": ["VR", "XR"],
|
|
3958
|
+
"?": ["Desktop", "Unknown"],
|
|
3959
|
+
"*": void 0
|
|
3960
|
+
};
|
|
3961
|
+
var browserHintsMap = {
|
|
3962
|
+
"Chrome": "Google Chrome",
|
|
3963
|
+
"Edge": "Microsoft Edge",
|
|
3964
|
+
"Edge WebView2": "Microsoft Edge WebView2",
|
|
3965
|
+
"Chrome WebView": "Android WebView",
|
|
3966
|
+
"Chrome Headless": "HeadlessChrome",
|
|
3967
|
+
"Huawei Browser": "HuaweiBrowser",
|
|
3968
|
+
"MIUI Browser": "Miui Browser",
|
|
3969
|
+
"Opera Mobi": "OperaMobile",
|
|
3970
|
+
"Yandex": "YaBrowser"
|
|
3971
|
+
};
|
|
3972
|
+
var defaultRegexes = {
|
|
3973
|
+
browser: [
|
|
3974
|
+
[
|
|
3975
|
+
// Most common regardless engine
|
|
3976
|
+
/\b(?:crmo|crios)\/([\w\.]+)/i
|
|
3977
|
+
// Chrome for Android/iOS
|
|
3978
|
+
],
|
|
3979
|
+
[VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
|
|
3980
|
+
[
|
|
3981
|
+
/webview.+edge\/([\w\.]+)/i
|
|
3982
|
+
// Microsoft Edge
|
|
3983
|
+
],
|
|
3984
|
+
[VERSION3, [NAME, EDGE + " WebView"]],
|
|
3985
|
+
[
|
|
3986
|
+
/edg(?:e|ios|a)?\/([\w\.]+)/i
|
|
3987
|
+
],
|
|
3988
|
+
[VERSION3, [NAME, "Edge"]],
|
|
3989
|
+
[
|
|
3990
|
+
// Presto based
|
|
3991
|
+
/(opera mini)\/([-\w\.]+)/i,
|
|
3992
|
+
// Opera Mini
|
|
3993
|
+
/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
|
|
3994
|
+
// Opera Mobi/Tablet
|
|
3995
|
+
/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
|
|
3996
|
+
// Opera
|
|
3997
|
+
],
|
|
3998
|
+
[NAME, VERSION3],
|
|
3999
|
+
[
|
|
4000
|
+
/opios[\/ ]+([\w\.]+)/i
|
|
4001
|
+
// Opera mini on iphone >= 8.0
|
|
4002
|
+
],
|
|
4003
|
+
[VERSION3, [NAME, OPERA + " Mini"]],
|
|
4004
|
+
[
|
|
4005
|
+
/\bop(?:rg)?x\/([\w\.]+)/i
|
|
4006
|
+
// Opera GX
|
|
4007
|
+
],
|
|
4008
|
+
[VERSION3, [NAME, OPERA + " GX"]],
|
|
4009
|
+
[
|
|
4010
|
+
/\bopr\/([\w\.]+)/i
|
|
4011
|
+
// Opera Webkit
|
|
4012
|
+
],
|
|
4013
|
+
[VERSION3, [NAME, OPERA]],
|
|
4014
|
+
[
|
|
4015
|
+
// Mixed
|
|
4016
|
+
/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
|
|
4017
|
+
// Baidu
|
|
4018
|
+
],
|
|
4019
|
+
[VERSION3, [NAME, "Baidu"]],
|
|
4020
|
+
[
|
|
4021
|
+
/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i
|
|
4022
|
+
// Maxthon
|
|
4023
|
+
],
|
|
4024
|
+
[VERSION3, [NAME, "Maxthon"]],
|
|
4025
|
+
[
|
|
4026
|
+
/(kindle)\/([\w\.]+)/i,
|
|
4027
|
+
// Kindle
|
|
4028
|
+
/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
|
|
4029
|
+
// Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
|
|
4030
|
+
// Trident based
|
|
4031
|
+
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
|
|
4032
|
+
// Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
|
|
4033
|
+
/(?:ms|\()(ie) ([\w\.]+)/i,
|
|
4034
|
+
// Internet Explorer
|
|
4035
|
+
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
|
|
4036
|
+
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,
|
|
4037
|
+
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
|
|
4038
|
+
/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
|
|
4039
|
+
// HeyTap/Ovi/115/Surf
|
|
4040
|
+
/(qwant)(?:ios|mobile)\/([\d\.]+)/i,
|
|
4041
|
+
// Qwant
|
|
4042
|
+
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
|
|
4043
|
+
// Ecosia/Weibo
|
|
4044
|
+
],
|
|
4045
|
+
[NAME, VERSION3],
|
|
4046
|
+
[
|
|
4047
|
+
/quark(?:pc)?\/([-\w\.]+)/i
|
|
4048
|
+
// Quark
|
|
4049
|
+
],
|
|
4050
|
+
[VERSION3, [NAME, "Quark"]],
|
|
4051
|
+
[
|
|
4052
|
+
/\bddg\/([\w\.]+)/i
|
|
4053
|
+
// DuckDuckGo
|
|
4054
|
+
],
|
|
4055
|
+
[VERSION3, [NAME, "DuckDuckGo"]],
|
|
4056
|
+
[
|
|
4057
|
+
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
|
|
4058
|
+
// UCBrowser
|
|
4059
|
+
],
|
|
4060
|
+
[VERSION3, [NAME, "UCBrowser"]],
|
|
4061
|
+
[
|
|
4062
|
+
/microm.+\bqbcore\/([\w\.]+)/i,
|
|
4063
|
+
// WeChat Desktop for Windows Built-in Browser
|
|
4064
|
+
/\bqbcore\/([\w\.]+).+microm/i,
|
|
4065
|
+
/micromessenger\/([\w\.]+)/i
|
|
4066
|
+
// WeChat
|
|
4067
|
+
],
|
|
4068
|
+
[VERSION3, [NAME, "WeChat"]],
|
|
4069
|
+
[
|
|
4070
|
+
/konqueror\/([\w\.]+)/i
|
|
4071
|
+
// Konqueror
|
|
4072
|
+
],
|
|
4073
|
+
[VERSION3, [NAME, "Konqueror"]],
|
|
4074
|
+
[
|
|
4075
|
+
/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
|
|
4076
|
+
// IE11
|
|
4077
|
+
],
|
|
4078
|
+
[VERSION3, [NAME, "IE"]],
|
|
4079
|
+
[
|
|
4080
|
+
/ya(?:search)?browser\/([\w\.]+)/i
|
|
4081
|
+
// Yandex
|
|
4082
|
+
],
|
|
4083
|
+
[VERSION3, [NAME, "Yandex"]],
|
|
4084
|
+
[
|
|
4085
|
+
/slbrowser\/([\w\.]+)/i
|
|
4086
|
+
// Smart Lenovo Browser
|
|
4087
|
+
],
|
|
4088
|
+
[VERSION3, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
|
|
4089
|
+
[
|
|
4090
|
+
/(avast|avg)\/([\w\.]+)/i
|
|
4091
|
+
// Avast/AVG Secure Browser
|
|
4092
|
+
],
|
|
4093
|
+
[[NAME, /(.+)/, "$1 Secure" + SUFFIX_BROWSER], VERSION3],
|
|
4094
|
+
[
|
|
4095
|
+
/\bfocus\/([\w\.]+)/i
|
|
4096
|
+
// Firefox Focus
|
|
4097
|
+
],
|
|
4098
|
+
[VERSION3, [NAME, FIREFOX + " Focus"]],
|
|
4099
|
+
[
|
|
4100
|
+
/\bopt\/([\w\.]+)/i
|
|
4101
|
+
// Opera Touch
|
|
4102
|
+
],
|
|
4103
|
+
[VERSION3, [NAME, OPERA + " Touch"]],
|
|
4104
|
+
[
|
|
4105
|
+
/coc_coc\w+\/([\w\.]+)/i
|
|
4106
|
+
// Coc Coc Browser
|
|
4107
|
+
],
|
|
4108
|
+
[VERSION3, [NAME, "Coc Coc"]],
|
|
4109
|
+
[
|
|
4110
|
+
/dolfin\/([\w\.]+)/i
|
|
4111
|
+
// Dolphin
|
|
4112
|
+
],
|
|
4113
|
+
[VERSION3, [NAME, "Dolphin"]],
|
|
4114
|
+
[
|
|
4115
|
+
/coast\/([\w\.]+)/i
|
|
4116
|
+
// Opera Coast
|
|
4117
|
+
],
|
|
4118
|
+
[VERSION3, [NAME, OPERA + " Coast"]],
|
|
4119
|
+
[
|
|
4120
|
+
/miuibrowser\/([\w\.]+)/i
|
|
4121
|
+
// MIUI Browser
|
|
4122
|
+
],
|
|
4123
|
+
[VERSION3, [NAME, "MIUI" + SUFFIX_BROWSER]],
|
|
4124
|
+
[
|
|
4125
|
+
/fxios\/([\w\.-]+)/i
|
|
4126
|
+
// Firefox for iOS
|
|
4127
|
+
],
|
|
4128
|
+
[VERSION3, [NAME, PREFIX_MOBILE + FIREFOX]],
|
|
4129
|
+
[
|
|
4130
|
+
/\bqihoobrowser\/?([\w\.]*)/i
|
|
4131
|
+
// 360
|
|
4132
|
+
],
|
|
4133
|
+
[VERSION3, [NAME, "360"]],
|
|
4134
|
+
[
|
|
4135
|
+
/\b(qq)\/([\w\.]+)/i
|
|
4136
|
+
// QQ
|
|
4137
|
+
],
|
|
4138
|
+
[[NAME, /(.+)/, "$1Browser"], VERSION3],
|
|
4139
|
+
[
|
|
4140
|
+
/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
|
|
4141
|
+
],
|
|
4142
|
+
[[NAME, /(.+)/, "$1" + SUFFIX_BROWSER], VERSION3],
|
|
4143
|
+
[
|
|
4144
|
+
// Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
|
|
4145
|
+
/samsungbrowser\/([\w\.]+)/i
|
|
4146
|
+
// Samsung Internet
|
|
4147
|
+
],
|
|
4148
|
+
[VERSION3, [NAME, SAMSUNG + " Internet"]],
|
|
4149
|
+
[
|
|
4150
|
+
/metasr[\/ ]?([\d\.]+)/i
|
|
4151
|
+
// Sogou Explorer
|
|
4152
|
+
],
|
|
4153
|
+
[VERSION3, [NAME, SOGOU + " Explorer"]],
|
|
4154
|
+
[
|
|
4155
|
+
/(sogou)mo\w+\/([\d\.]+)/i
|
|
4156
|
+
// Sogou Mobile
|
|
4157
|
+
],
|
|
4158
|
+
[[NAME, SOGOU + " Mobile"], VERSION3],
|
|
4159
|
+
[
|
|
4160
|
+
/(electron)\/([\w\.]+) safari/i,
|
|
4161
|
+
// Electron-based App
|
|
4162
|
+
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
|
|
4163
|
+
// Tesla
|
|
4164
|
+
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
|
|
4165
|
+
// QQ/2345
|
|
4166
|
+
],
|
|
4167
|
+
[NAME, VERSION3],
|
|
4168
|
+
[
|
|
4169
|
+
/(lbbrowser|rekonq)/i
|
|
4170
|
+
// LieBao Browser/Rekonq
|
|
4171
|
+
],
|
|
4172
|
+
[NAME],
|
|
4173
|
+
[
|
|
4174
|
+
/ome\/([\w\.]+) \w* ?(iron) saf/i,
|
|
4175
|
+
// Iron
|
|
4176
|
+
/ome\/([\w\.]+).+qihu (360)[es]e/i
|
|
4177
|
+
// 360
|
|
4178
|
+
],
|
|
4179
|
+
[VERSION3, NAME],
|
|
4180
|
+
[
|
|
4181
|
+
// WebView
|
|
4182
|
+
/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
|
|
4183
|
+
// Facebook App for iOS & Android
|
|
4184
|
+
],
|
|
4185
|
+
[[NAME, FACEBOOK], VERSION3, [TYPE, INAPP]],
|
|
4186
|
+
[
|
|
4187
|
+
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
|
|
4188
|
+
// Kakao App
|
|
4189
|
+
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
|
|
4190
|
+
// Naver InApp
|
|
4191
|
+
/(daum)apps[\/ ]([\w\.]+)/i,
|
|
4192
|
+
// Daum App
|
|
4193
|
+
/safari (line)\/([\w\.]+)/i,
|
|
4194
|
+
// Line App for iOS
|
|
4195
|
+
/\b(line)\/([\w\.]+)\/iab/i,
|
|
4196
|
+
// Line App for Android
|
|
4197
|
+
/(alipay)client\/([\w\.]+)/i,
|
|
4198
|
+
// Alipay
|
|
4199
|
+
/(twitter)(?:and| f.+e\/([\w\.]+))/i,
|
|
4200
|
+
// Twitter
|
|
4201
|
+
/(bing)(?:web|sapphire)\/([\w\.]+)/i,
|
|
4202
|
+
// Bing
|
|
4203
|
+
/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
|
|
4204
|
+
// Instagram/Snapchat/Klarna
|
|
4205
|
+
],
|
|
4206
|
+
[NAME, VERSION3, [TYPE, INAPP]],
|
|
4207
|
+
[
|
|
4208
|
+
/\bgsa\/([\w\.]+) .*safari\//i
|
|
4209
|
+
// Google Search Appliance on iOS
|
|
4210
|
+
],
|
|
4211
|
+
[VERSION3, [NAME, "GSA"], [TYPE, INAPP]],
|
|
4212
|
+
[
|
|
4213
|
+
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
|
|
4214
|
+
// TikTok
|
|
4215
|
+
],
|
|
4216
|
+
[VERSION3, [NAME, "TikTok"], [TYPE, INAPP]],
|
|
4217
|
+
[
|
|
4218
|
+
/\[(linkedin)app\]/i
|
|
4219
|
+
// LinkedIn App for iOS & Android
|
|
4220
|
+
],
|
|
4221
|
+
[NAME, [TYPE, INAPP]],
|
|
4222
|
+
[
|
|
4223
|
+
/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i
|
|
4224
|
+
// Zalo
|
|
4225
|
+
],
|
|
4226
|
+
[[NAME, /(.+)/, "Zalo"], VERSION3, [TYPE, INAPP]],
|
|
4227
|
+
[
|
|
4228
|
+
/(chromium)[\/ ]([-\w\.]+)/i
|
|
4229
|
+
// Chromium
|
|
4230
|
+
],
|
|
4231
|
+
[NAME, VERSION3],
|
|
4232
|
+
[
|
|
4233
|
+
/headlesschrome(?:\/([\w\.]+)| )/i
|
|
4234
|
+
// Chrome Headless
|
|
4235
|
+
],
|
|
4236
|
+
[VERSION3, [NAME, CHROME + " Headless"]],
|
|
4237
|
+
[
|
|
4238
|
+
/wv\).+chrome\/([\w\.]+).+edgw\//i
|
|
4239
|
+
// Edge WebView2
|
|
4240
|
+
],
|
|
4241
|
+
[VERSION3, [NAME, EDGE + " WebView2"]],
|
|
4242
|
+
[
|
|
4243
|
+
/ wv\).+(chrome)\/([\w\.]+)/i
|
|
4244
|
+
// Chrome WebView
|
|
4245
|
+
],
|
|
4246
|
+
[[NAME, CHROME + " WebView"], VERSION3],
|
|
4247
|
+
[
|
|
4248
|
+
/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
|
|
4249
|
+
// Android Browser
|
|
4250
|
+
],
|
|
4251
|
+
[VERSION3, [NAME, "Android" + SUFFIX_BROWSER]],
|
|
4252
|
+
[
|
|
4253
|
+
/chrome\/([\w\.]+) mobile/i
|
|
4254
|
+
// Chrome Mobile
|
|
4255
|
+
],
|
|
4256
|
+
[VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
|
|
4257
|
+
[
|
|
4258
|
+
/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
|
|
4259
|
+
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
|
4260
|
+
],
|
|
4261
|
+
[NAME, VERSION3],
|
|
4262
|
+
[
|
|
4263
|
+
/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i
|
|
4264
|
+
// Safari Mobile
|
|
4265
|
+
],
|
|
4266
|
+
[VERSION3, [NAME, PREFIX_MOBILE + "Safari"]],
|
|
4267
|
+
[
|
|
4268
|
+
/iphone .*mobile(?:\/\w+ | ?)safari/i
|
|
4269
|
+
],
|
|
4270
|
+
[[NAME, PREFIX_MOBILE + "Safari"]],
|
|
4271
|
+
[
|
|
4272
|
+
/version\/([\w\.\,]+) .*(safari)/i
|
|
4273
|
+
// Safari
|
|
4274
|
+
],
|
|
4275
|
+
[VERSION3, NAME],
|
|
4276
|
+
[
|
|
4277
|
+
/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
|
|
4278
|
+
// Safari < 3.0
|
|
4279
|
+
],
|
|
4280
|
+
[NAME, [VERSION3, "1"]],
|
|
4281
|
+
[
|
|
4282
|
+
/(webkit|khtml)\/([\w\.]+)/i
|
|
4283
|
+
],
|
|
4284
|
+
[NAME, VERSION3],
|
|
4285
|
+
[
|
|
4286
|
+
// Gecko based
|
|
4287
|
+
/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i
|
|
4288
|
+
// Firefox Mobile
|
|
4289
|
+
],
|
|
4290
|
+
[[NAME, PREFIX_MOBILE + FIREFOX], VERSION3],
|
|
4291
|
+
[
|
|
4292
|
+
/(navigator|netscape\d?)\/([-\w\.]+)/i
|
|
4293
|
+
// Netscape
|
|
4294
|
+
],
|
|
4295
|
+
[[NAME, "Netscape"], VERSION3],
|
|
4296
|
+
[
|
|
4297
|
+
/(wolvic|librewolf)\/([\w\.]+)/i
|
|
4298
|
+
// Wolvic/LibreWolf
|
|
4299
|
+
],
|
|
4300
|
+
[NAME, VERSION3],
|
|
4301
|
+
[
|
|
4302
|
+
/mobile vr; rv:([\w\.]+)\).+firefox/i
|
|
4303
|
+
// Firefox Reality
|
|
4304
|
+
],
|
|
4305
|
+
[VERSION3, [NAME, FIREFOX + " Reality"]],
|
|
4306
|
+
[
|
|
4307
|
+
/ekiohf.+(flow)\/([\w\.]+)/i,
|
|
4308
|
+
// Flow
|
|
4309
|
+
/(swiftfox)/i,
|
|
4310
|
+
// Swiftfox
|
|
4311
|
+
/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
|
|
4312
|
+
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
|
4313
|
+
/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
|
|
4314
|
+
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
|
4315
|
+
/(firefox)\/([\w\.]+)/i,
|
|
4316
|
+
// Other Firefox-based
|
|
4317
|
+
/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
|
|
4318
|
+
// Mozilla
|
|
4319
|
+
// Other
|
|
4320
|
+
/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
|
4321
|
+
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
|
|
4322
|
+
/\b(links) \(([\w\.]+)/i
|
|
4323
|
+
// Links
|
|
4324
|
+
],
|
|
4325
|
+
[NAME, [VERSION3, /_/g, "."]],
|
|
4326
|
+
[
|
|
4327
|
+
/(cobalt)\/([\w\.]+)/i
|
|
4328
|
+
// Cobalt
|
|
4329
|
+
],
|
|
4330
|
+
[NAME, [VERSION3, /[^\d\.]+./, EMPTY]]
|
|
4331
|
+
],
|
|
4332
|
+
cpu: [
|
|
4333
|
+
[
|
|
4334
|
+
/\b((amd|x|x86[-_]?|wow|win)64)\b/i
|
|
4335
|
+
// AMD64 (x64)
|
|
4336
|
+
],
|
|
4337
|
+
[[ARCHITECTURE, "amd64"]],
|
|
4338
|
+
[
|
|
4339
|
+
/(ia32(?=;))/i,
|
|
4340
|
+
// IA32 (quicktime)
|
|
4341
|
+
/\b((i[346]|x)86)(pc)?\b/i
|
|
4342
|
+
// IA32 (x86)
|
|
4343
|
+
],
|
|
4344
|
+
[[ARCHITECTURE, "ia32"]],
|
|
4345
|
+
[
|
|
4346
|
+
/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i
|
|
4347
|
+
// ARM64
|
|
4348
|
+
],
|
|
4349
|
+
[[ARCHITECTURE, "arm64"]],
|
|
4350
|
+
[
|
|
4351
|
+
/\b(arm(v[67])?ht?n?[fl]p?)\b/i
|
|
4352
|
+
// ARMHF
|
|
4353
|
+
],
|
|
4354
|
+
[[ARCHITECTURE, "armhf"]],
|
|
4355
|
+
[
|
|
4356
|
+
// PocketPC mistakenly identified as PowerPC
|
|
4357
|
+
/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
|
|
4358
|
+
],
|
|
4359
|
+
[[ARCHITECTURE, "arm"]],
|
|
4360
|
+
[
|
|
4361
|
+
/ sun4\w[;\)]/i
|
|
4362
|
+
// SPARC
|
|
4363
|
+
],
|
|
4364
|
+
[[ARCHITECTURE, "sparc"]],
|
|
4365
|
+
[
|
|
4366
|
+
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
|
|
4367
|
+
/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
|
|
4368
|
+
/((ppc|powerpc)(64)?)( mac|;|\))/i,
|
|
4369
|
+
// PowerPC
|
|
4370
|
+
/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
|
|
4371
|
+
// Alpha
|
|
4372
|
+
],
|
|
4373
|
+
[[ARCHITECTURE, /ower/, EMPTY, lowerize]],
|
|
4374
|
+
[
|
|
4375
|
+
/mc680.0/i
|
|
4376
|
+
],
|
|
4377
|
+
[[ARCHITECTURE, "68k"]],
|
|
4378
|
+
[
|
|
4379
|
+
/winnt.+\[axp/i
|
|
4380
|
+
],
|
|
4381
|
+
[[ARCHITECTURE, "alpha"]]
|
|
4382
|
+
],
|
|
4383
|
+
device: [
|
|
4384
|
+
[
|
|
4385
|
+
//////////////////////////
|
|
4386
|
+
// MOBILES & TABLETS
|
|
4387
|
+
/////////////////////////
|
|
4388
|
+
// Samsung
|
|
4389
|
+
/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
|
|
4390
|
+
],
|
|
4391
|
+
[MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]],
|
|
4392
|
+
[
|
|
4393
|
+
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
|
|
4394
|
+
/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
|
|
4395
|
+
/sec-(sgh\w+)/i
|
|
4396
|
+
],
|
|
4397
|
+
[MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]],
|
|
4398
|
+
[
|
|
4399
|
+
// Apple
|
|
4400
|
+
/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i
|
|
4401
|
+
// iPod/iPhone
|
|
4402
|
+
],
|
|
4403
|
+
[MODEL, [VENDOR, APPLE], [TYPE, MOBILE]],
|
|
4404
|
+
[
|
|
4405
|
+
/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,
|
|
4406
|
+
// iPad
|
|
4407
|
+
/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
|
|
4408
|
+
],
|
|
4409
|
+
[MODEL, [VENDOR, APPLE], [TYPE, TABLET]],
|
|
4410
|
+
[
|
|
4411
|
+
/(macintosh);/i
|
|
4412
|
+
],
|
|
4413
|
+
[MODEL, [VENDOR, APPLE]],
|
|
4414
|
+
[
|
|
4415
|
+
// Sharp
|
|
4416
|
+
/\b(sh-?[altvz]?\d\d[a-ekm]?)/i
|
|
4417
|
+
],
|
|
4418
|
+
[MODEL, [VENDOR, SHARP], [TYPE, MOBILE]],
|
|
4419
|
+
[
|
|
4420
|
+
// Honor
|
|
4421
|
+
/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
|
|
4422
|
+
],
|
|
4423
|
+
[MODEL, [VENDOR, HONOR], [TYPE, TABLET]],
|
|
4424
|
+
[
|
|
4425
|
+
/honor([-\w ]+)[;\)]/i
|
|
4426
|
+
],
|
|
4427
|
+
[MODEL, [VENDOR, HONOR], [TYPE, MOBILE]],
|
|
4428
|
+
[
|
|
4429
|
+
// Huawei
|
|
4430
|
+
/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
|
|
4431
|
+
],
|
|
4432
|
+
[MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]],
|
|
4433
|
+
[
|
|
4434
|
+
/(?:huawei) ?([-\w ]+)[;\)]/i,
|
|
4435
|
+
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
|
|
4436
|
+
],
|
|
4437
|
+
[MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]],
|
|
4438
|
+
[
|
|
4439
|
+
// Xiaomi
|
|
4440
|
+
/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
|
|
4441
|
+
/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i
|
|
4442
|
+
// Mi Pad tablets
|
|
4443
|
+
],
|
|
4444
|
+
[[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, TABLET]],
|
|
4445
|
+
[
|
|
4446
|
+
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,
|
|
4447
|
+
// Xiaomi POCO
|
|
4448
|
+
/\b; (\w+) build\/hm\1/i,
|
|
4449
|
+
// Xiaomi Hongmi 'numeric' models
|
|
4450
|
+
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
|
|
4451
|
+
// Xiaomi Hongmi
|
|
4452
|
+
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
|
|
4453
|
+
// Xiaomi Redmi
|
|
4454
|
+
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,
|
|
4455
|
+
// Xiaomi Redmi 'numeric' models
|
|
4456
|
+
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
|
|
4457
|
+
// Xiaomi Mi
|
|
4458
|
+
/ ([\w ]+) miui\/v?\d/i
|
|
4459
|
+
],
|
|
4460
|
+
[[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, MOBILE]],
|
|
4461
|
+
[
|
|
4462
|
+
// OnePlus
|
|
4463
|
+
/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,
|
|
4464
|
+
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
|
|
4465
|
+
],
|
|
4466
|
+
[MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]],
|
|
4467
|
+
[
|
|
4468
|
+
// OPPO
|
|
4469
|
+
/; (\w+) bui.+ oppo/i,
|
|
4470
|
+
/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
|
|
4471
|
+
],
|
|
4472
|
+
[MODEL, [VENDOR, OPPO], [TYPE, MOBILE]],
|
|
4473
|
+
[
|
|
4474
|
+
/\b(opd2(\d{3}a?))(?: bui|\))/i
|
|
4475
|
+
],
|
|
4476
|
+
[MODEL, [VENDOR, strMapper, { "OnePlus": ["203", "304", "403", "404", "413", "415"], "*": OPPO }], [TYPE, TABLET]],
|
|
4477
|
+
[
|
|
4478
|
+
// BLU
|
|
4479
|
+
/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i
|
|
4480
|
+
// Vivo series
|
|
4481
|
+
],
|
|
4482
|
+
[MODEL, [VENDOR, "BLU"], [TYPE, MOBILE]],
|
|
4483
|
+
[
|
|
4484
|
+
// Vivo
|
|
4485
|
+
/; vivo (\w+)(?: bui|\))/i,
|
|
4486
|
+
/\b(v[12]\d{3}\w?[at])(?: bui|;)/i
|
|
4487
|
+
],
|
|
4488
|
+
[MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]],
|
|
4489
|
+
[
|
|
4490
|
+
// Realme
|
|
4491
|
+
/\b(rmx[1-3]\d{3})(?: bui|;|\))/i
|
|
4492
|
+
],
|
|
4493
|
+
[MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]],
|
|
4494
|
+
[
|
|
4495
|
+
// Lenovo
|
|
4496
|
+
/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
|
|
4497
|
+
/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
|
|
4498
|
+
],
|
|
4499
|
+
[MODEL, [VENDOR, LENOVO], [TYPE, TABLET]],
|
|
4500
|
+
[
|
|
4501
|
+
/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
|
|
4502
|
+
],
|
|
4503
|
+
[MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]],
|
|
4504
|
+
[
|
|
4505
|
+
// Motorola
|
|
4506
|
+
/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
|
|
4507
|
+
/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
|
|
4508
|
+
/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
|
|
4509
|
+
],
|
|
4510
|
+
[MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]],
|
|
4511
|
+
[
|
|
4512
|
+
/\b(mz60\d|xoom[2 ]{0,2}) build\//i
|
|
4513
|
+
],
|
|
4514
|
+
[MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]],
|
|
4515
|
+
[
|
|
4516
|
+
// LG
|
|
4517
|
+
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
|
|
4518
|
+
],
|
|
4519
|
+
[MODEL, [VENDOR, LG], [TYPE, TABLET]],
|
|
4520
|
+
[
|
|
4521
|
+
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
|
|
4522
|
+
/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
|
|
4523
|
+
/\blg-?([\d\w]+) bui/i
|
|
4524
|
+
],
|
|
4525
|
+
[MODEL, [VENDOR, LG], [TYPE, MOBILE]],
|
|
4526
|
+
[
|
|
4527
|
+
// Nokia
|
|
4528
|
+
/(nokia) (t[12][01])/i
|
|
4529
|
+
],
|
|
4530
|
+
[VENDOR, MODEL, [TYPE, TABLET]],
|
|
4531
|
+
[
|
|
4532
|
+
/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
|
|
4533
|
+
/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
|
|
4534
|
+
],
|
|
4535
|
+
[[MODEL, /_/g, " "], [TYPE, MOBILE], [VENDOR, "Nokia"]],
|
|
4536
|
+
[
|
|
4537
|
+
// Google
|
|
4538
|
+
/(pixel (c|tablet))\b/i
|
|
4539
|
+
// Google Pixel C/Tablet
|
|
4540
|
+
],
|
|
4541
|
+
[MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]],
|
|
4542
|
+
[
|
|
4543
|
+
// Google Pixel
|
|
4544
|
+
/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
|
|
4545
|
+
],
|
|
4546
|
+
[MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]],
|
|
4547
|
+
[
|
|
4548
|
+
/(google) (pixelbook( go)?)/i
|
|
4549
|
+
],
|
|
4550
|
+
[VENDOR, MODEL],
|
|
4551
|
+
[
|
|
4552
|
+
// Sony
|
|
4553
|
+
/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
|
4554
|
+
],
|
|
4555
|
+
[MODEL, [VENDOR, SONY], [TYPE, MOBILE]],
|
|
4556
|
+
[
|
|
4557
|
+
/sony tablet [ps]/i,
|
|
4558
|
+
/\b(?:sony)?sgp\w+(?: bui|\))/i
|
|
4559
|
+
],
|
|
4560
|
+
[[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET]],
|
|
4561
|
+
[
|
|
4562
|
+
// Amazon
|
|
4563
|
+
/(alexa)webm/i,
|
|
4564
|
+
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
|
|
4565
|
+
// Kindle Fire without Silk / Echo Show
|
|
4566
|
+
/(kf[a-z]+)( bui|\)).+silk\//i
|
|
4567
|
+
// Kindle Fire HD
|
|
4568
|
+
],
|
|
4569
|
+
[MODEL, [VENDOR, AMAZON], [TYPE, TABLET]],
|
|
4570
|
+
[
|
|
4571
|
+
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
|
|
4572
|
+
// Fire Phone
|
|
4573
|
+
],
|
|
4574
|
+
[[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE, MOBILE]],
|
|
4575
|
+
[
|
|
4576
|
+
// BlackBerry
|
|
4577
|
+
/(playbook);[-\w\),; ]+(rim)/i
|
|
4578
|
+
// BlackBerry PlayBook
|
|
4579
|
+
],
|
|
4580
|
+
[MODEL, VENDOR, [TYPE, TABLET]],
|
|
4581
|
+
[
|
|
4582
|
+
/\b((?:bb[a-f]|st[hv])100-\d)/i,
|
|
4583
|
+
/(?:blackberry|\(bb10;) (\w+)/i
|
|
4584
|
+
],
|
|
4585
|
+
[MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]],
|
|
4586
|
+
[
|
|
4587
|
+
// Asus
|
|
4588
|
+
/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
|
|
4589
|
+
],
|
|
4590
|
+
[MODEL, [VENDOR, ASUS], [TYPE, TABLET]],
|
|
4591
|
+
[
|
|
4592
|
+
/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
|
|
4593
|
+
],
|
|
4594
|
+
[MODEL, [VENDOR, ASUS], [TYPE, MOBILE]],
|
|
4595
|
+
[
|
|
4596
|
+
// HTC
|
|
4597
|
+
/(nexus 9)/i
|
|
4598
|
+
// HTC Nexus 9
|
|
4599
|
+
],
|
|
4600
|
+
[MODEL, [VENDOR, "HTC"], [TYPE, TABLET]],
|
|
4601
|
+
[
|
|
4602
|
+
/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
|
|
4603
|
+
// HTC
|
|
4604
|
+
// ZTE
|
|
4605
|
+
/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
|
|
4606
|
+
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
|
|
4607
|
+
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
|
4608
|
+
],
|
|
4609
|
+
[VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]],
|
|
4610
|
+
[
|
|
4611
|
+
// TCL
|
|
4612
|
+
/tcl (xess p17aa)/i,
|
|
4613
|
+
/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
|
|
4614
|
+
],
|
|
4615
|
+
[MODEL, [VENDOR, "TCL"], [TYPE, TABLET]],
|
|
4616
|
+
[
|
|
4617
|
+
/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
|
|
4618
|
+
],
|
|
4619
|
+
[MODEL, [VENDOR, "TCL"], [TYPE, MOBILE]],
|
|
4620
|
+
[
|
|
4621
|
+
// itel
|
|
4622
|
+
/(itel) ((\w+))/i
|
|
4623
|
+
],
|
|
4624
|
+
[[VENDOR, lowerize], MODEL, [TYPE, strMapper, { "tablet": ["p10001l", "w7001"], "*": "mobile" }]],
|
|
4625
|
+
[
|
|
4626
|
+
// Acer
|
|
4627
|
+
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
|
|
4628
|
+
],
|
|
4629
|
+
[MODEL, [VENDOR, "Acer"], [TYPE, TABLET]],
|
|
4630
|
+
[
|
|
4631
|
+
// Meizu
|
|
4632
|
+
/droid.+; (m[1-5] note) bui/i,
|
|
4633
|
+
/\bmz-([-\w]{2,})/i
|
|
4634
|
+
],
|
|
4635
|
+
[MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]],
|
|
4636
|
+
[
|
|
4637
|
+
// Ulefone
|
|
4638
|
+
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
|
|
4639
|
+
],
|
|
4640
|
+
[MODEL, [VENDOR, "Ulefone"], [TYPE, MOBILE]],
|
|
4641
|
+
[
|
|
4642
|
+
// Energizer
|
|
4643
|
+
/; (energy ?\w+)(?: bui|\))/i,
|
|
4644
|
+
/; energizer ([\w ]+)(?: bui|\))/i
|
|
4645
|
+
],
|
|
4646
|
+
[MODEL, [VENDOR, "Energizer"], [TYPE, MOBILE]],
|
|
4647
|
+
[
|
|
4648
|
+
// Cat
|
|
4649
|
+
/; cat (b35);/i,
|
|
4650
|
+
/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
|
|
4651
|
+
],
|
|
4652
|
+
[MODEL, [VENDOR, "Cat"], [TYPE, MOBILE]],
|
|
4653
|
+
[
|
|
4654
|
+
// Smartfren
|
|
4655
|
+
/((?:new )?andromax[\w- ]+)(?: bui|\))/i
|
|
4656
|
+
],
|
|
4657
|
+
[MODEL, [VENDOR, "Smartfren"], [TYPE, MOBILE]],
|
|
4658
|
+
[
|
|
4659
|
+
// Nothing
|
|
4660
|
+
/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
|
|
4661
|
+
],
|
|
4662
|
+
[MODEL, [VENDOR, "Nothing"], [TYPE, MOBILE]],
|
|
4663
|
+
[
|
|
4664
|
+
// Archos
|
|
4665
|
+
/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
|
|
4666
|
+
/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
|
|
4667
|
+
],
|
|
4668
|
+
[MODEL, [VENDOR, "Archos"], [TYPE, TABLET]],
|
|
4669
|
+
[
|
|
4670
|
+
/archos ([\w ]+)( b|\))/i,
|
|
4671
|
+
/; (ac[3-6]\d\w{2,8})( b|\))/i
|
|
4672
|
+
],
|
|
4673
|
+
[MODEL, [VENDOR, "Archos"], [TYPE, MOBILE]],
|
|
4674
|
+
[
|
|
4675
|
+
// HMD
|
|
4676
|
+
/; (n159v)/i
|
|
4677
|
+
],
|
|
4678
|
+
[MODEL, [VENDOR, "HMD"], [TYPE, MOBILE]],
|
|
4679
|
+
[
|
|
4680
|
+
// MIXED
|
|
4681
|
+
/(imo) (tab \w+)/i,
|
|
4682
|
+
// IMO
|
|
4683
|
+
/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i
|
|
4684
|
+
// Infinix XPad / Tecno
|
|
4685
|
+
],
|
|
4686
|
+
[VENDOR, MODEL, [TYPE, TABLET]],
|
|
4687
|
+
[
|
|
4688
|
+
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
|
|
4689
|
+
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
|
|
4690
|
+
// BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
|
|
4691
|
+
/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
|
|
4692
|
+
/(hp) ([\w ]+\w)/i,
|
|
4693
|
+
// HP iPAQ
|
|
4694
|
+
/(microsoft); (lumia[\w ]+)/i,
|
|
4695
|
+
// Microsoft Lumia
|
|
4696
|
+
/(oppo) ?([\w ]+) bui/i,
|
|
4697
|
+
// OPPO
|
|
4698
|
+
/(hisense) ([ehv][\w ]+)\)/i,
|
|
4699
|
+
// Hisense
|
|
4700
|
+
/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
|
|
4701
|
+
// Philips
|
|
4702
|
+
],
|
|
4703
|
+
[VENDOR, MODEL, [TYPE, MOBILE]],
|
|
4704
|
+
[
|
|
4705
|
+
/(kobo)\s(ereader|touch)/i,
|
|
4706
|
+
// Kobo
|
|
4707
|
+
/(hp).+(touchpad(?!.+tablet)|tablet)/i,
|
|
4708
|
+
// HP TouchPad
|
|
4709
|
+
/(kindle)\/([\w\.]+)/i
|
|
4710
|
+
// Kindle
|
|
4711
|
+
],
|
|
4712
|
+
[VENDOR, MODEL, [TYPE, TABLET]],
|
|
4713
|
+
[
|
|
4714
|
+
/(surface duo)/i
|
|
4715
|
+
// Surface Duo
|
|
4716
|
+
],
|
|
4717
|
+
[MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]],
|
|
4718
|
+
[
|
|
4719
|
+
/droid [\d\.]+; (fp\du?)(?: b|\))/i
|
|
4720
|
+
// Fairphone
|
|
4721
|
+
],
|
|
4722
|
+
[MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]],
|
|
4723
|
+
[
|
|
4724
|
+
/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i
|
|
4725
|
+
// Nvidia Tablets
|
|
4726
|
+
],
|
|
4727
|
+
[MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]],
|
|
4728
|
+
[
|
|
4729
|
+
/(sprint) (\w+)/i
|
|
4730
|
+
// Sprint Phones
|
|
4731
|
+
],
|
|
4732
|
+
[VENDOR, MODEL, [TYPE, MOBILE]],
|
|
4733
|
+
[
|
|
4734
|
+
/(kin\.[onetw]{3})/i
|
|
4735
|
+
// Microsoft Kin
|
|
4736
|
+
],
|
|
4737
|
+
[[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE, MOBILE]],
|
|
4738
|
+
[
|
|
4739
|
+
/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
|
|
4740
|
+
// Zebra
|
|
4741
|
+
],
|
|
4742
|
+
[MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]],
|
|
4743
|
+
[
|
|
4744
|
+
/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
|
|
4745
|
+
],
|
|
4746
|
+
[MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]],
|
|
4747
|
+
[
|
|
4748
|
+
///////////////////
|
|
4749
|
+
// SMARTTVS
|
|
4750
|
+
///////////////////
|
|
4751
|
+
/(philips)[\w ]+tv/i,
|
|
4752
|
+
// Philips
|
|
4753
|
+
/smart-tv.+(samsung)/i
|
|
4754
|
+
// Samsung
|
|
4755
|
+
],
|
|
4756
|
+
[VENDOR, [TYPE, SMARTTV]],
|
|
4757
|
+
[
|
|
4758
|
+
/hbbtv.+maple;(\d+)/i
|
|
4759
|
+
],
|
|
4760
|
+
[[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE, SMARTTV]],
|
|
4761
|
+
[
|
|
4762
|
+
/(vizio)(?: |.+model\/)(\w+-\w+)/i,
|
|
4763
|
+
// Vizio
|
|
4764
|
+
/tcast.+(lg)e?. ([-\w]+)/i
|
|
4765
|
+
// LG SmartTV
|
|
4766
|
+
],
|
|
4767
|
+
[VENDOR, MODEL, [TYPE, SMARTTV]],
|
|
4768
|
+
[
|
|
4769
|
+
/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
|
|
4770
|
+
],
|
|
4771
|
+
[[VENDOR, LG], [TYPE, SMARTTV]],
|
|
4772
|
+
[
|
|
4773
|
+
/(apple) ?tv/i
|
|
4774
|
+
// Apple TV
|
|
4775
|
+
],
|
|
4776
|
+
[VENDOR, [MODEL, APPLE + " TV"], [TYPE, SMARTTV]],
|
|
4777
|
+
[
|
|
4778
|
+
/crkey.*devicetype\/chromecast/i
|
|
4779
|
+
// Google Chromecast Third Generation
|
|
4780
|
+
],
|
|
4781
|
+
[[MODEL, CHROMECAST + " Third Generation"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
4782
|
+
[
|
|
4783
|
+
/crkey.*devicetype\/([^/]*)/i
|
|
4784
|
+
// Google Chromecast with specific device type
|
|
4785
|
+
],
|
|
4786
|
+
[[MODEL, /^/, "Chromecast "], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
4787
|
+
[
|
|
4788
|
+
/fuchsia.*crkey/i
|
|
4789
|
+
// Google Chromecast Nest Hub
|
|
4790
|
+
],
|
|
4791
|
+
[[MODEL, CHROMECAST + " Nest Hub"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
4792
|
+
[
|
|
4793
|
+
/crkey/i
|
|
4794
|
+
// Google Chromecast, Linux-based or unknown
|
|
4795
|
+
],
|
|
4796
|
+
[[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
4797
|
+
[
|
|
4798
|
+
/(portaltv)/i
|
|
4799
|
+
// Facebook Portal TV
|
|
4800
|
+
],
|
|
4801
|
+
[MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]],
|
|
4802
|
+
[
|
|
4803
|
+
/droid.+aft(\w+)( bui|\))/i
|
|
4804
|
+
// Fire TV
|
|
4805
|
+
],
|
|
4806
|
+
[MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]],
|
|
4807
|
+
[
|
|
4808
|
+
/(shield \w+ tv)/i
|
|
4809
|
+
// Nvidia Shield TV
|
|
4810
|
+
],
|
|
4811
|
+
[MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]],
|
|
4812
|
+
[
|
|
4813
|
+
/\(dtv[\);].+(aquos)/i,
|
|
4814
|
+
/(aquos-tv[\w ]+)\)/i
|
|
4815
|
+
// Sharp
|
|
4816
|
+
],
|
|
4817
|
+
[MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],
|
|
4818
|
+
[
|
|
4819
|
+
/(bravia[\w ]+)( bui|\))/i
|
|
4820
|
+
// Sony
|
|
4821
|
+
],
|
|
4822
|
+
[MODEL, [VENDOR, SONY], [TYPE, SMARTTV]],
|
|
4823
|
+
[
|
|
4824
|
+
/(mi(tv|box)-?\w+) bui/i
|
|
4825
|
+
// Xiaomi
|
|
4826
|
+
],
|
|
4827
|
+
[MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]],
|
|
4828
|
+
[
|
|
4829
|
+
/Hbbtv.*(technisat) (.*);/i
|
|
4830
|
+
// TechniSAT
|
|
4831
|
+
],
|
|
4832
|
+
[VENDOR, MODEL, [TYPE, SMARTTV]],
|
|
4833
|
+
[
|
|
4834
|
+
/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
|
|
4835
|
+
// Roku
|
|
4836
|
+
/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
|
|
4837
|
+
// HbbTV devices
|
|
4838
|
+
],
|
|
4839
|
+
[[VENDOR, /.+\/(\w+)/, "$1", strMapper, { "LG": "lge" }], [MODEL, trim2], [TYPE, SMARTTV]],
|
|
4840
|
+
[
|
|
4841
|
+
///////////////////
|
|
4842
|
+
// CONSOLES
|
|
4843
|
+
///////////////////
|
|
4844
|
+
/(playstation \w+)/i
|
|
4845
|
+
// Playstation
|
|
4846
|
+
],
|
|
4847
|
+
[MODEL, [VENDOR, SONY], [TYPE, CONSOLE]],
|
|
4848
|
+
[
|
|
4849
|
+
/\b(xbox(?: one)?(?!; xbox))[\); ]/i
|
|
4850
|
+
// Microsoft Xbox
|
|
4851
|
+
],
|
|
4852
|
+
[MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]],
|
|
4853
|
+
[
|
|
4854
|
+
/(ouya)/i,
|
|
4855
|
+
// Ouya
|
|
4856
|
+
/(nintendo) (\w+)/i,
|
|
4857
|
+
// Nintendo
|
|
4858
|
+
/(retroid) (pocket ([^\)]+))/i
|
|
4859
|
+
// Retroid Pocket
|
|
4860
|
+
],
|
|
4861
|
+
[VENDOR, MODEL, [TYPE, CONSOLE]],
|
|
4862
|
+
[
|
|
4863
|
+
/droid.+; (shield)( bui|\))/i
|
|
4864
|
+
// Nvidia Portable
|
|
4865
|
+
],
|
|
4866
|
+
[MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]],
|
|
4867
|
+
[
|
|
4868
|
+
///////////////////
|
|
4869
|
+
// WEARABLES
|
|
4870
|
+
///////////////////
|
|
4871
|
+
/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i
|
|
4872
|
+
// Samsung Galaxy Watch
|
|
4873
|
+
],
|
|
4874
|
+
[MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]],
|
|
4875
|
+
[
|
|
4876
|
+
/((pebble))app/i,
|
|
4877
|
+
// Pebble
|
|
4878
|
+
/(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i
|
|
4879
|
+
// Asus ZenWatch / LG Watch / Pixel Watch
|
|
4880
|
+
],
|
|
4881
|
+
[VENDOR, MODEL, [TYPE, WEARABLE]],
|
|
4882
|
+
[
|
|
4883
|
+
/(ow(?:19|20)?we?[1-3]{1,3})/i
|
|
4884
|
+
// Oppo Watch
|
|
4885
|
+
],
|
|
4886
|
+
[MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]],
|
|
4887
|
+
[
|
|
4888
|
+
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
|
|
4889
|
+
// Apple Watch
|
|
4890
|
+
],
|
|
4891
|
+
[MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]],
|
|
4892
|
+
[
|
|
4893
|
+
/(opwwe\d{3})/i
|
|
4894
|
+
// OnePlus Watch
|
|
4895
|
+
],
|
|
4896
|
+
[MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]],
|
|
4897
|
+
[
|
|
4898
|
+
/(moto 360)/i
|
|
4899
|
+
// Motorola 360
|
|
4900
|
+
],
|
|
4901
|
+
[MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]],
|
|
4902
|
+
[
|
|
4903
|
+
/(smartwatch 3)/i
|
|
4904
|
+
// Sony SmartWatch
|
|
4905
|
+
],
|
|
4906
|
+
[MODEL, [VENDOR, SONY], [TYPE, WEARABLE]],
|
|
4907
|
+
[
|
|
4908
|
+
/(g watch r)/i
|
|
4909
|
+
// LG G Watch R
|
|
4910
|
+
],
|
|
4911
|
+
[MODEL, [VENDOR, LG], [TYPE, WEARABLE]],
|
|
4912
|
+
[
|
|
4913
|
+
/droid.+; (wt63?0{2,3})\)/i
|
|
4914
|
+
],
|
|
4915
|
+
[MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]],
|
|
4916
|
+
[
|
|
4917
|
+
///////////////////
|
|
4918
|
+
// XR
|
|
4919
|
+
///////////////////
|
|
4920
|
+
/droid.+; (glass) \d/i
|
|
4921
|
+
// Google Glass
|
|
4922
|
+
],
|
|
4923
|
+
[MODEL, [VENDOR, GOOGLE], [TYPE, XR]],
|
|
4924
|
+
[
|
|
4925
|
+
/(pico) ([\w ]+) os\d/i
|
|
4926
|
+
// Pico
|
|
4927
|
+
],
|
|
4928
|
+
[VENDOR, MODEL, [TYPE, XR]],
|
|
4929
|
+
[
|
|
4930
|
+
/(quest( \d| pro)?s?).+vr/i
|
|
4931
|
+
// Meta Quest
|
|
4932
|
+
],
|
|
4933
|
+
[MODEL, [VENDOR, FACEBOOK], [TYPE, XR]],
|
|
4934
|
+
[
|
|
4935
|
+
/mobile vr; rv.+firefox/i
|
|
4936
|
+
// Unidentifiable VR device using Firefox Reality / Wolvic
|
|
4937
|
+
],
|
|
4938
|
+
[[TYPE, XR]],
|
|
4939
|
+
[
|
|
4940
|
+
///////////////////
|
|
4941
|
+
// EMBEDDED
|
|
4942
|
+
///////////////////
|
|
4943
|
+
/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
|
|
4944
|
+
// Tesla
|
|
4945
|
+
],
|
|
4946
|
+
[VENDOR, [TYPE, EMBEDDED]],
|
|
4947
|
+
[
|
|
4948
|
+
/(aeobc)\b/i
|
|
4949
|
+
// Echo Dot
|
|
4950
|
+
],
|
|
4951
|
+
[MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]],
|
|
4952
|
+
[
|
|
4953
|
+
/(homepod).+mac os/i
|
|
4954
|
+
// Apple HomePod
|
|
4955
|
+
],
|
|
4956
|
+
[MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]],
|
|
4957
|
+
[
|
|
4958
|
+
/windows iot/i
|
|
4959
|
+
// Unidentifiable embedded device using Windows IoT
|
|
4960
|
+
],
|
|
4961
|
+
[[TYPE, EMBEDDED]],
|
|
4962
|
+
[
|
|
4963
|
+
////////////////////
|
|
4964
|
+
// MIXED (GENERIC)
|
|
4965
|
+
///////////////////
|
|
4966
|
+
/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i
|
|
4967
|
+
// Unidentifiable SmartTV
|
|
4968
|
+
],
|
|
4969
|
+
[MODEL, [TYPE, SMARTTV]],
|
|
4970
|
+
[
|
|
4971
|
+
/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
|
|
4972
|
+
],
|
|
4973
|
+
[[TYPE, SMARTTV]],
|
|
4974
|
+
[
|
|
4975
|
+
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
|
|
4976
|
+
],
|
|
4977
|
+
[MODEL, [TYPE, strMapper, { "mobile": "Mobile", "xr": "VR", "*": TABLET }]],
|
|
4978
|
+
[
|
|
4979
|
+
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
|
|
4980
|
+
// Unidentifiable Tablet
|
|
4981
|
+
],
|
|
4982
|
+
[[TYPE, TABLET]],
|
|
4983
|
+
[
|
|
4984
|
+
/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
|
|
4985
|
+
// Unidentifiable Mobile
|
|
4986
|
+
],
|
|
4987
|
+
[[TYPE, MOBILE]],
|
|
4988
|
+
[
|
|
4989
|
+
/droid .+?; ([\w\. -]+)( bui|\))/i
|
|
4990
|
+
// Generic Android Device
|
|
4991
|
+
],
|
|
4992
|
+
[MODEL, [VENDOR, "Generic"]]
|
|
4993
|
+
],
|
|
4994
|
+
engine: [
|
|
4995
|
+
[
|
|
4996
|
+
/windows.+ edge\/([\w\.]+)/i
|
|
4997
|
+
// EdgeHTML
|
|
4998
|
+
],
|
|
4999
|
+
[VERSION3, [NAME, EDGE + "HTML"]],
|
|
5000
|
+
[
|
|
5001
|
+
/(arkweb)\/([\w\.]+)/i
|
|
5002
|
+
// ArkWeb
|
|
5003
|
+
],
|
|
5004
|
+
[NAME, VERSION3],
|
|
5005
|
+
[
|
|
5006
|
+
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
|
|
5007
|
+
// Blink
|
|
5008
|
+
],
|
|
5009
|
+
[VERSION3, [NAME, "Blink"]],
|
|
5010
|
+
[
|
|
5011
|
+
/(presto)\/([\w\.]+)/i,
|
|
5012
|
+
// Presto
|
|
5013
|
+
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
|
|
5014
|
+
// WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
|
|
5015
|
+
/ekioh(flow)\/([\w\.]+)/i,
|
|
5016
|
+
// Flow
|
|
5017
|
+
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
|
|
5018
|
+
// KHTML/Tasman/Links
|
|
5019
|
+
/(icab)[\/ ]([23]\.[\d\.]+)/i,
|
|
5020
|
+
// iCab
|
|
5021
|
+
/\b(libweb)/i
|
|
5022
|
+
// LibWeb
|
|
5023
|
+
],
|
|
5024
|
+
[NAME, VERSION3],
|
|
5025
|
+
[
|
|
5026
|
+
/ladybird\//i
|
|
5027
|
+
],
|
|
5028
|
+
[[NAME, "LibWeb"]],
|
|
5029
|
+
[
|
|
5030
|
+
/rv\:([\w\.]{1,9})\b.+(gecko)/i
|
|
5031
|
+
// Gecko
|
|
5032
|
+
],
|
|
5033
|
+
[VERSION3, NAME]
|
|
5034
|
+
],
|
|
5035
|
+
os: [
|
|
5036
|
+
[
|
|
5037
|
+
// Windows
|
|
5038
|
+
/(windows nt) (6\.[23]); arm/i
|
|
5039
|
+
// Windows RT
|
|
5040
|
+
],
|
|
5041
|
+
[[NAME, /N/, "R"], [VERSION3, strMapper, windowsVersionMap]],
|
|
5042
|
+
[
|
|
5043
|
+
/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,
|
|
5044
|
+
// Windows IoT/Mobile/Phone
|
|
5045
|
+
// Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
|
|
5046
|
+
/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
|
|
5047
|
+
],
|
|
5048
|
+
[NAME, VERSION3],
|
|
5049
|
+
[
|
|
5050
|
+
/windows nt ?([\d\.\)]*)(?!.+xbox)/i,
|
|
5051
|
+
/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
|
|
5052
|
+
],
|
|
5053
|
+
[[VERSION3, /(;|\))/g, "", strMapper, windowsVersionMap], [NAME, WINDOWS]],
|
|
5054
|
+
[
|
|
5055
|
+
/(windows ce)\/?([\d\.]*)/i
|
|
5056
|
+
// Windows CE
|
|
5057
|
+
],
|
|
5058
|
+
[NAME, VERSION3],
|
|
5059
|
+
[
|
|
5060
|
+
// iOS/macOS
|
|
5061
|
+
/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
|
|
5062
|
+
// iOS
|
|
5063
|
+
/(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i,
|
|
5064
|
+
/cfnetwork\/.+darwin/i
|
|
5065
|
+
],
|
|
5066
|
+
[[VERSION3, /_/g, "."], [NAME, "iOS"]],
|
|
5067
|
+
[
|
|
5068
|
+
/(mac os x) ?([\w\. ]*)/i,
|
|
5069
|
+
/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i
|
|
5070
|
+
// Mac OS
|
|
5071
|
+
],
|
|
5072
|
+
[[NAME, "macOS"], [VERSION3, /_/g, "."]],
|
|
5073
|
+
[
|
|
5074
|
+
// Google Chromecast
|
|
5075
|
+
/android ([\d\.]+).*crkey/i
|
|
5076
|
+
// Google Chromecast, Android-based
|
|
5077
|
+
],
|
|
5078
|
+
[VERSION3, [NAME, CHROMECAST + " Android"]],
|
|
5079
|
+
[
|
|
5080
|
+
/fuchsia.*crkey\/([\d\.]+)/i
|
|
5081
|
+
// Google Chromecast, Fuchsia-based
|
|
5082
|
+
],
|
|
5083
|
+
[VERSION3, [NAME, CHROMECAST + " Fuchsia"]],
|
|
5084
|
+
[
|
|
5085
|
+
/crkey\/([\d\.]+).*devicetype\/smartspeaker/i
|
|
5086
|
+
// Google Chromecast, Linux-based Smart Speaker
|
|
5087
|
+
],
|
|
5088
|
+
[VERSION3, [NAME, CHROMECAST + " SmartSpeaker"]],
|
|
5089
|
+
[
|
|
5090
|
+
/linux.*crkey\/([\d\.]+)/i
|
|
5091
|
+
// Google Chromecast, Legacy Linux-based
|
|
5092
|
+
],
|
|
5093
|
+
[VERSION3, [NAME, CHROMECAST + " Linux"]],
|
|
5094
|
+
[
|
|
5095
|
+
/crkey\/([\d\.]+)/i
|
|
5096
|
+
// Google Chromecast, unknown
|
|
5097
|
+
],
|
|
5098
|
+
[VERSION3, [NAME, CHROMECAST]],
|
|
5099
|
+
[
|
|
5100
|
+
// Mobile OSes
|
|
5101
|
+
/droid ([\w\.]+)\b.+(android[- ]x86)/i
|
|
5102
|
+
// Android-x86
|
|
5103
|
+
],
|
|
5104
|
+
[VERSION3, NAME],
|
|
5105
|
+
[
|
|
5106
|
+
/(ubuntu) ([\w\.]+) like android/i
|
|
5107
|
+
// Ubuntu Touch
|
|
5108
|
+
],
|
|
5109
|
+
[[NAME, /(.+)/, "$1 Touch"], VERSION3],
|
|
5110
|
+
[
|
|
5111
|
+
/(harmonyos)[\/ ]?([\d\.]*)/i,
|
|
5112
|
+
// HarmonyOS
|
|
5113
|
+
// Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
|
|
5114
|
+
/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
|
|
5115
|
+
],
|
|
5116
|
+
[NAME, VERSION3],
|
|
5117
|
+
[
|
|
5118
|
+
/\(bb(10);/i
|
|
5119
|
+
// BlackBerry 10
|
|
5120
|
+
],
|
|
5121
|
+
[VERSION3, [NAME, BLACKBERRY]],
|
|
5122
|
+
[
|
|
5123
|
+
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i
|
|
5124
|
+
// Symbian
|
|
5125
|
+
],
|
|
5126
|
+
[VERSION3, [NAME, "Symbian"]],
|
|
5127
|
+
[
|
|
5128
|
+
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
|
|
5129
|
+
// Firefox OS
|
|
5130
|
+
],
|
|
5131
|
+
[VERSION3, [NAME, FIREFOX + " OS"]],
|
|
5132
|
+
[
|
|
5133
|
+
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,
|
|
5134
|
+
// WebOS
|
|
5135
|
+
/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
|
|
5136
|
+
],
|
|
5137
|
+
[VERSION3, [NAME, "webOS"]],
|
|
5138
|
+
[
|
|
5139
|
+
/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
|
|
5140
|
+
// https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
|
|
5141
|
+
],
|
|
5142
|
+
[[VERSION3, strMapper, { "25": "120", "24": "108", "23": "94", "22": "87", "6": "79", "5": "68", "4": "53", "3": "38", "2": "538", "1": "537", "*": "TV" }], [NAME, "webOS"]],
|
|
5143
|
+
[
|
|
5144
|
+
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
|
|
5145
|
+
// watchOS
|
|
5146
|
+
],
|
|
5147
|
+
[VERSION3, [NAME, "watchOS"]],
|
|
5148
|
+
[
|
|
5149
|
+
// Google ChromeOS
|
|
5150
|
+
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
|
|
5151
|
+
// Chromium OS
|
|
5152
|
+
],
|
|
5153
|
+
[[NAME, "Chrome OS"], VERSION3],
|
|
5154
|
+
[
|
|
5155
|
+
// Smart TVs
|
|
5156
|
+
/panasonic;(viera)/i,
|
|
5157
|
+
// Panasonic Viera
|
|
5158
|
+
/(netrange)mmh/i,
|
|
5159
|
+
// Netrange
|
|
5160
|
+
/(nettv)\/(\d+\.[\w\.]+)/i,
|
|
5161
|
+
// NetTV
|
|
5162
|
+
// Console
|
|
5163
|
+
/(nintendo|playstation) (\w+)/i,
|
|
5164
|
+
// Nintendo/Playstation
|
|
5165
|
+
/(xbox); +xbox ([^\);]+)/i,
|
|
5166
|
+
// Microsoft Xbox (360, One, X, S, Series X, Series S)
|
|
5167
|
+
/(pico) .+os([\w\.]+)/i,
|
|
5168
|
+
// Pico
|
|
5169
|
+
// Other
|
|
5170
|
+
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
|
|
5171
|
+
// Joli/Palm
|
|
5172
|
+
/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
|
|
5173
|
+
// Mint
|
|
5174
|
+
/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
|
|
5175
|
+
// Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
|
|
5176
|
+
/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
|
|
5177
|
+
// Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
|
|
5178
|
+
/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
|
|
5179
|
+
// Solaris
|
|
5180
|
+
/\b(aix)[; ]([1-9\.]{0,4})/i,
|
|
5181
|
+
// AIX
|
|
5182
|
+
/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
|
|
5183
|
+
// Hurd/Linux/MorphOS
|
|
5184
|
+
/(gnu) ?([\w\.]*)/i,
|
|
5185
|
+
// GNU
|
|
5186
|
+
/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
|
|
5187
|
+
// FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
|
|
5188
|
+
/(haiku) ?(r\d)?/i
|
|
5189
|
+
// Haiku
|
|
5190
|
+
],
|
|
5191
|
+
[NAME, VERSION3],
|
|
5192
|
+
[
|
|
5193
|
+
/(sunos) ?([\d\.]*)/i
|
|
5194
|
+
// Solaris
|
|
5195
|
+
],
|
|
5196
|
+
[[NAME, "Solaris"], VERSION3],
|
|
5197
|
+
[
|
|
5198
|
+
/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,
|
|
5199
|
+
// BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
|
|
5200
|
+
/(unix) ?([\w\.]*)/i
|
|
5201
|
+
// UNIX
|
|
5202
|
+
],
|
|
5203
|
+
[NAME, VERSION3]
|
|
5204
|
+
]
|
|
5205
|
+
};
|
|
5206
|
+
var defaultProps = function() {
|
|
5207
|
+
var props = { init: {}, isIgnore: {}, isIgnoreRgx: {}, toString: {} };
|
|
5208
|
+
setProps.call(props.init, [
|
|
5209
|
+
[BROWSER, [NAME, VERSION3, MAJOR, TYPE]],
|
|
5210
|
+
[CPU, [ARCHITECTURE]],
|
|
5211
|
+
[DEVICE, [TYPE, MODEL, VENDOR]],
|
|
5212
|
+
[ENGINE, [NAME, VERSION3]],
|
|
5213
|
+
[OS, [NAME, VERSION3]]
|
|
5214
|
+
]);
|
|
5215
|
+
setProps.call(props.isIgnore, [
|
|
5216
|
+
[BROWSER, [VERSION3, MAJOR]],
|
|
5217
|
+
[ENGINE, [VERSION3]],
|
|
5218
|
+
[OS, [VERSION3]]
|
|
5219
|
+
]);
|
|
5220
|
+
setProps.call(props.isIgnoreRgx, [
|
|
5221
|
+
[BROWSER, / ?browser$/i],
|
|
5222
|
+
[OS, / ?os$/i]
|
|
5223
|
+
]);
|
|
5224
|
+
setProps.call(props.toString, [
|
|
5225
|
+
[BROWSER, [NAME, VERSION3]],
|
|
5226
|
+
[CPU, [ARCHITECTURE]],
|
|
5227
|
+
[DEVICE, [VENDOR, MODEL]],
|
|
5228
|
+
[ENGINE, [NAME, VERSION3]],
|
|
5229
|
+
[OS, [NAME, VERSION3]]
|
|
5230
|
+
]);
|
|
5231
|
+
return props;
|
|
5232
|
+
}();
|
|
5233
|
+
var createIData = function(item, itemType) {
|
|
5234
|
+
var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
|
|
5235
|
+
function IData() {
|
|
5236
|
+
setProps.call(this, init_props);
|
|
5237
|
+
}
|
|
5238
|
+
IData.prototype.getItem = function() {
|
|
5239
|
+
return item;
|
|
5240
|
+
};
|
|
5241
|
+
IData.prototype.withClientHints = function() {
|
|
5242
|
+
if (!NAVIGATOR_UADATA) {
|
|
5243
|
+
return item.parseCH().get();
|
|
5244
|
+
}
|
|
5245
|
+
return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
|
|
5246
|
+
return item.setCH(new UACHData(res, false)).parseCH().get();
|
|
5247
|
+
});
|
|
5248
|
+
};
|
|
5249
|
+
IData.prototype.withFeatureCheck = function() {
|
|
5250
|
+
return item.detectFeature().get();
|
|
5251
|
+
};
|
|
5252
|
+
if (itemType != RESULT) {
|
|
5253
|
+
IData.prototype.is = function(strToCheck) {
|
|
5254
|
+
var is = false;
|
|
5255
|
+
for (var i in this) {
|
|
5256
|
+
if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
|
|
5257
|
+
is = true;
|
|
5258
|
+
if (strToCheck != TYPEOF.UNDEFINED) break;
|
|
5259
|
+
} else if (strToCheck == TYPEOF.UNDEFINED && is) {
|
|
5260
|
+
is = !is;
|
|
5261
|
+
break;
|
|
5262
|
+
}
|
|
5263
|
+
}
|
|
5264
|
+
return is;
|
|
5265
|
+
};
|
|
5266
|
+
IData.prototype.toString = function() {
|
|
5267
|
+
var str = EMPTY;
|
|
5268
|
+
for (var i in toString_props) {
|
|
5269
|
+
if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) {
|
|
5270
|
+
str += (str ? " " : EMPTY) + this[toString_props[i]];
|
|
5271
|
+
}
|
|
5272
|
+
}
|
|
5273
|
+
return str || TYPEOF.UNDEFINED;
|
|
5274
|
+
};
|
|
5275
|
+
}
|
|
5276
|
+
if (!NAVIGATOR_UADATA) {
|
|
5277
|
+
IData.prototype.then = function(cb) {
|
|
5278
|
+
var that = this;
|
|
5279
|
+
var IDataResolve = function() {
|
|
5280
|
+
for (var prop in that) {
|
|
5281
|
+
if (that.hasOwnProperty(prop)) {
|
|
5282
|
+
this[prop] = that[prop];
|
|
5283
|
+
}
|
|
5284
|
+
}
|
|
5285
|
+
};
|
|
5286
|
+
IDataResolve.prototype = {
|
|
5287
|
+
is: IData.prototype.is,
|
|
5288
|
+
toString: IData.prototype.toString
|
|
5289
|
+
};
|
|
5290
|
+
var resolveData = new IDataResolve();
|
|
5291
|
+
cb(resolveData);
|
|
5292
|
+
return resolveData;
|
|
5293
|
+
};
|
|
5294
|
+
}
|
|
5295
|
+
return new IData();
|
|
5296
|
+
};
|
|
5297
|
+
function UACHData(uach, isHttpUACH) {
|
|
5298
|
+
uach = uach || {};
|
|
5299
|
+
setProps.call(this, CH_ALL_VALUES);
|
|
5300
|
+
if (isHttpUACH) {
|
|
5301
|
+
setProps.call(this, [
|
|
5302
|
+
[BRANDS, itemListToArray(uach[CH])],
|
|
5303
|
+
[FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
|
|
5304
|
+
[MOBILE, /\?1/.test(uach[CH_MOBILE])],
|
|
5305
|
+
[MODEL, stripQuotes(uach[CH_MODEL])],
|
|
5306
|
+
[PLATFORM, stripQuotes(uach[CH_PLATFORM])],
|
|
5307
|
+
[PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
|
|
5308
|
+
[ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
|
|
5309
|
+
[FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
|
|
5310
|
+
[BITNESS, stripQuotes(uach[CH_BITNESS])]
|
|
5311
|
+
]);
|
|
5312
|
+
} else {
|
|
5313
|
+
for (var prop in uach) {
|
|
5314
|
+
if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
|
|
5315
|
+
}
|
|
5316
|
+
}
|
|
5317
|
+
}
|
|
5318
|
+
function UAItem(itemType, ua, rgxMap, uaCH) {
|
|
5319
|
+
this.get = function(prop) {
|
|
5320
|
+
if (!prop) return this.data;
|
|
5321
|
+
return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
|
|
5322
|
+
};
|
|
5323
|
+
this.set = function(prop, val) {
|
|
5324
|
+
this.data[prop] = val;
|
|
5325
|
+
return this;
|
|
5326
|
+
};
|
|
5327
|
+
this.setCH = function(ch) {
|
|
5328
|
+
this.uaCH = ch;
|
|
5329
|
+
return this;
|
|
5330
|
+
};
|
|
5331
|
+
this.detectFeature = function() {
|
|
5332
|
+
if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
|
|
5333
|
+
switch (this.itemType) {
|
|
5334
|
+
case BROWSER:
|
|
5335
|
+
if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
|
|
5336
|
+
this.set(NAME, "Brave");
|
|
5337
|
+
}
|
|
5338
|
+
break;
|
|
5339
|
+
case DEVICE:
|
|
5340
|
+
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
|
|
5341
|
+
this.set(TYPE, MOBILE);
|
|
5342
|
+
}
|
|
5343
|
+
if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
|
|
5344
|
+
this.set(MODEL, "iPad").set(TYPE, TABLET);
|
|
5345
|
+
}
|
|
5346
|
+
break;
|
|
5347
|
+
case OS:
|
|
5348
|
+
if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
|
|
5349
|
+
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
|
|
5350
|
+
}
|
|
5351
|
+
break;
|
|
5352
|
+
case RESULT:
|
|
5353
|
+
var data = this.data;
|
|
5354
|
+
var detect = function(itemType2) {
|
|
5355
|
+
return data[itemType2].getItem().detectFeature().get();
|
|
5356
|
+
};
|
|
5357
|
+
this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
|
|
5358
|
+
}
|
|
5359
|
+
}
|
|
5360
|
+
return this;
|
|
5361
|
+
};
|
|
5362
|
+
this.parseUA = function() {
|
|
5363
|
+
if (this.itemType != RESULT) {
|
|
5364
|
+
rgxMapper.call(this.data, this.ua, this.rgxMap);
|
|
5365
|
+
}
|
|
5366
|
+
switch (this.itemType) {
|
|
5367
|
+
case BROWSER:
|
|
5368
|
+
this.set(MAJOR, majorize(this.get(VERSION3)));
|
|
5369
|
+
break;
|
|
5370
|
+
case OS:
|
|
5371
|
+
if (this.get(NAME) == "iOS" && this.get(VERSION3) == "18.6") {
|
|
5372
|
+
var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
|
|
5373
|
+
if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) {
|
|
5374
|
+
this.set(VERSION3, realVersion[1]);
|
|
5375
|
+
}
|
|
5376
|
+
}
|
|
5377
|
+
break;
|
|
5378
|
+
}
|
|
5379
|
+
return this;
|
|
5380
|
+
};
|
|
5381
|
+
this.parseCH = function() {
|
|
5382
|
+
var uaCH2 = this.uaCH, rgxMap2 = this.rgxMap;
|
|
5383
|
+
switch (this.itemType) {
|
|
5384
|
+
case BROWSER:
|
|
5385
|
+
case ENGINE:
|
|
5386
|
+
var brands = uaCH2[FULLVERLIST] || uaCH2[BRANDS], prevName;
|
|
5387
|
+
if (brands) {
|
|
5388
|
+
for (var i = 0; i < brands.length; i++) {
|
|
5389
|
+
var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
|
|
5390
|
+
if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
|
|
5391
|
+
brandName = strMapper(brandName, browserHintsMap);
|
|
5392
|
+
prevName = this.get(NAME);
|
|
5393
|
+
if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
|
|
5394
|
+
this.set(NAME, brandName).set(VERSION3, brandVersion).set(MAJOR, majorize(brandVersion));
|
|
5395
|
+
}
|
|
5396
|
+
prevName = brandName;
|
|
5397
|
+
}
|
|
5398
|
+
if (this.itemType == ENGINE && brandName == CHROMIUM) {
|
|
5399
|
+
this.set(VERSION3, brandVersion);
|
|
5400
|
+
}
|
|
5401
|
+
}
|
|
5402
|
+
}
|
|
5403
|
+
break;
|
|
5404
|
+
case CPU:
|
|
5405
|
+
var archName = uaCH2[ARCHITECTURE];
|
|
5406
|
+
if (archName) {
|
|
5407
|
+
if (archName && uaCH2[BITNESS] == "64") archName += "64";
|
|
5408
|
+
rgxMapper.call(this.data, archName + ";", rgxMap2);
|
|
5409
|
+
}
|
|
5410
|
+
break;
|
|
5411
|
+
case DEVICE:
|
|
5412
|
+
if (uaCH2[MOBILE]) {
|
|
5413
|
+
this.set(TYPE, MOBILE);
|
|
5414
|
+
}
|
|
5415
|
+
if (uaCH2[MODEL]) {
|
|
5416
|
+
this.set(MODEL, uaCH2[MODEL]);
|
|
5417
|
+
if (!this.get(TYPE) || !this.get(VENDOR)) {
|
|
5418
|
+
var reParse = {};
|
|
5419
|
+
rgxMapper.call(reParse, "droid 9; " + uaCH2[MODEL] + ")", rgxMap2);
|
|
5420
|
+
if (!this.get(TYPE) && !!reParse.type) {
|
|
5421
|
+
this.set(TYPE, reParse.type);
|
|
5422
|
+
}
|
|
5423
|
+
if (!this.get(VENDOR) && !!reParse.vendor) {
|
|
5424
|
+
this.set(VENDOR, reParse.vendor);
|
|
5425
|
+
}
|
|
5426
|
+
}
|
|
5427
|
+
}
|
|
5428
|
+
if (uaCH2[FORMFACTORS]) {
|
|
5429
|
+
var ff;
|
|
5430
|
+
if (typeof uaCH2[FORMFACTORS] !== "string") {
|
|
5431
|
+
var idx = 0;
|
|
5432
|
+
while (!ff && idx < uaCH2[FORMFACTORS].length) {
|
|
5433
|
+
ff = strMapper(uaCH2[FORMFACTORS][idx++], formFactorsMap);
|
|
5434
|
+
}
|
|
5435
|
+
} else {
|
|
5436
|
+
ff = strMapper(uaCH2[FORMFACTORS], formFactorsMap);
|
|
5437
|
+
}
|
|
5438
|
+
this.set(TYPE, ff);
|
|
5439
|
+
}
|
|
5440
|
+
break;
|
|
5441
|
+
case OS:
|
|
5442
|
+
var osName = uaCH2[PLATFORM];
|
|
5443
|
+
if (osName) {
|
|
5444
|
+
var osVersion = uaCH2[PLATFORMVER];
|
|
5445
|
+
if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
|
|
5446
|
+
this.set(NAME, osName).set(VERSION3, osVersion);
|
|
5447
|
+
}
|
|
5448
|
+
if (this.get(NAME) == WINDOWS && uaCH2[MODEL] == "Xbox") {
|
|
5449
|
+
this.set(NAME, "Xbox").set(VERSION3, void 0);
|
|
5450
|
+
}
|
|
5451
|
+
break;
|
|
5452
|
+
case RESULT:
|
|
5453
|
+
var data = this.data;
|
|
5454
|
+
var parse = function(itemType2) {
|
|
5455
|
+
return data[itemType2].getItem().setCH(uaCH2).parseCH().get();
|
|
5456
|
+
};
|
|
5457
|
+
this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
|
|
5458
|
+
}
|
|
5459
|
+
return this;
|
|
5460
|
+
};
|
|
5461
|
+
setProps.call(this, [
|
|
5462
|
+
["itemType", itemType],
|
|
5463
|
+
["ua", ua],
|
|
5464
|
+
["uaCH", uaCH],
|
|
5465
|
+
["rgxMap", rgxMap],
|
|
5466
|
+
["data", createIData(this, itemType)]
|
|
5467
|
+
]);
|
|
5468
|
+
return this;
|
|
5469
|
+
}
|
|
5470
|
+
function UAParser(ua, extensions, headers) {
|
|
5471
|
+
if (typeof ua === TYPEOF.OBJECT) {
|
|
5472
|
+
if (isExtensions(ua, true)) {
|
|
5473
|
+
if (typeof extensions === TYPEOF.OBJECT) {
|
|
5474
|
+
headers = extensions;
|
|
5475
|
+
}
|
|
5476
|
+
extensions = ua;
|
|
5477
|
+
} else {
|
|
5478
|
+
headers = ua;
|
|
5479
|
+
extensions = void 0;
|
|
5480
|
+
}
|
|
5481
|
+
ua = void 0;
|
|
5482
|
+
} else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
|
|
5483
|
+
headers = extensions;
|
|
5484
|
+
extensions = void 0;
|
|
5485
|
+
}
|
|
5486
|
+
if (headers) {
|
|
5487
|
+
if (typeof headers.append === TYPEOF.FUNCTION) {
|
|
5488
|
+
var kv = {};
|
|
5489
|
+
headers.forEach(function(v, k) {
|
|
5490
|
+
kv[String(k).toLowerCase()] = v;
|
|
5491
|
+
});
|
|
5492
|
+
headers = kv;
|
|
5493
|
+
} else {
|
|
5494
|
+
var normalized = {};
|
|
5495
|
+
for (var header in headers) {
|
|
5496
|
+
if (headers.hasOwnProperty(header)) {
|
|
5497
|
+
normalized[String(header).toLowerCase()] = headers[header];
|
|
5498
|
+
}
|
|
5499
|
+
}
|
|
5500
|
+
headers = normalized;
|
|
5501
|
+
}
|
|
5502
|
+
}
|
|
5503
|
+
if (!(this instanceof UAParser)) {
|
|
5504
|
+
return new UAParser(ua, extensions, headers).getResult();
|
|
5505
|
+
}
|
|
5506
|
+
var userAgent = typeof ua === TYPEOF.STRING ? ua : (
|
|
5507
|
+
// Passed user-agent string
|
|
5508
|
+
headers && headers[USER_AGENT] ? headers[USER_AGENT] : (
|
|
5509
|
+
// User-Agent from passed headers
|
|
5510
|
+
NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : (
|
|
5511
|
+
// navigator.userAgent
|
|
5512
|
+
EMPTY
|
|
5513
|
+
)
|
|
5514
|
+
)
|
|
5515
|
+
), httpUACH = new UACHData(headers, true), regexMap = extensions ? extend2(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
|
|
5516
|
+
if (itemType == RESULT) {
|
|
5517
|
+
return function() {
|
|
5518
|
+
return new UAItem(itemType, userAgent, regexMap, httpUACH).set("ua", userAgent).set(BROWSER, this.getBrowser()).set(CPU, this.getCPU()).set(DEVICE, this.getDevice()).set(ENGINE, this.getEngine()).set(OS, this.getOS()).get();
|
|
5519
|
+
};
|
|
5520
|
+
} else {
|
|
5521
|
+
return function() {
|
|
5522
|
+
return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
|
|
5523
|
+
};
|
|
5524
|
+
}
|
|
5525
|
+
};
|
|
5526
|
+
setProps.call(this, [
|
|
5527
|
+
["getBrowser", createItemFunc(BROWSER)],
|
|
5528
|
+
["getCPU", createItemFunc(CPU)],
|
|
5529
|
+
["getDevice", createItemFunc(DEVICE)],
|
|
5530
|
+
["getEngine", createItemFunc(ENGINE)],
|
|
5531
|
+
["getOS", createItemFunc(OS)],
|
|
5532
|
+
["getResult", createItemFunc(RESULT)],
|
|
5533
|
+
["getUA", function() {
|
|
5534
|
+
return userAgent;
|
|
5535
|
+
}],
|
|
5536
|
+
["setUA", function(ua2) {
|
|
5537
|
+
if (isString2(ua2)) userAgent = trim2(ua2, UA_MAX_LENGTH);
|
|
5538
|
+
return this;
|
|
5539
|
+
}]
|
|
5540
|
+
]).setUA(userAgent);
|
|
5541
|
+
return this;
|
|
5542
|
+
}
|
|
5543
|
+
UAParser.VERSION = LIBVERSION;
|
|
5544
|
+
UAParser.BROWSER = enumerize([NAME, VERSION3, MAJOR, TYPE]);
|
|
5545
|
+
UAParser.CPU = enumerize([ARCHITECTURE]);
|
|
5546
|
+
UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
|
|
5547
|
+
UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION3]);
|
|
5548
|
+
|
|
5549
|
+
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/enums/ua-parser-enums.mjs
|
|
5550
|
+
var BrowserName = Object.freeze({
|
|
5551
|
+
"115": "115",
|
|
5552
|
+
"2345": "2345",
|
|
5553
|
+
"360": "360",
|
|
5554
|
+
ALIPAY: "Alipay",
|
|
5555
|
+
AMAYA: "Amaya",
|
|
5556
|
+
ANDROID: "Android Browser",
|
|
5557
|
+
ARORA: "Arora",
|
|
5558
|
+
AVANT: "Avant",
|
|
5559
|
+
AVAST: "Avast Secure Browser",
|
|
5560
|
+
AVG: "AVG Secure Browser",
|
|
5561
|
+
BAIDU: "Baidu Browser",
|
|
5562
|
+
BASILISK: "Basilisk",
|
|
5563
|
+
BING: "Bing",
|
|
5564
|
+
BLAZER: "Blazer",
|
|
5565
|
+
BOLT: "Bolt",
|
|
5566
|
+
BOWSER: "Bowser",
|
|
5567
|
+
BRAVE: "Brave",
|
|
5568
|
+
CAMINO: "Camino",
|
|
5569
|
+
CHIMERA: "Chimera",
|
|
5570
|
+
CHROME: "Chrome",
|
|
5571
|
+
CHROME_HEADLESS: "Chrome Headless",
|
|
5572
|
+
CHROME_MOBILE: "Mobile Chrome",
|
|
5573
|
+
CHROME_WEBVIEW: "Chrome WebView",
|
|
5574
|
+
CHROMIUM: "Chromium",
|
|
5575
|
+
COBALT: "Cobalt",
|
|
5576
|
+
COC_COC: "Coc Coc",
|
|
5577
|
+
CONKEROR: "Conkeror",
|
|
5578
|
+
DAUM: "Daum",
|
|
5579
|
+
DILLO: "Dillo",
|
|
5580
|
+
DOLPHIN: "Dolphin",
|
|
5581
|
+
DOOBLE: "Dooble",
|
|
5582
|
+
DORIS: "Doris",
|
|
5583
|
+
DRAGON: "Dragon",
|
|
5584
|
+
DUCKDUCKGO: "DuckDuckGo",
|
|
5585
|
+
ECOSIA: "Ecosia",
|
|
5586
|
+
EDGE: "Edge",
|
|
5587
|
+
EDGE_WEBVIEW: "Edge WebView",
|
|
5588
|
+
EDGE_WEBVIEW2: "Edge WebView2",
|
|
5589
|
+
EPIPHANY: "Epiphany",
|
|
5590
|
+
FACEBOOK: "Facebook",
|
|
5591
|
+
FALKON: "Falkon",
|
|
5592
|
+
FIREBIRD: "Firebird",
|
|
5593
|
+
FIREFOX: "Firefox",
|
|
5594
|
+
FIREFOX_FOCUS: "Firefox Focus",
|
|
5595
|
+
FIREFOX_MOBILE: "Mobile Firefox",
|
|
5596
|
+
FIREFOX_REALITY: "Firefox Reality",
|
|
5597
|
+
FENNEC: "Fennec",
|
|
5598
|
+
FLOCK: "Flock",
|
|
5599
|
+
FLOW: "Flow",
|
|
5600
|
+
GO: "GoBrowser",
|
|
5601
|
+
GOOGLE_SEARCH: "GSA",
|
|
5602
|
+
HELIO: "Helio",
|
|
5603
|
+
HEYTAP: "HeyTap",
|
|
5604
|
+
HONOR: "Honor",
|
|
5605
|
+
HUAWEI: "Huawei Browser",
|
|
5606
|
+
ICAB: "iCab",
|
|
5607
|
+
ICE: "ICE Browser",
|
|
5608
|
+
ICEAPE: "IceApe",
|
|
5609
|
+
ICECAT: "IceCat",
|
|
5610
|
+
ICEDRAGON: "IceDragon",
|
|
5611
|
+
ICEWEASEL: "IceWeasel",
|
|
5612
|
+
IE: "IE",
|
|
5613
|
+
INSTAGRAM: "Instagram",
|
|
5614
|
+
IRIDIUM: "Iridium",
|
|
5615
|
+
IRON: "Iron",
|
|
5616
|
+
JASMINE: "Jasmine",
|
|
5617
|
+
KONQUEROR: "Konqueror",
|
|
5618
|
+
KAKAO: "KakaoTalk",
|
|
5619
|
+
KHTML: "KHTML",
|
|
5620
|
+
K_MELEON: "K-Meleon",
|
|
5621
|
+
KLAR: "Klar",
|
|
5622
|
+
KLARNA: "Klarna",
|
|
5623
|
+
KINDLE: "Kindle",
|
|
5624
|
+
LENOVO: "Smart Lenovo Browser",
|
|
5625
|
+
LADYBIRD: "Ladybird",
|
|
5626
|
+
LG: "LG Browser",
|
|
5627
|
+
LIBREWOLF: "LibreWolf",
|
|
5628
|
+
LIEBAO: "LBBROWSER",
|
|
5629
|
+
LINE: "Line",
|
|
5630
|
+
LINKEDIN: "LinkedIn",
|
|
5631
|
+
LINKS: "Links",
|
|
5632
|
+
LUNASCAPE: "Lunascape",
|
|
5633
|
+
LYNX: "Lynx",
|
|
5634
|
+
MAEMO: "Maemo Browser",
|
|
5635
|
+
MAXTHON: "Maxthon",
|
|
5636
|
+
MIDORI: "Midori",
|
|
5637
|
+
MINIMO: "Minimo",
|
|
5638
|
+
MIUI: "MIUI Browser",
|
|
5639
|
+
MOZILLA: "Mozilla",
|
|
5640
|
+
MOSAIC: "Mosaic",
|
|
5641
|
+
NAVER: "Naver",
|
|
5642
|
+
NETFRONT: "NetFront",
|
|
5643
|
+
NETSCAPE: "Netscape",
|
|
5644
|
+
NETSURF: "Netsurf",
|
|
5645
|
+
NOKIA: "Nokia Browser",
|
|
5646
|
+
OBIGO: "Obigo",
|
|
5647
|
+
OCULUS: "Oculus Browser",
|
|
5648
|
+
OMNIWEB: "OmniWeb",
|
|
5649
|
+
OPERA: "Opera",
|
|
5650
|
+
OPERA_COAST: "Opera Coast",
|
|
5651
|
+
OPERA_GX: "Opera GX",
|
|
5652
|
+
OPERA_MINI: "Opera Mini",
|
|
5653
|
+
OPERA_MOBI: "Opera Mobi",
|
|
5654
|
+
OPERA_TABLET: "Opera Tablet",
|
|
5655
|
+
OPERA_TOUCH: "Opera Touch",
|
|
5656
|
+
OTTER: "Otter",
|
|
5657
|
+
OVI: "OviBrowser",
|
|
5658
|
+
PALEMOON: "PaleMoon",
|
|
5659
|
+
PHANTOMJS: "PhantomJS",
|
|
5660
|
+
PHOENIX: "Phoenix",
|
|
5661
|
+
PICOBROWSER: "Pico Browser",
|
|
5662
|
+
POLARIS: "Polaris",
|
|
5663
|
+
PUFFIN: "Puffin",
|
|
5664
|
+
QQ: "QQBrowser",
|
|
5665
|
+
QQ_LITE: "QQBrowserLite",
|
|
5666
|
+
QUARK: "Quark",
|
|
5667
|
+
QUPZILLA: "QupZilla",
|
|
5668
|
+
QUTEBROWSER: "qutebrowser",
|
|
5669
|
+
QWANT: "Qwant",
|
|
5670
|
+
REKONQ: "rekonq",
|
|
5671
|
+
ROCKMELT: "Rockmelt",
|
|
5672
|
+
SAFARI: "Safari",
|
|
5673
|
+
SAFARI_MOBILE: "Mobile Safari",
|
|
5674
|
+
SAILFISH: "Sailfish Browser",
|
|
5675
|
+
SAMSUNG: "Samsung Internet",
|
|
5676
|
+
SEAMONKEY: "SeaMonkey",
|
|
5677
|
+
SILK: "Silk",
|
|
5678
|
+
SKYFIRE: "Skyfire",
|
|
5679
|
+
SLEIPNIR: "Sleipnir",
|
|
5680
|
+
SLIMBOAT: "SlimBoat",
|
|
5681
|
+
SLIMBROWSER: "SlimBrowser",
|
|
5682
|
+
SLIMJET: "Slimjet",
|
|
5683
|
+
SNAPCHAT: "Snapchat",
|
|
5684
|
+
SOGOU_EXPLORER: "Sogou Explorer",
|
|
5685
|
+
SOGOU_MOBILE: "Sogou Mobile",
|
|
5686
|
+
SURF: "Surf",
|
|
5687
|
+
SWIFTFOX: "Swiftfox",
|
|
5688
|
+
TESLA: "Tesla",
|
|
5689
|
+
TIKTOK: "TikTok",
|
|
5690
|
+
TIZEN: "Tizen Browser",
|
|
5691
|
+
TWITTER: "Twitter",
|
|
5692
|
+
UC: "UCBrowser",
|
|
5693
|
+
UP: "UP.Browser",
|
|
5694
|
+
VIVALDI: "Vivaldi",
|
|
5695
|
+
VIVO: "Vivo Browser",
|
|
5696
|
+
W3M: "w3m",
|
|
5697
|
+
WATERFOX: "Waterfox",
|
|
5698
|
+
WEBKIT: "WebKit",
|
|
5699
|
+
WECHAT: "WeChat",
|
|
5700
|
+
WEIBO: "Weibo",
|
|
5701
|
+
WHALE: "Whale",
|
|
5702
|
+
WOLVIC: "Wolvic",
|
|
5703
|
+
YANDEX: "Yandex",
|
|
5704
|
+
ZALO: "Zalo"
|
|
5705
|
+
// TODO : test!
|
|
5706
|
+
});
|
|
5707
|
+
var BrowserType = Object.freeze({
|
|
5708
|
+
CRAWLER: "crawler",
|
|
5709
|
+
CLI: "cli",
|
|
5710
|
+
EMAIL: "email",
|
|
5711
|
+
FETCHER: "fetcher",
|
|
5712
|
+
INAPP: "inapp",
|
|
5713
|
+
MEDIAPLAYER: "mediaplayer",
|
|
5714
|
+
LIBRARY: "library"
|
|
5715
|
+
});
|
|
5716
|
+
var CPUArch = Object.freeze({
|
|
5717
|
+
"68K": "68k",
|
|
5718
|
+
ALPHA: "alpha",
|
|
5719
|
+
ARM: "arm",
|
|
5720
|
+
ARM_64: "arm64",
|
|
5721
|
+
ARM_HF: "armhf",
|
|
5722
|
+
AVR: "avr",
|
|
5723
|
+
AVR_32: "avr32",
|
|
5724
|
+
IA64: "ia64",
|
|
5725
|
+
IRIX: "irix",
|
|
5726
|
+
IRIX_64: "irix64",
|
|
5727
|
+
MIPS: "mips",
|
|
5728
|
+
MIPS_64: "mips64",
|
|
5729
|
+
PA_RISC: "pa-risc",
|
|
5730
|
+
PPC: "ppc",
|
|
5731
|
+
SPARC: "sparc",
|
|
5732
|
+
SPARC_64: "sparc64",
|
|
5733
|
+
X86: "ia32",
|
|
5734
|
+
X86_64: "amd64"
|
|
5735
|
+
});
|
|
5736
|
+
var DeviceType = Object.freeze({
|
|
5737
|
+
CONSOLE: "console",
|
|
5738
|
+
DESKTOP: "desktop",
|
|
5739
|
+
EMBEDDED: "embedded",
|
|
5740
|
+
MOBILE: "mobile",
|
|
5741
|
+
SMARTTV: "smarttv",
|
|
5742
|
+
TABLET: "tablet",
|
|
5743
|
+
WEARABLE: "wearable",
|
|
5744
|
+
XR: "xr"
|
|
5745
|
+
});
|
|
5746
|
+
var DeviceVendor = Object.freeze({
|
|
5747
|
+
ACER: "Acer",
|
|
5748
|
+
ADVAN: "Advan",
|
|
5749
|
+
ALCATEL: "Alcatel",
|
|
5750
|
+
APPLE: "Apple",
|
|
5751
|
+
AMAZON: "Amazon",
|
|
5752
|
+
ARCHOS: "Archos",
|
|
5753
|
+
ASUS: "ASUS",
|
|
5754
|
+
ATT: "AT&T",
|
|
5755
|
+
BENQ: "BenQ",
|
|
5756
|
+
BLACKBERRY: "BlackBerry",
|
|
5757
|
+
BLU: "BLU",
|
|
5758
|
+
CAT: "Cat",
|
|
5759
|
+
DELL: "Dell",
|
|
5760
|
+
ENERGIZER: "Energizer",
|
|
5761
|
+
ESSENTIAL: "Essential",
|
|
5762
|
+
FACEBOOK: "Facebook",
|
|
5763
|
+
FAIRPHONE: "Fairphone",
|
|
5764
|
+
GEEKSPHONE: "GeeksPhone",
|
|
5765
|
+
GENERIC: "Generic",
|
|
5766
|
+
GOOGLE: "Google",
|
|
5767
|
+
HISENSE: "Hisense",
|
|
5768
|
+
HMD: "HMD",
|
|
5769
|
+
HP: "HP",
|
|
5770
|
+
HTC: "HTC",
|
|
5771
|
+
HUAWEI: "Huawei",
|
|
5772
|
+
IMO: "IMO",
|
|
5773
|
+
INFINIX: "Infinix",
|
|
5774
|
+
ITEL: "itel",
|
|
5775
|
+
JOLLA: "Jolla",
|
|
5776
|
+
KOBO: "Kobo",
|
|
5777
|
+
LAVA: "Lava",
|
|
5778
|
+
LENOVO: "Lenovo",
|
|
5779
|
+
LG: "LG",
|
|
5780
|
+
MEIZU: "Meizu",
|
|
5781
|
+
MICROMAX: "Micromax",
|
|
5782
|
+
MICROSOFT: "Microsoft",
|
|
5783
|
+
MOTOROLA: "Motorola",
|
|
5784
|
+
NEXIAN: "Nexian",
|
|
5785
|
+
NINTENDO: "Nintendo",
|
|
5786
|
+
NOKIA: "Nokia",
|
|
5787
|
+
NOTHING: "Nothing",
|
|
5788
|
+
NVIDIA: "Nvidia",
|
|
5789
|
+
ONEPLUS: "OnePlus",
|
|
5790
|
+
OPPO: "OPPO",
|
|
5791
|
+
OUYA: "Ouya",
|
|
5792
|
+
PALM: "Palm",
|
|
5793
|
+
PANASONIC: "Panasonic",
|
|
5794
|
+
PEBBLE: "Pebble",
|
|
5795
|
+
PHILIPS: "Philips",
|
|
5796
|
+
PICO: "Pico",
|
|
5797
|
+
POLYTRON: "Polytron",
|
|
5798
|
+
REALME: "Realme",
|
|
5799
|
+
RETROID: "Retroid",
|
|
5800
|
+
RIM: "RIM",
|
|
5801
|
+
ROKU: "Roku",
|
|
5802
|
+
SAMSUNG: "Samsung",
|
|
5803
|
+
SHARP: "Sharp",
|
|
5804
|
+
SIEMENS: "Siemens",
|
|
5805
|
+
SMARTFREN: "Smartfren",
|
|
5806
|
+
SONY: "Sony",
|
|
5807
|
+
SPRINT: "Sprint",
|
|
5808
|
+
TCL: "TCL",
|
|
5809
|
+
TECHNISAT: "TechniSAT",
|
|
5810
|
+
TECNO: "TECNO",
|
|
5811
|
+
TESLA: "Tesla",
|
|
5812
|
+
ULEFONE: "Ulefone",
|
|
5813
|
+
VIVO: "Vivo",
|
|
5814
|
+
VIZIO: "Vizio",
|
|
5815
|
+
VODAFONE: "Vodafone",
|
|
5816
|
+
WIKO: "Wiko",
|
|
5817
|
+
XBOX: "Xbox",
|
|
5818
|
+
XIAOMI: "Xiaomi",
|
|
5819
|
+
ZEBRA: "Zebra",
|
|
5820
|
+
ZTE: "ZTE"
|
|
5821
|
+
// TODO : test!
|
|
5822
|
+
});
|
|
5823
|
+
var EngineName = Object.freeze({
|
|
5824
|
+
AMAYA: "Amaya",
|
|
5825
|
+
ARKWEB: "ArkWeb",
|
|
5826
|
+
BLINK: "Blink",
|
|
5827
|
+
EDGEHTML: "EdgeHTML",
|
|
5828
|
+
FLOW: "Flow",
|
|
5829
|
+
GECKO: "Gecko",
|
|
5830
|
+
GOANNA: "Goanna",
|
|
5831
|
+
ICAB: "iCab",
|
|
5832
|
+
KHTML: "KHTML",
|
|
5833
|
+
LIBWEB: "LibWeb",
|
|
5834
|
+
LINKS: "Links",
|
|
5835
|
+
LYNX: "Lynx",
|
|
5836
|
+
NETFRONT: "NetFront",
|
|
5837
|
+
NETSURF: "NetSurf",
|
|
5838
|
+
PRESTO: "Presto",
|
|
5839
|
+
SERVO: "Servo",
|
|
5840
|
+
TASMAN: "Tasman",
|
|
5841
|
+
TRIDENT: "Trident",
|
|
5842
|
+
W3M: "w3m",
|
|
5843
|
+
WEBKIT: "WebKit"
|
|
5844
|
+
});
|
|
5845
|
+
var OSName = Object.freeze({
|
|
5846
|
+
AIX: "AIX",
|
|
5847
|
+
AMIGA_OS: "Amiga OS",
|
|
5848
|
+
ANDROID: "Android",
|
|
5849
|
+
ANDROID_X86: "Android-x86",
|
|
5850
|
+
ARCAOS: "ArcaOS",
|
|
5851
|
+
ARCH: "Arch",
|
|
5852
|
+
BADA: "Bada",
|
|
5853
|
+
BEOS: "BeOS",
|
|
5854
|
+
BLACKBERRY: "BlackBerry",
|
|
5855
|
+
CENTOS: "CentOS",
|
|
5856
|
+
CHROME_OS: "Chrome OS",
|
|
5857
|
+
CHROMECAST: "Chromecast",
|
|
5858
|
+
CHROMECAST_ANDROID: "Chromecast Android",
|
|
5859
|
+
CHROMECAST_FUCHSIA: "Chromecast Fuchsia",
|
|
5860
|
+
CHROMECAST_LINUX: "Chromecast Linux",
|
|
5861
|
+
CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker",
|
|
5862
|
+
CONTIKI: "Contiki",
|
|
5863
|
+
DEBIAN: "Debian",
|
|
5864
|
+
DEEPIN: "Deepin",
|
|
5865
|
+
DRAGONFLY: "DragonFly",
|
|
5866
|
+
ELEMENTARY_OS: "elementary OS",
|
|
5867
|
+
FEDORA: "Fedora",
|
|
5868
|
+
FIREFOX_OS: "Firefox OS",
|
|
5869
|
+
FREEBSD: "FreeBSD",
|
|
5870
|
+
FUCHSIA: "Fuchsia",
|
|
5871
|
+
GENTOO: "Gentoo",
|
|
5872
|
+
GHOSTBSD: "GhostBSD",
|
|
5873
|
+
GNU: "GNU",
|
|
5874
|
+
HAIKU: "Haiku",
|
|
5875
|
+
HARMONYOS: "HarmonyOS",
|
|
5876
|
+
HP_UX: "HP-UX",
|
|
5877
|
+
HURD: "Hurd",
|
|
5878
|
+
IOS: "iOS",
|
|
5879
|
+
JOLI: "Joli",
|
|
5880
|
+
KAIOS: "KaiOS",
|
|
5881
|
+
KNOPPIX: "Knoppix",
|
|
5882
|
+
KUBUNTU: "Kubuntu",
|
|
5883
|
+
LINPUS: "Linpus",
|
|
5884
|
+
LINSPIRE: "Linspire",
|
|
5885
|
+
LINUX: "Linux",
|
|
5886
|
+
MACOS: "macOS",
|
|
5887
|
+
MAEMO: "Maemo",
|
|
5888
|
+
MAGEIA: "Mageia",
|
|
5889
|
+
MANDRIVA: "Mandriva",
|
|
5890
|
+
MANJARO: "Manjaro",
|
|
5891
|
+
MEEGO: "MeeGo",
|
|
5892
|
+
MINIX: "Minix",
|
|
5893
|
+
MINT: "Mint",
|
|
5894
|
+
MORPH_OS: "Morph OS",
|
|
5895
|
+
NETBSD: "NetBSD",
|
|
5896
|
+
NETRANGE: "NetRange",
|
|
5897
|
+
NETTV: "NetTV",
|
|
5898
|
+
NINTENDO: "Nintendo",
|
|
5899
|
+
OPENHARMONY: "OpenHarmony",
|
|
5900
|
+
OPENBSD: "OpenBSD",
|
|
5901
|
+
OPENVMS: "OpenVMS",
|
|
5902
|
+
OS2: "OS/2",
|
|
5903
|
+
PALM: "Palm",
|
|
5904
|
+
PC_BSD: "PC-BSD",
|
|
5905
|
+
PCLINUXOS: "PCLinuxOS",
|
|
5906
|
+
PICO: "Pico",
|
|
5907
|
+
PLAN9: "Plan9",
|
|
5908
|
+
PLAYSTATION: "PlayStation",
|
|
5909
|
+
QNX: "QNX",
|
|
5910
|
+
RASPBIAN: "Raspbian",
|
|
5911
|
+
REDHAT: "RedHat",
|
|
5912
|
+
RIM_TABLET_OS: "RIM Tablet OS",
|
|
5913
|
+
RISC_OS: "RISC OS",
|
|
5914
|
+
SABAYON: "Sabayon",
|
|
5915
|
+
SAILFISH: "Sailfish",
|
|
5916
|
+
SERENITYOS: "SerenityOS",
|
|
5917
|
+
SERIES40: "Series40",
|
|
5918
|
+
SLACKWARE: "Slackware",
|
|
5919
|
+
SOLARIS: "Solaris",
|
|
5920
|
+
SUSE: "SUSE",
|
|
5921
|
+
SYMBIAN: "Symbian",
|
|
5922
|
+
TIZEN: "Tizen",
|
|
5923
|
+
UBUNTU: "Ubuntu",
|
|
5924
|
+
UBUNTU_TOUCH: "Ubuntu Touch",
|
|
5925
|
+
UNIX: "Unix",
|
|
5926
|
+
VECTORLINUX: "VectorLinux",
|
|
5927
|
+
WATCHOS: "watchOS",
|
|
5928
|
+
WEBOS: "WebOS",
|
|
5929
|
+
WINDOWS: "Windows",
|
|
5930
|
+
WINDOWS_CE: "Windows CE",
|
|
5931
|
+
WINDOWS_IOT: "Windows IoT",
|
|
5932
|
+
WINDOWS_MOBILE: "Windows Mobile",
|
|
5933
|
+
WINDOWS_PHONE: "Windows Phone",
|
|
5934
|
+
WINDOWS_RT: "Windows RT",
|
|
5935
|
+
XBOX: "Xbox",
|
|
5936
|
+
XUBUNTU: "Xubuntu",
|
|
5937
|
+
ZENWALK: "Zenwalk"
|
|
5938
|
+
// TODO : test!
|
|
5939
|
+
});
|
|
5940
|
+
var Extension = Object.freeze({
|
|
5941
|
+
BrowserName: {
|
|
5942
|
+
CLI: {
|
|
5943
|
+
CURL: "curl",
|
|
5944
|
+
ELINKS: "ELinks",
|
|
5945
|
+
HTTPIE: "HTTPie",
|
|
5946
|
+
LYNX: "Lynx",
|
|
5947
|
+
WGET: "Wget"
|
|
5948
|
+
},
|
|
5949
|
+
Crawler: {
|
|
5950
|
+
AHREFS_BOT: "AhrefsBot",
|
|
5951
|
+
AI2_BOT: "AI2Bot",
|
|
5952
|
+
AIHIT_BOT: "aiHitBot",
|
|
5953
|
+
ALGOLIA_CRAWLER: "Algolia Crawler",
|
|
5954
|
+
APPLE_BOT: "Applebot",
|
|
5955
|
+
APPLE_BOT_EXTENDED: "Applebot-Extended",
|
|
5956
|
+
ASK_TEOMA: "Teoma",
|
|
5957
|
+
AMAZON_BOT: "Amazonbot",
|
|
5958
|
+
AMAZON_CONTXBOT: "contxbot",
|
|
5959
|
+
ANTHROPIC_AI: "anthropic-ai",
|
|
5960
|
+
ANTHROPIC_CLAUDE_BOT: "ClaudeBot",
|
|
5961
|
+
ANTHROPIC_CLAUDE_SEARCHBOT: "Claude-SearchBot",
|
|
5962
|
+
ANTHROPIC_CLAUDE_WEB: "Claude-Web",
|
|
5963
|
+
ARCHIVEORG_BOT: "archive.org_bot",
|
|
5964
|
+
BAIDU_ADS: "Baidu-ADS",
|
|
5965
|
+
BAIDU_SPIDER: "Baiduspider",
|
|
5966
|
+
BAIDU_SPIDER_ADS: "Baiduspider-ads",
|
|
5967
|
+
BAIDU_SPIDER_CPRO: "Baiduspider-cpro",
|
|
5968
|
+
BAIDU_SPIDER_FAVO: "Baiduspider-favo",
|
|
5969
|
+
BAIDU_SPIDER_IMAGE: "Baiduspider-image",
|
|
5970
|
+
BAIDU_SPIDER_NEWS: "Baiduspider-news",
|
|
5971
|
+
BAIDU_SPIDER_RENDER: "Baiduspider-render",
|
|
5972
|
+
BAIDU_SPIDER_VIDEO: "Baiduspider-video",
|
|
5973
|
+
BLEX_BOT: "BLEXBot",
|
|
5974
|
+
BOTIFY: "botify",
|
|
5975
|
+
BRAVE_BOT: "Bravebot",
|
|
5976
|
+
BYTEDANCE_BYTESPIDER: "Bytespider",
|
|
5977
|
+
BYTEDANCE_TIKTOKSPIDER: "TikTokSpider",
|
|
5978
|
+
COMMON_CRAWL_CCBOT: "CCBot",
|
|
5979
|
+
COCCOC_BOT_WEB: "coccocbot-web",
|
|
5980
|
+
COCCOC_BOT_IMAGE: "coccocbot-image",
|
|
5981
|
+
COHERE_TRAINING_DATA_CRAWLER: "cohere-training-data-crawler",
|
|
5982
|
+
COTOYOGI: "Cotoyogi",
|
|
5983
|
+
COVEO_BOT: "Coveobot",
|
|
5984
|
+
CRITEO_BOT: "CriteoBot",
|
|
5985
|
+
DATAFORSEO_BOT: "DataForSeoBot",
|
|
5986
|
+
DAUM: "Daum",
|
|
5987
|
+
DAUM_DAUMOA: "Daumoa",
|
|
5988
|
+
DAUM_DAUMOA_IMAGE: "Daumoa-image",
|
|
5989
|
+
DEEPSEEK_BOT: "DeepSeekBot",
|
|
5990
|
+
DIFFBOT: "Diffbot",
|
|
5991
|
+
DUCKDUCKGO_BOT: "DuckDuckBot",
|
|
5992
|
+
DUCKDUCKGO_FAVICONS_BOT: "DuckDuckGo-Favicons-Bot",
|
|
5993
|
+
ELASTIC: "Elastic",
|
|
5994
|
+
ELASTIC_SWIFTYPE_BOT: "Swiftbot",
|
|
5995
|
+
EXALEAD_EXABOT: "Exabot",
|
|
5996
|
+
FIRECRAWL_AGENT: "FirecrawlAgent",
|
|
5997
|
+
FREESPOKE: "Freespoke",
|
|
5998
|
+
GOOGLE_ADSBOT: "AdsBot-Google",
|
|
5999
|
+
GOOGLE_ADSBOT_MOBILE: "Adsbot-Google-Mobile",
|
|
6000
|
+
GOOGLE_ADSENSE: "AdSense",
|
|
6001
|
+
GOOGLE_APIS: "APIs-Google",
|
|
6002
|
+
GOOGLE_BOT: "Googlebot",
|
|
6003
|
+
GOOGLE_BOT_IMAGE: "Googlebot-Image",
|
|
6004
|
+
GOOGLE_BOT_NEWS: "Googlebot-News",
|
|
6005
|
+
GOOGLE_BOT_VIDEO: "Googlebot-Video",
|
|
6006
|
+
GOOGLE_CLOUDVERTEXBOT: "Google-CloudVertexBot",
|
|
6007
|
+
GOOGLE_EXTENDED: "Google-Extended",
|
|
6008
|
+
GOOGLE_INSPECTIONTOOL: "Google-InspectionTool",
|
|
6009
|
+
GOOGLE_OTHER: "GoogleOther",
|
|
6010
|
+
GOOGLE_OTHER_IMAGE: "GoogleOther-Image",
|
|
6011
|
+
GOOGLE_OTHER_VIDEO: "GoogleOther-Video",
|
|
6012
|
+
GOOGLE_SAFETY: "Google-Safety",
|
|
6013
|
+
GOOGLE_STOREBOT: "Storebot-Google",
|
|
6014
|
+
HIVE_IMAGESIFTBOT: "ImagesiftBot",
|
|
6015
|
+
HUAWEI_PANGUBOT: "PanguBot",
|
|
6016
|
+
HUAWEI_PETALBOT: "PetalBot",
|
|
6017
|
+
HUGGINGFACE_BOT: "HuggingFace-Bot",
|
|
6018
|
+
HUNTER_VELENPUBLICWEBCRAWLER: "VelenPublicWebCrawler",
|
|
6019
|
+
IA_ARCHIVER: "ia_archiver",
|
|
6020
|
+
IASK_BOT: "iAskBot",
|
|
6021
|
+
KAGI_BOT: "Kagibot",
|
|
6022
|
+
KANGAROO_BOT: "Kangaroo Bot",
|
|
6023
|
+
LINE_SPIDER: "Linespider",
|
|
6024
|
+
LINKEDIN_BOT: "LinkedInBot",
|
|
6025
|
+
MAGPIE_CRAWLER: "magpie-crawler",
|
|
6026
|
+
MARGINALIA: "marginalia",
|
|
6027
|
+
META_EXTERNALAGENT: "meta-externalagent",
|
|
6028
|
+
META_FACEBOOKBOT: "FacebookBot",
|
|
6029
|
+
META_FACEBOOKCATALOG: "facebookcatalog",
|
|
6030
|
+
META_FACEBOOKEXTERNALHIT: "facebookexternalhit",
|
|
6031
|
+
MAJESTIC_MJ12BOT: "MJ12bot",
|
|
6032
|
+
MICROSOFT_BINGBOT: "Bingbot",
|
|
6033
|
+
MICROSOFT_MSNBOT: "msnbot",
|
|
6034
|
+
MICROSOFT_ADIDXBOT: "adidxbot",
|
|
6035
|
+
MOJEEK_BOT: "MojeekBot",
|
|
6036
|
+
MOZ_DOTBOT: "DotBot",
|
|
6037
|
+
ONCRAWL: "OnCrawl",
|
|
6038
|
+
ONESPOT_SCRAPERBOT: "Onespot-ScraperBot",
|
|
6039
|
+
OPENAI_GPTBOT: "GPTBot",
|
|
6040
|
+
OPENAI_SEARCH_BOT: "OAI-SearchBot",
|
|
6041
|
+
PERPLEXITY_BOT: "PerplexityBot",
|
|
6042
|
+
QIHOO_360_SPIDER: "360Spider",
|
|
6043
|
+
QWANT_BOT: "Qwantbot",
|
|
6044
|
+
QWANT_BOT_NEWS: "Qwantbot-news",
|
|
6045
|
+
REPLICATE_BOT: "Replicate-Bot",
|
|
6046
|
+
RUNPOD_BOT: "RunPod-Bot",
|
|
6047
|
+
SB_INTUITIONS_BOT: "SBIntuitionsBot",
|
|
6048
|
+
SEEKPORT_BOT: "SeekportBot",
|
|
6049
|
+
SEMRUSH_BOT: "SemrushBot",
|
|
6050
|
+
SEMRUSH_BOT_BACKLINK: "SemrushBot-BA",
|
|
6051
|
+
SEMRUSH_BOT_CONTENTSHAKE: "SemrushBot-OCOB",
|
|
6052
|
+
SEMRUSH_BOT_SEO_CHECKER: "SemrushBot-SI",
|
|
6053
|
+
SEZNAM_BOT: "SeznamBot",
|
|
6054
|
+
SITEIMPROVE: "Siteimprove",
|
|
6055
|
+
SOGOU_PIC_SPIDER: "Sogou Pic Spider",
|
|
6056
|
+
SOGOU_WEB_SPIDER: "Sogou web spider",
|
|
6057
|
+
STARTPAGE: "Startpage",
|
|
6058
|
+
SURLY_BOT: "SurdotlyBot",
|
|
6059
|
+
TIMPI_BOT: "Timpibot",
|
|
6060
|
+
TOGETHER_BOT: "Together-Bot",
|
|
6061
|
+
TURNITIN_BOT: "TurnitinBot",
|
|
6062
|
+
TWIN_AGENT: "TwinAgent",
|
|
6063
|
+
VERCEL_V0BOT: "v0bot",
|
|
6064
|
+
WEBZIO: "webzio",
|
|
6065
|
+
WEBZIO_EXTENDED: "Webzio-Extended",
|
|
6066
|
+
WEBZIO_OMGILI: "omgili",
|
|
6067
|
+
WEBZIO_OMGILI_BOT: "omgilibot",
|
|
6068
|
+
XAI_BOT: "xAI-Bot",
|
|
6069
|
+
YAHOO_JAPAN: "Y!J-BRW",
|
|
6070
|
+
YAHOO_SLURP: "Yahoo! Slurp",
|
|
6071
|
+
YANDEX_ACCESSIBILITY_BOT: "YandexAccessibilityBot",
|
|
6072
|
+
YANDEX_ADDITIONAL_BOT: "YandexAdditionalBot",
|
|
6073
|
+
YANDEX_ADNET: "YandexAdNet",
|
|
6074
|
+
YANDEX_BLOGS: "YandexBlogs",
|
|
6075
|
+
YANDEX_BOT: "YandexBot",
|
|
6076
|
+
YANDEX_BOT_MIRRORDETECTOR: "YandexBot MirrorDetector",
|
|
6077
|
+
YANDEX_COMBOT: "YandexComBot",
|
|
6078
|
+
YANDEX_FAVICONS: "YandexFavicons",
|
|
6079
|
+
YANDEX_IMAGE_RESIZER: "YandexImageResizer",
|
|
6080
|
+
YANDEX_IMAGES: "YandexImages",
|
|
6081
|
+
YANDEX_MARKET: "YandexMarket",
|
|
6082
|
+
YANDEX_MEDIA: "YandexMedia",
|
|
6083
|
+
YANDEX_METRIKA: "YandexMetrika",
|
|
6084
|
+
YANDEX_MOBILE_BOT: "YandexMobileBot",
|
|
6085
|
+
YANDEX_MOBILE_SCREENSHOT_BOT: "YandexMobileScreenShotBot",
|
|
6086
|
+
YANDEX_NEWS: "YandexNews",
|
|
6087
|
+
YANDEX_ONTODB: "YandexOntoDB",
|
|
6088
|
+
YANDEX_ONTODB_API: "YandexOntoDBAPI",
|
|
6089
|
+
YANDEX_PARTNER: "YandexPartner",
|
|
6090
|
+
YANDEX_RCA: "YandexRCA",
|
|
6091
|
+
YANDEX_RENDERRESOURCES_BOT: "YandexRenderResourcesBot",
|
|
6092
|
+
YANDEX_SCREENSHOT_BOT: "YandexScreenshotBot",
|
|
6093
|
+
YANDEX_SPRAV_BOT: "YandexSpravBot",
|
|
6094
|
+
YANDEX_TRACKER: "YandexTracker",
|
|
6095
|
+
YANDEX_VERTICALS: "YandexVerticals",
|
|
6096
|
+
YANDEX_VERTIS: "YandexVertis",
|
|
6097
|
+
YANDEX_VIDEO: "YandexVideo",
|
|
6098
|
+
YANDEX_VIDEO_PARSER: "YandexVideoParser",
|
|
6099
|
+
YANDEX_WEBMASTER: "YandexWebmaster",
|
|
6100
|
+
YEP_BOT: "YepBot",
|
|
6101
|
+
YETI: "Yeti",
|
|
6102
|
+
YISOU_SPIDER: "YisouSpider",
|
|
6103
|
+
YOU_BOT: "YouBot",
|
|
6104
|
+
ZHIPU_CHATGLM_SPIDER: "ChatGLM-Spider",
|
|
6105
|
+
ZUM_BOT: "ZumBot"
|
|
6106
|
+
},
|
|
6107
|
+
Email: {
|
|
6108
|
+
AIRMAIL: "Airmail",
|
|
6109
|
+
APPLE_MAIL: "Mail",
|
|
6110
|
+
BLUEMAIL: "BlueMail",
|
|
6111
|
+
DAUM_MAIL: "DaumMail",
|
|
6112
|
+
EVOLUTION: "Evolution",
|
|
6113
|
+
EM_CLIENT: "eM Client",
|
|
6114
|
+
FOXMAIL: "Foxmail",
|
|
6115
|
+
KMAIL: "KMail",
|
|
6116
|
+
KMAIL2: "kmail2",
|
|
6117
|
+
KONTACT: "Kontact",
|
|
6118
|
+
MICROSOFT_OUTLOOK: "Microsoft Outlook",
|
|
6119
|
+
MICROSOFT_OUTLOOK_MAC: "MacOutlook",
|
|
6120
|
+
NAVER_MAILAPP: "NaverMailApp",
|
|
6121
|
+
POLYMAIL: "Polymail",
|
|
6122
|
+
PROTON_MAIL: "ProtonMail",
|
|
6123
|
+
SPARK_MAIL: "SparkDesktop",
|
|
6124
|
+
SPARROW: "Sparrow",
|
|
6125
|
+
THUNDERBIRD: "Thunderbird",
|
|
6126
|
+
YAHOO_MAIL: "Yahoo",
|
|
6127
|
+
ZIMBRA: "Zimbra",
|
|
6128
|
+
ZOHO_MAIL: "ZohoMail-Desktop"
|
|
6129
|
+
},
|
|
6130
|
+
Fetcher: {
|
|
6131
|
+
AHREFS_SITEAUDIT: "AhrefsSiteAudit",
|
|
6132
|
+
ANTHROPIC_CLAUDE_USER: "Claude-User",
|
|
6133
|
+
ASANA: "Asana",
|
|
6134
|
+
BETTER_UPTIME_BOT: "Better Uptime Bot",
|
|
6135
|
+
BITLY_BOT: "bitlybot",
|
|
6136
|
+
BLUESKY: "Bluesky",
|
|
6137
|
+
BUFFER_LINKPREVIEWBOT: "BufferLinkPreviewBot",
|
|
6138
|
+
COHERE_AI: "Cohere-AI",
|
|
6139
|
+
DISCORD_BOT: "Discordbot",
|
|
6140
|
+
DUCKDUCKGO_ASSISTBOT: "DuckAssistBot",
|
|
6141
|
+
GOOGLE_CHROME_LIGHTHOUSE: "Chrome-Lighthouse",
|
|
6142
|
+
GOOGLE_FEEDFETCHER: "FeedFetcher-Google",
|
|
6143
|
+
GOOGLE_GEMINI_DEEP_RESEARCH: "Gemini-Deep-Research",
|
|
6144
|
+
GOOGLE_IMAGEPROXY: "GoogleImageProxy",
|
|
6145
|
+
GOOGLE_PAGERENDERER: "Google-PageRenderer",
|
|
6146
|
+
GOOGLE_READ_ALOUD: "Google-Read-Aloud",
|
|
6147
|
+
GOOGLE_PRODUCER: "GoogleProducer",
|
|
6148
|
+
GOOGLE_SITE_VERIFICATION: "Google-Site-Verification",
|
|
6149
|
+
HUBSPOT_PAGE_FETCHER: "HubSpot Page Fetcher",
|
|
6150
|
+
IFRAMELY: "Iframely",
|
|
6151
|
+
KAKAOTALK_SCRAP: "kakaotalk-scrap",
|
|
6152
|
+
KEYBASE_BOT: "KeybaseBot",
|
|
6153
|
+
META_EXTERNALFETCHER: "meta-externalfetcher",
|
|
6154
|
+
META_WHATSAPP: "WhatsApp",
|
|
6155
|
+
MICROSOFT_BINGPREVIEW: "BingPreview",
|
|
6156
|
+
MICROSOFT_PREVIEW: "MicrosoftPreview",
|
|
6157
|
+
MISTRALAI_USER: "MistralAI-User",
|
|
6158
|
+
NAVER_BLUENO: "Blueno",
|
|
6159
|
+
ONCRAWL_ROGERBOT: "rogerbot",
|
|
6160
|
+
OPENAI_CHATGPT_USER: "ChatGPT-User",
|
|
6161
|
+
PERPLEXITY_USER: "Perplexity-User",
|
|
6162
|
+
PINTEREST_BOT: "Pinterestbot",
|
|
6163
|
+
SEMRUSH_SITEAUDITBOT: "SiteAuditBot",
|
|
6164
|
+
SLACK_BOT: "Slackbot",
|
|
6165
|
+
SLACK_BOT_LINKEXPANDING: "Slackbot-LinkExpanding",
|
|
6166
|
+
SLACK_IMGPROXY: "Slack-ImgProxy",
|
|
6167
|
+
SNAP_URL_PREVIEW: "Snap URL Preview",
|
|
6168
|
+
SKYPE_URIPREVIEW: "SkypeUriPreview",
|
|
6169
|
+
TELEGRAM_BOT: "TelegramBot",
|
|
6170
|
+
UPTIMEROBOT: "UptimeRobot",
|
|
6171
|
+
VERCEL_FAVICON_BOT: "vercel-favicon-bot",
|
|
6172
|
+
VERCEL_SCREENSHOT_BOT: "vercel-screenshot-bot",
|
|
6173
|
+
VERCEL_BOT: "Vercelbot",
|
|
6174
|
+
VERCEL_FLAGS: "vercelflags",
|
|
6175
|
+
VERCEL_TRACING: "verceltracing",
|
|
6176
|
+
X_TWITTERBOT: "Twitterbot",
|
|
6177
|
+
YANDEX_CALENDAR: "YandexCalendar",
|
|
6178
|
+
YANDEX_DIRECT: "YandexDirect",
|
|
6179
|
+
YANDEX_DIRECTDYN: "YandexDirectDyn",
|
|
6180
|
+
YANDEX_DIRECTFETCHER: "YaDirectFetcher",
|
|
6181
|
+
YANDEX_FORDOMAIN: "YandexForDomain",
|
|
6182
|
+
YANDEX_PAGECHECKER: "YandexPagechecker",
|
|
6183
|
+
YANDEX_SEARCHSHOP: "YandexSearchShop",
|
|
6184
|
+
YANDEX_SITELINKS: "YandexSitelinks",
|
|
6185
|
+
YANDEX_USERPROXY: "YandexUserproxy",
|
|
6186
|
+
ZOOMINFO_BOT: "Zoombot"
|
|
6187
|
+
},
|
|
6188
|
+
InApp: {
|
|
6189
|
+
DISCORD: "Discord",
|
|
6190
|
+
EVERNOTE: "Evernote",
|
|
6191
|
+
FIGMA: "Figma",
|
|
6192
|
+
FLIPBOARD: "Flipboard",
|
|
6193
|
+
MATTERMOST: "Mattermost",
|
|
6194
|
+
TEAMS: "Teams",
|
|
6195
|
+
NOTION: "Notion",
|
|
6196
|
+
POSTMAN: "Postman",
|
|
6197
|
+
RAMBOX: "Rambox",
|
|
6198
|
+
ROCKETCHAT: "Rocket.Chat",
|
|
6199
|
+
SLACK: "Slack",
|
|
6200
|
+
TIKTOK_LITE: "TikTok Lite",
|
|
6201
|
+
VSCODE: "VS Code",
|
|
6202
|
+
YAHOO_JAPAN: "Yahoo! Japan"
|
|
6203
|
+
},
|
|
6204
|
+
Library: {
|
|
6205
|
+
ADOBE_AIR: "AdobeAIR",
|
|
6206
|
+
AIOHTTP: "aiohttp",
|
|
6207
|
+
APACHE_HTTPCLIENT: "Apache-HttpClient",
|
|
6208
|
+
AXIOS: "axios",
|
|
6209
|
+
GO_HTTP_CLIENT: "go-http-client",
|
|
6210
|
+
GOT: "got",
|
|
6211
|
+
GUZZLEHTTP: "GuzzleHttp",
|
|
6212
|
+
JAVA: "Java",
|
|
6213
|
+
JAVA_HTTPCLIENT: "Java-http-client",
|
|
6214
|
+
JSDOM: "jsdom",
|
|
6215
|
+
LIBWWW_PERL: "libwww-perl",
|
|
6216
|
+
LUA_RESTY_HTTP: "lua-resty-http",
|
|
6217
|
+
NEEDLE: "Needle",
|
|
6218
|
+
NUTCH: "Nutch",
|
|
6219
|
+
OKHTTP: "OkHttp",
|
|
6220
|
+
NODE_FETCH: "node-fetch",
|
|
6221
|
+
NODE_SUPERAGENT: "node-superagent",
|
|
6222
|
+
PHP_SOAP: "PHP-SOAP",
|
|
6223
|
+
POSTMAN_RUNTIME: "PostmanRuntime",
|
|
6224
|
+
PYTHON_HTTPX: "python-httpx",
|
|
6225
|
+
PYTHON_URLLIB: "python-urllib",
|
|
6226
|
+
PYTHON_URLLIB3: "python-urllib3",
|
|
6227
|
+
PYTHON_REQUESTS: "python-requests",
|
|
6228
|
+
SCRAPY: "Scrapy"
|
|
6229
|
+
}
|
|
6230
|
+
},
|
|
6231
|
+
DeviceVendor: {
|
|
6232
|
+
Vehicle: {
|
|
6233
|
+
BMW: "BMW",
|
|
6234
|
+
BYD: "BYD",
|
|
6235
|
+
JEEP: "Jeep",
|
|
6236
|
+
RIVIAN: "Rivian",
|
|
6237
|
+
TESLA: "Tesla",
|
|
6238
|
+
VOLVO: "Volvo"
|
|
6239
|
+
}
|
|
6240
|
+
}
|
|
6241
|
+
});
|
|
6242
|
+
|
|
6243
|
+
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/extensions/ua-parser-extensions.mjs
|
|
6244
|
+
var MODEL2 = "model";
|
|
6245
|
+
var NAME2 = "name";
|
|
6246
|
+
var TYPE2 = "type";
|
|
6247
|
+
var VENDOR2 = "vendor";
|
|
6248
|
+
var VERSION4 = "version";
|
|
6249
|
+
var MOBILE2 = "mobile";
|
|
6250
|
+
var TABLET2 = "tablet";
|
|
6251
|
+
var CRAWLER = "crawler";
|
|
6252
|
+
var CLI = "cli";
|
|
6253
|
+
var EMAIL = "email";
|
|
6254
|
+
var FETCHER = "fetcher";
|
|
6255
|
+
var INAPP2 = "inapp";
|
|
6256
|
+
var MEDIAPLAYER = "mediaplayer";
|
|
6257
|
+
var LIBRARY = "library";
|
|
6258
|
+
var CLIs = Object.freeze({
|
|
6259
|
+
browser: [
|
|
6260
|
+
// wget / curl / Lynx / ELinks / HTTPie
|
|
6261
|
+
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i],
|
|
6262
|
+
[NAME2, VERSION4, [TYPE2, CLI]]
|
|
6263
|
+
]
|
|
6264
|
+
});
|
|
6265
|
+
var Crawlers = Object.freeze({
|
|
6266
|
+
browser: [
|
|
6267
|
+
[
|
|
6268
|
+
// AhrefsBot - https://ahrefs.com/robot
|
|
6269
|
+
// Amazonbot - https://developer.amazon.com/amazonbot
|
|
6270
|
+
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
|
6271
|
+
// Bravebot - https://search.brave.com/help/brave-search-crawler
|
|
6272
|
+
// CCBot - https://commoncrawl.org/faq
|
|
6273
|
+
// contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
|
|
6274
|
+
// Coveobot - https://connect.coveo.com/s/article/19648
|
|
6275
|
+
// CriteoBot - https://www.criteo.com/criteo-crawler/
|
|
6276
|
+
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
|
6277
|
+
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
|
6278
|
+
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
|
6279
|
+
// GPTBot - https://platform.openai.com/docs/gptbot
|
|
6280
|
+
// iAskBot - https://iask.ai
|
|
6281
|
+
// Kagibot - https://kagi.com/bot
|
|
6282
|
+
// Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
|
|
6283
|
+
// LinkedInBot - http://www.linkedin.com
|
|
6284
|
+
// MJ12bot - https://mj12bot.com/
|
|
6285
|
+
// MojeekBot - https://www.mojeek.com/bot.html
|
|
6286
|
+
// Onespot - https://www.onespot.com/identifying-traffic.html
|
|
6287
|
+
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
|
6288
|
+
// PerplexityBot - https://perplexity.ai/perplexitybot
|
|
6289
|
+
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
|
|
6290
|
+
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
|
6291
|
+
// SurdotlyBot - http://sur.ly/bot.html
|
|
6292
|
+
// Swiftbot - https://swiftype.com/swiftbot
|
|
6293
|
+
// YepBot - https://yep.com/yepbot/
|
|
6294
|
+
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
|
|
6295
|
+
// Algolia Crawler
|
|
6296
|
+
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
|
|
6297
|
+
// Applebot - http://apple.com/go/applebot
|
|
6298
|
+
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
|
6299
|
+
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
|
6300
|
+
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
|
6301
|
+
// ClaudeBot (Anthropic)
|
|
6302
|
+
/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
|
6303
|
+
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
|
6304
|
+
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
|
6305
|
+
// Daum
|
|
6306
|
+
/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
|
|
6307
|
+
// Facebook / Meta
|
|
6308
|
+
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
|
6309
|
+
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
|
6310
|
+
// Googlebot - http://www.google.com/bot.html
|
|
6311
|
+
/(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,
|
|
6312
|
+
// Internet Archive (archive.org)
|
|
6313
|
+
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
|
6314
|
+
// OnCrawl
|
|
6315
|
+
/(oncrawl) mobile\/([\w\.]+)/i,
|
|
6316
|
+
// Qwantbot - https://help.qwant.com/bot
|
|
6317
|
+
/(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
|
|
6318
|
+
// SemrushBot - http://www.semrush.com/bot.html
|
|
6319
|
+
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
|
6320
|
+
// Sogou Spider
|
|
6321
|
+
/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
|
|
6322
|
+
// Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
|
|
6323
|
+
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
|
6324
|
+
// Yandex Bots - https://yandex.com/bots
|
|
6325
|
+
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
|
|
6326
|
+
// Yeti (Naver)
|
|
6327
|
+
/(yeti)\/([\w\.]+)/i,
|
|
6328
|
+
// aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
|
|
6329
|
+
// Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
|
|
6330
|
+
// Freespoke - https://docs.freespoke.com/search/bot/
|
|
6331
|
+
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
|
|
6332
|
+
],
|
|
6333
|
+
[NAME2, VERSION4, [TYPE2, CRAWLER]],
|
|
6334
|
+
[
|
|
6335
|
+
// YandexBot MirrorDetector
|
|
6336
|
+
/(yandexbot\/([\w\.]+); mirrordetector)/i
|
|
6337
|
+
],
|
|
6338
|
+
[[NAME2, /\/.+;/ig, ""], VERSION4, [TYPE2, CRAWLER]],
|
|
6339
|
+
[
|
|
6340
|
+
// Google Bots
|
|
6341
|
+
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
|
6342
|
+
// AI2Bot - https://allenai.org/crawler
|
|
6343
|
+
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
|
6344
|
+
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
|
6345
|
+
// ImagesiftBot - https://imagesift.com/about
|
|
6346
|
+
// Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
|
|
6347
|
+
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
|
6348
|
+
// v0bot - https://vercel.com/docs/bot-management
|
|
6349
|
+
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
|
6350
|
+
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
|
|
6351
|
+
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
|
|
6352
|
+
],
|
|
6353
|
+
[NAME2, [TYPE2, CRAWLER]]
|
|
6354
|
+
]
|
|
6355
|
+
});
|
|
6356
|
+
var ExtraDevices = Object.freeze({
|
|
6357
|
+
device: [
|
|
6358
|
+
[
|
|
6359
|
+
/(nook)[\w ]+build\/(\w+)/i,
|
|
6360
|
+
// Nook
|
|
6361
|
+
/(dell) (strea[kpr\d ]*[\dko])/i,
|
|
6362
|
+
// Dell Streak
|
|
6363
|
+
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
|
|
6364
|
+
// Le Pan Tablets
|
|
6365
|
+
/(trinity)[- ]*(t\d{3}) bui/i,
|
|
6366
|
+
// Trinity Tablets
|
|
6367
|
+
/(gigaset)[- ]+(q\w{1,9}) bui/i,
|
|
6368
|
+
// Gigaset Tablets
|
|
6369
|
+
/(vodafone) ([\w ]+)(?:\)| bui)/i
|
|
6370
|
+
// Vodafone
|
|
6371
|
+
],
|
|
6372
|
+
[VENDOR2, MODEL2, [TYPE2, TABLET2]],
|
|
6373
|
+
[
|
|
6374
|
+
/(u304aa)/i
|
|
6375
|
+
// AT&T
|
|
6376
|
+
],
|
|
6377
|
+
[MODEL2, [VENDOR2, "AT&T"], [TYPE2, MOBILE2]],
|
|
6378
|
+
[
|
|
6379
|
+
/\bsie-(\w*)/i
|
|
6380
|
+
// Siemens
|
|
6381
|
+
],
|
|
6382
|
+
[MODEL2, [VENDOR2, "Siemens"], [TYPE2, MOBILE2]],
|
|
6383
|
+
[
|
|
6384
|
+
/\b(rct\w+) b/i
|
|
6385
|
+
// RCA Tablets
|
|
6386
|
+
],
|
|
6387
|
+
[MODEL2, [VENDOR2, "RCA"], [TYPE2, TABLET2]],
|
|
6388
|
+
[
|
|
6389
|
+
/\b(venue[\d ]{2,7}) b/i
|
|
6390
|
+
// Dell Venue Tablets
|
|
6391
|
+
],
|
|
6392
|
+
[MODEL2, [VENDOR2, "Dell"], [TYPE2, TABLET2]],
|
|
6393
|
+
[
|
|
6394
|
+
/\b(q(?:mv|ta)\w+) b/i
|
|
6395
|
+
// Verizon Tablet
|
|
6396
|
+
],
|
|
6397
|
+
[MODEL2, [VENDOR2, "Verizon"], [TYPE2, TABLET2]],
|
|
6398
|
+
[
|
|
6399
|
+
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
|
|
6400
|
+
// Barnes & Noble Tablet
|
|
6401
|
+
],
|
|
6402
|
+
[MODEL2, [VENDOR2, "Barnes & Noble"], [TYPE2, TABLET2]],
|
|
6403
|
+
[
|
|
6404
|
+
/\b(tm\d{3}\w+) b/i
|
|
6405
|
+
],
|
|
6406
|
+
[MODEL2, [VENDOR2, "NuVision"], [TYPE2, TABLET2]],
|
|
6407
|
+
[
|
|
6408
|
+
/\b(k88) b/i
|
|
6409
|
+
// ZTE K Series Tablet
|
|
6410
|
+
],
|
|
6411
|
+
[MODEL2, [VENDOR2, "ZTE"], [TYPE2, TABLET2]],
|
|
6412
|
+
[
|
|
6413
|
+
/\b(nx\d{3}j) b/i
|
|
6414
|
+
// ZTE Nubia
|
|
6415
|
+
],
|
|
6416
|
+
[MODEL2, [VENDOR2, "ZTE"], [TYPE2, MOBILE2]],
|
|
6417
|
+
[
|
|
6418
|
+
/\b(gen\d{3}) b.+49h/i
|
|
6419
|
+
// Swiss GEN Mobile
|
|
6420
|
+
],
|
|
6421
|
+
[MODEL2, [VENDOR2, "Swiss"], [TYPE2, MOBILE2]],
|
|
6422
|
+
[
|
|
6423
|
+
/\b(zur\d{3}) b/i
|
|
6424
|
+
// Swiss ZUR Tablet
|
|
6425
|
+
],
|
|
6426
|
+
[MODEL2, [VENDOR2, "Swiss"], [TYPE2, TABLET2]],
|
|
6427
|
+
[
|
|
6428
|
+
/^((zeki)?tb.*\b) b/i
|
|
6429
|
+
// Zeki Tablets
|
|
6430
|
+
],
|
|
6431
|
+
[MODEL2, [VENDOR2, "Zeki"], [TYPE2, TABLET2]],
|
|
6432
|
+
[
|
|
6433
|
+
/\b([yr]\d{2}) b/i,
|
|
6434
|
+
/\b(?:dragon[- ]+touch |dt)(\w{5}) b/i
|
|
6435
|
+
// Dragon Touch Tablet
|
|
6436
|
+
],
|
|
6437
|
+
[MODEL2, [VENDOR2, "Dragon Touch"], [TYPE2, TABLET2]],
|
|
6438
|
+
[
|
|
6439
|
+
/\b(ns-?\w{0,9}) b/i
|
|
6440
|
+
// Insignia Tablets
|
|
6441
|
+
],
|
|
6442
|
+
[MODEL2, [VENDOR2, "Insignia"], [TYPE2, TABLET2]],
|
|
6443
|
+
[
|
|
6444
|
+
/\b((nxa|next)-?\w{0,9}) b/i
|
|
6445
|
+
// NextBook Tablets
|
|
6446
|
+
],
|
|
6447
|
+
[MODEL2, [VENDOR2, "NextBook"], [TYPE2, TABLET2]],
|
|
6448
|
+
[
|
|
6449
|
+
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
|
|
6450
|
+
// Voice Xtreme Phones
|
|
6451
|
+
],
|
|
6452
|
+
[[VENDOR2, "Voice"], MODEL2, [TYPE2, MOBILE2]],
|
|
6453
|
+
[
|
|
6454
|
+
/\b(lvtel\-)?(v1[12]) b/i
|
|
6455
|
+
// LvTel Phones
|
|
6456
|
+
],
|
|
6457
|
+
[[VENDOR2, "LvTel"], MODEL2, [TYPE2, MOBILE2]],
|
|
6458
|
+
[
|
|
6459
|
+
/\b(ph-1) /i
|
|
6460
|
+
// Essential PH-1
|
|
6461
|
+
],
|
|
6462
|
+
[MODEL2, [VENDOR2, "Essential"], [TYPE2, MOBILE2]],
|
|
6463
|
+
[
|
|
6464
|
+
/\b(v(100md|700na|7011|917g).*\b) b/i
|
|
6465
|
+
// Envizen Tablets
|
|
6466
|
+
],
|
|
6467
|
+
[MODEL2, [VENDOR2, "Envizen"], [TYPE2, TABLET2]],
|
|
6468
|
+
[
|
|
6469
|
+
/\b(trio[-\w\. ]+) b/i
|
|
6470
|
+
// MachSpeed Tablets
|
|
6471
|
+
],
|
|
6472
|
+
[MODEL2, [VENDOR2, "MachSpeed"], [TYPE2, TABLET2]],
|
|
6473
|
+
[
|
|
6474
|
+
/\btu_(1491) b/i
|
|
6475
|
+
// Rotor Tablets
|
|
6476
|
+
],
|
|
6477
|
+
[MODEL2, [VENDOR2, "Rotor"], [TYPE2, TABLET2]]
|
|
6478
|
+
]
|
|
6479
|
+
});
|
|
6480
|
+
var Emails = Object.freeze({
|
|
6481
|
+
browser: [
|
|
6482
|
+
[
|
|
6483
|
+
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
|
|
6484
|
+
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
|
|
6485
|
+
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
|
|
6486
|
+
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
|
|
6487
|
+
// Apple's Mail
|
|
6488
|
+
/(mail)\/([\w\.]+) cf/i
|
|
6489
|
+
],
|
|
6490
|
+
[NAME2, VERSION4, [TYPE2, EMAIL]],
|
|
6491
|
+
[
|
|
6492
|
+
// Zimbra
|
|
6493
|
+
/zdesktop\/([\w\.]+)/i
|
|
6494
|
+
],
|
|
6495
|
+
[VERSION4, [NAME2, "Zimbra"], [TYPE2, EMAIL]]
|
|
6496
|
+
]
|
|
6497
|
+
});
|
|
6498
|
+
var Fetchers = Object.freeze({
|
|
6499
|
+
browser: [
|
|
6500
|
+
[
|
|
6501
|
+
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
|
|
6502
|
+
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
|
6503
|
+
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
|
|
6504
|
+
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
|
6505
|
+
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
|
6506
|
+
// Google Site Verifier / Meta / Yahoo! Japan
|
|
6507
|
+
// Iframely - https://iframely.com/docs/about
|
|
6508
|
+
// Perplexity-User - https://docs.perplexity.ai/guides/bots
|
|
6509
|
+
// MistralAI-User - https://docs.mistral.ai/robots/
|
|
6510
|
+
// Yandex Bots - https://yandex.com/bots
|
|
6511
|
+
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
|
6512
|
+
// Bluesky
|
|
6513
|
+
/(bluesky) cardyb\/([\w\.]+)/i,
|
|
6514
|
+
// Skype
|
|
6515
|
+
/(skypeuripreview) preview\/([\w\.]+)/i,
|
|
6516
|
+
// Slackbot - https://api.slack.com/robots
|
|
6517
|
+
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
|
|
6518
|
+
// WhatsApp
|
|
6519
|
+
/(whatsapp)\/([\w\.]+)/i
|
|
6520
|
+
],
|
|
6521
|
+
[NAME2, VERSION4, [TYPE2, FETCHER]],
|
|
6522
|
+
[
|
|
6523
|
+
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
|
|
6524
|
+
/((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
|
|
6525
|
+
],
|
|
6526
|
+
[NAME2, [TYPE2, FETCHER]]
|
|
6527
|
+
],
|
|
6528
|
+
os: [
|
|
6529
|
+
[/whatsapp\/[\d\.]+ (a|i)/i],
|
|
6530
|
+
[[NAME2, (os) => os == "A" ? "Android" : "iOS"]]
|
|
6531
|
+
]
|
|
6532
|
+
});
|
|
6533
|
+
var InApps = Object.freeze({
|
|
6534
|
+
browser: [
|
|
6535
|
+
[
|
|
6536
|
+
// Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
|
|
6537
|
+
/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
|
|
6538
|
+
/(flipboard)\/([\w\.]+)/i
|
|
6539
|
+
],
|
|
6540
|
+
[NAME2, VERSION4, [TYPE2, INAPP2]],
|
|
6541
|
+
[
|
|
6542
|
+
// Evernote/Teams on mobile
|
|
6543
|
+
/(evernote) win/i,
|
|
6544
|
+
/(teams)mobile-(ios|and)/i
|
|
6545
|
+
],
|
|
6546
|
+
[NAME2, [TYPE2, INAPP2]],
|
|
6547
|
+
[
|
|
6548
|
+
// Slack
|
|
6549
|
+
/chatlyio\/([\d\.]+)/i
|
|
6550
|
+
],
|
|
6551
|
+
[VERSION4, [NAME2, "Slack"], [TYPE2, INAPP2]],
|
|
6552
|
+
[
|
|
6553
|
+
// TikTok Lite
|
|
6554
|
+
/ultralite app_version\/([\w\.]+)/i
|
|
6555
|
+
],
|
|
6556
|
+
[VERSION4, [NAME2, "TikTok Lite"], [TYPE2, INAPP2]],
|
|
6557
|
+
[
|
|
6558
|
+
// VS Code
|
|
6559
|
+
/\) code\/([\d\.]+).+electron\//i
|
|
6560
|
+
],
|
|
6561
|
+
[VERSION4, [NAME2, "VS Code"], [TYPE2, INAPP2]],
|
|
6562
|
+
[
|
|
6563
|
+
// Yahoo! Japan
|
|
6564
|
+
/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i
|
|
6565
|
+
],
|
|
6566
|
+
[VERSION4, [NAME2, "Yahoo! Japan"], [TYPE2, INAPP2]]
|
|
6567
|
+
]
|
|
6568
|
+
});
|
|
6569
|
+
var MediaPlayers = Object.freeze({
|
|
6570
|
+
browser: [
|
|
6571
|
+
[
|
|
6572
|
+
/(apple(?:coremedia|tv))\/([\w\._]+)/i,
|
|
6573
|
+
// Generic Apple CoreMedia
|
|
6574
|
+
/(coremedia) v([\w\._]+)/i,
|
|
6575
|
+
// Ares/Nexplayer/OSSProxy
|
|
6576
|
+
/(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
|
|
6577
|
+
// Aqualung/Lyssna/BSPlayer/Clementine/MPD
|
|
6578
|
+
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
|
|
6579
|
+
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
|
6580
|
+
// Nero Home/Nero Scout/Nokia
|
|
6581
|
+
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
|
6582
|
+
// SoundTap/Totem/Stagefright/Streamium
|
|
6583
|
+
// XBMC/gvfs/Xine/XMMS/irapp
|
|
6584
|
+
/^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,
|
|
6585
|
+
/(lg player|nexplayer) ([\d\.]+)/i,
|
|
6586
|
+
/player\/(nexplayer|lg player) ([\w\.-]+)/i,
|
|
6587
|
+
// NexPlayer/LG Player
|
|
6588
|
+
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i,
|
|
6589
|
+
// Gstreamer
|
|
6590
|
+
/(htc streaming player) [\w_]+ \/ ([\d\.]+)/i,
|
|
6591
|
+
// HTC Streaming Player
|
|
6592
|
+
/(lavf)([\d\.]+)/i,
|
|
6593
|
+
// Lavf (FFMPEG)
|
|
6594
|
+
// MPlayer SVN
|
|
6595
|
+
/(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
|
|
6596
|
+
/ (songbird)\/([\w\.-]+)/i,
|
|
6597
|
+
// Songbird/Philips-Songbird
|
|
6598
|
+
/(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i,
|
|
6599
|
+
// Winamp
|
|
6600
|
+
/(vlc)(?:\/| media player - version )([\w\.-]+)/i,
|
|
6601
|
+
// VLC Videolan
|
|
6602
|
+
/^(foobar2000|itunes|smp)\/([\d\.]+)/i,
|
|
6603
|
+
// Foobar2000/iTunes/SMP
|
|
6604
|
+
/com\.(riseupradioalarm)\/([\d\.]*)/i,
|
|
6605
|
+
// RiseUP Radio Alarm
|
|
6606
|
+
/(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i,
|
|
6607
|
+
// MPlayer
|
|
6608
|
+
// Windows Media Server
|
|
6609
|
+
/(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
|
|
6610
|
+
],
|
|
6611
|
+
[NAME2, VERSION4, [TYPE2, MEDIAPLAYER]],
|
|
6612
|
+
[
|
|
6613
|
+
/(flrp)\/([\w\.-]+)/i
|
|
6614
|
+
// Flip Player
|
|
6615
|
+
],
|
|
6616
|
+
[[NAME2, "Flip Player"], VERSION4, [TYPE2, MEDIAPLAYER]],
|
|
6617
|
+
[
|
|
6618
|
+
// FStream/NativeHost/QuerySeekSpider
|
|
6619
|
+
// MPlayer (no other info)/Media Player Classic/Nero ShowTime
|
|
6620
|
+
// OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
|
6621
|
+
// inlight radio / YourMuze
|
|
6622
|
+
/(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
|
|
6623
|
+
],
|
|
6624
|
+
[NAME2, [TYPE2, MEDIAPLAYER]],
|
|
6625
|
+
[
|
|
6626
|
+
/(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i
|
|
6627
|
+
// HTC One S / Windows Media Player
|
|
6628
|
+
],
|
|
6629
|
+
[[NAME2, /[_-]/g, " "], VERSION4, [TYPE2, MEDIAPLAYER]],
|
|
6630
|
+
[
|
|
6631
|
+
/(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i
|
|
6632
|
+
// Rad.io
|
|
6633
|
+
],
|
|
6634
|
+
[[NAME2, "rad.io"], VERSION4, [TYPE2, MEDIAPLAYER]]
|
|
6635
|
+
]
|
|
6636
|
+
});
|
|
6637
|
+
var Libraries = Object.freeze({
|
|
6638
|
+
browser: [
|
|
6639
|
+
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
|
|
6640
|
+
[
|
|
6641
|
+
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
|
|
6642
|
+
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
|
|
6643
|
+
/(nutch)-([\w\.-]+)(\(|$)/i,
|
|
6644
|
+
/\((java)\/([\w\.]+)/i
|
|
6645
|
+
],
|
|
6646
|
+
[NAME2, VERSION4, [TYPE2, LIBRARY]]
|
|
6647
|
+
]
|
|
6648
|
+
});
|
|
6649
|
+
var Vehicles = Object.freeze({
|
|
6650
|
+
device: [
|
|
6651
|
+
[/aftlbt962e2/i],
|
|
6652
|
+
// BMW
|
|
6653
|
+
[[VENDOR2, "BMW"]],
|
|
6654
|
+
[/dilink.+(byd) auto/i],
|
|
6655
|
+
// BYD
|
|
6656
|
+
[VENDOR2],
|
|
6657
|
+
[/aftlft962x3/i],
|
|
6658
|
+
// Jeep
|
|
6659
|
+
[[VENDOR2, "Jeep"], [MODEL2, "Wagooner"]],
|
|
6660
|
+
[/(rivian) (r1t)/i],
|
|
6661
|
+
// Rivian
|
|
6662
|
+
[VENDOR2, MODEL2],
|
|
6663
|
+
[/vcc.+netfront/i],
|
|
6664
|
+
// Volvo
|
|
6665
|
+
[[VENDOR2, "Volvo"]]
|
|
6666
|
+
]
|
|
6667
|
+
});
|
|
6668
|
+
var Bots = Object.freeze({
|
|
6669
|
+
browser: [
|
|
6670
|
+
...CLIs.browser,
|
|
6671
|
+
...Fetchers.browser,
|
|
6672
|
+
...Crawlers.browser,
|
|
6673
|
+
...Libraries.browser
|
|
6674
|
+
],
|
|
6675
|
+
os: [
|
|
6676
|
+
...Fetchers.os
|
|
6677
|
+
]
|
|
6678
|
+
});
|
|
6679
|
+
|
|
6680
|
+
// ../../node_modules/.pnpm/detect-europe-js@0.1.2/node_modules/detect-europe-js/dist/esm/index.js
|
|
6681
|
+
var TIMEZONE = {
|
|
6682
|
+
ANDORRA: {
|
|
6683
|
+
ANDORRA: "Europe/Andorra"
|
|
6684
|
+
},
|
|
6685
|
+
AUSTRIA: {
|
|
6686
|
+
VIENNA: "Europe/Vienna"
|
|
6687
|
+
},
|
|
6688
|
+
BELGIUM: {
|
|
6689
|
+
BRUSSELS: "Europe/Brussels"
|
|
6690
|
+
},
|
|
6691
|
+
BULGARIA: {
|
|
6692
|
+
SOFIA: "Europe/Sofia"
|
|
6693
|
+
},
|
|
6694
|
+
CROATIA: {
|
|
6695
|
+
ZAGREB: "Europe/Zagreb"
|
|
6696
|
+
},
|
|
6697
|
+
CYPRUS: {
|
|
6698
|
+
NICOSIA_EUROPE: "Europe/Nicosia",
|
|
6699
|
+
NICOSIA_ASIA: "Asia/Nicosia",
|
|
6700
|
+
FAMAGUSTA: "Asia/Famagusta"
|
|
6701
|
+
},
|
|
6702
|
+
CZECHIA: {
|
|
6703
|
+
PRAGUE: "Europe/Prague"
|
|
6704
|
+
},
|
|
6705
|
+
DENMARK: {
|
|
6706
|
+
COPENHAGEN: "Europe/Copenhagen",
|
|
6707
|
+
FAROE: "Atlantic/Faroe"
|
|
6708
|
+
},
|
|
6709
|
+
ESTONIA: {
|
|
6710
|
+
TALLINN: "Europe/Tallinn"
|
|
6711
|
+
},
|
|
6712
|
+
FINLAND: {
|
|
6713
|
+
HELSINKI: "Europe/Helsinki",
|
|
6714
|
+
MARIEHAMN: "Europe/Mariehamn"
|
|
6715
|
+
},
|
|
6716
|
+
FRANCE: {
|
|
6717
|
+
PARIS: "Europe/Paris",
|
|
6718
|
+
CAYENNE: "America/Cayenne",
|
|
6719
|
+
GUADELOUPE: "America/Guadeloupe",
|
|
6720
|
+
MARIGOT: "America/Marigot",
|
|
6721
|
+
MARTINIQUE: "America/Martinique",
|
|
6722
|
+
MAYOTTE: "Indian/Mayotte",
|
|
6723
|
+
REUNION: "Indian/Reunion"
|
|
6724
|
+
},
|
|
6725
|
+
GERMANY: {
|
|
6726
|
+
BERLIN: "Europe/Berlin",
|
|
6727
|
+
BUSINGEN: "Europe/Busingen"
|
|
6728
|
+
},
|
|
6729
|
+
GREECE: {
|
|
6730
|
+
ATHENS: "Europe/Athens"
|
|
6731
|
+
},
|
|
6732
|
+
HUNGARY: {
|
|
6733
|
+
BUDAPEST: "Europe/Budapest"
|
|
6734
|
+
},
|
|
6735
|
+
ICELAND: {
|
|
6736
|
+
REYKJAVIK: "Atlantic/Reykjavik"
|
|
6737
|
+
},
|
|
6738
|
+
IRELAND: {
|
|
6739
|
+
DUBLIN: "Europe/Dublin"
|
|
6740
|
+
},
|
|
6741
|
+
ITALY: {
|
|
6742
|
+
ROME: "Europe/Rome"
|
|
6743
|
+
},
|
|
6744
|
+
LATVIA: {
|
|
6745
|
+
RIGA: "Europe/Riga"
|
|
6746
|
+
},
|
|
6747
|
+
LIECHTENSTEIN: {
|
|
6748
|
+
VADUZ: "Europe/Vaduz"
|
|
6749
|
+
},
|
|
6750
|
+
LITHUANIA: {
|
|
6751
|
+
VILNIUS: "Europe/Vilnius"
|
|
6752
|
+
},
|
|
6753
|
+
LUXEMBOURG: {
|
|
6754
|
+
LUXEMBOURG: "Europe/Luxembourg"
|
|
6755
|
+
},
|
|
6756
|
+
MALTA: {
|
|
6757
|
+
MALTA: "Europe/Malta"
|
|
6758
|
+
},
|
|
6759
|
+
MONACO: {
|
|
6760
|
+
MONACO: "Europe/Monaco"
|
|
6761
|
+
},
|
|
6762
|
+
NETHERLANDS: {
|
|
6763
|
+
AMSTERDAM: "Europe/Amsterdam",
|
|
6764
|
+
ARUBA: "America/Aruba",
|
|
6765
|
+
CURACAO: "America/Curacao",
|
|
6766
|
+
KRALENDIJK: "America/Kralendijk",
|
|
6767
|
+
LOWER_PRINCES: "America/Lower_Princes"
|
|
6768
|
+
},
|
|
6769
|
+
NORWAY: {
|
|
6770
|
+
OSLO: "Europe/Oslo",
|
|
6771
|
+
JAN_MAYEN: "Atlantic/Jan_Mayen",
|
|
6772
|
+
LONGYEARBYEN: "Arctic/Longyearbyen"
|
|
6773
|
+
},
|
|
6774
|
+
POLAND: {
|
|
6775
|
+
WARSAW: "Europe/Warsaw"
|
|
6776
|
+
},
|
|
6777
|
+
PORTUGAL: {
|
|
6778
|
+
LISBON: "Europe/Lisbon",
|
|
6779
|
+
AZORES: "Atlantic/Azores",
|
|
6780
|
+
MADEIRA: "Atlantic/Madeira"
|
|
6781
|
+
},
|
|
6782
|
+
ROMANIA: {
|
|
6783
|
+
BUCHAREST: "Europe/Bucharest"
|
|
6784
|
+
},
|
|
6785
|
+
SAN_MARINO: {
|
|
6786
|
+
SAN_MARINO: "Europe/San_Marino"
|
|
6787
|
+
},
|
|
6788
|
+
SLOVAKIA: {
|
|
6789
|
+
BRATISLAVA: "Europe/Bratislava"
|
|
6790
|
+
},
|
|
6791
|
+
SLOVENIA: {
|
|
6792
|
+
LJUBLJANA: "Europe/Ljubljana"
|
|
6793
|
+
},
|
|
6794
|
+
SPAIN: {
|
|
6795
|
+
MADRID: "Europe/Madrid",
|
|
6796
|
+
CANARY: "Atlantic/Canary",
|
|
6797
|
+
CEUTA: "Africa/Ceuta"
|
|
6798
|
+
},
|
|
6799
|
+
SWEDEN: {
|
|
6800
|
+
STOCKHOLM: "Europe/Stockholm"
|
|
6801
|
+
},
|
|
6802
|
+
SWITZERLAND: {
|
|
6803
|
+
ZURICH: "Europe/Zurich"
|
|
6804
|
+
},
|
|
6805
|
+
VATICAN: {
|
|
6806
|
+
VATICAN: "Europe/Vatican"
|
|
6807
|
+
}
|
|
6808
|
+
};
|
|
6809
|
+
var EU_TIMEZONE = [
|
|
6810
|
+
TIMEZONE.AUSTRIA.VIENNA,
|
|
6811
|
+
TIMEZONE.BELGIUM.BRUSSELS,
|
|
6812
|
+
TIMEZONE.BULGARIA.SOFIA,
|
|
6813
|
+
TIMEZONE.CROATIA.ZAGREB,
|
|
6814
|
+
TIMEZONE.CYPRUS.NICOSIA_EUROPE,
|
|
6815
|
+
TIMEZONE.CYPRUS.NICOSIA_ASIA,
|
|
6816
|
+
TIMEZONE.CYPRUS.FAMAGUSTA,
|
|
6817
|
+
TIMEZONE.CZECHIA.PRAGUE,
|
|
6818
|
+
TIMEZONE.DENMARK.COPENHAGEN,
|
|
6819
|
+
TIMEZONE.ESTONIA.TALLINN,
|
|
6820
|
+
TIMEZONE.FINLAND.HELSINKI,
|
|
6821
|
+
TIMEZONE.FINLAND.MARIEHAMN,
|
|
6822
|
+
TIMEZONE.FRANCE.PARIS,
|
|
6823
|
+
TIMEZONE.GERMANY.BERLIN,
|
|
6824
|
+
TIMEZONE.GREECE.ATHENS,
|
|
6825
|
+
TIMEZONE.HUNGARY.BUDAPEST,
|
|
6826
|
+
TIMEZONE.IRELAND.DUBLIN,
|
|
6827
|
+
TIMEZONE.ITALY.ROME,
|
|
6828
|
+
TIMEZONE.LATVIA.RIGA,
|
|
6829
|
+
TIMEZONE.LITHUANIA.VILNIUS,
|
|
6830
|
+
TIMEZONE.LUXEMBOURG.LUXEMBOURG,
|
|
6831
|
+
TIMEZONE.MALTA.MALTA,
|
|
6832
|
+
TIMEZONE.NETHERLANDS.AMSTERDAM,
|
|
6833
|
+
TIMEZONE.POLAND.WARSAW,
|
|
6834
|
+
TIMEZONE.PORTUGAL.LISBON,
|
|
6835
|
+
TIMEZONE.ROMANIA.BUCHAREST,
|
|
6836
|
+
TIMEZONE.SLOVAKIA.BRATISLAVA,
|
|
6837
|
+
TIMEZONE.SLOVENIA.LJUBLJANA,
|
|
6838
|
+
TIMEZONE.SPAIN.MADRID,
|
|
6839
|
+
TIMEZONE.SWEDEN.STOCKHOLM,
|
|
6840
|
+
TIMEZONE.FRANCE.CAYENNE,
|
|
6841
|
+
TIMEZONE.FRANCE.GUADELOUPE,
|
|
6842
|
+
TIMEZONE.FRANCE.MARIGOT,
|
|
6843
|
+
TIMEZONE.FRANCE.MARTINIQUE,
|
|
6844
|
+
TIMEZONE.FRANCE.MAYOTTE,
|
|
6845
|
+
TIMEZONE.FRANCE.REUNION,
|
|
6846
|
+
TIMEZONE.PORTUGAL.AZORES,
|
|
6847
|
+
TIMEZONE.PORTUGAL.MADEIRA,
|
|
6848
|
+
TIMEZONE.SPAIN.CANARY
|
|
6849
|
+
];
|
|
6850
|
+
var EEA_EFTA_TIMEZONE = [
|
|
6851
|
+
TIMEZONE.ICELAND.REYKJAVIK,
|
|
6852
|
+
TIMEZONE.LIECHTENSTEIN.VADUZ,
|
|
6853
|
+
TIMEZONE.NORWAY.OSLO,
|
|
6854
|
+
TIMEZONE.NORWAY.JAN_MAYEN
|
|
6855
|
+
];
|
|
6856
|
+
var EEA_TIMEZONE = [
|
|
6857
|
+
...EU_TIMEZONE,
|
|
6858
|
+
...EEA_EFTA_TIMEZONE
|
|
6859
|
+
];
|
|
6860
|
+
var EFTA_TIMEZONE = [
|
|
6861
|
+
TIMEZONE.SWITZERLAND.ZURICH,
|
|
6862
|
+
...EEA_EFTA_TIMEZONE
|
|
6863
|
+
];
|
|
6864
|
+
var SCHENGEN_TIMEZONE = [
|
|
6865
|
+
TIMEZONE.AUSTRIA.VIENNA,
|
|
6866
|
+
TIMEZONE.BELGIUM.BRUSSELS,
|
|
6867
|
+
TIMEZONE.BULGARIA.SOFIA,
|
|
6868
|
+
TIMEZONE.CROATIA.ZAGREB,
|
|
6869
|
+
TIMEZONE.CZECHIA.PRAGUE,
|
|
6870
|
+
TIMEZONE.DENMARK.COPENHAGEN,
|
|
6871
|
+
TIMEZONE.ESTONIA.TALLINN,
|
|
6872
|
+
TIMEZONE.FINLAND.HELSINKI,
|
|
6873
|
+
TIMEZONE.FINLAND.MARIEHAMN,
|
|
6874
|
+
TIMEZONE.FRANCE.PARIS,
|
|
6875
|
+
TIMEZONE.GERMANY.BERLIN,
|
|
6876
|
+
TIMEZONE.GREECE.ATHENS,
|
|
6877
|
+
TIMEZONE.HUNGARY.BUDAPEST,
|
|
6878
|
+
TIMEZONE.ITALY.ROME,
|
|
6879
|
+
TIMEZONE.LATVIA.RIGA,
|
|
6880
|
+
TIMEZONE.LITHUANIA.VILNIUS,
|
|
6881
|
+
TIMEZONE.LUXEMBOURG.LUXEMBOURG,
|
|
6882
|
+
TIMEZONE.MALTA.MALTA,
|
|
6883
|
+
TIMEZONE.NETHERLANDS.AMSTERDAM,
|
|
6884
|
+
TIMEZONE.POLAND.WARSAW,
|
|
6885
|
+
TIMEZONE.PORTUGAL.LISBON,
|
|
6886
|
+
TIMEZONE.PORTUGAL.AZORES,
|
|
6887
|
+
TIMEZONE.PORTUGAL.MADEIRA,
|
|
6888
|
+
TIMEZONE.ROMANIA.BUCHAREST,
|
|
6889
|
+
TIMEZONE.SLOVAKIA.BRATISLAVA,
|
|
6890
|
+
TIMEZONE.SLOVENIA.LJUBLJANA,
|
|
6891
|
+
TIMEZONE.SPAIN.MADRID,
|
|
6892
|
+
TIMEZONE.SPAIN.CANARY,
|
|
6893
|
+
TIMEZONE.SWEDEN.STOCKHOLM,
|
|
6894
|
+
TIMEZONE.ANDORRA.ANDORRA,
|
|
6895
|
+
TIMEZONE.GERMANY.BUSINGEN,
|
|
6896
|
+
TIMEZONE.ICELAND.REYKJAVIK,
|
|
6897
|
+
TIMEZONE.LIECHTENSTEIN.VADUZ,
|
|
6898
|
+
TIMEZONE.MONACO.MONACO,
|
|
6899
|
+
TIMEZONE.NORWAY.OSLO,
|
|
6900
|
+
TIMEZONE.SAN_MARINO.SAN_MARINO,
|
|
6901
|
+
TIMEZONE.SPAIN.CEUTA,
|
|
6902
|
+
TIMEZONE.SWITZERLAND.ZURICH,
|
|
6903
|
+
TIMEZONE.VATICAN.VATICAN
|
|
6904
|
+
];
|
|
6905
|
+
|
|
6906
|
+
// ../../node_modules/.pnpm/is-standalone-pwa@0.1.1/node_modules/is-standalone-pwa/dist/esm/index.js
|
|
6907
|
+
function isStandalonePWA() {
|
|
6908
|
+
var _a;
|
|
6909
|
+
return typeof window !== "undefined" && ((window === null || window === void 0 ? void 0 : window.matchMedia("(display-mode: standalone)").matches) || ((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone) || document.referrer.startsWith("android-app://") || (window === null || window === void 0 ? void 0 : window.Windows) || /trident.+(msapphost|webview)\//i.test(navigator.userAgent) || document.referrer.startsWith("app-info://platform/microsoft-store"));
|
|
3704
6910
|
}
|
|
6911
|
+
|
|
6912
|
+
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/helpers/ua-parser-helpers.mjs
|
|
6913
|
+
var { Crawler } = Extension.BrowserName;
|
|
6914
|
+
var toResult = (value, head, ext) => typeof value === "string" ? UAParser(value, head, ext) : value;
|
|
6915
|
+
var isAppleSilicon = (resultOrUA) => {
|
|
6916
|
+
const res = toResult(resultOrUA);
|
|
6917
|
+
if (res.os.is(OSName.MACOS)) {
|
|
6918
|
+
if (res.cpu.is(CPUArch.ARM)) {
|
|
6919
|
+
return true;
|
|
6920
|
+
}
|
|
6921
|
+
if (typeof resultOrUA !== "string" && typeof window !== "undefined") {
|
|
6922
|
+
try {
|
|
6923
|
+
const canvas = document.createElement("canvas");
|
|
6924
|
+
const webgl = canvas.getContext("webgl2") || canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
|
|
6925
|
+
const debug = webgl.getExtension("WEBGL_debug_renderer_info");
|
|
6926
|
+
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
|
6927
|
+
if (renderer.match(/apple m\d/i)) {
|
|
6928
|
+
return true;
|
|
6929
|
+
}
|
|
6930
|
+
} catch (e) {
|
|
6931
|
+
return false;
|
|
6932
|
+
}
|
|
6933
|
+
}
|
|
6934
|
+
}
|
|
6935
|
+
return false;
|
|
6936
|
+
};
|
|
6937
|
+
var isBot = (resultOrUA) => [
|
|
6938
|
+
BrowserType.CLI,
|
|
6939
|
+
BrowserType.CRAWLER,
|
|
6940
|
+
BrowserType.FETCHER,
|
|
6941
|
+
BrowserType.LIBRARY
|
|
6942
|
+
].includes(toResult(resultOrUA, Bots).browser.type);
|
|
6943
|
+
var isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
|
|
6944
|
+
|
|
6945
|
+
// src/v2/core/utils/deviceInfo.ts
|
|
3705
6946
|
function getScreenResolution() {
|
|
3706
6947
|
return {
|
|
3707
6948
|
width: window.screen.width,
|
|
@@ -3728,21 +6969,71 @@ var TagadaTrackerBundle = (() => {
|
|
|
3728
6969
|
if (typeof window === "undefined") {
|
|
3729
6970
|
return {
|
|
3730
6971
|
userAgent: {
|
|
3731
|
-
|
|
3732
|
-
|
|
6972
|
+
name: "",
|
|
6973
|
+
browser: { major: "", name: "", version: "" },
|
|
6974
|
+
os: { name: "", version: "" },
|
|
6975
|
+
device: void 0,
|
|
6976
|
+
engine: { name: "", version: "" },
|
|
6977
|
+
cpu: { architecture: "" }
|
|
3733
6978
|
},
|
|
3734
6979
|
screenResolution: { width: 0, height: 0 },
|
|
3735
|
-
timeZone: "UTC"
|
|
6980
|
+
timeZone: "UTC",
|
|
6981
|
+
flags: {
|
|
6982
|
+
isBot: false,
|
|
6983
|
+
isChromeFamily: false,
|
|
6984
|
+
isStandalonePWA: false,
|
|
6985
|
+
isAppleSilicon: false
|
|
6986
|
+
}
|
|
6987
|
+
};
|
|
6988
|
+
}
|
|
6989
|
+
const parser = new UAParser();
|
|
6990
|
+
const result = parser.getResult();
|
|
6991
|
+
let flags;
|
|
6992
|
+
try {
|
|
6993
|
+
flags = {
|
|
6994
|
+
isBot: isBot(result),
|
|
6995
|
+
isChromeFamily: isChromeFamily(result),
|
|
6996
|
+
isStandalonePWA: isStandalonePWA(),
|
|
6997
|
+
isAppleSilicon: isAppleSilicon(result)
|
|
6998
|
+
};
|
|
6999
|
+
} catch (error) {
|
|
7000
|
+
console.error("Failed to compute device flags:", error);
|
|
7001
|
+
flags = {
|
|
7002
|
+
isBot: false,
|
|
7003
|
+
isChromeFamily: false,
|
|
7004
|
+
isStandalonePWA: false,
|
|
7005
|
+
isAppleSilicon: false
|
|
3736
7006
|
};
|
|
3737
7007
|
}
|
|
3738
7008
|
return {
|
|
3739
7009
|
userAgent: {
|
|
3740
|
-
|
|
3741
|
-
|
|
3742
|
-
|
|
7010
|
+
name: result.ua,
|
|
7011
|
+
browser: {
|
|
7012
|
+
major: result.browser.major || "",
|
|
7013
|
+
name: result.browser.name || "",
|
|
7014
|
+
version: result.browser.version || "",
|
|
7015
|
+
type: result.browser.type
|
|
7016
|
+
},
|
|
7017
|
+
os: {
|
|
7018
|
+
name: result.os.name || "",
|
|
7019
|
+
version: result.os.version || ""
|
|
7020
|
+
},
|
|
7021
|
+
device: result.device.model || result.device.type || result.device.vendor ? {
|
|
7022
|
+
model: result.device.model,
|
|
7023
|
+
type: result.device.type,
|
|
7024
|
+
vendor: result.device.vendor
|
|
7025
|
+
} : void 0,
|
|
7026
|
+
engine: {
|
|
7027
|
+
name: result.engine.name || "",
|
|
7028
|
+
version: result.engine.version || ""
|
|
7029
|
+
},
|
|
7030
|
+
cpu: {
|
|
7031
|
+
architecture: result.cpu.architecture || ""
|
|
7032
|
+
}
|
|
3743
7033
|
},
|
|
3744
7034
|
screenResolution: getScreenResolution(),
|
|
3745
|
-
timeZone: getTimeZone()
|
|
7035
|
+
timeZone: getTimeZone(),
|
|
7036
|
+
flags
|
|
3746
7037
|
};
|
|
3747
7038
|
}
|
|
3748
7039
|
function getUrlParams() {
|
|
@@ -4104,6 +7395,94 @@ var TagadaTrackerBundle = (() => {
|
|
|
4104
7395
|
}
|
|
4105
7396
|
}
|
|
4106
7397
|
|
|
7398
|
+
// src/v2/core/utils/authHandoff.ts
|
|
7399
|
+
var resolutionCache = /* @__PURE__ */ new Map();
|
|
7400
|
+
var resolvedCodes = /* @__PURE__ */ new Set();
|
|
7401
|
+
function getAuthCode() {
|
|
7402
|
+
if (typeof window === "undefined") return null;
|
|
7403
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
7404
|
+
return urlParams.get("authCode");
|
|
7405
|
+
}
|
|
7406
|
+
async function resolveAuthHandoff(authCode, storeId, apiBaseUrl, debugMode = false) {
|
|
7407
|
+
if (resolvedCodes.has(authCode)) {
|
|
7408
|
+
if (debugMode) {
|
|
7409
|
+
console.log("[AuthHandoff] Code already resolved, skipping duplicate request");
|
|
7410
|
+
}
|
|
7411
|
+
throw new Error("Auth code already resolved");
|
|
7412
|
+
}
|
|
7413
|
+
const inFlightResolution = resolutionCache.get(authCode);
|
|
7414
|
+
if (inFlightResolution) {
|
|
7415
|
+
if (debugMode) {
|
|
7416
|
+
console.log("[AuthHandoff] Resolution already in progress, waiting for existing request");
|
|
7417
|
+
}
|
|
7418
|
+
return inFlightResolution;
|
|
7419
|
+
}
|
|
7420
|
+
if (debugMode) {
|
|
7421
|
+
console.log("[AuthHandoff] Resolving authCode:", authCode.substring(0, 15) + "...");
|
|
7422
|
+
}
|
|
7423
|
+
const resolutionPromise = (async () => {
|
|
7424
|
+
try {
|
|
7425
|
+
const response = await fetch("".concat(apiBaseUrl, "/api/v1/cms/auth/resolve-handoff"), {
|
|
7426
|
+
method: "POST",
|
|
7427
|
+
headers: {
|
|
7428
|
+
"Content-Type": "application/json"
|
|
7429
|
+
},
|
|
7430
|
+
body: JSON.stringify({
|
|
7431
|
+
code: authCode,
|
|
7432
|
+
storeId
|
|
7433
|
+
})
|
|
7434
|
+
});
|
|
7435
|
+
if (!response.ok) {
|
|
7436
|
+
const errorData = await response.json().catch(() => ({ message: "Unknown error" }));
|
|
7437
|
+
throw new Error(errorData.message || "Failed to resolve auth handoff: ".concat(response.status));
|
|
7438
|
+
}
|
|
7439
|
+
const data = await response.json();
|
|
7440
|
+
if (debugMode) {
|
|
7441
|
+
console.log("[AuthHandoff] \u2705 Resolved successfully:", {
|
|
7442
|
+
customerId: data.customer.id,
|
|
7443
|
+
role: data.customer.role,
|
|
7444
|
+
hasContext: Object.keys(data.context).length > 0
|
|
7445
|
+
});
|
|
7446
|
+
}
|
|
7447
|
+
if (debugMode) {
|
|
7448
|
+
console.log("[AuthHandoff] Storing new token (overriding existing)");
|
|
7449
|
+
}
|
|
7450
|
+
setClientToken(data.token);
|
|
7451
|
+
cleanAuthCodeFromUrl(debugMode);
|
|
7452
|
+
resolvedCodes.add(authCode);
|
|
7453
|
+
return data;
|
|
7454
|
+
} catch (error) {
|
|
7455
|
+
console.error("[AuthHandoff] \u274C Failed to resolve:", error);
|
|
7456
|
+
throw error;
|
|
7457
|
+
} finally {
|
|
7458
|
+
resolutionCache.delete(authCode);
|
|
7459
|
+
}
|
|
7460
|
+
})();
|
|
7461
|
+
resolutionCache.set(authCode, resolutionPromise);
|
|
7462
|
+
return resolutionPromise;
|
|
7463
|
+
}
|
|
7464
|
+
function cleanAuthCodeFromUrl(debugMode = false) {
|
|
7465
|
+
if (typeof window === "undefined") return;
|
|
7466
|
+
const url = new URL(window.location.href);
|
|
7467
|
+
if (url.searchParams.has("authCode")) {
|
|
7468
|
+
url.searchParams.delete("authCode");
|
|
7469
|
+
window.history.replaceState({}, "", url.pathname + url.search + url.hash);
|
|
7470
|
+
if (debugMode) {
|
|
7471
|
+
console.log("[AuthHandoff] Cleaned authCode from URL");
|
|
7472
|
+
}
|
|
7473
|
+
}
|
|
7474
|
+
}
|
|
7475
|
+
function shouldResolveAuthCode() {
|
|
7476
|
+
const authCode = getAuthCode();
|
|
7477
|
+
if (!authCode || !authCode.startsWith("ah_")) {
|
|
7478
|
+
return false;
|
|
7479
|
+
}
|
|
7480
|
+
if (resolvedCodes.has(authCode)) {
|
|
7481
|
+
return false;
|
|
7482
|
+
}
|
|
7483
|
+
return true;
|
|
7484
|
+
}
|
|
7485
|
+
|
|
4107
7486
|
// src/v2/core/client.ts
|
|
4108
7487
|
var TagadaClient = class {
|
|
4109
7488
|
constructor(config = {}) {
|
|
@@ -4119,13 +7498,17 @@ var TagadaTrackerBundle = (() => {
|
|
|
4119
7498
|
this.lastSessionInitError = null;
|
|
4120
7499
|
this.sessionInitRetryCount = 0;
|
|
4121
7500
|
this.MAX_SESSION_INIT_RETRIES = 3;
|
|
4122
|
-
var _a, _b;
|
|
7501
|
+
var _a, _b, _c, _d;
|
|
4123
7502
|
this.config = config;
|
|
4124
7503
|
this.instanceId = Math.random().toString(36).substr(2, 9);
|
|
4125
7504
|
this.boundHandleStorageChange = this.handleStorageChange.bind(this);
|
|
4126
|
-
|
|
4127
|
-
|
|
4128
|
-
|
|
7505
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Initializing..."));
|
|
7506
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Config:"), {
|
|
7507
|
+
debugMode: config.debugMode,
|
|
7508
|
+
hasRawPluginConfig: !!config.rawPluginConfig,
|
|
7509
|
+
rawPluginConfig: config.rawPluginConfig,
|
|
7510
|
+
features: config.features
|
|
7511
|
+
});
|
|
4129
7512
|
const previewModeActive = handlePreviewMode(this.config.debugMode);
|
|
4130
7513
|
if (previewModeActive && this.config.debugMode) {
|
|
4131
7514
|
console.log("[TagadaClient ".concat(this.instanceId, "] Preview mode active - state cleared"));
|
|
@@ -4166,10 +7549,15 @@ var TagadaTrackerBundle = (() => {
|
|
|
4166
7549
|
isInitialized: false,
|
|
4167
7550
|
isSessionInitialized: false,
|
|
4168
7551
|
pluginConfig: { basePath: "/", config: {} },
|
|
4169
|
-
pluginConfigLoading:
|
|
7552
|
+
pluginConfigLoading: true,
|
|
7553
|
+
// Always true - loadPluginConfig will process rawPluginConfig
|
|
4170
7554
|
debugMode: (_a = config.debugMode) != null ? _a : env !== "production",
|
|
4171
7555
|
token: null
|
|
4172
7556
|
};
|
|
7557
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Initial state:"), {
|
|
7558
|
+
pluginConfigLoading: this.state.pluginConfigLoading,
|
|
7559
|
+
hasRawPluginConfig: !!config.rawPluginConfig
|
|
7560
|
+
});
|
|
4173
7561
|
this.apiClient = new ApiClient({
|
|
4174
7562
|
baseURL: envConfig.apiConfig.baseUrl
|
|
4175
7563
|
});
|
|
@@ -4182,7 +7570,10 @@ var TagadaTrackerBundle = (() => {
|
|
|
4182
7570
|
debugMode: this.state.debugMode,
|
|
4183
7571
|
pluginConfig: this.state.pluginConfig,
|
|
4184
7572
|
environment: this.state.environment,
|
|
4185
|
-
autoRedirect: funnelConfig.autoRedirect
|
|
7573
|
+
autoRedirect: funnelConfig.autoRedirect,
|
|
7574
|
+
// Pass funnelId and stepId from rawPluginConfig to enable config-based initialization
|
|
7575
|
+
funnelId: (_c = config.rawPluginConfig) == null ? void 0 : _c.funnelId,
|
|
7576
|
+
stepId: (_d = config.rawPluginConfig) == null ? void 0 : _d.stepId
|
|
4186
7577
|
});
|
|
4187
7578
|
}
|
|
4188
7579
|
this.apiClient.setTokenProvider(this.waitForToken.bind(this));
|
|
@@ -4280,10 +7671,19 @@ var TagadaTrackerBundle = (() => {
|
|
|
4280
7671
|
* Load plugin configuration
|
|
4281
7672
|
*/
|
|
4282
7673
|
async initializePluginConfig() {
|
|
4283
|
-
|
|
7674
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] initializePluginConfig called"), {
|
|
7675
|
+
pluginConfigLoading: this.state.pluginConfigLoading,
|
|
7676
|
+
hasRawPluginConfig: !!this.config.rawPluginConfig
|
|
7677
|
+
});
|
|
7678
|
+
if (!this.state.pluginConfigLoading) {
|
|
7679
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Plugin config already loading or loaded, skipping..."));
|
|
7680
|
+
return;
|
|
7681
|
+
}
|
|
4284
7682
|
try {
|
|
4285
7683
|
const configVariant = this.config.localConfig || "default";
|
|
7684
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Loading plugin config with variant: ").concat(configVariant));
|
|
4286
7685
|
const config = await loadPluginConfig(configVariant, this.config.rawPluginConfig);
|
|
7686
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Plugin config loaded:"), config);
|
|
4287
7687
|
this.updateState({
|
|
4288
7688
|
pluginConfig: config,
|
|
4289
7689
|
pluginConfigLoading: false
|
|
@@ -4294,9 +7694,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
4294
7694
|
environment: this.state.environment
|
|
4295
7695
|
});
|
|
4296
7696
|
}
|
|
4297
|
-
if (this.state.debugMode) {
|
|
4298
|
-
console.log("[TagadaClient] Plugin config loaded:", config);
|
|
4299
|
-
}
|
|
4300
7697
|
} catch (error) {
|
|
4301
7698
|
console.error("[TagadaClient] Failed to load plugin config:", error);
|
|
4302
7699
|
this.updateState({
|
|
@@ -4309,15 +7706,63 @@ var TagadaTrackerBundle = (() => {
|
|
|
4309
7706
|
* Initialize token and session
|
|
4310
7707
|
*/
|
|
4311
7708
|
async initializeToken() {
|
|
7709
|
+
var _a;
|
|
7710
|
+
if (shouldResolveAuthCode()) {
|
|
7711
|
+
const storeId = this.state.pluginConfig.storeId;
|
|
7712
|
+
if (!storeId) {
|
|
7713
|
+
console.error("[TagadaClient] Cannot resolve authCode: storeId not found in config");
|
|
7714
|
+
return this.fallbackToNormalFlow();
|
|
7715
|
+
}
|
|
7716
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] \u{1F510} Cross-domain auth detected, resolving..."));
|
|
7717
|
+
try {
|
|
7718
|
+
const authCode = new URLSearchParams(window.location.search).get("authCode");
|
|
7719
|
+
if (!authCode) {
|
|
7720
|
+
return this.fallbackToNormalFlow();
|
|
7721
|
+
}
|
|
7722
|
+
const handoffData = await resolveAuthHandoff(
|
|
7723
|
+
authCode,
|
|
7724
|
+
storeId,
|
|
7725
|
+
this.state.environment.apiConfig.baseUrl,
|
|
7726
|
+
this.state.debugMode
|
|
7727
|
+
);
|
|
7728
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] \u2705 Auth handoff resolved:"), {
|
|
7729
|
+
customerId: handoffData.customer.id,
|
|
7730
|
+
role: handoffData.customer.role,
|
|
7731
|
+
hasContext: Object.keys(handoffData.context).length > 0
|
|
7732
|
+
});
|
|
7733
|
+
this.setToken(handoffData.token);
|
|
7734
|
+
const decodedSession = decodeJWTClient(handoffData.token);
|
|
7735
|
+
if (decodedSession) {
|
|
7736
|
+
this.updateState({ session: decodedSession });
|
|
7737
|
+
await this.initializeSession(decodedSession);
|
|
7738
|
+
if (((_a = handoffData.context) == null ? void 0 : _a.funnelSessionId) && this.funnel) {
|
|
7739
|
+
if (this.state.debugMode) {
|
|
7740
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Restoring funnel session from handoff context:"), handoffData.context.funnelSessionId);
|
|
7741
|
+
}
|
|
7742
|
+
}
|
|
7743
|
+
} else {
|
|
7744
|
+
console.error("[TagadaClient] Failed to decode token from handoff");
|
|
7745
|
+
this.updateState({ isInitialized: true, isLoading: false });
|
|
7746
|
+
}
|
|
7747
|
+
return;
|
|
7748
|
+
} catch (error) {
|
|
7749
|
+
console.error("[TagadaClient ".concat(this.instanceId, "] \u274C Auth handoff failed, falling back to normal flow:"), error);
|
|
7750
|
+
}
|
|
7751
|
+
}
|
|
7752
|
+
await this.fallbackToNormalFlow();
|
|
7753
|
+
}
|
|
7754
|
+
/**
|
|
7755
|
+
* Normal token initialization flow (no cross-domain handoff)
|
|
7756
|
+
*/
|
|
7757
|
+
async fallbackToNormalFlow() {
|
|
4312
7758
|
const existingToken = getClientToken();
|
|
4313
7759
|
const urlParams = new URLSearchParams(typeof window !== "undefined" ? window.location.search : "");
|
|
4314
7760
|
const queryToken = urlParams.get("token");
|
|
4315
|
-
|
|
4316
|
-
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4320
|
-
}
|
|
7761
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] Initializing token (normal flow)..."), {
|
|
7762
|
+
hasExistingToken: !!existingToken,
|
|
7763
|
+
hasQueryToken: !!queryToken,
|
|
7764
|
+
storeId: this.state.pluginConfig.storeId
|
|
7765
|
+
});
|
|
4321
7766
|
let tokenToUse = null;
|
|
4322
7767
|
let shouldPersist = false;
|
|
4323
7768
|
if (queryToken) {
|
|
@@ -4344,12 +7789,14 @@ var TagadaTrackerBundle = (() => {
|
|
|
4344
7789
|
}
|
|
4345
7790
|
} else {
|
|
4346
7791
|
const storeId = this.state.pluginConfig.storeId;
|
|
7792
|
+
console.log("[TagadaClient ".concat(this.instanceId, "] No existing token, creating anonymous token..."), {
|
|
7793
|
+
hasStoreId: !!storeId,
|
|
7794
|
+
storeId
|
|
7795
|
+
});
|
|
4347
7796
|
if (storeId) {
|
|
4348
|
-
if (this.state.debugMode) {
|
|
4349
|
-
console.log("[TagadaClient ".concat(this.instanceId, "] Creating anonymous token for store:"), storeId);
|
|
4350
|
-
}
|
|
4351
7797
|
await this.createAnonymousToken(storeId);
|
|
4352
7798
|
} else {
|
|
7799
|
+
console.warn("[TagadaClient ".concat(this.instanceId, "] No storeId in plugin config, skipping anonymous token creation"));
|
|
4353
7800
|
this.updateState({ isInitialized: true, isLoading: false });
|
|
4354
7801
|
}
|
|
4355
7802
|
}
|
|
@@ -4423,7 +7870,7 @@ var TagadaTrackerBundle = (() => {
|
|
|
4423
7870
|
* Initialize session
|
|
4424
7871
|
*/
|
|
4425
7872
|
async initializeSession(sessionData) {
|
|
4426
|
-
var _a, _b;
|
|
7873
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
4427
7874
|
if (this.isInitializingSession) {
|
|
4428
7875
|
if (this.state.debugMode) {
|
|
4429
7876
|
console.log("[TagadaClient ".concat(this.instanceId, "] Session initialization already in progress, skipping"));
|
|
@@ -4460,14 +7907,24 @@ var TagadaTrackerBundle = (() => {
|
|
|
4460
7907
|
osVersion: deviceInfo.userAgent.os.version,
|
|
4461
7908
|
deviceType: (_a = deviceInfo.userAgent.device) == null ? void 0 : _a.type,
|
|
4462
7909
|
deviceModel: (_b = deviceInfo.userAgent.device) == null ? void 0 : _b.model,
|
|
7910
|
+
deviceVendor: (_c = deviceInfo.userAgent.device) == null ? void 0 : _c.vendor,
|
|
7911
|
+
userAgent: deviceInfo.userAgent.name,
|
|
7912
|
+
engineName: deviceInfo.userAgent.engine.name,
|
|
7913
|
+
engineVersion: deviceInfo.userAgent.engine.version,
|
|
7914
|
+
cpuArchitecture: deviceInfo.userAgent.cpu.architecture,
|
|
7915
|
+
isBot: (_e = (_d = deviceInfo.flags) == null ? void 0 : _d.isBot) != null ? _e : false,
|
|
7916
|
+
isChromeFamily: (_g = (_f = deviceInfo.flags) == null ? void 0 : _f.isChromeFamily) != null ? _g : false,
|
|
7917
|
+
isStandalonePWA: (_i = (_h = deviceInfo.flags) == null ? void 0 : _h.isStandalonePWA) != null ? _i : false,
|
|
7918
|
+
isAppleSilicon: (_k = (_j = deviceInfo.flags) == null ? void 0 : _j.isAppleSilicon) != null ? _k : false,
|
|
4463
7919
|
screenWidth: deviceInfo.screenResolution.width,
|
|
4464
7920
|
screenHeight: deviceInfo.screenResolution.height,
|
|
4465
7921
|
timeZone: deviceInfo.timeZone,
|
|
4466
|
-
draft
|
|
7922
|
+
draft,
|
|
4467
7923
|
// 🎯 Pass draft mode to session init
|
|
7924
|
+
fetchMessages: false
|
|
4468
7925
|
};
|
|
4469
7926
|
const response = await this.apiClient.post(
|
|
4470
|
-
"/api/v1/cms/session/init",
|
|
7927
|
+
"/api/v1/cms/session/v2/init",
|
|
4471
7928
|
sessionInitData
|
|
4472
7929
|
);
|
|
4473
7930
|
this.lastSessionInitError = null;
|
|
@@ -4503,13 +7960,15 @@ var TagadaTrackerBundle = (() => {
|
|
|
4503
7960
|
});
|
|
4504
7961
|
this.updateState({ store: storeConfig });
|
|
4505
7962
|
}
|
|
4506
|
-
|
|
4507
|
-
|
|
4508
|
-
|
|
4509
|
-
|
|
4510
|
-
|
|
4511
|
-
|
|
4512
|
-
|
|
7963
|
+
if (response.locale) {
|
|
7964
|
+
const localeConfig = {
|
|
7965
|
+
locale: response.locale,
|
|
7966
|
+
language: response.locale.split("-")[0],
|
|
7967
|
+
region: (_b = response.locale.split("-")[1]) != null ? _b : "US",
|
|
7968
|
+
messages: (_c = response.messages) != null ? _c : {}
|
|
7969
|
+
};
|
|
7970
|
+
this.updateState({ locale: localeConfig });
|
|
7971
|
+
}
|
|
4513
7972
|
if (response.store) {
|
|
4514
7973
|
const currencyConfig = {
|
|
4515
7974
|
code: response.store.currency,
|
|
@@ -5066,6 +8525,29 @@ var TagadaTrackerBundle = (() => {
|
|
|
5066
8525
|
}
|
|
5067
8526
|
return __toCommonJS(external_tracker_exports);
|
|
5068
8527
|
})();
|
|
8528
|
+
/*! Bundled license information:
|
|
8529
|
+
|
|
8530
|
+
detect-europe-js/dist/esm/index.js:
|
|
8531
|
+
(*! detectEurope.js v0.1.2
|
|
8532
|
+
Determine whether a user is from the European Union (EU) area
|
|
8533
|
+
https://github.com/faisalman/detect-europe-js
|
|
8534
|
+
Author: Faisal Salman <f@faisalman.com>
|
|
8535
|
+
MIT License *)
|
|
8536
|
+
|
|
8537
|
+
ua-is-frozen/dist/esm/index.js:
|
|
8538
|
+
(*! isFrozenUA
|
|
8539
|
+
A freeze-test for your user-agent string
|
|
8540
|
+
https://github.com/faisalman/ua-is-frozen
|
|
8541
|
+
Author: Faisal Salman <f@faisalman.com>
|
|
8542
|
+
MIT License *)
|
|
8543
|
+
|
|
8544
|
+
is-standalone-pwa/dist/esm/index.js:
|
|
8545
|
+
(*! isStandalonePWA 0.1.1
|
|
8546
|
+
Detect if PWA is running in standalone mode
|
|
8547
|
+
https://github.com/faisalman/is-standalone-pwa
|
|
8548
|
+
Author: Faisal Salman <f@faisalman.com>
|
|
8549
|
+
MIT License *)
|
|
8550
|
+
*/
|
|
5069
8551
|
// Expose TagadaTracker globally
|
|
5070
8552
|
if (typeof window !== 'undefined' && TagadaTrackerBundle && TagadaTrackerBundle.TagadaTracker) {
|
|
5071
8553
|
window.TagadaTracker = TagadaTrackerBundle.TagadaTracker;
|