db-studio 1.24.1 → 2.0.1

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 (275) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +4 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/web-dist/assets/_pathlessLayout-aKKQKRJX.js +1 -0
  5. package/dist/web-dist/assets/_pathlessLayout-s6cwJxH6.js +2 -0
  6. package/dist/web-dist/assets/_queryId-DnPgn-AJ.js +1 -0
  7. package/dist/web-dist/assets/_table-Bgt0zJ9m.js +1 -0
  8. package/dist/web-dist/assets/_table-CU8PHZQE.js +1 -0
  9. package/dist/web-dist/assets/_table-DIbpzW3q.js +1 -0
  10. package/dist/web-dist/assets/abap-DQayJW6v.js +1 -0
  11. package/dist/web-dist/assets/apex-Djzlm7in.js +1 -0
  12. package/dist/web-dist/assets/azcli-Bbikkqe4.js +1 -0
  13. package/dist/web-dist/assets/badge-HtbO9hWg.js +1 -0
  14. package/dist/web-dist/assets/bat-BUFda2RT.js +1 -0
  15. package/dist/web-dist/assets/{bicep-DR-9-QmA.js → bicep-CuUgDHWX.js} +1 -1
  16. package/dist/web-dist/assets/browser-B6gU7HWo.js +1 -0
  17. package/dist/web-dist/assets/bundle-mjs-DEMZsBkP.js +1 -0
  18. package/dist/web-dist/assets/cameligo-DITobApP.js +1 -0
  19. package/dist/web-dist/assets/{chat-sidebar-BX995Yr1.js → chat-sidebar-Cr2fVFDF.js} +6 -6
  20. package/dist/web-dist/assets/clojure-DTFcSI8F.js +1 -0
  21. package/dist/web-dist/assets/{code-editor-DLaMoTPg.js → code-editor-BpsclD2u.js} +1 -1
  22. package/dist/web-dist/assets/coffee-CmIRg0oP.js +1 -0
  23. package/dist/web-dist/assets/connect-BM4hZPnz.js +1 -0
  24. package/dist/web-dist/assets/{constants-CK9YDygv.js → constants-BBxXyYPa.js} +3 -3
  25. package/dist/web-dist/assets/cpp-BwBWpZT1.js +1 -0
  26. package/dist/web-dist/assets/csharp-BnWK75m3.js +1 -0
  27. package/dist/web-dist/assets/csp-Dohj3XYI.js +1 -0
  28. package/dist/web-dist/assets/{css-BdpC37eA.js → css-DN4GbnxY.js} +1 -1
  29. package/dist/web-dist/assets/cssMode-CiAtMuTk.js +1 -0
  30. package/dist/web-dist/assets/cypher-CKAK8eD4.js +1 -0
  31. package/dist/web-dist/assets/dart-imWXBTLy.js +1 -0
  32. package/dist/web-dist/assets/database.store-73Wsz2L5.js +57 -0
  33. package/dist/web-dist/assets/dist-D4HUXaJv.js +1 -0
  34. package/dist/web-dist/assets/{dist-BW-TarB3.js → dist-DwRWhVwY.js} +1 -1
  35. package/dist/web-dist/assets/dockerfile-CXOK4zpC.js +1 -0
  36. package/dist/web-dist/assets/ecl-lOrW9o9k.js +1 -0
  37. package/dist/web-dist/assets/{editor.api-C3XWCrXI.js → editor.api-DSevzNN8.js} +1 -1
  38. package/dist/web-dist/assets/elixir-DgvzEwPU.js +1 -0
  39. package/dist/web-dist/assets/{esm-DvtsWsZW.js → esm-DC8GK2En.js} +1 -1
  40. package/dist/web-dist/assets/flow9-l3BJy5NQ.js +1 -0
  41. package/dist/web-dist/assets/format-cell-value-CuhjnBNV.js +1 -0
  42. package/dist/web-dist/assets/{freemarker2-CVTLPKvC.js → freemarker2-73G2DeCz.js} +1 -1
  43. package/dist/web-dist/assets/fsharp-sfou20I_.js +1 -0
  44. package/dist/web-dist/assets/go-DnjkNg4Q.js +1 -0
  45. package/dist/web-dist/assets/graphql-BJFXvNDL.js +1 -0
  46. package/dist/web-dist/assets/handlebars-DXg2L0KG.js +1 -0
  47. package/dist/web-dist/assets/hcl-B4FYtDde.js +1 -0
  48. package/dist/web-dist/assets/highlighted-body-OFNGDK62-Bi4CQl8I.js +1 -0
  49. package/dist/web-dist/assets/html-BvAUQUXw.js +1 -0
  50. package/dist/web-dist/assets/htmlMode-hZ3EloXT.js +1 -0
  51. package/dist/web-dist/assets/icons-CheF8KGp.js +1 -0
  52. package/dist/web-dist/assets/index-YCx2RIFq.js +34 -0
  53. package/dist/web-dist/assets/index-mbFBVmHb.css +2 -0
  54. package/dist/web-dist/assets/indexes-BYqaS45O.js +1 -0
  55. package/dist/web-dist/assets/ini-H3EW14Oa.js +1 -0
  56. package/dist/web-dist/assets/java-Cu5qHMXc.js +1 -0
  57. package/dist/web-dist/assets/javascript-bJHYh6Or.js +1 -0
  58. package/dist/web-dist/assets/json-editor-ZcSS1MRc.js +1 -0
  59. package/dist/web-dist/assets/{jsonMode-CyOYWfPp.js → jsonMode-CDMOUPss.js} +1 -1
  60. package/dist/web-dist/assets/julia-CZ0npMib.js +1 -0
  61. package/dist/web-dist/assets/keys-By5o7bPm.js +1 -0
  62. package/dist/web-dist/assets/kotlin-BpW0qHIt.js +1 -0
  63. package/dist/web-dist/assets/label-C93T1BbF.js +1 -0
  64. package/dist/web-dist/assets/less-DTBM-Kxp.js +2 -0
  65. package/dist/web-dist/assets/lexon-CLOvNp8v.js +1 -0
  66. package/dist/web-dist/assets/liquid-IpfBCIUY.js +1 -0
  67. package/dist/web-dist/assets/logs-CnLvqVtL.js +1 -0
  68. package/dist/web-dist/assets/lspLanguageFeatures-CnYZSn_O.js +4 -0
  69. package/dist/web-dist/assets/lua-BERpVknn.js +1 -0
  70. package/dist/web-dist/assets/m3-B_gILjHh.js +1 -0
  71. package/dist/web-dist/assets/markdown-DamaZSqy.js +1 -0
  72. package/dist/web-dist/assets/mdx-BTw_ghf-.js +1 -0
  73. package/dist/web-dist/assets/mermaid-GHXKKRXX-B7fOqMvZ.js +1 -0
  74. package/dist/web-dist/assets/middleware-DKaxoFZs.js +1 -0
  75. package/dist/web-dist/assets/mips-BkjI-_01.js +1 -0
  76. package/dist/web-dist/assets/module-BbdCXsK0.js +2 -0
  77. package/dist/web-dist/assets/{monaco-theme-tSfqYsPo.js → monaco-theme-DkPj5STI.js} +4 -4
  78. package/dist/web-dist/assets/msdax-5OSOIuww.js +1 -0
  79. package/dist/web-dist/assets/mysql-CMtxQW5J.js +1 -0
  80. package/dist/web-dist/assets/objective-c-CoW52So-.js +1 -0
  81. package/dist/web-dist/assets/overlay.store-BL-3zX6X.js +1 -0
  82. package/dist/web-dist/assets/pascal-BxyU4sPJ.js +1 -0
  83. package/dist/web-dist/assets/pascaligo-C63_040U.js +1 -0
  84. package/dist/web-dist/assets/perl-ayfptt23.js +1 -0
  85. package/dist/web-dist/assets/personal-preferences.store-BIr71Re8.js +1 -0
  86. package/dist/web-dist/assets/pgsql-CPGqMVI3.js +1 -0
  87. package/dist/web-dist/assets/php-DA-YJ6wI.js +1 -0
  88. package/dist/web-dist/assets/pla-DesDCKWW.js +1 -0
  89. package/dist/web-dist/assets/postiats-B8yhii_n.js +1 -0
  90. package/dist/web-dist/assets/powerquery-CG8tCOct.js +1 -0
  91. package/dist/web-dist/assets/powershell-C68aZHza.js +1 -0
  92. package/dist/web-dist/assets/preload-helper-DZhPwQp1.js +1 -0
  93. package/dist/web-dist/assets/{protobuf-DvBD3fs_.js → protobuf-OaVxpJrs.js} +1 -1
  94. package/dist/web-dist/assets/pug-0lOSC2rA.js +1 -0
  95. package/dist/web-dist/assets/python-C8ab8TeJ.js +1 -0
  96. package/dist/web-dist/assets/qsharp-BmHeDwNl.js +1 -0
  97. package/dist/web-dist/assets/queries.store-Dwdw-Gej.js +1 -0
  98. package/dist/web-dist/assets/{query-runner-C0YRZT1P.js → query-runner-C430BH5I.js} +5 -5
  99. package/dist/web-dist/assets/r-DoHxhOJg.js +1 -0
  100. package/dist/web-dist/assets/radix-ui-ByvuE8TW.js +51 -0
  101. package/dist/web-dist/assets/razor-DynaHCXX.js +1 -0
  102. package/dist/web-dist/assets/react-CKF1H7h0.js +1 -0
  103. package/dist/web-dist/assets/{react-dom-B0mgdSUa.js → react-dom-DQQG0g0D.js} +1 -1
  104. package/dist/web-dist/assets/redis-CSL-jfR-.js +1 -0
  105. package/dist/web-dist/assets/redis-value-Bf0tOet0.js +1 -0
  106. package/dist/web-dist/assets/redshift-Cb-LWZ8f.js +1 -0
  107. package/dist/web-dist/assets/restructuredtext-DTqnvYsu.js +1 -0
  108. package/dist/web-dist/assets/rolldown-runtime-0wqQW3ea.js +1 -0
  109. package/dist/web-dist/assets/ruby-DbgDuslH.js +1 -0
  110. package/dist/web-dist/assets/runner-DFzqBXp0.js +1 -0
  111. package/dist/web-dist/assets/rust-CWzrsIL_.js +1 -0
  112. package/dist/web-dist/assets/sb-BghszYt-.js +1 -0
  113. package/dist/web-dist/assets/scala-Cw9RU1Qz.js +1 -0
  114. package/dist/web-dist/assets/schema-B_EtHxTf.js +1 -0
  115. package/dist/web-dist/assets/schema-iTfBKwXl.js +1 -0
  116. package/dist/web-dist/assets/scheme-DeYmvmAH.js +1 -0
  117. package/dist/web-dist/assets/{scss-bqQKlHUB.js → scss-D_S6B2H1.js} +1 -1
  118. package/dist/web-dist/assets/select-DU0HoKZ4.js +1 -0
  119. package/dist/web-dist/assets/separator-CZgXYjVQ.js +1 -0
  120. package/dist/web-dist/assets/sheet-sidebar-KvxY47ZZ.js +1 -0
  121. package/dist/web-dist/assets/shell-B59ItoUV.js +1 -0
  122. package/dist/web-dist/assets/solidity-De0h6YhL.js +1 -0
  123. package/dist/web-dist/assets/sophia-DWmKHYE0.js +1 -0
  124. package/dist/web-dist/assets/sparql-0sKQlAae.js +1 -0
  125. package/dist/web-dist/assets/spinner-FJ-tXoFX.js +1 -0
  126. package/dist/web-dist/assets/sql-Cafrv7gm.js +1 -0
  127. package/dist/web-dist/assets/st-qkFqcB41.js +1 -0
  128. package/dist/web-dist/assets/swift-CDPKFfVs.js +1 -0
  129. package/dist/web-dist/assets/systemverilog-rjtBmhAJ.js +1 -0
  130. package/dist/web-dist/assets/table-DmoKTp5U.js +1 -0
  131. package/dist/web-dist/assets/tables-By-PTDwU.js +13 -0
  132. package/dist/web-dist/assets/{tanstack-B9dfs2ya.js → tanstack-Cb7WFPRi.js} +1 -1
  133. package/dist/web-dist/assets/tcl-C0NrUCCP.js +1 -0
  134. package/dist/web-dist/assets/{tsMode-C7nq1NR4.js → tsMode-C2yuf0pi.js} +1 -1
  135. package/dist/web-dist/assets/twig-RBrBABOf.js +1 -0
  136. package/dist/web-dist/assets/typescript-DWkZjHjp.js +1 -0
  137. package/dist/web-dist/assets/typespec-DfQiGud4.js +1 -0
  138. package/dist/web-dist/assets/use-database-engine-Mwmv8X7V.js +1 -0
  139. package/dist/web-dist/assets/use-theme-BLw5dtZV.js +1 -0
  140. package/dist/web-dist/assets/utils-awMbhLwX.js +1 -0
  141. package/dist/web-dist/assets/vb-BslxQW9i.js +1 -0
  142. package/dist/web-dist/assets/visualizer-LoD_yU5U.js +1 -0
  143. package/dist/web-dist/assets/vscode-Ba8jYSS7.js +1 -0
  144. package/dist/web-dist/assets/{wgsl-DmW6KOpe.js → wgsl-Bq67ZIFU.js} +1 -1
  145. package/dist/web-dist/assets/workers-rMl5Xrk2.js +1 -0
  146. package/dist/web-dist/assets/xml-PfDqoe6w.js +1 -0
  147. package/dist/web-dist/assets/yaml-CIuY3cB5.js +1 -0
  148. package/dist/web-dist/index.html +31 -31
  149. package/package.json +2 -3
  150. package/dist/web-dist/assets/_pathlessLayout-BdGKkBoI.js +0 -2
  151. package/dist/web-dist/assets/_pathlessLayout-DR0xmAEe.js +0 -1
  152. package/dist/web-dist/assets/_queryId-B366cOMu.js +0 -1
  153. package/dist/web-dist/assets/_table--08cFUXm.js +0 -1
  154. package/dist/web-dist/assets/_table-BUhoKmyX.js +0 -1
  155. package/dist/web-dist/assets/_table-MYNamF30.js +0 -1
  156. package/dist/web-dist/assets/abap-Cr3Wj4u-.js +0 -1
  157. package/dist/web-dist/assets/apex-CkolLxTe.js +0 -1
  158. package/dist/web-dist/assets/azcli-EQzWRQuF.js +0 -1
  159. package/dist/web-dist/assets/badge-DDylQPR6.js +0 -1
  160. package/dist/web-dist/assets/bat-Lmimo2RD.js +0 -1
  161. package/dist/web-dist/assets/browser-BSPQwshU.js +0 -1
  162. package/dist/web-dist/assets/bundle-mjs-CkOje67l.js +0 -1
  163. package/dist/web-dist/assets/cameligo-BD_SJlqP.js +0 -1
  164. package/dist/web-dist/assets/clojure-CR2FIkS9.js +0 -1
  165. package/dist/web-dist/assets/coffee-_RMK1-Uq.js +0 -1
  166. package/dist/web-dist/assets/connect-Db8e3ev_.js +0 -1
  167. package/dist/web-dist/assets/cpp-Dkqi_fZY.js +0 -1
  168. package/dist/web-dist/assets/csharp-82U4022-.js +0 -1
  169. package/dist/web-dist/assets/csp-BGvk2oOh.js +0 -1
  170. package/dist/web-dist/assets/cssMode-B3Jx5dyf.js +0 -1
  171. package/dist/web-dist/assets/cypher-BK9DaNjE.js +0 -1
  172. package/dist/web-dist/assets/dart-BPjrsICI.js +0 -1
  173. package/dist/web-dist/assets/database.store-COTWzU5x.js +0 -57
  174. package/dist/web-dist/assets/dist-BbTrC9ET.js +0 -1
  175. package/dist/web-dist/assets/dockerfile-CNJRHICn.js +0 -1
  176. package/dist/web-dist/assets/ecl-BnT5zX3_.js +0 -1
  177. package/dist/web-dist/assets/elixir-1M4R8B5k.js +0 -1
  178. package/dist/web-dist/assets/flow9-CxVom3E4.js +0 -1
  179. package/dist/web-dist/assets/format-cell-value-DeIyb5qF.js +0 -1
  180. package/dist/web-dist/assets/fsharp-CU6NZgCg.js +0 -1
  181. package/dist/web-dist/assets/go-Cet0LxBY.js +0 -1
  182. package/dist/web-dist/assets/graphql-BRqDg70d.js +0 -1
  183. package/dist/web-dist/assets/handlebars-xtUVXWSH.js +0 -1
  184. package/dist/web-dist/assets/hcl-DqcZcEQX.js +0 -1
  185. package/dist/web-dist/assets/highlighted-body-OFNGDK62-BlIYTcDK.js +0 -1
  186. package/dist/web-dist/assets/html-BJ_1aKKi.js +0 -1
  187. package/dist/web-dist/assets/htmlMode-Hg4GfZvB.js +0 -1
  188. package/dist/web-dist/assets/icons-CR59yTaA.js +0 -1
  189. package/dist/web-dist/assets/index-BDPIeMPK.js +0 -34
  190. package/dist/web-dist/assets/index-DqujaEeP.css +0 -2
  191. package/dist/web-dist/assets/indexes-ez4OmPR7.js +0 -1
  192. package/dist/web-dist/assets/ini-DAVBBvGM.js +0 -1
  193. package/dist/web-dist/assets/java-CPUr-3oI.js +0 -1
  194. package/dist/web-dist/assets/javascript-CvzYHnHf.js +0 -1
  195. package/dist/web-dist/assets/json-editor-C-7HFGJ2.js +0 -1
  196. package/dist/web-dist/assets/julia-Cu-j-vXr.js +0 -1
  197. package/dist/web-dist/assets/keys-VBmR2NsV.js +0 -1
  198. package/dist/web-dist/assets/kotlin-D2vv2tT1.js +0 -1
  199. package/dist/web-dist/assets/label-hsxz5VOl.js +0 -1
  200. package/dist/web-dist/assets/less-CKzCbMvG.js +0 -2
  201. package/dist/web-dist/assets/lexon-DKD4i4jk.js +0 -1
  202. package/dist/web-dist/assets/liquid-s8v6KVAN.js +0 -1
  203. package/dist/web-dist/assets/logs-DlQvMAY7.js +0 -1
  204. package/dist/web-dist/assets/lspLanguageFeatures-D9k63sBz.js +0 -4
  205. package/dist/web-dist/assets/lua-BjtFPVFc.js +0 -1
  206. package/dist/web-dist/assets/m3-CW0-q7dZ.js +0 -1
  207. package/dist/web-dist/assets/markdown-0274iNTO.js +0 -1
  208. package/dist/web-dist/assets/mdx-CZ8q31gq.js +0 -1
  209. package/dist/web-dist/assets/mermaid-GHXKKRXX-CQ1xUr5j.js +0 -1
  210. package/dist/web-dist/assets/middleware-DF6TlQS2.js +0 -1
  211. package/dist/web-dist/assets/mips-FR3oRusR.js +0 -1
  212. package/dist/web-dist/assets/module-Bek148sg.js +0 -2
  213. package/dist/web-dist/assets/msdax-CntWW6qe.js +0 -1
  214. package/dist/web-dist/assets/mysql-CJACC3-m.js +0 -1
  215. package/dist/web-dist/assets/objective-c-BUNGcP5B.js +0 -1
  216. package/dist/web-dist/assets/pascal-BKy15MaV.js +0 -1
  217. package/dist/web-dist/assets/pascaligo-DWESqQVQ.js +0 -1
  218. package/dist/web-dist/assets/perl-CBAgjcGX.js +0 -1
  219. package/dist/web-dist/assets/personal-preferences.store-Bfb2buXG.js +0 -1
  220. package/dist/web-dist/assets/pgsql-BqeSk0nE.js +0 -1
  221. package/dist/web-dist/assets/php-CzFJAlvL.js +0 -1
  222. package/dist/web-dist/assets/pla-DRvt3H-m.js +0 -1
  223. package/dist/web-dist/assets/postiats-ZvjXAa_2.js +0 -1
  224. package/dist/web-dist/assets/powerquery-DryHEA6Q.js +0 -1
  225. package/dist/web-dist/assets/powershell-QEI9APgx.js +0 -1
  226. package/dist/web-dist/assets/preload-helper-LZO0i3yF.js +0 -1
  227. package/dist/web-dist/assets/pug-CDF3vmYa.js +0 -1
  228. package/dist/web-dist/assets/python-BsOu3xjW.js +0 -1
  229. package/dist/web-dist/assets/qsharp-BbZVBun6.js +0 -1
  230. package/dist/web-dist/assets/queries.store-Dn4T9Cna.js +0 -1
  231. package/dist/web-dist/assets/r-CpYjNGnw.js +0 -1
  232. package/dist/web-dist/assets/radix-ui-CGydzmrQ.js +0 -51
  233. package/dist/web-dist/assets/razor-DAnkRgyU.js +0 -1
  234. package/dist/web-dist/assets/react-ffmTauEL.js +0 -1
  235. package/dist/web-dist/assets/redis-QErEcnOD.js +0 -1
  236. package/dist/web-dist/assets/redis-value--1z4IxUa.js +0 -1
  237. package/dist/web-dist/assets/redshift-CXgK11sI.js +0 -1
  238. package/dist/web-dist/assets/restructuredtext-BBt1qpNc.js +0 -1
  239. package/dist/web-dist/assets/rolldown-runtime-C5zEKjJh.js +0 -1
  240. package/dist/web-dist/assets/ruby-CgCIxh0i.js +0 -1
  241. package/dist/web-dist/assets/runner-KV8hbPPA.js +0 -1
  242. package/dist/web-dist/assets/rust-Copg69WU.js +0 -1
  243. package/dist/web-dist/assets/sb-BuyF0y3x.js +0 -1
  244. package/dist/web-dist/assets/scala-CZ7bI4SO.js +0 -1
  245. package/dist/web-dist/assets/schema-DR8Tuvdp.js +0 -1
  246. package/dist/web-dist/assets/schema-ruIelo5n.js +0 -1
  247. package/dist/web-dist/assets/scheme-BI3ohyII.js +0 -1
  248. package/dist/web-dist/assets/select-BedKPksO.js +0 -1
  249. package/dist/web-dist/assets/separator-Cd_a7h-Q.js +0 -1
  250. package/dist/web-dist/assets/sheet-sidebar-V9ImpjT9.js +0 -1
  251. package/dist/web-dist/assets/shell-CXx2Kidi.js +0 -1
  252. package/dist/web-dist/assets/solidity-DQP2nWvP.js +0 -1
  253. package/dist/web-dist/assets/sophia-DA8TX309.js +0 -1
  254. package/dist/web-dist/assets/sparql-CVI98ZbO.js +0 -1
  255. package/dist/web-dist/assets/spinner-J26L87h5.js +0 -1
  256. package/dist/web-dist/assets/sql-BRi0aIjG.js +0 -1
  257. package/dist/web-dist/assets/st-DlSkr5cV.js +0 -1
  258. package/dist/web-dist/assets/swift-DrB4uoi-.js +0 -1
  259. package/dist/web-dist/assets/systemverilog-DHk_Dhpc.js +0 -1
  260. package/dist/web-dist/assets/table-CT86qs6B.js +0 -1
  261. package/dist/web-dist/assets/tables-TbUO18cr.js +0 -13
  262. package/dist/web-dist/assets/tcl-BB6i8hBF.js +0 -1
  263. package/dist/web-dist/assets/tooltip-Bcb91KP1.js +0 -1
  264. package/dist/web-dist/assets/twig-DtkDzK6Y.js +0 -1
  265. package/dist/web-dist/assets/typescript-CfEpyYkn.js +0 -1
  266. package/dist/web-dist/assets/typespec-Cxei4Exd.js +0 -1
  267. package/dist/web-dist/assets/use-database-engine-Ds7pAy-l.js +0 -1
  268. package/dist/web-dist/assets/use-theme-BrgSRf8C.js +0 -1
  269. package/dist/web-dist/assets/utils-Bcpfbua-.js +0 -1
  270. package/dist/web-dist/assets/vb-CAxS_9xB.js +0 -1
  271. package/dist/web-dist/assets/visualizer-DMSktlIB.js +0 -1
  272. package/dist/web-dist/assets/vscode-D8MAi5Oo.js +0 -1
  273. package/dist/web-dist/assets/workers-9Tb8vu2S.js +0 -1
  274. package/dist/web-dist/assets/xml-Awyed4za.js +0 -1
  275. package/dist/web-dist/assets/yaml-VoM4GTAy.js +0 -1
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  </p>
14
14
 
