@burdenoff/microfe-adaptercloud 2026.706.1 → 2026.706.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adaptercloud/AdapterCloudRoutes.js +5 -1
- package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -1
- package/dist/adaptercloud/components/ConfirmDialog.js +27 -0
- package/dist/adaptercloud/components/ConfirmDialog.js.map +1 -0
- package/dist/adaptercloud/components/DataState.js +1 -1
- package/dist/adaptercloud/components/DataState.js.map +1 -1
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js +50 -31
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
- package/dist/adaptercloud/pages/OverviewPage.js +159 -156
- package/dist/adaptercloud/pages/OverviewPage.js.map +1 -1
- package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js +102 -89
- package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/adapters/AdapterFormPage.js +2 -0
- package/dist/adaptercloud/pages/adapters/AdapterFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/adapters/AdaptersListPage.js +2 -0
- package/dist/adaptercloud/pages/adapters/AdaptersListPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +141 -124
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionFormPage.js +2 -0
- package/dist/adaptercloud/pages/connections/ConnectionFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionsListPage.js +1 -0
- package/dist/adaptercloud/pages/connections/ConnectionsListPage.js.map +1 -1
- package/dist/adaptercloud/pages/costs/CostsPage.js +112 -87
- package/dist/adaptercloud/pages/costs/CostsPage.js.map +1 -1
- package/dist/adaptercloud/pages/drift/DriftListPage.js +81 -59
- package/dist/adaptercloud/pages/drift/DriftListPage.js.map +1 -1
- package/dist/adaptercloud/pages/policies/PoliciesListPage.js +2 -0
- package/dist/adaptercloud/pages/policies/PoliciesListPage.js.map +1 -1
- package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +109 -91
- package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/policies/PolicyFormPage.js +211 -184
- package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +153 -111
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/resources/ResourcesListPage.js +111 -83
- package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -1
- package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js +108 -86
- package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js.map +1 -1
- package/dist/adaptercloud/pages/violations/ViolationsListPage.js +11 -3
- package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
|
6
6
|
//#region src/adaptercloud/AdapterCloudRoutes.tsx
|
|
7
7
|
var u = r(() => import("./pages/adapters/AdaptersListPage.js").then((e) => ({ default: e.AdaptersListPage }))), d = r(() => import("./pages/adapters/AdapterDetailPage.js").then((e) => ({ default: e.AdapterDetailPage }))), f = r(() => import("./pages/adapters/AdapterFormPage.js").then((e) => ({ default: e.AdapterFormPage }))), p = r(() => import("./pages/connections/ConnectionsListPage.js").then((e) => ({ default: e.ConnectionsListPage }))), m = r(() => import("./pages/connections/ConnectionDetailPage.js").then((e) => ({ default: e.ConnectionDetailPage }))), h = r(() => import("./pages/connections/ConnectionFormPage.js").then((e) => ({ default: e.ConnectionFormPage }))), g = r(() => import("./pages/resources/ResourcesListPage.js").then((e) => ({ default: e.ResourcesListPage }))), _ = r(() => import("./pages/resources/ResourceDetailPage.js").then((e) => ({ default: e.ResourceDetailPage }))), v = r(() => import("./pages/policies/PoliciesListPage.js").then((e) => ({ default: e.PoliciesListPage }))), y = r(() => import("./pages/policies/PolicyDetailPage.js").then((e) => ({ default: e.PolicyDetailPage }))), b = r(() => import("./pages/policies/PolicyFormPage.js").then((e) => ({ default: e.PolicyFormPage }))), x = r(() => import("./pages/violations/ViolationsListPage.js").then((e) => ({ default: e.ViolationsListPage }))), S = r(() => import("./pages/drift/DriftListPage.js").then((e) => ({ default: e.DriftListPage }))), C = r(() => import("./pages/sync-runs/SyncRunsListPage.js").then((e) => ({ default: e.SyncRunsListPage }))), w = r(() => import("./pages/costs/CostsPage.js").then((e) => ({ default: e.CostsPage }))), T = () => /* @__PURE__ */ c("div", {
|
|
8
8
|
className: "flex min-h-[400px] items-center justify-center",
|
|
9
|
-
children: /* @__PURE__ */ c("div", { className: "h-8 w-8 animate-spin rounded-full border-b-2 border-
|
|
9
|
+
children: /* @__PURE__ */ c("div", { className: "h-8 w-8 animate-spin rounded-full border-b-2 border-accent-blue" })
|
|
10
10
|
}), E = () => {
|
|
11
11
|
let { basePath: r, isStandalone: E } = e(), D = s(), O = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
|
|
12
12
|
return O && !E && !(D.pathname === O || D.pathname.startsWith(O + "/")) ? null : /* @__PURE__ */ c("div", {
|
|
@@ -70,6 +70,10 @@ var u = r(() => import("./pages/adapters/AdaptersListPage.js").then((e) => ({ de
|
|
|
70
70
|
path: "policies/:id",
|
|
71
71
|
element: /* @__PURE__ */ c(y, {})
|
|
72
72
|
}),
|
|
73
|
+
/* @__PURE__ */ c(a, {
|
|
74
|
+
path: "policies/:id/edit",
|
|
75
|
+
element: /* @__PURE__ */ c(b, {})
|
|
76
|
+
}),
|
|
73
77
|
/* @__PURE__ */ c(a, {
|
|
74
78
|
path: "violations",
|
|
75
79
|
element: /* @__PURE__ */ c(x, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdapterCloudRoutes.js","names":[],"sources":["../../src/adaptercloud/AdapterCloudRoutes.tsx"],"sourcesContent":["/**\n * AdapterCloud Routes\n * @module adaptercloud\n *\n * Domain routing for the AdapterCloud (InfraVerse) control plane: an overview\n * landing page plus fabric (adapters / connections / resources), governance\n * (policies / violations / drift) and operations (sync runs / FinOps).\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { useAdapterCloud } from './context/AdapterCloudContext';\n\n// Eager — overview landing page\nimport { OverviewPage } from './pages/OverviewPage';\n\n// Fabric — adapters\nconst AdaptersListPage = lazy(() =>\n import('./pages/adapters/AdaptersListPage').then((m) => ({ default: m.AdaptersListPage }))\n);\nconst AdapterDetailPage = lazy(() =>\n import('./pages/adapters/AdapterDetailPage').then((m) => ({ default: m.AdapterDetailPage }))\n);\nconst AdapterFormPage = lazy(() =>\n import('./pages/adapters/AdapterFormPage').then((m) => ({ default: m.AdapterFormPage }))\n);\n\n// Fabric — connections\nconst ConnectionsListPage = lazy(() =>\n import('./pages/connections/ConnectionsListPage').then((m) => ({\n default: m.ConnectionsListPage,\n }))\n);\nconst ConnectionDetailPage = lazy(() =>\n import('./pages/connections/ConnectionDetailPage').then((m) => ({\n default: m.ConnectionDetailPage,\n }))\n);\nconst ConnectionFormPage = lazy(() =>\n import('./pages/connections/ConnectionFormPage').then((m) => ({\n default: m.ConnectionFormPage,\n }))\n);\n\n// Fabric — resources\nconst ResourcesListPage = lazy(() =>\n import('./pages/resources/ResourcesListPage').then((m) => ({ default: m.ResourcesListPage }))\n);\nconst ResourceDetailPage = lazy(() =>\n import('./pages/resources/ResourceDetailPage').then((m) => ({ default: m.ResourceDetailPage }))\n);\n\n// Governance — policies\nconst PoliciesListPage = lazy(() =>\n import('./pages/policies/PoliciesListPage').then((m) => ({ default: m.PoliciesListPage }))\n);\nconst PolicyDetailPage = lazy(() =>\n import('./pages/policies/PolicyDetailPage').then((m) => ({ default: m.PolicyDetailPage }))\n);\nconst PolicyFormPage = lazy(() =>\n import('./pages/policies/PolicyFormPage').then((m) => ({ default: m.PolicyFormPage }))\n);\n\n// Governance — violations & drift\nconst ViolationsListPage = lazy(() =>\n import('./pages/violations/ViolationsListPage').then((m) => ({ default: m.ViolationsListPage }))\n);\nconst DriftListPage = lazy(() =>\n import('./pages/drift/DriftListPage').then((m) => ({ default: m.DriftListPage }))\n);\n\n// Operations — sync runs & costs\nconst SyncRunsListPage = lazy(() =>\n import('./pages/sync-runs/SyncRunsListPage').then((m) => ({ default: m.SyncRunsListPage }))\n);\nconst CostsPage = lazy(() =>\n import('./pages/costs/CostsPage').then((m) => ({ default: m.CostsPage }))\n);\n\n// Loading fallback component\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-b-2 border-
|
|
1
|
+
{"version":3,"file":"AdapterCloudRoutes.js","names":[],"sources":["../../src/adaptercloud/AdapterCloudRoutes.tsx"],"sourcesContent":["/**\n * AdapterCloud Routes\n * @module adaptercloud\n *\n * Domain routing for the AdapterCloud (InfraVerse) control plane: an overview\n * landing page plus fabric (adapters / connections / resources), governance\n * (policies / violations / drift) and operations (sync runs / FinOps).\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { useAdapterCloud } from './context/AdapterCloudContext';\n\n// Eager — overview landing page\nimport { OverviewPage } from './pages/OverviewPage';\n\n// Fabric — adapters\nconst AdaptersListPage = lazy(() =>\n import('./pages/adapters/AdaptersListPage').then((m) => ({ default: m.AdaptersListPage }))\n);\nconst AdapterDetailPage = lazy(() =>\n import('./pages/adapters/AdapterDetailPage').then((m) => ({ default: m.AdapterDetailPage }))\n);\nconst AdapterFormPage = lazy(() =>\n import('./pages/adapters/AdapterFormPage').then((m) => ({ default: m.AdapterFormPage }))\n);\n\n// Fabric — connections\nconst ConnectionsListPage = lazy(() =>\n import('./pages/connections/ConnectionsListPage').then((m) => ({\n default: m.ConnectionsListPage,\n }))\n);\nconst ConnectionDetailPage = lazy(() =>\n import('./pages/connections/ConnectionDetailPage').then((m) => ({\n default: m.ConnectionDetailPage,\n }))\n);\nconst ConnectionFormPage = lazy(() =>\n import('./pages/connections/ConnectionFormPage').then((m) => ({\n default: m.ConnectionFormPage,\n }))\n);\n\n// Fabric — resources\nconst ResourcesListPage = lazy(() =>\n import('./pages/resources/ResourcesListPage').then((m) => ({ default: m.ResourcesListPage }))\n);\nconst ResourceDetailPage = lazy(() =>\n import('./pages/resources/ResourceDetailPage').then((m) => ({ default: m.ResourceDetailPage }))\n);\n\n// Governance — policies\nconst PoliciesListPage = lazy(() =>\n import('./pages/policies/PoliciesListPage').then((m) => ({ default: m.PoliciesListPage }))\n);\nconst PolicyDetailPage = lazy(() =>\n import('./pages/policies/PolicyDetailPage').then((m) => ({ default: m.PolicyDetailPage }))\n);\nconst PolicyFormPage = lazy(() =>\n import('./pages/policies/PolicyFormPage').then((m) => ({ default: m.PolicyFormPage }))\n);\n\n// Governance — violations & drift\nconst ViolationsListPage = lazy(() =>\n import('./pages/violations/ViolationsListPage').then((m) => ({ default: m.ViolationsListPage }))\n);\nconst DriftListPage = lazy(() =>\n import('./pages/drift/DriftListPage').then((m) => ({ default: m.DriftListPage }))\n);\n\n// Operations — sync runs & costs\nconst SyncRunsListPage = lazy(() =>\n import('./pages/sync-runs/SyncRunsListPage').then((m) => ({ default: m.SyncRunsListPage }))\n);\nconst CostsPage = lazy(() =>\n import('./pages/costs/CostsPage').then((m) => ({ default: m.CostsPage }))\n);\n\n// Loading fallback component\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-b-2 border-accent-blue\" />\n </div>\n);\n\nexport const AdapterCloudRoutes: FC = () => {\n const { basePath, isStandalone } = useAdapterCloud();\n const location = useLocation();\n\n // Normalize base path\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: Only render if path matches basePath (when integrated)\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview — eager loaded */}\n <Route index element={<OverviewPage />} />\n\n {/* Adapters */}\n <Route path=\"adapters\" element={<AdaptersListPage />} />\n <Route path=\"adapters/new\" element={<AdapterFormPage />} />\n <Route path=\"adapters/:id\" element={<AdapterDetailPage />} />\n <Route path=\"adapters/:id/edit\" element={<AdapterFormPage />} />\n\n {/* Connections */}\n <Route path=\"connections\" element={<ConnectionsListPage />} />\n <Route path=\"connections/new\" element={<ConnectionFormPage />} />\n <Route path=\"connections/:id\" element={<ConnectionDetailPage />} />\n <Route path=\"connections/:id/edit\" element={<ConnectionFormPage />} />\n\n {/* Resources */}\n <Route path=\"resources\" element={<ResourcesListPage />} />\n <Route path=\"resources/:id\" element={<ResourceDetailPage />} />\n\n {/* Policies */}\n <Route path=\"policies\" element={<PoliciesListPage />} />\n <Route path=\"policies/new\" element={<PolicyFormPage />} />\n <Route path=\"policies/:id\" element={<PolicyDetailPage />} />\n <Route path=\"policies/:id/edit\" element={<PolicyFormPage />} />\n\n {/* Governance */}\n <Route path=\"violations\" element={<ViolationsListPage />} />\n <Route path=\"drift\" element={<DriftListPage />} />\n\n {/* Operations */}\n <Route path=\"sync-runs\" element={<SyncRunsListPage />} />\n <Route path=\"costs\" element={<CostsPage />} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Loader2 as e } from "lucide-react";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
import { ResponsiveDialog as r, ResponsiveDialogContent as i, ResponsiveDialogDescription as a, ResponsiveDialogFooter as o, ResponsiveDialogHeader as s, ResponsiveDialogTitle as c } from "@burdenoff/fe-libs/ui";
|
|
4
|
+
//#region src/adaptercloud/components/ConfirmDialog.tsx
|
|
5
|
+
var l = ({ open: l, onOpenChange: u, title: d, description: f, confirmLabel: p, cancelLabel: m, onConfirm: h, isPending: g = !1, tone: _ = "danger" }) => /* @__PURE__ */ t(r, {
|
|
6
|
+
open: l,
|
|
7
|
+
onOpenChange: (e) => {
|
|
8
|
+
e || u(!1);
|
|
9
|
+
},
|
|
10
|
+
children: /* @__PURE__ */ n(i, { children: [/* @__PURE__ */ n(s, { children: [/* @__PURE__ */ t(c, { children: d }), f && /* @__PURE__ */ t(a, { children: f })] }), /* @__PURE__ */ n(o, { children: [/* @__PURE__ */ t("button", {
|
|
11
|
+
type: "button",
|
|
12
|
+
disabled: g,
|
|
13
|
+
onClick: () => u(!1),
|
|
14
|
+
className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent disabled:opacity-50",
|
|
15
|
+
children: m
|
|
16
|
+
}), /* @__PURE__ */ n("button", {
|
|
17
|
+
type: "button",
|
|
18
|
+
disabled: g,
|
|
19
|
+
onClick: h,
|
|
20
|
+
className: _ === "danger" ? "inline-flex items-center justify-center gap-2 rounded-lg bg-action-danger-bg px-4 py-2 text-sm font-medium text-action-danger-text transition-colors hover:bg-action-danger-bg-hover disabled:opacity-50" : "inline-flex items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:opacity-90 disabled:opacity-50",
|
|
21
|
+
children: [g && /* @__PURE__ */ t(e, { className: "h-4 w-4 animate-spin" }), p]
|
|
22
|
+
})] })] })
|
|
23
|
+
});
|
|
24
|
+
//#endregion
|
|
25
|
+
export { l as ConfirmDialog };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=ConfirmDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.js","names":[],"sources":["../../../src/adaptercloud/components/ConfirmDialog.tsx"],"sourcesContent":["/**\n * ConfirmDialog Component\n * @module adaptercloud/components\n *\n * A consistent \"Are you sure?\" confirmation gate for destructive or\n * consequential actions (archive, disable, remediate, cancel). Built on the\n * shared fe-libs `ResponsiveDialog` primitive so it adapts to mobile as a sheet\n * and desktop as a modal. Cancel dismisses; Confirm invokes `onConfirm` and can\n * show a pending spinner while the mutation is in flight.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport {\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\n\ninterface ConfirmDialogProps {\n /** Controls visibility. */\n open: boolean;\n /** Called with `false` when the dialog should close (Cancel / overlay / esc). */\n onOpenChange: (open: boolean) => void;\n /** Dialog heading, e.g. \"Archive adapter?\". */\n title: string;\n /** Supporting body copy explaining the consequence. */\n description?: ReactNode;\n /** Confirm button label. Defaults to \"Confirm\". */\n confirmLabel: string;\n /** Cancel button label. Defaults to \"Cancel\". */\n cancelLabel: string;\n /** Invoked when the user confirms. */\n onConfirm: () => void;\n /** When true the confirm button spins and both buttons disable. */\n isPending?: boolean;\n /**\n * Visual tone of the confirm button. `danger` for destructive actions\n * (archive/disable/cancel), `primary` for neutral consequential ones.\n */\n tone?: 'danger' | 'primary';\n}\n\nexport const ConfirmDialog: FC<ConfirmDialogProps> = ({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel,\n cancelLabel,\n onConfirm,\n isPending = false,\n tone = 'danger',\n}) => {\n const confirmClass =\n tone === 'danger'\n ? 'inline-flex items-center justify-center gap-2 rounded-lg bg-action-danger-bg px-4 py-2 text-sm font-medium text-action-danger-text transition-colors hover:bg-action-danger-bg-hover disabled:opacity-50'\n : 'inline-flex items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:opacity-90 disabled:opacity-50';\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n if (!next) onOpenChange(false);\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>{title}</ResponsiveDialogTitle>\n {description && (\n <ResponsiveDialogDescription>{description}</ResponsiveDialogDescription>\n )}\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => onOpenChange(false)}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent disabled:opacity-50\"\n >\n {cancelLabel}\n </button>\n <button type=\"button\" disabled={isPending} onClick={onConfirm} className={confirmClass}>\n {isPending && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n {confirmLabel}\n </button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n};\n"],"mappings":";;;;AA8CA,IAAa,KAAyC,EACpD,SACA,iBACA,UACA,gBACA,iBACA,gBACA,cACA,eAAY,IACZ,UAAO,eAQL,kBAAC,GAAD;CACQ;CACN,eAAe,MAAS;AACtB,EAAK,KAAM,EAAa,GAAM;;WAGhC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAwB,GAA8B,CAAA,EACrD,KACC,kBAAC,GAAD,EAAA,UAA8B,GAA0C,CAAA,CAEnD,EAAA,CAAA,EACzB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,UAAD;EACE,MAAK;EACL,UAAU;EACV,eAAe,EAAa,GAAM;EAClC,WAAU;YAET;EACM,CAAA,EACT,kBAAC,UAAD;EAAQ,MAAK;EAAS,UAAU;EAAW,SAAS;EAAW,WA3BrE,MAAS,WACL,6MACA;YAyBE,CACG,KAAa,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA,EACzD,EACM;IACc,EAAA,CAAA,CACD,EAAA,CAAA;CACT,CAAA"}
|
|
@@ -8,7 +8,7 @@ function s(e) {
|
|
|
8
8
|
}
|
|
9
9
|
var c = ({ isLoading: c, isError: l, isEmpty: u = !1, error: d, onRetry: f, emptyTitle: p = "Nothing here yet", emptyDescription: m, emptyIcon: h, emptyAction: g, emptyIllustration: _, className: v, children: y }) => c ? /* @__PURE__ */ a("div", {
|
|
10
10
|
className: e("flex min-h-[240px] items-center justify-center", v),
|
|
11
|
-
children: /* @__PURE__ */ a(r, { className: "h-8 w-8 animate-spin text-
|
|
11
|
+
children: /* @__PURE__ */ a(r, { className: "h-8 w-8 animate-spin text-accent-blue" })
|
|
12
12
|
}) : l ? /* @__PURE__ */ o("div", {
|
|
13
13
|
className: e("flex min-h-[240px] flex-col items-center justify-center gap-3 rounded-xl border border-border-subtle bg-bg-surface p-8 text-center", v),
|
|
14
14
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataState.js","names":[],"sources":["../../../src/adaptercloud/components/DataState.tsx"],"sourcesContent":["/**\n * DataState Component\n * @module adaptercloud/components\n *\n * Standard loading / error / empty wrapper for query-backed sections. Renders\n * `children` only when there is data; otherwise shows a spinner, an error panel,\n * or an illustrated empty state. Keeps every page's async UX consistent.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AlertCircle, Loader2 } from 'lucide-react';\nimport { EmptyState } from './EmptyState';\nimport { cn } from '../utils/cn';\n\ninterface DataStateProps {\n isLoading: boolean;\n isError: boolean;\n /** True when the underlying list/record is empty (only checked once loaded). */\n isEmpty?: boolean;\n error?: unknown;\n onRetry?: () => void;\n emptyTitle?: string;\n emptyDescription?: string;\n emptyIcon?: ReactNode;\n emptyAction?: ReactNode;\n emptyIllustration?: string;\n className?: string;\n children: ReactNode;\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n return 'Something went wrong while loading data.';\n}\n\nexport const DataState: FC<DataStateProps> = ({\n isLoading,\n isError,\n isEmpty = false,\n error,\n onRetry,\n emptyTitle = 'Nothing here yet',\n emptyDescription,\n emptyIcon,\n emptyAction,\n emptyIllustration,\n className,\n children,\n}) => {\n if (isLoading) {\n return (\n <div className={cn('flex min-h-[240px] items-center justify-center', className)}>\n <Loader2 className=\"h-8 w-8 animate-spin text-
|
|
1
|
+
{"version":3,"file":"DataState.js","names":[],"sources":["../../../src/adaptercloud/components/DataState.tsx"],"sourcesContent":["/**\n * DataState Component\n * @module adaptercloud/components\n *\n * Standard loading / error / empty wrapper for query-backed sections. Renders\n * `children` only when there is data; otherwise shows a spinner, an error panel,\n * or an illustrated empty state. Keeps every page's async UX consistent.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AlertCircle, Loader2 } from 'lucide-react';\nimport { EmptyState } from './EmptyState';\nimport { cn } from '../utils/cn';\n\ninterface DataStateProps {\n isLoading: boolean;\n isError: boolean;\n /** True when the underlying list/record is empty (only checked once loaded). */\n isEmpty?: boolean;\n error?: unknown;\n onRetry?: () => void;\n emptyTitle?: string;\n emptyDescription?: string;\n emptyIcon?: ReactNode;\n emptyAction?: ReactNode;\n emptyIllustration?: string;\n className?: string;\n children: ReactNode;\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n return 'Something went wrong while loading data.';\n}\n\nexport const DataState: FC<DataStateProps> = ({\n isLoading,\n isError,\n isEmpty = false,\n error,\n onRetry,\n emptyTitle = 'Nothing here yet',\n emptyDescription,\n emptyIcon,\n emptyAction,\n emptyIllustration,\n className,\n children,\n}) => {\n if (isLoading) {\n return (\n <div className={cn('flex min-h-[240px] items-center justify-center', className)}>\n <Loader2 className=\"h-8 w-8 animate-spin text-accent-blue\" />\n </div>\n );\n }\n\n if (isError) {\n return (\n <div\n className={cn(\n 'flex min-h-[240px] flex-col items-center justify-center gap-3 rounded-xl border border-border-subtle bg-bg-surface p-8 text-center',\n className\n )}\n >\n <AlertCircle className=\"h-10 w-10 text-status-error-text\" />\n <h3 className=\"text-base font-semibold text-text-primary\">Failed to load</h3>\n <p className=\"max-w-md text-sm text-text-secondary\">{errorMessage(error)}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"mt-1 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n Try again\n </button>\n )}\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <EmptyState\n title={emptyTitle}\n description={emptyDescription}\n icon={emptyIcon}\n action={emptyAction}\n illustration={emptyIllustration}\n className={className}\n />\n );\n }\n\n return <>{children}</>;\n};\n"],"mappings":";;;;;AA8BA,SAAS,EAAa,GAAwB;AAG5C,QAFI,aAAiB,QAAc,EAAM,UACrC,OAAO,KAAU,WAAiB,IAC/B;;AAGT,IAAa,KAAiC,EAC5C,cACA,YACA,aAAU,IACV,UACA,YACA,gBAAa,oBACb,qBACA,cACA,gBACA,sBACA,cACA,kBAEI,IAEA,kBAAC,OAAD;CAAK,WAAW,EAAG,kDAAkD,EAAU;WAC7E,kBAAC,GAAD,EAAS,WAAU,yCAA0C,CAAA;CACzD,CAAA,GAIN,IAEA,kBAAC,OAAD;CACE,WAAW,EACT,sIACA,EACD;WAJH;EAME,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA;EAC5D,kBAAC,MAAD;GAAI,WAAU;aAA4C;GAAmB,CAAA;EAC7E,kBAAC,KAAD;GAAG,WAAU;aAAwC,EAAa,EAAM;GAAK,CAAA;EAC5E,KACC,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,WAAU;aACX;GAEQ,CAAA;EAEP;KAIN,IAEA,kBAAC,GAAD;CACE,OAAO;CACP,aAAa;CACb,MAAM;CACN,QAAQ;CACR,cAAc;CACH;CACX,CAAA,GAIC,kBAAA,GAAA,EAAG,aAAY,CAAA"}
|
|
@@ -89,23 +89,24 @@ var s = {
|
|
|
89
89
|
if (r.errors?.length) throw Error(r.errors[0]?.message ?? "GraphQL request failed");
|
|
90
90
|
if (!r.data) throw Error("GraphQL response did not include data");
|
|
91
91
|
return /^\s*mutation\b/.test(e) && o(), r.data;
|
|
92
|
-
}, l = 30 * 1e3, u = "\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n", d = "\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n", f = "\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n", p = "\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n", m = "\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n", h = "\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n", g = "\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n", _ = (t = {}) => {
|
|
92
|
+
}, l = 30 * 1e3, u = "\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n", d = "\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n", f = "\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n", p = "\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n", m = "\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n", h = "\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n", g = "\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n", _ = "cursor hasMore totalCount", v = (t = {}) => {
|
|
93
93
|
let { apiGatewayUrl: n } = e();
|
|
94
94
|
return r({
|
|
95
95
|
queryKey: s.adapters(t),
|
|
96
96
|
queryFn: async () => (await c(`query AdaListAdapters($kind: AdaAdapterKind, $status: AdaAdapterStatus, $pagination: PaginationInput) {
|
|
97
97
|
adaListAdapters(kind: $kind, status: $status, pagination: $pagination) {
|
|
98
98
|
items { ${u} }
|
|
99
|
-
pageInfo {
|
|
99
|
+
pageInfo { ${_} }
|
|
100
100
|
}
|
|
101
101
|
}`, {
|
|
102
102
|
kind: t.kind,
|
|
103
103
|
status: t.status,
|
|
104
104
|
pagination: t.pagination
|
|
105
105
|
}, n)).adaListAdapters,
|
|
106
|
+
placeholderData: (e) => e,
|
|
106
107
|
staleTime: l
|
|
107
108
|
});
|
|
108
|
-
},
|
|
109
|
+
}, y = (t) => {
|
|
109
110
|
let { apiGatewayUrl: n } = e();
|
|
110
111
|
return r({
|
|
111
112
|
queryKey: s.adapter(t ?? ""),
|
|
@@ -118,7 +119,7 @@ var s = {
|
|
|
118
119
|
enabled: !!t,
|
|
119
120
|
staleTime: l
|
|
120
121
|
});
|
|
121
|
-
},
|
|
122
|
+
}, b = () => {
|
|
122
123
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
123
124
|
return n({
|
|
124
125
|
mutationFn: async (e) => (await c(`mutation AdaCreateAdapter($input: AdaCreateAdapterInput!) {
|
|
@@ -128,7 +129,7 @@ var s = {
|
|
|
128
129
|
t.invalidateQueries({ queryKey: [...s.all, "adapters"] });
|
|
129
130
|
}
|
|
130
131
|
});
|
|
131
|
-
},
|
|
132
|
+
}, x = () => {
|
|
132
133
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
133
134
|
return n({
|
|
134
135
|
mutationFn: async ({ id: e, input: t }) => (await c(`mutation AdaUpdateAdapter($id: ID!, $input: AdaUpdateAdapterInput!) {
|
|
@@ -141,7 +142,7 @@ var s = {
|
|
|
141
142
|
t.invalidateQueries({ queryKey: [...s.all, "adapters"] }), t.invalidateQueries({ queryKey: s.adapter(e.id) });
|
|
142
143
|
}
|
|
143
144
|
});
|
|
144
|
-
},
|
|
145
|
+
}, S = () => {
|
|
145
146
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
146
147
|
return n({
|
|
147
148
|
mutationFn: async (e) => (await c("mutation AdaArchiveAdapter($id: ID!) { adaArchiveAdapter(id: $id) }", { id: e }, r)).adaArchiveAdapter,
|
|
@@ -149,7 +150,7 @@ var s = {
|
|
|
149
150
|
t.invalidateQueries({ queryKey: [...s.all, "adapters"] });
|
|
150
151
|
}
|
|
151
152
|
});
|
|
152
|
-
},
|
|
153
|
+
}, C = (t = {}) => {
|
|
153
154
|
let { apiGatewayUrl: n } = e();
|
|
154
155
|
return r({
|
|
155
156
|
queryKey: s.connections(t),
|
|
@@ -159,16 +160,17 @@ var s = {
|
|
|
159
160
|
${d}
|
|
160
161
|
adapter { id name slug kind }
|
|
161
162
|
}
|
|
162
|
-
pageInfo {
|
|
163
|
+
pageInfo { ${_} }
|
|
163
164
|
}
|
|
164
165
|
}`, {
|
|
165
166
|
adapterId: t.adapterId,
|
|
166
167
|
status: t.status,
|
|
167
168
|
pagination: t.pagination
|
|
168
169
|
}, n)).adaListConnections,
|
|
170
|
+
placeholderData: (e) => e,
|
|
169
171
|
staleTime: l
|
|
170
172
|
});
|
|
171
|
-
},
|
|
173
|
+
}, w = (t) => {
|
|
172
174
|
let { apiGatewayUrl: n } = e();
|
|
173
175
|
return r({
|
|
174
176
|
queryKey: s.connection(t ?? ""),
|
|
@@ -182,7 +184,7 @@ var s = {
|
|
|
182
184
|
enabled: !!t,
|
|
183
185
|
staleTime: l
|
|
184
186
|
});
|
|
185
|
-
},
|
|
187
|
+
}, T = () => {
|
|
186
188
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
187
189
|
return n({
|
|
188
190
|
mutationFn: async (e) => (await c(`mutation AdaCreateConnection($input: AdaCreateConnectionInput!) {
|
|
@@ -192,7 +194,7 @@ var s = {
|
|
|
192
194
|
t.invalidateQueries({ queryKey: [...s.all, "connections"] });
|
|
193
195
|
}
|
|
194
196
|
});
|
|
195
|
-
},
|
|
197
|
+
}, E = () => {
|
|
196
198
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
197
199
|
return n({
|
|
198
200
|
mutationFn: async ({ id: e, input: t }) => (await c(`mutation AdaUpdateConnection($id: ID!, $input: AdaUpdateConnectionInput!) {
|
|
@@ -205,7 +207,7 @@ var s = {
|
|
|
205
207
|
t.invalidateQueries({ queryKey: [...s.all, "connections"] }), t.invalidateQueries({ queryKey: s.connection(e.id) });
|
|
206
208
|
}
|
|
207
209
|
});
|
|
208
|
-
},
|
|
210
|
+
}, D = () => {
|
|
209
211
|
let r = i(), { apiGatewayUrl: a } = e();
|
|
210
212
|
return n({
|
|
211
213
|
mutationFn: async ({ id: e, status: t }) => (await c(`mutation AdaSetConnectionStatus($id: ID!, $status: AdaConnectionStatus!) {
|
|
@@ -218,7 +220,7 @@ var s = {
|
|
|
218
220
|
t.success("Connection health updated"), r.invalidateQueries({ queryKey: [...s.all, "connections"] }), r.invalidateQueries({ queryKey: s.connection(e.id) });
|
|
219
221
|
}
|
|
220
222
|
});
|
|
221
|
-
},
|
|
223
|
+
}, O = () => {
|
|
222
224
|
let r = i(), { apiGatewayUrl: a } = e();
|
|
223
225
|
return n({
|
|
224
226
|
mutationFn: async (e) => (await c(`mutation AdaDisableConnection($id: ID!) {
|
|
@@ -228,7 +230,7 @@ var s = {
|
|
|
228
230
|
t.success("Connection disabled"), r.invalidateQueries({ queryKey: [...s.all, "connections"] }), r.invalidateQueries({ queryKey: s.connection(e.id) });
|
|
229
231
|
}
|
|
230
232
|
});
|
|
231
|
-
},
|
|
233
|
+
}, k = (t = {}) => {
|
|
232
234
|
let { apiGatewayUrl: n } = e();
|
|
233
235
|
return r({
|
|
234
236
|
queryKey: s.resources(t),
|
|
@@ -238,7 +240,7 @@ var s = {
|
|
|
238
240
|
${f}
|
|
239
241
|
connection { id name }
|
|
240
242
|
}
|
|
241
|
-
pageInfo {
|
|
243
|
+
pageInfo { ${_} }
|
|
242
244
|
}
|
|
243
245
|
}`, {
|
|
244
246
|
connectionId: t.connectionId,
|
|
@@ -246,9 +248,10 @@ var s = {
|
|
|
246
248
|
state: t.state,
|
|
247
249
|
pagination: t.pagination
|
|
248
250
|
}, n)).adaListResources,
|
|
251
|
+
placeholderData: (e) => e,
|
|
249
252
|
staleTime: l
|
|
250
253
|
});
|
|
251
|
-
},
|
|
254
|
+
}, A = (t) => {
|
|
252
255
|
let { apiGatewayUrl: n } = e();
|
|
253
256
|
return r({
|
|
254
257
|
queryKey: s.resource(t ?? ""),
|
|
@@ -262,7 +265,7 @@ var s = {
|
|
|
262
265
|
enabled: !!t,
|
|
263
266
|
staleTime: l
|
|
264
267
|
});
|
|
265
|
-
},
|
|
268
|
+
}, j = (t = {}) => {
|
|
266
269
|
let { apiGatewayUrl: n } = e();
|
|
267
270
|
return r({
|
|
268
271
|
queryKey: s.policies(t),
|
|
@@ -276,9 +279,10 @@ var s = {
|
|
|
276
279
|
kind: t.kind,
|
|
277
280
|
pagination: t.pagination
|
|
278
281
|
}, n)).adaListPolicies,
|
|
282
|
+
placeholderData: (e) => e,
|
|
279
283
|
staleTime: l
|
|
280
284
|
});
|
|
281
|
-
},
|
|
285
|
+
}, M = (t) => {
|
|
282
286
|
let { apiGatewayUrl: n } = e();
|
|
283
287
|
return r({
|
|
284
288
|
queryKey: s.policy(t ?? ""),
|
|
@@ -291,7 +295,7 @@ var s = {
|
|
|
291
295
|
enabled: !!t,
|
|
292
296
|
staleTime: l
|
|
293
297
|
});
|
|
294
|
-
},
|
|
298
|
+
}, N = () => {
|
|
295
299
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
296
300
|
return n({
|
|
297
301
|
mutationFn: async (e) => (await c(`mutation AdaCreatePolicy($input: AdaCreatePolicyInput!) {
|
|
@@ -301,7 +305,20 @@ var s = {
|
|
|
301
305
|
t.invalidateQueries({ queryKey: [...s.all, "policies"] });
|
|
302
306
|
}
|
|
303
307
|
});
|
|
304
|
-
},
|
|
308
|
+
}, P = () => {
|
|
309
|
+
let r = i(), { apiGatewayUrl: a } = e();
|
|
310
|
+
return n({
|
|
311
|
+
mutationFn: async ({ id: e, input: t }) => (await c(`mutation AdaUpdatePolicy($id: ID!, $input: AdaUpdatePolicyInput!) {
|
|
312
|
+
adaUpdatePolicy(id: $id, input: $input) { ${p} }
|
|
313
|
+
}`, {
|
|
314
|
+
id: e,
|
|
315
|
+
input: t
|
|
316
|
+
}, a)).adaUpdatePolicy,
|
|
317
|
+
onSuccess: (e) => {
|
|
318
|
+
t.success("Policy updated"), r.invalidateQueries({ queryKey: [...s.all, "policies"] }), r.invalidateQueries({ queryKey: s.policy(e.id) });
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
}, F = () => {
|
|
305
322
|
let t = i(), { apiGatewayUrl: r } = e();
|
|
306
323
|
return n({
|
|
307
324
|
mutationFn: async (e) => (await c("mutation AdaArchivePolicy($id: ID!) { adaArchivePolicy(id: $id) }", { id: e }, r)).adaArchivePolicy,
|
|
@@ -309,7 +326,7 @@ var s = {
|
|
|
309
326
|
t.invalidateQueries({ queryKey: [...s.all, "policies"] });
|
|
310
327
|
}
|
|
311
328
|
});
|
|
312
|
-
},
|
|
329
|
+
}, I = (t = {}) => {
|
|
313
330
|
let { apiGatewayUrl: n } = e();
|
|
314
331
|
return r({
|
|
315
332
|
queryKey: s.violations(t),
|
|
@@ -319,7 +336,7 @@ var s = {
|
|
|
319
336
|
${m}
|
|
320
337
|
policy { id name kind severity }
|
|
321
338
|
}
|
|
322
|
-
pageInfo {
|
|
339
|
+
pageInfo { ${_} }
|
|
323
340
|
}
|
|
324
341
|
}`, {
|
|
325
342
|
policyId: t.policyId,
|
|
@@ -327,9 +344,10 @@ var s = {
|
|
|
327
344
|
status: t.status,
|
|
328
345
|
pagination: t.pagination
|
|
329
346
|
}, n)).adaListViolations,
|
|
347
|
+
placeholderData: (e) => e,
|
|
330
348
|
staleTime: l
|
|
331
349
|
});
|
|
332
|
-
},
|
|
350
|
+
}, L = () => {
|
|
333
351
|
let r = i(), { apiGatewayUrl: a } = e();
|
|
334
352
|
return n({
|
|
335
353
|
mutationFn: async ({ id: e, status: t, waiverReason: n }) => (await c(`mutation AdaResolveViolation($id: ID!, $status: AdaViolationStatus!, $waiverReason: String) {
|
|
@@ -350,7 +368,7 @@ var s = {
|
|
|
350
368
|
}[e.status] ?? "Violation updated"), r.invalidateQueries({ queryKey: [...s.all, "violations"] });
|
|
351
369
|
}
|
|
352
370
|
});
|
|
353
|
-
},
|
|
371
|
+
}, R = (t = {}) => {
|
|
354
372
|
let { apiGatewayUrl: n } = e();
|
|
355
373
|
return r({
|
|
356
374
|
queryKey: s.drift(t),
|
|
@@ -362,7 +380,7 @@ var s = {
|
|
|
362
380
|
}, n)).adaListDriftRecords,
|
|
363
381
|
staleTime: l
|
|
364
382
|
});
|
|
365
|
-
},
|
|
383
|
+
}, z = () => {
|
|
366
384
|
let r = i(), { apiGatewayUrl: a } = e();
|
|
367
385
|
return n({
|
|
368
386
|
mutationFn: async (e) => (await c(`mutation AdaRemediateDrift($id: ID!) {
|
|
@@ -372,7 +390,7 @@ var s = {
|
|
|
372
390
|
t.success("Drift marked remediated"), r.invalidateQueries({ queryKey: [...s.all, "drift"] }), r.invalidateQueries({ queryKey: [...s.all, "resources"] });
|
|
373
391
|
}
|
|
374
392
|
});
|
|
375
|
-
},
|
|
393
|
+
}, B = (t = {}) => {
|
|
376
394
|
let { apiGatewayUrl: n } = e();
|
|
377
395
|
return r({
|
|
378
396
|
queryKey: s.syncRuns(t),
|
|
@@ -386,9 +404,10 @@ var s = {
|
|
|
386
404
|
status: t.status,
|
|
387
405
|
pagination: t.pagination
|
|
388
406
|
}, n)).adaListSyncRuns,
|
|
407
|
+
placeholderData: (e) => e,
|
|
389
408
|
staleTime: l
|
|
390
409
|
});
|
|
391
|
-
},
|
|
410
|
+
}, V = () => {
|
|
392
411
|
let r = i(), { apiGatewayUrl: a } = e();
|
|
393
412
|
return n({
|
|
394
413
|
mutationFn: async (e) => (await c(`mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {
|
|
@@ -398,7 +417,7 @@ var s = {
|
|
|
398
417
|
t.success("Sync run started"), r.invalidateQueries({ queryKey: [...s.all, "sync-runs"] }), r.invalidateQueries({ queryKey: [...s.all, "connections"] });
|
|
399
418
|
}
|
|
400
419
|
});
|
|
401
|
-
},
|
|
420
|
+
}, H = () => {
|
|
402
421
|
let r = i(), { apiGatewayUrl: a } = e();
|
|
403
422
|
return n({
|
|
404
423
|
mutationFn: async (e) => (await c(`mutation AdaCancelSyncRun($id: ID!) {
|
|
@@ -408,14 +427,14 @@ var s = {
|
|
|
408
427
|
t.success("Sync run cancelled"), r.invalidateQueries({ queryKey: [...s.all, "sync-runs"] });
|
|
409
428
|
}
|
|
410
429
|
});
|
|
411
|
-
},
|
|
430
|
+
}, U = (t) => {
|
|
412
431
|
let { apiGatewayUrl: n } = e();
|
|
413
432
|
return r({
|
|
414
433
|
queryKey: s.costSummary(t),
|
|
415
434
|
queryFn: async () => (await c("query AdaCostSummary($connectionId: ID) {\n adaCostSummary(connectionId: $connectionId) {\n currency total\n lines { service total }\n }\n }", { connectionId: t }, n)).adaCostSummary,
|
|
416
435
|
staleTime: l
|
|
417
436
|
});
|
|
418
|
-
},
|
|
437
|
+
}, W = (t = {}) => {
|
|
419
438
|
let { apiGatewayUrl: n } = e();
|
|
420
439
|
return r({
|
|
421
440
|
queryKey: s.costRecords(t),
|
|
@@ -428,6 +447,6 @@ var s = {
|
|
|
428
447
|
});
|
|
429
448
|
};
|
|
430
449
|
//#endregion
|
|
431
|
-
export {
|
|
450
|
+
export { y as useAdapter, v as useAdapters, S as useArchiveAdapter, F as useArchivePolicy, H as useCancelSyncRun, w as useConnection, C as useConnections, W as useCostRecords, U as useCostSummary, b as useCreateAdapter, T as useCreateConnection, N as useCreatePolicy, O as useDisableConnection, R as useDriftRecords, j as usePolicies, M as usePolicy, z as useRemediateDrift, L as useResolveViolation, A as useResource, k as useResources, D as useSetConnectionStatus, V as useStartSyncRun, B as useSyncRuns, x as useUpdateAdapter, E as useUpdateConnection, P as useUpdatePolicy, I as useViolations };
|
|
432
451
|
|
|
433
452
|
//# sourceMappingURL=useAdapterCloudApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdapterCloudApi.js","names":[],"sources":["../../../src/adaptercloud/hooks/useAdapterCloudApi.ts"],"sourcesContent":["/**\n * AdapterCloud API Hooks\n * @module adaptercloud/hooks\n *\n * Real, typed data layer for AdapterCloud (InfraVerse). Every hook talks to the\n * deployed `wspace-adaptercloud-svc` subgraph through the workspace GraphQL\n * gateway via `graphqlFetch`. Operations, fields, inputs, enums and the\n * Connection/pageInfo shapes are taken verbatim from the service's\n * `.hive-schema.graphql`. No mocks — every screen reads/writes real data.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useAdapterCloud } from '../context';\nimport { notify } from '../lib/toast';\nimport type {\n AdaAdapter,\n AdaAdapterConnectionPage,\n AdaAdapterKind,\n AdaAdapterStatus,\n AdaConnection,\n AdaConnectionPage,\n AdaConnectionStatus,\n AdaCostRecord,\n AdaCostSummary,\n AdaDriftRecord,\n AdaDriftStatus,\n AdaPolicy,\n AdaPolicyKind,\n AdaPolicyPage,\n AdaPolicyViolation,\n AdaPolicyViolationPage,\n AdaResource,\n AdaResourcePage,\n AdaResourceState,\n AdaSyncRun,\n AdaSyncRunPage,\n AdaSyncStatus,\n AdaViolationStatus,\n PaginationInput,\n AdaCreateAdapterInput,\n AdaUpdateAdapterInput,\n AdaCreateConnectionInput,\n AdaUpdateConnectionInput,\n AdaCreatePolicyInput,\n AdaStartSyncRunInput,\n} from '../types';\n\n// ============================================================================\n// Query keys\n// ============================================================================\n\nexport const adaKeys = {\n all: ['adaptercloud'] as const,\n health: () => [...adaKeys.all, 'health'] as const,\n costSummary: (connectionId?: string) =>\n [...adaKeys.all, 'cost-summary', connectionId ?? null] as const,\n costRecords: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'cost-records', filter] as const,\n adapters: (filter: Record<string, unknown>) => [...adaKeys.all, 'adapters', filter] as const,\n adapter: (id: string) => [...adaKeys.all, 'adapter', id] as const,\n connections: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'connections', filter] as const,\n connection: (id: string) => [...adaKeys.all, 'connection', id] as const,\n resources: (filter: Record<string, unknown>) => [...adaKeys.all, 'resources', filter] as const,\n resource: (id: string) => [...adaKeys.all, 'resource', id] as const,\n policies: (filter: Record<string, unknown>) => [...adaKeys.all, 'policies', filter] as const,\n policy: (id: string) => [...adaKeys.all, 'policy', id] as const,\n violations: (filter: Record<string, unknown>) => [...adaKeys.all, 'violations', filter] as const,\n drift: (filter: Record<string, unknown>) => [...adaKeys.all, 'drift', filter] as const,\n syncRuns: (filter: Record<string, unknown>) => [...adaKeys.all, 'sync-runs', filter] as const,\n syncRun: (id: string) => [...adaKeys.all, 'sync-run', id] as const,\n};\n\n// ============================================================================\n// Low-level query wrapper\n// ============================================================================\n\nconst adaQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // After a successful mutation, drop the fe-libs graphqlFetch response cache\n // (≤30s TTL) so the follow-up React-Query refetch reads fresh data instead of\n // a stale cached response — otherwise writes appear to \"not take effect\" for\n // up to 30s. (fe-libs' own Apollo client does the same on every mutation.)\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\nconst STALE = 30 * 1000;\n\n// ============================================================================\n// Reusable GraphQL field selections (inline strings)\n// ============================================================================\n\nconst ADAPTER_FIELDS = `\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n`;\n\nconst CONNECTION_FIELDS = `\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n`;\n\nconst RESOURCE_FIELDS = `\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n`;\n\nconst POLICY_FIELDS = `\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n`;\n\nconst VIOLATION_FIELDS = `\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n`;\n\nconst DRIFT_FIELDS = `\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n`;\n\nconst SYNC_RUN_FIELDS = `\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n`;\n\n// ============================================================================\n// Health\n// ============================================================================\n\nexport const useAdaHealth = () => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.health(),\n queryFn: async () => {\n const result = await adaQuery<{ adaHealth: string }>(\n `query AdaHealth { adaHealth }`,\n {},\n apiGatewayUrl\n );\n return result.adaHealth;\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Adapters\n// ============================================================================\n\nexport interface AdapterListFilter {\n kind?: AdaAdapterKind;\n status?: AdaAdapterStatus;\n pagination?: PaginationInput;\n}\n\nexport const useAdapters = (filter: AdapterListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapters(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListAdapters: AdaAdapterConnectionPage }>(\n `query AdaListAdapters($kind: AdaAdapterKind, $status: AdaAdapterStatus, $pagination: PaginationInput) {\n adaListAdapters(kind: $kind, status: $status, pagination: $pagination) {\n items { ${ADAPTER_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n kind: filter.kind,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListAdapters;\n },\n staleTime: STALE,\n });\n};\n\nexport const useAdapter = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapter(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaAdapter: AdaAdapter | null }>(\n `query AdaAdapter($id: ID!) {\n adaAdapter(id: $id) {\n ${ADAPTER_FIELDS}\n connections { ${CONNECTION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaAdapter;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateAdapterInput) => {\n const result = await adaQuery<{ adaCreateAdapter: AdaAdapter }>(\n `mutation AdaCreateAdapter($input: AdaCreateAdapterInput!) {\n adaCreateAdapter(input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\nexport const useUpdateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateAdapterInput }) => {\n const result = await adaQuery<{ adaUpdateAdapter: AdaAdapter }>(\n `mutation AdaUpdateAdapter($id: ID!, $input: AdaUpdateAdapterInput!) {\n adaUpdateAdapter(id: $id, input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateAdapter;\n },\n onSuccess: (adapter) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.adapter(adapter.id) });\n },\n });\n};\n\nexport const useArchiveAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchiveAdapter: boolean }>(\n `mutation AdaArchiveAdapter($id: ID!) { adaArchiveAdapter(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchiveAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\n// ============================================================================\n// Connections\n// ============================================================================\n\nexport interface ConnectionListFilter {\n adapterId?: string;\n status?: AdaConnectionStatus;\n pagination?: PaginationInput;\n}\n\nexport const useConnections = (filter: ConnectionListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connections(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListConnections: AdaConnectionPage }>(\n `query AdaListConnections($adapterId: ID, $status: AdaConnectionStatus, $pagination: PaginationInput) {\n adaListConnections(adapterId: $adapterId, status: $status, pagination: $pagination) {\n items {\n ${CONNECTION_FIELDS}\n adapter { id name slug kind }\n }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n adapterId: filter.adapterId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListConnections;\n },\n staleTime: STALE,\n });\n};\n\nexport const useConnection = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connection(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaConnection: AdaConnection | null }>(\n `query AdaConnection($id: ID!) {\n adaConnection(id: $id) {\n ${CONNECTION_FIELDS}\n adapter { ${ADAPTER_FIELDS} }\n resources { ${RESOURCE_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaConnection;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateConnectionInput) => {\n const result = await adaQuery<{ adaCreateConnection: AdaConnection }>(\n `mutation AdaCreateConnection($input: AdaCreateConnectionInput!) {\n adaCreateConnection(input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateConnection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useUpdateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateConnectionInput }) => {\n const result = await adaQuery<{ adaUpdateConnection: AdaConnection }>(\n `mutation AdaUpdateConnection($id: ID!, $input: AdaUpdateConnectionInput!) {\n adaUpdateConnection(id: $id, input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateConnection;\n },\n onSuccess: (connection) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useSetConnectionStatus = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: AdaConnectionStatus }) => {\n const result = await adaQuery<{ adaSetConnectionStatus: AdaConnection }>(\n `mutation AdaSetConnectionStatus($id: ID!, $status: AdaConnectionStatus!) {\n adaSetConnectionStatus(id: $id, status: $status) { ${CONNECTION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.adaSetConnectionStatus;\n },\n onSuccess: (connection) => {\n notify.success('Connection health updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useDisableConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaDisableConnection: AdaConnection }>(\n `mutation AdaDisableConnection($id: ID!) {\n adaDisableConnection(id: $id) { ${CONNECTION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaDisableConnection;\n },\n onSuccess: (connection) => {\n notify.success('Connection disabled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\n// ============================================================================\n// Resources\n// ============================================================================\n\nexport interface ResourceListFilter {\n connectionId?: string;\n resourceType?: string;\n state?: AdaResourceState;\n pagination?: PaginationInput;\n}\n\nexport const useResources = (filter: ResourceListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resources(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListResources: AdaResourcePage }>(\n `query AdaListResources($connectionId: ID, $resourceType: String, $state: AdaResourceState, $pagination: PaginationInput) {\n adaListResources(connectionId: $connectionId, resourceType: $resourceType, state: $state, pagination: $pagination) {\n items {\n ${RESOURCE_FIELDS}\n connection { id name }\n }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceType: filter.resourceType,\n state: filter.state,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListResources;\n },\n staleTime: STALE,\n });\n};\n\nexport const useResource = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resource(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaResource: AdaResource | null }>(\n `query AdaResource($id: ID!) {\n adaResource(id: $id) {\n ${RESOURCE_FIELDS}\n connection { ${CONNECTION_FIELDS} adapter { id name slug kind } }\n dependsOn { id name resourceType region state monthlyCost }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaResource;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Policies\n// ============================================================================\n\nexport interface PolicyListFilter {\n isActive?: boolean;\n kind?: AdaPolicyKind;\n pagination?: PaginationInput;\n}\n\nexport const usePolicies = (filter: PolicyListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policies(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListPolicies: AdaPolicyPage }>(\n `query AdaListPolicies($isActive: Boolean, $kind: AdaPolicyKind, $pagination: PaginationInput) {\n adaListPolicies(isActive: $isActive, kind: $kind, pagination: $pagination) {\n items { ${POLICY_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n isActive: filter.isActive,\n kind: filter.kind,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListPolicies;\n },\n staleTime: STALE,\n });\n};\n\nexport const usePolicy = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policy(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaPolicy: AdaPolicy | null }>(\n `query AdaPolicy($id: ID!) {\n adaPolicy(id: $id) {\n ${POLICY_FIELDS}\n violations { ${VIOLATION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaPolicy;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreatePolicyInput) => {\n const result = await adaQuery<{ adaCreatePolicy: AdaPolicy }>(\n `mutation AdaCreatePolicy($input: AdaCreatePolicyInput!) {\n adaCreatePolicy(input: $input) { ${POLICY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreatePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\nexport const useArchivePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchivePolicy: boolean }>(\n `mutation AdaArchivePolicy($id: ID!) { adaArchivePolicy(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchivePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\n// ============================================================================\n// Violations\n// ============================================================================\n\nexport interface ViolationListFilter {\n policyId?: string;\n resourceId?: string;\n status?: AdaViolationStatus;\n pagination?: PaginationInput;\n}\n\nexport const useViolations = (filter: ViolationListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.violations(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListViolations: AdaPolicyViolationPage }>(\n `query AdaListViolations($policyId: ID, $resourceId: ID, $status: AdaViolationStatus, $pagination: PaginationInput) {\n adaListViolations(policyId: $policyId, resourceId: $resourceId, status: $status, pagination: $pagination) {\n items {\n ${VIOLATION_FIELDS}\n policy { id name kind severity }\n }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n policyId: filter.policyId,\n resourceId: filter.resourceId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListViolations;\n },\n staleTime: STALE,\n });\n};\n\nexport const useResolveViolation = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({\n id,\n status,\n waiverReason,\n }: {\n id: string;\n status: AdaViolationStatus;\n waiverReason?: string;\n }) => {\n const result = await adaQuery<{ adaResolveViolation: AdaPolicyViolation }>(\n `mutation AdaResolveViolation($id: ID!, $status: AdaViolationStatus!, $waiverReason: String) {\n adaResolveViolation(id: $id, status: $status, waiverReason: $waiverReason) {\n ${VIOLATION_FIELDS}\n }\n }`,\n { id, status, waiverReason },\n apiGatewayUrl\n );\n return result.adaResolveViolation;\n },\n onSuccess: (violation) => {\n const label: Record<string, string> = {\n ACKNOWLEDGED: 'Violation acknowledged',\n RESOLVED: 'Violation resolved',\n WAIVED: 'Violation waived',\n OPEN: 'Violation reopened',\n };\n notify.success(label[violation.status] ?? 'Violation updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'violations'] });\n },\n });\n};\n\n// ============================================================================\n// Drift\n// ============================================================================\n\nexport interface DriftListFilter {\n resourceId?: string;\n status?: AdaDriftStatus;\n}\n\nexport const useDriftRecords = (filter: DriftListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.drift(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListDriftRecords: AdaDriftRecord[] }>(\n `query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus) {\n adaListDriftRecords(resourceId: $resourceId, status: $status) { ${DRIFT_FIELDS} }\n }`,\n { resourceId: filter.resourceId, status: filter.status },\n apiGatewayUrl\n );\n return result.adaListDriftRecords;\n },\n staleTime: STALE,\n });\n};\n\nexport const useRemediateDrift = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaRemediateDrift: AdaDriftRecord }>(\n `mutation AdaRemediateDrift($id: ID!) {\n adaRemediateDrift(id: $id) { ${DRIFT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaRemediateDrift;\n },\n onSuccess: () => {\n notify.success('Drift marked remediated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'drift'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'resources'] });\n },\n });\n};\n\n// ============================================================================\n// Sync runs\n// ============================================================================\n\nexport interface SyncRunListFilter {\n connectionId?: string;\n status?: AdaSyncStatus;\n pagination?: PaginationInput;\n}\n\nexport const useSyncRuns = (filter: SyncRunListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.syncRuns(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListSyncRuns: AdaSyncRunPage }>(\n `query AdaListSyncRuns($connectionId: ID, $status: AdaSyncStatus, $pagination: PaginationInput) {\n adaListSyncRuns(connectionId: $connectionId, status: $status, pagination: $pagination) {\n items { ${SYNC_RUN_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n connectionId: filter.connectionId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListSyncRuns;\n },\n staleTime: STALE,\n });\n};\n\nexport const useStartSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaStartSyncRunInput) => {\n const result = await adaQuery<{ adaStartSyncRun: AdaSyncRun }>(\n `mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {\n adaStartSyncRun(input: $input) { ${SYNC_RUN_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaStartSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run started');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useCancelSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaCancelSyncRun: AdaSyncRun }>(\n `mutation AdaCancelSyncRun($id: ID!) {\n adaCancelSyncRun(id: $id) { ${SYNC_RUN_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaCancelSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run cancelled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n },\n });\n};\n\n// ============================================================================\n// FinOps — cost\n// ============================================================================\n\nexport const useCostSummary = (connectionId?: string) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costSummary(connectionId),\n queryFn: async () => {\n const result = await adaQuery<{ adaCostSummary: AdaCostSummary }>(\n `query AdaCostSummary($connectionId: ID) {\n adaCostSummary(connectionId: $connectionId) {\n currency total\n lines { service total }\n }\n }`,\n { connectionId },\n apiGatewayUrl\n );\n return result.adaCostSummary;\n },\n staleTime: STALE,\n });\n};\n\nexport interface CostRecordListFilter {\n connectionId?: string;\n resourceId?: string;\n service?: string;\n}\n\nexport const useCostRecords = (filter: CostRecordListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costRecords(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListCostRecords: AdaCostRecord[] }>(\n `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service) {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceId: filter.resourceId,\n service: filter.service,\n },\n apiGatewayUrl\n );\n return result.adaListCostRecords;\n },\n staleTime: STALE,\n });\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAdapterCloudApi.js","names":[],"sources":["../../../src/adaptercloud/hooks/useAdapterCloudApi.ts"],"sourcesContent":["/**\n * AdapterCloud API Hooks\n * @module adaptercloud/hooks\n *\n * Real, typed data layer for AdapterCloud (InfraVerse). Every hook talks to the\n * deployed `wspace-adaptercloud-svc` subgraph through the workspace GraphQL\n * gateway via `graphqlFetch`. Operations, fields, inputs, enums and the\n * Connection/pageInfo shapes are taken verbatim from the service's\n * `.hive-schema.graphql`. No mocks — every screen reads/writes real data.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useAdapterCloud } from '../context';\nimport { notify } from '../lib/toast';\nimport type {\n AdaAdapter,\n AdaAdapterConnectionPage,\n AdaAdapterKind,\n AdaAdapterStatus,\n AdaConnection,\n AdaConnectionPage,\n AdaConnectionStatus,\n AdaCostRecord,\n AdaCostSummary,\n AdaDriftRecord,\n AdaDriftStatus,\n AdaPolicy,\n AdaPolicyKind,\n AdaPolicyPage,\n AdaPolicyViolation,\n AdaPolicyViolationPage,\n AdaResource,\n AdaResourcePage,\n AdaResourceState,\n AdaSyncRun,\n AdaSyncRunPage,\n AdaSyncStatus,\n AdaViolationStatus,\n PaginationInput,\n AdaCreateAdapterInput,\n AdaUpdateAdapterInput,\n AdaCreateConnectionInput,\n AdaUpdateConnectionInput,\n AdaCreatePolicyInput,\n AdaUpdatePolicyInput,\n AdaStartSyncRunInput,\n} from '../types';\n\n// ============================================================================\n// Query keys\n// ============================================================================\n\nexport const adaKeys = {\n all: ['adaptercloud'] as const,\n health: () => [...adaKeys.all, 'health'] as const,\n costSummary: (connectionId?: string) =>\n [...adaKeys.all, 'cost-summary', connectionId ?? null] as const,\n costRecords: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'cost-records', filter] as const,\n adapters: (filter: Record<string, unknown>) => [...adaKeys.all, 'adapters', filter] as const,\n adapter: (id: string) => [...adaKeys.all, 'adapter', id] as const,\n connections: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'connections', filter] as const,\n connection: (id: string) => [...adaKeys.all, 'connection', id] as const,\n resources: (filter: Record<string, unknown>) => [...adaKeys.all, 'resources', filter] as const,\n resource: (id: string) => [...adaKeys.all, 'resource', id] as const,\n policies: (filter: Record<string, unknown>) => [...adaKeys.all, 'policies', filter] as const,\n policy: (id: string) => [...adaKeys.all, 'policy', id] as const,\n violations: (filter: Record<string, unknown>) => [...adaKeys.all, 'violations', filter] as const,\n drift: (filter: Record<string, unknown>) => [...adaKeys.all, 'drift', filter] as const,\n syncRuns: (filter: Record<string, unknown>) => [...adaKeys.all, 'sync-runs', filter] as const,\n syncRun: (id: string) => [...adaKeys.all, 'sync-run', id] as const,\n};\n\n// ============================================================================\n// Low-level query wrapper\n// ============================================================================\n\nconst adaQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // After a successful mutation, drop the fe-libs graphqlFetch response cache\n // (≤30s TTL) so the follow-up React-Query refetch reads fresh data instead of\n // a stale cached response — otherwise writes appear to \"not take effect\" for\n // up to 30s. (fe-libs' own Apollo client does the same on every mutation.)\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\nconst STALE = 30 * 1000;\n\n// ============================================================================\n// Reusable GraphQL field selections (inline strings)\n// ============================================================================\n\nconst ADAPTER_FIELDS = `\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n`;\n\nconst CONNECTION_FIELDS = `\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n`;\n\nconst RESOURCE_FIELDS = `\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n`;\n\nconst POLICY_FIELDS = `\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n`;\n\nconst VIOLATION_FIELDS = `\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n`;\n\nconst DRIFT_FIELDS = `\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n`;\n\nconst SYNC_RUN_FIELDS = `\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n`;\n\n// `totalCount` is the real estate-wide count exposed on AdaPageInfo (svc-added).\n// Requested where the Overview tiles need an accurate total; consumers fall back\n// to `items.length` when it is null/undefined so the UI keeps working if absent.\nconst PAGE_INFO_FIELDS = `cursor hasMore totalCount`;\n\n// ============================================================================\n// Health\n// ============================================================================\n\nexport const useAdaHealth = () => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.health(),\n queryFn: async () => {\n const result = await adaQuery<{ adaHealth: string }>(\n `query AdaHealth { adaHealth }`,\n {},\n apiGatewayUrl\n );\n return result.adaHealth;\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Adapters\n// ============================================================================\n\nexport interface AdapterListFilter {\n kind?: AdaAdapterKind;\n status?: AdaAdapterStatus;\n pagination?: PaginationInput;\n}\n\nexport const useAdapters = (filter: AdapterListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapters(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListAdapters: AdaAdapterConnectionPage }>(\n `query AdaListAdapters($kind: AdaAdapterKind, $status: AdaAdapterStatus, $pagination: PaginationInput) {\n adaListAdapters(kind: $kind, status: $status, pagination: $pagination) {\n items { ${ADAPTER_FIELDS} }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n kind: filter.kind,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListAdapters;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useAdapter = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapter(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaAdapter: AdaAdapter | null }>(\n `query AdaAdapter($id: ID!) {\n adaAdapter(id: $id) {\n ${ADAPTER_FIELDS}\n connections { ${CONNECTION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaAdapter;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateAdapterInput) => {\n const result = await adaQuery<{ adaCreateAdapter: AdaAdapter }>(\n `mutation AdaCreateAdapter($input: AdaCreateAdapterInput!) {\n adaCreateAdapter(input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\nexport const useUpdateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateAdapterInput }) => {\n const result = await adaQuery<{ adaUpdateAdapter: AdaAdapter }>(\n `mutation AdaUpdateAdapter($id: ID!, $input: AdaUpdateAdapterInput!) {\n adaUpdateAdapter(id: $id, input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateAdapter;\n },\n onSuccess: (adapter) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.adapter(adapter.id) });\n },\n });\n};\n\nexport const useArchiveAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchiveAdapter: boolean }>(\n `mutation AdaArchiveAdapter($id: ID!) { adaArchiveAdapter(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchiveAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\n// ============================================================================\n// Connections\n// ============================================================================\n\nexport interface ConnectionListFilter {\n adapterId?: string;\n status?: AdaConnectionStatus;\n pagination?: PaginationInput;\n}\n\nexport const useConnections = (filter: ConnectionListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connections(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListConnections: AdaConnectionPage }>(\n `query AdaListConnections($adapterId: ID, $status: AdaConnectionStatus, $pagination: PaginationInput) {\n adaListConnections(adapterId: $adapterId, status: $status, pagination: $pagination) {\n items {\n ${CONNECTION_FIELDS}\n adapter { id name slug kind }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n adapterId: filter.adapterId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListConnections;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useConnection = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connection(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaConnection: AdaConnection | null }>(\n `query AdaConnection($id: ID!) {\n adaConnection(id: $id) {\n ${CONNECTION_FIELDS}\n adapter { ${ADAPTER_FIELDS} }\n resources { ${RESOURCE_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaConnection;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateConnectionInput) => {\n const result = await adaQuery<{ adaCreateConnection: AdaConnection }>(\n `mutation AdaCreateConnection($input: AdaCreateConnectionInput!) {\n adaCreateConnection(input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateConnection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useUpdateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateConnectionInput }) => {\n const result = await adaQuery<{ adaUpdateConnection: AdaConnection }>(\n `mutation AdaUpdateConnection($id: ID!, $input: AdaUpdateConnectionInput!) {\n adaUpdateConnection(id: $id, input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateConnection;\n },\n onSuccess: (connection) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useSetConnectionStatus = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: AdaConnectionStatus }) => {\n const result = await adaQuery<{ adaSetConnectionStatus: AdaConnection }>(\n `mutation AdaSetConnectionStatus($id: ID!, $status: AdaConnectionStatus!) {\n adaSetConnectionStatus(id: $id, status: $status) { ${CONNECTION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.adaSetConnectionStatus;\n },\n onSuccess: (connection) => {\n notify.success('Connection health updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useDisableConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaDisableConnection: AdaConnection }>(\n `mutation AdaDisableConnection($id: ID!) {\n adaDisableConnection(id: $id) { ${CONNECTION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaDisableConnection;\n },\n onSuccess: (connection) => {\n notify.success('Connection disabled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\n// ============================================================================\n// Resources\n// ============================================================================\n\nexport interface ResourceListFilter {\n connectionId?: string;\n resourceType?: string;\n state?: AdaResourceState;\n pagination?: PaginationInput;\n}\n\nexport const useResources = (filter: ResourceListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resources(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListResources: AdaResourcePage }>(\n `query AdaListResources($connectionId: ID, $resourceType: String, $state: AdaResourceState, $pagination: PaginationInput) {\n adaListResources(connectionId: $connectionId, resourceType: $resourceType, state: $state, pagination: $pagination) {\n items {\n ${RESOURCE_FIELDS}\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceType: filter.resourceType,\n state: filter.state,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListResources;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useResource = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resource(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaResource: AdaResource | null }>(\n `query AdaResource($id: ID!) {\n adaResource(id: $id) {\n ${RESOURCE_FIELDS}\n connection { ${CONNECTION_FIELDS} adapter { id name slug kind } }\n dependsOn { id name resourceType region state monthlyCost }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaResource;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Policies\n// ============================================================================\n\nexport interface PolicyListFilter {\n isActive?: boolean;\n kind?: AdaPolicyKind;\n pagination?: PaginationInput;\n}\n\nexport const usePolicies = (filter: PolicyListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policies(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListPolicies: AdaPolicyPage }>(\n `query AdaListPolicies($isActive: Boolean, $kind: AdaPolicyKind, $pagination: PaginationInput) {\n adaListPolicies(isActive: $isActive, kind: $kind, pagination: $pagination) {\n items { ${POLICY_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n isActive: filter.isActive,\n kind: filter.kind,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListPolicies;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const usePolicy = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policy(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaPolicy: AdaPolicy | null }>(\n `query AdaPolicy($id: ID!) {\n adaPolicy(id: $id) {\n ${POLICY_FIELDS}\n violations { ${VIOLATION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaPolicy;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreatePolicyInput) => {\n const result = await adaQuery<{ adaCreatePolicy: AdaPolicy }>(\n `mutation AdaCreatePolicy($input: AdaCreatePolicyInput!) {\n adaCreatePolicy(input: $input) { ${POLICY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreatePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\nexport const useUpdatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdatePolicyInput }) => {\n const result = await adaQuery<{ adaUpdatePolicy: AdaPolicy }>(\n `mutation AdaUpdatePolicy($id: ID!, $input: AdaUpdatePolicyInput!) {\n adaUpdatePolicy(id: $id, input: $input) { ${POLICY_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdatePolicy;\n },\n onSuccess: (policy) => {\n notify.success('Policy updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.policy(policy.id) });\n },\n });\n};\n\nexport const useArchivePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchivePolicy: boolean }>(\n `mutation AdaArchivePolicy($id: ID!) { adaArchivePolicy(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchivePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\n// ============================================================================\n// Violations\n// ============================================================================\n\nexport interface ViolationListFilter {\n policyId?: string;\n resourceId?: string;\n status?: AdaViolationStatus;\n pagination?: PaginationInput;\n}\n\nexport const useViolations = (filter: ViolationListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.violations(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListViolations: AdaPolicyViolationPage }>(\n `query AdaListViolations($policyId: ID, $resourceId: ID, $status: AdaViolationStatus, $pagination: PaginationInput) {\n adaListViolations(policyId: $policyId, resourceId: $resourceId, status: $status, pagination: $pagination) {\n items {\n ${VIOLATION_FIELDS}\n policy { id name kind severity }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n policyId: filter.policyId,\n resourceId: filter.resourceId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListViolations;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useResolveViolation = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({\n id,\n status,\n waiverReason,\n }: {\n id: string;\n status: AdaViolationStatus;\n waiverReason?: string;\n }) => {\n const result = await adaQuery<{ adaResolveViolation: AdaPolicyViolation }>(\n `mutation AdaResolveViolation($id: ID!, $status: AdaViolationStatus!, $waiverReason: String) {\n adaResolveViolation(id: $id, status: $status, waiverReason: $waiverReason) {\n ${VIOLATION_FIELDS}\n }\n }`,\n { id, status, waiverReason },\n apiGatewayUrl\n );\n return result.adaResolveViolation;\n },\n onSuccess: (violation) => {\n const label: Record<string, string> = {\n ACKNOWLEDGED: 'Violation acknowledged',\n RESOLVED: 'Violation resolved',\n WAIVED: 'Violation waived',\n OPEN: 'Violation reopened',\n };\n notify.success(label[violation.status] ?? 'Violation updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'violations'] });\n },\n });\n};\n\n// ============================================================================\n// Drift\n// ============================================================================\n\nexport interface DriftListFilter {\n resourceId?: string;\n status?: AdaDriftStatus;\n}\n\nexport const useDriftRecords = (filter: DriftListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.drift(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListDriftRecords: AdaDriftRecord[] }>(\n `query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus) {\n adaListDriftRecords(resourceId: $resourceId, status: $status) { ${DRIFT_FIELDS} }\n }`,\n { resourceId: filter.resourceId, status: filter.status },\n apiGatewayUrl\n );\n return result.adaListDriftRecords;\n },\n staleTime: STALE,\n });\n};\n\nexport const useRemediateDrift = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaRemediateDrift: AdaDriftRecord }>(\n `mutation AdaRemediateDrift($id: ID!) {\n adaRemediateDrift(id: $id) { ${DRIFT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaRemediateDrift;\n },\n onSuccess: () => {\n notify.success('Drift marked remediated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'drift'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'resources'] });\n },\n });\n};\n\n// ============================================================================\n// Sync runs\n// ============================================================================\n\nexport interface SyncRunListFilter {\n connectionId?: string;\n status?: AdaSyncStatus;\n pagination?: PaginationInput;\n}\n\nexport const useSyncRuns = (filter: SyncRunListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.syncRuns(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListSyncRuns: AdaSyncRunPage }>(\n `query AdaListSyncRuns($connectionId: ID, $status: AdaSyncStatus, $pagination: PaginationInput) {\n adaListSyncRuns(connectionId: $connectionId, status: $status, pagination: $pagination) {\n items { ${SYNC_RUN_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n connectionId: filter.connectionId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListSyncRuns;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useStartSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaStartSyncRunInput) => {\n const result = await adaQuery<{ adaStartSyncRun: AdaSyncRun }>(\n `mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {\n adaStartSyncRun(input: $input) { ${SYNC_RUN_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaStartSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run started');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useCancelSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaCancelSyncRun: AdaSyncRun }>(\n `mutation AdaCancelSyncRun($id: ID!) {\n adaCancelSyncRun(id: $id) { ${SYNC_RUN_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaCancelSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run cancelled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n },\n });\n};\n\n// ============================================================================\n// FinOps — cost\n// ============================================================================\n\nexport const useCostSummary = (connectionId?: string) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costSummary(connectionId),\n queryFn: async () => {\n const result = await adaQuery<{ adaCostSummary: AdaCostSummary }>(\n `query AdaCostSummary($connectionId: ID) {\n adaCostSummary(connectionId: $connectionId) {\n currency total\n lines { service total }\n }\n }`,\n { connectionId },\n apiGatewayUrl\n );\n return result.adaCostSummary;\n },\n staleTime: STALE,\n });\n};\n\nexport interface CostRecordListFilter {\n connectionId?: string;\n resourceId?: string;\n service?: string;\n}\n\nexport const useCostRecords = (filter: CostRecordListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costRecords(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListCostRecords: AdaCostRecord[] }>(\n `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service) {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceId: filter.resourceId,\n service: filter.service,\n },\n apiGatewayUrl\n );\n return result.adaListCostRecords;\n },\n staleTime: STALE,\n });\n};\n"],"mappings":"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"}
|