@dataql/supabase-adapter
Version:
Supabase adapter for DataQL with zero API changes
262 lines (213 loc) โข 7.35 kB
text/typescript
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 };