@tagadapay/plugin-sdk 3.1.12 → 3.1.24

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.
Files changed (144) hide show
  1. package/build-cdn.js +397 -11
  2. package/dist/data/iso3166.d.ts +23 -33
  3. package/dist/data/iso3166.js +134 -198
  4. package/dist/data/languages.d.ts +5 -64
  5. package/dist/data/languages.js +23 -143
  6. package/dist/external-tracker.js +623 -3426
  7. package/dist/external-tracker.min.js +2 -25
  8. package/dist/external-tracker.min.js.map +4 -4
  9. package/dist/react/config/payment.d.ts +14 -4
  10. package/dist/react/config/payment.js +47 -9
  11. package/dist/react/hooks/useCheckout.d.ts +3 -0
  12. package/dist/react/hooks/useCheckout.js +4 -1
  13. package/dist/react/hooks/useISOData.js +1 -1
  14. package/dist/react/hooks/usePaymentPolling.d.ts +3 -3
  15. package/dist/react/hooks/usePluginConfig.js +9 -10
  16. package/dist/react/providers/TagadaProvider.js +1 -1
  17. package/dist/tagada-react-sdk-minimal.min.js +36 -0
  18. package/dist/tagada-react-sdk-minimal.min.js.map +7 -0
  19. package/dist/tagada-react-sdk.js +37821 -0
  20. package/dist/tagada-react-sdk.min.js +78 -0
  21. package/dist/tagada-react-sdk.min.js.map +7 -0
  22. package/dist/tagada-sdk.js +16044 -0
  23. package/dist/tagada-sdk.min.js +32 -0
  24. package/dist/tagada-sdk.min.js.map +7 -0
  25. package/dist/v2/cdn-react-minimal.d.ts +23 -0
  26. package/dist/v2/cdn-react-minimal.js +26 -0
  27. package/dist/v2/core/client.d.ts +4 -2
  28. package/dist/v2/core/client.js +5 -4
  29. package/dist/v2/core/config/environment.js +2 -1
  30. package/dist/v2/core/errors.d.ts +75 -0
  31. package/dist/v2/core/errors.js +104 -0
  32. package/dist/v2/core/funnelClient.d.ts +100 -10
  33. package/dist/v2/core/funnelClient.js +121 -27
  34. package/dist/v2/core/isoData.d.ts +4 -4
  35. package/dist/v2/core/isoData.js +7 -7
  36. package/dist/v2/core/pixelMapping.d.ts +49 -0
  37. package/dist/v2/core/pixelMapping.js +363 -0
  38. package/dist/v2/core/resources/apiClient.d.ts +2 -0
  39. package/dist/v2/core/resources/apiClient.js +52 -9
  40. package/dist/v2/core/resources/checkout.d.ts +99 -30
  41. package/dist/v2/core/resources/checkout.js +14 -0
  42. package/dist/v2/core/resources/customer.d.ts +20 -19
  43. package/dist/v2/core/resources/expressPaymentMethods.d.ts +1 -0
  44. package/dist/v2/core/resources/funnel.d.ts +17 -17
  45. package/dist/v2/core/resources/payments.d.ts +89 -13
  46. package/dist/v2/core/resources/payments.js +27 -9
  47. package/dist/v2/core/resources/postPurchases.d.ts +17 -0
  48. package/dist/v2/core/resources/postPurchases.js +20 -0
  49. package/dist/v2/core/types.d.ts +50 -12
  50. package/dist/v2/core/types.js +0 -3
  51. package/dist/v2/core/utils/checkout.d.ts +2 -2
  52. package/dist/v2/core/utils/checkout.js +7 -2
  53. package/dist/v2/core/utils/currency.d.ts +14 -0
  54. package/dist/v2/core/utils/currency.js +40 -0
  55. package/dist/v2/core/utils/deviceInfo.d.ts +0 -10
  56. package/dist/v2/core/utils/deviceInfo.js +152 -76
  57. package/dist/v2/core/utils/index.d.ts +1 -0
  58. package/dist/v2/core/utils/index.js +2 -0
  59. package/dist/v2/core/utils/order.d.ts +13 -9
  60. package/dist/v2/core/utils/pluginConfig.d.ts +8 -0
  61. package/dist/v2/core/utils/pluginConfig.js +36 -12
  62. package/dist/v2/index.d.ts +6 -3
  63. package/dist/v2/index.js +4 -2
  64. package/dist/v2/react/components/FunnelScriptInjector.js +166 -77
  65. package/dist/v2/react/components/StripeExpressButton.d.ts +13 -0
  66. package/dist/v2/react/components/StripeExpressButton.js +171 -0
  67. package/dist/v2/react/components/WhopCheckout.d.ts +24 -0
  68. package/dist/v2/react/components/WhopCheckout.js +237 -0
  69. package/dist/v2/react/hooks/__examples__/FunnelContextExample.js +1 -1
  70. package/dist/v2/react/hooks/payment-actions/useAirwallexRadarAction.d.ts +14 -0
  71. package/dist/v2/react/hooks/payment-actions/useAirwallexRadarAction.js +181 -0
  72. package/dist/v2/react/hooks/payment-actions/useErrorAction.d.ts +9 -0
  73. package/dist/v2/react/hooks/payment-actions/useErrorAction.js +21 -0
  74. package/dist/v2/react/hooks/payment-actions/useFinixRadarAction.d.ts +14 -0
  75. package/dist/v2/react/hooks/payment-actions/useFinixRadarAction.js +187 -0
  76. package/dist/v2/react/hooks/payment-actions/useKessPayAction.d.ts +11 -0
  77. package/dist/v2/react/hooks/payment-actions/useKessPayAction.js +91 -0
  78. package/dist/v2/react/hooks/payment-actions/useMasterCardAction.d.ts +24 -0
  79. package/dist/v2/react/hooks/payment-actions/useMasterCardAction.js +221 -0
  80. package/dist/v2/react/hooks/payment-actions/usePaymentActionHandler.d.ts +15 -0
  81. package/dist/v2/react/hooks/payment-actions/usePaymentActionHandler.js +142 -0
  82. package/dist/v2/react/hooks/payment-actions/useProcessorAuthAction.d.ts +3 -0
  83. package/dist/v2/react/hooks/payment-actions/useProcessorAuthAction.js +31 -0
  84. package/dist/v2/react/hooks/payment-actions/useRedirectAction.d.ts +10 -0
  85. package/dist/v2/react/hooks/payment-actions/useRedirectAction.js +35 -0
  86. package/dist/v2/react/hooks/payment-actions/useStripeRadarAction.d.ts +14 -0
  87. package/dist/v2/react/hooks/payment-actions/useStripeRadarAction.js +192 -0
  88. package/dist/v2/react/hooks/payment-actions/useThreedsAuthAction.d.ts +14 -0
  89. package/dist/v2/react/hooks/payment-actions/useThreedsAuthAction.js +81 -0
  90. package/dist/v2/react/hooks/payment-actions/useTrustFlowAction.d.ts +11 -0
  91. package/dist/v2/react/hooks/payment-actions/useTrustFlowAction.js +84 -0
  92. package/dist/v2/react/hooks/payment-processing/usePaymentInstruments.d.ts +14 -0
  93. package/dist/v2/react/hooks/payment-processing/usePaymentInstruments.js +36 -0
  94. package/dist/v2/react/hooks/payment-processing/usePaymentProcessors.d.ts +31 -0
  95. package/dist/v2/react/hooks/payment-processing/usePaymentProcessors.js +212 -0
  96. package/dist/v2/react/hooks/payment-redirect/useAirwallex3dsReturn.d.ts +14 -0
  97. package/dist/v2/react/hooks/payment-redirect/useAirwallex3dsReturn.js +207 -0
  98. package/dist/v2/react/hooks/payment-redirect/useGenericPaymentReturn.d.ts +12 -0
  99. package/dist/v2/react/hooks/payment-redirect/useGenericPaymentReturn.js +101 -0
  100. package/dist/v2/react/hooks/useApplePayCheckout.js +8 -8
  101. package/dist/v2/react/hooks/useCheckoutQuery.d.ts +16 -0
  102. package/dist/v2/react/hooks/useCheckoutQuery.js +63 -10
  103. package/dist/v2/react/hooks/useFunnel.d.ts +15 -4
  104. package/dist/v2/react/hooks/useFunnel.js +8 -4
  105. package/dist/v2/react/hooks/useGeoLocation.d.ts +2 -1
  106. package/dist/v2/react/hooks/useGeoLocation.js +4 -2
  107. package/dist/v2/react/hooks/useGoogleAutocomplete.d.ts +2 -0
  108. package/dist/v2/react/hooks/useGoogleAutocomplete.js +29 -15
  109. package/dist/v2/react/hooks/useISOData.d.ts +2 -5
  110. package/dist/v2/react/hooks/useISOData.js +26 -27
  111. package/dist/v2/react/hooks/usePaymentPolling.d.ts +3 -3
  112. package/dist/v2/react/hooks/usePaymentQuery.d.ts +18 -5
  113. package/dist/v2/react/hooks/usePaymentQuery.js +63 -1015
  114. package/dist/v2/react/hooks/usePaymentRetrieve.d.ts +3 -2
  115. package/dist/v2/react/hooks/usePaymentRetrieve.js +3 -1
  116. package/dist/v2/react/hooks/usePixelTracking.d.ts +5 -48
  117. package/dist/v2/react/hooks/usePixelTracking.js +283 -504
  118. package/dist/v2/react/hooks/usePostPurchasesQuery.js +34 -2
  119. package/dist/v2/react/hooks/useRemappableParams.d.ts +2 -6
  120. package/dist/v2/react/hooks/useRemappableParams.js +23 -23
  121. package/dist/v2/react/hooks/useSetPaymentMethod.d.ts +16 -0
  122. package/dist/v2/react/hooks/useSetPaymentMethod.js +33 -0
  123. package/dist/v2/react/hooks/useShippingRatesQuery.js +13 -5
  124. package/dist/v2/react/hooks/useStepConfig.d.ts +23 -6
  125. package/dist/v2/react/hooks/useStepConfig.js +14 -7
  126. package/dist/v2/react/hooks/useTranslation.js +23 -8
  127. package/dist/v2/react/hooks/useWhopPaymentPolling.d.ts +30 -0
  128. package/dist/v2/react/hooks/useWhopPaymentPolling.js +61 -0
  129. package/dist/v2/react/index.d.ts +15 -1
  130. package/dist/v2/react/index.js +7 -0
  131. package/dist/v2/react/providers/ExpressPaymentMethodsProvider.d.ts +3 -1
  132. package/dist/v2/react/providers/ExpressPaymentMethodsProvider.js +12 -2
  133. package/dist/v2/react/providers/TagadaProvider.js +74 -5
  134. package/dist/v2/standalone/external-tracker.d.ts +52 -46
  135. package/dist/v2/standalone/external-tracker.js +205 -98
  136. package/dist/v2/standalone/index.d.ts +40 -0
  137. package/dist/v2/standalone/index.js +148 -1
  138. package/dist/v2/standalone/payment-service.d.ts +134 -0
  139. package/dist/v2/standalone/payment-service.js +928 -0
  140. package/package.json +6 -4
  141. package/dist/react/utils/__tests__/urlUtils.test.d.ts +0 -1
  142. package/dist/react/utils/__tests__/urlUtils.test.js +0 -189
  143. package/dist/v2/core/__tests__/pathRemapping.test.d.ts +0 -11
  144. package/dist/v2/core/__tests__/pathRemapping.test.js +0 -776
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TagadaPay External Tracker v3.1.12
2
+ * TagadaPay External Tracker v3.1.24
3
3
  * CDN Bundle - Standalone tracking for external pages (Debug Build)
4
4
  * @license MIT
5
5
  */
