@localstack/appinspector-ui 1.0.98 → 1.0.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2468,6 +2468,7 @@ var EVENT_DETAILS_CLOSE_BUTTON_TEST_ID = "event-details-close-button";
2468
2468
  var EVENT_DETAILS_STATUS_TEST_ID = "event-details-status";
2469
2469
  var EVENT_DETAILS_RESOURCE_NAME_TEST_ID = "event-details-resource-name";
2470
2470
  var EVENT_DETAILS_RESOURCE_ARN_TEST_ID = "event-details-resource-arn";
2471
+ var EVENT_DETAILS_CFN_RESOURCE_TYPE_TEST_ID = "event-details-cfn-resource-type";
2471
2472
  var EVENT_DETAILS_ACCOUNT_TEST_ID = "event-details-account";
2472
2473
  var EVENT_DETAILS_REGION_TEST_ID = "event-details-region";
2473
2474
  var EVENT_DETAILS_START_TIME_TEST_ID = "event-details-start-time";
@@ -4851,20 +4852,20 @@ var RowSorting = {
4851
4852
  createColumn: (column, table) => {
4852
4853
  column.getAutoSortingFn = () => {
4853
4854
  const firstRows = table.getFilteredRowModel().flatRows.slice(10);
4854
- let isString2 = false;
4855
+ let isString3 = false;
4855
4856
  for (const row of firstRows) {
4856
4857
  const value = row == null ? void 0 : row.getValue(column.id);
4857
4858
  if (Object.prototype.toString.call(value) === "[object Date]") {
4858
4859
  return sortingFns.datetime;
4859
4860
  }
4860
4861
  if (typeof value === "string") {
4861
- isString2 = true;
4862
+ isString3 = true;
4862
4863
  if (value.split(reSplitAlphaNumeric).length > 1) {
4863
4864
  return sortingFns.alphanumeric;
4864
4865
  }
4865
4866
  }
4866
4867
  }
4867
- if (isString2) {
4868
+ if (isString3) {
4868
4869
  return sortingFns.text;
4869
4870
  }
4870
4871
  return sortingFns.basic;
@@ -15457,10 +15458,74 @@ var StatusMessage = ({
15457
15458
  return /* @__PURE__ */ jsx129(Fragment6, {});
15458
15459
  };
15459
15460
 
15461
+ // src/hooks/status-provider.tsx
15462
+ import { createContext as createContext8, useContext as useContext15, useMemo as useMemo6 } from "react";
15463
+
15464
+ // src/hooks/use-status.tsx
15465
+ import { useCallback as useCallback3, useEffect as useEffect11, useRef as useRef8, useState as useState6 } from "react";
15466
+ var useStatus = () => {
15467
+ const api = useAppInspectorApi();
15468
+ const [checking, setChecking] = useState6(true);
15469
+ const [status, setStatus] = useState6();
15470
+ const [error, setError] = useState6();
15471
+ const hasFetchedReference = useRef8(false);
15472
+ const abortControllerReference = useRef8(null);
15473
+ const checkStatus = useCallback3(async () => {
15474
+ if (abortControllerReference.current !== null) {
15475
+ abortControllerReference.current.abort();
15476
+ }
15477
+ const abortController = new AbortController();
15478
+ abortControllerReference.current = abortController;
15479
+ setChecking(true);
15480
+ try {
15481
+ const response = await api.getStatus();
15482
+ if (!abortController.signal.aborted) {
15483
+ setStatus(response);
15484
+ setError(void 0);
15485
+ }
15486
+ } catch (error_) {
15487
+ if (!abortController.signal.aborted) {
15488
+ setError(error_ instanceof Error ? error_ : new Error("Unknown error"));
15489
+ setStatus(void 0);
15490
+ }
15491
+ } finally {
15492
+ if (!abortController.signal.aborted) {
15493
+ setChecking(false);
15494
+ }
15495
+ }
15496
+ }, [api]);
15497
+ useEffect11(() => {
15498
+ if (!hasFetchedReference.current) {
15499
+ hasFetchedReference.current = true;
15500
+ void checkStatus();
15501
+ }
15502
+ }, [checkStatus]);
15503
+ return { checking, checkStatus, error, status };
15504
+ };
15505
+
15506
+ // src/hooks/status-provider.tsx
15507
+ import { jsx as jsx130 } from "react/jsx-runtime";
15508
+ var AppInspectorStatusContext = createContext8(void 0);
15509
+ var StatusProvider = ({ children }) => {
15510
+ const { checking, checkStatus, error, status } = useStatus();
15511
+ const value = useMemo6(
15512
+ () => ({ checking, checkStatus, status, statusError: error }),
15513
+ [checking, checkStatus, status, error]
15514
+ );
15515
+ return /* @__PURE__ */ jsx130(AppInspectorStatusContext.Provider, { value, children });
15516
+ };
15517
+ var useAppInspectorStatus = () => {
15518
+ const value = useContext15(AppInspectorStatusContext);
15519
+ if (!value) {
15520
+ throw new Error("@localstack-studio/ui: useAppInspectorStatus must be used within a <StatusProvider> (rendered internally by <AppInspectorContextProvider>)");
15521
+ }
15522
+ return value;
15523
+ };
15524
+
15460
15525
  // src/hooks/use-local-storage.tsx
15461
- import { useCallback as useCallback3, useEffect as useEffect11, useState as useState6 } from "react";
15526
+ import { useCallback as useCallback4, useEffect as useEffect12, useState as useState7 } from "react";
15462
15527
  function useLocalStorage(key, initialValue) {
15463
- const [storedValue, setStoredValue] = useState6(() => {
15528
+ const [storedValue, setStoredValue] = useState7(() => {
15464
15529
  try {
15465
15530
  const item = globalThis.localStorage.getItem(key);
15466
15531
  return item ? JSON.parse(item) : initialValue;
@@ -15469,7 +15534,7 @@ function useLocalStorage(key, initialValue) {
15469
15534
  return initialValue;
15470
15535
  }
15471
15536
  });
15472
- const setValue = useCallback3((value) => {
15537
+ const setValue = useCallback4((value) => {
15473
15538
  try {
15474
15539
  setStoredValue((previousState) => {
15475
15540
  const next = typeof value === "function" ? value(previousState) : value;
@@ -15484,7 +15549,7 @@ function useLocalStorage(key, initialValue) {
15484
15549
  console.error(`Error setting localStorage key "${key}":`, error);
15485
15550
  }
15486
15551
  }, [key]);
15487
- useEffect11(() => {
15552
+ useEffect12(() => {
15488
15553
  const handleStorageChange = (event) => {
15489
15554
  if (event.key === key && event.newValue !== null) {
15490
15555
  try {
@@ -15503,49 +15568,7 @@ function useLocalStorage(key, initialValue) {
15503
15568
  }
15504
15569
 
15505
15570
  // src/hooks/use-spans.ts
15506
- import { useCallback as useCallback7, useEffect as useEffect15, useRef as useRef11, useState as useState10 } from "react";
15507
-
15508
- // src/hooks/use-status.tsx
15509
- import { useCallback as useCallback4, useEffect as useEffect12, useRef as useRef8, useState as useState7 } from "react";
15510
- var useStatus = () => {
15511
- const api = useAppInspectorApi();
15512
- const [checking, setChecking] = useState7(true);
15513
- const [status, setStatus] = useState7();
15514
- const [error, setError] = useState7();
15515
- const hasFetchedReference = useRef8(false);
15516
- const abortControllerReference = useRef8(null);
15517
- const checkStatus = useCallback4(async () => {
15518
- if (abortControllerReference.current !== null) {
15519
- abortControllerReference.current.abort();
15520
- }
15521
- const abortController = new AbortController();
15522
- abortControllerReference.current = abortController;
15523
- setChecking(true);
15524
- try {
15525
- const response = await api.getStatus();
15526
- if (!abortController.signal.aborted) {
15527
- setStatus(response);
15528
- setError(void 0);
15529
- }
15530
- } catch (error_) {
15531
- if (!abortController.signal.aborted) {
15532
- setError(error_ instanceof Error ? error_ : new Error("Unknown error"));
15533
- setStatus(void 0);
15534
- }
15535
- } finally {
15536
- if (!abortController.signal.aborted) {
15537
- setChecking(false);
15538
- }
15539
- }
15540
- }, [api]);
15541
- useEffect12(() => {
15542
- if (!hasFetchedReference.current) {
15543
- hasFetchedReference.current = true;
15544
- void checkStatus();
15545
- }
15546
- }, [checkStatus]);
15547
- return { checking, checkStatus, error, status };
15548
- };
15571
+ import { useCallback as useCallback7, useEffect as useEffect16, useRef as useRef12, useState as useState10 } from "react";
15549
15572
 
15550
15573
  // src/utils/pagination-buffer.ts
15551
15574
  var insertSorted = (array, item, compareFunction, hint = "back") => {
@@ -15726,12 +15749,13 @@ var createPaginationBuffer = (options) => {
15726
15749
  };
15727
15750
 
15728
15751
  // src/hooks/use-spans-ws.tsx
15729
- import { useCallback as useCallback6, useEffect as useEffect13, useRef as useRef9, useState as useState8 } from "react";
15752
+ import { useCallback as useCallback6, useEffect as useEffect14, useRef as useRef10, useState as useState8 } from "react";
15730
15753
 
15731
15754
  // src/config.ts
15732
15755
  var APPINSPECTOR_API_PREFIX = "/_localstack/appinspector";
15733
15756
  var API_VERSION = "v1";
15734
15757
  var API_ENDPOINTS = {
15758
+ ANALYTICS: "/analytics",
15735
15759
  EVENTS: "/traces/*/spans/*/events",
15736
15760
  ROOT: "/",
15737
15761
  SPANS: "/traces/*/spans",
@@ -15754,8 +15778,8 @@ var getAppInspectorApiUrl = (localstackEndpoint, endpoint) => {
15754
15778
  var LOCALSTACK_INFO_PATH = "/_localstack/info";
15755
15779
 
15756
15780
  // src/context.tsx
15757
- import { createContext as createContext8, useContext as useContext15 } from "react";
15758
- import { useCallback as useCallback5, useMemo as useMemo6 } from "react";
15781
+ import { createContext as createContext9, useContext as useContext16 } from "react";
15782
+ import { useCallback as useCallback5, useMemo as useMemo7 } from "react";
15759
15783
 
15760
15784
  // src/api/client.ts
15761
15785
  var import_semver2 = __toESM(require_semver2(), 1);
@@ -15826,6 +15850,7 @@ var createScopedLogger = (scope) => ({
15826
15850
 
15827
15851
  // src/api/client.ts
15828
15852
  var apiLogger = createScopedLogger("API");
15853
+ var analyticsLogger = createScopedLogger("ANALYTICS");
15829
15854
  var makeRequest = async (options) => {
15830
15855
  const url = getAppInspectorApiUrl(options.localstackEndpoint, options.endpoint);
15831
15856
  try {
@@ -15973,6 +15998,20 @@ var createApiClient = ({ localstackEndpoint }) => {
15973
15998
  const localstackVersion = headerVersion && import_semver2.default.coerce(headerVersion) ? headerVersion : infoVersion.status === "fulfilled" ? infoVersion.value : void 0;
15974
15999
  return { ...statusResult.value, localstackVersion };
15975
16000
  },
16001
+ postAnalytics: async (request) => {
16002
+ try {
16003
+ await makeRequest({
16004
+ endpoint: API_ENDPOINTS.ANALYTICS,
16005
+ localstackEndpoint,
16006
+ request: {
16007
+ body: JSON.stringify(request),
16008
+ method: "POST"
16009
+ }
16010
+ });
16011
+ } catch (error) {
16012
+ analyticsLogger.warn("Failed to post analytics event:", { error, event: request.event });
16013
+ }
16014
+ },
15976
16015
  setStatus: async (request) => {
15977
16016
  return makeRequest({
15978
16017
  endpoint: API_ENDPOINTS.STATUS,
@@ -15986,18 +16025,1925 @@ var createApiClient = ({ localstackEndpoint }) => {
15986
16025
  };
15987
16026
  };
15988
16027
 
16028
+ // src/hooks/use-appinspector-open-analytics.ts
16029
+ import { useEffect as useEffect13, useRef as useRef9 } from "react";
16030
+
16031
+ // node_modules/ua-parser-js/src/main/ua-parser.mjs
16032
+ var LIBVERSION = "2.0.9";
16033
+ var UA_MAX_LENGTH = 500;
16034
+ var USER_AGENT = "user-agent";
16035
+ var EMPTY = "";
16036
+ var UNKNOWN = "?";
16037
+ var TYPEOF = {
16038
+ FUNCTION: "function",
16039
+ OBJECT: "object",
16040
+ STRING: "string",
16041
+ UNDEFINED: "undefined"
16042
+ };
16043
+ var BROWSER = "browser";
16044
+ var CPU = "cpu";
16045
+ var DEVICE = "device";
16046
+ var ENGINE = "engine";
16047
+ var OS = "os";
16048
+ var RESULT = "result";
16049
+ var NAME = "name";
16050
+ var TYPE = "type";
16051
+ var VENDOR = "vendor";
16052
+ var VERSION = "version";
16053
+ var ARCHITECTURE = "architecture";
16054
+ var MAJOR = "major";
16055
+ var MODEL = "model";
16056
+ var CONSOLE = "console";
16057
+ var MOBILE = "mobile";
16058
+ var TABLET = "tablet";
16059
+ var SMARTTV = "smarttv";
16060
+ var WEARABLE = "wearable";
16061
+ var XR = "xr";
16062
+ var EMBEDDED = "embedded";
16063
+ var FETCHER = "fetcher";
16064
+ var INAPP = "inapp";
16065
+ var BRANDS = "brands";
16066
+ var FORMFACTORS = "formFactors";
16067
+ var FULLVERLIST = "fullVersionList";
16068
+ var PLATFORM = "platform";
16069
+ var PLATFORMVER = "platformVersion";
16070
+ var BITNESS = "bitness";
16071
+ var CH = "sec-ch-ua";
16072
+ var CH_FULL_VER_LIST = CH + "-full-version-list";
16073
+ var CH_ARCH = CH + "-arch";
16074
+ var CH_BITNESS = CH + "-" + BITNESS;
16075
+ var CH_FORM_FACTORS = CH + "-form-factors";
16076
+ var CH_MOBILE = CH + "-" + MOBILE;
16077
+ var CH_MODEL = CH + "-" + MODEL;
16078
+ var CH_PLATFORM = CH + "-" + PLATFORM;
16079
+ var CH_PLATFORM_VER = CH_PLATFORM + "-version";
16080
+ var CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS];
16081
+ var AMAZON = "Amazon";
16082
+ var APPLE = "Apple";
16083
+ var ASUS = "ASUS";
16084
+ var BLACKBERRY = "BlackBerry";
16085
+ var GOOGLE = "Google";
16086
+ var HUAWEI = "Huawei";
16087
+ var LENOVO = "Lenovo";
16088
+ var HONOR = "Honor";
16089
+ var LG = "LG";
16090
+ var MICROSOFT = "Microsoft";
16091
+ var MOTOROLA = "Motorola";
16092
+ var NVIDIA = "Nvidia";
16093
+ var ONEPLUS = "OnePlus";
16094
+ var OPPO = "OPPO";
16095
+ var SAMSUNG = "Samsung";
16096
+ var SHARP = "Sharp";
16097
+ var SONY = "Sony";
16098
+ var XIAOMI = "Xiaomi";
16099
+ var ZEBRA = "Zebra";
16100
+ var CHROME = "Chrome";
16101
+ var CHROMIUM = "Chromium";
16102
+ var CHROMECAST = "Chromecast";
16103
+ var EDGE = "Edge";
16104
+ var FIREFOX = "Firefox";
16105
+ var OPERA = "Opera";
16106
+ var FACEBOOK = "Facebook";
16107
+ var SOGOU = "Sogou";
16108
+ var PREFIX_MOBILE = "Mobile ";
16109
+ var SUFFIX_BROWSER = " Browser";
16110
+ var WINDOWS = "Windows";
16111
+ var isWindow = typeof window !== TYPEOF.UNDEFINED;
16112
+ var NAVIGATOR = isWindow && window.navigator ? window.navigator : void 0;
16113
+ var NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
16114
+ var extend = function(defaultRgx, extensions) {
16115
+ var mergedRgx = {};
16116
+ var extraRgx = extensions;
16117
+ if (!isExtensions(extensions)) {
16118
+ extraRgx = {};
16119
+ for (var i2 in extensions) {
16120
+ for (var j2 in extensions[i2]) {
16121
+ extraRgx[j2] = extensions[i2][j2].concat(extraRgx[j2] ? extraRgx[j2] : []);
16122
+ }
16123
+ }
16124
+ }
16125
+ for (var k2 in defaultRgx) {
16126
+ mergedRgx[k2] = extraRgx[k2] && extraRgx[k2].length % 2 === 0 ? extraRgx[k2].concat(defaultRgx[k2]) : defaultRgx[k2];
16127
+ }
16128
+ return mergedRgx;
16129
+ };
16130
+ var enumerize = function(arr) {
16131
+ var enums = {};
16132
+ for (var i2 = 0; i2 < arr.length; i2++) {
16133
+ enums[arr[i2].toUpperCase()] = arr[i2];
16134
+ }
16135
+ return enums;
16136
+ };
16137
+ var has = function(str1, str2) {
16138
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
16139
+ for (var i2 in str1) {
16140
+ if (lowerize(str2) == lowerize(str1[i2])) return true;
16141
+ }
16142
+ return false;
16143
+ }
16144
+ return isString2(str1) ? lowerize(str2) == lowerize(str1) : false;
16145
+ };
16146
+ var isExtensions = function(obj, deep) {
16147
+ for (var prop in obj) {
16148
+ return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
16149
+ }
16150
+ };
16151
+ var isString2 = function(val) {
16152
+ return typeof val === TYPEOF.STRING;
16153
+ };
16154
+ var itemListToArray = function(header) {
16155
+ if (!header) return void 0;
16156
+ var arr = [];
16157
+ var tokens = strip(/\\?\"/g, header).split(",");
16158
+ for (var i2 = 0; i2 < tokens.length; i2++) {
16159
+ if (tokens[i2].indexOf(";") > -1) {
16160
+ var token = trim(tokens[i2]).split(";v=");
16161
+ arr[i2] = { brand: token[0], version: token[1] };
16162
+ } else {
16163
+ arr[i2] = trim(tokens[i2]);
16164
+ }
16165
+ }
16166
+ return arr;
16167
+ };
16168
+ var lowerize = function(str) {
16169
+ return isString2(str) ? str.toLowerCase() : str;
16170
+ };
16171
+ var majorize = function(version) {
16172
+ return isString2(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
16173
+ };
16174
+ var setProps = function(arr) {
16175
+ for (var i2 in arr) {
16176
+ if (!arr.hasOwnProperty(i2)) continue;
16177
+ var propName = arr[i2];
16178
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
16179
+ this[propName[0]] = propName[1];
16180
+ } else {
16181
+ this[propName] = void 0;
16182
+ }
16183
+ }
16184
+ return this;
16185
+ };
16186
+ var strip = function(pattern, str) {
16187
+ return isString2(str) ? str.replace(pattern, EMPTY) : str;
16188
+ };
16189
+ var stripQuotes = function(str) {
16190
+ return strip(/\\?\"/g, str);
16191
+ };
16192
+ var trim = function(str, len) {
16193
+ str = strip(/^\s\s*/, String(str));
16194
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
16195
+ };
16196
+ var rgxMapper = function(ua, arrays) {
16197
+ if (!ua || !arrays) return;
16198
+ var i2 = 0, j2, k2, p2, q2, matches, match;
16199
+ while (i2 < arrays.length && !matches) {
16200
+ var regex = arrays[i2], props = arrays[i2 + 1];
16201
+ j2 = k2 = 0;
16202
+ while (j2 < regex.length && !matches) {
16203
+ if (!regex[j2]) {
16204
+ break;
16205
+ }
16206
+ matches = regex[j2++].exec(ua);
16207
+ if (!!matches) {
16208
+ for (p2 = 0; p2 < props.length; p2++) {
16209
+ match = matches[++k2];
16210
+ q2 = props[p2];
16211
+ if (typeof q2 === TYPEOF.OBJECT && q2.length > 0) {
16212
+ if (q2.length === 2) {
16213
+ if (typeof q2[1] == TYPEOF.FUNCTION) {
16214
+ this[q2[0]] = q2[1].call(this, match);
16215
+ } else {
16216
+ this[q2[0]] = q2[1];
16217
+ }
16218
+ } else if (q2.length >= 3) {
16219
+ if (typeof q2[1] === TYPEOF.FUNCTION && !(q2[1].exec && q2[1].test)) {
16220
+ if (q2.length > 3) {
16221
+ this[q2[0]] = match ? q2[1].apply(this, q2.slice(2)) : void 0;
16222
+ } else {
16223
+ this[q2[0]] = match ? q2[1].call(this, match, q2[2]) : void 0;
16224
+ }
16225
+ } else {
16226
+ if (q2.length == 3) {
16227
+ this[q2[0]] = match ? match.replace(q2[1], q2[2]) : void 0;
16228
+ } else if (q2.length == 4) {
16229
+ this[q2[0]] = match ? q2[3].call(this, match.replace(q2[1], q2[2])) : void 0;
16230
+ } else if (q2.length > 4) {
16231
+ this[q2[0]] = match ? q2[3].apply(this, [match.replace(q2[1], q2[2])].concat(q2.slice(4))) : void 0;
16232
+ }
16233
+ }
16234
+ }
16235
+ } else {
16236
+ this[q2] = match ? match : void 0;
16237
+ }
16238
+ }
16239
+ }
16240
+ }
16241
+ i2 += 2;
16242
+ }
16243
+ };
16244
+ var strMapper = function(str, map) {
16245
+ for (var i2 in map) {
16246
+ if (typeof map[i2] === TYPEOF.OBJECT && map[i2].length > 0) {
16247
+ for (var j2 = 0; j2 < map[i2].length; j2++) {
16248
+ if (has(map[i2][j2], str)) {
16249
+ return i2 === UNKNOWN ? void 0 : i2;
16250
+ }
16251
+ }
16252
+ } else if (has(map[i2], str)) {
16253
+ return i2 === UNKNOWN ? void 0 : i2;
16254
+ }
16255
+ }
16256
+ return map.hasOwnProperty("*") ? map["*"] : str;
16257
+ };
16258
+ var windowsVersionMap = {
16259
+ "ME": "4.90",
16260
+ "NT 3.51": "3.51",
16261
+ "NT 4.0": "4.0",
16262
+ "2000": ["5.0", "5.01"],
16263
+ "XP": ["5.1", "5.2"],
16264
+ "Vista": "6.0",
16265
+ "7": "6.1",
16266
+ "8": "6.2",
16267
+ "8.1": "6.3",
16268
+ "10": ["6.4", "10.0"],
16269
+ "NT": ""
16270
+ };
16271
+ var formFactorsMap = {
16272
+ "embedded": "Automotive",
16273
+ "mobile": "Mobile",
16274
+ "tablet": ["Tablet", "EInk"],
16275
+ "smarttv": "TV",
16276
+ "wearable": "Watch",
16277
+ "xr": ["VR", "XR"],
16278
+ "?": ["Desktop", "Unknown"],
16279
+ "*": void 0
16280
+ };
16281
+ var browserHintsMap = {
16282
+ "Chrome": "Google Chrome",
16283
+ "Edge": "Microsoft Edge",
16284
+ "Edge WebView2": "Microsoft Edge WebView2",
16285
+ "Chrome WebView": "Android WebView",
16286
+ "Chrome Headless": "HeadlessChrome",
16287
+ "Huawei Browser": "HuaweiBrowser",
16288
+ "MIUI Browser": "Miui Browser",
16289
+ "Opera Mobi": "OperaMobile",
16290
+ "Yandex": "YaBrowser"
16291
+ };
16292
+ var defaultRegexes = {
16293
+ browser: [
16294
+ [
16295
+ // Most common regardless engine
16296
+ /\b(?:crmo|crios)\/([\w\.]+)/i
16297
+ // Chrome for Android/iOS
16298
+ ],
16299
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
16300
+ [
16301
+ /webview.+edge\/([\w\.]+)/i
16302
+ // Microsoft Edge
16303
+ ],
16304
+ [VERSION, [NAME, EDGE + " WebView"]],
16305
+ [
16306
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
16307
+ ],
16308
+ [VERSION, [NAME, "Edge"]],
16309
+ [
16310
+ // Presto based
16311
+ /(opera mini)\/([-\w\.]+)/i,
16312
+ // Opera Mini
16313
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
16314
+ // Opera Mobi/Tablet
16315
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
16316
+ // Opera
16317
+ ],
16318
+ [NAME, VERSION],
16319
+ [
16320
+ /opios[\/ ]+([\w\.]+)/i
16321
+ // Opera mini on iphone >= 8.0
16322
+ ],
16323
+ [VERSION, [NAME, OPERA + " Mini"]],
16324
+ [
16325
+ /\bop(?:rg)?x\/([\w\.]+)/i
16326
+ // Opera GX
16327
+ ],
16328
+ [VERSION, [NAME, OPERA + " GX"]],
16329
+ [
16330
+ /\bopr\/([\w\.]+)/i
16331
+ // Opera Webkit
16332
+ ],
16333
+ [VERSION, [NAME, OPERA]],
16334
+ [
16335
+ // Mixed
16336
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
16337
+ // Baidu
16338
+ ],
16339
+ [VERSION, [NAME, "Baidu"]],
16340
+ [
16341
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i
16342
+ // Maxthon
16343
+ ],
16344
+ [VERSION, [NAME, "Maxthon"]],
16345
+ [
16346
+ /(kindle)\/([\w\.]+)/i,
16347
+ // Kindle
16348
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
16349
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
16350
+ // Trident based
16351
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
16352
+ // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
16353
+ /(?:ms|\()(ie) ([\w\.]+)/i,
16354
+ // Internet Explorer
16355
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon/HiBrowser
16356
+ /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
16357
+ // Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
16358
+ /(brave)(?: chrome)?\/([\d\.]+)/i,
16359
+ // Brave
16360
+ /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
16361
+ // Aloha/HeyTap/Ovi/115/Surf
16362
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i,
16363
+ // Qwant
16364
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
16365
+ // Ecosia/Weibo
16366
+ ],
16367
+ [NAME, VERSION],
16368
+ [
16369
+ /quark(?:pc)?\/([-\w\.]+)/i
16370
+ // Quark
16371
+ ],
16372
+ [VERSION, [NAME, "Quark"]],
16373
+ [
16374
+ /\bddg\/([\w\.]+)/i
16375
+ // DuckDuckGo
16376
+ ],
16377
+ [VERSION, [NAME, "DuckDuckGo"]],
16378
+ [
16379
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
16380
+ // UCBrowser
16381
+ ],
16382
+ [VERSION, [NAME, "UCBrowser"]],
16383
+ [
16384
+ /microm.+\bqbcore\/([\w\.]+)/i,
16385
+ // WeChat Desktop for Windows Built-in Browser
16386
+ /\bqbcore\/([\w\.]+).+microm/i,
16387
+ /micromessenger\/([\w\.]+)/i
16388
+ // WeChat
16389
+ ],
16390
+ [VERSION, [NAME, "WeChat"]],
16391
+ [
16392
+ /konqueror\/([\w\.]+)/i
16393
+ // Konqueror
16394
+ ],
16395
+ [VERSION, [NAME, "Konqueror"]],
16396
+ [
16397
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
16398
+ // IE11
16399
+ ],
16400
+ [VERSION, [NAME, "IE"]],
16401
+ [
16402
+ /ya(?:search)?browser\/([\w\.]+)/i
16403
+ // Yandex
16404
+ ],
16405
+ [VERSION, [NAME, "Yandex"]],
16406
+ [
16407
+ /slbrowser\/([\w\.]+)/i
16408
+ // Smart Lenovo Browser
16409
+ ],
16410
+ [VERSION, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
16411
+ [
16412
+ /(av(?:ast|g|ira))\/([\w\.]+)/i
16413
+ // Avast/AVG/Avira Secure Browser
16414
+ ],
16415
+ [[NAME, /(.+)/, "$1 Secure" + SUFFIX_BROWSER], VERSION],
16416
+ [
16417
+ /norton\/([\w\.]+)/i
16418
+ // Norton Private Browser
16419
+ ],
16420
+ [VERSION, [NAME, "Norton Private" + SUFFIX_BROWSER]],
16421
+ [
16422
+ /\bfocus\/([\w\.]+)/i
16423
+ // Firefox Focus
16424
+ ],
16425
+ [VERSION, [NAME, FIREFOX + " Focus"]],
16426
+ [
16427
+ / mms\/([\w\.]+)$/i
16428
+ // Opera Neon
16429
+ ],
16430
+ [VERSION, [NAME, OPERA + " Neon"]],
16431
+ [
16432
+ / opt\/([\w\.]+)$/i
16433
+ // Opera Touch
16434
+ ],
16435
+ [VERSION, [NAME, OPERA + " Touch"]],
16436
+ [
16437
+ /coc_coc\w+\/([\w\.]+)/i
16438
+ // Coc Coc Browser
16439
+ ],
16440
+ [VERSION, [NAME, "Coc Coc"]],
16441
+ [
16442
+ /dolfin\/([\w\.]+)/i
16443
+ // Dolphin
16444
+ ],
16445
+ [VERSION, [NAME, "Dolphin"]],
16446
+ [
16447
+ /coast\/([\w\.]+)/i
16448
+ // Opera Coast
16449
+ ],
16450
+ [VERSION, [NAME, OPERA + " Coast"]],
16451
+ [
16452
+ /miuibrowser\/([\w\.]+)/i
16453
+ // MIUI Browser
16454
+ ],
16455
+ [VERSION, [NAME, "MIUI" + SUFFIX_BROWSER]],
16456
+ [
16457
+ /fxios\/([\w\.-]+)/i
16458
+ // Firefox for iOS
16459
+ ],
16460
+ [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]],
16461
+ [
16462
+ /\bqihoobrowser\/?([\w\.]*)/i
16463
+ // 360
16464
+ ],
16465
+ [VERSION, [NAME, "360"]],
16466
+ [
16467
+ /\b(qq)\/([\w\.]+)/i
16468
+ // QQ
16469
+ ],
16470
+ [[NAME, /(.+)/, "$1Browser"], VERSION],
16471
+ [
16472
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
16473
+ ],
16474
+ [[NAME, /(.+)/, "$1" + SUFFIX_BROWSER], VERSION],
16475
+ [
16476
+ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
16477
+ /samsungbrowser\/([\w\.]+)/i
16478
+ // Samsung Internet
16479
+ ],
16480
+ [VERSION, [NAME, SAMSUNG + " Internet"]],
16481
+ [
16482
+ /metasr[\/ ]?([\d\.]+)/i
16483
+ // Sogou Explorer
16484
+ ],
16485
+ [VERSION, [NAME, SOGOU + " Explorer"]],
16486
+ [
16487
+ /(sogou)mo\w+\/([\d\.]+)/i
16488
+ // Sogou Mobile
16489
+ ],
16490
+ [[NAME, SOGOU + " Mobile"], VERSION],
16491
+ [
16492
+ /(electron)\/([\w\.]+) safari/i,
16493
+ // Electron-based App
16494
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
16495
+ // Tesla
16496
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
16497
+ // QQ/2345
16498
+ ],
16499
+ [NAME, VERSION],
16500
+ [
16501
+ /(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i
16502
+ // LieBao Browser/Luakit/Rekonq/Steam
16503
+ ],
16504
+ [NAME],
16505
+ [
16506
+ /ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i
16507
+ // Iron / 360
16508
+ ],
16509
+ [VERSION, NAME],
16510
+ [
16511
+ // WebView
16512
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
16513
+ // Facebook App for iOS & Android
16514
+ ],
16515
+ [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]],
16516
+ [
16517
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
16518
+ // Kakao App
16519
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
16520
+ // Naver InApp
16521
+ /(daum)apps[\/ ]([\w\.]+)/i,
16522
+ // Daum App
16523
+ /safari (line)\/([\w\.]+)/i,
16524
+ // Line App for iOS
16525
+ /\b(line)\/([\w\.]+)\/iab/i,
16526
+ // Line App for Android
16527
+ /(alipay)client\/([\w\.]+)/i,
16528
+ // Alipay
16529
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i,
16530
+ // Twitter
16531
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i,
16532
+ // Bing
16533
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
16534
+ // Instagram/Snapchat/Klarna
16535
+ ],
16536
+ [NAME, VERSION, [TYPE, INAPP]],
16537
+ [
16538
+ /\bgsa\/([\w\.]+) .*safari\//i
16539
+ // Google Search Appliance on iOS
16540
+ ],
16541
+ [VERSION, [NAME, "GSA"], [TYPE, INAPP]],
16542
+ [
16543
+ /(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i
16544
+ // TikTok
16545
+ ],
16546
+ [VERSION, [NAME, "TikTok"], [TYPE, INAPP]],
16547
+ [
16548
+ /\[(linkedin)app\]/i
16549
+ // LinkedIn App for iOS & Android
16550
+ ],
16551
+ [NAME, [TYPE, INAPP]],
16552
+ [
16553
+ /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i
16554
+ // Zalo
16555
+ ],
16556
+ [[NAME, /(.+)/, "Zalo"], VERSION, [TYPE, INAPP]],
16557
+ [
16558
+ /(chromium)[\/ ]([-\w\.]+)/i
16559
+ // Chromium
16560
+ ],
16561
+ [NAME, VERSION],
16562
+ [
16563
+ /ome-(lighthouse)$/i
16564
+ // Chrome Lighthouse
16565
+ ],
16566
+ [NAME, [TYPE, FETCHER]],
16567
+ [
16568
+ /headlesschrome(?:\/([\w\.]+)| )/i
16569
+ // Chrome Headless
16570
+ ],
16571
+ [VERSION, [NAME, CHROME + " Headless"]],
16572
+ [
16573
+ /wv\).+chrome\/([\w\.]+).+edgw\//i
16574
+ // Edge WebView2
16575
+ ],
16576
+ [VERSION, [NAME, EDGE + " WebView2"]],
16577
+ [
16578
+ / wv\).+(chrome)\/([\w\.]+)/i
16579
+ // Chrome WebView
16580
+ ],
16581
+ [[NAME, CHROME + " WebView"], VERSION],
16582
+ [
16583
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
16584
+ // Android Browser
16585
+ ],
16586
+ [VERSION, [NAME, "Android" + SUFFIX_BROWSER]],
16587
+ [
16588
+ /chrome\/([\w\.]+) mobile/i
16589
+ // Chrome Mobile
16590
+ ],
16591
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
16592
+ [
16593
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
16594
+ // Chrome/OmniWeb/Arora/Tizen/Nokia
16595
+ ],
16596
+ [NAME, VERSION],
16597
+ [
16598
+ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i
16599
+ // Safari Mobile
16600
+ ],
16601
+ [VERSION, [NAME, PREFIX_MOBILE + "Safari"]],
16602
+ [
16603
+ /iphone .*mobile(?:\/\w+ | ?)safari/i
16604
+ ],
16605
+ [[NAME, PREFIX_MOBILE + "Safari"]],
16606
+ [
16607
+ /version\/([\w\.\,]+) .*(safari)/i
16608
+ // Safari
16609
+ ],
16610
+ [VERSION, NAME],
16611
+ [
16612
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
16613
+ // Safari < 3.0
16614
+ ],
16615
+ [NAME, [VERSION, "1"]],
16616
+ [
16617
+ /(webkit|khtml)\/([\w\.]+)/i
16618
+ ],
16619
+ [NAME, VERSION],
16620
+ [
16621
+ // Gecko based
16622
+ /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i
16623
+ // Firefox Mobile
16624
+ ],
16625
+ [[NAME, PREFIX_MOBILE + FIREFOX], VERSION],
16626
+ [
16627
+ /(navigator|netscape\d?)\/([-\w\.]+)/i
16628
+ // Netscape
16629
+ ],
16630
+ [[NAME, "Netscape"], VERSION],
16631
+ [
16632
+ /(wolvic|librewolf)\/([\w\.]+)/i
16633
+ // Wolvic/LibreWolf
16634
+ ],
16635
+ [NAME, VERSION],
16636
+ [
16637
+ /mobile vr; rv:([\w\.]+)\).+firefox/i
16638
+ // Firefox Reality
16639
+ ],
16640
+ [VERSION, [NAME, FIREFOX + " Reality"]],
16641
+ [
16642
+ /ekiohf.+(flow)\/([\w\.]+)/i,
16643
+ // Flow
16644
+ /(swiftfox)/i,
16645
+ // Swiftfox
16646
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
16647
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
16648
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
16649
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
16650
+ /(firefox)\/([\w\.]+)/i,
16651
+ // Other Firefox-based
16652
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
16653
+ // Mozilla
16654
+ // Other
16655
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
16656
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
16657
+ /\b(links) \(([\w\.]+)/i
16658
+ // Links
16659
+ ],
16660
+ [NAME, [VERSION, /_/g, "."]],
16661
+ [
16662
+ /(cobalt)\/([\w\.]+)/i
16663
+ // Cobalt
16664
+ ],
16665
+ [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
16666
+ ],
16667
+ cpu: [
16668
+ [
16669
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i
16670
+ // AMD64 (x64)
16671
+ ],
16672
+ [[ARCHITECTURE, "amd64"]],
16673
+ [
16674
+ /(ia32(?=;))/i,
16675
+ // IA32 (quicktime)
16676
+ /\b((i[346]|x)86)(pc)?\b/i
16677
+ // IA32 (x86)
16678
+ ],
16679
+ [[ARCHITECTURE, "ia32"]],
16680
+ [
16681
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i
16682
+ // ARM64
16683
+ ],
16684
+ [[ARCHITECTURE, "arm64"]],
16685
+ [
16686
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i
16687
+ // ARMHF
16688
+ ],
16689
+ [[ARCHITECTURE, "armhf"]],
16690
+ [
16691
+ // PocketPC mistakenly identified as PowerPC
16692
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
16693
+ ],
16694
+ [[ARCHITECTURE, "arm"]],
16695
+ [
16696
+ / sun4\w[;\)]/i
16697
+ // SPARC
16698
+ ],
16699
+ [[ARCHITECTURE, "sparc"]],
16700
+ [
16701
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
16702
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
16703
+ /((ppc|powerpc)(64)?)( mac|;|\))/i,
16704
+ // PowerPC
16705
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
16706
+ // Alpha
16707
+ ],
16708
+ [[ARCHITECTURE, /ower/, EMPTY, lowerize]],
16709
+ [
16710
+ /mc680.0/i
16711
+ ],
16712
+ [[ARCHITECTURE, "68k"]],
16713
+ [
16714
+ /winnt.+\[axp/i
16715
+ ],
16716
+ [[ARCHITECTURE, "alpha"]]
16717
+ ],
16718
+ device: [
16719
+ [
16720
+ //////////////////////////
16721
+ // MOBILES & TABLETS
16722
+ /////////////////////////
16723
+ // Samsung
16724
+ /\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
16725
+ ],
16726
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]],
16727
+ [
16728
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
16729
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
16730
+ /sec-(sgh\w+)/i
16731
+ ],
16732
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]],
16733
+ [
16734
+ // Apple
16735
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i
16736
+ // iPod/iPhone
16737
+ ],
16738
+ [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]],
16739
+ [
16740
+ /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,
16741
+ // iPad
16742
+ /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
16743
+ ],
16744
+ [MODEL, [VENDOR, APPLE], [TYPE, TABLET]],
16745
+ [
16746
+ /(macintosh);/i
16747
+ ],
16748
+ [MODEL, [VENDOR, APPLE]],
16749
+ [
16750
+ // Sharp
16751
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
16752
+ ],
16753
+ [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]],
16754
+ [
16755
+ // Honor
16756
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
16757
+ ],
16758
+ [MODEL, [VENDOR, HONOR], [TYPE, TABLET]],
16759
+ [
16760
+ /honor([-\w ]+)[;\)]/i
16761
+ ],
16762
+ [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]],
16763
+ [
16764
+ // Huawei
16765
+ /\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
16766
+ ],
16767
+ [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]],
16768
+ [
16769
+ /(?:huawei) ?([-\w ]+)[;\)]/i,
16770
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
16771
+ ],
16772
+ [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]],
16773
+ [
16774
+ // Xiaomi
16775
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
16776
+ /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i
16777
+ // Mi Pad tablets
16778
+ ],
16779
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, TABLET]],
16780
+ [
16781
+ /\b; (\w+) build\/hm\1/i,
16782
+ // Xiaomi Hongmi 'numeric' models
16783
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
16784
+ // Xiaomi Hongmi
16785
+ // Xiaomi Redmi / POCO / Black Shark / Qin
16786
+ /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
16787
+ // Xiaomi Mi
16788
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
16789
+ / ([\w ]+) miui\/v?\d/i
16790
+ ],
16791
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, MOBILE]],
16792
+ [
16793
+ // OnePlus
16794
+ /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-l]\w[1m]10)\b/i,
16795
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
16796
+ ],
16797
+ [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]],
16798
+ [
16799
+ // OPPO
16800
+ /; (\w+) bui.+ oppo/i,
16801
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
16802
+ ],
16803
+ [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]],
16804
+ [
16805
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
16806
+ ],
16807
+ [MODEL, [VENDOR, strMapper, { "OnePlus": ["203", "304", "403", "404", "413", "415"], "*": OPPO }], [TYPE, TABLET]],
16808
+ [
16809
+ // BLU
16810
+ /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i
16811
+ // Vivo series
16812
+ ],
16813
+ [MODEL, [VENDOR, "BLU"], [TYPE, MOBILE]],
16814
+ [
16815
+ // Vivo
16816
+ /; vivo (\w+)(?: bui|\))/i,
16817
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
16818
+ ],
16819
+ [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]],
16820
+ [
16821
+ // Realme
16822
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
16823
+ ],
16824
+ [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]],
16825
+ [
16826
+ // Lenovo
16827
+ /(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,
16828
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
16829
+ ],
16830
+ [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]],
16831
+ [
16832
+ /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
16833
+ ],
16834
+ [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]],
16835
+ [
16836
+ // Motorola
16837
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
16838
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
16839
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
16840
+ ],
16841
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]],
16842
+ [
16843
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
16844
+ ],
16845
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]],
16846
+ [
16847
+ // LG
16848
+ /\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
16849
+ ],
16850
+ [MODEL, [VENDOR, LG], [TYPE, TABLET]],
16851
+ [
16852
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
16853
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
16854
+ /\blg-?([\d\w]+) bui/i
16855
+ ],
16856
+ [MODEL, [VENDOR, LG], [TYPE, MOBILE]],
16857
+ [
16858
+ // Nokia
16859
+ /(nokia) (t[12][01])/i
16860
+ ],
16861
+ [VENDOR, MODEL, [TYPE, TABLET]],
16862
+ [
16863
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
16864
+ /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
16865
+ ],
16866
+ [[MODEL, /_/g, " "], [TYPE, MOBILE], [VENDOR, "Nokia"]],
16867
+ [
16868
+ // Google
16869
+ /(pixel (c|tablet))\b/i
16870
+ // Google Pixel C/Tablet
16871
+ ],
16872
+ [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]],
16873
+ [
16874
+ // Google Pixel
16875
+ /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
16876
+ ],
16877
+ [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]],
16878
+ [
16879
+ /(google) (pixelbook( go)?)/i
16880
+ ],
16881
+ [VENDOR, MODEL],
16882
+ [
16883
+ // Sony
16884
+ /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
16885
+ ],
16886
+ [MODEL, [VENDOR, SONY], [TYPE, MOBILE]],
16887
+ [
16888
+ /sony tablet [ps]/i,
16889
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
16890
+ ],
16891
+ [[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET]],
16892
+ [
16893
+ // Amazon
16894
+ /(alexa)webm/i,
16895
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
16896
+ // Kindle Fire without Silk / Echo Show
16897
+ /(kf[a-z]+)( bui|\)).+silk\//i
16898
+ // Kindle Fire HD
16899
+ ],
16900
+ [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]],
16901
+ [
16902
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
16903
+ // Fire Phone
16904
+ ],
16905
+ [[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE, MOBILE]],
16906
+ [
16907
+ // BlackBerry
16908
+ /(playbook);[-\w\),; ]+(rim)/i
16909
+ // BlackBerry PlayBook
16910
+ ],
16911
+ [MODEL, VENDOR, [TYPE, TABLET]],
16912
+ [
16913
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
16914
+ /(?:blackberry|\(bb10;) (\w+)/i
16915
+ ],
16916
+ [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]],
16917
+ [
16918
+ // Asus
16919
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
16920
+ ],
16921
+ [MODEL, [VENDOR, ASUS], [TYPE, TABLET]],
16922
+ [
16923
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
16924
+ ],
16925
+ [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]],
16926
+ [
16927
+ // HTC
16928
+ /(nexus 9)/i
16929
+ // HTC Nexus 9
16930
+ ],
16931
+ [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]],
16932
+ [
16933
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
16934
+ // HTC
16935
+ // ZTE
16936
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
16937
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
16938
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
16939
+ ],
16940
+ [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]],
16941
+ [
16942
+ // TCL
16943
+ /tcl (xess p17aa)/i,
16944
+ /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
16945
+ ],
16946
+ [MODEL, [VENDOR, "TCL"], [TYPE, TABLET]],
16947
+ [
16948
+ /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
16949
+ ],
16950
+ [MODEL, [VENDOR, "TCL"], [TYPE, MOBILE]],
16951
+ [
16952
+ // itel
16953
+ /(itel) ((\w+))/i
16954
+ ],
16955
+ [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { "tablet": ["p10001l", "w7001"], "*": "mobile" }]],
16956
+ [
16957
+ // Acer
16958
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
16959
+ ],
16960
+ [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]],
16961
+ [
16962
+ // Meizu
16963
+ /droid.+; (m[1-5] note) bui/i,
16964
+ /\bmz-([-\w]{2,})/i
16965
+ ],
16966
+ [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]],
16967
+ [
16968
+ // Ulefone
16969
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
16970
+ ],
16971
+ [MODEL, [VENDOR, "Ulefone"], [TYPE, MOBILE]],
16972
+ [
16973
+ // Energizer
16974
+ /; (energy ?\w+)(?: bui|\))/i,
16975
+ /; energizer ([\w ]+)(?: bui|\))/i
16976
+ ],
16977
+ [MODEL, [VENDOR, "Energizer"], [TYPE, MOBILE]],
16978
+ [
16979
+ // Cat
16980
+ /; cat (b35);/i,
16981
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
16982
+ ],
16983
+ [MODEL, [VENDOR, "Cat"], [TYPE, MOBILE]],
16984
+ [
16985
+ // Smartfren
16986
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
16987
+ ],
16988
+ [MODEL, [VENDOR, "Smartfren"], [TYPE, MOBILE]],
16989
+ [
16990
+ // Nothing
16991
+ /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
16992
+ ],
16993
+ [MODEL, [VENDOR, "Nothing"], [TYPE, MOBILE]],
16994
+ [
16995
+ // Archos
16996
+ /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
16997
+ /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
16998
+ ],
16999
+ [MODEL, [VENDOR, "Archos"], [TYPE, TABLET]],
17000
+ [
17001
+ /archos ([\w ]+)( b|\))/i,
17002
+ /; (ac[3-6]\d\w{2,8})( b|\))/i
17003
+ ],
17004
+ [MODEL, [VENDOR, "Archos"], [TYPE, MOBILE]],
17005
+ [
17006
+ // HMD
17007
+ /; (n159v)/i
17008
+ ],
17009
+ [MODEL, [VENDOR, "HMD"], [TYPE, MOBILE]],
17010
+ [
17011
+ // MIXED
17012
+ /(imo) (tab \w+)/i,
17013
+ // IMO
17014
+ /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i
17015
+ // Infinix XPad / Tecno
17016
+ ],
17017
+ [VENDOR, MODEL, [TYPE, TABLET]],
17018
+ [
17019
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
17020
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
17021
+ // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
17022
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
17023
+ /(hp) ([\w ]+\w)/i,
17024
+ // HP iPAQ
17025
+ /(microsoft); (lumia[\w ]+)/i,
17026
+ // Microsoft Lumia
17027
+ /(oppo) ?([\w ]+) bui/i,
17028
+ // OPPO
17029
+ /(hisense) ([ehv][\w ]+)\)/i,
17030
+ // Hisense
17031
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
17032
+ // Philips
17033
+ ],
17034
+ [VENDOR, MODEL, [TYPE, MOBILE]],
17035
+ [
17036
+ /(kobo)\s(ereader|touch)/i,
17037
+ // Kobo
17038
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
17039
+ // HP TouchPad
17040
+ /(kindle)\/([\w\.]+)/i
17041
+ // Kindle
17042
+ ],
17043
+ [VENDOR, MODEL, [TYPE, TABLET]],
17044
+ [
17045
+ /(surface duo)/i
17046
+ // Surface Duo
17047
+ ],
17048
+ [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]],
17049
+ [
17050
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i
17051
+ // Fairphone
17052
+ ],
17053
+ [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]],
17054
+ [
17055
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i
17056
+ // Nvidia Tablets
17057
+ ],
17058
+ [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]],
17059
+ [
17060
+ /(sprint) (\w+)/i
17061
+ // Sprint Phones
17062
+ ],
17063
+ [VENDOR, MODEL, [TYPE, MOBILE]],
17064
+ [
17065
+ /(kin\.[onetw]{3})/i
17066
+ // Microsoft Kin
17067
+ ],
17068
+ [[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE, MOBILE]],
17069
+ [
17070
+ /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
17071
+ // Zebra
17072
+ ],
17073
+ [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]],
17074
+ [
17075
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
17076
+ ],
17077
+ [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]],
17078
+ [
17079
+ ///////////////////
17080
+ // SMARTTVS
17081
+ ///////////////////
17082
+ /(philips)[\w ]+tv/i,
17083
+ // Philips
17084
+ /smart-tv.+(samsung)/i
17085
+ // Samsung
17086
+ ],
17087
+ [VENDOR, [TYPE, SMARTTV]],
17088
+ [
17089
+ /hbbtv.+maple;(\d+)/i
17090
+ ],
17091
+ [[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE, SMARTTV]],
17092
+ [
17093
+ /(vizio)(?: |.+model\/)(\w+-\w+)/i,
17094
+ // Vizio
17095
+ /tcast.+(lg)e?. ([-\w]+)/i
17096
+ // LG SmartTV
17097
+ ],
17098
+ [VENDOR, MODEL, [TYPE, SMARTTV]],
17099
+ [
17100
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
17101
+ ],
17102
+ [[VENDOR, LG], [TYPE, SMARTTV]],
17103
+ [
17104
+ /(apple) ?tv/i
17105
+ // Apple TV
17106
+ ],
17107
+ [VENDOR, [MODEL, APPLE + " TV"], [TYPE, SMARTTV]],
17108
+ [
17109
+ /crkey.*devicetype\/chromecast/i
17110
+ // Google Chromecast Third Generation
17111
+ ],
17112
+ [[MODEL, CHROMECAST + " Third Generation"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
17113
+ [
17114
+ /crkey.*devicetype\/([^/]*)/i
17115
+ // Google Chromecast with specific device type
17116
+ ],
17117
+ [[MODEL, /^/, "Chromecast "], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
17118
+ [
17119
+ /fuchsia.*crkey/i
17120
+ // Google Chromecast Nest Hub
17121
+ ],
17122
+ [[MODEL, CHROMECAST + " Nest Hub"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
17123
+ [
17124
+ /crkey/i
17125
+ // Google Chromecast, Linux-based or unknown
17126
+ ],
17127
+ [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
17128
+ [
17129
+ /(portaltv)/i
17130
+ // Facebook Portal TV
17131
+ ],
17132
+ [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]],
17133
+ [
17134
+ /droid.+aft(\w+)( bui|\))/i
17135
+ // Fire TV
17136
+ ],
17137
+ [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]],
17138
+ [
17139
+ /(shield \w+ tv)/i
17140
+ // Nvidia Shield TV
17141
+ ],
17142
+ [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]],
17143
+ [
17144
+ /\(dtv[\);].+(aquos)/i,
17145
+ /(aquos-tv[\w ]+)\)/i
17146
+ // Sharp
17147
+ ],
17148
+ [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],
17149
+ [
17150
+ /(bravia[\w ]+)( bui|\))/i
17151
+ // Sony
17152
+ ],
17153
+ [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]],
17154
+ [
17155
+ /(mi(tv|box)-?\w+) bui/i
17156
+ // Xiaomi
17157
+ ],
17158
+ [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]],
17159
+ [
17160
+ /Hbbtv.*(technisat) (.*);/i
17161
+ // TechniSAT
17162
+ ],
17163
+ [VENDOR, MODEL, [TYPE, SMARTTV]],
17164
+ [
17165
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
17166
+ // Roku
17167
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
17168
+ // HbbTV devices
17169
+ ],
17170
+ [[VENDOR, /.+\/(\w+)/, "$1", strMapper, { "LG": "lge" }], [MODEL, trim], [TYPE, SMARTTV]],
17171
+ [
17172
+ ///////////////////
17173
+ // CONSOLES
17174
+ ///////////////////
17175
+ /(playstation \w+)/i
17176
+ // Playstation
17177
+ ],
17178
+ [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]],
17179
+ [
17180
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i
17181
+ // Microsoft Xbox
17182
+ ],
17183
+ [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]],
17184
+ [
17185
+ /(ouya)/i,
17186
+ // Ouya
17187
+ /(nintendo) (\w+)/i,
17188
+ // Nintendo
17189
+ /(retroid) (pocket ([^\)]+))/i,
17190
+ // Retroid Pocket
17191
+ /(valve).+(steam deck)/i,
17192
+ /droid.+; ((shield|rgcube|gr0006))( bui|\))/i
17193
+ // Nvidia Portable/Anbernic/Logitech
17194
+ ],
17195
+ [[VENDOR, strMapper, { "Nvidia": "Shield", "Anbernic": "RGCUBE", "Logitech": "GR0006" }], MODEL, [TYPE, CONSOLE]],
17196
+ [
17197
+ ///////////////////
17198
+ // WEARABLES
17199
+ ///////////////////
17200
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i
17201
+ // Samsung Galaxy Watch
17202
+ ],
17203
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]],
17204
+ [
17205
+ /((pebble))app/i,
17206
+ // Pebble
17207
+ /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i
17208
+ // Asus ZenWatch / LG Watch / Pixel Watch / Xiaomi Watch
17209
+ ],
17210
+ [VENDOR, MODEL, [TYPE, WEARABLE]],
17211
+ [
17212
+ /(ow(?:19|20)?we?[1-3]{1,3})/i
17213
+ // Oppo Watch
17214
+ ],
17215
+ [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]],
17216
+ [
17217
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
17218
+ // Apple Watch
17219
+ ],
17220
+ [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]],
17221
+ [
17222
+ /(opwwe\d{3})/i
17223
+ // OnePlus Watch
17224
+ ],
17225
+ [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]],
17226
+ [
17227
+ /(moto 360)/i
17228
+ // Motorola 360
17229
+ ],
17230
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]],
17231
+ [
17232
+ /(smartwatch 3)/i
17233
+ // Sony SmartWatch
17234
+ ],
17235
+ [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]],
17236
+ [
17237
+ /(g watch r)/i
17238
+ // LG G Watch R
17239
+ ],
17240
+ [MODEL, [VENDOR, LG], [TYPE, WEARABLE]],
17241
+ [
17242
+ /droid.+; (wt63?0{2,3})\)/i
17243
+ ],
17244
+ [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]],
17245
+ [
17246
+ ///////////////////
17247
+ // XR
17248
+ ///////////////////
17249
+ /droid.+; (glass) \d/i
17250
+ // Google Glass
17251
+ ],
17252
+ [MODEL, [VENDOR, GOOGLE], [TYPE, XR]],
17253
+ [
17254
+ /(pico) ([\w ]+) os\d/i
17255
+ // Pico
17256
+ ],
17257
+ [VENDOR, MODEL, [TYPE, XR]],
17258
+ [
17259
+ /(quest( \d| pro)?s?).+vr/i
17260
+ // Meta Quest
17261
+ ],
17262
+ [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]],
17263
+ [
17264
+ /mobile vr; rv.+firefox/i
17265
+ // Unidentifiable VR device using Firefox Reality / Wolvic
17266
+ ],
17267
+ [[TYPE, XR]],
17268
+ [
17269
+ ///////////////////
17270
+ // EMBEDDED
17271
+ ///////////////////
17272
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
17273
+ // Tesla
17274
+ ],
17275
+ [VENDOR, [TYPE, EMBEDDED]],
17276
+ [
17277
+ /(aeobc)\b/i
17278
+ // Echo Dot
17279
+ ],
17280
+ [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]],
17281
+ [
17282
+ /(homepod).+mac os/i
17283
+ // Apple HomePod
17284
+ ],
17285
+ [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]],
17286
+ [
17287
+ /windows iot/i
17288
+ // Unidentifiable embedded device using Windows IoT
17289
+ ],
17290
+ [[TYPE, EMBEDDED]],
17291
+ [
17292
+ ////////////////////
17293
+ // MIXED (GENERIC)
17294
+ ///////////////////
17295
+ /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i
17296
+ // Unidentifiable SmartTV
17297
+ ],
17298
+ [MODEL, [TYPE, SMARTTV]],
17299
+ [
17300
+ /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
17301
+ ],
17302
+ [[TYPE, SMARTTV]],
17303
+ [
17304
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
17305
+ ],
17306
+ [MODEL, [TYPE, strMapper, { "mobile": "Mobile", "xr": "VR", "*": TABLET }]],
17307
+ [
17308
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
17309
+ // Unidentifiable Tablet
17310
+ ],
17311
+ [[TYPE, TABLET]],
17312
+ [
17313
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
17314
+ // Unidentifiable Mobile
17315
+ ],
17316
+ [[TYPE, MOBILE]],
17317
+ [
17318
+ /droid .+?; ([\w\. -]+)( bui|\))/i
17319
+ // Generic Android Device
17320
+ ],
17321
+ [MODEL, [VENDOR, "Generic"]]
17322
+ ],
17323
+ engine: [
17324
+ [
17325
+ /windows.+ edge\/([\w\.]+)/i
17326
+ // EdgeHTML
17327
+ ],
17328
+ [VERSION, [NAME, EDGE + "HTML"]],
17329
+ [
17330
+ /(arkweb)\/([\w\.]+)/i
17331
+ // ArkWeb
17332
+ ],
17333
+ [NAME, VERSION],
17334
+ [
17335
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
17336
+ // Blink
17337
+ ],
17338
+ [VERSION, [NAME, "Blink"]],
17339
+ [
17340
+ /(presto)\/([\w\.]+)/i,
17341
+ // Presto
17342
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
17343
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
17344
+ /ekioh(flow)\/([\w\.]+)/i,
17345
+ // Flow
17346
+ /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,
17347
+ // KHTML/Tasman/Links/Dillo
17348
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
17349
+ // iCab
17350
+ /\b(libweb)/i
17351
+ // LibWeb
17352
+ ],
17353
+ [NAME, VERSION],
17354
+ [
17355
+ /ladybird\//i
17356
+ ],
17357
+ [[NAME, "LibWeb"]],
17358
+ [
17359
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i
17360
+ // Gecko
17361
+ ],
17362
+ [VERSION, NAME]
17363
+ ],
17364
+ os: [
17365
+ [
17366
+ // Windows
17367
+ /(windows nt) (6\.[23]); arm/i
17368
+ // Windows RT
17369
+ ],
17370
+ [[NAME, /N/, "R"], [VERSION, strMapper, windowsVersionMap]],
17371
+ [
17372
+ /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,
17373
+ // Windows IoT/Mobile/Phone
17374
+ // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
17375
+ /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
17376
+ ],
17377
+ [NAME, VERSION],
17378
+ [
17379
+ /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
17380
+ /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
17381
+ ],
17382
+ [[VERSION, /(;|\))/g, "", strMapper, windowsVersionMap], [NAME, WINDOWS]],
17383
+ [
17384
+ /(windows ce)\/?([\d\.]*)/i
17385
+ // Windows CE
17386
+ ],
17387
+ [NAME, VERSION],
17388
+ [
17389
+ // iOS/macOS
17390
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
17391
+ // iOS
17392
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
17393
+ /\btvos ?([\w\.]+)/i,
17394
+ /cfnetwork\/.+darwin/i
17395
+ ],
17396
+ [[VERSION, /_/g, "."], [NAME, "iOS"]],
17397
+ [
17398
+ /(mac os x) ?([\w\. ]*)/i,
17399
+ /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i
17400
+ // Mac OS
17401
+ ],
17402
+ [[NAME, "macOS"], [VERSION, /_/g, "."]],
17403
+ [
17404
+ // Google Chromecast
17405
+ /android ([\d\.]+).*crkey/i
17406
+ // Google Chromecast, Android-based
17407
+ ],
17408
+ [VERSION, [NAME, CHROMECAST + " Android"]],
17409
+ [
17410
+ /fuchsia.*crkey\/([\d\.]+)/i
17411
+ // Google Chromecast, Fuchsia-based
17412
+ ],
17413
+ [VERSION, [NAME, CHROMECAST + " Fuchsia"]],
17414
+ [
17415
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i
17416
+ // Google Chromecast, Linux-based Smart Speaker
17417
+ ],
17418
+ [VERSION, [NAME, CHROMECAST + " SmartSpeaker"]],
17419
+ [
17420
+ /linux.*crkey\/([\d\.]+)/i
17421
+ // Google Chromecast, Legacy Linux-based
17422
+ ],
17423
+ [VERSION, [NAME, CHROMECAST + " Linux"]],
17424
+ [
17425
+ /crkey\/([\d\.]+)/i
17426
+ // Google Chromecast, unknown
17427
+ ],
17428
+ [VERSION, [NAME, CHROMECAST]],
17429
+ [
17430
+ // Mobile OSes
17431
+ /droid ([\w\.]+)\b.+(android[- ]x86)/i
17432
+ // Android-x86
17433
+ ],
17434
+ [VERSION, NAME],
17435
+ [
17436
+ /(ubuntu) ([\w\.]+) like android/i
17437
+ // Ubuntu Touch
17438
+ ],
17439
+ [[NAME, /(.+)/, "$1 Touch"], VERSION],
17440
+ [
17441
+ /(harmonyos)[\/ ]?([\d\.]*)/i,
17442
+ // HarmonyOS
17443
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
17444
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
17445
+ ],
17446
+ [NAME, VERSION],
17447
+ [
17448
+ /\(bb(10);/i
17449
+ // BlackBerry 10
17450
+ ],
17451
+ [VERSION, [NAME, BLACKBERRY]],
17452
+ [
17453
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i
17454
+ // Symbian
17455
+ ],
17456
+ [VERSION, [NAME, "Symbian"]],
17457
+ [
17458
+ /mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i
17459
+ // Firefox OS
17460
+ ],
17461
+ [VERSION, [NAME, FIREFOX + " OS"]],
17462
+ [
17463
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,
17464
+ // WebOS
17465
+ /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
17466
+ ],
17467
+ [VERSION, [NAME, "webOS"]],
17468
+ [
17469
+ /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
17470
+ // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
17471
+ ],
17472
+ [[VERSION, strMapper, { "25": "120", "24": "108", "23": "94", "22": "87", "6": "79", "5": "68", "4": "53", "3": "38", "2": "538", "1": "537", "*": "TV" }], [NAME, "webOS"]],
17473
+ [
17474
+ /watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i
17475
+ // watchOS
17476
+ ],
17477
+ [VERSION, [NAME, "watchOS"]],
17478
+ [
17479
+ // Google ChromeOS
17480
+ /cros [\w]+(?:\)| ([\w\.]+)\b)/i
17481
+ // Chromium OS
17482
+ ],
17483
+ [VERSION, [NAME, "Chrome OS"]],
17484
+ [
17485
+ // Smart TVs
17486
+ /kepler ([\w\.]+); (aft|aeo)/i
17487
+ // Vega OS
17488
+ ],
17489
+ [VERSION, [NAME, "Vega OS"]],
17490
+ [
17491
+ /(netrange)mmh/i,
17492
+ // Netrange
17493
+ /(nettv)\/(\d+\.[\w\.]+)/i,
17494
+ // NetTV
17495
+ // Console
17496
+ /(nintendo|playstation) (\w+)/i,
17497
+ // Nintendo/Playstation
17498
+ /(xbox); +xbox ([^\);]+)/i,
17499
+ // Microsoft Xbox (360, One, X, S, Series X, Series S)
17500
+ /(pico) .+os([\w\.]+)/i,
17501
+ // Pico
17502
+ // Other
17503
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
17504
+ // Joli/Palm
17505
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
17506
+ // Mint
17507
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
17508
+ // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
17509
+ /([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,
17510
+ // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
17511
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
17512
+ // Solaris
17513
+ /\b(aix)[; ]([1-9\.]{0,4})/i,
17514
+ // AIX
17515
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
17516
+ // Hurd/Linux/MorphOS
17517
+ /(gnu) ?([\w\.]*)/i,
17518
+ // GNU
17519
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
17520
+ // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
17521
+ /(haiku) ?(r\d)?/i
17522
+ // Haiku
17523
+ ],
17524
+ [NAME, VERSION],
17525
+ [
17526
+ /(sunos) ?([\d\.]*)/i
17527
+ // Solaris
17528
+ ],
17529
+ [[NAME, "Solaris"], VERSION],
17530
+ [
17531
+ /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,
17532
+ // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
17533
+ /(unix) ?([\w\.]*)/i
17534
+ // UNIX
17535
+ ],
17536
+ [NAME, VERSION]
17537
+ ]
17538
+ };
17539
+ var defaultProps = (function() {
17540
+ var props = { init: {}, isIgnore: {}, isIgnoreRgx: {}, toString: {} };
17541
+ setProps.call(props.init, [
17542
+ [BROWSER, [NAME, VERSION, MAJOR, TYPE]],
17543
+ [CPU, [ARCHITECTURE]],
17544
+ [DEVICE, [TYPE, MODEL, VENDOR]],
17545
+ [ENGINE, [NAME, VERSION]],
17546
+ [OS, [NAME, VERSION]]
17547
+ ]);
17548
+ setProps.call(props.isIgnore, [
17549
+ [BROWSER, [VERSION, MAJOR]],
17550
+ [ENGINE, [VERSION]],
17551
+ [OS, [VERSION]]
17552
+ ]);
17553
+ setProps.call(props.isIgnoreRgx, [
17554
+ [BROWSER, / ?browser$/i],
17555
+ [OS, / ?os$/i]
17556
+ ]);
17557
+ setProps.call(props.toString, [
17558
+ [BROWSER, [NAME, VERSION]],
17559
+ [CPU, [ARCHITECTURE]],
17560
+ [DEVICE, [VENDOR, MODEL]],
17561
+ [ENGINE, [NAME, VERSION]],
17562
+ [OS, [NAME, VERSION]]
17563
+ ]);
17564
+ return props;
17565
+ })();
17566
+ var createIData = function(item, itemType) {
17567
+ var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
17568
+ function IData() {
17569
+ setProps.call(this, init_props);
17570
+ }
17571
+ IData.prototype.getItem = function() {
17572
+ return item;
17573
+ };
17574
+ IData.prototype.withClientHints = function() {
17575
+ if (!NAVIGATOR_UADATA) {
17576
+ return item.parseCH().get();
17577
+ }
17578
+ return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
17579
+ return item.setCH(new UACHData(res, false)).parseCH().get();
17580
+ });
17581
+ };
17582
+ IData.prototype.withFeatureCheck = function() {
17583
+ return item.detectFeature().get();
17584
+ };
17585
+ if (itemType != RESULT) {
17586
+ IData.prototype.is = function(strToCheck) {
17587
+ var is = false;
17588
+ for (var i2 in this) {
17589
+ if (this.hasOwnProperty(i2) && !has(is_ignoreProps, i2) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i2]) : this[i2]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
17590
+ is = true;
17591
+ if (strToCheck != TYPEOF.UNDEFINED) break;
17592
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
17593
+ is = !is;
17594
+ break;
17595
+ }
17596
+ }
17597
+ return is;
17598
+ };
17599
+ IData.prototype.toString = function() {
17600
+ var str = EMPTY;
17601
+ for (var i2 in toString_props) {
17602
+ if (typeof this[toString_props[i2]] !== TYPEOF.UNDEFINED) {
17603
+ str += (str ? " " : EMPTY) + this[toString_props[i2]];
17604
+ }
17605
+ }
17606
+ return str || TYPEOF.UNDEFINED;
17607
+ };
17608
+ }
17609
+ IData.prototype.then = function(cb2) {
17610
+ var that = this;
17611
+ var IDataResolve = function() {
17612
+ for (var prop in that) {
17613
+ if (that.hasOwnProperty(prop)) {
17614
+ this[prop] = that[prop];
17615
+ }
17616
+ }
17617
+ };
17618
+ IDataResolve.prototype = {
17619
+ is: IData.prototype.is,
17620
+ toString: IData.prototype.toString,
17621
+ withClientHints: IData.prototype.withClientHints,
17622
+ withFeatureCheck: IData.prototype.withFeatureCheck
17623
+ };
17624
+ var resolveData = new IDataResolve();
17625
+ cb2(resolveData);
17626
+ return resolveData;
17627
+ };
17628
+ return new IData();
17629
+ };
17630
+ function UACHData(uach, isHttpUACH) {
17631
+ uach = uach || {};
17632
+ setProps.call(this, CH_ALL_VALUES);
17633
+ if (isHttpUACH) {
17634
+ setProps.call(this, [
17635
+ [BRANDS, itemListToArray(uach[CH])],
17636
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
17637
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
17638
+ [MODEL, stripQuotes(uach[CH_MODEL])],
17639
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
17640
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
17641
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
17642
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
17643
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
17644
+ ]);
17645
+ } else {
17646
+ for (var prop in uach) {
17647
+ if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
17648
+ }
17649
+ }
17650
+ }
17651
+ function UAItem(itemType, ua, rgxMap, uaCH) {
17652
+ setProps.call(this, [
17653
+ ["itemType", itemType],
17654
+ ["ua", ua],
17655
+ ["uaCH", uaCH],
17656
+ ["rgxMap", rgxMap],
17657
+ ["data", createIData(this, itemType)]
17658
+ ]);
17659
+ return this;
17660
+ }
17661
+ UAItem.prototype.get = function(prop) {
17662
+ if (!prop) return this.data;
17663
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
17664
+ };
17665
+ UAItem.prototype.set = function(prop, val) {
17666
+ this.data[prop] = val;
17667
+ return this;
17668
+ };
17669
+ UAItem.prototype.setCH = function(ch) {
17670
+ this.uaCH = ch;
17671
+ return this;
17672
+ };
17673
+ UAItem.prototype.detectFeature = function() {
17674
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
17675
+ switch (this.itemType) {
17676
+ case BROWSER:
17677
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
17678
+ this.set(NAME, "Brave");
17679
+ }
17680
+ break;
17681
+ case DEVICE:
17682
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
17683
+ this.set(TYPE, MOBILE);
17684
+ }
17685
+ if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
17686
+ this.set(MODEL, "iPad").set(TYPE, TABLET);
17687
+ }
17688
+ break;
17689
+ case OS:
17690
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
17691
+ this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
17692
+ }
17693
+ break;
17694
+ case RESULT:
17695
+ var data = this.data;
17696
+ var detect = function(itemType) {
17697
+ return data[itemType].getItem().detectFeature().get();
17698
+ };
17699
+ this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
17700
+ }
17701
+ }
17702
+ return this;
17703
+ };
17704
+ UAItem.prototype.parseUA = function() {
17705
+ if (this.itemType != RESULT) {
17706
+ rgxMapper.call(this.data, this.ua, this.rgxMap);
17707
+ }
17708
+ switch (this.itemType) {
17709
+ case BROWSER:
17710
+ this.set(MAJOR, majorize(this.get(VERSION)));
17711
+ break;
17712
+ case OS:
17713
+ if (this.get(NAME) == "iOS" && this.get(VERSION) == "18.6") {
17714
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
17715
+ if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) {
17716
+ this.set(VERSION, realVersion[1]);
17717
+ }
17718
+ }
17719
+ break;
17720
+ }
17721
+ return this;
17722
+ };
17723
+ UAItem.prototype.parseCH = function() {
17724
+ var uaCH = this.uaCH, rgxMap = this.rgxMap;
17725
+ switch (this.itemType) {
17726
+ case BROWSER:
17727
+ case ENGINE:
17728
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
17729
+ if (brands) {
17730
+ for (var i2 = 0; i2 < brands.length; i2++) {
17731
+ var brandName = brands[i2].brand || brands[i2], brandVersion = brands[i2].version;
17732
+ if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
17733
+ brandName = strMapper(brandName, browserHintsMap);
17734
+ prevName = this.get(NAME);
17735
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
17736
+ this.set(NAME, brandName).set(VERSION, brandVersion).set(MAJOR, majorize(brandVersion));
17737
+ }
17738
+ prevName = brandName;
17739
+ }
17740
+ if (this.itemType == ENGINE && brandName == CHROMIUM) {
17741
+ this.set(VERSION, brandVersion);
17742
+ }
17743
+ }
17744
+ }
17745
+ break;
17746
+ case CPU:
17747
+ var archName = uaCH[ARCHITECTURE];
17748
+ if (archName) {
17749
+ if (archName && uaCH[BITNESS] == "64") archName += "64";
17750
+ rgxMapper.call(this.data, archName + ";", rgxMap);
17751
+ }
17752
+ break;
17753
+ case DEVICE:
17754
+ if (uaCH[MOBILE]) {
17755
+ this.set(TYPE, MOBILE);
17756
+ }
17757
+ if (uaCH[MODEL]) {
17758
+ this.set(MODEL, uaCH[MODEL]);
17759
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
17760
+ var reParse = {};
17761
+ rgxMapper.call(reParse, "droid 9; " + uaCH[MODEL] + ")", rgxMap);
17762
+ if (!this.get(TYPE) && !!reParse.type) {
17763
+ this.set(TYPE, reParse.type);
17764
+ }
17765
+ if (!this.get(VENDOR) && !!reParse.vendor) {
17766
+ this.set(VENDOR, reParse.vendor);
17767
+ }
17768
+ }
17769
+ }
17770
+ if (uaCH[FORMFACTORS]) {
17771
+ var ff;
17772
+ if (typeof uaCH[FORMFACTORS] !== "string") {
17773
+ var idx = 0;
17774
+ while (!ff && idx < uaCH[FORMFACTORS].length) {
17775
+ ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
17776
+ }
17777
+ } else {
17778
+ ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
17779
+ }
17780
+ this.set(TYPE, ff);
17781
+ }
17782
+ break;
17783
+ case OS:
17784
+ var osName = uaCH[PLATFORM];
17785
+ if (osName) {
17786
+ var osVersion = uaCH[PLATFORMVER];
17787
+ if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
17788
+ this.set(NAME, osName).set(VERSION, osVersion);
17789
+ }
17790
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == "Xbox") {
17791
+ this.set(NAME, "Xbox").set(VERSION, void 0);
17792
+ }
17793
+ break;
17794
+ case RESULT:
17795
+ var data = this.data;
17796
+ var parse2 = function(itemType) {
17797
+ return data[itemType].getItem().setCH(uaCH).parseCH().get();
17798
+ };
17799
+ this.set(BROWSER, parse2(BROWSER)).set(CPU, parse2(CPU)).set(DEVICE, parse2(DEVICE)).set(ENGINE, parse2(ENGINE)).set(OS, parse2(OS));
17800
+ }
17801
+ return this;
17802
+ };
17803
+ function UAParser(ua, extensions, headers) {
17804
+ if (typeof ua === TYPEOF.OBJECT) {
17805
+ if (isExtensions(ua, true)) {
17806
+ if (typeof extensions === TYPEOF.OBJECT) {
17807
+ headers = extensions;
17808
+ }
17809
+ extensions = ua;
17810
+ } else {
17811
+ headers = ua;
17812
+ extensions = void 0;
17813
+ }
17814
+ ua = void 0;
17815
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
17816
+ headers = extensions;
17817
+ extensions = void 0;
17818
+ }
17819
+ if (headers) {
17820
+ if (typeof headers.append === TYPEOF.FUNCTION) {
17821
+ var kv = {};
17822
+ headers.forEach(function(v2, k2) {
17823
+ kv[String(k2).toLowerCase()] = v2;
17824
+ });
17825
+ headers = kv;
17826
+ } else {
17827
+ var normalized = {};
17828
+ for (var header in headers) {
17829
+ if (headers.hasOwnProperty(header)) {
17830
+ normalized[String(header).toLowerCase()] = headers[header];
17831
+ }
17832
+ }
17833
+ headers = normalized;
17834
+ }
17835
+ }
17836
+ if (!(this instanceof UAParser)) {
17837
+ return new UAParser(ua, extensions, headers).getResult();
17838
+ }
17839
+ var userAgent = typeof ua === TYPEOF.STRING ? ua : (
17840
+ // Passed user-agent string
17841
+ headers && headers[USER_AGENT] ? headers[USER_AGENT] : (
17842
+ // User-Agent from passed headers
17843
+ NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : (
17844
+ // navigator.userAgent
17845
+ EMPTY
17846
+ )
17847
+ )
17848
+ ), httpUACH = new UACHData(headers, true), regexMap = extensions ? extend(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
17849
+ if (itemType == RESULT) {
17850
+ return function() {
17851
+ 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();
17852
+ };
17853
+ } else {
17854
+ return function() {
17855
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
17856
+ };
17857
+ }
17858
+ };
17859
+ setProps.call(this, [
17860
+ ["getBrowser", createItemFunc(BROWSER)],
17861
+ ["getCPU", createItemFunc(CPU)],
17862
+ ["getDevice", createItemFunc(DEVICE)],
17863
+ ["getEngine", createItemFunc(ENGINE)],
17864
+ ["getOS", createItemFunc(OS)],
17865
+ ["getResult", createItemFunc(RESULT)],
17866
+ ["getUA", function() {
17867
+ return userAgent;
17868
+ }],
17869
+ ["setUA", function(ua2) {
17870
+ if (isString2(ua2)) userAgent = trim(ua2, UA_MAX_LENGTH);
17871
+ return this;
17872
+ }]
17873
+ ]).setUA(userAgent);
17874
+ return this;
17875
+ }
17876
+ UAParser.VERSION = LIBVERSION;
17877
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
17878
+ UAParser.CPU = enumerize([ARCHITECTURE]);
17879
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
17880
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
17881
+
17882
+ // src/utils/browser.ts
17883
+ var FALLBACK = { browser: "Other", browser_version: "unknown" };
17884
+ var detectBrowser = () => {
17885
+ if (typeof navigator === "undefined" || typeof navigator.userAgent !== "string") {
17886
+ return FALLBACK;
17887
+ }
17888
+ const { name, version } = new UAParser(navigator.userAgent).getBrowser();
17889
+ if (!name || !version) {
17890
+ return FALLBACK;
17891
+ }
17892
+ return { browser: name, browser_version: version };
17893
+ };
17894
+
17895
+ // src/hooks/use-appinspector-open-analytics.ts
17896
+ var buildPayload = (container) => {
17897
+ if (container.source === "vscode") {
17898
+ return {
17899
+ extension_version: container.extensionVersion,
17900
+ ide_version: container.ideVersion,
17901
+ source: "vscode"
17902
+ };
17903
+ }
17904
+ const { browser, browser_version } = detectBrowser();
17905
+ return { browser, browser_version, source: "web" };
17906
+ };
17907
+ var useAppInspectorOpenAnalytics = () => {
17908
+ const api = useAppInspectorApi();
17909
+ const { deploymentContainer } = useAppInspector();
17910
+ const { status, statusError } = useAppInspectorStatus();
17911
+ const firedRef = useRef9(false);
17912
+ useEffect13(() => {
17913
+ if (firedRef.current) {
17914
+ return;
17915
+ }
17916
+ if (statusError) {
17917
+ return;
17918
+ }
17919
+ if (status?.status !== "ENABLED") {
17920
+ return;
17921
+ }
17922
+ firedRef.current = true;
17923
+ api.postAnalytics({
17924
+ event: "appinspector_open",
17925
+ payload: buildPayload(deploymentContainer)
17926
+ }).catch(() => {
17927
+ });
17928
+ }, [api, deploymentContainer, status, statusError]);
17929
+ };
17930
+
15989
17931
  // src/context.tsx
