@libredb/studio 0.9.7 → 0.9.13
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-CPF7XWV5.mjs +1289 -0
- package/dist/chunk-CPF7XWV5.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-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G3S66G64.mjs +6673 -0
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-HGPD6PWV.js +1310 -0
- package/dist/chunk-HGPD6PWV.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-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-Y52UIFEX.js +6741 -0
- package/dist/chunk-Y52UIFEX.js.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 +4174 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4147 -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
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
# Zero-Cost SaaS: How I Deployed My Project with Koyeb.com
|
|
2
|
-
|
|
3
|
-
*A side-project developer's serverless discovery journey*
|
|
4
|
-
|
|
5
|
-
**Tags:** #SaaS #CloudComputing #Koyeb #Startup #WebDevelopment #FreeTier #Serverless
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## I Had an Idea and Was Looking for the Right Tool
|
|
10
|
-
|
|
11
|
-
Every developer has that moment: the idea is ready, the code is ready, everything works perfectly on localhost. Then the question comes — "Where do I deploy this?"
|
|
12
|
-
|
|
13
|
-
Sound familiar?
|
|
14
|
-
|
|
15
|
-
I've been actively using platforms like AWS, Azure, GCP, DigitalOcean, Heroku, Render, Railway, and Fly.io for years, and I continue to use many of them. Each has its strengths — AWS's flexibility, Azure's enterprise integrations, DigitalOcean's simplicity, Fly.io's edge computing approach... I love these platforms and run most of my projects on them.
|
|
16
|
-
|
|
17
|
-
But this time I had a different need. For a SaaS application I was building as a side project, I was looking for a **free web service and database**, **quick setup**, and a **clean interface**. Something that didn't require heavy configuration, had no complex billing model, and could go live in minutes.
|
|
18
|
-
|
|
19
|
-
That's when I came across Koyeb. I created an account, connected my GitHub repo, and within minutes my project — database included — was live. And my bill? Zero.
|
|
20
|
-
|
|
21
|
-
In this post, I'll share my experience with Koyeb.com, what the platform offers, and why it's a great option for side projects and MVPs.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## What Is Koyeb?
|
|
26
|
-
|
|
27
|
-
Koyeb is a serverless Platform-as-a-Service (PaaS) built for developers who want to run applications without dealing with infrastructure management. In the simplest terms, it offers two paths:
|
|
28
|
-
|
|
29
|
-
> **Push to GitHub, let Koyeb deploy it. Or provide a Docker image, and it runs.**
|
|
30
|
-
|
|
31
|
-
First path: you connect your GitHub repo, and with every push, Koyeb automatically builds and deploys. Second path: you provide a Docker image from your container registry — like `ghcr.io/user/project:latest` — and Koyeb pulls and runs it directly. No server setup, no nginx configuration, no SSL certificates to manage... None of that. Automatic build, automatic deploy, automatic HTTPS.
|
|
32
|
-
|
|
33
|
-
What really surprised me was the **deployment speed**. Even on the first deploy, it was incredibly fast. You provide the image, and within seconds the service is ready. I've waited minutes for builds and provisioning on other platforms — on Koyeb, it was done in the blink of an eye.
|
|
34
|
-
|
|
35
|
-
What truly sets Koyeb apart is a major development from February 2026: **its acquisition by Mistral AI**. This was the French AI giant's first-ever acquisition, and it sends a strong signal of confidence in Koyeb's future. Mistral is positioning Koyeb as a core component of its AI cloud infrastructure. This means the platform won't just survive — it will grow with serious investment behind it.
|
|
36
|
-
|
|
37
|
-
Who is Koyeb for?
|
|
38
|
-
|
|
39
|
-
- **Indie hackers**: Those who want to validate ideas quickly
|
|
40
|
-
- **Startup founders**: Those who want to launch an MVP at zero cost
|
|
41
|
-
- **Students**: Those who want to host portfolio projects
|
|
42
|
-
- **Side project developers**: Those who keep saying "I'll deploy it someday"
|
|
43
|
-
- **AI developers**: Those who want to run GPU-powered inference workloads
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## The Power of the Free Plan
|
|
48
|
-
|
|
49
|
-
The first thing that drew me to Koyeb was the value of the Starter plan.
|
|
50
|
-
|
|
51
|
-
Koyeb's Starter plan is **$0** and includes:
|
|
52
|
-
|
|
53
|
-
- **1 web service** (512MB RAM, 0.1 vCPU, 2GB SSD)
|
|
54
|
-
- **1 managed PostgreSQL database** (1GB storage)
|
|
55
|
-
- **No time limit** — there's no trial period
|
|
56
|
-
- **Commercial use allowed** — even if your side project generates revenue
|
|
57
|
-
- **Custom domain support** — you can connect up to 5 domains
|
|
58
|
-
- **100GB monthly bandwidth** — included
|
|
59
|
-
|
|
60
|
-
This is more than enough for an MVP or side project. My SaaS project ran smoothly with these resources.
|
|
61
|
-
|
|
62
|
-
> *I entered my credit card during registration. A small amount was charged and refunded for verification — I didn't see any charges on my statement.*
|
|
63
|
-
|
|
64
|
-
### What Makes Koyeb Stand Out for Side Projects?
|
|
65
|
-
|
|
66
|
-
Every platform has its strengths. AWS and Azure are indispensable for enterprise projects, DigitalOcean is great for its simplicity, Fly.io excels at edge computing, and Railway and Render have made serious strides in developer experience. I actively use most of these platforms across different projects.
|
|
67
|
-
|
|
68
|
-
What made Koyeb different for me was that it **offers both a web service and a PostgreSQL database together on the free plan**, with an extremely clean interface. Instead of setting up separate services and managing accounts across different platforms for a side project, I could handle everything from one place.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## 5 Features That Impressed Me
|
|
73
|
-
|
|
74
|
-
The free plan is nice, but what really kept me on Koyeb was the user experience. Here are the 5 features that impressed me the most:
|
|
75
|
-
|
|
76
|
-
### 1. Two Easy Deploy Paths: Git Push or Docker Image
|
|
77
|
-
|
|
78
|
-
Koyeb offers two deployment paths, both extremely simple:
|
|
79
|
-
|
|
80
|
-
**Path A — Git Push:**
|
|
81
|
-
1. Connect your GitHub repo
|
|
82
|
-
2. Select a branch, confirm build settings
|
|
83
|
-
3. Deploy — every `git push` now triggers an automatic deployment
|
|
84
|
-
|
|
85
|
-
**Path B — Docker Image:**
|
|
86
|
-
1. Enter your container registry and image name (e.g., `ghcr.io/user/project:latest`)
|
|
87
|
-
2. Set port and environment variables
|
|
88
|
-
3. Deploy — Koyeb pulls the image and runs it
|
|
89
|
-
|
|
90
|
-
I chose the Docker image path for my project. I provided my image from GitHub Container Registry, entered my environment variables, and hit deploy. You can also integrate with GitHub Actions or your own CI/CD pipeline, but for a simple side project, this level of simplicity is exactly right.
|
|
91
|
-
|
|
92
|
-
My first deploy? It was live within **a few minutes** of providing the image. No exaggeration — the startup speed genuinely surprised me.
|
|
93
|
-
|
|
94
|
-
### 2. Scale-to-Zero: Pay Only for What You Use
|
|
95
|
-
|
|
96
|
-
This is, in my opinion, Koyeb's strongest feature. When your project isn't receiving traffic, the instance automatically goes to sleep. When a request comes in, it wakes up automatically. (Hugging Face Spaces and Render work similarly, but Koyeb still wins on simplicity and speed.)
|
|
97
|
-
|
|
98
|
-
Koyeb does this in two tiers:
|
|
99
|
-
|
|
100
|
-
- **Light Sleep**: The instance stays in memory, waking up within 200ms. Users feel no delay. (On other platforms, you really notice the cold start.)
|
|
101
|
-
- **Deep Sleep**: The instance shuts down completely, waking up in 1-5 seconds. For longer idle periods.
|
|
102
|
-
|
|
103
|
-
This is especially great for side projects. Why consume resources when your project isn't getting traffic at 3 AM? With Scale-to-Zero, you only pay for actual usage. On the free plan, you're already paying nothing — but when you move to paid plans, this means real savings.
|
|
104
|
-
|
|
105
|
-
### 3. Managed PostgreSQL
|
|
106
|
-
|
|
107
|
-
If you're building a SaaS project, you almost certainly need a database. Koyeb provides one out of the box. (This became my favorite feature. Yugabyte, Neon, Supabase, Heroku, and MongoDB Atlas all offer free tiers too — but having everything in one place is wonderful.)
|
|
108
|
-
|
|
109
|
-
You get your connection string, paste it into your app, done.
|
|
110
|
-
|
|
111
|
-
### 4. Clean and Modern Dashboard
|
|
112
|
-
|
|
113
|
-
Koyeb's dashboard is clean, intuitive, and modern. You can view real-time logs, track deployment history, and easily manage environment variables. (You can copy-paste your .env file — no need to enter variables one by one.) Larger cloud platforms naturally have more comprehensive dashboards because they offer a much wider range of services. Koyeb, by focusing on a narrower scope, keeps its interface extremely clean. I found exactly the information I needed, right where I needed it, for managing a side project.
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## Koyeb's Future: The Mistral AI Effect
|
|
118
|
-
|
|
119
|
-
In February 2026, Mistral AI announced its acquisition of Koyeb. This was Mistral's **first-ever acquisition**. Koyeb's 13-person team and three co-founders joined Mistral's engineering team, led by CTO Timothée Lacroix.
|
|
120
|
-
|
|
121
|
-
Why does this matter?
|
|
122
|
-
|
|
123
|
-
**Strategic positioning**: Mistral is moving beyond being just an LLM company to become a full-stack AI cloud provider. The Mistral Compute platform announced in June 2025 will be accelerated by Koyeb's infrastructure.
|
|
124
|
-
|
|
125
|
-
**AI-focused infrastructure**: Koyeb's serverless GPU support (L4, L40S, V100) aligns perfectly with Mistral's AI inference needs. We can expect more powerful GPU options and AI-native features in the future.
|
|
126
|
-
|
|
127
|
-
**European AI independence**: Mistral is part of Europe's vision to build alternatives to US tech giants. Combined with its $1.4 billion data center investment in Sweden, Koyeb's European-based infrastructure carries strategic value.
|
|
128
|
-
|
|
129
|
-
**Platform continuity commitment**: Koyeb's blog post made it clear — the existing platform and free plan will continue. The acquisition means growth, not shutdown.
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## Pricing: Pay as You Grow
|
|
134
|
-
|
|
135
|
-
Koyeb's free Starter plan offers 1 web service + 1 PostgreSQL. If your project grows, there are Pro ($29/month), Scale ($299/month), and Enterprise options — but at the side project stage, you don't need to think about any of that.
|
|
136
|
-
|
|
137
|
-
What mattered to me was this: no commitment, no hidden costs. You can start without thinking "What if it doesn't take off?" — because if it doesn't, it costs you absolutely nothing.
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## Practical Deploy Flow
|
|
142
|
-
|
|
143
|
-
I want to show how easy it is to get a project live on Koyeb. Both paths take just a few steps:
|
|
144
|
-
|
|
145
|
-
### With GitHub:
|
|
146
|
-
|
|
147
|
-
**Step 1** — Go to [koyeb.com](https://www.koyeb.com), sign up.
|
|
148
|
-
|
|
149
|
-
**Step 2** — Select "Create Web Service" > "GitHub", connect your repo.
|
|
150
|
-
|
|
151
|
-
**Step 3** — Confirm branch and build settings. Koyeb auto-detects popular frameworks like Next.js, Node.js, Python, Go, and Rust.
|
|
152
|
-
|
|
153
|
-
**Step 4** — Add your environment variables, hit "Deploy".
|
|
154
|
-
|
|
155
|
-
### With Docker Image:
|
|
156
|
-
|
|
157
|
-
**Step 1** — Select "Create Web Service" > "Docker".
|
|
158
|
-
|
|
159
|
-
**Step 2** — Enter your image address, e.g.: `ghcr.io/user/project:latest`
|
|
160
|
-
|
|
161
|
-
**Step 3** — Set port, environment variables, and health check settings, hit "Deploy".
|
|
162
|
-
|
|
163
|
-
With both paths, your project is live at `xxx.koyeb.app` within minutes. Want to add PostgreSQL? One click from the dashboard via "Create Database". The connection string is auto-generated. That's it.
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Is Koyeb Perfect? An Honest Assessment
|
|
168
|
-
|
|
169
|
-
Every platform has strengths and weaknesses. I want to be honest while praising Koyeb:
|
|
170
|
-
|
|
171
|
-
**Things to keep in mind:**
|
|
172
|
-
|
|
173
|
-
- **Free tier resources are limited**: 512MB RAM and 0.1 vCPU aren't enough for heavy traffic. But it's free — ideal for MVPs and prototypes.
|
|
174
|
-
- **PostgreSQL uptime**: The free database goes to sleep when idle. If you need an always-on DB, you may need to upgrade to a paid plan.
|
|
175
|
-
- **Region limitations (free)**: On the free plan, you can only choose Frankfurt or Washington D.C.
|
|
176
|
-
- **Younger ecosystem**: It doesn't yet have as wide a service range as platforms that have been around for many years. But it's rapidly growing with Mistral's backing.
|
|
177
|
-
|
|
178
|
-
**Standout strengths:**
|
|
179
|
-
|
|
180
|
-
- Zero-cost start (web service + DB together)
|
|
181
|
-
- Remarkably simple deploy process
|
|
182
|
-
- Smart resource management with Scale-to-Zero
|
|
183
|
-
- Clean and focused dashboard
|
|
184
|
-
- Secure future with Mistral AI backing
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## Conclusion: The Right Tool for the Right Job
|
|
189
|
-
|
|
190
|
-
Platforms like AWS, Azure, and GCP remain indispensable for my larger projects. But for a side project, for a quick and free start, Koyeb was exactly what I was looking for.
|
|
191
|
-
|
|
192
|
-
I deployed my project at zero cost, in minutes. I didn't have to get my database from a separate service. All I needed was my code and my GitHub repo. And my bill reflected nothing.
|
|
193
|
-
|
|
194
|
-
In 2026, cloud platform options are so rich that there's a solution for every need. Koyeb is a great option, especially for side projects, MVPs, and rapid prototyping. With its free web service and database bundled together, its clean interface, and easy setup, it's tailor-made for those "let me try this live" moments.
|
|
195
|
-
|
|
196
|
-
If you have an idea, if you have an unfinished project, if you have code that works on localhost but has never gone live — **give it a shot**. It's free to try.
|
|
197
|
-
|
|
198
|
-
And who knows, maybe the next big SaaS story will be yours.
|
|
199
|
-
|
|
200
|
-
---
|
|
201
|
-
|
|
202
|
-
*This post is not sponsored. There are no discount codes or referral links. I used Koyeb for my own project and wanted to share my experience. As someone who loves open source: a thank you to Koyeb, and a roadmap for you.*
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
## Resources
|
|
207
|
-
|
|
208
|
-
- [Koyeb Official Site](https://www.koyeb.com/)
|
|
209
|
-
- [Koyeb Pricing](https://www.koyeb.com/pricing)
|
|
210
|
-
- [Koyeb Docs](https://www.koyeb.com/docs)
|
|
211
|
-
- [Koyeb Scale-to-Zero](https://www.koyeb.com/docs/run-and-scale/scale-to-zero)
|
|
212
|
-
- [Mistral AI + Koyeb (TechCrunch)](https://techcrunch.com/2026/02/17/mistral-ai-buys-koyeb-in-first-acquisition-to-back-its-cloud-ambitions/)
|
|
213
|
-
- [Koyeb Blog: Joining Mistral AI](https://www.koyeb.com/blog/koyeb-is-joining-mistral-ai-to-build-the-future-of-ai-infrastructure)
|
|
214
|
-
- [Scale-to-Zero with Light Sleep](https://www.koyeb.com/blog/avoid-cold-starts-with-scale-to-zero-light-sleep)
|
|
215
|
-
- [Koyeb Regions](https://www.koyeb.com/docs/reference/regions)
|
package/docs/plans/test-plans.md
DELETED
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
# LibreDB Studio — Kapsamlı Test Altyapısı Planı
|
|
2
|
-
|
|
3
|
-
## Bağlam
|
|
4
|
-
|
|
5
|
-
LibreDB Studio enterprise-grade, open-source bir SQL IDE'dir. ~146 kaynak dosya, ~36,000+ satır kod var ve test altyapısı neredeyse sıfır (tek bir `postgres.test.ts` dosyası `bun:test` kullanıyor). Yeni katılımcıların güvenle geliştirme yapabilmesi ve production-ready kaliteyi korumak için kapsamlı bir test altyapısı şart.
|
|
6
|
-
|
|
7
|
-
**Yaklaşım:** Coverage-first değil, **risk-first + coverage floor** modeli. Coverage tek başına kaliteyi temsil etmez — branch coverage, critical-path zorunluluğu ve E2E akış başarı oranı birlikte kalite kapılarını oluşturur.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Kalite Kapıları (Quality Gates)
|
|
12
|
-
|
|
13
|
-
### Katman Bazlı Eşikler — CI'da Enforce Edilir
|
|
14
|
-
|
|
15
|
-
| Katman | Line Coverage | Branch Coverage | Zorunluluk |
|
|
16
|
-
|--------|-------------|----------------|------------|
|
|
17
|
-
| `src/lib/` (Unit) | ≥ %95 | ≥ %90 | PR merge blocker |
|
|
18
|
-
| `src/app/api/` (API) | ≥ %90 | ≥ %85 | PR merge blocker |
|
|
19
|
-
| `src/hooks/` (Hooks) | ≥ %85 | ≥ %80 | PR merge blocker |
|
|
20
|
-
| `src/components/` (UI) | ≥ %80 | ≥ %70 | Warning (soft gate) |
|
|
21
|
-
| **Toplam Proje** | ≥ %90 | ≥ %85 | PR merge blocker |
|
|
22
|
-
|
|
23
|
-
### E2E Kalite Kapısı (Bağımsız Metrik)
|
|
24
|
-
|
|
25
|
-
E2E testler `bun test --coverage` lcov çıktısına katkı **YAPMAZ** — Playwright ayrı bir süreçte tarayıcıda çalışır. E2E metrikleri ayrı takip edilir:
|
|
26
|
-
|
|
27
|
-
| Metrik | Eşik | Açıklama |
|
|
28
|
-
|--------|-------|----------|
|
|
29
|
-
| Kritik akış başarı oranı | %100 | Login, query execution, connection management |
|
|
30
|
-
| Toplam E2E pass oranı | ≥ %95 | Flaky tolerance: max %5 |
|
|
31
|
-
| Flaky test retry | ≤ 2 retry | CI'da `retries: 2`, 3. denemede de başarısızsa gerçek hata |
|
|
32
|
-
|
|
33
|
-
### Gelecek İyileştirmeler (Phase 2 sonrası değerlendirilecek)
|
|
34
|
-
|
|
35
|
-
- **Mutation Testing**: Stryker.js entegrasyonu — testlerin gerçekten hataları yakalayıp yakalamadığını ölçer
|
|
36
|
-
- **SonarCloud Quality Gate**: Coverage + duplication + complexity birleşik kontrol
|
|
37
|
-
- **PR Coverage Delta**: Yeni eklenen kodun coverage'ı mevcut ortalamadan düşük olamaz
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Faz 0: Altyapı Kurulumu
|
|
42
|
-
|
|
43
|
-
### 0.1 — Bağımlılıkları Yükle
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
bun add -d @testing-library/react @testing-library/jest-dom @testing-library/user-event happy-dom @playwright/test
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### 0.2 — `bunfig.toml` Oluştur (Yeni dosya)
|
|
50
|
-
|
|
51
|
-
```toml
|
|
52
|
-
[test]
|
|
53
|
-
preload = ["./tests/setup.ts"]
|
|
54
|
-
|
|
55
|
-
[test.coverage]
|
|
56
|
-
enabled = true
|
|
57
|
-
reporter = ["lcov", "text"]
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### 0.3 — `tests/setup.ts` Oluştur (Yeni dosya)
|
|
61
|
-
|
|
62
|
-
- `process.env.JWT_SECRET`, `ADMIN_PASSWORD`, `USER_PASSWORD` test değerleri
|
|
63
|
-
- `globalThis.localStorage` in-memory mock (SSR ortamı için)
|
|
64
|
-
- `afterEach` → `localStorage.clear()` cleanup
|
|
65
|
-
|
|
66
|
-
### 0.4 — Test Fixture'ları Oluştur
|
|
67
|
-
|
|
68
|
-
| Dosya | İçerik |
|
|
69
|
-
|-------|--------|
|
|
70
|
-
| `tests/fixtures/connections.ts` | Her DB tipi için mock `DatabaseConnection` objeleri (postgres, mysql, sqlite, mongodb, redis, oracle, mssql) |
|
|
71
|
-
| `tests/fixtures/schemas.ts` | Mock `TableSchema[]` objeleri |
|
|
72
|
-
| `tests/fixtures/query-results.ts` | Mock `QueryResult` objeleri |
|
|
73
|
-
| `tests/fixtures/masking-configs.ts` | Mock `MaskingConfig` objeleri |
|
|
74
|
-
|
|
75
|
-
### 0.5 — Test Helper'ları Oluştur
|
|
76
|
-
|
|
77
|
-
| Dosya | İçerik |
|
|
78
|
-
|-------|--------|
|
|
79
|
-
| `tests/helpers/mock-provider.ts` | `createMockProvider()` — tüm `DatabaseProvider` metodlarını mock'layan factory |
|
|
80
|
-
| `tests/helpers/mock-next.ts` | `createMockRequest()`, `createMockCookies()` — Next.js API test helper'ları |
|
|
81
|
-
| `tests/helpers/mock-fetch.ts` | Global `fetch` mock helper |
|
|
82
|
-
| `tests/helpers/mock-monaco.ts` | Monaco Editor'ü `<textarea>` olarak mock'la |
|
|
83
|
-
| `tests/helpers/render-with-providers.tsx` | Component test wrapper (theme, toast, router provider) |
|
|
84
|
-
|
|
85
|
-
### 0.6 — `package.json` Script'leri Ekle
|
|
86
|
-
|
|
87
|
-
```json
|
|
88
|
-
{
|
|
89
|
-
"test": "bun test",
|
|
90
|
-
"test:unit": "bun test tests/unit",
|
|
91
|
-
"test:integration": "bun test tests/integration",
|
|
92
|
-
"test:hooks": "bun test tests/hooks",
|
|
93
|
-
"test:api": "bun test tests/api",
|
|
94
|
-
"test:components": "bun test tests/components",
|
|
95
|
-
"test:e2e": "bunx playwright test",
|
|
96
|
-
"test:coverage": "bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage"
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### 0.7 — `playwright.config.ts` Oluştur (Yeni dosya)
|
|
101
|
-
|
|
102
|
-
- `testDir: './e2e'`, `baseURL: 'http://localhost:3000'`
|
|
103
|
-
- Chromium projesi, `webServer` → `bun run build && bun start`
|
|
104
|
-
- CI'da `retries: 2`, `workers: 1`
|
|
105
|
-
|
|
106
|
-
### 0.8 — Mevcut Test Dosyası Taşı
|
|
107
|
-
|
|
108
|
-
- `src/lib/db/providers/sql/postgres.test.ts` → `tests/integration/db/postgres-provider.test.ts`
|
|
109
|
-
|
|
110
|
-
### 0.9 — `.github/workflows/ci.yml` Güncelle
|
|
111
|
-
|
|
112
|
-
Mevcut `lint-and-build` job korunur. Eklenenler:
|
|
113
|
-
|
|
114
|
-
**Yeni `test` job:**
|
|
115
|
-
```yaml
|
|
116
|
-
test:
|
|
117
|
-
name: Unit & Integration Tests
|
|
118
|
-
runs-on: ubuntu-latest
|
|
119
|
-
steps:
|
|
120
|
-
- uses: actions/checkout@v6
|
|
121
|
-
- uses: oven-sh/setup-bun@v2
|
|
122
|
-
with:
|
|
123
|
-
bun-version: latest
|
|
124
|
-
- run: bun install --frozen-lockfile
|
|
125
|
-
- run: bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage
|
|
126
|
-
env:
|
|
127
|
-
JWT_SECRET: test-secret-for-ci-build-only-32ch
|
|
128
|
-
ADMIN_PASSWORD: test-admin
|
|
129
|
-
USER_PASSWORD: test-user
|
|
130
|
-
- uses: actions/upload-artifact@v4
|
|
131
|
-
with:
|
|
132
|
-
name: coverage
|
|
133
|
-
path: coverage/lcov.info
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
**Yeni `e2e` job (lint-and-build'e bağımlı):**
|
|
137
|
-
```yaml
|
|
138
|
-
e2e:
|
|
139
|
-
name: E2E Tests
|
|
140
|
-
needs: [lint-and-build]
|
|
141
|
-
runs-on: ubuntu-latest
|
|
142
|
-
steps:
|
|
143
|
-
- uses: actions/checkout@v6
|
|
144
|
-
- uses: oven-sh/setup-bun@v2
|
|
145
|
-
- run: bun install --frozen-lockfile
|
|
146
|
-
- run: bunx playwright install --with-deps chromium
|
|
147
|
-
- run: bunx playwright test
|
|
148
|
-
env:
|
|
149
|
-
JWT_SECRET: test-secret-for-ci-build-only-32ch
|
|
150
|
-
ADMIN_PASSWORD: test-admin
|
|
151
|
-
USER_PASSWORD: test-user
|
|
152
|
-
- uses: actions/upload-artifact@v4
|
|
153
|
-
if: always()
|
|
154
|
-
with:
|
|
155
|
-
name: playwright-report
|
|
156
|
-
path: playwright-report/
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
**`sonarcloud` job güncelleme:**
|
|
160
|
-
```yaml
|
|
161
|
-
sonarcloud:
|
|
162
|
-
name: SonarCloud Analysis
|
|
163
|
-
needs: [test] # coverage artifact'ını bekle
|
|
164
|
-
runs-on: ubuntu-latest
|
|
165
|
-
steps:
|
|
166
|
-
- uses: actions/checkout@v6
|
|
167
|
-
with:
|
|
168
|
-
fetch-depth: 0
|
|
169
|
-
- uses: actions/download-artifact@v4
|
|
170
|
-
with:
|
|
171
|
-
name: coverage
|
|
172
|
-
path: coverage
|
|
173
|
-
- uses: SonarSource/sonarqube-scan-action@v6
|
|
174
|
-
env:
|
|
175
|
-
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### 0.10 — `sonar-project.properties` Güncelle
|
|
179
|
-
|
|
180
|
-
```properties
|
|
181
|
-
sonar.projectKey=libredb_libredb-studio
|
|
182
|
-
sonar.organization=libredb
|
|
183
|
-
|
|
184
|
-
sonar.projectName=libredb-studio
|
|
185
|
-
sonar.projectVersion=0.6.18
|
|
186
|
-
|
|
187
|
-
sonar.sources=src
|
|
188
|
-
sonar.tests=tests,e2e
|
|
189
|
-
sonar.test.inclusions=tests/**/*.test.ts,tests/**/*.test.tsx,e2e/**/*.spec.ts
|
|
190
|
-
|
|
191
|
-
# Sadece runtime/generate edilmiş kodu hariç tut, test dosyalarını DEĞİL
|
|
192
|
-
sonar.exclusions=**/node_modules/**,**/.next/**,**/build/**,**/out/**,src/components/ui/**
|
|
193
|
-
|
|
194
|
-
sonar.javascript.lcov.reportPaths=coverage/lcov.info
|
|
195
|
-
sonar.typescript.tsconfigPath=tsconfig.json
|
|
196
|
-
sonar.sourceEncoding=UTF-8
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Önemli:** `tests/**` ve `e2e/**` artık `sonar.exclusions` içinde DEĞİL. Bunlar `sonar.tests` olarak tanımlanır → SonarCloud bunları test kodu olarak algılar, coverage hesaplamasından hariç tutar ama analiz eder.
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## Faz 1: Unit Testler — Saf Fonksiyonlar
|
|
204
|
-
|
|
205
|
-
**En yüksek ROI:** Saf fonksiyonlar, sıfır mocking, en kritik iş mantığı.
|
|
206
|
-
|
|
207
|
-
| # | Test Dosyası | Kaynak Dosya | ~Test | Açıklama |
|
|
208
|
-
|---|---|---|---|---|
|
|
209
|
-
| 1 | `tests/unit/sql/statement-splitter.test.ts` | `src/lib/sql/statement-splitter.ts` | 40 | Tek/çoklu statement, `''` string literal, `"identifiers"`, `--` ve `/* */` yorumlar, `$$dollar-quote$$`, unterminated string, boş input, `isMultiStatement()` |
|
|
210
|
-
| 2 | `tests/unit/lib/connection-string-parser.test.ts` | `src/lib/connection-string-parser.ts` | 45 | `postgres://`, `mysql://`, `mongodb://`, `mongodb+srv://`, `redis://`, `oracle://`, `mssql://`, `sqlserver://`, ADO.NET `Server=`, URL encoding, özel karakter, eksik parça, `detectConnectionStringType()` |
|
|
211
|
-
| 3 | `tests/unit/lib/data-masking.test.ts` | `src/lib/data-masking.ts` | 60 | 10 mask tipi, `maskByType()`, `detectSensitiveColumnsFromConfig()`, `shouldMask()` RBAC, `canToggleMasking()`, `canReveal()`, `applyMaskingToRows()`, null/undefined edge case |
|
|
212
|
-
| 4 | `tests/unit/db/query-limiter.test.ts` | `src/lib/db/utils/query-limiter.ts` | 50 | `analyzeQuery()` tüm query tipleri, LIMIT/OFFSET tespiti, MySQL `LIMIT x,y`, Oracle `FETCH FIRST`, MSSQL `TOP N`, `ROWNUM`, UNION, CTE, subquery, `applyQueryLimit()`, `forceLimit` |
|
|
213
|
-
| 5 | `tests/unit/db/errors.test.ts` | `src/lib/db/errors.ts` | 35 | 6 error class, `toJSON()`, 5 type guard, `isRetryableError()`, `mapDatabaseError()` pattern matching, Oracle ORA-*, MSSQL pattern |
|
|
214
|
-
| 6 | `tests/unit/sql/alias-extractor.test.ts` | `src/lib/sql/alias-extractor.ts` | 30 | FROM/JOIN alias, CTE, schema.table, `resolveAlias()`, `getAliasSchema()`, comment/string içindeki SQL |
|
|
215
|
-
| 7 | `tests/unit/schema-diff/diff-engine.test.ts` | `src/lib/schema-diff/diff-engine.ts` | 25 | Eklenen/silinen/değiştirilen tablo ve kolon, index diff, FK diff, aynı schema, boş schema |
|
|
216
|
-
| 8 | `tests/unit/schema-diff/migration-generator.test.ts` | `src/lib/schema-diff/migration-generator.ts` | 20 | CREATE/DROP/ALTER TABLE her dialect (PG, MySQL, SQLite, Oracle, MSSQL), identifier escaping |
|
|
217
|
-
| 9 | `tests/unit/lib/query-generators.test.ts` | `src/lib/query-generators.ts` | 12 | `generateTableQuery()` SQL/JSON/Oracle/MSSQL, `generateSelectQuery()`, `shouldRefreshSchema()` DDL pattern |
|
|
218
|
-
| 10 | `tests/unit/lib/storage.test.ts` | `src/lib/storage.ts` | 20 | CRUD: connections, history (max limit), saved queries, schema snapshots (max 50), charts, active connection ID, bozuk JSON handling |
|
|
219
|
-
| 11 | `tests/unit/lib/time-series-buffer.test.ts` | `src/lib/time-series-buffer.ts` | 15 | push, getAll, getRange, getLast, clear, circular overflow, size |
|
|
220
|
-
| 12 | `tests/unit/lib/audit.test.ts` | `src/lib/audit.ts` | 15 | RingBuffer push/getAll/getRecent/filter/clear/size/toJSON/loadFrom, max size |
|
|
221
|
-
| 13 | `tests/unit/lib/monitoring-thresholds.test.ts` | `src/lib/monitoring-thresholds.ts` | 12 | `evaluateThreshold()` above/below, healthy/warning/critical, `getThresholdColor()`, `getThresholdBadgeVariant()` |
|
|
222
|
-
| 14 | `tests/unit/db/pool-manager.test.ts` | `src/lib/db/utils/pool-manager.ts` | 20 | `mergePoolConfig()`, `validatePoolConfig()`, `withTimeout()`, `formatBytes()`, `formatDuration()`, `escapeIdentifier()` per dialect |
|
|
223
|
-
| 15 | `tests/unit/llm/config.test.ts` | `src/lib/llm/utils/config.ts` | 20 | `resolveConfig()`, `validateConfig()` her provider, `requiresApiKey()`, `requiresApiUrl()`, `getSafeConfigForLogging()` |
|
|
224
|
-
| 16 | `tests/unit/llm/retry.test.ts` | `src/lib/llm/utils/retry.ts` | 10 | `withRetry()` ilk seferde başarı, retry+başarı, tüm retry tükenme, non-retryable error |
|
|
225
|
-
| 17 | `tests/unit/llm/streaming.test.ts` | `src/lib/llm/utils/streaming.ts` | 10 | `encodeText()`/`decodeText()`, `createSSEParser()`, `[DONE]`, malformed JSON, `createErrorStream()` |
|
|
226
|
-
|
|
227
|
-
**Faz 1 Toplam:** 17 test dosyası, ~409 test case
|
|
228
|
-
**Beklenen line coverage (bun test):** ~%30
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
## Faz 2: API Route Testleri
|
|
233
|
-
|
|
234
|
-
Route handler fonksiyonları doğrudan import edilip mock `NextRequest` ile çağrılır.
|
|
235
|
-
|
|
236
|
-
**Mock Stratejisi:**
|
|
237
|
-
- `mock.module('@/lib/db')` → `getOrCreateProvider()` mock provider döndürür
|
|
238
|
-
- `mock.module('@/lib/auth')` → `getSession()` kontrol edilir (admin/user/null)
|
|
239
|
-
- Her HTTP metod, başarı/hata path'i, validasyon, status code test edilir
|
|
240
|
-
|
|
241
|
-
| # | Test Dosyası | Kaynak Dosya | ~Test |
|
|
242
|
-
|---|---|---|---|
|
|
243
|
-
| 1 | `tests/api/auth/login.test.ts` | `src/app/api/auth/login/route.ts` | 8 |
|
|
244
|
-
| 2 | `tests/api/auth/me.test.ts` | `src/app/api/auth/me/route.ts` | 4 |
|
|
245
|
-
| 3 | `tests/api/auth/logout.test.ts` | `src/app/api/auth/logout/route.ts` | 3 |
|
|
246
|
-
| 4 | `tests/api/db/query.test.ts` | `src/app/api/db/query/route.ts` | 12 |
|
|
247
|
-
| 5 | `tests/api/db/multi-query.test.ts` | `src/app/api/db/multi-query/route.ts` | 10 |
|
|
248
|
-
| 6 | `tests/api/db/schema.test.ts` | `src/app/api/db/schema/route.ts` | 6 |
|
|
249
|
-
| 7 | `tests/api/db/health.test.ts` | `src/app/api/db/health/route.ts` | 6 |
|
|
250
|
-
| 8 | `tests/api/db/test-connection.test.ts` | `src/app/api/db/test-connection/route.ts` | 8 |
|
|
251
|
-
| 9 | `tests/api/db/transaction.test.ts` | `src/app/api/db/transaction/route.ts` | 12 |
|
|
252
|
-
| 10 | `tests/api/db/cancel.test.ts` | `src/app/api/db/cancel/route.ts` | 6 |
|
|
253
|
-
| 11 | `tests/api/db/maintenance.test.ts` | `src/app/api/db/maintenance/route.ts` | 8 |
|
|
254
|
-
| 12 | `tests/api/db/monitoring.test.ts` | `src/app/api/db/monitoring/route.ts` | 6 |
|
|
255
|
-
| 13 | `tests/api/db/provider-meta.test.ts` | `src/app/api/db/provider-meta/route.ts` | 6 |
|
|
256
|
-
| 14 | `tests/api/db/pool-stats.test.ts` | `src/app/api/db/pool-stats/route.ts` | 4 |
|
|
257
|
-
| 15 | `tests/api/db/profile.test.ts` | `src/app/api/db/profile/route.ts` | 8 |
|
|
258
|
-
| 16 | `tests/api/db/schema-snapshot.test.ts` | `src/app/api/db/schema-snapshot/route.ts` | 6 |
|
|
259
|
-
| 17 | `tests/api/ai/chat.test.ts` | `src/app/api/ai/chat/route.ts` | 10 |
|
|
260
|
-
| 18 | `tests/api/ai/nl2sql.test.ts` | `src/app/api/ai/nl2sql/route.ts` | 8 |
|
|
261
|
-
| 19 | `tests/api/ai/explain.test.ts` | `src/app/api/ai/explain/route.ts` | 8 |
|
|
262
|
-
| 20 | `tests/api/ai/query-safety.test.ts` | `src/app/api/ai/query-safety/route.ts` | 8 |
|
|
263
|
-
| 21 | `tests/api/ai/autopilot.test.ts` | `src/app/api/ai/autopilot/route.ts` | 6 |
|
|
264
|
-
| 22 | `tests/api/ai/index-advisor.test.ts` | `src/app/api/ai/index-advisor/route.ts` | 6 |
|
|
265
|
-
| 23 | `tests/api/ai/impact.test.ts` | `src/app/api/ai/impact/route.ts` | 6 |
|
|
266
|
-
| 24 | `tests/api/ai/describe-schema.test.ts` | `src/app/api/ai/describe-schema/route.ts` | 4 |
|
|
267
|
-
| 25 | `tests/api/admin/fleet-health.test.ts` | `src/app/api/admin/fleet-health/route.ts` | 6 |
|
|
268
|
-
| 26 | `tests/api/admin/audit.test.ts` | `src/app/api/admin/audit/route.ts` | 6 |
|
|
269
|
-
| 28 | `tests/api/middleware.test.ts` | `src/middleware.ts` | 15 |
|
|
270
|
-
|
|
271
|
-
**Faz 2 Toplam:** 28 test dosyası, ~207 test case
|
|
272
|
-
**Beklenen kümülatif line coverage (bun test):** ~%55
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
## Faz 3: Provider Integration Testleri
|
|
277
|
-
|
|
278
|
-
Her provider'ın native DB client'ı `mock.module()` ile mock'lanır. Mevcut `postgres.test.ts` pattern'i takip edilir.
|
|
279
|
-
|
|
280
|
-
**Test edilen metodlar:** `connect()`, `disconnect()`, `query()`, `getSchema()`, `getHealth()`, `runMaintenance()`, `prepareQuery()`, `getCapabilities()`, `getLabels()`, error mapping.
|
|
281
|
-
|
|
282
|
-
| # | Test Dosyası | Kaynak Dosya | Mock Target | ~Test |
|
|
283
|
-
|---|---|---|---|---|
|
|
284
|
-
| 2 | `tests/integration/db/postgres-provider.test.ts` | `src/lib/db/providers/sql/postgres.ts` | `pg` → mock Pool | 20 |
|
|
285
|
-
| 3 | `tests/integration/db/mysql-provider.test.ts` | `src/lib/db/providers/sql/mysql.ts` | `mysql2/promise` | 18 |
|
|
286
|
-
| 4 | `tests/integration/db/sqlite-provider.test.ts` | `src/lib/db/providers/sql/sqlite.ts` | `better-sqlite3` | 15 |
|
|
287
|
-
| 5 | `tests/integration/db/mongodb-provider.test.ts` | `src/lib/db/providers/document/mongodb.ts` | `mongodb` → mock MongoClient | 18 |
|
|
288
|
-
| 6 | `tests/integration/db/redis-provider.test.ts` | `src/lib/db/providers/keyvalue/redis.ts` | `ioredis` | 15 |
|
|
289
|
-
| 7 | `tests/integration/db/oracle-provider.test.ts` | `src/lib/db/providers/sql/oracle.ts` | `oracledb` | 18 |
|
|
290
|
-
| 8 | `tests/integration/db/mssql-provider.test.ts` | `src/lib/db/providers/sql/mssql.ts` | `mssql` | 18 |
|
|
291
|
-
| 9 | `tests/unit/db/factory.test.ts` | `src/lib/db/factory.ts` | Dynamic imports + SSH tunnel | 15 |
|
|
292
|
-
| 10 | `tests/unit/db/base-provider.test.ts` | `src/lib/db/base-provider.ts` | Concrete mock impl | 12 |
|
|
293
|
-
|
|
294
|
-
**Faz 3 Toplam:** 10 test dosyası, ~164 test case
|
|
295
|
-
**Beklenen kümülatif line coverage (bun test):** ~%70
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
|
-
## Faz 4: React Hook Testleri
|
|
300
|
-
|
|
301
|
-
`@testing-library/react` `renderHook` + `act` kullanılır. `globalThis.fetch` mock'lanır.
|
|
302
|
-
|
|
303
|
-
| # | Test Dosyası | Kaynak Dosya | ~Test |
|
|
304
|
-
|---|---|---|---|
|
|
305
|
-
| 1 | `tests/hooks/use-auth.test.ts` | `src/hooks/use-auth.ts` | 8 |
|
|
306
|
-
| 2 | `tests/hooks/use-connection-manager.test.ts` | `src/hooks/use-connection-manager.ts` | 15 |
|
|
307
|
-
| 3 | `tests/hooks/use-tab-manager.test.ts` | `src/hooks/use-tab-manager.ts` | 12 |
|
|
308
|
-
| 4 | `tests/hooks/use-query-execution.test.ts` | `src/hooks/use-query-execution.ts` | 20 |
|
|
309
|
-
| 5 | `tests/hooks/use-transaction-control.test.ts` | `src/hooks/use-transaction-control.ts` | 8 |
|
|
310
|
-
| 6 | `tests/hooks/use-inline-editing.test.ts` | `src/hooks/use-inline-editing.ts` | 10 |
|
|
311
|
-
| 7 | `tests/hooks/use-connection-form.test.ts` | `src/hooks/use-connection-form.ts` | 15 |
|
|
312
|
-
| 8 | `tests/hooks/use-provider-metadata.test.ts` | `src/hooks/use-provider-metadata.ts` | 8 |
|
|
313
|
-
| 9 | `tests/hooks/use-monitoring-data.test.ts` | `src/hooks/use-monitoring-data.ts` | 12 |
|
|
314
|
-
| 10 | `tests/hooks/use-ai-chat.test.ts` | `src/hooks/use-ai-chat.ts` | 10 |
|
|
315
|
-
| 11 | `tests/hooks/use-mobile.test.ts` | `src/hooks/use-mobile.ts` | 4 |
|
|
316
|
-
| 12 | `tests/hooks/use-toast.test.ts` | `src/hooks/use-toast.ts` | 4 |
|
|
317
|
-
|
|
318
|
-
**Faz 4 Toplam:** 12 test dosyası, ~126 test case
|
|
319
|
-
**Beklenen kümülatif line coverage (bun test):** ~%80
|
|
320
|
-
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
## Faz 5: Component Testleri
|
|
324
|
-
|
|
325
|
-
`happy-dom` ortamı, `@testing-library/react`, heavy dependency mock'ları.
|
|
326
|
-
|
|
327
|
-
**Mock Stratejisi:**
|
|
328
|
-
- `@monaco-editor/react` → `<textarea data-testid="mock-monaco-editor">`
|
|
329
|
-
- `recharts` → basit `<div>` wrapper'ları
|
|
330
|
-
- `@xyflow/react` → `<div>` wrapper
|
|
331
|
-
- `framer-motion` → children pass-through (animasyonsuz)
|
|
332
|
-
|
|
333
|
-
| # | Test Dosyası | Kaynak Dosya | ~Test |
|
|
334
|
-
|---|---|---|---|
|
|
335
|
-
| 1 | `tests/components/ConnectionModal.test.tsx` | `src/components/ConnectionModal.tsx` | 15 |
|
|
336
|
-
| 2 | `tests/components/ResultsGrid.test.tsx` | `src/components/ResultsGrid.tsx` | 12 |
|
|
337
|
-
| 3 | `tests/components/Studio.test.tsx` | `src/components/Studio.tsx` | 10 |
|
|
338
|
-
| 4 | `tests/components/CommandPalette.test.tsx` | `src/components/CommandPalette.tsx` | 8 |
|
|
339
|
-
| 5 | `tests/components/QueryEditor.test.tsx` | `src/components/QueryEditor.tsx` | 8 |
|
|
340
|
-
| 6 | `tests/components/sidebar/Sidebar.test.tsx` | `src/components/sidebar/Sidebar.tsx` | 8 |
|
|
341
|
-
| 7 | `tests/components/sidebar/ConnectionItem.test.tsx` | `src/components/sidebar/ConnectionItem.tsx` | 6 |
|
|
342
|
-
| 8 | `tests/components/sidebar/ConnectionsList.test.tsx` | `src/components/sidebar/ConnectionsList.tsx` | 6 |
|
|
343
|
-
| 9 | `tests/components/QueryHistory.test.tsx` | `src/components/QueryHistory.tsx` | 8 |
|
|
344
|
-
| 10 | `tests/components/DataCharts.test.tsx` | `src/components/DataCharts.tsx` | 10 |
|
|
345
|
-
| 11 | `tests/components/SchemaDiagram.test.tsx` | `src/components/SchemaDiagram.tsx` | 8 |
|
|
346
|
-
| 12 | `tests/components/SchemaDiff.test.tsx` | `src/components/SchemaDiff.tsx` | 8 |
|
|
347
|
-
| 13 | `tests/components/MaskingSettings.test.tsx` | `src/components/MaskingSettings.tsx` | 8 |
|
|
348
|
-
| 14 | `tests/components/DataProfiler.test.tsx` | `src/components/DataProfiler.tsx` | 6 |
|
|
349
|
-
| 15 | `tests/components/schema-explorer/SchemaExplorer.test.tsx` | `src/components/schema-explorer/SchemaExplorer.tsx` | 6 |
|
|
350
|
-
| 16 | `tests/components/admin/AdminDashboard.test.tsx` | `src/components/admin/AdminDashboard.tsx` | 8 |
|
|
351
|
-
| 17 | `tests/components/admin/OverviewTab.test.tsx` | `src/components/admin/tabs/OverviewTab.tsx` | 8 |
|
|
352
|
-
| 18 | `tests/components/admin/OperationsTab.test.tsx` | `src/components/admin/tabs/OperationsTab.tsx` | 6 |
|
|
353
|
-
| 19 | `tests/components/admin/SecurityTab.test.tsx` | `src/components/admin/tabs/SecurityTab.tsx` | 6 |
|
|
354
|
-
| 20 | `tests/components/admin/AuditTab.test.tsx` | `src/components/admin/tabs/AuditTab.tsx` | 6 |
|
|
355
|
-
| 21 | `tests/components/monitoring/MonitoringDashboard.test.tsx` | `src/components/monitoring/MonitoringDashboard.tsx` | 8 |
|
|
356
|
-
| 22 | `tests/components/studio/BottomPanel.test.tsx` | `src/components/studio/BottomPanel.tsx` | 6 |
|
|
357
|
-
| 23 | `tests/components/studio/QueryToolbar.test.tsx` | `src/components/studio/QueryToolbar.tsx` | 6 |
|
|
358
|
-
| 24 | `tests/components/studio/StudioTabBar.test.tsx` | `src/components/studio/StudioTabBar.tsx` | 6 |
|
|
359
|
-
|
|
360
|
-
**Faz 5 Toplam:** 24 test dosyası, ~187 test case
|
|
361
|
-
**Beklenen kümülatif line coverage (bun test):** ~%90-92
|
|
362
|
-
|
|
363
|
-
---
|
|
364
|
-
|
|
365
|
-
## Faz 6: E2E Testler (Playwright)
|
|
366
|
-
|
|
367
|
-
Tam tarayıcı testleri, çalışan Next.js server'a karşı. **Bu testler `bun test --coverage` lcov'a katkı YAPMAZ** — bağımsız kalite kapısı olarak izlenir.
|
|
368
|
-
|
|
369
|
-
| # | Test Dosyası | Senaryo | Kritiklik |
|
|
370
|
-
|---|---|---|---|
|
|
371
|
-
| 1 | `e2e/login.spec.ts` | Admin/user login, yanlış şifre, redirect, logout | Kritik |
|
|
372
|
-
| 3 | `e2e/connection-management.spec.ts` | Connection ekle/düzenle/sil, test connection | Kritik |
|
|
373
|
-
| 4 | `e2e/query-execution.spec.ts` | Query yaz, çalıştır, sonuç gör, cancel | Kritik |
|
|
374
|
-
| 5 | `e2e/tab-management.spec.ts` | Tab ekle/kapat/yeniden adlandır/değiştir | Normal |
|
|
375
|
-
| 6 | `e2e/export.spec.ts` | CSV/JSON/SQL export | Normal |
|
|
376
|
-
| 7 | `e2e/admin-dashboard.spec.ts` | Admin erişim, tab'lar, fleet health | Normal |
|
|
377
|
-
|
|
378
|
-
**Faz 6 Toplam:** 7 test dosyası, ~40 test case
|
|
379
|
-
**E2E kritik akış başarı oranı hedefi:** %100
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## Toplam Özet
|
|
384
|
-
|
|
385
|
-
| Faz | Kapsam | Dosya | Test Case | Bun Coverage (lcov) |
|
|
386
|
-
|-----|--------|-------|-----------|---------------------|
|
|
387
|
-
| 0 | Altyapı + CI/CD | 12 (setup) | 0 | — |
|
|
388
|
-
| 1 | Saf Fonksiyonlar | 17 | ~409 | ~%30 |
|
|
389
|
-
| 2 | API Routes | 28 | ~207 | ~%55 |
|
|
390
|
-
| 3 | DB Providers | 10 | ~164 | ~%70 |
|
|
391
|
-
| 4 | React Hooks | 12 | ~126 | ~%80 |
|
|
392
|
-
| 5 | Components | 24 | ~187 | ~%90-92 |
|
|
393
|
-
| 6 | E2E (ayrı metrik) | 7 | ~40 | N/A |
|
|
394
|
-
| **Toplam** | | **110** | **~1,133** | **≥%90 line + ≥%85 branch** |
|
|
395
|
-
|
|
396
|
-
Faz 5 sonrası lcov raporundan kalan uncovered branch'ler tespit edilip ek edge-case testleri yazılarak %95+ hedefine ulaşılır.
|
|
397
|
-
|
|
398
|
-
---
|
|
399
|
-
|
|
400
|
-
## Framework Seçim Gerekçesi
|
|
401
|
-
|
|
402
|
-
| Katman | Araç | Neden |
|
|
403
|
-
|--------|------|-------|
|
|
404
|
-
| Unit/Integration | `bun:test` | Mevcut pattern, sıfır ek bağımlılık, native TS, Jest-uyumlu API, lcov desteği |
|
|
405
|
-
| Component/Hook | `@testing-library/react` + `happy-dom` | React standartı, `renderHook`, Bun ESM uyumlu, jsdom'dan hızlı |
|
|
406
|
-
| E2E | `@playwright/test` | Multi-browser, Next.js App Router desteği, HTML reporter, retries |
|
|
407
|
-
| Coverage | `bun test --coverage` | Built-in lcov reporter → SonarCloud entegrasyonu |
|
|
408
|
-
|
|
409
|
-
---
|
|
410
|
-
|
|
411
|
-
## Doğrulama Planı
|
|
412
|
-
|
|
413
|
-
Her faz sonunda:
|
|
414
|
-
1. `bun test` — tüm testler geçmeli (exit code 0)
|
|
415
|
-
2. `bun test --coverage` — line ve branch coverage eşikler kontrol edilmeli
|
|
416
|
-
3. `bun run lint` — test dosyaları lint'ten geçmeli
|
|
417
|
-
4. `bun run typecheck` — type hatası olmamalı
|
|
418
|
-
5. Faz 6 için: `bunx playwright test` — kritik akışlar %100 pass
|
|
419
|
-
6. CI pipeline'da tüm job'lar başarılı olmalı
|
|
420
|
-
|
|
421
|
-
---
|
|
422
|
-
|
|
423
|
-
## Değiştirilecek Mevcut Dosyalar
|
|
424
|
-
|
|
425
|
-
| Dosya | Değişiklik |
|
|
426
|
-
|-------|-----------|
|
|
427
|
-
| `package.json` | Test script'leri eklenir |
|
|
428
|
-
| `.github/workflows/ci.yml` | `test`, `e2e` job eklenir, `sonarcloud` güncellenir |
|
|
429
|
-
| `sonar-project.properties` | `sonar.tests`, `sonar.test.inclusions`, `sonar.exclusions` düzenlenir |
|
|
430
|
-
|
|
431
|
-
## Oluşturulacak Yeni Dosyalar
|
|
432
|
-
|
|
433
|
-
| Dosya | Amaç |
|
|
434
|
-
|-------|------|
|
|
435
|
-
| `bunfig.toml` | Bun test runner config |
|
|
436
|
-
| `playwright.config.ts` | Playwright E2E config |
|
|
437
|
-
| `tests/setup.ts` | Global test setup |
|
|
438
|
-
| `tests/fixtures/*.ts` (4 dosya) | Mock veri objeleri |
|
|
439
|
-
| `tests/helpers/*.ts` (5 dosya) | Test utility'leri |
|
|
440
|
-
| `tests/unit/**/*.test.ts` (17 dosya) | Unit testler |
|
|
441
|
-
| `tests/api/**/*.test.ts` (28 dosya) | API route testleri |
|
|
442
|
-
| `tests/integration/**/*.test.ts` (8 dosya) | Provider testleri |
|
|
443
|
-
| `tests/hooks/**/*.test.ts` (12 dosya) | Hook testleri |
|
|
444
|
-
| `tests/components/**/*.test.tsx` (24 dosya) | Component testleri |
|
|
445
|
-
| `e2e/**/*.spec.ts` (7 dosya) | E2E testler |
|