15
15
  <p align="center">
16
- A modern, universal database studio (the pgAdmin alternative) for every database.<br>
16
+ Every database. One studio<br>
17
17
  Browse tables, edit records, design schemas, and run queries from one UI, launched with a single <code>npx</code> command.
18
18
  </p>
19
19
 
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var Pl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var It=(r,e)=>{for(var t in e)Pl(r,t,{get:e[t],enumerable:!0})};var h=R(()=>{"use strict";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};r.SENTRY_RELEASE={id:"db-studio@1.24.1"}}catch{}})()});var Ps=R(()=>{"use strict";h()});var $s=R(()=>{"use strict";h()});var Ms=R(()=>{"use strict";h()});var vs,ks,ot,Us=R(()=>{"use strict";h();vs=globalThis.process?.env,ks=vs?.NODE_ENV,ot={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:ks==="development",PROXY_URL:vs?.DB_STUDIO_PROXY_URL??(ks==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var qs=R(()=>{"use strict";h()});var Bs,_r=R(()=>{"use strict";h();Bs={AUTHOR:"H\xFCsam \u{1F951} <husam@ql3.dev>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"db-studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var Fs=R(()=>{"use strict";h()});var tn=R(()=>{"use strict";h();Ps();$s();Ms();Us();qs();_r();Fs()});import{z as bt}from"zod";var v,M,Lt,dt,Bl,Fl,ie,Te=R(()=>{"use strict";h();v=bt.object({db:bt.string("Database name is required")}),M=v.extend({schemaName:bt.string().optional()}),Lt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],dt=bt.enum(Lt,{message:"Invalid database type"}),Bl=v.extend({dbType:dt}),Fl=bt.object({dbType:dt}),ie=bt.object({tableName:bt.string("Table name is required")})});import{z as je}from"zod";var Be,Hl,Kl,Vs=R(()=>{"use strict";h();Te();Be=je.object({columnName:je.string("Column name is required"),columnType:je.string("Column type is required"),defaultValue:je.string().optional(),isPrimaryKey:je.boolean().default(!1),isNullable:je.boolean().default(!1),isUnique:je.boolean().default(!1),isIdentity:je.boolean().default(!1),isArray:je.boolean().default(!1)}),Hl=ie,Kl=je.object({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName,columnName:Be.shape.columnName,columnType:Be.shape.columnType,defaultValue:Be.shape.defaultValue,isPrimaryKey:Be.shape.isPrimaryKey,isNullable:Be.shape.isNullable,isUnique:Be.shape.isUnique,isIdentity:Be.shape.isIdentity,isArray:Be.shape.isArray})});import{z as nn}from"zod";var xr,Ys=R(()=>{"use strict";h();xr=nn.object({tableName:nn.string("Table name is required"),data:nn.record(nn.string("Column name is required"),nn.any())})});import{z as jl}from"zod";var zs,Lr,Gs,Pr,$r=R(()=>{"use strict";h();zs=["gemini","openai","anthropic","grok","openrouter"],Lr=jl.enum(zs),Gs=[{id:"gemini",label:"Google Gemini",models:[{id:"gemini-3-flash-preview",label:"Gemini 3 Flash"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro"}]},{id:"openai",label:"OpenAI",models:[{id:"gpt-5.2",label:"GPT-5.2"},{id:"gpt-5-mini",label:"GPT-5 mini"}]},{id:"anthropic",label:"Anthropic",models:[{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5"}]},{id:"grok",label:"xAI Grok",models:[{id:"grok-4.6",label:"Grok 4.6"},{id:"grok-4.5",label:"Grok 4.5"}]},{id:"openrouter",label:"OpenRouter",models:[{id:"openai/gpt-5.2",label:"GPT-5.2 via OpenRouter"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet 4.6 via OpenRouter"}]}],Pr=r=>Gs.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Fe}from"zod";var Mr,Ee,Wl,Vl,On=R(()=>{"use strict";h();Te();Mr=M.extend({cascade:Fe.string().optional().transform(r=>r==="true")}),Ee=Fe.object({tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required")}),Wl=Fe.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,cascade:Fe.boolean().optional()}),Vl=Fe.object({message:Fe.string("Message is required"),tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required"),deletedCount:Fe.number("Deleted count is required").default(0)})});import{z as rn}from"zod";var Pt,Yl,zl,Qs=R(()=>{"use strict";h();Te();On();Pt=rn.object({columnType:rn.string("Column type is required"),isNullable:rn.boolean(),defaultValue:rn.string().nullable().optional()}),Yl=Ee,zl=rn.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,columnType:Pt.shape.columnType,isNullable:Pt.shape.isNullable,defaultValue:Pt.shape.defaultValue})});var Js=R(()=>{"use strict";h()});import{z as $t}from"zod";var kr,Xs=R(()=>{"use strict";h();kr=$t.object({tableName:$t.string().min(1,"Table name is required"),records:$t.array($t.record($t.string(),$t.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var Gl,Ql,vr,Zs=R(()=>{"use strict";h();$r();Te();Gl=me.object({type:me.string(),content:me.string().optional()}).passthrough(),Ql=me.object({provider:Lr.optional().default("gemini"),model:me.string().min(1).optional(),messages:me.array(me.object({id:me.string(),role:me.enum(["user","assistant","system","tool","reasoning"]),content:me.union([me.string(),me.null(),me.array(me.unknown())]).optional(),parts:me.array(Gl).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:v.shape.db,includeSchema:me.boolean().optional().default(!0)})}),vr=Ql.transform(r=>({...r,model:r.model??Pr(r.provider)}))});var eo=R(()=>{"use strict";h()});import{z as xe}from"zod";var Jl,to,L,Xl,no,Zl,Ur=R(()=>{"use strict";h();Jl=["text","boolean","number","enum","json","date","array"],to=xe.enum(Jl),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Xl=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],no=xe.enum(Xl),Zl=xe.object({columnName:xe.string(),dataType:to,dataTypeLabel:no,isNullable:xe.boolean(),columnDefault:xe.string().nullable(),isPrimaryKey:xe.boolean(),isForeignKey:xe.boolean(),referencedTable:xe.string().nullable(),referencedSchema:xe.string().optional(),referencedColumn:xe.string().nullable(),enumValues:xe.array(xe.string()).nullable()})});function In(r){let e=r?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?L.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?L.number:e==="boolean"||e==="bool"?L.boolean:e==="json"||e==="jsonb"?L.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?L.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?L.text:L.text}function qr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?b.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?b.bigint:e==="smallint"||e==="int2"?b.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?b.numeric:e==="real"||e==="float4"?b.float:e==="double precision"||e==="float8"||e==="float"?b.double:e==="money"?b.money:e==="boolean"||e==="bool"?b.boolean:e==="text"?b.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?b.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?b.char:e==="json"?b.json:e==="jsonb"?b.jsonb:e==="xml"?b.xml:e==="uuid"?b.uuid:e==="date"?b.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?b.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?b.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?b.timestamptz:e==="interval"||e.startsWith("interval")?b.interval:e==="bytea"?b.bytea:e==="inet"?b.inet:e==="cidr"?b.cidr:e==="macaddr"?b.macaddr:e==="macaddr8"?b.macaddr8:e==="point"?b.point:e==="line"?b.line:e==="polygon"?b.polygon:e.startsWith("array")||e.includes("[]")?b.text:e.startsWith("user-defined")||e==="enum"?b.enum:b.text}function xn(r,e){let t=r?.toLowerCase().trim()||"",n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?L.boolean:t==="tinyint"||t==="smallint"||t==="mediumint"||t==="int"||t==="integer"||t==="bigint"||t==="decimal"||t==="numeric"||t==="float"||t==="double"||t==="real"||t==="bit"?L.number:t==="boolean"||t==="bool"?L.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?L.date:t==="json"?L.json:t==="enum"||t==="set"?L.enum:L.text}function Br(r,e){if(!r)return b.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?b.boolean:t==="tinyint"?b.tinyint:t==="smallint"?b.smallint:t==="mediumint"?b.mediumint:t==="int"||t==="integer"?b.int:t==="bigint"?b.bigint:t==="decimal"||t==="numeric"?b.numeric:t==="float"||t==="real"?b.float:t==="double"?b.double:t==="bit"?b.bit:t==="boolean"||t==="bool"?b.boolean:t==="char"?b.char:t==="varchar"?b.varchar:t==="tinytext"?b.tinytext:t==="text"?b.text:t==="mediumtext"?b.mediumtext:t==="longtext"?b.longtext:t==="binary"?b.binary:t==="varbinary"?b.varbinary:t==="tinyblob"?b.tinyblob:t==="blob"?b.blob:t==="mediumblob"?b.mediumblob:t==="longblob"?b.longblob:t==="json"?b.json:t==="date"?b.date:t==="time"?b.time:t==="datetime"?b.datetime:t==="timestamp"?b.timestamp:t==="year"?b.year:t==="enum"?b.enum:t==="set"?b.set:b.text}function Ln(r){let e=r?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?L.number:e==="bit"?L.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?L.date:e==="json"?L.json:L.text}function Fr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="tinyint"?b.tinyint:e==="smallint"?b.smallint:e==="int"?b.int:e==="bigint"?b.bigint:e==="decimal"||e==="numeric"?b.numeric:e==="float"||e==="real"?b.float:e==="money"||e==="smallmoney"?b.money:e==="bit"?b.boolean:e==="char"?b.char:e==="varchar"?b.varchar:e==="text"?b.text:e==="nchar"?b.char:e==="nvarchar"?b.varchar:e==="ntext"?b.text:e==="binary"?b.binary:e==="varbinary"?b.varbinary:e==="image"?b.blob:e==="uniqueidentifier"?b.uuid:e==="date"?b.date:e==="time"?b.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?b.datetime:e==="datetimeoffset"?b.timestamptz:e==="json"?b.json:e==="xml"?b.xml:b.text}function Pn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?L.boolean:e==="json"?L.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?L.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?L.number:L.text}function Hr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?b.int:e==="bigint"||e.startsWith("bigint(")?b.bigint:e==="smallint"||e.startsWith("smallint(")?b.smallint:e==="tinyint"||e.startsWith("tinyint(")?b.tinyint:e==="mediumint"||e.startsWith("mediumint(")?b.mediumint:e.includes("int")?b.int:e==="real"||e==="float"||e.startsWith("float(")?b.float:e==="double"||e==="double precision"||e.startsWith("double(")?b.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?b.numeric:e==="boolean"||e==="bool"?b.boolean:e==="text"||e==="clob"?b.text:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="char"||e.startsWith("char(")?b.char:e==="json"?b.json:e==="date"?b.date:e==="time"?b.time:e==="datetime"?b.datetime:e==="timestamp"?b.timestamp:e==="blob"?b.blob:b.text}function $n(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?L.json:e==="boolean"||e==="bool"?L.boolean:e.startsWith("enum")?L.enum:e==="interval"?L.text:e==="date"||e.startsWith("time")||e==="datetime"?L.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?L.number:L.text}function Kr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?b.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?b.json:e.startsWith("enum")?b.enum:e==="interval"?b.interval:e==="tinyint"||e==="utinyint"?b.tinyint:e==="smallint"||e==="usmallint"?b.smallint:e==="integer"||e==="int"?b.int:e.includes("int")||e==="bignum"?b.bigint:e.startsWith("decimal")||e.startsWith("numeric")?b.numeric:e==="float"||e==="real"?b.float:e==="double"?b.double:e==="boolean"||e==="bool"?b.boolean:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="uuid"?b.uuid:e==="date"?b.date:e==="timestamp with time zone"||e==="timestamptz"?b.timestamptz:e.startsWith("timestamp")||e==="datetime"?b.timestamp:e.startsWith("time")?b.time:e==="blob"||e==="bytea"?b.blob:e==="bit"||e==="bitstring"?b.bit:b.text}function Mn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"?L.boolean:e==="json"?L.json:e==="date"||e.startsWith("timestamp")?L.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?L.number:L.text}function jr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return b.boolean;if(e==="json")return b.json;if(e==="xmltype")return b.xml;if(e==="integer")return b.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return b.smallint;if(n<=10)return b.int;if(n<=19)return b.bigint}return e.startsWith("number")?b.numeric:e==="binary_float"?b.float:e==="binary_double"||e.startsWith("float")?b.double:e.startsWith("varchar")||e.startsWith("nvarchar")?b.varchar:e.startsWith("char")||e.startsWith("nchar")?b.char:e.startsWith("timestamp")&&e.endsWith("time zone")?b.timestamptz:e==="date"||e.startsWith("timestamp")?b.timestamp:e.startsWith("interval")?b.interval:e==="blob"||e==="long raw"?b.blob:e.startsWith("raw")?b.varbinary:b.text}function Mt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function kn(r){let e=Mt(r);return e.startsWith("Array(")?L.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?L.enum:e==="Bool"?L.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?L.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?L.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?L.json:L.text}function Wr(r){let e=Mt(r);return e.startsWith("Array(")?b.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?b.enum:e==="Bool"?b.boolean:/^U?Int8$/.test(e)?b.tinyint:/^U?Int16$/.test(e)?b.smallint:/^U?Int32$/.test(e)?b.int:/^U?Int(64|128|256)$/.test(e)?b.bigint:e==="Float32"||e==="BFloat16"?b.float:e==="Float64"?b.double:e.startsWith("Decimal")?b.numeric:e.startsWith("FixedString(")?b.char:e==="UUID"?b.uuid:e==="IPv4"||e==="IPv6"?b.inet:e==="Date"||e==="Date32"?b.date:e.startsWith("DateTime64")?b.timestamp:e.startsWith("DateTime")?b.datetime:e.startsWith("Time")?b.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?b.json:b.text}var b,ro=R(()=>{"use strict";h();Ur();b={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as we}from"zod";var ao,an,so,eu,Vr,Yr,oo=R(()=>{"use strict";h();Te();ao=["red","orange","amber","green","teal","blue","violet","pink"],an=we.enum(ao),so=we.object({id:we.string(),name:we.string(),color:an.nullable(),lastUsedAt:we.number(),dbType:dt,maskedUrl:we.string()}),eu=we.object({connections:we.array(so),active:we.object({id:we.string().nullable(),dbType:dt,connectionId:we.string()}).nullable()}),Vr=we.object({url:we.string().trim().min(1,"Paste a connection URL")}),Yr=we.object({name:we.string().trim().min(1,"Name is required").max(100).optional(),color:an.nullable().optional()})});import{z as de}from"zod";var io,zr,co,lo,Gr,uo=R(()=>{"use strict";h();io=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],zr=de.enum(io),co=de.object({columnName:de.string("Column name is required"),columnType:de.string("Column type is required"),defaultValue:de.string().optional(),isPrimaryKey:de.boolean().default(!1),isNullable:de.boolean().default(!1),isUnique:de.boolean().default(!1),isIdentity:de.boolean().default(!1),isArray:de.boolean().default(!1)}),lo=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:zr.default("NO ACTION"),onDelete:zr.default("NO ACTION")}),Gr=de.object({tableName:de.string("Table name is required"),fields:de.array(co).min(1,"At least one field is required"),foreignKeys:de.array(lo).optional()})});var K,We,mo=R(()=>{"use strict";h();Te();K={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,rowMutation:!0,indexes:{methods:["btree","hash","gin","gist","spgist","brin"],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},sqlite:{label:"SQLite / libSQL / D1",protocols:["sqlite","libsql","d1"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!1},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"DuckDB cannot alter or rename a table that has an index, or alter or drop a column an index covers."},serverLogs:!1},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},We=r=>Lt.find(e=>K[e].protocols.includes(r))});import{z as Se}from"zod";var po,tu,nu,fo=R(()=>{"use strict";h();Te();po=Se.object({name:Se.string("Name is required"),size:Se.string("Size is required"),owner:Se.string("Owner is required"),encoding:Se.string("Encoding is required")}),tu=Se.object({databases:Se.array(po),dbType:dt}),nu=Se.object({version:Se.string("Version is required"),database:Se.string("Database is required"),user:Se.string("User is required"),host:Se.string("Host is required").nullable(),port:Se.number("Port is required").nullable(),active_connections:Se.coerce.number("Active connections is required"),max_connections:Se.coerce.number("Max connections is required")})});var ho=R(()=>{"use strict";h()});import{z as kt}from"zod";var vn,yo=R(()=>{"use strict";h();vn=kt.object({tableName:kt.string("Table name is required"),primaryKeys:kt.array(kt.object({columnName:kt.string("Column name is required"),value:kt.any()})).min(1,"At least one primary key is required")})});import{z as ru}from"zod";var Qr,go=R(()=>{"use strict";h();Te();Qr=M.extend({cascade:ru.string().optional().transform(r=>r==="true")})});import{z as bo}from"zod";var Jr,To=R(()=>{"use strict";h();Jr=bo.object({query:bo.string("Query is required")})});import{z as au}from"zod";var Eo,Xr,wo=R(()=>{"use strict";h();Te();Eo=["csv","xlsx","json"],Xr=M.extend({format:au.enum(Eo,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var So,su,Un,ou,qn,iu,Co=R(()=>{"use strict";h();Te();So=["primary","unique-constraint","index"],su=ce.object({indexName:ce.string(),columns:ce.array(ce.string()),isUnique:ce.boolean(),isSparse:ce.boolean().optional(),expireAfterSeconds:ce.number().nonnegative().optional(),method:ce.string().nullable(),kind:ce.enum(So),definition:ce.string().nullable()}),Un=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),ou=Un.extend({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName}),qn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),iu=qn.extend({db:v.shape.db,schemaName:M.shape.schemaName})});import{z as E}from"zod";var Bn,k,Zr,ea,cu,ta,vt,lu,uu,mu,du,pu,fu,hu,Ro,yu,na,gu,bu,Tu,Eu,wu,Su,Cu,ra,Ru,Nu,Au,Du,_u,Ou,Iu,xu,Lu,Pu,$u,Mu,ku,vu,Uu,aa,sa,qu,No=R(()=>{"use strict";h();Bn=E.enum(["string","hash","list","set","zset","stream","unknown"]),k=E.object({base64:E.string().max(16*1024*1024).refine(r=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(r),"Invalid unpadded base64url value"),utf8:E.string().optional()}),Zr=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(200).default(50),search:E.string().max(512).optional(),exactPattern:E.stringbool().default(!1),type:Bn.exclude(["unknown"]).optional()}),ea=E.object({key:k,type:Bn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),cu=E.object({keys:E.array(ea),nextCursor:E.string().nullable(),hasMore:E.boolean()}),ta=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(500).default(100),full:E.stringbool().default(!1),direction:E.enum(["forward","backward"]).default("forward")}),vt=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),lu=E.object({kind:E.literal("string"),value:k,truncated:E.boolean()}),uu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k}))}),mu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:k}))}),du=E.object({kind:E.literal("set"),members:E.array(k)}),pu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),fu=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:k,value:k}))}))}),hu=E.object({kind:E.literal("unknown")}),Ro=E.discriminatedUnion("kind",[lu,uu,mu,du,pu,fu,hu]),yu=ea.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Ro,nextCursor:E.string().nullable(),hasMore:E.boolean()}),na=E.object({db:E.string(),offset:E.coerce.number().int().nonnegative().default(0),limit:E.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:E.string().optional()}),gu=E.object({chunk:k,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),bu=E.object({kind:E.literal("string"),value:k}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k})).min(1)}),Eu=E.object({kind:E.literal("list"),entries:E.array(k).min(1)}),wu=E.object({kind:E.literal("set"),members:E.array(k).min(1)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.number()})).min(1)}),Cu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),ra=E.object({key:k,type:Bn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Cu]),ttlMs:E.number().int().positive().nullable().default(null)}),Ru=E.object({key:k,revision:E.string().nullable(),deleted:E.boolean()}),Nu=E.object({action:E.literal("rename"),newKey:k}),Au=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),Du=E.object({action:E.literal("setString"),value:k}),_u=E.object({action:E.literal("upsertHash"),field:k,value:k}),Ou=E.object({action:E.literal("deleteHash"),field:k}),Iu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:k}),xu=E.object({action:E.literal("setList"),index:E.number().int(),value:k}),Lu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Pu=E.object({action:E.literal("addSet"),member:k}),$u=E.object({action:E.literal("removeSet"),member:k}),Mu=E.object({action:E.literal("upsertZset"),member:k,score:E.number()}),ku=E.object({action:E.literal("removeZset"),member:k}),vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),Uu=E.object({action:E.literal("deleteStream"),id:E.string()}),aa=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[Nu,Au,Du,_u,Ou,Iu,xu,Lu,Pu,$u,Mu,ku,vu,Uu])}),sa=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),qu=E.object({deleted:E.boolean()})});var Ao=R(()=>{"use strict";h()});import{z as oa}from"zod";var Fn,Bu,Fu,Do=R(()=>{"use strict";h();Te();On();Fn=oa.object({newColumnName:oa.string("New column name is required")}),Bu=Ee,Fu=oa.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,newColumnName:Fn.shape.newColumnName})});import{z as Hn}from"zod";var sn,Hu,Ku,_o=R(()=>{"use strict";h();Te();sn=Hn.object({newTableName:Hn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Hn.string().trim().min(1).optional()}),Hu=ie,Ku=Hn.object({db:v.shape.db,tableName:ie.shape.tableName,newTableName:sn.shape.newTableName,schemaName:sn.shape.schemaName})});import{z as Me}from"zod";var Oo,Io,ju,xo=R(()=>{"use strict";h();Oo=["fatal","error","warning","info","debug"],Io=Me.enum(Oo),ju=Me.object({ts:Me.string(),level:Io,rawLevel:Me.string(),source:Me.string().optional(),code:Me.string().optional(),message:Me.string(),durationMs:Me.number().optional(),statement:Me.string().optional(),detail:Me.record(Me.string(),Me.string())})});import{z as U}from"zod";var Lo,on,Po,$o,Wu,ia,Mo=R(()=>{"use strict";h();Te();Lo=U.object({columnName:U.string(),operator:U.string(),value:U.string()}),on=["asc","desc"],Po=U.object({columnName:U.string(),direction:U.enum(on)}),$o=U.object({limit:U.number(),total:U.number(),totalEstimated:U.boolean().optional(),hasNextPage:U.boolean(),hasPreviousPage:U.boolean(),nextCursor:U.string().nullable(),prevCursor:U.string().nullable()}),Wu=U.object({data:U.array(U.record(U.string(),U.unknown())),meta:$o}),ia=U.object({db:v.shape.db,schemaName:M.shape.schemaName,cursor:U.string().optional(),limit:U.string().optional().default("50").transform(Number),direction:U.enum(on).optional().default(on[0]),sort:U.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(U.union([U.string(),U.array(Po)])),order:U.enum(on).optional(),filters:U.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(U.array(Lo))})});import{z as cn}from"zod";var Vu,ko=R(()=>{"use strict";h();Vu=cn.object({tableName:cn.string("Table name is required"),schemaName:cn.string().optional(),rowCount:cn.coerce.number("Row count is required"),rowCountEstimated:cn.boolean().optional()})});import{z as vo}from"zod";var Yu,Uo=R(()=>{"use strict";h();Yu=vo.object({schema:vo.string()})});import{z as ke}from"zod";var ca,qo=R(()=>{"use strict";h();ca=ke.object({tableName:ke.string("Table name is required"),primaryKey:ke.string("Primary key is required").default("id"),primaryKeys:ke.array(ke.string().min(1)).min(1).optional(),updates:ke.array(ke.object({rowData:ke.record(ke.string("Column name is required"),ke.any()),columnName:ke.string("Column name is required"),value:ke.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Bo={};It(Bo,{AI_PROVIDERS:()=>zs,AI_PROVIDER_OPTIONS:()=>Gs,CONNECTION_COLORS:()=>ao,DATABASE_ENGINES:()=>K,DATABASE_TYPES:()=>Lt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>io,FORMAT_TYPES:()=>Eo,INDEX_KINDS:()=>So,SERVER_LOG_LEVELS:()=>Oo,StandardizedDataType:()=>b,addColumnParamSchema:()=>Hl,addColumnParamsSchema:()=>Kl,addColumnSchema:()=>Be,addRecordSchema:()=>xr,aiProviderSchema:()=>Lr,alterColumnParamSchema:()=>Yl,alterColumnParamsSchema:()=>zl,alterColumnSchema:()=>Pt,bulkInsertRecordsSchema:()=>kr,chatSchema:()=>vr,columnInfoSchema:()=>Zl,connectUrlSchema:()=>Vr,connectionColorSchema:()=>an,connectionInfoSchema:()=>nu,connectionSummarySchema:()=>so,connectionsStateSchema:()=>eu,createIndexParamsSchema:()=>ou,createIndexSchema:()=>Un,createKeySchema:()=>ra,createTableSchema:()=>Gr,currentDatabaseSchema:()=>Bl,dataTypesSchema:()=>to,databaseInfoSchema:()=>po,databaseListSchema:()=>tu,databaseSchema:()=>v,databaseTypeParamSchema:()=>Fl,databaseTypeSchema:()=>dt,dbTypeFromProtocol:()=>We,deleteColumnParamSchema:()=>Ee,deleteColumnParamsSchema:()=>Wl,deleteColumnQuerySchema:()=>Mr,deleteColumnSuccessResponseSchema:()=>Vl,deleteKeyQuerySchema:()=>sa,deleteKeyResultSchema:()=>qu,deleteRecordSchema:()=>vn,deleteTableQuerySchema:()=>Qr,dropIndexParamSchema:()=>qn,dropIndexParamsSchema:()=>iu,encodedRedisValueSchema:()=>k,executeQuerySchema:()=>Jr,exportTableSchema:()=>Xr,fieldDataSchema:()=>co,filterSchema:()=>Lo,foreignKeyActionSchema:()=>zr,foreignKeyDataSchema:()=>lo,getDefaultAiModel:()=>Pr,indexInfoSchema:()=>su,keyActionSchema:()=>aa,keyDetailsQuerySchema:()=>ta,keyDetailsResultSchema:()=>yu,keyParamSchema:()=>vt,keyRawQuerySchema:()=>na,keyRawResultSchema:()=>gu,keyScanQuerySchema:()=>Zr,keyScanResultSchema:()=>cu,keyWriteResultSchema:()=>Ru,mapClickhouseToDataType:()=>kn,mapDuckdbToDataType:()=>$n,mapMssqlToDataType:()=>Ln,mapMysqlToDataType:()=>xn,mapOracleToDataType:()=>Mn,mapPostgresToDataType:()=>In,mapSqliteToDataType:()=>Pn,redisKeySummarySchema:()=>ea,redisKeyTypeSchema:()=>Bn,redisKeyValueSchema:()=>Ro,renameColumnParamSchema:()=>Bu,renameColumnParamsSchema:()=>Fu,renameColumnSchema:()=>Fn,renameTableParamSchema:()=>Hu,renameTableParamsSchema:()=>Ku,renameTableSchema:()=>sn,serverLogEntrySchema:()=>ju,serverLogLevelSchema:()=>Io,sortDirections:()=>on,sortSchema:()=>Po,standardizeClickhouseDataTypeLabel:()=>Wr,standardizeDataTypeLabel:()=>qr,standardizeDuckdbDataTypeLabel:()=>Kr,standardizeMssqlDataTypeLabel:()=>Fr,standardizeMysqlDataTypeLabel:()=>Br,standardizeOracleDataTypeLabel:()=>jr,standardizeSqliteDataTypeLabel:()=>Hr,standardizedDataTypeSchema:()=>no,tableDataMetaSchema:()=>$o,tableDataQuerySchema:()=>ia,tableDataResultSchema:()=>Wu,tableInfoSchema:()=>Vu,tableNameSchema:()=>ie,tableQuerySchema:()=>M,tableSchemaResultSchema:()=>Yu,unwrapClickhouseType:()=>Mt,updateConnectionSchema:()=>Yr,updateRecordsSchema:()=>ca});var j=R(()=>{"use strict";h();Vs();Ys();$r();Qs();Js();Xs();Zs();eo();ro();Ur();oo();uo();Te();mo();fo();ho();On();yo();go();To();wo();Co();No();Ao();Do();_o();xo();Mo();ko();Uo();qo()});var zu,Gu,Qu,Kn,la=R(()=>{"use strict";h();j();zu=Object.values(K).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),Gu=new RegExp(`\\b(?:${zu}):\\/\\/\\S+`,"gi"),Qu=/\b(authToken=)[^&\s]+/gi,Kn=r=>r.replace(Gu,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(Qu,"$1[redacted]")});var d,X=R(()=>{"use strict";h();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}}});import{AsyncLocalStorage as Zu}from"async_hooks";import{randomUUID as Ho}from"crypto";var em,tm,jn,Ko,jo,it,ua,nm,rm,am,Wo,ma,fe,Z,Ve=R(()=>{"use strict";h();X();em=Ho(),tm=/^[A-Za-z0-9_-]{8,64}$/,jn=new Zu,Ko=r=>r&&tm.test(r)?r:Ho(),jo=(r,e)=>jn.run(r,e),it=()=>jn.getStore()?.requestId,ua=()=>jn.getStore()?.connectionId,nm=r=>{let e=r instanceof d?"HTTPException":r instanceof Error?r.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},rm=/^[A-Z0-9_-]{2,32}$/,am=[[/^timeout exceeded when trying to connect$/,"POOL_ACQUIRE_TIMEOUT"],[/^(timeout expired|Connection terminated due to connection timeout)$/,"CONNECT_TIMEOUT"],[/^Connection terminated/,"CONNECTION_TERMINATED"],[/^Client has encountered a connection error/,"CONNECTION_BROKEN"]],Wo=r=>{if(!(r instanceof Error))return;let{code:e,errno:t,number:n,cause:a}=r;return typeof n=="number"&&Number.isSafeInteger(n)?String(n):typeof e=="string"&&rm.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):r.name==="ReplyError"?r.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:am.find(([s])=>s.test(r.message))?.[1]??Wo(a)},ma=r=>r instanceof d&&r.cause?r.cause:r,fe=r=>{let e=ma(r);return{error_type:nm(e),error_code:Wo(e)}},Z=(r,e,t={})=>{let n=jn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:em,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
3
- `)}});function _e(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||sm(e)}}catch(e){return Z("error","database_url_unparseable",fe(e)),{host:"localhost",port:5432}}}var Wn,sm,Vo,Ye=R(()=>{"use strict";h();j();Ve();Wn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},sm=r=>{let e=r.protocol.replace(":",""),t=We(e);return Wn[e]?.defaultPort??(t&&K[t].defaultPort)??5432},Vo=r=>{let e=new URL(r),t=Wn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Tt,da=R(()=>{Tt={name:"db-studio",type:"module",version:"1.24.1",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <husam@ql3.dev>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"Apache-2.0",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"portless run","dev:app":"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify",prepack:"cd ../web && bun run build && cd ../server && bun run build",start:`sh -c 'APP_PORT=\${PORT:-3333}; portless proxy start >/dev/null && portless alias db-studio "$APP_PORT" --force >/dev/null && HOST=127.0.0.1 PORT="$APP_PORT" DB_STUDIO_SERVER_URL=https://db-studio.localhost node dist/index.js'`,format:"biome check --write --unsafe",typecheck:"tsc --noEmit",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",e2e:"tsx e2e/contract.ts","e2e:perf":"tsx e2e/perf.ts","e2e:grid":"tsx e2e/grid.ts","e2e:schema-routing":"tsx e2e/schema-routing.ts","e2e:visualizer":"tsx e2e/visualizer.ts"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@clickhouse/client":"^1.24.0","@duckdb/node-api":"^1.5.6-r.1","@elysiajs/cors":"^1.4.2","@elysiajs/node":"^1.4.5","@libsql/client":"^0.18.0","@sentry/node":"^10.73.0",commander:"^15.0.0",dotenv:"^18.0.0",elysia:"^1.4.30",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",oracledb:"^7.0.1",pg:"^8.20.0",picocolors:"^1.1.1","posthog-node":"^5.20.0",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/oracledb":"^7.0.3","@types/pg":"^8.16.0","@vitest/coverage-v8":"^5.0.0","playwright-core":"1.61.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^5.0.0"}}});var ti={};It(ti,{captureInstallationActive:()=>ga,captureServerError:()=>ba,captureServerEvent:()=>Qn,databaseTypeForRequest:()=>mn,durationBucket:()=>ha,flushServerObservability:()=>Sm,getTelemetryConfig:()=>zn,initServerObservability:()=>ei,operationForRequest:()=>un,outcomeForStatus:()=>ya,resetTelemetryId:()=>fa,setTelemetryEnabled:()=>Gn,startServerSpan:()=>Ta});import{randomUUID as Jo}from"crypto";import{existsSync as mm,mkdirSync as dm,readFileSync as pm,writeFileSync as fm}from"fs";import{homedir as pa,platform as hm}from"os";import Vn from"path";import*as Le from"@sentry/node";import{PostHog as ym}from"posthog-node";var gm,Xo,Yn,bm,Tm,pt,Et,Em,wm,wt,ln,zn,Gn,fa,ha,ya,Zo,un,mn,ei,Sm,Qn,ga,Cm,ba,Ta,dn=R(()=>{"use strict";h();j();Ve();da();gm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",Xo=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Vn.join(pa(),".local","state"));return Vn.join(r||Vn.join(pa(),".db-studio"),"db-studio","telemetry.json")},Yn=r=>{try{let e=Xo();dm(Vn.dirname(e),{recursive:!0}),fm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},bm=()=>({installationId:Jo(),enabled:!0}),Tm=()=>{let r=Xo();try{if(mm(r)){let t=JSON.parse(pm(r,"utf8"));if(typeof t.installationId=="string"&&typeof t.enabled=="boolean")return{installationId:t.installationId,enabled:t.enabled,lastActiveAt:typeof t.lastActiveAt=="string"?t.lastActiveAt:void 0}}}catch{}let e=bm();return Yn(e),e},Em="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",wm="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",wt=()=>pt??=Tm(),ln=()=>!gm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&wt().enabled,zn=()=>({enabled:ln(),installationId:wt().installationId,appVersion:Tt.version}),Gn=r=>{pt={...wt(),enabled:r},Yn(pt),r?(Et?.enable(),ei()):(Et?.disable(),Le.close(500))},fa=()=>(pt={...wt(),installationId:Jo(),lastActiveAt:void 0},Yn(pt),pt.installationId),ha=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",ya=r=>r>=500?"server_error":r>=400?"client_error":"success",Zo=new RegExp(`^/api/(${Lt.join("|")})(?=/|$)`),un=(r,e)=>{let t=e.replace(Zo,"/api"),a=[[/^\/api\/databases(?:\/|$)/,"databases"],[/^\/api\/tables(?:\/|$)/,"tables"],[/^\/api\/records(?:\/|$)/,"records"],[/^\/api\/query(?:\/|$)/,"query"],[/^\/api\/keys(?:\/|$)/,"keys"],[/^\/api\/chat(?:\/|$)/,"chat"]].find(([s])=>s.test(t))?.[1]??"other";return`${r.toLowerCase()}_${a}`},mn=r=>r.match(Zo)?.[1],ei=()=>{if(!ln())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Em;r&&(!Le.isInitialized()||Le.getClient()?.getOptions().enabled===!1)&&Le.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${Tt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:wt().installationId},delete t.breadcrumbs,delete t.server_name,t},beforeSendSpan(t){return{...t,data:Object.fromEntries(Object.entries(t.data??{}).filter(([n])=>n.startsWith("db_studio.")))}}});let e=process.env.DB_STUDIO_POSTHOG_KEY??wm;e&&!Et&&(Et=new ym(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Sm=()=>Promise.allSettled([Et?.shutdown(2e3),Le.close(2e3)]),Qn=r=>{!ln()||!Et||Et.capture({distinctId:wt().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:Tt.version,$geoip_disable:!1}})},ga=()=>{if(!ln())return;let r=wt(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(pt={...r,lastActiveAt:new Date().toISOString()},Yn(pt),Qn({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:hm()}}))},Cm=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=pa(),s=r.stack.split(`
2
+ var Pl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var It=(r,e)=>{for(var t in e)Pl(r,t,{get:e[t],enumerable:!0})};var h=R(()=>{"use strict";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};r.SENTRY_RELEASE={id:"db-studio@2.0.1"}}catch{}})()});var Ps=R(()=>{"use strict";h()});var $s=R(()=>{"use strict";h()});var Ms=R(()=>{"use strict";h()});var vs,ks,ot,Us=R(()=>{"use strict";h();vs=globalThis.process?.env,ks=vs?.NODE_ENV,ot={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:ks==="development",PROXY_URL:vs?.DB_STUDIO_PROXY_URL??(ks==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var qs=R(()=>{"use strict";h()});var Bs,_r=R(()=>{"use strict";h();Bs={AUTHOR:"H\xFCsam \u{1F951} <husam@ql3.dev>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"Every database. One studio. Browse tables, edit records, and run queries in a free, open-source database GUI.",SITE_KEYWORDS:["database studio","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"db-studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"db-studio | Every database. One studio",SITE_COLOR:"#1447e6"}});var Fs=R(()=>{"use strict";h()});var tn=R(()=>{"use strict";h();Ps();$s();Ms();Us();qs();_r();Fs()});import{z as bt}from"zod";var v,M,Lt,dt,Bl,Fl,ie,Te=R(()=>{"use strict";h();v=bt.object({db:bt.string("Database name is required")}),M=v.extend({schemaName:bt.string().optional()}),Lt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],dt=bt.enum(Lt,{message:"Invalid database type"}),Bl=v.extend({dbType:dt}),Fl=bt.object({dbType:dt}),ie=bt.object({tableName:bt.string("Table name is required")})});import{z as je}from"zod";var Be,Hl,Kl,Vs=R(()=>{"use strict";h();Te();Be=je.object({columnName:je.string("Column name is required"),columnType:je.string("Column type is required"),defaultValue:je.string().optional(),isPrimaryKey:je.boolean().default(!1),isNullable:je.boolean().default(!1),isUnique:je.boolean().default(!1),isIdentity:je.boolean().default(!1),isArray:je.boolean().default(!1)}),Hl=ie,Kl=je.object({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName,columnName:Be.shape.columnName,columnType:Be.shape.columnType,defaultValue:Be.shape.defaultValue,isPrimaryKey:Be.shape.isPrimaryKey,isNullable:Be.shape.isNullable,isUnique:Be.shape.isUnique,isIdentity:Be.shape.isIdentity,isArray:Be.shape.isArray})});import{z as nn}from"zod";var xr,Ys=R(()=>{"use strict";h();xr=nn.object({tableName:nn.string("Table name is required"),data:nn.record(nn.string("Column name is required"),nn.any())})});import{z as jl}from"zod";var zs,Lr,Gs,Pr,$r=R(()=>{"use strict";h();zs=["gemini","openai","anthropic","grok","openrouter"],Lr=jl.enum(zs),Gs=[{id:"gemini",label:"Google Gemini",models:[{id:"gemini-3-flash-preview",label:"Gemini 3 Flash"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro"}]},{id:"openai",label:"OpenAI",models:[{id:"gpt-5.2",label:"GPT-5.2"},{id:"gpt-5-mini",label:"GPT-5 mini"}]},{id:"anthropic",label:"Anthropic",models:[{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5"}]},{id:"grok",label:"xAI Grok",models:[{id:"grok-4.6",label:"Grok 4.6"},{id:"grok-4.5",label:"Grok 4.5"}]},{id:"openrouter",label:"OpenRouter",models:[{id:"openai/gpt-5.2",label:"GPT-5.2 via OpenRouter"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet 4.6 via OpenRouter"}]}],Pr=r=>Gs.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Fe}from"zod";var Mr,Ee,Wl,Vl,On=R(()=>{"use strict";h();Te();Mr=M.extend({cascade:Fe.string().optional().transform(r=>r==="true")}),Ee=Fe.object({tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required")}),Wl=Fe.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,cascade:Fe.boolean().optional()}),Vl=Fe.object({message:Fe.string("Message is required"),tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required"),deletedCount:Fe.number("Deleted count is required").default(0)})});import{z as rn}from"zod";var Pt,Yl,zl,Qs=R(()=>{"use strict";h();Te();On();Pt=rn.object({columnType:rn.string("Column type is required"),isNullable:rn.boolean(),defaultValue:rn.string().nullable().optional()}),Yl=Ee,zl=rn.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,columnType:Pt.shape.columnType,isNullable:Pt.shape.isNullable,defaultValue:Pt.shape.defaultValue})});var Js=R(()=>{"use strict";h()});import{z as $t}from"zod";var kr,Xs=R(()=>{"use strict";h();kr=$t.object({tableName:$t.string().min(1,"Table name is required"),records:$t.array($t.record($t.string(),$t.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var Gl,Ql,vr,Zs=R(()=>{"use strict";h();$r();Te();Gl=me.object({type:me.string(),content:me.string().optional()}).passthrough(),Ql=me.object({provider:Lr.optional().default("gemini"),model:me.string().min(1).optional(),messages:me.array(me.object({id:me.string(),role:me.enum(["user","assistant","system","tool","reasoning"]),content:me.union([me.string(),me.null(),me.array(me.unknown())]).optional(),parts:me.array(Gl).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:v.shape.db,includeSchema:me.boolean().optional().default(!0)})}),vr=Ql.transform(r=>({...r,model:r.model??Pr(r.provider)}))});var eo=R(()=>{"use strict";h()});import{z as xe}from"zod";var Jl,to,L,Xl,no,Zl,Ur=R(()=>{"use strict";h();Jl=["text","boolean","number","enum","json","date","array"],to=xe.enum(Jl),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Xl=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],no=xe.enum(Xl),Zl=xe.object({columnName:xe.string(),dataType:to,dataTypeLabel:no,isNullable:xe.boolean(),columnDefault:xe.string().nullable(),isPrimaryKey:xe.boolean(),isForeignKey:xe.boolean(),referencedTable:xe.string().nullable(),referencedSchema:xe.string().optional(),referencedColumn:xe.string().nullable(),enumValues:xe.array(xe.string()).nullable()})});function In(r){let e=r?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?L.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?L.number:e==="boolean"||e==="bool"?L.boolean:e==="json"||e==="jsonb"?L.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?L.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?L.text:L.text}function qr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?b.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?b.bigint:e==="smallint"||e==="int2"?b.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?b.numeric:e==="real"||e==="float4"?b.float:e==="double precision"||e==="float8"||e==="float"?b.double:e==="money"?b.money:e==="boolean"||e==="bool"?b.boolean:e==="text"?b.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?b.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?b.char:e==="json"?b.json:e==="jsonb"?b.jsonb:e==="xml"?b.xml:e==="uuid"?b.uuid:e==="date"?b.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?b.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?b.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?b.timestamptz:e==="interval"||e.startsWith("interval")?b.interval:e==="bytea"?b.bytea:e==="inet"?b.inet:e==="cidr"?b.cidr:e==="macaddr"?b.macaddr:e==="macaddr8"?b.macaddr8:e==="point"?b.point:e==="line"?b.line:e==="polygon"?b.polygon:e.startsWith("array")||e.includes("[]")?b.text:e.startsWith("user-defined")||e==="enum"?b.enum:b.text}function xn(r,e){let t=r?.toLowerCase().trim()||"",n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?L.boolean:t==="tinyint"||t==="smallint"||t==="mediumint"||t==="int"||t==="integer"||t==="bigint"||t==="decimal"||t==="numeric"||t==="float"||t==="double"||t==="real"||t==="bit"?L.number:t==="boolean"||t==="bool"?L.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?L.date:t==="json"?L.json:t==="enum"||t==="set"?L.enum:L.text}function Br(r,e){if(!r)return b.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?b.boolean:t==="tinyint"?b.tinyint:t==="smallint"?b.smallint:t==="mediumint"?b.mediumint:t==="int"||t==="integer"?b.int:t==="bigint"?b.bigint:t==="decimal"||t==="numeric"?b.numeric:t==="float"||t==="real"?b.float:t==="double"?b.double:t==="bit"?b.bit:t==="boolean"||t==="bool"?b.boolean:t==="char"?b.char:t==="varchar"?b.varchar:t==="tinytext"?b.tinytext:t==="text"?b.text:t==="mediumtext"?b.mediumtext:t==="longtext"?b.longtext:t==="binary"?b.binary:t==="varbinary"?b.varbinary:t==="tinyblob"?b.tinyblob:t==="blob"?b.blob:t==="mediumblob"?b.mediumblob:t==="longblob"?b.longblob:t==="json"?b.json:t==="date"?b.date:t==="time"?b.time:t==="datetime"?b.datetime:t==="timestamp"?b.timestamp:t==="year"?b.year:t==="enum"?b.enum:t==="set"?b.set:b.text}function Ln(r){let e=r?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?L.number:e==="bit"?L.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?L.date:e==="json"?L.json:L.text}function Fr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="tinyint"?b.tinyint:e==="smallint"?b.smallint:e==="int"?b.int:e==="bigint"?b.bigint:e==="decimal"||e==="numeric"?b.numeric:e==="float"||e==="real"?b.float:e==="money"||e==="smallmoney"?b.money:e==="bit"?b.boolean:e==="char"?b.char:e==="varchar"?b.varchar:e==="text"?b.text:e==="nchar"?b.char:e==="nvarchar"?b.varchar:e==="ntext"?b.text:e==="binary"?b.binary:e==="varbinary"?b.varbinary:e==="image"?b.blob:e==="uniqueidentifier"?b.uuid:e==="date"?b.date:e==="time"?b.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?b.datetime:e==="datetimeoffset"?b.timestamptz:e==="json"?b.json:e==="xml"?b.xml:b.text}function Pn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?L.boolean:e==="json"?L.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?L.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?L.number:L.text}function Hr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?b.int:e==="bigint"||e.startsWith("bigint(")?b.bigint:e==="smallint"||e.startsWith("smallint(")?b.smallint:e==="tinyint"||e.startsWith("tinyint(")?b.tinyint:e==="mediumint"||e.startsWith("mediumint(")?b.mediumint:e.includes("int")?b.int:e==="real"||e==="float"||e.startsWith("float(")?b.float:e==="double"||e==="double precision"||e.startsWith("double(")?b.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?b.numeric:e==="boolean"||e==="bool"?b.boolean:e==="text"||e==="clob"?b.text:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="char"||e.startsWith("char(")?b.char:e==="json"?b.json:e==="date"?b.date:e==="time"?b.time:e==="datetime"?b.datetime:e==="timestamp"?b.timestamp:e==="blob"?b.blob:b.text}function $n(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?L.json:e==="boolean"||e==="bool"?L.boolean:e.startsWith("enum")?L.enum:e==="interval"?L.text:e==="date"||e.startsWith("time")||e==="datetime"?L.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?L.number:L.text}function Kr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?b.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?b.json:e.startsWith("enum")?b.enum:e==="interval"?b.interval:e==="tinyint"||e==="utinyint"?b.tinyint:e==="smallint"||e==="usmallint"?b.smallint:e==="integer"||e==="int"?b.int:e.includes("int")||e==="bignum"?b.bigint:e.startsWith("decimal")||e.startsWith("numeric")?b.numeric:e==="float"||e==="real"?b.float:e==="double"?b.double:e==="boolean"||e==="bool"?b.boolean:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="uuid"?b.uuid:e==="date"?b.date:e==="timestamp with time zone"||e==="timestamptz"?b.timestamptz:e.startsWith("timestamp")||e==="datetime"?b.timestamp:e.startsWith("time")?b.time:e==="blob"||e==="bytea"?b.blob:e==="bit"||e==="bitstring"?b.bit:b.text}function Mn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"?L.boolean:e==="json"?L.json:e==="date"||e.startsWith("timestamp")?L.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?L.number:L.text}function jr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return b.boolean;if(e==="json")return b.json;if(e==="xmltype")return b.xml;if(e==="integer")return b.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return b.smallint;if(n<=10)return b.int;if(n<=19)return b.bigint}return e.startsWith("number")?b.numeric:e==="binary_float"?b.float:e==="binary_double"||e.startsWith("float")?b.double:e.startsWith("varchar")||e.startsWith("nvarchar")?b.varchar:e.startsWith("char")||e.startsWith("nchar")?b.char:e.startsWith("timestamp")&&e.endsWith("time zone")?b.timestamptz:e==="date"||e.startsWith("timestamp")?b.timestamp:e.startsWith("interval")?b.interval:e==="blob"||e==="long raw"?b.blob:e.startsWith("raw")?b.varbinary:b.text}function Mt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function kn(r){let e=Mt(r);return e.startsWith("Array(")?L.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?L.enum:e==="Bool"?L.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?L.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?L.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?L.json:L.text}function Wr(r){let e=Mt(r);return e.startsWith("Array(")?b.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?b.enum:e==="Bool"?b.boolean:/^U?Int8$/.test(e)?b.tinyint:/^U?Int16$/.test(e)?b.smallint:/^U?Int32$/.test(e)?b.int:/^U?Int(64|128|256)$/.test(e)?b.bigint:e==="Float32"||e==="BFloat16"?b.float:e==="Float64"?b.double:e.startsWith("Decimal")?b.numeric:e.startsWith("FixedString(")?b.char:e==="UUID"?b.uuid:e==="IPv4"||e==="IPv6"?b.inet:e==="Date"||e==="Date32"?b.date:e.startsWith("DateTime64")?b.timestamp:e.startsWith("DateTime")?b.datetime:e.startsWith("Time")?b.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?b.json:b.text}var b,ro=R(()=>{"use strict";h();Ur();b={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as we}from"zod";var ao,an,so,eu,Vr,Yr,oo=R(()=>{"use strict";h();Te();ao=["red","orange","amber","green","teal","blue","violet","pink"],an=we.enum(ao),so=we.object({id:we.string(),name:we.string(),color:an.nullable(),lastUsedAt:we.number(),dbType:dt,maskedUrl:we.string()}),eu=we.object({connections:we.array(so),active:we.object({id:we.string().nullable(),dbType:dt,connectionId:we.string()}).nullable()}),Vr=we.object({url:we.string().trim().min(1,"Paste a connection URL")}),Yr=we.object({name:we.string().trim().min(1,"Name is required").max(100).optional(),color:an.nullable().optional()})});import{z as de}from"zod";var io,zr,co,lo,Gr,uo=R(()=>{"use strict";h();io=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],zr=de.enum(io),co=de.object({columnName:de.string("Column name is required"),columnType:de.string("Column type is required"),defaultValue:de.string().optional(),isPrimaryKey:de.boolean().default(!1),isNullable:de.boolean().default(!1),isUnique:de.boolean().default(!1),isIdentity:de.boolean().default(!1),isArray:de.boolean().default(!1)}),lo=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:zr.default("NO ACTION"),onDelete:zr.default("NO ACTION")}),Gr=de.object({tableName:de.string("Table name is required"),fields:de.array(co).min(1,"At least one field is required"),foreignKeys:de.array(lo).optional()})});var K,We,mo=R(()=>{"use strict";h();Te();K={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,rowMutation:!0,indexes:{methods:["btree","hash","gin","gist","spgist","brin"],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},sqlite:{label:"SQLite / libSQL / D1",protocols:["sqlite","libsql","d1"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!1},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"DuckDB cannot alter or rename a table that has an index, or alter or drop a column an index covers."},serverLogs:!1},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},We=r=>Lt.find(e=>K[e].protocols.includes(r))});import{z as Se}from"zod";var po,tu,nu,fo=R(()=>{"use strict";h();Te();po=Se.object({name:Se.string("Name is required"),size:Se.string("Size is required"),owner:Se.string("Owner is required"),encoding:Se.string("Encoding is required")}),tu=Se.object({databases:Se.array(po),dbType:dt}),nu=Se.object({version:Se.string("Version is required"),database:Se.string("Database is required"),user:Se.string("User is required"),host:Se.string("Host is required").nullable(),port:Se.number("Port is required").nullable(),active_connections:Se.coerce.number("Active connections is required"),max_connections:Se.coerce.number("Max connections is required")})});var ho=R(()=>{"use strict";h()});import{z as kt}from"zod";var vn,yo=R(()=>{"use strict";h();vn=kt.object({tableName:kt.string("Table name is required"),primaryKeys:kt.array(kt.object({columnName:kt.string("Column name is required"),value:kt.any()})).min(1,"At least one primary key is required")})});import{z as ru}from"zod";var Qr,go=R(()=>{"use strict";h();Te();Qr=M.extend({cascade:ru.string().optional().transform(r=>r==="true")})});import{z as bo}from"zod";var Jr,To=R(()=>{"use strict";h();Jr=bo.object({query:bo.string("Query is required")})});import{z as au}from"zod";var Eo,Xr,wo=R(()=>{"use strict";h();Te();Eo=["csv","xlsx","json"],Xr=M.extend({format:au.enum(Eo,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var So,su,Un,ou,qn,iu,Co=R(()=>{"use strict";h();Te();So=["primary","unique-constraint","index"],su=ce.object({indexName:ce.string(),columns:ce.array(ce.string()),isUnique:ce.boolean(),isSparse:ce.boolean().optional(),expireAfterSeconds:ce.number().nonnegative().optional(),method:ce.string().nullable(),kind:ce.enum(So),definition:ce.string().nullable()}),Un=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),ou=Un.extend({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName}),qn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),iu=qn.extend({db:v.shape.db,schemaName:M.shape.schemaName})});import{z as E}from"zod";var Bn,k,Zr,ea,cu,ta,vt,lu,uu,mu,du,pu,fu,hu,Ro,yu,na,gu,bu,Tu,Eu,wu,Su,Cu,ra,Ru,Nu,Au,Du,_u,Ou,Iu,xu,Lu,Pu,$u,Mu,ku,vu,Uu,aa,sa,qu,No=R(()=>{"use strict";h();Bn=E.enum(["string","hash","list","set","zset","stream","unknown"]),k=E.object({base64:E.string().max(16*1024*1024).refine(r=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(r),"Invalid unpadded base64url value"),utf8:E.string().optional()}),Zr=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(200).default(50),search:E.string().max(512).optional(),exactPattern:E.stringbool().default(!1),type:Bn.exclude(["unknown"]).optional()}),ea=E.object({key:k,type:Bn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),cu=E.object({keys:E.array(ea),nextCursor:E.string().nullable(),hasMore:E.boolean()}),ta=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(500).default(100),full:E.stringbool().default(!1),direction:E.enum(["forward","backward"]).default("forward")}),vt=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),lu=E.object({kind:E.literal("string"),value:k,truncated:E.boolean()}),uu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k}))}),mu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:k}))}),du=E.object({kind:E.literal("set"),members:E.array(k)}),pu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),fu=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:k,value:k}))}))}),hu=E.object({kind:E.literal("unknown")}),Ro=E.discriminatedUnion("kind",[lu,uu,mu,du,pu,fu,hu]),yu=ea.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Ro,nextCursor:E.string().nullable(),hasMore:E.boolean()}),na=E.object({db:E.string(),offset:E.coerce.number().int().nonnegative().default(0),limit:E.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:E.string().optional()}),gu=E.object({chunk:k,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),bu=E.object({kind:E.literal("string"),value:k}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k})).min(1)}),Eu=E.object({kind:E.literal("list"),entries:E.array(k).min(1)}),wu=E.object({kind:E.literal("set"),members:E.array(k).min(1)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.number()})).min(1)}),Cu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),ra=E.object({key:k,type:Bn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Cu]),ttlMs:E.number().int().positive().nullable().default(null)}),Ru=E.object({key:k,revision:E.string().nullable(),deleted:E.boolean()}),Nu=E.object({action:E.literal("rename"),newKey:k}),Au=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),Du=E.object({action:E.literal("setString"),value:k}),_u=E.object({action:E.literal("upsertHash"),field:k,value:k}),Ou=E.object({action:E.literal("deleteHash"),field:k}),Iu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:k}),xu=E.object({action:E.literal("setList"),index:E.number().int(),value:k}),Lu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Pu=E.object({action:E.literal("addSet"),member:k}),$u=E.object({action:E.literal("removeSet"),member:k}),Mu=E.object({action:E.literal("upsertZset"),member:k,score:E.number()}),ku=E.object({action:E.literal("removeZset"),member:k}),vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),Uu=E.object({action:E.literal("deleteStream"),id:E.string()}),aa=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[Nu,Au,Du,_u,Ou,Iu,xu,Lu,Pu,$u,Mu,ku,vu,Uu])}),sa=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),qu=E.object({deleted:E.boolean()})});var Ao=R(()=>{"use strict";h()});import{z as oa}from"zod";var Fn,Bu,Fu,Do=R(()=>{"use strict";h();Te();On();Fn=oa.object({newColumnName:oa.string("New column name is required")}),Bu=Ee,Fu=oa.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,newColumnName:Fn.shape.newColumnName})});import{z as Hn}from"zod";var sn,Hu,Ku,_o=R(()=>{"use strict";h();Te();sn=Hn.object({newTableName:Hn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Hn.string().trim().min(1).optional()}),Hu=ie,Ku=Hn.object({db:v.shape.db,tableName:ie.shape.tableName,newTableName:sn.shape.newTableName,schemaName:sn.shape.schemaName})});import{z as Me}from"zod";var Oo,Io,ju,xo=R(()=>{"use strict";h();Oo=["fatal","error","warning","info","debug"],Io=Me.enum(Oo),ju=Me.object({ts:Me.string(),level:Io,rawLevel:Me.string(),source:Me.string().optional(),code:Me.string().optional(),message:Me.string(),durationMs:Me.number().optional(),statement:Me.string().optional(),detail:Me.record(Me.string(),Me.string())})});import{z as U}from"zod";var Lo,on,Po,$o,Wu,ia,Mo=R(()=>{"use strict";h();Te();Lo=U.object({columnName:U.string(),operator:U.string(),value:U.string()}),on=["asc","desc"],Po=U.object({columnName:U.string(),direction:U.enum(on)}),$o=U.object({limit:U.number(),total:U.number(),totalEstimated:U.boolean().optional(),hasNextPage:U.boolean(),hasPreviousPage:U.boolean(),nextCursor:U.string().nullable(),prevCursor:U.string().nullable()}),Wu=U.object({data:U.array(U.record(U.string(),U.unknown())),meta:$o}),ia=U.object({db:v.shape.db,schemaName:M.shape.schemaName,cursor:U.string().optional(),limit:U.string().optional().default("50").transform(Number),direction:U.enum(on).optional().default(on[0]),sort:U.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(U.union([U.string(),U.array(Po)])),order:U.enum(on).optional(),filters:U.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(U.array(Lo))})});import{z as cn}from"zod";var Vu,ko=R(()=>{"use strict";h();Vu=cn.object({tableName:cn.string("Table name is required"),schemaName:cn.string().optional(),rowCount:cn.coerce.number("Row count is required"),rowCountEstimated:cn.boolean().optional()})});import{z as vo}from"zod";var Yu,Uo=R(()=>{"use strict";h();Yu=vo.object({schema:vo.string()})});import{z as ke}from"zod";var ca,qo=R(()=>{"use strict";h();ca=ke.object({tableName:ke.string("Table name is required"),primaryKey:ke.string("Primary key is required").default("id"),primaryKeys:ke.array(ke.string().min(1)).min(1).optional(),updates:ke.array(ke.object({rowData:ke.record(ke.string("Column name is required"),ke.any()),columnName:ke.string("Column name is required"),value:ke.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Bo={};It(Bo,{AI_PROVIDERS:()=>zs,AI_PROVIDER_OPTIONS:()=>Gs,CONNECTION_COLORS:()=>ao,DATABASE_ENGINES:()=>K,DATABASE_TYPES:()=>Lt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>io,FORMAT_TYPES:()=>Eo,INDEX_KINDS:()=>So,SERVER_LOG_LEVELS:()=>Oo,StandardizedDataType:()=>b,addColumnParamSchema:()=>Hl,addColumnParamsSchema:()=>Kl,addColumnSchema:()=>Be,addRecordSchema:()=>xr,aiProviderSchema:()=>Lr,alterColumnParamSchema:()=>Yl,alterColumnParamsSchema:()=>zl,alterColumnSchema:()=>Pt,bulkInsertRecordsSchema:()=>kr,chatSchema:()=>vr,columnInfoSchema:()=>Zl,connectUrlSchema:()=>Vr,connectionColorSchema:()=>an,connectionInfoSchema:()=>nu,connectionSummarySchema:()=>so,connectionsStateSchema:()=>eu,createIndexParamsSchema:()=>ou,createIndexSchema:()=>Un,createKeySchema:()=>ra,createTableSchema:()=>Gr,currentDatabaseSchema:()=>Bl,dataTypesSchema:()=>to,databaseInfoSchema:()=>po,databaseListSchema:()=>tu,databaseSchema:()=>v,databaseTypeParamSchema:()=>Fl,databaseTypeSchema:()=>dt,dbTypeFromProtocol:()=>We,deleteColumnParamSchema:()=>Ee,deleteColumnParamsSchema:()=>Wl,deleteColumnQuerySchema:()=>Mr,deleteColumnSuccessResponseSchema:()=>Vl,deleteKeyQuerySchema:()=>sa,deleteKeyResultSchema:()=>qu,deleteRecordSchema:()=>vn,deleteTableQuerySchema:()=>Qr,dropIndexParamSchema:()=>qn,dropIndexParamsSchema:()=>iu,encodedRedisValueSchema:()=>k,executeQuerySchema:()=>Jr,exportTableSchema:()=>Xr,fieldDataSchema:()=>co,filterSchema:()=>Lo,foreignKeyActionSchema:()=>zr,foreignKeyDataSchema:()=>lo,getDefaultAiModel:()=>Pr,indexInfoSchema:()=>su,keyActionSchema:()=>aa,keyDetailsQuerySchema:()=>ta,keyDetailsResultSchema:()=>yu,keyParamSchema:()=>vt,keyRawQuerySchema:()=>na,keyRawResultSchema:()=>gu,keyScanQuerySchema:()=>Zr,keyScanResultSchema:()=>cu,keyWriteResultSchema:()=>Ru,mapClickhouseToDataType:()=>kn,mapDuckdbToDataType:()=>$n,mapMssqlToDataType:()=>Ln,mapMysqlToDataType:()=>xn,mapOracleToDataType:()=>Mn,mapPostgresToDataType:()=>In,mapSqliteToDataType:()=>Pn,redisKeySummarySchema:()=>ea,redisKeyTypeSchema:()=>Bn,redisKeyValueSchema:()=>Ro,renameColumnParamSchema:()=>Bu,renameColumnParamsSchema:()=>Fu,renameColumnSchema:()=>Fn,renameTableParamSchema:()=>Hu,renameTableParamsSchema:()=>Ku,renameTableSchema:()=>sn,serverLogEntrySchema:()=>ju,serverLogLevelSchema:()=>Io,sortDirections:()=>on,sortSchema:()=>Po,standardizeClickhouseDataTypeLabel:()=>Wr,standardizeDataTypeLabel:()=>qr,standardizeDuckdbDataTypeLabel:()=>Kr,standardizeMssqlDataTypeLabel:()=>Fr,standardizeMysqlDataTypeLabel:()=>Br,standardizeOracleDataTypeLabel:()=>jr,standardizeSqliteDataTypeLabel:()=>Hr,standardizedDataTypeSchema:()=>no,tableDataMetaSchema:()=>$o,tableDataQuerySchema:()=>ia,tableDataResultSchema:()=>Wu,tableInfoSchema:()=>Vu,tableNameSchema:()=>ie,tableQuerySchema:()=>M,tableSchemaResultSchema:()=>Yu,unwrapClickhouseType:()=>Mt,updateConnectionSchema:()=>Yr,updateRecordsSchema:()=>ca});var j=R(()=>{"use strict";h();Vs();Ys();$r();Qs();Js();Xs();Zs();eo();ro();Ur();oo();uo();Te();mo();fo();ho();On();yo();go();To();wo();Co();No();Ao();Do();_o();xo();Mo();ko();Uo();qo()});var zu,Gu,Qu,Kn,la=R(()=>{"use strict";h();j();zu=Object.values(K).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),Gu=new RegExp(`\\b(?:${zu}):\\/\\/\\S+`,"gi"),Qu=/\b(authToken=)[^&\s]+/gi,Kn=r=>r.replace(Gu,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(Qu,"$1[redacted]")});var d,X=R(()=>{"use strict";h();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}}});import{AsyncLocalStorage as Zu}from"async_hooks";import{randomUUID as Ho}from"crypto";var em,tm,jn,Ko,jo,it,ua,nm,rm,am,Wo,ma,fe,Z,Ve=R(()=>{"use strict";h();X();em=Ho(),tm=/^[A-Za-z0-9_-]{8,64}$/,jn=new Zu,Ko=r=>r&&tm.test(r)?r:Ho(),jo=(r,e)=>jn.run(r,e),it=()=>jn.getStore()?.requestId,ua=()=>jn.getStore()?.connectionId,nm=r=>{let e=r instanceof d?"HTTPException":r instanceof Error?r.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},rm=/^[A-Z0-9_-]{2,32}$/,am=[[/^timeout exceeded when trying to connect$/,"POOL_ACQUIRE_TIMEOUT"],[/^(timeout expired|Connection terminated due to connection timeout)$/,"CONNECT_TIMEOUT"],[/^Connection terminated/,"CONNECTION_TERMINATED"],[/^Client has encountered a connection error/,"CONNECTION_BROKEN"]],Wo=r=>{if(!(r instanceof Error))return;let{code:e,errno:t,number:n,cause:a}=r;return typeof n=="number"&&Number.isSafeInteger(n)?String(n):typeof e=="string"&&rm.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):r.name==="ReplyError"?r.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:am.find(([s])=>s.test(r.message))?.[1]??Wo(a)},ma=r=>r instanceof d&&r.cause?r.cause:r,fe=r=>{let e=ma(r);return{error_type:nm(e),error_code:Wo(e)}},Z=(r,e,t={})=>{let n=jn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:em,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
3
+ `)}});function _e(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||sm(e)}}catch(e){return Z("error","database_url_unparseable",fe(e)),{host:"localhost",port:5432}}}var Wn,sm,Vo,Ye=R(()=>{"use strict";h();j();Ve();Wn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},sm=r=>{let e=r.protocol.replace(":",""),t=We(e);return Wn[e]?.defaultPort??(t&&K[t].defaultPort)??5432},Vo=r=>{let e=new URL(r),t=Wn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Tt,da=R(()=>{Tt={name:"db-studio",type:"module",version:"2.0.1",description:"Every database. One studio. Browse tables, edit records, design schemas, and run queries across SQL, document, and key-value databases. Free and open source.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <husam@ql3.dev>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"Apache-2.0",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"portless run","dev:app":"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify",prepack:"cd ../web && bun run build && cd ../server && bun run build",start:`sh -c 'APP_PORT=\${PORT:-3333}; portless proxy start >/dev/null && portless alias db-studio "$APP_PORT" --force >/dev/null && HOST=127.0.0.1 PORT="$APP_PORT" DB_STUDIO_SERVER_URL=https://db-studio.localhost node dist/index.js'`,format:"biome check --write --unsafe",typecheck:"tsc --noEmit",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",e2e:"tsx e2e/contract.ts","e2e:perf":"tsx e2e/perf.ts","e2e:grid":"tsx e2e/grid.ts","e2e:schema-routing":"tsx e2e/schema-routing.ts","e2e:visualizer":"tsx e2e/visualizer.ts"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@clickhouse/client":"^1.24.0","@duckdb/node-api":"^1.5.6-r.1","@elysiajs/cors":"^1.4.2","@elysiajs/node":"^1.4.5","@libsql/client":"^0.18.0","@sentry/node":"^10.73.0",commander:"^15.0.0",dotenv:"^18.0.0",elysia:"^1.4.30",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",oracledb:"^7.0.1",pg:"^8.20.0",picocolors:"^1.1.1","posthog-node":"^5.20.0",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/oracledb":"^7.0.3","@types/pg":"^8.16.0","@vitest/coverage-v8":"^5.0.0","playwright-core":"1.61.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^5.0.0"}}});var ti={};It(ti,{captureInstallationActive:()=>ga,captureServerError:()=>ba,captureServerEvent:()=>Qn,databaseTypeForRequest:()=>mn,durationBucket:()=>ha,flushServerObservability:()=>Sm,getTelemetryConfig:()=>zn,initServerObservability:()=>ei,operationForRequest:()=>un,outcomeForStatus:()=>ya,resetTelemetryId:()=>fa,setTelemetryEnabled:()=>Gn,startServerSpan:()=>Ta});import{randomUUID as Jo}from"crypto";import{existsSync as mm,mkdirSync as dm,readFileSync as pm,writeFileSync as fm}from"fs";import{homedir as pa,platform as hm}from"os";import Vn from"path";import*as Le from"@sentry/node";import{PostHog as ym}from"posthog-node";var gm,Xo,Yn,bm,Tm,pt,Et,Em,wm,wt,ln,zn,Gn,fa,ha,ya,Zo,un,mn,ei,Sm,Qn,ga,Cm,ba,Ta,dn=R(()=>{"use strict";h();j();Ve();da();gm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",Xo=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Vn.join(pa(),".local","state"));return Vn.join(r||Vn.join(pa(),".db-studio"),"db-studio","telemetry.json")},Yn=r=>{try{let e=Xo();dm(Vn.dirname(e),{recursive:!0}),fm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},bm=()=>({installationId:Jo(),enabled:!0}),Tm=()=>{let r=Xo();try{if(mm(r)){let t=JSON.parse(pm(r,"utf8"));if(typeof t.installationId=="string"&&typeof t.enabled=="boolean")return{installationId:t.installationId,enabled:t.enabled,lastActiveAt:typeof t.lastActiveAt=="string"?t.lastActiveAt:void 0}}}catch{}let e=bm();return Yn(e),e},Em="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",wm="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",wt=()=>pt??=Tm(),ln=()=>!gm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&wt().enabled,zn=()=>({enabled:ln(),installationId:wt().installationId,appVersion:Tt.version}),Gn=r=>{pt={...wt(),enabled:r},Yn(pt),r?(Et?.enable(),ei()):(Et?.disable(),Le.close(500))},fa=()=>(pt={...wt(),installationId:Jo(),lastActiveAt:void 0},Yn(pt),pt.installationId),ha=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",ya=r=>r>=500?"server_error":r>=400?"client_error":"success",Zo=new RegExp(`^/api/(${Lt.join("|")})(?=/|$)`),un=(r,e)=>{let t=e.replace(Zo,"/api"),a=[[/^\/api\/databases(?:\/|$)/,"databases"],[/^\/api\/tables(?:\/|$)/,"tables"],[/^\/api\/records(?:\/|$)/,"records"],[/^\/api\/query(?:\/|$)/,"query"],[/^\/api\/keys(?:\/|$)/,"keys"],[/^\/api\/chat(?:\/|$)/,"chat"]].find(([s])=>s.test(t))?.[1]??"other";return`${r.toLowerCase()}_${a}`},mn=r=>r.match(Zo)?.[1],ei=()=>{if(!ln())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Em;r&&(!Le.isInitialized()||Le.getClient()?.getOptions().enabled===!1)&&Le.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${Tt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:wt().installationId},delete t.breadcrumbs,delete t.server_name,t},beforeSendSpan(t){return{...t,data:Object.fromEntries(Object.entries(t.data??{}).filter(([n])=>n.startsWith("db_studio.")))}}});let e=process.env.DB_STUDIO_POSTHOG_KEY??wm;e&&!Et&&(Et=new ym(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Sm=()=>Promise.allSettled([Et?.shutdown(2e3),Le.close(2e3)]),Qn=r=>{!ln()||!Et||Et.capture({distinctId:wt().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:Tt.version,$geoip_disable:!1}})},ga=()=>{if(!ln())return;let r=wt(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(pt={...r,lastActiveAt:new Date().toISOString()},Yn(pt),Qn({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:hm()}}))},Cm=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=pa(),s=r.stack.split(`
4
4
  `).slice(1).filter(o=>/^\s*at\s/.test(o)).map(o=>o.replaceAll(a,"~"));n.stack=[`${e}: ${t}`,...s].join(`
5
5
  `)}return n},ba=(r,{operation:e,status:t,dbType:n})=>{if(!ln()||t<500)return;let{error_type:a,error_code:s}=fe(r),o=it(),i=`${e} failed with ${t}${s?` ${s}`:""}`;Le.captureException(Cm(ma(r),a,i),{tags:{operation:e,source:"server",release:Tt.version,status:String(t),...n?{db_type:n}:{},error_type:a,...s?{error_code:s}:{},...o?{request_id:o}:{}},fingerprint:[e,String(t),a,s??"unknown"]})},Ta=(r,e,t)=>Le.startSpan({name:r,op:"http.server",attributes:{"db_studio.operation":r,...e?{"db_studio.db_type":e}:{}}},t)});var ni={};It(ni,{checkDatabaseConnection:()=>wa,getDatabaseConnectionDetails:()=>Nm});var Rm,Ea,Nm,wa,Sa=R(()=>{"use strict";h();j();Ye();Rm=2e3,Ea=async r=>{let e;try{return await Promise.race([r,new Promise((t,n)=>{e=setTimeout(()=>n(new Error("Database startup check timed out")),Rm)})])}finally{e&&clearTimeout(e)}},Nm=r=>{let e=We(r.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{label:t,defaultPort:n}=K[e];if(r.startsWith("sqlite://"))return{type:e,name:t,destination:"local file"};if(r.startsWith("d1://"))return{type:e,name:t,destination:"Cloudflare D1"};if(n===null)return{type:e,name:t,destination:new URL(r).host};let{host:a,port:s}=_e(r);return{type:e,name:t,destination:`${a}:${s}`}},wa=async r=>{switch(r.getDbType()){case"pg":await Ea(r.getPgPool().then(e=>e.query("SELECT 1")));return;case"mysql":await(await r.getMysqlPool()).query("SELECT 1");return;case"mssql":await(await r.getMssqlPool()).request().query("SELECT 1");return;case"mongodb":{await(await r.getMongoClient()).db(r.getMongoDbName()).command({ping:1});return}case"sqlite":await Ea(r.getSqliteClient().then(e=>e.execute("SELECT 1")));return;case"redis":await(await r.getRedisClient()).ping();return;case"duckdb":await r.withDuckdbConnection(e=>e.run("SELECT 1"));return;case"oracle":{let e=await(await r.getOraclePool()).getConnection();await e.execute("SELECT 1 FROM dual").finally(()=>e.close());return}case"clickhouse":await Ea(r.getClickhouseClient().then(e=>e.query({query:"SELECT 1"})))}}});import{randomUUID as Am}from"crypto";import{chmod as Dm,mkdir as _m,readFile as Om,rename as Im,writeFile as xm}from"fs/promises";import{homedir as Lm}from"os";import{basename as Pm,join as si,resolve as $m}from"path";import{z as ft}from"zod";var Mm,km,oi,Jn,ri,ii,vm,Um,qt,ci,qm,ai,Ca,Bm,Ra,Na,Aa,Da,li,ui,mi,di,_a=R(()=>{"use strict";h();j();X();Mm=ft.object({id:ft.string(),name:ft.string(),url:ft.string(),color:an.nullable(),lastUsedAt:ft.number()}),km=ft.object({version:ft.literal(1),connections:ft.array(Mm)}),oi=()=>process.env.DB_STUDIO_CONFIG_DIR??si(Lm(),".dbstudio"),Jn=()=>si(oi(),"connections.json"),ri="\u2022\u2022\u2022\u2022",ii=/^(sqlite|duckdb):\/\/(.*)$/,vm=new Set(["authtoken","password","token"]),Um=r=>{try{return decodeURIComponent(r.replaceAll("+"," ")).toLowerCase()}catch{return r.toLowerCase()}},qt=r=>r.replace(/^([a-z][a-z0-9+.-]*:\/\/[^:/@?#]*:)[^/?#]*@/i,`$1${ri}@`).replace(/([?&])([^=&#]*)=[^&#]*/g,(e,t,n)=>vm.has(Um(n))?`${t}${n}=${ri}`:e),ci=(r,e=process.cwd())=>{let t=r.trim(),n=t.match(ii);if(!n)return t;let[,a,s=""]=n;return s===":memory:"||s.startsWith("/")?t:`${a}://${$m(e,s)}`},qm=r=>{let e=r.match(ii);if(e)return Pm(e[2]??"")||r;try{let t=new URL(r),n=decodeURIComponent(t.pathname.replace(/^\/+|\/+$/g,""));return n?`${t.hostname}/${n}`:t.hostname}catch{return qt(r)}},ai=r=>qt(r),Ca=async()=>{let r;try{r=await Om(Jn(),"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}let e=km.safeParse(JSON.parse(r));if(!e.success)throw new Error(`${Jn()} is not a valid connections file`);return e.data.connections},Bm=async r=>{let e=oi();await _m(e,{recursive:!0,mode:448}),await Dm(e,448);let t=`${Jn()}.${process.pid}.tmp`;await xm(t,`${JSON.stringify({version:1,connections:r},null," ")}
6
6
  `,{mode:384}),await Im(t,Jn())},Ra=Promise.resolve(),Na=r=>{let e=Ra.then(async()=>{let[t,n]=r(await Ca());return await Bm(t),n});return Ra=e.catch(()=>{}),e},Aa=()=>new d(404,{message:"Saved connection not found"}),Da=()=>Ra.then(Ca,Ca),li=async r=>{let e=(await Da()).find(t=>t.id===r);if(!e)throw Aa();return e},ui=r=>Na(e=>{let t=e.find(a=>ai(a.url)===ai(r)),n=t?{...t,url:r,lastUsedAt:Date.now()}:{id:Am(),name:qm(r),url:r,color:null,lastUsedAt:Date.now()};return[t?e.map(a=>a.id===n.id?n:a):[...e,n],n]}),mi=(r,{name:e,color:t})=>Na(n=>{let a=n.find(o=>o.id===r);if(!a)throw Aa();let s={...a,name:e??a.name,color:t===void 0?a.color:t};return[n.map(o=>o.id===r?s:o),s]}),di=r=>Na(e=>{if(!e.some(t=>t.id===r))throw Aa();return[e.filter(t=>t.id!==r),void 0]})});import{statSync as Fm}from"fs";var Oa,Hm,pi,Ia=R(()=>{"use strict";h();Oa=r=>r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`,Hm=r=>{if(!r)return"in-memory";try{return Oa(Fm(r).size)}catch{return"N/A"}},pi=r=>({execute:e=>r.execute(e),batch:(e,t)=>r.batch(e,t),rebuildTable:async e=>{await r.migrate(e)},info:async()=>{let[e,t]=await Promise.all([r.execute("PRAGMA database_list"),r.execute("SELECT sqlite_version()")]),n=e.rows.find(a=>a.name==="main")?.file;return{name:"main",size:r.protocol==="file"?Hm(typeof n=="string"?n:""):"N/A",version:`SQLite ${t.rows[0]?.[0]}`}},close:()=>r.close()})});var yi,Km,jm,Wm,fi,hi,gi,bi=R(()=>{"use strict";h();X();Ia();yi=r=>{let{host:e,pathname:t,searchParams:n}=new URL(r),a=decodeURIComponent(t.slice(1)),s=n.get("authToken")||process.env.CLOUDFLARE_API_TOKEN;if(!e)throw new Error("The Cloudflare D1 URL has no account id: put it where the host goes");if(!a)throw new Error("The Cloudflare D1 URL has no database id: put it where the path goes");if(!s)throw new Error("The Cloudflare D1 URL has no authToken parameter and CLOUDFLARE_API_TOKEN is not set");return{accountId:e,databaseId:a,token:s}},Km=BigInt(Number.MIN_SAFE_INTEGER),jm=BigInt(Number.MAX_SAFE_INTEGER),Wm=r=>typeof r!="bigint"?r:r>=Km&&r<=jm?Number(r):r.toString(),fi=r=>typeof r=="string"?{sql:r,params:[]}:{sql:r.sql,params:r.args.map(Wm)},hi=({results:r,meta:e})=>({columns:r.columns,rows:r.rows.map(t=>t.map(n=>Array.isArray(n)?Uint8Array.from(n).buffer:n)),rowsAffected:e.changes}),gi=({accountId:r,databaseId:e,token:t})=>{let n=`https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(r)}/d1/database/${encodeURIComponent(e)}`,a=async(o,i)=>{let c=await fetch(`${n}${o}`,{method:i===void 0?"GET":"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:i===void 0?void 0:JSON.stringify(i),signal:AbortSignal.timeout(3e4)}),l=await c.text(),u;try{u=JSON.parse(l)}catch{u=void 0}let m=u?.errors?.[0]?.message;if(c.status===401||c.status===403)throw new Error(`${m??"Cloudflare D1 refused the API token"} (HTTP status ${c.status})`);if(!u?.success||u.result===null)throw new Error(m??`Cloudflare D1 request failed with HTTP status ${c.status}`);return u.result},s=async o=>o.length?(await a("/raw",{batch:o.map(fi)})).map(hi):[];return{execute:async o=>hi((await a("/raw",fi(o)))[0]),batch:s,rebuildTable:async(o,i)=>{if(i.length){let c=i.map(u=>`"${u}"`).join(", "),l=i.length===1?"references":"reference";throw new d(400,{message:`Cloudflare D1 always enforces foreign keys, so changing a column of a table that ${c} ${l} would delete or block their rows`})}await s(o)},info:async()=>{let{name:o,file_size:i}=await a("");return{name:o,size:Oa(i),version:"Cloudflare D1"}},close:()=>{}}}});var Vm,pn,ze,Ke,Ge,Bt,St=R(()=>{"use strict";h();Vm={pg:()=>import("pg"),mysql:()=>import("mysql2/promise"),mssql:()=>import("mssql").then(r=>r.default),mongodb:()=>import("mongodb"),sqlite:()=>import("@libsql/client"),redis:()=>import("ioredis"),duckdb:()=>import("@duckdb/node-api"),oracle:()=>import("oracledb").then(r=>r.default),clickhouse:()=>import("@clickhouse/client")},pn={},ze=async r=>{let e=pn[r]??await Vm[r]();return pn[r]=e,e},Ke=r=>{let e=pn[r];if(!e)throw new Error(`The ${r} driver is used before a connection opened`);return e},Ge=r=>pn.pg!==void 0&&r instanceof pn.pg.DatabaseError,Bt=r=>Ge(r)&&r.code?.startsWith("23")===!0});var za={};It(za,{DatabaseManager:()=>Ht,closeAllDbPools:()=>Qm,coerceObjectId:()=>gn,getClickhouseClient:()=>va,getConnectionUrl:()=>Ua,getDbPool:()=>$a,getDbType:()=>Ct,getIsolatedRedisClient:()=>Va,getMongoClient:()=>Ha,getMongoDb:()=>ja,getMongoDbName:()=>Ka,getMssqlPool:()=>ka,getMysqlPool:()=>Ma,getOpenConnection:()=>hn,getOraclePool:()=>Fa,getRedisClient:()=>Wa,getRedisDefaultDb:()=>Ya,getSqliteClient:()=>qa,isValidObjectId:()=>yn,latestConnectionId:()=>La,openConnection:()=>xa,requestConnectionId:()=>Pa,withDuckdbConnection:()=>Ba});import{resolve as Ym}from"path";import{pathToFileURL as zm}from"url";var Ft,Ht,fn,Xn,Gm,xa,hn,La,Pa,Ce,$a,Ma,ka,va,Ct,Ua,Qm,qa,Ba,Fa,Ha,Ka,ja,Wa,Va,Ya,yn,gn,Qe=R(()=>{"use strict";h();j();bi();St();X();Ve();Ia();Ye();Ft=r=>{try{return decodeURIComponent(r.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return r}},Ht=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;sqliteClient=null;duckdb=null;duckdbQueue=Promise.resolve();oraclePool=null;redisClients=new Map;redisClusterChecked=!1;clickhouseClients=new Map;baseConfig;constructor(e=null){this.baseConfig=e?this.parseConfig(e):null}detectDbType(e){let t=e.protocol.replace(":",""),n=We(t);if(n)return n;let a=Object.values(K).map(({label:s,protocols:o})=>`${s} (${o.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}parseConfig(e){let t=We(e.split("://")[0]);if(t&&K[t].defaultPort===null)return{url:e,host:"localhost",port:0,user:"",password:"",dbType:t};let n,a;try{n=Vo(e),a=new URL(n)}catch{throw new Error("The connection URL is not a valid URL")}let s=this.detectDbType(a);return{url:n,host:a.hostname,port:Number.parseInt(a.port,10)||(K[s].defaultPort??0),user:Ft(a.username),password:Ft(a.password),dbType:s}}config(){if(!this.baseConfig)throw new d(409,{message:"No database is connected"});return this.baseConfig}getDbType(){return this.config().dbType}getConnectionUrl(){return this.config().url}buildConnectionString(e){let t=this.config();if(K[t.dbType].defaultPort===null)return t.url;try{let n=new URL(t.url);return e&&(n.pathname=`/${encodeURIComponent(e)}`),n.toString()}catch(n){throw new Error(`Failed to build connection string for database "${e}": ${n instanceof Error?n.message:String(n)}`)}}getSqliteClient(){let{url:e,dbType:t}=this.config();if(t!=="sqlite")throw new Error("The connection is not a sqlite://, libsql:// or d1:// connection");return this.sqliteClient??=this.openSqliteClient(e).catch(n=>{throw this.sqliteClient=null,n}),this.sqliteClient}async openSqliteClient(e){if(e.startsWith("d1://"))return gi(yi(e));let t=e.startsWith("sqlite://")?e.slice(9):null,n=t===null?e:t===":memory:"?t:zm(Ym(t)).href,{createClient:a}=await ze("sqlite"),s=a({url:n,intMode:"bigint"});return s.protocol==="file"&&(await s.execute("PRAGMA journal_mode = WAL"),await s.execute("PRAGMA foreign_keys = ON")),pi(s)}async closeSqliteClient(){let e=this.sqliteClient;this.sqliteClient=null,e&&(await e.catch(()=>null))?.close()}withDuckdbConnection(e){let t=this.duckdbQueue.then(async()=>e((await this.openDuckdb()).connection));return this.duckdbQueue=t.catch(()=>{}),t}openDuckdb(){let e=this.config();if(e.dbType!=="duckdb")throw new Error("The connection is not a duckdb:// connection");if(!this.duckdb){let t=e.url.replace(/^duckdb:\/\//,"");this.duckdb=(async()=>{try{let{DuckDBInstance:n}=await ze("duckdb"),a=await n.create(t,{checkpoint_threshold:"0b"});return{instance:a,connection:await a.connect()}}catch(n){this.duckdb=null;let a=n instanceof Error?n.message:String(n);throw a.includes("Could not set lock on file")?new Error(`The DuckDB file "${t}" is locked by another process. Close the other program using it and try again. (${a})`):n}})()}return this.duckdb}async closeDuckdb(){let e=this.duckdb;this.duckdb=null;let t=await e?.catch(()=>null);t?.connection.closeSync(),t?.instance.closeSync()}getOraclePool(){let{url:e,host:t,port:n,user:a,password:s,dbType:o}=this.config();if(o!=="oracle")throw new Error("The connection is not an oracle:// connection");let i=decodeURIComponent(new URL(e).pathname.slice(1));return this.oraclePool??=ze("oracle").then(c=>c.createPool({user:a,password:s,connectString:`${t}:${n}/${i}`,poolMin:0,poolMax:10,connectTimeout:5,sessionCallback:(l,u,m)=>{l.execute("ALTER SESSION SET TIME_ZONE = '+00:00'").then(()=>l.execute(`ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9' NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM' NLS_NUMERIC_CHARACTERS = '.,'`)).then(()=>m(),m)}})).catch(c=>{throw this.oraclePool=null,c}),this.oraclePool}async closeOraclePool(){let e=this.oraclePool;this.oraclePool=null,await(await e?.catch(()=>null))?.close(0)}async getPgPool(e){let t=this.buildConnectionString(e),{Pool:n}=await ze("pg");if(!this.pgPools.has(t)){let a={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:1e4},s=new n({...a,onConnect:o=>o.query(`SELECT set_config(
@@ -470,7 +470,7 @@ ${p}`}}return t},yp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
470
470
  ORDER BY m.name, f.id, f.seq`),n=new Map,a=new Map;for(let s of t){let o=`${s.child}\0${s.id}`,i=n.get(o);i||(i={childTable:s.child,childColumns:[],parentColumns:[]},n.set(o,i),a.set(s.parent,[...a.get(s.parent)??[],i])),i.childColumns.push(s.from),i.parentColumns.push(s.to)}return a}async getFkReferencesForTable(e,t,{includeSelf:n=!1}={}){return(await G(e,`SELECT m.name AS child, f."from", f."to"
471
471
  FROM sqlite_master m JOIN pragma_foreign_key_list(m.name) f
472
472
  WHERE m.type = 'table' AND m.name NOT LIKE 'sqlite_%' AND m.name NOT GLOB '_cf_*'
473
- AND (m.name != ? COLLATE NOCASE OR ?) AND f."table" = ? COLLATE NOCASE`,[t,n?1:0,t])).map(s=>({constraintName:`fk_${s.child}_${s.from}_${t}_${s.to}`,referencingTable:s.child,referencingColumn:s.from,referencedTable:t,referencedColumn:s.to??""}))}async getRelatedRecordsForTable(e,t){let n=await this.getFkReferencesForTable(e,t),a=[];for(let s of n){let o=await G(e,`SELECT * FROM "${s.referencingTable}" LIMIT 100`);o.length>0&&a.push({tableName:s.referencingTable,columnName:s.referencingColumn,constraintName:s.constraintName,records:o})}return a}async getRelatedRecords(e,t,n){let a=await this.getFkReferencesForTable(e,t),s=[];for(let o of a){if(!n.find(m=>m.columnName===o.referencedColumn))continue;let c=n.map(m=>m.value),l=c.map(()=>"?").join(", "),u=await G(e,`SELECT * FROM "${o.referencingTable}" WHERE "${o.referencingColumn}" IN (${l}) LIMIT 100`,c);u.length>0&&s.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:u})}return s}}});function zc(){ge.register("pg",new Tr),ge.register("mysql",new hr),ge.register("mssql",new dr),ge.register("mongodb",new ur),ge.register("sqlite",new Rr),ge.register("redis",new Cr),ge.register("duckdb",new ir),ge.register("oracle",new gr),ge.register("clickhouse",new ar)}var Gc=R(()=>{"use strict";h();Rt();Oi();ki();Wi();Qi();Zi();yc();Rc();Uc();Yc()});import{NotFoundError as of,ParseError as cf,ValidationError as lf}from"elysia";import{ZodError as uf}from"zod";function Qc(r,e){let{pathname:t}=new URL(e.url),n=un(e.method,t),a=mn(t),{status:s,body:o}=df(r);return Z(s>=500?"error":"warn","request_failed",{operation:n,db_type:a,method:e.method,status:s,...fe(r)}),ba(r,{operation:n,status:s,dbType:a}),Response.json({...o,requestId:it()},{status:s})}var mf,df,Jc=R(()=>{"use strict";h();St();X();dn();Ve();mf=r=>{let e=r;return e.code==="ECONNREFUSED"||e.code==="ENOTFOUND"||e.code==="ETIMEDOUT"||e.code==="ER_ACCESS_DENIED_ERROR"||e.code==="ER_BAD_HOST_ERROR"||e.code==="ECONNRESET"||e.errno===1045||e.errno===2003||e.errno===2002||r.message.includes("ECONNREFUSED")||r.message.includes("connection refused")||r.message.includes("timeout expired")||r.message.includes("Connection terminated")||r.message.includes("MongoNetworkError")||r.message.includes("MongoServerSelectionError")||Ge(r)&&r.code?.startsWith("08")===!0},df=r=>r instanceof d?{status:r.status,body:{error:r.message}}:r instanceof lf?{status:400,body:{error:"Validation error",details:r.all[0]?.message??"Invalid request"}}:r instanceof uf?{status:400,body:{error:"Validation error",details:r.issues[0].message}}:r instanceof cf?{status:400,body:{error:"Malformed JSON in request body"}}:r instanceof of?{status:404,body:{error:"Not found"}}:Bt(r)?{status:409,body:{error:r.message}}:Ge(r)&&r.code==="42501"?{status:403,body:{error:r.message}}:r instanceof Error&&mf(r)?{status:503,body:{error:"Database connection failed",details:r.message}}:{status:500,body:{error:r instanceof Error?r.message:"Internal server error"}}});function Zc(r){if(!r)return`You are a database assistant for db-studio. Keep answers concise and focused.
473
+ AND (m.name != ? COLLATE NOCASE OR ?) AND f."table" = ? COLLATE NOCASE`,[t,n?1:0,t])).map(s=>({constraintName:`fk_${s.child}_${s.from}_${t}_${s.to}`,referencingTable:s.child,referencingColumn:s.from,referencedTable:t,referencedColumn:s.to??""}))}async getRelatedRecordsForTable(e,t){let n=await this.getFkReferencesForTable(e,t),a=[];for(let s of n){let o=await G(e,`SELECT * FROM "${s.referencingTable}" LIMIT 100`);o.length>0&&a.push({tableName:s.referencingTable,columnName:s.referencingColumn,constraintName:s.constraintName,records:o})}return a}async getRelatedRecords(e,t,n){let a=await this.getFkReferencesForTable(e,t),s=[];for(let o of a){if(!n.find(m=>m.columnName===o.referencedColumn))continue;let c=n.map(m=>m.value),l=c.map(()=>"?").join(", "),u=await G(e,`SELECT * FROM "${o.referencingTable}" WHERE "${o.referencingColumn}" IN (${l}) LIMIT 100`,c);u.length>0&&s.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:u})}return s}}});function zc(){ge.register("pg",new Tr),ge.register("mysql",new hr),ge.register("mssql",new dr),ge.register("mongodb",new ur),ge.register("sqlite",new Rr),ge.register("redis",new Cr),ge.register("duckdb",new ir),ge.register("oracle",new gr),ge.register("clickhouse",new ar)}var Gc=R(()=>{"use strict";h();Rt();Oi();ki();Wi();Qi();Zi();yc();Rc();Uc();Yc()});import{NotFoundError as of,ParseError as cf,ValidationError as lf}from"elysia";import{ZodError as uf}from"zod";function Qc(r,e){let{pathname:t}=new URL(e.url),n=un(e.method,t),a=mn(t),{status:s,body:o}=df(r);return Z(s>=500?"error":"warn","request_failed",{operation:n,db_type:a,method:e.method,status:s,...fe(r)}),ba(r,{operation:n,status:s,dbType:a}),Response.json({...o,requestId:it()},{status:s})}var mf,df,Jc=R(()=>{"use strict";h();St();X();dn();Ve();mf=r=>{let e=r;return e.code==="ECONNREFUSED"||e.code==="ENOTFOUND"||e.code==="ETIMEDOUT"||e.code==="ER_ACCESS_DENIED_ERROR"||e.code==="ER_BAD_HOST_ERROR"||e.code==="ECONNRESET"||e.errno===1045||e.errno===2003||e.errno===2002||r.message.includes("ECONNREFUSED")||r.message.includes("connection refused")||r.message.includes("timeout expired")||r.message.includes("Connection terminated")||r.message.includes("MongoNetworkError")||r.message.includes("MongoServerSelectionError")||Ge(r)&&r.code?.startsWith("08")===!0},df=r=>r instanceof d?{status:r.status,body:{error:r.message}}:r instanceof lf?{status:400,body:{error:"Validation error",details:r.all[0]?.message??"Invalid request"}}:r instanceof uf?{status:400,body:{error:"Validation error",details:r.issues[0].message}}:r instanceof cf?{status:400,body:{error:"Malformed JSON in request body"}}:r instanceof of?{status:404,body:{error:"Not found"}}:r instanceof RangeError&&r.message==="Invalid string length"?{status:400,body:{error:"The result is too large to send. Add a LIMIT or select fewer rows or columns."}}:Bt(r)?{status:409,body:{error:r.message}}:Ge(r)&&r.code==="42501"?{status:403,body:{error:r.message}}:r instanceof Error&&mf(r)?{status:503,body:{error:"Database connection failed",details:r.message}}:{status:500,body:{error:r instanceof Error?r.message:"Internal server error"}}});function Zc(r){if(!r)return`You are a database assistant for db-studio. Keep answers concise and focused.
474
474
 
475
475
  The user chose not to share their database schema. Do not claim to know their table or column names. Ask for the minimum missing details needed to answer accurately, generate queries in fenced code blocks, and warn before potentially destructive or expensive operations.`;let e=r.dbType.toLowerCase(),t=K[r.dbType].label;return e.includes("mongo")?`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
476
476
 
@@ -598,7 +598,7 @@ This will return the 5 customers with the highest total order value. You might a
598
598
  `)}}if(r.relationships&&r.relationships.length>0){t+=`
599
599
  **Relationships:**
600
600
  `;for(let n of r.relationships)t+=` - ${n.fromTable}.${n.fromColumn} -> ${n.toTable}.${n.toColumn}
601
- `}return t}var el=R(()=>{"use strict";h();j()});function pf(r){let e={name:r.columnName,type:r.dataTypeLabel,nullable:r.isNullable};return r.isPrimaryKey&&(e.isPrimaryKey=!0),r.isForeignKey&&r.referencedTable&&r.referencedColumn&&(e.foreignKey=`${r.referencedTable}.${r.referencedColumn}`),r.enumValues&&r.enumValues.length>0&&(e.enumValues=r.enumValues,e.description=`Enum values: ${r.enumValues.join(", ")}`),e}function ff(r){let e=[];for(let t of r)for(let n of t.columns)if(n.foreignKey){let[a,s]=n.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:n.name,toTable:a,toColumn:s})}return e}async function hf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",fe(n)),[]}}async function tl(r){let e=Ct(),t=Kt(e);try{let n=await t.getTablesList(r),a=await Promise.all(n.map(async({schemaName:o,tableName:i})=>({name:o?`${o}.${i}`:i,columns:(await hf(t,i,r)).map(pf)}))),s=ff(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",fe(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var nl=R(()=>{"use strict";h();Rt();Qe();Ve()});import{Elysia as yf}from"elysia";var gf,bf,rl,al,sl=R(()=>{"use strict";h();tn();j();X();Ve();el();nl();gf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),bf=new Set(["localhost","127.0.0.1","::1","[::1]"]),rl=()=>{let r;try{r=new URL(ot.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=bf.has(r.hostname)||r.hostname.endsWith(".localhost");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&e))throw new d(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return r.origin},al=new yf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=rl();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":r["cf-connecting-ip"]??"","x-real-ip":r["x-real-ip"]??"","x-forwarded-for":r["x-forwarded-for"]??"","x-api-key":r["x-api-key"]??"","x-request-id":it()??""}});return t.ok?await t.json():(Z("warn","chat_limit_unavailable",{proxy_status:t.status}),{limit:3,used:3,remaining:0})}catch{return{limit:3,used:3,remaining:0}}}).post("/",async({body:{messages:r,data:e,provider:t,model:n},headers:a,set:s})=>{let{db:o,conversationId:i,includeSchema:c}=e,l=c?await tl(o):null,u=Zc(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${rl()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":a["cf-connecting-ip"]??"","x-real-ip":a["x-real-ip"]??"","x-forwarded-for":a["x-forwarded-for"]??"","x-api-key":a["x-api-key"]??"","x-byok-gemini":a["x-byok-gemini"]??"","x-byok-openai":a["x-byok-openai"]??"","x-byok-anthropic":a["x-byok-anthropic"]??"","x-byok-grok":a["x-byok-grok"]??"","x-byok-openrouter":a["x-byok-openrouter"]??"","x-request-id":it()??""},body:JSON.stringify(m)});if(!p.ok){Z("warn","chat_proxy_rejected",{proxy_status:p.status,provider:t,model:n});let f=await p.json();return Response.json({error:f.error||"Proxy request failed"},{status:p.status})}for(let[f,g]of p.headers)gf.has(f)||(s.headers[f]=g);return p.body},{body:vr})});import{Elysia as Tf}from"elysia";var ol,il=R(()=>{"use strict";h();j();Xa();_a();ol=new Tf({prefix:"/connections"}).get("/",async()=>({data:await bn()})).post("/",async({body:r})=>{let e=await Zn(r.url,{requireExistingFile:!0});return{data:await bn(e)}},{body:Vr}).post("/:id/connect",async({params:r})=>({data:await bn(await Qa(r.id))})).patch("/:id",async({params:r,body:e})=>({data:Ja(await mi(r.id,e))}),{body:Yr}).delete("/:id",async({params:r})=>(await di(r.id),{data:"Connection removed"}))});import{Elysia as Ef}from"elysia";var cl,ll=R(()=>{"use strict";h();Rt();Qe();cl=new Ef({prefix:"/databases"}).derive(()=>{let r=Ct();return{dbType:r,adapter:Kt(r)}}).get("/",async({adapter:r,dbType:e})=>({data:{databases:await r.getDatabasesList(),dbType:e}})).get("/current",async({adapter:r,dbType:e})=>({data:{db:(await r.getCurrentDatabase()).db,dbType:e}})).get("/connection",async({adapter:r})=>({data:await r.getDatabaseConnectionInfo()}))});import{Elysia as wf}from"elysia";var rt,Xt=R(()=>{"use strict";h();j();Rt();Qe();X();rt=new wf().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!ge.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${ge.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!hn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Ct();if(a!==t)throw new d(409,{message:`The open connection is ${K[a].label}. Reload the page.`});return{dbType:t,adapter:Kt(t)}})});import{Elysia as Sf}from"elysia";var ul,ml=R(()=>{"use strict";h();j();Rt();Xt();ul=new Sf({prefix:"/keys"}).use(rt).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:Ci(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:Zr}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:v,body:ra}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:na,params:vt}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:ta,params:vt}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:v,params:vt,body:aa}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:sa,params:vt})});import{Elysia as Cf}from"elysia";var dl,pl=R(()=>{"use strict";h();j();Xt();dl=new Cf({prefix:"/logs"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:v})});import{Elysia as Rf}from"elysia";var fl,hl=R(()=>{"use strict";h();j();Xt();fl=new Rf({prefix:"/query"}).use(rt).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:v,body:Jr})});import{Elysia as Nf}from"elysia";var yl,gl=R(()=>{"use strict";h();j();Xt();yl=new Nf({prefix:"/records"}).use(rt).post("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,data:a}})=>{let{insertedCount:s}=await r.addRecord({db:e,schemaName:t,params:{tableName:n,data:a}});return{data:`Record inserted into "${n}" with ${s} rows inserted`}},{query:M,body:xr}).patch("/",async({adapter:r,query:{db:e,schemaName:t},body:n})=>{let{updatedCount:a}=await r.updateRecords({params:n,schemaName:t,db:e});return{data:`Updated ${a} records in "${n.tableName}"`}},{query:M,body:ca}).delete("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a},status:s})=>{let{deletedCount:o,fkViolation:i,relatedRecords:c}=await r.deleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e});return i?s(409,{data:{deletedCount:0,fkViolation:!0,relatedRecords:c}}):{data:{deletedCount:o,fkViolation:!1,relatedRecords:[]}}},{query:M,body:vn}).delete("/force",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a}})=>({data:await r.forceDeleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e})}),{query:M,body:vn}).post("/bulk",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,records:a}})=>({data:await r.bulkInsertRecords({tableName:n,schemaName:t,records:a,db:e})}),{query:M,body:kr})});async function Tl({cols:r,rows:e,format:t,tableName:n}){if(t==="json"){let o=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(o,"utf-8"))}let{utils:a,write:s}=await import("xlsx");switch(t){case"csv":{let o=a.aoa_to_sheet(bl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(bl(r,e)),i=a.book_new();a.book_append_sheet(i,o,n.slice(0,31));let c=s(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var Af,bl,El=R(()=>{"use strict";h();Af=r=>r==null||r instanceof Date?r:Buffer.isBuffer(r)?`0x${r.toString("hex")}`:typeof r=="object"?JSON.stringify(r):typeof r=="bigint"?r.toString():r,bl=(r,e)=>[r,...e?.map(t=>r?.map(n=>Af(t[n])))??[]]});import{Elysia as Df}from"elysia";var _f,wl,Sl=R(()=>{"use strict";h();j();Xt();El();_f={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},wl=new Df({prefix:"/tables"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:v}).get("/graph",async({adapter:r,query:{db:e}})=>{let t=await r.getTablesList(e);return{data:await Promise.all(t.map(async n=>({...n,columns:await r.getTableColumns({tableName:n.tableName,schemaName:n.schemaName,db:e})})))}},{query:v}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:v,body:Gr}).delete("/:tableName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a}})=>({data:await r.deleteTable({tableName:a,schemaName:t,db:e,cascade:n})}),{query:Qr,params:ie}).patch("/:tableName/rename",async({adapter:r,query:{db:e},params:{tableName:t},body:n})=>(await r.renameTable({tableName:t,db:e,...n}),{data:`Table "${t}" renamed to "${n.newTableName}"`}),{query:v,params:ie,body:sn}).delete("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a,columnName:s}})=>{let{deletedCount:o}=await r.deleteColumn({schemaName:t,tableName:a,columnName:s,cascade:n,db:e});return{data:`Column "${s}" deleted successfully from table "${a}" with ${o} rows deleted`}},{query:Mr,params:Ee}).post("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.addColumn({tableName:n,schemaName:t,db:e,...a}),{data:`Column "${a.columnName}" added successfully to table "${n}"`}),{query:M,params:ie,body:Be}).patch("/:tableName/columns/:columnName/rename",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.renameColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" renamed to "${s.newColumnName}" in table "${n}"`}),{query:M,params:Ee,body:Fn}).patch("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.alterColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" updated successfully in table "${n}"`}),{query:M,params:Ee,body:Pt}).get("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableColumns({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).get("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableIndexes({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).post("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.createIndex({tableName:n,schemaName:t,db:e,...a}),{data:`Index "${a.indexName}" created successfully on table "${n}"`}),{query:M,params:ie,body:Un}).delete("/:tableName/indexes/:indexName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,indexName:a}})=>(await r.dropIndex({tableName:n,schemaName:t,indexName:a,db:e}),{data:`Index "${a}" dropped successfully from table "${n}"`}),{query:M,params:qn}).get("/:tableName/schema",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:{schema:await r.getTableSchema({tableName:n,schemaName:t,db:e})}}),{query:M,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:ia,params:ie}).get("/:tableName/export",async({adapter:r,query:{db:e,schemaName:t,format:n},params:{tableName:a}})=>{let{cols:s,rows:o}=await r.exportTableData({tableName:a,schemaName:t,db:e});return new Response(await Tl({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":_f[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:Xr,params:ie})});import{Elysia as Of}from"elysia";import{z as Cl}from"zod";var If,Rl,Nl=R(()=>{"use strict";h();dn();If=Cl.object({enabled:Cl.boolean()}).strict(),Rl=new Of({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Gn(!1),ga(),{data:zn()})).put("/preference",({body:r,status:e})=>{let t=If.safeParse(r);return t.success?(Gn(t.data.enabled),{data:zn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:fa()}}))});var Ol={};It(Ol,{createServer:()=>Yf});import{createHash as xf,timingSafeEqual as Lf}from"crypto";import{existsSync as Al}from"fs";import{readFile as Pf,stat as $f}from"fs/promises";import qe from"path";import{fileURLToPath as Mf}from"url";import{cors as kf}from"@elysiajs/cors";import{node as vf}from"@elysiajs/node";import{Elysia as Uf}from"elysia";var _n,qf,Bf,Ff,_l,Hf,Kf,jf,Dl,Wf,Vf,Yf,Il=R(()=>{"use strict";h();tn();Rt();Gc();Qe();X();Jc();dn();Ve();sl();il();ll();ml();pl();hl();gl();Sl();Nl();({API_PREFIX:_n}=ot),qf=()=>{if(process.env.NODE_ENV==="development")return qe.resolve(process.cwd(),"../web/dist");let r=qe.dirname(Mf(import.meta.url)),e=qe.resolve(r,"./web-dist"),t=qe.resolve(process.cwd(),"../web/dist"),n=qe.resolve(e,"index.html"),a=qe.resolve(t,"index.html");return!Al(n)&&Al(a)?t:e},Bf={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".ttf":"font/ttf",".woff2":"font/woff2"},Ff=async(r,e)=>{let t=qe.join(r,"index.html");try{let s=qe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${qe.sep}`)&&(await $f(s)).isFile()&&(t=s)}catch{}let n=await Pf(t).catch(s=>{if(s.code==="ENOENT")return null;throw s});if(n===null)return new Response('The web app is not built. Run "bun run build" in the repository root, then restart db-studio.',{status:404,headers:{"Content-Type":"text/plain; charset=utf-8"}});let a=t.startsWith(qe.join(r,"assets",qe.sep));return new Response(n,{headers:{"Content-Type":Bf[qe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},_l=r=>{if(!r)return!1;if((process.env.ALLOWED_ORIGINS?.split(",").map(t=>t.trim()).filter(Boolean)??[]).includes(r))return!0;if(process.env.NODE_ENV!=="development")return!1;try{let{hostname:t}=new URL(r);return t==="localhost"||t.endsWith(".localhost")||t==="127.0.0.1"}catch{return!1}},Hf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Kf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Hf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},jf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!_l(r.headers.get("origin"))},Dl=r=>xf("sha256").update(r).digest(),Wf=r=>{let e=process.env.DB_STUDIO_PASSWORD;if(!e)return!0;if(!r?.startsWith("Basic "))return!1;let t=Buffer.from(r.slice(6),"base64").toString("utf8"),n=t.indexOf(":");return n!==-1&&Lf(Dl(t.slice(n+1)),Dl(e))},Vf=(r,e)=>{let{pathname:t}=new URL(r.url),n=un(r.method,t),a=mn(t),s={requestId:Ko(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??La()??void 0};return jo(s,async()=>{if(!t.startsWith(`${_n}/`)||t.startsWith(`${_n}/telemetry`))return e();let o=performance.now(),i=a&&ge.has(a)?a:void 0,c=await Ta(n,i,e);return Qn({event:"server_operation",properties:{operation:n,method:r.method,outcome:ya(c.status),duration_bucket:ha(performance.now()-o),db_type:i}}),c})},Yf=()=>{zc();let r=qf(),e=new Uf({adapter:vf()}).wrap((t,n)=>(...a)=>Vf(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=it(),!Kf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Wf(t.headers.get("authorization")))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="db-studio", charset="UTF-8"'}});if(new URL(t.url).pathname.startsWith(`${_n}/`)&&jf(t))throw new d(403,{message:"Cross-site request refused"})}).use(kf({origin:t=>_l(t.headers.get("origin")),methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowedHeaders:["Content-Type","Authorization","X-Run-Id","X-Request-Id","X-Connection-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],credentials:!1,maxAge:600})).onTransform(t=>{t.query=Object.fromEntries(new URL(t.request.url).searchParams);let n=t.request.headers.get("content-type")??"";if(t.body!==void 0&&!/^application\/([\w.-]+\+)?json/.test(n))throw new d(400,{message:"Request body must be JSON"})}).onError(({error:t,request:n})=>Qc(t,n)).group(_n,t=>t.use(ol).use(cl).use(al).use(Rl).group("/:dbType",n=>n.use(wl).use(yl).use(fl).use(ul).use(dl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${_n}/`)?Ff(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});h();h();(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="73cf31b0-eb8e-4d75-8e3f-d168616012ce",r._sentryDebugIdIdentifier="sentry-dbid-73cf31b0-eb8e-4d75-8e3f-d168616012ce")}catch{}})();h();tn();import{intro as zf,log as Zt,outro as xl,spinner as Gf}from"@clack/prompts";import en from"picocolors";h();import{program as Or}from"commander";var Hs=()=>{Or.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("--open","Open db-studio in the default browser").option("--no-open","Do not open db-studio in the default browser").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv);let r=Or.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Or.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};h();var Ks=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;h();import{access as $l,readFile as Ml}from"fs/promises";import{dirname as kl,resolve as Ir}from"path";import{parse as vl}from"dotenv";var Ul=async r=>{let e=Ir(r);for(;;){let t=Ir(e,".env");try{return await $l(t),t}catch{}let n=kl(e);if(n===e)return null;e=n}},xt=async r=>{let e;if(r?e=Ir(r):e=await Ul(process.cwd()),!e)return null;try{let t=await Ml(e,"utf-8");return vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};h();import ql from"open";var js=r=>r===!0,Ws=async r=>{await ql(r)};la();h();_r();j();import{intro as Ju,outro as Xu}from"@clack/prompts";import Ut from"picocolors";var Fo=()=>{Ju(Ut.inverse(" db-studio ")),console.log(Ut.bold(`
601
+ `}return t}var el=R(()=>{"use strict";h();j()});function pf(r){let e={name:r.columnName,type:r.dataTypeLabel,nullable:r.isNullable};return r.isPrimaryKey&&(e.isPrimaryKey=!0),r.isForeignKey&&r.referencedTable&&r.referencedColumn&&(e.foreignKey=`${r.referencedTable}.${r.referencedColumn}`),r.enumValues&&r.enumValues.length>0&&(e.enumValues=r.enumValues,e.description=`Enum values: ${r.enumValues.join(", ")}`),e}function ff(r){let e=[];for(let t of r)for(let n of t.columns)if(n.foreignKey){let[a,s]=n.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:n.name,toTable:a,toColumn:s})}return e}async function hf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",fe(n)),[]}}async function tl(r){let e=Ct(),t=Kt(e);try{let n=await t.getTablesList(r),a=await Promise.all(n.map(async({schemaName:o,tableName:i})=>({name:o?`${o}.${i}`:i,columns:(await hf(t,i,r)).map(pf)}))),s=ff(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",fe(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var nl=R(()=>{"use strict";h();Rt();Qe();Ve()});import{Elysia as yf}from"elysia";var gf,bf,rl,al,sl=R(()=>{"use strict";h();tn();j();X();Ve();el();nl();gf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),bf=new Set(["localhost","127.0.0.1","::1","[::1]"]),rl=()=>{let r;try{r=new URL(ot.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=bf.has(r.hostname)||r.hostname.endsWith(".localhost");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&e))throw new d(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return r.origin},al=new yf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=rl();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":r["cf-connecting-ip"]??"","x-real-ip":r["x-real-ip"]??"","x-forwarded-for":r["x-forwarded-for"]??"","x-api-key":r["x-api-key"]??"","x-request-id":it()??""}});return t.ok?await t.json():(Z("warn","chat_limit_unavailable",{proxy_status:t.status}),{limit:3,used:3,remaining:0})}catch{return{limit:3,used:3,remaining:0}}}).post("/",async({body:{messages:r,data:e,provider:t,model:n},headers:a,set:s})=>{let{db:o,conversationId:i,includeSchema:c}=e,l=c?await tl(o):null,u=Zc(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${rl()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":a["cf-connecting-ip"]??"","x-real-ip":a["x-real-ip"]??"","x-forwarded-for":a["x-forwarded-for"]??"","x-api-key":a["x-api-key"]??"","x-byok-gemini":a["x-byok-gemini"]??"","x-byok-openai":a["x-byok-openai"]??"","x-byok-anthropic":a["x-byok-anthropic"]??"","x-byok-grok":a["x-byok-grok"]??"","x-byok-openrouter":a["x-byok-openrouter"]??"","x-request-id":it()??""},body:JSON.stringify(m)});if(!p.ok){Z("warn","chat_proxy_rejected",{proxy_status:p.status,provider:t,model:n});let f=await p.json();return Response.json({error:f.error||"Proxy request failed"},{status:p.status})}for(let[f,g]of p.headers)gf.has(f)||(s.headers[f]=g);return p.body},{body:vr})});import{Elysia as Tf}from"elysia";var ol,il=R(()=>{"use strict";h();j();Xa();_a();ol=new Tf({prefix:"/connections"}).get("/",async()=>({data:await bn()})).post("/",async({body:r})=>{let e=await Zn(r.url,{requireExistingFile:!0});return{data:await bn(e)}},{body:Vr}).post("/:id/connect",async({params:r})=>({data:await bn(await Qa(r.id))})).patch("/:id",async({params:r,body:e})=>({data:Ja(await mi(r.id,e))}),{body:Yr}).delete("/:id",async({params:r})=>(await di(r.id),{data:"Connection removed"}))});import{Elysia as Ef}from"elysia";var cl,ll=R(()=>{"use strict";h();Rt();Qe();cl=new Ef({prefix:"/databases"}).derive(()=>{let r=Ct();return{dbType:r,adapter:Kt(r)}}).get("/",async({adapter:r,dbType:e})=>({data:{databases:await r.getDatabasesList(),dbType:e}})).get("/current",async({adapter:r,dbType:e})=>({data:{db:(await r.getCurrentDatabase()).db,dbType:e}})).get("/connection",async({adapter:r})=>({data:await r.getDatabaseConnectionInfo()}))});import{Elysia as wf}from"elysia";var rt,Xt=R(()=>{"use strict";h();j();Rt();Qe();X();rt=new wf().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!ge.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${ge.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!hn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Ct();if(a!==t)throw new d(409,{message:`The open connection is ${K[a].label}. Reload the page.`});return{dbType:t,adapter:Kt(t)}})});import{Elysia as Sf}from"elysia";var ul,ml=R(()=>{"use strict";h();j();Rt();Xt();ul=new Sf({prefix:"/keys"}).use(rt).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:Ci(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:Zr}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:v,body:ra}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:na,params:vt}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:ta,params:vt}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:v,params:vt,body:aa}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:sa,params:vt})});import{Elysia as Cf}from"elysia";var dl,pl=R(()=>{"use strict";h();j();Xt();dl=new Cf({prefix:"/logs"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:v})});import{Elysia as Rf}from"elysia";var fl,hl=R(()=>{"use strict";h();j();Xt();fl=new Rf({prefix:"/query"}).use(rt).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:v,body:Jr})});import{Elysia as Nf}from"elysia";var yl,gl=R(()=>{"use strict";h();j();Xt();yl=new Nf({prefix:"/records"}).use(rt).post("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,data:a}})=>{let{insertedCount:s}=await r.addRecord({db:e,schemaName:t,params:{tableName:n,data:a}});return{data:`Record inserted into "${n}" with ${s} rows inserted`}},{query:M,body:xr}).patch("/",async({adapter:r,query:{db:e,schemaName:t},body:n})=>{let{updatedCount:a}=await r.updateRecords({params:n,schemaName:t,db:e});return{data:`Updated ${a} records in "${n.tableName}"`}},{query:M,body:ca}).delete("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a},status:s})=>{let{deletedCount:o,fkViolation:i,relatedRecords:c}=await r.deleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e});return i?s(409,{data:{deletedCount:0,fkViolation:!0,relatedRecords:c}}):{data:{deletedCount:o,fkViolation:!1,relatedRecords:[]}}},{query:M,body:vn}).delete("/force",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a}})=>({data:await r.forceDeleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e})}),{query:M,body:vn}).post("/bulk",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,records:a}})=>({data:await r.bulkInsertRecords({tableName:n,schemaName:t,records:a,db:e})}),{query:M,body:kr})});async function Tl({cols:r,rows:e,format:t,tableName:n}){if(t==="json"){let o=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(o,"utf-8"))}let{utils:a,write:s}=await import("xlsx");switch(t){case"csv":{let o=a.aoa_to_sheet(bl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(bl(r,e)),i=a.book_new();a.book_append_sheet(i,o,n.slice(0,31));let c=s(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var Af,bl,El=R(()=>{"use strict";h();Af=r=>r==null||r instanceof Date?r:Buffer.isBuffer(r)?`0x${r.toString("hex")}`:typeof r=="object"?JSON.stringify(r):typeof r=="bigint"?r.toString():r,bl=(r,e)=>[r,...e?.map(t=>r?.map(n=>Af(t[n])))??[]]});import{Elysia as Df}from"elysia";var _f,wl,Sl=R(()=>{"use strict";h();j();Xt();El();_f={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},wl=new Df({prefix:"/tables"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:v}).get("/graph",async({adapter:r,query:{db:e}})=>{let t=await r.getTablesList(e);return{data:await Promise.all(t.map(async n=>({...n,columns:await r.getTableColumns({tableName:n.tableName,schemaName:n.schemaName,db:e})})))}},{query:v}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:v,body:Gr}).delete("/:tableName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a}})=>({data:await r.deleteTable({tableName:a,schemaName:t,db:e,cascade:n})}),{query:Qr,params:ie}).patch("/:tableName/rename",async({adapter:r,query:{db:e},params:{tableName:t},body:n})=>(await r.renameTable({tableName:t,db:e,...n}),{data:`Table "${t}" renamed to "${n.newTableName}"`}),{query:v,params:ie,body:sn}).delete("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a,columnName:s}})=>{let{deletedCount:o}=await r.deleteColumn({schemaName:t,tableName:a,columnName:s,cascade:n,db:e});return{data:`Column "${s}" deleted successfully from table "${a}" with ${o} rows deleted`}},{query:Mr,params:Ee}).post("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.addColumn({tableName:n,schemaName:t,db:e,...a}),{data:`Column "${a.columnName}" added successfully to table "${n}"`}),{query:M,params:ie,body:Be}).patch("/:tableName/columns/:columnName/rename",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.renameColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" renamed to "${s.newColumnName}" in table "${n}"`}),{query:M,params:Ee,body:Fn}).patch("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.alterColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" updated successfully in table "${n}"`}),{query:M,params:Ee,body:Pt}).get("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableColumns({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).get("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableIndexes({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).post("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.createIndex({tableName:n,schemaName:t,db:e,...a}),{data:`Index "${a.indexName}" created successfully on table "${n}"`}),{query:M,params:ie,body:Un}).delete("/:tableName/indexes/:indexName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,indexName:a}})=>(await r.dropIndex({tableName:n,schemaName:t,indexName:a,db:e}),{data:`Index "${a}" dropped successfully from table "${n}"`}),{query:M,params:qn}).get("/:tableName/schema",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:{schema:await r.getTableSchema({tableName:n,schemaName:t,db:e})}}),{query:M,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:ia,params:ie}).get("/:tableName/export",async({adapter:r,query:{db:e,schemaName:t,format:n},params:{tableName:a}})=>{let{cols:s,rows:o}=await r.exportTableData({tableName:a,schemaName:t,db:e});return new Response(await Tl({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":_f[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:Xr,params:ie})});import{Elysia as Of}from"elysia";import{z as Cl}from"zod";var If,Rl,Nl=R(()=>{"use strict";h();dn();If=Cl.object({enabled:Cl.boolean()}).strict(),Rl=new Of({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Gn(!1),ga(),{data:zn()})).put("/preference",({body:r,status:e})=>{let t=If.safeParse(r);return t.success?(Gn(t.data.enabled),{data:zn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:fa()}}))});var Ol={};It(Ol,{createServer:()=>Yf});import{createHash as xf,timingSafeEqual as Lf}from"crypto";import{existsSync as Al}from"fs";import{readFile as Pf,stat as $f}from"fs/promises";import qe from"path";import{fileURLToPath as Mf}from"url";import{cors as kf}from"@elysiajs/cors";import{node as vf}from"@elysiajs/node";import{Elysia as Uf}from"elysia";var _n,qf,Bf,Ff,_l,Hf,Kf,jf,Dl,Wf,Vf,Yf,Il=R(()=>{"use strict";h();tn();Rt();Gc();Qe();X();Jc();dn();Ve();sl();il();ll();ml();pl();hl();gl();Sl();Nl();({API_PREFIX:_n}=ot),qf=()=>{if(process.env.NODE_ENV==="development")return qe.resolve(process.cwd(),"../web/dist");let r=qe.dirname(Mf(import.meta.url)),e=qe.resolve(r,"./web-dist"),t=qe.resolve(process.cwd(),"../web/dist"),n=qe.resolve(e,"index.html"),a=qe.resolve(t,"index.html");return!Al(n)&&Al(a)?t:e},Bf={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".ttf":"font/ttf",".woff2":"font/woff2"},Ff=async(r,e)=>{let t=qe.join(r,"index.html");try{let s=qe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${qe.sep}`)&&(await $f(s)).isFile()&&(t=s)}catch{}let n=await Pf(t).catch(s=>{if(s.code==="ENOENT")return null;throw s});if(n===null)return new Response('The web app is not built. Run "bun run build" in the repository root, then restart db-studio.',{status:404,headers:{"Content-Type":"text/plain; charset=utf-8"}});let a=t.startsWith(qe.join(r,"assets",qe.sep));return new Response(n,{headers:{"Content-Type":Bf[qe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},_l=r=>{if(!r)return!1;if((process.env.ALLOWED_ORIGINS?.split(",").map(t=>t.trim()).filter(Boolean)??[]).includes(r))return!0;if(process.env.NODE_ENV!=="development")return!1;try{let{hostname:t}=new URL(r);return t==="localhost"||t.endsWith(".localhost")||t==="127.0.0.1"}catch{return!1}},Hf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Kf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Hf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},jf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!_l(r.headers.get("origin"))},Dl=r=>xf("sha256").update(r).digest(),Wf=r=>{let e=process.env.DB_STUDIO_PASSWORD;if(!e)return!0;if(!r?.startsWith("Basic "))return!1;let t=Buffer.from(r.slice(6),"base64").toString("utf8"),n=t.indexOf(":");return n!==-1&&Lf(Dl(t.slice(n+1)),Dl(e))},Vf=(r,e)=>{let{pathname:t}=new URL(r.url),n=un(r.method,t),a=mn(t),s={requestId:Ko(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??La()??void 0};return jo(s,async()=>{if(!t.startsWith(`${_n}/`)||t.startsWith(`${_n}/telemetry`))return e();let o=performance.now(),i=a&&ge.has(a)?a:void 0,c=await Ta(n,i,e);return Qn({event:"server_operation",properties:{operation:n,method:r.method,outcome:ya(c.status),duration_bucket:ha(performance.now()-o),db_type:i}}),c})},Yf=()=>{zc();let r=qf(),e=new Uf({adapter:vf()}).wrap((t,n)=>(...a)=>Vf(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=it(),!Kf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Wf(t.headers.get("authorization")))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="db-studio", charset="UTF-8"'}});if(new URL(t.url).pathname.startsWith(`${_n}/`)&&jf(t))throw new d(403,{message:"Cross-site request refused"})}).use(kf({origin:t=>_l(t.headers.get("origin")),methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowedHeaders:["Content-Type","Authorization","X-Run-Id","X-Request-Id","X-Connection-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],credentials:!1,maxAge:600})).onTransform(t=>{t.query=Object.fromEntries(new URL(t.request.url).searchParams);let n=t.request.headers.get("content-type")??"";if(t.body!==void 0&&!/^application\/([\w.-]+\+)?json/.test(n))throw new d(400,{message:"Request body must be JSON"})}).onError(({error:t,request:n})=>Qc(t,n)).group(_n,t=>t.use(ol).use(cl).use(al).use(Rl).group("/:dbType",n=>n.use(wl).use(yl).use(fl).use(ul).use(dl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${_n}/`)?Ff(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});h();h();(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="df9bb6d3-52f1-4d68-b9f9-716636f8ece1",r._sentryDebugIdIdentifier="sentry-dbid-df9bb6d3-52f1-4d68-b9f9-716636f8ece1")}catch{}})();h();tn();import{intro as zf,log as Zt,outro as xl,spinner as Gf}from"@clack/prompts";import en from"picocolors";h();import{program as Or}from"commander";var Hs=()=>{Or.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("--open","Open db-studio in the default browser").option("--no-open","Do not open db-studio in the default browser").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv);let r=Or.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Or.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};h();var Ks=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;h();import{access as $l,readFile as Ml}from"fs/promises";import{dirname as kl,resolve as Ir}from"path";import{parse as vl}from"dotenv";var Ul=async r=>{let e=Ir(r);for(;;){let t=Ir(e,".env");try{return await $l(t),t}catch{}let n=kl(e);if(n===e)return null;e=n}},xt=async r=>{let e;if(r?e=Ir(r):e=await Ul(process.cwd()),!e)return null;try{let t=await Ml(e,"utf-8");return vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};h();import ql from"open";var js=r=>r===!0,Ws=async r=>{await ql(r)};la();h();_r();j();import{intro as Ju,outro as Xu}from"@clack/prompts";import Ut from"picocolors";var Fo=()=>{Ju(Ut.inverse(" db-studio ")),console.log(Ut.bold(`
602
602
  Usage:`)),console.log(` db-studio [options]
603
603
  `),console.log(Ut.bold("Supported Databases:")),console.log(` ${Object.values(K).map(({label:r})=>r).join(", ")}
604
604
  `),console.log(Ut.bold("Options:")),console.log(" -e, --env <path> Path to custom .env file"),console.log(" -p, --port <port> Port to run the server on (default: 3333)"),console.log(" -d, --database-url <url> Database URL to use"),console.log(" --open Open db-studio in the default browser (off by default)"),console.log(" --no-open Do not open db-studio in the default browser"),console.log(" -n, --var-name <name> Custom environment variable name (default: DATABASE_URL)"),console.log(" -s, --status Show status of the database connection"),console.log(" -h, --help Show this help message"),console.log(` -v, --version Show version number