@datarecce/ui 0.1.23 → 0.1.25

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 (53) hide show
  1. package/dist/{RecceCheckContext-DIQjrvH8.mjs → RecceCheckContext-CiG9fGRW.mjs} +4 -3
  2. package/dist/RecceCheckContext-CiG9fGRW.mjs.map +1 -0
  3. package/dist/{RecceCheckContext-_xzNlnbJ.js → RecceCheckContext-tUxygNmN.js} +4 -3
  4. package/dist/RecceCheckContext-tUxygNmN.js.map +1 -0
  5. package/dist/api.d.mts +2 -2
  6. package/dist/api.d.ts +2 -2
  7. package/dist/api.js +3 -2
  8. package/dist/api.mjs +3 -3
  9. package/dist/{components-DXbVq9Cw.js → components-Chaffojm.js} +274 -227
  10. package/dist/components-Chaffojm.js.map +1 -0
  11. package/dist/{components-CfY72Lq2.mjs → components-DoLZeY_e.mjs} +274 -225
  12. package/dist/components-DoLZeY_e.mjs.map +1 -0
  13. package/dist/components.d.mts +1 -1
  14. package/dist/components.d.ts +1 -1
  15. package/dist/components.js +4 -4
  16. package/dist/components.mjs +4 -4
  17. package/dist/{hooks-C4jkoryM.js → hooks-VXI-W5Aq.js} +3 -3
  18. package/dist/{hooks-C4jkoryM.js.map → hooks-VXI-W5Aq.js.map} +1 -1
  19. package/dist/{hooks-C8pyX9m_.mjs → hooks-XsKEyc3k.mjs} +3 -3
  20. package/dist/{hooks-C8pyX9m_.mjs.map → hooks-XsKEyc3k.mjs.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-CVPmrztP.d.ts → index-OeBjAMJ6.d.ts} +46 -40
  26. package/dist/index-OeBjAMJ6.d.ts.map +1 -0
  27. package/dist/{index-DIHuswfP.d.mts → index-_KWh3aGd.d.mts} +115 -109
  28. package/dist/index-_KWh3aGd.d.mts.map +1 -0
  29. package/dist/index.d.mts +2 -2
  30. package/dist/index.d.ts +2 -2
  31. package/dist/index.js +7 -5
  32. package/dist/index.mjs +6 -6
  33. package/dist/{state-BbgVwFV2.mjs → state-DyHCt6IJ.mjs} +118 -96
  34. package/dist/state-DyHCt6IJ.mjs.map +1 -0
  35. package/dist/{state-AeoqV9ja.js → state-FkYREAs-.js} +123 -95
  36. package/dist/state-FkYREAs-.js.map +1 -0
  37. package/dist/types.d.mts +1 -1
  38. package/dist/types.d.ts +1 -1
  39. package/dist/{version-MxW9vrDY.js → version-BGNaeW6k.js} +22 -12
  40. package/dist/version-BGNaeW6k.js.map +1 -0
  41. package/dist/{version-C2NU3xyx.mjs → version-Dav28qEz.mjs} +18 -14
  42. package/dist/version-Dav28qEz.mjs.map +1 -0
  43. package/package.json +2 -1
  44. package/dist/RecceCheckContext-DIQjrvH8.mjs.map +0 -1
  45. package/dist/RecceCheckContext-_xzNlnbJ.js.map +0 -1
  46. package/dist/components-CfY72Lq2.mjs.map +0 -1
  47. package/dist/components-DXbVq9Cw.js.map +0 -1
  48. package/dist/index-CVPmrztP.d.ts.map +0 -1
  49. package/dist/index-DIHuswfP.d.mts.map +0 -1
  50. package/dist/state-AeoqV9ja.js.map +0 -1
  51. package/dist/state-BbgVwFV2.mjs.map +0 -1
  52. package/dist/version-C2NU3xyx.mjs.map +0 -1
  53. package/dist/version-MxW9vrDY.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client"
2
- import { $t as trackMultiNodesAction, At as submitQuery, Bn as lightTheme, Bt as waitRun, Cn as toReactFlow, Ct as cacheKeys, F as useRecceActionContext, Gt as trackColumnLevelLineage, H as IconSave, I as useAppLocation, In as toaster, It as listRuns, J as mergeKeysWithStatus, Jt as trackExploreAction, K as useClipBoardToast, Kt as trackCopyToClipboard, M as useLineageViewContext, Mt as submitQueryDiff, N as useLineageViewContextSafe, Pt as cancelRun, Qt as trackLineageViewRender, R as IconEdit, Rn as colors, Rt as submitRun, Sn as selectUpstream, Tn as getCll, Tt as ScreenshotDataGrid, U as IconSync, Ut as EXPLORE_SOURCE, V as IconInfo, Vn as token, Vt as EXPLORE_ACTION, W as deltaPercentageString, Wt as LINEAGE_SELECTION_ACTION, Xt as trackHistoryAction, Zt as trackLineageSelection, _ as findByRunType, _n as COLUMN_HEIGHT, _t as useRecceInstanceContext, a as saveAs$1, an as trackStateAction, at as useModelColumns_default, bn as layout, c as createCheckByRun, cn as isProfileDiffRun, ct as useRunsAggregated, d as getCheck, dn as isQueryRun, dt as useIdleTimeout, en as trackNavigation, f as listChecks, fn as isRowCountDiffRun, g as useChecks, gn as isValueDiffRun, h as updateCheck, hn as isValueDiffDetailRun, ht as formatDuration, i as rename, in as trackSingleEnvironment, it as supportsHistogramDiff, j as LineageViewContext, jn as axiosClient, jt as submitQueryBase, k as createDataGridFromData, kt as createLineageDiffCheck, ln as isQueryBaseRun, lt as useRecceServerFlag, mn as isTopKDiffRun, nn as trackPreviewChangeFeedback, p as markAsPresetCheck, pn as isRowCountRun, q as mergeKeys, qt as trackEnvironmentConfig, r as isStateSyncing, rn as trackShareState, s as syncState, sn as isHistogramDiffRun, st as useLineageGraphContext, t as exportState, tn as trackPreviewChange, u as deleteCheck, un as isQueryDiffRun, v as runTypeHasRef, vn as isLineageGraphColumnNode, vt as useRecceInstanceInfo, wn as union, wt as EmptyRowsRenderer, xn as selectDownstream, yn as isLineageGraphNode, z as IconExport, zn as darkTheme, zt as submitRunFromCheck } from "./state-BbgVwFV2.mjs";
2
+ import { $t as trackLineageViewRender, At as createLineageDiffCheck, B as IconExport, Bn as darkTheme, Bt as submitRunFromCheck, Cn as selectUpstream, En as getCll, Et as ScreenshotDataGrid, Ft as cancelRun, G as deltaPercentageString, Gt as LINEAGE_SELECTION_ACTION, H as IconInfo, Hn as token, Ht as EXPLORE_ACTION, I as useRecceActionContext, J as mergeKeys, Jt as trackEnvironmentConfig, Kt as trackColumnLevelLineage, L as useAppLocation, Ln as toaster, Lt as listRuns, M as useLineageViewContext, Mn as axiosClient, Mt as submitQueryBase, N as useLineageViewContextSafe, Nt as submitQueryDiff, Qt as trackLineageSelection, Sn as selectDownstream, St as useApiConfig, Tn as union, Tt as EmptyRowsRenderer, U as IconSave, Vn as lightTheme, Vt as waitRun, W as IconSync, Wt as EXPLORE_SOURCE, Y as mergeKeysWithStatus, Yt as trackExploreAction, Zt as trackHistoryAction, _ as findByRunType, _n as isValueDiffRun, a as saveAs$1, an as trackSingleEnvironment, at as supportsHistogramDiff, bn as isLineageGraphNode, c as createCheckByRun, cn as isHistogramDiffRun, ct as useLineageGraphContext, d as getCheck, dn as isQueryDiffRun, en as trackMultiNodesAction, f as listChecks, fn as isQueryRun, ft as useIdleTimeout, g as useChecks, gn as isValueDiffDetailRun, gt as formatDuration, h as updateCheck, hn as isTopKDiffRun, i as rename, in as trackShareState, j as LineageViewContext, jt as submitQuery, k as createDataGridFromData, ln as isProfileDiffRun, lt as useRunsAggregated, mn as isRowCountRun, nn as trackPreviewChange, on as trackStateAction, ot as useModelColumns_default, p as markAsPresetCheck, pn as isRowCountDiffRun, q as useClipBoardToast, qt as trackCopyToClipboard, r as isStateSyncing, rn as trackPreviewChangeFeedback, s as syncState, t as exportState, tn as trackNavigation, u as deleteCheck, un as isQueryBaseRun, ut as useRecceServerFlag, v as runTypeHasRef, vn as COLUMN_HEIGHT, vt as useRecceInstanceContext, wn as toReactFlow, wt as cacheKeys, xn as layout, yn as isLineageGraphColumnNode, yt as useRecceInstanceInfo, z as IconEdit, zn as colors, zt as submitRun } from "./state-DyHCt6IJ.mjs";
3
3
  import { t as RECCE_SUPPORT_CALENDAR_URL } from "./urls-D7PrPolY.mjs";
