@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
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKV356UXJ_js = require('./chunk-KV356UXJ.js');
|
|
4
|
+
var chunkPTIRB2JO_js = require('./chunk-PTIRB2JO.js');
|
|
5
|
+
var chunkJZO5KRZN_js = require('./chunk-JZO5KRZN.js');
|
|
6
|
+
var chunkQ6LRDBK7_js = require('./chunk-Q6LRDBK7.js');
|
|
7
|
+
var fs = require('fs');
|
|
8
|
+
var path = require('path');
|
|
9
|
+
|
|
10
|
+
function _interopNamespace(e) {
|
|
11
|
+
if (e && e.__esModule) return e;
|
|
12
|
+
var n = Object.create(null);
|
|
13
|
+
if (e) {
|
|
14
|
+
Object.keys(e).forEach(function (k) {
|
|
15
|
+
if (k !== 'default') {
|
|
16
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
17
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return e[k]; }
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
n.default = e;
|
|
25
|
+
return Object.freeze(n);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
29
|
+
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
30
|
+
|
|
31
|
+
var Database = null;
|
|
32
|
+
var sqliteLoadError = null;
|
|
33
|
+
async function loadSQLite() {
|
|
34
|
+
if (Database) return Database;
|
|
35
|
+
if (sqliteLoadError) throw sqliteLoadError;
|
|
36
|
+
try {
|
|
37
|
+
const sqlite = await import('bun:sqlite');
|
|
38
|
+
Database = sqlite.Database;
|
|
39
|
+
return Database;
|
|
40
|
+
} catch (e) {
|
|
41
|
+
sqliteLoadError = new chunkJZO5KRZN_js.DatabaseConfigError(
|
|
42
|
+
"SQLite is not available in this environment. SQLite requires Bun runtime. For cloud deployments, use PostgreSQL or MySQL instead.",
|
|
43
|
+
"sqlite"
|
|
44
|
+
);
|
|
45
|
+
throw sqliteLoadError;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
var SQLiteProvider = class extends chunkKV356UXJ_js.SQLBaseProvider {
|
|
49
|
+
constructor(config, options = {}) {
|
|
50
|
+
super(config, options);
|
|
51
|
+
this.db = null;
|
|
52
|
+
this.validate();
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Provider Metadata
|
|
56
|
+
// ============================================================================
|
|
57
|
+
getCapabilities() {
|
|
58
|
+
return chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, super.getCapabilities()), {
|
|
59
|
+
defaultPort: null,
|
|
60
|
+
supportsExplain: false,
|
|
61
|
+
supportsConnectionString: false,
|
|
62
|
+
maintenanceOperations: ["vacuum", "analyze", "reindex", "check"]
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Validation
|
|
67
|
+
// ============================================================================
|
|
68
|
+
validate() {
|
|
69
|
+
super.validate();
|
|
70
|
+
if (!this.config.database && !this.config.connectionString) {
|
|
71
|
+
throw new chunkJZO5KRZN_js.DatabaseConfigError(
|
|
72
|
+
'Database file path is required for SQLite (use "database" field or ":memory:" for in-memory)',
|
|
73
|
+
"sqlite"
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Connection Management
|
|
79
|
+
// ============================================================================
|
|
80
|
+
async connect() {
|
|
81
|
+
if (this.db) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const SQLiteDB = await loadSQLite();
|
|
86
|
+
const dbPath = this.getDatabasePath();
|
|
87
|
+
if (dbPath !== ":memory:") {
|
|
88
|
+
const dir = path__namespace.dirname(dbPath);
|
|
89
|
+
if (!fs__namespace.existsSync(dir)) {
|
|
90
|
+
fs__namespace.mkdirSync(dir, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
this.db = new SQLiteDB(dbPath, {
|
|
94
|
+
create: true,
|
|
95
|
+
readwrite: true
|
|
96
|
+
});
|
|
97
|
+
this.db.exec("PRAGMA foreign_keys = ON");
|
|
98
|
+
this.db.exec("PRAGMA journal_mode = WAL");
|
|
99
|
+
this.db.exec("PRAGMA synchronous = NORMAL");
|
|
100
|
+
this.setConnected(true);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
this.setError(error instanceof Error ? error : new Error(String(error)));
|
|
103
|
+
if (error instanceof chunkJZO5KRZN_js.DatabaseConfigError) {
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
throw new chunkJZO5KRZN_js.ConnectionError(
|
|
107
|
+
`Failed to open SQLite database: ${error instanceof Error ? error.message : error}`,
|
|
108
|
+
"sqlite"
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async disconnect() {
|
|
113
|
+
if (this.db) {
|
|
114
|
+
this.db.close();
|
|
115
|
+
this.db = null;
|
|
116
|
+
this.setConnected(false);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
getDatabasePath() {
|
|
120
|
+
let dbPath;
|
|
121
|
+
if (this.config.connectionString) {
|
|
122
|
+
dbPath = this.config.connectionString.startsWith("file:") ? this.config.connectionString.replace("file:", "") : this.config.connectionString;
|
|
123
|
+
} else {
|
|
124
|
+
dbPath = this.config.database || ":memory:";
|
|
125
|
+
}
|
|
126
|
+
if (dbPath === ":memory:") return dbPath;
|
|
127
|
+
const resolved = path__namespace.resolve(dbPath);
|
|
128
|
+
if (resolved !== path__namespace.normalize(resolved) || dbPath.includes("\0")) {
|
|
129
|
+
throw new chunkJZO5KRZN_js.DatabaseConfigError(
|
|
130
|
+
"Invalid database path: path traversal is not allowed",
|
|
131
|
+
"sqlite"
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return resolved;
|
|
135
|
+
}
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// Query Execution
|
|
138
|
+
// ============================================================================
|
|
139
|
+
async query(sql, params) {
|
|
140
|
+
this.ensureConnected();
|
|
141
|
+
return this.trackQuery(async () => {
|
|
142
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
143
|
+
try {
|
|
144
|
+
const isSelect = this.isReadOnlyQuery(sql);
|
|
145
|
+
if (isSelect) {
|
|
146
|
+
const stmt = this.db.prepare(sql);
|
|
147
|
+
const rows = params ? stmt.all(...params) : stmt.all();
|
|
148
|
+
const fields = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
149
|
+
return {
|
|
150
|
+
rows: rows.map((row) => row),
|
|
151
|
+
fields,
|
|
152
|
+
changes: 0
|
|
153
|
+
};
|
|
154
|
+
} else {
|
|
155
|
+
const stmt = this.db.prepare(sql);
|
|
156
|
+
const info = params ? stmt.run(...params) : stmt.run();
|
|
157
|
+
return {
|
|
158
|
+
rows: [],
|
|
159
|
+
fields: [],
|
|
160
|
+
changes: info.changes
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
} catch (error) {
|
|
164
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "sqlite", sql);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
rows: result.rows,
|
|
169
|
+
fields: result.fields,
|
|
170
|
+
rowCount: result.rows.length || result.changes,
|
|
171
|
+
executionTime
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// ============================================================================
|
|
176
|
+
// Schema Operations
|
|
177
|
+
// ============================================================================
|
|
178
|
+
async getSchema() {
|
|
179
|
+
this.ensureConnected();
|
|
180
|
+
const tablesStmt = this.db.prepare(`
|
|
181
|
+
SELECT name FROM sqlite_master
|
|
182
|
+
WHERE type = 'table'
|
|
183
|
+
AND name NOT LIKE 'sqlite_%'
|
|
184
|
+
ORDER BY name;
|
|
185
|
+
`);
|
|
186
|
+
const tables = tablesStmt.all();
|
|
187
|
+
const schemas = [];
|
|
188
|
+
for (const { name: tableName } of tables) {
|
|
189
|
+
const countStmt = this.db.prepare(`SELECT COUNT(*) as count FROM "${tableName}"`);
|
|
190
|
+
const countResult = countStmt.get();
|
|
191
|
+
const rowCount = (countResult == null ? void 0 : countResult.count) || 0;
|
|
192
|
+
const columnsStmt = this.db.prepare(`PRAGMA table_info("${tableName}")`);
|
|
193
|
+
const columns = columnsStmt.all();
|
|
194
|
+
const fkStmt = this.db.prepare(`PRAGMA foreign_key_list("${tableName}")`);
|
|
195
|
+
const foreignKeys = fkStmt.all();
|
|
196
|
+
const indexStmt = this.db.prepare(`PRAGMA index_list("${tableName}")`);
|
|
197
|
+
const indexList = indexStmt.all();
|
|
198
|
+
const indexes = [];
|
|
199
|
+
for (const idx of indexList) {
|
|
200
|
+
if (idx.name.startsWith("sqlite_")) continue;
|
|
201
|
+
const indexInfoStmt = this.db.prepare(`PRAGMA index_info("${idx.name}")`);
|
|
202
|
+
const indexCols = indexInfoStmt.all();
|
|
203
|
+
indexes.push({
|
|
204
|
+
name: idx.name,
|
|
205
|
+
columns: indexCols.map((c) => c.name),
|
|
206
|
+
unique: idx.unique === 1
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
let sizeBytes = 0;
|
|
210
|
+
try {
|
|
211
|
+
const pageCountStmt = this.db.prepare(`
|
|
212
|
+
SELECT (SELECT page_count FROM pragma_page_count()) *
|
|
213
|
+
(SELECT page_size FROM pragma_page_size()) as size
|
|
214
|
+
`);
|
|
215
|
+
const sizeResult = pageCountStmt.get();
|
|
216
|
+
sizeBytes = (sizeResult == null ? void 0 : sizeResult.size) || 0;
|
|
217
|
+
} catch (e) {
|
|
218
|
+
}
|
|
219
|
+
schemas.push({
|
|
220
|
+
name: tableName,
|
|
221
|
+
rowCount,
|
|
222
|
+
size: chunkPTIRB2JO_js.formatBytes(sizeBytes),
|
|
223
|
+
columns: columns.map((col) => {
|
|
224
|
+
var _a;
|
|
225
|
+
return {
|
|
226
|
+
name: col.name,
|
|
227
|
+
type: col.type || "TEXT",
|
|
228
|
+
nullable: col.notnull === 0,
|
|
229
|
+
isPrimary: col.pk === 1,
|
|
230
|
+
defaultValue: (_a = col.dflt_value) != null ? _a : void 0
|
|
231
|
+
};
|
|
232
|
+
}),
|
|
233
|
+
indexes,
|
|
234
|
+
foreignKeys: foreignKeys.map((fk) => ({
|
|
235
|
+
columnName: fk.from,
|
|
236
|
+
referencedTable: fk.table,
|
|
237
|
+
referencedColumn: fk.to
|
|
238
|
+
}))
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return schemas;
|
|
242
|
+
}
|
|
243
|
+
// ============================================================================
|
|
244
|
+
// Health & Monitoring
|
|
245
|
+
// ============================================================================
|
|
246
|
+
async getHealth() {
|
|
247
|
+
this.ensureConnected();
|
|
248
|
+
const dbPath = this.getDatabasePath();
|
|
249
|
+
let databaseSize = "N/A";
|
|
250
|
+
if (dbPath !== ":memory:") {
|
|
251
|
+
try {
|
|
252
|
+
const stats = fs__namespace.statSync(dbPath);
|
|
253
|
+
databaseSize = chunkPTIRB2JO_js.formatBytes(stats.size);
|
|
254
|
+
} catch (e) {
|
|
255
|
+
databaseSize = "Unknown";
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
try {
|
|
259
|
+
const sizeStmt = this.db.prepare(`
|
|
260
|
+
SELECT (page_count * page_size) as size
|
|
261
|
+
FROM pragma_page_count(), pragma_page_size()
|
|
262
|
+
`);
|
|
263
|
+
const result = sizeStmt.get();
|
|
264
|
+
databaseSize = chunkPTIRB2JO_js.formatBytes((result == null ? void 0 : result.size) || 0);
|
|
265
|
+
} catch (e) {
|
|
266
|
+
databaseSize = "N/A";
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
let isHealthy = true;
|
|
270
|
+
try {
|
|
271
|
+
const integrityStmt = this.db.prepare("PRAGMA integrity_check");
|
|
272
|
+
const integrityResult = integrityStmt.get();
|
|
273
|
+
isHealthy = (integrityResult == null ? void 0 : integrityResult.integrity_check) === "ok";
|
|
274
|
+
} catch (e) {
|
|
275
|
+
isHealthy = false;
|
|
276
|
+
}
|
|
277
|
+
let journalMode = "unknown";
|
|
278
|
+
try {
|
|
279
|
+
const journalStmt = this.db.prepare("PRAGMA journal_mode");
|
|
280
|
+
const journalResult = journalStmt.get();
|
|
281
|
+
journalMode = (journalResult == null ? void 0 : journalResult.journal_mode) || "unknown";
|
|
282
|
+
} catch (e) {
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
activeConnections: 1,
|
|
286
|
+
databaseSize,
|
|
287
|
+
cacheHitRatio: "N/A",
|
|
288
|
+
slowQueries: [
|
|
289
|
+
{
|
|
290
|
+
query: `Integrity: ${isHealthy ? "OK" : "FAILED"}`,
|
|
291
|
+
calls: 0,
|
|
292
|
+
avgTime: "N/A"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
query: `Journal Mode: ${journalMode}`,
|
|
296
|
+
calls: 0,
|
|
297
|
+
avgTime: "N/A"
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
activeSessions: [
|
|
301
|
+
{
|
|
302
|
+
pid: process.pid,
|
|
303
|
+
user: "sqlite",
|
|
304
|
+
database: path__namespace.basename(dbPath),
|
|
305
|
+
state: "active",
|
|
306
|
+
query: "",
|
|
307
|
+
duration: "N/A"
|
|
308
|
+
}
|
|
309
|
+
]
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
// ============================================================================
|
|
313
|
+
// Maintenance Operations
|
|
314
|
+
// ============================================================================
|
|
315
|
+
async runMaintenance(type, target) {
|
|
316
|
+
this.ensureConnected();
|
|
317
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
318
|
+
let sql = "";
|
|
319
|
+
switch (type) {
|
|
320
|
+
case "vacuum":
|
|
321
|
+
sql = "VACUUM";
|
|
322
|
+
break;
|
|
323
|
+
case "analyze":
|
|
324
|
+
sql = target ? `ANALYZE "${target}"` : "ANALYZE";
|
|
325
|
+
break;
|
|
326
|
+
case "reindex":
|
|
327
|
+
sql = target ? `REINDEX "${target}"` : "REINDEX";
|
|
328
|
+
break;
|
|
329
|
+
case "check":
|
|
330
|
+
const checkStmt = this.db.prepare("PRAGMA integrity_check");
|
|
331
|
+
const checkResult = checkStmt.get();
|
|
332
|
+
return {
|
|
333
|
+
success: (checkResult == null ? void 0 : checkResult.integrity_check) === "ok",
|
|
334
|
+
message: (checkResult == null ? void 0 : checkResult.integrity_check) || "Unknown"
|
|
335
|
+
};
|
|
336
|
+
default:
|
|
337
|
+
throw new chunkJZO5KRZN_js.QueryError(`Unsupported maintenance type for SQLite: ${type}`, "sqlite");
|
|
338
|
+
}
|
|
339
|
+
this.db.exec(sql);
|
|
340
|
+
return { success: true, message: `${type.toUpperCase()} completed successfully` };
|
|
341
|
+
});
|
|
342
|
+
return {
|
|
343
|
+
success: result.success,
|
|
344
|
+
executionTime,
|
|
345
|
+
message: result.message
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
// ============================================================================
|
|
349
|
+
// Monitoring Operations
|
|
350
|
+
// ============================================================================
|
|
351
|
+
async getOverview() {
|
|
352
|
+
this.ensureConnected();
|
|
353
|
+
const versionStmt = this.db.prepare("SELECT sqlite_version() as version");
|
|
354
|
+
const versionResult = versionStmt.get();
|
|
355
|
+
const version = `SQLite ${(versionResult == null ? void 0 : versionResult.version) || "Unknown"}`;
|
|
356
|
+
const dbPath = this.getDatabasePath();
|
|
357
|
+
let databaseSizeBytes = 0;
|
|
358
|
+
if (dbPath !== ":memory:") {
|
|
359
|
+
try {
|
|
360
|
+
const stats = fs__namespace.statSync(dbPath);
|
|
361
|
+
databaseSizeBytes = stats.size;
|
|
362
|
+
} catch (e) {
|
|
363
|
+
}
|
|
364
|
+
} else {
|
|
365
|
+
try {
|
|
366
|
+
const sizeStmt = this.db.prepare(`
|
|
367
|
+
SELECT (page_count * page_size) as size
|
|
368
|
+
FROM pragma_page_count(), pragma_page_size()
|
|
369
|
+
`);
|
|
370
|
+
const result = sizeStmt.get();
|
|
371
|
+
databaseSizeBytes = (result == null ? void 0 : result.size) || 0;
|
|
372
|
+
} catch (e) {
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const tableCountStmt = this.db.prepare(`
|
|
376
|
+
SELECT COUNT(*) as count FROM sqlite_master
|
|
377
|
+
WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
|
|
378
|
+
`);
|
|
379
|
+
const tableCountResult = tableCountStmt.get();
|
|
380
|
+
const tableCount = (tableCountResult == null ? void 0 : tableCountResult.count) || 0;
|
|
381
|
+
const indexCountStmt = this.db.prepare(`
|
|
382
|
+
SELECT COUNT(*) as count FROM sqlite_master
|
|
383
|
+
WHERE type = 'index' AND name NOT LIKE 'sqlite_%'
|
|
384
|
+
`);
|
|
385
|
+
const indexCountResult = indexCountStmt.get();
|
|
386
|
+
const indexCount = (indexCountResult == null ? void 0 : indexCountResult.count) || 0;
|
|
387
|
+
return {
|
|
388
|
+
version,
|
|
389
|
+
uptime: "N/A",
|
|
390
|
+
activeConnections: 1,
|
|
391
|
+
maxConnections: 1,
|
|
392
|
+
databaseSize: chunkPTIRB2JO_js.formatBytes(databaseSizeBytes),
|
|
393
|
+
databaseSizeBytes,
|
|
394
|
+
tableCount,
|
|
395
|
+
indexCount
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
async getPerformanceMetrics() {
|
|
399
|
+
this.ensureConnected();
|
|
400
|
+
let cacheHitRatio = 99;
|
|
401
|
+
try {
|
|
402
|
+
const cacheStmt = this.db.prepare("PRAGMA cache_size");
|
|
403
|
+
const cacheResult = cacheStmt.get();
|
|
404
|
+
if (cacheResult == null ? void 0 : cacheResult.cache_size) {
|
|
405
|
+
cacheHitRatio = 95;
|
|
406
|
+
}
|
|
407
|
+
} catch (e) {
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
cacheHitRatio,
|
|
411
|
+
// SQLite doesn't provide these metrics
|
|
412
|
+
queriesPerSecond: void 0,
|
|
413
|
+
bufferPoolUsage: void 0,
|
|
414
|
+
deadlocks: 0
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
async getSlowQueries() {
|
|
418
|
+
return [];
|
|
419
|
+
}
|
|
420
|
+
async getActiveSessions() {
|
|
421
|
+
this.ensureConnected();
|
|
422
|
+
const dbPath = this.getDatabasePath();
|
|
423
|
+
return [{
|
|
424
|
+
pid: process.pid,
|
|
425
|
+
user: "sqlite",
|
|
426
|
+
database: path__namespace.basename(dbPath),
|
|
427
|
+
state: "active",
|
|
428
|
+
query: "",
|
|
429
|
+
duration: "N/A",
|
|
430
|
+
durationMs: 0
|
|
431
|
+
}];
|
|
432
|
+
}
|
|
433
|
+
async getTableStats() {
|
|
434
|
+
this.ensureConnected();
|
|
435
|
+
const tablesStmt = this.db.prepare(`
|
|
436
|
+
SELECT name FROM sqlite_master
|
|
437
|
+
WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
|
|
438
|
+
ORDER BY name
|
|
439
|
+
`);
|
|
440
|
+
const tables = tablesStmt.all();
|
|
441
|
+
const stats = [];
|
|
442
|
+
for (const { name: tableName } of tables) {
|
|
443
|
+
const countStmt = this.db.prepare(`SELECT COUNT(*) as count FROM "${tableName}"`);
|
|
444
|
+
const countResult = countStmt.get();
|
|
445
|
+
const rowCount = (countResult == null ? void 0 : countResult.count) || 0;
|
|
446
|
+
let tableSizeBytes = 0;
|
|
447
|
+
try {
|
|
448
|
+
tableSizeBytes = rowCount * 100;
|
|
449
|
+
} catch (e) {
|
|
450
|
+
}
|
|
451
|
+
stats.push({
|
|
452
|
+
schemaName: "main",
|
|
453
|
+
tableName,
|
|
454
|
+
rowCount,
|
|
455
|
+
tableSize: chunkPTIRB2JO_js.formatBytes(tableSizeBytes),
|
|
456
|
+
tableSizeBytes,
|
|
457
|
+
totalSize: chunkPTIRB2JO_js.formatBytes(tableSizeBytes),
|
|
458
|
+
totalSizeBytes: tableSizeBytes
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
return stats;
|
|
462
|
+
}
|
|
463
|
+
async getIndexStats() {
|
|
464
|
+
this.ensureConnected();
|
|
465
|
+
const indexesStmt = this.db.prepare(`
|
|
466
|
+
SELECT name, tbl_name FROM sqlite_master
|
|
467
|
+
WHERE type = 'index' AND name NOT LIKE 'sqlite_%'
|
|
468
|
+
ORDER BY tbl_name, name
|
|
469
|
+
`);
|
|
470
|
+
const indexes = indexesStmt.all();
|
|
471
|
+
const stats = [];
|
|
472
|
+
for (const { name: indexName, tbl_name: tableName } of indexes) {
|
|
473
|
+
const indexInfoStmt = this.db.prepare(`PRAGMA index_info("${indexName}")`);
|
|
474
|
+
const indexCols = indexInfoStmt.all();
|
|
475
|
+
const indexListStmt = this.db.prepare(`PRAGMA index_list("${tableName}")`);
|
|
476
|
+
const indexList = indexListStmt.all();
|
|
477
|
+
const indexMeta = indexList.find((i) => i.name === indexName);
|
|
478
|
+
stats.push({
|
|
479
|
+
schemaName: "main",
|
|
480
|
+
tableName,
|
|
481
|
+
indexName,
|
|
482
|
+
columns: indexCols.map((c) => c.name),
|
|
483
|
+
isUnique: (indexMeta == null ? void 0 : indexMeta.unique) === 1,
|
|
484
|
+
isPrimary: false,
|
|
485
|
+
// SQLite auto-creates rowid, explicit PKs are shown differently
|
|
486
|
+
indexSize: "N/A",
|
|
487
|
+
indexSizeBytes: 0,
|
|
488
|
+
scans: 0
|
|
489
|
+
// SQLite doesn't track index usage
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
return stats;
|
|
493
|
+
}
|
|
494
|
+
async getStorageStats() {
|
|
495
|
+
this.ensureConnected();
|
|
496
|
+
const stats = [];
|
|
497
|
+
const dbPath = this.getDatabasePath();
|
|
498
|
+
let mainSizeBytes = 0;
|
|
499
|
+
if (dbPath !== ":memory:") {
|
|
500
|
+
try {
|
|
501
|
+
const fileStats = fs__namespace.statSync(dbPath);
|
|
502
|
+
mainSizeBytes = fileStats.size;
|
|
503
|
+
} catch (e) {
|
|
504
|
+
}
|
|
505
|
+
} else {
|
|
506
|
+
try {
|
|
507
|
+
const sizeStmt = this.db.prepare(`
|
|
508
|
+
SELECT (page_count * page_size) as size
|
|
509
|
+
FROM pragma_page_count(), pragma_page_size()
|
|
510
|
+
`);
|
|
511
|
+
const result = sizeStmt.get();
|
|
512
|
+
mainSizeBytes = (result == null ? void 0 : result.size) || 0;
|
|
513
|
+
} catch (e) {
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
stats.push({
|
|
517
|
+
name: "Main Database",
|
|
518
|
+
location: dbPath === ":memory:" ? ":memory:" : path__namespace.basename(dbPath),
|
|
519
|
+
size: chunkPTIRB2JO_js.formatBytes(mainSizeBytes),
|
|
520
|
+
sizeBytes: mainSizeBytes
|
|
521
|
+
});
|
|
522
|
+
if (dbPath !== ":memory:") {
|
|
523
|
+
const walPath = `${dbPath}-wal`;
|
|
524
|
+
try {
|
|
525
|
+
const walStats = fs__namespace.statSync(walPath);
|
|
526
|
+
stats.push({
|
|
527
|
+
name: "WAL",
|
|
528
|
+
location: path__namespace.basename(walPath),
|
|
529
|
+
size: chunkPTIRB2JO_js.formatBytes(walStats.size),
|
|
530
|
+
sizeBytes: walStats.size,
|
|
531
|
+
walSize: chunkPTIRB2JO_js.formatBytes(walStats.size),
|
|
532
|
+
walSizeBytes: walStats.size
|
|
533
|
+
});
|
|
534
|
+
} catch (e) {
|
|
535
|
+
}
|
|
536
|
+
const shmPath = `${dbPath}-shm`;
|
|
537
|
+
try {
|
|
538
|
+
const shmStats = fs__namespace.statSync(shmPath);
|
|
539
|
+
stats.push({
|
|
540
|
+
name: "Shared Memory",
|
|
541
|
+
location: path__namespace.basename(shmPath),
|
|
542
|
+
size: chunkPTIRB2JO_js.formatBytes(shmStats.size),
|
|
543
|
+
sizeBytes: shmStats.size
|
|
544
|
+
});
|
|
545
|
+
} catch (e) {
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return stats;
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
exports.SQLiteProvider = SQLiteProvider;
|
|
553
|
+
//# sourceMappingURL=sqlite-4I2P2OGQ.js.map
|
|
554
|
+
//# sourceMappingURL=sqlite-4I2P2OGQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/db/providers/sql/sqlite.ts"],"names":["DatabaseConfigError","SQLBaseProvider","__spreadProps","__spreadValues","path","fs","ConnectionError","mapDatabaseError","formatBytes","QueryError"],"mappings":"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","file":"sqlite-4I2P2OGQ.js","sourcesContent":["/**\n * SQLite Database Provider\n * File-based SQLite support - Uses bun:sqlite when available\n *\n * Note: SQLite is primarily for local development. Cloud deployments\n * typically use PostgreSQL or MySQL instead.\n */\n\nimport { SQLBaseProvider } from './sql-base';\nimport {\n type DatabaseConnection,\n type TableSchema,\n type QueryResult,\n type HealthInfo,\n type MaintenanceType,\n type MaintenanceResult,\n type ProviderOptions,\n type ProviderCapabilities,\n type DatabaseOverview,\n type PerformanceMetrics,\n type SlowQueryStats,\n type ActiveSessionDetails,\n type TableStats,\n type IndexStats,\n type StorageStats,\n} from '../../types';\nimport {\n DatabaseConfigError,\n ConnectionError,\n QueryError,\n mapDatabaseError,\n} from '../../errors';\nimport { formatBytes } from '../../utils/pool-manager';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// ============================================================================\n// Dynamic SQLite Import (for Bun runtime compatibility)\n// ============================================================================\n\ntype SQLiteDatabase = {\n exec(sql: string): void;\n prepare(sql: string): {\n all(...params: unknown[]): unknown[];\n get(...params: unknown[]): unknown;\n run(...params: unknown[]): { changes: number };\n };\n close(): void;\n};\n\ntype SQLiteConstructor = new (path: string, options?: { create?: boolean; readwrite?: boolean }) => SQLiteDatabase;\n\nlet Database: SQLiteConstructor | null = null;\nlet sqliteLoadError: Error | null = null;\n\n// Try to load bun:sqlite at runtime\nasync function loadSQLite(): Promise<SQLiteConstructor> {\n if (Database) return Database;\n if (sqliteLoadError) throw sqliteLoadError;\n\n try {\n // Dynamic import for bun:sqlite\n const sqlite = await import('bun:sqlite');\n Database = sqlite.Database as unknown as SQLiteConstructor;\n return Database;\n } catch {\n sqliteLoadError = new DatabaseConfigError(\n 'SQLite is not available in this environment. SQLite requires Bun runtime. For cloud deployments, use PostgreSQL or MySQL instead.',\n 'sqlite'\n );\n throw sqliteLoadError;\n }\n}\n\n// ============================================================================\n// SQLite Provider\n// ============================================================================\n\nexport class SQLiteProvider extends SQLBaseProvider {\n private db: SQLiteDatabase | null = null;\n\n constructor(config: DatabaseConnection, options: ProviderOptions = {}) {\n super(config, options);\n this.validate();\n }\n\n // ============================================================================\n // Provider Metadata\n // ============================================================================\n\n public override getCapabilities(): ProviderCapabilities {\n return {\n ...super.getCapabilities(),\n defaultPort: null,\n supportsExplain: false,\n supportsConnectionString: false,\n maintenanceOperations: ['vacuum', 'analyze', 'reindex', 'check'],\n };\n }\n\n // ============================================================================\n // Validation\n // ============================================================================\n\n public validate(): void {\n super.validate();\n\n if (!this.config.database && !this.config.connectionString) {\n throw new DatabaseConfigError(\n 'Database file path is required for SQLite (use \"database\" field or \":memory:\" for in-memory)',\n 'sqlite'\n );\n }\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n public async connect(): Promise<void> {\n if (this.db) {\n return;\n }\n\n try {\n // Dynamically load SQLite\n const SQLiteDB = await loadSQLite();\n\n const dbPath = this.getDatabasePath();\n\n if (dbPath !== ':memory:') {\n const dir = path.dirname(dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n this.db = new SQLiteDB(dbPath, {\n create: true,\n readwrite: true,\n });\n\n // Enable WAL mode and foreign keys\n this.db.exec('PRAGMA foreign_keys = ON');\n this.db.exec('PRAGMA journal_mode = WAL');\n this.db.exec('PRAGMA synchronous = NORMAL');\n\n this.setConnected(true);\n } catch (error) {\n this.setError(error instanceof Error ? error : new Error(String(error)));\n\n if (error instanceof DatabaseConfigError) {\n throw error;\n }\n\n throw new ConnectionError(\n `Failed to open SQLite database: ${error instanceof Error ? error.message : error}`,\n 'sqlite'\n );\n }\n }\n\n public async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n this.setConnected(false);\n }\n }\n\n private getDatabasePath(): string {\n let dbPath: string;\n if (this.config.connectionString) {\n dbPath = this.config.connectionString.startsWith('file:')\n ? this.config.connectionString.replace('file:', '')\n : this.config.connectionString;\n } else {\n dbPath = this.config.database || ':memory:';\n }\n\n // Allow :memory: without path validation\n if (dbPath === ':memory:') return dbPath;\n\n // Resolve to absolute path and reject path traversal attempts\n const resolved = path.resolve(dbPath);\n if (resolved !== path.normalize(resolved) || dbPath.includes('\\0')) {\n throw new DatabaseConfigError(\n 'Invalid database path: path traversal is not allowed',\n 'sqlite'\n );\n }\n\n return resolved;\n }\n\n // ============================================================================\n // Query Execution\n // ============================================================================\n\n public async query(sql: string, params?: unknown[]): Promise<QueryResult> {\n this.ensureConnected();\n\n return this.trackQuery(async () => {\n const { result, executionTime } = await this.measureExecution(async () => {\n try {\n const isSelect = this.isReadOnlyQuery(sql);\n\n if (isSelect) {\n const stmt = this.db!.prepare(sql);\n const rows = params ? stmt.all(...params) : stmt.all();\n const fields = rows.length > 0 ? Object.keys(rows[0] as object) : [];\n return {\n rows: (rows as unknown[]).map(row => row as Record<string, unknown>) as Record<string, unknown>[],\n fields,\n changes: 0,\n };\n } else {\n const stmt = this.db!.prepare(sql);\n const info = params ? stmt.run(...params) : stmt.run();\n return {\n rows: [],\n fields: [],\n changes: info.changes,\n };\n }\n } catch (error) {\n throw mapDatabaseError(error, 'sqlite', sql);\n }\n });\n\n return {\n rows: result.rows,\n fields: result.fields,\n rowCount: result.rows.length || result.changes,\n executionTime,\n };\n });\n }\n\n // ============================================================================\n // Schema Operations\n // ============================================================================\n\n public async getSchema(): Promise<TableSchema[]> {\n this.ensureConnected();\n\n const tablesStmt = this.db!.prepare(`\n SELECT name FROM sqlite_master\n WHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\n ORDER BY name;\n `);\n const tables = tablesStmt.all() as { name: string }[];\n\n const schemas: TableSchema[] = [];\n\n for (const { name: tableName } of tables) {\n const countStmt = this.db!.prepare(`SELECT COUNT(*) as count FROM \"${tableName}\"`);\n const countResult = countStmt.get() as { count: number };\n const rowCount = countResult?.count || 0;\n\n const columnsStmt = this.db!.prepare(`PRAGMA table_info(\"${tableName}\")`);\n const columns = columnsStmt.all() as Array<{\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n }>;\n\n const fkStmt = this.db!.prepare(`PRAGMA foreign_key_list(\"${tableName}\")`);\n const foreignKeys = fkStmt.all() as Array<{\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n }>;\n\n const indexStmt = this.db!.prepare(`PRAGMA index_list(\"${tableName}\")`);\n const indexList = indexStmt.all() as Array<{\n seq: number;\n name: string;\n unique: number;\n }>;\n\n const indexes = [];\n for (const idx of indexList) {\n if (idx.name.startsWith('sqlite_')) continue;\n\n const indexInfoStmt = this.db!.prepare(`PRAGMA index_info(\"${idx.name}\")`);\n const indexCols = indexInfoStmt.all() as Array<{ seqno: number; cid: number; name: string }>;\n\n indexes.push({\n name: idx.name,\n columns: indexCols.map((c) => c.name),\n unique: idx.unique === 1,\n });\n }\n\n let sizeBytes = 0;\n try {\n const pageCountStmt = this.db!.prepare(`\n SELECT (SELECT page_count FROM pragma_page_count()) *\n (SELECT page_size FROM pragma_page_size()) as size\n `);\n const sizeResult = pageCountStmt.get() as { size: number };\n sizeBytes = sizeResult?.size || 0;\n } catch {\n // Ignore size calculation errors\n }\n\n schemas.push({\n name: tableName,\n rowCount,\n size: formatBytes(sizeBytes),\n columns: columns.map((col) => ({\n name: col.name,\n type: col.type || 'TEXT',\n nullable: col.notnull === 0,\n isPrimary: col.pk === 1,\n defaultValue: col.dflt_value ?? undefined,\n })),\n indexes,\n foreignKeys: foreignKeys.map((fk) => ({\n columnName: fk.from,\n referencedTable: fk.table,\n referencedColumn: fk.to,\n })),\n });\n }\n\n return schemas;\n }\n\n // ============================================================================\n // Health & Monitoring\n // ============================================================================\n\n public async getHealth(): Promise<HealthInfo> {\n this.ensureConnected();\n\n const dbPath = this.getDatabasePath();\n\n let databaseSize = 'N/A';\n if (dbPath !== ':memory:') {\n try {\n const stats = fs.statSync(dbPath);\n databaseSize = formatBytes(stats.size);\n } catch {\n databaseSize = 'Unknown';\n }\n } else {\n try {\n const sizeStmt = this.db!.prepare(`\n SELECT (page_count * page_size) as size\n FROM pragma_page_count(), pragma_page_size()\n `);\n const result = sizeStmt.get() as { size: number };\n databaseSize = formatBytes(result?.size || 0);\n } catch {\n databaseSize = 'N/A';\n }\n }\n\n let isHealthy = true;\n try {\n const integrityStmt = this.db!.prepare('PRAGMA integrity_check');\n const integrityResult = integrityStmt.get() as { integrity_check: string };\n isHealthy = integrityResult?.integrity_check === 'ok';\n } catch {\n isHealthy = false;\n }\n\n let journalMode = 'unknown';\n try {\n const journalStmt = this.db!.prepare('PRAGMA journal_mode');\n const journalResult = journalStmt.get() as { journal_mode: string };\n journalMode = journalResult?.journal_mode || 'unknown';\n } catch {\n // Ignore\n }\n\n return {\n activeConnections: 1,\n databaseSize,\n cacheHitRatio: 'N/A',\n slowQueries: [\n {\n query: `Integrity: ${isHealthy ? 'OK' : 'FAILED'}`,\n calls: 0,\n avgTime: 'N/A',\n },\n {\n query: `Journal Mode: ${journalMode}`,\n calls: 0,\n avgTime: 'N/A',\n },\n ],\n activeSessions: [\n {\n pid: process.pid,\n user: 'sqlite',\n database: path.basename(dbPath),\n state: 'active',\n query: '',\n duration: 'N/A',\n },\n ],\n };\n }\n\n // ============================================================================\n // Maintenance Operations\n // ============================================================================\n\n public async runMaintenance(\n type: MaintenanceType,\n target?: string\n ): Promise<MaintenanceResult> {\n this.ensureConnected();\n\n const { result, executionTime } = await this.measureExecution(async () => {\n let sql = '';\n\n switch (type) {\n case 'vacuum':\n sql = 'VACUUM';\n break;\n case 'analyze':\n sql = target ? `ANALYZE \"${target}\"` : 'ANALYZE';\n break;\n case 'reindex':\n sql = target ? `REINDEX \"${target}\"` : 'REINDEX';\n break;\n case 'check':\n const checkStmt = this.db!.prepare('PRAGMA integrity_check');\n const checkResult = checkStmt.get() as { integrity_check: string };\n return {\n success: checkResult?.integrity_check === 'ok',\n message: checkResult?.integrity_check || 'Unknown',\n };\n default:\n throw new QueryError(`Unsupported maintenance type for SQLite: ${type}`, 'sqlite');\n }\n\n this.db!.exec(sql);\n return { success: true, message: `${type.toUpperCase()} completed successfully` };\n });\n\n return {\n success: result.success,\n executionTime,\n message: result.message,\n };\n }\n\n // ============================================================================\n // Monitoring Operations\n // ============================================================================\n\n public async getOverview(): Promise<DatabaseOverview> {\n this.ensureConnected();\n\n // Get SQLite version\n const versionStmt = this.db!.prepare('SELECT sqlite_version() as version');\n const versionResult = versionStmt.get() as { version: string };\n const version = `SQLite ${versionResult?.version || 'Unknown'}`;\n\n // Get database size\n const dbPath = this.getDatabasePath();\n let databaseSizeBytes = 0;\n\n if (dbPath !== ':memory:') {\n try {\n const stats = fs.statSync(dbPath);\n databaseSizeBytes = stats.size;\n } catch {\n // File might not exist yet\n }\n } else {\n try {\n const sizeStmt = this.db!.prepare(`\n SELECT (page_count * page_size) as size\n FROM pragma_page_count(), pragma_page_size()\n `);\n const result = sizeStmt.get() as { size: number };\n databaseSizeBytes = result?.size || 0;\n } catch {\n // Ignore\n }\n }\n\n // Get table count\n const tableCountStmt = this.db!.prepare(`\n SELECT COUNT(*) as count FROM sqlite_master\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'\n `);\n const tableCountResult = tableCountStmt.get() as { count: number };\n const tableCount = tableCountResult?.count || 0;\n\n // Get index count\n const indexCountStmt = this.db!.prepare(`\n SELECT COUNT(*) as count FROM sqlite_master\n WHERE type = 'index' AND name NOT LIKE 'sqlite_%'\n `);\n const indexCountResult = indexCountStmt.get() as { count: number };\n const indexCount = indexCountResult?.count || 0;\n\n return {\n version,\n uptime: 'N/A',\n activeConnections: 1,\n maxConnections: 1,\n databaseSize: formatBytes(databaseSizeBytes),\n databaseSizeBytes,\n tableCount,\n indexCount,\n };\n }\n\n public async getPerformanceMetrics(): Promise<PerformanceMetrics> {\n this.ensureConnected();\n\n let cacheHitRatio = 99;\n\n try {\n // Get cache stats\n const cacheStmt = this.db!.prepare('PRAGMA cache_size');\n const cacheResult = cacheStmt.get() as { cache_size: number };\n\n // SQLite doesn't provide detailed cache hit stats, estimate high ratio\n if (cacheResult?.cache_size) {\n cacheHitRatio = 95; // Reasonable estimate for in-memory cache\n }\n } catch {\n // Ignore\n }\n\n return {\n cacheHitRatio,\n // SQLite doesn't provide these metrics\n queriesPerSecond: undefined,\n bufferPoolUsage: undefined,\n deadlocks: 0,\n };\n }\n\n public async getSlowQueries(): Promise<SlowQueryStats[]> {\n // SQLite doesn't have built-in query statistics\n return [];\n }\n\n public async getActiveSessions(): Promise<ActiveSessionDetails[]> {\n this.ensureConnected();\n\n const dbPath = this.getDatabasePath();\n\n // SQLite is single-connection, return current session\n return [{\n pid: process.pid,\n user: 'sqlite',\n database: path.basename(dbPath),\n state: 'active',\n query: '',\n duration: 'N/A',\n durationMs: 0,\n }];\n }\n\n public async getTableStats(): Promise<TableStats[]> {\n this.ensureConnected();\n\n const tablesStmt = this.db!.prepare(`\n SELECT name FROM sqlite_master\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `);\n const tables = tablesStmt.all() as { name: string }[];\n\n const stats: TableStats[] = [];\n\n for (const { name: tableName } of tables) {\n // Get row count\n const countStmt = this.db!.prepare(`SELECT COUNT(*) as count FROM \"${tableName}\"`);\n const countResult = countStmt.get() as { count: number };\n const rowCount = countResult?.count || 0;\n\n // Estimate table size (SQLite doesn't provide per-table sizes)\n // Use page count approximation\n let tableSizeBytes = 0;\n try {\n // Rough estimate: rows * average row size\n tableSizeBytes = rowCount * 100; // Assume 100 bytes average per row\n } catch {\n // Ignore\n }\n\n stats.push({\n schemaName: 'main',\n tableName,\n rowCount,\n tableSize: formatBytes(tableSizeBytes),\n tableSizeBytes,\n totalSize: formatBytes(tableSizeBytes),\n totalSizeBytes: tableSizeBytes,\n });\n }\n\n return stats;\n }\n\n public async getIndexStats(): Promise<IndexStats[]> {\n this.ensureConnected();\n\n const indexesStmt = this.db!.prepare(`\n SELECT name, tbl_name FROM sqlite_master\n WHERE type = 'index' AND name NOT LIKE 'sqlite_%'\n ORDER BY tbl_name, name\n `);\n const indexes = indexesStmt.all() as { name: string; tbl_name: string }[];\n\n const stats: IndexStats[] = [];\n\n for (const { name: indexName, tbl_name: tableName } of indexes) {\n // Get index info\n const indexInfoStmt = this.db!.prepare(`PRAGMA index_info(\"${indexName}\")`);\n const indexCols = indexInfoStmt.all() as { seqno: number; cid: number; name: string }[];\n\n // Get index uniqueness\n const indexListStmt = this.db!.prepare(`PRAGMA index_list(\"${tableName}\")`);\n const indexList = indexListStmt.all() as { name: string; unique: number }[];\n const indexMeta = indexList.find((i) => i.name === indexName);\n\n stats.push({\n schemaName: 'main',\n tableName,\n indexName,\n columns: indexCols.map((c) => c.name),\n isUnique: indexMeta?.unique === 1,\n isPrimary: false, // SQLite auto-creates rowid, explicit PKs are shown differently\n indexSize: 'N/A',\n indexSizeBytes: 0,\n scans: 0, // SQLite doesn't track index usage\n });\n }\n\n return stats;\n }\n\n public async getStorageStats(): Promise<StorageStats[]> {\n this.ensureConnected();\n\n const stats: StorageStats[] = [];\n const dbPath = this.getDatabasePath();\n\n // Main database file\n let mainSizeBytes = 0;\n if (dbPath !== ':memory:') {\n try {\n const fileStats = fs.statSync(dbPath);\n mainSizeBytes = fileStats.size;\n } catch {\n // File might not exist\n }\n } else {\n try {\n const sizeStmt = this.db!.prepare(`\n SELECT (page_count * page_size) as size\n FROM pragma_page_count(), pragma_page_size()\n `);\n const result = sizeStmt.get() as { size: number };\n mainSizeBytes = result?.size || 0;\n } catch {\n // Ignore\n }\n }\n\n stats.push({\n name: 'Main Database',\n location: dbPath === ':memory:' ? ':memory:' : path.basename(dbPath),\n size: formatBytes(mainSizeBytes),\n sizeBytes: mainSizeBytes,\n });\n\n // WAL file (if exists)\n if (dbPath !== ':memory:') {\n const walPath = `${dbPath}-wal`;\n try {\n const walStats = fs.statSync(walPath);\n stats.push({\n name: 'WAL',\n location: path.basename(walPath),\n size: formatBytes(walStats.size),\n sizeBytes: walStats.size,\n walSize: formatBytes(walStats.size),\n walSizeBytes: walStats.size,\n });\n } catch {\n // WAL might not exist\n }\n\n // SHM file (if exists)\n const shmPath = `${dbPath}-shm`;\n try {\n const shmStats = fs.statSync(shmPath);\n stats.push({\n name: 'Shared Memory',\n location: path.basename(shmPath),\n size: formatBytes(shmStats.size),\n sizeBytes: shmStats.size,\n });\n } catch {\n // SHM might not exist\n }\n }\n\n return stats;\n }\n}\n"]}
|