@datarecce/ui 0.1.22 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{RecceCheckContext-DNKi97uE.js → RecceCheckContext-Cb41gigE.js} +4 -3
  2. package/dist/RecceCheckContext-Cb41gigE.js.map +1 -0
  3. package/dist/{RecceCheckContext-BETsmiD5.mjs → RecceCheckContext-CzsuuXxT.mjs} +4 -3
  4. package/dist/RecceCheckContext-CzsuuXxT.mjs.map +1 -0
  5. package/dist/api.d.mts +2 -2
  6. package/dist/api.d.ts +2 -2
  7. package/dist/api.js +12 -37
  8. package/dist/api.mjs +3 -29
  9. package/dist/{components-C735_oqD.mjs → components-BHxcVq0D.mjs} +1353 -69
  10. package/dist/components-BHxcVq0D.mjs.map +1 -0
  11. package/dist/{components-DeA4kqxK.js → components-Bmc5X473.js} +1557 -248
  12. package/dist/components-Bmc5X473.js.map +1 -0
  13. package/dist/components.d.mts +2 -2
  14. package/dist/components.d.ts +2 -2
  15. package/dist/components.js +8 -4
  16. package/dist/components.mjs +5 -5
  17. package/dist/{hooks-Ba-AoxcK.mjs → hooks-B0XGswIh.mjs} +3 -3
  18. package/dist/{hooks-Ba-AoxcK.mjs.map → hooks-B0XGswIh.mjs.map} +1 -1
  19. package/dist/{hooks-D6xvNXEc.js → hooks-C99PZcmB.js} +3 -3
  20. package/dist/{hooks-D6xvNXEc.js.map → hooks-C99PZcmB.js.map} +1 -1
  21. package/dist/hooks.d.mts +2 -2
  22. package/dist/hooks.d.ts +2 -2
  23. package/dist/hooks.js +4 -3
  24. package/dist/hooks.mjs +4 -4
  25. package/dist/{index-Sj_wOmNH.d.mts → index-04n48ic2.d.mts} +129 -105
  26. package/dist/index-04n48ic2.d.mts.map +1 -0
  27. package/dist/{index-DYduBYD8.d.ts → index-CgyLTrll.d.ts} +129 -105
  28. package/dist/index-CgyLTrll.d.ts.map +1 -0
  29. package/dist/index.d.mts +2 -2
  30. package/dist/index.d.ts +2 -2
  31. package/dist/index.js +20 -14
  32. package/dist/index.mjs +7 -7
  33. package/dist/{state-BjKRZMwY.js → state-Ct-DP81O.js} +108 -79
  34. package/dist/state-Ct-DP81O.js.map +1 -0
  35. package/dist/{state-BySLlIE7.mjs → state-CwepO01b.mjs} +91 -80
  36. package/dist/state-CwepO01b.mjs.map +1 -0
  37. package/dist/types.d.mts +1 -1
  38. package/dist/types.d.ts +1 -1
  39. package/dist/{user-Dt_n5IJX.js → version-BgsW-hXj.js} +50 -10
  40. package/dist/version-BgsW-hXj.js.map +1 -0
  41. package/dist/version-Bz2CiMHD.mjs +93 -0
  42. package/dist/version-Bz2CiMHD.mjs.map +1 -0
  43. package/package.json +5 -4
  44. package/dist/RecceCheckContext-BETsmiD5.mjs.map +0 -1
  45. package/dist/RecceCheckContext-DNKi97uE.js.map +0 -1
  46. package/dist/api.js.map +0 -1
  47. package/dist/api.mjs.map +0 -1
  48. package/dist/components-C735_oqD.mjs.map +0 -1
  49. package/dist/components-DeA4kqxK.js.map +0 -1
  50. package/dist/index-DYduBYD8.d.ts.map +0 -1
  51. package/dist/index-Sj_wOmNH.d.mts.map +0 -1
  52. package/dist/state-BjKRZMwY.js.map +0 -1
  53. package/dist/state-BySLlIE7.mjs.map +0 -1
  54. package/dist/user-BHOgMaBf.mjs +0 -65
  55. package/dist/user-BHOgMaBf.mjs.map +0 -1
  56. package/dist/user-Dt_n5IJX.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client"
2
- const require_state = require('./state-BjKRZMwY.js');
2
+ const require_state = require('./state-Ct-DP81O.js');
3
3
  const require_urls = require('./urls-SazAekCZ.js');
4
- const require_user = require('./user-Dt_n5IJX.js');
5
- const require_RecceCheckContext = require('./RecceCheckContext-DNKi97uE.js');
4
+ const require_version = require('./version-BgsW-hXj.js');
5
+ const require_RecceCheckContext = require('./RecceCheckContext-Cb41gigE.js');
6
6
  const require_tooltipMessage = require('./tooltipMessage-Dbi1kkfi.js');
7
7
  let _mui_material_CssBaseline = require("@mui/material/CssBaseline");
8
8
  _mui_material_CssBaseline = require_state.__toESM(_mui_material_CssBaseline);
@@ -50,6 +50,8 @@ _mui_material_DialogTitle = require_state.__toESM(_mui_material_DialogTitle);
50
50
  let _mui_material_IconButton = require("@mui/material/IconButton");
51
51
  _mui_material_IconButton = require_state.__toESM(_mui_material_IconButton);
52
52
  let react_icons_io5 = require("react-icons/io5");
53
+ let next_link = require("next/link");
54
+ next_link = require_state.__toESM(next_link);
53
55
  let _mui_material_Checkbox = require("@mui/material/Checkbox");
54
56
  _mui_material_Checkbox = require_state.__toESM(_mui_material_Checkbox);
55
57
  let _mui_material_FormControlLabel = require("@mui/material/FormControlLabel");
@@ -63,8 +65,10 @@ _mui_material_MenuItem = require_state.__toESM(_mui_material_MenuItem);
63
65
  let react_icons_vsc = require("react-icons/vsc");
64
66
  let _mui_material_Tooltip = require("@mui/material/Tooltip");
65
67
  _mui_material_Tooltip = require_state.__toESM(_mui_material_Tooltip);
68
+ let usehooks_ts = require("usehooks-ts");
66
69
  let _mui_material_ListSubheader = require("@mui/material/ListSubheader");
67
70
  _mui_material_ListSubheader = require_state.__toESM(_mui_material_ListSubheader);
71
+ let next_navigation = require("next/navigation");
68
72
  let _mui_material_Link = require("@mui/material/Link");
69
73
  _mui_material_Link = require_state.__toESM(_mui_material_Link);
70
74
  let _mui_material_Popover = require("@mui/material/Popover");