4
- import { a as localStorageKeys, c as createSchemaDiffCheck, i as connectToCloud, n as fetchGitHubAvatar, o as sessionStorageKeys, r as fetchUser, s as select, t as useVersionNumber } from "./version-C2NU3xyx.mjs";
5
- import { i as useValueDiffAlertDialog_default, l as defaultSqlQuery, n as useRecceCheckContext, o as useRecceShareStateContext, r as useCheckToast, u as useRecceQueryContext } from "./RecceCheckContext-DIQjrvH8.mjs";
4
+ import { a as connectToCloud, c as select, i as fetchUser, l as createSchemaDiffCheck, n as useVersionNumber, o as localStorageKeys, r as fetchGitHubAvatar, s as sessionStorageKeys } from "./version-Dav28qEz.mjs";
5
+ import { i as useValueDiffAlertDialog_default, l as defaultSqlQuery, n as useRecceCheckContext, o as useRecceShareStateContext, r as useCheckToast, u as useRecceQueryContext } from "./RecceCheckContext-CiG9fGRW.mjs";
6
6
  import { t as DisableTooltipMessages } from "./tooltipMessage-CrXjOmVM.mjs";
7
7
  import CssBaseline from "@mui/material/CssBaseline";
8
8
  import { ThemeProvider, alpha, useTheme } from "@mui/material/styles";
@@ -19,7 +19,7 @@ import { ErrorBoundary, FallbackRender } from "@sentry/react";
19
19
  import ReactSplit, { SplitProps } from "react-split";
20
20
  import { Background, BackgroundVariant, BaseEdge, ControlButton, Controls, EdgeProps, Handle, MiniMap, Node, NodeProps, Panel, Position, ReactFlow, ReactFlowProvider, getBezierPath, getNodesBounds, useEdgesState, useNodesState, useReactFlow, useStore } from "@xyflow/react";
21
21
  import Divider from "@mui/material/Divider";
22
- import { AxiosError, AxiosResponse } from "axios";
22
+ import { AxiosError, AxiosInstance, AxiosResponse } from "axios";
23
23
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
24
24
  import "@xyflow/react/dist/style.css";
25
25
  import { FiArrowRight, FiCopy, FiFrown, FiInfo, FiPackage } from "react-icons/fi";
@@ -97,8 +97,6 @@ import Card from "@mui/material/Card";
97
97
  import CardContent from "@mui/material/CardContent";
98
98
  import CardHeader from "@mui/material/CardHeader";
99
99
  import Badge from "@mui/material/Badge";
100
- import DisplayModeToggle from "app/(mainComponents)/DisplayModeToggle";
101
- import RecceVersionBadge from "app/(mainComponents)/RecceVersionBadge";
102
100
 
103
101
  //#region recce-source/js/src/components/ui/mui-provider.tsx
104
102
  /**
@@ -117,10 +115,19 @@ import RecceVersionBadge from "app/(mainComponents)/RecceVersionBadge";
117
115
  */
118
116
  function MuiProvider({ children, forcedTheme, enableCssBaseline = false }) {
119
117
  const { resolvedTheme } = useTheme$1();
118
+ const [mounted, setMounted] = useState(false);
119
+ useEffect(() => {
120
+ setMounted(true);
121
+ }, []);
120
122
  return /* @__PURE__ */ jsxs(ThemeProvider, {
121
123
  theme: useMemo(() => {
124
+ if (!mounted) return lightTheme;
122
125
  return (forcedTheme ?? resolvedTheme) === "dark" ? darkTheme : lightTheme;
123
- }, [forcedTheme, resolvedTheme]),
126
+ }, [
127
+ forcedTheme,
128
+ resolvedTheme,
129
+ mounted
130
+ ]),
124
131
  children: [enableCssBaseline && /* @__PURE__ */ jsx(CssBaseline, {}), children]
125
132
  });
126
133
  }