15990
- import { jsx as jsx130 } from "react/jsx-runtime";
15991
- var AppInspectorContext = createContext8(void 0);
17932
+ import { Fragment as Fragment7, jsx as jsx131 } from "react/jsx-runtime";
17933
+ var AppInspectorContext = createContext9(void 0);
15992
17934
  var useAppInspector = () => {
15993
- const context = useContext15(AppInspectorContext);
17935
+ const context = useContext16(AppInspectorContext);
15994
17936
  if (!context) {
15995
17937
  throw new Error("@localstack-studio/ui: components must be used within a <AppInspectorContextProvider>");
15996
17938
  }
15997
17939
  return context;
15998
17940
  };
17941
+ var AppInspectorAnalyticsBoundary = ({ children }) => {
17942
+ useAppInspectorOpenAnalytics();
17943
+ return /* @__PURE__ */ jsx131(Fragment7, { children });
17944
+ };
15999
17945
  var AppInspectorContextProvider = (props) => {
16000
- const api = useMemo6(
17946
+ const api = useMemo7(
16001
17947
  () => createApiClient({ localstackEndpoint: props.localstackEndpoint }),
16002
17948
  [props.localstackEndpoint]
16003
17949
  );
@@ -16013,27 +17959,32 @@ var AppInspectorContextProvider = (props) => {
16013
17959
  },
16014
17960
  [props.routePrefix]
16015
17961
  );
16016
- const contextValue = useMemo6(
17962
+ const deploymentContainer = useMemo7(
17963
+ () => props.deploymentContainer ?? { source: "web" },
17964
+ [props.deploymentContainer]
17965
+ );
17966
+ const contextValue = useMemo7(
16017
17967
  () => ({
17968
+ deploymentContainer,
16018
17969
  linkComponent: props.linkComponent,
16019
17970
  localstackEndpoint: props.localstackEndpoint,
16020
17971
  resolveLink
16021
17972
  }),
16022
- [props.linkComponent, props.localstackEndpoint, resolveLink]
17973
+ [deploymentContainer, props.linkComponent, props.localstackEndpoint, resolveLink]
16023
17974
  );
16024
- return /* @__PURE__ */ jsx130(ApiProvider, { api, children: /* @__PURE__ */ jsx130(AppInspectorContext.Provider, { value: contextValue, children: props.children }) });
17975
+ return /* @__PURE__ */ jsx131(ApiProvider, { api, children: /* @__PURE__ */ jsx131(StatusProvider, { children: /* @__PURE__ */ jsx131(AppInspectorContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx131(AppInspectorAnalyticsBoundary, { children: props.children }) }) }) });
16025
17976
  };
