@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.
Files changed (688) hide show
  1. package/dist/chunk-34YQUUCM.mjs +319 -0
  2. package/dist/chunk-34YQUUCM.mjs.map +1 -0
  3. package/dist/chunk-4LVB3K53.mjs +37 -0
  4. package/dist/chunk-4LVB3K53.mjs.map +1 -0
  5. package/dist/chunk-6DRZXXNT.mjs +100 -0
  6. package/dist/chunk-6DRZXXNT.mjs.map +1 -0
  7. package/dist/chunk-CZVV3JJB.mjs +160 -0
  8. package/dist/chunk-CZVV3JJB.mjs.map +1 -0
  9. package/dist/chunk-D4WVWWWF.js +332 -0
  10. package/dist/chunk-D4WVWWWF.js.map +1 -0
  11. package/dist/chunk-DY3KXE44.mjs +3 -0
  12. package/dist/chunk-DY3KXE44.mjs.map +1 -0
  13. package/dist/chunk-DZ2UB3C6.mjs +6679 -0
  14. package/dist/chunk-DZ2UB3C6.mjs.map +1 -0
  15. package/dist/chunk-FYSE52VB.js +242 -0
  16. package/dist/chunk-FYSE52VB.js.map +1 -0
  17. package/dist/chunk-G4WYE6TI.js +4 -0
  18. package/dist/chunk-G4WYE6TI.js.map +1 -0
  19. package/dist/chunk-JOGLIOFO.js +1310 -0
  20. package/dist/chunk-JOGLIOFO.js.map +1 -0
  21. package/dist/chunk-JZO5KRZN.js +165 -0
  22. package/dist/chunk-JZO5KRZN.js.map +1 -0
  23. package/dist/chunk-KV356UXJ.js +253 -0
  24. package/dist/chunk-KV356UXJ.js.map +1 -0
  25. package/dist/chunk-PPODO6HX.mjs +237 -0
  26. package/dist/chunk-PPODO6HX.mjs.map +1 -0
  27. package/dist/chunk-PTIRB2JO.js +258 -0
  28. package/dist/chunk-PTIRB2JO.js.map +1 -0
  29. package/dist/chunk-Q6LRDBK7.js +42 -0
  30. package/dist/chunk-Q6LRDBK7.js.map +1 -0
  31. package/dist/chunk-QJP5FZRY.mjs +255 -0
  32. package/dist/chunk-QJP5FZRY.mjs.map +1 -0
  33. package/dist/chunk-R3POCJK6.mjs +248 -0
  34. package/dist/chunk-R3POCJK6.mjs.map +1 -0
  35. package/dist/chunk-RBVDMLFV.js +6747 -0
  36. package/dist/chunk-RBVDMLFV.js.map +1 -0
  37. package/dist/chunk-RCQB4FCE.js +186 -0
  38. package/dist/chunk-RCQB4FCE.js.map +1 -0
  39. package/dist/chunk-SR5DRGBX.mjs +174 -0
  40. package/dist/chunk-SR5DRGBX.mjs.map +1 -0
  41. package/dist/chunk-VLCRUZX7.js +102 -0
  42. package/dist/chunk-VLCRUZX7.js.map +1 -0
  43. package/dist/chunk-VWVRUCQO.mjs +1289 -0
  44. package/dist/chunk-VWVRUCQO.mjs.map +1 -0
  45. package/dist/components.d.mts +273 -0
  46. package/dist/components.d.ts +273 -0
  47. package/dist/components.js +59 -0
  48. package/dist/components.js.map +1 -0
  49. package/dist/components.mjs +6 -0
  50. package/dist/components.mjs.map +1 -0
  51. package/dist/custom-BNDOYC5P.js +134 -0
  52. package/dist/custom-BNDOYC5P.js.map +1 -0
  53. package/dist/custom-S2EKFMP3.mjs +132 -0
  54. package/dist/custom-S2EKFMP3.mjs.map +1 -0
  55. package/dist/gemini-4ASHNK4H.js +81 -0
  56. package/dist/gemini-4ASHNK4H.js.map +1 -0
  57. package/dist/gemini-C5RBLQEJ.mjs +79 -0
  58. package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
  59. package/dist/index.d.mts +6 -0
  60. package/dist/index.d.ts +6 -0
  61. package/dist/index.js +95 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/index.mjs +10 -0
  64. package/dist/index.mjs.map +1 -0
  65. package/dist/mongodb-XMZEZA4A.mjs +748 -0
  66. package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
  67. package/dist/mongodb-YQJJTLX3.js +750 -0
  68. package/dist/mongodb-YQJJTLX3.js.map +1 -0
  69. package/dist/mssql-PMOU4D36.js +916 -0
  70. package/dist/mssql-PMOU4D36.js.map +1 -0
  71. package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
  72. package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
  73. package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
  74. package/dist/mysql-I3WJQXN2.mjs.map +1 -0
  75. package/dist/mysql-Y3MSA5QY.js +833 -0
  76. package/dist/mysql-Y3MSA5QY.js.map +1 -0
  77. package/dist/ollama-26BYLVEV.mjs +115 -0
  78. package/dist/ollama-26BYLVEV.mjs.map +1 -0
  79. package/dist/ollama-HVWAGKQC.js +117 -0
  80. package/dist/ollama-HVWAGKQC.js.map +1 -0
  81. package/dist/openai-4U56KPG7.mjs +111 -0
  82. package/dist/openai-4U56KPG7.mjs.map +1 -0
  83. package/dist/openai-AK3R37BS.js +113 -0
  84. package/dist/openai-AK3R37BS.js.map +1 -0
  85. package/dist/oracle-L6VEAVXO.js +917 -0
  86. package/dist/oracle-L6VEAVXO.js.map +1 -0
  87. package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
  88. package/dist/oracle-P2G7T4P4.mjs.map +1 -0
  89. package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
  90. package/dist/postgres-O5KOQUVP.mjs.map +1 -0
  91. package/dist/postgres-RLCWNFFX.js +971 -0
  92. package/dist/postgres-RLCWNFFX.js.map +1 -0
  93. package/dist/providers.d.mts +149 -0
  94. package/dist/providers.d.ts +149 -0
  95. package/dist/providers.js +44 -0
  96. package/dist/providers.js.map +1 -0
  97. package/dist/providers.mjs +7 -0
  98. package/dist/providers.mjs.map +1 -0
  99. package/dist/redis-4WMQOVLX.mjs +435 -0
  100. package/dist/redis-4WMQOVLX.mjs.map +1 -0
  101. package/dist/redis-QVQ6YU62.js +441 -0
  102. package/dist/redis-QVQ6YU62.js.map +1 -0
  103. package/dist/sqlite-4I2P2OGQ.js +554 -0
  104. package/dist/sqlite-4I2P2OGQ.js.map +1 -0
  105. package/dist/sqlite-OA4YJX5S.mjs +531 -0
  106. package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
  107. package/dist/types-BJvJfxSY.d.mts +141 -0
  108. package/dist/types-BJvJfxSY.d.ts +141 -0
  109. package/dist/types-ClAg_v5k.d.mts +343 -0
  110. package/dist/types-Der_X8E8.d.ts +343 -0
  111. package/dist/types.d.mts +2 -0
  112. package/dist/types.d.ts +2 -0
  113. package/dist/types.js +6 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/types.mjs +3 -0
  116. package/dist/types.mjs.map +1 -0
  117. package/dist/workspace.d.mts +80 -0
  118. package/dist/workspace.d.ts +80 -0
  119. package/dist/workspace.js +4182 -0
  120. package/dist/workspace.js.map +1 -0
  121. package/dist/workspace.mjs +4155 -0
  122. package/dist/workspace.mjs.map +1 -0
  123. package/package.json +60 -5
  124. package/.claude/settings.local.json +0 -127
  125. package/.cursorrules +0 -426
  126. package/.devin/wiki.json +0 -143
  127. package/.dockerignore +0 -80
  128. package/.env.example +0 -159
  129. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
  130. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
  131. package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
  132. package/.github/workflows/ci.yml +0 -185
  133. package/.github/workflows/codeql.yml +0 -57
  134. package/.github/workflows/docker-build-push.yml +0 -118
  135. package/.github/workflows/helm-release.yml +0 -113
  136. package/CLAUDE.md +0 -265
  137. package/CODE_OF_CONDUCT.md +0 -124
  138. package/CONTRIBUTING.md +0 -154
  139. package/Dockerfile +0 -73
  140. package/SECURITY.md +0 -107
  141. package/artifacthub-repo.yml +0 -4
  142. package/bun.lock +0 -1714
  143. package/bunfig.toml +0 -3
  144. package/charts/libredb-studio/.helmignore +0 -11
  145. package/charts/libredb-studio/Chart.lock +0 -6
  146. package/charts/libredb-studio/Chart.yaml +0 -50
  147. package/charts/libredb-studio/README.md +0 -206
  148. package/charts/libredb-studio/templates/NOTES.txt +0 -59
  149. package/charts/libredb-studio/templates/_helpers.tpl +0 -135
  150. package/charts/libredb-studio/templates/configmap.yaml +0 -37
  151. package/charts/libredb-studio/templates/deployment.yaml +0 -184
  152. package/charts/libredb-studio/templates/hpa.yaml +0 -32
  153. package/charts/libredb-studio/templates/ingress.yaml +0 -41
  154. package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
  155. package/charts/libredb-studio/templates/pdb.yaml +0 -18
  156. package/charts/libredb-studio/templates/pvc.yaml +0 -23
  157. package/charts/libredb-studio/templates/secret.yaml +0 -30
  158. package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
  159. package/charts/libredb-studio/templates/service.yaml +0 -22
  160. package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
  161. package/charts/libredb-studio/values.schema.json +0 -246
  162. package/charts/libredb-studio/values.yaml +0 -286
  163. package/components.json +0 -22
  164. package/conductor/code_styleguides/typescript.md +0 -43
  165. package/conductor/product-guidelines.md +0 -43
  166. package/conductor/product.md +0 -3
  167. package/conductor/setup_state.json +0 -1
  168. package/conductor/tech-stack.md +0 -39
  169. package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
  170. package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
  171. package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
  172. package/conductor/tracks.md +0 -8
  173. package/conductor/workflow.md +0 -333
  174. package/database-compose.yml +0 -55
  175. package/docker/postgres-init/01-extensions.sql +0 -10
  176. package/docker/postgres-init/02-sample-data.sql +0 -585
  177. package/docker/postgres.yml +0 -68
  178. package/docker-compose.yml +0 -38
  179. package/docs/AI_PLAN.md +0 -74
  180. package/docs/API_DOCS.md +0 -875
  181. package/docs/ARCHITECTURE.md +0 -218
  182. package/docs/DATABASE_PROVIDERS.md +0 -358
  183. package/docs/FEATURES.md +0 -116
  184. package/docs/HELM_CHART.md +0 -252
  185. package/docs/LOGIN_PAGE.md +0 -178
  186. package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
  187. package/docs/OIDC_ARCH.md +0 -681
  188. package/docs/OIDC_SETUP.md +0 -322
  189. package/docs/POSTGRES_METRICS.md +0 -516
  190. package/docs/QUERY_OPTIMIZATION.md +0 -370
  191. package/docs/SEED_CONNECTIONS.md +0 -468
  192. package/docs/SQL_ALIAS_COMPLETION.md +0 -190
  193. package/docs/STORAGE_ARCHITECTURE.md +0 -565
  194. package/docs/STORAGE_QUICK_SETUP.md +0 -419
  195. package/docs/TECHNICAL_PLAN.md +0 -36
  196. package/docs/THEMING.md +0 -345
  197. package/docs/adding-a-new-database-provider.md +0 -642
  198. package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
  199. package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
  200. package/docs/backlogs/002-DATA_IMPORT.md +0 -215
  201. package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
  202. package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
  203. package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
  204. package/docs/backlogs/006-DATA_MASKING.md +0 -418
  205. package/docs/enterprise-features.md +0 -718
  206. package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
  207. package/docs/medium-koyeb-article-en.md +0 -215
  208. package/docs/plans/test-plans.md +0 -445
  209. package/docs/releases/RELEASE.V0.3.0.md +0 -22
  210. package/docs/releases/RELEASE.V0.4.0.md +0 -154
  211. package/docs/releases/RELEASE.V0.5.0.md +0 -252
  212. package/docs/releases/RELEASE_v0.5.6.md +0 -145
  213. package/docs/releases/RELEASE_v0.6.1.md +0 -303
  214. package/docs/releases/RELEASE_v0.6.7.md +0 -292
  215. package/docs/releases/RELEASE_v0.7.0.md +0 -332
  216. package/docs/releases/RELEASE_v0.8.0.md +0 -521
  217. package/docs/sampledb/titanic.sql +0 -1379
  218. package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
  219. package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
  220. package/e2e/admin-dashboard.spec.ts +0 -64
  221. package/e2e/connection-management.spec.ts +0 -58
  222. package/e2e/export.spec.ts +0 -34
  223. package/e2e/login.spec.ts +0 -85
  224. package/e2e/query-execution.spec.ts +0 -35
  225. package/e2e/tab-management.spec.ts +0 -64
  226. package/eslint.config.mjs +0 -28
  227. package/fly.toml +0 -43
  228. package/next.config.ts +0 -32
  229. package/playwright.config.ts +0 -34
  230. package/postcss.config.mjs +0 -7
  231. package/public/favicon-32x32.png +0 -0
  232. package/public/favicon.ico +0 -0
  233. package/public/file.svg +0 -1
  234. package/public/globe.svg +0 -1
  235. package/public/logo.svg +0 -32
  236. package/public/next.svg +0 -1
  237. package/public/screenshots/code-generator.png +0 -0
  238. package/public/screenshots/connection-modal.png +0 -0
  239. package/public/screenshots/data-profiler.png +0 -0
  240. package/public/screenshots/erd-diagram.png +0 -0
  241. package/public/screenshots/hero-editor.png +0 -0
  242. package/public/screenshots/nl2sql.png +0 -0
  243. package/public/vercel.svg +0 -1
  244. package/public/window.svg +0 -1
  245. package/render.yaml +0 -58
  246. package/scripts/merge-lcov.mjs +0 -239
  247. package/sonar-project.properties +0 -16
  248. package/src/app/admin/error.tsx +0 -46
  249. package/src/app/admin/page.tsx +0 -10
  250. package/src/app/api/admin/audit/route.ts +0 -52
  251. package/src/app/api/admin/fleet-health/route.ts +0 -81
  252. package/src/app/api/ai/autopilot/route.ts +0 -105
  253. package/src/app/api/ai/chat/route.ts +0 -132
  254. package/src/app/api/ai/describe-schema/route.ts +0 -52
  255. package/src/app/api/ai/explain/route.ts +0 -86
  256. package/src/app/api/ai/impact/route.ts +0 -97
  257. package/src/app/api/ai/index-advisor/route.ts +0 -98
  258. package/src/app/api/ai/nl2sql/route.ts +0 -87
  259. package/src/app/api/ai/query-safety/route.ts +0 -87
  260. package/src/app/api/auth/login/route.ts +0 -62
  261. package/src/app/api/auth/logout/route.ts +0 -25
  262. package/src/app/api/auth/me/route.ts +0 -10
  263. package/src/app/api/auth/oidc/callback/route.ts +0 -82
  264. package/src/app/api/auth/oidc/login/route.ts +0 -43
  265. package/src/app/api/connections/managed/route.ts +0 -35
  266. package/src/app/api/db/cancel/route.ts +0 -42
  267. package/src/app/api/db/disconnect/route.ts +0 -28
  268. package/src/app/api/db/health/route.ts +0 -49
  269. package/src/app/api/db/maintenance/route.ts +0 -72
  270. package/src/app/api/db/monitoring/route.ts +0 -62
  271. package/src/app/api/db/multi-query/route.ts +0 -116
  272. package/src/app/api/db/pool-stats/route.ts +0 -37
  273. package/src/app/api/db/profile/route.ts +0 -144
  274. package/src/app/api/db/provider-meta/route.ts +0 -49
  275. package/src/app/api/db/query/route.ts +0 -50
  276. package/src/app/api/db/schema/route.ts +0 -47
  277. package/src/app/api/db/schema-snapshot/route.ts +0 -42
  278. package/src/app/api/db/test-connection/route.ts +0 -55
  279. package/src/app/api/db/transaction/route.ts +0 -111
  280. package/src/app/api/storage/[collection]/route.ts +0 -67
  281. package/src/app/api/storage/config/route.ts +0 -17
  282. package/src/app/api/storage/migrate/route.ts +0 -45
  283. package/src/app/api/storage/route.ts +0 -32
  284. package/src/app/error.tsx +0 -49
  285. package/src/app/global-error.tsx +0 -55
  286. package/src/app/globals.css +0 -146
  287. package/src/app/icon.svg +0 -42
  288. package/src/app/layout.tsx +0 -34
  289. package/src/app/login/login-form.tsx +0 -301
  290. package/src/app/login/page.tsx +0 -11
  291. package/src/app/monitoring/page.tsx +0 -8
  292. package/src/app/not-found.tsx +0 -29
  293. package/src/app/page.tsx +0 -5
  294. package/src/components/AIAutopilotPanel.tsx +0 -238
  295. package/src/components/CodeGenerator.tsx +0 -271
  296. package/src/components/CommandPalette.tsx +0 -227
  297. package/src/components/ConnectionModal.tsx +0 -759
  298. package/src/components/CreateTableModal.tsx +0 -281
  299. package/src/components/DataCharts.tsx +0 -962
  300. package/src/components/DataImportModal.tsx +0 -582
  301. package/src/components/DataProfiler.tsx +0 -335
  302. package/src/components/DatabaseDocs.tsx +0 -251
  303. package/src/components/MaskingSettings.tsx +0 -414
  304. package/src/components/MobileNav.tsx +0 -50
  305. package/src/components/NL2SQLPanel.tsx +0 -281
  306. package/src/components/PivotTable.tsx +0 -257
  307. package/src/components/QueryEditor.tsx +0 -760
  308. package/src/components/QueryHistory.tsx +0 -344
  309. package/src/components/QuerySafetyDialog.tsx +0 -290
  310. package/src/components/ResultsGrid.tsx +0 -644
  311. package/src/components/SaveQueryModal.tsx +0 -104
  312. package/src/components/SavedQueries.tsx +0 -128
  313. package/src/components/SchemaDiagram.tsx +0 -473
  314. package/src/components/SchemaDiff.tsx +0 -473
  315. package/src/components/SnapshotTimeline.tsx +0 -116
  316. package/src/components/Studio.tsx +0 -639
  317. package/src/components/TestDataGenerator.tsx +0 -261
  318. package/src/components/VisualExplain.tsx +0 -820
  319. package/src/components/admin/AdminDashboard.tsx +0 -163
  320. package/src/components/admin/tabs/AuditTab.tsx +0 -531
  321. package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
  322. package/src/components/admin/tabs/OperationsTab.tsx +0 -646
  323. package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
  324. package/src/components/admin/tabs/SecurityTab.tsx +0 -284
  325. package/src/components/community-section.tsx +0 -92
  326. package/src/components/icons/db-icons.tsx +0 -84
  327. package/src/components/libredb-logo.tsx +0 -61
  328. package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
  329. package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
  330. package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
  331. package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
  332. package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
  333. package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
  334. package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
  335. package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
  336. package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
  337. package/src/components/results-grid/ResultCard.tsx +0 -111
  338. package/src/components/results-grid/RowDetailSheet.tsx +0 -178
  339. package/src/components/results-grid/StatsBar.tsx +0 -201
  340. package/src/components/results-grid/index.ts +0 -1
  341. package/src/components/results-grid/utils.ts +0 -23
  342. package/src/components/schema-explorer/ColumnList.tsx +0 -53
  343. package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
  344. package/src/components/schema-explorer/TableItem.tsx +0 -210
  345. package/src/components/schema-explorer/index.ts +0 -1
  346. package/src/components/sidebar/ConnectionItem.tsx +0 -105
  347. package/src/components/sidebar/ConnectionsList.tsx +0 -62
  348. package/src/components/sidebar/Sidebar.tsx +0 -130
  349. package/src/components/sidebar/index.ts +0 -2
  350. package/src/components/studio/BottomPanel.tsx +0 -286
  351. package/src/components/studio/QueryToolbar.tsx +0 -180
  352. package/src/components/studio/StudioDesktopHeader.tsx +0 -114
  353. package/src/components/studio/StudioMobileHeader.tsx +0 -340
  354. package/src/components/studio/StudioTabBar.tsx +0 -82
  355. package/src/components/studio/index.ts +0 -5
  356. package/src/components/ui/accordion.tsx +0 -66
  357. package/src/components/ui/alert-dialog.tsx +0 -157
  358. package/src/components/ui/alert.tsx +0 -66
  359. package/src/components/ui/aspect-ratio.tsx +0 -11
  360. package/src/components/ui/avatar.tsx +0 -53
  361. package/src/components/ui/badge.tsx +0 -46
  362. package/src/components/ui/breadcrumb.tsx +0 -109
  363. package/src/components/ui/button-group.tsx +0 -83
  364. package/src/components/ui/button.tsx +0 -60
  365. package/src/components/ui/calendar.tsx +0 -216
  366. package/src/components/ui/card.tsx +0 -92
  367. package/src/components/ui/carousel.tsx +0 -241
  368. package/src/components/ui/chart.tsx +0 -357
  369. package/src/components/ui/checkbox.tsx +0 -32
  370. package/src/components/ui/collapsible.tsx +0 -33
  371. package/src/components/ui/command.tsx +0 -184
  372. package/src/components/ui/context-menu.tsx +0 -252
  373. package/src/components/ui/dialog.tsx +0 -143
  374. package/src/components/ui/drawer.tsx +0 -135
  375. package/src/components/ui/dropdown-menu.tsx +0 -257
  376. package/src/components/ui/empty.tsx +0 -104
  377. package/src/components/ui/field.tsx +0 -248
  378. package/src/components/ui/form.tsx +0 -167
  379. package/src/components/ui/hover-card.tsx +0 -44
  380. package/src/components/ui/input-group.tsx +0 -170
  381. package/src/components/ui/input-otp.tsx +0 -77
  382. package/src/components/ui/input.tsx +0 -21
  383. package/src/components/ui/item.tsx +0 -193
  384. package/src/components/ui/kbd.tsx +0 -28
  385. package/src/components/ui/label.tsx +0 -24
  386. package/src/components/ui/menubar.tsx +0 -276
  387. package/src/components/ui/navigation-menu.tsx +0 -168
  388. package/src/components/ui/pagination.tsx +0 -127
  389. package/src/components/ui/popover.tsx +0 -48
  390. package/src/components/ui/progress.tsx +0 -31
  391. package/src/components/ui/radio-group.tsx +0 -45
  392. package/src/components/ui/resizable.tsx +0 -56
  393. package/src/components/ui/scroll-area.tsx +0 -58
  394. package/src/components/ui/select.tsx +0 -187
  395. package/src/components/ui/separator.tsx +0 -28
  396. package/src/components/ui/sheet.tsx +0 -139
  397. package/src/components/ui/sidebar.tsx +0 -726
  398. package/src/components/ui/skeleton.tsx +0 -13
  399. package/src/components/ui/slider.tsx +0 -63
  400. package/src/components/ui/sonner.tsx +0 -40
  401. package/src/components/ui/spinner.tsx +0 -16
  402. package/src/components/ui/switch.tsx +0 -31
  403. package/src/components/ui/table.tsx +0 -116
  404. package/src/components/ui/tabs.tsx +0 -66
  405. package/src/components/ui/textarea.tsx +0 -18
  406. package/src/components/ui/toggle-group.tsx +0 -83
  407. package/src/components/ui/toggle.tsx +0 -47
  408. package/src/components/ui/tooltip.tsx +0 -61
  409. package/src/exports/components.ts +0 -15
  410. package/src/exports/index.ts +0 -4
  411. package/src/exports/providers.ts +0 -4
  412. package/src/exports/types.ts +0 -26
  413. package/src/hooks/use-ai-chat.ts +0 -182
  414. package/src/hooks/use-all-connections.ts +0 -66
  415. package/src/hooks/use-api-call.ts +0 -71
  416. package/src/hooks/use-auth.ts +0 -51
  417. package/src/hooks/use-connection-form.ts +0 -349
  418. package/src/hooks/use-connection-manager.ts +0 -169
  419. package/src/hooks/use-connection-payload.ts +0 -15
  420. package/src/hooks/use-inline-editing.ts +0 -109
  421. package/src/hooks/use-mobile.ts +0 -20
  422. package/src/hooks/use-monitoring-data.ts +0 -270
  423. package/src/hooks/use-provider-metadata.ts +0 -62
  424. package/src/hooks/use-query-execution.ts +0 -478
  425. package/src/hooks/use-storage-sync.ts +0 -259
  426. package/src/hooks/use-tab-manager.ts +0 -231
  427. package/src/hooks/use-toast.ts +0 -20
  428. package/src/hooks/use-transaction-control.ts +0 -64
  429. package/src/lib/api/error-codes.ts +0 -30
  430. package/src/lib/api/errors.ts +0 -236
  431. package/src/lib/api/with-error-handler.ts +0 -41
  432. package/src/lib/audit.ts +0 -105
  433. package/src/lib/auth.ts +0 -87
  434. package/src/lib/connection-string-parser.ts +0 -172
  435. package/src/lib/data-masking.ts +0 -385
  436. package/src/lib/db/base-provider.ts +0 -325
  437. package/src/lib/db/errors.ts +0 -317
  438. package/src/lib/db/factory.ts +0 -324
  439. package/src/lib/db/index.ts +0 -123
  440. package/src/lib/db/providers/document/index.ts +0 -6
  441. package/src/lib/db/providers/document/mongodb.ts +0 -992
  442. package/src/lib/db/providers/keyvalue/redis.ts +0 -554
  443. package/src/lib/db/providers/sql/index.ts +0 -11
  444. package/src/lib/db/providers/sql/sql-base.ts +0 -174
  445. package/src/lib/db/providers/sql/sqlite.ts +0 -721
  446. package/src/lib/db/types.ts +0 -437
  447. package/src/lib/db/utils/pool-manager.ts +0 -287
  448. package/src/lib/db/utils/query-limiter.ts +0 -239
  449. package/src/lib/db-ui-config.ts +0 -86
  450. package/src/lib/editor/mongodb-completions.ts +0 -172
  451. package/src/lib/editor/sql-completions.ts +0 -280
  452. package/src/lib/llm/base-provider.ts +0 -117
  453. package/src/lib/llm/factory.ts +0 -102
  454. package/src/lib/llm/index.ts +0 -90
  455. package/src/lib/llm/providers/custom.ts +0 -181
  456. package/src/lib/llm/providers/gemini.ts +0 -126
  457. package/src/lib/llm/providers/ollama.ts +0 -154
  458. package/src/lib/llm/providers/openai.ts +0 -146
  459. package/src/lib/llm/types.ts +0 -173
  460. package/src/lib/llm/utils/config.ts +0 -187
  461. package/src/lib/llm/utils/retry.ts +0 -119
  462. package/src/lib/llm/utils/streaming.ts +0 -202
  463. package/src/lib/logger.ts +0 -127
  464. package/src/lib/monitoring-thresholds.ts +0 -44
  465. package/src/lib/oidc.ts +0 -262
  466. package/src/lib/query-generators.ts +0 -61
  467. package/src/lib/schema-diff/diff-engine.ts +0 -273
  468. package/src/lib/schema-diff/migration-generator.ts +0 -208
  469. package/src/lib/schema-diff/types.ts +0 -55
  470. package/src/lib/seed/config-loader.ts +0 -79
  471. package/src/lib/seed/connection-filter.ts +0 -49
  472. package/src/lib/seed/credential-resolver.ts +0 -62
  473. package/src/lib/seed/index.ts +0 -40
  474. package/src/lib/seed/resolve-connection.ts +0 -57
  475. package/src/lib/seed/types.ts +0 -69
  476. package/src/lib/sql/alias-extractor.ts +0 -267
  477. package/src/lib/sql/index.ts +0 -8
  478. package/src/lib/sql/statement-splitter.ts +0 -167
  479. package/src/lib/sql/types.ts +0 -40
  480. package/src/lib/ssh/tunnel.ts +0 -142
  481. package/src/lib/storage/factory.ts +0 -84
  482. package/src/lib/storage/index.ts +0 -14
  483. package/src/lib/storage/local-storage.ts +0 -99
  484. package/src/lib/storage/providers/postgres.ts +0 -225
  485. package/src/lib/storage/providers/sqlite.ts +0 -153
  486. package/src/lib/storage/storage-facade.ts +0 -272
  487. package/src/lib/storage/types.ts +0 -75
  488. package/src/lib/time-series-buffer.ts +0 -58
  489. package/src/lib/types.ts +0 -173
  490. package/src/lib/utils.ts +0 -6
  491. package/src/proxy.ts +0 -104
  492. package/src/types/db-drivers.d.ts +0 -23
  493. package/src/types/html2canvas.d.ts +0 -9
  494. package/tests/api/admin/audit.test.ts +0 -178
  495. package/tests/api/admin/fleet-health.test.ts +0 -183
  496. package/tests/api/ai/autopilot.test.ts +0 -174
  497. package/tests/api/ai/chat.test.ts +0 -250
  498. package/tests/api/ai/describe-schema.test.ts +0 -266
  499. package/tests/api/ai/explain.test.ts +0 -199
  500. package/tests/api/ai/impact.test.ts +0 -168
  501. package/tests/api/ai/index-advisor.test.ts +0 -171
  502. package/tests/api/ai/nl2sql.test.ts +0 -202
  503. package/tests/api/ai/query-safety.test.ts +0 -196
  504. package/tests/api/auth/login.test.ts +0 -170
  505. package/tests/api/auth/logout.test.ts +0 -140
  506. package/tests/api/auth/me.test.ts +0 -73
  507. package/tests/api/auth/oidc-callback.test.ts +0 -215
  508. package/tests/api/auth/oidc-login.test.ts +0 -127
  509. package/tests/api/db/cancel.test.ts +0 -198
  510. package/tests/api/db/disconnect.test.ts +0 -124
  511. package/tests/api/db/health.test.ts +0 -222
  512. package/tests/api/db/maintenance.test.ts +0 -263
  513. package/tests/api/db/monitoring.test.ts +0 -221
  514. package/tests/api/db/multi-query.test.ts +0 -316
  515. package/tests/api/db/pool-stats.test.ts +0 -135
  516. package/tests/api/db/profile.test.ts +0 -330
  517. package/tests/api/db/provider-meta.test.ts +0 -193
  518. package/tests/api/db/query.test.ts +0 -314
  519. package/tests/api/db/schema-snapshot.test.ts +0 -170
  520. package/tests/api/db/schema.test.ts +0 -191
  521. package/tests/api/db/test-connection.test.ts +0 -185
  522. package/tests/api/db/transaction.test.ts +0 -314
  523. package/tests/api/proxy.test.ts +0 -191
  524. package/tests/api/seed/managed-route.test.ts +0 -113
  525. package/tests/api/storage/config.test.ts +0 -42
  526. package/tests/api/storage/storage-routes.test.ts +0 -309
  527. package/tests/components/AIAutopilotPanel.test.tsx +0 -756
  528. package/tests/components/AdminPage.test.tsx +0 -33
  529. package/tests/components/CodeGenerator.test.tsx +0 -182
  530. package/tests/components/CommandPalette.test.tsx +0 -428
  531. package/tests/components/CommunitySection.test.tsx +0 -91
  532. package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
  533. package/tests/components/ConnectionModal.test.tsx +0 -570
  534. package/tests/components/CreateTableModal.test.tsx +0 -383
  535. package/tests/components/DataCharts.test.tsx +0 -739
  536. package/tests/components/DataImportModal.test.tsx +0 -751
  537. package/tests/components/DataProfiler.test.tsx +0 -589
  538. package/tests/components/DatabaseDocs.test.tsx +0 -353
  539. package/tests/components/LoginPage.test.tsx +0 -163
  540. package/tests/components/LoginPageOIDC.test.tsx +0 -92
  541. package/tests/components/MaskingSettings.test.tsx +0 -498
  542. package/tests/components/MobileNav.test.tsx +0 -30
  543. package/tests/components/MonitoringPage.test.tsx +0 -32
  544. package/tests/components/NL2SQLPanel.test.tsx +0 -621
  545. package/tests/components/Page.test.tsx +0 -33
  546. package/tests/components/PivotTable.test.tsx +0 -350
  547. package/tests/components/QueryEditor.test.tsx +0 -1730
  548. package/tests/components/QueryHistory.test.tsx +0 -572
  549. package/tests/components/QuerySafetyDialog.test.tsx +0 -586
  550. package/tests/components/ResultsGrid.test.tsx +0 -804
  551. package/tests/components/RootLayout.test.tsx +0 -83
  552. package/tests/components/SaveQueryModal.test.tsx +0 -25
  553. package/tests/components/SavedQueries.test.tsx +0 -43
  554. package/tests/components/SchemaDiagram.test.tsx +0 -1034
  555. package/tests/components/SchemaDiff.test.tsx +0 -906
  556. package/tests/components/SnapshotTimeline.test.tsx +0 -174
  557. package/tests/components/Studio.test.tsx +0 -1030
  558. package/tests/components/TestDataGenerator.test.tsx +0 -291
  559. package/tests/components/VisualExplain.test.tsx +0 -704
  560. package/tests/components/admin/AdminDashboard.test.tsx +0 -205
  561. package/tests/components/admin/AuditTab.test.tsx +0 -220
  562. package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
  563. package/tests/components/admin/OperationsTab.test.tsx +0 -975
  564. package/tests/components/admin/OverviewTab.test.tsx +0 -254
  565. package/tests/components/admin/SecurityTab.test.tsx +0 -467
  566. package/tests/components/monitoring/MetricChart.test.tsx +0 -111
  567. package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
  568. package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
  569. package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
  570. package/tests/components/monitoring/PoolTab.test.tsx +0 -42
  571. package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
  572. package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
  573. package/tests/components/monitoring/StorageTab.test.tsx +0 -127
  574. package/tests/components/monitoring/TablesTab.test.tsx +0 -153
  575. package/tests/components/results-grid/ResultCard.test.tsx +0 -105
  576. package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
  577. package/tests/components/results-grid/StatsBar.test.tsx +0 -162
  578. package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
  579. package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
  580. package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
  581. package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
  582. package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
  583. package/tests/components/sidebar/Sidebar.test.tsx +0 -187
  584. package/tests/components/studio/BottomPanel.test.tsx +0 -383
  585. package/tests/components/studio/QueryToolbar.test.tsx +0 -321
  586. package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
  587. package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
  588. package/tests/components/studio/StudioTabBar.test.tsx +0 -331
  589. package/tests/fixtures/connections.ts +0 -96
  590. package/tests/fixtures/masking-configs.ts +0 -86
  591. package/tests/fixtures/query-results.ts +0 -71
  592. package/tests/fixtures/schemas.ts +0 -64
  593. package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
  594. package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
  595. package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
  596. package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
  597. package/tests/fixtures/seed-connections/valid-config.json +0 -15
  598. package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
  599. package/tests/helpers/mock-fetch.ts +0 -59
  600. package/tests/helpers/mock-monaco.ts +0 -112
  601. package/tests/helpers/mock-navigation.ts +0 -28
  602. package/tests/helpers/mock-next.ts +0 -80
  603. package/tests/helpers/mock-provider.ts +0 -133
  604. package/tests/helpers/mock-sonner.ts +0 -29
  605. package/tests/helpers/render-with-providers.tsx +0 -19
  606. package/tests/hooks/use-ai-chat.test.ts +0 -600
  607. package/tests/hooks/use-auth.test.ts +0 -371
  608. package/tests/hooks/use-connection-form.test.ts +0 -743
  609. package/tests/hooks/use-connection-manager.test.ts +0 -466
  610. package/tests/hooks/use-inline-editing.test.ts +0 -321
  611. package/tests/hooks/use-mobile.test.ts +0 -177
  612. package/tests/hooks/use-monitoring-data.test.ts +0 -819
  613. package/tests/hooks/use-provider-metadata.test.ts +0 -228
  614. package/tests/hooks/use-query-execution.test.ts +0 -1212
  615. package/tests/hooks/use-tab-manager.test.ts +0 -756
  616. package/tests/hooks/use-toast.test.ts +0 -74
  617. package/tests/hooks/use-transaction-control.test.ts +0 -211
  618. package/tests/integration/db/mongodb-provider.test.ts +0 -698
  619. package/tests/integration/db/mssql-provider.test.ts +0 -840
  620. package/tests/integration/db/mysql-provider.test.ts +0 -872
  621. package/tests/integration/db/oracle-provider.test.ts +0 -843
  622. package/tests/integration/db/postgres-provider.test.ts +0 -1382
  623. package/tests/integration/db/redis-provider.test.ts +0 -526
  624. package/tests/integration/db/sqlite-provider.test.ts +0 -480
  625. package/tests/integration/seed/seed-pipeline.test.ts +0 -102
  626. package/tests/isolated/factory-singleton.test.ts +0 -150
  627. package/tests/isolated/use-storage-sync.test.ts +0 -389
  628. package/tests/run-components.sh +0 -196
  629. package/tests/setup-dom.ts +0 -58
  630. package/tests/setup.ts +0 -40
  631. package/tests/unit/api-errors.test.ts +0 -210
  632. package/tests/unit/code-generator-functions.test.ts +0 -271
  633. package/tests/unit/components/column-list.test.tsx +0 -190
  634. package/tests/unit/components/data-import-modal.test.tsx +0 -441
  635. package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
  636. package/tests/unit/data-charts-functions.test.ts +0 -496
  637. package/tests/unit/data-import-functions.test.ts +0 -320
  638. package/tests/unit/data-import-utils.test.ts +0 -125
  639. package/tests/unit/db/base-provider.test.ts +0 -517
  640. package/tests/unit/db/errors.test.ts +0 -403
  641. package/tests/unit/db/factory.test.ts +0 -436
  642. package/tests/unit/db/pool-manager.test.ts +0 -440
  643. package/tests/unit/db/query-limiter.test.ts +0 -387
  644. package/tests/unit/db/sql-base.test.ts +0 -438
  645. package/tests/unit/lib/api/error-codes.test.ts +0 -39
  646. package/tests/unit/lib/audit.test.ts +0 -326
  647. package/tests/unit/lib/auth.test.ts +0 -146
  648. package/tests/unit/lib/connection-string-parser.test.ts +0 -424
  649. package/tests/unit/lib/data-masking.test.ts +0 -583
  650. package/tests/unit/lib/db-icons.test.tsx +0 -41
  651. package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
  652. package/tests/unit/lib/oidc.test.ts +0 -509
  653. package/tests/unit/lib/query-generators.test.ts +0 -127
  654. package/tests/unit/lib/storage/factory.test.ts +0 -71
  655. package/tests/unit/lib/storage/local-storage.test.ts +0 -114
  656. package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
  657. package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
  658. package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
  659. package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
  660. package/tests/unit/lib/storage.test.ts +0 -317
  661. package/tests/unit/lib/time-series-buffer.test.ts +0 -212
  662. package/tests/unit/lib/utils.test.ts +0 -24
  663. package/tests/unit/llm/base-provider.test.ts +0 -238
  664. package/tests/unit/llm/config.test.ts +0 -262
  665. package/tests/unit/llm/custom-provider.test.ts +0 -281
  666. package/tests/unit/llm/gemini-provider.test.ts +0 -248
  667. package/tests/unit/llm/llm-factory.test.ts +0 -155
  668. package/tests/unit/llm/ollama-provider.test.ts +0 -288
  669. package/tests/unit/llm/openai-provider.test.ts +0 -324
  670. package/tests/unit/llm/retry.test.ts +0 -180
  671. package/tests/unit/llm/streaming.test.ts +0 -355
  672. package/tests/unit/logger.test.ts +0 -198
  673. package/tests/unit/mongodb-completions.test.ts +0 -516
  674. package/tests/unit/pivot-table-functions.test.ts +0 -76
  675. package/tests/unit/query-cancelled-error.test.ts +0 -81
  676. package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
  677. package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
  678. package/tests/unit/seed/config-loader.test.ts +0 -73
  679. package/tests/unit/seed/connection-filter.test.ts +0 -91
  680. package/tests/unit/seed/credential-resolver.test.ts +0 -85
  681. package/tests/unit/seed/index.test.ts +0 -72
  682. package/tests/unit/seed/resolve-connection.test.ts +0 -74
  683. package/tests/unit/seed/types.test.ts +0 -129
  684. package/tests/unit/sql/alias-extractor.test.ts +0 -444
  685. package/tests/unit/sql/statement-splitter.test.ts +0 -348
  686. package/tests/unit/sql-completions.test.ts +0 -463
  687. package/tests/unit/ssh-tunnel.test.ts +0 -465
  688. 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)
@@ -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 |