@@ -157,7 +157,7 @@ var TagadaTrackerBundle = (() => {
157
157
  const hostname = window.location.hostname;
158
158
  const href = window.location.href;
159
159
  console.log('[SDK] detectEnvironment() - hostname: "'.concat(hostname, '"'));
160
- if (hostname === "localhost" || hostname.startsWith("127.") || hostname.startsWith("192.168.") || hostname.startsWith("10.") || hostname.includes(".local") || hostname === "" || hostname === "0.0.0.0" || hostname.includes("ngrok-free.dev") || hostname.includes("ngrok-free.app") || hostname.includes("ngrok.io") || hostname.includes("ngrok.app")) {
160
+ if (hostname === "localhost" || hostname.startsWith("127.") || hostname.startsWith("192.168.") || hostname.startsWith("10.") || hostname.includes(".local") || hostname === "" || hostname === "0.0.0.0" || hostname.includes("ngrok-free.dev") || hostname.includes("ngrok-free.app") || hostname.includes("ngrok.io") || hostname.includes("ngrok.app") || hostname.includes(".loclx.io")) {
161
161
  console.log("[SDK] detectEnvironment() - returning LOCAL");
162
162
  if (typeof window !== "undefined" && ((_a = window == null ? void 0 : window.__TAGADA_ENV__) == null ? void 0 : _a.TAGADA_ENVIRONMENT)) {
163
163
  const override = window.__TAGADA_ENV__.TAGADA_ENVIRONMENT.toLowerCase();
@@ -674,6 +674,12 @@ var TagadaTrackerBundle = (() => {
674
674
  });
675
675
 
676
676
  // src/v2/core/utils/previewModeIndicator.ts
677
+ var previewModeIndicator_exports = {};
678
+ __export(previewModeIndicator_exports, {
679
+ injectPreviewModeIndicator: () => injectPreviewModeIndicator,
680
+ isIndicatorInjected: () => isIndicatorInjected,
681
+ removePreviewModeIndicator: () => removePreviewModeIndicator
682
+ });
677
683
  function clearSpecificCookie(cookieName) {
678
684
  if (typeof window === "undefined" || typeof document === "undefined") return;
679
685
  const hostname = window.location.hostname;
@@ -929,6 +935,16 @@ var TagadaTrackerBundle = (() => {
929
935
  indicatorElement = container;
930
936
  isInjected = true;
931
937
  }
938
+ function removePreviewModeIndicator() {
939
+ if (indicatorElement && indicatorElement.parentNode) {
940
+ indicatorElement.parentNode.removeChild(indicatorElement);
941
+ indicatorElement = null;
942
+ isInjected = false;
943
+ }
944
+ }
945
+ function isIndicatorInjected() {
946
+ return isInjected;
947
+ }
932
948
  var indicatorElement, isInjected;
933
949
  var init_previewModeIndicator = __esm({
934
950
  "src/v2/core/utils/previewModeIndicator.ts"() {
@@ -946,14 +962,48 @@ var TagadaTrackerBundle = (() => {
946
962
  __export(funnelClient_exports, {
947
963
  FunnelClient: () => FunnelClient,
948
964
  TrackingProvider: () => TrackingProvider,
965
+ findMethod: () => findMethod,
966
+ getAssignedOrderBumpOfferIds: () => getAssignedOrderBumpOfferIds,
949
967
  getAssignedPaymentFlowId: () => getAssignedPaymentFlowId,
950
968
  getAssignedPixels: () => getAssignedPixels,
969
+ getAssignedResources: () => getAssignedResources,
951
970
  getAssignedScripts: () => getAssignedScripts,
952
971
  getAssignedStaticResources: () => getAssignedStaticResources,
953
972
  getAssignedStepConfig: () => getAssignedStepConfig,
973
+ getAssignedUpsellOfferIds: () => getAssignedUpsellOfferIds,
974
+ getEnabledMethods: () => getEnabledMethods,
975
+ getExpressMethods: () => getExpressMethods,
976
+ getExpressMethodsByProcessor: () => getExpressMethodsByProcessor,
954
977
  getLocalFunnelConfig: () => getLocalFunnelConfig,
978
+ isMethodEnabled: () => isMethodEnabled,
955
979
  loadLocalFunnelConfig: () => loadLocalFunnelConfig
956
980
  });
981
+ function getEnabledMethods(config) {
982
+ if (!config) return [];
983
+ return Object.values(config).filter((m) => m.enabled);
984
+ }
985
+ function getExpressMethods(config) {
986
+ return getEnabledMethods(config).filter((m) => m.express);
987
+ }
988
+ function getExpressMethodsByProcessor(config) {
989
+ const groups = {};
990
+ for (const m of getExpressMethods(config)) {
991
+ const key = m.processorId || m.integrationId || m.provider;
992
+ if (!groups[key]) groups[key] = [];
993
+ groups[key].push(m);
994
+ }
995
+ return groups;
996
+ }
997
+ function findMethod(config, method) {
998
+ if (!config) return void 0;
999
+ for (const entry of Object.values(config)) {
1000
+ if (entry.method === method && entry.enabled) return entry;
1001
+ }
1002
+ return void 0;
1003
+ }
1004
+ function isMethodEnabled(config, method) {
1005
+ return !!findMethod(config, method);
1006
+ }
957
1007
  function getAssignedFunnelId() {
958
1008
  if (typeof window === "undefined") return void 0;
959
1009
  if (window.__TGD_FUNNEL_ID__) {
@@ -1052,11 +1102,14 @@ var TagadaTrackerBundle = (() => {
1052
1102
  return localFunnelConfigCache != null ? localFunnelConfigCache : null;
1053
1103
  }
1054
1104
  function localConfigToStepConfig(local) {
1105
+ const merged = __spreadValues(__spreadValues({}, local.staticResources), local.resources);
1055
1106
  return {
1056
1107
  payment: local.paymentFlowId ? { paymentFlowId: local.paymentFlowId } : void 0,
1057
- staticResources: local.staticResources,
1108
+ resources: Object.keys(merged).length > 0 ? merged : void 0,
1058
1109
  scripts: local.scripts,
1059
- pixels: local.pixels
1110
+ pixels: local.pixels,
1111
+ orderBumps: local.orderBumps,
1112
+ upsellOffers: local.upsellOffers
1060
1113
  };
1061
1114
  }
1062
1115
  function getAssignedStepConfig() {
@@ -1082,9 +1135,13 @@ var TagadaTrackerBundle = (() => {
1082
1135
  return void 0;
1083
1136
  }
1084
1137
  function getAssignedPaymentFlowId() {
1085
- var _a;
1138
+ var _a, _b;
1086
1139
  const stepConfig = getAssignedStepConfig();
1087
- if ((_a = stepConfig == null ? void 0 : stepConfig.payment) == null ? void 0 : _a.paymentFlowId) {
1140
+ const cardConfig = (_a = stepConfig == null ? void 0 : stepConfig.paymentSetupConfig) == null ? void 0 : _a.card;
1141
+ if (cardConfig == null ? void 0 : cardConfig.paymentFlowId) {
1142
+ return cardConfig.paymentFlowId;
1143
+ }
1144
+ if ((_b = stepConfig == null ? void 0 : stepConfig.payment) == null ? void 0 : _b.paymentFlowId) {
1088
1145
  return stepConfig.payment.paymentFlowId;
1089
1146
  }
1090
1147
  if (typeof window !== "undefined") {
@@ -1098,9 +1155,15 @@ var TagadaTrackerBundle = (() => {
1098
1155
  }
1099
1156
  return void 0;
1100
1157
  }
1101
- function getAssignedStaticResources() {
1158
+ function getAssignedResources() {
1102
1159
  const stepConfig = getAssignedStepConfig();
1103
- return stepConfig == null ? void 0 : stepConfig.staticResources;
1160
+ const legacy = stepConfig == null ? void 0 : stepConfig.staticResources;
1161
+ const current = stepConfig == null ? void 0 : stepConfig.resources;
1162
+ if (!legacy && !current) return void 0;
1163
+ return __spreadValues(__spreadValues({}, legacy), current);
1164
+ }
1165
+ function getAssignedStaticResources() {
1166
+ return getAssignedResources();
1104
1167
  }
1105
1168
  function getAssignedScripts(position) {
1106
1169
  const stepConfig = getAssignedStepConfig();
@@ -1111,6 +1174,14 @@ var TagadaTrackerBundle = (() => {
1111
1174
  }
1112
1175
  return scripts.length > 0 ? scripts : void 0;
1113
1176
  }
1177
+ function splitPixelConfig(px) {
1178
+ const idField = "containerId" in px ? "containerId" : "pixelId";
1179
+ const rawId = px[idField];
1180
+ if (!rawId || !rawId.includes(";") && !rawId.includes(",")) return [px];
1181
+ const ids = rawId.split(/[;,]/).map((id) => id.trim()).filter((id) => id.length > 0);
1182
+ if (ids.length <= 1) return [px];
1183
+ return ids.map((id) => __spreadProps(__spreadValues({}, px), { [idField]: id }));
1184
+ }
1114
1185
  function getAssignedPixels() {
1115
1186
  const stepConfig = getAssignedStepConfig();
1116
1187
  const rawPixels = stepConfig == null ? void 0 : stepConfig.pixels;
@@ -1119,14 +1190,26 @@ var TagadaTrackerBundle = (() => {
1119
1190
  for (const [key, value] of Object.entries(rawPixels)) {
1120
1191
  if (!value) continue;
1121
1192
  if (Array.isArray(value)) {
1122
- normalized[key] = value;
1193
+ normalized[key] = value.flatMap((px) => splitPixelConfig(px));
1123
1194
  } else if (typeof value === "object") {
1124
- normalized[key] = [value];
1195
+ normalized[key] = splitPixelConfig(value);
1125
1196
  }
1126
1197
  }
1127
1198
  return Object.keys(normalized).length > 0 ? normalized : void 0;
1128
1199
  }
1129
- var TrackingProvider, localFunnelConfigCache, localFunnelConfigLoading, FunnelClient;
1200
+ function getAssignedOrderBumpOfferIds() {
1201
+ const stepConfig = getAssignedStepConfig();
1202
+ if (!(stepConfig == null ? void 0 : stepConfig.orderBumps)) return void 0;
1203
+ if (stepConfig.orderBumps.mode !== "custom") return void 0;
1204
+ return stepConfig.orderBumps.enabledOfferIds;
1205
+ }
1206
+ function getAssignedUpsellOfferIds() {
1207
+ const stepConfig = getAssignedStepConfig();
1208
+ if (!(stepConfig == null ? void 0 : stepConfig.upsellOffers)) return void 0;
1209
+ if (stepConfig.upsellOffers.mode !== "custom") return void 0;
1210
+ return stepConfig.upsellOffers.enabledUpsellIds;
1211
+ }
1212
+ var lazyInjectPreviewIndicator, TrackingProvider, localFunnelConfigCache, localFunnelConfigLoading, FunnelClient;
1130
1213
  var init_funnelClient = __esm({
1131
1214
  "src/v2/core/funnelClient.ts"() {
1132
1215
  "use strict";
@@ -1134,8 +1217,8 @@ var TagadaTrackerBundle = (() => {
1134
1217
  init_funnel();
1135
1218
  init_eventDispatcher();
1136
1219
  init_previewMode();
1137
- init_previewModeIndicator();
1138
1220
  init_sessionStorage();
1221
+ lazyInjectPreviewIndicator = () => Promise.resolve().then(() => (init_previewModeIndicator(), previewModeIndicator_exports)).then((m) => m.injectPreviewModeIndicator());
1139
1222
  TrackingProvider = /* @__PURE__ */ ((TrackingProvider2) => {
1140
1223
  TrackingProvider2["FACEBOOK"] = "facebook";
1141
1224
  TrackingProvider2["TIKTOK"] = "tiktok";
@@ -1286,7 +1369,7 @@ var TagadaTrackerBundle = (() => {
1286
1369
  if (response.success && response.context) {
1287
1370
  const enriched = this.enrichContext(response.context);
1288
1371
  this.handleSessionSuccess(enriched);
1289
- injectPreviewModeIndicator();
1372
+ lazyInjectPreviewIndicator();
1290
1373
  return enriched;
1291
1374
  } else {
1292
1375
  throw new Error(response.error || "Failed to initialize funnel session");
@@ -1332,7 +1415,7 @@ var TagadaTrackerBundle = (() => {
1332
1415
  if (response.success && response.context) {
1333
1416
  const enriched = this.enrichContext(response.context);
1334
1417
  this.handleSessionSuccess(enriched);
1335
- injectPreviewModeIndicator();
1418
+ lazyInjectPreviewIndicator();
1336
1419
  return enriched;
1337
1420
  } else {
1338
1421
  throw new Error(response.error || "Failed to initialize");
@@ -1429,12 +1512,6 @@ var TagadaTrackerBundle = (() => {
1429
1512
  return result;
1430
1513
  }
1431
1514
  const shouldAutoRedirect = (options == null ? void 0 : options.autoRedirect) !== void 0 ? options.autoRedirect : this.config.autoRedirect !== false;
1432
- if (!shouldAutoRedirect) {
1433
- if (this.config.debugMode) {
1434
- console.log("\u{1F504} [FunnelClient] Refreshing session (no auto-redirect)");
1435
- }
1436
- await this.refreshSession();
1437
- }
1438
1515
  this.updateState({ isNavigating: false, isLoading: false });
1439
1516
  if (shouldAutoRedirect && (result == null ? void 0 : result.url) && typeof window !== "undefined") {
1440
1517
  if (this.config.debugMode) {
@@ -1552,6 +1629,7 @@ var TagadaTrackerBundle = (() => {
1552
1629
  // src/v2/standalone/external-tracker.ts
1553
1630
  var external_tracker_exports = {};
1554
1631
  __export(external_tracker_exports, {
1632
+ TRACKER_VERSION: () => TRACKER_VERSION,
1555
1633
  TagadaExternalTracker: () => TagadaExternalTracker,
1556
1634
  TagadaTracker: () => TagadaTracker
1557
1635
  });
@@ -2160,8 +2238,8 @@ var TagadaTrackerBundle = (() => {
2160
2238
  "%20": "+",
2161
2239
  "%00": "\0"
2162
2240
  };
2163
- return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
2164
- return charMap[match];
2241
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match2) {
2242
+ return charMap[match2];
2165
2243
  });
2166
2244
  }
2167
2245
  function AxiosURLSearchParams(params, options) {
@@ -2340,8 +2418,8 @@ var TagadaTrackerBundle = (() => {
2340
2418
 
2341
2419
  // ../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/formDataToJSON.js
2342
2420
  function parsePropPath(name) {
2343
- return utils_default.matchAll(/\w+|\[(\w*)]/g, name).map((match) => {
2344
- return match[0] === "[]" ? "" : match[1] || match[0];
2421
+ return utils_default.matchAll(/\w+|\[(\w*)]/g, name).map((match2) => {
2422
+ return match2[0] === "[]" ? "" : match2[1] || match2[0];
2345
2423
  });
2346
2424
  }
2347
2425
  function arrayToObject(arr) {
@@ -2559,9 +2637,9 @@ var TagadaTrackerBundle = (() => {
2559
2637
  function parseTokens(str) {
2560
2638
  const tokens = /* @__PURE__ */ Object.create(null);
2561
2639
  const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
2562
- let match;
2563
- while (match = tokensRE.exec(str)) {
2564
- tokens[match[1]] = match[2];
2640
+ let match2;
2641
+ while (match2 = tokensRE.exec(str)) {
2642
+ tokens[match2[1]] = match2[2];
2565
2643
  }
2566
2644
  return tokens;
2567
2645
  }
@@ -2820,8 +2898,8 @@ var TagadaTrackerBundle = (() => {
2820
2898
 
2821
2899
  // ../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/parseProtocol.js
2822
2900
  function parseProtocol(url) {
2823
- const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
2824
- return match && match[1] || "";
2901
+ const match2 = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
2902
+ return match2 && match2[1] || "";
2825
2903
  }
2826
2904
 
2827
2905
  // ../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/speedometer.js
@@ -2965,8 +3043,8 @@ var TagadaTrackerBundle = (() => {
2965
3043
  },
2966
3044
  read(name) {
2967
3045
  if (typeof document === "undefined") return null;
2968
- const match = document.cookie.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
2969
- return match ? decodeURIComponent(match[1]) : null;
3046
+ const match2 = document.cookie.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
3047
+ return match2 ? decodeURIComponent(match2[1]) : null;
2970
3048
  },
2971
3049
  remove(name) {
2972
3050
  this.write(name, "", Date.now() - 864e5, "/");
@@ -4177,6 +4255,75 @@ var TagadaTrackerBundle = (() => {
4177
4255
  mergeConfig: mergeConfig2
4178
4256
  } = axios_default;
4179
4257
 
4258
+ // src/v2/core/errors.ts
4259
+ var TagadaErrorCode = {
4260
+ NETWORK_ERROR: "network_error",
4261
+ API_ERROR: "api_error",
4262
+ AUTH_REQUIRED: "auth_required",
4263
+ TOKEN_EXPIRED: "token_expired",
4264
+ NOT_FOUND: "not_found",
4265
+ VALIDATION_ERROR: "validation_error",
4266
+ CIRCUIT_BREAKER: "circuit_breaker",
4267
+ PAYMENT_FAILED: "payment_failed",
4268
+ CARD_DECLINED: "card_declined",
4269
+ SESSION_EXPIRED: "session_expired",
4270
+ RATE_LIMITED: "rate_limited",
4271
+ TIMEOUT: "timeout",
4272
+ UNKNOWN: "unknown"
4273
+ };
4274
+ var TagadaError = class extends Error {
4275
+ constructor(message, options) {
4276
+ var _a;
4277
+ super(message);
4278
+ this.name = "TagadaError";
4279
+ this.code = options.code;
4280
+ this.statusCode = options.statusCode;
4281
+ this.retryable = (_a = options.retryable) != null ? _a : false;
4282
+ this.details = options.details;
4283
+ Object.setPrototypeOf(this, new.target.prototype);
4284
+ }
4285
+ };
4286
+ var TagadaApiError = class extends TagadaError {
4287
+ constructor(message, statusCode, options) {
4288
+ var _a, _b;
4289
+ super(message, {
4290
+ code: (_a = options == null ? void 0 : options.code) != null ? _a : TagadaErrorCode.API_ERROR,
4291
+ statusCode,
4292
+ retryable: (_b = options == null ? void 0 : options.retryable) != null ? _b : statusCode >= 500,
4293
+ details: options == null ? void 0 : options.details
4294
+ });
4295
+ this.name = "TagadaApiError";
4296
+ }
4297
+ };
4298
+ var TagadaNetworkError = class extends TagadaError {
4299
+ constructor(message = "Network request failed") {
4300
+ super(message, {
4301
+ code: TagadaErrorCode.NETWORK_ERROR,
4302
+ retryable: true
4303
+ });
4304
+ this.name = "TagadaNetworkError";
4305
+ }
4306
+ };
4307
+ var TagadaAuthError = class extends TagadaError {
4308
+ constructor(message = "Authentication required", statusCode = 401) {
4309
+ super(message, {
4310
+ code: TagadaErrorCode.AUTH_REQUIRED,
4311
+ statusCode,
4312
+ retryable: false
4313
+ });
4314
+ this.name = "TagadaAuthError";
4315
+ }
4316
+ };
4317
+ var TagadaCircuitBreakerError = class extends TagadaError {
4318
+ constructor(message) {
4319
+ super(message, {
4320
+ code: TagadaErrorCode.CIRCUIT_BREAKER,
4321
+ retryable: false
4322
+ });
4323
+ this.name = "TagadaCircuitBreakerError";
4324
+ }
4325
+ };
4326
+
4180
4327
  // src/v2/core/resources/apiClient.ts
4181
4328
  var ApiClient = class {
4182
4329
  // Max 30 requests per endpoint in window
@@ -4234,12 +4381,18 @@ var TagadaTrackerBundle = (() => {
4234
4381
  }
4235
4382
  );
4236
4383
  this.axios.interceptors.response.use(
4237
- (response) => {
4238
- return response;
4239
- },
4384
+ (response) => response,
4240
4385
  (error) => {
4241
4386
  console.error("[SDK] Response error:", error.message);
4242
- return Promise.reject(error instanceof Error ? error : new Error(String(error)));
4387
+ if (error instanceof TagadaError) {
4388
+ return Promise.reject(error);
4389
+ }
4390
+ if (axios_default.isAxiosError(error)) {
4391
+ return Promise.reject(this.toTagadaError(error));
4392
+ }
4393
+ return Promise.reject(
4394
+ error instanceof Error ? error : new Error(String(error))
4395
+ );
4243
4396
  }
4244
4397
  );
4245
4398
  }
@@ -4316,9 +4469,9 @@ var TagadaTrackerBundle = (() => {
4316
4469
  }
4317
4470
  history.count++;
4318
4471
  if (history.count > this.MAX_REQUESTS) {
4319
- const error = new Error("Circuit Breaker: Too many requests to ".concat(key, " (").concat(history.count, " in ").concat(this.WINDOW_MS, "ms)"));
4320
- error.isCircuitBreaker = true;
4321
- throw error;
4472
+ throw new TagadaCircuitBreakerError(
4473
+ "Circuit Breaker: Too many requests to ".concat(key, " (").concat(history.count, " in ").concat(this.WINDOW_MS, "ms)")
4474
+ );
4322
4475
  }
4323
4476
  }
4324
4477
  cleanupHistory() {
@@ -4329,3264 +4482,163 @@ var TagadaTrackerBundle = (() => {
4329
4482
  }
4330
4483
  }
4331
4484
  }
4332
- };
4333
-
4334
- // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/main/ua-parser.mjs
4335
- var LIBVERSION = "2.0.6";
4336
- var UA_MAX_LENGTH = 500;
4337
- var USER_AGENT = "user-agent";
4338
- var EMPTY = "";
4339
- var UNKNOWN = "?";
4340
- var TYPEOF = {
4341
- FUNCTION: "function",
4342
- OBJECT: "object",
4343
- STRING: "string",
4344
- UNDEFINED: "undefined"
4345
- };
4346
- var BROWSER = "browser";
4347
- var CPU = "cpu";
4348
- var DEVICE = "device";
4349
- var ENGINE = "engine";
4350
- var OS = "os";
4351
- var RESULT = "result";
4352
- var NAME = "name";
4353
- var TYPE = "type";
4354
- var VENDOR = "vendor";
4355
- var VERSION3 = "version";
4356
- var ARCHITECTURE = "architecture";
4357
- var MAJOR = "major";
4358
- var MODEL = "model";
4359
- var CONSOLE = "console";
4360
- var MOBILE = "mobile";
4361
- var TABLET = "tablet";
4362
- var SMARTTV = "smarttv";
4363
- var WEARABLE = "wearable";
4364
- var XR = "xr";
4365
- var EMBEDDED = "embedded";
4366
- var INAPP = "inapp";
4367
- var BRANDS = "brands";
4368
- var FORMFACTORS = "formFactors";
4369
- var FULLVERLIST = "fullVersionList";
4370
- var PLATFORM = "platform";
4371
- var PLATFORMVER = "platformVersion";
4372
- var BITNESS = "bitness";
4373
- var CH = "sec-ch-ua";
4374
- var CH_FULL_VER_LIST = CH + "-full-version-list";
4375
- var CH_ARCH = CH + "-arch";
4376
- var CH_BITNESS = CH + "-" + BITNESS;
4377
- var CH_FORM_FACTORS = CH + "-form-factors";
4378
- var CH_MOBILE = CH + "-" + MOBILE;
4379
- var CH_MODEL = CH + "-" + MODEL;
4380
- var CH_PLATFORM = CH + "-" + PLATFORM;
4381
- var CH_PLATFORM_VER = CH_PLATFORM + "-version";
4382
- var CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS];
4383
- var AMAZON = "Amazon";
4384
- var APPLE = "Apple";
4385
- var ASUS = "ASUS";
4386
- var BLACKBERRY = "BlackBerry";
4387
- var GOOGLE = "Google";
4388
- var HUAWEI = "Huawei";
4389
- var LENOVO = "Lenovo";
4390
- var HONOR = "Honor";
4391
- var LG = "LG";
4392
- var MICROSOFT = "Microsoft";
4393
- var MOTOROLA = "Motorola";
4394
- var NVIDIA = "Nvidia";
4395
- var ONEPLUS = "OnePlus";
4396
- var OPPO = "OPPO";
4397
- var SAMSUNG = "Samsung";
4398
- var SHARP = "Sharp";
4399
- var SONY = "Sony";
4400
- var XIAOMI = "Xiaomi";
4401
- var ZEBRA = "Zebra";
4402
- var CHROME = "Chrome";
4403
- var CHROMIUM = "Chromium";
4404
- var CHROMECAST = "Chromecast";
4405
- var EDGE = "Edge";
4406
- var FIREFOX = "Firefox";
4407
- var OPERA = "Opera";
4408
- var FACEBOOK = "Facebook";
4409
- var SOGOU = "Sogou";
4410
- var PREFIX_MOBILE = "Mobile ";
4411
- var SUFFIX_BROWSER = " Browser";
4412
- var WINDOWS = "Windows";
4413
- var isWindow = typeof window !== TYPEOF.UNDEFINED;
4414
- var NAVIGATOR = isWindow && window.navigator ? window.navigator : void 0;
4415
- var NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
4416
- var extend2 = function(defaultRgx, extensions) {
4417
- var mergedRgx = {};
4418
- var extraRgx = extensions;
4419
- if (!isExtensions(extensions)) {
4420
- extraRgx = {};
4421
- for (var i in extensions) {
4422
- for (var j in extensions[i]) {
4423
- extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
4424
- }
4425
- }
4426
- }
4427
- for (var k in defaultRgx) {
4428
- mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
4429
- }
4430
- return mergedRgx;
4431
- };
4432
- var enumerize = function(arr) {
4433
- var enums = {};
4434
- for (var i = 0; i < arr.length; i++) {
4435
- enums[arr[i].toUpperCase()] = arr[i];
4436
- }
4437
- return enums;
4438
- };
4439
- var has = function(str1, str2) {
4440
- if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
4441
- for (var i in str1) {
4442
- if (lowerize(str2) == lowerize(str1[i])) return true;
4443
- }
4444
- return false;
4445
- }
4446
- return isString2(str1) ? lowerize(str2) == lowerize(str1) : false;
4447
- };
4448
- var isExtensions = function(obj, deep) {
4449
- for (var prop in obj) {
4450
- return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
4451
- }
4452
- };
4453
- var isString2 = function(val) {
4454
- return typeof val === TYPEOF.STRING;
4455
- };
4456
- var itemListToArray = function(header) {
4457
- if (!header) return void 0;
4458
- var arr = [];
4459
- var tokens = strip(/\\?\"/g, header).split(",");
4460
- for (var i = 0; i < tokens.length; i++) {
4461
- if (tokens[i].indexOf(";") > -1) {
4462
- var token = trim2(tokens[i]).split(";v=");
4463
- arr[i] = { brand: token[0], version: token[1] };
4464
- } else {
4465
- arr[i] = trim2(tokens[i]);
4466
- }
4467
- }
4468
- return arr;
4469
- };
4470
- var lowerize = function(str) {
4471
- return isString2(str) ? str.toLowerCase() : str;
4472
- };
4473
- var majorize = function(version) {
4474
- return isString2(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
4475
- };
4476
- var setProps = function(arr) {
4477
- for (var i in arr) {
4478
- if (!arr.hasOwnProperty(i)) continue;
4479
- var propName = arr[i];
4480
- if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
4481
- this[propName[0]] = propName[1];
4482
- } else {
4483
- this[propName] = void 0;
4484
- }
4485
- }
4486
- return this;
4487
- };
4488
- var strip = function(pattern, str) {
4489
- return isString2(str) ? str.replace(pattern, EMPTY) : str;
4490
- };
4491
- var stripQuotes = function(str) {
4492
- return strip(/\\?\"/g, str);
4493
- };
4494
- var trim2 = function(str, len) {
4495
- str = strip(/^\s\s*/, String(str));
4496
- return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
4497
- };
4498
- var rgxMapper = function(ua, arrays) {
4499
- if (!ua || !arrays) return;
4500
- var i = 0, j, k, p, q, matches, match;
4501
- while (i < arrays.length && !matches) {
4502
- var regex = arrays[i], props = arrays[i + 1];
4503
- j = k = 0;
4504
- while (j < regex.length && !matches) {
4505
- if (!regex[j]) {
4506
- break;
4507
- }
4508
- matches = regex[j++].exec(ua);
4509
- if (!!matches) {
4510
- for (p = 0; p < props.length; p++) {
4511
- match = matches[++k];
4512
- q = props[p];
4513
- if (typeof q === TYPEOF.OBJECT && q.length > 0) {
4514
- if (q.length === 2) {
4515
- if (typeof q[1] == TYPEOF.FUNCTION) {
4516
- this[q[0]] = q[1].call(this, match);
4517
- } else {
4518
- this[q[0]] = q[1];
4519
- }
4520
- } else if (q.length >= 3) {
4521
- if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
4522
- if (q.length > 3) {
4523
- this[q[0]] = match ? q[1].apply(this, q.slice(2)) : void 0;
4524
- } else {
4525
- this[q[0]] = match ? q[1].call(this, match, q[2]) : void 0;
4526
- }
4527
- } else {
4528
- if (q.length == 3) {
4529
- this[q[0]] = match ? match.replace(q[1], q[2]) : void 0;
4530
- } else if (q.length == 4) {
4531
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : void 0;
4532
- } else if (q.length > 4) {
4533
- this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : void 0;
4534
- }
4535
- }
4536
- }
4537
- } else {
4538
- this[q] = match ? match : void 0;
4539
- }
4540
- }
4541
- }
4542
- }
4543
- i += 2;
4544
- }
4545
- };
4546
- var strMapper = function(str, map) {
4547
- for (var i in map) {
4548
- if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
4549
- for (var j = 0; j < map[i].length; j++) {
4550
- if (has(map[i][j], str)) {
4551
- return i === UNKNOWN ? void 0 : i;
4552
- }
4553
- }
4554
- } else if (has(map[i], str)) {
4555
- return i === UNKNOWN ? void 0 : i;
4556
- }
4557
- }
4558
- return map.hasOwnProperty("*") ? map["*"] : str;
4559
- };
4560
- var windowsVersionMap = {
4561
- "ME": "4.90",
4562
- "NT 3.51": "3.51",
4563
- "NT 4.0": "4.0",
4564
- "2000": ["5.0", "5.01"],
4565
- "XP": ["5.1", "5.2"],
4566
- "Vista": "6.0",
4567
- "7": "6.1",
4568
- "8": "6.2",
4569
- "8.1": "6.3",
4570
- "10": ["6.4", "10.0"],
4571
- "NT": ""
4572
- };
4573
- var formFactorsMap = {
4574
- "embedded": "Automotive",
4575
- "mobile": "Mobile",
4576
- "tablet": ["Tablet", "EInk"],
4577
- "smarttv": "TV",
4578
- "wearable": "Watch",
4579
- "xr": ["VR", "XR"],
4580
- "?": ["Desktop", "Unknown"],
4581
- "*": void 0
4582
- };
4583
- var browserHintsMap = {
4584
- "Chrome": "Google Chrome",
4585
- "Edge": "Microsoft Edge",
4586
- "Edge WebView2": "Microsoft Edge WebView2",
4587
- "Chrome WebView": "Android WebView",
4588
- "Chrome Headless": "HeadlessChrome",
4589
- "Huawei Browser": "HuaweiBrowser",
4590
- "MIUI Browser": "Miui Browser",
4591
- "Opera Mobi": "OperaMobile",
4592
- "Yandex": "YaBrowser"
4593
- };
4594
- var defaultRegexes = {
4595
- browser: [
4596
- [
4597
- // Most common regardless engine
4598
- /\b(?:crmo|crios)\/([\w\.]+)/i
4599
- // Chrome for Android/iOS
4600
- ],
4601
- [VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
4602
- [
4603
- /webview.+edge\/([\w\.]+)/i
4604
- // Microsoft Edge
4605
- ],
4606
- [VERSION3, [NAME, EDGE + " WebView"]],
4607
- [
4608
- /edg(?:e|ios|a)?\/([\w\.]+)/i
4609
- ],
4610
- [VERSION3, [NAME, "Edge"]],
4611
- [
4612
- // Presto based
4613
- /(opera mini)\/([-\w\.]+)/i,
4614
- // Opera Mini
4615
- /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
4616
- // Opera Mobi/Tablet
4617
- /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
4618
- // Opera
4619
- ],
4620
- [NAME, VERSION3],
4621
- [
4622
- /opios[\/ ]+([\w\.]+)/i
4623
- // Opera mini on iphone >= 8.0
4624
- ],
4625
- [VERSION3, [NAME, OPERA + " Mini"]],
4626
- [
4627
- /\bop(?:rg)?x\/([\w\.]+)/i
4628
- // Opera GX
4629
- ],
4630
- [VERSION3, [NAME, OPERA + " GX"]],
4631
- [
4632
- /\bopr\/([\w\.]+)/i
4633
- // Opera Webkit
4634
- ],
4635
- [VERSION3, [NAME, OPERA]],
4636
- [
4637
- // Mixed
4638
- /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
4639
- // Baidu
4640
- ],
4641
- [VERSION3, [NAME, "Baidu"]],
4642
- [
4643
- /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i
4644
- // Maxthon
4645
- ],
4646
- [VERSION3, [NAME, "Maxthon"]],
4647
- [
4648
- /(kindle)\/([\w\.]+)/i,
4649
- // Kindle
4650
- /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
4651
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
4652
- // Trident based
4653
- /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
4654
- // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
4655
- /(?:ms|\()(ie) ([\w\.]+)/i,
4656
- // Internet Explorer
4657
- // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
4658
- /(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,
4659
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
4660
- /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
4661
- // HeyTap/Ovi/115/Surf
4662
- /(qwant)(?:ios|mobile)\/([\d\.]+)/i,
4663
- // Qwant
4664
- /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
4665
- // Ecosia/Weibo
4666
- ],
4667
- [NAME, VERSION3],
4668
- [
4669
- /quark(?:pc)?\/([-\w\.]+)/i
4670
- // Quark
4671
- ],
4672
- [VERSION3, [NAME, "Quark"]],
4673
- [
4674
- /\bddg\/([\w\.]+)/i
4675
- // DuckDuckGo
4676
- ],
4677
- [VERSION3, [NAME, "DuckDuckGo"]],
4678
- [
4679
- /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
4680
- // UCBrowser
4681
- ],
4682
- [VERSION3, [NAME, "UCBrowser"]],
4683
- [
4684
- /microm.+\bqbcore\/([\w\.]+)/i,
4685
- // WeChat Desktop for Windows Built-in Browser
4686
- /\bqbcore\/([\w\.]+).+microm/i,
4687
- /micromessenger\/([\w\.]+)/i
4688
- // WeChat
4689
- ],
4690
- [VERSION3, [NAME, "WeChat"]],
4691
- [
4692
- /konqueror\/([\w\.]+)/i
4693
- // Konqueror
4694
- ],
4695
- [VERSION3, [NAME, "Konqueror"]],
4696
- [
4697
- /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
4698
- // IE11
4699
- ],
4700
- [VERSION3, [NAME, "IE"]],
4701
- [
4702
- /ya(?:search)?browser\/([\w\.]+)/i
4703
- // Yandex
4704
- ],
4705
- [VERSION3, [NAME, "Yandex"]],
4706
- [
4707
- /slbrowser\/([\w\.]+)/i
4708
- // Smart Lenovo Browser
4709
- ],
4710
- [VERSION3, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
4711
- [
4712
- /(avast|avg)\/([\w\.]+)/i
4713
- // Avast/AVG Secure Browser
4714
- ],
4715
- [[NAME, /(.+)/, "$1 Secure" + SUFFIX_BROWSER], VERSION3],
4716
- [
4717
- /\bfocus\/([\w\.]+)/i
4718
- // Firefox Focus
4719
- ],
4720
- [VERSION3, [NAME, FIREFOX + " Focus"]],
4721
- [
4722
- /\bopt\/([\w\.]+)/i
4723
- // Opera Touch
4724
- ],
4725
- [VERSION3, [NAME, OPERA + " Touch"]],
4726
- [
4727
- /coc_coc\w+\/([\w\.]+)/i
4728
- // Coc Coc Browser
4729
- ],
4730
- [VERSION3, [NAME, "Coc Coc"]],
4731
- [
4732
- /dolfin\/([\w\.]+)/i
4733
- // Dolphin
4734
- ],
4735
- [VERSION3, [NAME, "Dolphin"]],
4736
- [
4737
- /coast\/([\w\.]+)/i
4738
- // Opera Coast
4739
- ],
4740
- [VERSION3, [NAME, OPERA + " Coast"]],
4741
- [
4742
- /miuibrowser\/([\w\.]+)/i
4743
- // MIUI Browser
4744
- ],
4745
- [VERSION3, [NAME, "MIUI" + SUFFIX_BROWSER]],
4746
- [
4747
- /fxios\/([\w\.-]+)/i
4748
- // Firefox for iOS
4749
- ],
4750
- [VERSION3, [NAME, PREFIX_MOBILE + FIREFOX]],
4751
- [
4752
- /\bqihoobrowser\/?([\w\.]*)/i
4753
- // 360
4754
- ],
4755
- [VERSION3, [NAME, "360"]],
4756
- [
4757
- /\b(qq)\/([\w\.]+)/i
4758
- // QQ
4759
- ],
4760
- [[NAME, /(.+)/, "$1Browser"], VERSION3],
4761
- [
4762
- /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
4763
- ],
4764
- [[NAME, /(.+)/, "$1" + SUFFIX_BROWSER], VERSION3],
4765
- [
4766
- // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
4767
- /samsungbrowser\/([\w\.]+)/i
4768
- // Samsung Internet
4769
- ],
4770
- [VERSION3, [NAME, SAMSUNG + " Internet"]],
4771
- [
4772
- /metasr[\/ ]?([\d\.]+)/i
4773
- // Sogou Explorer
4774
- ],
4775
- [VERSION3, [NAME, SOGOU + " Explorer"]],
4776
- [
4777
- /(sogou)mo\w+\/([\d\.]+)/i
4778
- // Sogou Mobile
4779
- ],
4780
- [[NAME, SOGOU + " Mobile"], VERSION3],
4781
- [
4782
- /(electron)\/([\w\.]+) safari/i,
4783
- // Electron-based App
4784
- /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
4785
- // Tesla
4786
- /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
4787
- // QQ/2345
4788
- ],
4789
- [NAME, VERSION3],
4790
- [
4791
- /(lbbrowser|rekonq)/i
4792
- // LieBao Browser/Rekonq
4793
- ],
4794
- [NAME],
4795
- [
4796
- /ome\/([\w\.]+) \w* ?(iron) saf/i,
4797
- // Iron
4798
- /ome\/([\w\.]+).+qihu (360)[es]e/i
4799
- // 360
4800
- ],
4801
- [VERSION3, NAME],
4802
- [
4803
- // WebView
4804
- /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
4805
- // Facebook App for iOS & Android
4806
- ],
4807
- [[NAME, FACEBOOK], VERSION3, [TYPE, INAPP]],
4808
- [
4809
- /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
4810
- // Kakao App
4811
- /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
4812
- // Naver InApp
4813
- /(daum)apps[\/ ]([\w\.]+)/i,
4814
- // Daum App
4815
- /safari (line)\/([\w\.]+)/i,
4816
- // Line App for iOS
4817
- /\b(line)\/([\w\.]+)\/iab/i,
4818
- // Line App for Android
4819
- /(alipay)client\/([\w\.]+)/i,
4820
- // Alipay
4821
- /(twitter)(?:and| f.+e\/([\w\.]+))/i,
4822
- // Twitter
4823
- /(bing)(?:web|sapphire)\/([\w\.]+)/i,
4824
- // Bing
4825
- /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
4826
- // Instagram/Snapchat/Klarna
4827
- ],
4828
- [NAME, VERSION3, [TYPE, INAPP]],
4829
- [
4830
- /\bgsa\/([\w\.]+) .*safari\//i
4831
- // Google Search Appliance on iOS
4832
- ],
4833
- [VERSION3, [NAME, "GSA"], [TYPE, INAPP]],
4834
- [
4835
- /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
4836
- // TikTok
4837
- ],
4838
- [VERSION3, [NAME, "TikTok"], [TYPE, INAPP]],
4839
- [
4840
- /\[(linkedin)app\]/i
4841
- // LinkedIn App for iOS & Android
4842
- ],
4843
- [NAME, [TYPE, INAPP]],
4844
- [
4845
- /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i
4846
- // Zalo
4847
- ],
4848
- [[NAME, /(.+)/, "Zalo"], VERSION3, [TYPE, INAPP]],
4849
- [
4850
- /(chromium)[\/ ]([-\w\.]+)/i
4851
- // Chromium
4852
- ],
4853
- [NAME, VERSION3],
4854
- [
4855
- /headlesschrome(?:\/([\w\.]+)| )/i
4856
- // Chrome Headless
4857
- ],
4858
- [VERSION3, [NAME, CHROME + " Headless"]],
4859
- [
4860
- /wv\).+chrome\/([\w\.]+).+edgw\//i
4861
- // Edge WebView2
4862
- ],
4863
- [VERSION3, [NAME, EDGE + " WebView2"]],
4864
- [
4865
- / wv\).+(chrome)\/([\w\.]+)/i
4866
- // Chrome WebView
4867
- ],
4868
- [[NAME, CHROME + " WebView"], VERSION3],
4869
- [
4870
- /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
4871
- // Android Browser
4872
- ],
4873
- [VERSION3, [NAME, "Android" + SUFFIX_BROWSER]],
4874
- [
4875
- /chrome\/([\w\.]+) mobile/i
4876
- // Chrome Mobile
4877
- ],
4878
- [VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
4879
- [
4880
- /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
4881
- // Chrome/OmniWeb/Arora/Tizen/Nokia
4882
- ],
4883
- [NAME, VERSION3],
4884
- [
4885
- /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i
4886
- // Safari Mobile
4887
- ],
4888
- [VERSION3, [NAME, PREFIX_MOBILE + "Safari"]],
4889
- [
4890
- /iphone .*mobile(?:\/\w+ | ?)safari/i
4891
- ],
4892
- [[NAME, PREFIX_MOBILE + "Safari"]],
4893
- [
4894
- /version\/([\w\.\,]+) .*(safari)/i
4895
- // Safari
4896
- ],
4897
- [VERSION3, NAME],
4898
- [
4899
- /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
4900
- // Safari < 3.0
4901
- ],
4902
- [NAME, [VERSION3, "1"]],
4903
- [
4904
- /(webkit|khtml)\/([\w\.]+)/i
4905
- ],
4906
- [NAME, VERSION3],
4907
- [
4908
- // Gecko based
4909
- /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i
4910
- // Firefox Mobile
4911
- ],
4912
- [[NAME, PREFIX_MOBILE + FIREFOX], VERSION3],
4913
- [
4914
- /(navigator|netscape\d?)\/([-\w\.]+)/i
4915
- // Netscape
4916
- ],
4917
- [[NAME, "Netscape"], VERSION3],
4918
- [
4919
- /(wolvic|librewolf)\/([\w\.]+)/i
4920
- // Wolvic/LibreWolf
4921
- ],
4922
- [NAME, VERSION3],
4923
- [
4924
- /mobile vr; rv:([\w\.]+)\).+firefox/i
4925
- // Firefox Reality
4926
- ],
4927
- [VERSION3, [NAME, FIREFOX + " Reality"]],
4928
- [
4929
- /ekiohf.+(flow)\/([\w\.]+)/i,
4930
- // Flow
4931
- /(swiftfox)/i,
4932
- // Swiftfox
4933
- /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
4934
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
4935
- /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
4936
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
4937
- /(firefox)\/([\w\.]+)/i,
4938
- // Other Firefox-based
4939
- /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
4940
- // Mozilla
4941
- // Other
4942
- /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
4943
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
4944
- /\b(links) \(([\w\.]+)/i
4945
- // Links
4946
- ],
4947
- [NAME, [VERSION3, /_/g, "."]],
4948
- [
4949
- /(cobalt)\/([\w\.]+)/i
4950
- // Cobalt
4951
- ],
4952
- [NAME, [VERSION3, /[^\d\.]+./, EMPTY]]
4953
- ],
4954
- cpu: [
4955
- [
4956
- /\b((amd|x|x86[-_]?|wow|win)64)\b/i
4957
- // AMD64 (x64)
4958
- ],
4959
- [[ARCHITECTURE, "amd64"]],
4960
- [
4961
- /(ia32(?=;))/i,
4962
- // IA32 (quicktime)
4963
- /\b((i[346]|x)86)(pc)?\b/i
4964
- // IA32 (x86)
4965
- ],
4966
- [[ARCHITECTURE, "ia32"]],
4967
- [
4968
- /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i
4969
- // ARM64
4970
- ],
4971
- [[ARCHITECTURE, "arm64"]],
4972
- [
4973
- /\b(arm(v[67])?ht?n?[fl]p?)\b/i
4974
- // ARMHF
4975
- ],
4976
- [[ARCHITECTURE, "armhf"]],
4977
- [
4978
- // PocketPC mistakenly identified as PowerPC
4979
- /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
4980
- ],
4981
- [[ARCHITECTURE, "arm"]],
4982
- [
4983
- / sun4\w[;\)]/i
4984
- // SPARC
4985
- ],
4986
- [[ARCHITECTURE, "sparc"]],
4987
- [
4988
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
4989
- /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
4990
- /((ppc|powerpc)(64)?)( mac|;|\))/i,
4991
- // PowerPC
4992
- /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
4993
- // Alpha
4994
- ],
4995
- [[ARCHITECTURE, /ower/, EMPTY, lowerize]],
4996
- [
4997
- /mc680.0/i
4998
- ],
4999
- [[ARCHITECTURE, "68k"]],
5000
- [
5001
- /winnt.+\[axp/i
5002
- ],
5003
- [[ARCHITECTURE, "alpha"]]
5004
- ],
5005
- device: [
5006
- [
5007
- //////////////////////////
5008
- // MOBILES & TABLETS
5009
- /////////////////////////
5010
- // Samsung
5011
- /\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
5012
- ],
5013
- [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]],
5014
- [
5015
- /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
5016
- /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
5017
- /sec-(sgh\w+)/i
5018
- ],
5019
- [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]],
5020
- [
5021
- // Apple
5022
- /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i
5023
- // iPod/iPhone
5024
- ],
5025
- [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]],
5026
- [
5027
- /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,
5028
- // iPad
5029
- /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
5030
- ],
5031
- [MODEL, [VENDOR, APPLE], [TYPE, TABLET]],
5032
- [
5033
- /(macintosh);/i
5034
- ],
5035
- [MODEL, [VENDOR, APPLE]],
5036
- [
5037
- // Sharp
5038
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
5039
- ],
5040
- [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]],
5041
- [
5042
- // Honor
5043
- /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
5044
- ],
5045
- [MODEL, [VENDOR, HONOR], [TYPE, TABLET]],
5046
- [
5047
- /honor([-\w ]+)[;\)]/i
5048
- ],
5049
- [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]],
5050
- [
5051
- // Huawei
5052
- /\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
5053
- ],
5054
- [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]],
5055
- [
5056
- /(?:huawei) ?([-\w ]+)[;\)]/i,
5057
- /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
5058
- ],
5059
- [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]],
5060
- [
5061
- // Xiaomi
5062
- /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
5063
- /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i
5064
- // Mi Pad tablets
5065
- ],
5066
- [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, TABLET]],
5067
- [
5068
- /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,
5069
- // Xiaomi POCO
5070
- /\b; (\w+) build\/hm\1/i,
5071
- // Xiaomi Hongmi 'numeric' models
5072
- /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
5073
- // Xiaomi Hongmi
5074
- /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
5075
- // Xiaomi Redmi
5076
- /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,
5077
- // Xiaomi Redmi 'numeric' models
5078
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
5079
- // Xiaomi Mi
5080
- / ([\w ]+) miui\/v?\d/i
5081
- ],
5082
- [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, MOBILE]],
5083
- [
5084
- // OnePlus
5085
- /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,
5086
- /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
5087
- ],
5088
- [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]],
5089
- [
5090
- // OPPO
5091
- /; (\w+) bui.+ oppo/i,
5092
- /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
5093
- ],
5094
- [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]],
5095
- [
5096
- /\b(opd2(\d{3}a?))(?: bui|\))/i
5097
- ],
5098
- [MODEL, [VENDOR, strMapper, { "OnePlus": ["203", "304", "403", "404", "413", "415"], "*": OPPO }], [TYPE, TABLET]],
5099
- [
5100
- // BLU
5101
- /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i
5102
- // Vivo series
5103
- ],
5104
- [MODEL, [VENDOR, "BLU"], [TYPE, MOBILE]],
5105
- [
5106
- // Vivo
5107
- /; vivo (\w+)(?: bui|\))/i,
5108
- /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
5109
- ],
5110
- [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]],
5111
- [
5112
- // Realme
5113
- /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
5114
- ],
5115
- [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]],
5116
- [
5117
- // Lenovo
5118
- /(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,
5119
- /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
5120
- ],
5121
- [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]],
5122
- [
5123
- /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
5124
- ],
5125
- [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]],
5126
- [
5127
- // Motorola
5128
- /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
5129
- /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
5130
- /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
5131
- ],
5132
- [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]],
5133
- [
5134
- /\b(mz60\d|xoom[2 ]{0,2}) build\//i
5135
- ],
5136
- [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]],
5137
- [
5138
- // LG
5139
- /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
5140
- ],
5141
- [MODEL, [VENDOR, LG], [TYPE, TABLET]],
5142
- [
5143
- /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
5144
- /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
5145
- /\blg-?([\d\w]+) bui/i
5146
- ],
5147
- [MODEL, [VENDOR, LG], [TYPE, MOBILE]],
5148
- [
5149
- // Nokia
5150
- /(nokia) (t[12][01])/i
5151
- ],
5152
- [VENDOR, MODEL, [TYPE, TABLET]],
5153
- [
5154
- /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
5155
- /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
5156
- ],
5157
- [[MODEL, /_/g, " "], [TYPE, MOBILE], [VENDOR, "Nokia"]],
5158
- [
5159
- // Google
5160
- /(pixel (c|tablet))\b/i
5161
- // Google Pixel C/Tablet
5162
- ],
5163
- [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]],
5164
- [
5165
- // Google Pixel
5166
- /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
5167
- ],
5168
- [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]],
5169
- [
5170
- /(google) (pixelbook( go)?)/i
5171
- ],
5172
- [VENDOR, MODEL],
5173
- [
5174
- // Sony
5175
- /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
5176
- ],
5177
- [MODEL, [VENDOR, SONY], [TYPE, MOBILE]],
5178
- [
5179
- /sony tablet [ps]/i,
5180
- /\b(?:sony)?sgp\w+(?: bui|\))/i
5181
- ],
5182
- [[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET]],
5183
- [
5184
- // Amazon
5185
- /(alexa)webm/i,
5186
- /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
5187
- // Kindle Fire without Silk / Echo Show
5188
- /(kf[a-z]+)( bui|\)).+silk\//i
5189
- // Kindle Fire HD
5190
- ],
5191
- [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]],
5192
- [
5193
- /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
5194
- // Fire Phone
5195
- ],
5196
- [[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE, MOBILE]],
5197
- [
5198
- // BlackBerry
5199
- /(playbook);[-\w\),; ]+(rim)/i
5200
- // BlackBerry PlayBook
5201
- ],
5202
- [MODEL, VENDOR, [TYPE, TABLET]],
5203
- [
5204
- /\b((?:bb[a-f]|st[hv])100-\d)/i,
5205
- /(?:blackberry|\(bb10;) (\w+)/i
5206
- ],
5207
- [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]],
5208
- [
5209
- // Asus
5210
- /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
5211
- ],
5212
- [MODEL, [VENDOR, ASUS], [TYPE, TABLET]],
5213
- [
5214
- / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
5215
- ],
5216
- [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]],
5217
- [
5218
- // HTC
5219
- /(nexus 9)/i
5220
- // HTC Nexus 9
5221
- ],
5222
- [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]],
5223
- [
5224
- /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
5225
- // HTC
5226
- // ZTE
5227
- /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
5228
- /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
5229
- // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
5230
- ],
5231
- [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]],
5232
- [
5233
- // TCL
5234
- /tcl (xess p17aa)/i,
5235
- /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
5236
- ],
5237
- [MODEL, [VENDOR, "TCL"], [TYPE, TABLET]],
5238
- [
5239
- /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
5240
- ],
5241
- [MODEL, [VENDOR, "TCL"], [TYPE, MOBILE]],
5242
- [
5243
- // itel
5244
- /(itel) ((\w+))/i
5245
- ],
5246
- [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { "tablet": ["p10001l", "w7001"], "*": "mobile" }]],
5247
- [
5248
- // Acer
5249
- /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
5250
- ],
5251
- [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]],
5252
- [
5253
- // Meizu
5254
- /droid.+; (m[1-5] note) bui/i,
5255
- /\bmz-([-\w]{2,})/i
5256
- ],
5257
- [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]],
5258
- [
5259
- // Ulefone
5260
- /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
5261
- ],
5262
- [MODEL, [VENDOR, "Ulefone"], [TYPE, MOBILE]],
5263
- [
5264
- // Energizer
5265
- /; (energy ?\w+)(?: bui|\))/i,
5266
- /; energizer ([\w ]+)(?: bui|\))/i
5267
- ],
5268
- [MODEL, [VENDOR, "Energizer"], [TYPE, MOBILE]],
5269
- [
5270
- // Cat
5271
- /; cat (b35);/i,
5272
- /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
5273
- ],
5274
- [MODEL, [VENDOR, "Cat"], [TYPE, MOBILE]],
5275
- [
5276
- // Smartfren
5277
- /((?:new )?andromax[\w- ]+)(?: bui|\))/i
5278
- ],
5279
- [MODEL, [VENDOR, "Smartfren"], [TYPE, MOBILE]],
5280
- [
5281
- // Nothing
5282
- /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
5283
- ],
5284
- [MODEL, [VENDOR, "Nothing"], [TYPE, MOBILE]],
5285
- [
5286
- // Archos
5287
- /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
5288
- /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
5289
- ],
5290
- [MODEL, [VENDOR, "Archos"], [TYPE, TABLET]],
5291
- [
5292
- /archos ([\w ]+)( b|\))/i,
5293
- /; (ac[3-6]\d\w{2,8})( b|\))/i
5294
- ],
5295
- [MODEL, [VENDOR, "Archos"], [TYPE, MOBILE]],
5296
- [
5297
- // HMD
5298
- /; (n159v)/i
5299
- ],
5300
- [MODEL, [VENDOR, "HMD"], [TYPE, MOBILE]],
5301
- [
5302
- // MIXED
5303
- /(imo) (tab \w+)/i,
5304
- // IMO
5305
- /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i
5306
- // Infinix XPad / Tecno
5307
- ],
5308
- [VENDOR, MODEL, [TYPE, TABLET]],
5309
- [
5310
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
5311
- // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
5312
- // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
5313
- /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
5314
- /(hp) ([\w ]+\w)/i,
5315
- // HP iPAQ
5316
- /(microsoft); (lumia[\w ]+)/i,
5317
- // Microsoft Lumia
5318
- /(oppo) ?([\w ]+) bui/i,
5319
- // OPPO
5320
- /(hisense) ([ehv][\w ]+)\)/i,
5321
- // Hisense
5322
- /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
5323
- // Philips
5324
- ],
5325
- [VENDOR, MODEL, [TYPE, MOBILE]],
5326
- [
5327
- /(kobo)\s(ereader|touch)/i,
5328
- // Kobo
5329
- /(hp).+(touchpad(?!.+tablet)|tablet)/i,
5330
- // HP TouchPad
5331
- /(kindle)\/([\w\.]+)/i
5332
- // Kindle
5333
- ],
5334
- [VENDOR, MODEL, [TYPE, TABLET]],
5335
- [
5336
- /(surface duo)/i
5337
- // Surface Duo
5338
- ],
5339
- [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]],
5340
- [
5341
- /droid [\d\.]+; (fp\du?)(?: b|\))/i
5342
- // Fairphone
5343
- ],
5344
- [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]],
5345
- [
5346
- /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i
5347
- // Nvidia Tablets
5348
- ],
5349
- [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]],
5350
- [
5351
- /(sprint) (\w+)/i
5352
- // Sprint Phones
5353
- ],
5354
- [VENDOR, MODEL, [TYPE, MOBILE]],
5355
- [
5356
- /(kin\.[onetw]{3})/i
5357
- // Microsoft Kin
5358
- ],
5359
- [[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE, MOBILE]],
5360
- [
5361
- /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
5362
- // Zebra
5363
- ],
5364
- [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]],
5365
- [
5366
- /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
5367
- ],
5368
- [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]],
5369
- [
5370
- ///////////////////
5371
- // SMARTTVS
5372
- ///////////////////
5373
- /(philips)[\w ]+tv/i,
5374
- // Philips
5375
- /smart-tv.+(samsung)/i
5376
- // Samsung
5377
- ],
5378
- [VENDOR, [TYPE, SMARTTV]],
5379
- [
5380
- /hbbtv.+maple;(\d+)/i
5381
- ],
5382
- [[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE, SMARTTV]],
5383
- [
5384
- /(vizio)(?: |.+model\/)(\w+-\w+)/i,
5385
- // Vizio
5386
- /tcast.+(lg)e?. ([-\w]+)/i
5387
- // LG SmartTV
5388
- ],
5389
- [VENDOR, MODEL, [TYPE, SMARTTV]],
5390
- [
5391
- /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
5392
- ],
5393
- [[VENDOR, LG], [TYPE, SMARTTV]],
5394
- [
5395
- /(apple) ?tv/i
5396
- // Apple TV
5397
- ],
5398
- [VENDOR, [MODEL, APPLE + " TV"], [TYPE, SMARTTV]],
5399
- [
5400
- /crkey.*devicetype\/chromecast/i
5401
- // Google Chromecast Third Generation
5402
- ],
5403
- [[MODEL, CHROMECAST + " Third Generation"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
5404
- [
5405
- /crkey.*devicetype\/([^/]*)/i
5406
- // Google Chromecast with specific device type
5407
- ],
5408
- [[MODEL, /^/, "Chromecast "], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
5409
- [
5410
- /fuchsia.*crkey/i
5411
- // Google Chromecast Nest Hub
5412
- ],
5413
- [[MODEL, CHROMECAST + " Nest Hub"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
5414
- [
5415
- /crkey/i
5416
- // Google Chromecast, Linux-based or unknown
5417
- ],
5418
- [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
5419
- [
5420
- /(portaltv)/i
5421
- // Facebook Portal TV
5422
- ],
5423
- [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]],
5424
- [
5425
- /droid.+aft(\w+)( bui|\))/i
5426
- // Fire TV
5427
- ],
5428
- [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]],
5429
- [
5430
- /(shield \w+ tv)/i
5431
- // Nvidia Shield TV
5432
- ],
5433
- [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]],
5434
- [
5435
- /\(dtv[\);].+(aquos)/i,
5436
- /(aquos-tv[\w ]+)\)/i
5437
- // Sharp
5438
- ],
5439
- [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],
5440
- [
5441
- /(bravia[\w ]+)( bui|\))/i
5442
- // Sony
5443
- ],
5444
- [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]],
5445
- [
5446
- /(mi(tv|box)-?\w+) bui/i
5447
- // Xiaomi
5448
- ],
5449
- [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]],
5450
- [
5451
- /Hbbtv.*(technisat) (.*);/i
5452
- // TechniSAT
5453
- ],
5454
- [VENDOR, MODEL, [TYPE, SMARTTV]],
5455
- [
5456
- /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
5457
- // Roku
5458
- /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
5459
- // HbbTV devices
5460
- ],
5461
- [[VENDOR, /.+\/(\w+)/, "$1", strMapper, { "LG": "lge" }], [MODEL, trim2], [TYPE, SMARTTV]],
5462
- [
5463
- ///////////////////
5464
- // CONSOLES
5465
- ///////////////////
5466
- /(playstation \w+)/i
5467
- // Playstation
5468
- ],
5469
- [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]],
5470
- [
5471
- /\b(xbox(?: one)?(?!; xbox))[\); ]/i
5472
- // Microsoft Xbox
5473
- ],
5474
- [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]],
5475
- [
5476
- /(ouya)/i,
5477
- // Ouya
5478
- /(nintendo) (\w+)/i,
5479
- // Nintendo
5480
- /(retroid) (pocket ([^\)]+))/i
5481
- // Retroid Pocket
5482
- ],
5483
- [VENDOR, MODEL, [TYPE, CONSOLE]],
5484
- [
5485
- /droid.+; (shield)( bui|\))/i
5486
- // Nvidia Portable
5487
- ],
5488
- [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]],
5489
- [
5490
- ///////////////////
5491
- // WEARABLES
5492
- ///////////////////
5493
- /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i
5494
- // Samsung Galaxy Watch
5495
- ],
5496
- [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]],
5497
- [
5498
- /((pebble))app/i,
5499
- // Pebble
5500
- /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i
5501
- // Asus ZenWatch / LG Watch / Pixel Watch
5502
- ],
5503
- [VENDOR, MODEL, [TYPE, WEARABLE]],
5504
- [
5505
- /(ow(?:19|20)?we?[1-3]{1,3})/i
5506
- // Oppo Watch
5507
- ],
5508
- [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]],
5509
- [
5510
- /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
5511
- // Apple Watch
5512
- ],
5513
- [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]],
5514
- [
5515
- /(opwwe\d{3})/i
5516
- // OnePlus Watch
5517
- ],
5518
- [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]],
5519
- [
5520
- /(moto 360)/i
5521
- // Motorola 360
5522
- ],
5523
- [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]],
5524
- [
5525
- /(smartwatch 3)/i
5526
- // Sony SmartWatch
5527
- ],
5528
- [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]],
5529
- [
5530
- /(g watch r)/i
5531
- // LG G Watch R
5532
- ],
5533
- [MODEL, [VENDOR, LG], [TYPE, WEARABLE]],
5534
- [
5535
- /droid.+; (wt63?0{2,3})\)/i
5536
- ],
5537
- [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]],
5538
- [
5539
- ///////////////////
5540
- // XR
5541
- ///////////////////
5542
- /droid.+; (glass) \d/i
5543
- // Google Glass
5544
- ],
5545
- [MODEL, [VENDOR, GOOGLE], [TYPE, XR]],
5546
- [
5547
- /(pico) ([\w ]+) os\d/i
5548
- // Pico
5549
- ],
5550
- [VENDOR, MODEL, [TYPE, XR]],
5551
- [
5552
- /(quest( \d| pro)?s?).+vr/i
5553
- // Meta Quest
5554
- ],
5555
- [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]],
5556
- [
5557
- /mobile vr; rv.+firefox/i
5558
- // Unidentifiable VR device using Firefox Reality / Wolvic
5559
- ],
5560
- [[TYPE, XR]],
5561
- [
5562
- ///////////////////
5563
- // EMBEDDED
5564
- ///////////////////
5565
- /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
5566
- // Tesla
5567
- ],
5568
- [VENDOR, [TYPE, EMBEDDED]],
5569
- [
5570
- /(aeobc)\b/i
5571
- // Echo Dot
5572
- ],
5573
- [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]],
5574
- [
5575
- /(homepod).+mac os/i
5576
- // Apple HomePod
5577
- ],
5578
- [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]],
5579
- [
5580
- /windows iot/i
5581
- // Unidentifiable embedded device using Windows IoT
5582
- ],
5583
- [[TYPE, EMBEDDED]],
5584
- [
5585
- ////////////////////
5586
- // MIXED (GENERIC)
5587
- ///////////////////
5588
- /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i
5589
- // Unidentifiable SmartTV
5590
- ],
5591
- [MODEL, [TYPE, SMARTTV]],
5592
- [
5593
- /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
5594
- ],
5595
- [[TYPE, SMARTTV]],
5596
- [
5597
- /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
5598
- ],
5599
- [MODEL, [TYPE, strMapper, { "mobile": "Mobile", "xr": "VR", "*": TABLET }]],
5600
- [
5601
- /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
5602
- // Unidentifiable Tablet
5603
- ],
5604
- [[TYPE, TABLET]],
5605
- [
5606
- /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
5607
- // Unidentifiable Mobile
5608
- ],
5609
- [[TYPE, MOBILE]],
5610
- [
5611
- /droid .+?; ([\w\. -]+)( bui|\))/i
5612
- // Generic Android Device
5613
- ],
5614
- [MODEL, [VENDOR, "Generic"]]
5615
- ],
5616
- engine: [
5617
- [
5618
- /windows.+ edge\/([\w\.]+)/i
5619
- // EdgeHTML
5620
- ],
5621
- [VERSION3, [NAME, EDGE + "HTML"]],
5622
- [
5623
- /(arkweb)\/([\w\.]+)/i
5624
- // ArkWeb
5625
- ],
5626
- [NAME, VERSION3],
5627
- [
5628
- /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
5629
- // Blink
5630
- ],
5631
- [VERSION3, [NAME, "Blink"]],
5632
- [
5633
- /(presto)\/([\w\.]+)/i,
5634
- // Presto
5635
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
5636
- // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
5637
- /ekioh(flow)\/([\w\.]+)/i,
5638
- // Flow
5639
- /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
5640
- // KHTML/Tasman/Links
5641
- /(icab)[\/ ]([23]\.[\d\.]+)/i,
5642
- // iCab
5643
- /\b(libweb)/i
5644
- // LibWeb
5645
- ],
5646
- [NAME, VERSION3],
5647
- [
5648
- /ladybird\//i
5649
- ],
5650
- [[NAME, "LibWeb"]],
5651
- [
5652
- /rv\:([\w\.]{1,9})\b.+(gecko)/i
5653
- // Gecko
5654
- ],
5655
- [VERSION3, NAME]
5656
- ],
5657
- os: [
5658
- [
5659
- // Windows
5660
- /(windows nt) (6\.[23]); arm/i
5661
- // Windows RT
5662
- ],
5663
- [[NAME, /N/, "R"], [VERSION3, strMapper, windowsVersionMap]],
5664
- [
5665
- /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,
5666
- // Windows IoT/Mobile/Phone
5667
- // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
5668
- /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
5669
- ],
5670
- [NAME, VERSION3],
5671
- [
5672
- /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
5673
- /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
5674
- ],
5675
- [[VERSION3, /(;|\))/g, "", strMapper, windowsVersionMap], [NAME, WINDOWS]],
5676
- [
5677
- /(windows ce)\/?([\d\.]*)/i
5678
- // Windows CE
5679
- ],
5680
- [NAME, VERSION3],
5681
- [
5682
- // iOS/macOS
5683
- /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
5684
- // iOS
5685
- /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i,
5686
- /cfnetwork\/.+darwin/i
5687
- ],
5688
- [[VERSION3, /_/g, "."], [NAME, "iOS"]],
5689
- [
5690
- /(mac os x) ?([\w\. ]*)/i,
5691
- /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i
5692
- // Mac OS
5693
- ],
5694
- [[NAME, "macOS"], [VERSION3, /_/g, "."]],
5695
- [
5696
- // Google Chromecast
5697
- /android ([\d\.]+).*crkey/i
5698
- // Google Chromecast, Android-based
5699
- ],
5700
- [VERSION3, [NAME, CHROMECAST + " Android"]],
5701
- [
5702
- /fuchsia.*crkey\/([\d\.]+)/i
5703
- // Google Chromecast, Fuchsia-based
5704
- ],
5705
- [VERSION3, [NAME, CHROMECAST + " Fuchsia"]],
5706
- [
5707
- /crkey\/([\d\.]+).*devicetype\/smartspeaker/i
5708
- // Google Chromecast, Linux-based Smart Speaker
5709
- ],
5710
- [VERSION3, [NAME, CHROMECAST + " SmartSpeaker"]],
5711
- [
5712
- /linux.*crkey\/([\d\.]+)/i
5713
- // Google Chromecast, Legacy Linux-based
5714
- ],
5715
- [VERSION3, [NAME, CHROMECAST + " Linux"]],
5716
- [
5717
- /crkey\/([\d\.]+)/i
5718
- // Google Chromecast, unknown
5719
- ],
5720
- [VERSION3, [NAME, CHROMECAST]],
5721
- [
5722
- // Mobile OSes
5723
- /droid ([\w\.]+)\b.+(android[- ]x86)/i
5724
- // Android-x86
5725
- ],
5726
- [VERSION3, NAME],
5727
- [
5728
- /(ubuntu) ([\w\.]+) like android/i
5729
- // Ubuntu Touch
5730
- ],
5731
- [[NAME, /(.+)/, "$1 Touch"], VERSION3],
5732
- [
5733
- /(harmonyos)[\/ ]?([\d\.]*)/i,
5734
- // HarmonyOS
5735
- // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
5736
- /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
5737
- ],
5738
- [NAME, VERSION3],
5739
- [
5740
- /\(bb(10);/i
5741
- // BlackBerry 10
5742
- ],
5743
- [VERSION3, [NAME, BLACKBERRY]],
5744
- [
5745
- /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i
5746
- // Symbian
5747
- ],
5748
- [VERSION3, [NAME, "Symbian"]],
5749
- [
5750
- /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
5751
- // Firefox OS
5752
- ],
5753
- [VERSION3, [NAME, FIREFOX + " OS"]],
5754
- [
5755
- /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,
5756
- // WebOS
5757
- /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
5758
- ],
5759
- [VERSION3, [NAME, "webOS"]],
5760
- [
5761
- /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
5762
- // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
5763
- ],
5764
- [[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"]],
5765
- [
5766
- /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
5767
- // watchOS
5768
- ],
5769
- [VERSION3, [NAME, "watchOS"]],
5770
- [
5771
- // Google ChromeOS
5772
- /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
5773
- // Chromium OS
5774
- ],
5775
- [[NAME, "Chrome OS"], VERSION3],
5776
- [
5777
- // Smart TVs
5778
- /panasonic;(viera)/i,
5779
- // Panasonic Viera
5780
- /(netrange)mmh/i,
5781
- // Netrange
5782
- /(nettv)\/(\d+\.[\w\.]+)/i,
5783
- // NetTV
5784
- // Console
5785
- /(nintendo|playstation) (\w+)/i,
5786
- // Nintendo/Playstation
5787
- /(xbox); +xbox ([^\);]+)/i,
5788
- // Microsoft Xbox (360, One, X, S, Series X, Series S)
5789
- /(pico) .+os([\w\.]+)/i,
5790
- // Pico
5791
- // Other
5792
- /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
5793
- // Joli/Palm
5794
- /linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
5795
- // Mint
5796
- /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
5797
- // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
5798
- /([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,
5799
- // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
5800
- /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
5801
- // Solaris
5802
- /\b(aix)[; ]([1-9\.]{0,4})/i,
5803
- // AIX
5804
- /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
5805
- // Hurd/Linux/MorphOS
5806
- /(gnu) ?([\w\.]*)/i,
5807
- // GNU
5808
- /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
5809
- // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
5810
- /(haiku) ?(r\d)?/i
5811
- // Haiku
5812
- ],
5813
- [NAME, VERSION3],
5814
- [
5815
- /(sunos) ?([\d\.]*)/i
5816
- // Solaris
5817
- ],
5818
- [[NAME, "Solaris"], VERSION3],
5819
- [
5820
- /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,
5821
- // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
5822
- /(unix) ?([\w\.]*)/i
5823
- // UNIX
5824
- ],
5825
- [NAME, VERSION3]
5826
- ]
5827
- };
5828
- var defaultProps = function() {
5829
- var props = { init: {}, isIgnore: {}, isIgnoreRgx: {}, toString: {} };
5830
- setProps.call(props.init, [
5831
- [BROWSER, [NAME, VERSION3, MAJOR, TYPE]],
5832
- [CPU, [ARCHITECTURE]],
5833
- [DEVICE, [TYPE, MODEL, VENDOR]],
5834
- [ENGINE, [NAME, VERSION3]],
5835
- [OS, [NAME, VERSION3]]
5836
- ]);
5837
- setProps.call(props.isIgnore, [
5838
- [BROWSER, [VERSION3, MAJOR]],
5839
- [ENGINE, [VERSION3]],
5840
- [OS, [VERSION3]]
5841
- ]);
5842
- setProps.call(props.isIgnoreRgx, [
5843
- [BROWSER, / ?browser$/i],
5844
- [OS, / ?os$/i]
5845
- ]);
5846
- setProps.call(props.toString, [
5847
- [BROWSER, [NAME, VERSION3]],
5848
- [CPU, [ARCHITECTURE]],
5849
- [DEVICE, [VENDOR, MODEL]],
5850
- [ENGINE, [NAME, VERSION3]],
5851
- [OS, [NAME, VERSION3]]
5852
- ]);
5853
- return props;
5854
- }();
5855
- var createIData = function(item, itemType) {
5856
- var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
5857
- function IData() {
5858
- setProps.call(this, init_props);
5859
- }
5860
- IData.prototype.getItem = function() {
5861
- return item;
5862
- };
5863
- IData.prototype.withClientHints = function() {
5864
- if (!NAVIGATOR_UADATA) {
5865
- return item.parseCH().get();
5866
- }
5867
- return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
5868
- return item.setCH(new UACHData(res, false)).parseCH().get();
5869
- });
5870
- };
5871
- IData.prototype.withFeatureCheck = function() {
5872
- return item.detectFeature().get();
5873
- };
5874
- if (itemType != RESULT) {
5875
- IData.prototype.is = function(strToCheck) {
5876
- var is = false;
5877
- for (var i in this) {
5878
- 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)) {
5879
- is = true;
5880
- if (strToCheck != TYPEOF.UNDEFINED) break;
5881
- } else if (strToCheck == TYPEOF.UNDEFINED && is) {
5882
- is = !is;
5883
- break;
5884
- }
5885
- }
5886
- return is;
5887
- };
5888
- IData.prototype.toString = function() {
5889
- var str = EMPTY;
5890
- for (var i in toString_props) {
5891
- if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) {
5892
- str += (str ? " " : EMPTY) + this[toString_props[i]];
5893
- }
5894
- }
5895
- return str || TYPEOF.UNDEFINED;
5896
- };
5897
- }
5898
- if (!NAVIGATOR_UADATA) {
5899
- IData.prototype.then = function(cb) {
5900
- var that = this;
5901
- var IDataResolve = function() {
5902
- for (var prop in that) {
5903
- if (that.hasOwnProperty(prop)) {
5904
- this[prop] = that[prop];
5905
- }
5906
- }
5907
- };
5908
- IDataResolve.prototype = {
5909
- is: IData.prototype.is,
5910
- toString: IData.prototype.toString
5911
- };
5912
- var resolveData = new IDataResolve();
5913
- cb(resolveData);
5914
- return resolveData;
5915
- };
5916
- }
5917
- return new IData();
5918
- };
5919
- function UACHData(uach, isHttpUACH) {
5920
- uach = uach || {};
5921
- setProps.call(this, CH_ALL_VALUES);
5922
- if (isHttpUACH) {
5923
- setProps.call(this, [
5924
- [BRANDS, itemListToArray(uach[CH])],
5925
- [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
5926
- [MOBILE, /\?1/.test(uach[CH_MOBILE])],
5927
- [MODEL, stripQuotes(uach[CH_MODEL])],
5928
- [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
5929
- [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
5930
- [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
5931
- [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
5932
- [BITNESS, stripQuotes(uach[CH_BITNESS])]
5933
- ]);
5934
- } else {
5935
- for (var prop in uach) {
5936
- if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
5937
- }
5938
- }
5939
- }
5940
- function UAItem(itemType, ua, rgxMap, uaCH) {
5941
- this.get = function(prop) {
5942
- if (!prop) return this.data;
5943
- return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
5944
- };
5945
- this.set = function(prop, val) {
5946
- this.data[prop] = val;
5947
- return this;
5948
- };
5949
- this.setCH = function(ch) {
5950
- this.uaCH = ch;
5951
- return this;
5952
- };
5953
- this.detectFeature = function() {
5954
- if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
5955
- switch (this.itemType) {
5956
- case BROWSER:
5957
- if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
5958
- this.set(NAME, "Brave");
5959
- }
5960
- break;
5961
- case DEVICE:
5962
- if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
5963
- this.set(TYPE, MOBILE);
5964
- }
5965
- if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
5966
- this.set(MODEL, "iPad").set(TYPE, TABLET);
5967
- }
5968
- break;
5969
- case OS:
5970
- if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
5971
- this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
5972
- }
5973
- break;
5974
- case RESULT:
5975
- var data = this.data;
5976
- var detect = function(itemType2) {
5977
- return data[itemType2].getItem().detectFeature().get();
5978
- };
5979
- this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
4485
+ /** Convert an AxiosError into the appropriate TagadaError subclass. */
4486
+ toTagadaError(error) {
4487
+ var _a, _b, _c, _d, _e;
4488
+ const status = (_a = error.response) == null ? void 0 : _a.status;
4489
+ const data = (_b = error.response) == null ? void 0 : _b.data;
4490
+ const serverMessage = (_d = (_c = data == null ? void 0 : data.message) != null ? _c : data == null ? void 0 : data.error) != null ? _d : error.message;
4491
+ if (!error.response) {
4492
+ if (error.code === "ECONNABORTED") {
4493
+ return new TagadaApiError("Request timed out", 0, {
4494
+ code: TagadaErrorCode.TIMEOUT,
4495
+ retryable: true
4496
+ });
5980
4497
  }
4498
+ return new TagadaNetworkError(serverMessage);
5981
4499
  }
5982
- return this;
5983
- };
5984
- this.parseUA = function() {
5985
- if (this.itemType != RESULT) {
5986
- rgxMapper.call(this.data, this.ua, this.rgxMap);
4500
+ if (status === 401 || status === 403) {
4501
+ return new TagadaAuthError(serverMessage, status);
5987
4502
  }
5988
- switch (this.itemType) {
5989
- case BROWSER:
5990
- this.set(MAJOR, majorize(this.get(VERSION3)));
5991
- break;
5992
- case OS:
5993
- if (this.get(NAME) == "iOS" && this.get(VERSION3) == "18.6") {
5994
- var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
5995
- if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) {
5996
- this.set(VERSION3, realVersion[1]);
5997
- }
5998
- }
5999
- break;
6000
- }
6001
- return this;
6002
- };
6003
- this.parseCH = function() {
6004
- var uaCH2 = this.uaCH, rgxMap2 = this.rgxMap;
6005
- switch (this.itemType) {
6006
- case BROWSER:
6007
- case ENGINE:
6008
- var brands = uaCH2[FULLVERLIST] || uaCH2[BRANDS], prevName;
6009
- if (brands) {
6010
- for (var i = 0; i < brands.length; i++) {
6011
- var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
6012
- if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
6013
- brandName = strMapper(brandName, browserHintsMap);
6014
- prevName = this.get(NAME);
6015
- if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
6016
- this.set(NAME, brandName).set(VERSION3, brandVersion).set(MAJOR, majorize(brandVersion));
6017
- }
6018
- prevName = brandName;
6019
- }
6020
- if (this.itemType == ENGINE && brandName == CHROMIUM) {
6021
- this.set(VERSION3, brandVersion);
6022
- }
6023
- }
6024
- }
6025
- break;
6026
- case CPU:
6027
- var archName = uaCH2[ARCHITECTURE];
6028
- if (archName) {
6029
- if (archName && uaCH2[BITNESS] == "64") archName += "64";
6030
- rgxMapper.call(this.data, archName + ";", rgxMap2);
6031
- }
6032
- break;
6033
- case DEVICE:
6034
- if (uaCH2[MOBILE]) {
6035
- this.set(TYPE, MOBILE);
6036
- }
6037
- if (uaCH2[MODEL]) {
6038
- this.set(MODEL, uaCH2[MODEL]);
6039
- if (!this.get(TYPE) || !this.get(VENDOR)) {
6040
- var reParse = {};
6041
- rgxMapper.call(reParse, "droid 9; " + uaCH2[MODEL] + ")", rgxMap2);
6042
- if (!this.get(TYPE) && !!reParse.type) {
6043
- this.set(TYPE, reParse.type);
6044
- }
6045
- if (!this.get(VENDOR) && !!reParse.vendor) {
6046
- this.set(VENDOR, reParse.vendor);
6047
- }
6048
- }
6049
- }
6050
- if (uaCH2[FORMFACTORS]) {
6051
- var ff;
6052
- if (typeof uaCH2[FORMFACTORS] !== "string") {
6053
- var idx = 0;
6054
- while (!ff && idx < uaCH2[FORMFACTORS].length) {
6055
- ff = strMapper(uaCH2[FORMFACTORS][idx++], formFactorsMap);
6056
- }
6057
- } else {
6058
- ff = strMapper(uaCH2[FORMFACTORS], formFactorsMap);
6059
- }
6060
- this.set(TYPE, ff);
6061
- }
6062
- break;
6063
- case OS:
6064
- var osName = uaCH2[PLATFORM];
6065
- if (osName) {
6066
- var osVersion = uaCH2[PLATFORMVER];
6067
- if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
6068
- this.set(NAME, osName).set(VERSION3, osVersion);
6069
- }
6070
- if (this.get(NAME) == WINDOWS && uaCH2[MODEL] == "Xbox") {
6071
- this.set(NAME, "Xbox").set(VERSION3, void 0);
6072
- }
6073
- break;
6074
- case RESULT:
6075
- var data = this.data;
6076
- var parse = function(itemType2) {
6077
- return data[itemType2].getItem().setCH(uaCH2).parseCH().get();
6078
- };
6079
- this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
6080
- }
6081
- return this;
6082
- };
6083
- setProps.call(this, [
6084
- ["itemType", itemType],
6085
- ["ua", ua],
6086
- ["uaCH", uaCH],
6087
- ["rgxMap", rgxMap],
6088
- ["data", createIData(this, itemType)]
6089
- ]);
6090
- return this;
6091
- }
6092
- function UAParser(ua, extensions, headers) {
6093
- if (typeof ua === TYPEOF.OBJECT) {
6094
- if (isExtensions(ua, true)) {
6095
- if (typeof extensions === TYPEOF.OBJECT) {
6096
- headers = extensions;
6097
- }
6098
- extensions = ua;
6099
- } else {
6100
- headers = ua;
6101
- extensions = void 0;
6102
- }
6103
- ua = void 0;
6104
- } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
6105
- headers = extensions;
6106
- extensions = void 0;
6107
- }
6108
- if (headers) {
6109
- if (typeof headers.append === TYPEOF.FUNCTION) {
6110
- var kv = {};
6111
- headers.forEach(function(v, k) {
6112
- kv[String(k).toLowerCase()] = v;
4503
+ if (status === 429) {
4504
+ return new TagadaApiError(serverMessage, 429, {
4505
+ code: TagadaErrorCode.RATE_LIMITED,
4506
+ retryable: true
6113
4507
  });
6114
- headers = kv;
6115
- } else {
6116
- var normalized = {};
6117
- for (var header in headers) {
6118
- if (headers.hasOwnProperty(header)) {
6119
- normalized[String(header).toLowerCase()] = headers[header];
6120
- }
6121
- }
6122
- headers = normalized;
6123
- }
6124
- }
6125
- if (!(this instanceof UAParser)) {
6126
- return new UAParser(ua, extensions, headers).getResult();
6127
- }
6128
- var userAgent = typeof ua === TYPEOF.STRING ? ua : (
6129
- // Passed user-agent string
6130
- headers && headers[USER_AGENT] ? headers[USER_AGENT] : (
6131
- // User-Agent from passed headers
6132
- NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : (
6133
- // navigator.userAgent
6134
- EMPTY
6135
- )
6136
- )
6137
- ), httpUACH = new UACHData(headers, true), regexMap = extensions ? extend2(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
6138
- if (itemType == RESULT) {
6139
- return function() {
6140
- 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();
6141
- };
6142
- } else {
6143
- return function() {
6144
- return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
6145
- };
6146
- }
6147
- };
6148
- setProps.call(this, [
6149
- ["getBrowser", createItemFunc(BROWSER)],
6150
- ["getCPU", createItemFunc(CPU)],
6151
- ["getDevice", createItemFunc(DEVICE)],
6152
- ["getEngine", createItemFunc(ENGINE)],
6153
- ["getOS", createItemFunc(OS)],
6154
- ["getResult", createItemFunc(RESULT)],
6155
- ["getUA", function() {
6156
- return userAgent;
6157
- }],
6158
- ["setUA", function(ua2) {
6159
- if (isString2(ua2)) userAgent = trim2(ua2, UA_MAX_LENGTH);
6160
- return this;
6161
- }]
6162
- ]).setUA(userAgent);
6163
- return this;
6164
- }
6165
- UAParser.VERSION = LIBVERSION;
6166
- UAParser.BROWSER = enumerize([NAME, VERSION3, MAJOR, TYPE]);
6167
- UAParser.CPU = enumerize([ARCHITECTURE]);
6168
- UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
6169
- UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION3]);
6170
-
6171
- // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/enums/ua-parser-enums.mjs
6172
- var BrowserName = Object.freeze({
6173
- "115": "115",
6174
- "2345": "2345",
6175
- "360": "360",
6176
- ALIPAY: "Alipay",
6177
- AMAYA: "Amaya",
6178
- ANDROID: "Android Browser",
6179
- ARORA: "Arora",
6180
- AVANT: "Avant",
6181
- AVAST: "Avast Secure Browser",
6182
- AVG: "AVG Secure Browser",
6183
- BAIDU: "Baidu Browser",
6184
- BASILISK: "Basilisk",
6185
- BING: "Bing",
6186
- BLAZER: "Blazer",
6187
- BOLT: "Bolt",
6188
- BOWSER: "Bowser",
6189
- BRAVE: "Brave",
6190
- CAMINO: "Camino",
6191
- CHIMERA: "Chimera",
6192
- CHROME: "Chrome",
6193
- CHROME_HEADLESS: "Chrome Headless",
6194
- CHROME_MOBILE: "Mobile Chrome",
6195
- CHROME_WEBVIEW: "Chrome WebView",
6196
- CHROMIUM: "Chromium",
6197
- COBALT: "Cobalt",
6198
- COC_COC: "Coc Coc",
6199
- CONKEROR: "Conkeror",
6200
- DAUM: "Daum",
6201
- DILLO: "Dillo",
6202
- DOLPHIN: "Dolphin",
6203
- DOOBLE: "Dooble",
6204
- DORIS: "Doris",
6205
- DRAGON: "Dragon",
6206
- DUCKDUCKGO: "DuckDuckGo",
6207
- ECOSIA: "Ecosia",
6208
- EDGE: "Edge",
6209
- EDGE_WEBVIEW: "Edge WebView",
6210
- EDGE_WEBVIEW2: "Edge WebView2",
6211
- EPIPHANY: "Epiphany",
6212
- FACEBOOK: "Facebook",
6213
- FALKON: "Falkon",
6214
- FIREBIRD: "Firebird",
6215
- FIREFOX: "Firefox",
6216
- FIREFOX_FOCUS: "Firefox Focus",
6217
- FIREFOX_MOBILE: "Mobile Firefox",
6218
- FIREFOX_REALITY: "Firefox Reality",
6219
- FENNEC: "Fennec",
6220
- FLOCK: "Flock",
6221
- FLOW: "Flow",
6222
- GO: "GoBrowser",
6223
- GOOGLE_SEARCH: "GSA",
6224
- HELIO: "Helio",
6225
- HEYTAP: "HeyTap",
6226
- HONOR: "Honor",
6227
- HUAWEI: "Huawei Browser",
6228
- ICAB: "iCab",
6229
- ICE: "ICE Browser",
6230
- ICEAPE: "IceApe",
6231
- ICECAT: "IceCat",
6232
- ICEDRAGON: "IceDragon",
6233
- ICEWEASEL: "IceWeasel",
6234
- IE: "IE",
6235
- INSTAGRAM: "Instagram",
6236
- IRIDIUM: "Iridium",
6237
- IRON: "Iron",
6238
- JASMINE: "Jasmine",
6239
- KONQUEROR: "Konqueror",
6240
- KAKAO: "KakaoTalk",
6241
- KHTML: "KHTML",
6242
- K_MELEON: "K-Meleon",
6243
- KLAR: "Klar",
6244
- KLARNA: "Klarna",
6245
- KINDLE: "Kindle",
6246
- LENOVO: "Smart Lenovo Browser",
6247
- LADYBIRD: "Ladybird",
6248
- LG: "LG Browser",
6249
- LIBREWOLF: "LibreWolf",
6250
- LIEBAO: "LBBROWSER",
6251
- LINE: "Line",
6252
- LINKEDIN: "LinkedIn",
6253
- LINKS: "Links",
6254
- LUNASCAPE: "Lunascape",
6255
- LYNX: "Lynx",
6256
- MAEMO: "Maemo Browser",
6257
- MAXTHON: "Maxthon",
6258
- MIDORI: "Midori",
6259
- MINIMO: "Minimo",
6260
- MIUI: "MIUI Browser",
6261
- MOZILLA: "Mozilla",
6262
- MOSAIC: "Mosaic",
6263
- NAVER: "Naver",
6264
- NETFRONT: "NetFront",
6265
- NETSCAPE: "Netscape",
6266
- NETSURF: "Netsurf",
6267
- NOKIA: "Nokia Browser",
6268
- OBIGO: "Obigo",
6269
- OCULUS: "Oculus Browser",
6270
- OMNIWEB: "OmniWeb",
6271
- OPERA: "Opera",
6272
- OPERA_COAST: "Opera Coast",
6273
- OPERA_GX: "Opera GX",
6274
- OPERA_MINI: "Opera Mini",
6275
- OPERA_MOBI: "Opera Mobi",
6276
- OPERA_TABLET: "Opera Tablet",
6277
- OPERA_TOUCH: "Opera Touch",
6278
- OTTER: "Otter",
6279
- OVI: "OviBrowser",
6280
- PALEMOON: "PaleMoon",
6281
- PHANTOMJS: "PhantomJS",
6282
- PHOENIX: "Phoenix",
6283
- PICOBROWSER: "Pico Browser",
6284
- POLARIS: "Polaris",
6285
- PUFFIN: "Puffin",
6286
- QQ: "QQBrowser",
6287
- QQ_LITE: "QQBrowserLite",
6288
- QUARK: "Quark",
6289
- QUPZILLA: "QupZilla",
6290
- QUTEBROWSER: "qutebrowser",
6291
- QWANT: "Qwant",
6292
- REKONQ: "rekonq",
6293
- ROCKMELT: "Rockmelt",
6294
- SAFARI: "Safari",
6295
- SAFARI_MOBILE: "Mobile Safari",
6296
- SAILFISH: "Sailfish Browser",
6297
- SAMSUNG: "Samsung Internet",
6298
- SEAMONKEY: "SeaMonkey",
6299
- SILK: "Silk",
6300
- SKYFIRE: "Skyfire",
6301
- SLEIPNIR: "Sleipnir",
6302
- SLIMBOAT: "SlimBoat",
6303
- SLIMBROWSER: "SlimBrowser",
6304
- SLIMJET: "Slimjet",
6305
- SNAPCHAT: "Snapchat",
6306
- SOGOU_EXPLORER: "Sogou Explorer",
6307
- SOGOU_MOBILE: "Sogou Mobile",
6308
- SURF: "Surf",
6309
- SWIFTFOX: "Swiftfox",
6310
- TESLA: "Tesla",
6311
- TIKTOK: "TikTok",
6312
- TIZEN: "Tizen Browser",
6313
- TWITTER: "Twitter",
6314
- UC: "UCBrowser",
6315
- UP: "UP.Browser",
6316
- VIVALDI: "Vivaldi",
6317
- VIVO: "Vivo Browser",
6318
- W3M: "w3m",
6319
- WATERFOX: "Waterfox",
6320
- WEBKIT: "WebKit",
6321
- WECHAT: "WeChat",
6322
- WEIBO: "Weibo",
6323
- WHALE: "Whale",
6324
- WOLVIC: "Wolvic",
6325
- YANDEX: "Yandex",
6326
- ZALO: "Zalo"
6327
- // TODO : test!
6328
- });
6329
- var BrowserType = Object.freeze({
6330
- CRAWLER: "crawler",
6331
- CLI: "cli",
6332
- EMAIL: "email",
6333
- FETCHER: "fetcher",
6334
- INAPP: "inapp",
6335
- MEDIAPLAYER: "mediaplayer",
6336
- LIBRARY: "library"
6337
- });
6338
- var CPUArch = Object.freeze({
6339
- "68K": "68k",
6340
- ALPHA: "alpha",
6341
- ARM: "arm",
6342
- ARM_64: "arm64",
6343
- ARM_HF: "armhf",
6344
- AVR: "avr",
6345
- AVR_32: "avr32",
6346
- IA64: "ia64",
6347
- IRIX: "irix",
6348
- IRIX_64: "irix64",
6349
- MIPS: "mips",
6350
- MIPS_64: "mips64",
6351
- PA_RISC: "pa-risc",
6352
- PPC: "ppc",
6353
- SPARC: "sparc",
6354
- SPARC_64: "sparc64",
6355
- X86: "ia32",
6356
- X86_64: "amd64"
6357
- });
6358
- var DeviceType = Object.freeze({
6359
- CONSOLE: "console",
6360
- DESKTOP: "desktop",
6361
- EMBEDDED: "embedded",
6362
- MOBILE: "mobile",
6363
- SMARTTV: "smarttv",
6364
- TABLET: "tablet",
6365
- WEARABLE: "wearable",
6366
- XR: "xr"
6367
- });
6368
- var DeviceVendor = Object.freeze({
6369
- ACER: "Acer",
6370
- ADVAN: "Advan",
6371
- ALCATEL: "Alcatel",
6372
- APPLE: "Apple",
6373
- AMAZON: "Amazon",
6374
- ARCHOS: "Archos",
6375
- ASUS: "ASUS",
6376
- ATT: "AT&T",
6377
- BENQ: "BenQ",
6378
- BLACKBERRY: "BlackBerry",
6379
- BLU: "BLU",
6380
- CAT: "Cat",
6381
- DELL: "Dell",
6382
- ENERGIZER: "Energizer",
6383
- ESSENTIAL: "Essential",
6384
- FACEBOOK: "Facebook",
6385
- FAIRPHONE: "Fairphone",
6386
- GEEKSPHONE: "GeeksPhone",
6387
- GENERIC: "Generic",
6388
- GOOGLE: "Google",
6389
- HISENSE: "Hisense",
6390
- HMD: "HMD",
6391
- HP: "HP",
6392
- HTC: "HTC",
6393
- HUAWEI: "Huawei",
6394
- IMO: "IMO",
6395
- INFINIX: "Infinix",
6396
- ITEL: "itel",
6397
- JOLLA: "Jolla",
6398
- KOBO: "Kobo",
6399
- LAVA: "Lava",
6400
- LENOVO: "Lenovo",
6401
- LG: "LG",
6402
- MEIZU: "Meizu",
6403
- MICROMAX: "Micromax",
6404
- MICROSOFT: "Microsoft",
6405
- MOTOROLA: "Motorola",
6406
- NEXIAN: "Nexian",
6407
- NINTENDO: "Nintendo",
6408
- NOKIA: "Nokia",
6409
- NOTHING: "Nothing",
6410
- NVIDIA: "Nvidia",
6411
- ONEPLUS: "OnePlus",
6412
- OPPO: "OPPO",
6413
- OUYA: "Ouya",
6414
- PALM: "Palm",
6415
- PANASONIC: "Panasonic",
6416
- PEBBLE: "Pebble",
6417
- PHILIPS: "Philips",
6418
- PICO: "Pico",
6419
- POLYTRON: "Polytron",
6420
- REALME: "Realme",
6421
- RETROID: "Retroid",
6422
- RIM: "RIM",
6423
- ROKU: "Roku",
6424
- SAMSUNG: "Samsung",
6425
- SHARP: "Sharp",
6426
- SIEMENS: "Siemens",
6427
- SMARTFREN: "Smartfren",
6428
- SONY: "Sony",
6429
- SPRINT: "Sprint",
6430
- TCL: "TCL",
6431
- TECHNISAT: "TechniSAT",
6432
- TECNO: "TECNO",
6433
- TESLA: "Tesla",
6434
- ULEFONE: "Ulefone",
6435
- VIVO: "Vivo",
6436
- VIZIO: "Vizio",
6437
- VODAFONE: "Vodafone",
6438
- WIKO: "Wiko",
6439
- XBOX: "Xbox",
6440
- XIAOMI: "Xiaomi",
6441
- ZEBRA: "Zebra",
6442
- ZTE: "ZTE"
6443
- // TODO : test!
6444
- });
6445
- var EngineName = Object.freeze({
6446
- AMAYA: "Amaya",
6447
- ARKWEB: "ArkWeb",
6448
- BLINK: "Blink",
6449
- EDGEHTML: "EdgeHTML",
6450
- FLOW: "Flow",
6451
- GECKO: "Gecko",
6452
- GOANNA: "Goanna",
6453
- ICAB: "iCab",
6454
- KHTML: "KHTML",
6455
- LIBWEB: "LibWeb",
6456
- LINKS: "Links",
6457
- LYNX: "Lynx",
6458
- NETFRONT: "NetFront",
6459
- NETSURF: "NetSurf",
6460
- PRESTO: "Presto",
6461
- SERVO: "Servo",
6462
- TASMAN: "Tasman",
6463
- TRIDENT: "Trident",
6464
- W3M: "w3m",
6465
- WEBKIT: "WebKit"
6466
- });
6467
- var OSName = Object.freeze({
6468
- AIX: "AIX",
6469
- AMIGA_OS: "Amiga OS",
6470
- ANDROID: "Android",
6471
- ANDROID_X86: "Android-x86",
6472
- ARCAOS: "ArcaOS",
6473
- ARCH: "Arch",
6474
- BADA: "Bada",
6475
- BEOS: "BeOS",
6476
- BLACKBERRY: "BlackBerry",
6477
- CENTOS: "CentOS",
6478
- CHROME_OS: "Chrome OS",
6479
- CHROMECAST: "Chromecast",
6480
- CHROMECAST_ANDROID: "Chromecast Android",
6481
- CHROMECAST_FUCHSIA: "Chromecast Fuchsia",
6482
- CHROMECAST_LINUX: "Chromecast Linux",
6483
- CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker",
6484
- CONTIKI: "Contiki",
6485
- DEBIAN: "Debian",
6486
- DEEPIN: "Deepin",
6487
- DRAGONFLY: "DragonFly",
6488
- ELEMENTARY_OS: "elementary OS",
6489
- FEDORA: "Fedora",
6490
- FIREFOX_OS: "Firefox OS",
6491
- FREEBSD: "FreeBSD",
6492
- FUCHSIA: "Fuchsia",
6493
- GENTOO: "Gentoo",
6494
- GHOSTBSD: "GhostBSD",
6495
- GNU: "GNU",
6496
- HAIKU: "Haiku",
6497
- HARMONYOS: "HarmonyOS",
6498
- HP_UX: "HP-UX",
6499
- HURD: "Hurd",
6500
- IOS: "iOS",
6501
- JOLI: "Joli",
6502
- KAIOS: "KaiOS",
6503
- KNOPPIX: "Knoppix",
6504
- KUBUNTU: "Kubuntu",
6505
- LINPUS: "Linpus",
6506
- LINSPIRE: "Linspire",
6507
- LINUX: "Linux",
6508
- MACOS: "macOS",
6509
- MAEMO: "Maemo",
6510
- MAGEIA: "Mageia",
6511
- MANDRIVA: "Mandriva",
6512
- MANJARO: "Manjaro",
6513
- MEEGO: "MeeGo",
6514
- MINIX: "Minix",
6515
- MINT: "Mint",
6516
- MORPH_OS: "Morph OS",
6517
- NETBSD: "NetBSD",
6518
- NETRANGE: "NetRange",
6519
- NETTV: "NetTV",
6520
- NINTENDO: "Nintendo",
6521
- OPENHARMONY: "OpenHarmony",
6522
- OPENBSD: "OpenBSD",
6523
- OPENVMS: "OpenVMS",
6524
- OS2: "OS/2",
6525
- PALM: "Palm",
6526
- PC_BSD: "PC-BSD",
6527
- PCLINUXOS: "PCLinuxOS",
6528
- PICO: "Pico",
6529
- PLAN9: "Plan9",
6530
- PLAYSTATION: "PlayStation",
6531
- QNX: "QNX",
6532
- RASPBIAN: "Raspbian",
6533
- REDHAT: "RedHat",
6534
- RIM_TABLET_OS: "RIM Tablet OS",
6535
- RISC_OS: "RISC OS",
6536
- SABAYON: "Sabayon",
6537
- SAILFISH: "Sailfish",
6538
- SERENITYOS: "SerenityOS",
6539
- SERIES40: "Series40",
6540
- SLACKWARE: "Slackware",
6541
- SOLARIS: "Solaris",
6542
- SUSE: "SUSE",
6543
- SYMBIAN: "Symbian",
6544
- TIZEN: "Tizen",
6545
- UBUNTU: "Ubuntu",
6546
- UBUNTU_TOUCH: "Ubuntu Touch",
6547
- UNIX: "Unix",
6548
- VECTORLINUX: "VectorLinux",
6549
- WATCHOS: "watchOS",
6550
- WEBOS: "WebOS",
6551
- WINDOWS: "Windows",
6552
- WINDOWS_CE: "Windows CE",
6553
- WINDOWS_IOT: "Windows IoT",
6554
- WINDOWS_MOBILE: "Windows Mobile",
6555
- WINDOWS_PHONE: "Windows Phone",
6556
- WINDOWS_RT: "Windows RT",
6557
- XBOX: "Xbox",
6558
- XUBUNTU: "Xubuntu",
6559
- ZENWALK: "Zenwalk"
6560
- // TODO : test!
6561
- });
6562
- var Extension = Object.freeze({
6563
- BrowserName: {
6564
- CLI: {
6565
- CURL: "curl",
6566
- ELINKS: "ELinks",
6567
- HTTPIE: "HTTPie",
6568
- LYNX: "Lynx",
6569
- WGET: "Wget"
6570
- },
6571
- Crawler: {
6572
- AHREFS_BOT: "AhrefsBot",
6573
- AI2_BOT: "AI2Bot",
6574
- AIHIT_BOT: "aiHitBot",
6575
- ALGOLIA_CRAWLER: "Algolia Crawler",
6576
- APPLE_BOT: "Applebot",
6577
- APPLE_BOT_EXTENDED: "Applebot-Extended",
6578
- ASK_TEOMA: "Teoma",
6579
- AMAZON_BOT: "Amazonbot",
6580
- AMAZON_CONTXBOT: "contxbot",
6581
- ANTHROPIC_AI: "anthropic-ai",
6582
- ANTHROPIC_CLAUDE_BOT: "ClaudeBot",
6583
- ANTHROPIC_CLAUDE_SEARCHBOT: "Claude-SearchBot",
6584
- ANTHROPIC_CLAUDE_WEB: "Claude-Web",
6585
- ARCHIVEORG_BOT: "archive.org_bot",
6586
- BAIDU_ADS: "Baidu-ADS",
6587
- BAIDU_SPIDER: "Baiduspider",
6588
- BAIDU_SPIDER_ADS: "Baiduspider-ads",
6589
- BAIDU_SPIDER_CPRO: "Baiduspider-cpro",
6590
- BAIDU_SPIDER_FAVO: "Baiduspider-favo",
6591
- BAIDU_SPIDER_IMAGE: "Baiduspider-image",
6592
- BAIDU_SPIDER_NEWS: "Baiduspider-news",
6593
- BAIDU_SPIDER_RENDER: "Baiduspider-render",
6594
- BAIDU_SPIDER_VIDEO: "Baiduspider-video",
6595
- BLEX_BOT: "BLEXBot",
6596
- BOTIFY: "botify",
6597
- BRAVE_BOT: "Bravebot",
6598
- BYTEDANCE_BYTESPIDER: "Bytespider",
6599
- BYTEDANCE_TIKTOKSPIDER: "TikTokSpider",
6600
- COMMON_CRAWL_CCBOT: "CCBot",
6601
- COCCOC_BOT_WEB: "coccocbot-web",
6602
- COCCOC_BOT_IMAGE: "coccocbot-image",
6603
- COHERE_TRAINING_DATA_CRAWLER: "cohere-training-data-crawler",
6604
- COTOYOGI: "Cotoyogi",
6605
- COVEO_BOT: "Coveobot",
6606
- CRITEO_BOT: "CriteoBot",
6607
- DATAFORSEO_BOT: "DataForSeoBot",
6608
- DAUM: "Daum",
6609
- DAUM_DAUMOA: "Daumoa",
6610
- DAUM_DAUMOA_IMAGE: "Daumoa-image",
6611
- DEEPSEEK_BOT: "DeepSeekBot",
6612
- DIFFBOT: "Diffbot",
6613
- DUCKDUCKGO_BOT: "DuckDuckBot",
6614
- DUCKDUCKGO_FAVICONS_BOT: "DuckDuckGo-Favicons-Bot",
6615
- ELASTIC: "Elastic",
6616
- ELASTIC_SWIFTYPE_BOT: "Swiftbot",
6617
- EXALEAD_EXABOT: "Exabot",
6618
- FIRECRAWL_AGENT: "FirecrawlAgent",
6619
- FREESPOKE: "Freespoke",
6620
- GOOGLE_ADSBOT: "AdsBot-Google",
6621
- GOOGLE_ADSBOT_MOBILE: "Adsbot-Google-Mobile",
6622
- GOOGLE_ADSENSE: "AdSense",
6623
- GOOGLE_APIS: "APIs-Google",
6624
- GOOGLE_BOT: "Googlebot",
6625
- GOOGLE_BOT_IMAGE: "Googlebot-Image",
6626
- GOOGLE_BOT_NEWS: "Googlebot-News",
6627
- GOOGLE_BOT_VIDEO: "Googlebot-Video",
6628
- GOOGLE_CLOUDVERTEXBOT: "Google-CloudVertexBot",
6629
- GOOGLE_EXTENDED: "Google-Extended",
6630
- GOOGLE_INSPECTIONTOOL: "Google-InspectionTool",
6631
- GOOGLE_OTHER: "GoogleOther",
6632
- GOOGLE_OTHER_IMAGE: "GoogleOther-Image",
6633
- GOOGLE_OTHER_VIDEO: "GoogleOther-Video",
6634
- GOOGLE_SAFETY: "Google-Safety",
6635
- GOOGLE_STOREBOT: "Storebot-Google",
6636
- HIVE_IMAGESIFTBOT: "ImagesiftBot",
6637
- HUAWEI_PANGUBOT: "PanguBot",
6638
- HUAWEI_PETALBOT: "PetalBot",
6639
- HUGGINGFACE_BOT: "HuggingFace-Bot",
6640
- HUNTER_VELENPUBLICWEBCRAWLER: "VelenPublicWebCrawler",
6641
- IA_ARCHIVER: "ia_archiver",
6642
- IASK_BOT: "iAskBot",
6643
- KAGI_BOT: "Kagibot",
6644
- KANGAROO_BOT: "Kangaroo Bot",
6645
- LINE_SPIDER: "Linespider",
6646
- LINKEDIN_BOT: "LinkedInBot",
6647
- MAGPIE_CRAWLER: "magpie-crawler",
6648
- MARGINALIA: "marginalia",
6649
- META_EXTERNALAGENT: "meta-externalagent",
6650
- META_FACEBOOKBOT: "FacebookBot",
6651
- META_FACEBOOKCATALOG: "facebookcatalog",
6652
- META_FACEBOOKEXTERNALHIT: "facebookexternalhit",
6653
- MAJESTIC_MJ12BOT: "MJ12bot",
6654
- MICROSOFT_BINGBOT: "Bingbot",
6655
- MICROSOFT_MSNBOT: "msnbot",
6656
- MICROSOFT_ADIDXBOT: "adidxbot",
6657
- MOJEEK_BOT: "MojeekBot",
6658
- MOZ_DOTBOT: "DotBot",
6659
- ONCRAWL: "OnCrawl",
6660
- ONESPOT_SCRAPERBOT: "Onespot-ScraperBot",
6661
- OPENAI_GPTBOT: "GPTBot",
6662
- OPENAI_SEARCH_BOT: "OAI-SearchBot",
6663
- PERPLEXITY_BOT: "PerplexityBot",
6664
- QIHOO_360_SPIDER: "360Spider",
6665
- QWANT_BOT: "Qwantbot",
6666
- QWANT_BOT_NEWS: "Qwantbot-news",
6667
- REPLICATE_BOT: "Replicate-Bot",
6668
- RUNPOD_BOT: "RunPod-Bot",
6669
- SB_INTUITIONS_BOT: "SBIntuitionsBot",
6670
- SEEKPORT_BOT: "SeekportBot",
6671
- SEMRUSH_BOT: "SemrushBot",
6672
- SEMRUSH_BOT_BACKLINK: "SemrushBot-BA",
6673
- SEMRUSH_BOT_CONTENTSHAKE: "SemrushBot-OCOB",
6674
- SEMRUSH_BOT_SEO_CHECKER: "SemrushBot-SI",
6675
- SEZNAM_BOT: "SeznamBot",
6676
- SITEIMPROVE: "Siteimprove",
6677
- SOGOU_PIC_SPIDER: "Sogou Pic Spider",
6678
- SOGOU_WEB_SPIDER: "Sogou web spider",
6679
- STARTPAGE: "Startpage",
6680
- SURLY_BOT: "SurdotlyBot",
6681
- TIMPI_BOT: "Timpibot",
6682
- TOGETHER_BOT: "Together-Bot",
6683
- TURNITIN_BOT: "TurnitinBot",
6684
- TWIN_AGENT: "TwinAgent",
6685
- VERCEL_V0BOT: "v0bot",
6686
- WEBZIO: "webzio",
6687
- WEBZIO_EXTENDED: "Webzio-Extended",
6688
- WEBZIO_OMGILI: "omgili",
6689
- WEBZIO_OMGILI_BOT: "omgilibot",
6690
- XAI_BOT: "xAI-Bot",
6691
- YAHOO_JAPAN: "Y!J-BRW",
6692
- YAHOO_SLURP: "Yahoo! Slurp",
6693
- YANDEX_ACCESSIBILITY_BOT: "YandexAccessibilityBot",
6694
- YANDEX_ADDITIONAL_BOT: "YandexAdditionalBot",
6695
- YANDEX_ADNET: "YandexAdNet",
6696
- YANDEX_BLOGS: "YandexBlogs",
6697
- YANDEX_BOT: "YandexBot",
6698
- YANDEX_BOT_MIRRORDETECTOR: "YandexBot MirrorDetector",
6699
- YANDEX_COMBOT: "YandexComBot",
6700
- YANDEX_FAVICONS: "YandexFavicons",
6701
- YANDEX_IMAGE_RESIZER: "YandexImageResizer",
6702
- YANDEX_IMAGES: "YandexImages",
6703
- YANDEX_MARKET: "YandexMarket",
6704
- YANDEX_MEDIA: "YandexMedia",
6705
- YANDEX_METRIKA: "YandexMetrika",
6706
- YANDEX_MOBILE_BOT: "YandexMobileBot",
6707
- YANDEX_MOBILE_SCREENSHOT_BOT: "YandexMobileScreenShotBot",
6708
- YANDEX_NEWS: "YandexNews",
6709
- YANDEX_ONTODB: "YandexOntoDB",
6710
- YANDEX_ONTODB_API: "YandexOntoDBAPI",
6711
- YANDEX_PARTNER: "YandexPartner",
6712
- YANDEX_RCA: "YandexRCA",
6713
- YANDEX_RENDERRESOURCES_BOT: "YandexRenderResourcesBot",
6714
- YANDEX_SCREENSHOT_BOT: "YandexScreenshotBot",
6715
- YANDEX_SPRAV_BOT: "YandexSpravBot",
6716
- YANDEX_TRACKER: "YandexTracker",
6717
- YANDEX_VERTICALS: "YandexVerticals",
6718
- YANDEX_VERTIS: "YandexVertis",
6719
- YANDEX_VIDEO: "YandexVideo",
6720
- YANDEX_VIDEO_PARSER: "YandexVideoParser",
6721
- YANDEX_WEBMASTER: "YandexWebmaster",
6722
- YEP_BOT: "YepBot",
6723
- YETI: "Yeti",
6724
- YISOU_SPIDER: "YisouSpider",
6725
- YOU_BOT: "YouBot",
6726
- ZHIPU_CHATGLM_SPIDER: "ChatGLM-Spider",
6727
- ZUM_BOT: "ZumBot"
6728
- },
6729
- Email: {
6730
- AIRMAIL: "Airmail",
6731
- APPLE_MAIL: "Mail",
6732
- BLUEMAIL: "BlueMail",
6733
- DAUM_MAIL: "DaumMail",
6734
- EVOLUTION: "Evolution",
6735
- EM_CLIENT: "eM Client",
6736
- FOXMAIL: "Foxmail",
6737
- KMAIL: "KMail",
6738
- KMAIL2: "kmail2",
6739
- KONTACT: "Kontact",
6740
- MICROSOFT_OUTLOOK: "Microsoft Outlook",
6741
- MICROSOFT_OUTLOOK_MAC: "MacOutlook",
6742
- NAVER_MAILAPP: "NaverMailApp",
6743
- POLYMAIL: "Polymail",
6744
- PROTON_MAIL: "ProtonMail",
6745
- SPARK_MAIL: "SparkDesktop",
6746
- SPARROW: "Sparrow",
6747
- THUNDERBIRD: "Thunderbird",
6748
- YAHOO_MAIL: "Yahoo",
6749
- ZIMBRA: "Zimbra",
6750
- ZOHO_MAIL: "ZohoMail-Desktop"
6751
- },
6752
- Fetcher: {
6753
- AHREFS_SITEAUDIT: "AhrefsSiteAudit",
6754
- ANTHROPIC_CLAUDE_USER: "Claude-User",
6755
- ASANA: "Asana",
6756
- BETTER_UPTIME_BOT: "Better Uptime Bot",
6757
- BITLY_BOT: "bitlybot",
6758
- BLUESKY: "Bluesky",
6759
- BUFFER_LINKPREVIEWBOT: "BufferLinkPreviewBot",
6760
- COHERE_AI: "Cohere-AI",
6761
- DISCORD_BOT: "Discordbot",
6762
- DUCKDUCKGO_ASSISTBOT: "DuckAssistBot",
6763
- GOOGLE_CHROME_LIGHTHOUSE: "Chrome-Lighthouse",
6764
- GOOGLE_FEEDFETCHER: "FeedFetcher-Google",
6765
- GOOGLE_GEMINI_DEEP_RESEARCH: "Gemini-Deep-Research",
6766
- GOOGLE_IMAGEPROXY: "GoogleImageProxy",
6767
- GOOGLE_PAGERENDERER: "Google-PageRenderer",
6768
- GOOGLE_READ_ALOUD: "Google-Read-Aloud",
6769
- GOOGLE_PRODUCER: "GoogleProducer",
6770
- GOOGLE_SITE_VERIFICATION: "Google-Site-Verification",
6771
- HUBSPOT_PAGE_FETCHER: "HubSpot Page Fetcher",
6772
- IFRAMELY: "Iframely",
6773
- KAKAOTALK_SCRAP: "kakaotalk-scrap",
6774
- KEYBASE_BOT: "KeybaseBot",
6775
- META_EXTERNALFETCHER: "meta-externalfetcher",
6776
- META_WHATSAPP: "WhatsApp",
6777
- MICROSOFT_BINGPREVIEW: "BingPreview",
6778
- MICROSOFT_PREVIEW: "MicrosoftPreview",
6779
- MISTRALAI_USER: "MistralAI-User",
6780
- NAVER_BLUENO: "Blueno",
6781
- ONCRAWL_ROGERBOT: "rogerbot",
6782
- OPENAI_CHATGPT_USER: "ChatGPT-User",
6783
- PERPLEXITY_USER: "Perplexity-User",
6784
- PINTEREST_BOT: "Pinterestbot",
6785
- SEMRUSH_SITEAUDITBOT: "SiteAuditBot",
6786
- SLACK_BOT: "Slackbot",
6787
- SLACK_BOT_LINKEXPANDING: "Slackbot-LinkExpanding",
6788
- SLACK_IMGPROXY: "Slack-ImgProxy",
6789
- SNAP_URL_PREVIEW: "Snap URL Preview",
6790
- SKYPE_URIPREVIEW: "SkypeUriPreview",
6791
- TELEGRAM_BOT: "TelegramBot",
6792
- UPTIMEROBOT: "UptimeRobot",
6793
- VERCEL_FAVICON_BOT: "vercel-favicon-bot",
6794
- VERCEL_SCREENSHOT_BOT: "vercel-screenshot-bot",
6795
- VERCEL_BOT: "Vercelbot",
6796
- VERCEL_FLAGS: "vercelflags",
6797
- VERCEL_TRACING: "verceltracing",
6798
- X_TWITTERBOT: "Twitterbot",
6799
- YANDEX_CALENDAR: "YandexCalendar",
6800
- YANDEX_DIRECT: "YandexDirect",
6801
- YANDEX_DIRECTDYN: "YandexDirectDyn",
6802
- YANDEX_DIRECTFETCHER: "YaDirectFetcher",
6803
- YANDEX_FORDOMAIN: "YandexForDomain",
6804
- YANDEX_PAGECHECKER: "YandexPagechecker",
6805
- YANDEX_SEARCHSHOP: "YandexSearchShop",
6806
- YANDEX_SITELINKS: "YandexSitelinks",
6807
- YANDEX_USERPROXY: "YandexUserproxy",
6808
- ZOOMINFO_BOT: "Zoombot"
6809
- },
6810
- InApp: {
6811
- DISCORD: "Discord",
6812
- EVERNOTE: "Evernote",
6813
- FIGMA: "Figma",
6814
- FLIPBOARD: "Flipboard",
6815
- MATTERMOST: "Mattermost",
6816
- TEAMS: "Teams",
6817
- NOTION: "Notion",
6818
- POSTMAN: "Postman",
6819
- RAMBOX: "Rambox",
6820
- ROCKETCHAT: "Rocket.Chat",
6821
- SLACK: "Slack",
6822
- TIKTOK_LITE: "TikTok Lite",
6823
- VSCODE: "VS Code",
6824
- YAHOO_JAPAN: "Yahoo! Japan"
6825
- },
6826
- Library: {
6827
- ADOBE_AIR: "AdobeAIR",
6828
- AIOHTTP: "aiohttp",
6829
- APACHE_HTTPCLIENT: "Apache-HttpClient",
6830
- AXIOS: "axios",
6831
- GO_HTTP_CLIENT: "go-http-client",
6832
- GOT: "got",
6833
- GUZZLEHTTP: "GuzzleHttp",
6834
- JAVA: "Java",
6835
- JAVA_HTTPCLIENT: "Java-http-client",
6836
- JSDOM: "jsdom",
6837
- LIBWWW_PERL: "libwww-perl",
6838
- LUA_RESTY_HTTP: "lua-resty-http",
6839
- NEEDLE: "Needle",
6840
- NUTCH: "Nutch",
6841
- OKHTTP: "OkHttp",
6842
- NODE_FETCH: "node-fetch",
6843
- NODE_SUPERAGENT: "node-superagent",
6844
- PHP_SOAP: "PHP-SOAP",
6845
- POSTMAN_RUNTIME: "PostmanRuntime",
6846
- PYTHON_HTTPX: "python-httpx",
6847
- PYTHON_URLLIB: "python-urllib",
6848
- PYTHON_URLLIB3: "python-urllib3",
6849
- PYTHON_REQUESTS: "python-requests",
6850
- SCRAPY: "Scrapy"
6851
- }
6852
- },
6853
- DeviceVendor: {
6854
- Vehicle: {
6855
- BMW: "BMW",
6856
- BYD: "BYD",
6857
- JEEP: "Jeep",
6858
- RIVIAN: "Rivian",
6859
- TESLA: "Tesla",
6860
- VOLVO: "Volvo"
6861
- }
6862
- }
6863
- });
6864
-
6865
- // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/extensions/ua-parser-extensions.mjs
6866
- var MODEL2 = "model";
6867
- var NAME2 = "name";
6868
- var TYPE2 = "type";
6869
- var VENDOR2 = "vendor";
6870
- var VERSION4 = "version";
6871
- var MOBILE2 = "mobile";
6872
- var TABLET2 = "tablet";
6873
- var CRAWLER = "crawler";
6874
- var CLI = "cli";
6875
- var EMAIL = "email";
6876
- var FETCHER = "fetcher";
6877
- var INAPP2 = "inapp";
6878
- var MEDIAPLAYER = "mediaplayer";
6879
- var LIBRARY = "library";
6880
- var CLIs = Object.freeze({
6881
- browser: [
6882
- // wget / curl / Lynx / ELinks / HTTPie
6883
- [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i],
6884
- [NAME2, VERSION4, [TYPE2, CLI]]
6885
- ]
6886
- });
6887
- var Crawlers = Object.freeze({
6888
- browser: [
6889
- [
6890
- // AhrefsBot - https://ahrefs.com/robot
6891
- // Amazonbot - https://developer.amazon.com/amazonbot
6892
- // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
6893
- // Bravebot - https://search.brave.com/help/brave-search-crawler
6894
- // CCBot - https://commoncrawl.org/faq
6895
- // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
6896
- // Coveobot - https://connect.coveo.com/s/article/19648
6897
- // CriteoBot - https://www.criteo.com/criteo-crawler/
6898
- // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
6899
- // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
6900
- // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
6901
- // GPTBot - https://platform.openai.com/docs/gptbot
6902
- // iAskBot - https://iask.ai
6903
- // Kagibot - https://kagi.com/bot
6904
- // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
6905
- // LinkedInBot - http://www.linkedin.com
6906
- // MJ12bot - https://mj12bot.com/
6907
- // MojeekBot - https://www.mojeek.com/bot.html
6908
- // Onespot - https://www.onespot.com/identifying-traffic.html
6909
- // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
6910
- // PerplexityBot - https://perplexity.ai/perplexitybot
6911
- // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
6912
- // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
6913
- // SurdotlyBot - http://sur.ly/bot.html
6914
- // Swiftbot - https://swiftype.com/swiftbot
6915
- // YepBot - https://yep.com/yepbot/
6916
- /((?: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,
6917
- // Algolia Crawler
6918
- /(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
6919
- // Applebot - http://apple.com/go/applebot
6920
- /(applebot(?:-extended)?)\/?([\w\.]*)/i,
6921
- // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
6922
- /(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
6923
- // ClaudeBot (Anthropic)
6924
- /(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
6925
- // Coc Coc Bot - https://help.coccoc.com/en/search-engine
6926
- /(coccocbot-(?:image|web))\/([\w\.]+)/i,
6927
- // Daum
6928
- /(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
6929
- // Facebook / Meta
6930
- // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
6931
- /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
6932
- // Googlebot - http://www.google.com/bot.html
6933
- /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,
6934
- // Internet Archive (archive.org)
6935
- /(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
6936
- // OnCrawl
6937
- /(oncrawl) mobile\/([\w\.]+)/i,
6938
- // Qwantbot - https://help.qwant.com/bot
6939
- /(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
6940
- // SemrushBot - http://www.semrush.com/bot.html
6941
- /((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
6942
- // Sogou Spider
6943
- /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
6944
- // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
6945
- /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
6946
- // Yandex Bots - https://yandex.com/bots
6947
- /(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,
6948
- // Yeti (Naver)
6949
- /(yeti)\/([\w\.]+)/i,
6950
- // 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
6951
- // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
6952
- // Freespoke - https://docs.freespoke.com/search/bot/
6953
- /((?: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
6954
- ],
6955
- [NAME2, VERSION4, [TYPE2, CRAWLER]],
6956
- [
6957
- // YandexBot MirrorDetector
6958
- /(yandexbot\/([\w\.]+); mirrordetector)/i
6959
- ],
6960
- [[NAME2, /\/.+;/ig, ""], VERSION4, [TYPE2, CRAWLER]],
6961
- [
6962
- // Google Bots
6963
- /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
6964
- // AI2Bot - https://allenai.org/crawler
6965
- // DataForSeoBot - https://dataforseo.com/dataforseo-bot
6966
- // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
6967
- // ImagesiftBot - https://imagesift.com/about
6968
- // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
6969
- // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
6970
- // v0bot - https://vercel.com/docs/bot-management
6971
- // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
6972
- // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
6973
- /\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
6974
- ],
6975
- [NAME2, [TYPE2, CRAWLER]]
6976
- ]
6977
- });
6978
- var ExtraDevices = Object.freeze({
6979
- device: [
6980
- [
6981
- /(nook)[\w ]+build\/(\w+)/i,
6982
- // Nook
6983
- /(dell) (strea[kpr\d ]*[\dko])/i,
6984
- // Dell Streak
6985
- /(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
6986
- // Le Pan Tablets
6987
- /(trinity)[- ]*(t\d{3}) bui/i,
6988
- // Trinity Tablets
6989
- /(gigaset)[- ]+(q\w{1,9}) bui/i,
6990
- // Gigaset Tablets
6991
- /(vodafone) ([\w ]+)(?:\)| bui)/i
6992
- // Vodafone
6993
- ],
6994
- [VENDOR2, MODEL2, [TYPE2, TABLET2]],
6995
- [
6996
- /(u304aa)/i
6997
- // AT&T
6998
- ],
6999
- [MODEL2, [VENDOR2, "AT&T"], [TYPE2, MOBILE2]],
7000
- [
7001
- /\bsie-(\w*)/i
7002
- // Siemens
7003
- ],
7004
- [MODEL2, [VENDOR2, "Siemens"], [TYPE2, MOBILE2]],
7005
- [
7006
- /\b(rct\w+) b/i
7007
- // RCA Tablets
7008
- ],
7009
- [MODEL2, [VENDOR2, "RCA"], [TYPE2, TABLET2]],
7010
- [
7011
- /\b(venue[\d ]{2,7}) b/i
7012
- // Dell Venue Tablets
7013
- ],
7014
- [MODEL2, [VENDOR2, "Dell"], [TYPE2, TABLET2]],
7015
- [
7016
- /\b(q(?:mv|ta)\w+) b/i
7017
- // Verizon Tablet
7018
- ],
7019
- [MODEL2, [VENDOR2, "Verizon"], [TYPE2, TABLET2]],
7020
- [
7021
- /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
7022
- // Barnes & Noble Tablet
7023
- ],
7024
- [MODEL2, [VENDOR2, "Barnes & Noble"], [TYPE2, TABLET2]],
7025
- [
7026
- /\b(tm\d{3}\w+) b/i
7027
- ],
7028
- [MODEL2, [VENDOR2, "NuVision"], [TYPE2, TABLET2]],
7029
- [
7030
- /\b(k88) b/i
7031
- // ZTE K Series Tablet
7032
- ],
7033
- [MODEL2, [VENDOR2, "ZTE"], [TYPE2, TABLET2]],
7034
- [
7035
- /\b(nx\d{3}j) b/i
7036
- // ZTE Nubia
7037
- ],
7038
- [MODEL2, [VENDOR2, "ZTE"], [TYPE2, MOBILE2]],
7039
- [
7040
- /\b(gen\d{3}) b.+49h/i
7041
- // Swiss GEN Mobile
7042
- ],
7043
- [MODEL2, [VENDOR2, "Swiss"], [TYPE2, MOBILE2]],
7044
- [
7045
- /\b(zur\d{3}) b/i
7046
- // Swiss ZUR Tablet
7047
- ],
7048
- [MODEL2, [VENDOR2, "Swiss"], [TYPE2, TABLET2]],
7049
- [
7050
- /^((zeki)?tb.*\b) b/i
7051
- // Zeki Tablets
7052
- ],
7053
- [MODEL2, [VENDOR2, "Zeki"], [TYPE2, TABLET2]],
7054
- [
7055
- /\b([yr]\d{2}) b/i,
7056
- /\b(?:dragon[- ]+touch |dt)(\w{5}) b/i
7057
- // Dragon Touch Tablet
7058
- ],
7059
- [MODEL2, [VENDOR2, "Dragon Touch"], [TYPE2, TABLET2]],
7060
- [
7061
- /\b(ns-?\w{0,9}) b/i
7062
- // Insignia Tablets
7063
- ],
7064
- [MODEL2, [VENDOR2, "Insignia"], [TYPE2, TABLET2]],
7065
- [
7066
- /\b((nxa|next)-?\w{0,9}) b/i
7067
- // NextBook Tablets
7068
- ],
7069
- [MODEL2, [VENDOR2, "NextBook"], [TYPE2, TABLET2]],
7070
- [
7071
- /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
7072
- // Voice Xtreme Phones
7073
- ],
7074
- [[VENDOR2, "Voice"], MODEL2, [TYPE2, MOBILE2]],
7075
- [
7076
- /\b(lvtel\-)?(v1[12]) b/i
7077
- // LvTel Phones
7078
- ],
7079
- [[VENDOR2, "LvTel"], MODEL2, [TYPE2, MOBILE2]],
7080
- [
7081
- /\b(ph-1) /i
7082
- // Essential PH-1
7083
- ],
7084
- [MODEL2, [VENDOR2, "Essential"], [TYPE2, MOBILE2]],
7085
- [
7086
- /\b(v(100md|700na|7011|917g).*\b) b/i
7087
- // Envizen Tablets
7088
- ],
7089
- [MODEL2, [VENDOR2, "Envizen"], [TYPE2, TABLET2]],
7090
- [
7091
- /\b(trio[-\w\. ]+) b/i
7092
- // MachSpeed Tablets
7093
- ],
7094
- [MODEL2, [VENDOR2, "MachSpeed"], [TYPE2, TABLET2]],
7095
- [
7096
- /\btu_(1491) b/i
7097
- // Rotor Tablets
7098
- ],
7099
- [MODEL2, [VENDOR2, "Rotor"], [TYPE2, TABLET2]]
7100
- ]
7101
- });
7102
- var Emails = Object.freeze({
7103
- browser: [
7104
- [
7105
- // Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
7106
- // Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
7107
- // ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
7108
- /((?: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,
7109
- // Apple's Mail
7110
- /(mail)\/([\w\.]+) cf/i
7111
- ],
7112
- [NAME2, VERSION4, [TYPE2, EMAIL]],
7113
- [
7114
- // Zimbra
7115
- /zdesktop\/([\w\.]+)/i
7116
- ],
7117
- [VERSION4, [NAME2, "Zimbra"], [TYPE2, EMAIL]]
7118
- ]
7119
- });
7120
- var Fetchers = Object.freeze({
7121
- browser: [
7122
- [
7123
- // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
7124
- // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
7125
- // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
7126
- // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
7127
- // DuckAssistBot - https://duckduckgo.com/duckassistbot/
7128
- // Google Site Verifier / Meta / Yahoo! Japan
7129
- // Iframely - https://iframely.com/docs/about
7130
- // Perplexity-User - https://docs.perplexity.ai/guides/bots
7131
- // MistralAI-User - https://docs.mistral.ai/robots/
7132
- // Yandex Bots - https://yandex.com/bots
7133
- /(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,
7134
- // Bluesky
7135
- /(bluesky) cardyb\/([\w\.]+)/i,
7136
- // Skype
7137
- /(skypeuripreview) preview\/([\w\.]+)/i,
7138
- // Slackbot - https://api.slack.com/robots
7139
- /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
7140
- // WhatsApp
7141
- /(whatsapp)\/([\w\.]+)/i
7142
- ],
7143
- [NAME2, VERSION4, [TYPE2, FETCHER]],
7144
- [
7145
- // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
7146
- /((?: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
7147
- ],
7148
- [NAME2, [TYPE2, FETCHER]]
7149
- ],
7150
- os: [
7151
- [/whatsapp\/[\d\.]+ (a|i)/i],
7152
- [[NAME2, (os) => os == "A" ? "Android" : "iOS"]]
7153
- ]
7154
- });
7155
- var InApps = Object.freeze({
7156
- browser: [
7157
- [
7158
- // Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
7159
- /\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
7160
- /(flipboard)\/([\w\.]+)/i
7161
- ],
7162
- [NAME2, VERSION4, [TYPE2, INAPP2]],
7163
- [
7164
- // Evernote/Teams on mobile
7165
- /(evernote) win/i,
7166
- /(teams)mobile-(ios|and)/i
7167
- ],
7168
- [NAME2, [TYPE2, INAPP2]],
7169
- [
7170
- // Slack
7171
- /chatlyio\/([\d\.]+)/i
7172
- ],
7173
- [VERSION4, [NAME2, "Slack"], [TYPE2, INAPP2]],
7174
- [
7175
- // TikTok Lite
7176
- /ultralite app_version\/([\w\.]+)/i
7177
- ],
7178
- [VERSION4, [NAME2, "TikTok Lite"], [TYPE2, INAPP2]],
7179
- [
7180
- // VS Code
7181
- /\) code\/([\d\.]+).+electron\//i
7182
- ],
7183
- [VERSION4, [NAME2, "VS Code"], [TYPE2, INAPP2]],
7184
- [
7185
- // Yahoo! Japan
7186
- /jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i
7187
- ],
7188
- [VERSION4, [NAME2, "Yahoo! Japan"], [TYPE2, INAPP2]]
7189
- ]
7190
- });
7191
- var MediaPlayers = Object.freeze({
7192
- browser: [
7193
- [
7194
- /(apple(?:coremedia|tv))\/([\w\._]+)/i,
7195
- // Generic Apple CoreMedia
7196
- /(coremedia) v([\w\._]+)/i,
7197
- // Ares/Nexplayer/OSSProxy
7198
- /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
7199
- // Aqualung/Lyssna/BSPlayer/Clementine/MPD
7200
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
7201
- // NSPlayer/PSP-InternetRadioPlayer/Videos
7202
- // Nero Home/Nero Scout/Nokia
7203
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
7204
- // SoundTap/Totem/Stagefright/Streamium
7205
- // XBMC/gvfs/Xine/XMMS/irapp
7206
- /^(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,
7207
- /(lg player|nexplayer) ([\d\.]+)/i,
7208
- /player\/(nexplayer|lg player) ([\w\.-]+)/i,
7209
- // NexPlayer/LG Player
7210
- /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i,
7211
- // Gstreamer
7212
- /(htc streaming player) [\w_]+ \/ ([\d\.]+)/i,
7213
- // HTC Streaming Player
7214
- /(lavf)([\d\.]+)/i,
7215
- // Lavf (FFMPEG)
7216
- // MPlayer SVN
7217
- /(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
7218
- / (songbird)\/([\w\.-]+)/i,
7219
- // Songbird/Philips-Songbird
7220
- /(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i,
7221
- // Winamp
7222
- /(vlc)(?:\/| media player - version )([\w\.-]+)/i,
7223
- // VLC Videolan
7224
- /^(foobar2000|itunes|smp)\/([\d\.]+)/i,
7225
- // Foobar2000/iTunes/SMP
7226
- /com\.(riseupradioalarm)\/([\d\.]*)/i,
7227
- // RiseUP Radio Alarm
7228
- /(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i,
7229
- // MPlayer
7230
- // Windows Media Server
7231
- /(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
7232
- ],
7233
- [NAME2, VERSION4, [TYPE2, MEDIAPLAYER]],
7234
- [
7235
- /(flrp)\/([\w\.-]+)/i
7236
- // Flip Player
7237
- ],
7238
- [[NAME2, "Flip Player"], VERSION4, [TYPE2, MEDIAPLAYER]],
7239
- [
7240
- // FStream/NativeHost/QuerySeekSpider
7241
- // MPlayer (no other info)/Media Player Classic/Nero ShowTime
7242
- // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
7243
- // inlight radio / YourMuze
7244
- /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
7245
- ],
7246
- [NAME2, [TYPE2, MEDIAPLAYER]],
7247
- [
7248
- /(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i
7249
- // HTC One S / Windows Media Player
7250
- ],
7251
- [[NAME2, /[_-]/g, " "], VERSION4, [TYPE2, MEDIAPLAYER]],
7252
- [
7253
- /(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i
7254
- // Rad.io
7255
- ],
7256
- [[NAME2, "rad.io"], VERSION4, [TYPE2, MEDIAPLAYER]]
7257
- ]
7258
- });
7259
- var Libraries = Object.freeze({
7260
- browser: [
7261
- // 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
7262
- [
7263
- /^(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,
7264
- /(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
7265
- /(nutch)-([\w\.-]+)(\(|$)/i,
7266
- /\((java)\/([\w\.]+)/i
7267
- ],
7268
- [NAME2, VERSION4, [TYPE2, LIBRARY]]
7269
- ]
7270
- });
7271
- var Vehicles = Object.freeze({
7272
- device: [
7273
- [/aftlbt962e2/i],
7274
- // BMW
7275
- [[VENDOR2, "BMW"]],
7276
- [/dilink.+(byd) auto/i],
7277
- // BYD
7278
- [VENDOR2],
7279
- [/aftlft962x3/i],
7280
- // Jeep
7281
- [[VENDOR2, "Jeep"], [MODEL2, "Wagooner"]],
7282
- [/(rivian) (r1t)/i],
7283
- // Rivian
7284
- [VENDOR2, MODEL2],
7285
- [/vcc.+netfront/i],
7286
- // Volvo
7287
- [[VENDOR2, "Volvo"]]
7288
- ]
7289
- });
7290
- var Bots = Object.freeze({
7291
- browser: [
7292
- ...CLIs.browser,
7293
- ...Fetchers.browser,
7294
- ...Crawlers.browser,
7295
- ...Libraries.browser
7296
- ],
7297
- os: [
7298
- ...Fetchers.os
7299
- ]
7300
- });
7301
-
7302
- // ../../node_modules/.pnpm/detect-europe-js@0.1.2/node_modules/detect-europe-js/dist/esm/index.js
7303
- var TIMEZONE = {
7304
- ANDORRA: {
7305
- ANDORRA: "Europe/Andorra"
7306
- },
7307
- AUSTRIA: {
7308
- VIENNA: "Europe/Vienna"
7309
- },
7310
- BELGIUM: {
7311
- BRUSSELS: "Europe/Brussels"
7312
- },
7313
- BULGARIA: {
7314
- SOFIA: "Europe/Sofia"
7315
- },
7316
- CROATIA: {
7317
- ZAGREB: "Europe/Zagreb"
7318
- },
7319
- CYPRUS: {
7320
- NICOSIA_EUROPE: "Europe/Nicosia",
7321
- NICOSIA_ASIA: "Asia/Nicosia",
7322
- FAMAGUSTA: "Asia/Famagusta"
7323
- },
7324
- CZECHIA: {
7325
- PRAGUE: "Europe/Prague"
7326
- },
7327
- DENMARK: {
7328
- COPENHAGEN: "Europe/Copenhagen",
7329
- FAROE: "Atlantic/Faroe"
7330
- },
7331
- ESTONIA: {
7332
- TALLINN: "Europe/Tallinn"
7333
- },
7334
- FINLAND: {
7335
- HELSINKI: "Europe/Helsinki",
7336
- MARIEHAMN: "Europe/Mariehamn"
7337
- },
7338
- FRANCE: {
7339
- PARIS: "Europe/Paris",
7340
- CAYENNE: "America/Cayenne",
7341
- GUADELOUPE: "America/Guadeloupe",
7342
- MARIGOT: "America/Marigot",
7343
- MARTINIQUE: "America/Martinique",
7344
- MAYOTTE: "Indian/Mayotte",
7345
- REUNION: "Indian/Reunion"
7346
- },
7347
- GERMANY: {
7348
- BERLIN: "Europe/Berlin",
7349
- BUSINGEN: "Europe/Busingen"
7350
- },
7351
- GREECE: {
7352
- ATHENS: "Europe/Athens"
7353
- },
7354
- HUNGARY: {
7355
- BUDAPEST: "Europe/Budapest"
7356
- },
7357
- ICELAND: {
7358
- REYKJAVIK: "Atlantic/Reykjavik"
7359
- },
7360
- IRELAND: {
7361
- DUBLIN: "Europe/Dublin"
7362
- },
7363
- ITALY: {
7364
- ROME: "Europe/Rome"
7365
- },
7366
- LATVIA: {
7367
- RIGA: "Europe/Riga"
7368
- },
7369
- LIECHTENSTEIN: {
7370
- VADUZ: "Europe/Vaduz"
7371
- },
7372
- LITHUANIA: {
7373
- VILNIUS: "Europe/Vilnius"
7374
- },
7375
- LUXEMBOURG: {
7376
- LUXEMBOURG: "Europe/Luxembourg"
7377
- },
7378
- MALTA: {
7379
- MALTA: "Europe/Malta"
7380
- },
7381
- MONACO: {
7382
- MONACO: "Europe/Monaco"
7383
- },
7384
- NETHERLANDS: {
7385
- AMSTERDAM: "Europe/Amsterdam",
7386
- ARUBA: "America/Aruba",
7387
- CURACAO: "America/Curacao",
7388
- KRALENDIJK: "America/Kralendijk",
7389
- LOWER_PRINCES: "America/Lower_Princes"
7390
- },
7391
- NORWAY: {
7392
- OSLO: "Europe/Oslo",
7393
- JAN_MAYEN: "Atlantic/Jan_Mayen",
7394
- LONGYEARBYEN: "Arctic/Longyearbyen"
7395
- },
7396
- POLAND: {
7397
- WARSAW: "Europe/Warsaw"
7398
- },
7399
- PORTUGAL: {
7400
- LISBON: "Europe/Lisbon",
7401
- AZORES: "Atlantic/Azores",
7402
- MADEIRA: "Atlantic/Madeira"
7403
- },
7404
- ROMANIA: {
7405
- BUCHAREST: "Europe/Bucharest"
7406
- },
7407
- SAN_MARINO: {
7408
- SAN_MARINO: "Europe/San_Marino"
7409
- },
7410
- SLOVAKIA: {
7411
- BRATISLAVA: "Europe/Bratislava"
7412
- },
7413
- SLOVENIA: {
7414
- LJUBLJANA: "Europe/Ljubljana"
7415
- },
7416
- SPAIN: {
7417
- MADRID: "Europe/Madrid",
7418
- CANARY: "Atlantic/Canary",
7419
- CEUTA: "Africa/Ceuta"
7420
- },
7421
- SWEDEN: {
7422
- STOCKHOLM: "Europe/Stockholm"
7423
- },
7424
- SWITZERLAND: {
7425
- ZURICH: "Europe/Zurich"
7426
- },
7427
- VATICAN: {
7428
- VATICAN: "Europe/Vatican"
7429
- }
7430
- };
7431
- var EU_TIMEZONE = [
7432
- TIMEZONE.AUSTRIA.VIENNA,
7433
- TIMEZONE.BELGIUM.BRUSSELS,
7434
- TIMEZONE.BULGARIA.SOFIA,
7435
- TIMEZONE.CROATIA.ZAGREB,
7436
- TIMEZONE.CYPRUS.NICOSIA_EUROPE,
7437
- TIMEZONE.CYPRUS.NICOSIA_ASIA,
7438
- TIMEZONE.CYPRUS.FAMAGUSTA,
7439
- TIMEZONE.CZECHIA.PRAGUE,
7440
- TIMEZONE.DENMARK.COPENHAGEN,
7441
- TIMEZONE.ESTONIA.TALLINN,
7442
- TIMEZONE.FINLAND.HELSINKI,
7443
- TIMEZONE.FINLAND.MARIEHAMN,
7444
- TIMEZONE.FRANCE.PARIS,
7445
- TIMEZONE.GERMANY.BERLIN,
7446
- TIMEZONE.GREECE.ATHENS,
7447
- TIMEZONE.HUNGARY.BUDAPEST,
7448
- TIMEZONE.IRELAND.DUBLIN,
7449
- TIMEZONE.ITALY.ROME,
7450
- TIMEZONE.LATVIA.RIGA,
7451
- TIMEZONE.LITHUANIA.VILNIUS,
7452
- TIMEZONE.LUXEMBOURG.LUXEMBOURG,
7453
- TIMEZONE.MALTA.MALTA,
7454
- TIMEZONE.NETHERLANDS.AMSTERDAM,
7455
- TIMEZONE.POLAND.WARSAW,
7456
- TIMEZONE.PORTUGAL.LISBON,
7457
- TIMEZONE.ROMANIA.BUCHAREST,
7458
- TIMEZONE.SLOVAKIA.BRATISLAVA,
7459
- TIMEZONE.SLOVENIA.LJUBLJANA,
7460
- TIMEZONE.SPAIN.MADRID,
7461
- TIMEZONE.SWEDEN.STOCKHOLM,
7462
- TIMEZONE.FRANCE.CAYENNE,
7463
- TIMEZONE.FRANCE.GUADELOUPE,
7464
- TIMEZONE.FRANCE.MARIGOT,
7465
- TIMEZONE.FRANCE.MARTINIQUE,
7466
- TIMEZONE.FRANCE.MAYOTTE,
7467
- TIMEZONE.FRANCE.REUNION,
7468
- TIMEZONE.PORTUGAL.AZORES,
7469
- TIMEZONE.PORTUGAL.MADEIRA,
7470
- TIMEZONE.SPAIN.CANARY
7471
- ];
7472
- var EEA_EFTA_TIMEZONE = [
7473
- TIMEZONE.ICELAND.REYKJAVIK,
7474
- TIMEZONE.LIECHTENSTEIN.VADUZ,
7475
- TIMEZONE.NORWAY.OSLO,
7476
- TIMEZONE.NORWAY.JAN_MAYEN
7477
- ];
7478
- var EEA_TIMEZONE = [
7479
- ...EU_TIMEZONE,
7480
- ...EEA_EFTA_TIMEZONE
7481
- ];
7482
- var EFTA_TIMEZONE = [
7483
- TIMEZONE.SWITZERLAND.ZURICH,
7484
- ...EEA_EFTA_TIMEZONE
7485
- ];
7486
- var SCHENGEN_TIMEZONE = [
7487
- TIMEZONE.AUSTRIA.VIENNA,
7488
- TIMEZONE.BELGIUM.BRUSSELS,
7489
- TIMEZONE.BULGARIA.SOFIA,
7490
- TIMEZONE.CROATIA.ZAGREB,
7491
- TIMEZONE.CZECHIA.PRAGUE,
7492
- TIMEZONE.DENMARK.COPENHAGEN,
7493
- TIMEZONE.ESTONIA.TALLINN,
7494
- TIMEZONE.FINLAND.HELSINKI,
7495
- TIMEZONE.FINLAND.MARIEHAMN,
7496
- TIMEZONE.FRANCE.PARIS,
7497
- TIMEZONE.GERMANY.BERLIN,
7498
- TIMEZONE.GREECE.ATHENS,
7499
- TIMEZONE.HUNGARY.BUDAPEST,
7500
- TIMEZONE.ITALY.ROME,
7501
- TIMEZONE.LATVIA.RIGA,
7502
- TIMEZONE.LITHUANIA.VILNIUS,
7503
- TIMEZONE.LUXEMBOURG.LUXEMBOURG,
7504
- TIMEZONE.MALTA.MALTA,
7505
- TIMEZONE.NETHERLANDS.AMSTERDAM,
7506
- TIMEZONE.POLAND.WARSAW,
7507
- TIMEZONE.PORTUGAL.LISBON,
7508
- TIMEZONE.PORTUGAL.AZORES,
7509
- TIMEZONE.PORTUGAL.MADEIRA,
7510
- TIMEZONE.ROMANIA.BUCHAREST,
7511
- TIMEZONE.SLOVAKIA.BRATISLAVA,
7512
- TIMEZONE.SLOVENIA.LJUBLJANA,
7513
- TIMEZONE.SPAIN.MADRID,
7514
- TIMEZONE.SPAIN.CANARY,
7515
- TIMEZONE.SWEDEN.STOCKHOLM,
7516
- TIMEZONE.ANDORRA.ANDORRA,
7517
- TIMEZONE.GERMANY.BUSINGEN,
7518
- TIMEZONE.ICELAND.REYKJAVIK,
7519
- TIMEZONE.LIECHTENSTEIN.VADUZ,
7520
- TIMEZONE.MONACO.MONACO,
7521
- TIMEZONE.NORWAY.OSLO,
7522
- TIMEZONE.SAN_MARINO.SAN_MARINO,
7523
- TIMEZONE.SPAIN.CEUTA,
7524
- TIMEZONE.SWITZERLAND.ZURICH,
7525
- TIMEZONE.VATICAN.VATICAN
7526
- ];
7527
-
7528
- // ../../node_modules/.pnpm/is-standalone-pwa@0.1.1/node_modules/is-standalone-pwa/dist/esm/index.js
7529
- function isStandalonePWA() {
7530
- var _a;
7531
- 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"));
7532
- }
7533
-
7534
- // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/helpers/ua-parser-helpers.mjs
7535
- var { Crawler } = Extension.BrowserName;
7536
- var toResult = (value, head, ext) => typeof value === "string" ? UAParser(value, head, ext) : value;
7537
- var isAppleSilicon = (resultOrUA) => {
7538
- const res = toResult(resultOrUA);
7539
- if (res.os.is(OSName.MACOS)) {
7540
- if (res.cpu.is(CPUArch.ARM)) {
7541
- return true;
7542
4508
  }
7543
- if (typeof resultOrUA !== "string" && typeof window !== "undefined") {
7544
- try {
7545
- const canvas = document.createElement("canvas");
7546
- const webgl = canvas.getContext("webgl2") || canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
7547
- const debug = webgl.getExtension("WEBGL_debug_renderer_info");
7548
- const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
7549
- if (renderer.match(/apple m\d/i)) {
7550
- return true;
7551
- }
7552
- } catch (e) {
7553
- return false;
7554
- }
4509
+ if (status === 404) {
4510
+ return new TagadaApiError(serverMessage, 404, {
4511
+ code: TagadaErrorCode.NOT_FOUND,
4512
+ retryable: false
4513
+ });
7555
4514
  }
4515
+ return new TagadaApiError(serverMessage, status != null ? status : 0, {
4516
+ code: (_e = data == null ? void 0 : data.code) != null ? _e : TagadaErrorCode.API_ERROR,
4517
+ details: data,
4518
+ retryable: (status != null ? status : 0) >= 500
4519
+ });
7556
4520
  }
7557
- return false;
7558
4521
  };
7559
- var isBot = (resultOrUA) => [
7560
- BrowserType.CLI,
7561
- BrowserType.CRAWLER,
7562
- BrowserType.FETCHER,
7563
- BrowserType.LIBRARY
7564
- ].includes(toResult(resultOrUA, Bots).browser.type);
7565
- var isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
7566
4522
 
7567
4523
  // src/v2/core/utils/deviceInfo.ts
7568
4524
  function getScreenResolution() {
7569
- return {
7570
- width: window.screen.width,
7571
- height: window.screen.height
7572
- };
4525
+ return { width: window.screen.width, height: window.screen.height };
7573
4526
  }
7574
4527
  function getTimeZone() {
7575
4528
  try {
7576
4529
  return Intl.DateTimeFormat().resolvedOptions().timeZone;
7577
- } catch (error) {
7578
- console.error("Failed to get timezone:", error);
4530
+ } catch (e) {
7579
4531
  return "UTC";
7580
4532
  }
7581
4533
  }
7582
4534
  function getBrowserLocale() {
7583
4535
  try {
7584
4536
  return navigator.language || "en-US";
7585
- } catch (error) {
7586
- console.error("Failed to get browser locale:", error);
4537
+ } catch (e) {
7587
4538
  return "en-US";
7588
4539
  }
7589
4540
  }
4541
+ var UA = typeof navigator !== "undefined" ? navigator.userAgent : "";
4542
+ function match(ua, ...patterns) {
4543
+ for (const p of patterns) {
4544
+ const m = ua.match(p);
4545
+ if (m) return m;
4546
+ }
4547
+ return null;
4548
+ }
4549
+ function parseBrowser(ua) {
4550
+ const tests = [
4551
+ [/EdgA?\/([\d.]+)/i, "Edge"],
4552
+ [/OPR\/([\d.]+)/i, "Opera"],
4553
+ [/Brave\/([\d.]+)/i, "Brave"],
4554
+ [/Vivaldi\/([\d.]+)/i, "Vivaldi"],
4555
+ [/SamsungBrowser\/([\d.]+)/i, "Samsung Internet"],
4556
+ [/UCBrowser\/([\d.]+)/i, "UC Browser"],
4557
+ [/Firefox\/([\d.]+)/i, "Firefox"],
4558
+ [/CriOS\/([\d.]+)/i, "Chrome"],
4559
+ // Chrome on iOS
4560
+ [/FxiOS\/([\d.]+)/i, "Firefox"],
4561
+ // Firefox on iOS
4562
+ [/Chrome\/([\d.]+)/i, "Chrome"],
4563
+ [/Version\/([\d.]+).*Safari/i, "Safari"],
4564
+ [/Safari\/([\d.]+)/i, "Safari"]
4565
+ ];
4566
+ for (const [re, name] of tests) {
4567
+ const m = ua.match(re);
4568
+ if (m) {
4569
+ const version = m[1] || "";
4570
+ return { name, version, major: version.split(".")[0] || "" };
4571
+ }
4572
+ }
4573
+ return { name: "", version: "", major: "" };
4574
+ }
4575
+ function parseOS(ua) {
4576
+ const m = match(ua, /Windows NT ([\d.]+)/i) || match(ua, /Mac OS X ([\d_.]+)/i) || match(ua, /Android ([\d.]+)/i) || match(ua, /iPhone OS ([\d_]+)/i) || match(ua, /iPad.*OS ([\d_]+)/i) || match(ua, /CrOS[\w ]*\/([\d.]+)/i) || match(ua, /Linux/i);
4577
+ if (!m) return { name: "", version: "" };
4578
+ const raw = m[0];
4579
+ const version = (m[1] || "").replace(/_/g, ".");
4580
+ if (/Windows/i.test(raw)) {
4581
+ const ntMap = {
4582
+ "10.0": "10",
4583
+ "6.3": "8.1",
4584
+ "6.2": "8",
4585
+ "6.1": "7",
4586
+ "6.0": "Vista",
4587
+ "5.1": "XP"
4588
+ };
4589
+ return { name: "Windows", version: ntMap[version] || version };
4590
+ }
4591
+ if (/Mac OS X/i.test(raw)) return { name: "macOS", version };
4592
+ if (/Android/i.test(raw)) return { name: "Android", version };
4593
+ if (/iPhone|iPad/i.test(raw)) return { name: "iOS", version };
4594
+ if (/CrOS/i.test(raw)) return { name: "Chrome OS", version };
4595
+ if (/Linux/i.test(raw)) return { name: "Linux", version: "" };
4596
+ return { name: "", version: "" };
4597
+ }
4598
+ function parseDevice(ua) {
4599
+ var _a;
4600
+ if (/iPad/i.test(ua)) return { type: "tablet", vendor: "Apple", model: "iPad" };
4601
+ if (/iPhone/i.test(ua)) return { type: "mobile", vendor: "Apple", model: "iPhone" };
4602
+ if (/iPod/i.test(ua)) return { type: "mobile", vendor: "Apple", model: "iPod" };
4603
+ if (/Android/i.test(ua)) {
4604
+ const m = ua.match(/Android[\s\d.]+;\s*([^)]+?)(?:\s+Build)/i);
4605
+ const mobile = /Mobile/i.test(ua);
4606
+ return { type: mobile ? "mobile" : "tablet", model: (_a = m == null ? void 0 : m[1]) == null ? void 0 : _a.trim() };
4607
+ }
4608
+ return void 0;
4609
+ }
4610
+ function parseEngine(ua) {
4611
+ const m = match(ua, /AppleWebKit\/([\d.]+)/i) || match(ua, /Gecko\/([\d.]+)/i) || match(ua, /Trident\/([\d.]+)/i) || match(ua, /Presto\/([\d.]+)/i);
4612
+ if (!m) return { name: "", version: "" };
4613
+ const raw = m[0];
4614
+ const version = m[1] || "";
4615
+ if (/AppleWebKit/i.test(raw)) return { name: "WebKit", version };
4616
+ if (/Gecko/i.test(raw)) return { name: "Gecko", version };
4617
+ if (/Trident/i.test(raw)) return { name: "Trident", version };
4618
+ if (/Presto/i.test(raw)) return { name: "Presto", version };
4619
+ return { name: "", version: "" };
4620
+ }
4621
+ function parseCPU(ua) {
4622
+ if (/x86_64|x64|amd64|Win64/i.test(ua)) return { architecture: "amd64" };
4623
+ if (/ia32|x86/i.test(ua)) return { architecture: "ia32" };
4624
+ if (/aarch64|arm64/i.test(ua)) return { architecture: "arm64" };
4625
+ if (/arm/i.test(ua)) return { architecture: "arm" };
4626
+ return { architecture: "" };
4627
+ }
4628
+ function detectIsBot() {
4629
+ if (navigator.webdriver) return true;
4630
+ return /bot|crawl|spider|slurp|Googlebot|bingbot|yandex|baidu|duckduck|facebookexternalhit|Twitterbot|linkedinbot|embedly|quora|pinterest|redditbot|Slackbot|Discordbot|WhatsApp|TelegramBot|Applebot/i.test(UA);
4631
+ }
4632
+ function detectIsChromeFamily(browserName) {
4633
+ return /Chrome|Chromium|Edge|Brave|Opera|Vivaldi|Arc/i.test(browserName);
4634
+ }
4635
+ function detectIsStandalonePWA() {
4636
+ return window.matchMedia("(display-mode: standalone)").matches || navigator.standalone === true;
4637
+ }
4638
+ function detectIsAppleSilicon(osName) {
4639
+ if (!/mac/i.test(osName)) return false;
4640
+ return navigator.maxTouchPoints > 0;
4641
+ }
7590
4642
  function collectDeviceInfo() {
7591
4643
  if (typeof window === "undefined") {
7592
4644
  return {
@@ -7600,68 +4652,34 @@ var TagadaTrackerBundle = (() => {
7600
4652
  },
7601
4653
  screenResolution: { width: 0, height: 0 },
7602
4654
  timeZone: "UTC",
7603
- flags: {
7604
- isBot: false,
7605
- isChromeFamily: false,
7606
- isStandalonePWA: false,
7607
- isAppleSilicon: false
7608
- }
4655
+ flags: { isBot: false, isChromeFamily: false, isStandalonePWA: false, isAppleSilicon: false }
7609
4656
  };
7610
4657
  }
7611
- const parser = new UAParser();
7612
- const result = parser.getResult();
4658
+ const browser = parseBrowser(UA);
4659
+ const os = parseOS(UA);
4660
+ const device = parseDevice(UA);
4661
+ const engine = parseEngine(UA);
4662
+ const cpu = parseCPU(UA);
7613
4663
  let flags;
7614
4664
  try {
7615
4665
  flags = {
7616
- isBot: isBot(result),
7617
- isChromeFamily: isChromeFamily(result),
7618
- isStandalonePWA: isStandalonePWA(),
7619
- isAppleSilicon: isAppleSilicon(result)
7620
- };
7621
- } catch (error) {
7622
- console.error("Failed to compute device flags:", error);
7623
- flags = {
7624
- isBot: false,
7625
- isChromeFamily: false,
7626
- isStandalonePWA: false,
7627
- isAppleSilicon: false
4666
+ isBot: detectIsBot(),
4667
+ isChromeFamily: detectIsChromeFamily(browser.name),
4668
+ isStandalonePWA: detectIsStandalonePWA(),
4669
+ isAppleSilicon: detectIsAppleSilicon(os.name)
7628
4670
  };
4671
+ } catch (e) {
4672
+ flags = { isBot: false, isChromeFamily: false, isStandalonePWA: false, isAppleSilicon: false };
7629
4673
  }
7630
4674
  return {
7631
- userAgent: {
7632
- name: result.ua,
7633
- browser: {
7634
- major: result.browser.major || "",
7635
- name: result.browser.name || "",
7636
- version: result.browser.version || "",
7637
- type: result.browser.type
7638
- },
7639
- os: {
7640
- name: result.os.name || "",
7641
- version: result.os.version || ""
7642
- },
7643
- device: result.device.model || result.device.type || result.device.vendor ? {
7644
- model: result.device.model,
7645
- type: result.device.type,
7646
- vendor: result.device.vendor
7647
- } : void 0,
7648
- engine: {
7649
- name: result.engine.name || "",
7650
- version: result.engine.version || ""
7651
- },
7652
- cpu: {
7653
- architecture: result.cpu.architecture || ""
7654
- }
7655
- },
4675
+ userAgent: { name: UA, browser, os, device, engine, cpu },
7656
4676
  screenResolution: getScreenResolution(),
7657
4677
  timeZone: getTimeZone(),
7658
4678
  flags
7659
4679
  };
7660
4680
  }
7661
4681
  function getUrlParams() {
7662
- if (typeof window === "undefined") {
7663
- return {};
7664
- }
4682
+ if (typeof window === "undefined") return {};
7665
4683
  const params = new URLSearchParams(window.location.search);
7666
4684
  return {
7667
4685
  locale: params.get("locale") || void 0,
@@ -7890,9 +4908,21 @@ var TagadaTrackerBundle = (() => {
7890
4908
  }
7891
4909
  };
7892
4910
  var getMetaContent = (name) => {
4911
+ if (typeof document === "undefined") return void 0;
7893
4912
  const metaTag = document.querySelector('meta[name="'.concat(name, '"]'));
7894
4913
  return (metaTag == null ? void 0 : metaTag.getAttribute("content")) || void 0;
7895
4914
  };
4915
+ var readWindowConfig = () => {
4916
+ if (typeof window !== "undefined" && window.__TAGADA_PLUGIN_CONFIG__) {
4917
+ return window.__TAGADA_PLUGIN_CONFIG__;
4918
+ }
4919
+ try {
4920
+ const encoded = getMetaContent("x-plugin-config");
4921
+ if (encoded) return JSON.parse(decodeURIComponent(encoded));
4922
+ } catch (e) {
4923
+ }
4924
+ return {};
4925
+ };
7896
4926
  var loadProductionConfig = async () => {
7897
4927
  try {
7898
4928
  if (typeof document === "undefined") {
@@ -7904,16 +4934,7 @@ var TagadaTrackerBundle = (() => {
7904
4934
  return null;
7905
4935
  }
7906
4936
  const basePath = getMetaContent("x-plugin-base-path") || "/";
7907
- let config = {};
7908
- try {
7909
- const encodedConfig = getMetaContent("x-plugin-config");
7910
- if (encodedConfig) {
7911
- const decodedConfig = decodeURIComponent(encodedConfig);
7912
- config = JSON.parse(decodedConfig);
7913
- }
7914
- } catch (error) {
7915
- console.warn("\u26A0\uFE0F Failed to parse plugin config from meta tag:", error);
7916
- }
4937
+ const config = readWindowConfig();
7917
4938
  if (!accountId) {
7918
4939
  console.warn("\u26A0\uFE0F Plugin config: Account ID not found in meta tags");
7919
4940
  }
@@ -8584,7 +5605,7 @@ var TagadaTrackerBundle = (() => {
8584
5605
  if (this.state.debugMode) {
8585
5606
  console.log("[TagadaClient ".concat(this.instanceId, "] Initializing session..."), { sessionId: sessionData.sessionId });
8586
5607
  }
8587
- const deviceInfo = collectDeviceInfo();
5608
+ const deviceInfo = await collectDeviceInfo();
8588
5609
  const urlParams = getUrlParams();
8589
5610
  const browserLocale = getBrowserLocale();
8590
5611
  const draft = isDraftMode();
@@ -8651,7 +5672,7 @@ var TagadaTrackerBundle = (() => {
8651
5672
  }
8652
5673
  }
8653
5674
  updateSessionState(response, sessionData) {
8654
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
5675
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
8655
5676
  if (response.store) {
8656
5677
  const storeData = response.store;
8657
5678
  const storeConfig = __spreadProps(__spreadValues({}, response.store), {
@@ -8689,8 +5710,10 @@ var TagadaTrackerBundle = (() => {
8689
5710
  customer: (_g = response.customer) != null ? _g : null,
8690
5711
  auth: authState
8691
5712
  });
8692
- if (this.funnel && sessionData.customerId && ((_h = response.store) == null ? void 0 : _h.id)) {
8693
- const accountId = response.store.accountId || ((_i = this.state.pluginConfig) == null ? void 0 : _i.accountId) || sessionData.accountId || "";
5713
+ const funnelFeature = (_h = this.config.features) == null ? void 0 : _h.funnel;
5714
+ const skipAutoInit = typeof funnelFeature === "object" && funnelFeature.skipAutoInit;
5715
+ if (this.funnel && !skipAutoInit && sessionData.customerId && ((_i = response.store) == null ? void 0 : _i.id)) {
5716
+ const accountId = response.store.accountId || ((_j = this.state.pluginConfig) == null ? void 0 : _j.accountId) || sessionData.accountId || "";
8694
5717
  if (accountId) {
8695
5718
  const urlParams = new URLSearchParams(typeof window !== "undefined" ? window.location.search : "");
8696
5719
  const funnelId = urlParams.get("funnelId") || void 0;
@@ -9017,18 +6040,87 @@ var TagadaTrackerBundle = (() => {
9017
6040
  };
9018
6041
 
9019
6042
  // src/v2/standalone/index.ts
9020
- init_funnel();
9021
-
9022
- // src/v2/core/utils/index.ts
9023
- init_sessionStorage();
9024
-
9025
- // src/v2/standalone/index.ts
6043
+ init_funnelClient();
6044
+ function parseStepConfigScripts() {
6045
+ if (typeof window === "undefined" || typeof document === "undefined") {
6046
+ return [];
6047
+ }
6048
+ const stepConfig = getAssignedStepConfig();
6049
+ if (stepConfig == null ? void 0 : stepConfig.scripts) {
6050
+ return stepConfig.scripts.filter((s) => s.enabled);
6051
+ }
6052
+ return [];
6053
+ }
6054
+ function injectScript(script, index) {
6055
+ const position = script.position || "body-end";
6056
+ const scriptId = "tagada-stepconfig-script-".concat(index);
6057
+ if (document.getElementById(scriptId)) {
6058
+ return;
6059
+ }
6060
+ let scriptBody = script.content.trim();
6061
+ const scriptTagMatch = scriptBody.match(/^<script[^>]*>([\s\S]*)<\/script>$/i);
6062
+ if (scriptTagMatch) {
6063
+ scriptBody = scriptTagMatch[1].trim();
6064
+ }
6065
+ if (!scriptBody) return;
6066
+ const wrappedScript = "(function() {\n try {\n // Script: " + script.name + "\n" + scriptBody + '\n } catch (error) {\n console.error("[TagadaPay] StepConfig script error:", error);\n }\n})();';
6067
+ const scriptElement = document.createElement("script");
6068
+ scriptElement.id = scriptId;
6069
+ scriptElement.setAttribute("data-tagada-stepconfig-script", "true");
6070
+ scriptElement.setAttribute("data-script-name", script.name);
6071
+ scriptElement.textContent = wrappedScript;
6072
+ switch (position) {
6073
+ case "head-start":
6074
+ if (document.head.firstChild) {
6075
+ document.head.insertBefore(scriptElement, document.head.firstChild);
6076
+ } else {
6077
+ document.head.appendChild(scriptElement);
6078
+ }
6079
+ break;
6080
+ case "head-end":
6081
+ document.head.appendChild(scriptElement);
6082
+ break;
6083
+ case "body-start":
6084
+ if (document.body.firstChild) {
6085
+ document.body.insertBefore(scriptElement, document.body.firstChild);
6086
+ } else {
6087
+ document.body.appendChild(scriptElement);
6088
+ }
6089
+ break;
6090
+ case "body-end":
6091
+ default:
6092
+ document.body.appendChild(scriptElement);
6093
+ break;
6094
+ }
6095
+ }
6096
+ function injectStepConfigScripts() {
6097
+ const scripts = parseStepConfigScripts();
6098
+ if (scripts.length === 0) return;
6099
+ scripts.forEach((script, index) => {
6100
+ injectScript(script, index);
6101
+ });
6102
+ }
6103
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
6104
+ const runInjection = () => {
6105
+ if (document.body) {
6106
+ injectStepConfigScripts();
6107
+ } else {
6108
+ document.addEventListener("DOMContentLoaded", injectStepConfigScripts, { once: true });
6109
+ }
6110
+ };
6111
+ if ("requestIdleCallback" in window) {
6112
+ window.requestIdleCallback(runInjection, { timeout: 100 });
6113
+ } else {
6114
+ setTimeout(runInjection, 0);
6115
+ }
6116
+ }
9026
6117
  function createTagadaClient(config = {}) {
9027
6118
  return new TagadaClient(config);
9028
6119
  }
9029
6120
 
9030
6121
  // src/v2/standalone/external-tracker.ts
9031
6122
  init_tokenStorage();
6123
+ var TRACKER_VERSION = "1.0.0";
9032
6124
  function getUrlParam(name) {
9033
6125
  if (typeof window === "undefined") return null;
9034
6126
  const params = new URLSearchParams(window.location.search);
@@ -9039,58 +6131,133 @@ var TagadaTrackerBundle = (() => {
9039
6131
  console.log("[TagadaTracker]", ...args);
9040
6132
  }
9041
6133
  }
6134
+ function warn(...args) {
6135
+ console.warn("[TagadaTracker]", ...args);
6136
+ }
6137
+ function validate(config) {
6138
+ if (!config.storeId || typeof config.storeId !== "string") {
6139
+ throw new Error("TagadaTracker: storeId is required and must be a non-empty string.");
6140
+ }
6141
+ if (!config.accountId || typeof config.accountId !== "string") {
6142
+ throw new Error("TagadaTracker: accountId is required and must be a non-empty string.");
6143
+ }
6144
+ if (!config.stepId || typeof config.stepId !== "string") {
6145
+ throw new Error("TagadaTracker: stepId is required and must be a non-empty string.");
6146
+ }
6147
+ if (config.apiBaseUrl) {
6148
+ try {
6149
+ new URL(config.apiBaseUrl);
6150
+ } catch (e) {
6151
+ throw new Error('TagadaTracker: apiBaseUrl is not a valid URL: "'.concat(config.apiBaseUrl, '"'));
6152
+ }
6153
+ }
6154
+ }
6155
+ async function retryWithBackoff(fn, maxRetries, debug) {
6156
+ let lastError;
6157
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
6158
+ try {
6159
+ return await fn();
6160
+ } catch (err) {
6161
+ lastError = err instanceof Error ? err : new Error(String(err));
6162
+ if (attempt < maxRetries) {
6163
+ const delay = Math.min(1e3 * 2 ** attempt, 8e3);
6164
+ log(debug, "Retry ".concat(attempt + 1, "/").concat(maxRetries, " in ").concat(delay, "ms..."));
6165
+ await new Promise((r) => setTimeout(r, delay));
6166
+ }
6167
+ }
6168
+ }
6169
+ throw lastError;
6170
+ }
9042
6171
  var TagadaExternalTracker = class {
9043
6172
  constructor() {
9044
6173
  this.config = null;
9045
6174
  this.client = null;
9046
6175
  this.initialized = false;
9047
6176
  this.initializing = false;
6177
+ this.unsubscribe = null;
6178
+ /** Tracker version */
6179
+ this.version = TRACKER_VERSION;
9048
6180
  }
9049
6181
  /**
9050
- * Initialize the tracker using SDK infrastructure
6182
+ * Initialize the tracker.
6183
+ * When `onError` is provided, errors are passed to the callback and init()
6184
+ * resolves to `null` instead of throwing.
9051
6185
  */
9052
6186
  async init(config) {
9053
- var _a, _b, _c, _d;
9054
- if (this.initialized || this.initializing) {
9055
- log(config.debug || false, "Already initialized or initializing");
6187
+ var _a, _b;
6188
+ if (this.initialized) {
6189
+ log(config.debug || false, "Already initialized \u2014 returning existing session.");
9056
6190
  return this.getSession();
9057
6191
  }
6192
+ if (this.initializing) {
6193
+ log(config.debug || false, "Initialization in progress \u2014 skipping duplicate call.");
6194
+ return null;
6195
+ }
9058
6196
  this.initializing = true;
9059
- this.config = __spreadValues({
9060
- debug: false
9061
- }, config);
9062
- log(this.config.debug, "\u{1F680} Initializing external tracker with SDK...", config);
6197
+ this.config = __spreadValues({ debug: false }, config);
6198
+ const debug = this.config.debug;
6199
+ try {
6200
+ validate(this.config);
6201
+ } catch (err) {
6202
+ this.initializing = false;
6203
+ const error = err instanceof Error ? err : new Error(String(err));
6204
+ if (this.config.onError) {
6205
+ this.config.onError(error);
6206
+ return null;
6207
+ }
6208
+ throw error;
6209
+ }
6210
+ log(debug, "\u{1F680} Initializing external tracker v".concat(TRACKER_VERSION), {
6211
+ storeId: config.storeId,
6212
+ accountId: config.accountId,
6213
+ stepId: config.stepId,
6214
+ funnelId: config.funnelId
6215
+ });
9063
6216
  try {
9064
6217
  const urlToken = getUrlParam("token");
9065
6218
  if (urlToken) {
9066
6219
  setClientToken(urlToken);
9067
- log(this.config.debug, "\u{1F511} Bootstrapped token from URL");
6220
+ log(debug, "\u{1F511} Bootstrapped token from URL");
9068
6221
  }
9069
6222
  this.client = createTagadaClient({
9070
- debugMode: this.config.debug,
9071
- features: { funnel: true }
6223
+ debugMode: debug,
6224
+ features: { funnel: { skipAutoInit: true } },
6225
+ rawPluginConfig: {
6226
+ storeId: this.config.storeId,
6227
+ accountId: this.config.accountId
6228
+ },
6229
+ customApiConfig: this.config.apiBaseUrl ? {
6230
+ apiConfig: {
6231
+ baseUrl: this.config.apiBaseUrl.trim()
6232
+ }
6233
+ } : void 0
9072
6234
  });
9073
6235
  await this.waitForClientReady();
9074
- const funnelContext = await this.initializeFunnel();
9075
- log(this.config.debug, "\u2705 Session initialized (tracking handled by orchestrator):", funnelContext);
6236
+ const funnelContext = await retryWithBackoff(
6237
+ () => this.initializeFunnel(),
6238
+ 2,
6239
+ debug
6240
+ );
6241
+ log(debug, "\u2705 Session initialized:", funnelContext);
9076
6242
  this.initialized = true;
9077
6243
  const session = this.getSession();
9078
6244
  if (session) {
9079
6245
  (_b = (_a = this.config).onReady) == null ? void 0 : _b.call(_a, session);
9080
6246
  }
9081
6247
  return session;
9082
- } catch (error) {
9083
- const err = error instanceof Error ? error : new Error(String(error));
9084
- log(this.config.debug, "\u274C Initialization failed:", err);
9085
- (_d = (_c = this.config).onError) == null ? void 0 : _d.call(_c, err);
9086
- throw err;
6248
+ } catch (err) {
6249
+ const error = err instanceof Error ? err : new Error(String(err));
6250
+ log(debug, "\u274C Initialization failed:", error);
6251
+ if (this.config.onError) {
6252
+ this.config.onError(error);
6253
+ return null;
6254
+ }
6255
+ throw error;
9087
6256
  } finally {
9088
6257
  this.initializing = false;
9089
6258
  }
9090
6259
  }
9091
- /**
9092
- * Get current session from SDK state
9093
- */
6260
+ /** Get current session data. */
9094
6261
  getSession() {
9095
6262
  var _a, _b;
9096
6263
  if (!((_b = (_a = this.client) == null ? void 0 : _a.funnel) == null ? void 0 : _b.state.context)) return null;
@@ -9104,19 +6271,18 @@ var TagadaTrackerBundle = (() => {
9104
6271
  cmsToken: this.client.state.token || void 0
9105
6272
  };
9106
6273
  }
9107
- /**
9108
- * Check if tracker is ready
9109
- */
6274
+ /** Whether the tracker is fully initialized and ready. */
9110
6275
  isReady() {
9111
6276
  var _a, _b;
9112
6277
  return this.initialized && !!((_b = (_a = this.client) == null ? void 0 : _a.funnel) == null ? void 0 : _b.state.context);
9113
6278
  }
9114
6279
  /**
9115
- * Navigate to next step in funnel using SDK's funnel client
6280
+ * Navigate to the next step in the funnel.
6281
+ * By default, auto-redirects the browser window.
9116
6282
  */
9117
6283
  async navigate(options) {
9118
6284
  if (!this.isReady()) {
9119
- throw new Error("Tracker not initialized. Call init() first.");
6285
+ throw new Error("TagadaTracker: not initialized. Call init() first.");
9120
6286
  }
9121
6287
  log(this.config.debug, "\u{1F680} Navigating:", options);
9122
6288
  const shouldAutoRedirect = options.autoRedirect !== false;
@@ -9127,7 +6293,6 @@ var TagadaTrackerBundle = (() => {
9127
6293
  data: options.eventData || {}
9128
6294
  },
9129
6295
  { autoRedirect: false }
9130
- // Always disable SDK auto-redirect, we handle it here
9131
6296
  );
9132
6297
  if (result == null ? void 0 : result.url) {
9133
6298
  log(this.config.debug, "\u2705 Navigation result:", result.url);
@@ -9143,36 +6308,48 @@ var TagadaTrackerBundle = (() => {
9143
6308
  }
9144
6309
  }
9145
6310
  /**
9146
- * Get customer ID (for identifying the user)
6311
+ * Track a custom event (e.g., button click, scroll depth, video play).
6312
+ * Events are sent through the funnel orchestrator for unified analytics.
9147
6313
  */
6314
+ async trackEvent(options) {
6315
+ if (!this.isReady()) {
6316
+ warn("trackEvent called before init \u2014 event dropped:", options.name);
6317
+ return;
6318
+ }
6319
+ log(this.config.debug, "\u{1F4CA} Tracking event:", options.name, options.data);
6320
+ try {
6321
+ await this.client.funnel.navigate(
6322
+ {
6323
+ type: options.name,
6324
+ data: options.data || {}
6325
+ },
6326
+ { autoRedirect: false }
6327
+ );
6328
+ } catch (e) {
6329
+ log(this.config.debug, "\u26A0\uFE0F Event tracking failed (non-critical):", options.name);
6330
+ }
6331
+ }
6332
+ /** Get customer ID. */
9148
6333
  getCustomerId() {
9149
6334
  var _a, _b, _c, _d, _e;
9150
6335
  return ((_b = (_a = this.client) == null ? void 0 : _a.state.auth.customer) == null ? void 0 : _b.id) || ((_e = (_d = (_c = this.client) == null ? void 0 : _c.funnel) == null ? void 0 : _d.state.context) == null ? void 0 : _e.customerId) || null;
9151
6336
  }
9152
- /**
9153
- * Get funnel session ID
9154
- */
6337
+ /** Get funnel session ID. */
9155
6338
  getFunnelSessionId() {
9156
6339
  var _a, _b, _c;
9157
6340
  return ((_c = (_b = (_a = this.client) == null ? void 0 : _a.funnel) == null ? void 0 : _b.state.context) == null ? void 0 : _c.sessionId) || null;
9158
6341
  }
9159
6342
  /**
9160
- * Build a URL with funnel context parameters
9161
- * Useful for linking to other external pages while preserving session
6343
+ * Build a URL that preserves funnel session context.
6344
+ * Use this to link to other external pages within the same funnel.
9162
6345
  */
9163
6346
  buildUrl(baseUrl, additionalParams) {
9164
6347
  const session = this.getSession();
9165
- if (!session) {
9166
- return baseUrl;
9167
- }
6348
+ if (!session) return baseUrl;
9168
6349
  const url = new URL(baseUrl, typeof window !== "undefined" ? window.location.origin : void 0);
9169
6350
  url.searchParams.set("funnelSessionId", session.sessionId);
9170
- if (session.cmsToken) {
9171
- url.searchParams.set("token", session.cmsToken);
9172
- }
9173
- if (session.funnelId) {
9174
- url.searchParams.set("funnelId", session.funnelId);
9175
- }
6351
+ if (session.cmsToken) url.searchParams.set("token", session.cmsToken);
6352
+ if (session.funnelId) url.searchParams.set("funnelId", session.funnelId);
9176
6353
  url.searchParams.set("storeId", session.storeId);
9177
6354
  if (additionalParams) {
9178
6355
  Object.entries(additionalParams).forEach(([key, value]) => {
@@ -9181,55 +6358,98 @@ var TagadaTrackerBundle = (() => {
9181
6358
  }
9182
6359
  return url.toString();
9183
6360
  }
9184
- /**
9185
- * Get the underlying SDK client (for advanced usage)
9186
- */
6361
+ /** Get the underlying SDK client (advanced usage). */
9187
6362
  getClient() {
9188
6363
  return this.client;
9189
6364
  }
6365
+ /**
6366
+ * Reset the tracker to a new step without re-creating the session.
6367
+ * Useful for SPAs that navigate between funnel steps client-side.
6368
+ */
6369
+ async reset(newStepId) {
6370
+ var _a, _b;
6371
+ if (!this.client || !this.config) {
6372
+ throw new Error("TagadaTracker: not initialized. Call init() first.");
6373
+ }
6374
+ log(this.config.debug, "\u{1F504} Resetting to step:", newStepId);
6375
+ this.config.stepId = newStepId;
6376
+ const ctx = await this.initializeFunnel();
6377
+ const session = this.getSession();
6378
+ if (session) (_b = (_a = this.config).onReady) == null ? void 0 : _b.call(_a, session);
6379
+ return session;
6380
+ }
6381
+ /**
6382
+ * Destroy the tracker, clean up event listeners and state.
6383
+ * Call this when the tracker is no longer needed (e.g., SPA teardown).
6384
+ */
6385
+ destroy() {
6386
+ var _a, _b;
6387
+ if (this.unsubscribe) {
6388
+ this.unsubscribe();
6389
+ this.unsubscribe = null;
6390
+ }
6391
+ if (this.client) {
6392
+ (_b = (_a = this.client).destroy) == null ? void 0 : _b.call(_a);
6393
+ }
6394
+ this.client = null;
6395
+ this.config = null;
6396
+ this.initialized = false;
6397
+ this.initializing = false;
6398
+ log(false, "\u{1F5D1}\uFE0F Tracker destroyed");
6399
+ }
9190
6400
  // ========================================================================
9191
6401
  // PRIVATE METHODS
9192
6402
  // ========================================================================
9193
6403
  async waitForClientReady() {
9194
6404
  if (!this.client) return;
9195
6405
  return new Promise((resolve) => {
9196
- let retries = 0;
9197
- const checkReady = () => {
9198
- var _a, _b;
9199
- if (((_a = this.client) == null ? void 0 : _a.state.isInitialized) || ((_b = this.client) == null ? void 0 : _b.state.token)) {
6406
+ var _a;
6407
+ if ((_a = this.client) == null ? void 0 : _a.state.isInitialized) {
6408
+ resolve();
6409
+ return;
6410
+ }
6411
+ let resolved = false;
6412
+ const timeout = setTimeout(() => {
6413
+ var _a2;
6414
+ if (!resolved) {
6415
+ resolved = true;
6416
+ log(((_a2 = this.config) == null ? void 0 : _a2.debug) || false, "\u23F1\uFE0F Client ready timeout \u2014 proceeding");
9200
6417
  resolve();
9201
- } else if (retries > 40) {
6418
+ }
6419
+ }, 1e4);
6420
+ this.unsubscribe = this.client.subscribe(() => {
6421
+ var _a2;
6422
+ if (!resolved && ((_a2 = this.client) == null ? void 0 : _a2.state.isInitialized)) {
6423
+ resolved = true;
6424
+ clearTimeout(timeout);
9202
6425
  resolve();
9203
- } else {
9204
- retries++;
9205
- setTimeout(checkReady, 50);
9206
6426
  }
9207
- };
9208
- checkReady();
6427
+ });
9209
6428
  });
9210
6429
  }
9211
6430
  async initializeFunnel() {
9212
6431
  var _a, _b, _c;
9213
6432
  if (!((_a = this.client) == null ? void 0 : _a.funnel)) return null;
6433
+ const customerId = (_b = this.client.state.auth.customer) == null ? void 0 : _b.id;
6434
+ const sessionId = (_c = this.client.state.auth.session) == null ? void 0 : _c.sessionId;
6435
+ if (!customerId && !sessionId) {
6436
+ warn("No auth session available \u2014 funnel init may fail.");
6437
+ }
9214
6438
  const authSession = {
9215
- customerId: ((_b = this.client.state.auth.customer) == null ? void 0 : _b.id) || "anon_placeholder",
9216
- sessionId: ((_c = this.client.state.auth.session) == null ? void 0 : _c.sessionId) || "sess_placeholder"
6439
+ customerId: customerId || "anon_placeholder",
6440
+ sessionId: sessionId || "sess_placeholder"
9217
6441
  };
9218
6442
  const store = {
9219
6443
  id: this.config.storeId,
9220
- accountId: this.config.accountId || ""
6444
+ accountId: this.config.accountId
9221
6445
  };
9222
6446
  const entryStepId = this.config.stepId;
9223
- if (!entryStepId) {
9224
- throw new Error("stepId is required for external page tracking (URL mapping does not work for external pages)");
9225
- }
9226
- log(this.config.debug, "\u{1F50D} Initializing external page at step:", entryStepId);
6447
+ log(this.config.debug, "\u{1F50D} Initializing funnel at step:", entryStepId);
9227
6448
  return this.client.funnel.initialize(
9228
6449
  authSession,
9229
6450
  store,
9230
6451
  this.config.funnelId || getUrlParam("funnelId") || void 0,
9231
6452
  entryStepId
9232
- // ✅ Explicitly tell orchestrator which step we're on
9233
6453
  );
9234
6454
  }
9235
6455
  };
@@ -9239,29 +6459,6 @@ var TagadaTrackerBundle = (() => {
9239
6459
  }
9240
6460
  return __toCommonJS(external_tracker_exports);
9241
6461
  })();
9242
- /*! Bundled license information:
9243
-
9244
- detect-europe-js/dist/esm/index.js:
9245
- (*! detectEurope.js v0.1.2
9246
- Determine whether a user is from the European Union (EU) area
9247
- https://github.com/faisalman/detect-europe-js
9248
- Author: Faisal Salman <f@faisalman.com>
9249
- MIT License *)
9250
-
9251
- ua-is-frozen/dist/esm/index.js:
9252
- (*! isFrozenUA
9253
- A freeze-test for your user-agent string
9254
- https://github.com/faisalman/ua-is-frozen
9255
- Author: Faisal Salman <f@faisalman.com>
9256
- MIT License *)
9257
-
9258
- is-standalone-pwa/dist/esm/index.js:
9259
- (*! isStandalonePWA 0.1.1
9260
- Detect if PWA is running in standalone mode
9261
- https://github.com/faisalman/is-standalone-pwa
9262
- Author: Faisal Salman <f@faisalman.com>
9263
- MIT License *)
9264
- */
9265
6462
  // Expose TagadaTracker globally
9266
6463
  if (typeof window !== 'undefined' && TagadaTrackerBundle && TagadaTrackerBundle.TagadaTracker) {
9267
6464
  window.TagadaTracker = TagadaTrackerBundle.TagadaTracker;