#!/usr/bin/env node import { createClient } from '@supabase/supabase-js'; import dotenv from 'dotenv'; import readline from 'readline'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import fs from 'fs'; // Lade Umgebungsvariablen aus .env dotenv.config(); const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Supabase-Client erstellen const supabaseUrl = process.env.EXPO_PUBLIC_SUPABASE_URL; const supabaseKey = process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY; if (!supabaseUrl || !supabaseKey) { console.error('Fehler: EXPO_PUBLIC_SUPABASE_URL und EXPO_PUBLIC_SUPABASE_ANON_KEY müssen in der .env-Datei definiert sein.'); process.exit(1); } const supabase = createClient(supabaseUrl, supabaseKey); // Readline-Interface für interaktive Eingabe const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // Funktion zum Ausführen einer SQL-Abfrage async function executeQuery(query) { try { console.log(`Führe Abfrage aus: ${query}`); const { data, error } = await supabase.rpc('execute_sql', { query }); if (error) { console.error('Fehler bei der Ausführung der Abfrage:', error.message); return; } console.log('Ergebnis:'); console.table(data); } catch (error) { console.error('Unerwarteter Fehler:', error.message); } } // Funktion zum Ausführen einer SQL-Datei async function executeFile(filePath) { try { const fullPath = join(process.cwd(), filePath); console.log(`Führe SQL-Datei aus: ${fullPath}`); if (!fs.existsSync(fullPath)) { console.error(`Fehler: Datei ${fullPath} existiert nicht.`); return; } const query = fs.readFileSync(fullPath, 'utf8'); await executeQuery(query); } catch (error) { console.error('Fehler beim Lesen oder Ausführen der Datei:', error.message); } } // Funktion zum Anzeigen der Tabellenliste async function listTables() { try { const query = ` SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name; `; const { data, error } = await supabase.rpc('execute_sql', { query }); if (error) { console.error('Fehler beim Abrufen der Tabellenliste:', error.message); return; } console.log('Verfügbare Tabellen:'); data.forEach((row, index) => { console.log(`${index + 1}. ${row.table_name}`); }); } catch (error) { console.error('Unerwarteter Fehler:', error.message); } } // Funktion zum Anzeigen der Tabellenstruktur async function describeTable(tableName) { try { const query = ` SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '${tableName}' ORDER BY ordinal_position; `; const { data, error } = await supabase.rpc('execute_sql', { query }); if (error) { console.error(`Fehler beim Beschreiben der Tabelle ${tableName}:`, error.message); return; } console.log(`Struktur der Tabelle ${tableName}:`); console.table(data); } catch (error) { console.error('Unerwarteter Fehler:', error.message); } } // Hauptmenü function showMenu() { console.log('\n--- Supabase CLI ---'); console.log('1. SQL-Abfrage ausführen'); console.log('2. SQL-Datei ausführen'); console.log('3. Tabellenliste anzeigen'); console.log('4. Tabellenstruktur anzeigen'); console.log('5. Beenden'); rl.question('\nWähle eine Option (1-5): ', async (answer) => { switch (answer.trim()) { case '1': rl.question('Gib deine SQL-Abfrage ein: ', async (query) => { await executeQuery(query); showMenu(); }); break; case '2': rl.question('Gib den Pfad zur SQL-Datei ein: ', async (filePath) => { await executeFile(filePath); showMenu(); }); break; case '3': await listTables(); showMenu(); break; case '4': rl.question('Gib den Tabellennamen ein: ', async (tableName) => { await describeTable(tableName); showMenu(); }); break; case '5': console.log('Auf Wiedersehen!'); rl.close(); process.exit(0); break; default: console.log('Ungültige Option. Bitte wähle 1-5.'); showMenu(); break; } }); } // Starte das Programm console.log('Verbindung zu Supabase hergestellt.'); console.log(`URL: ${supabaseUrl}`); showMenu();