@libredb/studio 0.9.7
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/.claude/settings.local.json +127 -0
- package/.cursorrules +426 -0
- package/.devin/wiki.json +143 -0
- package/.dockerignore +80 -0
- package/.env.example +159 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +49 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +57 -0
- package/.github/workflows/ci.yml +185 -0
- package/.github/workflows/codeql.yml +57 -0
- package/.github/workflows/docker-build-push.yml +118 -0
- package/.github/workflows/helm-release.yml +113 -0
- package/CLAUDE.md +265 -0
- package/CODE_OF_CONDUCT.md +124 -0
- package/CONTRIBUTING.md +154 -0
- package/Dockerfile +73 -0
- package/LICENSE +21 -0
- package/README.md +614 -0
- package/SECURITY.md +107 -0
- package/artifacthub-repo.yml +4 -0
- package/bun.lock +1714 -0
- package/bunfig.toml +3 -0
- package/charts/libredb-studio/.helmignore +11 -0
- package/charts/libredb-studio/Chart.lock +6 -0
- package/charts/libredb-studio/Chart.yaml +50 -0
- package/charts/libredb-studio/README.md +206 -0
- package/charts/libredb-studio/templates/NOTES.txt +59 -0
- package/charts/libredb-studio/templates/_helpers.tpl +135 -0
- package/charts/libredb-studio/templates/configmap.yaml +37 -0
- package/charts/libredb-studio/templates/deployment.yaml +184 -0
- package/charts/libredb-studio/templates/hpa.yaml +32 -0
- package/charts/libredb-studio/templates/ingress.yaml +41 -0
- package/charts/libredb-studio/templates/networkpolicy.yaml +50 -0
- package/charts/libredb-studio/templates/pdb.yaml +18 -0
- package/charts/libredb-studio/templates/pvc.yaml +23 -0
- package/charts/libredb-studio/templates/secret.yaml +30 -0
- package/charts/libredb-studio/templates/seed-configmap.yaml +11 -0
- package/charts/libredb-studio/templates/service.yaml +22 -0
- package/charts/libredb-studio/templates/serviceaccount.yaml +13 -0
- package/charts/libredb-studio/values.schema.json +246 -0
- package/charts/libredb-studio/values.yaml +286 -0
- package/components.json +22 -0
- package/conductor/code_styleguides/typescript.md +43 -0
- package/conductor/product-guidelines.md +43 -0
- package/conductor/product.md +3 -0
- package/conductor/setup_state.json +1 -0
- package/conductor/tech-stack.md +39 -0
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +8 -0
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +44 -0
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +31 -0
- package/conductor/tracks.md +8 -0
- package/conductor/workflow.md +333 -0
- package/database-compose.yml +55 -0
- package/docker/postgres-init/01-extensions.sql +10 -0
- package/docker/postgres-init/02-sample-data.sql +585 -0
- package/docker/postgres.yml +68 -0
- package/docker-compose.yml +38 -0
- package/docs/AI_PLAN.md +74 -0
- package/docs/API_DOCS.md +875 -0
- package/docs/ARCHITECTURE.md +218 -0
- package/docs/DATABASE_PROVIDERS.md +358 -0
- package/docs/FEATURES.md +116 -0
- package/docs/HELM_CHART.md +252 -0
- package/docs/LOGIN_PAGE.md +178 -0
- package/docs/MONACO_EDITOR_PERFORMANCE.md +315 -0
- package/docs/OIDC_ARCH.md +681 -0
- package/docs/OIDC_SETUP.md +322 -0
- package/docs/POSTGRES_METRICS.md +516 -0
- package/docs/QUERY_OPTIMIZATION.md +370 -0
- package/docs/SEED_CONNECTIONS.md +468 -0
- package/docs/SQL_ALIAS_COMPLETION.md +190 -0
- package/docs/STORAGE_ARCHITECTURE.md +565 -0
- package/docs/STORAGE_QUICK_SETUP.md +419 -0
- package/docs/TECHNICAL_PLAN.md +36 -0
- package/docs/THEMING.md +345 -0
- package/docs/adding-a-new-database-provider.md +642 -0
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +360 -0
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +118 -0
- package/docs/backlogs/002-DATA_IMPORT.md +215 -0
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +183 -0
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +292 -0
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +352 -0
- package/docs/backlogs/006-DATA_MASKING.md +418 -0
- package/docs/enterprise-features.md +718 -0
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +803 -0
- package/docs/medium-koyeb-article-en.md +215 -0
- package/docs/plans/test-plans.md +445 -0
- package/docs/releases/RELEASE.V0.3.0.md +22 -0
- package/docs/releases/RELEASE.V0.4.0.md +154 -0
- package/docs/releases/RELEASE.V0.5.0.md +252 -0
- package/docs/releases/RELEASE_v0.5.6.md +145 -0
- package/docs/releases/RELEASE_v0.6.1.md +303 -0
- package/docs/releases/RELEASE_v0.6.7.md +292 -0
- package/docs/releases/RELEASE_v0.7.0.md +332 -0
- package/docs/releases/RELEASE_v0.8.0.md +521 -0
- package/docs/sampledb/titanic.sql +1379 -0
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +1362 -0
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +590 -0
- package/e2e/admin-dashboard.spec.ts +64 -0
- package/e2e/connection-management.spec.ts +58 -0
- package/e2e/export.spec.ts +34 -0
- package/e2e/login.spec.ts +85 -0
- package/e2e/query-execution.spec.ts +35 -0
- package/e2e/tab-management.spec.ts +64 -0
- package/eslint.config.mjs +28 -0
- package/fly.toml +43 -0
- package/next.config.ts +32 -0
- package/package.json +130 -0
- package/playwright.config.ts +34 -0
- package/postcss.config.mjs +7 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/logo.svg +32 -0
- package/public/next.svg +1 -0
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/render.yaml +58 -0
- package/scripts/merge-lcov.mjs +239 -0
- package/sonar-project.properties +16 -0
- package/src/app/admin/error.tsx +46 -0
- package/src/app/admin/page.tsx +10 -0
- package/src/app/api/admin/audit/route.ts +52 -0
- package/src/app/api/admin/fleet-health/route.ts +81 -0
- package/src/app/api/ai/autopilot/route.ts +105 -0
- package/src/app/api/ai/chat/route.ts +132 -0
- package/src/app/api/ai/describe-schema/route.ts +52 -0
- package/src/app/api/ai/explain/route.ts +86 -0
- package/src/app/api/ai/impact/route.ts +97 -0
- package/src/app/api/ai/index-advisor/route.ts +98 -0
- package/src/app/api/ai/nl2sql/route.ts +87 -0
- package/src/app/api/ai/query-safety/route.ts +87 -0
- package/src/app/api/auth/login/route.ts +62 -0
- package/src/app/api/auth/logout/route.ts +25 -0
- package/src/app/api/auth/me/route.ts +10 -0
- package/src/app/api/auth/oidc/callback/route.ts +82 -0
- package/src/app/api/auth/oidc/login/route.ts +43 -0
- package/src/app/api/connections/managed/route.ts +35 -0
- package/src/app/api/db/cancel/route.ts +42 -0
- package/src/app/api/db/disconnect/route.ts +28 -0
- package/src/app/api/db/health/route.ts +49 -0
- package/src/app/api/db/maintenance/route.ts +72 -0
- package/src/app/api/db/monitoring/route.ts +62 -0
- package/src/app/api/db/multi-query/route.ts +116 -0
- package/src/app/api/db/pool-stats/route.ts +37 -0
- package/src/app/api/db/profile/route.ts +144 -0
- package/src/app/api/db/provider-meta/route.ts +49 -0
- package/src/app/api/db/query/route.ts +50 -0
- package/src/app/api/db/schema/route.ts +47 -0
- package/src/app/api/db/schema-snapshot/route.ts +42 -0
- package/src/app/api/db/test-connection/route.ts +55 -0
- package/src/app/api/db/transaction/route.ts +111 -0
- package/src/app/api/storage/[collection]/route.ts +67 -0
- package/src/app/api/storage/config/route.ts +17 -0
- package/src/app/api/storage/migrate/route.ts +45 -0
- package/src/app/api/storage/route.ts +32 -0
- package/src/app/error.tsx +49 -0
- package/src/app/global-error.tsx +55 -0
- package/src/app/globals.css +146 -0
- package/src/app/icon.svg +42 -0
- package/src/app/layout.tsx +34 -0
- package/src/app/login/login-form.tsx +301 -0
- package/src/app/login/page.tsx +11 -0
- package/src/app/monitoring/page.tsx +8 -0
- package/src/app/not-found.tsx +29 -0
- package/src/app/page.tsx +5 -0
- package/src/components/AIAutopilotPanel.tsx +238 -0
- package/src/components/CodeGenerator.tsx +271 -0
- package/src/components/CommandPalette.tsx +227 -0
- package/src/components/ConnectionModal.tsx +759 -0
- package/src/components/CreateTableModal.tsx +281 -0
- package/src/components/DataCharts.tsx +962 -0
- package/src/components/DataImportModal.tsx +582 -0
- package/src/components/DataProfiler.tsx +335 -0
- package/src/components/DatabaseDocs.tsx +251 -0
- package/src/components/MaskingSettings.tsx +414 -0
- package/src/components/MobileNav.tsx +50 -0
- package/src/components/NL2SQLPanel.tsx +281 -0
- package/src/components/PivotTable.tsx +257 -0
- package/src/components/QueryEditor.tsx +760 -0
- package/src/components/QueryHistory.tsx +344 -0
- package/src/components/QuerySafetyDialog.tsx +290 -0
- package/src/components/ResultsGrid.tsx +644 -0
- package/src/components/SaveQueryModal.tsx +104 -0
- package/src/components/SavedQueries.tsx +128 -0
- package/src/components/SchemaDiagram.tsx +473 -0
- package/src/components/SchemaDiff.tsx +473 -0
- package/src/components/SnapshotTimeline.tsx +116 -0
- package/src/components/Studio.tsx +639 -0
- package/src/components/TestDataGenerator.tsx +261 -0
- package/src/components/VisualExplain.tsx +820 -0
- package/src/components/admin/AdminDashboard.tsx +163 -0
- package/src/components/admin/tabs/AuditTab.tsx +531 -0
- package/src/components/admin/tabs/MonitoringEmbed.tsx +11 -0
- package/src/components/admin/tabs/OperationsTab.tsx +646 -0
- package/src/components/admin/tabs/OverviewTab.tsx +1328 -0
- package/src/components/admin/tabs/SecurityTab.tsx +284 -0
- package/src/components/community-section.tsx +92 -0
- package/src/components/icons/db-icons.tsx +84 -0
- package/src/components/libredb-logo.tsx +61 -0
- package/src/components/monitoring/MonitoringDashboard.tsx +345 -0
- package/src/components/monitoring/tabs/MetricChart.tsx +82 -0
- package/src/components/monitoring/tabs/OverviewTab.tsx +263 -0
- package/src/components/monitoring/tabs/PerformanceTab.tsx +254 -0
- package/src/components/monitoring/tabs/PoolTab.tsx +174 -0
- package/src/components/monitoring/tabs/QueriesTab.tsx +287 -0
- package/src/components/monitoring/tabs/SessionsTab.tsx +316 -0
- package/src/components/monitoring/tabs/StorageTab.tsx +335 -0
- package/src/components/monitoring/tabs/TablesTab.tsx +300 -0
- package/src/components/results-grid/ResultCard.tsx +111 -0
- package/src/components/results-grid/RowDetailSheet.tsx +178 -0
- package/src/components/results-grid/StatsBar.tsx +201 -0
- package/src/components/results-grid/index.ts +1 -0
- package/src/components/results-grid/utils.ts +23 -0
- package/src/components/schema-explorer/ColumnList.tsx +53 -0
- package/src/components/schema-explorer/SchemaExplorer.tsx +182 -0
- package/src/components/schema-explorer/TableItem.tsx +210 -0
- package/src/components/schema-explorer/index.ts +1 -0
- package/src/components/sidebar/ConnectionItem.tsx +105 -0
- package/src/components/sidebar/ConnectionsList.tsx +62 -0
- package/src/components/sidebar/Sidebar.tsx +130 -0
- package/src/components/sidebar/index.ts +2 -0
- package/src/components/studio/BottomPanel.tsx +286 -0
- package/src/components/studio/QueryToolbar.tsx +180 -0
- package/src/components/studio/StudioDesktopHeader.tsx +114 -0
- package/src/components/studio/StudioMobileHeader.tsx +340 -0
- package/src/components/studio/StudioTabBar.tsx +82 -0
- package/src/components/studio/index.ts +5 -0
- package/src/components/ui/accordion.tsx +66 -0
- package/src/components/ui/alert-dialog.tsx +157 -0
- package/src/components/ui/alert.tsx +66 -0
- package/src/components/ui/aspect-ratio.tsx +11 -0
- package/src/components/ui/avatar.tsx +53 -0
- package/src/components/ui/badge.tsx +46 -0
- package/src/components/ui/breadcrumb.tsx +109 -0
- package/src/components/ui/button-group.tsx +83 -0
- package/src/components/ui/button.tsx +60 -0
- package/src/components/ui/calendar.tsx +216 -0
- package/src/components/ui/card.tsx +92 -0
- package/src/components/ui/carousel.tsx +241 -0
- package/src/components/ui/chart.tsx +357 -0
- package/src/components/ui/checkbox.tsx +32 -0
- package/src/components/ui/collapsible.tsx +33 -0
- package/src/components/ui/command.tsx +184 -0
- package/src/components/ui/context-menu.tsx +252 -0
- package/src/components/ui/dialog.tsx +143 -0
- package/src/components/ui/drawer.tsx +135 -0
- package/src/components/ui/dropdown-menu.tsx +257 -0
- package/src/components/ui/empty.tsx +104 -0
- package/src/components/ui/field.tsx +248 -0
- package/src/components/ui/form.tsx +167 -0
- package/src/components/ui/hover-card.tsx +44 -0
- package/src/components/ui/input-group.tsx +170 -0
- package/src/components/ui/input-otp.tsx +77 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/item.tsx +193 -0
- package/src/components/ui/kbd.tsx +28 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/menubar.tsx +276 -0
- package/src/components/ui/navigation-menu.tsx +168 -0
- package/src/components/ui/pagination.tsx +127 -0
- package/src/components/ui/popover.tsx +48 -0
- package/src/components/ui/progress.tsx +31 -0
- package/src/components/ui/radio-group.tsx +45 -0
- package/src/components/ui/resizable.tsx +56 -0
- package/src/components/ui/scroll-area.tsx +58 -0
- package/src/components/ui/select.tsx +187 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +139 -0
- package/src/components/ui/sidebar.tsx +726 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/slider.tsx +63 -0
- package/src/components/ui/sonner.tsx +40 -0
- package/src/components/ui/spinner.tsx +16 -0
- package/src/components/ui/switch.tsx +31 -0
- package/src/components/ui/table.tsx +116 -0
- package/src/components/ui/tabs.tsx +66 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/toggle-group.tsx +83 -0
- package/src/components/ui/toggle.tsx +47 -0
- package/src/components/ui/tooltip.tsx +61 -0
- package/src/exports/components.ts +15 -0
- package/src/exports/index.ts +4 -0
- package/src/exports/providers.ts +4 -0
- package/src/exports/types.ts +26 -0
- package/src/hooks/use-ai-chat.ts +182 -0
- package/src/hooks/use-all-connections.ts +66 -0
- package/src/hooks/use-api-call.ts +71 -0
- package/src/hooks/use-auth.ts +51 -0
- package/src/hooks/use-connection-form.ts +349 -0
- package/src/hooks/use-connection-manager.ts +169 -0
- package/src/hooks/use-connection-payload.ts +15 -0
- package/src/hooks/use-inline-editing.ts +109 -0
- package/src/hooks/use-mobile.ts +20 -0
- package/src/hooks/use-monitoring-data.ts +270 -0
- package/src/hooks/use-provider-metadata.ts +62 -0
- package/src/hooks/use-query-execution.ts +478 -0
- package/src/hooks/use-storage-sync.ts +259 -0
- package/src/hooks/use-tab-manager.ts +231 -0
- package/src/hooks/use-toast.ts +20 -0
- package/src/hooks/use-transaction-control.ts +64 -0
- package/src/lib/api/error-codes.ts +30 -0
- package/src/lib/api/errors.ts +236 -0
- package/src/lib/api/with-error-handler.ts +41 -0
- package/src/lib/audit.ts +105 -0
- package/src/lib/auth.ts +87 -0
- package/src/lib/connection-string-parser.ts +172 -0
- package/src/lib/data-masking.ts +385 -0
- package/src/lib/db/base-provider.ts +325 -0
- package/src/lib/db/errors.ts +317 -0
- package/src/lib/db/factory.ts +324 -0
- package/src/lib/db/index.ts +123 -0
- package/src/lib/db/providers/document/index.ts +6 -0
- package/src/lib/db/providers/document/mongodb.ts +992 -0
- package/src/lib/db/providers/keyvalue/redis.ts +554 -0
- package/src/lib/db/providers/sql/index.ts +11 -0
- package/src/lib/db/providers/sql/mssql.ts +1065 -0
- package/src/lib/db/providers/sql/mysql.ts +978 -0
- package/src/lib/db/providers/sql/oracle.ts +1044 -0
- package/src/lib/db/providers/sql/postgres.ts +1179 -0
- package/src/lib/db/providers/sql/sql-base.ts +174 -0
- package/src/lib/db/providers/sql/sqlite.ts +721 -0
- package/src/lib/db/types.ts +437 -0
- package/src/lib/db/utils/pool-manager.ts +287 -0
- package/src/lib/db/utils/query-limiter.ts +239 -0
- package/src/lib/db-ui-config.ts +86 -0
- package/src/lib/editor/mongodb-completions.ts +172 -0
- package/src/lib/editor/sql-completions.ts +280 -0
- package/src/lib/llm/base-provider.ts +117 -0
- package/src/lib/llm/factory.ts +102 -0
- package/src/lib/llm/index.ts +90 -0
- package/src/lib/llm/providers/custom.ts +181 -0
- package/src/lib/llm/providers/gemini.ts +126 -0
- package/src/lib/llm/providers/ollama.ts +154 -0
- package/src/lib/llm/providers/openai.ts +146 -0
- package/src/lib/llm/types.ts +173 -0
- package/src/lib/llm/utils/config.ts +187 -0
- package/src/lib/llm/utils/retry.ts +119 -0
- package/src/lib/llm/utils/streaming.ts +202 -0
- package/src/lib/logger.ts +127 -0
- package/src/lib/monitoring-thresholds.ts +44 -0
- package/src/lib/oidc.ts +262 -0
- package/src/lib/query-generators.ts +61 -0
- package/src/lib/schema-diff/diff-engine.ts +273 -0
- package/src/lib/schema-diff/migration-generator.ts +208 -0
- package/src/lib/schema-diff/types.ts +55 -0
- package/src/lib/seed/config-loader.ts +79 -0
- package/src/lib/seed/connection-filter.ts +49 -0
- package/src/lib/seed/credential-resolver.ts +62 -0
- package/src/lib/seed/index.ts +40 -0
- package/src/lib/seed/resolve-connection.ts +57 -0
- package/src/lib/seed/types.ts +69 -0
- package/src/lib/sql/alias-extractor.ts +267 -0
- package/src/lib/sql/index.ts +8 -0
- package/src/lib/sql/statement-splitter.ts +167 -0
- package/src/lib/sql/types.ts +40 -0
- package/src/lib/ssh/tunnel.ts +142 -0
- package/src/lib/storage/factory.ts +84 -0
- package/src/lib/storage/index.ts +14 -0
- package/src/lib/storage/local-storage.ts +99 -0
- package/src/lib/storage/providers/postgres.ts +225 -0
- package/src/lib/storage/providers/sqlite.ts +153 -0
- package/src/lib/storage/storage-facade.ts +272 -0
- package/src/lib/storage/types.ts +75 -0
- package/src/lib/time-series-buffer.ts +58 -0
- package/src/lib/types.ts +173 -0
- package/src/lib/utils.ts +6 -0
- package/src/proxy.ts +104 -0
- package/src/types/db-drivers.d.ts +23 -0
- package/src/types/html2canvas.d.ts +9 -0
- package/tests/api/admin/audit.test.ts +178 -0
- package/tests/api/admin/fleet-health.test.ts +183 -0
- package/tests/api/ai/autopilot.test.ts +174 -0
- package/tests/api/ai/chat.test.ts +250 -0
- package/tests/api/ai/describe-schema.test.ts +266 -0
- package/tests/api/ai/explain.test.ts +199 -0
- package/tests/api/ai/impact.test.ts +168 -0
- package/tests/api/ai/index-advisor.test.ts +171 -0
- package/tests/api/ai/nl2sql.test.ts +202 -0
- package/tests/api/ai/query-safety.test.ts +196 -0
- package/tests/api/auth/login.test.ts +170 -0
- package/tests/api/auth/logout.test.ts +140 -0
- package/tests/api/auth/me.test.ts +73 -0
- package/tests/api/auth/oidc-callback.test.ts +215 -0
- package/tests/api/auth/oidc-login.test.ts +127 -0
- package/tests/api/db/cancel.test.ts +198 -0
- package/tests/api/db/disconnect.test.ts +124 -0
- package/tests/api/db/health.test.ts +222 -0
- package/tests/api/db/maintenance.test.ts +263 -0
- package/tests/api/db/monitoring.test.ts +221 -0
- package/tests/api/db/multi-query.test.ts +316 -0
- package/tests/api/db/pool-stats.test.ts +135 -0
- package/tests/api/db/profile.test.ts +330 -0
- package/tests/api/db/provider-meta.test.ts +193 -0
- package/tests/api/db/query.test.ts +314 -0
- package/tests/api/db/schema-snapshot.test.ts +170 -0
- package/tests/api/db/schema.test.ts +191 -0
- package/tests/api/db/test-connection.test.ts +185 -0
- package/tests/api/db/transaction.test.ts +314 -0
- package/tests/api/proxy.test.ts +191 -0
- package/tests/api/seed/managed-route.test.ts +113 -0
- package/tests/api/storage/config.test.ts +42 -0
- package/tests/api/storage/storage-routes.test.ts +309 -0
- package/tests/components/AIAutopilotPanel.test.tsx +756 -0
- package/tests/components/AdminPage.test.tsx +33 -0
- package/tests/components/CodeGenerator.test.tsx +182 -0
- package/tests/components/CommandPalette.test.tsx +428 -0
- package/tests/components/CommunitySection.test.tsx +91 -0
- package/tests/components/ConnectionModal.mobile.test.tsx +284 -0
- package/tests/components/ConnectionModal.test.tsx +570 -0
- package/tests/components/CreateTableModal.test.tsx +383 -0
- package/tests/components/DataCharts.test.tsx +739 -0
- package/tests/components/DataImportModal.test.tsx +751 -0
- package/tests/components/DataProfiler.test.tsx +589 -0
- package/tests/components/DatabaseDocs.test.tsx +353 -0
- package/tests/components/LoginPage.test.tsx +163 -0
- package/tests/components/LoginPageOIDC.test.tsx +92 -0
- package/tests/components/MaskingSettings.test.tsx +498 -0
- package/tests/components/MobileNav.test.tsx +30 -0
- package/tests/components/MonitoringPage.test.tsx +32 -0
- package/tests/components/NL2SQLPanel.test.tsx +621 -0
- package/tests/components/Page.test.tsx +33 -0
- package/tests/components/PivotTable.test.tsx +350 -0
- package/tests/components/QueryEditor.test.tsx +1730 -0
- package/tests/components/QueryHistory.test.tsx +572 -0
- package/tests/components/QuerySafetyDialog.test.tsx +586 -0
- package/tests/components/ResultsGrid.test.tsx +804 -0
- package/tests/components/RootLayout.test.tsx +83 -0
- package/tests/components/SaveQueryModal.test.tsx +25 -0
- package/tests/components/SavedQueries.test.tsx +43 -0
- package/tests/components/SchemaDiagram.test.tsx +1034 -0
- package/tests/components/SchemaDiff.test.tsx +906 -0
- package/tests/components/SnapshotTimeline.test.tsx +174 -0
- package/tests/components/Studio.test.tsx +1030 -0
- package/tests/components/TestDataGenerator.test.tsx +291 -0
- package/tests/components/VisualExplain.test.tsx +704 -0
- package/tests/components/admin/AdminDashboard.test.tsx +205 -0
- package/tests/components/admin/AuditTab.test.tsx +220 -0
- package/tests/components/admin/MonitoringEmbed.test.tsx +58 -0
- package/tests/components/admin/OperationsTab.test.tsx +975 -0
- package/tests/components/admin/OverviewTab.test.tsx +254 -0
- package/tests/components/admin/SecurityTab.test.tsx +467 -0
- package/tests/components/monitoring/MetricChart.test.tsx +111 -0
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +259 -0
- package/tests/components/monitoring/OverviewTab.test.tsx +78 -0
- package/tests/components/monitoring/PerformanceTab.test.tsx +87 -0
- package/tests/components/monitoring/PoolTab.test.tsx +42 -0
- package/tests/components/monitoring/QueriesTab.test.tsx +80 -0
- package/tests/components/monitoring/SessionsTab.test.tsx +154 -0
- package/tests/components/monitoring/StorageTab.test.tsx +127 -0
- package/tests/components/monitoring/TablesTab.test.tsx +153 -0
- package/tests/components/results-grid/ResultCard.test.tsx +105 -0
- package/tests/components/results-grid/RowDetailSheet.test.tsx +308 -0
- package/tests/components/results-grid/StatsBar.test.tsx +162 -0
- package/tests/components/schema-explorer/ColumnList.test.tsx +151 -0
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +461 -0
- package/tests/components/schema-explorer/TableItem.test.tsx +415 -0
- package/tests/components/sidebar/ConnectionItem.test.tsx +201 -0
- package/tests/components/sidebar/ConnectionsList.test.tsx +176 -0
- package/tests/components/sidebar/Sidebar.test.tsx +187 -0
- package/tests/components/studio/BottomPanel.test.tsx +383 -0
- package/tests/components/studio/QueryToolbar.test.tsx +321 -0
- package/tests/components/studio/StudioDesktopHeader.test.tsx +377 -0
- package/tests/components/studio/StudioMobileHeader.test.tsx +198 -0
- package/tests/components/studio/StudioTabBar.test.tsx +331 -0
- package/tests/fixtures/connections.ts +96 -0
- package/tests/fixtures/masking-configs.ts +86 -0
- package/tests/fixtures/query-results.ts +71 -0
- package/tests/fixtures/schemas.ts +64 -0
- package/tests/fixtures/seed-connections/invalid-config.yaml +7 -0
- package/tests/fixtures/seed-connections/minimal-config.yaml +8 -0
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +23 -0
- package/tests/fixtures/seed-connections/multi-role-config.yaml +30 -0
- package/tests/fixtures/seed-connections/valid-config.json +15 -0
- package/tests/fixtures/seed-connections/valid-config.yaml +51 -0
- package/tests/helpers/mock-fetch.ts +59 -0
- package/tests/helpers/mock-monaco.ts +112 -0
- package/tests/helpers/mock-navigation.ts +28 -0
- package/tests/helpers/mock-next.ts +80 -0
- package/tests/helpers/mock-provider.ts +133 -0
- package/tests/helpers/mock-sonner.ts +29 -0
- package/tests/helpers/render-with-providers.tsx +19 -0
- package/tests/hooks/use-ai-chat.test.ts +600 -0
- package/tests/hooks/use-auth.test.ts +371 -0
- package/tests/hooks/use-connection-form.test.ts +743 -0
- package/tests/hooks/use-connection-manager.test.ts +466 -0
- package/tests/hooks/use-inline-editing.test.ts +321 -0
- package/tests/hooks/use-mobile.test.ts +177 -0
- package/tests/hooks/use-monitoring-data.test.ts +819 -0
- package/tests/hooks/use-provider-metadata.test.ts +228 -0
- package/tests/hooks/use-query-execution.test.ts +1212 -0
- package/tests/hooks/use-tab-manager.test.ts +756 -0
- package/tests/hooks/use-toast.test.ts +74 -0
- package/tests/hooks/use-transaction-control.test.ts +211 -0
- package/tests/integration/db/mongodb-provider.test.ts +698 -0
- package/tests/integration/db/mssql-provider.test.ts +840 -0
- package/tests/integration/db/mysql-provider.test.ts +872 -0
- package/tests/integration/db/oracle-provider.test.ts +843 -0
- package/tests/integration/db/postgres-provider.test.ts +1382 -0
- package/tests/integration/db/redis-provider.test.ts +526 -0
- package/tests/integration/db/sqlite-provider.test.ts +480 -0
- package/tests/integration/seed/seed-pipeline.test.ts +102 -0
- package/tests/isolated/factory-singleton.test.ts +150 -0
- package/tests/isolated/use-storage-sync.test.ts +389 -0
- package/tests/run-components.sh +196 -0
- package/tests/setup-dom.ts +58 -0
- package/tests/setup.ts +40 -0
- package/tests/unit/api-errors.test.ts +210 -0
- package/tests/unit/code-generator-functions.test.ts +271 -0
- package/tests/unit/components/column-list.test.tsx +190 -0
- package/tests/unit/components/data-import-modal.test.tsx +441 -0
- package/tests/unit/components/studio-mobile-header.test.tsx +327 -0
- package/tests/unit/data-charts-functions.test.ts +496 -0
- package/tests/unit/data-import-functions.test.ts +320 -0
- package/tests/unit/data-import-utils.test.ts +125 -0
- package/tests/unit/db/base-provider.test.ts +517 -0
- package/tests/unit/db/errors.test.ts +403 -0
- package/tests/unit/db/factory.test.ts +436 -0
- package/tests/unit/db/pool-manager.test.ts +440 -0
- package/tests/unit/db/query-limiter.test.ts +387 -0
- package/tests/unit/db/sql-base.test.ts +438 -0
- package/tests/unit/lib/api/error-codes.test.ts +39 -0
- package/tests/unit/lib/audit.test.ts +326 -0
- package/tests/unit/lib/auth.test.ts +146 -0
- package/tests/unit/lib/connection-string-parser.test.ts +424 -0
- package/tests/unit/lib/data-masking.test.ts +583 -0
- package/tests/unit/lib/db-icons.test.tsx +41 -0
- package/tests/unit/lib/monitoring-thresholds.test.ts +133 -0
- package/tests/unit/lib/oidc.test.ts +509 -0
- package/tests/unit/lib/query-generators.test.ts +127 -0
- package/tests/unit/lib/storage/factory.test.ts +71 -0
- package/tests/unit/lib/storage/local-storage.test.ts +114 -0
- package/tests/unit/lib/storage/providers/postgres.test.ts +312 -0
- package/tests/unit/lib/storage/providers/sqlite.test.ts +232 -0
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +331 -0
- package/tests/unit/lib/storage/storage-facade.test.ts +184 -0
- package/tests/unit/lib/storage.test.ts +317 -0
- package/tests/unit/lib/time-series-buffer.test.ts +212 -0
- package/tests/unit/lib/utils.test.ts +24 -0
- package/tests/unit/llm/base-provider.test.ts +238 -0
- package/tests/unit/llm/config.test.ts +262 -0
- package/tests/unit/llm/custom-provider.test.ts +281 -0
- package/tests/unit/llm/gemini-provider.test.ts +248 -0
- package/tests/unit/llm/llm-factory.test.ts +155 -0
- package/tests/unit/llm/ollama-provider.test.ts +288 -0
- package/tests/unit/llm/openai-provider.test.ts +324 -0
- package/tests/unit/llm/retry.test.ts +180 -0
- package/tests/unit/llm/streaming.test.ts +355 -0
- package/tests/unit/logger.test.ts +198 -0
- package/tests/unit/mongodb-completions.test.ts +516 -0
- package/tests/unit/pivot-table-functions.test.ts +76 -0
- package/tests/unit/query-cancelled-error.test.ts +81 -0
- package/tests/unit/schema-diff/diff-engine.test.ts +367 -0
- package/tests/unit/schema-diff/migration-generator.test.ts +513 -0
- package/tests/unit/seed/config-loader.test.ts +73 -0
- package/tests/unit/seed/connection-filter.test.ts +91 -0
- package/tests/unit/seed/credential-resolver.test.ts +85 -0
- package/tests/unit/seed/index.test.ts +72 -0
- package/tests/unit/seed/resolve-connection.test.ts +74 -0
- package/tests/unit/seed/types.test.ts +129 -0
- package/tests/unit/sql/alias-extractor.test.ts +444 -0
- package/tests/unit/sql/statement-splitter.test.ts +348 -0
- package/tests/unit/sql-completions.test.ts +463 -0
- package/tests/unit/ssh-tunnel.test.ts +465 -0
- package/tsconfig.json +42 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
# LibreDB Studio - Platform Architecture
|
|
2
|
+
|
|
3
|
+
> **Status:** Backlog
|
|
4
|
+
> **Date:** 2025-12-25
|
|
5
|
+
> **Priority:** High
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Operating Modes
|
|
10
|
+
|
|
11
|
+
The system can operate in **two modes**. It works flawlessly in both scenarios:
|
|
12
|
+
|
|
13
|
+
### 1.1 Browser-Only Mode (Default)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
┌─────────────────────────────────────────┐
|
|
17
|
+
│ PGlite (WASM PostgreSQL) │
|
|
18
|
+
│ │ │
|
|
19
|
+
│ ▼ │
|
|
20
|
+
│ IndexedDB (browser) │
|
|
21
|
+
│ │
|
|
22
|
+
│ ✅ No external DB required │
|
|
23
|
+
│ ✅ Zero-config, works immediately │
|
|
24
|
+
│ ✅ Single browser usage │
|
|
25
|
+
└─────────────────────────────────────────┘
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- Platform data stays **only in the browser**
|
|
29
|
+
- No external database **required**
|
|
30
|
+
- No installation or configuration **needed**
|
|
31
|
+
- Data is **lost** if browser is cleared
|
|
32
|
+
|
|
33
|
+
### 1.2 Database Sync Mode (Optional)
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
┌─────────────────────────────────────────┐
|
|
37
|
+
│ PGlite (WASM PostgreSQL) │
|
|
38
|
+
│ │ │
|
|
39
|
+
│ ▼ │
|
|
40
|
+
│ IndexedDB (browser) │
|
|
41
|
+
│ │ │
|
|
42
|
+
│ ▼ (sync enabled) │
|
|
43
|
+
│ ElectricSQL ──▶ External PostgreSQL │
|
|
44
|
+
│ │
|
|
45
|
+
│ ✅ Data in both browser and DB │
|
|
46
|
+
│ ✅ Access from multiple devices │
|
|
47
|
+
│ ✅ Recoverable even if browser cleared │
|
|
48
|
+
└─────────────────────────────────────────┘
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- Platform data is stored **first in browser**, then **synced to external DB**
|
|
52
|
+
- User enables it if desired, **not mandatory**
|
|
53
|
+
- **Continues to work** offline
|
|
54
|
+
- Data is **persistent** and **shareable**
|
|
55
|
+
|
|
56
|
+
### 1.3 Mode Selection
|
|
57
|
+
|
|
58
|
+
| Parameter | Value | Behavior |
|
|
59
|
+
|-----------|-------|----------|
|
|
60
|
+
| `SYNC_MODE` or UI setting | `browser` (default) | Browser only |
|
|
61
|
+
| `SYNC_MODE` or UI setting | `database` | Browser + sync |
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// Example usage
|
|
65
|
+
if (syncConfig.enabled && syncConfig.databaseUrl) {
|
|
66
|
+
await startSync(); // Start sync to external DB
|
|
67
|
+
}
|
|
68
|
+
// else: PGlite only, no errors
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 2. Requirements Analysis
|
|
74
|
+
|
|
75
|
+
### 2.1 Core Requirements
|
|
76
|
+
|
|
77
|
+
| # | Requirement | Description |
|
|
78
|
+
|---|-------------|-------------|
|
|
79
|
+
| 1 | **User/Role Management** | Create users, assign roles (admin, user, viewer) |
|
|
80
|
+
| 2 | **Query Logging** | User-based query history (query, row count, execution time, status) |
|
|
81
|
+
| 3 | **Saved Queries** | Allow users to save and edit their queries |
|
|
82
|
+
| 4 | **Account Management** | Profile, preferences, account settings |
|
|
83
|
+
| 5 | **Platform Structure** | Future collaborative workspace and sharing features |
|
|
84
|
+
|
|
85
|
+
### 2.2 Technical Requirements
|
|
86
|
+
|
|
87
|
+
| Requirement | Description |
|
|
88
|
+
|-------------|-------------|
|
|
89
|
+
| Zero-config startup | Must work without any installation |
|
|
90
|
+
| Database necessity | Persistent storage needed for users, query logs, saved queries |
|
|
91
|
+
| Optional persistence | Users who want can sync their data to external DB |
|
|
92
|
+
| Minimal complexity | Should not significantly change existing architecture |
|
|
93
|
+
|
|
94
|
+
### 2.3 Current Problems
|
|
95
|
+
|
|
96
|
+
- LocalStorage 5-10MB limit
|
|
97
|
+
- No user-based separation
|
|
98
|
+
- No cross-device data sharing
|
|
99
|
+
- Data loss when browser is cleared
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 3. Solution: PGlite + ElectricSQL
|
|
104
|
+
|
|
105
|
+
### 3.1 Vision
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
Default: PGlite in browser (WASM PostgreSQL) → Persistent in IndexedDB
|
|
109
|
+
Optional: If user wants → Sync to external PostgreSQL (ElectricSQL)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 3.2 Why This Solution?
|
|
113
|
+
|
|
114
|
+
| Alternative | Problem |
|
|
115
|
+
|-------------|---------|
|
|
116
|
+
| LocalStorage | 5-10MB limit, no SQL |
|
|
117
|
+
| IndexedDB (raw) | NoSQL, complex queries are difficult |
|
|
118
|
+
| Mandatory External DB | No zero-config, requires installation |
|
|
119
|
+
| **PGlite** | ✅ Real PostgreSQL, 100GB+ limit, zero-config |
|
|
120
|
+
|
|
121
|
+
### 3.3 Architecture
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
125
|
+
│ Browser │
|
|
126
|
+
│ │
|
|
127
|
+
│ React Components │
|
|
128
|
+
│ │ │
|
|
129
|
+
│ ▼ │
|
|
130
|
+
│ storage.ts (API unchanged) │
|
|
131
|
+
│ │ │
|
|
132
|
+
│ ▼ │
|
|
133
|
+
│ PGlite (WASM PostgreSQL) │
|
|
134
|
+
│ │ │
|
|
135
|
+
│ ▼ │
|
|
136
|
+
│ IndexedDB (100GB+ limit) │
|
|
137
|
+
│ │ │
|
|
138
|
+
│ ▼ (optional) │
|
|
139
|
+
│ ElectricSQL Sync ──────────▶ External PostgreSQL │
|
|
140
|
+
│ │
|
|
141
|
+
└─────────────────────────────────────────────────────────────┘
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Important:** The existing `storage.ts` API is preserved, only the backend changes.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 4. Database Schema
|
|
149
|
+
|
|
150
|
+
### 4.1 Tables
|
|
151
|
+
|
|
152
|
+
```sql
|
|
153
|
+
-- Users
|
|
154
|
+
CREATE TABLE users (
|
|
155
|
+
id TEXT PRIMARY KEY,
|
|
156
|
+
username TEXT UNIQUE NOT NULL,
|
|
157
|
+
email TEXT,
|
|
158
|
+
role TEXT DEFAULT 'user', -- admin, user, viewer
|
|
159
|
+
preferences JSONB DEFAULT '{}',
|
|
160
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
161
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
-- Connections (passwords excluded - stay in localStorage)
|
|
165
|
+
CREATE TABLE connections (
|
|
166
|
+
id TEXT PRIMARY KEY,
|
|
167
|
+
user_id TEXT REFERENCES users(id),
|
|
168
|
+
name TEXT NOT NULL,
|
|
169
|
+
type TEXT NOT NULL, -- postgres, mysql, sqlite, mongodb
|
|
170
|
+
host TEXT,
|
|
171
|
+
port INTEGER,
|
|
172
|
+
database_name TEXT,
|
|
173
|
+
username TEXT,
|
|
174
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
-- Query History
|
|
178
|
+
CREATE TABLE query_logs (
|
|
179
|
+
id TEXT PRIMARY KEY,
|
|
180
|
+
user_id TEXT REFERENCES users(id),
|
|
181
|
+
connection_id TEXT,
|
|
182
|
+
connection_name TEXT,
|
|
183
|
+
tab_name TEXT,
|
|
184
|
+
query TEXT NOT NULL,
|
|
185
|
+
row_count INTEGER,
|
|
186
|
+
execution_time_ms INTEGER,
|
|
187
|
+
status TEXT NOT NULL, -- success, error
|
|
188
|
+
error_message TEXT,
|
|
189
|
+
executed_at TEXT DEFAULT (datetime('now'))
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
-- Saved Queries
|
|
193
|
+
CREATE TABLE saved_queries (
|
|
194
|
+
id TEXT PRIMARY KEY,
|
|
195
|
+
user_id TEXT REFERENCES users(id),
|
|
196
|
+
name TEXT NOT NULL,
|
|
197
|
+
description TEXT,
|
|
198
|
+
query TEXT NOT NULL,
|
|
199
|
+
connection_type TEXT,
|
|
200
|
+
tags TEXT, -- JSON array as text
|
|
201
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
202
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
-- Sync Config (optional)
|
|
206
|
+
CREATE TABLE sync_config (
|
|
207
|
+
id TEXT PRIMARY KEY,
|
|
208
|
+
sync_enabled INTEGER DEFAULT 0,
|
|
209
|
+
sync_url TEXT,
|
|
210
|
+
last_sync_at TEXT
|
|
211
|
+
);
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 5. Implementation Plan
|
|
217
|
+
|
|
218
|
+
### 5.1 File Structure (Minimal)
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
src/lib/
|
|
222
|
+
├── storage.ts # Existing API preserved, PGlite backend
|
|
223
|
+
├── pglite/
|
|
224
|
+
│ ├── client.ts # PGlite singleton
|
|
225
|
+
│ ├── migrations.ts # Schema migrations
|
|
226
|
+
│ └── sync.ts # ElectricSQL integration (Phase 2)
|
|
227
|
+
└── crypto/
|
|
228
|
+
└── vault.ts # Password encryption (localStorage)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 5.2 Phase 1: PGlite Integration (1 week)
|
|
232
|
+
|
|
233
|
+
**Goal:** LocalStorage → PGlite migration
|
|
234
|
+
|
|
235
|
+
| Task | Description |
|
|
236
|
+
|------|-------------|
|
|
237
|
+
| PGlite client | Singleton instance, lazy loading |
|
|
238
|
+
| Migrations | Initial schema, version tracking |
|
|
239
|
+
| storage.ts refactor | Same API, PGlite backend |
|
|
240
|
+
| Data migration | Migrate existing localStorage data to PGlite |
|
|
241
|
+
|
|
242
|
+
**storage.ts change:**
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
// BEFORE
|
|
246
|
+
export const storage = {
|
|
247
|
+
getHistory: () => {
|
|
248
|
+
const stored = localStorage.getItem(HISTORY_KEY);
|
|
249
|
+
return JSON.parse(stored);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
// AFTER
|
|
254
|
+
export const storage = {
|
|
255
|
+
getHistory: async () => {
|
|
256
|
+
const db = await getPGlite();
|
|
257
|
+
const result = await db.query('SELECT * FROM query_logs ORDER BY executed_at DESC');
|
|
258
|
+
return result.rows;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 5.3 Phase 2: User Management (1 week)
|
|
264
|
+
|
|
265
|
+
**Goal:** Real user system
|
|
266
|
+
|
|
267
|
+
| Task | Description |
|
|
268
|
+
|------|-------------|
|
|
269
|
+
| User CRUD | Create, read, update users |
|
|
270
|
+
| Auth integration | Connect with existing JWT system |
|
|
271
|
+
| Role-based queries | User-based data filtering |
|
|
272
|
+
| Settings UI | User preferences page |
|
|
273
|
+
|
|
274
|
+
### 5.4 Phase 3: ElectricSQL Sync (1 week)
|
|
275
|
+
|
|
276
|
+
**Goal:** Optional external sync
|
|
277
|
+
|
|
278
|
+
| Task | Description |
|
|
279
|
+
|------|-------------|
|
|
280
|
+
| Electric client | Sync client setup |
|
|
281
|
+
| Sync UI | Connection form, status indicator |
|
|
282
|
+
| Conflict handling | Last-write-wins |
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 6. API Compatibility
|
|
287
|
+
|
|
288
|
+
**Existing API is preserved, only becomes async:**
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
// Current usage (Studio.tsx)
|
|
292
|
+
storage.addToHistory(item);
|
|
293
|
+
const history = storage.getHistory();
|
|
294
|
+
|
|
295
|
+
// New usage (minimal change)
|
|
296
|
+
await storage.addToHistory(item);
|
|
297
|
+
const history = await storage.getHistory();
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Studio.tsx changes are minimal:**
|
|
301
|
+
- `storage.xxx()` → `await storage.xxx()`
|
|
302
|
+
- Async wrapper inside useEffect
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 7. Security
|
|
307
|
+
|
|
308
|
+
| Data | Storage | Sync |
|
|
309
|
+
|------|---------|------|
|
|
310
|
+
| Passwords | localStorage (encrypted) | ❌ Never |
|
|
311
|
+
| User information | PGlite | ✅ Optional |
|
|
312
|
+
| Query history | PGlite | ✅ Optional |
|
|
313
|
+
| Saved queries | PGlite | ✅ Optional |
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## 8. Dependencies
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"@electric-sql/pglite": "^0.2.x"
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Note:** ElectricSQL sync client will be added in Phase 3.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 9. Timeline
|
|
330
|
+
|
|
331
|
+
| Phase | Duration | Output |
|
|
332
|
+
|-------|----------|--------|
|
|
333
|
+
| Phase 1: PGlite | 5-7 days | LocalStorage → PGlite migration |
|
|
334
|
+
| Phase 2: Users | 5-7 days | User management |
|
|
335
|
+
| Phase 3: Sync | 5-7 days | Optional external sync |
|
|
336
|
+
|
|
337
|
+
**Total:** ~3 weeks
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 10. Summary
|
|
342
|
+
|
|
343
|
+
```
|
|
344
|
+
Requirement → Solution
|
|
345
|
+
─────────────────────────────────────────────────
|
|
346
|
+
User/Role Management → users table + role column
|
|
347
|
+
Query Logging → query_logs table
|
|
348
|
+
Saved Queries → saved_queries table
|
|
349
|
+
Account Management → users.preferences JSONB
|
|
350
|
+
Platform (future) → ElectricSQL sync
|
|
351
|
+
Zero-config → PGlite (in-browser)
|
|
352
|
+
Optional persistence → ElectricSQL → External PostgreSQL
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## 11. References
|
|
358
|
+
|
|
359
|
+
- [PGlite](https://pglite.dev/) - In-browser PostgreSQL
|
|
360
|
+
- [ElectricSQL](https://electric-sql.com/) - Postgres sync
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Inline Data Editing
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Enable direct data manipulation in the Results Grid without writing SQL queries manually.
|
|
5
|
+
|
|
6
|
+
## Problem Statement
|
|
7
|
+
Currently, users must write UPDATE, INSERT, or DELETE statements manually to modify data. This is time-consuming for quick fixes and requires SQL knowledge for simple operations.
|
|
8
|
+
|
|
9
|
+
## Proposed Solution
|
|
10
|
+
Add inline editing capabilities to the ResultsGrid component, allowing users to:
|
|
11
|
+
- Edit cell values directly by double-clicking
|
|
12
|
+
- Insert new rows
|
|
13
|
+
- Delete existing rows
|
|
14
|
+
- Review pending changes before committing
|
|
15
|
+
|
|
16
|
+
## Features
|
|
17
|
+
|
|
18
|
+
### 1. Cell Editing
|
|
19
|
+
- Double-click on a cell to enter edit mode
|
|
20
|
+
- Press Enter to confirm, Escape to cancel
|
|
21
|
+
- Visual indicator for modified cells (highlight/border)
|
|
22
|
+
- Type-aware input fields (text, number, date, boolean)
|
|
23
|
+
|
|
24
|
+
### 2. Row Operations
|
|
25
|
+
- "Add Row" button in toolbar
|
|
26
|
+
- Row selection with checkbox
|
|
27
|
+
- "Delete Selected" button with confirmation
|
|
28
|
+
- Right-click context menu for row operations
|
|
29
|
+
|
|
30
|
+
### 3. Change Tracking
|
|
31
|
+
- Pending changes indicator (badge count)
|
|
32
|
+
- Changes panel showing all modifications
|
|
33
|
+
- Diff view: original value → new value
|
|
34
|
+
- Undo individual changes
|
|
35
|
+
|
|
36
|
+
### 4. Commit/Rollback
|
|
37
|
+
- "Commit Changes" button - executes all pending changes
|
|
38
|
+
- "Rollback" button - discards all pending changes
|
|
39
|
+
- Transaction support (all-or-nothing)
|
|
40
|
+
- Success/error feedback per operation
|
|
41
|
+
|
|
42
|
+
### 5. Safety Features
|
|
43
|
+
- Confirmation dialog for destructive operations
|
|
44
|
+
- Primary key requirement for UPDATE/DELETE
|
|
45
|
+
- Row count limit for bulk operations
|
|
46
|
+
- Read-only mode toggle
|
|
47
|
+
|
|
48
|
+
## Technical Considerations
|
|
49
|
+
|
|
50
|
+
### Database Requirements
|
|
51
|
+
- Table must have a PRIMARY KEY for UPDATE/DELETE
|
|
52
|
+
- User must have appropriate permissions
|
|
53
|
+
- Connection must support transactions
|
|
54
|
+
|
|
55
|
+
### UI Components
|
|
56
|
+
- Extend `ResultsGrid.tsx` with edit mode
|
|
57
|
+
- New `PendingChanges` component
|
|
58
|
+
- New `EditableCell` component
|
|
59
|
+
- Toolbar additions
|
|
60
|
+
|
|
61
|
+
### API Endpoints
|
|
62
|
+
```
|
|
63
|
+
POST /api/db/mutation
|
|
64
|
+
{
|
|
65
|
+
connection: DatabaseConnection,
|
|
66
|
+
operations: [
|
|
67
|
+
{ type: 'UPDATE', table: string, pk: object, changes: object },
|
|
68
|
+
{ type: 'INSERT', table: string, values: object },
|
|
69
|
+
{ type: 'DELETE', table: string, pk: object }
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## UI Mockup
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
78
|
+
│ Results [3 pending] [+] │
|
|
79
|
+
├─────────────────────────────────────────────────────────────┤
|
|
80
|
+
│ ☐ │ id │ name │ email │ status │ │
|
|
81
|
+
├───┼────┼─────────────┼────────────────────┼──────────┼─────┤
|
|
82
|
+
│ ☐ │ 1 │ John Doe │ john@example.com │ active │ │
|
|
83
|
+
│ ☑ │ 2 │ [Jane Doe]* │ jane@example.com │ active │ 🗑 │
|
|
84
|
+
│ ☐ │ 3 │ Bob Smith │ bob@example.com │ inactive │ │
|
|
85
|
+
│ + │ -- │ New row... │ -- │ -- │ │
|
|
86
|
+
└─────────────────────────────────────────────────────────────┘
|
|
87
|
+
│ [Rollback] [Commit Changes] │
|
|
88
|
+
└─────────────────────────────────────────────────────────────┘
|
|
89
|
+
|
|
90
|
+
* = modified cell (highlighted)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Acceptance Criteria
|
|
94
|
+
- [ ] User can double-click a cell to edit its value
|
|
95
|
+
- [ ] Modified cells are visually distinct
|
|
96
|
+
- [ ] User can add new rows to the result set
|
|
97
|
+
- [ ] User can delete selected rows
|
|
98
|
+
- [ ] Pending changes are tracked and displayed
|
|
99
|
+
- [ ] User can commit all changes in a single transaction
|
|
100
|
+
- [ ] User can rollback all pending changes
|
|
101
|
+
- [ ] Confirmation dialog appears before destructive operations
|
|
102
|
+
- [ ] Error handling with clear feedback
|
|
103
|
+
- [ ] Works with PostgreSQL, MySQL, SQLite
|
|
104
|
+
|
|
105
|
+
## Dependencies
|
|
106
|
+
- Primary key detection from schema
|
|
107
|
+
- Transaction support in database providers
|
|
108
|
+
- Permission checking
|
|
109
|
+
|
|
110
|
+
## Estimated Effort
|
|
111
|
+
Medium-High complexity
|
|
112
|
+
|
|
113
|
+
## Priority
|
|
114
|
+
P2 - Nice to have
|
|
115
|
+
|
|
116
|
+
## Related Issues
|
|
117
|
+
- Query Results Export (existing)
|
|
118
|
+
- Schema Explorer (existing)
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Data Import
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Enable importing data from external files (CSV, JSON, Excel) into database tables.
|
|
5
|
+
|
|
6
|
+
## Problem Statement
|
|
7
|
+
Users currently have no way to bulk import data through the UI. They must either:
|
|
8
|
+
- Write INSERT statements manually
|
|
9
|
+
- Use external tools (psql COPY, mysql LOAD DATA)
|
|
10
|
+
- Use command-line utilities
|
|
11
|
+
|
|
12
|
+
This creates friction for common workflows like data migration, seeding test data, or importing spreadsheet data.
|
|
13
|
+
|
|
14
|
+
## Proposed Solution
|
|
15
|
+
Add a data import feature accessible from the Schema Explorer, allowing users to:
|
|
16
|
+
- Upload files via drag & drop or file picker
|
|
17
|
+
- Preview and validate data before import
|
|
18
|
+
- Map file columns to table columns
|
|
19
|
+
- Configure import options (batch size, error handling)
|
|
20
|
+
- Execute import with progress tracking
|
|
21
|
+
|
|
22
|
+
## Supported Formats
|
|
23
|
+
|
|
24
|
+
### CSV
|
|
25
|
+
- Delimiter detection (comma, semicolon, tab)
|
|
26
|
+
- Header row option
|
|
27
|
+
- Quote character handling
|
|
28
|
+
- Encoding support (UTF-8, Latin-1)
|
|
29
|
+
|
|
30
|
+
### JSON
|
|
31
|
+
- Array of objects format
|
|
32
|
+
- Nested object flattening (optional)
|
|
33
|
+
- JSON Lines (.jsonl) support
|
|
34
|
+
|
|
35
|
+
### Excel (.xlsx)
|
|
36
|
+
- Sheet selection
|
|
37
|
+
- Header row configuration
|
|
38
|
+
- Date format handling
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
### 1. File Upload
|
|
43
|
+
- Drag & drop zone
|
|
44
|
+
- File picker button
|
|
45
|
+
- File size limit (configurable, default 50MB)
|
|
46
|
+
- Format auto-detection
|
|
47
|
+
|
|
48
|
+
### 2. Data Preview
|
|
49
|
+
- First 100 rows preview
|
|
50
|
+
- Column type inference
|
|
51
|
+
- Error/warning indicators
|
|
52
|
+
- Row count display
|
|
53
|
+
|
|
54
|
+
### 3. Column Mapping
|
|
55
|
+
- Auto-mapping by column name
|
|
56
|
+
- Manual mapping dropdown
|
|
57
|
+
- Ignore column option
|
|
58
|
+
- Type conversion warnings
|
|
59
|
+
- Required field validation
|
|
60
|
+
|
|
61
|
+
### 4. Import Options
|
|
62
|
+
- Batch size (default: 1000 rows)
|
|
63
|
+
- On error: Stop / Skip / Replace
|
|
64
|
+
- Truncate table before import (with confirmation)
|
|
65
|
+
- Dry run mode (validate only)
|
|
66
|
+
|
|
67
|
+
### 5. Progress & Results
|
|
68
|
+
- Progress bar with percentage
|
|
69
|
+
- Rows processed / total
|
|
70
|
+
- Success / error counts
|
|
71
|
+
- Error log with row numbers
|
|
72
|
+
- Cancel button
|
|
73
|
+
|
|
74
|
+
## Technical Considerations
|
|
75
|
+
|
|
76
|
+
### File Processing
|
|
77
|
+
- Client-side parsing for preview (Papa Parse for CSV)
|
|
78
|
+
- Server-side processing for large files
|
|
79
|
+
- Streaming for memory efficiency
|
|
80
|
+
- Chunked uploads for large files
|
|
81
|
+
|
|
82
|
+
### API Endpoints
|
|
83
|
+
```
|
|
84
|
+
POST /api/db/import/preview
|
|
85
|
+
{
|
|
86
|
+
connection: DatabaseConnection,
|
|
87
|
+
file: FormData,
|
|
88
|
+
options: { format, delimiter, hasHeader }
|
|
89
|
+
}
|
|
90
|
+
Response: { columns: [], preview: [], rowCount: number }
|
|
91
|
+
|
|
92
|
+
POST /api/db/import/execute
|
|
93
|
+
{
|
|
94
|
+
connection: DatabaseConnection,
|
|
95
|
+
table: string,
|
|
96
|
+
mapping: { fileColumn: tableColumn }[],
|
|
97
|
+
options: { batchSize, onError, truncate }
|
|
98
|
+
}
|
|
99
|
+
Response: { success: number, failed: number, errors: [] }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Libraries
|
|
103
|
+
- CSV: `papaparse` (client) + `csv-parse` (server)
|
|
104
|
+
- Excel: `xlsx` or `exceljs`
|
|
105
|
+
- JSON: Native parsing
|
|
106
|
+
|
|
107
|
+
## UI Flow
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
111
|
+
│ Import Data to "users" │
|
|
112
|
+
├──────────────────────────────────────────────────────────────┤
|
|
113
|
+
│ Step 1: Upload File │
|
|
114
|
+
│ ┌────────────────────────────────────────────────────────┐ │
|
|
115
|
+
│ │ │ │
|
|
116
|
+
│ │ 📁 Drag & drop your file here │ │
|
|
117
|
+
│ │ or click to browse │ │
|
|
118
|
+
│ │ │ │
|
|
119
|
+
│ │ Supported: CSV, JSON, Excel (.xlsx) │ │
|
|
120
|
+
│ └────────────────────────────────────────────────────────┘ │
|
|
121
|
+
└──────────────────────────────────────────────────────────────┘
|
|
122
|
+
|
|
123
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
124
|
+
│ Step 2: Preview & Map Columns │
|
|
125
|
+
├──────────────────────────────────────────────────────────────┤
|
|
126
|
+
│ File: users_export.csv (1,234 rows) │
|
|
127
|
+
│ │
|
|
128
|
+
│ Column Mapping: │
|
|
129
|
+
│ ┌─────────────────┬─────────────────┬──────────────────┐ │
|
|
130
|
+
│ │ File Column │ Table Column │ Status │ │
|
|
131
|
+
│ ├─────────────────┼─────────────────┼──────────────────┤ │
|
|
132
|
+
│ │ name │ [name ▼] │ ✓ Mapped │ │
|
|
133
|
+
│ │ email │ [email ▼] │ ✓ Mapped │ │
|
|
134
|
+
│ │ age │ [age ▼] │ ⚠ Type mismatch │ │
|
|
135
|
+
│ │ created │ [-- Ignore --] │ Skipped │ │
|
|
136
|
+
│ └─────────────────┴─────────────────┴──────────────────┘ │
|
|
137
|
+
│ │
|
|
138
|
+
│ Preview (first 5 rows): │
|
|
139
|
+
│ ┌────────────────┬────────────────┬─────┐ │
|
|
140
|
+
│ │ name │ email │ age │ │
|
|
141
|
+
│ ├────────────────┼────────────────┼─────┤ │
|
|
142
|
+
│ │ John Doe │ john@test.com │ 25 │ │
|
|
143
|
+
│ │ Jane Smith │ jane@test.com │ 30 │ │
|
|
144
|
+
│ └────────────────┴────────────────┴─────┘ │
|
|
145
|
+
└──────────────────────────────────────────────────────────────┘
|
|
146
|
+
|
|
147
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
148
|
+
│ Step 3: Import Options │
|
|
149
|
+
├──────────────────────────────────────────────────────────────┤
|
|
150
|
+
│ Batch Size: [1000 ▼] │
|
|
151
|
+
│ On Error: (•) Skip row ( ) Stop import ( ) Replace │
|
|
152
|
+
│ [ ] Truncate table before import ⚠ │
|
|
153
|
+
│ [ ] Dry run (validate only) │
|
|
154
|
+
│ │
|
|
155
|
+
│ [Cancel] [Start Import] │
|
|
156
|
+
└──────────────────────────────────────────────────────────────┘
|
|
157
|
+
|
|
158
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
159
|
+
│ Importing... │
|
|
160
|
+
├──────────────────────────────────────────────────────────────┤
|
|
161
|
+
│ ████████████████████░░░░░░░░░░ 67% │
|
|
162
|
+
│ 823 / 1,234 rows processed │
|
|
163
|
+
│ ✓ 820 successful ✗ 3 failed │
|
|
164
|
+
│ │
|
|
165
|
+
│ [Cancel] │
|
|
166
|
+
└──────────────────────────────────────────────────────────────┘
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Entry Points
|
|
170
|
+
|
|
171
|
+
1. **Schema Explorer Context Menu**
|
|
172
|
+
- Right-click on table → "Import Data..."
|
|
173
|
+
|
|
174
|
+
2. **Table Actions Dropdown**
|
|
175
|
+
- Table row → More menu → "Import"
|
|
176
|
+
|
|
177
|
+
3. **Toolbar Button** (when table is selected)
|
|
178
|
+
- Import icon in schema explorer toolbar
|
|
179
|
+
|
|
180
|
+
## Acceptance Criteria
|
|
181
|
+
- [ ] User can upload CSV, JSON, and Excel files
|
|
182
|
+
- [ ] File format is auto-detected
|
|
183
|
+
- [ ] Preview shows first 100 rows
|
|
184
|
+
- [ ] Columns can be mapped to table columns
|
|
185
|
+
- [ ] Unmapped columns can be ignored
|
|
186
|
+
- [ ] Type mismatches show warnings
|
|
187
|
+
- [ ] Import options are configurable
|
|
188
|
+
- [ ] Progress is displayed during import
|
|
189
|
+
- [ ] Errors are logged with row numbers
|
|
190
|
+
- [ ] Import can be cancelled
|
|
191
|
+
- [ ] Success message shows final counts
|
|
192
|
+
- [ ] Works with PostgreSQL, MySQL, SQLite
|
|
193
|
+
|
|
194
|
+
## Security Considerations
|
|
195
|
+
- File size limits
|
|
196
|
+
- Sanitize input data
|
|
197
|
+
- SQL injection prevention (parameterized queries)
|
|
198
|
+
- Rate limiting on import endpoint
|
|
199
|
+
- Validate file types (not just extension)
|
|
200
|
+
|
|
201
|
+
## Dependencies
|
|
202
|
+
- Schema information (column names, types)
|
|
203
|
+
- Database write permissions
|
|
204
|
+
- Bulk insert support in providers
|
|
205
|
+
|
|
206
|
+
## Estimated Effort
|
|
207
|
+
High complexity
|
|
208
|
+
|
|
209
|
+
## Priority
|
|
210
|
+
P2 - Nice to have
|
|
211
|
+
|
|
212
|
+
## Related Issues
|
|
213
|
+
- Data Export (existing feature)
|
|
214
|
+
- Inline Data Editing (backlog)
|
|
215
|
+
- Schema Explorer (existing)
|