UNPKG

@dataql/supabase-adapter

Version:

Supabase adapter for DataQL with zero API changes

262 lines (213 loc) โ€ข 7.35 kB
import { createClient } from "@dataql/supabase-adapter"; // Initialize Supabase client with DataQL backend const supabase = createClient( "https://your-project.supabase.co", "your-anon-key", { // DataQL automatically handles routing appToken: "your-app-token", env: "dev", } ); // Register table schemas for better type safety supabase.registerTable("users", { id: { type: "ID", required: true }, email: { type: "String", required: true, unique: true }, name: { type: "String" }, avatar_url: { type: "String" }, created_at: { type: "Date", default: "now" }, updated_at: { type: "Date", default: "now" }, }); supabase.registerTable("posts", { id: { type: "ID", required: true }, title: { type: "String", required: true }, content: { type: "String" }, author_id: { type: "ID", required: true }, published: { type: "Boolean", default: false }, created_at: { type: "Date", default: "now" }, updated_at: { type: "Date", default: "now" }, }); async function basicOperations() { console.log("๐Ÿš€ Starting Supabase adapter example..."); try { // Insert a user console.log("\n๐Ÿ“ Creating a new user..."); const { data: newUser, error: insertError } = await supabase .from("users") .insert({ name: "John Doe", email: "john@example.com", avatar_url: "https://example.com/avatar.jpg", }); if (insertError) { console.error("โŒ Insert error:", insertError.message); return; } console.log("โœ… User created:", newUser); // Query users console.log("\n๐Ÿ” Querying users..."); const { data: users, error: queryError } = await supabase .from("users") .select("id, name, email, created_at") .eq("email", "john@example.com") .single(); if (queryError) { console.error("โŒ Query error:", queryError.message); return; } console.log("โœ… User found:", users); // Update user console.log("\nโœ๏ธ Updating user name..."); const { data: updatedUser, error: updateError } = await supabase .from("users") .update({ name: "John Smith" }) .eq("email", "john@example.com"); if (updateError) { console.error("โŒ Update error:", updateError.message); return; } console.log("โœ… User updated:", updatedUser); // Complex query with filters console.log("\n๐Ÿ”Ž Complex query with filters..."); const { data: filteredUsers, error: filterError } = await supabase .from("users") .select("*") .like("name", "%John%") .order("created_at", { ascending: false }) .limit(10); if (filterError) { console.error("โŒ Filter error:", filterError.message); return; } console.log("โœ… Filtered users:", filteredUsers); // Insert a post console.log("\n๐Ÿ“ Creating a post..."); const { data: newPost, error: postError } = await supabase .from("posts") .insert({ title: "Getting Started with DataQL", content: "DataQL provides powerful offline-first capabilities for modern applications...", author_id: users?.id || "user-123", published: true, }); if (postError) { console.error("โŒ Post error:", postError.message); return; } console.log("โœ… Post created:", newPost); // Query posts with pagination console.log("\n๐Ÿ“‹ Querying posts with pagination..."); const { data: posts, error: postsError } = await supabase .from("posts") .select("id, title, published, created_at") .eq("published", true) .order("created_at", { ascending: false }) .range(0, 4); if (postsError) { console.error("โŒ Posts error:", postsError.message); return; } console.log("โœ… Published posts:", posts); // Upsert operation console.log("\n๐Ÿ”„ Upsert operation..."); const { data: upsertedUser, error: upsertError } = await supabase .from("users") .upsert({ email: "john@example.com", name: "John Doe Updated", avatar_url: "https://example.com/new-avatar.jpg", }); if (upsertError) { console.error("โŒ Upsert error:", upsertError.message); return; } console.log("โœ… User upserted:", upsertedUser); console.log("\n๐ŸŽ‰ All operations completed successfully!"); } catch (error) { console.error("โŒ Unexpected error:", error); } } async function realtimeExample() { console.log("\n๐Ÿ“ก Setting up real-time subscriptions..."); // Subscribe to user insertions const userSubscription = supabase.from("users").on("INSERT", (payload) => { console.log("๐Ÿ†• New user created:", payload.new); }); // Subscribe to post updates const postSubscription = supabase.from("posts").on("UPDATE", (payload) => { console.log("๐Ÿ“ Post updated:", payload.new); }); console.log("โœ… Real-time subscriptions active"); // Simulate some real-time events setTimeout(async () => { console.log("\n๐ŸŽฌ Simulating real-time events..."); await supabase.from("users").insert({ name: "Jane Doe", email: "jane@example.com", }); await supabase .from("posts") .update({ title: "Updated Post Title" }) .eq("published", true); }, 2000); // Cleanup after 10 seconds setTimeout(() => { console.log("\n๐Ÿงน Cleaning up subscriptions..."); userSubscription.unsubscribe(); postSubscription.unsubscribe(); console.log("โœ… Subscriptions cleaned up"); }, 10000); } async function advancedFeaturesExample() { console.log("\n๐Ÿš€ Advanced features example..."); try { // Text search console.log("\n๐Ÿ” Full-text search..."); const { data: searchResults } = await supabase .from("posts") .select("*") .textSearch("title", "DataQL OR database"); console.log("โœ… Search results:", searchResults); // Count query console.log("\n๐Ÿ“Š Count query..."); const { data: userCount } = await supabase .from("users") .select("*", { count: "exact" }) .gte("created_at", "2024-01-01"); console.log("โœ… User count:", userCount?.count); // Complex filtering console.log("\n๐ŸŽฏ Complex filtering..."); const { data: complexResults } = await supabase .from("posts") .select("*") .eq("published", true) .gte("created_at", "2024-01-01") .like("title", "%DataQL%") .order("created_at", { ascending: false }) .limit(5); console.log("โœ… Complex filter results:", complexResults); // Array operations console.log("\n๐Ÿ“ Array operations..."); const { data: arrayResults } = await supabase .from("users") .select("*") .in("email", ["john@example.com", "jane@example.com"]); console.log("โœ… Array filter results:", arrayResults); } catch (error) { console.error("โŒ Advanced features error:", error); } } async function runExample() { console.log("๐ŸŽฏ DataQL Supabase Adapter Example"); console.log("====================================="); await basicOperations(); await realtimeExample(); await advancedFeaturesExample(); console.log("\nโœ… Example completed!"); } // Run the example if (require.main === module) { runExample().catch(console.error); } export { runExample };