@@ -483,13 +490,14 @@ function useImageDownloadModal() {
483
490
  //#endregion
484
491
  //#region recce-source/js/src/lib/hooks/useRun.tsx
485
492
  const useRun = (runId) => {
493
+ const { apiClient } = useApiConfig();
486
494
  const [isRunning, setIsRunning] = useState(false);
487
495
  const [aborting, setAborting] = useState(false);
488
496
  const [, refetchRunsAggregated] = useRunsAggregated();
489
497
  const { error, data: run } = useQuery({
490
498
  queryKey: cacheKeys.run(runId ?? ""),
491
499
  queryFn: async () => {
492
- return await waitRun(runId ?? "", isRunning ? 2 : 0);
500
+ return await waitRun(runId ?? "", isRunning ? 2 : 0, apiClient);
493
501
  },
494
502
  enabled: !!runId,
495
503
  refetchInterval: isRunning ? 50 : false,
@@ -513,8 +521,8 @@ const useRun = (runId) => {
513
521
  const onCancel = useCallback(async () => {
514
522
  setAborting(true);
515
523
  if (!runId) return;
516
- await cancelRun(runId);
517
- }, [runId]);
524
+ await cancelRun(runId, apiClient);
525
+ }, [runId, apiClient]);
518
526
  let RunResultView;
519
527
  if (run && runTypeHasRef(run.type)) RunResultView = findByRunType(run.type).RunResultView;
520
528
  return {
@@ -532,9 +540,8 @@ const useRun = (runId) => {
532
540
  /**
533
541
  * Theme-aware color utility hook
534
542
  *
535
- * Provides convenient access to theme-aware colors for components that
536
- * need to handle both light and dark modes. This centralizes theme-aware
537
- * color logic to avoid repetitive ternary expressions throughout components.
543
+ * Uses next-themes to determine dark/light mode, which is more reliable
544
+ * when the host app uses MUI CSS variables mode with nested ThemeProviders.
538
545
  *
539
546
  * @example
540
547
  * ```tsx
@@ -554,20 +561,25 @@ const useRun = (runId) => {
554
561
  * ```
555
562
  */
556
563
  function useThemeColors() {
557
- const theme = useTheme();
558
- const isDark = theme.palette.mode === "dark";
564
+ const muiTheme = useTheme();
565
+ const { resolvedTheme } = useTheme$1();
566
+ const [mounted, setMounted] = useState(false);
567
+ useEffect(() => {
568
+ setMounted(true);
569
+ }, []);
570
+ const isDark = mounted ? resolvedTheme === "dark" : false;
559
571
  return {
560
572
  isDark,
561
- theme,
573
+ theme: muiTheme,
562
574
  background: {
563
- default: theme.palette.background.default,
564
- paper: theme.palette.background.paper,
575
+ default: isDark ? colors.neutral[900] : colors.white,
576
+ paper: isDark ? colors.neutral[800] : colors.white,
565
577
  subtle: isDark ? colors.neutral[800] : colors.neutral[50],
566
578
  emphasized: isDark ? colors.neutral[700] : colors.neutral[100]
567
579
  },
568
580
  text: {
569
- primary: theme.palette.text.primary,
570
- secondary: theme.palette.text.secondary,
581
+ primary: isDark ? colors.neutral[50] : colors.neutral[900],
582
+ secondary: isDark ? colors.neutral[400] : colors.neutral[600],
571
583
  disabled: isDark ? colors.neutral[500] : colors.neutral[400],
572
584
  inverted: isDark ? colors.neutral[900] : colors.neutral[50]
573
585
  },
@@ -578,16 +590,16 @@ function useThemeColors() {
578
590
  },
579
591
  status: {
580
592
  added: {
581
- bg: isDark ? "#1a4d1a" : "#cefece",
582
- text: theme.palette.text.primary
593
+ bg: isDark ? colors.green[900] : colors.green[100],
594
+ text: isDark ? colors.neutral[50] : colors.neutral[900]
583
595
  },
584
596
  removed: {
585
- bg: isDark ? "#5c1f1f" : "#ffc5c5",
586
- text: theme.palette.text.primary
597
+ bg: isDark ? colors.red[950] : colors.red[200],
598
+ text: isDark ? colors.neutral[50] : colors.neutral[900]
587
599
  },
588
600
  modified: {
589
- bg: isDark ? "#5c4a1a" : "#fff3cd",
590
- text: theme.palette.text.primary
601
+ bg: isDark ? colors.yellow[900] : colors.amber[100],
602
+ text: isDark ? colors.neutral[50] : colors.neutral[900]
591
603
  }
592
604
  },
593
605
  interactive: {
@@ -4252,6 +4264,7 @@ const QueryForm = ({ defaultPrimaryKeys, onPrimaryKeysChange, ...props }) => {
4252
4264
  //#region recce-source/js/src/components/AuthModal/AuthModal.tsx
4253
4265
  function AuthModal({ handleParentClose, parentOpen = false, ignoreCookie = false, variant = "auth" }) {
4254
4266
  const { authed } = useRecceInstanceContext();
4267
+ const { apiClient } = useApiConfig();
4255
4268
  const [open, setOpen] = useState(parentOpen || !authed);
4256
4269
  const authStateCookieValue = Cookies.get("authState") ?? "pending";
4257
4270
  const [authState, setAuthState] = useState(ignoreCookie ? "pending" : authStateCookieValue);
@@ -4334,7 +4347,7 @@ function AuthModal({ handleParentClose, parentOpen = false, ignoreCookie = false
4334
4347
  },
4335
4348
  onClick: async () => {
4336
4349
  setAuthState("authenticating");
4337
- const { connection_url } = await connectToCloud();
4350
+ const { connection_url } = await connectToCloud(apiClient);
4338
4351
  window.open(connection_url, "_blank");
4339
4352
  },
4340
4353
  children: [
@@ -5020,6 +5033,7 @@ function AddToCheckButton({ runId, viewOptions }) {
5020
5033
  const { error, run } = useRun(runId);
5021
5034
  const queryClient = useQueryClient();
5022
5035
  const [, setLocation] = useAppLocation();
5036
+ const { apiClient } = useApiConfig();
5023
5037
  const checkId = run?.check_id;
5024
5038
  const handleGoToCheck = useCallback(() => {
5025
5039
  if (!checkId) return;
@@ -5027,14 +5041,15 @@ function AddToCheckButton({ runId, viewOptions }) {
5027
5041
  }, [checkId, setLocation]);
5028
5042
  const handleAddToChecklist = useCallback(async () => {
5029
5043
  if (!runId) return;
5030
- const check = await createCheckByRun(runId, viewOptions);
5044
+ const check = await createCheckByRun(runId, viewOptions, apiClient);
5031
5045
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
5032
5046
  setLocation(`/checks/?id=${check.check_id}`);
5033
5047
  }, [
5034
5048
  runId,
5035
5049
  setLocation,
5036
5050
  queryClient,
5037
- viewOptions
5051
+ viewOptions,
5052
+ apiClient
5038
5053
  ]);
5039
5054
  if (featureToggles.disableUpdateChecklist) return /* @__PURE__ */ jsx(Fragment$1, {});
5040
5055
  if (run?.check_id) return /* @__PURE__ */ jsx(Button, {
@@ -5192,15 +5207,16 @@ function SandboxView({ isOpen, onClose, current }) {
5192
5207
  const { showRunId, clearRunResult } = useRecceActionContext();
5193
5208
  const { primaryKeys, setPrimaryKeys } = useRecceQueryContext();
5194
5209
  const { data: flags, isLoading } = useRecceServerFlag();
5210
+ const { apiClient } = useApiConfig();
5195
5211
  const queryFn = async () => {
5196
5212
  const sqlTemplate = modifiedCode;
5197
5213
  const { run_id } = await submitQueryDiff({
5198
5214
  current_model: current?.name ?? "",
5199
5215
  primary_keys: primaryKeys,
5200
5216
  sql_template: sqlTemplate
5201
- }, { nowait: true });
5217
+ }, { nowait: true }, apiClient);
5202
5218
  showRunId(run_id);
5203
- return await waitRun(run_id);
5219
+ return await waitRun(run_id, void 0, apiClient);
5204
5220
  };
5205
5221
  const { mutate: runQuery, isPending } = useMutation({
5206
5222
  mutationFn: queryFn,
@@ -5678,12 +5694,17 @@ function ExploreChangeMenuButton({ node, baseColumns, currentColumns, disableRea
5678
5694
  const { envInfo, isActionAvailable } = useLineageGraphContext();
5679
5695
  const { featureToggles } = useRecceInstanceContext();
5680
5696
  const { primaryKey } = useModelColumns_default(node.data.name);
5697
+ const { apiClient } = useApiConfig();
5681
5698
  const metadataOnly = featureToggles.mode === "metadata only";
5682
5699
  const isAddedOrRemoved = node.data.changeStatus === "added" || node.data.changeStatus === "removed";
5683
5700
  const addSchemaCheck = useCallback(async () => {
5684
5701
  const nodeId = node.id;
5685
- setLocation(`/checks/?id=${(await createSchemaDiffCheck({ node_id: nodeId })).check_id}`);
5686
- }, [node, setLocation]);
5702
+ setLocation(`/checks/?id=${(await createSchemaDiffCheck({ node_id: nodeId }, apiClient)).check_id}`);
5703
+ }, [
5704
+ node,
5705
+ setLocation,
5706
+ apiClient
5707
+ ]);
5687
5708
  const formattedColumns = formatSelectColumns(baseColumns, currentColumns);
5688
5709
  let query = `select * from {{ ref("${node.data.name}") }}`;
5689
5710
  if (formattedColumns.length) query = `select \n ${formattedColumns.join("\n ")}\nfrom {{ ref("${node.data.name}") }}`;
@@ -6150,6 +6171,7 @@ const initValue = {
6150
6171
  actions: {}
6151
6172
  };
6152
6173
  const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onActionCompleted }) => {
6174
+ const { apiClient } = useApiConfig();
6153
6175
  const actionState = useRef({ ...initValue }).current;
6154
6176
  const { showRunId } = useRecceActionContext();
6155
6177
  const submitRunForNodes = async (type, skip, getParams) => {
@@ -6179,12 +6201,12 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
6179
6201
  }
6180
6202
  const params = getParams(candidates);
6181
6203
  try {
6182
- const { run_id } = await submitRun(type, params, { nowait: true });
6204
+ const { run_id } = await submitRun(type, params, { nowait: true }, apiClient);
6183
6205
  showRunId(run_id);
6184
6206
  actionState.currentRun = { run_id };
6185
6207
  actionState.total = 1;
6186
6208
  for (;;) {
6187
- const run = await waitRun(run_id, 2);
6209
+ const run = await waitRun(run_id, 2, apiClient);
6188
6210
  actionState.currentRun = run;
6189
6211
  const status = run.error ? "failure" : run.result ? "success" : "running";
6190
6212
  for (const node of candidates) {
@@ -6233,7 +6255,7 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
6233
6255
  };
6234
6256
  onActionNodeUpdated(node);
6235
6257
  } else try {
6236
- const { run_id } = await submitRun(type, params, { nowait: true });
6258
+ const { run_id } = await submitRun(type, params, { nowait: true }, apiClient);
6237
6259
  actionState.currentRun = { run_id };
6238
6260
  actions[node.id] = {
6239
6261
  mode,
@@ -6241,7 +6263,7 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
6241
6263
  };
6242
6264
  onActionNodeUpdated(node);
6243
6265
  for (;;) {
6244
- const run = await waitRun(run_id, 2);
6266
+ const run = await waitRun(run_id, 2, apiClient);
6245
6267
  actionState.currentRun = run;
6246
6268
  const status = run.error ? "failure" : run.result ? "success" : "running";
6247
6269
  actions[node.id] = {
@@ -6327,17 +6349,17 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
6327
6349
  });
6328
6350
  };
6329
6351
  const addLineageDiffCheck = async () => {
6330
- return await createLineageDiffCheck({ node_ids: nodes.map((node) => node.id) });
6352
+ return await createLineageDiffCheck({ node_ids: nodes.map((node) => node.id) }, apiClient);
6331
6353
  };
6332
6354
  const addSchemaDiffCheck = async () => {
6333
6355
  let check;
6334
- if (nodes.length === 1) check = await createSchemaDiffCheck({ node_id: nodes[0].id });
6335
- else check = await createSchemaDiffCheck({ node_id: nodes.map((node) => node.id) });
6356
+ if (nodes.length === 1) check = await createSchemaDiffCheck({ node_id: nodes[0].id }, apiClient);
6357
+ else check = await createSchemaDiffCheck({ node_id: nodes.map((node) => node.id) }, apiClient);
6336
6358
  return check;
6337
6359
  };
6338
6360
  const cancel = async () => {
6339
6361
  actionState.status = "canceling";
6340
- if (actionState.currentRun?.run_id) await cancelRun(actionState.currentRun.run_id);
6362
+ if (actionState.currentRun?.run_id) await cancelRun(actionState.currentRun.run_id, apiClient);
6341
6363
  };
6342
6364
  const reset = () => {
6343
6365
  Object.assign(actionState, initValue);
@@ -6400,6 +6422,7 @@ const useNavToCheck = () => {
6400
6422
  };
6401
6423
  function PrivateLineageView({ interactive = false, ...props }, ref) {
6402
6424
  const { isDark } = useThemeColors();
6425
+ const { apiClient } = useApiConfig();
6403
6426
  const reactFlow = useReactFlow();
6404
6427
  const refResize = useRef(null);
6405
6428
  const { successToast, failToast } = useClipBoardToast();
@@ -6447,7 +6470,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6447
6470
  }, []);
6448
6471
  const cllHistory = useRef([]).current;
6449
6472
  const [cll, setCll] = useState(void 0);
6450
- const actionGetCll = useMutation({ mutationFn: getCll });
6473
+ const actionGetCll = useMutation({ mutationFn: (input) => getCll(input, apiClient) });
6451
6474
  const [nodeColumnSetMap, setNodeColumSetMap] = useState({});
6452
6475
  const findNodeByName = useCallback((name) => {
6453
6476
  return nodes.filter(isLineageGraphNode).find((n) => n.data.name === name);
@@ -6550,7 +6573,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6550
6573
  exclude: newViewOptions.exclude,
6551
6574
  packages: newViewOptions.packages,
6552
6575
  view_mode: newViewOptions.view_mode
6553
- })).nodes;
6576
+ }, apiClient)).nodes;
6554
6577
  } catch (_$1) {
6555
6578
  newViewOptions.view_mode = "all";
6556
6579
  filteredNodeIds$1 = (await select({
@@ -6558,7 +6581,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6558
6581
  exclude: newViewOptions.exclude,
6559
6582
  packages: newViewOptions.packages,
6560
6583
  view_mode: newViewOptions.view_mode
6561
- })).nodes;
6584
+ }, apiClient)).nodes;
6562
6585
  }
6563
6586
  setViewOptions(newViewOptions);
6564
6587
  }
@@ -6679,7 +6702,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6679
6702
  exclude: newViewOptions.exclude,
6680
6703
  packages: newViewOptions.packages,
6681
6704
  view_mode: newViewOptions.view_mode
6682
- });
6705
+ }, apiClient);
6683
6706
  newViewOptions = {
6684
6707
  ...newViewOptions,
6685
6708
  column_level_lineage: void 0
@@ -6961,7 +6984,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6961
6984
  selected: "multi"
6962
6985
  });
6963
6986
  } else if (!focusedNode) {
6964
- check = await createLineageDiffCheck(viewOptions);
6987
+ check = await createLineageDiffCheck(viewOptions, apiClient);
6965
6988
  trackMultiNodesAction({
6966
6989
  type: "lineage_diff",
6967
6990
  selected: "none"
@@ -6981,7 +7004,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6981
7004
  });
6982
7005
  }
6983
7006
  } else if (focusedNode) {
6984
- check = await createSchemaDiffCheck({ node_id: focusedNode.id });
7007
+ check = await createSchemaDiffCheck({ node_id: focusedNode.id }, apiClient);
6985
7008
  trackMultiNodesAction({
6986
7009
  type: "schema_diff",
6987
7010
  selected: "single"
@@ -6992,7 +7015,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
6992
7015
  exclude: viewOptions.exclude,
6993
7016
  packages: viewOptions.packages,
6994
7017
  view_mode: viewOptions.view_mode
6995
- });
7018
+ }, apiClient);
6996
7019
  trackMultiNodesAction({
6997
7020
  type: "schema_diff",
6998
7021
  selected: "none"
@@ -7328,6 +7351,7 @@ const QueryPage = () => {
7328
7351
  if (envInfo?.adapterType === "sqlmesh" && _sqlQuery === defaultSqlQuery) sqlQuery = `select * from db.mymodel`;
7329
7352
  if (featureToggles.mode === "read only") sqlQuery = `--- Would like to do query here? Book a demo with us at ${RECCE_SUPPORT_CALENDAR_URL}\n${sqlQuery}`;
7330
7353
  const { showRunId } = useRecceActionContext();
7354
+ const { apiClient } = useApiConfig();
7331
7355
  const queryFn = async (type) => {
7332
7356
  function queryFactory(type$1) {
7333
7357
  switch (type$1) {
@@ -7345,9 +7369,9 @@ const QueryPage = () => {
7345
7369
  params.primary_keys = primaryKeys;
7346
7370
  if (isCustomQueries) params.base_sql_template = baseSqlQuery;
7347
7371
  }
7348
- const { run_id } = await runFn(params, options);
7372
+ const { run_id } = await runFn(params, options, apiClient);
7349
7373
  showRunId(run_id);
7350
- return await waitRun(run_id);
7374
+ return await waitRun(run_id, void 0, apiClient);
7351
7375
  };
7352
7376
  const { mutate: runQuery, isPending } = useMutation({ mutationFn: queryFn });
7353
7377
  const currentSchema = useMemo(() => {
@@ -7502,9 +7526,10 @@ const ChecklistItem = ({ check, selected, onSelect, onMarkAsApproved }) => {
7502
7526
  const isDark = useTheme().palette.mode === "dark";
7503
7527
  const { featureToggles } = useRecceInstanceContext();
7504
7528
  const queryClient = useQueryClient();
7529
+ const { apiClient } = useApiConfig();
7505
7530
  const checkId = check.check_id;
7506
7531
  const { mutate } = useMutation({
7507
- mutationFn: (check$1) => updateCheck(checkId, check$1),
7532
+ mutationFn: (check$1) => updateCheck(checkId, check$1, apiClient),
7508
7533
  onSuccess: async () => {
7509
7534
  await queryClient.invalidateQueries({ queryKey: cacheKeys.check(checkId) });
7510
7535
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
@@ -7576,8 +7601,9 @@ const CheckList = ({ checks, selectedItem, onCheckSelected, onChecksReordered })
7576
7601
  const [open, setOpen] = useState(false);
7577
7602
  const [pendingApprovalCheckId, setPendingApprovalCheckId] = useState(null);
7578
7603
  const queryClient = useQueryClient();
7604
+ const { apiClient } = useApiConfig();
7579
7605
  const { mutate: markCheckedByID } = useMutation({
7580
- mutationFn: (checkId) => updateCheck(checkId, { is_checked: true }),
7606
+ mutationFn: (checkId) => updateCheck(checkId, { is_checked: true }, apiClient),
7581
7607
  onSuccess: async (_$1, checkId) => {
7582
7608
  await queryClient.invalidateQueries({ queryKey: cacheKeys.check(checkId) });
7583
7609
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
@@ -7725,20 +7751,22 @@ const CheckList = ({ checks, selectedItem, onCheckSelected, onChecksReordered })
7725
7751
  * List all events for a check in chronological order.
7726
7752
  *
7727
7753
  * @param checkId - The check ID
7754
+ * @param client - Optional axios instance for API configuration
7728
7755
  * @returns Promise resolving to array of CheckEvent objects
7729
7756
  */
7730
- async function listCheckEvents(checkId) {
7731
- return (await axiosClient.get(`/api/checks/${checkId}/events`)).data;
7757
+ async function listCheckEvents(checkId, client = axiosClient) {
7758
+ return (await client.get(`/api/checks/${checkId}/events`)).data;
7732
7759
  }
7733
7760
  /**
7734
7761
  * Create a new comment on a check.
7735
7762
  *
7736
7763
  * @param checkId - The check ID
7737
7764
  * @param content - The comment content (plain text for now, markdown later)
7765
+ * @param client - Optional axios instance for API configuration
7738
7766
  * @returns Promise resolving to the created CheckEvent
7739
7767
  */
7740
- async function createComment(checkId, content) {
7741
- return (await axiosClient.post(`/api/checks/${checkId}/events`, { content })).data;
7768
+ async function createComment(checkId, content, client = axiosClient) {
7769
+ return (await client.post(`/api/checks/${checkId}/events`, { content })).data;
7742
7770
  }
7743
7771
  /**
7744
7772
  * Update an existing comment.
@@ -7747,10 +7775,11 @@ async function createComment(checkId, content) {
7747
7775
  * @param checkId - The check ID
7748
7776
  * @param eventId - The event ID of the comment to update
7749
7777
  * @param content - The new comment content
7778
+ * @param client - Optional axios instance for API configuration
7750
7779
  * @returns Promise resolving to the updated CheckEvent
7751
7780
  */
7752
- async function updateComment(checkId, eventId, content) {
7753
- return (await axiosClient.patch(`/api/checks/${checkId}/events/${eventId}`, { content })).data;
7781
+ async function updateComment(checkId, eventId, content, client = axiosClient) {
7782
+ return (await client.patch(`/api/checks/${checkId}/events/${eventId}`, { content })).data;
7754
7783
  }
7755
7784
  /**
7756
7785
  * Delete a comment (soft delete).
@@ -7758,10 +7787,11 @@ async function updateComment(checkId, eventId, content) {
7758
7787
  *
7759
7788
  * @param checkId - The check ID
7760
7789
  * @param eventId - The event ID of the comment to delete
7790
+ * @param client - Optional axios instance for API configuration
7761
7791
  * @returns Promise resolving when deletion is complete
7762
7792
  */
7763
- async function deleteComment(checkId, eventId) {
7764
- await axiosClient.delete(`/api/checks/${checkId}/events/${eventId}`);
7793
+ async function deleteComment(checkId, eventId, client = axiosClient) {
7794
+ await client.delete(`/api/checks/${checkId}/events/${eventId}`);
7765
7795
  }
7766
7796
  /**
7767
7797
  * Get the appropriate icon name for an event type.
@@ -7791,27 +7821,28 @@ const POLLING_INTERVAL = 1e4;
7791
7821
  function useCheckEvents(checkId, options = {}) {
7792
7822
  const { enabled = true } = options;
7793
7823
  const queryClient = useQueryClient();
7824
+ const { apiClient } = useApiConfig();
7794
7825
  const { data: events, isLoading, error, refetch } = useQuery({
7795
7826
  queryKey: cacheKeys.checkEvents(checkId),
7796
- queryFn: () => listCheckEvents(checkId),
7827
+ queryFn: () => listCheckEvents(checkId, apiClient),
7797
7828
  enabled,
7798
7829
  refetchInterval: POLLING_INTERVAL,
7799
7830
  refetchIntervalInBackground: false
7800
7831
  });
7801
7832
  const createCommentMutation = useMutation({
7802
- mutationFn: (content) => createComment(checkId, content),
7833
+ mutationFn: (content) => createComment(checkId, content, apiClient),
7803
7834
  onSuccess: async () => {
7804
7835
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checkEvents(checkId) });
7805
7836
  }
7806
7837
  });
7807
7838
  const updateCommentMutation = useMutation({
7808
- mutationFn: ({ eventId, content }) => updateComment(checkId, eventId, content),
7839
+ mutationFn: ({ eventId, content }) => updateComment(checkId, eventId, content, apiClient),
7809
7840
  onSuccess: async () => {
7810
7841
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checkEvents(checkId) });
7811
7842
  }
7812
7843
  });
7813
7844
  const deleteCommentMutation = useMutation({
7814
- mutationFn: (eventId) => deleteComment(checkId, eventId),
7845
+ mutationFn: (eventId) => deleteComment(checkId, eventId, apiClient),
7815
7846
  onSuccess: async () => {
7816
7847
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checkEvents(checkId) });
7817
7848
  }
@@ -8668,10 +8699,11 @@ function TimelineEvent({ event, currentUserId, onEdit, onDelete }) {
8668
8699
  */
8669
8700
  function CheckTimeline({ checkId }) {
8670
8701
  const isDark = useTheme().palette.mode === "dark";
8702
+ const { apiClient } = useApiConfig();
8671
8703
  const { events, isLoading, error, createComment: createComment$1, isCreatingComment, updateComment: updateComment$1, deleteComment: deleteComment$1 } = useCheckEvents(checkId);
8672
8704
  const { data: currentUser } = useQuery({
8673
8705
  queryKey: cacheKeys.user(),
8674
- queryFn: fetchUser,
8706
+ queryFn: () => fetchUser(apiClient),
8675
8707
  retry: false
8676
8708
  });
8677
8709
  const handleCreateComment = (content) => {
@@ -9056,6 +9088,7 @@ const NodelistItem = ({ node, selected, onSelect, schemaChanged, isDark }) => {
9056
9088
  };
9057
9089
  function PrivateSchemaDiffView({ check }, ref) {
9058
9090
  const isDark = useTheme().palette.mode === "dark";
9091
+ const { apiClient } = useApiConfig();
9059
9092
  const { lineageGraph } = useLineageGraphContext();
9060
9093
  const params = check.params;
9061
9094
  const { isLoading, error, data } = useQuery({
@@ -9065,7 +9098,7 @@ function PrivateSchemaDiffView({ check }, ref) {
9065
9098
  exclude: params.exclude,
9066
9099
  packages: params.packages,
9067
9100
  view_mode: params.view_mode
9068
- }),
9101
+ }, apiClient),
9069
9102
  refetchOnMount: true,
9070
9103
  enabled: !params.node_id
9071
9104
  });
@@ -9177,6 +9210,7 @@ const SchemaDiffView = forwardRef(PrivateSchemaDiffView);
9177
9210
  function CheckDetail({ checkId, refreshCheckList }) {
9178
9211
  const theme = useTheme();
9179
9212
  const isDark = theme.palette.mode === "dark";
9213
+ const { apiClient } = useApiConfig();
9180
9214
  const { featureToggles, sessionId } = useRecceInstanceContext();
9181
9215
  const { setLatestSelectedCheckId } = useRecceCheckContext();
9182
9216
  const { cloudMode } = useLineageGraphContext();
@@ -9192,7 +9226,7 @@ function CheckDetail({ checkId, refreshCheckList }) {
9192
9226
  const menuOpen = Boolean(menuAnchorEl);
9193
9227
  const { isLoading, error, data: check } = useQuery({
9194
9228
  queryKey: cacheKeys.check(checkId),
9195
- queryFn: async () => getCheck(checkId),
9229
+ queryFn: async () => getCheck(checkId, apiClient),
9196
9230
  refetchOnMount: true
9197
9231
  });
9198
9232
  const trackedRunId = submittedRunId ?? check?.last_run?.run_id;
@@ -9204,14 +9238,14 @@ function CheckDetail({ checkId, refreshCheckList }) {
9204
9238
  const isPresetCheck = check?.is_preset ?? false;
9205
9239
  const lineageViewRef = useRef(null);
9206
9240
  const { mutate } = useMutation({
9207
- mutationFn: (check$1) => updateCheck(checkId, check$1),
9241
+ mutationFn: (check$1) => updateCheck(checkId, check$1, apiClient),
9208
9242
  onSuccess: async () => {
9209
9243
  await queryClient.invalidateQueries({ queryKey: cacheKeys.check(checkId) });
9210
9244
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
9211
9245
  }
9212
9246
  });
9213
9247
  const { mutate: handleDelete } = useMutation({
9214
- mutationFn: () => deleteCheck(checkId),
9248
+ mutationFn: () => deleteCheck(checkId, apiClient),
9215
9249
  onSuccess: async () => {
9216
9250
  setLatestSelectedCheckId("");
9217
9251
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
@@ -9221,7 +9255,7 @@ function CheckDetail({ checkId, refreshCheckList }) {
9221
9255
  const { mutate: handleMarkAsPresetCheck, isPending: isMarkingAsPreset } = useMutation({
9222
9256
  mutationFn: async () => {
9223
9257
  if (!check) throw new Error("Check not found");
9224
- return await markAsPresetCheck(checkId);
9258
+ return await markAsPresetCheck(checkId, apiClient);
9225
9259
  },
9226
9260
  onSuccess: async () => {
9227
9261
  successToast("Check marked as preset successfully");
@@ -9233,20 +9267,21 @@ function CheckDetail({ checkId, refreshCheckList }) {
9233
9267
  });
9234
9268
  const handleRerun = useCallback(async () => {
9235
9269
  if (!check?.type) return;
9236
- setSubmittedRunId((await submitRunFromCheck(checkId, { nowait: true })).run_id);
9270
+ setSubmittedRunId((await submitRunFromCheck(checkId, { nowait: true }, apiClient)).run_id);
9237
9271
  await queryClient.invalidateQueries({ queryKey: cacheKeys.check(checkId) });
9238
9272
  if (refreshCheckList) refreshCheckList();
9239
9273
  }, [
9240
9274
  check,
9241
9275
  checkId,
9242
9276
  queryClient,
9243
- refreshCheckList
9277
+ refreshCheckList,
9278
+ apiClient
9244
9279
  ]);
9245
9280
  const handleCancel = useCallback(async () => {
9246
9281
  setAborting(true);
9247
9282
  if (!trackedRunId) return;
9248
- return await cancelRun(trackedRunId);
9249
- }, [trackedRunId]);
9283
+ return await cancelRun(trackedRunId, apiClient);
9284
+ }, [trackedRunId, apiClient]);
9250
9285
  const handleCopy = async () => {
9251
9286
  if (!check) return;
9252
9287
  const markdown = buildMarkdown(check);
@@ -9751,8 +9786,9 @@ function buildBody(check) {
9751
9786
  const CheckEmptyState = () => {
9752
9787
  const queryClient = useQueryClient();
9753
9788
  const [, setLocation] = useAppLocation();
9789
+ const { apiClient } = useApiConfig();
9754
9790
  const { mutate: createSchemaCheck, isPending } = useMutation({
9755
- mutationFn: () => createSchemaDiffCheck({ select: "state:modified" }),
9791
+ mutationFn: () => createSchemaDiffCheck({ select: "state:modified" }, apiClient),
9756
9792
  onSuccess: async (check) => {
9757
9793
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
9758
9794
  setLocation(`/checks/?id=${check.check_id}`);
@@ -9835,9 +9871,10 @@ const CheckEmptyState = () => {
9835
9871
  //#endregion
9836
9872
  //#region recce-source/js/src/components/run/RunPage.tsx
9837
9873
  const RunPage = ({ runId }) => {
9874
+ const { apiClient } = useApiConfig();
9838
9875
  const { error, data: run } = useQuery({
9839
9876
  queryKey: cacheKeys.run(runId),
9840
- queryFn: async () => waitRun(runId)
9877
+ queryFn: async () => waitRun(runId, void 0, apiClient)
9841
9878
  });
9842
9879
  let RunResultView;
9843
9880
  if (run && runTypeHasRef(run.type)) RunResultView = findByRunType(run.type).RunResultView;
@@ -9852,10 +9889,11 @@ const RunPage = ({ runId }) => {
9852
9889
  //#region recce-source/js/src/components/run/RunList.tsx
9853
9890
  const RunListItem = ({ run, isSelected, onSelectRun, onAddToChecklist, onGoToCheck }) => {
9854
9891
  const { featureToggles } = useRecceInstanceContext();
9892
+ const { apiClient } = useApiConfig();
9855
9893
  const { data: fetchedRun } = useQuery({
9856
9894
  queryKey: cacheKeys.run(run.run_id),
9857
9895
  queryFn: async () => {
9858
- return await waitRun(run.run_id);
9896
+ return await waitRun(run.run_id, void 0, apiClient);
9859
9897
  },
9860
9898
  enabled: run.status === "running",
9861
9899
  retry: false
@@ -9959,10 +9997,11 @@ const DateSegmentItem = ({ runAt }) => {
9959
9997
  };
9960
9998
  const RunList = () => {
9961
9999
  const { closeHistory } = useRecceActionContext();
10000
+ const { apiClient } = useApiConfig();
9962
10001
  const { data: runs, isLoading } = useQuery({
9963
10002
  queryKey: cacheKeys.runs(),
9964
10003
  queryFn: async () => {
9965
- return await listRuns();
10004
+ return await listRuns(apiClient);
9966
10005
  },
9967
10006
  retry: false
9968
10007
  });
@@ -10026,6 +10065,7 @@ const RunList = () => {
10026
10065
  function DateDividedRunHistoryItem({ run, previousDate }) {
10027
10066
  const [, setLocation] = useAppLocation();
10028
10067
  const queryClient = useQueryClient();
10068
+ const { apiClient } = useApiConfig();
10029
10069
  const { showRunId, runId } = useRecceActionContext();
10030
10070
  const currentDate = new Date(run.run_at).toDateString();
10031
10071
  const shouldRenderDateSegment = previousDate != null && previousDate !== currentDate;
@@ -10034,10 +10074,14 @@ function DateDividedRunHistoryItem({ run, previousDate }) {
10034
10074
  showRunId(runId$1, false);
10035
10075
  };
10036
10076
  const handleAddToChecklist = useCallback(async (clickedRunId) => {
10037
- const check = await createCheckByRun(clickedRunId);
10077
+ const check = await createCheckByRun(clickedRunId, void 0, apiClient);
10038
10078
  await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });
10039
10079
  setLocation(`/checks/?id=${check.check_id}`);
10040
- }, [setLocation, queryClient]);
10080
+ }, [
10081
+ setLocation,
10082
+ queryClient,
10083
+ apiClient
10084
+ ]);
10041
10085
  const handleGoToCheck = useCallback((checkId) => {
10042
10086
  trackHistoryAction({ name: "go_to_check" });
10043
10087
  setLocation(`/checks/?id=${checkId}`);
@@ -10405,9 +10449,10 @@ function SummaryView() {
10405
10449
  //#endregion
10406
10450
  //#region recce-source/js/src/components/app/AvatarDropdown.tsx
10407
10451
  function AvatarDropdown() {
10452
+ const { apiClient } = useApiConfig();
10408
10453
  const { data: user, isLoading, error } = useQuery({
10409
10454
  queryKey: cacheKeys.user(),
10410
- queryFn: fetchUser,
10455
+ queryFn: () => fetchUser(apiClient),
10411
10456
  retry: false
10412
10457
  });
10413
10458
  const { data: avatarUrl } = useQuery({
@@ -10556,6 +10601,142 @@ function IdleTimeoutBadge() {
10556
10601
  });
10557
10602
  }
10558
10603
 
10604
+ //#endregion
10605
+ //#region recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx
10606
+ /**
10607
+ * Display Mode Toggle - switches between light and dark themes
10608
+ *
10609
+ * Uses next-themes to persist the user's preference.
10610
+ * Default is light theme, with future support for system preference.
10611
+ */
10612
+ function DisplayModeToggle() {
10613
+ const { setTheme, resolvedTheme } = useTheme$1();
10614
+ const [mounted, setMounted] = useState(false);
10615
+ useEffect(() => {
10616
+ setMounted(true);
10617
+ }, []);
10618
+ const toggleTheme = () => {
10619
+ setTheme(resolvedTheme === "dark" ? "light" : "dark");
10620
+ };
10621
+ if (!mounted) return /* @__PURE__ */ jsx(IconButton, {
10622
+ size: "small",
10623
+ sx: {
10624
+ color: "rgba(255, 255, 255, 0.8)",
10625
+ "&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
10626
+ },
10627
+ disabled: true,
10628
+ children: /* @__PURE__ */ jsx(PiSun, { style: {
10629
+ width: 18,
10630
+ height: 18
10631
+ } })
10632
+ });
10633
+ const isDark = resolvedTheme === "dark";
10634
+ return /* @__PURE__ */ jsx(MuiTooltip, {
10635
+ title: isDark ? "Switch to light mode" : "Switch to dark mode",
10636
+ children: /* @__PURE__ */ jsx(IconButton, {
10637
+ size: "small",
10638
+ onClick: toggleTheme,
10639
+ sx: {
10640
+ color: "rgba(255, 255, 255, 0.8)",
10641
+ "&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
10642
+ },
10643
+ "aria-label": isDark ? "Switch to light mode" : "Switch to dark mode",
10644
+ children: isDark ? /* @__PURE__ */ jsx(PiSun, { style: {
10645
+ width: 18,
10646
+ height: 18
10647
+ } }) : /* @__PURE__ */ jsx(PiMoon, { style: {
10648
+ width: 18,
10649
+ height: 18
10650
+ } })
10651
+ })
10652
+ });
10653
+ }
10654
+
10655
+ //#endregion
10656
+ //#region recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx
10657
+ function RecceVersionBadge() {
10658
+ const { version, latestVersion } = useVersionNumber();
10659
+ const versionFormatRegex = useMemo(() => /* @__PURE__ */ new RegExp("^\\d+\\.\\d+\\.\\d+$"), []);
10660
+ useEffect(() => {
10661
+ if (versionFormatRegex.test(version) && version !== latestVersion) {
10662
+ const storageKey = "recce-update-toast-shown";
10663
+ if (sessionStorage.getItem(storageKey)) return;
10664
+ setTimeout(() => {
10665
+ toaster.create({
10666
+ id: "recce-update-available",
10667
+ title: "Update available",
10668
+ description: /* @__PURE__ */ jsxs("span", { children: [
10669
+ "A new version of Recce (v",
10670
+ latestVersion,
10671
+ ") is available.",
10672
+ /* @__PURE__ */ jsx("br", {}),
10673
+ "Please run",
10674
+ " ",
10675
+ /* @__PURE__ */ jsx(Box, {
10676
+ component: "code",
10677
+ sx: {
10678
+ bgcolor: "grey.200",
10679
+ px: .5,
10680
+ py: .25,
10681
+ borderRadius: .5,
10682
+ fontFamily: "monospace",
10683
+ fontSize: "0.875em"
10684
+ },
10685
+ children: "pip install --upgrade recce"
10686
+ }),
10687
+ " ",
10688
+ "to update Recce.",
10689
+ /* @__PURE__ */ jsx("br", {}),
10690
+ /* @__PURE__ */ jsx(Link, {
10691
+ sx: {
10692
+ color: "primary.main",
10693
+ fontWeight: "bold",
10694
+ "&:hover": { textDecoration: "underline" }
10695
+ },
10696
+ href: `https://github.com/DataRecce/recce/releases/tag/v${latestVersion}`,
10697
+ target: "_blank",
10698
+ children: "Click here to view the detail of latest release"
10699
+ })
10700
+ ] }),
10701
+ duration: 60 * 1e3,
10702
+ closable: true
10703
+ });
10704
+ sessionStorage.setItem(storageKey, "true");
10705
+ }, 0);
10706
+ }
10707
+ }, [
10708
+ version,
10709
+ latestVersion,
10710
+ versionFormatRegex
10711
+ ]);
10712
+ if (!versionFormatRegex.test(version)) return /* @__PURE__ */ jsx(Typography, {
10713
+ component: "span",
10714
+ sx: {
10715
+ fontSize: "sm",
10716
+ color: "rgba(255,255,255,0.8)",
10717
+ textTransform: "uppercase",
10718
+ borderWidth: 1,
10719
+ px: 1,
10720
+ borderRadius: .75
10721
+ },
10722
+ children: version
10723
+ });
10724
+ return /* @__PURE__ */ jsx(Link, {
10725
+ href: `https://github.com/DataRecce/recce/releases/tag/v${version}`,
10726
+ sx: {
10727
+ "&:hover": { textDecoration: "none" },
10728
+ fontSize: "sm",
10729
+ color: "rgba(255,255,255,0.8)",
10730
+ textTransform: "uppercase",
10731
+ borderWidth: 1,
10732
+ px: 1,
10733
+ borderRadius: .75
10734
+ },
10735
+ target: "_blank",
10736
+ children: version
10737
+ });
10738
+ }
10739
+
10559
10740
  //#endregion
10560
10741
  //#region recce-source/js/app/(mainComponents)/TopBar.tsx
10561
10742
  function LinkIcon({ icon: IconComponent, href, sx, ...props }) {
@@ -10808,6 +10989,7 @@ const useClosePrompt = (prompt) => {
10808
10989
  const Filename = () => {
10809
10990
  const { featureToggles } = useRecceInstanceContext();
10810
10991
  const { fileName, cloudMode, isDemoSite, envInfo } = useLineageGraphContext();
10992
+ const { apiClient } = useApiConfig();
10811
10993
  const [modalOpen, setModalOpen] = useState(false);
10812
10994
  const [overwriteOpen, setOverwriteOpen] = useState(false);
10813
10995
  const isStateless = !fileName && !cloudMode && !isDemoSite;
@@ -10834,11 +11016,11 @@ const Filename = () => {
10834
11016
  if (method === "save") await saveAs$1({
10835
11017
  filename: newFileName,
10836
11018
  overwrite: overwrite ?? bypassOverwrite
10837
- });
11019
+ }, apiClient);
10838
11020
  else await rename({
10839
11021
  filename: newFileName,
10840
11022
  overwrite: overwrite ?? bypassOverwrite
10841
- });
11023
+ }, apiClient);
10842
11024
  toastSuccess(method === "save" ? "Save file successfully" : "Rename file successfully");
10843
11025
  await queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });
10844
11026
  if (bypass) localStorage.setItem(localStorageKeys.bypassSaveOverwrite, "true");
@@ -11062,9 +11244,10 @@ const Filename = () => {
11062
11244
  //#region recce-source/js/src/components/app/StateExporter.tsx
11063
11245
  function StateExporter() {
11064
11246
  const { featureToggles } = useRecceInstanceContext();
11247
+ const { apiClient } = useApiConfig();
11065
11248
  const handleExport = async () => {
11066
11249
  try {
11067
- const jsonData = await exportState();
11250
+ const jsonData = await exportState(apiClient);
11068
11251
  const jsonString = JSON.stringify(jsonData, null, 2);
11069
11252
  saveAs(new Blob([jsonString], { type: "application/json" }), `recce-state-${format(/* @__PURE__ */ new Date(), "yyyy-MM-dd-HH-mm-ss")}.json`);
11070
11253
  } catch (error) {
@@ -11231,6 +11414,7 @@ function StateSpinner() {
11231
11414
  function StateSynchronizer() {
11232
11415
  const [isSyncing, setSyncing] = useState(false);
11233
11416
  const queryClient = useQueryClient();
11417
+ const { apiClient } = useApiConfig();
11234
11418
  const [location, setLocation] = useAppLocation();
11235
11419
  const [open, setOpen] = useState(false);
11236
11420
  const [syncOption, setSyncOption] = useState("");
@@ -11239,12 +11423,12 @@ function StateSynchronizer() {
11239
11423
  const handleSync = useCallback(async (input) => {
11240
11424
  setOpen(false);
11241
11425
  setSyncing(true);
11242
- if ((await syncState(input)).status === "conflict") {
11426
+ if ((await syncState(input, apiClient)).status === "conflict") {
11243
11427
  setOpen(true);
11244
11428
  setSyncing(false);
11245
11429
  return;
11246
11430
  }
11247
- while (await isStateSyncing()) await new Promise((resolve) => setTimeout(resolve, 1e3));
11431
+ while (await isStateSyncing(apiClient)) await new Promise((resolve) => setTimeout(resolve, 1e3));
11248
11432
  toaster.create({
11249
11433
  description: "Sync Completed",
11250
11434
  type: "success",
@@ -11260,7 +11444,8 @@ function StateSynchronizer() {
11260
11444
  }, [
11261
11445
  queryClient,
11262
11446
  location,
11263
- setLocation
11447
+ setLocation,
11448
+ apiClient
11264
11449
  ]);
11265
11450
  if (isSyncing) return /* @__PURE__ */ jsx(StateSpinner, {});
11266
11451
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(MuiTooltip, {
@@ -11546,141 +11731,5 @@ function NavBar() {
11546
11731
  }
11547
11732
 
11548
11733
  //#endregion
11549
- //#region recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx
11550
- /**
11551
- * Display Mode Toggle - switches between light and dark themes
11552
- *
11553
- * Uses next-themes to persist the user's preference.
11554
- * Default is light theme, with future support for system preference.
11555
- */
11556
- function DisplayModeToggle$1() {
11557
- const { setTheme, resolvedTheme } = useTheme$1();
11558
- const [mounted, setMounted] = useState(false);
11559
- useEffect(() => {
11560
- setMounted(true);
11561
- }, []);
11562
- const toggleTheme = () => {
11563
- setTheme(resolvedTheme === "dark" ? "light" : "dark");
11564
- };
11565
- if (!mounted) return /* @__PURE__ */ jsx(IconButton, {
11566
- size: "small",
11567
- sx: {
11568
- color: "rgba(255, 255, 255, 0.8)",
11569
- "&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
11570
- },
11571
- disabled: true,
11572
- children: /* @__PURE__ */ jsx(PiSun, { style: {
11573
- width: 18,
11574
- height: 18
11575
- } })
11576
- });
11577
- const isDark = resolvedTheme === "dark";
11578
- return /* @__PURE__ */ jsx(MuiTooltip, {
11579
- title: isDark ? "Switch to light mode" : "Switch to dark mode",
11580
- children: /* @__PURE__ */ jsx(IconButton, {
11581
- size: "small",
11582
- onClick: toggleTheme,
11583
- sx: {
11584
- color: "rgba(255, 255, 255, 0.8)",
11585
- "&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
11586
- },
11587
- "aria-label": isDark ? "Switch to light mode" : "Switch to dark mode",
11588
- children: isDark ? /* @__PURE__ */ jsx(PiSun, { style: {
11589
- width: 18,
11590
- height: 18
11591
- } }) : /* @__PURE__ */ jsx(PiMoon, { style: {
11592
- width: 18,
11593
- height: 18
11594
- } })
11595
- })
11596
- });
11597
- }
11598
-
11599
- //#endregion
11600
- //#region recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx
11601
- function RecceVersionBadge$1() {
11602
- const { version, latestVersion } = useVersionNumber();
11603
- const versionFormatRegex = useMemo(() => /* @__PURE__ */ new RegExp("^\\d+\\.\\d+\\.\\d+$"), []);
11604
- useEffect(() => {
11605
- if (versionFormatRegex.test(version) && version !== latestVersion) {
11606
- const storageKey = "recce-update-toast-shown";
11607
- if (sessionStorage.getItem(storageKey)) return;
11608
- setTimeout(() => {
11609
- toaster.create({
11610
- id: "recce-update-available",
11611
- title: "Update available",
11612
- description: /* @__PURE__ */ jsxs("span", { children: [
11613
- "A new version of Recce (v",
11614
- latestVersion,
11615
- ") is available.",
11616
- /* @__PURE__ */ jsx("br", {}),
11617
- "Please run",
11618
- " ",
11619
- /* @__PURE__ */ jsx(Box, {
11620
- component: "code",
11621
- sx: {
11622
- bgcolor: "grey.200",
11623
- px: .5,
11624
- py: .25,
11625
- borderRadius: .5,
11626
- fontFamily: "monospace",
11627
- fontSize: "0.875em"
11628
- },
11629
- children: "pip install --upgrade recce"
11630
- }),
11631
- " ",
11632
- "to update Recce.",
11633
- /* @__PURE__ */ jsx("br", {}),
11634
- /* @__PURE__ */ jsx(Link, {
11635
- sx: {
11636
- color: "primary.main",
11637
- fontWeight: "bold",
11638
- "&:hover": { textDecoration: "underline" }
11639
- },
11640
- href: `https://github.com/DataRecce/recce/releases/tag/v${latestVersion}`,
11641
- target: "_blank",
11642
- children: "Click here to view the detail of latest release"
11643
- })
11644
- ] }),
11645
- duration: 60 * 1e3,
11646
- closable: true
11647
- });
11648
- sessionStorage.setItem(storageKey, "true");
11649
- }, 0);
11650
- }
11651
- }, [
11652
- version,
11653
- latestVersion,
11654
- versionFormatRegex
11655
- ]);
11656
- if (!versionFormatRegex.test(version)) return /* @__PURE__ */ jsx(Typography, {
11657
- component: "span",
11658
- sx: {
11659
- fontSize: "sm",
11660
- color: "rgba(255,255,255,0.8)",
11661
- textTransform: "uppercase",
11662
- borderWidth: 1,
11663
- px: 1,
11664
- borderRadius: .75
11665
- },
11666
- children: version
11667
- });
11668
- return /* @__PURE__ */ jsx(Link, {
11669
- href: `https://github.com/DataRecce/recce/releases/tag/v${version}`,
11670
- sx: {
11671
- "&:hover": { textDecoration: "none" },
11672
- fontSize: "sm",
11673
- color: "rgba(255,255,255,0.8)",
11674
- textTransform: "uppercase",
11675
- borderWidth: 1,
11676
- px: 1,
11677
- borderRadius: .75
11678
- },
11679
- target: "_blank",
11680
- children: version
11681
- });
11682
- }
11683
-
11684
- //#endregion
11685
- export { NodeSqlView as A, GraphEdge as B, NodeView as C, SqlEditor_default as D, RunStatusAndDate as E, HistoryToggle as F, MuiProvider as G, HSplit as H, GraphNode as I, mui_provider_default as K, ModelRowCount as L, CodeEditor_default as M, SchemaView as N, QueryForm as O, LineageViewTopBar as P, ResourceTypeTag as R, SetupConnectionBanner as S, RunView as T, VSplit as U, GraphColumnNode as V, ErrorBoundary$1 as W, CheckList as _, IdleTimeoutBadge as a, LineagePage as b, ChangeSummary as c, CheckEmptyState as d, CheckDetail as f, CheckBreadcrumb as g, CheckDescription as h, TopBar as i, DiffEditor_default as j, EnvInfo as k, RunList as l, LineageDiffView as m, DisplayModeToggle$1 as n, SummaryView as o, SchemaDiffView as p, NavBar as r, SchemaSummary as s, RecceVersionBadge$1 as t, RunPage as u, QueryPage as v, RunResultPane as w, LineageView as x, SetupConnectionGuide as y, RowCountDiffTag as z };
11686
- //# sourceMappingURL=components-CfY72Lq2.mjs.map
11734
+ export { NodeSqlView as A, GraphEdge as B, NodeView as C, SqlEditor_default as D, RunStatusAndDate as E, HistoryToggle as F, MuiProvider as G, HSplit as H, GraphNode as I, mui_provider_default as K, ModelRowCount as L, CodeEditor_default as M, SchemaView as N, QueryForm as O, LineageViewTopBar as P, ResourceTypeTag as R, SetupConnectionBanner as S, RunView as T, VSplit as U, GraphColumnNode as V, ErrorBoundary$1 as W, CheckList as _, IdleTimeoutBadge as a, LineagePage as b, ChangeSummary as c, CheckEmptyState as d, CheckDetail as f, CheckBreadcrumb as g, CheckDescription as h, DisplayModeToggle as i, DiffEditor_default as j, EnvInfo as k, RunList as l, LineageDiffView as m, TopBar as n, SummaryView as o, SchemaDiffView as p, RecceVersionBadge as r, SchemaSummary as s, NavBar as t, RunPage as u, QueryPage as v, RunResultPane as w, LineageView as x, SetupConnectionGuide as y, RowCountDiffTag as z };
11735
+ //# sourceMappingURL=components-DoLZeY_e.mjs.map