canvas/dist/db/index.js

1363 lines
38 KiB
JavaScript
Raw Normal View History

2026-03-11 18:42:08 -07:00
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
// src/db/index.ts
var index_exports = {};
__export(index_exports, {
CanvasDbProvider: () => CanvasDbProvider,
InMemoryStorageAdapter: () => InMemoryStorageAdapter,
SupabaseStorageAdapter: () => SupabaseStorageAdapter,
canvasKeys: () => canvasKeys,
createGraphEdge: () => createGraphEdge,
createGraphNode: () => createGraphNode,
deleteGraphEdge: () => deleteGraphEdge,
deleteGraphNode: () => deleteGraphNode,
fetchGraphEdges: () => fetchGraphEdges,
fetchGraphNode: () => fetchGraphNode,
fetchGraphNodes: () => fetchGraphNodes,
storageAdapterAtom: () => storageAdapterAtom,
updateGraphEdge: () => updateGraphEdge,
updateGraphNode: () => updateGraphNode,
useCreateEdge: () => useCreateEdge,
useCreateNode: () => useCreateNode,
useDeleteEdge: () => useDeleteEdge,
useDeleteNode: () => useDeleteNode,
useGraphEdges: () => useGraphEdges,
useGraphNodes: () => useGraphNodes,
useStorageAdapter: () => useStorageAdapter,
useUpdateEdge: () => useUpdateEdge,
useUpdateNode: () => useUpdateNode
});
module.exports = __toCommonJS(index_exports);
// src/db/adapter.ts
var import_jotai = require("jotai");
var InMemoryStorageAdapter = class {
constructor() {
__publicField(this, "nodes", /* @__PURE__ */ new Map());
__publicField(this, "edges", /* @__PURE__ */ new Map());
}
async fetchNodes(graphId) {
return Array.from(this.nodes.values()).filter((n) => n.graph_id === graphId);
}
async createNode(graphId, node) {
const now = (/* @__PURE__ */ new Date()).toISOString();
const fullNode = {
id: node.id ?? crypto.randomUUID(),
graph_id: graphId,
label: node.label ?? null,
node_type: node.node_type ?? null,
configuration: node.configuration ?? null,
ui_properties: node.ui_properties ?? null,
data: node.data ?? null,
created_at: now,
updated_at: now
};
this.nodes.set(fullNode.id, fullNode);
return fullNode;
}
async updateNode(nodeId, updates) {
const existing = this.nodes.get(nodeId);
if (!existing) throw new Error(`Node ${nodeId} not found`);
const updated = {
...existing,
...updates,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
};
this.nodes.set(nodeId, updated);
return updated;
}
async deleteNode(nodeId) {
this.nodes.delete(nodeId);
for (const [edgeId, edge] of this.edges) {
if (edge.source_node_id === nodeId || edge.target_node_id === nodeId) {
this.edges.delete(edgeId);
}
}
}
async fetchEdges(graphId) {
return Array.from(this.edges.values()).filter((e) => e.graph_id === graphId);
}
async createEdge(graphId, edge) {
const now = (/* @__PURE__ */ new Date()).toISOString();
const fullEdge = {
id: edge.id ?? crypto.randomUUID(),
graph_id: graphId,
source_node_id: edge.source_node_id ?? "",
target_node_id: edge.target_node_id ?? "",
edge_type: edge.edge_type ?? null,
filter_condition: edge.filter_condition ?? null,
ui_properties: edge.ui_properties ?? null,
data: edge.data ?? null,
created_at: now,
updated_at: now
};
this.edges.set(fullEdge.id, fullEdge);
return fullEdge;
}
async updateEdge(edgeId, updates) {
const existing = this.edges.get(edgeId);
if (!existing) throw new Error(`Edge ${edgeId} not found`);
const updated = {
...existing,
...updates,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
};
this.edges.set(edgeId, updated);
return updated;
}
async deleteEdge(edgeId) {
this.edges.delete(edgeId);
}
// --- Batch Operations ---
async createNodes(graphId, nodes) {
return Promise.all(nodes.map((n) => this.createNode(graphId, n)));
}
async deleteNodes(nodeIds) {
for (const id of nodeIds) {
await this.deleteNode(id);
}
}
async createEdges(graphId, edges) {
return Promise.all(edges.map((e) => this.createEdge(graphId, e)));
}
async deleteEdges(edgeIds) {
for (const id of edgeIds) {
await this.deleteEdge(id);
}
}
};
var storageAdapterAtom = (0, import_jotai.atom)(null);
// src/db/supabase-adapter.ts
var SupabaseStorageAdapter = class {
constructor(client) {
this.client = client;
}
/** Get the underlying Supabase client (for advanced use or backward compat) */
getClient() {
return this.client;
}
// --- Node Operations ---
async fetchNodes(graphId) {
const {
data,
error
} = await this.client.from("nodes").select("*").eq("graph_id", graphId).order("created_at", {
ascending: true
});
if (error) throw error;
return data || [];
}
async createNode(graphId, node) {
const {
data,
error
} = await this.client.from("nodes").insert({
graph_id: graphId,
label: node.label ?? null,
node_type: node.node_type ?? null,
configuration: node.configuration ?? null,
ui_properties: node.ui_properties ?? null,
data: node.data ?? null
}).select().single();
if (error) throw error;
return data;
}
async updateNode(nodeId, updates) {
const {
data,
error
} = await this.client.from("nodes").update({
...updates,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
}).eq("id", nodeId).select().single();
if (error) throw error;
return data;
}
async deleteNode(nodeId) {
const {
error
} = await this.client.from("nodes").delete().eq("id", nodeId);
if (error) throw error;
}
// --- Edge Operations ---
async fetchEdges(graphId) {
const {
data,
error
} = await this.client.from("edges").select("*").eq("graph_id", graphId).order("created_at", {
ascending: true
});
if (error) throw error;
return data || [];
}
async createEdge(graphId, edge) {
const {
data,
error
} = await this.client.from("edges").insert({
graph_id: graphId,
source_node_id: edge.source_node_id ?? "",
target_node_id: edge.target_node_id ?? "",
edge_type: edge.edge_type ?? null,
filter_condition: edge.filter_condition ?? null,
ui_properties: edge.ui_properties ?? null,
data: edge.data ?? null
}).select().single();
if (error) throw error;
return data;
}
async updateEdge(edgeId, updates) {
const {
data,
error
} = await this.client.from("edges").update({
...updates,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
}).eq("id", edgeId).select().single();
if (error) throw error;
return data;
}
async deleteEdge(edgeId) {
const {
error
} = await this.client.from("edges").delete().eq("id", edgeId);
if (error) throw error;
}
// --- Realtime (optional) ---
subscribe(graphId, onChange) {
const channel = this.client.channel(`canvas-${graphId}`).on("postgres_changes", {
event: "*",
schema: "public",
table: "nodes",
filter: `graph_id=eq.${graphId}`
}, (payload) => {
onChange({
type: payload.eventType,
table: "nodes",
new: payload.new,
old: payload.old
});
}).on("postgres_changes", {
event: "*",
schema: "public",
table: "edges",
filter: `graph_id=eq.${graphId}`
}, (payload) => {
onChange({
type: payload.eventType,
table: "edges",
new: payload.new,
old: payload.old
});
}).subscribe();
return () => {
channel.unsubscribe();
};
}
};
// src/db/provider.tsx
var import_react = __toESM(require("react"));
var import_jotai2 = require("jotai");
var import_jotai3 = require("jotai");
var import_jsx_runtime = require("react/jsx-runtime");
var AdapterContext = /* @__PURE__ */ (0, import_react.createContext)(null);
function CanvasDbProvider({
adapter,
children
}) {
const setAdapter = (0, import_jotai2.useSetAtom)(storageAdapterAtom);
const prevAdapterRef = (0, import_react.useRef)(null);
const resolved = adapter === prevAdapterRef.current ? prevAdapterRef.current : adapter;
prevAdapterRef.current = resolved;
(0, import_react.useEffect)(() => {
setAdapter(resolved);
return () => setAdapter(null);
}, [resolved, setAdapter]);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AdapterContext, {
value: resolved,
children
});
}
function useStorageAdapter() {
const contextAdapter = (0, import_react.useContext)(AdapterContext);
const atomAdapter = (0, import_jotai2.useAtomValue)(storageAdapterAtom);
const adapter = contextAdapter || atomAdapter;
if (!adapter) {
throw new Error("useStorageAdapter must be used within CanvasDbProvider");
}
return adapter;
}
var supabaseClientAtom = (0, import_jotai3.atom)(null);
function useSupabaseClient() {
const client = (0, import_jotai3.useAtomValue)(supabaseClientAtom);
if (!client) {
throw new Error("useSupabaseClient: no Supabase client available. Use CanvasDbProvider with a SupabaseStorageAdapter.");
}
return client;
}
// src/utils/debug.ts
var import_debug = __toESM(require("debug"));
var NAMESPACE = "canvas";
function createDebug(module2) {
const base = (0, import_debug.default)(`${NAMESPACE}:${module2}`);
const warn = (0, import_debug.default)(`${NAMESPACE}:${module2}:warn`);
const error = (0, import_debug.default)(`${NAMESPACE}:${module2}:error`);
warn.enabled = true;
error.enabled = true;
warn.log = console.warn.bind(console);
error.log = console.error.bind(console);
const debugFn = Object.assign(base, {
warn,
error
});
return debugFn;
}
var debug = {
graph: {
node: createDebug("graph:node"),
edge: createDebug("graph:edge"),
sync: createDebug("graph:sync")
},
ui: {
selection: createDebug("ui:selection"),
drag: createDebug("ui:drag"),
resize: createDebug("ui:resize")
},
sync: {
status: createDebug("sync:status"),
mutations: createDebug("sync:mutations"),
queue: createDebug("sync:queue")
},
viewport: createDebug("viewport")
};
// src/db/queries/nodes.ts
var debug2 = createDebug("db:nodes");
async function fetchGraphNodes(supabase, graphId) {
if (!graphId) {
throw new Error("graphId is required to fetch nodes");
}
const {
data,
error
} = await supabase.from("nodes").select("*").eq("graph_id", graphId).order("created_at", {
ascending: true
});
if (error) {
debug2.error("Error fetching nodes for graph %s: %O", graphId, error);
throw error;
}
return data || [];
}
async function fetchGraphNode(supabase, nodeId) {
if (!nodeId) {
throw new Error("nodeId is required to fetch node");
}
const {
data,
error
} = await supabase.from("nodes").select("*").eq("id", nodeId).single();
if (error) {
if (error.code === "PGRST116") {
return null;
}
debug2.error("Error fetching node %s: %O", nodeId, error);
throw error;
}
return data;
}
async function createGraphNode(supabase, node) {
const {
data,
error
} = await supabase.from("nodes").insert(node).select().single();
if (error) {
debug2.error("Error creating node: %O", error);
throw error;
}
return data;
}
async function updateGraphNode(supabase, nodeId, updates) {
const {
data,
error
} = await supabase.from("nodes").update({
...updates,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
}).eq("id", nodeId).select().single();
if (error) {
debug2.error("Error updating node %s: %O", nodeId, error);
throw error;
}
return data;
}
async function deleteGraphNode(supabase, nodeId) {
const {
error
} = await supabase.from("nodes").delete().eq("id", nodeId);
if (error) {
debug2.error("Error deleting node %s: %O", nodeId, error);
throw error;
}
}
// src/db/queries/edges.ts
var debug3 = createDebug("db:edges");
async function fetchGraphEdges(supabase, graphId) {
if (!graphId) {
throw new Error("graphId is required to fetch edges");
}
const {
data,
error
} = await supabase.from("edges").select("*").eq("graph_id", graphId).order("created_at", {
ascending: true
});
if (error) {
debug3.error("Error fetching edges for graph %s: %O", graphId, error);
throw error;
}
return data || [];
}
async function createGraphEdge(supabase, edge) {
const {
data,
error
} = await supabase.from("edges").insert(edge).select().single();
if (error) {
debug3.error("Error creating edge: %O", error);
throw error;
}
return data;
}
async function updateGraphEdge(supabase, edgeId, updates) {
const {
data,
error
} = await supabase.from("edges").update({
...updates,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
}).eq("id", edgeId).select().single();
if (error) {
debug3.error("Error updating edge %s: %O", edgeId, error);
throw error;
}
return data;
}
async function deleteGraphEdge(supabase, edgeId) {
const {
error
} = await supabase.from("edges").delete().eq("id", edgeId);
if (error) {
debug3.error("Error deleting edge %s: %O", edgeId, error);
throw error;
}
}
// src/db/hooks/keys.ts
var canvasKeys = {
all: ["canvas"],
graphs: () => [...canvasKeys.all, "graphs"],
graph: (graphId) => [...canvasKeys.graphs(), graphId],
nodes: (graphId) => [...canvasKeys.graph(graphId), "nodes"],
node: (graphId, nodeId) => [...canvasKeys.nodes(graphId), nodeId],
edges: (graphId) => [...canvasKeys.graph(graphId), "edges"],
edge: (graphId, edgeId) => [...canvasKeys.edges(graphId), edgeId]
};
// src/db/hooks/useGraphNodes.ts
var import_compiler_runtime = require("react/compiler-runtime");
var import_react_query = require("@tanstack/react-query");
function useGraphNodes(graphId, t0) {
const $ = (0, import_compiler_runtime.c)(11);
let t1;
if ($[0] !== t0) {
t1 = t0 === void 0 ? {} : t0;
$[0] = t0;
$[1] = t1;
} else {
t1 = $[1];
}
const options = t1;
const {
enabled: t2
} = options;
const enabled = t2 === void 0 ? true : t2;
const supabase = useSupabaseClient();
let t3;
if ($[2] !== graphId) {
t3 = canvasKeys.nodes(graphId || "");
$[2] = graphId;
$[3] = t3;
} else {
t3 = $[3];
}
let t4;
if ($[4] !== graphId || $[5] !== supabase) {
t4 = () => fetchGraphNodes(supabase, graphId);
$[4] = graphId;
$[5] = supabase;
$[6] = t4;
} else {
t4 = $[6];
}
const t5 = enabled && !!graphId;
let t6;
if ($[7] !== t3 || $[8] !== t4 || $[9] !== t5) {
t6 = {
queryKey: t3,
queryFn: t4,
enabled: t5
};
$[7] = t3;
$[8] = t4;
$[9] = t5;
$[10] = t6;
} else {
t6 = $[10];
}
return (0, import_react_query.useQuery)(t6);
}
// src/db/hooks/useGraphEdges.ts
var import_compiler_runtime2 = require("react/compiler-runtime");
var import_react_query2 = require("@tanstack/react-query");
function useGraphEdges(graphId, t0) {
const $ = (0, import_compiler_runtime2.c)(11);
let t1;
if ($[0] !== t0) {
t1 = t0 === void 0 ? {} : t0;
$[0] = t0;
$[1] = t1;
} else {
t1 = $[1];
}
const options = t1;
const {
enabled: t2
} = options;
const enabled = t2 === void 0 ? true : t2;
const supabase = useSupabaseClient();
let t3;
if ($[2] !== graphId) {
t3 = canvasKeys.edges(graphId || "");
$[2] = graphId;
$[3] = t3;
} else {
t3 = $[3];
}
let t4;
if ($[4] !== graphId || $[5] !== supabase) {
t4 = () => fetchGraphEdges(supabase, graphId);
$[4] = graphId;
$[5] = supabase;
$[6] = t4;
} else {
t4 = $[6];
}
const t5 = enabled && !!graphId;
let t6;
if ($[7] !== t3 || $[8] !== t4 || $[9] !== t5) {
t6 = {
queryKey: t3,
queryFn: t4,
enabled: t5
};
$[7] = t3;
$[8] = t4;
$[9] = t5;
$[10] = t6;
} else {
t6 = $[10];
}
return (0, import_react_query2.useQuery)(t6);
}
// src/db/hooks/useUpdateNode.ts
var import_compiler_runtime3 = require("react/compiler-runtime");
var import_react_query3 = require("@tanstack/react-query");
var import_jotai5 = require("jotai");
// src/core/sync-store.ts
var import_jotai4 = require("jotai");
var debug4 = createDebug("sync");
var syncStatusAtom = (0, import_jotai4.atom)("synced");
var pendingMutationsCountAtom = (0, import_jotai4.atom)(0);
var isOnlineAtom = (0, import_jotai4.atom)(typeof navigator !== "undefined" ? navigator.onLine : true);
var lastSyncErrorAtom = (0, import_jotai4.atom)(null);
var lastSyncTimeAtom = (0, import_jotai4.atom)(Date.now());
var mutationQueueAtom = (0, import_jotai4.atom)([]);
var syncStateAtom = (0, import_jotai4.atom)((get) => ({
status: get(syncStatusAtom),
pendingMutations: get(pendingMutationsCountAtom),
lastError: get(lastSyncErrorAtom),
lastSyncTime: get(lastSyncTimeAtom),
isOnline: get(isOnlineAtom),
queuedMutations: get(mutationQueueAtom).length
}));
var startMutationAtom = (0, import_jotai4.atom)(null, (get, set) => {
const currentCount = get(pendingMutationsCountAtom);
const newCount = currentCount + 1;
set(pendingMutationsCountAtom, newCount);
debug4("Mutation started. Pending count: %d -> %d", currentCount, newCount);
if (newCount > 0 && get(syncStatusAtom) !== "syncing") {
set(syncStatusAtom, "syncing");
debug4("Status -> syncing");
}
});
var completeMutationAtom = (0, import_jotai4.atom)(null, (get, set, success = true) => {
const currentCount = get(pendingMutationsCountAtom);
const newCount = Math.max(0, currentCount - 1);
set(pendingMutationsCountAtom, newCount);
debug4("Mutation completed (success: %s). Pending count: %d -> %d", success, currentCount, newCount);
if (success) {
set(lastSyncTimeAtom, Date.now());
if (newCount === 0) {
set(lastSyncErrorAtom, null);
}
}
if (newCount === 0) {
const isOnline = get(isOnlineAtom);
const hasError = get(lastSyncErrorAtom) !== null;
if (hasError) {
set(syncStatusAtom, "error");
debug4("Status -> error");
} else if (!isOnline) {
set(syncStatusAtom, "offline");
debug4("Status -> offline");
} else {
set(syncStatusAtom, "synced");
debug4("Status -> synced");
}
}
});
var trackMutationErrorAtom = (0, import_jotai4.atom)(null, (_get, set, error) => {
set(lastSyncErrorAtom, error);
debug4("Mutation failed: %s", error);
});
var setOnlineStatusAtom = (0, import_jotai4.atom)(null, (get, set, isOnline) => {
set(isOnlineAtom, isOnline);
const pendingCount = get(pendingMutationsCountAtom);
const hasError = get(lastSyncErrorAtom) !== null;
const queueLength = get(mutationQueueAtom).length;
if (pendingCount === 0) {
if (hasError || queueLength > 0) {
set(syncStatusAtom, "error");
} else {
set(syncStatusAtom, isOnline ? "synced" : "offline");
}
}
});
var queueMutationAtom = (0, import_jotai4.atom)(null, (get, set, mutation) => {
const queue = get(mutationQueueAtom);
const newMutation = {
...mutation,
id: crypto.randomUUID(),
timestamp: Date.now(),
retryCount: 0,
maxRetries: mutation.maxRetries ?? 3
};
const newQueue = [...queue, newMutation];
set(mutationQueueAtom, newQueue);
debug4("Queued mutation: %s. Queue size: %d", mutation.type, newQueue.length);
if (get(pendingMutationsCountAtom) === 0) {
set(syncStatusAtom, "error");
}
return newMutation.id;
});
var dequeueMutationAtom = (0, import_jotai4.atom)(null, (get, set, mutationId) => {
const queue = get(mutationQueueAtom);
const newQueue = queue.filter((m) => m.id !== mutationId);
set(mutationQueueAtom, newQueue);
debug4("Dequeued mutation: %s. Queue size: %d", mutationId, newQueue.length);
if (newQueue.length === 0 && get(pendingMutationsCountAtom) === 0 && get(lastSyncErrorAtom) === null) {
set(syncStatusAtom, get(isOnlineAtom) ? "synced" : "offline");
}
});
var incrementRetryCountAtom = (0, import_jotai4.atom)(null, (get, set, mutationId) => {
const queue = get(mutationQueueAtom);
const newQueue = queue.map((m) => m.id === mutationId ? {
...m,
retryCount: m.retryCount + 1
} : m);
set(mutationQueueAtom, newQueue);
});
var getNextQueuedMutationAtom = (0, import_jotai4.atom)((get) => {
const queue = get(mutationQueueAtom);
return queue.find((m) => m.retryCount < m.maxRetries) ?? null;
});
var clearMutationQueueAtom = (0, import_jotai4.atom)(null, (get, set) => {
set(mutationQueueAtom, []);
debug4("Cleared mutation queue");
if (get(pendingMutationsCountAtom) === 0 && get(lastSyncErrorAtom) === null) {
set(syncStatusAtom, get(isOnlineAtom) ? "synced" : "offline");
}
});
// src/db/hooks/useUpdateNode.ts
function useUpdateNode() {
const $ = (0, import_compiler_runtime3.c)(18);
const queryClient = (0, import_react_query3.useQueryClient)();
const supabase = useSupabaseClient();
const startMutation = (0, import_jotai5.useSetAtom)(startMutationAtom);
const completeMutation = (0, import_jotai5.useSetAtom)(completeMutationAtom);
let t0;
if ($[0] !== supabase) {
t0 = async (t12) => {
const {
nodeId,
updates
} = t12;
return updateGraphNode(supabase, nodeId, updates);
};
$[0] = supabase;
$[1] = t0;
} else {
t0 = $[1];
}
let t1;
if ($[2] !== queryClient || $[3] !== startMutation) {
t1 = async (t22) => {
const {
nodeId: nodeId_0,
graphId,
updates: updates_0
} = t22;
startMutation();
await queryClient.cancelQueries({
queryKey: canvasKeys.nodes(graphId)
});
const previousNodes = queryClient.getQueryData(canvasKeys.nodes(graphId));
if (previousNodes) {
queryClient.setQueryData(canvasKeys.nodes(graphId), (old) => old?.map((node) => node.id === nodeId_0 ? {
...node,
...updates_0,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
} : node));
}
return {
previousNodes,
graphId
};
};
$[2] = queryClient;
$[3] = startMutation;
$[4] = t1;
} else {
t1 = $[4];
}
let t2;
if ($[5] !== completeMutation || $[6] !== queryClient) {
t2 = (_err, _variables, context) => {
if (context?.previousNodes) {
queryClient.setQueryData(canvasKeys.nodes(context.graphId), context.previousNodes);
}
completeMutation(false);
};
$[5] = completeMutation;
$[6] = queryClient;
$[7] = t2;
} else {
t2 = $[7];
}
let t3;
if ($[8] !== completeMutation) {
t3 = () => {
completeMutation(true);
};
$[8] = completeMutation;
$[9] = t3;
} else {
t3 = $[9];
}
let t4;
if ($[10] !== queryClient) {
t4 = (_data, _error, variables) => {
queryClient.invalidateQueries({
queryKey: canvasKeys.nodes(variables.graphId)
});
};
$[10] = queryClient;
$[11] = t4;
} else {
t4 = $[11];
}
let t5;
if ($[12] !== t0 || $[13] !== t1 || $[14] !== t2 || $[15] !== t3 || $[16] !== t4) {
t5 = {
mutationFn: t0,
onMutate: t1,
onError: t2,
onSuccess: t3,
onSettled: t4
};
$[12] = t0;
$[13] = t1;
$[14] = t2;
$[15] = t3;
$[16] = t4;
$[17] = t5;
} else {
t5 = $[17];
}
return (0, import_react_query3.useMutation)(t5);
}
// src/db/hooks/useCreateNode.ts
var import_compiler_runtime4 = require("react/compiler-runtime");
var import_react_query4 = require("@tanstack/react-query");
var import_jotai6 = require("jotai");
function useCreateNode() {
const $ = (0, import_compiler_runtime4.c)(17);
const queryClient = (0, import_react_query4.useQueryClient)();
const supabase = useSupabaseClient();
const startMutation = (0, import_jotai6.useSetAtom)(startMutationAtom);
const completeMutation = (0, import_jotai6.useSetAtom)(completeMutationAtom);
let t0;
if ($[0] !== supabase) {
t0 = async (node) => createGraphNode(supabase, node);
$[0] = supabase;
$[1] = t0;
} else {
t0 = $[1];
}
let t1;
if ($[2] !== queryClient || $[3] !== startMutation) {
t1 = async (node_0) => {
startMutation();
await queryClient.cancelQueries({
queryKey: canvasKeys.nodes(node_0.graph_id)
});
const previousNodes = queryClient.getQueryData(canvasKeys.nodes(node_0.graph_id));
const optimisticNode = {
...node_0,
id: `temp-${Date.now()}`,
created_at: (/* @__PURE__ */ new Date()).toISOString(),
updated_at: (/* @__PURE__ */ new Date()).toISOString()
};
queryClient.setQueryData(canvasKeys.nodes(node_0.graph_id), (old) => [...old || [], optimisticNode]);
return {
previousNodes,
graphId: node_0.graph_id,
optimisticId: optimisticNode.id
};
};
$[2] = queryClient;
$[3] = startMutation;
$[4] = t1;
} else {
t1 = $[4];
}
let t2;
let t3;
if ($[5] !== completeMutation || $[6] !== queryClient) {
t2 = (_err, _variables, context) => {
if (context?.previousNodes) {
queryClient.setQueryData(canvasKeys.nodes(context.graphId), context.previousNodes);
}
completeMutation(false);
};
t3 = (newNode, _variables_0, context_0) => {
if (context_0) {
queryClient.setQueryData(canvasKeys.nodes(context_0.graphId), (old_0) => old_0?.map((node_1) => node_1.id === context_0.optimisticId ? newNode : node_1));
}
completeMutation(true);
};
$[5] = completeMutation;
$[6] = queryClient;
$[7] = t2;
$[8] = t3;
} else {
t2 = $[7];
t3 = $[8];
}
let t4;
if ($[9] !== queryClient) {
t4 = (_data, _error, variables) => {
queryClient.invalidateQueries({
queryKey: canvasKeys.nodes(variables.graph_id)
});
};
$[9] = queryClient;
$[10] = t4;
} else {
t4 = $[10];
}
let t5;
if ($[11] !== t0 || $[12] !== t1 || $[13] !== t2 || $[14] !== t3 || $[15] !== t4) {
t5 = {
mutationFn: t0,
onMutate: t1,
onError: t2,
onSuccess: t3,
onSettled: t4
};
$[11] = t0;
$[12] = t1;
$[13] = t2;
$[14] = t3;
$[15] = t4;
$[16] = t5;
} else {
t5 = $[16];
}
return (0, import_react_query4.useMutation)(t5);
}
// src/db/hooks/useDeleteNode.ts
var import_compiler_runtime5 = require("react/compiler-runtime");
var import_react_query5 = require("@tanstack/react-query");
var import_jotai7 = require("jotai");
function useDeleteNode() {
const $ = (0, import_compiler_runtime5.c)(18);
const queryClient = (0, import_react_query5.useQueryClient)();
const supabase = useSupabaseClient();
const startMutation = (0, import_jotai7.useSetAtom)(startMutationAtom);
const completeMutation = (0, import_jotai7.useSetAtom)(completeMutationAtom);
let t0;
if ($[0] !== supabase) {
t0 = async (t12) => {
const {
nodeId
} = t12;
return deleteGraphNode(supabase, nodeId);
};
$[0] = supabase;
$[1] = t0;
} else {
t0 = $[1];
}
let t1;
if ($[2] !== queryClient || $[3] !== startMutation) {
t1 = async (t22) => {
const {
nodeId: nodeId_0,
graphId
} = t22;
startMutation();
await queryClient.cancelQueries({
queryKey: canvasKeys.nodes(graphId)
});
const previousNodes = queryClient.getQueryData(canvasKeys.nodes(graphId));
if (previousNodes) {
queryClient.setQueryData(canvasKeys.nodes(graphId), (old) => old?.filter((node) => node.id !== nodeId_0));
}
return {
previousNodes,
graphId
};
};
$[2] = queryClient;
$[3] = startMutation;
$[4] = t1;
} else {
t1 = $[4];
}
let t2;
if ($[5] !== completeMutation || $[6] !== queryClient) {
t2 = (_err, _variables, context) => {
if (context?.previousNodes) {
queryClient.setQueryData(canvasKeys.nodes(context.graphId), context.previousNodes);
}
completeMutation(false);
};
$[5] = completeMutation;
$[6] = queryClient;
$[7] = t2;
} else {
t2 = $[7];
}
let t3;
if ($[8] !== completeMutation) {
t3 = () => {
completeMutation(true);
};
$[8] = completeMutation;
$[9] = t3;
} else {
t3 = $[9];
}
let t4;
if ($[10] !== queryClient) {
t4 = (_data, _error, variables) => {
queryClient.invalidateQueries({
queryKey: canvasKeys.nodes(variables.graphId)
});
};
$[10] = queryClient;
$[11] = t4;
} else {
t4 = $[11];
}
let t5;
if ($[12] !== t0 || $[13] !== t1 || $[14] !== t2 || $[15] !== t3 || $[16] !== t4) {
t5 = {
mutationFn: t0,
onMutate: t1,
onError: t2,
onSuccess: t3,
onSettled: t4
};
$[12] = t0;
$[13] = t1;
$[14] = t2;
$[15] = t3;
$[16] = t4;
$[17] = t5;
} else {
t5 = $[17];
}
return (0, import_react_query5.useMutation)(t5);
}
// src/db/hooks/useUpdateEdge.ts
var import_compiler_runtime6 = require("react/compiler-runtime");
var import_react_query6 = require("@tanstack/react-query");
var import_jotai8 = require("jotai");
function useUpdateEdge() {
const $ = (0, import_compiler_runtime6.c)(18);
const queryClient = (0, import_react_query6.useQueryClient)();
const supabase = useSupabaseClient();
const startMutation = (0, import_jotai8.useSetAtom)(startMutationAtom);
const completeMutation = (0, import_jotai8.useSetAtom)(completeMutationAtom);
let t0;
if ($[0] !== supabase) {
t0 = async (t12) => {
const {
edgeId,
updates
} = t12;
return updateGraphEdge(supabase, edgeId, updates);
};
$[0] = supabase;
$[1] = t0;
} else {
t0 = $[1];
}
let t1;
if ($[2] !== queryClient || $[3] !== startMutation) {
t1 = async (t22) => {
const {
edgeId: edgeId_0,
graphId,
updates: updates_0
} = t22;
startMutation();
await queryClient.cancelQueries({
queryKey: canvasKeys.edges(graphId)
});
const previousEdges = queryClient.getQueryData(canvasKeys.edges(graphId));
if (previousEdges) {
queryClient.setQueryData(canvasKeys.edges(graphId), (old) => old?.map((edge) => edge.id === edgeId_0 ? {
...edge,
...updates_0,
updated_at: (/* @__PURE__ */ new Date()).toISOString()
} : edge));
}
return {
previousEdges,
graphId
};
};
$[2] = queryClient;
$[3] = startMutation;
$[4] = t1;
} else {
t1 = $[4];
}
let t2;
if ($[5] !== completeMutation || $[6] !== queryClient) {
t2 = (_err, _variables, context) => {
if (context?.previousEdges) {
queryClient.setQueryData(canvasKeys.edges(context.graphId), context.previousEdges);
}
completeMutation(false);
};
$[5] = completeMutation;
$[6] = queryClient;
$[7] = t2;
} else {
t2 = $[7];
}
let t3;
if ($[8] !== completeMutation) {
t3 = () => {
completeMutation(true);
};
$[8] = completeMutation;
$[9] = t3;
} else {
t3 = $[9];
}
let t4;
if ($[10] !== queryClient) {
t4 = (_data, _error, variables) => {
queryClient.invalidateQueries({
queryKey: canvasKeys.edges(variables.graphId)
});
};
$[10] = queryClient;
$[11] = t4;
} else {
t4 = $[11];
}
let t5;
if ($[12] !== t0 || $[13] !== t1 || $[14] !== t2 || $[15] !== t3 || $[16] !== t4) {
t5 = {
mutationFn: t0,
onMutate: t1,
onError: t2,
onSuccess: t3,
onSettled: t4
};
$[12] = t0;
$[13] = t1;
$[14] = t2;
$[15] = t3;
$[16] = t4;
$[17] = t5;
} else {
t5 = $[17];
}
return (0, import_react_query6.useMutation)(t5);
}
// src/db/hooks/useCreateEdge.ts
var import_compiler_runtime7 = require("react/compiler-runtime");
var import_react_query7 = require("@tanstack/react-query");
var import_jotai9 = require("jotai");
function useCreateEdge() {
const $ = (0, import_compiler_runtime7.c)(17);
const queryClient = (0, import_react_query7.useQueryClient)();
const supabase = useSupabaseClient();
const startMutation = (0, import_jotai9.useSetAtom)(startMutationAtom);
const completeMutation = (0, import_jotai9.useSetAtom)(completeMutationAtom);
let t0;
if ($[0] !== supabase) {
t0 = async (edge) => createGraphEdge(supabase, edge);
$[0] = supabase;
$[1] = t0;
} else {
t0 = $[1];
}
let t1;
if ($[2] !== queryClient || $[3] !== startMutation) {
t1 = async (edge_0) => {
startMutation();
await queryClient.cancelQueries({
queryKey: canvasKeys.edges(edge_0.graph_id)
});
const previousEdges = queryClient.getQueryData(canvasKeys.edges(edge_0.graph_id));
const optimisticEdge = {
...edge_0,
id: `temp-${Date.now()}`,
created_at: (/* @__PURE__ */ new Date()).toISOString(),
updated_at: (/* @__PURE__ */ new Date()).toISOString()
};
queryClient.setQueryData(canvasKeys.edges(edge_0.graph_id), (old) => [...old || [], optimisticEdge]);
return {
previousEdges,
graphId: edge_0.graph_id,
optimisticId: optimisticEdge.id
};
};
$[2] = queryClient;
$[3] = startMutation;
$[4] = t1;
} else {
t1 = $[4];
}
let t2;
let t3;
if ($[5] !== completeMutation || $[6] !== queryClient) {
t2 = (_err, _variables, context) => {
if (context?.previousEdges) {
queryClient.setQueryData(canvasKeys.edges(context.graphId), context.previousEdges);
}
completeMutation(false);
};
t3 = (newEdge, _variables_0, context_0) => {
if (context_0) {
queryClient.setQueryData(canvasKeys.edges(context_0.graphId), (old_0) => old_0?.map((edge_1) => edge_1.id === context_0.optimisticId ? newEdge : edge_1));
}
completeMutation(true);
};
$[5] = completeMutation;
$[6] = queryClient;
$[7] = t2;
$[8] = t3;
} else {
t2 = $[7];
t3 = $[8];
}
let t4;
if ($[9] !== queryClient) {
t4 = (_data, _error, variables) => {
queryClient.invalidateQueries({
queryKey: canvasKeys.edges(variables.graph_id)
});
};
$[9] = queryClient;
$[10] = t4;
} else {
t4 = $[10];
}
let t5;
if ($[11] !== t0 || $[12] !== t1 || $[13] !== t2 || $[14] !== t3 || $[15] !== t4) {
t5 = {
mutationFn: t0,
onMutate: t1,
onError: t2,
onSuccess: t3,
onSettled: t4
};
$[11] = t0;
$[12] = t1;
$[13] = t2;
$[14] = t3;
$[15] = t4;
$[16] = t5;
} else {
t5 = $[16];
}
return (0, import_react_query7.useMutation)(t5);
}
// src/db/hooks/useDeleteEdge.ts
var import_compiler_runtime8 = require("react/compiler-runtime");
var import_react_query8 = require("@tanstack/react-query");
var import_jotai10 = require("jotai");
function useDeleteEdge() {
const $ = (0, import_compiler_runtime8.c)(18);
const queryClient = (0, import_react_query8.useQueryClient)();
const supabase = useSupabaseClient();
const startMutation = (0, import_jotai10.useSetAtom)(startMutationAtom);
const completeMutation = (0, import_jotai10.useSetAtom)(completeMutationAtom);
let t0;
if ($[0] !== supabase) {
t0 = async (t12) => {
const {
edgeId
} = t12;
return deleteGraphEdge(supabase, edgeId);
};
$[0] = supabase;
$[1] = t0;
} else {
t0 = $[1];
}
let t1;
if ($[2] !== queryClient || $[3] !== startMutation) {
t1 = async (t22) => {
const {
edgeId: edgeId_0,
graphId
} = t22;
startMutation();
await queryClient.cancelQueries({
queryKey: canvasKeys.edges(graphId)
});
const previousEdges = queryClient.getQueryData(canvasKeys.edges(graphId));
if (previousEdges) {
queryClient.setQueryData(canvasKeys.edges(graphId), (old) => old?.filter((edge) => edge.id !== edgeId_0));
}
return {
previousEdges,
graphId
};
};
$[2] = queryClient;
$[3] = startMutation;
$[4] = t1;
} else {
t1 = $[4];
}
let t2;
if ($[5] !== completeMutation || $[6] !== queryClient) {
t2 = (_err, _variables, context) => {
if (context?.previousEdges) {
queryClient.setQueryData(canvasKeys.edges(context.graphId), context.previousEdges);
}
completeMutation(false);
};
$[5] = completeMutation;
$[6] = queryClient;
$[7] = t2;
} else {
t2 = $[7];
}
let t3;
if ($[8] !== completeMutation) {
t3 = () => {
completeMutation(true);
};
$[8] = completeMutation;
$[9] = t3;
} else {
t3 = $[9];
}
let t4;
if ($[10] !== queryClient) {
t4 = (_data, _error, variables) => {
queryClient.invalidateQueries({
queryKey: canvasKeys.edges(variables.graphId)
});
};
$[10] = queryClient;
$[11] = t4;
} else {
t4 = $[11];
}
let t5;
if ($[12] !== t0 || $[13] !== t1 || $[14] !== t2 || $[15] !== t3 || $[16] !== t4) {
t5 = {
mutationFn: t0,
onMutate: t1,
onError: t2,
onSuccess: t3,
onSettled: t4
};
$[12] = t0;
$[13] = t1;
$[14] = t2;
$[15] = t3;
$[16] = t4;
$[17] = t5;
} else {
t5 = $[17];
}
return (0, import_react_query8.useMutation)(t5);
}
//# sourceMappingURL=index.js.map