@@ -1351,9 +1355,9 @@ var require_embed_resources = /* @__PURE__ */ require_state.__commonJSMin(((expo
1351
1355
  var preferredFontFormat = _a.preferredFontFormat;
1352
1356
  return !preferredFontFormat ? str : str.replace(FONT_SRC_REGEX, function(match) {
1353
1357
  while (true) {
1354
- var _a$1 = URL_WITH_FORMAT_REGEX.exec(match) || [], src = _a$1[0], format$3 = _a$1[2];
1355
- if (!format$3) return "";
1356
- if (format$3 === preferredFontFormat) return "src: ".concat(src, ";");
1358
+ var _a$1 = URL_WITH_FORMAT_REGEX.exec(match) || [], src = _a$1[0], format$4 = _a$1[2];
1359
+ if (!format$4) return "";
1360
+ if (format$4 === preferredFontFormat) return "src: ".concat(src, ";");
1357
1361
  }
1358
1362
  });
1359
1363
  }
@@ -2288,7 +2292,7 @@ const getHTMLElementFromRef = (refCurrent) => {
2288
2292
  };
2289
2293
  const IGNORE_SCREENSHOT_CLASS = "ignore-screenshot";
2290
2294
  const highlightBoxShadow = "rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px";
2291
- function useCopyToClipboard({ renderLibrary = "html2canvas", imageType = "png", backgroundColor = null, boardEffect = true, shadowEffect = false, borderStyle = `solid 1px ${require_state.colors.neutral[300]}`, borderRadius = "10px", onSuccess, onError, ignoreElements }) {
2295
+ function useCopyToClipboard$1({ renderLibrary = "html2canvas", imageType = "png", backgroundColor = null, boardEffect = true, shadowEffect = false, borderStyle = `solid 1px ${require_state.colors.neutral[300]}`, borderRadius = "10px", onSuccess, onError, ignoreElements }) {
2292
2296
  const [status, setStatus] = (0, react.useState)("idle");
2293
2297
  const ref = (0, react.useRef)(null);
2294
2298
  const { onOpen, setImgBlob, ImageDownloadModal } = useImageDownloadModal();
@@ -2389,7 +2393,7 @@ function useCopyToClipboard({ renderLibrary = "html2canvas", imageType = "png",
2389
2393
  }
2390
2394
  function useCopyToClipboardButton(options) {
2391
2395
  const { successToast, failToast } = require_state.useClipBoardToast();
2392
- const { isLoading, copyToClipboard, ImageDownloadModal, ref } = useCopyToClipboard({
2396
+ const { isLoading, copyToClipboard, ImageDownloadModal, ref } = useCopyToClipboard$1({
2393
2397
  imageType: "png",
2394
2398
  shadowEffect: true,
2395
2399
  backgroundColor: options?.backgroundColor ?? require_state.colors.neutral[100],
@@ -2543,13 +2547,14 @@ function useImageDownloadModal() {
2543
2547
  //#endregion
2544
2548
  //#region recce-source/js/src/lib/hooks/useRun.tsx
2545
2549
  const useRun = (runId) => {
2550
+ const { apiClient } = require_state.useApiConfig();
2546
2551
  const [isRunning, setIsRunning] = (0, react.useState)(false);
2547
2552
  const [aborting, setAborting] = (0, react.useState)(false);
2548
2553
  const [, refetchRunsAggregated] = require_state.useRunsAggregated();
2549
2554
  const { error, data: run } = (0, _tanstack_react_query.useQuery)({
2550
2555
  queryKey: require_state.cacheKeys.run(runId ?? ""),
2551
2556
  queryFn: async () => {
2552
- return await require_state.waitRun(runId ?? "", isRunning ? 2 : 0);
2557
+ return await require_state.waitRun(runId ?? "", isRunning ? 2 : 0, apiClient);
2553
2558
  },
2554
2559
  enabled: !!runId,
2555
2560
  refetchInterval: isRunning ? 50 : false,
@@ -2573,8 +2578,8 @@ const useRun = (runId) => {
2573
2578
  const onCancel = (0, react.useCallback)(async () => {
2574
2579
  setAborting(true);
2575
2580
  if (!runId) return;
2576
- await require_state.cancelRun(runId);
2577
- }, [runId]);
2581
+ await require_state.cancelRun(runId, apiClient);
2582
+ }, [runId, apiClient]);
2578
2583
  let RunResultView;
2579
2584
  if (run && require_state.runTypeHasRef(run.type)) RunResultView = require_state.findByRunType(run.type).RunResultView;
2580
2585
  return {
@@ -4452,7 +4457,7 @@ const useLineageViewContextMenu = () => {
4452
4457
  //#endregion
4453
4458
  //#region recce-source/js/src/components/lineage/LineageViewNotification.tsx
4454
4459
  function LineageViewNotification({ notification, type }) {
4455
- const notificationKey = require_user.sessionStorageKeys.lineageNotificationDismissed;
4460
+ const notificationKey = require_version.sessionStorageKeys.lineageNotificationDismissed;
4456
4461
  const [visible, setVisible] = (0, react.useState)(() => {
4457
4462
  return sessionStorage.getItem(notificationKey) !== "true";
4458
4463
  });
@@ -6312,6 +6317,7 @@ const QueryForm = ({ defaultPrimaryKeys, onPrimaryKeysChange, ...props }) => {
6312
6317
  //#region recce-source/js/src/components/AuthModal/AuthModal.tsx
6313
6318
  function AuthModal({ handleParentClose, parentOpen = false, ignoreCookie = false, variant = "auth" }) {
6314
6319
  const { authed } = require_state.useRecceInstanceContext();
6320
+ const { apiClient } = require_state.useApiConfig();
6315
6321
  const [open, setOpen] = (0, react.useState)(parentOpen || !authed);
6316
6322
  const authStateCookieValue = js_cookie.default.get("authState") ?? "pending";
6317
6323
  const [authState, setAuthState] = (0, react.useState)(ignoreCookie ? "pending" : authStateCookieValue);
@@ -6394,7 +6400,7 @@ function AuthModal({ handleParentClose, parentOpen = false, ignoreCookie = false
6394
6400
  },
6395
6401
  onClick: async () => {
6396
6402
  setAuthState("authenticating");
6397
- const { connection_url } = await require_user.connectToCloud();
6403
+ const { connection_url } = await require_version.connectToCloud(apiClient);
6398
6404
  window.open(connection_url, "_blank");
6399
6405
  },
6400
6406
  children: [
@@ -7080,6 +7086,7 @@ function AddToCheckButton({ runId, viewOptions }) {
7080
7086
  const { error, run } = useRun(runId);
7081
7087
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
7082
7088
  const [, setLocation] = require_state.useAppLocation();
7089
+ const { apiClient } = require_state.useApiConfig();
7083
7090
  const checkId = run?.check_id;
7084
7091
  const handleGoToCheck = (0, react.useCallback)(() => {
7085
7092
  if (!checkId) return;
@@ -7087,14 +7094,15 @@ function AddToCheckButton({ runId, viewOptions }) {
7087
7094
  }, [checkId, setLocation]);
7088
7095
  const handleAddToChecklist = (0, react.useCallback)(async () => {
7089
7096
  if (!runId) return;
7090
- const check = await require_state.createCheckByRun(runId, viewOptions);
7097
+ const check = await require_state.createCheckByRun(runId, viewOptions, apiClient);
7091
7098
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
7092
7099
  setLocation(`/checks/?id=${check.check_id}`);
7093
7100
  }, [
7094
7101
  runId,
7095
7102
  setLocation,
7096
7103
  queryClient,
7097
- viewOptions
7104
+ viewOptions,
7105
+ apiClient
7098
7106
  ]);
7099
7107
  if (featureToggles.disableUpdateChecklist) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {});
7100
7108
  if (run?.check_id) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
@@ -7252,15 +7260,16 @@ function SandboxView({ isOpen, onClose, current }) {
7252
7260
  const { showRunId, clearRunResult } = require_state.useRecceActionContext();
7253
7261
  const { primaryKeys, setPrimaryKeys } = require_RecceCheckContext.useRecceQueryContext();
7254
7262
  const { data: flags, isLoading } = require_state.useRecceServerFlag();
7263
+ const { apiClient } = require_state.useApiConfig();
7255
7264
  const queryFn = async () => {
7256
7265
  const sqlTemplate = modifiedCode;
7257
7266
  const { run_id } = await require_state.submitQueryDiff({
7258
7267
  current_model: current?.name ?? "",
7259
7268
  primary_keys: primaryKeys,
7260
7269
  sql_template: sqlTemplate
7261
- }, { nowait: true });
7270
+ }, { nowait: true }, apiClient);
7262
7271
  showRunId(run_id);
7263
- return await require_state.waitRun(run_id);
7272
+ return await require_state.waitRun(run_id, void 0, apiClient);
7264
7273
  };
7265
7274
  const { mutate: runQuery, isPending } = (0, _tanstack_react_query.useMutation)({
7266
7275
  mutationFn: queryFn,
@@ -7286,7 +7295,7 @@ function SandboxView({ isOpen, onClose, current }) {
7286
7295
  }
7287
7296
  });
7288
7297
  const { feedbackToast, closeToast } = useFeedbackCollectionToast({
7289
- feedbackId: require_user.localStorageKeys.previewChangeFeedbackID,
7298
+ feedbackId: require_version.localStorageKeys.previewChangeFeedbackID,
7290
7299
  description: "Enjoy preview change?",
7291
7300
  onFeedbackSubmit: (feedback) => {
7292
7301
  switch (feedback) {
@@ -7315,7 +7324,7 @@ function SandboxView({ isOpen, onClose, current }) {
7315
7324
  externalLinkText: "Give us feedback"
7316
7325
  });
7317
7326
  const { guideToast: prepareEnvToast, closeGuideToast } = useGuideToast({
7318
- guideId: require_user.localStorageKeys.prepareEnvGuideID,
7327
+ guideId: require_version.localStorageKeys.prepareEnvGuideID,
7319
7328
  description: "Want to compare data changes with production data?",
7320
7329
  externalLink: "https://docs.datarecce.io/get-started/#prepare-dbt-artifacts",
7321
7330
  externalLinkText: "Learn how.",
@@ -7738,12 +7747,17 @@ function ExploreChangeMenuButton({ node, baseColumns, currentColumns, disableRea
7738
7747
  const { envInfo, isActionAvailable } = require_state.useLineageGraphContext();
7739
7748
  const { featureToggles } = require_state.useRecceInstanceContext();
7740
7749
  const { primaryKey } = require_state.useModelColumns_default(node.data.name);
7750
+ const { apiClient } = require_state.useApiConfig();
7741
7751
  const metadataOnly = featureToggles.mode === "metadata only";
7742
7752
  const isAddedOrRemoved = node.data.changeStatus === "added" || node.data.changeStatus === "removed";
7743
7753
  const addSchemaCheck = (0, react.useCallback)(async () => {
7744
7754
  const nodeId = node.id;
7745
- setLocation(`/checks/?id=${(await require_user.createSchemaDiffCheck({ node_id: nodeId })).check_id}`);
7746
- }, [node, setLocation]);
7755
+ setLocation(`/checks/?id=${(await require_version.createSchemaDiffCheck({ node_id: nodeId }, apiClient)).check_id}`);
7756
+ }, [
7757
+ node,
7758
+ setLocation,
7759
+ apiClient
7760
+ ]);
7747
7761
  const formattedColumns = formatSelectColumns(baseColumns, currentColumns);
7748
7762
  let query = `select * from {{ ref("${node.data.name}") }}`;
7749
7763
  if (formattedColumns.length) query = `select \n ${formattedColumns.join("\n ")}\nfrom {{ ref("${node.data.name}") }}`;
@@ -8210,6 +8224,7 @@ const initValue = {
8210
8224
  actions: {}
8211
8225
  };
8212
8226
  const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onActionCompleted }) => {
8227
+ const { apiClient } = require_state.useApiConfig();
8213
8228
  const actionState = (0, react.useRef)({ ...initValue }).current;
8214
8229
  const { showRunId } = require_state.useRecceActionContext();
8215
8230
  const submitRunForNodes = async (type, skip, getParams) => {
@@ -8239,12 +8254,12 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
8239
8254
  }
8240
8255
  const params = getParams(candidates);
8241
8256
  try {
8242
- const { run_id } = await require_state.submitRun(type, params, { nowait: true });
8257
+ const { run_id } = await require_state.submitRun(type, params, { nowait: true }, apiClient);
8243
8258
  showRunId(run_id);
8244
8259
  actionState.currentRun = { run_id };
8245
8260
  actionState.total = 1;
8246
8261
  for (;;) {
8247
- const run = await require_state.waitRun(run_id, 2);
8262
+ const run = await require_state.waitRun(run_id, 2, apiClient);
8248
8263
  actionState.currentRun = run;
8249
8264
  const status = run.error ? "failure" : run.result ? "success" : "running";
8250
8265
  for (const node of candidates) {
@@ -8293,7 +8308,7 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
8293
8308
  };
8294
8309
  onActionNodeUpdated(node);
8295
8310
  } else try {
8296
- const { run_id } = await require_state.submitRun(type, params, { nowait: true });
8311
+ const { run_id } = await require_state.submitRun(type, params, { nowait: true }, apiClient);
8297
8312
  actionState.currentRun = { run_id };
8298
8313
  actions[node.id] = {
8299
8314
  mode,
@@ -8301,7 +8316,7 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
8301
8316
  };
8302
8317
  onActionNodeUpdated(node);
8303
8318
  for (;;) {
8304
- const run = await require_state.waitRun(run_id, 2);
8319
+ const run = await require_state.waitRun(run_id, 2, apiClient);
8305
8320
  actionState.currentRun = run;
8306
8321
  const status = run.error ? "failure" : run.result ? "success" : "running";
8307
8322
  actions[node.id] = {
@@ -8387,17 +8402,17 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
8387
8402
  });
8388
8403
  };
8389
8404
  const addLineageDiffCheck = async () => {
8390
- return await require_state.createLineageDiffCheck({ node_ids: nodes.map((node) => node.id) });
8405
+ return await require_state.createLineageDiffCheck({ node_ids: nodes.map((node) => node.id) }, apiClient);
8391
8406
  };
8392
8407
  const addSchemaDiffCheck = async () => {
8393
8408
  let check;
8394
- if (nodes.length === 1) check = await require_user.createSchemaDiffCheck({ node_id: nodes[0].id });
8395
- else check = await require_user.createSchemaDiffCheck({ node_id: nodes.map((node) => node.id) });
8409
+ if (nodes.length === 1) check = await require_version.createSchemaDiffCheck({ node_id: nodes[0].id }, apiClient);
8410
+ else check = await require_version.createSchemaDiffCheck({ node_id: nodes.map((node) => node.id) }, apiClient);
8396
8411
  return check;
8397
8412
  };
8398
8413
  const cancel = async () => {
8399
8414
  actionState.status = "canceling";
8400
- if (actionState.currentRun?.run_id) await require_state.cancelRun(actionState.currentRun.run_id);
8415
+ if (actionState.currentRun?.run_id) await require_state.cancelRun(actionState.currentRun.run_id, apiClient);
8401
8416
  };
8402
8417
  const reset = () => {
8403
8418
  Object.assign(actionState, initValue);
@@ -8460,10 +8475,11 @@ const useNavToCheck = () => {
8460
8475
  };
8461
8476
  function PrivateLineageView({ interactive = false, ...props }, ref) {
8462
8477
  const { isDark } = useThemeColors();
8478
+ const { apiClient } = require_state.useApiConfig();
8463
8479
  const reactFlow = (0, _xyflow_react.useReactFlow)();
8464
8480
  const refResize = (0, react.useRef)(null);
8465
8481
  const { successToast, failToast } = require_state.useClipBoardToast();
8466
- const { copyToClipboard, ImageDownloadModal, ref: refReactFlow } = useCopyToClipboard({
8482
+ const { copyToClipboard, ImageDownloadModal, ref: refReactFlow } = useCopyToClipboard$1({
8467
8483
  renderLibrary: "html-to-image",
8468
8484
  imageType: "png",
8469
8485
  shadowEffect: true,
@@ -8507,7 +8523,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
8507
8523
  }, []);
8508
8524
  const cllHistory = (0, react.useRef)([]).current;
8509
8525
  const [cll, setCll] = (0, react.useState)(void 0);
8510
- const actionGetCll = (0, _tanstack_react_query.useMutation)({ mutationFn: require_state.getCll });
8526
+ const actionGetCll = (0, _tanstack_react_query.useMutation)({ mutationFn: (input) => require_state.getCll(input, apiClient) });
8511
8527
  const [nodeColumnSetMap, setNodeColumSetMap] = (0, react.useState)({});
8512
8528
  const findNodeByName = (0, react.useCallback)((name) => {
8513
8529
  return nodes.filter(require_state.isLineageGraphNode).find((n) => n.data.name === name);
@@ -8605,20 +8621,20 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
8605
8621
  ...props.viewOptions
8606
8622
  };
8607
8623
  try {
8608
- filteredNodeIds$1 = (await require_user.select({
8624
+ filteredNodeIds$1 = (await require_version.select({
8609
8625
  select: newViewOptions.select,
8610
8626
  exclude: newViewOptions.exclude,
8611
8627
  packages: newViewOptions.packages,
8612
8628
  view_mode: newViewOptions.view_mode
8613
- })).nodes;
8629
+ }, apiClient)).nodes;
8614
8630
  } catch (_$1) {
8615
8631
  newViewOptions.view_mode = "all";
8616
- filteredNodeIds$1 = (await require_user.select({
8632
+ filteredNodeIds$1 = (await require_version.select({
8617
8633
  select: newViewOptions.select,
8618
8634
  exclude: newViewOptions.exclude,
8619
8635
  packages: newViewOptions.packages,
8620
8636
  view_mode: newViewOptions.view_mode
8621
- })).nodes;
8637
+ }, apiClient)).nodes;
8622
8638
  }
8623
8639
  setViewOptions(newViewOptions);
8624
8640
  }
@@ -8734,12 +8750,12 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
8734
8750
  if (!lineageGraph) return;
8735
8751
  if (viewOptions.select !== newViewOptions.select || viewOptions.exclude !== newViewOptions.exclude || viewOptions.packages !== newViewOptions.packages || viewOptions.view_mode !== newViewOptions.view_mode) {
8736
8752
  try {
8737
- const result = await require_user.select({
8753
+ const result = await require_version.select({
8738
8754
  select: newViewOptions.select,
8739
8755
  exclude: newViewOptions.exclude,
8740
8756
  packages: newViewOptions.packages,
8741
8757
  view_mode: newViewOptions.view_mode
8742
- });
8758
+ }, apiClient);
8743
8759
  newViewOptions = {
8744
8760
  ...newViewOptions,
8745
8761
  column_level_lineage: void 0
@@ -9021,7 +9037,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
9021
9037
  selected: "multi"
9022
9038
  });
9023
9039
  } else if (!focusedNode) {
9024
- check = await require_state.createLineageDiffCheck(viewOptions);
9040
+ check = await require_state.createLineageDiffCheck(viewOptions, apiClient);
9025
9041
  require_state.trackMultiNodesAction({
9026
9042
  type: "lineage_diff",
9027
9043
  selected: "none"
@@ -9041,18 +9057,18 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
9041
9057
  });
9042
9058
  }
9043
9059
  } else if (focusedNode) {
9044
- check = await require_user.createSchemaDiffCheck({ node_id: focusedNode.id });
9060
+ check = await require_version.createSchemaDiffCheck({ node_id: focusedNode.id }, apiClient);
9045
9061
  require_state.trackMultiNodesAction({
9046
9062
  type: "schema_diff",
9047
9063
  selected: "single"
9048
9064
  });
9049
9065
  } else {
9050
- check = await require_user.createSchemaDiffCheck({
9066
+ check = await require_version.createSchemaDiffCheck({
9051
9067
  select: viewOptions.select,
9052
9068
  exclude: viewOptions.exclude,
9053
9069
  packages: viewOptions.packages,
9054
9070
  view_mode: viewOptions.view_mode
9055
- });
9071
+ }, apiClient);
9056
9072
  require_state.trackMultiNodesAction({
9057
9073
  type: "schema_diff",
9058
9074
  selected: "none"
@@ -9388,6 +9404,7 @@ const QueryPage = () => {
9388
9404
  if (envInfo?.adapterType === "sqlmesh" && _sqlQuery === require_RecceCheckContext.defaultSqlQuery) sqlQuery = `select * from db.mymodel`;
9389
9405
  if (featureToggles.mode === "read only") sqlQuery = `--- Would like to do query here? Book a demo with us at ${require_urls.RECCE_SUPPORT_CALENDAR_URL}\n${sqlQuery}`;
9390
9406
  const { showRunId } = require_state.useRecceActionContext();
9407
+ const { apiClient } = require_state.useApiConfig();
9391
9408
  const queryFn = async (type) => {
9392
9409
  function queryFactory(type$1) {
9393
9410
  switch (type$1) {
@@ -9405,9 +9422,9 @@ const QueryPage = () => {
9405
9422
  params.primary_keys = primaryKeys;
9406
9423
  if (isCustomQueries) params.base_sql_template = baseSqlQuery;
9407
9424
  }
9408
- const { run_id } = await runFn(params, options);
9425
+ const { run_id } = await runFn(params, options, apiClient);
9409
9426
  showRunId(run_id);
9410
- return await require_state.waitRun(run_id);
9427
+ return await require_state.waitRun(run_id, void 0, apiClient);
9411
9428
  };
9412
9429
  const { mutate: runQuery, isPending } = (0, _tanstack_react_query.useMutation)({ mutationFn: queryFn });
9413
9430
  const currentSchema = (0, react.useMemo)(() => {
@@ -9562,9 +9579,10 @@ const ChecklistItem = ({ check, selected, onSelect, onMarkAsApproved }) => {
9562
9579
  const isDark = (0, _mui_material_styles.useTheme)().palette.mode === "dark";
9563
9580
  const { featureToggles } = require_state.useRecceInstanceContext();
9564
9581
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
9582
+ const { apiClient } = require_state.useApiConfig();
9565
9583
  const checkId = check.check_id;
9566
9584
  const { mutate } = (0, _tanstack_react_query.useMutation)({
9567
- mutationFn: (check$1) => require_state.updateCheck(checkId, check$1),
9585
+ mutationFn: (check$1) => require_state.updateCheck(checkId, check$1, apiClient),
9568
9586
  onSuccess: async () => {
9569
9587
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
9570
9588
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
@@ -9636,8 +9654,9 @@ const CheckList = ({ checks, selectedItem, onCheckSelected, onChecksReordered })
9636
9654
  const [open, setOpen] = (0, react.useState)(false);
9637
9655
  const [pendingApprovalCheckId, setPendingApprovalCheckId] = (0, react.useState)(null);
9638
9656
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
9657
+ const { apiClient } = require_state.useApiConfig();
9639
9658
  const { mutate: markCheckedByID } = (0, _tanstack_react_query.useMutation)({
9640
- mutationFn: (checkId) => require_state.updateCheck(checkId, { is_checked: true }),
9659
+ mutationFn: (checkId) => require_state.updateCheck(checkId, { is_checked: true }, apiClient),
9641
9660
  onSuccess: async (_$1, checkId) => {
9642
9661
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
9643
9662
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
@@ -9794,20 +9813,22 @@ const CheckList = ({ checks, selectedItem, onCheckSelected, onChecksReordered })
9794
9813
  * List all events for a check in chronological order.
9795
9814
  *
9796
9815
  * @param checkId - The check ID
9816
+ * @param client - Optional axios instance for API configuration
9797
9817
  * @returns Promise resolving to array of CheckEvent objects
9798
9818
  */
9799
- async function listCheckEvents(checkId) {
9800
- return (await require_state.axiosClient.get(`/api/checks/${checkId}/events`)).data;
9819
+ async function listCheckEvents(checkId, client = require_state.axiosClient) {
9820
+ return (await client.get(`/api/checks/${checkId}/events`)).data;
9801
9821
  }
9802
9822
  /**
9803
9823
  * Create a new comment on a check.
9804
9824
  *
9805
9825
  * @param checkId - The check ID
9806
9826
  * @param content - The comment content (plain text for now, markdown later)
9827
+ * @param client - Optional axios instance for API configuration
9807
9828
  * @returns Promise resolving to the created CheckEvent
9808
9829
  */
9809
- async function createComment(checkId, content) {
9810
- return (await require_state.axiosClient.post(`/api/checks/${checkId}/events`, { content })).data;
9830
+ async function createComment(checkId, content, client = require_state.axiosClient) {
9831
+ return (await client.post(`/api/checks/${checkId}/events`, { content })).data;
9811
9832
  }
9812
9833
  /**
9813
9834
  * Update an existing comment.
@@ -9816,10 +9837,11 @@ async function createComment(checkId, content) {
9816
9837
  * @param checkId - The check ID
9817
9838
  * @param eventId - The event ID of the comment to update
9818
9839
  * @param content - The new comment content
9840
+ * @param client - Optional axios instance for API configuration
9819
9841
  * @returns Promise resolving to the updated CheckEvent
9820
9842
  */
9821
- async function updateComment(checkId, eventId, content) {
9822
- return (await require_state.axiosClient.patch(`/api/checks/${checkId}/events/${eventId}`, { content })).data;
9843
+ async function updateComment(checkId, eventId, content, client = require_state.axiosClient) {
9844
+ return (await client.patch(`/api/checks/${checkId}/events/${eventId}`, { content })).data;
9823
9845
  }
9824
9846
  /**
9825
9847
  * Delete a comment (soft delete).
@@ -9827,10 +9849,11 @@ async function updateComment(checkId, eventId, content) {
9827
9849
  *
9828
9850
  * @param checkId - The check ID
9829
9851
  * @param eventId - The event ID of the comment to delete
9852
+ * @param client - Optional axios instance for API configuration
9830
9853
  * @returns Promise resolving when deletion is complete
9831
9854
  */
9832
- async function deleteComment(checkId, eventId) {
9833
- await require_state.axiosClient.delete(`/api/checks/${checkId}/events/${eventId}`);
9855
+ async function deleteComment(checkId, eventId, client = require_state.axiosClient) {
9856
+ await client.delete(`/api/checks/${checkId}/events/${eventId}`);
9834
9857
  }
9835
9858
  /**
9836
9859
  * Get the appropriate icon name for an event type.
@@ -9860,27 +9883,28 @@ const POLLING_INTERVAL = 1e4;
9860
9883
  function useCheckEvents(checkId, options = {}) {
9861
9884
  const { enabled = true } = options;
9862
9885
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
9886
+ const { apiClient } = require_state.useApiConfig();
9863
9887
  const { data: events, isLoading, error, refetch } = (0, _tanstack_react_query.useQuery)({
9864
9888
  queryKey: require_state.cacheKeys.checkEvents(checkId),
9865
- queryFn: () => listCheckEvents(checkId),
9889
+ queryFn: () => listCheckEvents(checkId, apiClient),
9866
9890
  enabled,
9867
9891
  refetchInterval: POLLING_INTERVAL,
9868
9892
  refetchIntervalInBackground: false
9869
9893
  });
9870
9894
  const createCommentMutation = (0, _tanstack_react_query.useMutation)({
9871
- mutationFn: (content) => createComment(checkId, content),
9895
+ mutationFn: (content) => createComment(checkId, content, apiClient),
9872
9896
  onSuccess: async () => {
9873
9897
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checkEvents(checkId) });
9874
9898
  }
9875
9899
  });
9876
9900
  const updateCommentMutation = (0, _tanstack_react_query.useMutation)({
9877
- mutationFn: ({ eventId, content }) => updateComment(checkId, eventId, content),
9901
+ mutationFn: ({ eventId, content }) => updateComment(checkId, eventId, content, apiClient),
9878
9902
  onSuccess: async () => {
9879
9903
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checkEvents(checkId) });
9880
9904
  }
9881
9905
  });
9882
9906
  const deleteCommentMutation = (0, _tanstack_react_query.useMutation)({
9883
- mutationFn: (eventId) => deleteComment(checkId, eventId),
9907
+ mutationFn: (eventId) => deleteComment(checkId, eventId, apiClient),
9884
9908
  onSuccess: async () => {
9885
9909
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checkEvents(checkId) });
9886
9910
  }
@@ -10391,7 +10415,7 @@ function UserAvatar({ event }) {
10391
10415
  const userId = actor.user_id?.toString();
10392
10416
  const { data: avatarUrl } = (0, _tanstack_react_query.useQuery)({
10393
10417
  queryKey: ["github-avatar", userId],
10394
- queryFn: () => userId ? require_user.fetchGitHubAvatar(userId) : Promise.resolve(null),
10418
+ queryFn: () => userId ? require_version.fetchGitHubAvatar(userId) : Promise.resolve(null),
10395
10419
  enabled: !!userId,
10396
10420
  retry: false,
10397
10421
  staleTime: 300 * 1e3
@@ -10737,10 +10761,11 @@ function TimelineEvent({ event, currentUserId, onEdit, onDelete }) {
10737
10761
  */
10738
10762
  function CheckTimeline({ checkId }) {
10739
10763
  const isDark = (0, _mui_material_styles.useTheme)().palette.mode === "dark";
10764
+ const { apiClient } = require_state.useApiConfig();
10740
10765
  const { events, isLoading, error, createComment: createComment$1, isCreatingComment, updateComment: updateComment$1, deleteComment: deleteComment$1 } = useCheckEvents(checkId);
10741
10766
  const { data: currentUser } = (0, _tanstack_react_query.useQuery)({
10742
10767
  queryKey: require_state.cacheKeys.user(),
10743
- queryFn: require_user.fetchUser,
10768
+ queryFn: () => require_version.fetchUser(apiClient),
10744
10769
  retry: false
10745
10770
  });
10746
10771
  const handleCreateComment = (content) => {
@@ -11125,16 +11150,17 @@ const NodelistItem = ({ node, selected, onSelect, schemaChanged, isDark }) => {
11125
11150
  };
11126
11151
  function PrivateSchemaDiffView({ check }, ref) {
11127
11152
  const isDark = (0, _mui_material_styles.useTheme)().palette.mode === "dark";
11153
+ const { apiClient } = require_state.useApiConfig();
11128
11154
  const { lineageGraph } = require_state.useLineageGraphContext();
11129
11155
  const params = check.params;
11130
11156
  const { isLoading, error, data } = (0, _tanstack_react_query.useQuery)({
11131
11157
  queryKey: [...require_state.cacheKeys.check(check.check_id), "select"],
11132
- queryFn: async () => require_user.select({
11158
+ queryFn: async () => require_version.select({
11133
11159
  select: params.select,
11134
11160
  exclude: params.exclude,
11135
11161
  packages: params.packages,
11136
11162
  view_mode: params.view_mode
11137
- }),
11163
+ }, apiClient),
11138
11164
  refetchOnMount: true,
11139
11165
  enabled: !params.node_id
11140
11166
  });
@@ -11246,6 +11272,7 @@ const SchemaDiffView = (0, react.forwardRef)(PrivateSchemaDiffView);
11246
11272
  function CheckDetail({ checkId, refreshCheckList }) {
11247
11273
  const theme = (0, _mui_material_styles.useTheme)();
11248
11274
  const isDark = theme.palette.mode === "dark";
11275
+ const { apiClient } = require_state.useApiConfig();
11249
11276
  const { featureToggles, sessionId } = require_state.useRecceInstanceContext();
11250
11277
  const { setLatestSelectedCheckId } = require_RecceCheckContext.useRecceCheckContext();
11251
11278
  const { cloudMode } = require_state.useLineageGraphContext();
@@ -11261,7 +11288,7 @@ function CheckDetail({ checkId, refreshCheckList }) {
11261
11288
  const menuOpen = Boolean(menuAnchorEl);
11262
11289
  const { isLoading, error, data: check } = (0, _tanstack_react_query.useQuery)({
11263
11290
  queryKey: require_state.cacheKeys.check(checkId),
11264
- queryFn: async () => require_state.getCheck(checkId),
11291
+ queryFn: async () => require_state.getCheck(checkId, apiClient),
11265
11292
  refetchOnMount: true
11266
11293
  });
11267
11294
  const trackedRunId = submittedRunId ?? check?.last_run?.run_id;
@@ -11273,14 +11300,14 @@ function CheckDetail({ checkId, refreshCheckList }) {
11273
11300
  const isPresetCheck = check?.is_preset ?? false;
11274
11301
  const lineageViewRef = (0, react.useRef)(null);
11275
11302
  const { mutate } = (0, _tanstack_react_query.useMutation)({
11276
- mutationFn: (check$1) => require_state.updateCheck(checkId, check$1),
11303
+ mutationFn: (check$1) => require_state.updateCheck(checkId, check$1, apiClient),
11277
11304
  onSuccess: async () => {
11278
11305
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
11279
11306
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
11280
11307
  }
11281
11308
  });
11282
11309
  const { mutate: handleDelete } = (0, _tanstack_react_query.useMutation)({
11283
- mutationFn: () => require_state.deleteCheck(checkId),
11310
+ mutationFn: () => require_state.deleteCheck(checkId, apiClient),
11284
11311
  onSuccess: async () => {
11285
11312
  setLatestSelectedCheckId("");
11286
11313
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
@@ -11290,7 +11317,7 @@ function CheckDetail({ checkId, refreshCheckList }) {
11290
11317
  const { mutate: handleMarkAsPresetCheck, isPending: isMarkingAsPreset } = (0, _tanstack_react_query.useMutation)({
11291
11318
  mutationFn: async () => {
11292
11319
  if (!check) throw new Error("Check not found");
11293
- return await require_state.markAsPresetCheck(checkId);
11320
+ return await require_state.markAsPresetCheck(checkId, apiClient);
11294
11321
  },
11295
11322
  onSuccess: async () => {
11296
11323
  successToast("Check marked as preset successfully");
@@ -11302,20 +11329,21 @@ function CheckDetail({ checkId, refreshCheckList }) {
11302
11329
  });
11303
11330
  const handleRerun = (0, react.useCallback)(async () => {
11304
11331
  if (!check?.type) return;
11305
- setSubmittedRunId((await require_state.submitRunFromCheck(checkId, { nowait: true })).run_id);
11332
+ setSubmittedRunId((await require_state.submitRunFromCheck(checkId, { nowait: true }, apiClient)).run_id);
11306
11333
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
11307
11334
  if (refreshCheckList) refreshCheckList();
11308
11335
  }, [
11309
11336
  check,
11310
11337
  checkId,
11311
11338
  queryClient,
11312
- refreshCheckList
11339
+ refreshCheckList,
11340
+ apiClient
11313
11341
  ]);
11314
11342
  const handleCancel = (0, react.useCallback)(async () => {
11315
11343
  setAborting(true);
11316
11344
  if (!trackedRunId) return;
11317
- return await require_state.cancelRun(trackedRunId);
11318
- }, [trackedRunId]);
11345
+ return await require_state.cancelRun(trackedRunId, apiClient);
11346
+ }, [trackedRunId, apiClient]);
11319
11347
  const handleCopy = async () => {
11320
11348
  if (!check) return;
11321
11349
  const markdown = buildMarkdown(check);
@@ -11820,8 +11848,9 @@ function buildBody(check) {
11820
11848
  const CheckEmptyState = () => {
11821
11849
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
11822
11850
  const [, setLocation] = require_state.useAppLocation();
11851
+ const { apiClient } = require_state.useApiConfig();
11823
11852
  const { mutate: createSchemaCheck, isPending } = (0, _tanstack_react_query.useMutation)({
11824
- mutationFn: () => require_user.createSchemaDiffCheck({ select: "state:modified" }),
11853
+ mutationFn: () => require_version.createSchemaDiffCheck({ select: "state:modified" }, apiClient),
11825
11854
  onSuccess: async (check) => {
11826
11855
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
11827
11856
  setLocation(`/checks/?id=${check.check_id}`);
@@ -11904,9 +11933,10 @@ const CheckEmptyState = () => {
11904
11933
  //#endregion
11905
11934
  //#region recce-source/js/src/components/run/RunPage.tsx
11906
11935
  const RunPage = ({ runId }) => {
11936
+ const { apiClient } = require_state.useApiConfig();
11907
11937
  const { error, data: run } = (0, _tanstack_react_query.useQuery)({
11908
11938
  queryKey: require_state.cacheKeys.run(runId),
11909
- queryFn: async () => require_state.waitRun(runId)
11939
+ queryFn: async () => require_state.waitRun(runId, void 0, apiClient)
11910
11940
  });
11911
11941
  let RunResultView;
11912
11942
  if (run && require_state.runTypeHasRef(run.type)) RunResultView = require_state.findByRunType(run.type).RunResultView;
@@ -11921,10 +11951,11 @@ const RunPage = ({ runId }) => {
11921
11951
  //#region recce-source/js/src/components/run/RunList.tsx
11922
11952
  const RunListItem = ({ run, isSelected, onSelectRun, onAddToChecklist, onGoToCheck }) => {
11923
11953
  const { featureToggles } = require_state.useRecceInstanceContext();
11954
+ const { apiClient } = require_state.useApiConfig();
11924
11955
  const { data: fetchedRun } = (0, _tanstack_react_query.useQuery)({
11925
11956
  queryKey: require_state.cacheKeys.run(run.run_id),
11926
11957
  queryFn: async () => {
11927
- return await require_state.waitRun(run.run_id);
11958
+ return await require_state.waitRun(run.run_id, void 0, apiClient);
11928
11959
  },
11929
11960
  enabled: run.status === "running",
11930
11961
  retry: false
@@ -12028,10 +12059,11 @@ const DateSegmentItem = ({ runAt }) => {
12028
12059
  };
12029
12060
  const RunList = () => {
12030
12061
  const { closeHistory } = require_state.useRecceActionContext();
12062
+ const { apiClient } = require_state.useApiConfig();
12031
12063
  const { data: runs, isLoading } = (0, _tanstack_react_query.useQuery)({
12032
12064
  queryKey: require_state.cacheKeys.runs(),
12033
12065
  queryFn: async () => {
12034
- return await require_state.listRuns();
12066
+ return await require_state.listRuns(apiClient);
12035
12067
  },
12036
12068
  retry: false
12037
12069
  });
@@ -12095,6 +12127,7 @@ const RunList = () => {
12095
12127
  function DateDividedRunHistoryItem({ run, previousDate }) {
12096
12128
  const [, setLocation] = require_state.useAppLocation();
12097
12129
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
12130
+ const { apiClient } = require_state.useApiConfig();
12098
12131
  const { showRunId, runId } = require_state.useRecceActionContext();
12099
12132
  const currentDate = new Date(run.run_at).toDateString();
12100
12133
  const shouldRenderDateSegment = previousDate != null && previousDate !== currentDate;
@@ -12103,10 +12136,14 @@ function DateDividedRunHistoryItem({ run, previousDate }) {
12103
12136
  showRunId(runId$1, false);
12104
12137
  };
12105
12138
  const handleAddToChecklist = (0, react.useCallback)(async (clickedRunId) => {
12106
- const check = await require_state.createCheckByRun(clickedRunId);
12139
+ const check = await require_state.createCheckByRun(clickedRunId, void 0, apiClient);
12107
12140
  await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
12108
12141
  setLocation(`/checks/?id=${check.check_id}`);
12109
- }, [setLocation, queryClient]);
12142
+ }, [
12143
+ setLocation,
12144
+ queryClient,
12145
+ apiClient
12146
+ ]);
12110
12147
  const handleGoToCheck = (0, react.useCallback)((checkId) => {
12111
12148
  require_state.trackHistoryAction({ name: "go_to_check" });
12112
12149
  setLocation(`/checks/?id=${checkId}`);
@@ -12471,6 +12508,125 @@ function SummaryView() {
12471
12508
  }) });
12472
12509
  }
12473
12510
 
12511
+ //#endregion
12512
+ //#region recce-source/js/src/components/app/AvatarDropdown.tsx
12513
+ function AvatarDropdown() {
12514
+ const { apiClient } = require_state.useApiConfig();
12515
+ const { data: user, isLoading, error } = (0, _tanstack_react_query.useQuery)({
12516
+ queryKey: require_state.cacheKeys.user(),
12517
+ queryFn: () => require_version.fetchUser(apiClient),
12518
+ retry: false
12519
+ });
12520
+ const { data: avatarUrl } = (0, _tanstack_react_query.useQuery)({
12521
+ queryKey: ["github-avatar", user?.id],
12522
+ queryFn: () => user ? require_version.fetchGitHubAvatar(user.id) : Promise.resolve(null),
12523
+ enabled: !!user?.id && user.login_type === "github",
12524
+ retry: false,
12525
+ staleTime: 300 * 1e3
12526
+ });
12527
+ const [anchorEl, setAnchorEl] = (0, react.useState)(null);
12528
+ const open = Boolean(anchorEl);
12529
+ const handleClick = (event) => {
12530
+ setAnchorEl(event.currentTarget);
12531
+ };
12532
+ const handleClose = () => {
12533
+ setAnchorEl(null);
12534
+ };
12535
+ const showUserInfo = !isLoading && !error && user;
12536
+ const getInitials = (name) => {
12537
+ if (!name) return "U";
12538
+ return name.charAt(0).toUpperCase();
12539
+ };
12540
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12541
+ onClick: handleClick,
12542
+ sx: {
12543
+ width: 32,
12544
+ height: 32,
12545
+ borderRadius: "50%",
12546
+ bgcolor: "background.paper",
12547
+ color: "primary.main",
12548
+ display: "flex",
12549
+ alignItems: "center",
12550
+ justifyContent: "center",
12551
+ cursor: "pointer"
12552
+ },
12553
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, { size: 16 })
12554
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Avatar.default, {
12555
+ onClick: handleClick,
12556
+ src: avatarUrl || void 0,
12557
+ sx: {
12558
+ width: 28,
12559
+ height: 28,
12560
+ cursor: "pointer",
12561
+ outline: "1px solid white",
12562
+ fontSize: "0.875rem"
12563
+ },
12564
+ children: getInitials(user?.login)
12565
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Menu.default, {
12566
+ anchorEl,
12567
+ open,
12568
+ onClose: handleClose,
12569
+ slotProps: { paper: { sx: {
12570
+ bgcolor: "background.paper",
12571
+ borderColor: "divider",
12572
+ boxShadow: 3,
12573
+ minWidth: 180
12574
+ } } },
12575
+ children: [
12576
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
12577
+ sx: {
12578
+ px: 2,
12579
+ py: 1.5
12580
+ },
12581
+ children: [
12582
+ isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
12583
+ sx: {
12584
+ display: "flex",
12585
+ alignItems: "center",
12586
+ gap: 1
12587
+ },
12588
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12589
+ variant: "body2",
12590
+ color: "text.primary",
12591
+ children: "Loading..."
12592
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, { size: 16 })]
12593
+ }),
12594
+ error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12595
+ variant: "caption",
12596
+ color: "error",
12597
+ children: "Failed to load user information"
12598
+ }),
12599
+ showUserInfo && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12600
+ variant: "body2",
12601
+ fontWeight: "600",
12602
+ color: "text.primary",
12603
+ children: user.login
12604
+ }), user.email && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12605
+ variant: "caption",
12606
+ color: "text.secondary",
12607
+ children: user.email
12608
+ })] })
12609
+ ]
12610
+ }),
12611
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Divider.default, {}),
12612
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_MenuItem.default, {
12613
+ onClick: () => {
12614
+ window.open("https://cloud.datarecce.io/", "_blank");
12615
+ handleClose();
12616
+ },
12617
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemIcon.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_fa.FaCloud, {}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemText.default, { children: "Recce Cloud" })]
12618
+ }),
12619
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_MenuItem.default, {
12620
+ onClick: () => {
12621
+ window.open(require_urls.RECCE_SUPPORT_CALENDAR_URL, "_blank");
12622
+ handleClose();
12623
+ },
12624
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemIcon.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_fa.FaUser, {}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemText.default, { children: "Get live support" })]
12625
+ })
12626
+ ]
12627
+ })] });
12628
+ }
12629
+
12474
12630
  //#endregion
12475
12631
  //#region recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx
12476
12632
  /**
@@ -12508,178 +12664,1325 @@ function IdleTimeoutBadge() {
12508
12664
  }
12509
12665
 
12510
12666
  //#endregion
12511
- Object.defineProperty(exports, 'ChangeSummary', {
12512
- enumerable: true,
12513
- get: function () {
12514
- return ChangeSummary;
12515
- }
12516
- });
12517
- Object.defineProperty(exports, 'CheckBreadcrumb', {
12518
- enumerable: true,
12519
- get: function () {
12520
- return CheckBreadcrumb;
12521
- }
12522
- });
12523
- Object.defineProperty(exports, 'CheckDescription', {
12524
- enumerable: true,
12525
- get: function () {
12526
- return CheckDescription;
12527
- }
12528
- });
12529
- Object.defineProperty(exports, 'CheckDetail', {
12530
- enumerable: true,
12531
- get: function () {
12532
- return CheckDetail;
12533
- }
12534
- });
12535
- Object.defineProperty(exports, 'CheckEmptyState', {
12536
- enumerable: true,
12537
- get: function () {
12538
- return CheckEmptyState;
12539
- }
12540
- });
12541
- Object.defineProperty(exports, 'CheckList', {
12542
- enumerable: true,
12543
- get: function () {
12544
- return CheckList;
12545
- }
12546
- });
12547
- Object.defineProperty(exports, 'CodeEditor_default', {
12548
- enumerable: true,
12549
- get: function () {
12550
- return CodeEditor_default;
12551
- }
12552
- });
12553
- Object.defineProperty(exports, 'DiffEditor_default', {
12554
- enumerable: true,
12555
- get: function () {
12556
- return DiffEditor_default;
12557
- }
12558
- });
12559
- Object.defineProperty(exports, 'EnvInfo', {
12560
- enumerable: true,
12561
- get: function () {
12562
- return EnvInfo;
12563
- }
12564
- });
12565
- Object.defineProperty(exports, 'ErrorBoundary', {
12566
- enumerable: true,
12567
- get: function () {
12568
- return ErrorBoundary;
12569
- }
12570
- });
12571
- Object.defineProperty(exports, 'GraphColumnNode', {
12572
- enumerable: true,
12573
- get: function () {
12574
- return GraphColumnNode;
12575
- }
12576
- });
12577
- Object.defineProperty(exports, 'GraphEdge', {
12578
- enumerable: true,
12579
- get: function () {
12580
- return GraphEdge;
12581
- }
12582
- });
12583
- Object.defineProperty(exports, 'GraphNode', {
12584
- enumerable: true,
12585
- get: function () {
12586
- return GraphNode;
12587
- }
12588
- });
12589
- Object.defineProperty(exports, 'HSplit', {
12590
- enumerable: true,
12591
- get: function () {
12592
- return HSplit;
12593
- }
12594
- });
12595
- Object.defineProperty(exports, 'HistoryToggle', {
12596
- enumerable: true,
12597
- get: function () {
12598
- return HistoryToggle;
12599
- }
12600
- });
12601
- Object.defineProperty(exports, 'IdleTimeoutBadge', {
12602
- enumerable: true,
12603
- get: function () {
12604
- return IdleTimeoutBadge;
12605
- }
12606
- });
12607
- Object.defineProperty(exports, 'LineageDiffView', {
12608
- enumerable: true,
12609
- get: function () {
12610
- return LineageDiffView;
12611
- }
12612
- });
12613
- Object.defineProperty(exports, 'LineagePage', {
12614
- enumerable: true,
12615
- get: function () {
12616
- return LineagePage;
12617
- }
12618
- });
12619
- Object.defineProperty(exports, 'LineageView', {
12620
- enumerable: true,
12621
- get: function () {
12622
- return LineageView;
12623
- }
12624
- });
12625
- Object.defineProperty(exports, 'LineageViewTopBar', {
12626
- enumerable: true,
12627
- get: function () {
12628
- return LineageViewTopBar;
12629
- }
12630
- });
12631
- Object.defineProperty(exports, 'ModelRowCount', {
12632
- enumerable: true,
12633
- get: function () {
12634
- return ModelRowCount;
12635
- }
12636
- });
12637
- Object.defineProperty(exports, 'MuiProvider', {
12638
- enumerable: true,
12639
- get: function () {
12640
- return MuiProvider;
12641
- }
12642
- });
12643
- Object.defineProperty(exports, 'NodeSqlView', {
12644
- enumerable: true,
12645
- get: function () {
12646
- return NodeSqlView;
12647
- }
12648
- });
12649
- Object.defineProperty(exports, 'NodeView', {
12650
- enumerable: true,
12651
- get: function () {
12652
- return NodeView;
12653
- }
12654
- });
12655
- Object.defineProperty(exports, 'QueryForm', {
12656
- enumerable: true,
12657
- get: function () {
12658
- return QueryForm;
12659
- }
12660
- });
12661
- Object.defineProperty(exports, 'QueryPage', {
12662
- enumerable: true,
12663
- get: function () {
12664
- return QueryPage;
12665
- }
12666
- });
12667
- Object.defineProperty(exports, 'ResourceTypeTag', {
12668
- enumerable: true,
12669
- get: function () {
12670
- return ResourceTypeTag;
12671
- }
12672
- });
12673
- Object.defineProperty(exports, 'RowCountDiffTag', {
12674
- enumerable: true,
12675
- get: function () {
12676
- return RowCountDiffTag;
12677
- }
12678
- });
12679
- Object.defineProperty(exports, 'RunList', {
12680
- enumerable: true,
12681
- get: function () {
12682
- return RunList;
12667
+ //#region recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx
12668
+ /**
12669
+ * Display Mode Toggle - switches between light and dark themes
12670
+ *
12671
+ * Uses next-themes to persist the user's preference.
12672
+ * Default is light theme, with future support for system preference.
12673
+ */
12674
+ function DisplayModeToggle() {
12675
+ const { setTheme, resolvedTheme } = (0, next_themes.useTheme)();
12676
+ const [mounted, setMounted] = (0, react.useState)(false);
12677
+ (0, react.useEffect)(() => {
12678
+ setMounted(true);
12679
+ }, []);
12680
+ const toggleTheme = () => {
12681
+ setTheme(resolvedTheme === "dark" ? "light" : "dark");
12682
+ };
12683
+ if (!mounted) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
12684
+ size: "small",
12685
+ sx: {
12686
+ color: "rgba(255, 255, 255, 0.8)",
12687
+ "&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
12688
+ },
12689
+ disabled: true,
12690
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiSun, { style: {
12691
+ width: 18,
12692
+ height: 18
12693
+ } })
12694
+ });
12695
+ const isDark = resolvedTheme === "dark";
12696
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
12697
+ title: isDark ? "Switch to light mode" : "Switch to dark mode",
12698
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
12699
+ size: "small",
12700
+ onClick: toggleTheme,
12701
+ sx: {
12702
+ color: "rgba(255, 255, 255, 0.8)",
12703
+ "&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
12704
+ },
12705
+ "aria-label": isDark ? "Switch to light mode" : "Switch to dark mode",
12706
+ children: isDark ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiSun, { style: {
12707
+ width: 18,
12708
+ height: 18
12709
+ } }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiMoon, { style: {
12710
+ width: 18,
12711
+ height: 18
12712
+ } })
12713
+ })
12714
+ });
12715
+ }
12716
+
12717
+ //#endregion
12718
+ //#region recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx
12719
+ function RecceVersionBadge() {
12720
+ const { version, latestVersion } = require_version.useVersionNumber();
12721
+ const versionFormatRegex = (0, react.useMemo)(() => /* @__PURE__ */ new RegExp("^\\d+\\.\\d+\\.\\d+$"), []);
12722
+ (0, react.useEffect)(() => {
12723
+ if (versionFormatRegex.test(version) && version !== latestVersion) {
12724
+ const storageKey = "recce-update-toast-shown";
12725
+ if (sessionStorage.getItem(storageKey)) return;
12726
+ setTimeout(() => {
12727
+ require_state.toaster.create({
12728
+ id: "recce-update-available",
12729
+ title: "Update available",
12730
+ description: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
12731
+ "A new version of Recce (v",
12732
+ latestVersion,
12733
+ ") is available.",
12734
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("br", {}),
12735
+ "Please run",
12736
+ " ",
12737
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12738
+ component: "code",
12739
+ sx: {
12740
+ bgcolor: "grey.200",
12741
+ px: .5,
12742
+ py: .25,
12743
+ borderRadius: .5,
12744
+ fontFamily: "monospace",
12745
+ fontSize: "0.875em"
12746
+ },
12747
+ children: "pip install --upgrade recce"
12748
+ }),
12749
+ " ",
12750
+ "to update Recce.",
12751
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("br", {}),
12752
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
12753
+ sx: {
12754
+ color: "primary.main",
12755
+ fontWeight: "bold",
12756
+ "&:hover": { textDecoration: "underline" }
12757
+ },
12758
+ href: `https://github.com/DataRecce/recce/releases/tag/v${latestVersion}`,
12759
+ target: "_blank",
12760
+ children: "Click here to view the detail of latest release"
12761
+ })
12762
+ ] }),
12763
+ duration: 60 * 1e3,
12764
+ closable: true
12765
+ });
12766
+ sessionStorage.setItem(storageKey, "true");
12767
+ }, 0);
12768
+ }
12769
+ }, [
12770
+ version,
12771
+ latestVersion,
12772
+ versionFormatRegex
12773
+ ]);
12774
+ if (!versionFormatRegex.test(version)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12775
+ component: "span",
12776
+ sx: {
12777
+ fontSize: "sm",
12778
+ color: "rgba(255,255,255,0.8)",
12779
+ textTransform: "uppercase",
12780
+ borderWidth: 1,
12781
+ px: 1,
12782
+ borderRadius: .75
12783
+ },
12784
+ children: version
12785
+ });
12786
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
12787
+ href: `https://github.com/DataRecce/recce/releases/tag/v${version}`,
12788
+ sx: {
12789
+ "&:hover": { textDecoration: "none" },
12790
+ fontSize: "sm",
12791
+ color: "rgba(255,255,255,0.8)",
12792
+ textTransform: "uppercase",
12793
+ borderWidth: 1,
12794
+ px: 1,
12795
+ borderRadius: .75
12796
+ },
12797
+ target: "_blank",
12798
+ children: version
12799
+ });
12800
+ }
12801
+
12802
+ //#endregion
12803
+ //#region recce-source/js/app/(mainComponents)/TopBar.tsx
12804
+ function LinkIcon({ icon: IconComponent, href, sx, ...props }) {
12805
+ const theme = (0, _mui_material_styles.useTheme)();
12806
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
12807
+ sx: {
12808
+ height: "20px",
12809
+ color: "common.white",
12810
+ ...sx
12811
+ },
12812
+ href,
12813
+ target: "_blank",
12814
+ ...props,
12815
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconComponent, { style: {
12816
+ color: theme.palette.common.white,
12817
+ width: 20,
12818
+ height: 20
12819
+ } })
12820
+ });
12821
+ }
12822
+ function TopBar() {
12823
+ const { reviewMode, isDemoSite, envInfo, cloudMode } = require_state.useLineageGraphContext();
12824
+ const { featureToggles, authed } = require_state.useRecceInstanceContext();
12825
+ const { url: prURL, id: prID } = envInfo?.pullRequest ?? {};
12826
+ const demoPrId = prURL ? prURL.split("/").pop() : null;
12827
+ const brandLink = cloudMode || authed ? "https://cloud.datarecce.io/" : "https://reccehq.com/";
12828
+ const [showModal, setShowModal] = (0, react.useState)(false);
12829
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
12830
+ sx: {
12831
+ display: "flex",
12832
+ gap: "10px",
12833
+ minHeight: "40px",
12834
+ alignItems: "center",
12835
+ bgcolor: require_state.colors.brand[400]
12836
+ },
12837
+ children: [
12838
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
12839
+ href: brandLink,
12840
+ target: "_blank",
12841
+ sx: { "&:hover": { textDecoration: "none" } },
12842
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
12843
+ sx: {
12844
+ display: "flex",
12845
+ gap: "10px",
12846
+ alignItems: "center"
12847
+ },
12848
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12849
+ component: "img",
12850
+ sx: {
12851
+ width: 20,
12852
+ height: 20,
12853
+ ml: "18px"
12854
+ },
12855
+ src: "/logo/recce-logo-white.png",
12856
+ alt: "recce-logo-white"
12857
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12858
+ variant: "h4",
12859
+ sx: {
12860
+ fontFamily: "\"Montserrat\", sans-serif",
12861
+ color: "common.white",
12862
+ fontSize: "1.25rem"
12863
+ },
12864
+ children: "RECCE"
12865
+ })]
12866
+ })
12867
+ }),
12868
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisplayModeToggle, {}),
12869
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RecceVersionBadge, {}),
12870
+ (featureToggles.mode ?? reviewMode) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Badge.default, {
12871
+ sx: {
12872
+ fontSize: "0.875rem",
12873
+ color: "rgba(255,255,255,0.8)",
12874
+ textTransform: "uppercase",
12875
+ borderWidth: 1,
12876
+ px: 1,
12877
+ borderRadius: .75,
12878
+ borderColor: "rgba(255,255,255,0.8)"
12879
+ },
12880
+ children: featureToggles.mode ?? "review mode"
12881
+ }),
12882
+ cloudMode && prID && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Badge.default, {
12883
+ sx: {
12884
+ fontSize: "0.875rem",
12885
+ color: "rgba(255,255,255,0.8)",
12886
+ textTransform: "uppercase",
12887
+ borderWidth: 1,
12888
+ px: 1,
12889
+ borderRadius: .75,
12890
+ borderColor: "rgba(255,255,255,0.8)"
12891
+ },
12892
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
12893
+ direction: "row",
12894
+ spacing: 1,
12895
+ alignItems: "center",
12896
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { children: "cloud mode" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12897
+ sx: {
12898
+ borderLeft: "1px solid rgba(255,255,255,0.8)",
12899
+ pl: "8px"
12900
+ },
12901
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Link.default, {
12902
+ href: prURL,
12903
+ sx: { "&:hover": { textDecoration: "none" } },
12904
+ target: "_blank",
12905
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_vsc.VscGitPullRequest, { style: {
12906
+ color: "rgba(255,255,255,0.8)",
12907
+ width: 12,
12908
+ height: 12,
12909
+ marginRight: 2,
12910
+ display: "inline",
12911
+ verticalAlign: "middle"
12912
+ } }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12913
+ component: "span",
12914
+ sx: {
12915
+ color: "rgba(255,255,255,0.8)",
12916
+ display: "inline"
12917
+ },
12918
+ children: `#${String(prID)}`
12919
+ })]
12920
+ })
12921
+ })]
12922
+ })
12923
+ }),
12924
+ isDemoSite && prURL && demoPrId && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Badge.default, {
12925
+ sx: {
12926
+ fontSize: "0.875rem",
12927
+ color: "rgba(255,255,255,0.8)",
12928
+ textTransform: "uppercase",
12929
+ borderWidth: 1,
12930
+ px: 1,
12931
+ borderRadius: .75,
12932
+ borderColor: "rgba(255,255,255,0.8)"
12933
+ },
12934
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
12935
+ direction: "row",
12936
+ spacing: 1,
12937
+ alignItems: "center",
12938
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { children: "demo mode" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12939
+ sx: {
12940
+ borderLeft: "1px solid rgba(255,255,255,0.8)",
12941
+ pl: "8px"
12942
+ },
12943
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Link.default, {
12944
+ href: prURL,
12945
+ sx: { "&:hover": { textDecoration: "none" } },
12946
+ target: "_blank",
12947
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_vsc.VscGitPullRequest, { style: {
12948
+ color: "rgba(255,255,255,0.8)",
12949
+ width: 12,
12950
+ height: 12,
12951
+ marginRight: 2,
12952
+ display: "inline",
12953
+ verticalAlign: "middle"
12954
+ } }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
12955
+ component: "span",
12956
+ sx: {
12957
+ color: "rgba(255,255,255,0.8)",
12958
+ display: "inline"
12959
+ },
12960
+ children: `#${demoPrId}`
12961
+ })]
12962
+ })
12963
+ })]
12964
+ })
12965
+ }),
12966
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flex: 1 } }),
12967
+ (isDemoSite || featureToggles.mode === "read only") && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
12968
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LinkIcon, {
12969
+ icon: react_icons_fa.FaGithub,
12970
+ href: "https://github.com/DataRecce/recce"
12971
+ }),
12972
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LinkIcon, {
12973
+ icon: react_icons_fa.FaSlack,
12974
+ href: "https://getdbt.slack.com/archives/C05C28V7CPP"
12975
+ }),
12976
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LinkIcon, {
12977
+ sx: { mr: 2 },
12978
+ icon: react_icons_fa.FaQuestionCircle,
12979
+ href: "https://docs.datarecce.io"
12980
+ })
12981
+ ] }),
12982
+ !isDemoSite && featureToggles.mode !== "read only" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IdleTimeoutBadge, {}), authed || cloudMode ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12983
+ sx: { mr: 2 },
12984
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AvatarDropdown, {})
12985
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
12986
+ component: "button",
12987
+ sx: {
12988
+ color: "common.white",
12989
+ fontSize: "0.875rem",
12990
+ fontWeight: 600,
12991
+ bgcolor: "brand.700",
12992
+ borderRadius: 1,
12993
+ px: 3,
12994
+ py: 1,
12995
+ mr: 2,
12996
+ cursor: "pointer",
12997
+ border: "none"
12998
+ },
12999
+ onClick: () => {
13000
+ setShowModal(true);
13001
+ },
13002
+ children: "Connect to Cloud"
13003
+ }), showModal && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthModal, {
13004
+ parentOpen: showModal,
13005
+ handleParentClose: setShowModal,
13006
+ ignoreCookie: true,
13007
+ variant: "user-profile"
13008
+ })] })] })
13009
+ ]
13010
+ });
13011
+ }
13012
+
13013
+ //#endregion
13014
+ //#region recce-source/js/src/components/app/Filename.tsx
13015
+ const useRecceToast = () => {
13016
+ const toastSuccess = (message) => {
13017
+ require_state.toaster.create({
13018
+ description: message,
13019
+ type: "success",
13020
+ duration: 5e3,
13021
+ closable: true
13022
+ });
13023
+ };
13024
+ const toastError = (message, error) => {
13025
+ let errorMessage = message;
13026
+ if (error != null) if (error instanceof axios.AxiosError) errorMessage = `${message}. ${String(error.response?.data?.detail)}`;
13027
+ else errorMessage = `${message}. ${error}`;
13028
+ require_state.toaster.create({
13029
+ description: errorMessage,
13030
+ type: "error",
13031
+ duration: 5e3,
13032
+ closable: true
13033
+ });
13034
+ };
13035
+ return {
13036
+ toastSuccess,
13037
+ toastError
13038
+ };
13039
+ };
13040
+ const useClosePrompt = (prompt) => {
13041
+ (0, react.useEffect)(() => {
13042
+ const handleBeforeUnload = (e) => {
13043
+ e.preventDefault();
13044
+ };
13045
+ if (prompt) window.addEventListener("beforeunload", handleBeforeUnload);
13046
+ return () => {
13047
+ if (prompt) window.removeEventListener("beforeunload", handleBeforeUnload);
13048
+ };
13049
+ }, [prompt]);
13050
+ };
13051
+ const Filename = () => {
13052
+ const { featureToggles } = require_state.useRecceInstanceContext();
13053
+ const { fileName, cloudMode, isDemoSite, envInfo } = require_state.useLineageGraphContext();
13054
+ const { apiClient } = require_state.useApiConfig();
13055
+ const [modalOpen, setModalOpen] = (0, react.useState)(false);
13056
+ const [overwriteOpen, setOverwriteOpen] = (0, react.useState)(false);
13057
+ const isStateless = !fileName && !cloudMode && !isDemoSite;
13058
+ const { data: checks } = require_state.useChecks(isStateless);
13059
+ const hasNonPresetChecks = checks != void 0 && checks.filter((check) => !check.is_preset).length > 0;
13060
+ useClosePrompt(isStateless && hasNonPresetChecks);
13061
+ const [{ newFileName, errorMessage, modified, overwriteWithMethod, bypass }, setState] = (0, react.useState)({ newFileName: fileName ?? "recce_state.json" });
13062
+ const inputRef = (0, react.useRef)(null);
13063
+ const { toastSuccess, toastError } = useRecceToast();
13064
+ const queryClient = (0, _tanstack_react_query.useQueryClient)();
13065
+ const handleOpen = () => {
13066
+ setState({
13067
+ newFileName: fileName ?? "recce_state.json",
13068
+ modified: !fileName
13069
+ });
13070
+ setModalOpen(true);
13071
+ };
13072
+ const handleModalClose = () => setModalOpen(false);
13073
+ const handleOverwriteClose = () => setOverwriteOpen(false);
13074
+ const handleAction = async (method, overwrite) => {
13075
+ if (!newFileName) return;
13076
+ const bypassOverwrite = localStorage.getItem(require_version.localStorageKeys.bypassSaveOverwrite) === "true";
13077
+ try {
13078
+ if (method === "save") await require_state.saveAs({
13079
+ filename: newFileName,
13080
+ overwrite: overwrite ?? bypassOverwrite
13081
+ }, apiClient);
13082
+ else await require_state.rename({
13083
+ filename: newFileName,
13084
+ overwrite: overwrite ?? bypassOverwrite
13085
+ }, apiClient);
13086
+ toastSuccess(method === "save" ? "Save file successfully" : "Rename file successfully");
13087
+ await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.lineage() });
13088
+ if (bypass) localStorage.setItem(require_version.localStorageKeys.bypassSaveOverwrite, "true");
13089
+ } catch (error) {
13090
+ if (error instanceof axios.AxiosError) {
13091
+ if (error.response?.status === 409) {
13092
+ setState((s) => ({
13093
+ ...s,
13094
+ overwriteWithMethod: method
13095
+ }));
13096
+ setOverwriteOpen(true);
13097
+ return;
13098
+ }
13099
+ }
13100
+ toastError(method === "save" ? "Save file failed" : "Rename file failed", error);
13101
+ } finally {
13102
+ handleModalClose();
13103
+ }
13104
+ };
13105
+ const handleOvewriteBack = () => {
13106
+ handleOverwriteClose();
13107
+ setModalOpen(true);
13108
+ setState((s) => {
13109
+ return {
13110
+ ...s,
13111
+ overwriteWithMethod: void 0
13112
+ };
13113
+ });
13114
+ };
13115
+ if (cloudMode || isDemoSite) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {});
13116
+ const titleNewInstance = "New Instance" + (hasNonPresetChecks ? " (unsaved)" : "");
13117
+ let titleReadOnlyState;
13118
+ if (featureToggles.disableSaveToFile && fileName) {
13119
+ const generatedAt = envInfo?.stateMetadata?.generated_at;
13120
+ const formattedDate = generatedAt ? formatRunDateTime(new Date(generatedAt)) : null;
13121
+ titleReadOnlyState = formattedDate ? `${fileName} (${formattedDate})` : null;
13122
+ }
13123
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
13124
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13125
+ direction: "row",
13126
+ alignItems: "center",
13127
+ justifyContent: "center",
13128
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13129
+ sx: { fontWeight: 600 },
13130
+ children: titleReadOnlyState ?? fileName ?? titleNewInstance
13131
+ }), !featureToggles.disableSaveToFile && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13132
+ title: fileName ? "Change Filename" : "Save",
13133
+ enterDelay: 1e3,
13134
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13135
+ onClick: handleOpen,
13136
+ "aria-label": fileName ? "Change Filename" : "Save",
13137
+ size: "small",
13138
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13139
+ component: fileName ? require_state.IconEdit : require_state.IconSave,
13140
+ sx: {
13141
+ fontSize: 16,
13142
+ verticalAlign: "middle"
13143
+ }
13144
+ })
13145
+ })
13146
+ })]
13147
+ }),
13148
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Dialog.default, {
13149
+ open: modalOpen,
13150
+ onClose: handleModalClose,
13151
+ children: [
13152
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogTitle.default, {
13153
+ sx: {
13154
+ display: "flex",
13155
+ alignItems: "center"
13156
+ },
13157
+ children: [
13158
+ fileName ? "Change Filename" : "Save File",
13159
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flexGrow: 1 } }),
13160
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13161
+ size: "small",
13162
+ onClick: handleModalClose,
13163
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_io5.IoClose, {})
13164
+ })
13165
+ ]
13166
+ }),
13167
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_DialogContent.default, {
13168
+ onKeyDown: (e) => {
13169
+ e.stopPropagation();
13170
+ },
13171
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_TextField.default, {
13172
+ inputRef,
13173
+ value: newFileName,
13174
+ label: "File name",
13175
+ placeholder: "Enter filename",
13176
+ error: !!errorMessage,
13177
+ helperText: errorMessage,
13178
+ fullWidth: true,
13179
+ size: "small",
13180
+ sx: { mt: 1 },
13181
+ onChange: (e) => {
13182
+ const value = e.target.value;
13183
+ let newErrorMessage = void 0;
13184
+ if (!value) newErrorMessage = "Filename cannot be empty.";
13185
+ else if (!value.endsWith(".json")) newErrorMessage = "Filename must end with .json.";
13186
+ else if (!/^[a-zA-Z0-9 _-]+\.json$/.test(value)) newErrorMessage = "Invalid filename. Only alphanumeric, space, _ and - are allowed.";
13187
+ else if (fileName && value === fileName) newErrorMessage = "Filename is the same as the current one.";
13188
+ setState((s) => {
13189
+ return {
13190
+ ...s,
13191
+ modified: true,
13192
+ newFileName: value,
13193
+ errorMessage: newErrorMessage
13194
+ };
13195
+ });
13196
+ },
13197
+ onKeyDown: (e) => {
13198
+ if (e.key === "Enter") {
13199
+ if (errorMessage) return;
13200
+ if (!fileName) handleAction("save");
13201
+ else handleAction("rename");
13202
+ } else if (e.key === "Escape") handleModalClose();
13203
+ }
13204
+ })
13205
+ }),
13206
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogActions.default, {
13207
+ sx: { gap: "5px" },
13208
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13209
+ size: "small",
13210
+ color: fileName ? "inherit" : "iochmara",
13211
+ variant: "contained",
13212
+ onClick: async () => {
13213
+ await handleAction("save");
13214
+ },
13215
+ disabled: !newFileName || !!errorMessage || !modified,
13216
+ children: fileName ? "Save as New File" : "Confirm"
13217
+ }), fileName && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13218
+ size: "small",
13219
+ color: "iochmara",
13220
+ variant: "contained",
13221
+ onClick: async () => {
13222
+ await handleAction("rename");
13223
+ },
13224
+ disabled: !newFileName || !!errorMessage || !modified,
13225
+ children: "Rename"
13226
+ })]
13227
+ })
13228
+ ]
13229
+ }),
13230
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Dialog.default, {
13231
+ open: overwriteOpen,
13232
+ onClose: handleOverwriteClose,
13233
+ children: [
13234
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogTitle.default, {
13235
+ sx: {
13236
+ display: "flex",
13237
+ alignItems: "center"
13238
+ },
13239
+ children: [
13240
+ "Overwrite File?",
13241
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flexGrow: 1 } }),
13242
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13243
+ size: "small",
13244
+ onClick: handleOverwriteClose,
13245
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_io5.IoClose, {})
13246
+ })
13247
+ ]
13248
+ }),
13249
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogContent.default, {
13250
+ sx: {
13251
+ borderTop: "solid 1px",
13252
+ borderBottom: "solid 1px",
13253
+ borderColor: "divider"
13254
+ },
13255
+ onKeyDown: (e) => {
13256
+ e.stopPropagation();
13257
+ },
13258
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
13259
+ sx: { fontSize: "12pt" },
13260
+ children: overwriteWithMethod === "save" ? "Saving a file with this name will overwrite the existing file. Are you sure you wish to continue?" : "Renaming the file with this name will overwrite the existing file. Are you sure you wish to continue?"
13261
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
13262
+ control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Checkbox.default, {
13263
+ size: "small",
13264
+ checked: bypass,
13265
+ onChange: (e) => {
13266
+ setState((s) => ({
13267
+ ...s,
13268
+ bypass: e.target.checked
13269
+ }));
13270
+ }
13271
+ }),
13272
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
13273
+ sx: {
13274
+ fontWeight: "bold",
13275
+ pt: "8px"
13276
+ },
13277
+ children: "Don't show this again"
13278
+ })
13279
+ })]
13280
+ }),
13281
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogActions.default, {
13282
+ sx: { gap: "5px" },
13283
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13284
+ variant: "outlined",
13285
+ onClick: handleOvewriteBack,
13286
+ size: "small",
13287
+ children: "Back"
13288
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13289
+ size: "small",
13290
+ color: "iochmara",
13291
+ variant: "contained",
13292
+ onClick: () => {
13293
+ if (!overwriteWithMethod) return;
13294
+ handleAction(overwriteWithMethod, true);
13295
+ handleOverwriteClose();
13296
+ },
13297
+ children: "Overwrite"
13298
+ })]
13299
+ })
13300
+ ]
13301
+ })
13302
+ ] });
13303
+ };
13304
+
13305
+ //#endregion
13306
+ //#region recce-source/js/src/components/app/StateExporter.tsx
13307
+ function StateExporter() {
13308
+ const { featureToggles } = require_state.useRecceInstanceContext();
13309
+ const { apiClient } = require_state.useApiConfig();
13310
+ const handleExport = async () => {
13311
+ try {
13312
+ const jsonData = await require_state.exportState(apiClient);
13313
+ const jsonString = JSON.stringify(jsonData, null, 2);
13314
+ (0, file_saver.default)(new Blob([jsonString], { type: "application/json" }), `recce-state-${(0, date_fns.format)(/* @__PURE__ */ new Date(), "yyyy-MM-dd-HH-mm-ss")}.json`);
13315
+ } catch (error) {
13316
+ console.error("Export failed", error);
13317
+ require_state.toaster.create({
13318
+ title: "Export failed",
13319
+ description: String(error),
13320
+ type: "error",
13321
+ duration: 5e3,
13322
+ closable: true
13323
+ });
13324
+ }
13325
+ };
13326
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13327
+ title: "Export",
13328
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13329
+ size: "small",
13330
+ "aria-label": "Export state",
13331
+ onClick: async () => {
13332
+ await handleExport();
13333
+ require_state.trackStateAction({ name: "export" });
13334
+ },
13335
+ disabled: featureToggles.disableExportStateFile,
13336
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13337
+ component: require_state.IconExport,
13338
+ sx: {
13339
+ verticalAlign: "middle",
13340
+ width: "16px",
13341
+ height: "16px"
13342
+ }
13343
+ })
13344
+ })
13345
+ });
13346
+ }
13347
+
13348
+ //#endregion
13349
+ //#region recce-source/js/src/components/app/StateSharing.tsx
13350
+ const LOADING_MESSAGES = [
13351
+ "Processing...",
13352
+ "Still processing, please wait...",
13353
+ "Almost there, thanks for your patience..."
13354
+ ];
13355
+ function TopLevelShare() {
13356
+ const { successToast, failToast } = require_state.useClipBoardToast();
13357
+ const [, copyToClipboard] = (0, usehooks_ts.useCopyToClipboard)();
13358
+ const { authed } = require_state.useRecceInstanceContext();
13359
+ const { shareUrl, isLoading, error, handleShareClick } = require_RecceCheckContext.useRecceShareStateContext();
13360
+ const [showModal, setShowModal] = (0, react.useState)(false);
13361
+ const [messageIndex, setMessageIndex] = (0, react.useState)(0);
13362
+ const [prevIsLoading, setPrevIsLoading] = (0, react.useState)(isLoading);
13363
+ if (isLoading !== prevIsLoading) {
13364
+ setPrevIsLoading(isLoading);
13365
+ if (isLoading) setMessageIndex(0);
13366
+ }
13367
+ (0, usehooks_ts.useInterval)(() => {
13368
+ setMessageIndex((prev) => Math.min(prev + 1, LOADING_MESSAGES.length - 1));
13369
+ }, isLoading ? 3e4 : null);
13370
+ (0, react.useEffect)(() => {
13371
+ if (error) failToast("Failed to share state", error);
13372
+ }, [error, failToast]);
13373
+ const handleCopy = async () => {
13374
+ try {
13375
+ await copyToClipboard(String(shareUrl));
13376
+ successToast("Copied the link to clipboard");
13377
+ } catch (error$1) {
13378
+ failToast("Failed to copy the link", error$1);
13379
+ }
13380
+ };
13381
+ if (!authed) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13382
+ direction: "row",
13383
+ sx: {
13384
+ flex: 1,
13385
+ alignItems: "center"
13386
+ },
13387
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13388
+ size: "xsmall",
13389
+ color: "neutral",
13390
+ variant: "outlined",
13391
+ onClick: () => {
13392
+ setShowModal(true);
13393
+ },
13394
+ startIcon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_tb.TbCloudUpload, {}),
13395
+ children: "Share"
13396
+ }), showModal && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthModal, {
13397
+ parentOpen: showModal,
13398
+ handleParentClose: setShowModal,
13399
+ ignoreCookie: true,
13400
+ variant: "enable-share"
13401
+ })]
13402
+ });
13403
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13404
+ direction: "row",
13405
+ sx: {
13406
+ flex: 1,
13407
+ alignItems: "center",
13408
+ gap: "5px"
13409
+ },
13410
+ children: [
13411
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13412
+ size: "xsmall",
13413
+ variant: "outlined",
13414
+ color: "neutral",
13415
+ startIcon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_tb.TbCloudUpload, {}),
13416
+ endIcon: shareUrl ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13417
+ component: react_icons_pi.PiCheckCircle,
13418
+ sx: { color: "success.main" }
13419
+ }) : void 0,
13420
+ onClick: async () => {
13421
+ await handleShareClick();
13422
+ require_state.trackShareState({ name: "create" });
13423
+ },
13424
+ disabled: isLoading,
13425
+ children: isLoading ? "Sharing..." : "Share"
13426
+ }),
13427
+ isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
13428
+ sx: {
13429
+ fontSize: 14,
13430
+ color: "grey.500"
13431
+ },
13432
+ children: LOADING_MESSAGES[messageIndex]
13433
+ }),
13434
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Stack.default, {
13435
+ direction: "row",
13436
+ spacing: .5,
13437
+ alignItems: "center",
13438
+ children: shareUrl && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13439
+ sx: {
13440
+ overflowX: "auto",
13441
+ whiteSpace: "nowrap",
13442
+ maxWidth: "350px"
13443
+ },
13444
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
13445
+ sx: { fontSize: 14 },
13446
+ children: shareUrl
13447
+ })
13448
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13449
+ size: "small",
13450
+ "aria-label": "Copy the share URL",
13451
+ onClick: async () => {
13452
+ await handleCopy();
13453
+ require_state.trackShareState({ name: "copy" });
13454
+ },
13455
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiCopy, {})
13456
+ })] })
13457
+ })
13458
+ ]
13459
+ });
13460
+ }
13461
+
13462
+ //#endregion
13463
+ //#region recce-source/js/src/components/app/StateSynchronizer.tsx
13464
+ function isCheckDetailPage(href) {
13465
+ return /^\/checks\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/.test(href);
13466
+ }
13467
+ function StateSpinner() {
13468
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13469
+ title: "Syncing",
13470
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13471
+ sx: { mx: "10px" },
13472
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, { size: 20 })
13473
+ })
13474
+ });
13475
+ }
13476
+ function StateSynchronizer() {
13477
+ const [isSyncing, setSyncing] = (0, react.useState)(false);
13478
+ const queryClient = (0, _tanstack_react_query.useQueryClient)();
13479
+ const { apiClient } = require_state.useApiConfig();
13480
+ const [location, setLocation] = require_state.useAppLocation();
13481
+ const [open, setOpen] = (0, react.useState)(false);
13482
+ const [syncOption, setSyncOption] = (0, react.useState)("");
13483
+ const { data: instanceInfo } = require_state.useRecceInstanceInfo();
13484
+ const handleClose = () => setOpen(false);
13485
+ const handleSync = (0, react.useCallback)(async (input) => {
13486
+ setOpen(false);
13487
+ setSyncing(true);
13488
+ if ((await require_state.syncState(input, apiClient)).status === "conflict") {
13489
+ setOpen(true);
13490
+ setSyncing(false);
13491
+ return;
13492
+ }
13493
+ while (await require_state.isStateSyncing(apiClient)) await new Promise((resolve) => setTimeout(resolve, 1e3));
13494
+ require_state.toaster.create({
13495
+ description: "Sync Completed",
13496
+ type: "success",
13497
+ duration: 5e3,
13498
+ closable: true
13499
+ });
13500
+ setSyncing(false);
13501
+ setSyncOption("");
13502
+ await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.lineage() });
13503
+ await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
13504
+ await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.runs() });
13505
+ if (isCheckDetailPage(location)) setLocation("/checks");
13506
+ }, [
13507
+ queryClient,
13508
+ location,
13509
+ setLocation,
13510
+ apiClient
13511
+ ]);
13512
+ if (isSyncing) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StateSpinner, {});
13513
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13514
+ title: "Sync with Cloud",
13515
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13516
+ size: "small",
13517
+ "aria-label": "Sync state",
13518
+ onClick: () => handleSync(instanceInfo?.session_id ? { method: "merge" } : {}),
13519
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13520
+ component: require_state.IconSync,
13521
+ sx: {
13522
+ fontSize: 16,
13523
+ verticalAlign: "middle"
13524
+ }
13525
+ })
13526
+ })
13527
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Dialog.default, {
13528
+ open,
13529
+ onClose: handleClose,
13530
+ children: [
13531
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogTitle.default, {
13532
+ sx: {
13533
+ display: "flex",
13534
+ alignItems: "center",
13535
+ fontWeight: "bold"
13536
+ },
13537
+ children: [
13538
+ "Sync with Cloud",
13539
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flexGrow: 1 } }),
13540
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
13541
+ size: "small",
13542
+ onClick: handleClose,
13543
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_io5.IoClose, {})
13544
+ })
13545
+ ]
13546
+ }),
13547
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogContent.default, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, { children: "New changes have been detected in the cloud. Please choose a method to sync your state" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13548
+ sx: { mt: "5px" },
13549
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_RadioGroup.default, {
13550
+ value: syncOption,
13551
+ onChange: (e) => {
13552
+ setSyncOption(e.target.value);
13553
+ },
13554
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13555
+ direction: "column",
13556
+ children: [
13557
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
13558
+ value: "merge",
13559
+ control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Radio.default, {}),
13560
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13561
+ direction: "row",
13562
+ alignItems: "center",
13563
+ children: ["Merge", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13564
+ title: "This will merge the local and remote states.",
13565
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13566
+ component: react_icons_pi.PiInfo,
13567
+ sx: {
13568
+ ml: 2,
13569
+ cursor: "pointer"
13570
+ }
13571
+ })
13572
+ })]
13573
+ })
13574
+ }),
13575
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
13576
+ value: "overwrite",
13577
+ control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Radio.default, {}),
13578
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13579
+ direction: "row",
13580
+ alignItems: "center",
13581
+ children: ["Overwrite", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13582
+ title: "This will overwrite the remote state file with the local state.",
13583
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13584
+ component: react_icons_pi.PiInfo,
13585
+ sx: {
13586
+ ml: 2,
13587
+ cursor: "pointer"
13588
+ }
13589
+ })
13590
+ })]
13591
+ })
13592
+ }),
13593
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
13594
+ value: "revert",
13595
+ control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Radio.default, {}),
13596
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
13597
+ direction: "row",
13598
+ alignItems: "center",
13599
+ children: ["Revert", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
13600
+ title: "This will discard local changes and revert to the cloud state.",
13601
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13602
+ component: react_icons_pi.PiInfo,
13603
+ sx: {
13604
+ ml: 2,
13605
+ cursor: "pointer"
13606
+ }
13607
+ })
13608
+ })]
13609
+ })
13610
+ })
13611
+ ]
13612
+ })
13613
+ })
13614
+ })] }),
13615
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogActions.default, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13616
+ onClick: handleClose,
13617
+ sx: { mr: 1 },
13618
+ children: "Cancel"
13619
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
13620
+ color: "iochmara",
13621
+ variant: "contained",
13622
+ onClick: () => handleSync({ method: syncOption || void 0 }),
13623
+ disabled: !syncOption,
13624
+ children: "Sync"
13625
+ })] })
13626
+ ]
13627
+ })] });
13628
+ }
13629
+
13630
+ //#endregion
13631
+ //#region recce-source/js/app/(mainComponents)/NavBar.tsx
13632
+ /**
13633
+ * Route configuration for tabs
13634
+ */
13635
+ const ROUTE_CONFIG = [
13636
+ {
13637
+ path: "/lineage",
13638
+ name: "Lineage"
13639
+ },
13640
+ {
13641
+ path: "/query",
13642
+ name: "Query"
13643
+ },
13644
+ {
13645
+ path: "/checks",
13646
+ name: "Checklist"
13647
+ }
13648
+ ];
13649
+ function TabBadge({ queryKey, fetchCallback, selectCallback }) {
13650
+ const { data: count, isLoading, error } = (0, _tanstack_react_query.useQuery)({
13651
+ queryKey,
13652
+ queryFn: fetchCallback,
13653
+ select: selectCallback
13654
+ });
13655
+ if (isLoading || error || count === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {});
13656
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13657
+ bgcolor: "brand.main",
13658
+ display: "flex",
13659
+ justifyContent: "center",
13660
+ alignItems: "center",
13661
+ p: 1,
13662
+ borderRadius: "100%",
13663
+ color: "white",
13664
+ fontWeight: 700,
13665
+ fontSize: "0.75rem",
13666
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: count })
13667
+ });
13668
+ }
13669
+ function ChecklistBadge() {
13670
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabBadge, {
13671
+ queryKey: require_state.cacheKeys.checks(),
13672
+ fetchCallback: require_state.listChecks,
13673
+ selectCallback: (checks) => {
13674
+ return checks.filter((check) => !check.is_checked).length;
13675
+ }
13676
+ });
13677
+ }
13678
+ function NavBar() {
13679
+ const pathname = (0, next_navigation.usePathname)();
13680
+ const { isDemoSite, isLoading, cloudMode } = require_state.useLineageGraphContext();
13681
+ const { featureToggles } = require_state.useRecceInstanceContext();
13682
+ const { data: flag, isLoading: isFlagLoading } = require_state.useRecceServerFlag();
13683
+ const prevPathnameRef = (0, react.useRef)(null);
13684
+ (0, react.useEffect)(() => {
13685
+ if (prevPathnameRef.current && prevPathnameRef.current !== pathname) require_state.trackNavigation({
13686
+ from: prevPathnameRef.current,
13687
+ to: pathname
13688
+ });
13689
+ prevPathnameRef.current = pathname;
13690
+ }, [pathname]);
13691
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13692
+ sx: {
13693
+ borderBottom: "1px solid lightgray",
13694
+ px: "12px"
13695
+ },
13696
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
13697
+ sx: {
13698
+ display: "grid",
13699
+ gridTemplateColumns: "1fr auto 1fr",
13700
+ width: "100%",
13701
+ alignItems: "center"
13702
+ },
13703
+ children: [
13704
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tabs.default, {
13705
+ value: (0, react.useMemo)(() => {
13706
+ if (pathname.startsWith("/checks")) return "/checks";
13707
+ if (pathname.startsWith("/query")) return "/query";
13708
+ if (pathname.startsWith("/runs")) return "/runs";
13709
+ return "/lineage";
13710
+ }, [pathname]),
13711
+ sx: {
13712
+ borderBottom: "none",
13713
+ minHeight: "auto"
13714
+ },
13715
+ children: ROUTE_CONFIG.map(({ path, name }) => {
13716
+ if (name === "Query" && flag?.single_env_onboarding) return null;
13717
+ if (name === "Checklist" && ChecklistBadge) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tab.default, {
13718
+ value: path,
13719
+ disabled: isLoading || isFlagLoading,
13720
+ sx: { p: 0 },
13721
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13722
+ sx: {
13723
+ display: "flex",
13724
+ alignItems: "center",
13725
+ gap: "4px"
13726
+ },
13727
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(next_link.default, {
13728
+ href: path,
13729
+ style: {
13730
+ textDecoration: "none",
13731
+ color: "inherit",
13732
+ padding: "0.875rem 1.1875rem",
13733
+ display: "flex",
13734
+ gap: 3,
13735
+ alignItems: "center"
13736
+ },
13737
+ children: [
13738
+ name,
13739
+ " ",
13740
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChecklistBadge, {})
13741
+ ]
13742
+ })
13743
+ })
13744
+ }, path);
13745
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tab.default, {
13746
+ value: path,
13747
+ disabled: isLoading || isFlagLoading,
13748
+ sx: { p: 0 },
13749
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
13750
+ sx: {
13751
+ display: "flex",
13752
+ alignItems: "center",
13753
+ gap: "4px"
13754
+ },
13755
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(next_link.default, {
13756
+ href: path,
13757
+ style: {
13758
+ textDecoration: "none",
13759
+ color: "inherit",
13760
+ padding: "0.875rem 1.1875rem"
13761
+ },
13762
+ children: name
13763
+ })
13764
+ })
13765
+ }, path);
13766
+ })
13767
+ }),
13768
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
13769
+ sx: {
13770
+ display: "flex",
13771
+ alignItems: "center",
13772
+ gap: "12px",
13773
+ justifyContent: "center"
13774
+ },
13775
+ children: [!isLoading && !isDemoSite && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Filename, {}), !isLoading && !isDemoSite && !flag?.single_env_onboarding && !featureToggles.disableShare && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TopLevelShare, {})]
13776
+ }),
13777
+ !isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
13778
+ sx: {
13779
+ display: "flex",
13780
+ justifyContent: "right",
13781
+ alignItems: "center",
13782
+ mr: "8px"
13783
+ },
13784
+ children: [
13785
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnvInfo, {}),
13786
+ cloudMode && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StateSynchronizer, {}),
13787
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StateExporter, {})
13788
+ ]
13789
+ })
13790
+ ]
13791
+ })
13792
+ });
13793
+ }
13794
+
13795
+ //#endregion
13796
+ Object.defineProperty(exports, 'ChangeSummary', {
13797
+ enumerable: true,
13798
+ get: function () {
13799
+ return ChangeSummary;
13800
+ }
13801
+ });
13802
+ Object.defineProperty(exports, 'CheckBreadcrumb', {
13803
+ enumerable: true,
13804
+ get: function () {
13805
+ return CheckBreadcrumb;
13806
+ }
13807
+ });
13808
+ Object.defineProperty(exports, 'CheckDescription', {
13809
+ enumerable: true,
13810
+ get: function () {
13811
+ return CheckDescription;
13812
+ }
13813
+ });
13814
+ Object.defineProperty(exports, 'CheckDetail', {
13815
+ enumerable: true,
13816
+ get: function () {
13817
+ return CheckDetail;
13818
+ }
13819
+ });
13820
+ Object.defineProperty(exports, 'CheckEmptyState', {
13821
+ enumerable: true,
13822
+ get: function () {
13823
+ return CheckEmptyState;
13824
+ }
13825
+ });
13826
+ Object.defineProperty(exports, 'CheckList', {
13827
+ enumerable: true,
13828
+ get: function () {
13829
+ return CheckList;
13830
+ }
13831
+ });
13832
+ Object.defineProperty(exports, 'CodeEditor_default', {
13833
+ enumerable: true,
13834
+ get: function () {
13835
+ return CodeEditor_default;
13836
+ }
13837
+ });
13838
+ Object.defineProperty(exports, 'DiffEditor_default', {
13839
+ enumerable: true,
13840
+ get: function () {
13841
+ return DiffEditor_default;
13842
+ }
13843
+ });
13844
+ Object.defineProperty(exports, 'DisplayModeToggle', {
13845
+ enumerable: true,
13846
+ get: function () {
13847
+ return DisplayModeToggle;
13848
+ }
13849
+ });
13850
+ Object.defineProperty(exports, 'EnvInfo', {
13851
+ enumerable: true,
13852
+ get: function () {
13853
+ return EnvInfo;
13854
+ }
13855
+ });
13856
+ Object.defineProperty(exports, 'ErrorBoundary', {
13857
+ enumerable: true,
13858
+ get: function () {
13859
+ return ErrorBoundary;
13860
+ }
13861
+ });
13862
+ Object.defineProperty(exports, 'GraphColumnNode', {
13863
+ enumerable: true,
13864
+ get: function () {
13865
+ return GraphColumnNode;
13866
+ }
13867
+ });
13868
+ Object.defineProperty(exports, 'GraphEdge', {
13869
+ enumerable: true,
13870
+ get: function () {
13871
+ return GraphEdge;
13872
+ }
13873
+ });
13874
+ Object.defineProperty(exports, 'GraphNode', {
13875
+ enumerable: true,
13876
+ get: function () {
13877
+ return GraphNode;
13878
+ }
13879
+ });
13880
+ Object.defineProperty(exports, 'HSplit', {
13881
+ enumerable: true,
13882
+ get: function () {
13883
+ return HSplit;
13884
+ }
13885
+ });
13886
+ Object.defineProperty(exports, 'HistoryToggle', {
13887
+ enumerable: true,
13888
+ get: function () {
13889
+ return HistoryToggle;
13890
+ }
13891
+ });
13892
+ Object.defineProperty(exports, 'IdleTimeoutBadge', {
13893
+ enumerable: true,
13894
+ get: function () {
13895
+ return IdleTimeoutBadge;
13896
+ }
13897
+ });
13898
+ Object.defineProperty(exports, 'LineageDiffView', {
13899
+ enumerable: true,
13900
+ get: function () {
13901
+ return LineageDiffView;
13902
+ }
13903
+ });
13904
+ Object.defineProperty(exports, 'LineagePage', {
13905
+ enumerable: true,
13906
+ get: function () {
13907
+ return LineagePage;
13908
+ }
13909
+ });
13910
+ Object.defineProperty(exports, 'LineageView', {
13911
+ enumerable: true,
13912
+ get: function () {
13913
+ return LineageView;
13914
+ }
13915
+ });
13916
+ Object.defineProperty(exports, 'LineageViewTopBar', {
13917
+ enumerable: true,
13918
+ get: function () {
13919
+ return LineageViewTopBar;
13920
+ }
13921
+ });
13922
+ Object.defineProperty(exports, 'ModelRowCount', {
13923
+ enumerable: true,
13924
+ get: function () {
13925
+ return ModelRowCount;
13926
+ }
13927
+ });
13928
+ Object.defineProperty(exports, 'MuiProvider', {
13929
+ enumerable: true,
13930
+ get: function () {
13931
+ return MuiProvider;
13932
+ }
13933
+ });
13934
+ Object.defineProperty(exports, 'NavBar', {
13935
+ enumerable: true,
13936
+ get: function () {
13937
+ return NavBar;
13938
+ }
13939
+ });
13940
+ Object.defineProperty(exports, 'NodeSqlView', {
13941
+ enumerable: true,
13942
+ get: function () {
13943
+ return NodeSqlView;
13944
+ }
13945
+ });
13946
+ Object.defineProperty(exports, 'NodeView', {
13947
+ enumerable: true,
13948
+ get: function () {
13949
+ return NodeView;
13950
+ }
13951
+ });
13952
+ Object.defineProperty(exports, 'QueryForm', {
13953
+ enumerable: true,
13954
+ get: function () {
13955
+ return QueryForm;
13956
+ }
13957
+ });
13958
+ Object.defineProperty(exports, 'QueryPage', {
13959
+ enumerable: true,
13960
+ get: function () {
13961
+ return QueryPage;
13962
+ }
13963
+ });
13964
+ Object.defineProperty(exports, 'RecceVersionBadge', {
13965
+ enumerable: true,
13966
+ get: function () {
13967
+ return RecceVersionBadge;
13968
+ }
13969
+ });
13970
+ Object.defineProperty(exports, 'ResourceTypeTag', {
13971
+ enumerable: true,
13972
+ get: function () {
13973
+ return ResourceTypeTag;
13974
+ }
13975
+ });
13976
+ Object.defineProperty(exports, 'RowCountDiffTag', {
13977
+ enumerable: true,
13978
+ get: function () {
13979
+ return RowCountDiffTag;
13980
+ }
13981
+ });
13982
+ Object.defineProperty(exports, 'RunList', {
13983
+ enumerable: true,
13984
+ get: function () {
13985
+ return RunList;
12683
13986
  }
12684
13987
  });
12685
13988
  Object.defineProperty(exports, 'RunPage', {
@@ -12748,6 +14051,12 @@ Object.defineProperty(exports, 'SummaryView', {
12748
14051
  return SummaryView;
12749
14052
  }
12750
14053
  });
14054
+ Object.defineProperty(exports, 'TopBar', {
14055
+ enumerable: true,
14056
+ get: function () {
14057
+ return TopBar;
14058
+ }
14059
+ });
12751
14060
  Object.defineProperty(exports, 'VSplit', {
12752
14061
  enumerable: true,
12753
14062
  get: function () {
@@ -12760,4 +14069,4 @@ Object.defineProperty(exports, 'mui_provider_default', {
12760
14069
  return mui_provider_default;
12761
14070
  }
12762
14071
  });
12763
- //# sourceMappingURL=components-DeA4kqxK.js.map
14072
+ //# sourceMappingURL=components-Bmc5X473.js.map