@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/src/lib/sql/types.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SQL Alias Extraction Types
|
|
3
|
-
*
|
|
4
|
-
* Type definitions for the SQL alias extraction module used by Monaco Editor
|
|
5
|
-
* completion provider.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Represents a table alias mapping in a SQL query
|
|
10
|
-
*/
|
|
11
|
-
export interface TableAlias {
|
|
12
|
-
/** The alias name (e.g., 'c' in 'customer AS c') */
|
|
13
|
-
alias: string;
|
|
14
|
-
/** The original table name (e.g., 'customer') */
|
|
15
|
-
tableName: string;
|
|
16
|
-
/** Optional schema prefix (e.g., 'public' in 'public.customer') */
|
|
17
|
-
schema?: string;
|
|
18
|
-
/** Source of the alias definition */
|
|
19
|
-
source: 'from' | 'join' | 'cte';
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Result of alias extraction from a SQL query
|
|
24
|
-
*/
|
|
25
|
-
export interface AliasExtractionResult {
|
|
26
|
-
/** Map of alias (lowercase) -> TableAlias */
|
|
27
|
-
aliases: Map<string, TableAlias>;
|
|
28
|
-
/** Whether the query contains extractable table references */
|
|
29
|
-
hasTableReferences: boolean;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Options for alias extraction
|
|
34
|
-
*/
|
|
35
|
-
export interface AliasExtractorOptions {
|
|
36
|
-
/** Include CTE aliases (WITH clause) - default: true */
|
|
37
|
-
includeCTEs?: boolean;
|
|
38
|
-
/** Case-insensitive alias matching - default: true */
|
|
39
|
-
caseInsensitive?: boolean;
|
|
40
|
-
}
|
package/src/lib/ssh/tunnel.ts
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SSH Tunnel Manager
|
|
3
|
-
* Creates SSH tunnels for database connections behind firewalls/bastion hosts.
|
|
4
|
-
* Uses ssh2 library for tunnel creation.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { Client } from 'ssh2';
|
|
8
|
-
import net from 'net';
|
|
9
|
-
import type { SSHTunnelConfig } from '@/lib/types';
|
|
10
|
-
import { logger } from '@/lib/logger';
|
|
11
|
-
|
|
12
|
-
export interface TunnelInfo {
|
|
13
|
-
localHost: string;
|
|
14
|
-
localPort: number;
|
|
15
|
-
close: () => Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Cache active tunnels by connection ID
|
|
19
|
-
const activeTunnels = new Map<string, TunnelInfo>();
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Create an SSH tunnel for a database connection.
|
|
23
|
-
* Returns the local host/port to connect the database client to.
|
|
24
|
-
*/
|
|
25
|
-
export async function createSSHTunnel(
|
|
26
|
-
connectionId: string,
|
|
27
|
-
sshConfig: SSHTunnelConfig,
|
|
28
|
-
remoteHost: string,
|
|
29
|
-
remotePort: number
|
|
30
|
-
): Promise<TunnelInfo> {
|
|
31
|
-
// Return existing tunnel if already active
|
|
32
|
-
// Note: cached tunnel may be stale if the SSH connection dropped silently.
|
|
33
|
-
// Callers should handle connection errors and call closeSSHTunnel() to evict stale entries.
|
|
34
|
-
const existing = activeTunnels.get(connectionId);
|
|
35
|
-
if (existing) {
|
|
36
|
-
return existing;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return new Promise((resolve, reject) => {
|
|
40
|
-
const sshClient = new Client();
|
|
41
|
-
let localServer: net.Server | null = null;
|
|
42
|
-
|
|
43
|
-
const cleanup = async () => {
|
|
44
|
-
activeTunnels.delete(connectionId);
|
|
45
|
-
if (localServer) {
|
|
46
|
-
localServer.close();
|
|
47
|
-
localServer = null;
|
|
48
|
-
}
|
|
49
|
-
sshClient.end();
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
sshClient.on('ready', () => {
|
|
53
|
-
// Create a local TCP server that forwards to the remote host through SSH
|
|
54
|
-
localServer = net.createServer((socket) => {
|
|
55
|
-
sshClient.forwardOut(
|
|
56
|
-
'127.0.0.1',
|
|
57
|
-
0,
|
|
58
|
-
remoteHost,
|
|
59
|
-
remotePort,
|
|
60
|
-
(err, stream) => {
|
|
61
|
-
if (err) {
|
|
62
|
-
socket.end();
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
// Prevent unhandled stream errors from crashing the process
|
|
66
|
-
stream.on('error', () => { socket.destroy(); });
|
|
67
|
-
socket.on('error', () => { stream.close(); });
|
|
68
|
-
socket.pipe(stream).pipe(socket);
|
|
69
|
-
}
|
|
70
|
-
);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// Attach error handler before listen to catch bind/listen errors
|
|
74
|
-
localServer.on('error', (err) => {
|
|
75
|
-
cleanup();
|
|
76
|
-
reject(new Error(`SSH tunnel local server error: ${err.message}`));
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// Listen on a random available port
|
|
80
|
-
localServer.listen(0, '127.0.0.1', () => {
|
|
81
|
-
const address = localServer!.address() as net.AddressInfo;
|
|
82
|
-
const tunnelInfo: TunnelInfo = {
|
|
83
|
-
localHost: '127.0.0.1',
|
|
84
|
-
localPort: address.port,
|
|
85
|
-
close: cleanup,
|
|
86
|
-
};
|
|
87
|
-
activeTunnels.set(connectionId, tunnelInfo);
|
|
88
|
-
logger.info(`Tunnel created for ${connectionId}: 127.0.0.1:${address.port} -> ${remoteHost}:${remotePort}`, { connectionId });
|
|
89
|
-
resolve(tunnelInfo);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
sshClient.on('error', (err) => {
|
|
94
|
-
// Ensure SSH file descriptors are released before rejecting
|
|
95
|
-
sshClient.end();
|
|
96
|
-
cleanup();
|
|
97
|
-
reject(new Error(`SSH connection error: ${err.message}`));
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// Build SSH connection options
|
|
101
|
-
const connectOptions: Parameters<Client['connect']>[0] = {
|
|
102
|
-
host: sshConfig.host,
|
|
103
|
-
port: sshConfig.port || 22,
|
|
104
|
-
username: sshConfig.username,
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
if (sshConfig.authMethod === 'password') {
|
|
108
|
-
connectOptions.password = sshConfig.password;
|
|
109
|
-
} else if (sshConfig.authMethod === 'privateKey') {
|
|
110
|
-
connectOptions.privateKey = sshConfig.privateKey;
|
|
111
|
-
if (sshConfig.passphrase) {
|
|
112
|
-
connectOptions.passphrase = sshConfig.passphrase;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
sshClient.connect(connectOptions);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Close an SSH tunnel by connection ID
|
|
122
|
-
*/
|
|
123
|
-
export async function closeSSHTunnel(connectionId: string): Promise<void> {
|
|
124
|
-
const tunnel = activeTunnels.get(connectionId);
|
|
125
|
-
if (tunnel) {
|
|
126
|
-
await tunnel.close();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Check if a tunnel exists for a connection
|
|
132
|
-
*/
|
|
133
|
-
export function hasTunnel(connectionId: string): boolean {
|
|
134
|
-
return activeTunnels.has(connectionId);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Get tunnel info for a connection
|
|
139
|
-
*/
|
|
140
|
-
export function getTunnelInfo(connectionId: string): TunnelInfo | undefined {
|
|
141
|
-
return activeTunnels.get(connectionId);
|
|
142
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Storage Provider Factory
|
|
3
|
-
* Creates the appropriate server storage provider based on STORAGE_PROVIDER env var.
|
|
4
|
-
* Uses singleton pattern — one provider instance per process.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { ServerStorageProvider, StorageConfigResponse } from './types';
|
|
8
|
-
|
|
9
|
-
let _provider: ServerStorageProvider | null = null;
|
|
10
|
-
let _initialized = false;
|
|
11
|
-
|
|
12
|
-
export type StorageProviderType = 'local' | 'sqlite' | 'postgres';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Get the configured storage provider type from environment.
|
|
16
|
-
* Returns 'local' if not set or invalid.
|
|
17
|
-
*/
|
|
18
|
-
export function getStorageProviderType(): StorageProviderType {
|
|
19
|
-
const env = process.env.STORAGE_PROVIDER?.toLowerCase();
|
|
20
|
-
if (env === 'sqlite' || env === 'postgres') return env;
|
|
21
|
-
return 'local';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Check if server-side storage is enabled.
|
|
26
|
-
*/
|
|
27
|
-
export function isServerStorageEnabled(): boolean {
|
|
28
|
-
return getStorageProviderType() !== 'local';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Get the storage configuration for the /api/storage/config endpoint.
|
|
33
|
-
*/
|
|
34
|
-
export function getStorageConfig(): StorageConfigResponse {
|
|
35
|
-
const provider = getStorageProviderType();
|
|
36
|
-
return {
|
|
37
|
-
provider,
|
|
38
|
-
serverMode: provider !== 'local',
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Get or create the singleton server storage provider.
|
|
44
|
-
* Returns null if STORAGE_PROVIDER is 'local' or not set.
|
|
45
|
-
* The provider is automatically initialized on first call.
|
|
46
|
-
*/
|
|
47
|
-
export async function getStorageProvider(): Promise<ServerStorageProvider | null> {
|
|
48
|
-
const providerType = getStorageProviderType();
|
|
49
|
-
|
|
50
|
-
if (providerType === 'local') return null;
|
|
51
|
-
|
|
52
|
-
if (_provider && _initialized) return _provider;
|
|
53
|
-
|
|
54
|
-
switch (providerType) {
|
|
55
|
-
case 'sqlite': {
|
|
56
|
-
const { SQLiteStorageProvider } = await import('./providers/sqlite');
|
|
57
|
-
_provider = new SQLiteStorageProvider();
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
case 'postgres': {
|
|
61
|
-
const { PostgresStorageProvider } = await import('./providers/postgres');
|
|
62
|
-
_provider = new PostgresStorageProvider();
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (_provider && !_initialized) {
|
|
68
|
-
await _provider.initialize();
|
|
69
|
-
_initialized = true;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return _provider;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Close and reset the singleton provider. Used for testing/cleanup.
|
|
77
|
-
*/
|
|
78
|
-
export async function closeStorageProvider(): Promise<void> {
|
|
79
|
-
if (_provider) {
|
|
80
|
-
await _provider.close();
|
|
81
|
-
_provider = null;
|
|
82
|
-
_initialized = false;
|
|
83
|
-
}
|
|
84
|
-
}
|
package/src/lib/storage/index.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Storage module — barrel export.
|
|
3
|
-
* Import path `@/lib/storage` is preserved for all consumers.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export { storage } from './storage-facade';
|
|
7
|
-
export type {
|
|
8
|
-
StorageData,
|
|
9
|
-
StorageCollection,
|
|
10
|
-
ServerStorageProvider,
|
|
11
|
-
StorageConfigResponse,
|
|
12
|
-
StorageChangeDetail,
|
|
13
|
-
} from './types';
|
|
14
|
-
export { STORAGE_COLLECTIONS } from './types';
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure localStorage CRUD operations.
|
|
3
|
-
* All reads/writes go through these functions.
|
|
4
|
-
* No event dispatching — that's the facade's responsibility.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { logger } from '@/lib/logger';
|
|
8
|
-
|
|
9
|
-
const KEY_PREFIX = 'libredb_';
|
|
10
|
-
|
|
11
|
-
/** Map collection names to localStorage keys */
|
|
12
|
-
const COLLECTION_KEYS: Record<string, string> = {
|
|
13
|
-
connections: `${KEY_PREFIX}connections`,
|
|
14
|
-
history: `${KEY_PREFIX}history`,
|
|
15
|
-
saved_queries: `${KEY_PREFIX}saved_queries`,
|
|
16
|
-
schema_snapshots: `${KEY_PREFIX}schema_snapshots`,
|
|
17
|
-
saved_charts: `${KEY_PREFIX}saved_charts`,
|
|
18
|
-
active_connection_id: `${KEY_PREFIX}active_connection_id`,
|
|
19
|
-
audit_log: `${KEY_PREFIX}audit_log`,
|
|
20
|
-
masking_config: `${KEY_PREFIX}masking_config`,
|
|
21
|
-
threshold_config: `${KEY_PREFIX}threshold_config`,
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
function isClient(): boolean {
|
|
25
|
-
return typeof window !== 'undefined';
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function getKey(collection: string): string {
|
|
29
|
-
return COLLECTION_KEYS[collection] || `${KEY_PREFIX}${collection}`;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Read raw JSON from localStorage.
|
|
34
|
-
* Returns null if not found or parse fails.
|
|
35
|
-
*/
|
|
36
|
-
export function readJSON<T>(collection: string): T | null {
|
|
37
|
-
if (!isClient()) return null;
|
|
38
|
-
try {
|
|
39
|
-
const key = getKey(collection);
|
|
40
|
-
const raw = localStorage.getItem(key);
|
|
41
|
-
if (raw === null) return null;
|
|
42
|
-
return JSON.parse(raw) as T;
|
|
43
|
-
} catch {
|
|
44
|
-
logger.warn('Failed to parse JSON from localStorage', { key: getKey(collection) });
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Read raw string from localStorage.
|
|
51
|
-
*/
|
|
52
|
-
export function readString(collection: string): string | null {
|
|
53
|
-
if (!isClient()) return null;
|
|
54
|
-
return localStorage.getItem(getKey(collection));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Write JSON to localStorage.
|
|
59
|
-
* Returns true on success, false on failure (e.g. QuotaExceededError).
|
|
60
|
-
*/
|
|
61
|
-
export function writeJSON(collection: string, data: unknown): boolean {
|
|
62
|
-
if (!isClient()) return false;
|
|
63
|
-
try {
|
|
64
|
-
localStorage.setItem(getKey(collection), JSON.stringify(data));
|
|
65
|
-
return true;
|
|
66
|
-
} catch (error) {
|
|
67
|
-
logger.warn('Failed to write to localStorage', {
|
|
68
|
-
key: getKey(collection),
|
|
69
|
-
error: error instanceof Error ? error.message : String(error),
|
|
70
|
-
});
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Write raw string to localStorage.
|
|
77
|
-
* Returns true on success, false on failure (e.g. QuotaExceededError).
|
|
78
|
-
*/
|
|
79
|
-
export function writeString(collection: string, value: string): boolean {
|
|
80
|
-
if (!isClient()) return false;
|
|
81
|
-
try {
|
|
82
|
-
localStorage.setItem(getKey(collection), value);
|
|
83
|
-
return true;
|
|
84
|
-
} catch (error) {
|
|
85
|
-
logger.warn('Failed to write to localStorage', {
|
|
86
|
-
key: getKey(collection),
|
|
87
|
-
error: error instanceof Error ? error.message : String(error),
|
|
88
|
-
});
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Remove a key from localStorage.
|
|
95
|
-
*/
|
|
96
|
-
export function remove(collection: string): void {
|
|
97
|
-
if (!isClient()) return;
|
|
98
|
-
localStorage.removeItem(getKey(collection));
|
|
99
|
-
}
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PostgreSQL Server Storage Provider
|
|
3
|
-
* Uses the existing `pg` package (already a project dependency).
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { ServerStorageProvider, StorageCollection, StorageData } from '../types';
|
|
7
|
-
import { STORAGE_COLLECTIONS } from '../types';
|
|
8
|
-
import { logger } from '@/lib/logger';
|
|
9
|
-
|
|
10
|
-
let Pool: typeof import('pg').Pool;
|
|
11
|
-
|
|
12
|
-
export class PostgresStorageProvider implements ServerStorageProvider {
|
|
13
|
-
private pool: InstanceType<typeof import('pg').Pool> | null = null;
|
|
14
|
-
private connectionString: string;
|
|
15
|
-
|
|
16
|
-
constructor(connectionString?: string) {
|
|
17
|
-
this.connectionString =
|
|
18
|
-
connectionString || process.env.STORAGE_POSTGRES_URL || '';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async initialize(): Promise<void> {
|
|
22
|
-
if (!this.connectionString) {
|
|
23
|
-
throw new Error(
|
|
24
|
-
'STORAGE_POSTGRES_URL is required when STORAGE_PROVIDER=postgres'
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Dynamic import to avoid requiring pg when not needed
|
|
29
|
-
if (!Pool) {
|
|
30
|
-
const pg = await import('pg');
|
|
31
|
-
Pool = pg.Pool;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
this.pool = new Pool({
|
|
35
|
-
connectionString: this.connectionString,
|
|
36
|
-
max: 5,
|
|
37
|
-
idleTimeoutMillis: 30000,
|
|
38
|
-
ssl: this.buildSSLConfig(),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// Create table
|
|
42
|
-
try {
|
|
43
|
-
await this.pool.query(`
|
|
44
|
-
CREATE TABLE IF NOT EXISTS user_storage (
|
|
45
|
-
user_id TEXT NOT NULL,
|
|
46
|
-
collection TEXT NOT NULL,
|
|
47
|
-
data TEXT NOT NULL,
|
|
48
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
49
|
-
PRIMARY KEY (user_id, collection)
|
|
50
|
-
)
|
|
51
|
-
`);
|
|
52
|
-
} catch (error) {
|
|
53
|
-
if (error instanceof Error && error.message.includes('does not support SSL')) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
'PostgreSQL storage connection failed: server does not support SSL. Add ?sslmode=disable to STORAGE_POSTGRES_URL for local PostgreSQL.',
|
|
56
|
-
{ cause: error }
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
logger.error('PostgreSQL storage initialization failed', error, { provider: 'postgres' });
|
|
60
|
-
throw error;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async getAllData(userId: string): Promise<Partial<StorageData>> {
|
|
65
|
-
this.ensurePool();
|
|
66
|
-
const { rows } = await this.pool!.query(
|
|
67
|
-
'SELECT collection, data FROM user_storage WHERE user_id = $1',
|
|
68
|
-
[userId]
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
const result: Partial<StorageData> = {};
|
|
72
|
-
for (const row of rows) {
|
|
73
|
-
try {
|
|
74
|
-
(result as Record<string, unknown>)[row.collection] = JSON.parse(
|
|
75
|
-
row.data
|
|
76
|
-
);
|
|
77
|
-
} catch {
|
|
78
|
-
logger.warn('Skipping corrupted storage data', { provider: 'postgres', collection: row.collection });
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async getCollection<K extends StorageCollection>(
|
|
85
|
-
userId: string,
|
|
86
|
-
collection: K
|
|
87
|
-
): Promise<StorageData[K] | null> {
|
|
88
|
-
this.ensurePool();
|
|
89
|
-
const { rows } = await this.pool!.query(
|
|
90
|
-
'SELECT data FROM user_storage WHERE user_id = $1 AND collection = $2',
|
|
91
|
-
[userId, collection]
|
|
92
|
-
);
|
|
93
|
-
if (rows.length === 0) return null;
|
|
94
|
-
try {
|
|
95
|
-
return JSON.parse(rows[0].data) as StorageData[K];
|
|
96
|
-
} catch {
|
|
97
|
-
logger.warn('Corrupted data in storage collection', { provider: 'postgres', collection });
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async setCollection<K extends StorageCollection>(
|
|
103
|
-
userId: string,
|
|
104
|
-
collection: K,
|
|
105
|
-
data: StorageData[K]
|
|
106
|
-
): Promise<void> {
|
|
107
|
-
this.ensurePool();
|
|
108
|
-
await this.pool!.query(
|
|
109
|
-
`INSERT INTO user_storage (user_id, collection, data, updated_at)
|
|
110
|
-
VALUES ($1, $2, $3, NOW())
|
|
111
|
-
ON CONFLICT (user_id, collection)
|
|
112
|
-
DO UPDATE SET data = EXCLUDED.data, updated_at = NOW()`,
|
|
113
|
-
[userId, collection, JSON.stringify(data)]
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
async mergeData(userId: string, data: Partial<StorageData>): Promise<void> {
|
|
118
|
-
this.ensurePool();
|
|
119
|
-
const client = await this.pool!.connect();
|
|
120
|
-
try {
|
|
121
|
-
await client.query('BEGIN');
|
|
122
|
-
for (const collection of STORAGE_COLLECTIONS) {
|
|
123
|
-
const collectionData = (data as Record<string, unknown>)[collection];
|
|
124
|
-
if (collectionData !== undefined) {
|
|
125
|
-
await client.query(
|
|
126
|
-
`INSERT INTO user_storage (user_id, collection, data, updated_at)
|
|
127
|
-
VALUES ($1, $2, $3, NOW())
|
|
128
|
-
ON CONFLICT (user_id, collection)
|
|
129
|
-
DO UPDATE SET data = EXCLUDED.data, updated_at = NOW()`,
|
|
130
|
-
[userId, collection, JSON.stringify(collectionData)]
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
await client.query('COMMIT');
|
|
135
|
-
} catch (err) {
|
|
136
|
-
await client.query('ROLLBACK');
|
|
137
|
-
throw err;
|
|
138
|
-
} finally {
|
|
139
|
-
client.release();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async isHealthy(): Promise<boolean> {
|
|
144
|
-
try {
|
|
145
|
-
this.ensurePool();
|
|
146
|
-
const { rows } = await this.pool!.query('SELECT 1 as ok');
|
|
147
|
-
return rows[0]?.ok === 1;
|
|
148
|
-
} catch {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
async close(): Promise<void> {
|
|
154
|
-
if (this.pool) {
|
|
155
|
-
await this.pool.end();
|
|
156
|
-
this.pool = null;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
private ensurePool(): void {
|
|
161
|
-
if (!this.pool) {
|
|
162
|
-
throw new Error(
|
|
163
|
-
'PostgreSQL storage not initialized. Call initialize() first.'
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
private buildSSLConfig(): boolean | { rejectUnauthorized: boolean } {
|
|
169
|
-
const { host, searchParams } = this.parseConnectionString(this.connectionString);
|
|
170
|
-
|
|
171
|
-
const sslMode = searchParams.get('sslmode')?.toLowerCase();
|
|
172
|
-
if (sslMode === 'disable') return false;
|
|
173
|
-
if (
|
|
174
|
-
sslMode === 'require' ||
|
|
175
|
-
sslMode === 'prefer' ||
|
|
176
|
-
sslMode === 'verify-ca' ||
|
|
177
|
-
sslMode === 'verify-full'
|
|
178
|
-
) {
|
|
179
|
-
return { rejectUnauthorized: false };
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const sslParam = searchParams.get('ssl')?.toLowerCase();
|
|
183
|
-
if (sslParam === 'false' || sslParam === '0' || sslParam === 'no') {
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
if (sslParam === 'true' || sslParam === '1' || sslParam === 'yes') {
|
|
187
|
-
return { rejectUnauthorized: false };
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (this.isLocalHost(host)) return false;
|
|
191
|
-
return { rejectUnauthorized: false };
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
private parseConnectionString(connectionString: string): {
|
|
195
|
-
host: string;
|
|
196
|
-
searchParams: URLSearchParams;
|
|
197
|
-
} {
|
|
198
|
-
try {
|
|
199
|
-
const parsed = new URL(connectionString);
|
|
200
|
-
return {
|
|
201
|
-
host: parsed.hostname.toLowerCase(),
|
|
202
|
-
searchParams: parsed.searchParams,
|
|
203
|
-
};
|
|
204
|
-
} catch {
|
|
205
|
-
return {
|
|
206
|
-
host: '',
|
|
207
|
-
searchParams: new URLSearchParams(),
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
private isLocalHost(host: string): boolean {
|
|
213
|
-
const localHosts = new Set([
|
|
214
|
-
'localhost',
|
|
215
|
-
'::1',
|
|
216
|
-
'host.docker.internal',
|
|
217
|
-
'docker.for.mac.localhost',
|
|
218
|
-
'docker.for.win.localhost',
|
|
219
|
-
'gateway.docker.internal',
|
|
220
|
-
]);
|
|
221
|
-
if (localHosts.has(host)) return true;
|
|
222
|
-
if (host.startsWith('127.')) return true;
|
|
223
|
-
return false;
|
|
224
|
-
}
|
|
225
|
-
}
|