16026
17977
 
16027
17978
  // src/hooks/use-spans-ws.tsx
16028
17979
  function useSpansWebSocket(options) {
16029
17980
  const { onMessage } = options;
16030
- const onMessageRef = useRef9(onMessage);
16031
- useEffect13(() => {
17981
+ const onMessageRef = useRef10(onMessage);
17982
+ useEffect14(() => {
16032
17983
  onMessageRef.current = onMessage;
16033
17984
  }, [onMessage]);
16034
17985
  const [connected, setConnected] = useState8(false);
16035
- const wsRef = useRef9(void 0);
16036
- const reconnectRef = useRef9(void 0);
17986
+ const wsRef = useRef10(void 0);
17987
+ const reconnectRef = useRef10(void 0);
16037
17988
  const { localstackEndpoint } = useAppInspector();
16038
17989
  const connect = useCallback6(() => {
16039
17990
  if (wsRef.current !== void 0) return;
@@ -16061,7 +18012,7 @@ function useSpansWebSocket(options) {
16061
18012
  }
16062
18013
  });
16063
18014
  }, [localstackEndpoint]);
16064
- useEffect13(() => {
18015
+ useEffect14(() => {
16065
18016
  connect();
16066
18017
  return () => {
16067
18018
  if (reconnectRef.current !== void 0) clearTimeout(reconnectRef.current);
@@ -16078,17 +18029,17 @@ function useSpansWebSocket(options) {
16078
18029
  }
16079
18030
 
16080
18031
  // src/hooks/use-throttled-items.ts
16081
- import { useEffect as useEffect14, useRef as useRef10, useState as useState9 } from "react";
18032
+ import { useEffect as useEffect15, useRef as useRef11, useState as useState9 } from "react";
16082
18033
  function useThrottledItems(items, getId, catchUpIncrement = 10) {
16083
18034
  const [displayedItems, setDisplayedItems] = useState9([]);
16084
18035
  const [isCatchingUpForward, setIsCatchingUpForward] = useState9(false);
16085
18036
  const [isCatchingUpBackward, setIsCatchingUpBackward] = useState9(false);
16086
- const targetRef = useRef10([]);
16087
- const rafRef = useRef10(void 0);
16088
- const leftHiddenRef = useRef10(0);
16089
- const rightHiddenRef = useRef10(0);
16090
- const shrinkRafPendingRef = useRef10(false);
16091
- useEffect14(() => {
18037
+ const targetRef = useRef11([]);
18038
+ const rafRef = useRef11(void 0);
18039
+ const leftHiddenRef = useRef11(0);
18040
+ const rightHiddenRef = useRef11(0);
18041
+ const shrinkRafPendingRef = useRef11(false);
18042
+ useEffect15(() => {
16092
18043
  const previousTarget = targetRef.current;
16093
18044
  const target = items ?? [];
16094
18045
  targetRef.current = target;
@@ -16159,7 +18110,7 @@ function useThrottledItems(items, getId, catchUpIncrement = 10) {
16159
18110
  });
16160
18111
  }
16161
18112
  }, [items, getId, catchUpIncrement]);
16162
- useEffect14(() => {
18113
+ useEffect15(() => {
16163
18114
  return () => {
16164
18115
  if (rafRef.current !== void 0) {
16165
18116
  cancelAnimationFrame(rafRef.current);
@@ -16179,7 +18130,7 @@ var useSpans = () => {
16179
18130
  const [fetchError, setFetchError] = useState10();
16180
18131
  const [fetchingForward, setFetchingForward] = useState10(false);
16181
18132
  const [fetchingBackward, setFetchingBackward] = useState10(false);
16182
- const paginationBufferRef = useRef11(createPaginationBuffer({
18133
+ const paginationBufferRef = useRef12(createPaginationBuffer({
16183
18134
  async fetchPage(token) {
16184
18135
  const response = await api.getSpans({
16185
18136
  limit: PAGE_SIZE,
@@ -16206,9 +18157,9 @@ var useSpans = () => {
16206
18157
  onError: (error) => {
16207
18158
  setFetchError(error);
16208
18159
  },
16209
- onStatusChange(status2) {
16210
- setFetchingBackward(status2.fetchingBackward);
16211
- setFetchingForward(status2.fetchingForward);
18160
+ onStatusChange(status) {
18161
+ setFetchingBackward(status.fetchingBackward);
18162
+ setFetchingForward(status.fetchingForward);
16212
18163
  },
16213
18164
  // The spans endpoint is sorted by span ingestion time, which might differ from
16214
18165
  // the span timestamp. In order to accomodate for this, we will sort the spans
@@ -16229,10 +18180,9 @@ var useSpans = () => {
16229
18180
  const fetchBackward = useCallback7(() => {
16230
18181
  void paginationBufferRef.current.fetchBackward();
16231
18182
  }, []);
16232
- useEffect15(() => {
18183
+ useEffect16(() => {
16233
18184
  fetchForward();
16234
18185
  }, [fetchForward]);
16235
- const { checking, checkStatus, error: statusError, status } = useStatus();
16236
18186
  const [clearingSpans, setClearingSpans] = useState10(false);
16237
18187
  const clearSpans = useCallback7(async () => {
16238
18188
  if (clearingSpans) {
@@ -16255,7 +18205,7 @@ var useSpans = () => {
16255
18205
  const toggleStream = useCallback7(() => {
16256
18206
  setStreamPaused((previous) => !previous);
16257
18207
  }, []);
16258
- useEffect15(() => {
18208
+ useEffect16(() => {
16259
18209
  if (hasMoreForward === true && !fetchingForward && !streamPaused) {
16260
18210
  void paginationBufferRef.current.fetchForward();
16261
18211
  }
@@ -16275,8 +18225,6 @@ var useSpans = () => {
16275
18225
  }
16276
18226
  });
16277
18227
  return {
16278
- checking,
16279
- checkStatus,
16280
18228
  clearingSpans,
16281
18229
  clearSpans,
16282
18230
  fetchBackward,
@@ -16289,8 +18237,6 @@ var useSpans = () => {
16289
18237
  iamErrorCount,
16290
18238
  licenseLimit,
16291
18239
  spans: throttledSpans.items,
16292
- status,
16293
- statusError,
16294
18240
  streamPaused,
16295
18241
  systemLimit,
16296
18242
  toggleStream,
@@ -16303,12 +18249,12 @@ import { ArrowBack } from "@mui/icons-material";
16303
18249
  import { Box as Box19, Button as Button6, Drawer, Paper as Paper3 } from "@mui/material";
16304
18250
  import { styled } from "@mui/material/styles";
16305
18251
  import { ReactFlowProvider } from "@xyflow/react";
16306
- import { useCallback as useCallback9, useEffect as useEffect20, useRef as useRef15, useState as useState17 } from "react";
18252
+ import { useCallback as useCallback9, useEffect as useEffect21, useRef as useRef16, useState as useState17 } from "react";
16307
18253
 
16308
18254
  // src/components/event-details/event-details.tsx
16309
18255
  import { Close as Close2 } from "@mui/icons-material";
16310
18256
  import { Alert as Alert4, Box as Box15, Chip as Chip3, Divider as Divider3, FormControlLabel as FormControlLabel2, IconButton as IconButton4, Stack as Stack2, Switch, Typography as Typography10 } from "@mui/material";
16311
- import { useMemo as useMemo11, useState as useState16 } from "react";
18257
+ import { useMemo as useMemo12, useState as useState16 } from "react";
16312
18258
 
16313
18259
  // src/utils/iam-utils.ts
16314
18260
  function determinePermissionStatus(payload) {
@@ -16507,28 +18453,28 @@ var getEventGroupsByType = (events) => {
16507
18453
  // src/components/event-details/event-detail.tsx
16508
18454
  import { KeyboardArrowDown as KeyboardArrowDown2, KeyboardArrowRight as KeyboardArrowRight2 } from "@mui/icons-material";
16509
18455
  import { Box as Box12, IconButton as IconButton3, Typography as Typography7 } from "@mui/material";
16510
- import { useEffect as useEffect17, useMemo as useMemo9, useRef as useRef13, useState as useState13 } from "react";
18456
+ import { useEffect as useEffect18, useMemo as useMemo10, useRef as useRef14, useState as useState13 } from "react";
16511
18457
 
16512
18458
  // src/components/status-icon.tsx
16513
18459
  import { Cancel, CheckCircle, Error as Error2, Info, RemoveCircle } from "@mui/icons-material";
16514
18460
  import { Box as Box7 } from "@mui/material";
16515
- import { jsx as jsx131 } from "react/jsx-runtime";
18461
+ import { jsx as jsx132 } from "react/jsx-runtime";
16516
18462
  var StatusIcon = ({ errorLevel }) => {
16517
18463
  switch (errorLevel) {
16518
18464
  case EventLevel.LevelError: {
16519
- return /* @__PURE__ */ jsx131(Cancel, { sx: { color: "red" } });
18465
+ return /* @__PURE__ */ jsx132(Cancel, { sx: { color: "red" } });
16520
18466
  }
16521
18467
  case EventLevel.LevelInfo: {
16522
- return /* @__PURE__ */ jsx131(Info, { sx: { color: "gray" } });
18468
+ return /* @__PURE__ */ jsx132(Info, { sx: { color: "gray" } });
16523
18469
  }
16524
18470
  case EventLevel.LevelPermission: {
16525
- return /* @__PURE__ */ jsx131(RemoveCircle, { sx: { color: "blue" } });
18471
+ return /* @__PURE__ */ jsx132(RemoveCircle, { sx: { color: "blue" } });
16526
18472
  }
16527
18473
  case EventLevel.LevelWarning: {
16528
- return /* @__PURE__ */ jsx131(Error2, { sx: { color: "orange" } });
18474
+ return /* @__PURE__ */ jsx132(Error2, { sx: { color: "orange" } });
16529
18475
  }
16530
18476
  default: {
16531
- return /* @__PURE__ */ jsx131(CheckCircle, { sx: { color: "lightgray" } });
18477
+ return /* @__PURE__ */ jsx132(CheckCircle, { sx: { color: "lightgray" } });
16532
18478
  }
16533
18479
  }
16534
18480
  };
@@ -16536,39 +18482,39 @@ var StatusIcon = ({ errorLevel }) => {
16536
18482
  // src/components/event-details/iam-event-detail.tsx
16537
18483
  import { CheckCircle as CheckCircle2, Error as ErrorIcon, Warning } from "@mui/icons-material";
16538
18484
  import { Box as Box8, Chip, Typography as Typography5 } from "@mui/material";
16539
- import { jsx as jsx132, jsxs as jsxs124 } from "react/jsx-runtime";
18485
+ import { jsx as jsx133, jsxs as jsxs124 } from "react/jsx-runtime";
16540
18486
  var DetailRow = ({ content, label }) => /* @__PURE__ */ jsxs124(Box8, { sx: { display: "grid", gap: 1, gridTemplateColumns: "72px 1fr", mb: 0.5 }, children: [
16541
- /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: label }),
16542
- /* @__PURE__ */ jsx132(Box8, { children: typeof content === "string" ? /* @__PURE__ */ jsx132(Typography5, { sx: { color: "text.primary", wordBreak: "break-word" }, variant: "caption", children: content }) : content })
18487
+ /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: label }),
18488
+ /* @__PURE__ */ jsx133(Box8, { children: typeof content === "string" ? /* @__PURE__ */ jsx133(Typography5, { sx: { color: "text.primary", wordBreak: "break-word" }, variant: "caption", children: content }) : content })
16543
18489
  ] });
16544
18490
  var PermissionIcon = ({ status }) => {
16545
18491
  switch (status) {
16546
18492
  case "explicitly_allowed":
16547
18493
  case "implicitly_allowed": {
16548
- return /* @__PURE__ */ jsx132(CheckCircle2, { sx: { color: "success.main", fontSize: "1rem" } });
18494
+ return /* @__PURE__ */ jsx133(CheckCircle2, { sx: { color: "success.main", fontSize: "1rem" } });
16549
18495
  }
16550
18496
  case "explicitly_denied": {
16551
- return /* @__PURE__ */ jsx132(ErrorIcon, { sx: { color: "error.main", fontSize: "1rem" } });
18497
+ return /* @__PURE__ */ jsx133(ErrorIcon, { sx: { color: "error.main", fontSize: "1rem" } });
16552
18498
  }
16553
18499
  case "implicitly_denied": {
16554
- return /* @__PURE__ */ jsx132(Warning, { sx: { color: "warning.main", fontSize: "1rem" } });
18500
+ return /* @__PURE__ */ jsx133(Warning, { sx: { color: "warning.main", fontSize: "1rem" } });
16555
18501
  }
16556
18502
  }
16557
18503
  };
16558
18504
  var IAMEventDetail = ({ event }) => {
16559
18505
  const payloadString = event.attributes?.payload;
16560
18506
  if (!payloadString) {
16561
- return /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", variant: "caption", children: "No IAM policy evaluation data available" });
18507
+ return /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", variant: "caption", children: "No IAM policy evaluation data available" });
16562
18508
  }
16563
18509
  const parsedIAM = parseIAMEvent(payloadString);
16564
18510
  if (!parsedIAM) {
16565
- return /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", variant: "caption", children: "Failed to parse IAM event data" });
18511
+ return /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", variant: "caption", children: "Failed to parse IAM event data" });
16566
18512
  }
16567
18513
  return /* @__PURE__ */ jsxs124(Box8, { children: [
16568
- /* @__PURE__ */ jsx132(Box8, { sx: { mb: 1.5 }, children: /* @__PURE__ */ jsx132(
18514
+ /* @__PURE__ */ jsx133(Box8, { sx: { mb: 1.5 }, children: /* @__PURE__ */ jsx133(
16569
18515
  Chip,
16570
18516
  {
16571
- icon: /* @__PURE__ */ jsx132(PermissionIcon, { status: parsedIAM.permission }),
18517
+ icon: /* @__PURE__ */ jsx133(PermissionIcon, { status: parsedIAM.permission }),
16572
18518
  label: formatPermissionStatus(parsedIAM.permission),
16573
18519
  size: "small",
16574
18520
  sx: {
@@ -16578,36 +18524,36 @@ var IAMEventDetail = ({ event }) => {
16578
18524
  variant: "outlined"
16579
18525
  }
16580
18526
  ) }),
16581
- /* @__PURE__ */ jsx132(DetailRow, { content: `${parsedIAM.service}:${parsedIAM.operation}`, label: "Operation" }),
16582
- /* @__PURE__ */ jsx132(DetailRow, { content: parsedIAM.principal, label: "Principal" }),
16583
- parsedIAM.details.actions && parsedIAM.details.actions.length > 0 && /* @__PURE__ */ jsx132(
18527
+ /* @__PURE__ */ jsx133(DetailRow, { content: `${parsedIAM.service}:${parsedIAM.operation}`, label: "Operation" }),
18528
+ /* @__PURE__ */ jsx133(DetailRow, { content: parsedIAM.principal, label: "Principal" }),
18529
+ parsedIAM.details.actions && parsedIAM.details.actions.length > 0 && /* @__PURE__ */ jsx133(
16584
18530
  DetailRow,
16585
18531
  {
16586
- content: /* @__PURE__ */ jsx132(Box8, { children: parsedIAM.details.actions.map((action) => /* @__PURE__ */ jsx132(Typography5, { sx: { color: "text.primary", display: "block" }, variant: "caption", children: action }, action)) }),
18532
+ content: /* @__PURE__ */ jsx133(Box8, { children: parsedIAM.details.actions.map((action) => /* @__PURE__ */ jsx133(Typography5, { sx: { color: "text.primary", display: "block" }, variant: "caption", children: action }, action)) }),
16587
18533
  label: "Actions"
16588
18534
  }
16589
18535
  ),
16590
- parsedIAM.details.resources && parsedIAM.details.resources.length > 0 && /* @__PURE__ */ jsx132(
18536
+ parsedIAM.details.resources && parsedIAM.details.resources.length > 0 && /* @__PURE__ */ jsx133(
16591
18537
  DetailRow,
16592
18538
  {
16593
- content: /* @__PURE__ */ jsx132(Box8, { children: parsedIAM.details.resources.map((resource) => /* @__PURE__ */ jsx132(Typography5, { sx: { color: "text.primary", display: "block", wordBreak: "break-all" }, variant: "caption", children: resource }, resource)) }),
18539
+ content: /* @__PURE__ */ jsx133(Box8, { children: parsedIAM.details.resources.map((resource) => /* @__PURE__ */ jsx133(Typography5, { sx: { color: "text.primary", display: "block", wordBreak: "break-all" }, variant: "caption", children: resource }, resource)) }),
16594
18540
  label: "Resources"
16595
18541
  }
16596
18542
  ),
16597
18543
  (parsedIAM.details.explicitAllows !== void 0 || parsedIAM.details.explicitDenies !== void 0 || parsedIAM.details.implicitDenies !== void 0) && /* @__PURE__ */ jsxs124(Box8, { sx: { mt: 1.5 }, children: [
16598
- /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", sx: { display: "block", fontWeight: 600, mb: 0.5 }, variant: "caption", children: "Policy Evaluation" }),
18544
+ /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", sx: { display: "block", fontWeight: 600, mb: 0.5 }, variant: "caption", children: "Policy Evaluation" }),
16599
18545
  /* @__PURE__ */ jsxs124(Box8, { sx: { display: "grid", gap: 1, gridTemplateColumns: "repeat(3, 1fr)" }, children: [
16600
18546
  parsedIAM.details.explicitAllows !== void 0 && /* @__PURE__ */ jsxs124(Box8, { sx: { textAlign: "center" }, children: [
16601
- /* @__PURE__ */ jsx132(Typography5, { color: "success.main", sx: { display: "block", fontWeight: "bold" }, variant: "subtitle2", children: parsedIAM.details.explicitAllows }),
16602
- /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", variant: "caption", children: "Explicit Allows" })
18547
+ /* @__PURE__ */ jsx133(Typography5, { color: "success.main", sx: { display: "block", fontWeight: "bold" }, variant: "subtitle2", children: parsedIAM.details.explicitAllows }),
18548
+ /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", variant: "caption", children: "Explicit Allows" })
16603
18549
  ] }),
16604
18550
  parsedIAM.details.explicitDenies !== void 0 && /* @__PURE__ */ jsxs124(Box8, { sx: { textAlign: "center" }, children: [
16605
- /* @__PURE__ */ jsx132(Typography5, { color: "error.main", sx: { display: "block", fontWeight: "bold" }, variant: "subtitle2", children: parsedIAM.details.explicitDenies }),
16606
- /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", variant: "caption", children: "Explicit Denies" })
18551
+ /* @__PURE__ */ jsx133(Typography5, { color: "error.main", sx: { display: "block", fontWeight: "bold" }, variant: "subtitle2", children: parsedIAM.details.explicitDenies }),
18552
+ /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", variant: "caption", children: "Explicit Denies" })
16607
18553
  ] }),
16608
18554
  parsedIAM.details.implicitDenies !== void 0 && /* @__PURE__ */ jsxs124(Box8, { sx: { textAlign: "center" }, children: [
16609
- /* @__PURE__ */ jsx132(Typography5, { color: "warning.main", sx: { display: "block", fontWeight: "bold" }, variant: "subtitle2", children: parsedIAM.details.implicitDenies }),
16610
- /* @__PURE__ */ jsx132(Typography5, { color: "text.secondary", variant: "caption", children: "Implicit Denies" })
18555
+ /* @__PURE__ */ jsx133(Typography5, { color: "warning.main", sx: { display: "block", fontWeight: "bold" }, variant: "subtitle2", children: parsedIAM.details.implicitDenies }),
18556
+ /* @__PURE__ */ jsx133(Typography5, { color: "text.secondary", variant: "caption", children: "Implicit Denies" })
16611
18557
  ] })
16612
18558
  ] })
16613
18559
  ] })
@@ -16617,19 +18563,19 @@ var IAMEventDetail = ({ event }) => {
16617
18563
  // src/components/event-details/iam-permission-detail.tsx
16618
18564
  import { KeyboardArrowDown, KeyboardArrowRight } from "@mui/icons-material";
16619
18565
  import { Box as Box9, Chip as Chip2, IconButton as IconButton2, Typography as Typography6 } from "@mui/material";
16620
- import { useMemo as useMemo7, useState as useState11 } from "react";
16621
- import { jsx as jsx133, jsxs as jsxs125 } from "react/jsx-runtime";
18566
+ import { useMemo as useMemo8, useState as useState11 } from "react";
18567
+ import { jsx as jsx134, jsxs as jsxs125 } from "react/jsx-runtime";
16622
18568
  var getChipColors = (status) => ({
16623
18569
  backgroundColor: getPermissionStatusColor(status),
16624
18570
  color: "white"
16625
18571
  });
16626
18572
  var LabelValue = ({ label, value }) => /* @__PURE__ */ jsxs125(Box9, { sx: { display: "grid", gap: 1, gridTemplateColumns: "72px 1fr", mb: 0.5 }, children: [
16627
- /* @__PURE__ */ jsx133(Typography6, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: label }),
16628
- /* @__PURE__ */ jsx133(Typography6, { sx: { wordBreak: "break-all" }, variant: "caption", children: value })
18573
+ /* @__PURE__ */ jsx134(Typography6, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: label }),
18574
+ /* @__PURE__ */ jsx134(Typography6, { sx: { wordBreak: "break-all" }, variant: "caption", children: value })
16629
18575
  ] });
16630
18576
  var IAMPermissionItem = ({ event }) => {
16631
18577
  const [isOpen, setIsOpen] = useState11(false);
16632
- const parsedData = useMemo7(() => {
18578
+ const parsedData = useMemo8(() => {
16633
18579
  const payloadString = event.attributes?.payload;
16634
18580
  if (!payloadString) return;
16635
18581
  const parsedIAM2 = parseIAMEvent(payloadString);
@@ -16642,10 +18588,10 @@ var IAMPermissionItem = ({ event }) => {
16642
18588
  const { chipColors, parsedIAM } = parsedData;
16643
18589
  return /* @__PURE__ */ jsxs125(Box9, { sx: { mb: 0.5 }, children: [
16644
18590
  /* @__PURE__ */ jsxs125(Box9, { sx: { alignItems: "center", display: "flex", gap: 1 }, children: [
16645
- /* @__PURE__ */ jsx133(IconButton2, { onClick: () => {
18591
+ /* @__PURE__ */ jsx134(IconButton2, { onClick: () => {
16646
18592
  setIsOpen(!isOpen);
16647
- }, size: "small", sx: { p: 0 }, children: isOpen ? /* @__PURE__ */ jsx133(KeyboardArrowDown, { sx: { fontSize: 16 } }) : /* @__PURE__ */ jsx133(KeyboardArrowRight, { sx: { fontSize: 16 } }) }),
16648
- /* @__PURE__ */ jsx133(Chip2, { label: formatPermissionStatus(parsedIAM.permission), size: "small", sx: { ...chipColors, fontWeight: 500 } }),
18593
+ }, size: "small", sx: { p: 0 }, children: isOpen ? /* @__PURE__ */ jsx134(KeyboardArrowDown, { sx: { fontSize: 16 } }) : /* @__PURE__ */ jsx134(KeyboardArrowRight, { sx: { fontSize: 16 } }) }),
18594
+ /* @__PURE__ */ jsx134(Chip2, { label: formatPermissionStatus(parsedIAM.permission), size: "small", sx: { ...chipColors, fontWeight: 500 } }),
16649
18595
  /* @__PURE__ */ jsxs125(Typography6, { color: "text.secondary", noWrap: true, sx: { flex: 1, overflow: "hidden", textOverflow: "ellipsis" }, variant: "caption", children: [
16650
18596
  parsedIAM.service,
16651
18597
  ":",
@@ -16653,28 +18599,28 @@ var IAMPermissionItem = ({ event }) => {
16653
18599
  ] })
16654
18600
  ] }),
16655
18601
  isOpen && /* @__PURE__ */ jsxs125(Box9, { sx: { borderColor: "divider", borderLeft: "2px solid", ml: 1, mt: 0.5, pl: 1.5, py: 0.5 }, children: [
16656
- /* @__PURE__ */ jsx133(LabelValue, { label: "Principal", value: parsedIAM.principal }),
18602
+ /* @__PURE__ */ jsx134(LabelValue, { label: "Principal", value: parsedIAM.principal }),
16657
18603
  parsedIAM.details.actions && parsedIAM.details.actions.length > 0 && /* @__PURE__ */ jsxs125(Box9, { sx: { display: "grid", gap: 1, gridTemplateColumns: "72px 1fr", mb: 0.5 }, children: [
16658
- /* @__PURE__ */ jsx133(Typography6, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: "Actions" }),
16659
- /* @__PURE__ */ jsx133(Box9, { children: parsedIAM.details.actions.map((action) => /* @__PURE__ */ jsx133(Typography6, { sx: { display: "block" }, variant: "caption", children: action }, action)) })
18604
+ /* @__PURE__ */ jsx134(Typography6, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: "Actions" }),
18605
+ /* @__PURE__ */ jsx134(Box9, { children: parsedIAM.details.actions.map((action) => /* @__PURE__ */ jsx134(Typography6, { sx: { display: "block" }, variant: "caption", children: action }, action)) })
16660
18606
  ] }),
16661
18607
  parsedIAM.details.resources && parsedIAM.details.resources.length > 0 && /* @__PURE__ */ jsxs125(Box9, { sx: { display: "grid", gap: 1, gridTemplateColumns: "72px 1fr" }, children: [
16662
- /* @__PURE__ */ jsx133(Typography6, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: "Resources" }),
16663
- /* @__PURE__ */ jsx133(Box9, { children: parsedIAM.details.resources.map((resource) => /* @__PURE__ */ jsx133(Typography6, { sx: { display: "block", wordBreak: "break-all" }, variant: "caption", children: resource }, resource)) })
18608
+ /* @__PURE__ */ jsx134(Typography6, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: "Resources" }),
18609
+ /* @__PURE__ */ jsx134(Box9, { children: parsedIAM.details.resources.map((resource) => /* @__PURE__ */ jsx134(Typography6, { sx: { display: "block", wordBreak: "break-all" }, variant: "caption", children: resource }, resource)) })
16664
18610
  ] })
16665
18611
  ] })
16666
18612
  ] });
16667
18613
  };
16668
- var IAMPermissionDetail = ({ events }) => /* @__PURE__ */ jsx133(Box9, { children: events.map((event) => /* @__PURE__ */ jsx133(IAMPermissionItem, { event }, `${event.span_id}-${event.event_id}`)) });
18614
+ var IAMPermissionDetail = ({ events }) => /* @__PURE__ */ jsx134(Box9, { children: events.map((event) => /* @__PURE__ */ jsx134(IAMPermissionItem, { event }, `${event.span_id}-${event.event_id}`)) });
16669
18615
 
16670
18616
  // src/components/event-details/payload-viewer.tsx
16671
18617
  import { Box as Box11, useTheme as useTheme3 } from "@mui/material";
16672
18618
 
16673
18619
  // node_modules/@textea/json-viewer/dist/index.mjs
16674
18620
  var import_copy_to_clipboard = __toESM(require_copy_to_clipboard(), 1);
16675
- import { jsx as jsx134, jsxs as jsxs126, Fragment as Fragment7 } from "react/jsx-runtime";
18621
+ import { jsx as jsx135, jsxs as jsxs126, Fragment as Fragment8 } from "react/jsx-runtime";
16676
18622
  import { Box as Box10, InputBase, NoSsr, SvgIcon, createTheme, ThemeProvider, Paper as Paper2 } from "@mui/material";
16677
- import { createContext as createContext9, useContext as useContext16, useState as useState12, useRef as useRef12, useCallback as useCallback8, useMemo as useMemo8, useEffect as useEffect16, memo as memo9 } from "react";
18623
+ import { createContext as createContext10, useContext as useContext17, useState as useState12, useRef as useRef13, useCallback as useCallback8, useMemo as useMemo9, useEffect as useEffect17, memo as memo9 } from "react";
16678
18624
  import { create, useStore, createStore } from "zustand";
16679
18625
  function r(e2) {
16680
18626
  var t2, f2, n2 = "";
@@ -16790,10 +18736,10 @@ var createJsonViewerStore = (props) => {
16790
18736
  };
16791
18737
  });
16792
18738
  };
16793
- var JsonViewerStoreContext = createContext9(void 0);
18739
+ var JsonViewerStoreContext = createContext10(void 0);
16794
18740
  JsonViewerStoreContext.Provider;
16795
18741
  var useJsonViewerStore = (selector2, equalityFn) => {
16796
- const store = useContext16(JsonViewerStoreContext);
18742
+ const store = useContext17(JsonViewerStoreContext);
16797
18743
  return useStore(store, selector2, equalityFn);
16798
18744
  };
16799
18745
  var useTextColor = () => {
@@ -16919,7 +18865,7 @@ async function copyString(value) {
16919
18865
  function useClipboard() {
16920
18866
  let { timeout = 2e3 } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
16921
18867
  const [copied, setCopied] = useState12(false);
16922
- const copyTimeout = useRef12(null);
18868
+ const copyTimeout = useRef13(null);
16923
18869
  const handleCopyResult = useCallback8((value) => {
16924
18870
  const current = copyTimeout.current;
16925
18871
  if (current) {
@@ -16966,7 +18912,7 @@ function useClipboard() {
16966
18912
  }
16967
18913
  function useIsCycleReference(path, value) {
16968
18914
  const rootValue = useJsonViewerStore((store) => store.value);
16969
- return useMemo8(() => isCycleReference(rootValue, path, value), [
18915
+ return useMemo9(() => isCycleReference(rootValue, path, value), [
16970
18916
  path,
16971
18917
  value,
16972
18918
  rootValue
@@ -16979,7 +18925,7 @@ function useInspect(path, value, nestedIndex) {
16979
18925
  const setInspectCache = useJsonViewerStore((store) => store.setInspectCache);
16980
18926
  const defaultInspectDepth = useJsonViewerStore((store) => store.defaultInspectDepth);
16981
18927
  const defaultInspectControl = useJsonViewerStore((store) => store.defaultInspectControl);
16982
- useEffect16(() => {
18928
+ useEffect17(() => {
16983
18929
  const inspect2 = getInspectCache(path, nestedIndex);
16984
18930
  if (inspect2 !== void 0) {
16985
18931
  return;
@@ -17027,7 +18973,7 @@ function useInspect(path, value, nestedIndex) {
17027
18973
  setInspect
17028
18974
  ];
17029
18975
  }
17030
- var DataBox = (props) => /* @__PURE__ */ jsx134(Box10, {
18976
+ var DataBox = (props) => /* @__PURE__ */ jsx135(Box10, {
17031
18977
  component: "div",
17032
18978
  ...props,
17033
18979
  sx: {
@@ -17038,7 +18984,7 @@ var DataBox = (props) => /* @__PURE__ */ jsx134(Box10, {
17038
18984
  var DataTypeLabel = (param) => {
17039
18985
  let { dataType, enable = true } = param;
17040
18986
  if (!enable) return null;
17041
- return /* @__PURE__ */ jsx134(DataBox, {
18987
+ return /* @__PURE__ */ jsx135(DataBox, {
17042
18988
  className: "data-type-label",
17043
18989
  sx: {
17044
18990
  mx: 0.5,
@@ -17062,12 +19008,12 @@ function defineEasyType(param) {
17062
19008
  color: color2
17063
19009
  },
17064
19010
  children: [
17065
- displayTypeLabel && storeDisplayDataTypes && /* @__PURE__ */ jsx134(DataTypeLabel, {
19011
+ displayTypeLabel && storeDisplayDataTypes && /* @__PURE__ */ jsx135(DataTypeLabel, {
17066
19012
  dataType: type
17067
19013
  }),
17068
- /* @__PURE__ */ jsx134(DataBox, {
19014
+ /* @__PURE__ */ jsx135(DataBox, {
17069
19015
  className: "".concat(type, "-value"),
17070
- children: /* @__PURE__ */ jsx134(Render, {
19016
+ children: /* @__PURE__ */ jsx135(Render, {
17071
19017
  path: props.path,
17072
19018
  inspect: props.inspect,
17073
19019
  setInspect: props.setInspect,
@@ -17107,7 +19053,7 @@ function defineEasyType(param) {
17107
19053
  }, [
17108
19054
  setValue
17109
19055
  ]);
17110
- return /* @__PURE__ */ jsx134(InputBase, {
19056
+ return /* @__PURE__ */ jsx135(InputBase, {
17111
19057
  autoFocus: true,
17112
19058
  value,
17113
19059
  onChange: handleChange,
@@ -17147,7 +19093,7 @@ var booleanType = defineEasyType({
17147
19093
  },
17148
19094
  Renderer: (param) => {
17149
19095
  let { value } = param;
17150
- return /* @__PURE__ */ jsx134(Fragment7, {
19096
+ return /* @__PURE__ */ jsx135(Fragment8, {
17151
19097
  children: value ? "true" : "false"
17152
19098
  });
17153
19099
  }
@@ -17166,7 +19112,7 @@ var dateType = defineEasyType({
17166
19112
  colorKey: "base0D",
17167
19113
  Renderer: (param) => {
17168
19114
  let { value } = param;
17169
- return /* @__PURE__ */ jsx134(Fragment7, {
19115
+ return /* @__PURE__ */ jsx135(Fragment8, {
17170
19116
  children: value.toLocaleTimeString("en-us", displayOptions)
17171
19117
  });
17172
19118
  }
@@ -17197,7 +19143,7 @@ var rb = "}";
17197
19143
  var PreFunctionType = (props) => {
17198
19144
  return /* @__PURE__ */ jsxs126(NoSsr, {
17199
19145
  children: [
17200
- /* @__PURE__ */ jsx134(DataTypeLabel, {
19146
+ /* @__PURE__ */ jsx135(DataTypeLabel, {
17201
19147
  dataType: "function"
17202
19148
  }),
17203
19149
  /* @__PURE__ */ jsxs126(Box10, {
@@ -17216,8 +19162,8 @@ var PreFunctionType = (props) => {
17216
19162
  });
17217
19163
  };
17218
19164
  var PostFunctionType = () => {
17219
- return /* @__PURE__ */ jsx134(NoSsr, {
17220
- children: /* @__PURE__ */ jsx134(Box10, {
19165
+ return /* @__PURE__ */ jsx135(NoSsr, {
19166
+ children: /* @__PURE__ */ jsx135(Box10, {
17221
19167
  component: "span",
17222
19168
  className: "data-function-end",
17223
19169
  children: rb
@@ -17226,15 +19172,15 @@ var PostFunctionType = () => {
17226
19172
  };
17227
19173
  var FunctionType = (props) => {
17228
19174
  const functionColor = useJsonViewerStore((store) => store.colorspace.base05);
17229
- return /* @__PURE__ */ jsx134(NoSsr, {
17230
- children: /* @__PURE__ */ jsx134(Box10, {
19175
+ return /* @__PURE__ */ jsx135(NoSsr, {
19176
+ children: /* @__PURE__ */ jsx135(Box10, {
17231
19177
  className: "data-function",
17232
19178
  sx: {
17233
19179
  display: props.inspect ? "block" : "inline-block",
17234
19180
  pl: props.inspect ? 2 : 0,
17235
19181
  color: functionColor
17236
19182
  },
17237
- children: props.inspect ? functionBody(props.value) : /* @__PURE__ */ jsx134(Box10, {
19183
+ children: props.inspect ? functionBody(props.value) : /* @__PURE__ */ jsx135(Box10, {
17238
19184
  component: "span",
17239
19185
  className: "data-function-body",
17240
19186
  onClick: () => props.setInspect(true),
@@ -17262,7 +19208,7 @@ var nullType = defineEasyType({
17262
19208
  displayTypeLabel: false,
17263
19209
  Renderer: () => {
17264
19210
  const backgroundColor = useJsonViewerStore((store) => store.colorspace.base02);
17265
- return /* @__PURE__ */ jsx134(Box10, {
19211
+ return /* @__PURE__ */ jsx135(Box10, {
17266
19212
  sx: {
17267
19213
  fontSize: "0.8rem",
17268
19214
  backgroundColor,
@@ -17285,7 +19231,7 @@ var nanType = defineEasyType({
17285
19231
  deserialize: (value) => parseFloat(value),
17286
19232
  Renderer: () => {
17287
19233
  const backgroundColor = useJsonViewerStore((store) => store.colorspace.base02);
17288
- return /* @__PURE__ */ jsx134(Box10, {
19234
+ return /* @__PURE__ */ jsx135(Box10, {
17289
19235
  sx: {
17290
19236
  backgroundColor,
17291
19237
  fontSize: "0.8rem",
@@ -17305,7 +19251,7 @@ var floatType = defineEasyType({
17305
19251
  deserialize: (value) => parseFloat(value),
17306
19252
  Renderer: (param) => {
17307
19253
  let { value } = param;
17308
- return /* @__PURE__ */ jsx134(Fragment7, {
19254
+ return /* @__PURE__ */ jsx135(Fragment8, {
17309
19255
  children: value
17310
19256
  });
17311
19257
  }
@@ -17319,7 +19265,7 @@ var intType = defineEasyType({
17319
19265
  deserialize: (value) => parseFloat(value),
17320
19266
  Renderer: (param) => {
17321
19267
  let { value } = param;
17322
- return /* @__PURE__ */ jsx134(Fragment7, {
19268
+ return /* @__PURE__ */ jsx135(Fragment8, {
17323
19269
  children: value
17324
19270
  });
17325
19271
  }
@@ -17332,16 +19278,16 @@ var bigIntType = defineEasyType({
17332
19278
  deserialize: (value) => BigInt(value.replace(/\D/g, "")),
17333
19279
  Renderer: (param) => {
17334
19280
  let { value } = param;
17335
- return /* @__PURE__ */ jsx134(Fragment7, {
19281
+ return /* @__PURE__ */ jsx135(Fragment8, {
17336
19282
  children: "".concat(value, "n")
17337
19283
  });
17338
19284
  }
17339
19285
  });
17340
19286
  var BaseIcon = (param) => {
17341
19287
  let { d: d2, ...props } = param;
17342
- return /* @__PURE__ */ jsx134(SvgIcon, {
19288
+ return /* @__PURE__ */ jsx135(SvgIcon, {
17343
19289
  ...props,
17344
- children: /* @__PURE__ */ jsx134("path", {
19290
+ children: /* @__PURE__ */ jsx135("path", {
17345
19291
  d: d2
17346
19292
  })
17347
19293
  });
@@ -17356,55 +19302,55 @@ var Edit = "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.3
17356
19302
  var ExpandMore = "M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z";
17357
19303
  var Delete = "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5l-1-1h-5l-1 1H5v2h14V4z";
17358
19304
  var AddBoxIcon = (props) => {
17359
- return /* @__PURE__ */ jsx134(BaseIcon, {
19305
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17360
19306
  d: AddBox,
17361
19307
  ...props
17362
19308
  });
17363
19309
  };
17364
19310
  var CheckIcon = (props) => {
17365
- return /* @__PURE__ */ jsx134(BaseIcon, {
19311
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17366
19312
  d: Check,
17367
19313
  ...props
17368
19314
  });
17369
19315
  };
17370
19316
  var ChevronRightIcon = (props) => {
17371
- return /* @__PURE__ */ jsx134(BaseIcon, {
19317
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17372
19318
  d: ChevronRight,
17373
19319
  ...props
17374
19320
  });
17375
19321
  };
17376
19322
  var CircularArrowsIcon = (props) => {
17377
- return /* @__PURE__ */ jsx134(BaseIcon, {
19323
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17378
19324
  d: CircularArrows,
17379
19325
  ...props
17380
19326
  });
17381
19327
  };
17382
19328
  var CloseIcon = (props) => {
17383
- return /* @__PURE__ */ jsx134(BaseIcon, {
19329
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17384
19330
  d: Close,
17385
19331
  ...props
17386
19332
  });
17387
19333
  };
17388
19334
  var ContentCopyIcon = (props) => {
17389
- return /* @__PURE__ */ jsx134(BaseIcon, {
19335
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17390
19336
  d: ContentCopy,
17391
19337
  ...props
17392
19338
  });
17393
19339
  };
17394
19340
  var EditIcon = (props) => {
17395
- return /* @__PURE__ */ jsx134(BaseIcon, {
19341
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17396
19342
  d: Edit,
17397
19343
  ...props
17398
19344
  });
17399
19345
  };
17400
19346
  var ExpandMoreIcon = (props) => {
17401
- return /* @__PURE__ */ jsx134(BaseIcon, {
19347
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17402
19348
  d: ExpandMore,
17403
19349
  ...props
17404
19350
  });
17405
19351
  };
17406
19352
  var DeleteIcon = (props) => {
17407
- return /* @__PURE__ */ jsx134(BaseIcon, {
19353
+ return /* @__PURE__ */ jsx135(BaseIcon, {
17408
19354
  d: Delete,
17409
19355
  ...props
17410
19356
  });
@@ -17427,17 +19373,17 @@ function inspectMetadata(value) {
17427
19373
  var PreObjectType = (props) => {
17428
19374
  const metadataColor = useJsonViewerStore((store) => store.colorspace.base04);
17429
19375
  const textColor = useTextColor();
17430
- const isArrayLike = useMemo8(() => Array.isArray(props.value) || props.value instanceof Set, [
19376
+ const isArrayLike = useMemo9(() => Array.isArray(props.value) || props.value instanceof Set, [
17431
19377
  props.value
17432
19378
  ]);
17433
- const isEmptyValue = useMemo8(() => getValueSize(props.value) === 0, [
19379
+ const isEmptyValue = useMemo9(() => getValueSize(props.value) === 0, [
17434
19380
  props.value
17435
19381
  ]);
17436
- const sizeOfValue = useMemo8(() => inspectMetadata(props.value), [
19382
+ const sizeOfValue = useMemo9(() => inspectMetadata(props.value), [
17437
19383
  props.value
17438
19384
  ]);
17439
19385
  const displaySize = useJsonViewerStore((store) => store.displaySize);
17440
- const shouldDisplaySize = useMemo8(() => typeof displaySize === "function" ? displaySize(props.path, props.value) : displaySize, [
19386
+ const shouldDisplaySize = useMemo9(() => typeof displaySize === "function" ? displaySize(props.path, props.value) : displaySize, [
17441
19387
  displaySize,
17442
19388
  props.path,
17443
19389
  props.value
@@ -17451,7 +19397,7 @@ var PreObjectType = (props) => {
17451
19397
  },
17452
19398
  children: [
17453
19399
  isArrayLike ? arrayLb : objectLb,
17454
- shouldDisplaySize && props.inspect && !isEmptyValue && /* @__PURE__ */ jsx134(Box10, {
19400
+ shouldDisplaySize && props.inspect && !isEmptyValue && /* @__PURE__ */ jsx135(Box10, {
17455
19401
  component: "span",
17456
19402
  sx: {
17457
19403
  pl: 0.5,
@@ -17461,16 +19407,16 @@ var PreObjectType = (props) => {
17461
19407
  },
17462
19408
  children: sizeOfValue
17463
19409
  }),
17464
- isTrap && !props.inspect && /* @__PURE__ */ jsxs126(Fragment7, {
19410
+ isTrap && !props.inspect && /* @__PURE__ */ jsxs126(Fragment8, {
17465
19411
  children: [
17466
- /* @__PURE__ */ jsx134(CircularArrowsIcon, {
19412
+ /* @__PURE__ */ jsx135(CircularArrowsIcon, {
17467
19413
  sx: {
17468
19414
  fontSize: 12,
17469
19415
  color: textColor,
17470
19416
  mx: 0.5
17471
19417
  }
17472
19418
  }),
17473
- /* @__PURE__ */ jsx134(DataBox, {
19419
+ /* @__PURE__ */ jsx135(DataBox, {
17474
19420
  sx: {
17475
19421
  cursor: "pointer",
17476
19422
  userSelect: "none"
@@ -17485,17 +19431,17 @@ var PreObjectType = (props) => {
17485
19431
  var PostObjectType = (props) => {
17486
19432
  const metadataColor = useJsonViewerStore((store) => store.colorspace.base04);
17487
19433
  const textColor = useTextColor();
17488
- const isArrayLike = useMemo8(() => Array.isArray(props.value) || props.value instanceof Set, [
19434
+ const isArrayLike = useMemo9(() => Array.isArray(props.value) || props.value instanceof Set, [
17489
19435
  props.value
17490
19436
  ]);
17491
- const isEmptyValue = useMemo8(() => getValueSize(props.value) === 0, [
19437
+ const isEmptyValue = useMemo9(() => getValueSize(props.value) === 0, [
17492
19438
  props.value
17493
19439
  ]);
17494
- const sizeOfValue = useMemo8(() => inspectMetadata(props.value), [
19440
+ const sizeOfValue = useMemo9(() => inspectMetadata(props.value), [
17495
19441
  props.value
17496
19442
  ]);
17497
19443
  const displaySize = useJsonViewerStore((store) => store.displaySize);
17498
- const shouldDisplaySize = useMemo8(() => typeof displaySize === "function" ? displaySize(props.path, props.value) : displaySize, [
19444
+ const shouldDisplaySize = useMemo9(() => typeof displaySize === "function" ? displaySize(props.path, props.value) : displaySize, [
17499
19445
  displaySize,
17500
19446
  props.path,
17501
19447
  props.value
@@ -17511,7 +19457,7 @@ var PostObjectType = (props) => {
17511
19457
  },
17512
19458
  children: [
17513
19459
  isArrayLike ? arrayRb : objectRb,
17514
- shouldDisplaySize && (isEmptyValue || !props.inspect) ? /* @__PURE__ */ jsx134(Box10, {
19460
+ shouldDisplaySize && (isEmptyValue || !props.inspect) ? /* @__PURE__ */ jsx135(Box10, {
17515
19461
  component: "span",
17516
19462
  sx: {
17517
19463
  pl: 0.5,
@@ -17534,7 +19480,7 @@ var ObjectType = (props) => {
17534
19480
  const isTrap = useIsCycleReference(props.path, props.value);
17535
19481
  const [displayLength, setDisplayLength] = useState12(useJsonViewerStore((store) => store.maxDisplayLength));
17536
19482
  const objectSortKeys = useJsonViewerStore((store) => store.objectSortKeys);
17537
- const elements = useMemo8(() => {
19483
+ const elements = useMemo9(() => {
17538
19484
  if (!props.inspect) {
17539
19485
  return null;
17540
19486
  }
@@ -17551,7 +19497,7 @@ var ObjectType = (props) => {
17551
19497
  ...props.path,
17552
19498
  key
17553
19499
  ];
17554
- elements3.push(/* @__PURE__ */ jsx134(DataKeyPair, {
19500
+ elements3.push(/* @__PURE__ */ jsx135(DataKeyPair, {
17555
19501
  path,
17556
19502
  value: value2,
17557
19503
  prevValue: props.prevValue instanceof Map ? props.prevValue.get(k2) : void 0,
@@ -17567,7 +19513,7 @@ var ObjectType = (props) => {
17567
19513
  while (true) {
17568
19514
  const nextResult = iterator2.next();
17569
19515
  var _nextResult_done;
17570
- elements3.push(/* @__PURE__ */ jsx134(DataKeyPair, {
19516
+ elements3.push(/* @__PURE__ */ jsx135(DataKeyPair, {
17571
19517
  path: [
17572
19518
  ...props.path,
17573
19519
  "iterator:".concat(count2)
@@ -17595,7 +19541,7 @@ var ObjectType = (props) => {
17595
19541
  ...props.path,
17596
19542
  index
17597
19543
  ];
17598
- return /* @__PURE__ */ jsx134(DataKeyPair, {
19544
+ return /* @__PURE__ */ jsx135(DataKeyPair, {
17599
19545
  path,
17600
19546
  value: value2,
17601
19547
  prevValue: Array.isArray(props.prevValue) ? props.prevValue[index] : void 0,
@@ -17627,7 +19573,7 @@ var ObjectType = (props) => {
17627
19573
  const prevElements = Array.isArray(props.prevValue) ? segmentArray(props.prevValue, groupArraysAfterLength) : void 0;
17628
19574
  const elementsLastIndex = elements3.length - 1;
17629
19575
  return elements3.map((list, index) => {
17630
- return /* @__PURE__ */ jsx134(DataKeyPair, {
19576
+ return /* @__PURE__ */ jsx135(DataKeyPair, {
17631
19577
  path: props.path,
17632
19578
  value: list,
17633
19579
  nestedIndex: index,
@@ -17654,7 +19600,7 @@ var ObjectType = (props) => {
17654
19600
  ...props.path,
17655
19601
  key
17656
19602
  ];
17657
- return /* @__PURE__ */ jsx134(DataKeyPair, {
19603
+ return /* @__PURE__ */ jsx135(DataKeyPair, {
17658
19604
  path,
17659
19605
  value: value2,
17660
19606
  prevValue: (_props_prevValue = props.prevValue) === null || _props_prevValue === void 0 ? void 0 : _props_prevValue[key],
@@ -17695,13 +19641,13 @@ var ObjectType = (props) => {
17695
19641
  const marginLeft = props.inspect ? 0.6 : 0;
17696
19642
  const width = useJsonViewerStore((store) => store.indentWidth);
17697
19643
  const indentWidth = props.inspect ? width - marginLeft : width;
17698
- const isEmptyValue = useMemo8(() => getValueSize(props.value) === 0, [
19644
+ const isEmptyValue = useMemo9(() => getValueSize(props.value) === 0, [
17699
19645
  props.value
17700
19646
  ]);
17701
19647
  if (isEmptyValue) {
17702
19648
  return null;
17703
19649
  }
17704
- return /* @__PURE__ */ jsx134(Box10, {
19650
+ return /* @__PURE__ */ jsx135(Box10, {
17705
19651
  className: "data-object",
17706
19652
  sx: {
17707
19653
  display: props.inspect ? "block" : "inline-block",
@@ -17710,7 +19656,7 @@ var ObjectType = (props) => {
17710
19656
  color: keyColor,
17711
19657
  borderLeft: props.inspect ? "1px solid ".concat(borderColor) : "none"
17712
19658
  },
17713
- children: props.inspect ? elements : !isTrap && /* @__PURE__ */ jsx134(Box10, {
19659
+ children: props.inspect ? elements : !isTrap && /* @__PURE__ */ jsx135(Box10, {
17714
19660
  component: "span",
17715
19661
  className: "data-object-body",
17716
19662
  onClick: () => props.setInspect(true),
@@ -17760,7 +19706,7 @@ var stringType = defineEasyType({
17760
19706
  children: [
17761
19707
  '"',
17762
19708
  value,
17763
- hasRest && !showRest && /* @__PURE__ */ jsx134(Box10, {
19709
+ hasRest && !showRest && /* @__PURE__ */ jsx135(Box10, {
17764
19710
  component: "span",
17765
19711
  sx: {
17766
19712
  padding: 0.5
@@ -17779,7 +19725,7 @@ var undefinedType = defineEasyType({
17779
19725
  displayTypeLabel: false,
17780
19726
  Renderer: () => {
17781
19727
  const backgroundColor = useJsonViewerStore((store) => store.colorspace.base02);
17782
- return /* @__PURE__ */ jsx134(Box10, {
19728
+ return /* @__PURE__ */ jsx135(Box10, {
17783
19729
  sx: {
17784
19730
  fontSize: "0.7rem",
17785
19731
  backgroundColor,
@@ -17831,10 +19777,10 @@ var createTypeRegistryStore = () => {
17831
19777
  }
17832
19778
  }));
17833
19779
  };
17834
- var TypeRegistryStoreContext = /* @__PURE__ */ createContext9(void 0);
19780
+ var TypeRegistryStoreContext = /* @__PURE__ */ createContext10(void 0);
17835
19781
  TypeRegistryStoreContext.Provider;
17836
19782
  var useTypeRegistryStore = (selector2, equalityFn) => {
17837
- const store = useContext16(TypeRegistryStoreContext);
19783
+ const store = useContext17(TypeRegistryStoreContext);
17838
19784
  return useStore(store, selector2, equalityFn);
17839
19785
  };
17840
19786
  function matchTypeComponents(value, path, registry) {
@@ -17854,13 +19800,13 @@ function matchTypeComponents(value, path, registry) {
17854
19800
  }
17855
19801
  function useTypeComponents(value, path) {
17856
19802
  const registry = useTypeRegistryStore((store) => store.registry);
17857
- return useMemo8(() => matchTypeComponents(value, path, registry), [
19803
+ return useMemo9(() => matchTypeComponents(value, path, registry), [
17858
19804
  value,
17859
19805
  path,
17860
19806
  registry
17861
19807
  ]);
17862
19808
  }
17863
- var IconBox = (props) => /* @__PURE__ */ jsx134(Box10, {
19809
+ var IconBox = (props) => /* @__PURE__ */ jsx135(Box10, {
17864
19810
  component: "span",
17865
19811
  ...props,
17866
19812
  sx: {
@@ -17875,7 +19821,7 @@ var DataKeyPair = (props) => {
17875
19821
  var _props_editable;
17876
19822
  const propsEditable = (_props_editable = props.editable) !== null && _props_editable !== void 0 ? _props_editable : void 0;
17877
19823
  const storeEditable = useJsonViewerStore((store) => store.editable);
17878
- const editable = useMemo8(() => {
19824
+ const editable = useMemo9(() => {
17879
19825
  if (storeEditable === false) {
17880
19826
  return false;
17881
19827
  }
@@ -17896,7 +19842,7 @@ var DataKeyPair = (props) => {
17896
19842
  const depth = path.length;
17897
19843
  const key = path[depth - 1];
17898
19844
  const hoverPath = useJsonViewerStore((store) => store.hoverPath);
17899
- const isHover = useMemo8(() => {
19845
+ const isHover = useMemo9(() => {
17900
19846
  return hoverPath && path.every((value2, index) => value2 === hoverPath.path[index] && nestedIndex === hoverPath.nestedIndex);
17901
19847
  }, [
17902
19848
  hoverPath,
@@ -17918,7 +19864,7 @@ var DataKeyPair = (props) => {
17918
19864
  const isNumberKey = Number.isInteger(Number(key));
17919
19865
  const storeEnableAdd = useJsonViewerStore((store) => store.enableAdd);
17920
19866
  const onAdd = useJsonViewerStore((store) => store.onAdd);
17921
- const enableAdd = useMemo8(() => {
19867
+ const enableAdd = useMemo9(() => {
17922
19868
  if (!onAdd || nestedIndex !== void 0) return false;
17923
19869
  if (storeEnableAdd === false) {
17924
19870
  return false;
@@ -17943,7 +19889,7 @@ var DataKeyPair = (props) => {
17943
19889
  ]);
17944
19890
  const storeEnableDelete = useJsonViewerStore((store) => store.enableDelete);
17945
19891
  const onDelete = useJsonViewerStore((store) => store.onDelete);
17946
- const enableDelete = useMemo8(() => {
19892
+ const enableDelete = useMemo9(() => {
17947
19893
  if (!onDelete || nestedIndex !== void 0) return false;
17948
19894
  if (isRoot) {
17949
19895
  return false;
@@ -17970,7 +19916,7 @@ var DataKeyPair = (props) => {
17970
19916
  const enableClipboard = useJsonViewerStore((store) => store.enableClipboard);
17971
19917
  const { copy, copied } = useClipboard();
17972
19918
  const highlightUpdates = useJsonViewerStore((store) => store.highlightUpdates);
17973
- const isHighlight = useMemo8(() => {
19919
+ const isHighlight = useMemo9(() => {
17974
19920
  if (!highlightUpdates || prevValue === void 0) return false;
17975
19921
  if (typeof value !== typeof prevValue) {
17976
19922
  return true;
@@ -17994,8 +19940,8 @@ var DataKeyPair = (props) => {
17994
19940
  prevValue,
17995
19941
  value
17996
19942
  ]);
17997
- const highlightContainer = useRef12();
17998
- useEffect16(() => {
19943
+ const highlightContainer = useRef13();
19944
+ useEffect17(() => {
17999
19945
  if (highlightContainer.current && isHighlight && "animate" in highlightContainer.current) {
18000
19946
  highlightContainer.current.animate([
18001
19947
  {
@@ -18044,20 +19990,20 @@ var DataKeyPair = (props) => {
18044
19990
  path,
18045
19991
  value
18046
19992
  ]);
18047
- const actionIcons = useMemo8(() => {
19993
+ const actionIcons = useMemo9(() => {
18048
19994
  if (editing) {
18049
- return /* @__PURE__ */ jsxs126(Fragment7, {
19995
+ return /* @__PURE__ */ jsxs126(Fragment8, {
18050
19996
  children: [
18051
- /* @__PURE__ */ jsx134(IconBox, {
18052
- children: /* @__PURE__ */ jsx134(CloseIcon, {
19997
+ /* @__PURE__ */ jsx135(IconBox, {
19998
+ children: /* @__PURE__ */ jsx135(CloseIcon, {
18053
19999
  sx: {
18054
20000
  fontSize: ".8rem"
18055
20001
  },
18056
20002
  onClick: abortEditing
18057
20003
  })
18058
20004
  }),
18059
- /* @__PURE__ */ jsx134(IconBox, {
18060
- children: /* @__PURE__ */ jsx134(CheckIcon, {
20005
+ /* @__PURE__ */ jsx135(IconBox, {
20006
+ children: /* @__PURE__ */ jsx135(CheckIcon, {
18061
20007
  sx: {
18062
20008
  fontSize: ".8rem"
18063
20009
  },
@@ -18067,9 +20013,9 @@ var DataKeyPair = (props) => {
18067
20013
  ]
18068
20014
  });
18069
20015
  }
18070
- return /* @__PURE__ */ jsxs126(Fragment7, {
20016
+ return /* @__PURE__ */ jsxs126(Fragment8, {
18071
20017
  children: [
18072
- enableClipboard && /* @__PURE__ */ jsx134(IconBox, {
20018
+ enableClipboard && /* @__PURE__ */ jsx135(IconBox, {
18073
20019
  onClick: (event) => {
18074
20020
  event.preventDefault();
18075
20021
  try {
@@ -18078,41 +20024,41 @@ var DataKeyPair = (props) => {
18078
20024
  console.error(e2);
18079
20025
  }
18080
20026
  },
18081
- children: copied ? /* @__PURE__ */ jsx134(CheckIcon, {
20027
+ children: copied ? /* @__PURE__ */ jsx135(CheckIcon, {
18082
20028
  sx: {
18083
20029
  fontSize: ".8rem"
18084
20030
  }
18085
- }) : /* @__PURE__ */ jsx134(ContentCopyIcon, {
20031
+ }) : /* @__PURE__ */ jsx135(ContentCopyIcon, {
18086
20032
  sx: {
18087
20033
  fontSize: ".8rem"
18088
20034
  }
18089
20035
  })
18090
20036
  }),
18091
- Editor && editable && serialize && deserialize && /* @__PURE__ */ jsx134(IconBox, {
20037
+ Editor && editable && serialize && deserialize && /* @__PURE__ */ jsx135(IconBox, {
18092
20038
  onClick: startEditing,
18093
- children: /* @__PURE__ */ jsx134(EditIcon, {
20039
+ children: /* @__PURE__ */ jsx135(EditIcon, {
18094
20040
  sx: {
18095
20041
  fontSize: ".8rem"
18096
20042
  }
18097
20043
  })
18098
20044
  }),
18099
- enableAdd && /* @__PURE__ */ jsx134(IconBox, {
20045
+ enableAdd && /* @__PURE__ */ jsx135(IconBox, {
18100
20046
  onClick: (event) => {
18101
20047
  event.preventDefault();
18102
20048
  onAdd === null || onAdd === void 0 ? void 0 : onAdd(path);
18103
20049
  },
18104
- children: /* @__PURE__ */ jsx134(AddBoxIcon, {
20050
+ children: /* @__PURE__ */ jsx135(AddBoxIcon, {
18105
20051
  sx: {
18106
20052
  fontSize: ".8rem"
18107
20053
  }
18108
20054
  })
18109
20055
  }),
18110
- enableDelete && /* @__PURE__ */ jsx134(IconBox, {
20056
+ enableDelete && /* @__PURE__ */ jsx135(IconBox, {
18111
20057
  onClick: (event) => {
18112
20058
  event.preventDefault();
18113
20059
  onDelete === null || onDelete === void 0 ? void 0 : onDelete(path, value);
18114
20060
  },
18115
- children: /* @__PURE__ */ jsx134(DeleteIcon, {
20061
+ children: /* @__PURE__ */ jsx135(DeleteIcon, {
18116
20062
  sx: {
18117
20063
  fontSize: ".9rem"
18118
20064
  }
@@ -18140,12 +20086,12 @@ var DataKeyPair = (props) => {
18140
20086
  abortEditing,
18141
20087
  commitEditing
18142
20088
  ]);
18143
- const isEmptyValue = useMemo8(() => getValueSize(value) === 0, [
20089
+ const isEmptyValue = useMemo9(() => getValueSize(value) === 0, [
18144
20090
  value
18145
20091
  ]);
18146
20092
  const expandable = !isEmptyValue && !!(PreComponent && PostComponent);
18147
20093
  const KeyRenderer = useJsonViewerStore((store) => store.keyRenderer);
18148
- const downstreamProps = useMemo8(() => ({
20094
+ const downstreamProps = useMemo9(() => ({
18149
20095
  path,
18150
20096
  inspect,
18151
20097
  setInspect,
@@ -18193,7 +20139,7 @@ var DataKeyPair = (props) => {
18193
20139
  setInspect
18194
20140
  ]),
18195
20141
  children: [
18196
- expandable ? inspect ? /* @__PURE__ */ jsx134(ExpandMoreIcon, {
20142
+ expandable ? inspect ? /* @__PURE__ */ jsx135(ExpandMoreIcon, {
18197
20143
  className: "data-key-toggle-expanded",
18198
20144
  sx: {
18199
20145
  fontSize: ".8rem",
@@ -18201,7 +20147,7 @@ var DataKeyPair = (props) => {
18201
20147
  cursor: "pointer"
18202
20148
  }
18203
20149
  }
18204
- }) : /* @__PURE__ */ jsx134(ChevronRightIcon, {
20150
+ }) : /* @__PURE__ */ jsx135(ChevronRightIcon, {
18205
20151
  className: "data-key-toggle-collapsed",
18206
20152
  sx: {
18207
20153
  fontSize: ".8rem",
@@ -18210,44 +20156,44 @@ var DataKeyPair = (props) => {
18210
20156
  }
18211
20157
  }
18212
20158
  }) : null,
18213
- /* @__PURE__ */ jsx134(Box10, {
20159
+ /* @__PURE__ */ jsx135(Box10, {
18214
20160
  ref: highlightContainer,
18215
20161
  className: "data-key-key",
18216
20162
  component: "span",
18217
- children: isRoot && depth === 0 ? rootName !== false ? quotesOnKeys ? /* @__PURE__ */ jsxs126(Fragment7, {
20163
+ children: isRoot && depth === 0 ? rootName !== false ? quotesOnKeys ? /* @__PURE__ */ jsxs126(Fragment8, {
18218
20164
  children: [
18219
20165
  '"',
18220
20166
  rootName,
18221
20167
  '"'
18222
20168
  ]
18223
- }) : /* @__PURE__ */ jsx134(Fragment7, {
20169
+ }) : /* @__PURE__ */ jsx135(Fragment8, {
18224
20170
  children: rootName
18225
- }) : null : KeyRenderer.when(downstreamProps) ? /* @__PURE__ */ jsx134(KeyRenderer, {
20171
+ }) : null : KeyRenderer.when(downstreamProps) ? /* @__PURE__ */ jsx135(KeyRenderer, {
18226
20172
  ...downstreamProps
18227
- }) : nestedIndex === void 0 && (isNumberKey ? /* @__PURE__ */ jsx134(Box10, {
20173
+ }) : nestedIndex === void 0 && (isNumberKey ? /* @__PURE__ */ jsx135(Box10, {
18228
20174
  component: "span",
18229
20175
  style: {
18230
20176
  color: numberKeyColor,
18231
20177
  userSelect: isNumberKey ? "none" : "auto"
18232
20178
  },
18233
20179
  children: key
18234
- }) : quotesOnKeys ? /* @__PURE__ */ jsxs126(Fragment7, {
20180
+ }) : quotesOnKeys ? /* @__PURE__ */ jsxs126(Fragment8, {
18235
20181
  children: [
18236
20182
  '"',
18237
20183
  key,
18238
20184
  '"'
18239
20185
  ]
18240
- }) : /* @__PURE__ */ jsx134(Fragment7, {
20186
+ }) : /* @__PURE__ */ jsx135(Fragment8, {
18241
20187
  children: key
18242
20188
  }))
18243
20189
  }),
18244
- isRoot ? rootName !== false && /* @__PURE__ */ jsx134(DataBox, {
20190
+ isRoot ? rootName !== false && /* @__PURE__ */ jsx135(DataBox, {
18245
20191
  className: "data-key-colon",
18246
20192
  sx: {
18247
20193
  mr: 0.5
18248
20194
  },
18249
20195
  children: ":"
18250
- }) : nestedIndex === void 0 && /* @__PURE__ */ jsx134(DataBox, {
20196
+ }) : nestedIndex === void 0 && /* @__PURE__ */ jsx135(DataBox, {
18251
20197
  className: "data-key-colon",
18252
20198
  sx: {
18253
20199
  mr: 0.5,
@@ -18258,29 +20204,29 @@ var DataKeyPair = (props) => {
18258
20204
  },
18259
20205
  children: ":"
18260
20206
  }),
18261
- PreComponent && /* @__PURE__ */ jsx134(PreComponent, {
20207
+ PreComponent && /* @__PURE__ */ jsx135(PreComponent, {
18262
20208
  ...downstreamProps
18263
20209
  }),
18264
20210
  isHover && expandable && inspect && actionIcons
18265
20211
  ]
18266
20212
  }),
18267
- editing && editable ? Editor && /* @__PURE__ */ jsx134(Editor, {
20213
+ editing && editable ? Editor && /* @__PURE__ */ jsx135(Editor, {
18268
20214
  path,
18269
20215
  value: tempValue,
18270
20216
  setValue: setTempValue,
18271
20217
  abortEditing,
18272
20218
  commitEditing
18273
- }) : Component ? /* @__PURE__ */ jsx134(Component, {
20219
+ }) : Component ? /* @__PURE__ */ jsx135(Component, {
18274
20220
  ...downstreamProps
18275
- }) : /* @__PURE__ */ jsx134(Box10, {
20221
+ }) : /* @__PURE__ */ jsx135(Box10, {
18276
20222
  component: "span",
18277
20223
  className: "data-value-fallback",
18278
20224
  children: "fallback: ".concat(value)
18279
20225
  }),
18280
- PostComponent && /* @__PURE__ */ jsx134(PostComponent, {
20226
+ PostComponent && /* @__PURE__ */ jsx135(PostComponent, {
18281
20227
  ...downstreamProps
18282
20228
  }),
18283
- !last && displayComma && /* @__PURE__ */ jsx134(DataBox, {
20229
+ !last && displayComma && /* @__PURE__ */ jsx135(DataBox, {
18284
20230
  children: ","
18285
20231
  }),
18286
20232
  isHover && expandable && !inspect && actionIcons,
@@ -18292,7 +20238,7 @@ var DataKeyPair = (props) => {
18292
20238
  var query = "(prefers-color-scheme: dark)";
18293
20239
  function useThemeDetector() {
18294
20240
  const [isDark, setIsDark] = useState12(false);
18295
- useEffect16(() => {
20241
+ useEffect17(() => {
18296
20242
  const listener = (e2) => setIsDark(e2.matches);
18297
20243
  setIsDark(window.matchMedia(query).matches);
18298
20244
  const queryMedia = window.matchMedia(query);
@@ -18302,8 +20248,8 @@ function useThemeDetector() {
18302
20248
  return isDark;
18303
20249
  }
18304
20250
  function useSetIfNotUndefinedEffect(key, value) {
18305
- const { setState } = useContext16(JsonViewerStoreContext);
18306
- useEffect16(() => {
20251
+ const { setState } = useContext17(JsonViewerStoreContext);
20252
+ useEffect17(() => {
18307
20253
  if (value !== void 0) {
18308
20254
  setState({
18309
20255
  [key]: value
@@ -18316,8 +20262,8 @@ function useSetIfNotUndefinedEffect(key, value) {
18316
20262
  ]);
18317
20263
  }
18318
20264
  var JsonViewerInner = (props) => {
18319
- const { setState } = useContext16(JsonViewerStoreContext);
18320
- useEffect16(() => {
20265
+ const { setState } = useContext17(JsonViewerStoreContext);
20266
+ useEffect17(() => {
18321
20267
  setState((state) => ({
18322
20268
  prevValue: state.value,
18323
20269
  value: props.value
@@ -18345,7 +20291,7 @@ var JsonViewerInner = (props) => {
18345
20291
  useSetIfNotUndefinedEffect("displaySize", props.displaySize);
18346
20292
  useSetIfNotUndefinedEffect("displayComma", props.displayComma);
18347
20293
  useSetIfNotUndefinedEffect("highlightUpdates", props.highlightUpdates);
18348
- useEffect16(() => {
20294
+ useEffect17(() => {
18349
20295
  if (props.theme === "light") {
18350
20296
  setState({
18351
20297
  colorspace: lightColorspace
@@ -18363,13 +20309,13 @@ var JsonViewerInner = (props) => {
18363
20309
  setState,
18364
20310
  props.theme
18365
20311
  ]);
18366
- const themeCls = useMemo8(() => {
20312
+ const themeCls = useMemo9(() => {
18367
20313
  if (typeof props.theme === "object") return "json-viewer-theme-custom";
18368
20314
  return props.theme === "dark" ? "json-viewer-theme-dark" : "json-viewer-theme-light";
18369
20315
  }, [
18370
20316
  props.theme
18371
20317
  ]);
18372
- const onceRef = useRef12(true);
20318
+ const onceRef = useRef13(true);
18373
20319
  const registerTypes = useTypeRegistryStore((store) => store.registerTypes);
18374
20320
  if (onceRef.current) {
18375
20321
  const allTypes = props.valueTypes ? [
@@ -18381,7 +20327,7 @@ var JsonViewerInner = (props) => {
18381
20327
  registerTypes(allTypes);
18382
20328
  onceRef.current = false;
18383
20329
  }
18384
- useEffect16(() => {
20330
+ useEffect17(() => {
18385
20331
  const allTypes = props.valueTypes ? [
18386
20332
  ...predefinedTypes,
18387
20333
  ...props.valueTypes
@@ -18395,12 +20341,12 @@ var JsonViewerInner = (props) => {
18395
20341
  ]);
18396
20342
  const value = useJsonViewerStore((store) => store.value);
18397
20343
  const prevValue = useJsonViewerStore((store) => store.prevValue);
18398
- const emptyPath = useMemo8(() => [], []);
20344
+ const emptyPath = useMemo9(() => [], []);
18399
20345
  const setHover = useJsonViewerStore((store) => store.setHover);
18400
20346
  const onMouseLeave = useCallback8(() => setHover(null), [
18401
20347
  setHover
18402
20348
  ]);
18403
- return /* @__PURE__ */ jsx134(Paper2, {
20349
+ return /* @__PURE__ */ jsx135(Paper2, {
18404
20350
  elevation: 0,
18405
20351
  className: clsx(themeCls, props.className),
18406
20352
  style: props.style,
@@ -18411,7 +20357,7 @@ var JsonViewerInner = (props) => {
18411
20357
  ...props.sx
18412
20358
  },
18413
20359
  onMouseLeave,
18414
- children: /* @__PURE__ */ jsx134(DataKeyPair, {
20360
+ children: /* @__PURE__ */ jsx135(DataKeyPair, {
18415
20361
  value,
18416
20362
  prevValue,
18417
20363
  path: emptyPath,
@@ -18426,14 +20372,14 @@ var JsonViewer = function JsonViewer2(props) {
18426
20372
  }
18427
20373
  }
18428
20374
  const isAutoDarkTheme = useThemeDetector();
18429
- const themeType = useMemo8(() => {
20375
+ const themeType = useMemo9(() => {
18430
20376
  var _props_theme;
18431
20377
  return props.theme === "auto" ? isAutoDarkTheme ? "dark" : "light" : (_props_theme = props.theme) !== null && _props_theme !== void 0 ? _props_theme : "light";
18432
20378
  }, [
18433
20379
  isAutoDarkTheme,
18434
20380
  props.theme
18435
20381
  ]);
18436
- const theme = useMemo8(() => {
20382
+ const theme = useMemo9(() => {
18437
20383
  const backgroundColor = typeof themeType === "object" ? themeType.base00 : themeType === "dark" ? darkColorspace.base00 : lightColorspace.base00;
18438
20384
  const foregroundColor = typeof themeType === "object" ? themeType.base07 : themeType === "dark" ? darkColorspace.base07 : lightColorspace.base07;
18439
20385
  return createTheme({
@@ -18461,15 +20407,15 @@ var JsonViewer = function JsonViewer2(props) {
18461
20407
  ...props,
18462
20408
  theme: themeType
18463
20409
  };
18464
- const jsonViewerStore = useMemo8(() => createJsonViewerStore(props), []);
18465
- const typeRegistryStore = useMemo8(() => createTypeRegistryStore(), []);
18466
- return /* @__PURE__ */ jsx134(ThemeProvider, {
20410
+ const jsonViewerStore = useMemo9(() => createJsonViewerStore(props), []);
20411
+ const typeRegistryStore = useMemo9(() => createTypeRegistryStore(), []);
20412
+ return /* @__PURE__ */ jsx135(ThemeProvider, {
18467
20413
  theme,
18468
- children: /* @__PURE__ */ jsx134(TypeRegistryStoreContext.Provider, {
20414
+ children: /* @__PURE__ */ jsx135(TypeRegistryStoreContext.Provider, {
18469
20415
  value: typeRegistryStore,
18470
- children: /* @__PURE__ */ jsx134(JsonViewerStoreContext.Provider, {
20416
+ children: /* @__PURE__ */ jsx135(JsonViewerStoreContext.Provider, {
18471
20417
  value: jsonViewerStore,
18472
- children: /* @__PURE__ */ jsx134(JsonViewerInner, {
20418
+ children: /* @__PURE__ */ jsx135(JsonViewerInner, {
18473
20419
  ...mixedProps
18474
20420
  })
18475
20421
  })
@@ -18479,7 +20425,7 @@ var JsonViewer = function JsonViewer2(props) {
18479
20425
 
18480
20426
  // src/components/event-details/payload-viewer.tsx
18481
20427
  import { memo as memo10 } from "react";
18482
- import { jsx as jsx135 } from "react/jsx-runtime";
20428
+ import { jsx as jsx136 } from "react/jsx-runtime";
18483
20429
  function tryParseJson(value) {
18484
20430
  if (typeof value !== "string") {
18485
20431
  return value;
@@ -18492,7 +20438,7 @@ function tryParseJson(value) {
18492
20438
  }
18493
20439
  var PayloadViewer = memo10(({ sx, testId, value }) => {
18494
20440
  const theme = useTheme3();
18495
- return /* @__PURE__ */ jsx135(Box11, { "data-testid": testId, sx: { backgroundColor: "background.default", borderRadius: 1, fontSize: 12, overflow: "auto", p: 1, ...sx }, children: /* @__PURE__ */ jsx135(
20441
+ return /* @__PURE__ */ jsx136(Box11, { "data-testid": testId, sx: { backgroundColor: "background.default", borderRadius: 1, fontSize: 12, overflow: "auto", p: 1, ...sx }, children: /* @__PURE__ */ jsx136(
18496
20442
  JsonViewer,
18497
20443
  {
18498
20444
  displayDataTypes: false,
@@ -18506,21 +20452,21 @@ var PayloadViewer = memo10(({ sx, testId, value }) => {
18506
20452
  });
18507
20453
 
18508
20454
  // src/components/event-details/event-detail.tsx
18509
- import { Fragment as Fragment8, jsx as jsx136, jsxs as jsxs127 } from "react/jsx-runtime";
20455
+ import { Fragment as Fragment9, jsx as jsx137, jsxs as jsxs127 } from "react/jsx-runtime";
18510
20456
  var DetailRow2 = ({ content, label }) => /* @__PURE__ */ jsxs127(Box12, { sx: { display: "grid", gap: 1, gridTemplateColumns: "72px 1fr", mb: 0.5 }, children: [
18511
- /* @__PURE__ */ jsx136(Typography7, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: label }),
18512
- /* @__PURE__ */ jsx136(Box12, { children: typeof content === "string" ? /* @__PURE__ */ jsx136(Typography7, { sx: { color: "text.primary", whiteSpace: "pre-wrap" }, variant: "caption", children: content }) : content })
20457
+ /* @__PURE__ */ jsx137(Typography7, { color: "text.secondary", sx: { fontWeight: 600 }, variant: "caption", children: label }),
20458
+ /* @__PURE__ */ jsx137(Box12, { children: typeof content === "string" ? /* @__PURE__ */ jsx137(Typography7, { sx: { color: "text.primary", whiteSpace: "pre-wrap" }, variant: "caption", children: content }) : content })
18513
20459
  ] });
18514
20460
  var EventMessage = ({ event }) => {
18515
20461
  const [isOpen, setIsOpen] = useState13(false);
18516
20462
  const [isOverflowing, setIsOverflowing] = useState13(false);
18517
- const textReference = useRef13(null);
18518
- const parsedMessage = useMemo9(() => parseEventMessage(event), [event]);
18519
- const isIAMPolicyEvent = useMemo9(
20463
+ const textReference = useRef14(null);
20464
+ const parsedMessage = useMemo10(() => parseEventMessage(event), [event]);
20465
+ const isIAMPolicyEvent = useMemo10(
18520
20466
  () => event.event_type === "iam.policy_evaluation" && event.attributes?.payload && typeof event.attributes.payload === "string",
18521
20467
  [event]
18522
20468
  );
18523
- useEffect17(() => {
20469
+ useEffect18(() => {
18524
20470
  const checkOverflow = () => {
18525
20471
  const element = textReference.current;
18526
20472
  if (element) {
@@ -18533,17 +20479,17 @@ var EventMessage = ({ event }) => {
18533
20479
  window.removeEventListener("resize", checkOverflow);
18534
20480
  };
18535
20481
  }, [parsedMessage.headline]);
18536
- const hasAdditionalContent = useMemo9(
20482
+ const hasAdditionalContent = useMemo10(
18537
20483
  () => parsedMessage.message || parsedMessage.details || isIAMPolicyEvent,
18538
20484
  [parsedMessage.message, parsedMessage.details, isIAMPolicyEvent]
18539
20485
  );
18540
- const shouldShowToggle = useMemo9(
20486
+ const shouldShowToggle = useMemo10(
18541
20487
  () => isOverflowing || hasAdditionalContent,
18542
20488
  [isOverflowing, hasAdditionalContent]
18543
20489
  );
18544
20490
  return /* @__PURE__ */ jsxs127(Box12, { sx: { display: "flex", flexDirection: "column" }, children: [
18545
20491
  /* @__PURE__ */ jsxs127(Box12, { sx: { alignItems: "center", display: "flex" }, children: [
18546
- Boolean(shouldShowToggle) && /* @__PURE__ */ jsx136(
20492
+ Boolean(shouldShowToggle) && /* @__PURE__ */ jsx137(
18547
20493
  IconButton3,
18548
20494
  {
18549
20495
  onClick: () => {
@@ -18551,10 +20497,10 @@ var EventMessage = ({ event }) => {
18551
20497
  },
18552
20498
  size: "small",
18553
20499
  sx: { mr: 1, p: 0 },
18554
- children: isOpen ? /* @__PURE__ */ jsx136(KeyboardArrowDown2, { sx: { fontSize: 16 } }) : /* @__PURE__ */ jsx136(KeyboardArrowRight2, { sx: { fontSize: 16 } })
20500
+ children: isOpen ? /* @__PURE__ */ jsx137(KeyboardArrowDown2, { sx: { fontSize: 16 } }) : /* @__PURE__ */ jsx137(KeyboardArrowRight2, { sx: { fontSize: 16 } })
18555
20501
  }
18556
20502
  ),
18557
- /* @__PURE__ */ jsx136(
20503
+ /* @__PURE__ */ jsx137(
18558
20504
  Typography7,
18559
20505
  {
18560
20506
  ref: textReference,
@@ -18572,12 +20518,12 @@ var EventMessage = ({ event }) => {
18572
20518
  }
18573
20519
  )
18574
20520
  ] }),
18575
- isOpen && /* @__PURE__ */ jsx136(Box12, { sx: { borderColor: "divider", borderLeft: "2px solid", ml: 1, mt: 0.5, pl: 1.5, py: 0.5 }, children: isIAMPolicyEvent ? /* @__PURE__ */ jsx136(IAMEventDetail, { event }) : /* @__PURE__ */ jsxs127(Fragment8, { children: [
18576
- Boolean(parsedMessage.message) && /* @__PURE__ */ jsx136(DetailRow2, { content: parsedMessage.message, label: "Message" }),
18577
- Boolean(parsedMessage.details) && /* @__PURE__ */ jsx136(
20521
+ isOpen && /* @__PURE__ */ jsx137(Box12, { sx: { borderColor: "divider", borderLeft: "2px solid", ml: 1, mt: 0.5, pl: 1.5, py: 0.5 }, children: isIAMPolicyEvent ? /* @__PURE__ */ jsx137(IAMEventDetail, { event }) : /* @__PURE__ */ jsxs127(Fragment9, { children: [
20522
+ Boolean(parsedMessage.message) && /* @__PURE__ */ jsx137(DetailRow2, { content: parsedMessage.message, label: "Message" }),
20523
+ Boolean(parsedMessage.details) && /* @__PURE__ */ jsx137(
18578
20524
  DetailRow2,
18579
20525
  {
18580
- content: /* @__PURE__ */ jsx136(PayloadViewer, { sx: { px: 0 }, value: tryParseJson(parsedMessage.details) }),
20526
+ content: /* @__PURE__ */ jsx137(PayloadViewer, { sx: { px: 0 }, value: tryParseJson(parsedMessage.details) }),
18581
20527
  label: "Details"
18582
20528
  }
18583
20529
  )
@@ -18609,15 +20555,15 @@ var EventDetail = ({
18609
20555
  type
18610
20556
  }) => {
18611
20557
  if (type === "permission") {
18612
- return /* @__PURE__ */ jsx136(IAMPermissionDetail, { events });
20558
+ return /* @__PURE__ */ jsx137(IAMPermissionDetail, { events });
18613
20559
  }
18614
20560
  const eventLevel = getEventLevelFromGroup(type);
18615
20561
  return /* @__PURE__ */ jsxs127(Box12, { children: [
18616
20562
  /* @__PURE__ */ jsxs127(Box12, { sx: { alignItems: "center", display: "flex", mb: 0.5 }, children: [
18617
- /* @__PURE__ */ jsx136(StatusIcon, { errorLevel: eventLevel }),
18618
- /* @__PURE__ */ jsx136(Typography7, { color: "text.secondary", sx: { fontWeight: 600, ml: 0.5 }, variant: "caption", children: displayText })
20563
+ /* @__PURE__ */ jsx137(StatusIcon, { errorLevel: eventLevel }),
20564
+ /* @__PURE__ */ jsx137(Typography7, { color: "text.secondary", sx: { fontWeight: 600, ml: 0.5 }, variant: "caption", children: displayText })
18619
20565
  ] }),
18620
- /* @__PURE__ */ jsx136(Box12, { children: events.map((event) => /* @__PURE__ */ jsx136(Box12, { sx: { maxWidth: "100%", mb: 0.5 }, children: /* @__PURE__ */ jsx136(EventMessage, { event }) }, `${event.span_id}-${event.event_id}`)) })
20566
+ /* @__PURE__ */ jsx137(Box12, { children: events.map((event) => /* @__PURE__ */ jsx137(Box12, { sx: { maxWidth: "100%", mb: 0.5 }, children: /* @__PURE__ */ jsx137(EventMessage, { event }) }, `${event.span_id}-${event.event_id}`)) })
18621
20567
  ] });
18622
20568
  };
18623
20569
 
@@ -23946,7 +25892,7 @@ async function checkFeatures(context, config, args) {
23946
25892
  }
23947
25893
 
23948
25894
  // node_modules/@aws-sdk/middleware-user-agent/dist-es/constants.js
23949
- var USER_AGENT = "user-agent";
25895
+ var USER_AGENT2 = "user-agent";
23950
25896
  var X_AMZ_USER_AGENT = "x-amz-user-agent";
23951
25897
  var SPACE = " ";
23952
25898
  var UA_NAME_SEPARATOR = "/";
@@ -23998,9 +25944,9 @@ var userAgentMiddleware = (options) => (next, context) => async (args) => {
23998
25944
  ].join(SPACE);
23999
25945
  if (options.runtime !== "browser") {
24000
25946
  if (normalUAValue) {
24001
- headers[X_AMZ_USER_AGENT] = headers[X_AMZ_USER_AGENT] ? `${headers[USER_AGENT]} ${normalUAValue}` : normalUAValue;
25947
+ headers[X_AMZ_USER_AGENT] = headers[X_AMZ_USER_AGENT] ? `${headers[USER_AGENT2]} ${normalUAValue}` : normalUAValue;
24002
25948
  }
24003
- headers[USER_AGENT] = sdkUserAgentValue;
25949
+ headers[USER_AGENT2] = sdkUserAgentValue;
24004
25950
  } else {
24005
25951
  headers[X_AMZ_USER_AGENT] = sdkUserAgentValue;
24006
25952
  }
@@ -28309,8 +30255,8 @@ var QueryStatus = {
28309
30255
 
28310
30256
  // src/components/event-details/lambda-invoke-logs-section.tsx
28311
30257
  import { Box as Box13, CircularProgress as CircularProgress3, Stack, Typography as Typography8 } from "@mui/material";
28312
- import { useEffect as useEffect18, useMemo as useMemo10, useRef as useRef14, useState as useState14 } from "react";
28313
- import { jsx as jsx137, jsxs as jsxs128 } from "react/jsx-runtime";
30258
+ import { useEffect as useEffect19, useMemo as useMemo11, useRef as useRef15, useState as useState14 } from "react";
30259
+ import { jsx as jsx138, jsxs as jsxs128 } from "react/jsx-runtime";
28314
30260
  var POLL_INTERVAL_MS = 1e3;
28315
30261
  async function pollQueryResults(client, queryId) {
28316
30262
  return client.send(new GetQueryResultsCommand({ queryId }));
@@ -28327,7 +30273,7 @@ async function startLambdaLogsQuery(client, functionName2, requestId, startTimeS
28327
30273
  }
28328
30274
  function useCloudWatchLogsClient(region) {
28329
30275
  const { localstackEndpoint } = useAppInspector();
28330
- const client = useMemo10(() => new CloudWatchLogsClient({
30276
+ const client = useMemo11(() => new CloudWatchLogsClient({
28331
30277
  credentials: {
28332
30278
  accessKeyId: "test",
28333
30279
  secretAccessKey: "test"
@@ -28341,9 +30287,9 @@ function useLambdaInvokeLogs(functionName2, requestId, region, startTimeNano, en
28341
30287
  const [loading, setLoading] = useState14(true);
28342
30288
  const [logs, setLogs] = useState14([]);
28343
30289
  const [error, setError] = useState14();
28344
- const pollTimerRef = useRef14(null);
30290
+ const pollTimerRef = useRef15(null);
28345
30291
  const cloudWatchLogs = useCloudWatchLogsClient(region);
28346
- useEffect18(() => {
30292
+ useEffect19(() => {
28347
30293
  let cancelled = false;
28348
30294
  const startTimeSec = Math.floor(Number(BigInt(startTimeNano) / BigInt(1e9)));
28349
30295
  const endTimeSec = Math.ceil(Number(BigInt(endTimeNano) / BigInt(1e9)));
@@ -28401,24 +30347,24 @@ var LambdaInvokeLogsSection = ({ endTimeNano, functionName: functionName2, regio
28401
30347
  const { error, loading, logs } = useLambdaInvokeLogs(functionName2, requestId, region, startTimeNano, endTimeNano);
28402
30348
  if (loading) {
28403
30349
  return /* @__PURE__ */ jsxs128(Stack, { alignItems: "center", direction: "row", spacing: 1, children: [
28404
- /* @__PURE__ */ jsx137(CircularProgress3, { size: 14 }),
28405
- /* @__PURE__ */ jsx137(Typography8, { color: "text.secondary", variant: "body2", children: "Loading logs\u2026" })
30350
+ /* @__PURE__ */ jsx138(CircularProgress3, { size: 14 }),
30351
+ /* @__PURE__ */ jsx138(Typography8, { color: "text.secondary", variant: "body2", children: "Loading logs\u2026" })
28406
30352
  ] });
28407
30353
  }
28408
30354
  if (error !== void 0) {
28409
- return /* @__PURE__ */ jsx137(Typography8, { color: "error", variant: "body2", children: error.message });
30355
+ return /* @__PURE__ */ jsx138(Typography8, { color: "error", variant: "body2", children: error.message });
28410
30356
  }
28411
30357
  if (logs.length === 0) {
28412
- return /* @__PURE__ */ jsx137(Typography8, { color: "text.secondary", variant: "body2", children: "No logs found for this invocation." });
30358
+ return /* @__PURE__ */ jsx138(Typography8, { color: "text.secondary", variant: "body2", children: "No logs found for this invocation." });
28413
30359
  }
28414
- return /* @__PURE__ */ jsx137(Box13, { sx: { backgroundColor: (theme) => theme.palette.background.default, borderRadius: 1, p: 1 }, children: /* @__PURE__ */ jsx137("pre", { style: { margin: 0, overflow: "auto" }, children: logs.map((log) => /* @__PURE__ */ jsx137(Typography8, { variant: "body2", children: `[${log.timestamp}] ${log.message}` }, log.ptr)) }) });
30360
+ return /* @__PURE__ */ jsx138(Box13, { sx: { backgroundColor: (theme) => theme.palette.background.default, borderRadius: 1, p: 1 }, children: /* @__PURE__ */ jsx138("pre", { style: { margin: 0, overflow: "auto" }, children: logs.map((log) => /* @__PURE__ */ jsx138(Typography8, { variant: "body2", children: `[${log.timestamp}] ${log.message}` }, log.ptr)) }) });
28415
30361
  };
28416
30362
 
28417
30363
  // src/components/event-details/toggle-section.tsx
28418
30364
  import { KeyboardArrowDown as KeyboardArrowDown3, KeyboardArrowRight as KeyboardArrowRight3 } from "@mui/icons-material";
28419
30365
  import { Box as Box14, Typography as Typography9 } from "@mui/material";
28420
30366
  import { useState as useState15 } from "react";
28421
- import { jsx as jsx138, jsxs as jsxs129 } from "react/jsx-runtime";
30367
+ import { jsx as jsx139, jsxs as jsxs129 } from "react/jsx-runtime";
28422
30368
  var ToggleSection = ({ action, children, headline, initialOpen = true }) => {
28423
30369
  const [isOpen, setIsOpen] = useState15(initialOpen);
28424
30370
  return /* @__PURE__ */ jsxs129(Box14, { sx: { mt: 4 }, children: [
@@ -28446,23 +30392,23 @@ var ToggleSection = ({ action, children, headline, initialOpen = true }) => {
28446
30392
  gap: 1
28447
30393
  },
28448
30394
  children: [
28449
- /* @__PURE__ */ jsx138(Typography9, { sx: { fontWeight: 600 }, variant: "subtitle2", children: headline }),
28450
- isOpen ? /* @__PURE__ */ jsx138(KeyboardArrowDown3, { sx: { color: "text.secondary", height: 20, width: 20 } }) : /* @__PURE__ */ jsx138(KeyboardArrowRight3, { sx: { color: "text.secondary", height: 20, width: 20 } })
30395
+ /* @__PURE__ */ jsx139(Typography9, { sx: { fontWeight: 600 }, variant: "subtitle2", children: headline }),
30396
+ isOpen ? /* @__PURE__ */ jsx139(KeyboardArrowDown3, { sx: { color: "text.secondary", height: 20, width: 20 } }) : /* @__PURE__ */ jsx139(KeyboardArrowRight3, { sx: { color: "text.secondary", height: 20, width: 20 } })
28451
30397
  ]
28452
30398
  }
28453
30399
  ),
28454
- action !== false && /* @__PURE__ */ jsx138(Box14, { onClick: (event) => {
30400
+ action !== false && /* @__PURE__ */ jsx139(Box14, { onClick: (event) => {
28455
30401
  event.stopPropagation();
28456
30402
  }, children: action })
28457
30403
  ]
28458
30404
  }
28459
30405
  ),
28460
- isOpen && /* @__PURE__ */ jsx138(Box14, { children })
30406
+ isOpen && /* @__PURE__ */ jsx139(Box14, { children })
28461
30407
  ] });
28462
30408
  };
28463
30409
 
28464
30410
  // src/components/event-details/event-details.tsx
28465
- import { Fragment as Fragment9, jsx as jsx139, jsxs as jsxs130 } from "react/jsx-runtime";
30411
+ import { Fragment as Fragment10, jsx as jsx140, jsxs as jsxs130 } from "react/jsx-runtime";
28466
30412
  var checkIsLambdaInvoke = (span) => {
28467
30413
  if (span.service_name !== "lambda") {
28468
30414
  return false;
@@ -28477,18 +30423,19 @@ var checkIsSqsSendMessage = (span) => {
28477
30423
  return span.operation_name.startsWith("SendMessage");
28478
30424
  };
28479
30425
  var EventDetails = ({ onClose, selectedEvent }) => {
28480
- const eventGroups = useMemo11(
30426
+ const eventGroups = useMemo12(
28481
30427
  () => getEventGroupsByType(selectedEvent?.events ?? []),
28482
30428
  [selectedEvent?.events]
28483
30429
  );
28484
30430
  const [parseNestedJson, setParseNestedJson] = useState16(true);
28485
30431
  if (!selectedEvent) {
28486
- return /* @__PURE__ */ jsx139(Box15, { sx: { p: 3, textAlign: "center" }, children: /* @__PURE__ */ jsx139(Typography10, { color: "text.secondary", variant: "body2", children: "Select an event to view details" }) });
30432
+ return /* @__PURE__ */ jsx140(Box15, { sx: { p: 3, textAlign: "center" }, children: /* @__PURE__ */ jsx140(Typography10, { color: "text.secondary", variant: "body2", children: "Select an event to view details" }) });
28487
30433
  }
28488
30434
  const isLambdaInvoke = checkIsLambdaInvoke(selectedEvent);
28489
30435
  const isSqsSendMessage = checkIsSqsSendMessage(selectedEvent);
28490
30436
  const requestId = typeof selectedEvent.attributes?.["localstack.request_id"] === "string" ? selectedEvent.attributes["localstack.request_id"] : void 0;
28491
30437
  const resourceArn = typeof selectedEvent.attributes?.["localstack.aws.resource_arn"] === "string" ? selectedEvent.attributes["localstack.aws.resource_arn"] : void 0;
30438
+ const cfnResourceType = typeof selectedEvent.attributes?.["localstack.cfn.resource_type"] === "string" ? selectedEvent.attributes["localstack.cfn.resource_type"] : void 0;
28492
30439
  const requestPayload = tryParseJson(selectedEvent.attributes?.["localstack.aws.service.request"]);
28493
30440
  if (parseNestedJson) {
28494
30441
  if (isLambdaInvoke && requestPayload && typeof requestPayload === "object" && "Payload" in requestPayload) {
@@ -28519,48 +30466,54 @@ var EventDetails = ({ onClose, selectedEvent }) => {
28519
30466
  py: 1
28520
30467
  },
28521
30468
  children: [
28522
- /* @__PURE__ */ jsx139(Box15, { children: /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "h6", children: "Operation Details" }) }),
28523
- onClose && /* @__PURE__ */ jsx139(IconButton4, { "data-testid": EVENT_DETAILS_CLOSE_BUTTON_TEST_ID, onClick: onClose, size: "small", children: /* @__PURE__ */ jsx139(Close2, {}) })
30469
+ /* @__PURE__ */ jsx140(Box15, { children: /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "h6", children: "Operation Details" }) }),
30470
+ onClose && /* @__PURE__ */ jsx140(IconButton4, { "data-testid": EVENT_DETAILS_CLOSE_BUTTON_TEST_ID, onClick: onClose, size: "small", children: /* @__PURE__ */ jsx140(Close2, {}) })
28524
30471
  ]
28525
30472
  }
28526
30473
  ),
28527
- /* @__PURE__ */ jsx139(Box15, { sx: { flexGrow: 1, overflow: "auto", p: 2 }, children: /* @__PURE__ */ jsxs130(Stack2, { spacing: 2, children: [
28528
- /* @__PURE__ */ jsx139(ToggleSection, { headline: "Basic Information", children: /* @__PURE__ */ jsxs130(Stack2, { "data-testid": EVENT_DETAILS_SECTION_BASIC_INFORMATION_TEST_ID, spacing: 1, children: [
30474
+ /* @__PURE__ */ jsx140(Box15, { sx: { flexGrow: 1, overflow: "auto", p: 2 }, children: /* @__PURE__ */ jsxs130(Stack2, { spacing: 2, children: [
30475
+ /* @__PURE__ */ jsx140(ToggleSection, { headline: "Basic Information", children: /* @__PURE__ */ jsxs130(Stack2, { "data-testid": EVENT_DETAILS_SECTION_BASIC_INFORMATION_TEST_ID, spacing: 1, children: [
28529
30476
  /* @__PURE__ */ jsxs130(Box15, { sx: { display: "grid", gap: 2, gridTemplateColumns: "1.3fr 1fr" }, children: [
28530
30477
  /* @__PURE__ */ jsxs130(Box15, { children: [
28531
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Service" }),
28532
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_SERVICE_NAME_TEST_ID, variant: "body2", children: selectedEvent.service_name })
30478
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Service" }),
30479
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_SERVICE_NAME_TEST_ID, variant: "body2", children: selectedEvent.service_name })
28533
30480
  ] }),
28534
30481
  /* @__PURE__ */ jsxs130(Box15, { children: [
28535
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Operation" }),
28536
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_OPERATION_NAME_TEST_ID, variant: "body2", children: selectedEvent.operation_name })
30482
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Operation" }),
30483
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_OPERATION_NAME_TEST_ID, variant: "body2", children: selectedEvent.operation_name })
28537
30484
  ] })
28538
30485
  ] }),
28539
- /* @__PURE__ */ jsxs130(Box15, { children: [
28540
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Resource" }),
28541
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_RESOURCE_NAME_TEST_ID, variant: "body2", children: selectedEvent.resource_name })
30486
+ /* @__PURE__ */ jsxs130(Box15, { sx: cfnResourceType ? { display: "grid", gap: 2, gridTemplateColumns: "1.3fr 1fr" } : void 0, children: [
30487
+ /* @__PURE__ */ jsxs130(Box15, { children: [
30488
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Resource" }),
30489
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_RESOURCE_NAME_TEST_ID, variant: "body2", children: selectedEvent.resource_name })
30490
+ ] }),
30491
+ Boolean(cfnResourceType) && /* @__PURE__ */ jsxs130(Box15, { children: [
30492
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Resource Type" }),
30493
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_CFN_RESOURCE_TYPE_TEST_ID, variant: "body2", children: cfnResourceType })
30494
+ ] })
28542
30495
  ] }),
28543
30496
  Boolean(resourceArn) && /* @__PURE__ */ jsxs130(Box15, { children: [
28544
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Resource ARN" }),
28545
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_RESOURCE_ARN_TEST_ID, variant: "body2", children: resourceArn })
30497
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Resource ARN" }),
30498
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_RESOURCE_ARN_TEST_ID, variant: "body2", children: resourceArn })
28546
30499
  ] }),
28547
30500
  /* @__PURE__ */ jsxs130(Box15, { sx: { display: "grid", gap: 1, gridTemplateColumns: "1.3fr 1fr" }, children: [
28548
30501
  /* @__PURE__ */ jsxs130(Box15, { children: [
28549
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Account" }),
28550
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_ACCOUNT_TEST_ID, variant: "body2", children: selectedEvent.account_id })
30502
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Account" }),
30503
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_ACCOUNT_TEST_ID, variant: "body2", children: selectedEvent.account_id })
28551
30504
  ] }),
28552
30505
  /* @__PURE__ */ jsxs130(Box15, { children: [
28553
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Region" }),
28554
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_REGION_TEST_ID, variant: "body2", children: selectedEvent.region })
30506
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Region" }),
30507
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_REGION_TEST_ID, variant: "body2", children: selectedEvent.region })
28555
30508
  ] })
28556
30509
  ] }),
28557
30510
  /* @__PURE__ */ jsxs130(Box15, { sx: { display: "grid", gap: 1, gridTemplateColumns: duration === void 0 ? "1fr" : "1.3fr 1fr" }, children: [
28558
30511
  /* @__PURE__ */ jsxs130(Box15, { children: [
28559
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Start Time" }),
28560
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_START_TIME_TEST_ID, variant: "body2", children: unixNanoToDate(selectedEvent.start_time_unix_nano)?.toISOString() })
30512
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Start Time" }),
30513
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_START_TIME_TEST_ID, variant: "body2", children: unixNanoToDate(selectedEvent.start_time_unix_nano)?.toISOString() })
28561
30514
  ] }),
28562
30515
  duration !== void 0 && /* @__PURE__ */ jsxs130(Box15, { children: [
28563
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Duration" }),
30516
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Duration" }),
28564
30517
  /* @__PURE__ */ jsxs130(Typography10, { "data-testid": EVENT_DETAILS_DURATION_TEST_ID, variant: "body2", children: [
28565
30518
  duration,
28566
30519
  "ms"
@@ -28568,8 +30521,8 @@ var EventDetails = ({ onClose, selectedEvent }) => {
28568
30521
  ] })
28569
30522
  ] }),
28570
30523
  /* @__PURE__ */ jsxs130(Box15, { children: [
28571
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Status" }),
28572
- /* @__PURE__ */ jsx139(Stack2, { alignItems: "center", direction: "row", flexWrap: "wrap", gap: 1, sx: { mb: eventGroups.errors || eventGroups.warnings ? 1 : 0 }, children: /* @__PURE__ */ jsx139(
30524
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Status" }),
30525
+ /* @__PURE__ */ jsx140(Stack2, { alignItems: "center", direction: "row", flexWrap: "wrap", gap: 1, sx: { mb: eventGroups.errors || eventGroups.warnings ? 1 : 0 }, children: /* @__PURE__ */ jsx140(
28573
30526
  Chip3,
28574
30527
  {
28575
30528
  color: selectedEvent.status_code === 2 ? "error" : selectedEvent.status_code === 1 ? "success" : "default",
@@ -28580,50 +30533,50 @@ var EventDetails = ({ onClose, selectedEvent }) => {
28580
30533
  ) })
28581
30534
  ] })
28582
30535
  ] }) }),
28583
- /* @__PURE__ */ jsx139(Divider3, {}),
30536
+ /* @__PURE__ */ jsx140(Divider3, {}),
28584
30537
  /* @__PURE__ */ jsxs130(ToggleSection, { headline: "Permissions", children: [
28585
- selectedEvent.iam_errors_suppressed && /* @__PURE__ */ jsx139(Alert4, { "data-testid": EVENT_DETAILS_IAM_ERRORS_SUPPRESSED_TEST_ID, severity: "warning", sx: { mb: 1 }, children: "IAM errors are suppressed \u2014 upgrade your license to view" }),
28586
- !selectedEvent.iam_errors_suppressed && !eventGroups.permissions && !eventGroups.errors && !eventGroups.warnings && /* @__PURE__ */ jsx139(Typography10, { color: "text.secondary", variant: "body2", children: "There is no permission information available." }),
28587
- eventGroups.permissions && /* @__PURE__ */ jsx139(EventDetail, { displayText: "Permissions", events: eventGroups.permissions, type: "permission" }),
28588
- eventGroups.errors && /* @__PURE__ */ jsx139(EventDetail, { displayText: "Error", events: eventGroups.errors, type: "error" }),
28589
- eventGroups.warnings && /* @__PURE__ */ jsx139(EventDetail, { displayText: "Warning", events: eventGroups.warnings, type: "warning" })
30538
+ selectedEvent.iam_errors_suppressed && /* @__PURE__ */ jsx140(Alert4, { "data-testid": EVENT_DETAILS_IAM_ERRORS_SUPPRESSED_TEST_ID, severity: "warning", sx: { mb: 1 }, children: "IAM errors are suppressed \u2014 upgrade your license to view" }),
30539
+ !selectedEvent.iam_errors_suppressed && !eventGroups.permissions && !eventGroups.errors && !eventGroups.warnings && /* @__PURE__ */ jsx140(Typography10, { color: "text.secondary", variant: "body2", children: "There is no permission information available." }),
30540
+ eventGroups.permissions && /* @__PURE__ */ jsx140(EventDetail, { displayText: "Permissions", events: eventGroups.permissions, type: "permission" }),
30541
+ eventGroups.errors && /* @__PURE__ */ jsx140(EventDetail, { displayText: "Error", events: eventGroups.errors, type: "error" }),
30542
+ eventGroups.warnings && /* @__PURE__ */ jsx140(EventDetail, { displayText: "Warning", events: eventGroups.warnings, type: "warning" })
28590
30543
  ] }),
28591
- hasPayloads && /* @__PURE__ */ jsxs130(Fragment9, { children: [
28592
- /* @__PURE__ */ jsx139(Divider3, {}),
28593
- /* @__PURE__ */ jsx139(
30544
+ hasPayloads && /* @__PURE__ */ jsxs130(Fragment10, { children: [
30545
+ /* @__PURE__ */ jsx140(Divider3, {}),
30546
+ /* @__PURE__ */ jsx140(
28594
30547
  ToggleSection,
28595
30548
  {
28596
- action: /* @__PURE__ */ jsx139(
30549
+ action: /* @__PURE__ */ jsx140(
28597
30550
  FormControlLabel2,
28598
30551
  {
28599
- control: /* @__PURE__ */ jsx139(Switch, { checked: !parseNestedJson, onChange: (event) => {
30552
+ control: /* @__PURE__ */ jsx140(Switch, { checked: !parseNestedJson, onChange: (event) => {
28600
30553
  setParseNestedJson(!event.target.checked);
28601
30554
  }, size: "small" }),
28602
- label: /* @__PURE__ */ jsx139(Typography10, { variant: "caption", children: "View raw data" }),
30555
+ label: /* @__PURE__ */ jsx140(Typography10, { variant: "caption", children: "View raw data" }),
28603
30556
  sx: { mr: 0 }
28604
30557
  }
28605
30558
  ),
28606
30559
  headline: "Payloads",
28607
30560
  children: /* @__PURE__ */ jsxs130(Stack2, { spacing: 2, children: [
28608
30561
  requestPayload !== void 0 && /* @__PURE__ */ jsxs130(Box15, { children: [
28609
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Request" }),
28610
- /* @__PURE__ */ jsx139(PayloadViewer, { testId: EVENT_DETAILS_REQUEST_PAYLOAD, value: requestPayload })
30562
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Request" }),
30563
+ /* @__PURE__ */ jsx140(PayloadViewer, { testId: EVENT_DETAILS_REQUEST_PAYLOAD, value: requestPayload })
28611
30564
  ] }),
28612
30565
  (responsePayload !== void 0 || isResponseSuppressed) && /* @__PURE__ */ jsxs130(Box15, { children: [
28613
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Response" }),
28614
- isResponseSuppressed ? /* @__PURE__ */ jsx139(Box15, { sx: { py: 1 }, children: /* @__PURE__ */ jsx139(Alert4, { severity: "warning", sx: { mb: 1 }, children: "Response payload is available \u2014 upgrade your license to view" }) }) : /* @__PURE__ */ jsx139(PayloadViewer, { testId: EVENT_DETAILS_RESPONSE_PAYLOAD_TEST_ID, value: responsePayload })
30566
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Response" }),
30567
+ isResponseSuppressed ? /* @__PURE__ */ jsx140(Box15, { sx: { py: 1 }, children: /* @__PURE__ */ jsx140(Alert4, { severity: "warning", sx: { mb: 1 }, children: "Response payload is available \u2014 upgrade your license to view" }) }) : /* @__PURE__ */ jsx140(PayloadViewer, { testId: EVENT_DETAILS_RESPONSE_PAYLOAD_TEST_ID, value: responsePayload })
28615
30568
  ] }),
28616
30569
  exceptionPayload !== void 0 && /* @__PURE__ */ jsxs130(Box15, { children: [
28617
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Exception" }),
28618
- /* @__PURE__ */ jsx139(PayloadViewer, { testId: EVENT_DETAILS_EXCEPTION_PAYLOAD_TEST_ID, value: exceptionPayload })
30570
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Exception" }),
30571
+ /* @__PURE__ */ jsx140(PayloadViewer, { testId: EVENT_DETAILS_EXCEPTION_PAYLOAD_TEST_ID, value: exceptionPayload })
28619
30572
  ] })
28620
30573
  ] })
28621
30574
  }
28622
30575
  )
28623
30576
  ] }),
28624
- isLambdaInvoke && requestId !== void 0 && /* @__PURE__ */ jsxs130(Fragment9, { children: [
28625
- /* @__PURE__ */ jsx139(Divider3, {}),
28626
- /* @__PURE__ */ jsx139(ToggleSection, { headline: "Lambda Logs", children: /* @__PURE__ */ jsx139(
30577
+ isLambdaInvoke && requestId !== void 0 && /* @__PURE__ */ jsxs130(Fragment10, { children: [
30578
+ /* @__PURE__ */ jsx140(Divider3, {}),
30579
+ /* @__PURE__ */ jsx140(ToggleSection, { headline: "Lambda Logs", children: /* @__PURE__ */ jsx140(
28627
30580
  LambdaInvokeLogsSection,
28628
30581
  {
28629
30582
  endTimeNano: selectedEvent.end_time_unix_nano ?? selectedEvent.start_time_unix_nano,
@@ -28634,21 +30587,21 @@ var EventDetails = ({ onClose, selectedEvent }) => {
28634
30587
  }
28635
30588
  ) })
28636
30589
  ] }),
28637
- /* @__PURE__ */ jsx139(Divider3, {}),
28638
- /* @__PURE__ */ jsx139(ToggleSection, { headline: "Advanced Information", initialOpen: false, children: /* @__PURE__ */ jsxs130(Stack2, { spacing: 1, children: [
30590
+ /* @__PURE__ */ jsx140(Divider3, {}),
30591
+ /* @__PURE__ */ jsx140(ToggleSection, { headline: "Advanced Information", initialOpen: false, children: /* @__PURE__ */ jsxs130(Stack2, { spacing: 1, children: [
28639
30592
  /* @__PURE__ */ jsxs130(Box15, { children: [
28640
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Span ID" }),
28641
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_SPAN_ID_TEST_ID, variant: "body2", children: selectedEvent.span_id })
30593
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Span ID" }),
30594
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_SPAN_ID_TEST_ID, variant: "body2", children: selectedEvent.span_id })
28642
30595
  ] }),
28643
30596
  /* @__PURE__ */ jsxs130(Box15, { children: [
28644
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Trace ID" }),
28645
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_TRACE_ID_TEST_ID, variant: "body2", children: selectedEvent.trace_id })
30597
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Trace ID" }),
30598
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_TRACE_ID_TEST_ID, variant: "body2", children: selectedEvent.trace_id })
28646
30599
  ] }),
28647
30600
  requestId !== void 0 && /* @__PURE__ */ jsxs130(Box15, { children: [
28648
- /* @__PURE__ */ jsx139(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Request ID" }),
28649
- /* @__PURE__ */ jsx139(Typography10, { "data-testid": EVENT_DETAILS_REQUEST_ID_TEST_ID, variant: "body2", children: requestId })
30601
+ /* @__PURE__ */ jsx140(Typography10, { sx: { fontWeight: 600 }, variant: "caption", children: "Request ID" }),
30602
+ /* @__PURE__ */ jsx140(Typography10, { "data-testid": EVENT_DETAILS_REQUEST_ID_TEST_ID, variant: "body2", children: requestId })
28650
30603
  ] }),
28651
- eventGroups.info && /* @__PURE__ */ jsx139(EventDetail, { displayText: "Info", events: eventGroups.info, type: "info" })
30604
+ eventGroups.info && /* @__PURE__ */ jsx140(EventDetail, { displayText: "Info", events: eventGroups.info, type: "info" })
28652
30605
  ] }) })
28653
30606
  ] }) })
28654
30607
  ] });
@@ -28658,7 +30611,7 @@ var EventDetails = ({ onClose, selectedEvent }) => {
28658
30611
  import "@xyflow/react/dist/base.css";
28659
30612
  import { Alert as Alert5, Button as Button5, useTheme as useTheme5 } from "@mui/material";
28660
30613
  import { Background, MarkerType, Position as Position2, ReactFlow, useEdgesState, useNodesState } from "@xyflow/react";
28661
- import { useEffect as useEffect19 } from "react";
30614
+ import { useEffect as useEffect20 } from "react";
28662
30615
 
28663
30616
  // src/components/trace-graph/service-node.tsx
28664
30617
  import { Box as Box17, Divider as Divider4, Stack as Stack3, Typography as Typography11, useTheme as useTheme4 } from "@mui/material";
@@ -28669,23 +30622,23 @@ import { memo as memo11 } from "react";
28669
30622
  // src/components/trace-graph/problem-indicator.tsx
28670
30623
  import { Error as ErrorIcon2, Info as Info2, Warning as Warning2 } from "@mui/icons-material";
28671
30624
  import { Box as Box16, Tooltip as Tooltip4 } from "@mui/material";
28672
- import { useMemo as useMemo12 } from "react";
28673
- import { jsx as jsx140 } from "react/jsx-runtime";
30625
+ import { useMemo as useMemo13 } from "react";
30626
+ import { jsx as jsx141 } from "react/jsx-runtime";
28674
30627
  var ProblemIndicator = ({ error }) => {
28675
- const icon = useMemo12(() => {
30628
+ const icon = useMemo13(() => {
28676
30629
  switch (error.level) {
28677
30630
  case "error": {
28678
- return /* @__PURE__ */ jsx140(ErrorIcon2, { sx: { color: "#d32f2f", fontSize: "14px" } });
30631
+ return /* @__PURE__ */ jsx141(ErrorIcon2, { sx: { color: "#d32f2f", fontSize: "14px" } });
28679
30632
  }
28680
30633
  case "warning": {
28681
- return /* @__PURE__ */ jsx140(Warning2, { sx: { color: "#ff9800", fontSize: "14px" } });
30634
+ return /* @__PURE__ */ jsx141(Warning2, { sx: { color: "#ff9800", fontSize: "14px" } });
28682
30635
  }
28683
30636
  default: {
28684
- return /* @__PURE__ */ jsx140(Info2, { sx: { color: "#2196f3", fontSize: "14px" } });
30637
+ return /* @__PURE__ */ jsx141(Info2, { sx: { color: "#2196f3", fontSize: "14px" } });
28685
30638
  }
28686
30639
  }
28687
30640
  }, [error.level]);
28688
- const color2 = useMemo12(() => {
30641
+ const color2 = useMemo13(() => {
28689
30642
  switch (error.level) {
28690
30643
  case "error": {
28691
30644
  return "#d32f2f";
@@ -28698,7 +30651,7 @@ var ProblemIndicator = ({ error }) => {
28698
30651
  }
28699
30652
  }
28700
30653
  }, [error.level]);
28701
- return /* @__PURE__ */ jsx140(Tooltip4, { arrow: true, title: error.message ?? "Issue detected", children: /* @__PURE__ */ jsx140(
30654
+ return /* @__PURE__ */ jsx141(Tooltip4, { arrow: true, title: error.message ?? "Issue detected", children: /* @__PURE__ */ jsx141(
28702
30655
  Box16,
28703
30656
  {
28704
30657
  sx: {
@@ -28718,7 +30671,7 @@ var ProblemIndicator = ({ error }) => {
28718
30671
  };
28719
30672
 
28720
30673
  // src/components/trace-graph/service-node.tsx
28721
- import { jsx as jsx141, jsxs as jsxs131 } from "react/jsx-runtime";
30674
+ import { jsx as jsx142, jsxs as jsxs131 } from "react/jsx-runtime";
28722
30675
  var handleStyle = {
28723
30676
  backgroundColor: "white",
28724
30677
  borderColor: "lightgray",
@@ -28750,8 +30703,8 @@ var ServiceNode = memo11(({ data, selected }) => {
28750
30703
  },
28751
30704
  tabIndex: 0,
28752
30705
  children: [
28753
- /* @__PURE__ */ jsx141(Handle, { position: Position.Left, style: handleStyle, type: "target" }),
28754
- /* @__PURE__ */ jsx141(Handle, { position: Position.Right, style: handleStyle, type: "source" }),
30706
+ /* @__PURE__ */ jsx142(Handle, { position: Position.Left, style: handleStyle, type: "target" }),
30707
+ /* @__PURE__ */ jsx142(Handle, { position: Position.Right, style: handleStyle, type: "source" }),
28755
30708
  /* @__PURE__ */ jsxs131(
28756
30709
  Stack3,
28757
30710
  {
@@ -28759,9 +30712,9 @@ var ServiceNode = memo11(({ data, selected }) => {
28759
30712
  direction: "row",
28760
30713
  sx: { gap: "8px", pb: "2px", pt: "6px", px: "8px" },
28761
30714
  children: [
28762
- /* @__PURE__ */ jsx141(Box17, { sx: { borderRadius: "4px", flexShrink: 0, lineHeight: 0, overflow: "hidden" }, children: /* @__PURE__ */ jsx141(AwsServiceIcon, { hideTooltip: true, service: data.event.service_name, size: "medium" }) }),
30715
+ /* @__PURE__ */ jsx142(Box17, { sx: { borderRadius: "4px", flexShrink: 0, lineHeight: 0, overflow: "hidden" }, children: /* @__PURE__ */ jsx142(AwsServiceIcon, { hideTooltip: true, service: data.event.service_name, size: "medium" }) }),
28763
30716
  /* @__PURE__ */ jsxs131(Stack3, { sx: { minWidth: 0 }, children: [
28764
- /* @__PURE__ */ jsx141(
30717
+ /* @__PURE__ */ jsx142(
28765
30718
  Typography11,
28766
30719
  {
28767
30720
  noWrap: true,
@@ -28770,7 +30723,7 @@ var ServiceNode = memo11(({ data, selected }) => {
28770
30723
  children: data.event.service_name
28771
30724
  }
28772
30725
  ),
28773
- data.event.resource_name != "" && /* @__PURE__ */ jsx141(
30726
+ data.event.resource_name != "" && /* @__PURE__ */ jsx142(
28774
30727
  Typography11,
28775
30728
  {
28776
30729
  color: "text.secondary",
@@ -28784,7 +30737,7 @@ var ServiceNode = memo11(({ data, selected }) => {
28784
30737
  ]
28785
30738
  }
28786
30739
  ),
28787
- /* @__PURE__ */ jsx141(Divider4, { sx: { ml: "38px", mr: "8px", my: "5px" } }),
30740
+ /* @__PURE__ */ jsx142(Divider4, { sx: { ml: "38px", mr: "8px", my: "5px" } }),
28788
30741
  /* @__PURE__ */ jsxs131(
28789
30742
  Stack3,
28790
30743
  {
@@ -28792,7 +30745,7 @@ var ServiceNode = memo11(({ data, selected }) => {
28792
30745
  direction: "row",
28793
30746
  sx: { minWidth: 0, pb: "5px", pr: "8px", pt: "1px" },
28794
30747
  children: [
28795
- /* @__PURE__ */ jsx141(
30748
+ /* @__PURE__ */ jsx142(
28796
30749
  Box17,
28797
30750
  {
28798
30751
  sx: {
@@ -28802,10 +30755,10 @@ var ServiceNode = memo11(({ data, selected }) => {
28802
30755
  justifyContent: "center",
28803
30756
  width: "38px"
28804
30757
  },
28805
- children: hasErrors && data.event.errors?.map((error) => /* @__PURE__ */ jsx141(ProblemIndicator, { error }, error.span_id))
30758
+ children: hasErrors && data.event.errors?.map((error) => /* @__PURE__ */ jsx142(ProblemIndicator, { error }, error.span_id))
28806
30759
  }
28807
30760
  ),
28808
- /* @__PURE__ */ jsx141(
30761
+ /* @__PURE__ */ jsx142(
28809
30762
  Typography11,
28810
30763
  {
28811
30764
  "data-testid": SERVICE_NODE_OPERATION_NAME_TEST_ID,
@@ -28883,7 +30836,7 @@ import { Box as Box18, IconButton as IconButton5 } from "@mui/material";
28883
30836
  import { useReactFlow, useStore as useStore2 } from "@xyflow/react";
28884
30837
  import { memo as memo12 } from "react";
28885
30838
  import { shallow } from "zustand/shallow";
28886
- import { jsx as jsx142, jsxs as jsxs132 } from "react/jsx-runtime";
30839
+ import { jsx as jsx143, jsxs as jsxs132 } from "react/jsx-runtime";
28887
30840
  var selector = (s2) => ({
28888
30841
  isInteractive: s2.nodesDraggable || s2.nodesConnectable || s2.elementsSelectable,
28889
30842
  maxZoomReached: s2.transform[2] >= s2.maxZoom,
@@ -28915,33 +30868,33 @@ var Controls = memo12(() => {
28915
30868
  zIndex: 5
28916
30869
  },
28917
30870
  children: [
28918
- /* @__PURE__ */ jsx142(
30871
+ /* @__PURE__ */ jsx143(
28919
30872
  IconButton5,
28920
30873
  {
28921
30874
  className: "react-flow__controls-zoomin",
28922
30875
  disabled: maxZoomReached,
28923
30876
  onClick: onZoomInHandler,
28924
30877
  size: "small",
28925
- children: /* @__PURE__ */ jsx142(Add, {})
30878
+ children: /* @__PURE__ */ jsx143(Add, {})
28926
30879
  }
28927
30880
  ),
28928
- /* @__PURE__ */ jsx142(
30881
+ /* @__PURE__ */ jsx143(
28929
30882
  IconButton5,
28930
30883
  {
28931
30884
  className: "react-flow__controls-zoomout",
28932
30885
  disabled: minZoomReached,
28933
30886
  onClick: onZoomOutHandler,
28934
30887
  size: "small",
28935
- children: /* @__PURE__ */ jsx142(Remove, {})
30888
+ children: /* @__PURE__ */ jsx143(Remove, {})
28936
30889
  }
28937
30890
  ),
28938
- /* @__PURE__ */ jsx142(
30891
+ /* @__PURE__ */ jsx143(
28939
30892
  IconButton5,
28940
30893
  {
28941
30894
  className: "react-flow__controls-fitview",
28942
30895
  onClick: onFitViewHandler,
28943
30896
  size: "small",
28944
- children: /* @__PURE__ */ jsx142(FitScreen, {})
30897
+ children: /* @__PURE__ */ jsx143(FitScreen, {})
28945
30898
  }
28946
30899
  )
28947
30900
  ]
@@ -28950,7 +30903,7 @@ var Controls = memo12(() => {
28950
30903
  });
28951
30904
 
28952
30905
  // src/components/trace-graph/trace-graph.tsx
28953
- import { Fragment as Fragment10, jsx as jsx143, jsxs as jsxs133 } from "react/jsx-runtime";
30906
+ import { Fragment as Fragment11, jsx as jsx144, jsxs as jsxs133 } from "react/jsx-runtime";
28954
30907
  var nodeTypes = {
28955
30908
  service: ServiceNode
28956
30909
  };
@@ -28963,7 +30916,7 @@ var TraceGraph = ({
28963
30916
  }) => {
28964
30917
  const [nodes, setNodes, onNodesChange] = useNodesState([]);
28965
30918
  const [edges, setEdges] = useEdgesState([]);
28966
- useEffect19(() => {
30919
+ useEffect20(() => {
28967
30920
  const allNodes = [];
28968
30921
  const allEdges = [];
28969
30922
  for (const span of spans.data ?? []) {
@@ -29014,11 +30967,11 @@ var TraceGraph = ({
29014
30967
  setEdges(layoutedEdges);
29015
30968
  }, [spans.data, initialFocusEventId, order2, setNodes, setEdges]);
29016
30969
  const theme = useTheme5();
29017
- return /* @__PURE__ */ jsxs133(Fragment10, { children: [
30970
+ return /* @__PURE__ */ jsxs133(Fragment11, { children: [
29018
30971
  spans.error && /* @__PURE__ */ jsxs133(
29019
30972
  Alert5,
29020
30973
  {
29021
- action: /* @__PURE__ */ jsx143(Button5, { onClick: () => {
30974
+ action: /* @__PURE__ */ jsx144(Button5, { onClick: () => {
29022
30975
  onRefresh();
29023
30976
  }, children: "Retry" }),
29024
30977
  severity: "error",
@@ -29047,8 +31000,8 @@ var TraceGraph = ({
29047
31000
  onNodesChange,
29048
31001
  selectNodesOnDrag: false,
29049
31002
  children: [
29050
- /* @__PURE__ */ jsx143(Controls, {}),
29051
- /* @__PURE__ */ jsx143(
31003
+ /* @__PURE__ */ jsx144(Controls, {}),
31004
+ /* @__PURE__ */ jsx144(
29052
31005
  Background,
29053
31006
  {
29054
31007
  bgColor: theme.palette.background.default,
@@ -29062,7 +31015,7 @@ var TraceGraph = ({
29062
31015
  };
29063
31016
 
29064
31017
  // src/pages/trace-graph-page.tsx
29065
- import { Fragment as Fragment11, jsx as jsx144, jsxs as jsxs134 } from "react/jsx-runtime";
31018
+ import { Fragment as Fragment12, jsx as jsx145, jsxs as jsxs134 } from "react/jsx-runtime";
29066
31019
  var HEADER_HEIGHT = 56;
29067
31020
  var DRAWER_WIDTH = "35%";
29068
31021
  var Main = styled("main", { shouldForwardProp: (property) => property !== "open" })(({ open, theme }) => ({
@@ -29126,12 +31079,12 @@ var TraceGraphView = ({
29126
31079
  },
29127
31080
  children: [
29128
31081
  /* @__PURE__ */ jsxs134(Box19, { sx: { display: "flex", width: "100%" }, children: [
29129
- /* @__PURE__ */ jsx144(Button6, { onClick: () => {
31082
+ /* @__PURE__ */ jsx145(Button6, { onClick: () => {
29130
31083
  navigateToSpansList();
29131
- }, startIcon: /* @__PURE__ */ jsx144(ArrowBack, {}), children: "Go back" }),
29132
- /* @__PURE__ */ jsx144(Box19, { sx: { flexGrow: 1 } })
31084
+ }, startIcon: /* @__PURE__ */ jsx145(ArrowBack, {}), children: "Go back" }),
31085
+ /* @__PURE__ */ jsx145(Box19, { sx: { flexGrow: 1 } })
29133
31086
  ] }),
29134
- /* @__PURE__ */ jsx144(
31087
+ /* @__PURE__ */ jsx145(
29135
31088
  Paper3,
29136
31089
  {
29137
31090
  sx: {
@@ -29141,7 +31094,7 @@ var TraceGraphView = ({
29141
31094
  position: "relative",
29142
31095
  width: "100%"
29143
31096
  },
29144
- children: shouldShowStatusMessage ? /* @__PURE__ */ jsx144(
31097
+ children: shouldShowStatusMessage ? /* @__PURE__ */ jsx145(
29145
31098
  StatusMessage,
29146
31099
  {
29147
31100
  error: statusError,
@@ -29149,15 +31102,15 @@ var TraceGraphView = ({
29149
31102
  onRetry: handleRetry,
29150
31103
  status
29151
31104
  }
29152
- ) : /* @__PURE__ */ jsxs134(Fragment11, { children: [
29153
- /* @__PURE__ */ jsx144(Main, { open, children: /* @__PURE__ */ jsx144(
31105
+ ) : /* @__PURE__ */ jsxs134(Fragment12, { children: [
31106
+ /* @__PURE__ */ jsx145(Main, { open, children: /* @__PURE__ */ jsx145(
29154
31107
  Box19,
29155
31108
  {
29156
31109
  sx: {
29157
31110
  height: "100%",
29158
31111
  overflow: "auto"
29159
31112
  },
29160
- children: traceId !== void 0 && /* @__PURE__ */ jsx144(ReactFlowProvider, { children: /* @__PURE__ */ jsx144(
31113
+ children: traceId !== void 0 && /* @__PURE__ */ jsx145(ReactFlowProvider, { children: /* @__PURE__ */ jsx145(
29161
31114
  TraceGraph,
29162
31115
  {
29163
31116
  initialFocusEventId: spanId,
@@ -29175,7 +31128,7 @@ var TraceGraphView = ({
29175
31128
  ) })
29176
31129
  }
29177
31130
  ) }),
29178
- /* @__PURE__ */ jsx144(StyledDrawer, { anchor: "right", open, variant: "persistent", children: /* @__PURE__ */ jsx144(EventDetails, { onClose: handleClose, selectedEvent }) })
31131
+ /* @__PURE__ */ jsx145(StyledDrawer, { anchor: "right", open, variant: "persistent", children: /* @__PURE__ */ jsx145(EventDetails, { onClose: handleClose, selectedEvent }) })
29179
31132
  ] })
29180
31133
  }
29181
31134
  )
@@ -29235,19 +31188,19 @@ var TraceGraphPage = ({ onClose, order: order2 = "oldest_first", spanId, traceId
29235
31188
  setLoading(false);
29236
31189
  }
29237
31190
  }, [api, traceId]);
29238
- useEffect20(() => {
31191
+ useEffect21(() => {
29239
31192
  void fetchSpans();
29240
31193
  }, [fetchSpans]);
29241
31194
  const [open, setOpen] = useState17(true);
29242
31195
  const [selectedEvent, setSelectedEvent] = useState17(() => spans?.find((span) => span.span_id === spanId));
29243
- const spansReference = useRef15();
29244
- useEffect20(() => {
31196
+ const spansReference = useRef16();
31197
+ useEffect21(() => {
29245
31198
  if (!spansReference.current && spans) {
29246
31199
  setSelectedEvent(spans.find((span) => span.span_id === spanId));
29247
31200
  spansReference.current = spans;
29248
31201
  }
29249
31202
  }, [spans, setSelectedEvent, spanId]);
29250
- const { checkStatus, error: statusError, status } = useStatus();
31203
+ const { checkStatus, status, statusError } = useAppInspectorStatus();
29251
31204
  const handleEnable = useCallback9(async () => {
29252
31205
  await api.setStatus({ status: "ENABLED" });
29253
31206
  void checkStatus();
@@ -29263,7 +31216,7 @@ var TraceGraphPage = ({ onClose, order: order2 = "oldest_first", spanId, traceId
29263
31216
  const navigateToSpansList = useCallback9(() => {
29264
31217
  onClose?.();
29265
31218
  }, [onClose]);
29266
- return /* @__PURE__ */ jsx144(
31219
+ return /* @__PURE__ */ jsx145(
29267
31220
  TraceGraphView,
29268
31221
  {
29269
31222
  fetchError,
@@ -29289,12 +31242,10 @@ var TraceGraphPage = ({ onClose, order: order2 = "oldest_first", spanId, traceId
29289
31242
  };
29290
31243
 
29291
31244
  // src/pages/spans-list-page.tsx
29292
- import { Fragment as Fragment12, jsx as jsx145, jsxs as jsxs135 } from "react/jsx-runtime";
31245
+ import { Fragment as Fragment13, jsx as jsx146, jsxs as jsxs135 } from "react/jsx-runtime";
29293
31246
  var SpansListPage = () => {
29294
31247
  const api = useAppInspectorApi();
29295
31248
  const {
29296
- checking,
29297
- checkStatus,
29298
31249
  clearingSpans,
29299
31250
  clearSpans,
29300
31251
  fetchBackward,
@@ -29307,13 +31258,12 @@ var SpansListPage = () => {
29307
31258
  iamErrorCount,
29308
31259
  licenseLimit,
29309
31260
  spans,
29310
- status,
29311
- statusError,
29312
31261
  streamPaused,
29313
31262
  systemLimit,
29314
31263
  toggleStream,
29315
31264
  totalCount
29316
31265
  } = useSpans();
31266
+ const { checking, checkStatus, status, statusError } = useAppInspectorStatus();
29317
31267
  const clearSpansSync = useCallback10(() => {
29318
31268
  void clearSpans();
29319
31269
  }, [clearSpans]);
@@ -29335,7 +31285,7 @@ var SpansListPage = () => {
29335
31285
  void checkStatus();
29336
31286
  }, [api, checkStatus]);
29337
31287
  const shouldShowStatusMessage = Boolean(statusError) || status?.status === "DISABLED";
29338
- return /* @__PURE__ */ jsxs135(Fragment12, { children: [
31288
+ return /* @__PURE__ */ jsxs135(Fragment13, { children: [
29339
31289
  /* @__PURE__ */ jsxs135(
29340
31290
  Box20,
29341
31291
  {
@@ -29352,7 +31302,7 @@ var SpansListPage = () => {
29352
31302
  width: "100%"
29353
31303
  },
29354
31304
  children: [
29355
- !checking && !shouldShowStatusMessage && /* @__PURE__ */ jsx145(
31305
+ !checking && !shouldShowStatusMessage && /* @__PURE__ */ jsx146(
29356
31306
  EmulatorVersionBanner,
29357
31307
  {
29358
31308
  compatibility: bannerDismissed && versionCompatibility === "warning" ? "ok" : versionCompatibility,
@@ -29362,7 +31312,7 @@ var SpansListPage = () => {
29362
31312
  } : void 0
29363
31313
  }
29364
31314
  ),
29365
- shouldShowStatusMessage ? /* @__PURE__ */ jsx145(
31315
+ shouldShowStatusMessage ? /* @__PURE__ */ jsx146(
29366
31316
  StatusMessage,
29367
31317
  {
29368
31318
  error: statusError,
@@ -29371,7 +31321,7 @@ var SpansListPage = () => {
29371
31321
  onRetry: handleRetry,
29372
31322
  status
29373
31323
  }
29374
- ) : /* @__PURE__ */ jsx145(
31324
+ ) : /* @__PURE__ */ jsx146(
29375
31325
  SpansList,
29376
31326
  {
29377
31327
  clearingSpans,
@@ -29398,7 +31348,7 @@ var SpansListPage = () => {
29398
31348
  ]
29399
31349
  }
29400
31350
  ),
29401
- selectedTraceId !== void 0 && /* @__PURE__ */ jsx145(TraceGraphPage, { onClose: () => {
31351
+ selectedTraceId !== void 0 && /* @__PURE__ */ jsx146(TraceGraphPage, { onClose: () => {
29402
31352
  setSelectedTraceId(void 0);
29403
31353
  }, order: order2, spanId: selectedSpanId, traceId: selectedTraceId })
29404
31354
  ] });