@libredb/studio 0.9.7 → 0.9.12
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/dist/chunk-34YQUUCM.mjs +319 -0
- package/dist/chunk-34YQUUCM.mjs.map +1 -0
- package/dist/chunk-4LVB3K53.mjs +37 -0
- package/dist/chunk-4LVB3K53.mjs.map +1 -0
- package/dist/chunk-6DRZXXNT.mjs +100 -0
- package/dist/chunk-6DRZXXNT.mjs.map +1 -0
- package/dist/chunk-CZVV3JJB.mjs +160 -0
- package/dist/chunk-CZVV3JJB.mjs.map +1 -0
- package/dist/chunk-D4WVWWWF.js +332 -0
- package/dist/chunk-D4WVWWWF.js.map +1 -0
- package/dist/chunk-DY3KXE44.mjs +3 -0
- package/dist/chunk-DY3KXE44.mjs.map +1 -0
- package/dist/chunk-DZ2UB3C6.mjs +6679 -0
- package/dist/chunk-DZ2UB3C6.mjs.map +1 -0
- package/dist/chunk-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-JOGLIOFO.js +1310 -0
- package/dist/chunk-JOGLIOFO.js.map +1 -0
- package/dist/chunk-JZO5KRZN.js +165 -0
- package/dist/chunk-JZO5KRZN.js.map +1 -0
- package/dist/chunk-KV356UXJ.js +253 -0
- package/dist/chunk-KV356UXJ.js.map +1 -0
- package/dist/chunk-PPODO6HX.mjs +237 -0
- package/dist/chunk-PPODO6HX.mjs.map +1 -0
- package/dist/chunk-PTIRB2JO.js +258 -0
- package/dist/chunk-PTIRB2JO.js.map +1 -0
- package/dist/chunk-Q6LRDBK7.js +42 -0
- package/dist/chunk-Q6LRDBK7.js.map +1 -0
- package/dist/chunk-QJP5FZRY.mjs +255 -0
- package/dist/chunk-QJP5FZRY.mjs.map +1 -0
- package/dist/chunk-R3POCJK6.mjs +248 -0
- package/dist/chunk-R3POCJK6.mjs.map +1 -0
- package/dist/chunk-RBVDMLFV.js +6747 -0
- package/dist/chunk-RBVDMLFV.js.map +1 -0
- package/dist/chunk-RCQB4FCE.js +186 -0
- package/dist/chunk-RCQB4FCE.js.map +1 -0
- package/dist/chunk-SR5DRGBX.mjs +174 -0
- package/dist/chunk-SR5DRGBX.mjs.map +1 -0
- package/dist/chunk-VLCRUZX7.js +102 -0
- package/dist/chunk-VLCRUZX7.js.map +1 -0
- package/dist/chunk-VWVRUCQO.mjs +1289 -0
- package/dist/chunk-VWVRUCQO.mjs.map +1 -0
- package/dist/components.d.mts +273 -0
- package/dist/components.d.ts +273 -0
- package/dist/components.js +59 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +6 -0
- package/dist/components.mjs.map +1 -0
- package/dist/custom-BNDOYC5P.js +134 -0
- package/dist/custom-BNDOYC5P.js.map +1 -0
- package/dist/custom-S2EKFMP3.mjs +132 -0
- package/dist/custom-S2EKFMP3.mjs.map +1 -0
- package/dist/gemini-4ASHNK4H.js +81 -0
- package/dist/gemini-4ASHNK4H.js.map +1 -0
- package/dist/gemini-C5RBLQEJ.mjs +79 -0
- package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mongodb-XMZEZA4A.mjs +748 -0
- package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
- package/dist/mongodb-YQJJTLX3.js +750 -0
- package/dist/mongodb-YQJJTLX3.js.map +1 -0
- package/dist/mssql-PMOU4D36.js +916 -0
- package/dist/mssql-PMOU4D36.js.map +1 -0
- package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
- package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
- package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
- package/dist/mysql-I3WJQXN2.mjs.map +1 -0
- package/dist/mysql-Y3MSA5QY.js +833 -0
- package/dist/mysql-Y3MSA5QY.js.map +1 -0
- package/dist/ollama-26BYLVEV.mjs +115 -0
- package/dist/ollama-26BYLVEV.mjs.map +1 -0
- package/dist/ollama-HVWAGKQC.js +117 -0
- package/dist/ollama-HVWAGKQC.js.map +1 -0
- package/dist/openai-4U56KPG7.mjs +111 -0
- package/dist/openai-4U56KPG7.mjs.map +1 -0
- package/dist/openai-AK3R37BS.js +113 -0
- package/dist/openai-AK3R37BS.js.map +1 -0
- package/dist/oracle-L6VEAVXO.js +917 -0
- package/dist/oracle-L6VEAVXO.js.map +1 -0
- package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
- package/dist/oracle-P2G7T4P4.mjs.map +1 -0
- package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
- package/dist/postgres-O5KOQUVP.mjs.map +1 -0
- package/dist/postgres-RLCWNFFX.js +971 -0
- package/dist/postgres-RLCWNFFX.js.map +1 -0
- package/dist/providers.d.mts +149 -0
- package/dist/providers.d.ts +149 -0
- package/dist/providers.js +44 -0
- package/dist/providers.js.map +1 -0
- package/dist/providers.mjs +7 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/redis-4WMQOVLX.mjs +435 -0
- package/dist/redis-4WMQOVLX.mjs.map +1 -0
- package/dist/redis-QVQ6YU62.js +441 -0
- package/dist/redis-QVQ6YU62.js.map +1 -0
- package/dist/sqlite-4I2P2OGQ.js +554 -0
- package/dist/sqlite-4I2P2OGQ.js.map +1 -0
- package/dist/sqlite-OA4YJX5S.mjs +531 -0
- package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
- package/dist/types-BJvJfxSY.d.mts +141 -0
- package/dist/types-BJvJfxSY.d.ts +141 -0
- package/dist/types-ClAg_v5k.d.mts +343 -0
- package/dist/types-Der_X8E8.d.ts +343 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/dist/workspace.d.mts +80 -0
- package/dist/workspace.d.ts +80 -0
- package/dist/workspace.js +4182 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4155 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +60 -5
- package/.claude/settings.local.json +0 -127
- package/.cursorrules +0 -426
- package/.devin/wiki.json +0 -143
- package/.dockerignore +0 -80
- package/.env.example +0 -159
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
- package/.github/workflows/ci.yml +0 -185
- package/.github/workflows/codeql.yml +0 -57
- package/.github/workflows/docker-build-push.yml +0 -118
- package/.github/workflows/helm-release.yml +0 -113
- package/CLAUDE.md +0 -265
- package/CODE_OF_CONDUCT.md +0 -124
- package/CONTRIBUTING.md +0 -154
- package/Dockerfile +0 -73
- package/SECURITY.md +0 -107
- package/artifacthub-repo.yml +0 -4
- package/bun.lock +0 -1714
- package/bunfig.toml +0 -3
- package/charts/libredb-studio/.helmignore +0 -11
- package/charts/libredb-studio/Chart.lock +0 -6
- package/charts/libredb-studio/Chart.yaml +0 -50
- package/charts/libredb-studio/README.md +0 -206
- package/charts/libredb-studio/templates/NOTES.txt +0 -59
- package/charts/libredb-studio/templates/_helpers.tpl +0 -135
- package/charts/libredb-studio/templates/configmap.yaml +0 -37
- package/charts/libredb-studio/templates/deployment.yaml +0 -184
- package/charts/libredb-studio/templates/hpa.yaml +0 -32
- package/charts/libredb-studio/templates/ingress.yaml +0 -41
- package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
- package/charts/libredb-studio/templates/pdb.yaml +0 -18
- package/charts/libredb-studio/templates/pvc.yaml +0 -23
- package/charts/libredb-studio/templates/secret.yaml +0 -30
- package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
- package/charts/libredb-studio/templates/service.yaml +0 -22
- package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
- package/charts/libredb-studio/values.schema.json +0 -246
- package/charts/libredb-studio/values.yaml +0 -286
- package/components.json +0 -22
- package/conductor/code_styleguides/typescript.md +0 -43
- package/conductor/product-guidelines.md +0 -43
- package/conductor/product.md +0 -3
- package/conductor/setup_state.json +0 -1
- package/conductor/tech-stack.md +0 -39
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
- package/conductor/tracks.md +0 -8
- package/conductor/workflow.md +0 -333
- package/database-compose.yml +0 -55
- package/docker/postgres-init/01-extensions.sql +0 -10
- package/docker/postgres-init/02-sample-data.sql +0 -585
- package/docker/postgres.yml +0 -68
- package/docker-compose.yml +0 -38
- package/docs/AI_PLAN.md +0 -74
- package/docs/API_DOCS.md +0 -875
- package/docs/ARCHITECTURE.md +0 -218
- package/docs/DATABASE_PROVIDERS.md +0 -358
- package/docs/FEATURES.md +0 -116
- package/docs/HELM_CHART.md +0 -252
- package/docs/LOGIN_PAGE.md +0 -178
- package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
- package/docs/OIDC_ARCH.md +0 -681
- package/docs/OIDC_SETUP.md +0 -322
- package/docs/POSTGRES_METRICS.md +0 -516
- package/docs/QUERY_OPTIMIZATION.md +0 -370
- package/docs/SEED_CONNECTIONS.md +0 -468
- package/docs/SQL_ALIAS_COMPLETION.md +0 -190
- package/docs/STORAGE_ARCHITECTURE.md +0 -565
- package/docs/STORAGE_QUICK_SETUP.md +0 -419
- package/docs/TECHNICAL_PLAN.md +0 -36
- package/docs/THEMING.md +0 -345
- package/docs/adding-a-new-database-provider.md +0 -642
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
- package/docs/backlogs/002-DATA_IMPORT.md +0 -215
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
- package/docs/backlogs/006-DATA_MASKING.md +0 -418
- package/docs/enterprise-features.md +0 -718
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
- package/docs/medium-koyeb-article-en.md +0 -215
- package/docs/plans/test-plans.md +0 -445
- package/docs/releases/RELEASE.V0.3.0.md +0 -22
- package/docs/releases/RELEASE.V0.4.0.md +0 -154
- package/docs/releases/RELEASE.V0.5.0.md +0 -252
- package/docs/releases/RELEASE_v0.5.6.md +0 -145
- package/docs/releases/RELEASE_v0.6.1.md +0 -303
- package/docs/releases/RELEASE_v0.6.7.md +0 -292
- package/docs/releases/RELEASE_v0.7.0.md +0 -332
- package/docs/releases/RELEASE_v0.8.0.md +0 -521
- package/docs/sampledb/titanic.sql +0 -1379
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
- package/e2e/admin-dashboard.spec.ts +0 -64
- package/e2e/connection-management.spec.ts +0 -58
- package/e2e/export.spec.ts +0 -34
- package/e2e/login.spec.ts +0 -85
- package/e2e/query-execution.spec.ts +0 -35
- package/e2e/tab-management.spec.ts +0 -64
- package/eslint.config.mjs +0 -28
- package/fly.toml +0 -43
- package/next.config.ts +0 -32
- package/playwright.config.ts +0 -34
- package/postcss.config.mjs +0 -7
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/logo.svg +0 -32
- package/public/next.svg +0 -1
- 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 +0 -1
- package/public/window.svg +0 -1
- package/render.yaml +0 -58
- package/scripts/merge-lcov.mjs +0 -239
- package/sonar-project.properties +0 -16
- package/src/app/admin/error.tsx +0 -46
- package/src/app/admin/page.tsx +0 -10
- package/src/app/api/admin/audit/route.ts +0 -52
- package/src/app/api/admin/fleet-health/route.ts +0 -81
- package/src/app/api/ai/autopilot/route.ts +0 -105
- package/src/app/api/ai/chat/route.ts +0 -132
- package/src/app/api/ai/describe-schema/route.ts +0 -52
- package/src/app/api/ai/explain/route.ts +0 -86
- package/src/app/api/ai/impact/route.ts +0 -97
- package/src/app/api/ai/index-advisor/route.ts +0 -98
- package/src/app/api/ai/nl2sql/route.ts +0 -87
- package/src/app/api/ai/query-safety/route.ts +0 -87
- package/src/app/api/auth/login/route.ts +0 -62
- package/src/app/api/auth/logout/route.ts +0 -25
- package/src/app/api/auth/me/route.ts +0 -10
- package/src/app/api/auth/oidc/callback/route.ts +0 -82
- package/src/app/api/auth/oidc/login/route.ts +0 -43
- package/src/app/api/connections/managed/route.ts +0 -35
- package/src/app/api/db/cancel/route.ts +0 -42
- package/src/app/api/db/disconnect/route.ts +0 -28
- package/src/app/api/db/health/route.ts +0 -49
- package/src/app/api/db/maintenance/route.ts +0 -72
- package/src/app/api/db/monitoring/route.ts +0 -62
- package/src/app/api/db/multi-query/route.ts +0 -116
- package/src/app/api/db/pool-stats/route.ts +0 -37
- package/src/app/api/db/profile/route.ts +0 -144
- package/src/app/api/db/provider-meta/route.ts +0 -49
- package/src/app/api/db/query/route.ts +0 -50
- package/src/app/api/db/schema/route.ts +0 -47
- package/src/app/api/db/schema-snapshot/route.ts +0 -42
- package/src/app/api/db/test-connection/route.ts +0 -55
- package/src/app/api/db/transaction/route.ts +0 -111
- package/src/app/api/storage/[collection]/route.ts +0 -67
- package/src/app/api/storage/config/route.ts +0 -17
- package/src/app/api/storage/migrate/route.ts +0 -45
- package/src/app/api/storage/route.ts +0 -32
- package/src/app/error.tsx +0 -49
- package/src/app/global-error.tsx +0 -55
- package/src/app/globals.css +0 -146
- package/src/app/icon.svg +0 -42
- package/src/app/layout.tsx +0 -34
- package/src/app/login/login-form.tsx +0 -301
- package/src/app/login/page.tsx +0 -11
- package/src/app/monitoring/page.tsx +0 -8
- package/src/app/not-found.tsx +0 -29
- package/src/app/page.tsx +0 -5
- package/src/components/AIAutopilotPanel.tsx +0 -238
- package/src/components/CodeGenerator.tsx +0 -271
- package/src/components/CommandPalette.tsx +0 -227
- package/src/components/ConnectionModal.tsx +0 -759
- package/src/components/CreateTableModal.tsx +0 -281
- package/src/components/DataCharts.tsx +0 -962
- package/src/components/DataImportModal.tsx +0 -582
- package/src/components/DataProfiler.tsx +0 -335
- package/src/components/DatabaseDocs.tsx +0 -251
- package/src/components/MaskingSettings.tsx +0 -414
- package/src/components/MobileNav.tsx +0 -50
- package/src/components/NL2SQLPanel.tsx +0 -281
- package/src/components/PivotTable.tsx +0 -257
- package/src/components/QueryEditor.tsx +0 -760
- package/src/components/QueryHistory.tsx +0 -344
- package/src/components/QuerySafetyDialog.tsx +0 -290
- package/src/components/ResultsGrid.tsx +0 -644
- package/src/components/SaveQueryModal.tsx +0 -104
- package/src/components/SavedQueries.tsx +0 -128
- package/src/components/SchemaDiagram.tsx +0 -473
- package/src/components/SchemaDiff.tsx +0 -473
- package/src/components/SnapshotTimeline.tsx +0 -116
- package/src/components/Studio.tsx +0 -639
- package/src/components/TestDataGenerator.tsx +0 -261
- package/src/components/VisualExplain.tsx +0 -820
- package/src/components/admin/AdminDashboard.tsx +0 -163
- package/src/components/admin/tabs/AuditTab.tsx +0 -531
- package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
- package/src/components/admin/tabs/OperationsTab.tsx +0 -646
- package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
- package/src/components/admin/tabs/SecurityTab.tsx +0 -284
- package/src/components/community-section.tsx +0 -92
- package/src/components/icons/db-icons.tsx +0 -84
- package/src/components/libredb-logo.tsx +0 -61
- package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
- package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
- package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
- package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
- package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
- package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
- package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
- package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
- package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
- package/src/components/results-grid/ResultCard.tsx +0 -111
- package/src/components/results-grid/RowDetailSheet.tsx +0 -178
- package/src/components/results-grid/StatsBar.tsx +0 -201
- package/src/components/results-grid/index.ts +0 -1
- package/src/components/results-grid/utils.ts +0 -23
- package/src/components/schema-explorer/ColumnList.tsx +0 -53
- package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
- package/src/components/schema-explorer/TableItem.tsx +0 -210
- package/src/components/schema-explorer/index.ts +0 -1
- package/src/components/sidebar/ConnectionItem.tsx +0 -105
- package/src/components/sidebar/ConnectionsList.tsx +0 -62
- package/src/components/sidebar/Sidebar.tsx +0 -130
- package/src/components/sidebar/index.ts +0 -2
- package/src/components/studio/BottomPanel.tsx +0 -286
- package/src/components/studio/QueryToolbar.tsx +0 -180
- package/src/components/studio/StudioDesktopHeader.tsx +0 -114
- package/src/components/studio/StudioMobileHeader.tsx +0 -340
- package/src/components/studio/StudioTabBar.tsx +0 -82
- package/src/components/studio/index.ts +0 -5
- package/src/components/ui/accordion.tsx +0 -66
- package/src/components/ui/alert-dialog.tsx +0 -157
- package/src/components/ui/alert.tsx +0 -66
- package/src/components/ui/aspect-ratio.tsx +0 -11
- package/src/components/ui/avatar.tsx +0 -53
- package/src/components/ui/badge.tsx +0 -46
- package/src/components/ui/breadcrumb.tsx +0 -109
- package/src/components/ui/button-group.tsx +0 -83
- package/src/components/ui/button.tsx +0 -60
- package/src/components/ui/calendar.tsx +0 -216
- package/src/components/ui/card.tsx +0 -92
- package/src/components/ui/carousel.tsx +0 -241
- package/src/components/ui/chart.tsx +0 -357
- package/src/components/ui/checkbox.tsx +0 -32
- package/src/components/ui/collapsible.tsx +0 -33
- package/src/components/ui/command.tsx +0 -184
- package/src/components/ui/context-menu.tsx +0 -252
- package/src/components/ui/dialog.tsx +0 -143
- package/src/components/ui/drawer.tsx +0 -135
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/empty.tsx +0 -104
- package/src/components/ui/field.tsx +0 -248
- package/src/components/ui/form.tsx +0 -167
- package/src/components/ui/hover-card.tsx +0 -44
- package/src/components/ui/input-group.tsx +0 -170
- package/src/components/ui/input-otp.tsx +0 -77
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/item.tsx +0 -193
- package/src/components/ui/kbd.tsx +0 -28
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/menubar.tsx +0 -276
- package/src/components/ui/navigation-menu.tsx +0 -168
- package/src/components/ui/pagination.tsx +0 -127
- package/src/components/ui/popover.tsx +0 -48
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/radio-group.tsx +0 -45
- package/src/components/ui/resizable.tsx +0 -56
- package/src/components/ui/scroll-area.tsx +0 -58
- package/src/components/ui/select.tsx +0 -187
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -726
- package/src/components/ui/skeleton.tsx +0 -13
- package/src/components/ui/slider.tsx +0 -63
- package/src/components/ui/sonner.tsx +0 -40
- package/src/components/ui/spinner.tsx +0 -16
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/table.tsx +0 -116
- package/src/components/ui/tabs.tsx +0 -66
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/toggle-group.tsx +0 -83
- package/src/components/ui/toggle.tsx +0 -47
- package/src/components/ui/tooltip.tsx +0 -61
- package/src/exports/components.ts +0 -15
- package/src/exports/index.ts +0 -4
- package/src/exports/providers.ts +0 -4
- package/src/exports/types.ts +0 -26
- package/src/hooks/use-ai-chat.ts +0 -182
- package/src/hooks/use-all-connections.ts +0 -66
- package/src/hooks/use-api-call.ts +0 -71
- package/src/hooks/use-auth.ts +0 -51
- package/src/hooks/use-connection-form.ts +0 -349
- package/src/hooks/use-connection-manager.ts +0 -169
- package/src/hooks/use-connection-payload.ts +0 -15
- package/src/hooks/use-inline-editing.ts +0 -109
- package/src/hooks/use-mobile.ts +0 -20
- package/src/hooks/use-monitoring-data.ts +0 -270
- package/src/hooks/use-provider-metadata.ts +0 -62
- package/src/hooks/use-query-execution.ts +0 -478
- package/src/hooks/use-storage-sync.ts +0 -259
- package/src/hooks/use-tab-manager.ts +0 -231
- package/src/hooks/use-toast.ts +0 -20
- package/src/hooks/use-transaction-control.ts +0 -64
- package/src/lib/api/error-codes.ts +0 -30
- package/src/lib/api/errors.ts +0 -236
- package/src/lib/api/with-error-handler.ts +0 -41
- package/src/lib/audit.ts +0 -105
- package/src/lib/auth.ts +0 -87
- package/src/lib/connection-string-parser.ts +0 -172
- package/src/lib/data-masking.ts +0 -385
- package/src/lib/db/base-provider.ts +0 -325
- package/src/lib/db/errors.ts +0 -317
- package/src/lib/db/factory.ts +0 -324
- package/src/lib/db/index.ts +0 -123
- package/src/lib/db/providers/document/index.ts +0 -6
- package/src/lib/db/providers/document/mongodb.ts +0 -992
- package/src/lib/db/providers/keyvalue/redis.ts +0 -554
- package/src/lib/db/providers/sql/index.ts +0 -11
- package/src/lib/db/providers/sql/sql-base.ts +0 -174
- package/src/lib/db/providers/sql/sqlite.ts +0 -721
- package/src/lib/db/types.ts +0 -437
- package/src/lib/db/utils/pool-manager.ts +0 -287
- package/src/lib/db/utils/query-limiter.ts +0 -239
- package/src/lib/db-ui-config.ts +0 -86
- package/src/lib/editor/mongodb-completions.ts +0 -172
- package/src/lib/editor/sql-completions.ts +0 -280
- package/src/lib/llm/base-provider.ts +0 -117
- package/src/lib/llm/factory.ts +0 -102
- package/src/lib/llm/index.ts +0 -90
- package/src/lib/llm/providers/custom.ts +0 -181
- package/src/lib/llm/providers/gemini.ts +0 -126
- package/src/lib/llm/providers/ollama.ts +0 -154
- package/src/lib/llm/providers/openai.ts +0 -146
- package/src/lib/llm/types.ts +0 -173
- package/src/lib/llm/utils/config.ts +0 -187
- package/src/lib/llm/utils/retry.ts +0 -119
- package/src/lib/llm/utils/streaming.ts +0 -202
- package/src/lib/logger.ts +0 -127
- package/src/lib/monitoring-thresholds.ts +0 -44
- package/src/lib/oidc.ts +0 -262
- package/src/lib/query-generators.ts +0 -61
- package/src/lib/schema-diff/diff-engine.ts +0 -273
- package/src/lib/schema-diff/migration-generator.ts +0 -208
- package/src/lib/schema-diff/types.ts +0 -55
- package/src/lib/seed/config-loader.ts +0 -79
- package/src/lib/seed/connection-filter.ts +0 -49
- package/src/lib/seed/credential-resolver.ts +0 -62
- package/src/lib/seed/index.ts +0 -40
- package/src/lib/seed/resolve-connection.ts +0 -57
- package/src/lib/seed/types.ts +0 -69
- package/src/lib/sql/alias-extractor.ts +0 -267
- package/src/lib/sql/index.ts +0 -8
- package/src/lib/sql/statement-splitter.ts +0 -167
- package/src/lib/sql/types.ts +0 -40
- package/src/lib/ssh/tunnel.ts +0 -142
- package/src/lib/storage/factory.ts +0 -84
- package/src/lib/storage/index.ts +0 -14
- package/src/lib/storage/local-storage.ts +0 -99
- package/src/lib/storage/providers/postgres.ts +0 -225
- package/src/lib/storage/providers/sqlite.ts +0 -153
- package/src/lib/storage/storage-facade.ts +0 -272
- package/src/lib/storage/types.ts +0 -75
- package/src/lib/time-series-buffer.ts +0 -58
- package/src/lib/types.ts +0 -173
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -104
- package/src/types/db-drivers.d.ts +0 -23
- package/src/types/html2canvas.d.ts +0 -9
- package/tests/api/admin/audit.test.ts +0 -178
- package/tests/api/admin/fleet-health.test.ts +0 -183
- package/tests/api/ai/autopilot.test.ts +0 -174
- package/tests/api/ai/chat.test.ts +0 -250
- package/tests/api/ai/describe-schema.test.ts +0 -266
- package/tests/api/ai/explain.test.ts +0 -199
- package/tests/api/ai/impact.test.ts +0 -168
- package/tests/api/ai/index-advisor.test.ts +0 -171
- package/tests/api/ai/nl2sql.test.ts +0 -202
- package/tests/api/ai/query-safety.test.ts +0 -196
- package/tests/api/auth/login.test.ts +0 -170
- package/tests/api/auth/logout.test.ts +0 -140
- package/tests/api/auth/me.test.ts +0 -73
- package/tests/api/auth/oidc-callback.test.ts +0 -215
- package/tests/api/auth/oidc-login.test.ts +0 -127
- package/tests/api/db/cancel.test.ts +0 -198
- package/tests/api/db/disconnect.test.ts +0 -124
- package/tests/api/db/health.test.ts +0 -222
- package/tests/api/db/maintenance.test.ts +0 -263
- package/tests/api/db/monitoring.test.ts +0 -221
- package/tests/api/db/multi-query.test.ts +0 -316
- package/tests/api/db/pool-stats.test.ts +0 -135
- package/tests/api/db/profile.test.ts +0 -330
- package/tests/api/db/provider-meta.test.ts +0 -193
- package/tests/api/db/query.test.ts +0 -314
- package/tests/api/db/schema-snapshot.test.ts +0 -170
- package/tests/api/db/schema.test.ts +0 -191
- package/tests/api/db/test-connection.test.ts +0 -185
- package/tests/api/db/transaction.test.ts +0 -314
- package/tests/api/proxy.test.ts +0 -191
- package/tests/api/seed/managed-route.test.ts +0 -113
- package/tests/api/storage/config.test.ts +0 -42
- package/tests/api/storage/storage-routes.test.ts +0 -309
- package/tests/components/AIAutopilotPanel.test.tsx +0 -756
- package/tests/components/AdminPage.test.tsx +0 -33
- package/tests/components/CodeGenerator.test.tsx +0 -182
- package/tests/components/CommandPalette.test.tsx +0 -428
- package/tests/components/CommunitySection.test.tsx +0 -91
- package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
- package/tests/components/ConnectionModal.test.tsx +0 -570
- package/tests/components/CreateTableModal.test.tsx +0 -383
- package/tests/components/DataCharts.test.tsx +0 -739
- package/tests/components/DataImportModal.test.tsx +0 -751
- package/tests/components/DataProfiler.test.tsx +0 -589
- package/tests/components/DatabaseDocs.test.tsx +0 -353
- package/tests/components/LoginPage.test.tsx +0 -163
- package/tests/components/LoginPageOIDC.test.tsx +0 -92
- package/tests/components/MaskingSettings.test.tsx +0 -498
- package/tests/components/MobileNav.test.tsx +0 -30
- package/tests/components/MonitoringPage.test.tsx +0 -32
- package/tests/components/NL2SQLPanel.test.tsx +0 -621
- package/tests/components/Page.test.tsx +0 -33
- package/tests/components/PivotTable.test.tsx +0 -350
- package/tests/components/QueryEditor.test.tsx +0 -1730
- package/tests/components/QueryHistory.test.tsx +0 -572
- package/tests/components/QuerySafetyDialog.test.tsx +0 -586
- package/tests/components/ResultsGrid.test.tsx +0 -804
- package/tests/components/RootLayout.test.tsx +0 -83
- package/tests/components/SaveQueryModal.test.tsx +0 -25
- package/tests/components/SavedQueries.test.tsx +0 -43
- package/tests/components/SchemaDiagram.test.tsx +0 -1034
- package/tests/components/SchemaDiff.test.tsx +0 -906
- package/tests/components/SnapshotTimeline.test.tsx +0 -174
- package/tests/components/Studio.test.tsx +0 -1030
- package/tests/components/TestDataGenerator.test.tsx +0 -291
- package/tests/components/VisualExplain.test.tsx +0 -704
- package/tests/components/admin/AdminDashboard.test.tsx +0 -205
- package/tests/components/admin/AuditTab.test.tsx +0 -220
- package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
- package/tests/components/admin/OperationsTab.test.tsx +0 -975
- package/tests/components/admin/OverviewTab.test.tsx +0 -254
- package/tests/components/admin/SecurityTab.test.tsx +0 -467
- package/tests/components/monitoring/MetricChart.test.tsx +0 -111
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
- package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
- package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
- package/tests/components/monitoring/PoolTab.test.tsx +0 -42
- package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
- package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
- package/tests/components/monitoring/StorageTab.test.tsx +0 -127
- package/tests/components/monitoring/TablesTab.test.tsx +0 -153
- package/tests/components/results-grid/ResultCard.test.tsx +0 -105
- package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
- package/tests/components/results-grid/StatsBar.test.tsx +0 -162
- package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
- package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
- package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
- package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
- package/tests/components/sidebar/Sidebar.test.tsx +0 -187
- package/tests/components/studio/BottomPanel.test.tsx +0 -383
- package/tests/components/studio/QueryToolbar.test.tsx +0 -321
- package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
- package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
- package/tests/components/studio/StudioTabBar.test.tsx +0 -331
- package/tests/fixtures/connections.ts +0 -96
- package/tests/fixtures/masking-configs.ts +0 -86
- package/tests/fixtures/query-results.ts +0 -71
- package/tests/fixtures/schemas.ts +0 -64
- package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
- package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
- package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
- package/tests/fixtures/seed-connections/valid-config.json +0 -15
- package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
- package/tests/helpers/mock-fetch.ts +0 -59
- package/tests/helpers/mock-monaco.ts +0 -112
- package/tests/helpers/mock-navigation.ts +0 -28
- package/tests/helpers/mock-next.ts +0 -80
- package/tests/helpers/mock-provider.ts +0 -133
- package/tests/helpers/mock-sonner.ts +0 -29
- package/tests/helpers/render-with-providers.tsx +0 -19
- package/tests/hooks/use-ai-chat.test.ts +0 -600
- package/tests/hooks/use-auth.test.ts +0 -371
- package/tests/hooks/use-connection-form.test.ts +0 -743
- package/tests/hooks/use-connection-manager.test.ts +0 -466
- package/tests/hooks/use-inline-editing.test.ts +0 -321
- package/tests/hooks/use-mobile.test.ts +0 -177
- package/tests/hooks/use-monitoring-data.test.ts +0 -819
- package/tests/hooks/use-provider-metadata.test.ts +0 -228
- package/tests/hooks/use-query-execution.test.ts +0 -1212
- package/tests/hooks/use-tab-manager.test.ts +0 -756
- package/tests/hooks/use-toast.test.ts +0 -74
- package/tests/hooks/use-transaction-control.test.ts +0 -211
- package/tests/integration/db/mongodb-provider.test.ts +0 -698
- package/tests/integration/db/mssql-provider.test.ts +0 -840
- package/tests/integration/db/mysql-provider.test.ts +0 -872
- package/tests/integration/db/oracle-provider.test.ts +0 -843
- package/tests/integration/db/postgres-provider.test.ts +0 -1382
- package/tests/integration/db/redis-provider.test.ts +0 -526
- package/tests/integration/db/sqlite-provider.test.ts +0 -480
- package/tests/integration/seed/seed-pipeline.test.ts +0 -102
- package/tests/isolated/factory-singleton.test.ts +0 -150
- package/tests/isolated/use-storage-sync.test.ts +0 -389
- package/tests/run-components.sh +0 -196
- package/tests/setup-dom.ts +0 -58
- package/tests/setup.ts +0 -40
- package/tests/unit/api-errors.test.ts +0 -210
- package/tests/unit/code-generator-functions.test.ts +0 -271
- package/tests/unit/components/column-list.test.tsx +0 -190
- package/tests/unit/components/data-import-modal.test.tsx +0 -441
- package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
- package/tests/unit/data-charts-functions.test.ts +0 -496
- package/tests/unit/data-import-functions.test.ts +0 -320
- package/tests/unit/data-import-utils.test.ts +0 -125
- package/tests/unit/db/base-provider.test.ts +0 -517
- package/tests/unit/db/errors.test.ts +0 -403
- package/tests/unit/db/factory.test.ts +0 -436
- package/tests/unit/db/pool-manager.test.ts +0 -440
- package/tests/unit/db/query-limiter.test.ts +0 -387
- package/tests/unit/db/sql-base.test.ts +0 -438
- package/tests/unit/lib/api/error-codes.test.ts +0 -39
- package/tests/unit/lib/audit.test.ts +0 -326
- package/tests/unit/lib/auth.test.ts +0 -146
- package/tests/unit/lib/connection-string-parser.test.ts +0 -424
- package/tests/unit/lib/data-masking.test.ts +0 -583
- package/tests/unit/lib/db-icons.test.tsx +0 -41
- package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
- package/tests/unit/lib/oidc.test.ts +0 -509
- package/tests/unit/lib/query-generators.test.ts +0 -127
- package/tests/unit/lib/storage/factory.test.ts +0 -71
- package/tests/unit/lib/storage/local-storage.test.ts +0 -114
- package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
- package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
- package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
- package/tests/unit/lib/storage.test.ts +0 -317
- package/tests/unit/lib/time-series-buffer.test.ts +0 -212
- package/tests/unit/lib/utils.test.ts +0 -24
- package/tests/unit/llm/base-provider.test.ts +0 -238
- package/tests/unit/llm/config.test.ts +0 -262
- package/tests/unit/llm/custom-provider.test.ts +0 -281
- package/tests/unit/llm/gemini-provider.test.ts +0 -248
- package/tests/unit/llm/llm-factory.test.ts +0 -155
- package/tests/unit/llm/ollama-provider.test.ts +0 -288
- package/tests/unit/llm/openai-provider.test.ts +0 -324
- package/tests/unit/llm/retry.test.ts +0 -180
- package/tests/unit/llm/streaming.test.ts +0 -355
- package/tests/unit/logger.test.ts +0 -198
- package/tests/unit/mongodb-completions.test.ts +0 -516
- package/tests/unit/pivot-table-functions.test.ts +0 -76
- package/tests/unit/query-cancelled-error.test.ts +0 -81
- package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
- package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
- package/tests/unit/seed/config-loader.test.ts +0 -73
- package/tests/unit/seed/connection-filter.test.ts +0 -91
- package/tests/unit/seed/credential-resolver.test.ts +0 -85
- package/tests/unit/seed/index.test.ts +0 -72
- package/tests/unit/seed/resolve-connection.test.ts +0 -74
- package/tests/unit/seed/types.test.ts +0 -129
- package/tests/unit/sql/alias-extractor.test.ts +0 -444
- package/tests/unit/sql/statement-splitter.test.ts +0 -348
- package/tests/unit/sql-completions.test.ts +0 -463
- package/tests/unit/ssh-tunnel.test.ts +0 -465
- package/tsconfig.json +0 -42
package/docs/SEED_CONNECTIONS.md
DELETED
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
# Seed Connections — Pre-Configured Database Connections
|
|
2
|
-
|
|
3
|
-
Seed Connections let administrators pre-configure database connections via a YAML or JSON file. Users see these connections immediately after login — no manual setup required.
|
|
4
|
-
|
|
5
|
-
**Use cases:**
|
|
6
|
-
- Platform/SaaS: provision databases for all users on signup
|
|
7
|
-
- Enterprise: give teams access to staging/production databases
|
|
8
|
-
- On-prem: DevOps pre-loads connections via Helm values or Docker volumes
|
|
9
|
-
|
|
10
|
-
## Quick Start
|
|
11
|
-
|
|
12
|
-
**1.** Create `seed-connections.yaml`:
|
|
13
|
-
|
|
14
|
-
```yaml
|
|
15
|
-
version: "1"
|
|
16
|
-
|
|
17
|
-
connections:
|
|
18
|
-
- id: "prod-db"
|
|
19
|
-
name: "Production Database"
|
|
20
|
-
type: postgres
|
|
21
|
-
host: "${DB_HOST}"
|
|
22
|
-
port: 5432
|
|
23
|
-
database: "${DB_NAME}"
|
|
24
|
-
user: "${DB_USER}"
|
|
25
|
-
password: "${DB_PASSWORD}"
|
|
26
|
-
roles: ["*"]
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
**2.** Mount and set env vars:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
docker run \
|
|
33
|
-
-v ./seed-connections.yaml:/app/config/seed-connections.yaml:ro \
|
|
34
|
-
-e SEED_CONFIG_PATH=/app/config/seed-connections.yaml \
|
|
35
|
-
-e DB_HOST=mydb.internal -e DB_NAME=mydb \
|
|
36
|
-
-e DB_USER=reader -e DB_PASSWORD=secret \
|
|
37
|
-
ghcr.io/libredb/libredb-studio:latest
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
**3.** Login — the connection appears in the sidebar with a lock icon.
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Config File Format
|
|
45
|
-
|
|
46
|
-
The config file is YAML (`.yaml`, `.yml`) or JSON (`.json`). Format is auto-detected by file extension.
|
|
47
|
-
|
|
48
|
-
```yaml
|
|
49
|
-
version: "1"
|
|
50
|
-
|
|
51
|
-
defaults: # Optional — merged into every connection
|
|
52
|
-
managed: true
|
|
53
|
-
environment: production
|
|
54
|
-
ssl:
|
|
55
|
-
mode: require
|
|
56
|
-
rejectUnauthorized: true
|
|
57
|
-
|
|
58
|
-
connections:
|
|
59
|
-
- id: "analytics-pg" # Required, unique, lowercase slug [a-z0-9-]
|
|
60
|
-
name: "Analytics DB" # Required, display name in UI
|
|
61
|
-
type: postgres # Required: postgres|mysql|sqlite|mongodb|redis|oracle|mssql
|
|
62
|
-
host: "${PG_HOST}"
|
|
63
|
-
port: 5432
|
|
64
|
-
database: analytics
|
|
65
|
-
user: "${PG_USER}"
|
|
66
|
-
password: "${PG_PASSWORD}"
|
|
67
|
-
environment: production # production|staging|development|local|other
|
|
68
|
-
group: "Data Team" # Group label in sidebar
|
|
69
|
-
color: "#10B981" # Hex color for environment badge
|
|
70
|
-
roles: ["admin"] # Who can see this connection
|
|
71
|
-
managed: true # Read-only in UI (default from `defaults`)
|
|
72
|
-
ssl:
|
|
73
|
-
mode: require
|
|
74
|
-
rejectUnauthorized: true
|
|
75
|
-
# serviceName: "ORCL" # Oracle only
|
|
76
|
-
# instanceName: "MSSQL$" # SQL Server only
|
|
77
|
-
|
|
78
|
-
- id: "dev-mysql"
|
|
79
|
-
name: "Dev MySQL"
|
|
80
|
-
type: mysql
|
|
81
|
-
host: "${MYSQL_HOST}"
|
|
82
|
-
port: 3306
|
|
83
|
-
database: devdb
|
|
84
|
-
user: "${MYSQL_USER}"
|
|
85
|
-
password: "${MYSQL_PASSWORD}"
|
|
86
|
-
roles: ["*"] # Everyone can see this
|
|
87
|
-
managed: false # User gets an editable copy
|
|
88
|
-
environment: development
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Field Reference
|
|
92
|
-
|
|
93
|
-
| Field | Required | Default | Description |
|
|
94
|
-
|-------|----------|---------|-------------|
|
|
95
|
-
| `version` | Yes | — | Must be `"1"` |
|
|
96
|
-
| `defaults` | No | — | Merged into all connections (connection values override) |
|
|
97
|
-
| `defaults.managed` | No | `true` | Default managed state |
|
|
98
|
-
| `defaults.environment` | No | — | Default environment label |
|
|
99
|
-
| `defaults.ssl` | No | — | Default SSL config |
|
|
100
|
-
| `connections` | Yes | — | Array of connection definitions (min 1) |
|
|
101
|
-
| `connections[].id` | Yes | — | Unique slug: `[a-z0-9-]+`, max 64 chars |
|
|
102
|
-
| `connections[].name` | Yes | — | Display name, max 128 chars |
|
|
103
|
-
| `connections[].type` | Yes | — | Database type (see supported list above) |
|
|
104
|
-
| `connections[].host` | No | — | Hostname or IP |
|
|
105
|
-
| `connections[].port` | No | — | Port number (1-65535) |
|
|
106
|
-
| `connections[].database` | No | — | Database name |
|
|
107
|
-
| `connections[].user` | No | — | Username |
|
|
108
|
-
| `connections[].password` | No | — | Password (use `${ENV_VAR}` syntax) |
|
|
109
|
-
| `connections[].connectionString` | No | — | Full connection string (use `${ENV_VAR}`) |
|
|
110
|
-
| `connections[].roles` | Yes | — | Access control: `["*"]`, `["admin"]`, `["user"]`, `["admin", "user"]` |
|
|
111
|
-
| `connections[].managed` | No | from defaults | `true` = read-only, `false` = editable copy |
|
|
112
|
-
| `connections[].environment` | No | from defaults | Environment badge |
|
|
113
|
-
| `connections[].group` | No | — | Group label |
|
|
114
|
-
| `connections[].color` | No | — | Hex color for badge (e.g., `#10B981`) |
|
|
115
|
-
| `connections[].ssl` | No | from defaults | SSL configuration |
|
|
116
|
-
| `connections[].serviceName` | No | — | Oracle service name |
|
|
117
|
-
| `connections[].instanceName` | No | — | SQL Server instance name |
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Credential Management
|
|
122
|
-
|
|
123
|
-
Credentials are never stored in the config file directly. Use `${ENV_VAR}` syntax to reference environment variables:
|
|
124
|
-
|
|
125
|
-
```yaml
|
|
126
|
-
connections:
|
|
127
|
-
- id: "prod-db"
|
|
128
|
-
password: "${PROD_DB_PASSWORD}" # Resolved from process.env at runtime
|
|
129
|
-
connectionString: "${MONGO_URI}" # Also works for connection strings
|
|
130
|
-
user: "${DB_USER}" # Any field can use ${} syntax
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**How it works:**
|
|
134
|
-
1. Config file is read from disk (YAML/JSON)
|
|
135
|
-
2. `${VARIABLE_NAME}` patterns are resolved from `process.env`
|
|
136
|
-
3. If an env var is undefined, that connection is **skipped** (others continue working)
|
|
137
|
-
4. Plaintext passwords trigger a warning log (but still work)
|
|
138
|
-
|
|
139
|
-
**Resolvable fields:** `password`, `connectionString`, `user`, `host`, `database`
|
|
140
|
-
|
|
141
|
-
### Credential Sources by Deployment
|
|
142
|
-
|
|
143
|
-
| Deployment | How to provide credentials |
|
|
144
|
-
|------------|---------------------------|
|
|
145
|
-
| **Docker** | `-e DB_PASSWORD=secret` |
|
|
146
|
-
| **Docker Compose** | `environment:` block or `.env` file |
|
|
147
|
-
| **Kubernetes** | `Secret` → `extraEnvFrom` in Helm values |
|
|
148
|
-
| **Vault/SSM** | External Secrets Operator → K8s Secret → `extraEnvFrom` |
|
|
149
|
-
|
|
150
|
-
### Kubernetes Example
|
|
151
|
-
|
|
152
|
-
```yaml
|
|
153
|
-
# Create a K8s Secret with credentials
|
|
154
|
-
apiVersion: v1
|
|
155
|
-
kind: Secret
|
|
156
|
-
metadata:
|
|
157
|
-
name: seed-db-credentials
|
|
158
|
-
type: Opaque
|
|
159
|
-
stringData:
|
|
160
|
-
PG_PASSWORD: "my-secret-password"
|
|
161
|
-
MYSQL_PASSWORD: "another-secret"
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
# Reference in Helm values
|
|
165
|
-
extraEnvFrom:
|
|
166
|
-
- secretRef:
|
|
167
|
-
name: seed-db-credentials
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## Role-Based Access Control
|
|
173
|
-
|
|
174
|
-
Each connection has a `roles` field that controls which users can see it:
|
|
175
|
-
|
|
176
|
-
| Config | Who sees it |
|
|
177
|
-
|--------|-------------|
|
|
178
|
-
| `roles: ["*"]` | All authenticated users |
|
|
179
|
-
| `roles: ["admin"]` | Admin users only |
|
|
180
|
-
| `roles: ["user"]` | Regular users only |
|
|
181
|
-
| `roles: ["admin", "user"]` | Both (same as `["*"]`) |
|
|
182
|
-
|
|
183
|
-
Roles are matched against the JWT session's `role` field. The role is extracted server-side from the JWT token — never from client input.
|
|
184
|
-
|
|
185
|
-
**Current limitation:** The system supports `admin` and `user` roles only (matching the JWT `role` claim). Custom roles (e.g., `data-team`, `backend`) are planned for a future release with expanded OIDC role claim support.
|
|
186
|
-
|
|
187
|
-
### How Role Filtering Works
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
User logs in → JWT contains { role: "user" }
|
|
191
|
-
↓
|
|
192
|
-
GET /api/connections/managed
|
|
193
|
-
↓
|
|
194
|
-
Server reads config → filters by role
|
|
195
|
-
↓
|
|
196
|
-
User sees only connections where roles includes "user" or "*"
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Managed vs. Unmanaged Connections
|
|
202
|
-
|
|
203
|
-
### `managed: true` (default)
|
|
204
|
-
|
|
205
|
-
- Connection appears with a **lock icon** in the sidebar
|
|
206
|
-
- Users **cannot edit or delete** it
|
|
207
|
-
- Credentials are **never sent to the client** — server resolves them at query time
|
|
208
|
-
- If admin updates the config (e.g., password rotation), all users get the new credentials automatically
|
|
209
|
-
- Best for: production databases, shared resources
|
|
210
|
-
|
|
211
|
-
### `managed: false`
|
|
212
|
-
|
|
213
|
-
- On first load, the connection is **copied to the user's local storage** with credentials
|
|
214
|
-
- User **can edit or delete** their copy
|
|
215
|
-
- Once copied, the connection belongs to the user — admin changes to the seed config won't affect existing copies
|
|
216
|
-
- If the user deletes their copy, it will be re-imported on next login
|
|
217
|
-
- Best for: development databases, sandbox environments
|
|
218
|
-
|
|
219
|
-
### Comparison
|
|
220
|
-
|
|
221
|
-
| Behavior | `managed: true` | `managed: false` |
|
|
222
|
-
|----------|-----------------|-------------------|
|
|
223
|
-
| UI edit/delete | Locked | Allowed |
|
|
224
|
-
| Credentials on client | Never | Copied once |
|
|
225
|
-
| Password rotation | Automatic | User must re-import |
|
|
226
|
-
| Admin removes from config | Disappears for all | User copy remains |
|
|
227
|
-
| Server-side credential resolution | Yes | No (user has local copy) |
|
|
228
|
-
|
|
229
|
-
---
|
|
230
|
-
|
|
231
|
-
## Hot Reload
|
|
232
|
-
|
|
233
|
-
The config file is **cached in memory** with a TTL (default 60 seconds). When the file changes:
|
|
234
|
-
|
|
235
|
-
1. Next API request after TTL expires triggers a re-read
|
|
236
|
-
2. New connections appear, removed connections disappear
|
|
237
|
-
3. Updated credentials take effect immediately (for `managed: true`)
|
|
238
|
-
4. **No restart required**
|
|
239
|
-
|
|
240
|
-
### Tuning the Cache TTL
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
# Default: 60 seconds
|
|
244
|
-
SEED_CACHE_TTL_MS=60000
|
|
245
|
-
|
|
246
|
-
# Faster refresh (5 seconds) — useful during development
|
|
247
|
-
SEED_CACHE_TTL_MS=5000
|
|
248
|
-
|
|
249
|
-
# Slower refresh (5 minutes) — production with infrequent changes
|
|
250
|
-
SEED_CACHE_TTL_MS=300000
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
In Kubernetes, ConfigMap updates propagate in ~60-120s (kubelet sync period). Combined with the cache TTL, expect ~2-3 minutes for changes to take effect.
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Deployment Examples
|
|
258
|
-
|
|
259
|
-
### Docker
|
|
260
|
-
|
|
261
|
-
```bash
|
|
262
|
-
docker run -d \
|
|
263
|
-
-v ./seed-connections.yaml:/app/config/seed-connections.yaml:ro \
|
|
264
|
-
-e SEED_CONFIG_PATH=/app/config/seed-connections.yaml \
|
|
265
|
-
-e PG_PASSWORD=secret \
|
|
266
|
-
-e JWT_SECRET=your-32-char-jwt-secret-here!! \
|
|
267
|
-
-e ADMIN_PASSWORD=MyAdmin123 \
|
|
268
|
-
-e USER_PASSWORD=MyUser123 \
|
|
269
|
-
-p 3000:3000 \
|
|
270
|
-
ghcr.io/libredb/libredb-studio:latest
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
### Docker Compose
|
|
274
|
-
|
|
275
|
-
```yaml
|
|
276
|
-
services:
|
|
277
|
-
libredb:
|
|
278
|
-
image: ghcr.io/libredb/libredb-studio:latest
|
|
279
|
-
ports:
|
|
280
|
-
- "3000:3000"
|
|
281
|
-
volumes:
|
|
282
|
-
- ./seed-connections.yaml:/app/config/seed-connections.yaml:ro
|
|
283
|
-
environment:
|
|
284
|
-
SEED_CONFIG_PATH: /app/config/seed-connections.yaml
|
|
285
|
-
JWT_SECRET: your-32-char-jwt-secret-here!!
|
|
286
|
-
ADMIN_PASSWORD: MyAdmin123
|
|
287
|
-
USER_PASSWORD: MyUser123
|
|
288
|
-
PG_PASSWORD: ${PG_PASSWORD}
|
|
289
|
-
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
|
290
|
-
env_file:
|
|
291
|
-
- .env # Store credentials here
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### Kubernetes (Helm)
|
|
295
|
-
|
|
296
|
-
**Option A — Inline config in values.yaml:**
|
|
297
|
-
|
|
298
|
-
```yaml
|
|
299
|
-
seedConnections:
|
|
300
|
-
enabled: true
|
|
301
|
-
config:
|
|
302
|
-
version: "1"
|
|
303
|
-
defaults:
|
|
304
|
-
managed: true
|
|
305
|
-
environment: production
|
|
306
|
-
connections:
|
|
307
|
-
- id: "prod-analytics"
|
|
308
|
-
name: "Production Analytics"
|
|
309
|
-
type: postgres
|
|
310
|
-
host: analytics-db.internal
|
|
311
|
-
port: 5432
|
|
312
|
-
database: analytics
|
|
313
|
-
user: readonly
|
|
314
|
-
password: "${ANALYTICS_DB_PASSWORD}"
|
|
315
|
-
roles: ["admin"]
|
|
316
|
-
color: "#10B981"
|
|
317
|
-
- id: "staging-api"
|
|
318
|
-
name: "Staging API DB"
|
|
319
|
-
type: mysql
|
|
320
|
-
host: staging-mysql.internal
|
|
321
|
-
password: "${STAGING_DB_PASSWORD}"
|
|
322
|
-
roles: ["*"]
|
|
323
|
-
managed: false
|
|
324
|
-
environment: staging
|
|
325
|
-
|
|
326
|
-
extraEnvFrom:
|
|
327
|
-
- secretRef:
|
|
328
|
-
name: seed-db-credentials
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
**Option B — External ConfigMap:**
|
|
332
|
-
|
|
333
|
-
```yaml
|
|
334
|
-
seedConnections:
|
|
335
|
-
enabled: true
|
|
336
|
-
existingConfigMap: "my-seed-connections" # Pre-created ConfigMap
|
|
337
|
-
configMapKey: "connections.yaml" # Key within the ConfigMap
|
|
338
|
-
|
|
339
|
-
extraEnvFrom:
|
|
340
|
-
- secretRef:
|
|
341
|
-
name: seed-db-credentials
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
---
|
|
345
|
-
|
|
346
|
-
## Error Handling
|
|
347
|
-
|
|
348
|
-
| Scenario | Behavior |
|
|
349
|
-
|----------|----------|
|
|
350
|
-
| Config file not found | App runs normally, no seed connections. Warning logged. |
|
|
351
|
-
| Invalid YAML/JSON | Endpoint returns 500. Error logged with details. |
|
|
352
|
-
| Invalid config (Zod validation fails) | Endpoint returns 500 with validation errors. |
|
|
353
|
-
| Unrecognized `version` | Endpoint returns 500. Future versions require code update. |
|
|
354
|
-
| `${ENV_VAR}` not defined | That connection is **skipped**. Others work normally. Error logged. |
|
|
355
|
-
| User role doesn't match any connection | Empty list returned. Normal behavior. |
|
|
356
|
-
| Seed connection not found at query time | 404 response. |
|
|
357
|
-
| User doesn't have access to seed connection | 403 response. |
|
|
358
|
-
|
|
359
|
-
**Design principle:** One broken connection never breaks the others. Each connection is resolved independently.
|
|
360
|
-
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
## Security Model
|
|
364
|
-
|
|
365
|
-
### Credential Protection
|
|
366
|
-
|
|
367
|
-
- `managed: true` connections: passwords **never reach the client**. The API strips `password` and `connectionString` from responses. Server resolves credentials at query execution time.
|
|
368
|
-
- Config file should be mounted **read-only** (`:ro` in Docker, `readOnly: true` in Kubernetes).
|
|
369
|
-
- Use `${ENV_VAR}` for all secrets. Plaintext passwords trigger a warning log.
|
|
370
|
-
|
|
371
|
-
### Role Enforcement
|
|
372
|
-
|
|
373
|
-
- User role is extracted from the JWT session **server-side** — never from client headers or request params.
|
|
374
|
-
- Every database operation (query, schema, health check, etc.) goes through `resolveConnection()` which verifies role access before returning credentials.
|
|
375
|
-
- Role check failures return 403 with no credential information.
|
|
376
|
-
|
|
377
|
-
### Audit Trail
|
|
378
|
-
|
|
379
|
-
Every operation on a managed connection is logged:
|
|
380
|
-
|
|
381
|
-
```json
|
|
382
|
-
{
|
|
383
|
-
"event": "managed_connection_query",
|
|
384
|
-
"connectionId": "prod-analytics",
|
|
385
|
-
"user": "admin@company.com",
|
|
386
|
-
"role": "admin",
|
|
387
|
-
"route": "/api/db/query",
|
|
388
|
-
"timestamp": "2026-03-25T10:30:00Z"
|
|
389
|
-
}
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## Environment Variables
|
|
395
|
-
|
|
396
|
-
| Variable | Default | Description |
|
|
397
|
-
|----------|---------|-------------|
|
|
398
|
-
| `SEED_CONFIG_PATH` | `/app/config/seed-connections.yaml` | Path to config file |
|
|
399
|
-
| `SEED_CACHE_TTL_MS` | `60000` | Cache TTL in milliseconds |
|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
## Troubleshooting
|
|
404
|
-
|
|
405
|
-
### Connections don't appear after login
|
|
406
|
-
|
|
407
|
-
1. Check if the config file exists at `SEED_CONFIG_PATH`
|
|
408
|
-
2. Check server logs for `Seed config file not found` warning
|
|
409
|
-
3. Verify the YAML is valid: `cat seed-connections.yaml | python3 -c "import yaml,sys; yaml.safe_load(sys.stdin)"`
|
|
410
|
-
4. Check if `${ENV_VAR}` values are set: connections with unresolvable vars are silently skipped
|
|
411
|
-
|
|
412
|
-
### "Access denied" error when querying
|
|
413
|
-
|
|
414
|
-
The user's role doesn't match the connection's `roles` array. Check:
|
|
415
|
-
- User JWT role: login as admin vs user
|
|
416
|
-
- Connection `roles` field in config
|
|
417
|
-
|
|
418
|
-
### Credentials not updating after config change
|
|
419
|
-
|
|
420
|
-
- `managed: true`: Wait for TTL to expire (default 60s), or restart the app
|
|
421
|
-
- `managed: false`: The user has a local copy. They need to delete it from the sidebar and re-login to get the updated version
|
|
422
|
-
|
|
423
|
-
### Two identical connections in sidebar
|
|
424
|
-
|
|
425
|
-
Clear browser localStorage (`libredb_connections` key) and refresh. This can happen if a connection was persisted before being marked as managed.
|
|
426
|
-
|
|
427
|
-
---
|
|
428
|
-
|
|
429
|
-
## Architecture
|
|
430
|
-
|
|
431
|
-
```
|
|
432
|
-
seed-connections.yaml (volume mount)
|
|
433
|
-
│
|
|
434
|
-
┌─────▼──────────┐
|
|
435
|
-
│ ConfigLoader │ Read + YAML/JSON parse + Zod validate + TTL cache
|
|
436
|
-
└─────┬──────────┘
|
|
437
|
-
│
|
|
438
|
-
┌─────▼──────────────┐
|
|
439
|
-
│ CredentialResolver │ ${ENV_VAR} → process.env + plaintext warning
|
|
440
|
-
└─────┬──────────────┘
|
|
441
|
-
│
|
|
442
|
-
┌─────▼──────────────┐
|
|
443
|
-
│ ConnectionFilter │ Role filter + defaults merge → ManagedConnection[]
|
|
444
|
-
└─────┬──────────────┘
|
|
445
|
-
│
|
|
446
|
-
┌─────▼───────────────────────┐
|
|
447
|
-
│ GET /api/connections/managed │ Auth + strip credentials for managed:true
|
|
448
|
-
└─────┬───────────────────────┘
|
|
449
|
-
│
|
|
450
|
-
┌─────▼────────────────────┐
|
|
451
|
-
│ useConnectionManager │ Merge managed + user connections
|
|
452
|
-
└─────┬────────────────────┘
|
|
453
|
-
│
|
|
454
|
-
┌─────▼────────────────────────────┐
|
|
455
|
-
│ resolveConnection() (all routes) │ seed: prefix → server-side credential resolution
|
|
456
|
-
└──────────────────────────────────┘
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
**Module:** `src/lib/seed/` — 6 files, ~350 lines total
|
|
460
|
-
|
|
461
|
-
| File | Responsibility |
|
|
462
|
-
|------|---------------|
|
|
463
|
-
| `types.ts` | Zod schemas + TypeScript types |
|
|
464
|
-
| `config-loader.ts` | File read + parse + validate + cache |
|
|
465
|
-
| `credential-resolver.ts` | `${ENV_VAR}` resolution |
|
|
466
|
-
| `connection-filter.ts` | Role filter + defaults merge |
|
|
467
|
-
| `resolve-connection.ts` | Shared utility for all API routes |
|
|
468
|
-
| `index.ts` | Public API: `getManagedConnections()` |
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
# SQL Alias-Based Code Completion
|
|
2
|
-
|
|
3
|
-
This document describes the intelligent SQL code completion feature that provides context-aware autocompletion with alias support in the Monaco Editor.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
### 1. Alias-Based Column Completion
|
|
8
|
-
|
|
9
|
-
When you define a table alias in your SQL query, typing the alias followed by a dot (`.`) will suggest columns from the referenced table.
|
|
10
|
-
|
|
11
|
-
**Supported Patterns:**
|
|
12
|
-
|
|
13
|
-
| Pattern | Example | Result |
|
|
14
|
-
|---------|---------|--------|
|
|
15
|
-
| `FROM table AS alias` | `FROM employee AS e WHERE e.` | employee columns |
|
|
16
|
-
| `FROM table alias` | `FROM employee e WHERE e.` | employee columns |
|
|
17
|
-
| `JOIN table AS alias` | `JOIN department AS d ON d.` | department columns |
|
|
18
|
-
| `JOIN table alias` | `LEFT JOIN salary s ON s.` | salary columns |
|
|
19
|
-
| `schema.table alias` | `FROM employees.employee e WHERE e.` | employee columns |
|
|
20
|
-
| Multiple aliases | `FROM a AS x JOIN b AS y` | Both `x.` and `y.` work |
|
|
21
|
-
| CTE references | `WITH cte AS (...) SELECT cte.` | CTE columns |
|
|
22
|
-
| Direct table | `employee.` | employee columns |
|
|
23
|
-
|
|
24
|
-
### 2. Context-Aware Completions
|
|
25
|
-
|
|
26
|
-
The completion system intelligently shows suggestions based on SQL context:
|
|
27
|
-
|
|
28
|
-
**Columns are shown only after:**
|
|
29
|
-
- `SELECT` keyword
|
|
30
|
-
- `WHERE` clause
|
|
31
|
-
- `AND`, `OR` operators
|
|
32
|
-
- `ON` (in JOIN conditions)
|
|
33
|
-
- `SET` (in UPDATE statements)
|
|
34
|
-
- `HAVING` clause
|
|
35
|
-
- `ORDER BY`, `GROUP BY` clauses
|
|
36
|
-
- Comma (`,`) in column lists
|
|
37
|
-
|
|
38
|
-
**Columns are NOT shown when:**
|
|
39
|
-
- Typing keywords like `FROM`, `JOIN`, `WHERE`
|
|
40
|
-
- After `SELECT *` (expecting keyword, not column)
|
|
41
|
-
|
|
42
|
-
### 3. Prioritized Suggestions
|
|
43
|
-
|
|
44
|
-
Suggestions are sorted by relevance:
|
|
45
|
-
|
|
46
|
-
| Priority | Type | Description |
|
|
47
|
-
|----------|------|-------------|
|
|
48
|
-
| 1st | Keywords | SQL keywords (SELECT, FROM, WHERE, etc.) |
|
|
49
|
-
| 2nd | Functions | SQL functions (COUNT, SUM, AVG, etc.) |
|
|
50
|
-
| 3rd | Tables | Database tables |
|
|
51
|
-
| 4th | Snippets | Query templates |
|
|
52
|
-
| 5th | Columns | Table columns (context-dependent) |
|
|
53
|
-
|
|
54
|
-
## Architecture
|
|
55
|
-
|
|
56
|
-
### Module Structure
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
src/lib/sql/
|
|
60
|
-
├── alias-extractor.ts # Core alias extraction logic
|
|
61
|
-
├── types.ts # TypeScript interfaces
|
|
62
|
-
└── index.ts # Module exports
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Key Components
|
|
66
|
-
|
|
67
|
-
#### 1. Alias Extractor (`src/lib/sql/alias-extractor.ts`)
|
|
68
|
-
|
|
69
|
-
Lightweight regex-based SQL parser that extracts table aliases without external dependencies.
|
|
70
|
-
|
|
71
|
-
**Functions:**
|
|
72
|
-
- `extractAliases(sql: string)` - Extract all table aliases from a SQL query
|
|
73
|
-
- `resolveAlias(identifier: string, aliases: Map)` - Resolve an alias to its table name
|
|
74
|
-
|
|
75
|
-
**How it works:**
|
|
76
|
-
1. Preprocesses SQL to remove comments and string literals
|
|
77
|
-
2. Extracts FROM clause aliases
|
|
78
|
-
3. Extracts JOIN clause aliases
|
|
79
|
-
4. Extracts CTE (WITH clause) aliases
|
|
80
|
-
5. Returns a Map of alias → table name
|
|
81
|
-
|
|
82
|
-
#### 2. Completion Provider (`src/components/QueryEditor.tsx`)
|
|
83
|
-
|
|
84
|
-
Monaco Editor completion provider that integrates with the alias extractor.
|
|
85
|
-
|
|
86
|
-
**Dot-triggered completion flow:**
|
|
87
|
-
```
|
|
88
|
-
User types: "e."
|
|
89
|
-
↓
|
|
90
|
-
1. Try direct table lookup: columnMap.get("e")
|
|
91
|
-
↓ (not found)
|
|
92
|
-
2. Extract aliases from query text
|
|
93
|
-
↓
|
|
94
|
-
3. Resolve "e" → "employee"
|
|
95
|
-
↓
|
|
96
|
-
4. Find columns: columnMap.get("employee")
|
|
97
|
-
↓
|
|
98
|
-
5. Return column suggestions
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### Edge Cases Handled
|
|
102
|
-
|
|
103
|
-
1. **SQL Keywords as Aliases**: Filters out `ON`, `WHERE`, `AND`, etc.
|
|
104
|
-
2. **Comments**: Removes `--` and `/* */` before parsing
|
|
105
|
-
3. **String Literals**: Replaces with placeholder to avoid false matches
|
|
106
|
-
4. **Case Insensitivity**: Alias lookup is case-insensitive
|
|
107
|
-
5. **Schema Prefixes**: Handles `schema.table` format (e.g., `employees.employee`)
|
|
108
|
-
|
|
109
|
-
## Performance Considerations
|
|
110
|
-
|
|
111
|
-
- **No external SQL parser**: Keeps bundle size small
|
|
112
|
-
- **Regex-based parsing**: Fast execution (<10ms for typical queries)
|
|
113
|
-
- **Lazy evaluation**: Alias extraction only runs on dot-trigger
|
|
114
|
-
- **Cursor-limited parsing**: Only parses text from start to cursor position
|
|
115
|
-
- **Early exit**: Skips parsing if no FROM/JOIN/WITH keywords found
|
|
116
|
-
|
|
117
|
-
## Examples
|
|
118
|
-
|
|
119
|
-
### Basic Alias Usage
|
|
120
|
-
```sql
|
|
121
|
-
SELECT e.first_name, e.last_name
|
|
122
|
-
FROM employee e
|
|
123
|
-
WHERE e.hire_date > '2020-01-01'
|
|
124
|
-
```
|
|
125
|
-
Typing `e.` after defining `FROM employee e` will suggest all employee columns.
|
|
126
|
-
|
|
127
|
-
### Multiple Table Aliases
|
|
128
|
-
```sql
|
|
129
|
-
SELECT
|
|
130
|
-
e.first_name,
|
|
131
|
-
d.dept_name,
|
|
132
|
-
s.amount
|
|
133
|
-
FROM employee e
|
|
134
|
-
JOIN department_employee de ON de.employee_id = e.id
|
|
135
|
-
JOIN department d ON d.id = de.department_id
|
|
136
|
-
JOIN salary s ON s.employee_id = e.id
|
|
137
|
-
```
|
|
138
|
-
Each alias (`e`, `de`, `d`, `s`) resolves to its respective table.
|
|
139
|
-
|
|
140
|
-
### CTE Support
|
|
141
|
-
```sql
|
|
142
|
-
WITH active_employees AS (
|
|
143
|
-
SELECT * FROM employee WHERE status = 'active'
|
|
144
|
-
)
|
|
145
|
-
SELECT ae.first_name
|
|
146
|
-
FROM active_employees ae
|
|
147
|
-
WHERE ae.department_id = 1
|
|
148
|
-
```
|
|
149
|
-
The `ae` alias resolves to the CTE `active_employees`.
|
|
150
|
-
|
|
151
|
-
## Integration
|
|
152
|
-
|
|
153
|
-
The alias completion is automatically available in the SQL editor. No configuration required.
|
|
154
|
-
|
|
155
|
-
### API
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
import { extractAliases, resolveAlias } from '@/lib/sql';
|
|
159
|
-
|
|
160
|
-
// Extract aliases from a query
|
|
161
|
-
const { aliases } = extractAliases('SELECT * FROM employee e WHERE e.id = 1');
|
|
162
|
-
|
|
163
|
-
// Resolve an alias
|
|
164
|
-
const tableName = resolveAlias('e', aliases); // Returns 'employee'
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
## Type Definitions
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
interface TableAlias {
|
|
171
|
-
alias: string; // e.g., 'e'
|
|
172
|
-
tableName: string; // e.g., 'employee'
|
|
173
|
-
schema?: string; // e.g., 'employees'
|
|
174
|
-
source: 'from' | 'join' | 'cte';
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
interface AliasExtractionResult {
|
|
178
|
-
aliases: Map<string, TableAlias>;
|
|
179
|
-
hasTableReferences: boolean;
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## Related Files
|
|
184
|
-
|
|
185
|
-
| File | Description |
|
|
186
|
-
|------|-------------|
|
|
187
|
-
| `src/lib/sql/types.ts` | Type definitions |
|
|
188
|
-
| `src/lib/sql/alias-extractor.ts` | Core parsing logic |
|
|
189
|
-
| `src/lib/sql/index.ts` | Module exports |
|
|
190
|
-
| `src/components/QueryEditor.tsx` | Monaco Editor integration |
|