db-studio 2.1.0 → 2.2.0

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 (199) hide show
  1. package/dist/index.js +69 -69
  2. package/dist/index.js.map +1 -1
  3. package/dist/web-dist/assets/_pathlessLayout-DSqP7uLw.js +1 -0
  4. package/dist/web-dist/assets/_pathlessLayout-sBYxFR0u.js +2 -0
  5. package/dist/web-dist/assets/_queryId-D-e6Pm3D.js +1 -0
  6. package/dist/web-dist/assets/_table-CUkeoJ5r.js +1 -0
  7. package/dist/web-dist/assets/{_table-BUNHOVIK.js → _table-CuzwG7mZ.js} +1 -1
  8. package/dist/web-dist/assets/_table-ziU6yws2.js +1 -0
  9. package/dist/web-dist/assets/{abap-B-HzHdT_.js → abap-CNHfI6UP.js} +1 -1
  10. package/dist/web-dist/assets/{apex-t5VcK3BF.js → apex-DTJWTIPK.js} +1 -1
  11. package/dist/web-dist/assets/{azcli-Ce3iuV2p.js → azcli-Degrf7_O.js} +1 -1
  12. package/dist/web-dist/assets/{badge-COF6gx-2.js → badge-BfsYSaL9.js} +1 -1
  13. package/dist/web-dist/assets/{bat-bOBZcLbK.js → bat-og3u3-iX.js} +1 -1
  14. package/dist/web-dist/assets/{bicep-TSicgsnM.js → bicep-DWKWUTZk.js} +1 -1
  15. package/dist/web-dist/assets/{browser-B-fV6CZb.js → browser-ZSYFt_6v.js} +1 -1
  16. package/dist/web-dist/assets/bundle-mjs-DBtz6MiX.js +1 -0
  17. package/dist/web-dist/assets/{cameligo-D-9xpPXV.js → cameligo-wkA_VlQe.js} +1 -1
  18. package/dist/web-dist/assets/chat-sidebar-BzjjNUcW.js +161 -0
  19. package/dist/web-dist/assets/{clojure-9X3x3csE.js → clojure-DOzhadKJ.js} +1 -1
  20. package/dist/web-dist/assets/{code-editor-tPwHd3zF.js → code-editor-BMXfdFhg.js} +2 -2
  21. package/dist/web-dist/assets/{codicon-Brq4_Ui5.ttf → codicon-DF1abBS2.ttf} +0 -0
  22. package/dist/web-dist/assets/{coffee-anOch8Z-.js → coffee-CS5CzV5M.js} +1 -1
  23. package/dist/web-dist/assets/connect-DGQjyh4c.js +1 -0
  24. package/dist/web-dist/assets/constants-iNJwkB3Z.js +20 -0
  25. package/dist/web-dist/assets/{cpp-oW293AoF.js → cpp-BMgiE7AJ.js} +1 -1
  26. package/dist/web-dist/assets/{csharp-BOXMgm5k.js → csharp-Bsvbb6s9.js} +1 -1
  27. package/dist/web-dist/assets/{csp-D67JhNKT.js → csp-BrZ2q231.js} +1 -1
  28. package/dist/web-dist/assets/{css-Bk6H7_K_.js → css-Uqgocp1T.js} +1 -1
  29. package/dist/web-dist/assets/{css.worker-B-fFSVTK.js → css.worker-bHD0dlJO.js} +1507 -1453
  30. package/dist/web-dist/assets/cssMode-BoXwzMyE.js +1 -0
  31. package/dist/web-dist/assets/{cypher-DB0LBjic.js → cypher-BtFHfHba.js} +1 -1
  32. package/dist/web-dist/assets/{dart-CS3MbwLP.js → dart-C5lyYd0g.js} +1 -1
  33. package/dist/web-dist/assets/database.store-BbWvMDJ7.js +57 -0
  34. package/dist/web-dist/assets/dist-BbZuOizk.js +1 -0
  35. package/dist/web-dist/assets/dist-CISR_13N.js +2 -0
  36. package/dist/web-dist/assets/{dockerfile-BGz3qsmk.js → dockerfile-BvQ8yybz.js} +1 -1
  37. package/dist/web-dist/assets/{ecl-lt3qcklx.js → ecl-DkR5NtXz.js} +1 -1
  38. package/dist/web-dist/assets/editor-g1MJRkXV.css +1 -0
  39. package/dist/web-dist/assets/editor.api-BQRmhEY6.js +926 -0
  40. package/dist/web-dist/assets/{editor.worker-BYfbSb3U.js → editor.worker-ByY_fgkM.js} +1328 -1274
  41. package/dist/web-dist/assets/{elixir-cMyUafed.js → elixir-DwgH4lv4.js} +1 -1
  42. package/dist/web-dist/assets/esm-DHn0u-mG.js +1 -0
  43. package/dist/web-dist/assets/{esm-B-4Q6MuQ.js → esm-HKPuItQJ.js} +1 -1
  44. package/dist/web-dist/assets/{flow9-BI9V6TuS.js → flow9-DdhMBw5Q.js} +1 -1
  45. package/dist/web-dist/assets/format-cell-value-CUgsp8Xn.js +1 -0
  46. package/dist/web-dist/assets/{freemarker2-mnCFA3xV.js → freemarker2-g_nJsTeC.js} +2 -2
  47. package/dist/web-dist/assets/{fsharp-I1kqnt0E.js → fsharp-D3Xp09Vk.js} +1 -1
  48. package/dist/web-dist/assets/{go-Cg4qMFVj.js → go-DiDKwy3n.js} +1 -1
  49. package/dist/web-dist/assets/{graphql-CvtHcP49.js → graphql-BgFph-jF.js} +1 -1
  50. package/dist/web-dist/assets/{handlebars-BUcE6Uyy.js → handlebars-RA6uoaMW.js} +1 -1
  51. package/dist/web-dist/assets/{hcl-BkvCdKNu.js → hcl-D4fzt9AB.js} +1 -1
  52. package/dist/web-dist/assets/highlighted-body-JLMTFACH-D8jkzP7m.js +1 -0
  53. package/dist/web-dist/assets/{html-BBqcfykD.js → html-DchTZAEc.js} +1 -1
  54. package/dist/web-dist/assets/{html.worker-CdalOg9p.js → html.worker-CHVREBCJ.js} +1527 -1473
  55. package/dist/web-dist/assets/{htmlMode-D8je66Rk.js → htmlMode-BcLYF6v1.js} +1 -1
  56. package/dist/web-dist/assets/icons-DKLzom80.js +1 -0
  57. package/dist/web-dist/assets/index-DTVRtzpz.css +2 -0
  58. package/dist/web-dist/assets/index-L3nylpEA.js +34 -0
  59. package/dist/web-dist/assets/indexes-B3M1QTrn.js +1 -0
  60. package/dist/web-dist/assets/{ini-CPc8BCWu.js → ini-CjG9jGLJ.js} +1 -1
  61. package/dist/web-dist/assets/{java-C9Yie4SH.js → java-DitR3Nwd.js} +1 -1
  62. package/dist/web-dist/assets/{javascript-CuGq5ydO.js → javascript-l9pEcFVL.js} +1 -1
  63. package/dist/web-dist/assets/{json-editor-Dc1E8Fc-.js → json-editor-CeBQ9FBf.js} +1 -1
  64. package/dist/web-dist/assets/{json.worker-DI02pyM8.js → json.worker-BKCy_srb.js} +2747 -2693
  65. package/dist/web-dist/assets/{jsonMode-BgdTmYik.js → jsonMode-D4edoDNQ.js} +4 -4
  66. package/dist/web-dist/assets/{julia--qJGRfN8.js → julia-_g8mQYsr.js} +1 -1
  67. package/dist/web-dist/assets/{keys-Bs0DRbCB.js → keys-DhNPoWOm.js} +1 -1
  68. package/dist/web-dist/assets/{kotlin-C3MSe-0N.js → kotlin-3o4lP58u.js} +1 -1
  69. package/dist/web-dist/assets/{label-DzHJlGAx.js → label-CavJMZd3.js} +1 -1
  70. package/dist/web-dist/assets/{less-DOBYgWSY.js → less-CdRSAxY_.js} +1 -1
  71. package/dist/web-dist/assets/{lexon-Djd2rGvJ.js → lexon-B1v3Gspe.js} +1 -1
  72. package/dist/web-dist/assets/{liquid-DXfHmR66.js → liquid-3wMbC9OJ.js} +1 -1
  73. package/dist/web-dist/assets/{logs-BortjBc-.js → logs-C22dj_JT.js} +1 -1
  74. package/dist/web-dist/assets/{lspLanguageFeatures-C7-iyD6G.js → lspLanguageFeatures-TaH7V4jh.js} +1 -1
  75. package/dist/web-dist/assets/{lua-Ck8vNcPw.js → lua-D3D-_pEE.js} +1 -1
  76. package/dist/web-dist/assets/{m3-a6Kl4TV0.js → m3-fsgnMtjU.js} +1 -1
  77. package/dist/web-dist/assets/{markdown-DkcRBwO0.js → markdown-DTtmtPZi.js} +1 -1
  78. package/dist/web-dist/assets/{mdx-QI5o45qz.js → mdx-B7jfJVLI.js} +1 -1
  79. package/dist/web-dist/assets/mermaid-WFAXDIZX-qzZppTtW.js +1 -0
  80. package/dist/web-dist/assets/middleware-DLeL20gb.js +1 -0
  81. package/dist/web-dist/assets/{mips-Cc1YVI2p.js → mips-BA6kSOEZ.js} +1 -1
  82. package/dist/web-dist/assets/module-B7dXHbVt.js +3 -0
  83. package/dist/web-dist/assets/monaco-theme-BwGcwpJl.js +68 -0
  84. package/dist/web-dist/assets/monaco-theme-DtsiNm_H.css +1 -0
  85. package/dist/web-dist/assets/{msdax-Bh41xUoQ.js → msdax-B96QDI_e.js} +1 -1
  86. package/dist/web-dist/assets/{mysql-BZTZMxPa.js → mysql-ZJG-Zmb7.js} +1 -1
  87. package/dist/web-dist/assets/{objective-c-CxZIMOHQ.js → objective-c-D1BqZdFg.js} +1 -1
  88. package/dist/web-dist/assets/{overlay.store-DsUdwZjE.js → overlay.store-DoGHwFxO.js} +1 -1
  89. package/dist/web-dist/assets/{pascal-I-WmLkmD.js → pascal-CXwopv-V.js} +1 -1
  90. package/dist/web-dist/assets/{pascaligo-DEZ-6bwf.js → pascaligo-DbxCO0kO.js} +1 -1
  91. package/dist/web-dist/assets/{perl-DfeHQJxJ.js → perl-DL95F-1i.js} +1 -1
  92. package/dist/web-dist/assets/{personal-preferences.store-DXSnKmVN.js → personal-preferences.store-BgUar1W1.js} +1 -1
  93. package/dist/web-dist/assets/{pgsql-OdOoQYPW.js → pgsql-D6V7y-We.js} +1 -1
  94. package/dist/web-dist/assets/{php-CF1bUutw.js → php-Cl4Rc77T.js} +1 -1
  95. package/dist/web-dist/assets/{pla-BHZr0GrY.js → pla-C2-KEJLZ.js} +1 -1
  96. package/dist/web-dist/assets/{postiats-BSB6a63H.js → postiats-CnwS6VBM.js} +1 -1
  97. package/dist/web-dist/assets/{powerquery-Bu0p84Ye.js → powerquery-IxSHxxBc.js} +1 -1
  98. package/dist/web-dist/assets/{powershell-Dcq3YM6T.js → powershell-DAkyXnxj.js} +1 -1
  99. package/dist/web-dist/assets/preload-helper-BmptvQqE.js +1 -0
  100. package/dist/web-dist/assets/{protobuf-CsWrQxqX.js → protobuf-FnPVBP5H.js} +1 -1
  101. package/dist/web-dist/assets/{pug-DLQiv3Bp.js → pug-C_d8B8nZ.js} +1 -1
  102. package/dist/web-dist/assets/{python-BvKEpyP9.js → python-DK9sRx0Y.js} +1 -1
  103. package/dist/web-dist/assets/{qsharp-D8nrRUNu.js → qsharp-DHzbHTnS.js} +1 -1
  104. package/dist/web-dist/assets/{queries.store-BaeyNA64.js → queries.store-CXQwDZiV.js} +1 -1
  105. package/dist/web-dist/assets/query-runner-D0LqVvy4.js +17 -0
  106. package/dist/web-dist/assets/{r-xhyKpGTk.js → r-BreUQjgc.js} +1 -1
  107. package/dist/web-dist/assets/radix-ui-CJhaEsHV.js +41 -0
  108. package/dist/web-dist/assets/{razor-Ceb9S1Rz.js → razor-CI-yLdex.js} +1 -1
  109. package/dist/web-dist/assets/react-CGNcTA1t.js +1 -0
  110. package/dist/web-dist/assets/react-dom-Czf_u9MH.js +9 -0
  111. package/dist/web-dist/assets/{redis-BnpkEvbr.js → redis-BdhjrevD.js} +1 -1
  112. package/dist/web-dist/assets/{redis-value-DMk0-Zuc.js → redis-value-Cq8YBvSS.js} +1 -1
  113. package/dist/web-dist/assets/{redshift-BpxVXjAI.js → redshift-CwVMUyQc.js} +1 -1
  114. package/dist/web-dist/assets/{restructuredtext-5afXtW7D.js → restructuredtext-D6U9PIiF.js} +1 -1
  115. package/dist/web-dist/assets/rolldown-runtime-D_n5YsVB.js +1 -0
  116. package/dist/web-dist/assets/{ruby-CHaoWUHT.js → ruby-D0QS81Wd.js} +1 -1
  117. package/dist/web-dist/assets/runner-BE2YTdi9.js +1 -0
  118. package/dist/web-dist/assets/{rust-Bw0WVsLy.js → rust-Bsq9cLDY.js} +1 -1
  119. package/dist/web-dist/assets/{sb-CEjXmIyG.js → sb-DAQADLLd.js} +1 -1
  120. package/dist/web-dist/assets/{scala-BuaCSaU6.js → scala-oEMLo0pl.js} +1 -1
  121. package/dist/web-dist/assets/schema-B-jmgfHC.js +1 -0
  122. package/dist/web-dist/assets/schema-JCqbh3DE.js +1 -0
  123. package/dist/web-dist/assets/{scheme-DIKzlmFG.js → scheme-DDI6muad.js} +1 -1
  124. package/dist/web-dist/assets/{scss-C2_UsWzg.js → scss-BU9Ttlwm.js} +1 -1
  125. package/dist/web-dist/assets/{select-C-nrz7Tx.js → select-3l4LDMzT.js} +1 -1
  126. package/dist/web-dist/assets/{separator-DnB61XAO.js → separator-BD46sVx9.js} +1 -1
  127. package/dist/web-dist/assets/{sheet-sidebar-BGxJGRbd.js → sheet-sidebar-CjbtFAKn.js} +1 -1
  128. package/dist/web-dist/assets/{shell-2aEL2EVH.js → shell-BI6rOefn.js} +1 -1
  129. package/dist/web-dist/assets/{solidity-D-5XfYE1.js → solidity-B17zzzu-.js} +1 -1
  130. package/dist/web-dist/assets/{sophia-s4MFSvUF.js → sophia-DQi6mooo.js} +1 -1
  131. package/dist/web-dist/assets/{sparql-Dkv46wS5.js → sparql-DGFBDMPi.js} +1 -1
  132. package/dist/web-dist/assets/spinner-D7Cvt3BD.js +1 -0
  133. package/dist/web-dist/assets/{sql-Dz9Xhs8s.js → sql-DGzRlxQo.js} +1 -1
  134. package/dist/web-dist/assets/{st-Cbo0XVmr.js → st-Ceq2dhS_.js} +1 -1
  135. package/dist/web-dist/assets/{swift-B66X97nW.js → swift-8-FeeRSy.js} +1 -1
  136. package/dist/web-dist/assets/{systemverilog-gGKga8Gf.js → systemverilog-mmioB6wo.js} +1 -1
  137. package/dist/web-dist/assets/table-sVAmZLcg.js +1 -0
  138. package/dist/web-dist/assets/tables-TW8L7_FW.js +16 -0
  139. package/dist/web-dist/assets/tanstack-D9GckDbx.js +5 -0
  140. package/dist/web-dist/assets/{tcl-BtbeJsUN.js → tcl-BTUJQo2X.js} +1 -1
  141. package/dist/web-dist/assets/{ts.worker-r_qbh1JO.js → ts.worker-BLC4EdqU.js} +18311 -18257
  142. package/dist/web-dist/assets/{tsMode-BgtcNcpl.js → tsMode-BRJ2WiSx.js} +4 -4
  143. package/dist/web-dist/assets/{twig-0_nXiuYs.js → twig-C6ea54bM.js} +1 -1
  144. package/dist/web-dist/assets/{typescript-Cy_CzC_-.js → typescript-U3aTTn2d.js} +1 -1
  145. package/dist/web-dist/assets/{typespec-DBO6_WMJ.js → typespec-B4z8l2XF.js} +1 -1
  146. package/dist/web-dist/assets/use-database-engine-CG7rZQXQ.js +1 -0
  147. package/dist/web-dist/assets/{use-theme-DBhPknw6.js → use-theme-CKjVHAZg.js} +1 -1
  148. package/dist/web-dist/assets/utils-CZdosIsH.js +1 -0
  149. package/dist/web-dist/assets/{vb-DFJjBsW2.js → vb-BbQNgbjG.js} +1 -1
  150. package/dist/web-dist/assets/visualizer-c23lRr6o.js +1 -0
  151. package/dist/web-dist/assets/{wgsl-U3RBM2M0.js → wgsl-SWAFFAY4.js} +1 -1
  152. package/dist/web-dist/assets/{workers-ClRH6A2w.js → workers-DeOJBffb.js} +1 -1
  153. package/dist/web-dist/assets/{xml-D11j3J2_.js → xml-DM-qLhlQ.js} +1 -1
  154. package/dist/web-dist/assets/{yaml-D7Z_4mnx.js → yaml-BB3LUpV7.js} +1 -1
  155. package/dist/web-dist/index.html +31 -31
  156. package/package.json +22 -22
  157. package/dist/web-dist/assets/_pathlessLayout-CUDS1e28.js +0 -1
  158. package/dist/web-dist/assets/_pathlessLayout-WZkezfN7.js +0 -2
  159. package/dist/web-dist/assets/_queryId-CEJb62Vl.js +0 -1
  160. package/dist/web-dist/assets/_table-6SZEx92j.js +0 -1
  161. package/dist/web-dist/assets/_table-CwyP_2EP.js +0 -1
  162. package/dist/web-dist/assets/bundle-mjs-CZwf2xtr.js +0 -1
  163. package/dist/web-dist/assets/chat-sidebar-DwzCElBd.js +0 -132
  164. package/dist/web-dist/assets/connect-l3LjAClZ.js +0 -1
  165. package/dist/web-dist/assets/constants-CKAehpPm.js +0 -12
  166. package/dist/web-dist/assets/cssMode-G6latsS7.js +0 -1
  167. package/dist/web-dist/assets/database.store-BuqVJMY6.js +0 -57
  168. package/dist/web-dist/assets/dist-Bz0qAN0x.js +0 -2
  169. package/dist/web-dist/assets/dist-Cf0L32Jd.js +0 -1
  170. package/dist/web-dist/assets/editor-1FQrmyyI.css +0 -1
  171. package/dist/web-dist/assets/editor.api-BTIrAcm5.js +0 -865
  172. package/dist/web-dist/assets/format-cell-value-CgUtYv8B.js +0 -1
  173. package/dist/web-dist/assets/highlighted-body-OFNGDK62-t8UIAZOZ.js +0 -1
  174. package/dist/web-dist/assets/icons-DxFtdMXW.js +0 -1
  175. package/dist/web-dist/assets/index-QVi4Lb9U.css +0 -2
  176. package/dist/web-dist/assets/index-WFVurGCI.js +0 -34
  177. package/dist/web-dist/assets/indexes-C3Qddb5L.js +0 -1
  178. package/dist/web-dist/assets/mermaid-GHXKKRXX-D35eppUc.js +0 -1
  179. package/dist/web-dist/assets/middleware-CXk7SlTF.js +0 -1
  180. package/dist/web-dist/assets/module-D_kjbMCc.js +0 -2
  181. package/dist/web-dist/assets/monaco-theme-BnSsSzUH.css +0 -1
  182. package/dist/web-dist/assets/monaco-theme-C2k_taVU.js +0 -64
  183. package/dist/web-dist/assets/preload-helper-DF7hIgef.js +0 -1
  184. package/dist/web-dist/assets/query-runner-f473QQSD.js +0 -17
  185. package/dist/web-dist/assets/radix-ui-CxCv--D1.js +0 -51
  186. package/dist/web-dist/assets/react-DEQ0BgTL.js +0 -1
  187. package/dist/web-dist/assets/react-dom-ITw3Lqwx.js +0 -9
  188. package/dist/web-dist/assets/rolldown-runtime-fzu9RN21.js +0 -1
  189. package/dist/web-dist/assets/runner-NsYjzIZs.js +0 -1
  190. package/dist/web-dist/assets/schema-CE1yGygf.js +0 -1
  191. package/dist/web-dist/assets/schema-rxLBue8Q.js +0 -1
  192. package/dist/web-dist/assets/spinner-CNnB5r0X.js +0 -1
  193. package/dist/web-dist/assets/table-C8WK3uAc.js +0 -1
  194. package/dist/web-dist/assets/tables-D98Kbmcb.js +0 -16
  195. package/dist/web-dist/assets/tanstack-RwHFfmqj.js +0 -8
  196. package/dist/web-dist/assets/use-database-engine-DZZj7-4J.js +0 -1
  197. package/dist/web-dist/assets/utils-EJLOIroS.js +0 -1
  198. package/dist/web-dist/assets/visualizer-CgYlDJ_-.js +0 -1
  199. package/dist/web-dist/assets/vscode-wuSgCuZI.js +0 -1
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- var Bl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var Pt=(r,e)=>{for(var t in e)Bl(r,t,{get:e[t],enumerable:!0})};var y=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.1.0"}}catch{}})()});var ks=R(()=>{"use strict";y()});var vs=R(()=>{"use strict";y()});var Us=R(()=>{"use strict";y()});var Bs,qs,it,Fs=R(()=>{"use strict";y();Bs=globalThis.process?.env,qs=Bs?.NODE_ENV,it={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:qs==="development",PROXY_URL:Bs?.DB_STUDIO_PROXY_URL??(qs==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var Ks=R(()=>{"use strict";y()});var Hs,xr=R(()=>{"use strict";y();Hs={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 js=R(()=>{"use strict";y()});var an=R(()=>{"use strict";y();ks();vs();Us();Fs();Ks();xr();js()});import{z as Et}from"zod";var U,k,Mt,ft,Yl,zl,ie,Ee=R(()=>{"use strict";y();U=Et.object({db:Et.string("Database name is required")}),k=U.extend({schemaName:Et.string().optional()}),Mt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],ft=Et.enum(Mt,{message:"Invalid database type"}),Yl=U.extend({dbType:ft}),zl=Et.object({dbType:ft}),ie=Et.object({tableName:Et.string("Table name is required")})});import{z as We}from"zod";var Be,Gl,Ql,Gs=R(()=>{"use strict";y();Ee();Be=We.object({columnName:We.string("Column name is required"),columnType:We.string("Column type is required"),defaultValue:We.string().optional(),isPrimaryKey:We.boolean().default(!1),isNullable:We.boolean().default(!1),isUnique:We.boolean().default(!1),isIdentity:We.boolean().default(!1),isArray:We.boolean().default(!1)}),Gl=ie,Ql=We.object({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.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 sn}from"zod";var $r,Qs=R(()=>{"use strict";y();$r=sn.object({tableName:sn.string("Table name is required"),data:sn.record(sn.string("Column name is required"),sn.any())})});import{z as Jl}from"zod";var Js,Mr,Xs,kr,vr=R(()=>{"use strict";y();Js=["gemini","openai","anthropic","grok","openrouter"],Mr=Jl.enum(Js),Xs=[{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"}]}],kr=r=>Xs.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Fe}from"zod";var Ur,we,Xl,Zl,Ln=R(()=>{"use strict";y();Ee();Ur=k.extend({cascade:Fe.string().optional().transform(r=>r==="true")}),we=Fe.object({tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required")}),Xl=Fe.object({db:U.shape.db,tableName:we.shape.tableName,schemaName:k.shape.schemaName,columnName:we.shape.columnName,cascade:Fe.boolean().optional()}),Zl=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 on}from"zod";var kt,eu,tu,Zs=R(()=>{"use strict";y();Ee();Ln();kt=on.object({columnType:on.string("Column type is required"),isNullable:on.boolean(),defaultValue:on.string().nullable().optional()}),eu=we,tu=on.object({db:U.shape.db,tableName:we.shape.tableName,schemaName:k.shape.schemaName,columnName:we.shape.columnName,columnType:kt.shape.columnType,isNullable:kt.shape.isNullable,defaultValue:kt.shape.defaultValue})});var eo=R(()=>{"use strict";y()});import{z as vt}from"zod";var qr,to=R(()=>{"use strict";y();qr=vt.object({tableName:vt.string().min(1,"Table name is required"),records:vt.array(vt.record(vt.string(),vt.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var nu,ru,Br,no=R(()=>{"use strict";y();vr();Ee();nu=me.object({type:me.string(),content:me.string().optional()}).passthrough(),ru=me.object({provider:Mr.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(nu).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:U.shape.db,includeSchema:me.boolean().optional().default(!0)})}),Br=ru.transform(r=>({...r,model:r.model??kr(r.provider)}))});var ro=R(()=>{"use strict";y()});import{z as xe}from"zod";var au,ao,L,su,so,ou,Fr=R(()=>{"use strict";y();au=["text","boolean","number","enum","json","date","array"],ao=xe.enum(au),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},su=["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"],so=xe.enum(su),ou=xe.object({columnName:xe.string(),dataType:ao,dataTypeLabel:so,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 Pn(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 Kr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?g.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?g.bigint:e==="smallint"||e==="int2"?g.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?g.numeric:e==="real"||e==="float4"?g.float:e==="double precision"||e==="float8"||e==="float"?g.double:e==="money"?g.money:e==="boolean"||e==="bool"?g.boolean:e==="text"?g.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?g.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?g.char:e==="json"?g.json:e==="jsonb"?g.jsonb:e==="xml"?g.xml:e==="uuid"?g.uuid:e==="date"?g.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?g.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?g.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?g.timestamptz:e==="interval"||e.startsWith("interval")?g.interval:e==="bytea"?g.bytea:e==="inet"?g.inet:e==="cidr"?g.cidr:e==="macaddr"?g.macaddr:e==="macaddr8"?g.macaddr8:e==="point"?g.point:e==="line"?g.line:e==="polygon"?g.polygon:e.startsWith("array")||e.includes("[]")?g.text:e.startsWith("user-defined")||e==="enum"?g.enum:g.text}function $n(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 Hr(r,e){if(!r)return g.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?g.boolean:t==="tinyint"?g.tinyint:t==="smallint"?g.smallint:t==="mediumint"?g.mediumint:t==="int"||t==="integer"?g.int:t==="bigint"?g.bigint:t==="decimal"||t==="numeric"?g.numeric:t==="float"||t==="real"?g.float:t==="double"?g.double:t==="bit"?g.bit:t==="boolean"||t==="bool"?g.boolean:t==="char"?g.char:t==="varchar"?g.varchar:t==="tinytext"?g.tinytext:t==="text"?g.text:t==="mediumtext"?g.mediumtext:t==="longtext"?g.longtext:t==="binary"?g.binary:t==="varbinary"?g.varbinary:t==="tinyblob"?g.tinyblob:t==="blob"?g.blob:t==="mediumblob"?g.mediumblob:t==="longblob"?g.longblob:t==="json"?g.json:t==="date"?g.date:t==="time"?g.time:t==="datetime"?g.datetime:t==="timestamp"?g.timestamp:t==="year"?g.year:t==="enum"?g.enum:t==="set"?g.set:g.text}function Mn(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 jr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="tinyint"?g.tinyint:e==="smallint"?g.smallint:e==="int"?g.int:e==="bigint"?g.bigint:e==="decimal"||e==="numeric"?g.numeric:e==="float"||e==="real"?g.float:e==="money"||e==="smallmoney"?g.money:e==="bit"?g.boolean:e==="char"?g.char:e==="varchar"?g.varchar:e==="text"?g.text:e==="nchar"?g.char:e==="nvarchar"?g.varchar:e==="ntext"?g.text:e==="binary"?g.binary:e==="varbinary"?g.varbinary:e==="image"?g.blob:e==="uniqueidentifier"?g.uuid:e==="date"?g.date:e==="time"?g.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?g.datetime:e==="datetimeoffset"?g.timestamptz:e==="json"?g.json:e==="xml"?g.xml:g.text}function kn(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 Wr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?g.int:e==="bigint"||e.startsWith("bigint(")?g.bigint:e==="smallint"||e.startsWith("smallint(")?g.smallint:e==="tinyint"||e.startsWith("tinyint(")?g.tinyint:e==="mediumint"||e.startsWith("mediumint(")?g.mediumint:e.includes("int")?g.int:e==="real"||e==="float"||e.startsWith("float(")?g.float:e==="double"||e==="double precision"||e.startsWith("double(")?g.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?g.numeric:e==="boolean"||e==="bool"?g.boolean:e==="text"||e==="clob"?g.text:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="char"||e.startsWith("char(")?g.char:e==="json"?g.json:e==="date"?g.date:e==="time"?g.time:e==="datetime"?g.datetime:e==="timestamp"?g.timestamp:e==="blob"?g.blob:g.text}function vn(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 Vr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?g.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?g.json:e.startsWith("enum")?g.enum:e==="interval"?g.interval:e==="tinyint"||e==="utinyint"?g.tinyint:e==="smallint"||e==="usmallint"?g.smallint:e==="integer"||e==="int"?g.int:e.includes("int")||e==="bignum"?g.bigint:e.startsWith("decimal")||e.startsWith("numeric")?g.numeric:e==="float"||e==="real"?g.float:e==="double"?g.double:e==="boolean"||e==="bool"?g.boolean:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="uuid"?g.uuid:e==="date"?g.date:e==="timestamp with time zone"||e==="timestamptz"?g.timestamptz:e.startsWith("timestamp")||e==="datetime"?g.timestamp:e.startsWith("time")?g.time:e==="blob"||e==="bytea"?g.blob:e==="bit"||e==="bitstring"?g.bit:g.text}function Un(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 Yr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return g.boolean;if(e==="json")return g.json;if(e==="xmltype")return g.xml;if(e==="integer")return g.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return g.smallint;if(n<=10)return g.int;if(n<=19)return g.bigint}return e.startsWith("number")?g.numeric:e==="binary_float"?g.float:e==="binary_double"||e.startsWith("float")?g.double:e.startsWith("varchar")||e.startsWith("nvarchar")?g.varchar:e.startsWith("char")||e.startsWith("nchar")?g.char:e.startsWith("timestamp")&&e.endsWith("time zone")?g.timestamptz:e==="date"||e.startsWith("timestamp")?g.timestamp:e.startsWith("interval")?g.interval:e==="blob"||e==="long raw"?g.blob:e.startsWith("raw")?g.varbinary:g.text}function Ut(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function qn(r){let e=Ut(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 zr(r){let e=Ut(r);return e.startsWith("Array(")?g.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?g.enum:e==="Bool"?g.boolean:/^U?Int8$/.test(e)?g.tinyint:/^U?Int16$/.test(e)?g.smallint:/^U?Int32$/.test(e)?g.int:/^U?Int(64|128|256)$/.test(e)?g.bigint:e==="Float32"||e==="BFloat16"?g.float:e==="Float64"?g.double:e.startsWith("Decimal")?g.numeric:e.startsWith("FixedString(")?g.char:e==="UUID"?g.uuid:e==="IPv4"||e==="IPv6"?g.inet:e==="Date"||e==="Date32"?g.date:e.startsWith("DateTime64")?g.timestamp:e.startsWith("DateTime")?g.datetime:e.startsWith("Time")?g.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?g.json:g.text}var g,oo=R(()=>{"use strict";y();Fr();g={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 fe}from"zod";var io,cn,co,iu,Gr,Qr,lo=R(()=>{"use strict";y();Ee();io=["red","orange","amber","green","teal","blue","violet","pink"],cn=fe.enum(io),co=fe.object({id:fe.string(),name:fe.string(),color:cn.nullable(),readOnly:fe.boolean(),lastUsedAt:fe.number(),dbType:ft,maskedUrl:fe.string()}),iu=fe.object({connections:fe.array(co),active:fe.object({id:fe.string().nullable(),dbType:ft,connectionId:fe.string()}).nullable()}),Gr=fe.object({url:fe.string().trim().min(1,"Paste a connection URL")}),Qr=fe.object({name:fe.string().trim().min(1,"Name is required").max(100).optional(),color:cn.nullable().optional(),readOnly:fe.boolean().optional()})});import{z as de}from"zod";var uo,Jr,mo,po,Xr,fo=R(()=>{"use strict";y();uo=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Jr=de.enum(uo),mo=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)}),po=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:Jr.default("NO ACTION"),onDelete:Jr.default("NO ACTION")}),Xr=de.object({tableName:de.string("Table name is required"),fields:de.array(mo).min(1,"At least one field is required"),foreignKeys:de.array(po).optional()})});var M,Ve,yo=R(()=>{"use strict";y();Ee();M={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},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,cellDefault:!0,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!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,cellDefault:!0,readOnly:!1,sqlInsert:{quote:"[",booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!0},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,cellDefault:!1,readOnly:!1,sqlInsert:null,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,cellDefault:!1,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!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,cellDefault:!1,readOnly:!1,sqlInsert:null,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!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,cellDefault:!0,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!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,cellDefault:!1,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!1},indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},Ve=r=>Mt.find(e=>M[e].protocols.includes(r))});import{z as Se}from"zod";var ho,cu,lu,go=R(()=>{"use strict";y();Ee();ho=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")}),cu=Se.object({databases:Se.array(ho),dbType:ft}),lu=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 bo=R(()=>{"use strict";y()});import{z as qt}from"zod";var Bn,To=R(()=>{"use strict";y();Bn=qt.object({tableName:qt.string("Table name is required"),primaryKeys:qt.array(qt.object({columnName:qt.string("Column name is required"),value:qt.any()})).min(1,"At least one primary key is required")})});import{z as uu}from"zod";var Zr,Eo=R(()=>{"use strict";y();Ee();Zr=k.extend({cascade:uu.string().optional().transform(r=>r==="true")})});import{z as wo}from"zod";var ea,So=R(()=>{"use strict";y();ea=wo.object({query:wo.string("Query is required")})});import{z as mu}from"zod";var Co,ta,Ro=R(()=>{"use strict";y();Ee();Co=["csv","xlsx","json"],ta=k.extend({format:mu.enum(Co,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var No,du,Fn,pu,Kn,fu,Ao=R(()=>{"use strict";y();Ee();No=["primary","unique-constraint","index"],du=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(No),definition:ce.string().nullable()}),Fn=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),pu=Fn.extend({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName}),Kn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),fu=Kn.extend({db:U.shape.db,schemaName:k.shape.schemaName})});import{z as E}from"zod";var Hn,v,na,ra,yu,aa,Bt,hu,gu,bu,Tu,Eu,wu,Su,Do,Cu,sa,Ru,Nu,Au,Du,_u,Ou,Iu,oa,xu,Lu,Pu,$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,ia,ca,Vu,_o=R(()=>{"use strict";y();Hn=E.enum(["string","hash","list","set","zset","stream","unknown"]),v=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()}),na=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:Hn.exclude(["unknown"]).optional()}),ra=E.object({key:v,type:Hn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),yu=E.object({keys:E.array(ra),nextCursor:E.string().nullable(),hasMore:E.boolean()}),aa=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")}),Bt=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),hu=E.object({kind:E.literal("string"),value:v,truncated:E.boolean()}),gu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v}))}),bu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:v}))}),Tu=E.object({kind:E.literal("set"),members:E.array(v)}),Eu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),wu=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:v,value:v}))}))}),Su=E.object({kind:E.literal("unknown")}),Do=E.discriminatedUnion("kind",[hu,gu,bu,Tu,Eu,wu,Su]),Cu=ra.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Do,nextCursor:E.string().nullable(),hasMore:E.boolean()}),sa=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()}),Ru=E.object({chunk:v,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),Nu=E.object({kind:E.literal("string"),value:v}),Au=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v})).min(1)}),Du=E.object({kind:E.literal("list"),entries:E.array(v).min(1)}),_u=E.object({kind:E.literal("set"),members:E.array(v).min(1)}),Ou=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.number()})).min(1)}),Iu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),oa=E.object({key:v,type:Hn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[Nu,Au,Du,_u,Ou,Iu]),ttlMs:E.number().int().positive().nullable().default(null)}),xu=E.object({key:v,revision:E.string().nullable(),deleted:E.boolean()}),Lu=E.object({action:E.literal("rename"),newKey:v}),Pu=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),$u=E.object({action:E.literal("setString"),value:v}),Mu=E.object({action:E.literal("upsertHash"),field:v,value:v}),ku=E.object({action:E.literal("deleteHash"),field:v}),vu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:v}),Uu=E.object({action:E.literal("setList"),index:E.number().int(),value:v}),qu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Bu=E.object({action:E.literal("addSet"),member:v}),Fu=E.object({action:E.literal("removeSet"),member:v}),Ku=E.object({action:E.literal("upsertZset"),member:v,score:E.number()}),Hu=E.object({action:E.literal("removeZset"),member:v}),ju=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),Wu=E.object({action:E.literal("deleteStream"),id:E.string()}),ia=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[Lu,Pu,$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu])}),ca=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),Vu=E.object({deleted:E.boolean()})});var Oo=R(()=>{"use strict";y()});import{z as la}from"zod";var jn,Yu,zu,Io=R(()=>{"use strict";y();Ee();Ln();jn=la.object({newColumnName:la.string("New column name is required")}),Yu=we,zu=la.object({db:U.shape.db,tableName:we.shape.tableName,schemaName:k.shape.schemaName,columnName:we.shape.columnName,newColumnName:jn.shape.newColumnName})});import{z as Wn}from"zod";var ln,Gu,Qu,xo=R(()=>{"use strict";y();Ee();ln=Wn.object({newTableName:Wn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Wn.string().trim().min(1).optional()}),Gu=ie,Qu=Wn.object({db:U.shape.db,tableName:ie.shape.tableName,newTableName:ln.shape.newTableName,schemaName:ln.shape.schemaName})});import{z as ke}from"zod";var Lo,Po,Ju,$o=R(()=>{"use strict";y();Lo=["fatal","error","warning","info","debug"],Po=ke.enum(Lo),Ju=ke.object({ts:ke.string(),level:Po,rawLevel:ke.string(),source:ke.string().optional(),code:ke.string().optional(),message:ke.string(),durationMs:ke.number().optional(),statement:ke.string().optional(),detail:ke.record(ke.string(),ke.string())})});import{z as q}from"zod";var Mo,un,ko,vo,Xu,ua,Uo=R(()=>{"use strict";y();Ee();Mo=q.object({columnName:q.string(),operator:q.string(),value:q.string()}),un=["asc","desc"],ko=q.object({columnName:q.string(),direction:q.enum(un)}),vo=q.object({limit:q.number(),total:q.number(),totalEstimated:q.boolean().optional(),hasNextPage:q.boolean(),hasPreviousPage:q.boolean(),nextCursor:q.string().nullable(),prevCursor:q.string().nullable()}),Xu=q.object({data:q.array(q.record(q.string(),q.unknown())),meta:vo}),ua=q.object({db:U.shape.db,schemaName:k.shape.schemaName,cursor:q.string().optional(),limit:q.string().optional().default("50").transform(Number),direction:q.enum(un).optional().default(un[0]),sort:q.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(q.union([q.string(),q.array(ko)])),order:q.enum(un).optional(),filters:q.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(q.array(Mo))})});import{z as mn}from"zod";var Zu,qo=R(()=>{"use strict";y();Zu=mn.object({tableName:mn.string("Table name is required"),schemaName:mn.string().optional(),rowCount:mn.coerce.number("Row count is required"),rowCountEstimated:mn.boolean().optional()})});import{z as Bo}from"zod";var em,Fo=R(()=>{"use strict";y();em=Bo.object({schema:Bo.string()})});import{z as Le}from"zod";var ma,Ko=R(()=>{"use strict";y();ma=Le.object({tableName:Le.string("Table name is required"),primaryKey:Le.string("Primary key is required").default("id"),primaryKeys:Le.array(Le.string().min(1)).min(1).optional(),updates:Le.array(Le.object({rowData:Le.record(Le.string("Column name is required"),Le.any()),columnName:Le.string("Column name is required"),value:Le.any(),useDefault:Le.boolean().optional()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Ho={};Pt(Ho,{AI_PROVIDERS:()=>Js,AI_PROVIDER_OPTIONS:()=>Xs,CONNECTION_COLORS:()=>io,DATABASE_ENGINES:()=>M,DATABASE_TYPES:()=>Mt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>uo,FORMAT_TYPES:()=>Co,INDEX_KINDS:()=>No,SERVER_LOG_LEVELS:()=>Lo,StandardizedDataType:()=>g,addColumnParamSchema:()=>Gl,addColumnParamsSchema:()=>Ql,addColumnSchema:()=>Be,addRecordSchema:()=>$r,aiProviderSchema:()=>Mr,alterColumnParamSchema:()=>eu,alterColumnParamsSchema:()=>tu,alterColumnSchema:()=>kt,bulkInsertRecordsSchema:()=>qr,chatSchema:()=>Br,columnInfoSchema:()=>ou,connectUrlSchema:()=>Gr,connectionColorSchema:()=>cn,connectionInfoSchema:()=>lu,connectionSummarySchema:()=>co,connectionsStateSchema:()=>iu,createIndexParamsSchema:()=>pu,createIndexSchema:()=>Fn,createKeySchema:()=>oa,createTableSchema:()=>Xr,currentDatabaseSchema:()=>Yl,dataTypesSchema:()=>ao,databaseInfoSchema:()=>ho,databaseListSchema:()=>cu,databaseSchema:()=>U,databaseTypeParamSchema:()=>zl,databaseTypeSchema:()=>ft,dbTypeFromProtocol:()=>Ve,deleteColumnParamSchema:()=>we,deleteColumnParamsSchema:()=>Xl,deleteColumnQuerySchema:()=>Ur,deleteColumnSuccessResponseSchema:()=>Zl,deleteKeyQuerySchema:()=>ca,deleteKeyResultSchema:()=>Vu,deleteRecordSchema:()=>Bn,deleteTableQuerySchema:()=>Zr,dropIndexParamSchema:()=>Kn,dropIndexParamsSchema:()=>fu,encodedRedisValueSchema:()=>v,executeQuerySchema:()=>ea,exportTableSchema:()=>ta,fieldDataSchema:()=>mo,filterSchema:()=>Mo,foreignKeyActionSchema:()=>Jr,foreignKeyDataSchema:()=>po,getDefaultAiModel:()=>kr,indexInfoSchema:()=>du,keyActionSchema:()=>ia,keyDetailsQuerySchema:()=>aa,keyDetailsResultSchema:()=>Cu,keyParamSchema:()=>Bt,keyRawQuerySchema:()=>sa,keyRawResultSchema:()=>Ru,keyScanQuerySchema:()=>na,keyScanResultSchema:()=>yu,keyWriteResultSchema:()=>xu,mapClickhouseToDataType:()=>qn,mapDuckdbToDataType:()=>vn,mapMssqlToDataType:()=>Mn,mapMysqlToDataType:()=>$n,mapOracleToDataType:()=>Un,mapPostgresToDataType:()=>Pn,mapSqliteToDataType:()=>kn,redisKeySummarySchema:()=>ra,redisKeyTypeSchema:()=>Hn,redisKeyValueSchema:()=>Do,renameColumnParamSchema:()=>Yu,renameColumnParamsSchema:()=>zu,renameColumnSchema:()=>jn,renameTableParamSchema:()=>Gu,renameTableParamsSchema:()=>Qu,renameTableSchema:()=>ln,serverLogEntrySchema:()=>Ju,serverLogLevelSchema:()=>Po,sortDirections:()=>un,sortSchema:()=>ko,standardizeClickhouseDataTypeLabel:()=>zr,standardizeDataTypeLabel:()=>Kr,standardizeDuckdbDataTypeLabel:()=>Vr,standardizeMssqlDataTypeLabel:()=>jr,standardizeMysqlDataTypeLabel:()=>Hr,standardizeOracleDataTypeLabel:()=>Yr,standardizeSqliteDataTypeLabel:()=>Wr,standardizedDataTypeSchema:()=>so,tableDataMetaSchema:()=>vo,tableDataQuerySchema:()=>ua,tableDataResultSchema:()=>Xu,tableInfoSchema:()=>Zu,tableNameSchema:()=>ie,tableQuerySchema:()=>k,tableSchemaResultSchema:()=>em,unwrapClickhouseType:()=>Ut,updateConnectionSchema:()=>Qr,updateRecordsSchema:()=>ma});var j=R(()=>{"use strict";y();Gs();Qs();vr();Zs();eo();to();no();ro();oo();Fr();lo();fo();Ee();yo();go();bo();Ln();To();Eo();So();Ro();Ao();_o();Oo();Io();xo();$o();Uo();qo();Fo();Ko()});var tm,nm,rm,Vn,da=R(()=>{"use strict";y();j();tm=Object.values(M).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),nm=new RegExp(`\\b(?:${tm}):\\/\\/\\S+`,"gi"),rm=/\b(authToken=)[^&\s]+/gi,Vn=r=>r.replace(nm,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(rm,"$1[redacted]")});var d,Q=R(()=>{"use strict";y();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}}});import{AsyncLocalStorage as om}from"async_hooks";import{randomUUID as Wo}from"crypto";var im,cm,Yn,Vo,Yo,ct,pa,lm,um,mm,zo,fa,ye,Z,Ye=R(()=>{"use strict";y();Q();im=Wo(),cm=/^[A-Za-z0-9_-]{8,64}$/,Yn=new om,Vo=r=>r&&cm.test(r)?r:Wo(),Yo=(r,e)=>Yn.run(r,e),ct=()=>Yn.getStore()?.requestId,pa=()=>Yn.getStore()?.connectionId,lm=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"},um=/^[A-Z0-9_-]{2,32}$/,mm=[[/^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"]],zo=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"&&um.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]:mm.find(([s])=>s.test(r.message))?.[1]??zo(a)},fa=r=>r instanceof d&&r.cause?r.cause:r,ye=r=>{let e=fa(r);return{error_type:lm(e),error_code:zo(e)}},Z=(r,e,t={})=>{let n=Yn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:im,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)||dm(e)}}catch(e){return Z("error","database_url_unparseable",ye(e)),{host:"localhost",port:5432}}}var zn,dm,Go,ze=R(()=>{"use strict";y();j();Ye();zn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},dm=r=>{let e=r.protocol.replace(":",""),t=Ve(e);return zn[e]?.defaultPort??(t&&M[t].defaultPort)??5432},Go=r=>{let e=new URL(r),t=zn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var wt,ya=R(()=>{wt={name:"db-studio",type:"module",version:"2.1.0",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 ai={};Pt(ai,{captureInstallationActive:()=>Ea,captureServerError:()=>wa,captureServerEvent:()=>Zn,databaseTypeForRequest:()=>fn,durationBucket:()=>ba,flushServerObservability:()=>Om,getTelemetryConfig:()=>Jn,initServerObservability:()=>ri,operationForRequest:()=>pn,outcomeForStatus:()=>Ta,resetTelemetryId:()=>ga,setTelemetryEnabled:()=>Xn,startServerSpan:()=>Sa});import{randomUUID as ei}from"crypto";import{existsSync as bm,mkdirSync as Tm,readFileSync as Em,writeFileSync as wm}from"fs";import{homedir as ha,platform as Sm}from"os";import Gn from"path";import*as Pe from"@sentry/node";import{PostHog as Cm}from"posthog-node";var Rm,ti,Qn,Nm,Am,yt,St,Dm,_m,Ct,dn,Jn,Xn,ga,ba,Ta,ni,pn,fn,ri,Om,Zn,Ea,Im,wa,Sa,yn=R(()=>{"use strict";y();j();Ye();ya();Rm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",ti=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Gn.join(ha(),".local","state"));return Gn.join(r||Gn.join(ha(),".db-studio"),"db-studio","telemetry.json")},Qn=r=>{try{let e=ti();Tm(Gn.dirname(e),{recursive:!0}),wm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},Nm=()=>({installationId:ei(),enabled:!0}),Am=()=>{let r=ti();try{if(bm(r)){let t=JSON.parse(Em(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=Nm();return Qn(e),e},Dm="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",_m="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",Ct=()=>yt??=Am(),dn=()=>!Rm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&Ct().enabled,Jn=()=>({enabled:dn(),installationId:Ct().installationId,appVersion:wt.version}),Xn=r=>{yt={...Ct(),enabled:r},Qn(yt),r?(St?.enable(),ri()):(St?.disable(),Pe.close(500))},ga=()=>(yt={...Ct(),installationId:ei(),lastActiveAt:void 0},Qn(yt),yt.installationId),ba=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",Ta=r=>r>=500?"server_error":r>=400?"client_error":"success",ni=new RegExp(`^/api/(${Mt.join("|")})(?=/|$)`),pn=(r,e)=>{let t=e.replace(ni,"/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}`},fn=r=>r.match(ni)?.[1],ri=()=>{if(!dn())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Dm;r&&(!Pe.isInitialized()||Pe.getClient()?.getOptions().enabled===!1)&&Pe.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${wt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:Ct().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??_m;e&&!St&&(St=new Cm(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Om=()=>Promise.allSettled([St?.shutdown(2e3),Pe.close(2e3)]),Zn=r=>{!dn()||!St||St.capture({distinctId:Ct().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:wt.version,$geoip_disable:!1}})},Ea=()=>{if(!dn())return;let r=Ct(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(yt={...r,lastActiveAt:new Date().toISOString()},Qn(yt),Zn({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:Sm()}}))},Im=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=ha(),s=r.stack.split(`
4
- `).slice(1).filter(o=>/^\s*at\s/.test(o)).map(o=>o.replaceAll(a,"~"));n.stack=[`${e}: ${t}`,...s].join(`
5
- `)}return n},wa=(r,{operation:e,status:t,dbType:n})=>{if(!dn()||t<500)return;let{error_type:a,error_code:s}=ye(r),o=ct(),i=`${e} failed with ${t}${s?` ${s}`:""}`;Pe.captureException(Im(fa(r),a,i),{tags:{operation:e,source:"server",release:wt.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"]})},Sa=(r,e,t)=>Pe.startSpan({name:r,op:"http.server",attributes:{"db_studio.operation":r,...e?{"db_studio.db_type":e}:{}}},t)});var si={};Pt(si,{checkDatabaseConnection:()=>Ra,getDatabaseConnectionDetails:()=>Lm});var xm,Ca,Lm,Ra,Na=R(()=>{"use strict";y();j();ze();xm=2e3,Ca=async r=>{let e;try{return await Promise.race([r,new Promise((t,n)=>{e=setTimeout(()=>n(new Error("Database startup check timed out")),xm)})])}finally{e&&clearTimeout(e)}},Lm=r=>{let e=Ve(r.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{label:t,defaultPort:n}=M[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}`}},Ra=async r=>{switch(r.getDbType()){case"pg":await Ca(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 Ca(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 Ca(r.getClickhouseClient().then(e=>e.query({query:"SELECT 1"})))}}});import{randomUUID as Pm}from"crypto";import{chmod as $m,mkdir as Mm,readFile as km,rename as vm,writeFile as Um}from"fs/promises";import{homedir as qm}from"os";import{basename as Bm,join as ci,resolve as Fm}from"path";import{z as lt}from"zod";var Km,Hm,li,er,oi,ui,jm,Wm,Ge,mi,Vm,ii,Aa,Ym,Da,_a,Oa,tr,Ia,di,pi,fi,xa=R(()=>{"use strict";y();j();Q();Km=lt.object({id:lt.string(),name:lt.string(),url:lt.string(),color:cn.nullable(),readOnly:lt.boolean().default(!1),lastUsedAt:lt.number()}),Hm=lt.object({version:lt.literal(1),connections:lt.array(Km)}),li=()=>process.env.DB_STUDIO_CONFIG_DIR??ci(qm(),".dbstudio"),er=()=>ci(li(),"connections.json"),oi="\u2022\u2022\u2022\u2022",ui=/^(sqlite|duckdb):\/\/(.*)$/,jm=new Set(["authtoken","password","token"]),Wm=r=>{try{return decodeURIComponent(r.replaceAll("+"," ")).toLowerCase()}catch{return r.toLowerCase()}},Ge=r=>r.replace(/^([a-z][a-z0-9+.-]*:\/\/[^:/@?#]*:)[^/?#]*@/i,`$1${oi}@`).replace(/([?&])([^=&#]*)=[^&#]*/g,(e,t,n)=>jm.has(Wm(n))?`${t}${n}=${oi}`:e),mi=(r,e=process.cwd())=>{let t=r.trim(),n=t.match(ui);if(!n)return t;let[,a,s=""]=n;return s===":memory:"||s.startsWith("/")?t:`${a}://${Fm(e,s)}`},Vm=r=>{let e=r.match(ui);if(e)return Bm(e[2]??"")||r;try{let t=new URL(r),n=decodeURIComponent(t.pathname.replace(/^\/+|\/+$/g,""));return n?`${t.hostname}/${n}`:t.hostname}catch{return Ge(r)}},ii=r=>Ge(r),Aa=async()=>{let r;try{r=await km(er(),"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}let e=Hm.safeParse(JSON.parse(r));if(!e.success)throw new Error(`${er()} is not a valid connections file`);return e.data.connections},Ym=async r=>{let e=li();await Mm(e,{recursive:!0,mode:448}),await $m(e,448);let t=`${er()}.${process.pid}.tmp`;await Um(t,`${JSON.stringify({version:1,connections:r},null," ")}
6
- `,{mode:384}),await vm(t,er())},Da=Promise.resolve(),_a=r=>{let e=Da.then(async()=>{let[t,n]=r(await Aa());return await Ym(t),n});return Da=e.catch(()=>{}),e},Oa=()=>new d(404,{message:"Saved connection not found"}),tr=()=>Da.then(Aa,Aa),Ia=async r=>{let e=(await tr()).find(t=>t.id===r);if(!e)throw Oa();return e},di=r=>_a(e=>{let t=e.find(a=>ii(a.url)===ii(r)),n=t?{...t,url:r,lastUsedAt:Date.now()}:{id:Pm(),name:Vm(r),url:r,color:null,readOnly:!1,lastUsedAt:Date.now()};return[t?e.map(a=>a.id===n.id?n:a):[...e,n],n]}),pi=(r,{name:e,color:t,readOnly:n})=>_a(a=>{let s=a.find(i=>i.id===r);if(!s)throw Oa();let o={...s,name:e??s.name,color:t===void 0?s.color:t,readOnly:n??s.readOnly};return[a.map(i=>i.id===r?o:i),o]}),fi=r=>_a(e=>{if(!e.some(t=>t.id===r))throw Oa();return[e.filter(t=>t.id!==r),void 0]})});import{statSync as zm}from"fs";var La,Gm,yi,Pa=R(()=>{"use strict";y();La=r=>r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`,Gm=r=>{if(!r)return"in-memory";try{return La(zm(r).size)}catch{return"N/A"}},yi=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"?Gm(typeof n=="string"?n:""):"N/A",version:`SQLite ${t.rows[0]?.[0]}`}},close:()=>r.close()})});var bi,Qm,Jm,Xm,hi,gi,Ti,Ei=R(()=>{"use strict";y();Q();Pa();bi=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}},Qm=BigInt(Number.MIN_SAFE_INTEGER),Jm=BigInt(Number.MAX_SAFE_INTEGER),Xm=r=>typeof r!="bigint"?r:r>=Qm&&r<=Jm?Number(r):r.toString(),hi=r=>typeof r=="string"?{sql:r,params:[]}:{sql:r.sql,params:r.args.map(Xm)},gi=({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}),Ti=({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(hi)})).map(gi):[];return{execute:async o=>gi((await a("/raw",hi(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:La(i),version:"Cloudflare D1"}},close:()=>{}}}});var Zm,hn,Qe,He,je,Kt,ht,Rt=R(()=>{"use strict";y();Zm={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")},hn={},Qe=async r=>{let e=hn[r]??await Zm[r]();return hn[r]=e,e},He=r=>{let e=hn[r];if(!e)throw new Error(`The ${r} driver is used before a connection opened`);return e},je=r=>hn.pg!==void 0&&r instanceof hn.pg.DatabaseError,Kt=r=>je(r)&&r.code?.startsWith("23")===!0,ht=r=>je(r)&&r.code?.startsWith("22")===!0});var Xa={};Pt(Xa,{DatabaseManager:()=>jt,closeAllDbPools:()=>rd,closeConnection:()=>$a,coerceObjectId:()=>Tn,getClickhouseClient:()=>Fa,getConnectionUrl:()=>Ka,getDbPool:()=>Ua,getDbType:()=>At,getIsolatedRedisClient:()=>Qa,getMongoClient:()=>Va,getMongoDb:()=>za,getMongoDbName:()=>Ya,getMssqlPool:()=>Ba,getMysqlPool:()=>qa,getOpenConnection:()=>gn,getOraclePool:()=>Wa,getRedisClient:()=>Ga,getRedisDefaultDb:()=>Ja,getSqliteClient:()=>Ha,isValidObjectId:()=>bn,latestConnectionId:()=>ka,openConnection:()=>Ma,requestConnectionId:()=>va,withDuckdbConnection:()=>ja});import{resolve as ed}from"path";import{pathToFileURL as td}from"url";var Ht,jt,Nt,Wt,nd,wi,$a,Ma,gn,ka,va,Ce,Ua,qa,Ba,Fa,At,Ka,rd,Ha,ja,Wa,Va,Ya,za,Ga,Qa,Ja,bn,Tn,Je=R(()=>{"use strict";y();j();Ei();Rt();Q();Ye();Pa();ze();Ht=r=>{try{return decodeURIComponent(r.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return r}},jt=class{constructor(e=null,t=!1){this.readOnly=t;this.baseConfig=e?this.parseConfig(e):null;let n=this.baseConfig&&M[this.baseConfig.dbType];if(t&&n&&!n.readOnly)throw new Error(`${n.label} connections cannot be opened read-only`)}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;detectDbType(e){let t=e.protocol.replace(":",""),n=Ve(t);if(n)return n;let a=Object.values(M).map(({label:s,protocols:o})=>`${s} (${o.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}parseConfig(e){let t=Ve(e.split("://")[0]);if(t&&M[t].defaultPort===null)return{url:e,host:"localhost",port:0,user:"",password:"",dbType:t};let n,a;try{n=Go(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)||(M[s].defaultPort??0),user:Ht(a.username),password:Ht(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(M[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 Ti(bi(e));let t=e.startsWith("sqlite://")?e.slice(9):null,n=t===null?e:t===":memory:"?t:td(ed(t)).href,{createClient:a}=await Qe("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")),yi(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 Qe("duckdb"),a=await n.create(t,{checkpoint_threshold:"0b",...this.readOnly&&{access_mode:"READ_ONLY"}});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??=Qe("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 Qe("pg");if(!this.pgPools.has(t)){let a={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:1e4},s=new n({...a,onConnect:async o=>{this.readOnly&&await o.query("SET default_transaction_read_only = on"),await o.query(`SELECT set_config(
2
+ var Kl=Object.defineProperty;var C=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(n){throw t=[n],n}};var $t=(r,e)=>{for(var t in e)Kl(r,t,{get:e[t],enumerable:!0})};var y=C(()=>{"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.2.0"}}catch{}})()});var Us=C(()=>{"use strict";y()});var qs=C(()=>{"use strict";y()});var Bs=C(()=>{"use strict";y()});var Ks,Fs,ct,Hs=C(()=>{"use strict";y();Ks=globalThis.process?.env,Fs=Ks?.NODE_ENV,ct={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:Fs==="development",PROXY_URL:Ks?.DB_STUDIO_PROXY_URL??(Fs==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var js=C(()=>{"use strict";y()});var Ws,Pr=C(()=>{"use strict";y();Ws={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 Vs=C(()=>{"use strict";y()});var on=C(()=>{"use strict";y();Us();qs();Bs();Hs();js();Pr();Vs()});import{z as St}from"zod";var U,k,kt,yt,Gl,Ql,ie,we=C(()=>{"use strict";y();U=St.object({db:St.string("Database name is required")}),k=U.extend({schemaName:St.string().optional()}),kt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],yt=St.enum(kt,{message:"Invalid database type"}),Gl=U.extend({dbType:yt}),Ql=St.object({dbType:yt}),ie=St.object({tableName:St.string("Table name is required")})});import{z as Ve}from"zod";var Ke,Jl,Xl,Js=C(()=>{"use strict";y();we();Ke=Ve.object({columnName:Ve.string("Column name is required"),columnType:Ve.string("Column type is required"),defaultValue:Ve.string().optional(),isPrimaryKey:Ve.boolean().default(!1),isNullable:Ve.boolean().default(!1),isUnique:Ve.boolean().default(!1),isIdentity:Ve.boolean().default(!1),isArray:Ve.boolean().default(!1)}),Jl=ie,Xl=Ve.object({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName,columnName:Ke.shape.columnName,columnType:Ke.shape.columnType,defaultValue:Ke.shape.defaultValue,isPrimaryKey:Ke.shape.isPrimaryKey,isNullable:Ke.shape.isNullable,isUnique:Ke.shape.isUnique,isIdentity:Ke.shape.isIdentity,isArray:Ke.shape.isArray})});import{z as cn}from"zod";var kr,Xs=C(()=>{"use strict";y();kr=cn.object({tableName:cn.string("Table name is required"),data:cn.record(cn.string("Column name is required"),cn.any())})});import{z as Zl}from"zod";var Zs,vr,eo,Ur,qr=C(()=>{"use strict";y();Zs=["gemini","openai","anthropic","grok","openrouter"],vr=Zl.enum(Zs),eo=[{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"}]}],Ur=r=>eo.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as He}from"zod";var Br,Se,eu,tu,$n=C(()=>{"use strict";y();we();Br=k.extend({cascade:He.string().optional().transform(r=>r==="true")}),Se=He.object({tableName:He.string("Table name is required"),columnName:He.string("Column name is required")}),eu=He.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,cascade:He.boolean().optional()}),tu=He.object({message:He.string("Message is required"),tableName:He.string("Table name is required"),columnName:He.string("Column name is required"),deletedCount:He.number("Deleted count is required").default(0)})});import{z as ln}from"zod";var vt,nu,ru,to=C(()=>{"use strict";y();we();$n();vt=ln.object({columnType:ln.string("Column type is required"),isNullable:ln.boolean(),defaultValue:ln.string().nullable().optional()}),nu=Se,ru=ln.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,columnType:vt.shape.columnType,isNullable:vt.shape.isNullable,defaultValue:vt.shape.defaultValue})});var no=C(()=>{"use strict";y()});import{z as Ut}from"zod";var Fr,ro=C(()=>{"use strict";y();Fr=Ut.object({tableName:Ut.string().min(1,"Table name is required"),records:Ut.array(Ut.record(Ut.string(),Ut.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var au,su,Kr,ao=C(()=>{"use strict";y();qr();we();au=me.object({type:me.string(),content:me.string().optional()}).passthrough(),su=me.object({provider:vr.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(au).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:U.shape.db,includeSchema:me.boolean().optional().default(!0)})}),Kr=su.transform(r=>({...r,model:r.model??Ur(r.provider)}))});var so=C(()=>{"use strict";y()});import{z as Le}from"zod";var ou,oo,L,iu,io,cu,Hr=C(()=>{"use strict";y();ou=["text","boolean","number","enum","json","date","array"],oo=Le.enum(ou),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},iu=["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"],io=Le.enum(iu),cu=Le.object({columnName:Le.string(),dataType:oo,dataTypeLabel:io,isNullable:Le.boolean(),columnDefault:Le.string().nullable(),isPrimaryKey:Le.boolean(),isForeignKey:Le.boolean(),referencedTable:Le.string().nullable(),referencedSchema:Le.string().optional(),referencedColumn:Le.string().nullable(),enumValues:Le.array(Le.string()).nullable()})});function Mn(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 jr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?g.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?g.bigint:e==="smallint"||e==="int2"?g.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?g.numeric:e==="real"||e==="float4"?g.float:e==="double precision"||e==="float8"||e==="float"?g.double:e==="money"?g.money:e==="boolean"||e==="bool"?g.boolean:e==="text"?g.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?g.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?g.char:e==="json"?g.json:e==="jsonb"?g.jsonb:e==="xml"?g.xml:e==="uuid"?g.uuid:e==="date"?g.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?g.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?g.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?g.timestamptz:e==="interval"||e.startsWith("interval")?g.interval:e==="bytea"?g.bytea:e==="inet"?g.inet:e==="cidr"?g.cidr:e==="macaddr"?g.macaddr:e==="macaddr8"?g.macaddr8:e==="point"?g.point:e==="line"?g.line:e==="polygon"?g.polygon:e.startsWith("array")||e.includes("[]")?g.text:e.startsWith("user-defined")||e==="enum"?g.enum:g.text}function kn(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 Wr(r,e){if(!r)return g.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?g.boolean:t==="tinyint"?g.tinyint:t==="smallint"?g.smallint:t==="mediumint"?g.mediumint:t==="int"||t==="integer"?g.int:t==="bigint"?g.bigint:t==="decimal"||t==="numeric"?g.numeric:t==="float"||t==="real"?g.float:t==="double"?g.double:t==="bit"?g.bit:t==="boolean"||t==="bool"?g.boolean:t==="char"?g.char:t==="varchar"?g.varchar:t==="tinytext"?g.tinytext:t==="text"?g.text:t==="mediumtext"?g.mediumtext:t==="longtext"?g.longtext:t==="binary"?g.binary:t==="varbinary"?g.varbinary:t==="tinyblob"?g.tinyblob:t==="blob"?g.blob:t==="mediumblob"?g.mediumblob:t==="longblob"?g.longblob:t==="json"?g.json:t==="date"?g.date:t==="time"?g.time:t==="datetime"?g.datetime:t==="timestamp"?g.timestamp:t==="year"?g.year:t==="enum"?g.enum:t==="set"?g.set:g.text}function vn(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 Vr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="tinyint"?g.tinyint:e==="smallint"?g.smallint:e==="int"?g.int:e==="bigint"?g.bigint:e==="decimal"||e==="numeric"?g.numeric:e==="float"||e==="real"?g.float:e==="money"||e==="smallmoney"?g.money:e==="bit"?g.boolean:e==="char"?g.char:e==="varchar"?g.varchar:e==="text"?g.text:e==="nchar"?g.char:e==="nvarchar"?g.varchar:e==="ntext"?g.text:e==="binary"?g.binary:e==="varbinary"?g.varbinary:e==="image"?g.blob:e==="uniqueidentifier"?g.uuid:e==="date"?g.date:e==="time"?g.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?g.datetime:e==="datetimeoffset"?g.timestamptz:e==="json"?g.json:e==="xml"?g.xml:g.text}function Un(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 Yr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?g.int:e==="bigint"||e.startsWith("bigint(")?g.bigint:e==="smallint"||e.startsWith("smallint(")?g.smallint:e==="tinyint"||e.startsWith("tinyint(")?g.tinyint:e==="mediumint"||e.startsWith("mediumint(")?g.mediumint:e.includes("int")?g.int:e==="real"||e==="float"||e.startsWith("float(")?g.float:e==="double"||e==="double precision"||e.startsWith("double(")?g.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?g.numeric:e==="boolean"||e==="bool"?g.boolean:e==="text"||e==="clob"?g.text:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="char"||e.startsWith("char(")?g.char:e==="json"?g.json:e==="date"?g.date:e==="time"?g.time:e==="datetime"?g.datetime:e==="timestamp"?g.timestamp:e==="blob"?g.blob:g.text}function qn(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 zr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?g.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?g.json:e.startsWith("enum")?g.enum:e==="interval"?g.interval:e==="tinyint"||e==="utinyint"?g.tinyint:e==="smallint"||e==="usmallint"?g.smallint:e==="integer"||e==="int"?g.int:e.includes("int")||e==="bignum"?g.bigint:e.startsWith("decimal")||e.startsWith("numeric")?g.numeric:e==="float"||e==="real"?g.float:e==="double"?g.double:e==="boolean"||e==="bool"?g.boolean:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="uuid"?g.uuid:e==="date"?g.date:e==="timestamp with time zone"||e==="timestamptz"?g.timestamptz:e.startsWith("timestamp")||e==="datetime"?g.timestamp:e.startsWith("time")?g.time:e==="blob"||e==="bytea"?g.blob:e==="bit"||e==="bitstring"?g.bit:g.text}function Bn(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 Gr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return g.boolean;if(e==="json")return g.json;if(e==="xmltype")return g.xml;if(e==="integer")return g.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return g.smallint;if(n<=10)return g.int;if(n<=19)return g.bigint}return e.startsWith("number")?g.numeric:e==="binary_float"?g.float:e==="binary_double"||e.startsWith("float")?g.double:e.startsWith("varchar")||e.startsWith("nvarchar")?g.varchar:e.startsWith("char")||e.startsWith("nchar")?g.char:e.startsWith("timestamp")&&e.endsWith("time zone")?g.timestamptz:e==="date"||e.startsWith("timestamp")?g.timestamp:e.startsWith("interval")?g.interval:e==="blob"||e==="long raw"?g.blob:e.startsWith("raw")?g.varbinary:g.text}function qt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function Fn(r){let e=qt(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 Qr(r){let e=qt(r);return e.startsWith("Array(")?g.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?g.enum:e==="Bool"?g.boolean:/^U?Int8$/.test(e)?g.tinyint:/^U?Int16$/.test(e)?g.smallint:/^U?Int32$/.test(e)?g.int:/^U?Int(64|128|256)$/.test(e)?g.bigint:e==="Float32"||e==="BFloat16"?g.float:e==="Float64"?g.double:e.startsWith("Decimal")?g.numeric:e.startsWith("FixedString(")?g.char:e==="UUID"?g.uuid:e==="IPv4"||e==="IPv6"?g.inet:e==="Date"||e==="Date32"?g.date:e.startsWith("DateTime64")?g.timestamp:e.startsWith("DateTime")?g.datetime:e.startsWith("Time")?g.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?g.json:g.text}var g,co=C(()=>{"use strict";y();Hr();g={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 ye}from"zod";var lo,un,uo,lu,Jr,Xr,mo=C(()=>{"use strict";y();we();lo=["red","orange","amber","green","teal","blue","violet","pink"],un=ye.enum(lo),uo=ye.object({id:ye.string(),name:ye.string(),color:un.nullable(),readOnly:ye.boolean(),lastUsedAt:ye.number(),dbType:yt,maskedUrl:ye.string()}),lu=ye.object({connections:ye.array(uo),active:ye.object({id:ye.string().nullable(),dbType:yt,connectionId:ye.string()}).nullable()}),Jr=ye.object({url:ye.string().trim().min(1,"Paste a connection URL")}),Xr=ye.object({name:ye.string().trim().min(1,"Name is required").max(100).optional(),color:un.nullable().optional(),readOnly:ye.boolean().optional()})});import{z as de}from"zod";var po,Zr,fo,yo,ea,ho=C(()=>{"use strict";y();po=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Zr=de.enum(po),fo=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)}),yo=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")}),ea=de.object({tableName:de.string("Table name is required"),fields:de.array(fo).min(1,"At least one field is required"),foreignKeys:de.array(yo).optional()})});var M,Ye,go=C(()=>{"use strict";y();we();M={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},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,cellDefault:!0,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!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,cellDefault:!0,readOnly:!1,sqlInsert:{quote:"[",booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!0},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,cellDefault:!1,readOnly:!1,sqlInsert:null,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,cellDefault:!1,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!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,cellDefault:!1,readOnly:!1,sqlInsert:null,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!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,cellDefault:!0,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!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,cellDefault:!1,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!1},indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},Ye=r=>kt.find(e=>M[e].protocols.includes(r))});import{z as Re}from"zod";var bo,uu,mu,To=C(()=>{"use strict";y();we();bo=Re.object({name:Re.string("Name is required"),size:Re.string("Size is required"),owner:Re.string("Owner is required"),encoding:Re.string("Encoding is required")}),uu=Re.object({databases:Re.array(bo),dbType:yt}),mu=Re.object({version:Re.string("Version is required"),database:Re.string("Database is required"),user:Re.string("User is required"),host:Re.string("Host is required").nullable(),port:Re.number("Port is required").nullable(),active_connections:Re.coerce.number("Active connections is required"),max_connections:Re.coerce.number("Max connections is required")})});var Eo=C(()=>{"use strict";y()});import{z as Bt}from"zod";var Kn,wo=C(()=>{"use strict";y();Kn=Bt.object({tableName:Bt.string("Table name is required"),primaryKeys:Bt.array(Bt.object({columnName:Bt.string("Column name is required"),value:Bt.any()})).min(1,"At least one primary key is required")})});import{z as du}from"zod";var ta,So=C(()=>{"use strict";y();we();ta=k.extend({cascade:du.string().optional().transform(r=>r==="true")})});import{z as Ro}from"zod";var na,Co=C(()=>{"use strict";y();na=Ro.object({query:Ro.string("Query is required")})});import{z as pu}from"zod";var No,ra,Ao=C(()=>{"use strict";y();we();No=["csv","xlsx","json"],ra=k.extend({format:pu.enum(No,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var Do,fu,Hn,yu,jn,hu,_o=C(()=>{"use strict";y();we();Do=["primary","unique-constraint","index"],fu=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(Do),definition:ce.string().nullable()}),Hn=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),yu=Hn.extend({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName}),jn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),hu=jn.extend({db:U.shape.db,schemaName:k.shape.schemaName})});import{z as E}from"zod";var Wn,v,aa,sa,gu,oa,Ft,bu,Tu,Eu,wu,Su,Ru,Cu,Oo,Nu,ia,Au,Du,_u,Ou,Iu,xu,Lu,ca,Pu,$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,Vu,Yu,la,ua,zu,Io=C(()=>{"use strict";y();Wn=E.enum(["string","hash","list","set","zset","stream","unknown"]),v=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()}),aa=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:Wn.exclude(["unknown"]).optional()}),sa=E.object({key:v,type:Wn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),gu=E.object({keys:E.array(sa),nextCursor:E.string().nullable(),hasMore:E.boolean()}),oa=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")}),Ft=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),bu=E.object({kind:E.literal("string"),value:v,truncated:E.boolean()}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v}))}),Eu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:v}))}),wu=E.object({kind:E.literal("set"),members:E.array(v)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),Ru=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:v,value:v}))}))}),Cu=E.object({kind:E.literal("unknown")}),Oo=E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Ru,Cu]),Nu=sa.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Oo,nextCursor:E.string().nullable(),hasMore:E.boolean()}),ia=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()}),Au=E.object({chunk:v,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),Du=E.object({kind:E.literal("string"),value:v}),_u=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v})).min(1)}),Ou=E.object({kind:E.literal("list"),entries:E.array(v).min(1)}),Iu=E.object({kind:E.literal("set"),members:E.array(v).min(1)}),xu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.number()})).min(1)}),Lu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),ca=E.object({key:v,type:Wn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[Du,_u,Ou,Iu,xu,Lu]),ttlMs:E.number().int().positive().nullable().default(null)}),Pu=E.object({key:v,revision:E.string().nullable(),deleted:E.boolean()}),$u=E.object({action:E.literal("rename"),newKey:v}),Mu=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),ku=E.object({action:E.literal("setString"),value:v}),vu=E.object({action:E.literal("upsertHash"),field:v,value:v}),Uu=E.object({action:E.literal("deleteHash"),field:v}),qu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:v}),Bu=E.object({action:E.literal("setList"),index:E.number().int(),value:v}),Fu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Ku=E.object({action:E.literal("addSet"),member:v}),Hu=E.object({action:E.literal("removeSet"),member:v}),ju=E.object({action:E.literal("upsertZset"),member:v,score:E.number()}),Wu=E.object({action:E.literal("removeZset"),member:v}),Vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),Yu=E.object({action:E.literal("deleteStream"),id:E.string()}),la=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,Vu,Yu])}),ua=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),zu=E.object({deleted:E.boolean()})});var xo=C(()=>{"use strict";y()});import{z as ma}from"zod";var Vn,Gu,Qu,Lo=C(()=>{"use strict";y();we();$n();Vn=ma.object({newColumnName:ma.string("New column name is required")}),Gu=Se,Qu=ma.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,newColumnName:Vn.shape.newColumnName})});import{z as Yn}from"zod";var mn,Ju,Xu,Po=C(()=>{"use strict";y();we();mn=Yn.object({newTableName:Yn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Yn.string().trim().min(1).optional()}),Ju=ie,Xu=Yn.object({db:U.shape.db,tableName:ie.shape.tableName,newTableName:mn.shape.newTableName,schemaName:mn.shape.schemaName})});import{z as ve}from"zod";var $o,Mo,Zu,ko=C(()=>{"use strict";y();$o=["fatal","error","warning","info","debug"],Mo=ve.enum($o),Zu=ve.object({ts:ve.string(),level:Mo,rawLevel:ve.string(),source:ve.string().optional(),code:ve.string().optional(),message:ve.string(),durationMs:ve.number().optional(),statement:ve.string().optional(),detail:ve.record(ve.string(),ve.string())})});import{z as q}from"zod";var vo,dn,Uo,qo,em,da,Bo=C(()=>{"use strict";y();we();vo=q.object({columnName:q.string(),operator:q.string(),value:q.string()}),dn=["asc","desc"],Uo=q.object({columnName:q.string(),direction:q.enum(dn)}),qo=q.object({limit:q.number(),total:q.number(),totalEstimated:q.boolean().optional(),hasNextPage:q.boolean(),hasPreviousPage:q.boolean(),nextCursor:q.string().nullable(),prevCursor:q.string().nullable()}),em=q.object({data:q.array(q.record(q.string(),q.unknown())),meta:qo}),da=q.object({db:U.shape.db,schemaName:k.shape.schemaName,cursor:q.string().optional(),limit:q.string().optional().default("50").transform(Number),direction:q.enum(dn).optional().default(dn[0]),sort:q.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(q.union([q.string(),q.array(Uo)])),order:q.enum(dn).optional(),filters:q.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(q.array(vo))})});import{z as pn}from"zod";var tm,Fo=C(()=>{"use strict";y();tm=pn.object({tableName:pn.string("Table name is required"),schemaName:pn.string().optional(),rowCount:pn.coerce.number("Row count is required"),rowCountEstimated:pn.boolean().optional()})});import{z as Ko}from"zod";var nm,Ho=C(()=>{"use strict";y();nm=Ko.object({schema:Ko.string()})});import{z as Pe}from"zod";var pa,jo=C(()=>{"use strict";y();pa=Pe.object({tableName:Pe.string("Table name is required"),primaryKey:Pe.string("Primary key is required").default("id"),primaryKeys:Pe.array(Pe.string().min(1)).min(1).optional(),updates:Pe.array(Pe.object({rowData:Pe.record(Pe.string("Column name is required"),Pe.any()),columnName:Pe.string("Column name is required"),value:Pe.any(),useDefault:Pe.boolean().optional()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Wo={};$t(Wo,{AI_PROVIDERS:()=>Zs,AI_PROVIDER_OPTIONS:()=>eo,CONNECTION_COLORS:()=>lo,DATABASE_ENGINES:()=>M,DATABASE_TYPES:()=>kt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>po,FORMAT_TYPES:()=>No,INDEX_KINDS:()=>Do,SERVER_LOG_LEVELS:()=>$o,StandardizedDataType:()=>g,addColumnParamSchema:()=>Jl,addColumnParamsSchema:()=>Xl,addColumnSchema:()=>Ke,addRecordSchema:()=>kr,aiProviderSchema:()=>vr,alterColumnParamSchema:()=>nu,alterColumnParamsSchema:()=>ru,alterColumnSchema:()=>vt,bulkInsertRecordsSchema:()=>Fr,chatSchema:()=>Kr,columnInfoSchema:()=>cu,connectUrlSchema:()=>Jr,connectionColorSchema:()=>un,connectionInfoSchema:()=>mu,connectionSummarySchema:()=>uo,connectionsStateSchema:()=>lu,createIndexParamsSchema:()=>yu,createIndexSchema:()=>Hn,createKeySchema:()=>ca,createTableSchema:()=>ea,currentDatabaseSchema:()=>Gl,dataTypesSchema:()=>oo,databaseInfoSchema:()=>bo,databaseListSchema:()=>uu,databaseSchema:()=>U,databaseTypeParamSchema:()=>Ql,databaseTypeSchema:()=>yt,dbTypeFromProtocol:()=>Ye,deleteColumnParamSchema:()=>Se,deleteColumnParamsSchema:()=>eu,deleteColumnQuerySchema:()=>Br,deleteColumnSuccessResponseSchema:()=>tu,deleteKeyQuerySchema:()=>ua,deleteKeyResultSchema:()=>zu,deleteRecordSchema:()=>Kn,deleteTableQuerySchema:()=>ta,dropIndexParamSchema:()=>jn,dropIndexParamsSchema:()=>hu,encodedRedisValueSchema:()=>v,executeQuerySchema:()=>na,exportTableSchema:()=>ra,fieldDataSchema:()=>fo,filterSchema:()=>vo,foreignKeyActionSchema:()=>Zr,foreignKeyDataSchema:()=>yo,getDefaultAiModel:()=>Ur,indexInfoSchema:()=>fu,keyActionSchema:()=>la,keyDetailsQuerySchema:()=>oa,keyDetailsResultSchema:()=>Nu,keyParamSchema:()=>Ft,keyRawQuerySchema:()=>ia,keyRawResultSchema:()=>Au,keyScanQuerySchema:()=>aa,keyScanResultSchema:()=>gu,keyWriteResultSchema:()=>Pu,mapClickhouseToDataType:()=>Fn,mapDuckdbToDataType:()=>qn,mapMssqlToDataType:()=>vn,mapMysqlToDataType:()=>kn,mapOracleToDataType:()=>Bn,mapPostgresToDataType:()=>Mn,mapSqliteToDataType:()=>Un,redisKeySummarySchema:()=>sa,redisKeyTypeSchema:()=>Wn,redisKeyValueSchema:()=>Oo,renameColumnParamSchema:()=>Gu,renameColumnParamsSchema:()=>Qu,renameColumnSchema:()=>Vn,renameTableParamSchema:()=>Ju,renameTableParamsSchema:()=>Xu,renameTableSchema:()=>mn,serverLogEntrySchema:()=>Zu,serverLogLevelSchema:()=>Mo,sortDirections:()=>dn,sortSchema:()=>Uo,standardizeClickhouseDataTypeLabel:()=>Qr,standardizeDataTypeLabel:()=>jr,standardizeDuckdbDataTypeLabel:()=>zr,standardizeMssqlDataTypeLabel:()=>Vr,standardizeMysqlDataTypeLabel:()=>Wr,standardizeOracleDataTypeLabel:()=>Gr,standardizeSqliteDataTypeLabel:()=>Yr,standardizedDataTypeSchema:()=>io,tableDataMetaSchema:()=>qo,tableDataQuerySchema:()=>da,tableDataResultSchema:()=>em,tableInfoSchema:()=>tm,tableNameSchema:()=>ie,tableQuerySchema:()=>k,tableSchemaResultSchema:()=>nm,unwrapClickhouseType:()=>qt,updateConnectionSchema:()=>Xr,updateRecordsSchema:()=>pa});var j=C(()=>{"use strict";y();Js();Xs();qr();to();no();ro();ao();so();co();Hr();mo();ho();we();go();To();Eo();$n();wo();So();Co();Ao();_o();Io();xo();Lo();Po();ko();Bo();Fo();Ho();jo()});var rm,am,sm,zn,fa=C(()=>{"use strict";y();j();rm=Object.values(M).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),am=new RegExp(`\\b(?:${rm}):\\/\\/\\S+`,"gi"),sm=/\b(authToken=)[^&\s]+/gi,zn=r=>r.replace(am,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(sm,"$1[redacted]")});var d,Q=C(()=>{"use strict";y();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}status}});import{AsyncLocalStorage as cm}from"async_hooks";import{randomUUID as Yo}from"crypto";var lm,um,Gn,zo,Go,lt,ya,mm,dm,pm,Qo,ha,he,Z,ze=C(()=>{"use strict";y();Q();lm=Yo(),um=/^[A-Za-z0-9_-]{8,64}$/,Gn=new cm,zo=r=>r&&um.test(r)?r:Yo(),Go=(r,e)=>Gn.run(r,e),lt=()=>Gn.getStore()?.requestId,ya=()=>Gn.getStore()?.connectionId,mm=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"},dm=/^[A-Z0-9_-]{2,32}$/,pm=[[/^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"]],Qo=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"&&dm.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]:pm.find(([s])=>s.test(r.message))?.[1]??Qo(a)},ha=r=>r instanceof d&&r.cause?r.cause:r,he=r=>{let e=ha(r);return{error_type:mm(e),error_code:Qo(e)}},Z=(r,e,t={})=>{let n=Gn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:lm,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
3
+ `)}});function Oe(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||fm(e)}}catch(e){return Z("error","database_url_unparseable",he(e)),{host:"localhost",port:5432}}}var Qn,fm,Jo,Ge=C(()=>{"use strict";y();j();ze();Qn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},fm=r=>{let e=r.protocol.replace(":",""),t=Ye(e);return Qn[e]?.defaultPort??(t&&M[t].defaultPort)??5432},Jo=r=>{let e=new URL(r),t=Qn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Rt,ga=C(()=>{Rt={name:"db-studio",type:"module",version:"2.2.0",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:"bun check",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.8.1","@clickhouse/client":"^1.24.1","@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.9",elysia:"^1.4.30",ioredis:"^6.0.0",mongodb:"^7.8.0",mssql:"^12.7.13",mysql2:"^3.24.6",open:"^11.0.4",oracledb:"^26.0.0",pg:"^8.23.1",picocolors:"^1.1.1","posthog-node":"^5.61.1",xlsx:"^0.18.5",zod:"^4.6.7"},devDependencies:{"@biomejs/biome":"^2.6.4","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.6.6","@types/oracledb":"^26.0.1","@types/pg":"^8.23.1","@vitest/coverage-v8":"^5.0.5","playwright-core":"1.64.1",tsup:"^9.0.0",tsx:"^4.23.15",typescript:"^7.0.2",vitest:"^5.0.5"}}});var oi={};$t(oi,{captureInstallationActive:()=>Sa,captureServerError:()=>Ra,captureServerEvent:()=>er,databaseTypeForRequest:()=>hn,durationBucket:()=>Ea,flushServerObservability:()=>Lm,getTelemetryConfig:()=>Xn,initServerObservability:()=>si,operationForRequest:()=>yn,outcomeForStatus:()=>wa,resetTelemetryId:()=>Ta,setTelemetryEnabled:()=>Zn,startServerSpan:()=>Ca});import{randomUUID as ni}from"crypto";import{existsSync as Em,mkdirSync as wm,readFileSync as Sm,writeFileSync as Rm}from"fs";import{homedir as ba,platform as Cm}from"os";import Ht from"path";import{pathToFileURL as Nm}from"url";import*as $e from"@sentry/node";import{PostHog as Am}from"posthog-node";var Dm,ri,Jn,_m,Om,ht,Ct,Im,xm,Nt,fn,Xn,Zn,Ta,Ea,wa,ai,yn,hn,si,Lm,er,Sa,Pm,Ra,Ca,gn=C(()=>{"use strict";y();j();ze();ga();Dm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",ri=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Ht.join(ba(),".local","state"));return Ht.join(r||Ht.join(ba(),".db-studio"),"db-studio","telemetry.json")},Jn=r=>{try{let e=ri();wm(Ht.dirname(e),{recursive:!0}),Rm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},_m=()=>({installationId:ni(),enabled:!0}),Om=()=>{let r=ri();try{if(Em(r)){let t=JSON.parse(Sm(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=_m();return Jn(e),e},Im="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",xm="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",Nt=()=>ht??=Om(),fn=()=>!Dm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&Nt().enabled,Xn=()=>({enabled:fn(),installationId:Nt().installationId,appVersion:Rt.version}),Zn=r=>{ht={...Nt(),enabled:r},Jn(ht),r?(Ct?.enable(),si()):(Ct?.disable(),$e.close(500))},Ta=()=>(ht={...Nt(),installationId:ni(),lastActiveAt:void 0},Jn(ht),ht.installationId),Ea=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",wa=r=>r>=500?"server_error":r>=400?"client_error":"success",ai=new RegExp(`^/api/(${kt.join("|")})(?=/|$)`),yn=(r,e)=>{let t=e.replace(ai,"/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}`},hn=r=>r.match(ai)?.[1],si=()=>{if(!fn())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Im;r&&(!$e.isInitialized()||$e.getClient()?.getOptions().enabled===!1)&&$e.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${Rt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:Nt().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??xm;e&&!Ct&&(Ct=new Am(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Lm=()=>Promise.allSettled([Ct?.shutdown(2e3),$e.close(2e3)]),er=r=>{!fn()||!Ct||Ct.capture({distinctId:Nt().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:Rt.version,$geoip_disable:!1}})},Sa=()=>{if(!fn())return;let r=Nt(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(ht={...r,lastActiveAt:new Date().toISOString()},Jn(ht),er({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:Cm()}}))},Pm=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=ba(),s=a.replaceAll("\\","/"),o=a?[a,s,Nm(a,{windows:Ht.win32.isAbsolute(a)&&!Ht.posix.isAbsolute(a)}).pathname.replace(/^\/(?=[a-z]:\/)/i,"")].sort((c,l)=>l.length-c.length):[],i=r.stack.split(`
4
+ `).slice(1).filter(c=>/^\s*at\s/.test(c)).map(c=>o.reduce((l,u)=>l.replaceAll(u,"~"),c));n.stack=[`${e}: ${t}`,...i].join(`
5
+ `)}return n},Ra=(r,{operation:e,status:t,dbType:n})=>{if(!fn()||t<500)return;let{error_type:a,error_code:s}=he(r),o=lt(),i=`${e} failed with ${t}${s?` ${s}`:""}`;$e.captureException(Pm(ha(r),a,i),{tags:{operation:e,source:"server",release:Rt.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"]})},Ca=(r,e,t)=>$e.startSpan({name:r,op:"http.server",attributes:{"db_studio.operation":r,...e?{"db_studio.db_type":e}:{}}},t)});var ii={};$t(ii,{checkDatabaseConnection:()=>Aa,getDatabaseConnectionDetails:()=>Mm});var $m,Na,Mm,Aa,Da=C(()=>{"use strict";y();j();Ge();$m=2e3,Na=async r=>{let e;try{return await Promise.race([r,new Promise((t,n)=>{e=setTimeout(()=>n(new Error("Database startup check timed out")),$m)})])}finally{e&&clearTimeout(e)}},Mm=r=>{let e=Ye(r.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{label:t,defaultPort:n}=M[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}=Oe(r);return{type:e,name:t,destination:`${a}:${s}`}},Aa=async r=>{switch(r.getDbType()){case"pg":await Na(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 Na(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 Na(r.getClickhouseClient().then(e=>e.query({query:"SELECT 1"})))}}});import{randomUUID as km}from"crypto";import{chmod as vm,mkdir as Um,readFile as qm,rename as Bm,writeFile as Fm}from"fs/promises";import{homedir as Km}from"os";import{basename as Hm,join as ui,resolve as jm}from"path";import{z as ut}from"zod";var Wm,Vm,mi,tr,ci,di,Ym,zm,Qe,pi,Gm,li,_a,Qm,Oa,Ia,xa,nr,La,fi,yi,hi,Pa=C(()=>{"use strict";y();j();Q();Wm=ut.object({id:ut.string(),name:ut.string(),url:ut.string(),color:un.nullable(),readOnly:ut.boolean().default(!1),lastUsedAt:ut.number()}),Vm=ut.object({version:ut.literal(1),connections:ut.array(Wm)}),mi=()=>process.env.DB_STUDIO_CONFIG_DIR??ui(Km(),".dbstudio"),tr=()=>ui(mi(),"connections.json"),ci="\u2022\u2022\u2022\u2022",di=/^(sqlite|duckdb):\/\/(.*)$/,Ym=new Set(["authtoken","password","token"]),zm=r=>{try{return decodeURIComponent(r.replaceAll("+"," ")).toLowerCase()}catch{return r.toLowerCase()}},Qe=r=>r.replace(/^([a-z][a-z0-9+.-]*:\/\/[^:/@?#]*:)[^/?#]*@/i,`$1${ci}@`).replace(/([?&])([^=&#]*)=[^&#]*/g,(e,t,n)=>Ym.has(zm(n))?`${t}${n}=${ci}`:e),pi=(r,e=process.cwd())=>{let t=r.trim(),n=t.match(di);if(!n)return t;let[,a,s=""]=n;return s===":memory:"||s.startsWith("/")?t:`${a}://${jm(e,s)}`},Gm=r=>{let e=r.match(di);if(e)return Hm(e[2]??"")||r;try{let t=new URL(r),n=decodeURIComponent(t.pathname.replace(/^\/+|\/+$/g,""));return n?`${t.hostname}/${n}`:t.hostname}catch{return Qe(r)}},li=r=>Qe(r),_a=async()=>{let r;try{r=await qm(tr(),"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}let e=Vm.safeParse(JSON.parse(r));if(!e.success)throw new Error(`${tr()} is not a valid connections file`);return e.data.connections},Qm=async r=>{let e=mi();await Um(e,{recursive:!0,mode:448}),await vm(e,448);let t=`${tr()}.${process.pid}.tmp`;await Fm(t,`${JSON.stringify({version:1,connections:r},null," ")}
6
+ `,{mode:384}),await Bm(t,tr())},Oa=Promise.resolve(),Ia=r=>{let e=Oa.then(async()=>{let[t,n]=r(await _a());return await Qm(t),n});return Oa=e.catch(()=>{}),e},xa=()=>new d(404,{message:"Saved connection not found"}),nr=()=>Oa.then(_a,_a),La=async r=>{let e=(await nr()).find(t=>t.id===r);if(!e)throw xa();return e},fi=r=>Ia(e=>{let t=e.find(a=>li(a.url)===li(r)),n=t?{...t,url:r,lastUsedAt:Date.now()}:{id:km(),name:Gm(r),url:r,color:null,readOnly:!1,lastUsedAt:Date.now()};return[t?e.map(a=>a.id===n.id?n:a):[...e,n],n]}),yi=(r,{name:e,color:t,readOnly:n})=>Ia(a=>{let s=a.find(i=>i.id===r);if(!s)throw xa();let o={...s,name:e??s.name,color:t===void 0?s.color:t,readOnly:n??s.readOnly};return[a.map(i=>i.id===r?o:i),o]}),hi=r=>Ia(e=>{if(!e.some(t=>t.id===r))throw xa();return[e.filter(t=>t.id!==r),void 0]})});import{statSync as Jm}from"fs";var $a,Xm,gi,Ma=C(()=>{"use strict";y();$a=r=>r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`,Xm=r=>{if(!r)return"in-memory";try{return $a(Jm(r).size)}catch{return"N/A"}},gi=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"?Xm(typeof n=="string"?n:""):"N/A",version:`SQLite ${t.rows[0]?.[0]}`}},close:()=>r.close()})});var Ei,Zm,ed,td,bi,Ti,wi,Si=C(()=>{"use strict";y();Q();Ma();Ei=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}},Zm=BigInt(Number.MIN_SAFE_INTEGER),ed=BigInt(Number.MAX_SAFE_INTEGER),td=r=>typeof r!="bigint"?r:r>=Zm&&r<=ed?Number(r):r.toString(),bi=r=>typeof r=="string"?{sql:r,params:[]}:{sql:r.sql,params:r.args.map(td)},Ti=({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}),wi=({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(bi)})).map(Ti):[];return{execute:async o=>Ti((await a("/raw",bi(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:$a(i),version:"Cloudflare D1"}},close:()=>{}}}});var nd,bn,Je,We,Ue,jt,gt,rr,pe,bt=C(()=>{"use strict";y();nd={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")},bn={},Je=async r=>{let e=bn[r]??await nd[r]();return bn[r]=e,e},We=r=>{let e=bn[r];if(!e)throw new Error(`The ${r} driver is used before a connection opened`);return e},Ue=r=>bn.pg!==void 0&&r instanceof bn.pg.DatabaseError,jt=r=>Ue(r)&&r.code?.startsWith("23")===!0,gt=r=>Ue(r)&&r.code?.startsWith("22")===!0,rr="This database session is read-only. Disable read-only in Connections if enabled, or connect to a writable database.",pe=r=>Ue(r)&&r.code==="25006"||r instanceof Error&&(r.errno===1792||r.message.includes("attached in read-only mode"))});var es={};$t(es,{DatabaseManager:()=>Vt,closeAllDbPools:()=>od,closeConnection:()=>ka,coerceObjectId:()=>wn,getClickhouseClient:()=>Ha,getConnectionUrl:()=>ja,getDbPool:()=>Ba,getDbType:()=>Dt,getIsolatedRedisClient:()=>Xa,getMongoClient:()=>za,getMongoDb:()=>Qa,getMongoDbName:()=>Ga,getMssqlPool:()=>Ka,getMysqlPool:()=>Fa,getOpenConnection:()=>Tn,getOraclePool:()=>Ya,getRedisClient:()=>Ja,getRedisDefaultDb:()=>Za,getSqliteClient:()=>Wa,isValidObjectId:()=>En,latestConnectionId:()=>Ua,openConnection:()=>va,requestConnectionId:()=>qa,withDuckdbConnection:()=>Va});import{resolve as rd}from"path";import{pathToFileURL as ad}from"url";var Wt,Vt,At,Yt,sd,Ri,ka,va,Tn,Ua,qa,Ce,Ba,Fa,Ka,Ha,Dt,ja,od,Wa,Va,Ya,za,Ga,Qa,Ja,Xa,Za,En,wn,Xe=C(()=>{"use strict";y();j();Si();bt();Q();ze();Ma();Ge();Wt=r=>{try{return decodeURIComponent(r.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return r}},Vt=class{constructor(e=null,t=!1){this.readOnly=t;this.baseConfig=e?this.parseConfig(e):null;let n=this.baseConfig&&M[this.baseConfig.dbType];if(t&&n&&!n.readOnly)throw new Error(`${n.label} connections cannot be opened read-only`)}readOnly;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;detectDbType(e){let t=e.protocol.replace(":",""),n=Ye(t);if(n)return n;let a=Object.values(M).map(({label:s,protocols:o})=>`${s} (${o.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}parseConfig(e){let t=Ye(e.split("://")[0]);if(t&&M[t].defaultPort===null)return{url:e,host:"localhost",port:0,user:"",password:"",dbType:t};let n,a;try{n=Jo(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)||(M[s].defaultPort??0),user:Wt(a.username),password:Wt(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(M[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 wi(Ei(e));let t=e.startsWith("sqlite://")?e.slice(9):null,n=t===null?e:t===":memory:"?t:ad(rd(t)).href,{createClient:a}=await Je("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")),gi(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 Je("duckdb"),a=await n.create(t,{checkpoint_threshold:"0b",...this.readOnly&&{access_mode:"READ_ONLY"}});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??=Je("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 Je("pg");if(!this.pgPools.has(t)){let a={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:1e4},s=new n({...a,onConnect:async o=>{this.readOnly&&await o.query("SET default_transaction_read_only = on"),await o.query(`SELECT set_config(
7
7
  'search_path',
8
8
  COALESCE(
9
9
  'public, ' || string_agg(quote_ident(nspname), ', ' ORDER BY nspname),
@@ -14,7 +14,7 @@ var Bl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var Pt=(r,e)=>{f
14
14
  FROM pg_namespace
15
15
  WHERE nspname NOT IN ('pg_catalog', 'information_schema', 'public', 'crdb_internal', 'pg_extension')
16
16
  AND nspname NOT LIKE 'pg_toast%'
17
- AND nspname NOT LIKE 'pg_temp%';`).then(()=>{},i=>{Z("warn","db_search_path_widen_failed",{db_type:"pg",...ye(i)})})}});s.on("error",o=>{Z("error","db_pool_error",{db_type:"pg",...ye(o)})}),this.pgPools.set(t,s)}return this.pgPools.get(t)}async getMysqlPool(e){let t=this.config(),n=this.buildConnectionString(e),{createPool:a}=await Qe("mysql");if(!this.mysqlPools.has(n)){let s=new URL(n),o=Ht(s.pathname.slice(1)),i=a({host:t.host,port:t.port,user:t.user,password:t.password,database:o||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.readOnly&&i.pool.on("connection",c=>c.query("SET SESSION TRANSACTION READ ONLY",l=>{l&&c.destroy()})),this.mysqlPools.set(n,i)}return this.mysqlPools.get(n)}async getMssqlPool(e){let t=this.config(),n=this.buildConnectionString(e),a=await Qe("mssql");if(!this.mssqlPools.has(n)){let s=new URL(n),o=Ht(s.pathname.slice(1)),i={server:t.host,port:t.port,user:t.user,password:t.password,database:o||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},c=await new a.ConnectionPool(i).connect();c.on("error",l=>{Z("error","db_pool_error",{db_type:"mssql",...ye(l)})}),this.mssqlPools.set(n,c)}return this.mssqlPools.get(n)}async getClickhouseClient(e){let t=this.config(),n=new URL(this.buildConnectionString(e)),a=Ht(n.pathname.slice(1))||"default",{ClickHouseLogLevel:s,createClient:o}=await Qe("clickhouse"),i=this.clickhouseClients.get(a);if(i)return i;let c=n.protocol==="clickhouses:",l=o({url:`${c?"https":"http"}://${n.hostname}:${n.port||(c?8443:8123)}`,username:t.user||"default",password:t.password,database:a,request_timeout:3e4,clickhouse_settings:{output_format_json_quote_64bit_integers:1,output_format_json_quote_decimals:1,wait_end_of_query:1,...this.readOnly&&{readonly:"2"}},log:{level:s.OFF}});return this.clickhouseClients.set(a,l),l}async getMongoClient(){if(!this.mongoClient){let{url:e}=this.config(),{MongoClient:t}=await Qe("mongodb"),n=new t(e);try{await n.connect(),this.mongoClient=n}catch(a){try{await n.close()}catch{}throw a}}return this.mongoClient}getMongoDbName(){return Ht(new URL(this.config().url).pathname.replace(/^\/+|\/+$/g,""))||"admin"}async getMongoDb(e){return(await this.getMongoClient()).db(e??this.getMongoDbName())}async getRedisClient(e){let t=this.config();if(t.dbType!=="redis")throw new Error("The connection is not a redis:// connection");let n=e??this.getRedisDefaultDb(),a=this.redisClients.get(n);if(a)return a;let s=new URL(t.url),o={host:t.host,port:t.port,db:n,lazyConnect:!0,maxRetriesPerRequest:1,enableReadyCheck:!0,connectTimeout:2e3};t.user&&(o.username=t.user),t.password&&(o.password=t.password),s.protocol==="rediss:"&&(o.tls={});let{Redis:i}=await Qe("redis"),c=new i(o);try{if(await c.connect(),!this.redisClusterChecked){let l=await c.info("server");if(/^redis_mode:(cluster|sentinel)\b/m.test(l))throw await c.quit().catch(()=>{}),new Error("Redis cluster and Sentinel modes are not supported. Use a standalone redis:// connection.");let u=l.match(/^redis_version:([^\r\n]+)/m)?.[1],[m=0,p=0]=u?.split(".").map(Number)??[];if(m<6||m===6&&p<2)throw await c.quit().catch(()=>{}),new Error(`Redis 6.2 or newer is required. Connected server reports ${u??"an unknown version"}.`);this.redisClusterChecked=!0}}catch(l){throw await c.quit().catch(()=>{}),l}return this.redisClients.set(n,c),c}async getIsolatedRedisClient(e){let t=(await this.getRedisClient(e)).duplicate();return await t.connect(),t}getRedisDefaultDb(){if(!this.baseConfig)return 0;try{let t=new URL(this.baseConfig.url).pathname.replace(/^\//,"");if(!t)return 0;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:0}catch{return 0}}async closeAll(){let e=Array.from(this.pgPools.values()).map(async s=>{await s.end(),Z("info","db_pool_closed",{db_type:"pg"})}),t=Array.from(this.mysqlPools.values()).map(async s=>{await s.end(),Z("info","db_pool_closed",{db_type:"mysql"})}),n=Array.from(this.mssqlPools.values()).map(async s=>{await s.close(),Z("info","db_pool_closed",{db_type:"mssql"})});await Promise.all([...e,...t,...n]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null),await this.closeSqliteClient(),await this.closeDuckdb(),await this.closeOraclePool();let a=Array.from(this.redisClients.values()).map(async s=>{await s.quit().catch(()=>{}),Z("info","db_pool_closed",{db_type:"redis"})});await Promise.all(a),this.redisClients.clear(),this.redisClusterChecked=!1,await Promise.all(Array.from(this.clickhouseClients.values()).map(s=>s.close())),this.clickhouseClients.clear()}},Nt=new Map,Wt=null,nd=new jt,wi=new Set,$a=async r=>{let e=Nt.get(r);Nt.delete(r),wi.add(r),Wt===r&&(Wt=null),await e?.closeAll()},Ma=(r,e)=>{Nt.set(r,e),Wt=r},gn=r=>Nt.get(r),ka=()=>Wt,va=()=>{let r=pa();return r&&wi.has(r)?null:r&&Nt.has(r)?r:Wt},Ce=()=>Nt.get(pa()??Wt??"")??nd,Ua=r=>Ce().getPgPool(r),qa=r=>Ce().getMysqlPool(r),Ba=async r=>Ce().getMssqlPool(r),Fa=r=>Ce().getClickhouseClient(r),At=()=>Ce().getDbType(),Ka=()=>Ce().getConnectionUrl(),rd=async()=>{await Promise.all([...Nt.values()].map(r=>r.closeAll()))},Ha=()=>Ce().getSqliteClient(),ja=r=>Ce().withDuckdbConnection(r),Wa=()=>Ce().getOraclePool(),Va=()=>Ce().getMongoClient(),Ya=()=>Ce().getMongoDbName(),za=r=>Ce().getMongoDb(r),Ga=r=>Ce().getRedisClient(r),Qa=r=>Ce().getIsolatedRedisClient(r),Ja=()=>Ce().getRedisDefaultDb(),bn=r=>typeof r=="string"&&He("mongodb").ObjectId.isValid(r),Tn=r=>{let{ObjectId:e}=He("mongodb");return typeof r=="string"&&e.isValid(r)?new e(r):r}});var _i={};Pt(_i,{connect:()=>nr,connectSaved:()=>Za,getConnectionsState:()=>wn,updateConnection:()=>es});import{randomUUID as ad}from"crypto";import{access as sd}from"fs/promises";var Si,Ni,En,Ai,Ci,od,nr,Za,Di,wn,Ri,es,ts=R(()=>{"use strict";y();j();Na();da();xa();Je();Q();Ye();Si=Promise.resolve(),Ni=r=>{let e=Si.then(r);return Si=e.catch(()=>{}),e},En=new Map,Ai=/^(?:sqlite|duckdb):\/\/(.+)$/,Ci=r=>Vn(r instanceof Error?r.message:String(r)),od=async(r,e)=>{let t=[...En].find(([,s])=>s.url===r&&s.readOnly===e)?.[0];if(t)return t;let n;try{n=new jt(r,e)}catch(s){throw new d(400,{message:Ci(s),cause:s})}try{await Ra(n)}catch(s){throw await n.closeAll().catch(()=>{}),new d(400,{message:`Could not connect: ${Ci(s)}`,cause:s})}let a=ad();return Ma(a,n),En.set(a,{url:r,readOnly:e}),a},nr=(r,{requireExistingFile:e=!1}={})=>{let t=mi(r);return Ni(async()=>{let n=t.match(Ai)?.[1];e&&n&&n!==":memory:"&&await sd(n).catch(()=>{throw new d(400,{message:`No database file at ${n}`})});let a=(await tr()).some(o=>o.readOnly&&Ge(o.url)===Ge(t)),s=await od(t,a);return await di(t).catch(o=>{Z("warn","connection_save_failed",ye(o))}),s})},Za=async r=>{let e=await Ia(r);return nr(e.url,{requireExistingFile:!0})},Di=r=>{let e=Ve(r.url.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{id:t,name:n,color:a,readOnly:s,lastUsedAt:o}=r;return{id:t,name:n,color:a,readOnly:s,lastUsedAt:o,dbType:e,maskedUrl:Ge(r.url)}},wn=async(r=va())=>{let e=await tr(),t=e.map(Di).filter(s=>s!==null).sort((s,o)=>o.lastUsedAt-s.lastUsedAt),n=r&&En.get(r)?.url,a=r&&gn(r);return!r||!n||!a?{connections:t,active:null}:{connections:t,active:{id:e.find(s=>Ge(s.url)===Ge(n))?.id??null,dbType:a.getDbType(),connectionId:r}}},Ri=r=>{let e=Di(r);if(!e)throw new d(500,{message:"Saved connection has an unknown engine"});return e},es=(r,e)=>Ni(async()=>{let t=await Ia(r),n=Ri(t);if(e.readOnly&&!M[n.dbType].readOnly)throw new d(400,{message:`${M[n.dbType].label} connections cannot be opened read-only`});if(e.readOnly&&t.url.match(Ai)?.[1]===":memory:")throw new d(400,{message:"An in-memory database cannot be opened read-only"});let a=await pi(r,e);for(let[s,o]of En)o.readOnly!==a.readOnly&&Ge(o.url)===Ge(a.url)&&(En.delete(s),await $a(s));return Ri(a)})});function Vt(r){return be.get(r)}function Oi(r,e){if(!id(r))throw new d(400,{message:`Key browsing is not supported for database type: "${e}"`});return r}var ns,be,id,Dt=R(()=>{"use strict";y();Q();ns=class{adapters=new Map;register(e,t){this.adapters.set(e,t)}get(e){let t=this.adapters.get(e);if(!t)throw new d(400,{message:`Unsupported database type: "${e}". Supported types: ${this.getSupportedTypes().join(", ")}`});return t}has(e){return this.adapters.has(e)}getSupportedTypes(){return[...this.adapters.keys()]}},be=new ns;id=r=>"scanKeys"in r&&typeof r.scanKeys=="function"});function le(r){throw new d(501,{message:`${r} is not implemented for this database type`})}function cd(){throw new d(400,{message:"Server logs are not supported for this database type"})}function rs(){throw new d(400,{message:"Indexes are not supported for this database type"})}var ut,re,Xe=R(()=>{"use strict";y();Rt();Q();ut=5e4;re=class{assertDeletableKey(e){if(e.length>1)throw new d(400,{message:"Deleting rows from tables with a composite primary key is not supported yet."})}wrapError(e){if(e instanceof d)return e;if(e instanceof Error){let t=e,n=t.code??e.cause?.code,a=e.number;return je(e)&&e.code==="42501"||e.name==="RequestError"&&(a===229||a===230)?new d(403,{message:e.message,cause:e}):ht(e)?new d(400,{message:e.message,cause:e}):n==="ECONNREFUSED"||n==="ENOTFOUND"||n==="ETIMEDOUT"||n==="ER_ACCESS_DENIED_ERROR"||n==="ER_BAD_HOST_ERROR"||n==="ECONNRESET"||t.errno===1045||t.errno===2003||t.errno===2002||e.message.includes("ECONNREFUSED")||e.message.includes("connection refused")||e.message.includes("timeout expired")||e.message.includes("Connection terminated")||e.message.includes("MongoNetworkError")||e.message.includes("MongoServerSelectionError")||e.message.includes("Login failed")||/HTTP status (401|403)\b/.test(e.message)||e.message.startsWith("NOAUTH")||e.message.startsWith("WRONGPASS")||e.message.startsWith("LOADING")||e.message.startsWith("BUSY")||e.message.startsWith("READONLY")||e.message.startsWith("CLUSTERDOWN")||e.message.includes("Redis cluster mode is not supported")||e.message.includes("Could not set lock on file")||/^(ORA-(01017|03113|03114|03135|12170|12505|12514|12541|28000)|NJS-5(00|01|03|10|11|18|21)):/.test(e.message)||e.message.includes("Authentication failed: password is incorrect")||e.message==="Timeout error."||je(e)&&e.code?.startsWith("08")?new d(503,{message:e.message,cause:e}):new d(500,{message:e.message,cause:e})}return new d(500,{message:"Internal server error",cause:e})}resolveKeyColumns(e){return e.primaryKeys?.length?e.primaryKeys:[e.primaryKey]}assertWholeKey(e,t){let n=e.filter(a=>!t.includes(a));if(n.length>0)throw new d(400,{message:`Updates must match on every primary key column; missing: ${n.join(", ")}`})}groupUpdatesByKey(e,t){let n=new Map;for(let a of e.updates){let s=t.map(c=>{let l=a.rowData[c];if(l==null)throw new d(400,{message:`Primary key "${c}" not found in row data.`});return l}),o=JSON.stringify(s.map(c=>String(c))),i=n.get(o)??{keyValues:s,rowUpdates:[]};i.rowUpdates.push({columnName:a.columnName,value:a.value,useDefault:a.useDefault}),n.set(o,i)}return[...n.values()]}orderTerms(e=[],t,n){let a=typeof e=="string"?e?[{columnName:e,direction:t}]:[]:e,s=a[0]?.direction??t;return[...a.map(o=>({column:o.columnName,direction:o.direction})),...n.filter(o=>!a.some(i=>i.columnName===o)).map(o=>({column:o,direction:s}))]}describeKey(e,t){return e.map((n,a)=>`${n} = ${t[a]}`).join(", ")}assertDifferentTableName(e,t){if(e===t)throw new d(400,{message:`New table name must be different from "${e}"`})}encodeCursor(e){return Buffer.from(JSON.stringify(e)).toString("base64url")}decodeCursor(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}normalizeRow(e){let t={};for(let[n,a]of Object.entries(e))t[n]=a;return t}async getTableData(e){try{let{db:t,limit:n=50,direction:a="asc"}=e,s=this.buildTableDataQuery(e),[o,i]=await Promise.all([this.runQuery(t,s.countSql,s.countValues),this.runQuery(t,s.sql,s.values)]),c=Number(o[0]?.total??0),l=i.length>n,u=l?i.slice(0,n):i,m=this.normalizeRows(u);a==="desc"&&(m=m.reverse());let{nextCursor:p,prevCursor:f}=this.buildCursors(e,m,l);return{data:m,meta:{limit:n,total:c,hasNextPage:a==="asc"?l:!!e.cursor,hasPreviousPage:a==="asc"?!!e.cursor:l,nextCursor:p,prevCursor:f}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let n=`SELECT * FROM ${this.quoteIdentifier(e)}`,a=await this.runQuery(t,n,[]);if(!a||a.length===0)throw new d(404,{message:`Table "${e}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}catch(n){throw this.wrapError(n)}}getDatabasesList(){return le("getDatabasesList")}getCurrentDatabase(){return le("getCurrentDatabase")}getDatabaseConnectionInfo(){return le("getDatabaseConnectionInfo")}getTablesList(e){return le("getTablesList")}createTable(e){return le("createTable")}deleteTable(e){return le("deleteTable")}renameTable(e){return le("renameTable")}getTableSchema(e){return le("getTableSchema")}getTableColumns(e){return le("getTableColumns")}addColumn(e){return le("addColumn")}deleteColumn(e){return le("deleteColumn")}alterColumn(e){return le("alterColumn")}renameColumn(e){return le("renameColumn")}getTableIndexes(e){return rs()}createIndex(e){return rs()}dropIndex(e){return rs()}getServerLogs(e){return cd()}addRecord(e){return le("addRecord")}updateRecords(e){return le("updateRecords")}deleteRecords(e){return le("deleteRecords")}forceDeleteRecords(e){return le("forceDeleteRecords")}bulkInsertRecords(e){return le("bulkInsertRecords")}executeQuery(e){return le("executeQuery")}}});var W,K,F,V,as,ss,rr,ar,te,Re,sr,_t,Ot,ve,Ze=R(()=>{"use strict";y();Je();W=r=>Ua(r),K=r=>qa(r),F=r=>Ba(r),V=()=>Ha(),as=r=>ja(r),ss=()=>Wa(),rr=()=>Va(),ar=()=>Ya(),te=r=>za(r),Re=r=>Ga(r),sr=r=>Qa(r),_t=()=>Ja(),Ot=r=>Fa(r),ve=()=>Ka()});var $e,ne,Oe,he,mt=R(()=>{"use strict";y();$e="/* db-studio:server-logs */",ne=r=>({available:!1,reason:r}),Oe=r=>r.sort((e,t)=>e.ts.localeCompare(t.ts)).slice(-500),he=r=>Object.fromEntries(Object.entries(r).filter(([,e])=>e!=null&&e!=="").map(([e,t])=>[e,typeof t=="string"?t:JSON.stringify(t)]))});function Ii(r){let e=[],t=[],n=a=>(t.push(a),`{p${t.length-1}:String}`);for(let{columnName:a,operator:s,value:o}of r){let i=os(a);switch(s){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${i} ${s} ${n(o)}`);break;case"is":e.push(o.toLowerCase()==="null"?`${i} IS NULL`:`${i} = ${n(o)}`);break;case"is not":e.push(o.toLowerCase()==="null"?`${i} IS NOT NULL`:`${i} != ${n(o)}`);break;case"like":e.push(`toString(${i}) LIKE ${n(o)}`);break;case"not like":e.push(`toString(${i}) NOT LIKE ${n(o)}`);break;case"ilike":e.push(`toString(${i}) ILIKE ${n(o)}`);break;case"not ilike":e.push(`toString(${i}) NOT ILIKE ${n(o)}`);break}}return{clause:e.length?`WHERE ${e.join(" AND ")}`:"",values:t}}function xi(r,e,t){let n=Array.isArray(r)?r:r?[{columnName:r,direction:e}]:[],a=(n[0]?.direction??e).toUpperCase(),s=[...n.map(o=>`${os(o.columnName)} ${o.direction.toUpperCase()}`),...t.map(o=>`${o} ${a}`)];return s.length?`ORDER BY ${s.join(", ")}`:""}function ld(r,e,t){let a={smallserial:"UInt16",serial2:"UInt16",serial:"UInt32",serial4:"UInt32",bigserial:"UInt64",serial8:"UInt64",tinyint:"Int8",smallint:"Int16",int2:"Int16",int:"Int32",int4:"Int32",integer:"Int32",bigint:"Int64",int8:"Int64",numeric:"Decimal(38, 10)",decimal:"Decimal(38, 10)",money:"Decimal(19, 4)",real:"Float32",float4:"Float32",float:"Float64",float8:"Float64","double precision":"Float64",boolean:"Bool",bool:"Bool",text:"String",varchar:"String","character varying":"String",char:"String",character:"String",bpchar:"String",citext:"String",uuid:"UUID",json:t?"JSON":"String",jsonb:t?"JSON":"String",xml:"String",date:"Date32",time:"String","time without time zone":"String",timestamp:"DateTime64(6)","timestamp without time zone":"DateTime64(6)",timestamptz:"DateTime64(6, 'UTC')","timestamp with time zone":"DateTime64(6, 'UTC')",interval:"String",bytea:"String",inet:"String",cidr:"String",macaddr:"String",macaddr8:"String"}[r.toLowerCase().trim()]??r.trim();return e?`Array(${a})`:a}function or(r,e){let t=os(r.columnName);if(r.isIdentity||/serial/i.test(r.columnType))return`${t} UInt64 DEFAULT generateSnowflakeID()`;let n=ld(r.columnType,r.isArray??!1,e),a=r.isNullable&&!r.isPrimaryKey&&!r.isArray,s=`${t} ${a?`Nullable(${n})`:n}`,o=r.defaultValue?.trim();return o&&(s+=` DEFAULT ${ud[o.toLowerCase()]??o}`),s}var ae,os,ud,Li=R(()=>{"use strict";y();ae=r=>`\`${r.replaceAll("\\","\\\\").replaceAll("`","\\`")}\``,os=ae;ud={"now()":"now()",current_timestamp:"now()","current_timestamp()":"now()",current_date:"today()","gen_random_uuid()":"generateUUIDv4()","uuid_generate_v4()":"generateUUIDv4()"}});import{ClickHouseError as Pi}from"@clickhouse/client";var md,$i,dd,pd,ir,Mi=R(()=>{"use strict";y();j();Xe();Ze();mt();Q();ze();Li();md={mutations_sync:"2"},$i=r=>/^(LowCardinality\()?Nullable\(/.test(r),dd=(r,e)=>{if(r==null)return null;let t=Ut(e);if(r===""&&t!=="String"&&!t.startsWith("FixedString"))return null;if(r instanceof Date)return r.toISOString();if(t==="Bool"&&typeof r=="string")return["true","t","1","yes","on"].includes(r.trim().toLowerCase());if(typeof r=="string"&&(t.startsWith("JSON")||t.startsWith("Array(")||t.startsWith("Map(")))try{return JSON.parse(r)}catch{throw new d(400,{message:`Invalid ${t} value: ${r}`})}return typeof r=="object"&&t==="String"?JSON.stringify(r):r},pd={Fatal:"fatal",Critical:"fatal",Error:"error",Warning:"warning"},ir=class extends re{serverVersion=new WeakMap;async runQuery(e,t,n){let a=Object.fromEntries(n.map((s,o)=>[`p${o}`,s]));return await this.select(e,t,a)}quoteIdentifier(e){return ae(e)}mapToUniversalType(e){return qn(e)}mapFromUniversalType(e){return{text:"String",number:"Int64",boolean:"Bool",json:"String",date:"DateTime",array:"Array(String)",enum:"String"}[e]??"String"}buildTableDataQuery(e){return this.buildPageQuery(e,[])}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){let{cursor:a,limit:s=50}=e,o=a?this.decodeOffsetCursor(a):0;return{nextCursor:n?this.makeCursor(o+s):null,prevCursor:o>0?this.makeCursor(Math.max(0,o-s)):null}}async getTableData(e){try{let{db:t,tableName:n,limit:a=50,cursor:s}=e,o=await this.getTable(t,n),i=o.sorting_key?[`(${o.sorting_key})`]:[];o.engine.endsWith("MergeTree")&&i.push("_part","_part_offset");let c=this.buildPageQuery(e,i),[l,u]=await Promise.all([this.runQuery(t,c.countSql,c.countValues),this.runQuery(t,c.sql,c.values)]),m=u.length>a,p=this.normalizeRows(m?u.slice(0,a):u),f=s?this.decodeOffsetCursor(s):0;return{data:p,meta:{limit:a,total:Number(l[0]?.total??0),hasNextPage:m,hasPreviousPage:f>0,...this.buildCursors(e,p,m)}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{return(await this.select(void 0,`SELECT d.name AS name, formatReadableSize(p.bytes) AS size
17
+ AND nspname NOT LIKE 'pg_temp%';`).then(()=>{},i=>{Z("warn","db_search_path_widen_failed",{db_type:"pg",...he(i)})})}});s.on("error",o=>{Z("error","db_pool_error",{db_type:"pg",...he(o)})}),this.pgPools.set(t,s)}return this.pgPools.get(t)}async getMysqlPool(e){let t=this.config(),n=this.buildConnectionString(e),{createPool:a}=await Je("mysql");if(!this.mysqlPools.has(n)){let s=new URL(n),o=Wt(s.pathname.slice(1)),i=a({host:t.host,port:t.port,user:t.user,password:t.password,database:o||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.readOnly&&i.pool.on("connection",c=>c.query("SET SESSION TRANSACTION READ ONLY",l=>{l&&c.destroy()})),this.mysqlPools.set(n,i)}return this.mysqlPools.get(n)}async getMssqlPool(e){let t=this.config(),n=this.buildConnectionString(e),a=await Je("mssql");if(!this.mssqlPools.has(n)){let s=new URL(n),o=Wt(s.pathname.slice(1)),i={server:t.host,port:t.port,user:t.user,password:t.password,database:o||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},c=await new a.ConnectionPool(i).connect();c.on("error",l=>{Z("error","db_pool_error",{db_type:"mssql",...he(l)})}),this.mssqlPools.set(n,c)}return this.mssqlPools.get(n)}async getClickhouseClient(e){let t=this.config(),n=new URL(this.buildConnectionString(e)),a=Wt(n.pathname.slice(1))||"default",{ClickHouseLogLevel:s,createClient:o}=await Je("clickhouse"),i=this.clickhouseClients.get(a);if(i)return i;let c=n.protocol==="clickhouses:",l=o({url:`${c?"https":"http"}://${n.hostname}:${n.port||(c?8443:8123)}`,username:t.user||"default",password:t.password,database:a,request_timeout:3e4,clickhouse_settings:{output_format_json_quote_64bit_integers:1,output_format_json_quote_decimals:1,wait_end_of_query:1,...this.readOnly&&{readonly:"2"}},log:{level:s.OFF}});return this.clickhouseClients.set(a,l),l}async getMongoClient(){if(!this.mongoClient){let{url:e}=this.config(),{MongoClient:t}=await Je("mongodb"),n=new t(e);try{await n.connect(),this.mongoClient=n}catch(a){try{await n.close()}catch{}throw a}}return this.mongoClient}getMongoDbName(){return Wt(new URL(this.config().url).pathname.replace(/^\/+|\/+$/g,""))||"admin"}async getMongoDb(e){return(await this.getMongoClient()).db(e??this.getMongoDbName())}async getRedisClient(e){let t=this.config();if(t.dbType!=="redis")throw new Error("The connection is not a redis:// connection");let n=e??this.getRedisDefaultDb(),a=this.redisClients.get(n);if(a)return a;let s=new URL(t.url),o={host:t.host,port:t.port,db:n,lazyConnect:!0,maxRetriesPerRequest:1,enableReadyCheck:!0,connectTimeout:2e3};t.user&&(o.username=t.user),t.password&&(o.password=t.password),s.protocol==="rediss:"&&(o.tls={});let{Redis:i}=await Je("redis"),c=new i(o);try{if(await c.connect(),!this.redisClusterChecked){let l=await c.info("server");if(/^redis_mode:(cluster|sentinel)\b/m.test(l))throw await c.quit().catch(()=>{}),new Error("Redis cluster and Sentinel modes are not supported. Use a standalone redis:// connection.");let u=l.match(/^redis_version:([^\r\n]+)/m)?.[1],[m=0,p=0]=u?.split(".").map(Number)??[];if(m<6||m===6&&p<2)throw await c.quit().catch(()=>{}),new Error(`Redis 6.2 or newer is required. Connected server reports ${u??"an unknown version"}.`);this.redisClusterChecked=!0}}catch(l){throw await c.quit().catch(()=>{}),l}return this.redisClients.set(n,c),c}async getIsolatedRedisClient(e){let t=(await this.getRedisClient(e)).duplicate();return await t.connect(),t}getRedisDefaultDb(){if(!this.baseConfig)return 0;try{let t=new URL(this.baseConfig.url).pathname.replace(/^\//,"");if(!t)return 0;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:0}catch{return 0}}async closeAll(){let e=Array.from(this.pgPools.values()).map(async s=>{await s.end(),Z("info","db_pool_closed",{db_type:"pg"})}),t=Array.from(this.mysqlPools.values()).map(async s=>{await s.end(),Z("info","db_pool_closed",{db_type:"mysql"})}),n=Array.from(this.mssqlPools.values()).map(async s=>{await s.close(),Z("info","db_pool_closed",{db_type:"mssql"})});await Promise.all([...e,...t,...n]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null),await this.closeSqliteClient(),await this.closeDuckdb(),await this.closeOraclePool();let a=Array.from(this.redisClients.values()).map(async s=>{await s.quit().catch(()=>{}),Z("info","db_pool_closed",{db_type:"redis"})});await Promise.all(a),this.redisClients.clear(),this.redisClusterChecked=!1,await Promise.all(Array.from(this.clickhouseClients.values()).map(s=>s.close())),this.clickhouseClients.clear()}},At=new Map,Yt=null,sd=new Vt,Ri=new Set,ka=async r=>{let e=At.get(r);At.delete(r),Ri.add(r),Yt===r&&(Yt=null),await e?.closeAll()},va=(r,e)=>{At.set(r,e),Yt=r},Tn=r=>At.get(r),Ua=()=>Yt,qa=()=>{let r=ya();return r&&Ri.has(r)?null:r&&At.has(r)?r:Yt},Ce=()=>At.get(ya()??Yt??"")??sd,Ba=r=>Ce().getPgPool(r),Fa=r=>Ce().getMysqlPool(r),Ka=async r=>Ce().getMssqlPool(r),Ha=r=>Ce().getClickhouseClient(r),Dt=()=>Ce().getDbType(),ja=()=>Ce().getConnectionUrl(),od=async()=>{await Promise.all([...At.values()].map(r=>r.closeAll()))},Wa=()=>Ce().getSqliteClient(),Va=r=>Ce().withDuckdbConnection(r),Ya=()=>Ce().getOraclePool(),za=()=>Ce().getMongoClient(),Ga=()=>Ce().getMongoDbName(),Qa=r=>Ce().getMongoDb(r),Ja=r=>Ce().getRedisClient(r),Xa=r=>Ce().getIsolatedRedisClient(r),Za=()=>Ce().getRedisDefaultDb(),En=r=>typeof r=="string"&&We("mongodb").ObjectId.isValid(r),wn=r=>{let{ObjectId:e}=We("mongodb");return typeof r=="string"&&e.isValid(r)?new e(r):r}});var Ii={};$t(Ii,{connect:()=>ar,connectSaved:()=>ts,getConnectionsState:()=>Rn,updateConnection:()=>ns});import{randomUUID as id}from"crypto";import{access as cd}from"fs/promises";var Ci,Di,Sn,_i,Ni,ld,ar,ts,Oi,Rn,Ai,ns,rs=C(()=>{"use strict";y();j();Da();fa();Pa();Xe();Q();ze();Ci=Promise.resolve(),Di=r=>{let e=Ci.then(r);return Ci=e.catch(()=>{}),e},Sn=new Map,_i=/^(?:sqlite|duckdb):\/\/(.+)$/,Ni=r=>zn(r instanceof Error?r.message:String(r)),ld=async(r,e)=>{let t=[...Sn].find(([,s])=>s.url===r&&s.readOnly===e)?.[0];if(t)return t;let n;try{n=new Vt(r,e)}catch(s){throw new d(400,{message:Ni(s),cause:s})}try{await Aa(n)}catch(s){throw await n.closeAll().catch(()=>{}),new d(400,{message:`Could not connect: ${Ni(s)}`,cause:s})}let a=id();return va(a,n),Sn.set(a,{url:r,readOnly:e}),a},ar=(r,{requireExistingFile:e=!1}={})=>{let t=pi(r);return Di(async()=>{let n=t.match(_i)?.[1];e&&n&&n!==":memory:"&&await cd(n).catch(()=>{throw new d(400,{message:`No database file at ${n}`})});let a=(await nr()).some(o=>o.readOnly&&Qe(o.url)===Qe(t)),s=await ld(t,a);return await fi(t).catch(o=>{Z("warn","connection_save_failed",he(o))}),s})},ts=async r=>{let e=await La(r);return ar(e.url,{requireExistingFile:!0})},Oi=r=>{let e=Ye(r.url.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{id:t,name:n,color:a,readOnly:s,lastUsedAt:o}=r;return{id:t,name:n,color:a,readOnly:s,lastUsedAt:o,dbType:e,maskedUrl:Qe(r.url)}},Rn=async(r=qa())=>{let e=await nr(),t=e.map(Oi).filter(s=>s!==null).sort((s,o)=>o.lastUsedAt-s.lastUsedAt),n=r&&Sn.get(r)?.url,a=r&&Tn(r);return!r||!n||!a?{connections:t,active:null}:{connections:t,active:{id:e.find(s=>Qe(s.url)===Qe(n))?.id??null,dbType:a.getDbType(),connectionId:r}}},Ai=r=>{let e=Oi(r);if(!e)throw new d(500,{message:"Saved connection has an unknown engine"});return e},ns=(r,e)=>Di(async()=>{let t=await La(r),n=Ai(t);if(e.readOnly&&!M[n.dbType].readOnly)throw new d(400,{message:`${M[n.dbType].label} connections cannot be opened read-only`});if(e.readOnly&&t.url.match(_i)?.[1]===":memory:")throw new d(400,{message:"An in-memory database cannot be opened read-only"});let a=await yi(r,e);for(let[s,o]of Sn)o.readOnly!==a.readOnly&&Qe(o.url)===Qe(a.url)&&(Sn.delete(s),await ka(s));return Ai(a)})});function zt(r){return Te.get(r)}function xi(r,e){if(!ud(r))throw new d(400,{message:`Key browsing is not supported for database type: "${e}"`});return r}var as,Te,ud,_t=C(()=>{"use strict";y();Q();as=class{adapters=new Map;register(e,t){this.adapters.set(e,t)}get(e){let t=this.adapters.get(e);if(!t)throw new d(400,{message:`Unsupported database type: "${e}". Supported types: ${this.getSupportedTypes().join(", ")}`});return t}has(e){return this.adapters.has(e)}getSupportedTypes(){return[...this.adapters.keys()]}},Te=new as;ud=r=>"scanKeys"in r&&typeof r.scanKeys=="function"});function le(r){throw new d(501,{message:`${r} is not implemented for this database type`})}function md(){throw new d(400,{message:"Server logs are not supported for this database type"})}function ss(){throw new d(400,{message:"Indexes are not supported for this database type"})}var mt,re,Ze=C(()=>{"use strict";y();bt();Q();mt=5e4;re=class{assertDeletableKey(e){if(e.length>1)throw new d(400,{message:"Deleting rows from tables with a composite primary key is not supported yet."})}wrapError(e){if(e instanceof d)return e;if(e instanceof Error){let t=e,n=t.code??e.cause?.code,a=e.number;return Ue(e)&&e.code==="42501"||e.name==="RequestError"&&(a===229||a===230)?new d(403,{message:e.message,cause:e}):gt(e)?new d(400,{message:e.message,cause:e}):pe(e)?new d(403,{message:rr,cause:e}):n==="ECONNREFUSED"||n==="ENOTFOUND"||n==="ETIMEDOUT"||n==="ER_ACCESS_DENIED_ERROR"||n==="ER_BAD_HOST_ERROR"||n==="ECONNRESET"||e.name==="ConnectionError"||t.errno===1045||t.errno===2003||t.errno===2002||e.message.includes("ECONNREFUSED")||e.message.includes("connection refused")||e.message.includes("timeout expired")||e.message.includes("Connection terminated")||e.message.includes("MongoNetworkError")||e.message.includes("MongoServerSelectionError")||e.message.includes("Login failed")||/HTTP status (401|403)\b/.test(e.message)||e.message.startsWith("NOAUTH")||e.message.startsWith("WRONGPASS")||e.message.startsWith("LOADING")||e.message.startsWith("BUSY")||e.message.startsWith("READONLY")||e.message.startsWith("CLUSTERDOWN")||e.message.includes("Redis cluster mode is not supported")||e.message.includes("Could not set lock on file")||/^(ORA-(01017|03113|03114|03135|12170|12505|12514|12541|28000)|NJS-5(00|01|03|10|11|18|21)):/.test(e.message)||e.message.includes("Authentication failed: password is incorrect")||e.message==="Timeout error."||Ue(e)&&e.code?.startsWith("08")?new d(503,{message:e.message,cause:e}):new d(500,{message:e.message,cause:e})}return new d(500,{message:"Internal server error",cause:e})}resolveKeyColumns(e){return e.primaryKeys?.length?e.primaryKeys:[e.primaryKey]}assertWholeKey(e,t){let n=e.filter(a=>!t.includes(a));if(n.length>0)throw new d(400,{message:`Updates must match on every primary key column; missing: ${n.join(", ")}`})}groupUpdatesByKey(e,t){let n=new Map;for(let a of e.updates){let s=t.map(c=>{let l=a.rowData[c];if(l==null)throw new d(400,{message:`Primary key "${c}" not found in row data.`});return l}),o=JSON.stringify(s.map(c=>String(c))),i=n.get(o)??{keyValues:s,rowUpdates:[]};i.rowUpdates.push({columnName:a.columnName,value:a.value,useDefault:a.useDefault}),n.set(o,i)}return[...n.values()]}orderTerms(e=[],t,n){let a=typeof e=="string"?e?[{columnName:e,direction:t}]:[]:e,s=a[0]?.direction??t;return[...a.map(o=>({column:o.columnName,direction:o.direction})),...n.filter(o=>!a.some(i=>i.columnName===o)).map(o=>({column:o,direction:s}))]}describeKey(e,t){return e.map((n,a)=>`${n} = ${t[a]}`).join(", ")}assertDifferentTableName(e,t){if(e===t)throw new d(400,{message:`New table name must be different from "${e}"`})}encodeCursor(e){return Buffer.from(JSON.stringify(e)).toString("base64url")}decodeCursor(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}normalizeRow(e){let t={};for(let[n,a]of Object.entries(e))t[n]=a;return t}async getTableData(e){try{let{db:t,limit:n=50,direction:a="asc"}=e,s=this.buildTableDataQuery(e),[o,i]=await Promise.all([this.runQuery(t,s.countSql,s.countValues),this.runQuery(t,s.sql,s.values)]),c=Number(o[0]?.total??0),l=i.length>n,u=l?i.slice(0,n):i,m=this.normalizeRows(u);a==="desc"&&(m=m.reverse());let{nextCursor:p,prevCursor:f}=this.buildCursors(e,m,l);return{data:m,meta:{limit:n,total:c,hasNextPage:a==="asc"?l:!!e.cursor,hasPreviousPage:a==="asc"?!!e.cursor:l,nextCursor:p,prevCursor:f}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let n=`SELECT * FROM ${this.quoteIdentifier(e)}`,a=await this.runQuery(t,n,[]);if(!a||a.length===0)throw new d(404,{message:`Table "${e}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}catch(n){throw this.wrapError(n)}}getDatabasesList(){return le("getDatabasesList")}getCurrentDatabase(){return le("getCurrentDatabase")}getDatabaseConnectionInfo(){return le("getDatabaseConnectionInfo")}getTablesList(e){return le("getTablesList")}createTable(e){return le("createTable")}deleteTable(e){return le("deleteTable")}renameTable(e){return le("renameTable")}getTableSchema(e){return le("getTableSchema")}getTableColumns(e){return le("getTableColumns")}addColumn(e){return le("addColumn")}deleteColumn(e){return le("deleteColumn")}alterColumn(e){return le("alterColumn")}renameColumn(e){return le("renameColumn")}getTableIndexes(e){return ss()}createIndex(e){return ss()}dropIndex(e){return ss()}getServerLogs(e){return md()}addRecord(e){return le("addRecord")}updateRecords(e){return le("updateRecords")}deleteRecords(e){return le("deleteRecords")}forceDeleteRecords(e){return le("forceDeleteRecords")}bulkInsertRecords(e){return le("bulkInsertRecords")}executeQuery(e){return le("executeQuery")}}});var W,K,F,V,os,is,sr,or,te,Ne,ir,Ot,It,qe,et=C(()=>{"use strict";y();Xe();W=r=>Ba(r),K=r=>Fa(r),F=r=>Ka(r),V=()=>Wa(),os=r=>Va(r),is=()=>Ya(),sr=()=>za(),or=()=>Ga(),te=r=>Qa(r),Ne=r=>Ja(r),ir=r=>Xa(r),Ot=()=>Za(),It=r=>Ha(r),qe=()=>ja()});var Me,ne,Ie,ge,dt=C(()=>{"use strict";y();Me="/* db-studio:server-logs */",ne=r=>({available:!1,reason:r}),Ie=r=>r.sort((e,t)=>e.ts.localeCompare(t.ts)).slice(-500),ge=r=>Object.fromEntries(Object.entries(r).filter(([,e])=>e!=null&&e!=="").map(([e,t])=>[e,typeof t=="string"?t:JSON.stringify(t)]))});function Li(r){let e=[],t=[],n=a=>(t.push(a),`{p${t.length-1}:String}`);for(let{columnName:a,operator:s,value:o}of r){let i=cs(a);switch(s){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${i} ${s} ${n(o)}`);break;case"is":e.push(o.toLowerCase()==="null"?`${i} IS NULL`:`${i} = ${n(o)}`);break;case"is not":e.push(o.toLowerCase()==="null"?`${i} IS NOT NULL`:`${i} != ${n(o)}`);break;case"like":e.push(`toString(${i}) LIKE ${n(o)}`);break;case"not like":e.push(`toString(${i}) NOT LIKE ${n(o)}`);break;case"ilike":e.push(`toString(${i}) ILIKE ${n(o)}`);break;case"not ilike":e.push(`toString(${i}) NOT ILIKE ${n(o)}`);break}}return{clause:e.length?`WHERE ${e.join(" AND ")}`:"",values:t}}function Pi(r,e,t){let n=Array.isArray(r)?r:r?[{columnName:r,direction:e}]:[],a=(n[0]?.direction??e).toUpperCase(),s=[...n.map(o=>`${cs(o.columnName)} ${o.direction.toUpperCase()}`),...t.map(o=>`${o} ${a}`)];return s.length?`ORDER BY ${s.join(", ")}`:""}function dd(r,e,t){let a={smallserial:"UInt16",serial2:"UInt16",serial:"UInt32",serial4:"UInt32",bigserial:"UInt64",serial8:"UInt64",tinyint:"Int8",smallint:"Int16",int2:"Int16",int:"Int32",int4:"Int32",integer:"Int32",bigint:"Int64",int8:"Int64",numeric:"Decimal(38, 10)",decimal:"Decimal(38, 10)",money:"Decimal(19, 4)",real:"Float32",float4:"Float32",float:"Float64",float8:"Float64","double precision":"Float64",boolean:"Bool",bool:"Bool",text:"String",varchar:"String","character varying":"String",char:"String",character:"String",bpchar:"String",citext:"String",uuid:"UUID",json:t?"JSON":"String",jsonb:t?"JSON":"String",xml:"String",date:"Date32",time:"String","time without time zone":"String",timestamp:"DateTime64(6)","timestamp without time zone":"DateTime64(6)",timestamptz:"DateTime64(6, 'UTC')","timestamp with time zone":"DateTime64(6, 'UTC')",interval:"String",bytea:"String",inet:"String",cidr:"String",macaddr:"String",macaddr8:"String"}[r.toLowerCase().trim()]??r.trim();return e?`Array(${a})`:a}function cr(r,e){let t=cs(r.columnName);if(r.isIdentity||/serial/i.test(r.columnType))return`${t} UInt64 DEFAULT generateSnowflakeID()`;let n=dd(r.columnType,r.isArray??!1,e),a=r.isNullable&&!r.isPrimaryKey&&!r.isArray,s=`${t} ${a?`Nullable(${n})`:n}`,o=r.defaultValue?.trim();return o&&(s+=` DEFAULT ${pd[o.toLowerCase()]??o}`),s}var ae,cs,pd,$i=C(()=>{"use strict";y();ae=r=>`\`${r.replaceAll("\\","\\\\").replaceAll("`","\\`")}\``,cs=ae;pd={"now()":"now()",current_timestamp:"now()","current_timestamp()":"now()",current_date:"today()","gen_random_uuid()":"generateUUIDv4()","uuid_generate_v4()":"generateUUIDv4()"}});import{ClickHouseError as Mi}from"@clickhouse/client";var fd,ki,yd,hd,lr,vi=C(()=>{"use strict";y();j();Ze();et();dt();Q();Ge();$i();fd={mutations_sync:"2"},ki=r=>/^(LowCardinality\()?Nullable\(/.test(r),yd=(r,e)=>{if(r==null)return null;let t=qt(e);if(r===""&&t!=="String"&&!t.startsWith("FixedString"))return null;if(r instanceof Date)return r.toISOString();if(t==="Bool"&&typeof r=="string")return["true","t","1","yes","on"].includes(r.trim().toLowerCase());if(typeof r=="string"&&(t.startsWith("JSON")||t.startsWith("Array(")||t.startsWith("Map(")))try{return JSON.parse(r)}catch{throw new d(400,{message:`Invalid ${t} value: ${r}`})}return typeof r=="object"&&t==="String"?JSON.stringify(r):r},hd={Fatal:"fatal",Critical:"fatal",Error:"error",Warning:"warning"},lr=class extends re{serverVersion=new WeakMap;async runQuery(e,t,n){let a=Object.fromEntries(n.map((s,o)=>[`p${o}`,s]));return await this.select(e,t,a)}quoteIdentifier(e){return ae(e)}mapToUniversalType(e){return Fn(e)}mapFromUniversalType(e){return{text:"String",number:"Int64",boolean:"Bool",json:"String",date:"DateTime",array:"Array(String)",enum:"String"}[e]??"String"}buildTableDataQuery(e){return this.buildPageQuery(e,[])}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){let{cursor:a,limit:s=50}=e,o=a?this.decodeOffsetCursor(a):0;return{nextCursor:n?this.makeCursor(o+s):null,prevCursor:o>0?this.makeCursor(Math.max(0,o-s)):null}}async getTableData(e){try{let{db:t,tableName:n,limit:a=50,cursor:s}=e,o=await this.getTable(t,n),i=o.sorting_key?[`(${o.sorting_key})`]:[];o.engine.endsWith("MergeTree")&&i.push("_part","_part_offset");let c=this.buildPageQuery(e,i),[l,u]=await Promise.all([this.runQuery(t,c.countSql,c.countValues),this.runQuery(t,c.sql,c.values)]),m=u.length>a,p=this.normalizeRows(m?u.slice(0,a):u),f=s?this.decodeOffsetCursor(s):0;return{data:p,meta:{limit:a,total:Number(l[0]?.total??0),hasNextPage:m,hasPreviousPage:f>0,...this.buildCursors(e,p,m)}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{return(await this.select(void 0,`SELECT d.name AS name, formatReadableSize(p.bytes) AS size
18
18
  FROM system.databases AS d
19
19
  LEFT JOIN (
20
20
  SELECT database, sum(bytes_on_disk) AS bytes FROM system.parts WHERE active GROUP BY database
@@ -25,10 +25,10 @@ var Bl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var Pt=(r,e)=>{f
25
25
  currentUser() AS user,
26
26
  currentDatabase() AS database,
27
27
  (SELECT sum(value) FROM system.metrics WHERE metric IN ('TCPConnection', 'HTTPConnection', 'MySQLConnection', 'PostgreSQLConnection')) AS active_connections,
28
- (SELECT value FROM system.server_settings WHERE name = 'max_connections') AS max_connections`);if(!e)throw new d(500,{message:"No connection information returned"});let{host:t,port:n}=_e(ve());return{host:t,port:n,user:e.user,database:e.database,version:`ClickHouse ${e.version}`,active_connections:Number(e.active_connections),max_connections:Number(e.max_connections)}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{return(await this.select(e,`SELECT name AS tableName, total_rows AS rowCount
28
+ (SELECT value FROM system.server_settings WHERE name = 'max_connections') AS max_connections`);if(!e)throw new d(500,{message:"No connection information returned"});let{host:t,port:n}=Oe(qe());return{host:t,port:n,user:e.user,database:e.database,version:`ClickHouse ${e.version}`,active_connections:Number(e.active_connections),max_connections:Number(e.max_connections)}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{return(await this.select(e,`SELECT name AS tableName, total_rows AS rowCount
29
29
  FROM system.tables
30
30
  WHERE database = currentDatabase() AND NOT is_temporary AND NOT startsWith(name, '.inner')
31
- ORDER BY name`)).map(n=>({tableName:n.tableName,rowCount:Number(n.rowCount??0)}))}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e;if(s?.length)throw new d(400,{message:"ClickHouse does not support foreign keys"});let o=a.find(i=>i.isUnique&&!i.isPrimaryKey);if(o)throw new d(400,{message:`ClickHouse does not enforce UNIQUE constraints; clear "Unique" on "${o.columnName}"`});try{let i=await this.isAtLeast(t,25,3);if(a.some(u=>u.isIdentity||/serial/i.test(u.columnType))&&!await this.isAtLeast(t,24,6))throw new d(400,{message:"Auto-generated ids need ClickHouse 24.6 or newer (generateSnowflakeID)"});let c=a.map(u=>or(u,i)),l=a.filter(u=>u.isPrimaryKey).map(u=>ae(u.columnName));await this.command(t,`CREATE TABLE ${ae(n)} (${c.join(", ")}) ENGINE = MergeTree ORDER BY ${l.length?`(${l.join(", ")})`:"tuple()"}`)}catch(i){throw this.wrapError(i)}}async deleteTable({tableName:e,db:t}){try{await this.getTable(t,e);let[n]=await this.select(t,`SELECT count() AS total FROM ${ae(e)}`);return await this.command(t,`DROP TABLE ${ae(e)}`),{deletedCount:Number(n?.total??0),fkViolation:!1,relatedRecords:[]}}catch(n){throw this.wrapError(n)}}async renameTable({tableName:e,newTableName:t,db:n}){this.assertDifferentTableName(e,t);try{if(await this.getTable(n,e),await this.findTable(n,t))throw new d(409,{message:`Table "${t}" already exists`});await this.command(n,`RENAME TABLE ${ae(e)} TO ${ae(t)}`)}catch(a){throw this.wrapError(a)}}async getTableSchema({tableName:e,db:t}){try{await this.getTable(t,e);let[n]=await this.select(t,`SHOW CREATE TABLE ${ae(e)}`);return n?.statement??""}catch(n){throw this.wrapError(n)}}async getTableColumns({tableName:e,db:t}){try{return await this.getTable(t,e),(await this.getColumns(t,e)).map(a=>({columnName:a.name,dataType:qn(a.type),dataTypeLabel:zr(a.type),isNullable:$i(a.type),columnDefault:a.default_expression||null,isPrimaryKey:a.is_in_sorting_key===1,isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:/^Enum(8|16)\(/.test(Ut(a.type))?[...a.type.matchAll(/'((?:[^'\\]|\\.)*)'\s*=/g)].map(s=>s[1]??""):null}))}catch(n){throw this.wrapError(n)}}async addColumn(e){let{tableName:t,columnName:n,db:a}=e;if(e.isUnique)throw new d(400,{message:"ClickHouse does not enforce UNIQUE constraints"});try{if(await this.getTable(a,t),(await this.getColumns(a,t)).some(i=>i.name===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let o=or({...e,isPrimaryKey:!1},await this.isAtLeast(a,25,3));await this.command(a,`ALTER TABLE ${ae(t)} ADD COLUMN ${o}`)}catch(s){throw this.wrapError(s)}}async deleteColumn({tableName:e,columnName:t,db:n}){try{if((await this.getColumn(n,e,t)).is_in_sorting_key)throw new d(400,{message:`"${t}" is part of the sorting key and cannot be dropped`});return await this.command(n,`ALTER TABLE ${ae(e)} DROP COLUMN ${ae(t)}`),{deletedCount:1}}catch(a){throw this.wrapError(a)}}async alterColumn(e){let{tableName:t,columnName:n,db:a}=e;try{let s=await this.getColumn(a,t,n),o=or({...e,columnName:n,isPrimaryKey:s.is_in_sorting_key===1},await this.isAtLeast(a,25,3));await this.command(a,`ALTER TABLE ${ae(t)} MODIFY COLUMN ${o}`)}catch(s){throw this.wrapError(s)}}async renameColumn({tableName:e,columnName:t,newColumnName:n,db:a}){try{if(await this.getColumn(a,e,t),(await this.getColumns(a,e)).some(o=>o.name===n))throw new d(409,{message:`Column "${n}" already exists in table "${e}"`});await this.command(a,`ALTER TABLE ${ae(e)} RENAME COLUMN ${ae(t)} TO ${ae(n)}`)}catch(s){throw this.wrapError(s)}}async addRecord({db:e,params:t}){if(!Object.keys(t.data).length)throw new d(400,{message:"No data provided for insert"});return await this.insertRows(e,t.tableName,[t.data]),{insertedCount:1}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t?.length)throw new d(400,{message:"At least one record is required"});return await this.insertRows(n,e,t),{success:!0,message:`Bulk insert completed: ${t.length} records inserted`,successCount:t.length,failureCount:0}}async updateRecords(e){throw new d(400,{message:M.clickhouse.rowMutationReason})}async deleteRecords(e){throw new d(400,{message:M.clickhouse.rowMutationReason})}async forceDeleteRecords(e){throw new d(400,{message:M.clickhouse.rowMutationReason})}async executeQuery({query:e,db:t}){let n=e.trim().replace(/;+\s*$/,"");if(!n)throw new d(400,{message:"Query is required"});let a=performance.now();try{let s=await Ot(t),o=n.replace(/^(\s*(--[^\n]*\n|\/\*[\s\S]*?\*\/))*/,"").match(/^\s*(\w+)/)?.[1]?.toUpperCase();if(o&&["SELECT","WITH","SHOW","DESC","DESCRIBE","EXPLAIN","EXISTS"].includes(o)){let l=await s.query({query:n,format:"JSON"}),{meta:u=[],data:m}=await l.json();return{columns:u.map(p=>p.name),rows:m,rowCount:m.length,duration:performance.now()-a,message:m.length===0?"OK":void 0}}let{summary:i}=await s.command({query:n,clickhouse_settings:md}),c=Number(i?.written_rows??0);return{columns:[],rows:[],rowCount:c,duration:performance.now()-a,message:`OK (${c} rows affected)`}}catch(s){throw this.wrapError(s)}}async getServerLogs({db:e}){let t=await Ot(e),n=async a=>{try{return await(await t.query({query:`${$e} ${a}`,format:"JSONEachRow",clickhouse_settings:{log_queries:0}})).json()}catch(s){if(s instanceof Pi&&s.type==="UNKNOWN_TABLE")return null;throw s}};try{let a=await n(`SELECT toUnixTimestamp64Milli(event_time_microseconds) AS ms, type, query_duration_ms,
31
+ ORDER BY name`)).map(n=>({tableName:n.tableName,rowCount:Number(n.rowCount??0)}))}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e;if(s?.length)throw new d(400,{message:"ClickHouse does not support foreign keys"});let o=a.find(i=>i.isUnique&&!i.isPrimaryKey);if(o)throw new d(400,{message:`ClickHouse does not enforce UNIQUE constraints; clear "Unique" on "${o.columnName}"`});try{let i=await this.isAtLeast(t,25,3);if(a.some(u=>u.isIdentity||/serial/i.test(u.columnType))&&!await this.isAtLeast(t,24,6))throw new d(400,{message:"Auto-generated ids need ClickHouse 24.6 or newer (generateSnowflakeID)"});let c=a.map(u=>cr(u,i)),l=a.filter(u=>u.isPrimaryKey).map(u=>ae(u.columnName));await this.command(t,`CREATE TABLE ${ae(n)} (${c.join(", ")}) ENGINE = MergeTree ORDER BY ${l.length?`(${l.join(", ")})`:"tuple()"}`)}catch(i){throw this.wrapError(i)}}async deleteTable({tableName:e,db:t}){try{await this.getTable(t,e);let[n]=await this.select(t,`SELECT count() AS total FROM ${ae(e)}`);return await this.command(t,`DROP TABLE ${ae(e)}`),{deletedCount:Number(n?.total??0),fkViolation:!1,relatedRecords:[]}}catch(n){throw this.wrapError(n)}}async renameTable({tableName:e,newTableName:t,db:n}){this.assertDifferentTableName(e,t);try{if(await this.getTable(n,e),await this.findTable(n,t))throw new d(409,{message:`Table "${t}" already exists`});await this.command(n,`RENAME TABLE ${ae(e)} TO ${ae(t)}`)}catch(a){throw this.wrapError(a)}}async getTableSchema({tableName:e,db:t}){try{await this.getTable(t,e);let[n]=await this.select(t,`SHOW CREATE TABLE ${ae(e)}`);return n?.statement??""}catch(n){throw this.wrapError(n)}}async getTableColumns({tableName:e,db:t}){try{return await this.getTable(t,e),(await this.getColumns(t,e)).map(a=>({columnName:a.name,dataType:Fn(a.type),dataTypeLabel:Qr(a.type),isNullable:ki(a.type),columnDefault:a.default_expression||null,isPrimaryKey:a.is_in_sorting_key===1,isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:/^Enum(8|16)\(/.test(qt(a.type))?[...a.type.matchAll(/'((?:[^'\\]|\\.)*)'\s*=/g)].map(s=>s[1]??""):null}))}catch(n){throw this.wrapError(n)}}async addColumn(e){let{tableName:t,columnName:n,db:a}=e;if(e.isUnique)throw new d(400,{message:"ClickHouse does not enforce UNIQUE constraints"});try{if(await this.getTable(a,t),(await this.getColumns(a,t)).some(i=>i.name===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let o=cr({...e,isPrimaryKey:!1},await this.isAtLeast(a,25,3));await this.command(a,`ALTER TABLE ${ae(t)} ADD COLUMN ${o}`)}catch(s){throw this.wrapError(s)}}async deleteColumn({tableName:e,columnName:t,db:n}){try{if((await this.getColumn(n,e,t)).is_in_sorting_key)throw new d(400,{message:`"${t}" is part of the sorting key and cannot be dropped`});return await this.command(n,`ALTER TABLE ${ae(e)} DROP COLUMN ${ae(t)}`),{deletedCount:1}}catch(a){throw this.wrapError(a)}}async alterColumn(e){let{tableName:t,columnName:n,db:a}=e;try{let s=await this.getColumn(a,t,n),o=cr({...e,columnName:n,isPrimaryKey:s.is_in_sorting_key===1},await this.isAtLeast(a,25,3));await this.command(a,`ALTER TABLE ${ae(t)} MODIFY COLUMN ${o}`)}catch(s){throw this.wrapError(s)}}async renameColumn({tableName:e,columnName:t,newColumnName:n,db:a}){try{if(await this.getColumn(a,e,t),(await this.getColumns(a,e)).some(o=>o.name===n))throw new d(409,{message:`Column "${n}" already exists in table "${e}"`});await this.command(a,`ALTER TABLE ${ae(e)} RENAME COLUMN ${ae(t)} TO ${ae(n)}`)}catch(s){throw this.wrapError(s)}}async addRecord({db:e,params:t}){if(!Object.keys(t.data).length)throw new d(400,{message:"No data provided for insert"});return await this.insertRows(e,t.tableName,[t.data]),{insertedCount:1}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t?.length)throw new d(400,{message:"At least one record is required"});return await this.insertRows(n,e,t),{success:!0,message:`Bulk insert completed: ${t.length} records inserted`,successCount:t.length,failureCount:0}}async updateRecords(e){throw new d(400,{message:M.clickhouse.rowMutationReason})}async deleteRecords(e){throw new d(400,{message:M.clickhouse.rowMutationReason})}async forceDeleteRecords(e){throw new d(400,{message:M.clickhouse.rowMutationReason})}async executeQuery({query:e,db:t}){let n=e.trim().replace(/;+\s*$/,"");if(!n)throw new d(400,{message:"Query is required"});let a=performance.now();try{let s=await It(t),o=n.replace(/^(\s*(--[^\n]*\n|\/\*[\s\S]*?\*\/))*/,"").match(/^\s*(\w+)/)?.[1]?.toUpperCase();if(o&&["SELECT","WITH","SHOW","DESC","DESCRIBE","EXPLAIN","EXISTS"].includes(o)){let l=await s.query({query:n,format:"JSON"}),{meta:u=[],data:m}=await l.json();return{columns:u.map(p=>p.name),rows:m,rowCount:m.length,duration:performance.now()-a,message:m.length===0?"OK":void 0}}let{summary:i}=await s.command({query:n,clickhouse_settings:fd}),c=Number(i?.written_rows??0);return{columns:[],rows:[],rowCount:c,duration:performance.now()-a,message:`OK (${c} rows affected)`}}catch(s){throw this.wrapError(s)}}async getServerLogs({db:e}){let t=await It(e),n=async a=>{try{return await(await t.query({query:`${Me} ${a}`,format:"JSONEachRow",clickhouse_settings:{log_queries:0}})).json()}catch(s){if(s instanceof Mi&&s.type==="UNKNOWN_TABLE")return null;throw s}};try{let a=await n(`SELECT toUnixTimestamp64Milli(event_time_microseconds) AS ms, type, query_duration_ms,
32
32
  query, exception, exception_code, user, query_id, read_rows,
33
33
  formatReadableSize(memory_usage) AS memory
34
34
  FROM system.query_log
@@ -39,10 +39,10 @@ var Bl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var Pt=(r,e)=>{f
39
39
  WHERE event_date >= yesterday()
40
40
  AND level IN ('Fatal', 'Critical', 'Error', 'Warning')
41
41
  AND logger_name NOT IN ('executeQuery', 'TCPHandler', 'HTTPHandler')
42
- ORDER BY event_time_microseconds DESC LIMIT ${500}`);if(!a&&!s)return ne("query_log and text_log are both off in the server config.");let o=[...(a??[]).reverse().map(i=>{let c=i.type!=="QueryFinish";return{ts:new Date(Number(i.ms)).toISOString(),level:c?"error":"info",rawLevel:i.type,code:c?String(i.exception_code):void 0,message:c?i.exception:i.query,durationMs:Number(i.query_duration_ms),statement:c?i.query:void 0,detail:he({user:i.user,query_id:i.query_id,read_rows:i.read_rows,memory:i.memory})}}),...(s??[]).reverse().map(i=>({ts:new Date(Number(i.ms)).toISOString(),level:pd[i.level]??"info",rawLevel:i.level,source:i.logger_name,message:i.message,detail:he({query_id:i.query_id})}))];return{available:!0,source:s?"system.query_log + system.text_log":"system.query_log",entries:Oe(o)}}catch(a){if(a instanceof Pi&&a.type==="ACCESS_DENIED")return ne("Reading the server log needs: GRANT SELECT ON system.query_log TO <user>; and the same on system.text_log.");throw this.wrapError(a)}}async select(e,t,n={}){return(await(await Ot(e)).query({query:t,query_params:n,format:"JSONEachRow"})).json()}async command(e,t,n={},a={}){await(await Ot(e)).command({query:t,query_params:n,clickhouse_settings:a})}buildPageQuery(e,t){let{tableName:n,filters:a=[],sort:s=[],order:o="asc",limit:i=50,cursor:c}=e,{clause:l,values:u}=Ii(a),m=xi(s,o,t),p=c?this.decodeOffsetCursor(c):0,f=u.length;return{sql:`SELECT * FROM ${ae(n)} ${l} ${m} LIMIT {p${f+1}:UInt64} OFFSET {p${f}:UInt64}`,values:[...u,p,i+1],countSql:`SELECT count() AS total FROM ${ae(n)} ${l}`,countValues:u}}async findTable(e,t){let[n]=await this.select(e,"SELECT engine, sorting_key FROM system.tables WHERE database = currentDatabase() AND name = {table:String}",{table:t});return n}async getTable(e,t){let n=await this.findTable(e,t);if(!n)throw new d(404,{message:`Table "${t}" does not exist`});return n}getColumns(e,t){return this.select(e,`SELECT name, type, default_expression, is_in_sorting_key
42
+ ORDER BY event_time_microseconds DESC LIMIT ${500}`);if(!a&&!s)return ne("query_log and text_log are both off in the server config.");let o=[...(a??[]).reverse().map(i=>{let c=i.type!=="QueryFinish";return{ts:new Date(Number(i.ms)).toISOString(),level:c?"error":"info",rawLevel:i.type,code:c?String(i.exception_code):void 0,message:c?i.exception:i.query,durationMs:Number(i.query_duration_ms),statement:c?i.query:void 0,detail:ge({user:i.user,query_id:i.query_id,read_rows:i.read_rows,memory:i.memory})}}),...(s??[]).reverse().map(i=>({ts:new Date(Number(i.ms)).toISOString(),level:hd[i.level]??"info",rawLevel:i.level,source:i.logger_name,message:i.message,detail:ge({query_id:i.query_id})}))];return{available:!0,source:s?"system.query_log + system.text_log":"system.query_log",entries:Ie(o)}}catch(a){if(a instanceof Mi&&a.type==="ACCESS_DENIED")return ne("Reading the server log needs: GRANT SELECT ON system.query_log TO <user>; and the same on system.text_log.");throw this.wrapError(a)}}async select(e,t,n={}){return(await(await It(e)).query({query:t,query_params:n,format:"JSONEachRow"})).json()}async command(e,t,n={},a={}){await(await It(e)).command({query:t,query_params:n,clickhouse_settings:a})}buildPageQuery(e,t){let{tableName:n,filters:a=[],sort:s=[],order:o="asc",limit:i=50,cursor:c}=e,{clause:l,values:u}=Li(a),m=Pi(s,o,t),p=c?this.decodeOffsetCursor(c):0,f=u.length;return{sql:`SELECT * FROM ${ae(n)} ${l} ${m} LIMIT {p${f+1}:UInt64} OFFSET {p${f}:UInt64}`,values:[...u,p,i+1],countSql:`SELECT count() AS total FROM ${ae(n)} ${l}`,countValues:u}}async findTable(e,t){let[n]=await this.select(e,"SELECT engine, sorting_key FROM system.tables WHERE database = currentDatabase() AND name = {table:String}",{table:t});return n}async getTable(e,t){let n=await this.findTable(e,t);if(!n)throw new d(404,{message:`Table "${t}" does not exist`});return n}getColumns(e,t){return this.select(e,`SELECT name, type, default_expression, is_in_sorting_key
43
43
  FROM system.columns
44
44
  WHERE database = currentDatabase() AND table = {table:String}
45
- ORDER BY position`,{table:t})}async getColumn(e,t,n){await this.getTable(e,t);let a=(await this.getColumns(e,t)).find(s=>s.name===n);if(!a)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});return a}async insertRows(e,t,n){try{await this.getTable(e,t);let a=new Map((await this.getColumns(e,t)).map(o=>[o.name,o.type])),s=n.map(o=>Object.fromEntries(Object.entries(o).flatMap(([i,c])=>{let l=a.get(i);if(!l)throw new d(400,{message:`Column "${i}" does not exist in table "${t}"`});let u=dd(c,l);return u===null&&!$i(l)?[]:[[i,u]]})));await(await Ot(e)).insert({table:ae(t),values:s,format:"JSONEachRow",clickhouse_settings:{date_time_input_format:"best_effort"}})}catch(a){throw this.wrapError(a)}}async isAtLeast(e,t,n){let a=await Ot(e),s=this.serverVersion.get(a);if(!s){let[c]=await this.select(e,"SELECT version() AS version");s=(c?.version??"0.0").split(".").map(Number),this.serverVersion.set(a,s)}let[o=0,i=0]=s;return o>t||o===t&&i>=n}makeCursor(e){return this.encodeCursor({values:{_offset:e},sortColumns:["_offset"]})}decodeOffsetCursor(e){return Number(this.decodeCursor(e)?.values._offset??0)}}});function ki(r){let e=[],t=[];for(let n of r){let a=I(n.columnName),s=n.value.toLowerCase()==="null";switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${n.operator} ?`),t.push(n.value);break;case"is":s?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(n.value));break;case"is not":s?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(n.value));break;case"like":case"not like":case"ilike":case"not ilike":e.push(`CAST(${a} AS VARCHAR) ${n.operator.toUpperCase()} ?`),t.push(n.value);break}}return{conditions:e,values:t}}function qi(r,e,t){let n=[],a=[],s=[],o=[];for(let i of r){let c=I(i.column),l=e[i.column]??null,{descending:u,nullsLast:m}=vi(i,t),p=l===null?m?null:`${c} IS NOT NULL`:`${c} ${u?"<":">"} ?${m?` OR ${c} IS NULL`:""}`;p&&(n.push(`(${[...s,`(${p})`].join(" AND ")})`),a.push(...o,...l===null?[]:[l])),l===null?s.push(`${c} IS NULL`):(s.push(`${c} = ?`),o.push(l))}return{clause:n.length?`(${n.join(" OR ")})`:"FALSE",values:a}}function cr(r,e){let t=r.toLowerCase().trim(),a={serial:"INTEGER",serial4:"INTEGER",bigserial:"BIGINT",serial8:"BIGINT",smallserial:"SMALLINT",serial2:"SMALLINT",int:"INTEGER",int4:"INTEGER",integer:"INTEGER",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",numeric:"DECIMAL(18, 3)",decimal:"DECIMAL(18, 3)",real:"FLOAT",float4:"FLOAT",float:"DOUBLE","double precision":"DOUBLE",float8:"DOUBLE",money:"DECIMAL(19, 4)",boolean:"BOOLEAN",bool:"BOOLEAN",text:"VARCHAR",varchar:"VARCHAR","character varying":"VARCHAR",char:"VARCHAR",character:"VARCHAR",bpchar:"VARCHAR",uuid:"UUID",json:"JSON",jsonb:"JSON",xml:"VARCHAR",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"TIMESTAMP","timestamp without time zone":"TIMESTAMP","timestamp with time zone":"TIMESTAMPTZ",timestamptz:"TIMESTAMPTZ",interval:"INTERVAL",bytea:"BLOB",inet:"VARCHAR",cidr:"VARCHAR",macaddr:"VARCHAR",macaddr8:"VARCHAR",point:"VARCHAR",line:"VARCHAR",polygon:"VARCHAR"}[t]??r.toUpperCase();return e?`${a}[]`:a}var I,is,vi,Ui,fd,cs,Bi=R(()=>{"use strict";y();I=r=>`"${r.replaceAll('"','""')}"`,is=r=>r.length?`WHERE ${r.join(" AND ")}`:"";vi=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),Ui=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=vi(t,e);return`${I(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;fd=new Set(["serial","serial4","bigserial","serial8","smallserial","serial2"]),cs=r=>fd.has(r.toLowerCase().trim())});import{statSync as yd}from"fs";var zt,hd,Fi,us,Te,ls,Sn,lr,gd,bd,Td,Ed,ur,Ki=R(()=>{"use strict";y();j();Xe();Ze();Rt();Q();Bi();zt="database_name = current_database() AND schema_name = current_schema()",hd=r=>{let{DuckDBTypeId:e}=He("duckdb");return r===e.BIGINT||r===e.UBIGINT||r===e.HUGEINT||r===e.UHUGEINT},Fi=r=>{let e=r.columnTypes(),t=r.columnNames().filter((a,s)=>hd(e[s].typeId)),n=r.getRowObjectsJson();for(let a of n)for(let s of t){let o=a[s];typeof o=="string"&&Number.isSafeInteger(Number(o))&&(a[s]=Number(o))}return n},us=r=>r==null?null:typeof r=="string"||typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?r:r instanceof Date?r.toISOString():JSON.stringify(r),Te=async(r,e,t=[])=>Fi(await r.runAndReadAll(e,t.map(us))),ls=async(r,e,t=[])=>(await r.runAndReadAll(e,t.map(us))).rowsChanged,Sn=async(r,e)=>{await r.run("BEGIN TRANSACTION");try{let t=await e();return await r.run("COMMIT"),t}catch(t){throw await r.run("ROLLBACK").catch(()=>{}),t}},lr=r=>r.map(()=>"?").join(", "),gd=r=>r.columns.map((e,t)=>`c.${I(e)} = p.${I(r.referencedColumns[t])}`).join(" AND "),bd=r=>r.flatMap(e=>[...(e.column_default??"").matchAll(/nextval\('([^']+)'\)/g)].map(t=>t[1])),Td=[["Dependency Error","DuckDB cannot alter or rename a table that another table's foreign key references or that has an index. Drop the referencing table or the index first."],["has a CHECK constraint","DuckDB cannot change the type of a column that has a CHECK constraint."],["an index depends on it","DuckDB cannot alter or drop a column covered by an index, primary key or unique constraint."]],Ed=new Set(["CASCADE","SET NULL","SET DEFAULT"]),ur=class extends re{async runQuery(e,t,n){return as(a=>Te(a,t,n))}quoteIdentifier(e){return I(e)}mapToUniversalType(e){return vn(e)}mapFromUniversalType(e){return{text:"VARCHAR",number:"DOUBLE",boolean:"BOOLEAN",json:"JSON",date:"TIMESTAMP",array:"VARCHAR[]",enum:"VARCHAR"}[e]??"VARCHAR"}buildTableDataQuery(e){throw new Error("DuckDbAdapter.getTableData builds its own query")}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){throw new Error("DuckDbAdapter.getTableData builds its own cursors")}wrapError(e){if(e instanceof Error){let t=Td.find(([n])=>e.message.includes(n));if(t)return new d(400,{message:`${t[1]} (${e.message})`,cause:e})}return super.wrapError(e)}withConnection(e){return as(e).catch(t=>{throw this.wrapError(t)})}async getTableData(e){let{tableName:t,limit:n=50,direction:a="asc",sort:s=[],order:o="asc",cursor:i,filters:c=[]}=e;return this.withConnection(async l=>{await this.requireColumns(l,t);let u=await this.primaryKey(l,t),m=this.orderTerms(s,o,u.length?u:["rowid"]),p=a==="desc",f=ki(c),b=i?this.decodeCursor(i):null,T=b?qi(m,b.values,p):null,h=Ui(m,p),w=u.length?"*":"*, rowid",S=is(T?[...f.conditions,T.clause]:f.conditions),[A]=await Te(l,`SELECT COUNT(*) AS total FROM ${I(t)} ${is(f.conditions)}`,f.values),N=await Te(l,`SELECT ${w} FROM ${I(t)} ${S} ${h} LIMIT ?`,[...f.values,...T?.values??[],n+1]),C=N.length>n,_=N.slice(0,n);p&&_.reverse();let D=X=>this.encodeCursor({values:Object.fromEntries(m.map(ee=>[ee.column,X[ee.column]])),sortColumns:m.map(ee=>ee.column)}),x=_[0],H=_.at(-1),$=p?!!i:C,J=p?C:!!i;return{data:_.map(X=>{if(u.length)return this.normalizeRow(X);let{rowid:ee,...P}=X;return this.normalizeRow(P)}),meta:{limit:n,total:Number(A?.total??0),hasNextPage:$,hasPreviousPage:J,nextCursor:$&&H?D(H):null,prevCursor:J&&x?D(x):null}}})}async getDatabasesList(){return this.withConnection(async e=>(await Te(e,"SELECT database_name, path FROM duckdb_databases() WHERE database_name = current_database()")).map(n=>({name:n.database_name,size:this.getFileSize(n.path),owner:"",encoding:"UTF-8"})))}async getCurrentDatabase(){return this.withConnection(async e=>{let[t]=await Te(e,"SELECT current_database() AS db");return{db:t.db}})}async getDatabaseConnectionInfo(){return this.withConnection(async e=>{let[t]=await Te(e,"SELECT current_database() AS db, version() AS version");return{host:null,port:null,user:"",database:t.db,version:`DuckDB ${t.version}`,active_connections:1,max_connections:1}})}async getTablesList(e){return this.withConnection(async t=>{let n=await Te(t,`SELECT table_name FROM duckdb_tables() WHERE ${zt} AND NOT temporary ORDER BY table_name`),a=[];for(let{table_name:s}of n){let[o]=await Te(t,`SELECT COUNT(*) AS count FROM ${I(s)}`);a.push({tableName:s,rowCount:Number(o?.count??0)})}return a})}async createTable({tableData:e}){let{tableName:t,fields:n,foreignKeys:a=[]}=e;for(let l of a){let u=[l.onUpdate,l.onDelete].find(m=>Ed.has(m));if(u)throw new d(400,{message:`DuckDB foreign keys do not support ${u} (on "${l.columnName}"). Use NO ACTION or RESTRICT.`})}let s=[],o=n.filter(l=>l.isPrimaryKey).map(l=>l.columnName),i=n.map(l=>{let u=`${I(l.columnName)} ${cr(l.columnType,l.isArray)}`;if(o.length===1&&l.isPrimaryKey&&(u+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(u+=" UNIQUE"),!l.isNullable&&!l.isPrimaryKey&&(u+=" NOT NULL"),l.isIdentity||cs(l.columnType)){let m=`${t}_${l.columnName}_seq`;s.push(m),u+=` DEFAULT nextval('${m.replaceAll("'","''")}')`}else l.defaultValue?.trim()&&(u+=` DEFAULT ${l.defaultValue.trim()}`);return u});o.length>1&&i.push(`PRIMARY KEY (${o.map(I).join(", ")})`);let c=a.map(l=>`FOREIGN KEY (${I(l.columnName)}) REFERENCES ${I(l.referencedTable)} (${I(l.referencedColumn)}) ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`);await this.withConnection(l=>Sn(l,async()=>{for(let u of s)await l.run(`CREATE SEQUENCE ${I(u)}`);await l.run(`CREATE TABLE ${I(t)} (${[...i,...c].join(", ")})`)}))}async deleteTable({tableName:e,cascade:t}){return this.withConnection(async n=>{let a=await this.requireColumns(n,e),s=(await this.foreignKeys(n,"referenced_table",e)).filter(i=>i.table!==e);if(s.length){if(t)throw new d(400,{message:`DuckDB cannot drop "${e}" while ${[...new Set(s.map(i=>`"${i.table}"`))].join(", ")} reference it, and it cannot remove those foreign keys. Delete the referencing tables first.`});return{deletedCount:0,fkViolation:!0,relatedRecords:await this.sampleReferencingRows(n,s)}}let[o]=await Te(n,`SELECT COUNT(*) AS count FROM ${I(e)}`);await n.run(`DROP TABLE ${I(e)}`);for(let i of bd(a))await n.run(`DROP SEQUENCE IF EXISTS ${I(i)}`).catch(()=>{});return{deletedCount:Number(o?.count??0),fkViolation:!1,relatedRecords:[]}})}async renameTable({tableName:e,newTableName:t}){this.assertDifferentTableName(e,t),await this.withConnection(async n=>{if(await this.requireColumns(n,e),(await this.columns(n,t)).length)throw new d(409,{message:`Table "${t}" already exists`});await n.run(`ALTER TABLE ${I(e)} RENAME TO ${I(t)}`)})}async getTableSchema({tableName:e}){return this.withConnection(async t=>{let[n]=await Te(t,`SELECT sql FROM duckdb_tables() WHERE ${zt} AND table_name = ?`,[e]);if(!n)throw new d(404,{message:`Table "${e}" does not exist`});return n.sql})}async getTableColumns({tableName:e}){return this.withConnection(async t=>{let n=await this.requireColumns(t,e),a=new Set(await this.primaryKey(t,e)),s=new Map((await this.foreignKeys(t,"table_name",e)).flatMap(o=>o.columns.map((i,c)=>[i,{table:o.referencedTable,column:o.referencedColumns[c]}])));return n.map(o=>{let i=s.get(o.column_name),c=a.has(o.column_name);return{columnName:o.column_name,dataType:vn(o.data_type),dataTypeLabel:Vr(o.data_type),isNullable:o.is_nullable&&!c,columnDefault:o.column_default,isPrimaryKey:c,isForeignKey:!!i,referencedTable:i?.table??null,referencedColumn:i?.column??null,enumValues:o.data_type.startsWith("ENUM(")?[...o.data_type.matchAll(/'((?:[^']|'')*)'/g)].map(l=>l[1].replaceAll("''","'")):null}})})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isNullable:o,isUnique:i,isPrimaryKey:c}=e;if(i||c)throw new d(400,{message:`DuckDB cannot add a ${c?"PRIMARY KEY":"UNIQUE"} column to an existing table. Add the column without it, or recreate the table.`});let l=e.isIdentity||cs(a)?`${t}_${n}_seq`:null,u=`${I(n)} ${cr(a,e.isArray)}`;l?u+=` DEFAULT nextval('${l.replaceAll("'","''")}')`:s?.trim()&&(u+=` DEFAULT ${s.trim()}`),await this.withConnection(async m=>{if((await this.requireColumns(m,t)).some(f=>f.column_name===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});await Sn(m,async()=>{l&&await m.run(`CREATE SEQUENCE ${I(l)}`),await m.run(`ALTER TABLE ${I(t)} ADD COLUMN ${u}`),o||await m.run(`ALTER TABLE ${I(t)} ALTER COLUMN ${I(n)} SET NOT NULL`).catch(f=>{throw String(f).includes("NOT NULL constraint failed")?new d(400,{message:`Column "${n}" needs a default value to be NOT NULL, because "${t}" already has rows.`}):f})})})}async deleteColumn({tableName:e,columnName:t}){return await this.withConnection(async n=>{await this.requireColumn(n,e,t),await n.run(`ALTER TABLE ${I(e)} DROP COLUMN ${I(t)}`)}),{deletedCount:1}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o}=e,i=`ALTER TABLE ${I(t)} ALTER COLUMN ${I(n)}`;await this.withConnection(async c=>{await this.requireColumn(c,t,n),await Sn(c,async()=>{await c.run(`${i} TYPE ${cr(a,!1)}`),await c.run(`${i} ${s?"DROP":"SET"} NOT NULL`),await c.run(o?.trim()?`${i} SET DEFAULT ${o.trim()}`:`${i} DROP DEFAULT`)})})}async renameColumn({tableName:e,columnName:t,newColumnName:n}){await this.withConnection(async a=>{if((await this.requireColumn(a,e,t)).some(o=>o.column_name===n))throw new d(409,{message:`Column "${n}" already exists in table "${e}"`});await a.run(`ALTER TABLE ${I(e)} RENAME COLUMN ${I(t)} TO ${I(n)}`)})}async getTableIndexes({tableName:e}){return this.withConnection(t=>this.listIndexes(t,e))}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o}=e;await this.withConnection(async i=>{let c=await this.requireColumns(i,t),l=a.find(u=>!c.some(m=>m.column_name===u));if(l!==void 0)throw new d(400,{message:`Column "${l}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});try{await i.run(`CREATE ${s?"UNIQUE ":""}INDEX ${I(n)} ON ${I(t)} (${a.map(I).join(", ")})`)}catch(u){throw u instanceof Error&&/already exists|Data contains duplicates/.test(u.message)?new d(409,{message:u.message,cause:u}):u}})}async dropIndex({tableName:e,indexName:t}){await this.withConnection(async n=>{if(!(await this.listIndexes(n,e)).some(s=>s.indexName===t))throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});await n.run(`DROP INDEX ${I(t)}`)})}async addRecord({params:e}){let{tableName:t,data:n}=e,a=Object.keys(n);if(!a.length)throw new d(400,{message:"No data provided for insert"});return{insertedCount:await this.withConnection(o=>ls(o,`INSERT INTO ${I(t)} (${a.map(I).join(", ")}) VALUES (${lr(a)})`,Object.values(n)))}}async updateRecords({params:e}){let{tableName:t}=e,n=this.resolveKeyColumns(e),a=this.groupUpdatesByKey(e,n);return{updatedCount:await this.withConnection(o=>Sn(o,async()=>{this.assertWholeKey(await this.primaryKey(o,t),n);let i=0;for(let{keyValues:c,rowUpdates:l}of a){let u=await ls(o,`UPDATE ${I(t)} SET ${l.map(m=>`${I(m.columnName)} = ${m.useDefault?"DEFAULT":"?"}`).join(", ")} WHERE ${n.map(m=>`${I(m)} = ?`).join(" AND ")}`,[...l.filter(m=>!m.useDefault).map(m=>m.value),...c]);if(u===0)throw new d(404,{message:`Record with ${this.describeKey(n,c)} not found in table "${t}"`});i+=u}return i}))}}async deleteRecords({tableName:e,primaryKeys:t}){let n=t[0]?.columnName;if(!n)throw new d(400,{message:"Primary key column name is required"});let a=t.map(s=>s.value);return this.withConnection(async s=>{this.assertDeletableKey(await this.primaryKey(s,e));try{return{deletedCount:await ls(s,`DELETE FROM ${I(e)} WHERE ${I(n)} IN (${lr(a)})`,a),fkViolation:!1,relatedRecords:[]}}catch(o){if(!(o instanceof Error)||!o.message.includes("Violates foreign key constraint"))throw o;let i=[];for(let c of await this.foreignKeys(s,"referenced_table",e)){let l=await Te(s,`SELECT c.* FROM ${I(c.table)} c JOIN ${I(e)} p ON ${gd(c)} WHERE p.${I(n)} IN (${lr(a)}) LIMIT 100`,a);l.length&&i.push({tableName:c.table,columnName:c.columns.join(", "),constraintName:c.constraintName,records:l})}return{deletedCount:0,fkViolation:!0,relatedRecords:i}}})}async forceDeleteRecords(e){let t=await this.deleteRecords(e);if(t.fkViolation)throw new d(400,{message:"DuckDB cannot atomically delete a row and its dependent rows. Delete the dependent rows explicitly, then retry. Nothing was deleted."});return{deletedCount:t.deletedCount}}async bulkInsertRecords({tableName:e,records:t}){if(!t?.length)throw new d(400,{message:"At least one record is required"});let n=Object.keys(t[0]),a=await this.withConnection(s=>Sn(s,async()=>{let o=await s.prepare(`INSERT INTO ${I(e)} (${n.map(I).join(", ")}) VALUES (${lr(n)})`);for(let i of t)o.bind(n.map(c=>us(i[c]))),await o.run();return t.length}));return{success:!0,message:`Bulk insert completed: ${a} records inserted`,successCount:a,failureCount:0}}async executeQuery({query:e}){if(!e?.trim())throw new d(400,{message:"Query is required"});return this.withConnection(async t=>{let{ResultReturnType:n,StatementType:a}=He("duckdb"),s=performance.now(),o=await t.extractStatements(e);if(o.count!==1)throw new d(400,{message:"The query runner runs one statement at a time. Run each statement separately."});let i=await o.prepare(0);try{if(i.statementType===a.TRANSACTION)throw new d(400,{message:"Transactions cannot span query-runner requests. BEGIN, COMMIT, and ROLLBACK are not supported."});let c=await i.runAndReadAll(),l=performance.now()-s;if(c.returnType===n.CHANGED_ROWS)return{columns:[],rows:[],rowCount:c.rowsChanged,duration:l,message:`OK (${c.rowsChanged} rows affected)`};if(c.returnType===n.NOTHING)return{columns:[],rows:[],rowCount:0,duration:l,message:"OK"};let u=Fi(c);return{columns:c.columnNames(),rows:u,rowCount:u.length,duration:l,message:u.length===0?"OK":void 0}}finally{i.destroySync()}})}getFileSize(e){if(!e)return"in-memory";try{let t=yd(e).size;return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}catch{return"N/A"}}columns(e,t){return Te(e,`SELECT column_name, data_type, is_nullable, column_default FROM duckdb_columns() WHERE ${zt} AND table_name = ? ORDER BY column_index`,[t])}async requireColumns(e,t){let n=await this.columns(e,t);if(!n.length)throw new d(404,{message:`Table "${t}" does not exist`});return n}async requireColumn(e,t,n){let a=await this.requireColumns(e,t);if(!a.some(s=>s.column_name===n))throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});return a}async listIndexes(e,t){return await this.requireColumns(e,t),(await Te(e,`SELECT index_name, is_unique, expressions::VARCHAR[] AS keys, sql FROM duckdb_indexes() WHERE ${zt} AND table_name = ? ORDER BY index_name`,[t])).map(a=>({indexName:a.index_name,columns:a.keys.map(s=>s.startsWith('"')?s.slice(1,-1).replaceAll('""','"'):s.startsWith("(")?s.slice(1,-1):s),isUnique:a.is_unique,method:null,kind:"index",definition:a.keys.some(s=>s.startsWith("("))?a.sql:null}))}async primaryKey(e,t){let[n]=await Te(e,`SELECT constraint_column_names AS columns FROM duckdb_constraints() WHERE ${zt} AND table_name = ? AND constraint_type = 'PRIMARY KEY'`,[t]);return n?.columns??[]}async foreignKeys(e,t,n){return Te(e,`SELECT constraint_name AS "constraintName", table_name AS "table", constraint_column_names AS "columns", referenced_table AS "referencedTable", referenced_column_names AS "referencedColumns" FROM duckdb_constraints() WHERE ${zt} AND constraint_type = 'FOREIGN KEY' AND ${t} = ?`,[n])}async sampleReferencingRows(e,t){let n=[];for(let a of t){let s=await Te(e,`SELECT * FROM ${I(a.table)} WHERE ${a.columns.map(o=>`${I(o)} IS NOT NULL`).join(" AND ")} LIMIT 100`);s.length&&n.push({tableName:a.table,columnName:a.columns.join(", "),constraintName:a.constraintName,records:s})}return n}}});var wd,Hi,ji=R(()=>{"use strict";y();wd=new Set(["admin","config","local"]),Hi=(r,e)=>{let t=r.filter(n=>!wd.has(n.name)||n.name===e);return!e||t.some(n=>n.name===e)?t:[...t,{name:e,sizeOnDisk:0}]}});function Wi(r){if(!r||r.length===0)return{};let e=[];for(let t of r){let n=t.columnName,a=Sd(t.value),s=t.operator.toLowerCase();if(n)switch(s){case"=":e.push({[n]:a});break;case"!=":e.push({[n]:{$ne:a}});break;case">":e.push({[n]:{$gt:a}});break;case">=":e.push({[n]:{$gte:a}});break;case"<":e.push({[n]:{$lt:a}});break;case"<=":e.push({[n]:{$lte:a}});break;case"is":e.push({[n]:a});break;case"is not":e.push({[n]:{$ne:a}});break;case"like":e.push({[n]:{$regex:mr(String(a)),$options:""}});break;case"not like":e.push({[n]:{$not:{$regex:mr(String(a)),$options:""}}});break;case"ilike":e.push({[n]:{$regex:mr(String(a)),$options:"i"}});break;case"not ilike":e.push({[n]:{$not:{$regex:mr(String(a)),$options:"i"}}});break;default:e.push({[n]:a});break}}return e.length?{$and:e}:{}}function ms(r,e){return r?Array.isArray(r)?r.length===0?{_id:1}:Object.fromEntries(r.map(t=>[t.columnName,t.direction==="desc"?-1:1])):typeof r=="string"&&r.length>0?{[r]:e==="desc"?-1:1}:{_id:1}:{_id:1}}function ds(r){return Buffer.from(JSON.stringify({offset:r})).toString("base64url")}function Vi(r){if(!r)return 0;try{let e=JSON.parse(Buffer.from(r,"base64url").toString("utf-8"));return typeof e.offset=="number"?e.offset:0}catch{return 0}}var mr,Sd,Yi=R(()=>{"use strict";y();Je();mr=r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Sd=r=>{let e=r.trim();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;let t=Number(e);return!Number.isNaN(t)&&e!==""?t:bn(e)?Tn(e):e}});var dr,Gt,Cd,Rd,Nd,Ad,Dd,zi,Cn,_d,Qi,Od,Id,xd,Qt,Ld,Pd,$d,Gi,Md,pr,Ji=R(()=>{"use strict";y();Xe();Ze();mt();Je();Q();Ye();ji();ze();Yi();dr=r=>r instanceof Date?r.toISOString():typeof r=="bigint"?r.toString():r&&typeof r=="object"?"_bsontype"in r&&r._bsontype==="ObjectId"?r.toHexString():Array.isArray(r)?r.map(e=>dr(e)):Object.fromEntries(Object.entries(r).map(([e,t])=>[e,dr(t)])):r,Gt=r=>dr(r),Cd=["sparse","expireAfterSeconds","partialFilterExpression","collation"],Rd=r=>{let e=r.name??"",t=e==="_id_",n=Object.values(r.key),a=r.weights,s=a?Object.keys(r.key).flatMap(c=>c==="_fts"?Object.keys(a):c==="_ftsx"?[]:[c]):Object.keys(r.key),o={};a&&(o.weights=a);for(let c of Cd){let l=r[c];l!=null&&l!==!1&&(o[c]=dr(l))}let i=n.every(c=>c===1)&&Object.keys(o).length===0;return{indexName:e,columns:s,isUnique:t||r.unique===!0,isSparse:r.sparse,expireAfterSeconds:r.expireAfterSeconds,method:n.find(c=>typeof c=="string")??null,kind:t?"primary":"index",definition:i?null:JSON.stringify({key:r.key,...o})}},Nd=new Set([85,86,11e3]),Ad=r=>r instanceof Date?"date":r&&typeof r=="object"?Array.isArray(r)?"array":"_bsontype"in r?"text":"json":typeof r=="boolean"?"boolean":typeof r=="number"||typeof r=="bigint"?"number":"text",Dd=r=>{switch(r){case"number":return"numeric";case"boolean":return"boolean";case"json":return"json";case"date":return"date";case"array":return"array";case"enum":return"enum";default:return"text"}},zi=r=>typeof r=="string"&&bn(r),Cn=r=>Tn(r),_d=r=>{if(!Number.isFinite(r))return"n/a";let e=["B","KB","MB","GB","TB"],t=r,n=0;for(;t>=1024&&n<e.length-1;)t/=1024,n++;return`${t.toFixed(1)} ${e[n]}`},Qi=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Od=r=>{let e=r.trim();if(Qi.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Id=r=>{if(r==null)return"null";if(r instanceof Date)return"date";if(typeof r=="boolean")return"bool";if(typeof r=="number")return Number.isInteger(r)?"int":"double";if(typeof r=="bigint")return"long";if(Array.isArray(r))return"array";if(typeof r=="object"){let e=r._bsontype;return e==="ObjectId"?"objectId":e==="Decimal128"?"decimal":e==="Binary"?"binData":e==="Timestamp"?"timestamp":e?e.toLowerCase():"object"}return"string"},xd=(r,e)=>{if(r!=null&&r.trim()!=="")try{return JSON.parse(r)}catch{return r}switch(e){case"string":return"";case"int":case"long":case"double":case"decimal":return 0;case"bool":return!1;case"array":return[];case"object":return{};case"date":return new Date;default:return null}},Qt=r=>{if(r._id&&typeof r._id=="string")return{...r,_id:Cn(r._id)};if(r._id&&typeof r._id=="object"){let e=r._id;if(Array.isArray(e.$in))return{...r,_id:{...e,$in:e.$in.map(t=>typeof t=="string"?Cn(t):t)}};if(Array.isArray(e.$nin))return{...r,_id:{...e,$nin:e.$nin.map(t=>typeof t=="string"?Cn(t):t)}}}return r},Ld=13,Pd=8e3,$d=51803,Gi={F:"fatal",E:"error",W:"warning",I:"info"},Md=({t:r,s:e,c:t,id:n,ctx:a,msg:s,attr:o={}})=>{if(n===$d){let{ns:i,command:c,durationMillis:l,...u}=o,m=Object.fromEntries(Object.entries(c??{}).filter(([p])=>!p.startsWith("$")&&p!=="lsid"));return{ts:new Date(r.$date).toISOString(),level:Gi[e]??"debug",rawLevel:e,source:t,message:`${i} ${JSON.stringify(m)}`,durationMs:Number(l),detail:he({id:n,ctx:a,...u})}}return{ts:new Date(r.$date).toISOString(),level:Gi[e]??"debug",rawLevel:e,source:t,message:s,detail:he({id:n,ctx:a,...o})}},pr=class extends re{runQuery(){throw new d(501,{message:"runQuery is not supported for MongoDB"})}buildTableDataQuery(e){throw new d(501,{message:"buildTableDataQuery is not supported for MongoDB"})}normalizeRows(e){return e.map(t=>this.normalizeRow(Gt(t)))}buildCursors(){return{nextCursor:null,prevCursor:null}}quoteIdentifier(e){return e}mapToUniversalType(e){switch(e.toLowerCase()){case"int":case"long":case"double":case"decimal":return"number";case"bool":return"boolean";case"date":return"date";case"array":return"array";case"object":return"json";default:return"text"}}mapFromUniversalType(e){switch(e){case"number":return"double";case"boolean":return"bool";case"date":return"date";case"array":return"array";case"json":return"object";default:return"string"}}wrapError(e){if(e instanceof d)return e;if(e instanceof Error){let t=e.name??"";if(t==="MongoNetworkError"||t==="MongoServerSelectionError"||t==="MongoTopologyClosedError")return new d(503,{message:e.message,cause:e})}return super.wrapError(e)}async getTableData(e){try{let{tableName:t,db:n,cursor:a,limit:s,direction:o="asc",sort:i,order:c,filters:l}=e,m=(await te(n)).collection(t),p=Wi(l??[]),f=ms(i??"",c),b=s&&s>0?s:50,T=Vi(a),h=Number.isFinite(T)&&T>=0?T:0,w=o==="desc"?Math.max(h-b,0):h,[S,A]=await Promise.all([m.countDocuments(p),m.find(p).sort(f).skip(w).limit(b).toArray()]),N=A.map(D=>Gt(D)),C=w+b,_=Math.max(w-b,0);return{data:N,meta:{limit:b,total:S,hasNextPage:C<S,hasPreviousPage:w>0,nextCursor:C<S?ds(C):null,prevCursor:w>0?ds(_):null}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let o=(await(await te(t)).collection(e).find({}).limit(1e4).toArray()).map(c=>Gt(c));return{cols:Array.from(new Set(o.flatMap(c=>Object.keys(c)))),rows:o}}catch(n){throw this.wrapError(n)}}async getDatabasesList(){try{let a=(await(await rr()).db().admin().listDatabases()).databases??[];if(!a[0])throw new d(500,{message:"No databases returned from MongoDB"});return Hi(a,ar()).map(s=>({name:s.name,size:_d(s.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:ar()}}async getDatabaseConnectionInfo(){try{let t=(await rr()).db().admin(),n=_e(ve()),a={};try{a=await t.serverStatus()}catch(s){Z("warn","db_server_status_failed",ye(s))}return{host:n.host,port:n.port,user:"n/a",database:ar(),version:a.version??"unknown",active_connections:a.connections?.current??0,max_connections:(a.connections?.current??0)+(a.connections?.available??0)}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=await te(e),n=await t.listCollections().toArray(),a=[];for(let s of n){let o=await t.collection(s.name).estimatedDocumentCount();a.push({tableName:s.name,rowCount:o})}return a}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){try{let n=e?.tableName??"",a=await te(t);if((await a.listCollections({name:n}).toArray()).length>0)throw new d(400,{message:`Collection "${n}" already exists`});let o=e?.fields??[];if(o.length===0){await a.createCollection(n);return}let i={},c=[];for(let l of o){let u=Od(l.columnType);if(!Qi.has(u))throw new d(400,{message:`Unsupported MongoDB BSON type "${l.columnType}" for field "${l.columnName}"`});l.isArray?i[l.columnName]={bsonType:"array",...u!=="array"?{items:{bsonType:u}}:{}}:i[l.columnName]={bsonType:u},l.isNullable||c.push(l.columnName)}await a.createCollection(n,{validator:{$jsonSchema:{bsonType:"object",required:c,properties:i,additionalProperties:!0}},validationAction:"error"})}catch(n){throw this.wrapError(n)}}async deleteTable({tableName:e,db:t}){try{let a=(await te(t)).collection(e),s=await a.estimatedDocumentCount();return await a.drop(),{deletedCount:s,fkViolation:!1,relatedRecords:[]}}catch(n){throw this.wrapError(n)}}async renameTable(e){try{let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await te(a);if((await s.listCollections({name:t}).toArray()).length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if((await s.listCollections({name:n}).toArray()).length>0)throw new d(409,{message:`Collection "${n}" already exists`});await s.collection(t).rename(n)}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,db:t}){try{let n=await te(t);if((await n.listCollections({name:e}).toArray()).length===0)throw new d(404,{message:`Collection "${e}" does not exist`});let s=n.collection(e),o=await s.find({}).limit(200).toArray(),i=await s.estimatedDocumentCount(),c=new Map,l=new Map;for(let f of o)for(let[b,T]of Object.entries(f)){let h=Id(T);c.has(b)||(c.set(b,new Set),l.set(b,0)),c.get(b)?.add(h),l.set(b,(l.get(b)??0)+1)}let u={},m=[];for(let[f,b]of c.entries()){let T=l.get(f)??0,h=Array.from(b).filter(S=>S!=="null"),w=b.has("null")||T<o.length;T===o.length&&o.length>0&&!w&&m.push(f),u[f]=h.length===1?{bsonType:w?[h[0],"null"]:h[0]}:{bsonType:w?[...h,"null"]:h}}let p={collection:e,estimatedDocumentCount:i,sampledDocuments:o.length,jsonSchema:{bsonType:"object",required:m.length>0?m:void 0,properties:u}};return JSON.stringify(p,null,2)}catch(n){throw this.wrapError(n)}}async getTableColumns({tableName:e,db:t}){try{let s=await(await te(t)).collection(e).find({}).limit(200).toArray(),o=s.length,i=new Map,c=(l,u)=>{let m=Ad(u);if(!i.has(l))i.set(l,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=i.get(l);p.types.add(m),p.presentCount+=1}};for(let l of s)for(let[u,m]of Object.entries(l)){if(m==null){if(!i.has(u))i.set(u,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=i.get(u);p.nullable=!0,p.presentCount+=1}continue}c(u,m)}if(o>0)for(let l of i.values())l.presentCount<o&&(l.nullable=!0);return i.has("_id")||i.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:o}),Array.from(i.entries()).map(([l,u])=>{let m=u.types.values().next().value??"text";return{columnName:l,dataType:m,dataTypeLabel:Dd(m),isNullable:u.nullable,columnDefault:null,isPrimaryKey:l==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}catch(n){throw this.wrapError(n)}}async addColumn(e){try{let{tableName:t,columnName:n,columnType:a,defaultValue:s,isNullable:o,db:i}=e,c=await te(i),l=await c.listCollections({name:t}).toArray();if(l.length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if(await c.collection(t).findOne({[n]:{$exists:!0}}))throw new d(409,{message:`Field "${n}" already exists in collection "${t}"`});let m=xd(s,a);await c.collection(t).updateMany({},{$set:{[n]:m}});let f=l[0].options?.validator?.$jsonSchema??{},b={...f.properties??{},[n]:{bsonType:o?[a,"null"]:a}},T=[...f.required??[]];!o&&!T.includes(n)&&T.push(n),await c.command({collMod:t,validator:{$jsonSchema:{...f,bsonType:"object",properties:b,...T.length>0?{required:T}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async deleteColumn({tableName:e,columnName:t,db:n}){try{return{deletedCount:(await(await te(n)).collection(e).updateMany({},{$unset:{[t]:""}})).modifiedCount}}catch(a){throw this.wrapError(a)}}async alterColumn(e){try{let{tableName:t,columnName:n,columnType:a,isNullable:s,db:o}=e,i=await te(o),c=await i.listCollections({name:t}).toArray();if(c.length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if(n==="_id")throw new d(400,{message:'Cannot alter the "_id" field'});let u=c[0].options?.validator?.$jsonSchema??{},m={...u.properties??{}},p=[...u.required??[]];m[n]={bsonType:s?[a,"null"]:a};let f=p.indexOf(n);!s&&f===-1?p.push(n):s&&f!==-1&&p.splice(f,1),await i.command({collMod:t,validator:{$jsonSchema:{...u,bsonType:"object",properties:m,...p.length>0?{required:p}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async renameColumn(e){try{let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await te(s);if((await o.listCollections({name:t}).toArray()).length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if(n==="_id")throw new d(400,{message:'Cannot rename the "_id" field'});if(!await o.collection(t).findOne({[n]:{$exists:!0}}))throw new d(404,{message:`Field "${n}" does not exist in collection "${t}"`});if(await o.collection(t).findOne({[a]:{$exists:!0}}))throw new d(409,{message:`Field "${a}" already exists in collection "${t}"`});await o.collection(t).updateMany({[n]:{$exists:!0}},{$rename:{[n]:a}})}catch(t){throw this.wrapError(t)}}async getServerLogs(){try{let e=await rr(),{log:t}=await e.db("admin").command({getLog:"global"}),n=t.flatMap(a=>{try{return[Md(JSON.parse(a))]}catch{return[]}});return{available:!0,source:"getLog: 'global' (the server keeps the newest 1024 entries)",entries:Oe(n)}}catch(e){let t=e.code;if(t===Ld)return ne("Reading the server log needs the getLog action, which the clusterMonitor role grants.");if(t===Pd)return ne("This Atlas tier does not allow getLog.");throw this.wrapError(e)}}async listIndexes(e,t){if((await e.listCollections({name:t}).toArray()).length===0)throw new d(404,{message:`Collection "${t}" does not exist`});return(await e.collection(t).listIndexes().toArray()).map(Rd).sort((s,o)=>+(o.kind==="primary")-+(s.kind==="primary")||(s.indexName<o.indexName?-1:s.indexName>o.indexName?1:0))}async getTableIndexes({tableName:e,db:t}){try{return await this.listIndexes(await te(t),e)}catch(n){throw this.wrapError(n)}}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o,db:i}=e;try{if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});let c=a.find(m=>m.split(".").some(p=>p===""||p.startsWith("$")));if(c!==void 0)throw new d(400,{message:`Invalid field path "${c}"`});if(new Set(a).size!==a.length)throw new d(400,{message:"A field can appear only once in an index"});let l=await te(i);if((await this.listIndexes(l,t)).some(m=>m.indexName===n))throw new d(409,{message:`Index "${n}" already exists on collection "${t}"`});await l.collection(t).createIndex(new Map(a.map(m=>[m,1])),{name:n,unique:s})}catch(c){let l=c.code;throw c instanceof Error&&typeof l=="number"&&Nd.has(l)?new d(409,{message:c.message,cause:c}):this.wrapError(c)}}async dropIndex({tableName:e,indexName:t,db:n}){try{let a=await te(n),s=(await this.listIndexes(a,e)).find(o=>o.indexName===t);if(!s)throw new d(404,{message:`Index "${t}" does not exist on collection "${e}"`});if(s.kind==="primary")throw new d(400,{message:`Index "${t}" backs the primary key and cannot be dropped`});await a.collection(e).dropIndex(t)}catch(a){throw this.wrapError(a)}}async addRecord({db:e,params:t}){try{let{tableName:n,data:a}=t,o=(await te(e)).collection(n),i=Gt(a);if((i._id===""||i._id===null)&&delete i._id,!(await o.insertOne(i)).insertedId)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:1}}catch(n){throw this.wrapError(n)}}async updateRecords({db:e,params:t}){try{let{tableName:n}=t,s=(await te(e)).collection(n),o=0,i=this.resolveKeyColumns(t).map(l=>l||"_id"),c=this.groupUpdatesByKey({...t,primaryKeys:i},i);for(let{keyValues:l,rowUpdates:u}of c){if(u.some(b=>b.columnName==="_id"))throw new d(400,{message:'The "_id" field is immutable and cannot be updated.'});let m={};for(let b of u)m[b.columnName]=b.value;let p={};i.forEach((b,T)=>{let h=l[T];p[b]=b==="_id"&&zi(h)?Cn(h):h});let f=await s.updateOne(p,{$set:m});if(f.matchedCount===0)throw new d(404,{message:`Record with ${this.describeKey(i,l)} not found in "${n}"`});o+=f.modifiedCount}return{updatedCount:o}}catch(n){throw this.wrapError(n)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:n,db:a}=e,o=(await te(a)).collection(t),i=n[0]?.columnName??"_id",c=n.map(u=>i==="_id"&&zi(u.value)?Cn(u.value):u.value);return{deletedCount:(await o.deleteMany({[i]:{$in:c}})).deletedCount??0,fkViolation:!1,relatedRecords:[]}}catch(t){throw this.wrapError(t)}}async forceDeleteRecords(e){return{deletedCount:(await this.deleteRecords(e)).deletedCount}}async bulkInsertRecords(e){try{let{tableName:t,records:n,db:a}=e;if(!n||n.length===0)throw new d(400,{message:"At least one record is required"});let o=(await te(a)).collection(t),i=n.map(l=>{let u=Gt(l);return(u._id===""||u._id===null)&&delete u._id,u}),c=await o.insertMany(i,{ordered:!1});return{success:!0,message:`Successfully inserted ${c.insertedCount} record${c.insertedCount!==1?"s":""}`,successCount:c.insertedCount,failureCount:n.length-c.insertedCount}}catch(t){throw this.wrapError(t)}}async executeQuery({query:e,db:t}){try{if(!e?.trim())throw new d(400,{message:"Query is required"});let n;try{n=JSON.parse(e)}catch{throw new d(400,{message:"Mongo query must be valid JSON"})}if(!n.collection||!n.operation)throw new d(400,{message:"Mongo query must include collection and operation"});let s=(await te(t)).collection(n.collection),o=performance.now(),i=[],c=0,l;switch(n.operation){case"find":{let f=Qt(n.filter??{}),b=s.find(f,n.options??{});b.sort(n.sort??ms("",void 0)),n.skip&&b.skip(n.skip),n.limit&&b.limit(n.limit),i=await b.toArray(),c=i.length;break}case"aggregate":{i=await s.aggregate(n.pipeline??[],n.options??{}).toArray(),c=i.length;break}case"insertOne":{let f=n.document;if(!f)throw new d(400,{message:"document is required"});c=(await s.insertOne(f)).insertedId?1:0,l="OK";break}case"insertMany":{let f=n.document;if(!Array.isArray(f))throw new d(400,{message:"document array is required"});c=(await s.insertMany(f)).insertedCount??0,l="OK";break}case"updateOne":{let f=Qt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let b=await s.updateOne(f,n.update,n.options??{});c=b.matchedCount??0,l=`OK (${b.modifiedCount??0} modified)`;break}case"updateMany":{let f=Qt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let b=await s.updateMany(f,n.update,n.options??{});c=b.matchedCount??0,l=`OK (${b.modifiedCount??0} modified)`;break}case"deleteOne":{let f=Qt(n.filter??{});c=(await s.deleteOne(f,n.options??{})).deletedCount??0,l="OK";break}case"deleteMany":{let f=Qt(n.filter??{});c=(await s.deleteMany(f,n.options??{})).deletedCount??0,l="OK";break}case"count":{let f=Qt(n.filter??{});c=await s.countDocuments(f),i=[{count:c}],l="OK";break}default:throw new d(400,{message:"Unsupported Mongo operation"})}let u=performance.now()-o,m=i.map(f=>Gt(f));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:c,duration:u,message:l}}catch(n){throw this.wrapError(n)}}}});function ps(r,e=0){if(r.length===0)return{clause:"",values:[],nextIdx:e};let t=[],n=[],a=e;for(let s of r){let o=fr(s.columnName);switch(s.operator){case"=":case"!=":case">":case">=":case"<":case"<=":t.push(`${o} ${s.operator} @p${a}`),n.push(s.value),a++;break;case"is":s.value.toLowerCase()==="null"?t.push(`${o} IS NULL`):(t.push(`${o} = @p${a}`),n.push(s.value),a++);break;case"is not":s.value.toLowerCase()==="null"?t.push(`${o} IS NOT NULL`):(t.push(`${o} != @p${a}`),n.push(s.value),a++);break;case"like":case"ilike":t.push(`${o} LIKE @p${a}`),n.push(s.value),a++;break;case"not like":case"not ilike":t.push(`${o} NOT LIKE @p${a}`),n.push(s.value),a++;break;default:break}}return t.length===0?{clause:"",values:[],nextIdx:e}:{clause:`WHERE ${t.join(" AND ")}`,values:n,nextIdx:a}}function fs(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${fr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${fr(r)} ${e?.toUpperCase()||"ASC"}`:""}function Xi(r,e,t){let n=fs(r,e),a=Array.isArray(r)?r.map(i=>i.columnName):[r],s=(Array.isArray(r)?r[0]?.direction??e:e).toUpperCase(),o=t.filter(i=>!a.includes(i)).map(i=>`${fr(i)} ${s}`).join(", ");return o?n?`${n}, ${o}`:`ORDER BY ${o}`:n||"ORDER BY (SELECT NULL)"}function ys(r,e){if(e)return"NVARCHAR(MAX)";let t=r.toLowerCase().trim();return{serial:"INT IDENTITY(1,1)",serial4:"INT IDENTITY(1,1)",bigserial:"BIGINT IDENTITY(1,1)",serial8:"BIGINT IDENTITY(1,1)",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",tinyint:"TINYINT",numeric:"NUMERIC",decimal:"DECIMAL",real:"REAL",float4:"REAL",float:"FLOAT","double precision":"FLOAT",float8:"FLOAT",money:"MONEY",boolean:"BIT",bool:"BIT",text:"NVARCHAR(MAX)",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"UNIQUEIDENTIFIER",json:"NVARCHAR(MAX)",jsonb:"NVARCHAR(MAX)",xml:"XML",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME2","timestamp without time zone":"DATETIME2","timestamp with time zone":"DATETIMEOFFSET",timestamptz:"DATETIMEOFFSET",interval:"VARCHAR(255)",bytea:"VARBINARY(MAX)",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)"}[t]||r.toUpperCase()}function hs(r,e){let t=r.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("newid()")?e.toUpperCase().includes("UNIQUEIDENTIFIER")?"NEWID()":null:t.includes("getdate")||t.includes("current_timestamp")?"GETDATE()":r.trim():t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":r.trim()}function Zi(r,e={}){let t=ys(r.columnType,r.isArray??!1),n=`[${r.columnName}] ${t}`;if(r.isIdentity&&!t.includes("IDENTITY")&&(n+=" IDENTITY(1,1)"),!r.isNullable&&!r.isPrimaryKey&&(n+=" NOT NULL"),r.defaultValue?.trim()&&!t.includes("IDENTITY")){let a=hs(r.defaultValue,t);a!==null&&(n+=` DEFAULT ${a}`)}return e.includeUnique&&r.isUnique&&!r.isPrimaryKey&&(n+=" UNIQUE"),e.includePrimaryKey&&r.isPrimaryKey&&(n+=" PRIMARY KEY"),n}var fr,ec=R(()=>{"use strict";y();fr=r=>`[${r.replaceAll("]","]]")}]`});var kd,vd,Ud,tc,qd,Bd,Fd,Kd,Hd,jd,Wd,Ne,yr,nc=R(()=>{"use strict";y();j();Xe();Ze();mt();Q();ze();ec();kd=547,vd=15003,Ud=27219,tc=r=>[229,230].includes(r.number??0),qd=2812,Bd=/^Error: (\d+), Severity: (\d+), State: (\d+)\.?$/,Fd=3726,Kd=1913,Hd=1505,jd=new Set([1919,1978]),Wd=3723,Ne=r=>`[${r.replaceAll("]","]]")}]`,yr=class extends re{async runQuery(e,t,n){let s=(await F(e)).request();return n.forEach((i,c)=>{s.input(`p${c}`,i)}),(await s.query(t)).recordset}quoteIdentifier(e){return Ne(e)}mapToUniversalType(e){return Mn(e)}mapFromUniversalType(e){return{text:"NVARCHAR(MAX)",number:"INT",boolean:"BIT",json:"NVARCHAR(MAX)",date:"DATETIME2",array:"NVARCHAR(MAX)",enum:"NVARCHAR(255)"}[e]??"NVARCHAR(MAX)"}buildTableDataQuery(e){let{tableName:t,filters:n=[],sort:a=[],order:s="asc",limit:o=50,cursor:i}=e,{clause:c,values:l,nextIdx:u}=ps(n,0),m=fs(a,s)||"ORDER BY (SELECT NULL)",p=i?this.decodeOffsetCursor(i):0,f=`SELECT * FROM ${Ne(t)} ${c} ${m} OFFSET @p${u} ROWS FETCH NEXT @p${u+1} ROWS ONLY`,b=[...l,p,o+1],T=`SELECT COUNT(*) as total FROM ${Ne(t)} ${c}`;return{sql:f,values:b,countSql:T,countValues:l}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){let{cursor:a,limit:s=50}=e,o=a?this.decodeOffsetCursor(a):0;return{nextCursor:n?this.makeCursor(o+s):null,prevCursor:o>0?this.makeCursor(Math.max(0,o-s)):null}}async getTableData(e){try{let{tableName:t,db:n,limit:a=50,sort:s=[],order:o="asc",cursor:i,filters:c=[]}=e,l=await F(n),u=i?this.decodeOffsetCursor(i):0,{clause:m,values:p,nextIdx:f}=ps(c,0),[b,{total:T,estimated:h}]=await Promise.all([this.getPrimaryKeyColumns(l,t),this.countRows(l,t,m,p)]),w=Xi(s,o,b),S=l.request();p.forEach((_,D)=>{S.input(`p${D}`,_)}),S.input(`p${f}`,u),S.input(`p${f+1}`,a+1);let N=(await S.query(`SELECT * FROM ${Ne(t)} ${m} ${w} OFFSET @p${f} ROWS FETCH NEXT @p${f+1} ROWS ONLY`)).recordset,C=N.length>a;return C&&(N=N.slice(0,a)),{data:N,meta:{limit:a,total:T,...h&&{totalEstimated:!0},hasNextPage:C,hasPreviousPage:u>0,nextCursor:C?this.makeCursor(u+a):null,prevCursor:u>0?this.makeCursor(Math.max(0,u-a)):null}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{let t=await(await F()).request().query(`
45
+ ORDER BY position`,{table:t})}async getColumn(e,t,n){await this.getTable(e,t);let a=(await this.getColumns(e,t)).find(s=>s.name===n);if(!a)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});return a}async insertRows(e,t,n){try{await this.getTable(e,t);let a=new Map((await this.getColumns(e,t)).map(o=>[o.name,o.type])),s=n.map(o=>Object.fromEntries(Object.entries(o).flatMap(([i,c])=>{let l=a.get(i);if(!l)throw new d(400,{message:`Column "${i}" does not exist in table "${t}"`});let u=yd(c,l);return u===null&&!ki(l)?[]:[[i,u]]})));await(await It(e)).insert({table:ae(t),values:s,format:"JSONEachRow",clickhouse_settings:{date_time_input_format:"best_effort"}})}catch(a){throw this.wrapError(a)}}async isAtLeast(e,t,n){let a=await It(e),s=this.serverVersion.get(a);if(!s){let[c]=await this.select(e,"SELECT version() AS version");s=(c?.version??"0.0").split(".").map(Number),this.serverVersion.set(a,s)}let[o=0,i=0]=s;return o>t||o===t&&i>=n}makeCursor(e){return this.encodeCursor({values:{_offset:e},sortColumns:["_offset"]})}decodeOffsetCursor(e){return Number(this.decodeCursor(e)?.values._offset??0)}}});function Ui(r){let e=[],t=[];for(let n of r){let a=I(n.columnName),s=n.value.toLowerCase()==="null";switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${n.operator} ?`),t.push(n.value);break;case"is":s?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(n.value));break;case"is not":s?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(n.value));break;case"like":case"not like":case"ilike":case"not ilike":e.push(`CAST(${a} AS VARCHAR) ${n.operator.toUpperCase()} ?`),t.push(n.value);break}}return{conditions:e,values:t}}function Fi(r,e,t){let n=[],a=[],s=[],o=[];for(let i of r){let c=I(i.column),l=e[i.column]??null,{descending:u,nullsLast:m}=qi(i,t),p=l===null?m?null:`${c} IS NOT NULL`:`${c} ${u?"<":">"} ?${m?` OR ${c} IS NULL`:""}`;p&&(n.push(`(${[...s,`(${p})`].join(" AND ")})`),a.push(...o,...l===null?[]:[l])),l===null?s.push(`${c} IS NULL`):(s.push(`${c} = ?`),o.push(l))}return{clause:n.length?`(${n.join(" OR ")})`:"FALSE",values:a}}function ur(r,e){let t=r.toLowerCase().trim(),a={serial:"INTEGER",serial4:"INTEGER",bigserial:"BIGINT",serial8:"BIGINT",smallserial:"SMALLINT",serial2:"SMALLINT",int:"INTEGER",int4:"INTEGER",integer:"INTEGER",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",numeric:"DECIMAL(18, 3)",decimal:"DECIMAL(18, 3)",real:"FLOAT",float4:"FLOAT",float:"DOUBLE","double precision":"DOUBLE",float8:"DOUBLE",money:"DECIMAL(19, 4)",boolean:"BOOLEAN",bool:"BOOLEAN",text:"VARCHAR",varchar:"VARCHAR","character varying":"VARCHAR",char:"VARCHAR",character:"VARCHAR",bpchar:"VARCHAR",uuid:"UUID",json:"JSON",jsonb:"JSON",xml:"VARCHAR",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"TIMESTAMP","timestamp without time zone":"TIMESTAMP","timestamp with time zone":"TIMESTAMPTZ",timestamptz:"TIMESTAMPTZ",interval:"INTERVAL",bytea:"BLOB",inet:"VARCHAR",cidr:"VARCHAR",macaddr:"VARCHAR",macaddr8:"VARCHAR",point:"VARCHAR",line:"VARCHAR",polygon:"VARCHAR"}[t]??r.toUpperCase();return e?`${a}[]`:a}var I,ls,qi,Bi,gd,us,Ki=C(()=>{"use strict";y();I=r=>`"${r.replaceAll('"','""')}"`,ls=r=>r.length?`WHERE ${r.join(" AND ")}`:"";qi=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),Bi=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=qi(t,e);return`${I(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;gd=new Set(["serial","serial4","bigserial","serial8","smallserial","serial2"]),us=r=>gd.has(r.toLowerCase().trim())});import{statSync as bd}from"fs";var Qt,Td,Hi,ds,Ee,ms,Cn,mr,Ed,wd,Sd,Rd,dr,ji=C(()=>{"use strict";y();j();Ze();et();bt();Q();Ki();Qt="database_name = current_database() AND schema_name = current_schema()",Td=r=>{let{DuckDBTypeId:e}=We("duckdb");return r===e.BIGINT||r===e.UBIGINT||r===e.HUGEINT||r===e.UHUGEINT},Hi=r=>{let e=r.columnTypes(),t=r.columnNames().filter((a,s)=>Td(e[s].typeId)),n=r.getRowObjectsJson();for(let a of n)for(let s of t){let o=a[s];typeof o=="string"&&Number.isSafeInteger(Number(o))&&(a[s]=Number(o))}return n},ds=r=>r==null?null:typeof r=="string"||typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?r:r instanceof Date?r.toISOString():JSON.stringify(r),Ee=async(r,e,t=[])=>Hi(await r.runAndReadAll(e,t.map(ds))),ms=async(r,e,t=[])=>(await r.runAndReadAll(e,t.map(ds))).rowsChanged,Cn=async(r,e)=>{await r.run("BEGIN TRANSACTION");try{let t=await e();return await r.run("COMMIT"),t}catch(t){throw await r.run("ROLLBACK").catch(()=>{}),t}},mr=r=>r.map(()=>"?").join(", "),Ed=r=>r.columns.map((e,t)=>`c.${I(e)} = p.${I(r.referencedColumns[t])}`).join(" AND "),wd=r=>r.flatMap(e=>[...(e.column_default??"").matchAll(/nextval\('([^']+)'\)/g)].map(t=>t[1])),Sd=[["Dependency Error","DuckDB cannot alter or rename a table that another table's foreign key references or that has an index. Drop the referencing table or the index first."],["has a CHECK constraint","DuckDB cannot change the type of a column that has a CHECK constraint."],["an index depends on it","DuckDB cannot alter or drop a column covered by an index, primary key or unique constraint."]],Rd=new Set(["CASCADE","SET NULL","SET DEFAULT"]),dr=class extends re{async runQuery(e,t,n){return os(a=>Ee(a,t,n))}quoteIdentifier(e){return I(e)}mapToUniversalType(e){return qn(e)}mapFromUniversalType(e){return{text:"VARCHAR",number:"DOUBLE",boolean:"BOOLEAN",json:"JSON",date:"TIMESTAMP",array:"VARCHAR[]",enum:"VARCHAR"}[e]??"VARCHAR"}buildTableDataQuery(e){throw new Error("DuckDbAdapter.getTableData builds its own query")}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){throw new Error("DuckDbAdapter.getTableData builds its own cursors")}wrapError(e){if(e instanceof Error){let t=Sd.find(([n])=>e.message.includes(n));if(t)return new d(400,{message:`${t[1]} (${e.message})`,cause:e})}return super.wrapError(e)}withConnection(e){return os(e).catch(t=>{throw this.wrapError(t)})}async getTableData(e){let{tableName:t,limit:n=50,direction:a="asc",sort:s=[],order:o="asc",cursor:i,filters:c=[]}=e;return this.withConnection(async l=>{await this.requireColumns(l,t);let u=await this.primaryKey(l,t),m=this.orderTerms(s,o,u.length?u:["rowid"]),p=a==="desc",f=Ui(c),b=i?this.decodeCursor(i):null,T=b?Fi(m,b.values,p):null,h=Bi(m,p),w=u.length?"*":"*, rowid",S=ls(T?[...f.conditions,T.clause]:f.conditions),[A]=await Ee(l,`SELECT COUNT(*) AS total FROM ${I(t)} ${ls(f.conditions)}`,f.values),N=await Ee(l,`SELECT ${w} FROM ${I(t)} ${S} ${h} LIMIT ?`,[...f.values,...T?.values??[],n+1]),R=N.length>n,_=N.slice(0,n);p&&_.reverse();let D=X=>this.encodeCursor({values:Object.fromEntries(m.map(ee=>[ee.column,X[ee.column]])),sortColumns:m.map(ee=>ee.column)}),x=_[0],H=_.at(-1),$=p?!!i:R,J=p?R:!!i;return{data:_.map(X=>{if(u.length)return this.normalizeRow(X);let{rowid:ee,...P}=X;return this.normalizeRow(P)}),meta:{limit:n,total:Number(A?.total??0),hasNextPage:$,hasPreviousPage:J,nextCursor:$&&H?D(H):null,prevCursor:J&&x?D(x):null}}})}async getDatabasesList(){return this.withConnection(async e=>(await Ee(e,"SELECT database_name, path FROM duckdb_databases() WHERE database_name = current_database()")).map(n=>({name:n.database_name,size:this.getFileSize(n.path),owner:"",encoding:"UTF-8"})))}async getCurrentDatabase(){return this.withConnection(async e=>{let[t]=await Ee(e,"SELECT current_database() AS db");return{db:t.db}})}async getDatabaseConnectionInfo(){return this.withConnection(async e=>{let[t]=await Ee(e,"SELECT current_database() AS db, version() AS version");return{host:null,port:null,user:"",database:t.db,version:`DuckDB ${t.version}`,active_connections:1,max_connections:1}})}async getTablesList(e){return this.withConnection(async t=>{let n=await Ee(t,`SELECT table_name FROM duckdb_tables() WHERE ${Qt} AND NOT temporary ORDER BY table_name`),a=[];for(let{table_name:s}of n){let[o]=await Ee(t,`SELECT COUNT(*) AS count FROM ${I(s)}`);a.push({tableName:s,rowCount:Number(o?.count??0)})}return a})}async createTable({tableData:e}){let{tableName:t,fields:n,foreignKeys:a=[]}=e;for(let l of a){let u=[l.onUpdate,l.onDelete].find(m=>Rd.has(m));if(u)throw new d(400,{message:`DuckDB foreign keys do not support ${u} (on "${l.columnName}"). Use NO ACTION or RESTRICT.`})}let s=[],o=n.filter(l=>l.isPrimaryKey).map(l=>l.columnName),i=n.map(l=>{let u=`${I(l.columnName)} ${ur(l.columnType,l.isArray)}`;if(o.length===1&&l.isPrimaryKey&&(u+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(u+=" UNIQUE"),!l.isNullable&&!l.isPrimaryKey&&(u+=" NOT NULL"),l.isIdentity||us(l.columnType)){let m=`${t}_${l.columnName}_seq`;s.push(m),u+=` DEFAULT nextval('${m.replaceAll("'","''")}')`}else l.defaultValue?.trim()&&(u+=` DEFAULT ${l.defaultValue.trim()}`);return u});o.length>1&&i.push(`PRIMARY KEY (${o.map(I).join(", ")})`);let c=a.map(l=>`FOREIGN KEY (${I(l.columnName)}) REFERENCES ${I(l.referencedTable)} (${I(l.referencedColumn)}) ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`);await this.withConnection(l=>Cn(l,async()=>{for(let u of s)await l.run(`CREATE SEQUENCE ${I(u)}`);await l.run(`CREATE TABLE ${I(t)} (${[...i,...c].join(", ")})`)}))}async deleteTable({tableName:e,cascade:t}){return this.withConnection(async n=>{let a=await this.requireColumns(n,e),s=(await this.foreignKeys(n,"referenced_table",e)).filter(i=>i.table!==e);if(s.length){if(t)throw new d(400,{message:`DuckDB cannot drop "${e}" while ${[...new Set(s.map(i=>`"${i.table}"`))].join(", ")} reference it, and it cannot remove those foreign keys. Delete the referencing tables first.`});return{deletedCount:0,fkViolation:!0,relatedRecords:await this.sampleReferencingRows(n,s)}}let[o]=await Ee(n,`SELECT COUNT(*) AS count FROM ${I(e)}`);await n.run(`DROP TABLE ${I(e)}`);for(let i of wd(a))await n.run(`DROP SEQUENCE IF EXISTS ${I(i)}`).catch(()=>{});return{deletedCount:Number(o?.count??0),fkViolation:!1,relatedRecords:[]}})}async renameTable({tableName:e,newTableName:t}){this.assertDifferentTableName(e,t),await this.withConnection(async n=>{if(await this.requireColumns(n,e),(await this.columns(n,t)).length)throw new d(409,{message:`Table "${t}" already exists`});await n.run(`ALTER TABLE ${I(e)} RENAME TO ${I(t)}`)})}async getTableSchema({tableName:e}){return this.withConnection(async t=>{let[n]=await Ee(t,`SELECT sql FROM duckdb_tables() WHERE ${Qt} AND table_name = ?`,[e]);if(!n)throw new d(404,{message:`Table "${e}" does not exist`});return n.sql})}async getTableColumns({tableName:e}){return this.withConnection(async t=>{let n=await this.requireColumns(t,e),a=new Set(await this.primaryKey(t,e)),s=new Map((await this.foreignKeys(t,"table_name",e)).flatMap(o=>o.columns.map((i,c)=>[i,{table:o.referencedTable,column:o.referencedColumns[c]}])));return n.map(o=>{let i=s.get(o.column_name),c=a.has(o.column_name);return{columnName:o.column_name,dataType:qn(o.data_type),dataTypeLabel:zr(o.data_type),isNullable:o.is_nullable&&!c,columnDefault:o.column_default,isPrimaryKey:c,isForeignKey:!!i,referencedTable:i?.table??null,referencedColumn:i?.column??null,enumValues:o.data_type.startsWith("ENUM(")?[...o.data_type.matchAll(/'((?:[^']|'')*)'/g)].map(l=>l[1].replaceAll("''","'")):null}})})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isNullable:o,isUnique:i,isPrimaryKey:c}=e;if(i||c)throw new d(400,{message:`DuckDB cannot add a ${c?"PRIMARY KEY":"UNIQUE"} column to an existing table. Add the column without it, or recreate the table.`});let l=e.isIdentity||us(a)?`${t}_${n}_seq`:null,u=`${I(n)} ${ur(a,e.isArray)}`;l?u+=` DEFAULT nextval('${l.replaceAll("'","''")}')`:s?.trim()&&(u+=` DEFAULT ${s.trim()}`),await this.withConnection(async m=>{if((await this.requireColumns(m,t)).some(f=>f.column_name===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});await Cn(m,async()=>{l&&await m.run(`CREATE SEQUENCE ${I(l)}`),await m.run(`ALTER TABLE ${I(t)} ADD COLUMN ${u}`),o||await m.run(`ALTER TABLE ${I(t)} ALTER COLUMN ${I(n)} SET NOT NULL`).catch(f=>{throw String(f).includes("NOT NULL constraint failed")?new d(400,{message:`Column "${n}" needs a default value to be NOT NULL, because "${t}" already has rows.`}):f})})})}async deleteColumn({tableName:e,columnName:t}){return await this.withConnection(async n=>{await this.requireColumn(n,e,t),await n.run(`ALTER TABLE ${I(e)} DROP COLUMN ${I(t)}`)}),{deletedCount:1}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o}=e,i=`ALTER TABLE ${I(t)} ALTER COLUMN ${I(n)}`;await this.withConnection(async c=>{await this.requireColumn(c,t,n),await Cn(c,async()=>{await c.run(`${i} TYPE ${ur(a,!1)}`),await c.run(`${i} ${s?"DROP":"SET"} NOT NULL`),await c.run(o?.trim()?`${i} SET DEFAULT ${o.trim()}`:`${i} DROP DEFAULT`)})})}async renameColumn({tableName:e,columnName:t,newColumnName:n}){await this.withConnection(async a=>{if((await this.requireColumn(a,e,t)).some(o=>o.column_name===n))throw new d(409,{message:`Column "${n}" already exists in table "${e}"`});await a.run(`ALTER TABLE ${I(e)} RENAME COLUMN ${I(t)} TO ${I(n)}`)})}async getTableIndexes({tableName:e}){return this.withConnection(t=>this.listIndexes(t,e))}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o}=e;await this.withConnection(async i=>{let c=await this.requireColumns(i,t),l=a.find(u=>!c.some(m=>m.column_name===u));if(l!==void 0)throw new d(400,{message:`Column "${l}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});try{await i.run(`CREATE ${s?"UNIQUE ":""}INDEX ${I(n)} ON ${I(t)} (${a.map(I).join(", ")})`)}catch(u){throw u instanceof Error&&/already exists|Data contains duplicates/.test(u.message)?new d(409,{message:u.message,cause:u}):u}})}async dropIndex({tableName:e,indexName:t}){await this.withConnection(async n=>{if(!(await this.listIndexes(n,e)).some(s=>s.indexName===t))throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});await n.run(`DROP INDEX ${I(t)}`)})}async addRecord({params:e}){let{tableName:t,data:n}=e,a=Object.keys(n);if(!a.length)throw new d(400,{message:"No data provided for insert"});return{insertedCount:await this.withConnection(o=>ms(o,`INSERT INTO ${I(t)} (${a.map(I).join(", ")}) VALUES (${mr(a)})`,Object.values(n)))}}async updateRecords({params:e}){let{tableName:t}=e,n=this.resolveKeyColumns(e),a=this.groupUpdatesByKey(e,n);return{updatedCount:await this.withConnection(o=>Cn(o,async()=>{this.assertWholeKey(await this.primaryKey(o,t),n);let i=0;for(let{keyValues:c,rowUpdates:l}of a){let u=await ms(o,`UPDATE ${I(t)} SET ${l.map(m=>`${I(m.columnName)} = ${m.useDefault?"DEFAULT":"?"}`).join(", ")} WHERE ${n.map(m=>`${I(m)} = ?`).join(" AND ")}`,[...l.filter(m=>!m.useDefault).map(m=>m.value),...c]);if(u===0)throw new d(404,{message:`Record with ${this.describeKey(n,c)} not found in table "${t}"`});i+=u}return i}))}}async deleteRecords({tableName:e,primaryKeys:t}){let n=t[0]?.columnName;if(!n)throw new d(400,{message:"Primary key column name is required"});let a=t.map(s=>s.value);return this.withConnection(async s=>{this.assertDeletableKey(await this.primaryKey(s,e));try{return{deletedCount:await ms(s,`DELETE FROM ${I(e)} WHERE ${I(n)} IN (${mr(a)})`,a),fkViolation:!1,relatedRecords:[]}}catch(o){if(!(o instanceof Error)||!o.message.includes("Violates foreign key constraint"))throw o;let i=[];for(let c of await this.foreignKeys(s,"referenced_table",e)){let l=await Ee(s,`SELECT c.* FROM ${I(c.table)} c JOIN ${I(e)} p ON ${Ed(c)} WHERE p.${I(n)} IN (${mr(a)}) LIMIT 100`,a);l.length&&i.push({tableName:c.table,columnName:c.columns.join(", "),constraintName:c.constraintName,records:l})}return{deletedCount:0,fkViolation:!0,relatedRecords:i}}})}async forceDeleteRecords(e){let t=await this.deleteRecords(e);if(t.fkViolation)throw new d(400,{message:"DuckDB cannot atomically delete a row and its dependent rows. Delete the dependent rows explicitly, then retry. Nothing was deleted."});return{deletedCount:t.deletedCount}}async bulkInsertRecords({tableName:e,records:t}){if(!t?.length)throw new d(400,{message:"At least one record is required"});let n=Object.keys(t[0]),a=await this.withConnection(s=>Cn(s,async()=>{let o=await s.prepare(`INSERT INTO ${I(e)} (${n.map(I).join(", ")}) VALUES (${mr(n)})`);for(let i of t)o.bind(n.map(c=>ds(i[c]))),await o.run();return t.length}));return{success:!0,message:`Bulk insert completed: ${a} records inserted`,successCount:a,failureCount:0}}async executeQuery({query:e}){if(!e?.trim())throw new d(400,{message:"Query is required"});return this.withConnection(async t=>{let{ResultReturnType:n,StatementType:a}=We("duckdb"),s=performance.now(),o=await t.extractStatements(e);if(o.count!==1)throw new d(400,{message:"The query runner runs one statement at a time. Run each statement separately."});let i=await o.prepare(0);try{if(i.statementType===a.TRANSACTION)throw new d(400,{message:"Transactions cannot span query-runner requests. BEGIN, COMMIT, and ROLLBACK are not supported."});let c=await i.runAndReadAll(),l=performance.now()-s;if(c.returnType===n.CHANGED_ROWS)return{columns:[],rows:[],rowCount:c.rowsChanged,duration:l,message:`OK (${c.rowsChanged} rows affected)`};if(c.returnType===n.NOTHING)return{columns:[],rows:[],rowCount:0,duration:l,message:"OK"};let u=Hi(c);return{columns:c.columnNames(),rows:u,rowCount:u.length,duration:l,message:u.length===0?"OK":void 0}}finally{i.destroySync()}})}getFileSize(e){if(!e)return"in-memory";try{let t=bd(e).size;return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}catch{return"N/A"}}columns(e,t){return Ee(e,`SELECT column_name, data_type, is_nullable, column_default FROM duckdb_columns() WHERE ${Qt} AND table_name = ? ORDER BY column_index`,[t])}async requireColumns(e,t){let n=await this.columns(e,t);if(!n.length)throw new d(404,{message:`Table "${t}" does not exist`});return n}async requireColumn(e,t,n){let a=await this.requireColumns(e,t);if(!a.some(s=>s.column_name===n))throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});return a}async listIndexes(e,t){return await this.requireColumns(e,t),(await Ee(e,`SELECT index_name, is_unique, expressions::VARCHAR[] AS keys, sql FROM duckdb_indexes() WHERE ${Qt} AND table_name = ? ORDER BY index_name`,[t])).map(a=>({indexName:a.index_name,columns:a.keys.map(s=>s.startsWith('"')?s.slice(1,-1).replaceAll('""','"'):s.startsWith("(")?s.slice(1,-1):s),isUnique:a.is_unique,method:null,kind:"index",definition:a.keys.some(s=>s.startsWith("("))?a.sql:null}))}async primaryKey(e,t){let[n]=await Ee(e,`SELECT constraint_column_names AS columns FROM duckdb_constraints() WHERE ${Qt} AND table_name = ? AND constraint_type = 'PRIMARY KEY'`,[t]);return n?.columns??[]}async foreignKeys(e,t,n){return Ee(e,`SELECT constraint_name AS "constraintName", table_name AS "table", constraint_column_names AS "columns", referenced_table AS "referencedTable", referenced_column_names AS "referencedColumns" FROM duckdb_constraints() WHERE ${Qt} AND constraint_type = 'FOREIGN KEY' AND ${t} = ?`,[n])}async sampleReferencingRows(e,t){let n=[];for(let a of t){let s=await Ee(e,`SELECT * FROM ${I(a.table)} WHERE ${a.columns.map(o=>`${I(o)} IS NOT NULL`).join(" AND ")} LIMIT 100`);s.length&&n.push({tableName:a.table,columnName:a.columns.join(", "),constraintName:a.constraintName,records:s})}return n}}});var Cd,Wi,Vi=C(()=>{"use strict";y();Cd=new Set(["admin","config","local"]),Wi=(r,e)=>{let t=r.filter(n=>!Cd.has(n.name)||n.name===e);return!e||t.some(n=>n.name===e)?t:[...t,{name:e,sizeOnDisk:0}]}});function Yi(r){if(!r||r.length===0)return{};let e=[];for(let t of r){let n=t.columnName,a=Nd(t.value),s=t.operator.toLowerCase();if(n)switch(s){case"=":e.push({[n]:a});break;case"!=":e.push({[n]:{$ne:a}});break;case">":e.push({[n]:{$gt:a}});break;case">=":e.push({[n]:{$gte:a}});break;case"<":e.push({[n]:{$lt:a}});break;case"<=":e.push({[n]:{$lte:a}});break;case"is":e.push({[n]:a});break;case"is not":e.push({[n]:{$ne:a}});break;case"like":e.push({[n]:{$regex:pr(String(a)),$options:""}});break;case"not like":e.push({[n]:{$not:{$regex:pr(String(a)),$options:""}}});break;case"ilike":e.push({[n]:{$regex:pr(String(a)),$options:"i"}});break;case"not ilike":e.push({[n]:{$not:{$regex:pr(String(a)),$options:"i"}}});break;default:e.push({[n]:a});break}}return e.length?{$and:e}:{}}function ps(r,e){return r?Array.isArray(r)?r.length===0?{_id:1}:Object.fromEntries(r.map(t=>[t.columnName,t.direction==="desc"?-1:1])):typeof r=="string"&&r.length>0?{[r]:e==="desc"?-1:1}:{_id:1}:{_id:1}}function fs(r){return Buffer.from(JSON.stringify({offset:r})).toString("base64url")}function zi(r){if(!r)return 0;try{let e=JSON.parse(Buffer.from(r,"base64url").toString("utf-8"));return typeof e.offset=="number"?e.offset:0}catch{return 0}}var pr,Nd,Gi=C(()=>{"use strict";y();Xe();pr=r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Nd=r=>{let e=r.trim();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;let t=Number(e);return!Number.isNaN(t)&&e!==""?t:En(e)?wn(e):e}});var fr,Jt,Ad,Dd,_d,Od,Id,Qi,Nn,xd,Xi,Ld,Pd,$d,Xt,Md,kd,vd,Ji,Ud,yr,Zi=C(()=>{"use strict";y();Ze();et();dt();Xe();Q();ze();Vi();Ge();Gi();fr=r=>r instanceof Date?r.toISOString():typeof r=="bigint"?r.toString():r&&typeof r=="object"?"_bsontype"in r&&r._bsontype==="ObjectId"?r.toHexString():Array.isArray(r)?r.map(e=>fr(e)):Object.fromEntries(Object.entries(r).map(([e,t])=>[e,fr(t)])):r,Jt=r=>fr(r),Ad=["sparse","expireAfterSeconds","partialFilterExpression","collation"],Dd=r=>{let e=r.name??"",t=e==="_id_",n=Object.values(r.key),a=r.weights,s=a?Object.keys(r.key).flatMap(c=>c==="_fts"?Object.keys(a):c==="_ftsx"?[]:[c]):Object.keys(r.key),o={};a&&(o.weights=a);for(let c of Ad){let l=r[c];l!=null&&l!==!1&&(o[c]=fr(l))}let i=n.every(c=>c===1)&&Object.keys(o).length===0;return{indexName:e,columns:s,isUnique:t||r.unique===!0,isSparse:r.sparse,expireAfterSeconds:r.expireAfterSeconds,method:n.find(c=>typeof c=="string")??null,kind:t?"primary":"index",definition:i?null:JSON.stringify({key:r.key,...o})}},_d=new Set([85,86,11e3]),Od=r=>r instanceof Date?"date":r&&typeof r=="object"?Array.isArray(r)?"array":"_bsontype"in r?"text":"json":typeof r=="boolean"?"boolean":typeof r=="number"||typeof r=="bigint"?"number":"text",Id=r=>{switch(r){case"number":return"numeric";case"boolean":return"boolean";case"json":return"json";case"date":return"date";case"array":return"array";case"enum":return"enum";default:return"text"}},Qi=r=>typeof r=="string"&&En(r),Nn=r=>wn(r),xd=r=>{if(!Number.isFinite(r))return"n/a";let e=["B","KB","MB","GB","TB"],t=r,n=0;for(;t>=1024&&n<e.length-1;)t/=1024,n++;return`${t.toFixed(1)} ${e[n]}`},Xi=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Ld=r=>{let e=r.trim();if(Xi.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Pd=r=>{if(r==null)return"null";if(r instanceof Date)return"date";if(typeof r=="boolean")return"bool";if(typeof r=="number")return Number.isInteger(r)?"int":"double";if(typeof r=="bigint")return"long";if(Array.isArray(r))return"array";if(typeof r=="object"){let e=r._bsontype;return e==="ObjectId"?"objectId":e==="Decimal128"?"decimal":e==="Binary"?"binData":e==="Timestamp"?"timestamp":e?e.toLowerCase():"object"}return"string"},$d=(r,e)=>{if(r!=null&&r.trim()!=="")try{return JSON.parse(r)}catch{return r}switch(e){case"string":return"";case"int":case"long":case"double":case"decimal":return 0;case"bool":return!1;case"array":return[];case"object":return{};case"date":return new Date;default:return null}},Xt=r=>{if(r._id&&typeof r._id=="string")return{...r,_id:Nn(r._id)};if(r._id&&typeof r._id=="object"){let e=r._id;if(Array.isArray(e.$in))return{...r,_id:{...e,$in:e.$in.map(t=>typeof t=="string"?Nn(t):t)}};if(Array.isArray(e.$nin))return{...r,_id:{...e,$nin:e.$nin.map(t=>typeof t=="string"?Nn(t):t)}}}return r},Md=13,kd=8e3,vd=51803,Ji={F:"fatal",E:"error",W:"warning",I:"info"},Ud=({t:r,s:e,c:t,id:n,ctx:a,msg:s,attr:o={}})=>{if(n===vd){let{ns:i,command:c,durationMillis:l,...u}=o,m=Object.fromEntries(Object.entries(c??{}).filter(([p])=>!p.startsWith("$")&&p!=="lsid"));return{ts:new Date(r.$date).toISOString(),level:Ji[e]??"debug",rawLevel:e,source:t,message:`${i} ${JSON.stringify(m)}`,durationMs:Number(l),detail:ge({id:n,ctx:a,...u})}}return{ts:new Date(r.$date).toISOString(),level:Ji[e]??"debug",rawLevel:e,source:t,message:s,detail:ge({id:n,ctx:a,...o})}},yr=class extends re{runQuery(){throw new d(501,{message:"runQuery is not supported for MongoDB"})}buildTableDataQuery(e){throw new d(501,{message:"buildTableDataQuery is not supported for MongoDB"})}normalizeRows(e){return e.map(t=>this.normalizeRow(Jt(t)))}buildCursors(){return{nextCursor:null,prevCursor:null}}quoteIdentifier(e){return e}mapToUniversalType(e){switch(e.toLowerCase()){case"int":case"long":case"double":case"decimal":return"number";case"bool":return"boolean";case"date":return"date";case"array":return"array";case"object":return"json";default:return"text"}}mapFromUniversalType(e){switch(e){case"number":return"double";case"boolean":return"bool";case"date":return"date";case"array":return"array";case"json":return"object";default:return"string"}}wrapError(e){if(e instanceof d)return e;if(e instanceof Error){let t=e.name??"";if(t==="MongoNetworkError"||t==="MongoServerSelectionError"||t==="MongoTopologyClosedError")return new d(503,{message:e.message,cause:e})}return super.wrapError(e)}async getTableData(e){try{let{tableName:t,db:n,cursor:a,limit:s,direction:o="asc",sort:i,order:c,filters:l}=e,m=(await te(n)).collection(t),p=Yi(l??[]),f=ps(i??"",c),b=s&&s>0?s:50,T=zi(a),h=Number.isFinite(T)&&T>=0?T:0,w=o==="desc"?Math.max(h-b,0):h,[S,A]=await Promise.all([m.countDocuments(p),m.find(p).sort(f).skip(w).limit(b).toArray()]),N=A.map(D=>Jt(D)),R=w+b,_=Math.max(w-b,0);return{data:N,meta:{limit:b,total:S,hasNextPage:R<S,hasPreviousPage:w>0,nextCursor:R<S?fs(R):null,prevCursor:w>0?fs(_):null}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let o=(await(await te(t)).collection(e).find({}).limit(1e4).toArray()).map(c=>Jt(c));return{cols:Array.from(new Set(o.flatMap(c=>Object.keys(c)))),rows:o}}catch(n){throw this.wrapError(n)}}async getDatabasesList(){try{let a=(await(await sr()).db().admin().listDatabases()).databases??[];if(!a[0])throw new d(500,{message:"No databases returned from MongoDB"});return Wi(a,or()).map(s=>({name:s.name,size:xd(s.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:or()}}async getDatabaseConnectionInfo(){try{let t=(await sr()).db().admin(),n=Oe(qe()),a={};try{a=await t.serverStatus()}catch(s){Z("warn","db_server_status_failed",he(s))}return{host:n.host,port:n.port,user:"n/a",database:or(),version:a.version??"unknown",active_connections:a.connections?.current??0,max_connections:(a.connections?.current??0)+(a.connections?.available??0)}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=await te(e),n=await t.listCollections().toArray(),a=[];for(let s of n){if(s.name.startsWith("system."))continue;let o=await t.collection(s.name).estimatedDocumentCount();a.push({tableName:s.name,rowCount:o})}return a}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){try{let n=e?.tableName??"",a=await te(t);if((await a.listCollections({name:n}).toArray()).length>0)throw new d(400,{message:`Collection "${n}" already exists`});let o=e?.fields??[];if(o.length===0){await a.createCollection(n);return}let i={},c=[];for(let l of o){let u=Ld(l.columnType);if(!Xi.has(u))throw new d(400,{message:`Unsupported MongoDB BSON type "${l.columnType}" for field "${l.columnName}"`});l.isArray?i[l.columnName]={bsonType:"array",...u!=="array"?{items:{bsonType:u}}:{}}:i[l.columnName]={bsonType:u},l.isNullable||c.push(l.columnName)}await a.createCollection(n,{validator:{$jsonSchema:{bsonType:"object",required:c,properties:i,additionalProperties:!0}},validationAction:"error"})}catch(n){throw this.wrapError(n)}}async deleteTable({tableName:e,db:t}){try{let a=(await te(t)).collection(e),s=await a.estimatedDocumentCount();return await a.drop(),{deletedCount:s,fkViolation:!1,relatedRecords:[]}}catch(n){throw this.wrapError(n)}}async renameTable(e){try{let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await te(a);if((await s.listCollections({name:t}).toArray()).length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if((await s.listCollections({name:n}).toArray()).length>0)throw new d(409,{message:`Collection "${n}" already exists`});await s.collection(t).rename(n)}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,db:t}){try{let n=await te(t);if((await n.listCollections({name:e}).toArray()).length===0)throw new d(404,{message:`Collection "${e}" does not exist`});let s=n.collection(e),o=await s.find({}).limit(200).toArray(),i=await s.estimatedDocumentCount(),c=new Map,l=new Map;for(let f of o)for(let[b,T]of Object.entries(f)){let h=Pd(T);c.has(b)||(c.set(b,new Set),l.set(b,0)),c.get(b)?.add(h),l.set(b,(l.get(b)??0)+1)}let u={},m=[];for(let[f,b]of c.entries()){let T=l.get(f)??0,h=Array.from(b).filter(S=>S!=="null"),w=b.has("null")||T<o.length;T===o.length&&o.length>0&&!w&&m.push(f),u[f]=h.length===1?{bsonType:w?[h[0],"null"]:h[0]}:{bsonType:w?[...h,"null"]:h}}let p={collection:e,estimatedDocumentCount:i,sampledDocuments:o.length,jsonSchema:{bsonType:"object",required:m.length>0?m:void 0,properties:u}};return JSON.stringify(p,null,2)}catch(n){throw this.wrapError(n)}}async getTableColumns({tableName:e,db:t}){try{let s=await(await te(t)).collection(e).find({}).limit(200).toArray(),o=s.length,i=new Map,c=(l,u)=>{let m=Od(u);if(!i.has(l))i.set(l,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=i.get(l);p.types.add(m),p.presentCount+=1}};for(let l of s)for(let[u,m]of Object.entries(l)){if(m==null){if(!i.has(u))i.set(u,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=i.get(u);p.nullable=!0,p.presentCount+=1}continue}c(u,m)}if(o>0)for(let l of i.values())l.presentCount<o&&(l.nullable=!0);return i.has("_id")||i.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:o}),Array.from(i.entries()).map(([l,u])=>{let m=u.types.values().next().value??"text";return{columnName:l,dataType:m,dataTypeLabel:Id(m),isNullable:u.nullable,columnDefault:null,isPrimaryKey:l==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}catch(n){throw this.wrapError(n)}}async addColumn(e){try{let{tableName:t,columnName:n,columnType:a,defaultValue:s,isNullable:o,db:i}=e,c=await te(i),l=await c.listCollections({name:t}).toArray();if(l.length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if(await c.collection(t).findOne({[n]:{$exists:!0}}))throw new d(409,{message:`Field "${n}" already exists in collection "${t}"`});let m=$d(s,a);await c.collection(t).updateMany({},{$set:{[n]:m}});let f=l[0].options?.validator?.$jsonSchema??{},b={...f.properties??{},[n]:{bsonType:o?[a,"null"]:a}},T=[...f.required??[]];!o&&!T.includes(n)&&T.push(n),await c.command({collMod:t,validator:{$jsonSchema:{...f,bsonType:"object",properties:b,...T.length>0?{required:T}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async deleteColumn({tableName:e,columnName:t,db:n}){try{return{deletedCount:(await(await te(n)).collection(e).updateMany({},{$unset:{[t]:""}})).modifiedCount}}catch(a){throw this.wrapError(a)}}async alterColumn(e){try{let{tableName:t,columnName:n,columnType:a,isNullable:s,db:o}=e,i=await te(o),c=await i.listCollections({name:t}).toArray();if(c.length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if(n==="_id")throw new d(400,{message:'Cannot alter the "_id" field'});let u=c[0].options?.validator?.$jsonSchema??{},m={...u.properties??{}},p=[...u.required??[]];m[n]={bsonType:s?[a,"null"]:a};let f=p.indexOf(n);!s&&f===-1?p.push(n):s&&f!==-1&&p.splice(f,1),await i.command({collMod:t,validator:{$jsonSchema:{...u,bsonType:"object",properties:m,...p.length>0?{required:p}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async renameColumn(e){try{let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await te(s);if((await o.listCollections({name:t}).toArray()).length===0)throw new d(404,{message:`Collection "${t}" does not exist`});if(n==="_id")throw new d(400,{message:'Cannot rename the "_id" field'});if(!await o.collection(t).findOne({[n]:{$exists:!0}}))throw new d(404,{message:`Field "${n}" does not exist in collection "${t}"`});if(await o.collection(t).findOne({[a]:{$exists:!0}}))throw new d(409,{message:`Field "${a}" already exists in collection "${t}"`});await o.collection(t).updateMany({[n]:{$exists:!0}},{$rename:{[n]:a}})}catch(t){throw this.wrapError(t)}}async getServerLogs(){try{let e=await sr(),{log:t}=await e.db("admin").command({getLog:"global"}),n=t.flatMap(a=>{try{return[Ud(JSON.parse(a))]}catch{return[]}});return{available:!0,source:"getLog: 'global' (the server keeps the newest 1024 entries)",entries:Ie(n)}}catch(e){let t=e.code;if(t===Md)return ne("Reading the server log needs the getLog action, which the clusterMonitor role grants.");if(t===kd)return ne("This Atlas tier does not allow getLog.");throw this.wrapError(e)}}async listIndexes(e,t){if((await e.listCollections({name:t}).toArray()).length===0)throw new d(404,{message:`Collection "${t}" does not exist`});return(await e.collection(t).listIndexes().toArray()).map(Dd).sort((s,o)=>+(o.kind==="primary")-+(s.kind==="primary")||(s.indexName<o.indexName?-1:s.indexName>o.indexName?1:0))}async getTableIndexes({tableName:e,db:t}){try{return await this.listIndexes(await te(t),e)}catch(n){throw this.wrapError(n)}}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o,db:i}=e;try{if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});let c=a.find(m=>m.split(".").some(p=>p===""||p.startsWith("$")));if(c!==void 0)throw new d(400,{message:`Invalid field path "${c}"`});if(new Set(a).size!==a.length)throw new d(400,{message:"A field can appear only once in an index"});let l=await te(i);if((await this.listIndexes(l,t)).some(m=>m.indexName===n))throw new d(409,{message:`Index "${n}" already exists on collection "${t}"`});await l.collection(t).createIndex(new Map(a.map(m=>[m,1])),{name:n,unique:s})}catch(c){let l=c.code;throw c instanceof Error&&typeof l=="number"&&_d.has(l)?new d(409,{message:c.message,cause:c}):this.wrapError(c)}}async dropIndex({tableName:e,indexName:t,db:n}){try{let a=await te(n),s=(await this.listIndexes(a,e)).find(o=>o.indexName===t);if(!s)throw new d(404,{message:`Index "${t}" does not exist on collection "${e}"`});if(s.kind==="primary")throw new d(400,{message:`Index "${t}" backs the primary key and cannot be dropped`});await a.collection(e).dropIndex(t)}catch(a){throw this.wrapError(a)}}async addRecord({db:e,params:t}){try{let{tableName:n,data:a}=t,o=(await te(e)).collection(n),i=Jt(a);if((i._id===""||i._id===null)&&delete i._id,!(await o.insertOne(i)).insertedId)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:1}}catch(n){throw this.wrapError(n)}}async updateRecords({db:e,params:t}){try{let{tableName:n}=t,s=(await te(e)).collection(n),o=0,i=this.resolveKeyColumns(t).map(l=>l||"_id"),c=this.groupUpdatesByKey({...t,primaryKeys:i},i);for(let{keyValues:l,rowUpdates:u}of c){if(u.some(b=>b.columnName==="_id"))throw new d(400,{message:'The "_id" field is immutable and cannot be updated.'});let m={};for(let b of u)m[b.columnName]=b.value;let p={};i.forEach((b,T)=>{let h=l[T];p[b]=b==="_id"&&Qi(h)?Nn(h):h});let f=await s.updateOne(p,{$set:m});if(f.matchedCount===0)throw new d(404,{message:`Record with ${this.describeKey(i,l)} not found in "${n}"`});o+=f.modifiedCount}return{updatedCount:o}}catch(n){throw this.wrapError(n)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:n,db:a}=e,o=(await te(a)).collection(t),i=n[0]?.columnName??"_id",c=n.map(u=>i==="_id"&&Qi(u.value)?Nn(u.value):u.value);return{deletedCount:(await o.deleteMany({[i]:{$in:c}})).deletedCount??0,fkViolation:!1,relatedRecords:[]}}catch(t){throw this.wrapError(t)}}async forceDeleteRecords(e){return{deletedCount:(await this.deleteRecords(e)).deletedCount}}async bulkInsertRecords(e){try{let{tableName:t,records:n,db:a}=e;if(!n||n.length===0)throw new d(400,{message:"At least one record is required"});let o=(await te(a)).collection(t),i=n.map(l=>{let u=Jt(l);return(u._id===""||u._id===null)&&delete u._id,u}),c=await o.insertMany(i,{ordered:!1});return{success:!0,message:`Successfully inserted ${c.insertedCount} record${c.insertedCount!==1?"s":""}`,successCount:c.insertedCount,failureCount:n.length-c.insertedCount}}catch(t){throw this.wrapError(t)}}async executeQuery({query:e,db:t}){try{if(!e?.trim())throw new d(400,{message:"Query is required"});let n;try{n=JSON.parse(e)}catch{throw new d(400,{message:"Mongo query must be valid JSON"})}if(!n.collection||!n.operation)throw new d(400,{message:"Mongo query must include collection and operation"});let s=(await te(t)).collection(n.collection),o=performance.now(),i=[],c=0,l;switch(n.operation){case"find":{let f=Xt(n.filter??{}),b=s.find(f,n.options??{});b.sort(n.sort??ps("",void 0)),n.skip&&b.skip(n.skip),n.limit&&b.limit(n.limit),i=await b.toArray(),c=i.length;break}case"aggregate":{i=await s.aggregate(n.pipeline??[],n.options??{}).toArray(),c=i.length;break}case"insertOne":{let f=n.document;if(!f)throw new d(400,{message:"document is required"});c=(await s.insertOne(f)).insertedId?1:0,l="OK";break}case"insertMany":{let f=n.document;if(!Array.isArray(f))throw new d(400,{message:"document array is required"});c=(await s.insertMany(f)).insertedCount??0,l="OK";break}case"updateOne":{let f=Xt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let b=await s.updateOne(f,n.update,n.options??{});c=b.matchedCount??0,l=`OK (${b.modifiedCount??0} modified)`;break}case"updateMany":{let f=Xt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let b=await s.updateMany(f,n.update,n.options??{});c=b.matchedCount??0,l=`OK (${b.modifiedCount??0} modified)`;break}case"deleteOne":{let f=Xt(n.filter??{});c=(await s.deleteOne(f,n.options??{})).deletedCount??0,l="OK";break}case"deleteMany":{let f=Xt(n.filter??{});c=(await s.deleteMany(f,n.options??{})).deletedCount??0,l="OK";break}case"count":{let f=Xt(n.filter??{});c=await s.countDocuments(f),i=[{count:c}],l="OK";break}default:throw new d(400,{message:"Unsupported Mongo operation"})}let u=performance.now()-o,m=i.map(f=>Jt(f));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:c,duration:u,message:l}}catch(n){throw this.wrapError(n)}}}});function ys(r,e=0){if(r.length===0)return{clause:"",values:[],nextIdx:e};let t=[],n=[],a=e;for(let s of r){let o=hr(s.columnName);switch(s.operator){case"=":case"!=":case">":case">=":case"<":case"<=":t.push(`${o} ${s.operator} @p${a}`),n.push(s.value),a++;break;case"is":s.value.toLowerCase()==="null"?t.push(`${o} IS NULL`):(t.push(`${o} = @p${a}`),n.push(s.value),a++);break;case"is not":s.value.toLowerCase()==="null"?t.push(`${o} IS NOT NULL`):(t.push(`${o} != @p${a}`),n.push(s.value),a++);break;case"like":case"ilike":t.push(`${o} LIKE @p${a}`),n.push(s.value),a++;break;case"not like":case"not ilike":t.push(`${o} NOT LIKE @p${a}`),n.push(s.value),a++;break;default:break}}return t.length===0?{clause:"",values:[],nextIdx:e}:{clause:`WHERE ${t.join(" AND ")}`,values:n,nextIdx:a}}function hs(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${hr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${hr(r)} ${e?.toUpperCase()||"ASC"}`:""}function ec(r,e,t){let n=hs(r,e),a=Array.isArray(r)?r.map(i=>i.columnName):[r],s=(Array.isArray(r)?r[0]?.direction??e:e).toUpperCase(),o=t.filter(i=>!a.includes(i)).map(i=>`${hr(i)} ${s}`).join(", ");return o?n?`${n}, ${o}`:`ORDER BY ${o}`:n||"ORDER BY (SELECT NULL)"}function gs(r,e){if(e)return"NVARCHAR(MAX)";let t=r.toLowerCase().trim();return{serial:"INT IDENTITY(1,1)",serial4:"INT IDENTITY(1,1)",bigserial:"BIGINT IDENTITY(1,1)",serial8:"BIGINT IDENTITY(1,1)",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",tinyint:"TINYINT",numeric:"NUMERIC",decimal:"DECIMAL",real:"REAL",float4:"REAL",float:"FLOAT","double precision":"FLOAT",float8:"FLOAT",money:"MONEY",boolean:"BIT",bool:"BIT",text:"NVARCHAR(MAX)",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"UNIQUEIDENTIFIER",json:"NVARCHAR(MAX)",jsonb:"NVARCHAR(MAX)",xml:"XML",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME2","timestamp without time zone":"DATETIME2","timestamp with time zone":"DATETIMEOFFSET",timestamptz:"DATETIMEOFFSET",interval:"VARCHAR(255)",bytea:"VARBINARY(MAX)",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)"}[t]||r.toUpperCase()}function bs(r,e){let t=r.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("newid()")?e.toUpperCase().includes("UNIQUEIDENTIFIER")?"NEWID()":null:t.includes("getdate")||t.includes("current_timestamp")?"GETDATE()":r.trim():t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":r.trim()}function tc(r,e={}){let t=gs(r.columnType,r.isArray??!1),n=`[${r.columnName}] ${t}`;if(r.isIdentity&&!t.includes("IDENTITY")&&(n+=" IDENTITY(1,1)"),!r.isNullable&&!r.isPrimaryKey&&(n+=" NOT NULL"),r.defaultValue?.trim()&&!t.includes("IDENTITY")){let a=bs(r.defaultValue,t);a!==null&&(n+=` DEFAULT ${a}`)}return e.includeUnique&&r.isUnique&&!r.isPrimaryKey&&(n+=" UNIQUE"),e.includePrimaryKey&&r.isPrimaryKey&&(n+=" PRIMARY KEY"),n}var hr,nc=C(()=>{"use strict";y();hr=r=>`[${r.replaceAll("]","]]")}]`});var qd,Bd,Fd,rc,Kd,Hd,jd,Wd,Vd,Yd,zd,Ae,gr,ac=C(()=>{"use strict";y();j();Ze();et();dt();Q();Ge();nc();qd=547,Bd=15003,Fd=27219,rc=r=>[229,230].includes(r.number??0),Kd=2812,Hd=/^Error: (\d+), Severity: (\d+), State: (\d+)\.?$/,jd=3726,Wd=1913,Vd=1505,Yd=new Set([1919,1978]),zd=3723,Ae=r=>`[${r.replaceAll("]","]]")}]`,gr=class extends re{async runQuery(e,t,n){let s=(await F(e)).request();return n.forEach((i,c)=>{s.input(`p${c}`,i)}),(await s.query(t)).recordset}quoteIdentifier(e){return Ae(e)}mapToUniversalType(e){return vn(e)}mapFromUniversalType(e){return{text:"NVARCHAR(MAX)",number:"INT",boolean:"BIT",json:"NVARCHAR(MAX)",date:"DATETIME2",array:"NVARCHAR(MAX)",enum:"NVARCHAR(255)"}[e]??"NVARCHAR(MAX)"}buildTableDataQuery(e){let{tableName:t,filters:n=[],sort:a=[],order:s="asc",limit:o=50,cursor:i}=e,{clause:c,values:l,nextIdx:u}=ys(n,0),m=hs(a,s)||"ORDER BY (SELECT NULL)",p=i?this.decodeOffsetCursor(i):0,f=`SELECT * FROM ${Ae(t)} ${c} ${m} OFFSET @p${u} ROWS FETCH NEXT @p${u+1} ROWS ONLY`,b=[...l,p,o+1],T=`SELECT COUNT(*) as total FROM ${Ae(t)} ${c}`;return{sql:f,values:b,countSql:T,countValues:l}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){let{cursor:a,limit:s=50}=e,o=a?this.decodeOffsetCursor(a):0;return{nextCursor:n?this.makeCursor(o+s):null,prevCursor:o>0?this.makeCursor(Math.max(0,o-s)):null}}async getTableData(e){try{let{tableName:t,db:n,limit:a=50,sort:s=[],order:o="asc",cursor:i,filters:c=[]}=e,l=await F(n),u=i?this.decodeOffsetCursor(i):0,{clause:m,values:p,nextIdx:f}=ys(c,0),[b,{total:T,estimated:h}]=await Promise.all([this.getPrimaryKeyColumns(l,t),this.countRows(l,t,m,p)]),w=ec(s,o,b),S=l.request();p.forEach((_,D)=>{S.input(`p${D}`,_)}),S.input(`p${f}`,u),S.input(`p${f+1}`,a+1);let N=(await S.query(`SELECT * FROM ${Ae(t)} ${m} ${w} OFFSET @p${f} ROWS FETCH NEXT @p${f+1} ROWS ONLY`)).recordset,R=N.length>a;return R&&(N=N.slice(0,a)),{data:N,meta:{limit:a,total:T,...h&&{totalEstimated:!0},hasNextPage:R,hasPreviousPage:u>0,nextCursor:R?this.makeCursor(u+a):null,prevCursor:u>0?this.makeCursor(Math.max(0,u-a)):null}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{let t=await(await F()).request().query(`
46
46
  SELECT
47
47
  d.name AS name,
48
48
  ISNULL(CAST(ROUND(CAST(SUM(mf.size) * 8.0 / 1024 AS DECIMAL(10,2)), 2) AS VARCHAR(20)) + ' MB', '') AS size,
@@ -62,13 +62,13 @@ var Bl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var Pt=(r,e)=>{f
62
62
  CONNECTIONPROPERTY('local_tcp_port') AS port,
63
63
  @@MAX_CONNECTIONS AS max_connections,
64
64
  (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS active_connections
65
- `);if(!t.recordset[0])throw new d(500,{message:"No connection information returned from server"});let n=t.recordset[0],a=_e(ve());return{host:String(n.host||a.host),port:Number(n.port||a.port),user:String(n.user),database:String(n.database_name??""),version:String(n.version),active_connections:Number(n.active_connections??0),max_connections:Number(n.max_connections)}}async getTablesList(e){let t=await F(e),n=await this.rowEstimates(t);return Promise.all([...n].map(async([a,s])=>{if(s>=ut)return{tableName:a,rowCount:s,rowCountEstimated:!0};try{let o=await t.request().query(`SELECT COUNT(*) as count FROM ${Ne(a)}`);return{tableName:a,rowCount:Number(o.recordset[0]?.count??0)}}catch(o){if(!tc(o))throw o;return{tableName:a,rowCount:s,rowCountEstimated:!0}}}))}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=await F(t),i=a.map(m=>{let p=ys(m.columnType,m.isArray??!1),f=`[${m.columnName}] ${p}`;if(!m.isNullable&&!m.isPrimaryKey&&(f+=" NOT NULL"),m.defaultValue&&!p.includes("IDENTITY")){let b=hs(m.defaultValue,p);b!==null&&(f+=` DEFAULT ${b}`)}return f}),c=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&c.push(`PRIMARY KEY (${l.map(m=>`[${m.columnName}]`).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&c.push(`UNIQUE ([${m.columnName}])`);let u=s?.map(m=>`CONSTRAINT [${`FK_${n}_${m.columnName}`}] FOREIGN KEY ([${m.columnName}]) REFERENCES [${m.referencedTable}] ([${m.referencedColumn}]) ON UPDATE ${m.onUpdate} ON DELETE ${m.onDelete}`)??[];await o.request().query(`CREATE TABLE [${n}] (
65
+ `);if(!t.recordset[0])throw new d(500,{message:"No connection information returned from server"});let n=t.recordset[0],a=Oe(qe());return{host:String(n.host||a.host),port:Number(n.port||a.port),user:String(n.user),database:String(n.database_name??""),version:String(n.version),active_connections:Number(n.active_connections??0),max_connections:Number(n.max_connections)}}async getTablesList(e){let t=await F(e),n=await this.rowEstimates(t);return Promise.all([...n].map(async([a,s])=>{if(s>=mt)return{tableName:a,rowCount:s,rowCountEstimated:!0};try{let o=await t.request().query(`SELECT COUNT(*) as count FROM ${Ae(a)}`);return{tableName:a,rowCount:Number(o.recordset[0]?.count??0)}}catch(o){if(!rc(o))throw o;return{tableName:a,rowCount:s,rowCountEstimated:!0}}}))}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=await F(t),i=a.map(m=>{let p=gs(m.columnType,m.isArray??!1),f=`[${m.columnName}] ${p}`;if(!m.isNullable&&!m.isPrimaryKey&&(f+=" NOT NULL"),m.defaultValue&&!p.includes("IDENTITY")){let b=bs(m.defaultValue,p);b!==null&&(f+=` DEFAULT ${b}`)}return f}),c=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&c.push(`PRIMARY KEY (${l.map(m=>`[${m.columnName}]`).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&c.push(`UNIQUE ([${m.columnName}])`);let u=s?.map(m=>`CONSTRAINT [${`FK_${n}_${m.columnName}`}] FOREIGN KEY ([${m.columnName}]) REFERENCES [${m.referencedTable}] ([${m.referencedColumn}]) ON UPDATE ${m.onUpdate} ON DELETE ${m.onDelete}`)??[];await o.request().query(`CREATE TABLE [${n}] (
66
66
  ${[...i,...c,...u].join(`,
67
67
  `)}
68
68
  )`)}async deleteTable(e){let{tableName:t,db:n,cascade:a}=e,s=await F(n),o=await s.request().input("tableName",t).query(`
69
69
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES
70
70
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND TABLE_SCHEMA = 'dbo'
71
- `);if(Number(o.recordset[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`});let i=await this.getTableRowCount(t,n);if(!a){let c=await this.getRelatedRecordsForTable(t,n);if(c.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:c}}try{if(a){let c=await this.getForeignKeyReferences(t,n);for(let l of c)await s.request().query(`ALTER TABLE [${l.referencingTable}] DROP CONSTRAINT [${l.constraintName}]`)}return await s.request().query(`DROP TABLE [${t}]`),{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(c){if(c.number===Fd)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,n)};throw c instanceof d?c:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){try{let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await F(a);await this.assertTableExists(s,t);let o=await s.request().input("tableName",n).query(`
71
+ `);if(Number(o.recordset[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`});let i=await this.getTableRowCount(t,n);if(!a){let c=await this.getRelatedRecordsForTable(t,n);if(c.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:c}}try{if(a){let c=await this.getForeignKeyReferences(t,n);for(let l of c)await s.request().query(`ALTER TABLE [${l.referencingTable}] DROP CONSTRAINT [${l.constraintName}]`)}return await s.request().query(`DROP TABLE [${t}]`),{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(c){if(c.number===jd)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,n)};throw c instanceof d?c:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){try{let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await F(a);await this.assertTableExists(s,t);let o=await s.request().input("tableName",n).query(`
72
72
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES
73
73
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND TABLE_SCHEMA = 'dbo'
74
74
  `);if(Number(o.recordset[0]?.cnt??0)>0)throw new d(409,{message:`Table "${n}" already exists`});await s.request().input("oldName",t).input("newName",n).query("EXEC sp_rename @oldName, @newName")}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,db:t}){let n=await F(t),a=await n.request().input("tableName",e).query(`
@@ -157,10 +157,10 @@ ${o.join(`,
157
157
  JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cc
158
158
  ON chk.CONSTRAINT_NAME = cc.CONSTRAINT_NAME AND cc.TABLE_SCHEMA = 'dbo'
159
159
  WHERE cc.TABLE_NAME = @tableName AND cc.TABLE_CATALOG = DB_NAME()
160
- `),o=new Map;for(let i of s.recordset){let c=this.parseCheckConstraintValues(i.checkClause);c&&o.set(i.columnName,c)}return a.recordset.map(i=>{let c=o.get(i.columnName)??null;return{columnName:i.columnName,dataType:c?"enum":Mn(i.dataType),dataTypeLabel:c?"enum":jr(i.dataType),isNullable:!!i.isNullable,columnDefault:i.columnDefault??null,isPrimaryKey:!!i.isPrimaryKey,isForeignKey:!!i.isForeignKey,referencedTable:i.referencedTable??null,referencedColumn:i.referencedColumn??null,enumValues:c}})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,db:u}=e,m=await F(u);await this.assertTableExists(m,t);let p=await m.request().input("tableName",t).input("columnName",n).query(`
160
+ `),o=new Map;for(let i of s.recordset){let c=this.parseCheckConstraintValues(i.checkClause);c&&o.set(i.columnName,c)}return a.recordset.map(i=>{let c=o.get(i.columnName)??null;return{columnName:i.columnName,dataType:c?"enum":vn(i.dataType),dataTypeLabel:c?"enum":Vr(i.dataType),isNullable:!!i.isNullable,columnDefault:i.columnDefault??null,isPrimaryKey:!!i.isPrimaryKey,isForeignKey:!!i.isForeignKey,referencedTable:i.referencedTable??null,referencedColumn:i.referencedColumn??null,enumValues:c}})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,db:u}=e,m=await F(u);await this.assertTableExists(m,t);let p=await m.request().input("tableName",t).input("columnName",n).query(`
161
161
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS
162
162
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = 'dbo'
163
- `);if(Number(p.recordset[0]?.cnt??0)>0)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let f=Zi({columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l},{includePrimaryKey:!0,includeUnique:!0});await m.request().query(`ALTER TABLE [${t}] ADD ${f}`)}async deleteColumn(e){let{tableName:t,columnName:n,db:a}=e,s=await F(a);return await this.assertTableExists(s,t),await this.assertColumnExists(s,t,n),{deletedCount:(await s.request().query(`ALTER TABLE [${t}] DROP COLUMN [${n}]`)).rowsAffected[0]??1}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o,db:i}=e,c=await F(i);await this.assertTableExists(c,t),await this.assertColumnExists(c,t,n);let u=(await c.request().input("tableName",t).input("columnName",n).query(`
163
+ `);if(Number(p.recordset[0]?.cnt??0)>0)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let f=tc({columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l},{includePrimaryKey:!0,includeUnique:!0});await m.request().query(`ALTER TABLE [${t}] ADD ${f}`)}async deleteColumn(e){let{tableName:t,columnName:n,db:a}=e,s=await F(a);return await this.assertTableExists(s,t),await this.assertColumnExists(s,t,n),{deletedCount:(await s.request().query(`ALTER TABLE [${t}] DROP COLUMN [${n}]`)).rowsAffected[0]??1}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o,db:i}=e,c=await F(i);await this.assertTableExists(c,t),await this.assertColumnExists(c,t,n);let u=(await c.request().input("tableName",t).input("columnName",n).query(`
164
164
  SELECT dc.name AS constraint_name
165
165
  FROM sys.default_constraints dc
166
166
  JOIN sys.columns c
@@ -169,10 +169,10 @@ ${o.join(`,
169
169
  `)).recordset[0]?.constraint_name;u&&await c.request().query(`ALTER TABLE [${t}] DROP CONSTRAINT [${u}]`);let m=s?"NULL":"NOT NULL";await c.request().query(`ALTER TABLE [${t}] ALTER COLUMN [${n}] ${a} ${m}`),o?.trim()&&await c.request().query(`ALTER TABLE [${t}] ADD DEFAULT ${o.trim()} FOR [${n}]`)}async renameColumn(e){let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await F(s);await this.assertTableExists(o,t),await this.assertColumnExists(o,t,n);let i=await o.request().input("tableName",t).input("columnName",a).query(`
170
170
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS
171
171
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = 'dbo'
172
- `);if(Number(i.recordset[0]?.cnt??0)>0)throw new d(409,{message:`Column "${a}" already exists in table "${t}"`});await o.request().query(`EXEC sp_rename '${t}.${n}', '${a}', 'COLUMN'`)}async getServerLogs({db:e}){let t=await F(e);try{let n=await t.request().query("EXEC sp_readerrorlog 0, 1; SELECT DATEDIFF(MINUTE, GETUTCDATE(), GETDATE()) AS offset"),[a,[{offset:s}]]=n.recordsets,o=[],i=null;for(let c of a){let l=Bd.exec(c.Text);if(l){i={code:l[1],severity:Number(l[2]),process:c.ProcessInfo};continue}let u=i?.process===c.ProcessInfo?i:null;i=null,o.push({ts:new Date(c.LogDate.getTime()-s*6e4).toISOString(),level:u?u.severity>=20?"fatal":u.severity>=11?"error":"warning":"info",rawLevel:u?`Severity ${u.severity}`:"Info",source:c.ProcessInfo,code:u?.code,message:c.Text,detail:{}})}return{available:!0,source:"sp_readerrorlog",entries:Oe(o)}}catch(n){let a=n.number;if(a===vd||a===Ud)return ne("Reading the error log needs the securityadmin server role: ALTER SERVER ROLE securityadmin ADD MEMBER <login>;");if(a===qd)return ne("This server has no error log to read. Azure SQL Database keeps its logs in Azure Monitor.");throw this.wrapError(n)}}async getTableIndexes({tableName:e,db:t}){try{return await this.listIndexes(await F(t),e)}catch(n){throw this.wrapError(n)}}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o,db:i}=e;try{let c=await F(i);await this.assertTableExists(c,t);let l=await c.request().input("tableName",t).query(`
172
+ `);if(Number(i.recordset[0]?.cnt??0)>0)throw new d(409,{message:`Column "${a}" already exists in table "${t}"`});await o.request().query(`EXEC sp_rename '${t}.${n}', '${a}', 'COLUMN'`)}async getServerLogs({db:e}){let t=await F(e);try{let n=await t.request().query("EXEC sp_readerrorlog 0, 1; SELECT DATEDIFF(MINUTE, GETUTCDATE(), GETDATE()) AS offset"),[a,[{offset:s}]]=n.recordsets,o=[],i=null;for(let c of a){let l=Hd.exec(c.Text);if(l){i={code:l[1],severity:Number(l[2]),process:c.ProcessInfo};continue}let u=i?.process===c.ProcessInfo?i:null;i=null,o.push({ts:new Date(c.LogDate.getTime()-s*6e4).toISOString(),level:u?u.severity>=20?"fatal":u.severity>=11?"error":"warning":"info",rawLevel:u?`Severity ${u.severity}`:"Info",source:c.ProcessInfo,code:u?.code,message:c.Text,detail:{}})}return{available:!0,source:"sp_readerrorlog",entries:Ie(o)}}catch(n){let a=n.number;if(a===Bd||a===Fd)return ne("Reading the error log needs the securityadmin server role: ALTER SERVER ROLE securityadmin ADD MEMBER <login>;");if(a===Kd)return ne("This server has no error log to read. Azure SQL Database keeps its logs in Azure Monitor.");throw this.wrapError(n)}}async getTableIndexes({tableName:e,db:t}){try{return await this.listIndexes(await F(t),e)}catch(n){throw this.wrapError(n)}}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o,db:i}=e;try{let c=await F(i);await this.assertTableExists(c,t);let l=await c.request().input("tableName",t).query(`
173
173
  SELECT COLUMN_NAME AS columnName FROM INFORMATION_SCHEMA.COLUMNS
174
174
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND TABLE_SCHEMA = 'dbo'
175
- `),u=new Set(l.recordset.map(p=>p.columnName)),m=a.find(p=>!u.has(p));if(m!==void 0)throw new d(400,{message:`Column "${m}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});await c.request().query(`CREATE ${s?"UNIQUE ":""}INDEX ${Ne(n)} ON [dbo].${Ne(t)} (${a.map(Ne).join(", ")})`)}catch(c){let l=c.number;throw c instanceof Error&&(l===Kd||l===Hd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&jd.has(l)?new d(400,{message:c.message,cause:c}):this.wrapError(c)}}async dropIndex({tableName:e,indexName:t,db:n}){try{let a=await F(n),s=(await this.listIndexes(a,e)).find(o=>o.indexName===t);if(!s)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(s.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});await a.request().query(`DROP INDEX ${Ne(t)} ON [dbo].${Ne(e)}`)}catch(a){throw a instanceof Error&&a.number===Wd?new d(400,{message:a.message,cause:a}):this.wrapError(a)}}async addRecord({db:e,params:t}){let{tableName:n,data:a}=t,s=await F(e),o=await this.getBooleanColumnSet(n,e),i=await s.request().input("tableName",n).query("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@tableName) AND is_identity = 1"),c=new Set(i.recordset.map(T=>T.name)),l=Object.keys(a).filter(T=>!c.has(T)),u=l.map(T=>{let h=a[T];return o.has(T)&&typeof h=="string"?h==="true"?1:0:h}),m=l.map(T=>`[${T}]`).join(", "),p=l.map((T,h)=>`@param${h}`).join(", "),f=s.request();l.forEach((T,h)=>{f.input(`param${h}`,u[h])});let b=await f.query(`INSERT INTO [${n}] (${m}) VALUES (${p})`);if(b.rowsAffected[0]===0)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:b.rowsAffected[0]??0}}async updateRecords({params:e,db:t}){let{tableName:n}=e,a=await F(t),s=await this.getBooleanColumnSet(n,t),o=this.resolveKeyColumns(e);this.assertWholeKey(await this.getPrimaryKeyColumns(a,n),o);let i=this.groupUpdatesByKey(e,o),c=a.transaction();await c.begin();try{let l=0;for(let{keyValues:u,rowUpdates:m}of i){let p=c.request(),f=m.map((h,w)=>`[${h.columnName}] = ${h.useDefault?"DEFAULT":`@value${w}`}`);m.forEach((h,w)=>{if(h.useDefault)return;let S=h.value;S!==null&&typeof S=="object"&&(S=JSON.stringify(S)),s.has(h.columnName)&&typeof S=="string"&&(S=S==="true"?1:0),p.input(`value${w}`,S)}),u.forEach((h,w)=>{p.input(`pkValue${w}`,h)});let b=o.map((h,w)=>`[${h}] = @pkValue${w}`),T=await p.query(`UPDATE [${n}] SET ${f.join(", ")} WHERE ${b.join(" AND ")}`);if(T.rowsAffected[0]===0)throw new d(404,{message:`Record with ${this.describeKey(o,u)} not found in table "${n}"`});l+=T.rowsAffected[0]??0}return await c.commit(),{updatedCount:l}}catch(l){throw await c.rollback(),l instanceof d?l:new d(500,{message:`Failed to update records in "${n}"`})}}async deleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await F(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(c=>c.value),i=a.transaction();await i.begin();try{let c=i.request();o.forEach((m,p)=>{c.input(`pk${p}`,m)});let l=o.map((m,p)=>`@pk${p}`).join(", "),u=await c.query(`DELETE FROM [${e}] WHERE [${s}] IN (${l})`);return await i.commit(),{deletedCount:u.rowsAffected[0]??0,fkViolation:!1,relatedRecords:[]}}catch(c){if(await i.rollback(),c.number===kd)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,n)};throw c instanceof d?c:new d(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await F(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(c=>c.value),i=a.transaction();await i.begin();try{let c=await this.getForeignKeyReferences(e,n),l=0,u=new Set,m=new Set,p=async(h,w,S,A)=>{let N=`${h}.${w}`;if(A.has(N))return;A.add(N);let C=await this.getForeignKeyReferences(h,n);for(let H of C){let $=i.request();S.forEach((P,ue)=>{$.input(`val${ue}`,P)});let J=S.map((P,ue)=>`@val${ue}`).join(", "),ee=(await $.query(`SELECT [${H.referencedColumn}] FROM [${h}] WHERE [${w}] IN (${J})`)).recordset.map(P=>P[H.referencedColumn]);ee.length>0&&await p(H.referencingTable,H.referencingColumn,ee,A)}let _=i.request();S.forEach((H,$)=>{_.input(`delVal${$}`,H)});let D=S.map((H,$)=>`@delVal${$}`).join(", "),x=await _.query(`DELETE FROM [${h}] WHERE [${w}] IN (${D})`);l+=x.rowsAffected[0]??0,u.add(h)};for(let h of c)u.has(h.referencingTable)||await p(h.referencingTable,h.referencingColumn,o,m);let f=i.request();o.forEach((h,w)=>{f.input(`mainPk${w}`,h)});let b=o.map((h,w)=>`@mainPk${w}`).join(", "),T=await f.query(`DELETE FROM [${e}] WHERE [${s}] IN (${b})`);return await i.commit(),{deletedCount:(T.rowsAffected[0]??0)+l}}catch(c){throw await i.rollback(),c instanceof d?c:new d(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t||t.length===0)throw new d(400,{message:"At least one record is required"});let s=(await F(n)).transaction();try{let o=Object.keys(t[0]),i=o.map(l=>`[${l}]`).join(", "),c=await this.getBooleanColumnSet(e,n);await s.begin();for(let l=0;l<t.length;l++){let u=t[l],m=s.request(),p=o.map(b=>{let T=u[b];return c.has(b)&&typeof T=="string"?T==="true"?1:0:T}),f=o.map((b,T)=>`@p${l}_${T}`).join(", ");o.forEach((b,T)=>{m.input(`p${l}_${T}`,p[T])});try{await m.query(`INSERT INTO [${e}] (${i}) VALUES (${f})`)}catch(b){throw new d(500,{message:`Failed to insert record ${l+1}: ${b instanceof Error?b.message:String(b)}`})}}return await s.commit(),{success:!0,message:`Successfully inserted ${t.length} record${t.length!==1?"s":""}`,successCount:t.length,failureCount:0}}catch(o){throw await s.rollback(),o instanceof d?o:new d(500,{message:`Failed to bulk insert records into "${e}"`})}}async executeQuery({query:e,db:t}){let n=await F(t);if(!e?.trim())throw new d(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),s=performance.now(),o=await n.request().query(a).catch(c=>{throw this.wrapError(c)}),i=performance.now()-s;if(o.recordset){let c=o.recordset;return{columns:o.recordset.columns?Object.keys(o.recordset.columns):Object.keys(c[0]??{}),rows:c,rowCount:c.length,duration:i,message:c.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:o.rowsAffected[0]??0,duration:i,message:`OK \u2014 ${o.rowsAffected[0]??0} row(s) affected`}}async getForeignKeyReferences(e,t){return(await(await F(t)).request().input("tableName",e).query(`
175
+ `),u=new Set(l.recordset.map(p=>p.columnName)),m=a.find(p=>!u.has(p));if(m!==void 0)throw new d(400,{message:`Column "${m}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});await c.request().query(`CREATE ${s?"UNIQUE ":""}INDEX ${Ae(n)} ON [dbo].${Ae(t)} (${a.map(Ae).join(", ")})`)}catch(c){let l=c.number;throw c instanceof Error&&(l===Wd||l===Vd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&Yd.has(l)?new d(400,{message:c.message,cause:c}):this.wrapError(c)}}async dropIndex({tableName:e,indexName:t,db:n}){try{let a=await F(n),s=(await this.listIndexes(a,e)).find(o=>o.indexName===t);if(!s)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(s.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});await a.request().query(`DROP INDEX ${Ae(t)} ON [dbo].${Ae(e)}`)}catch(a){throw a instanceof Error&&a.number===zd?new d(400,{message:a.message,cause:a}):this.wrapError(a)}}async addRecord({db:e,params:t}){let{tableName:n,data:a}=t,s=await F(e),o=await this.getBooleanColumnSet(n,e),i=await s.request().input("tableName",n).query("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@tableName) AND is_identity = 1"),c=new Set(i.recordset.map(T=>T.name)),l=Object.keys(a).filter(T=>!c.has(T)),u=l.map(T=>{let h=a[T];return o.has(T)&&typeof h=="string"?h==="true"?1:0:h}),m=l.map(T=>`[${T}]`).join(", "),p=l.map((T,h)=>`@param${h}`).join(", "),f=s.request();l.forEach((T,h)=>{f.input(`param${h}`,u[h])});let b=await f.query(`INSERT INTO [${n}] (${m}) VALUES (${p})`);if(b.rowsAffected[0]===0)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:b.rowsAffected[0]??0}}async updateRecords({params:e,db:t}){let{tableName:n}=e,a=await F(t),s=await this.getBooleanColumnSet(n,t),o=this.resolveKeyColumns(e);this.assertWholeKey(await this.getPrimaryKeyColumns(a,n),o);let i=this.groupUpdatesByKey(e,o),c=a.transaction();await c.begin();try{let l=0;for(let{keyValues:u,rowUpdates:m}of i){let p=c.request(),f=m.map((h,w)=>`[${h.columnName}] = ${h.useDefault?"DEFAULT":`@value${w}`}`);m.forEach((h,w)=>{if(h.useDefault)return;let S=h.value;S!==null&&typeof S=="object"&&(S=JSON.stringify(S)),s.has(h.columnName)&&typeof S=="string"&&(S=S==="true"?1:0),p.input(`value${w}`,S)}),u.forEach((h,w)=>{p.input(`pkValue${w}`,h)});let b=o.map((h,w)=>`[${h}] = @pkValue${w}`),T=await p.query(`UPDATE [${n}] SET ${f.join(", ")} WHERE ${b.join(" AND ")}`);if(T.rowsAffected[0]===0)throw new d(404,{message:`Record with ${this.describeKey(o,u)} not found in table "${n}"`});l+=T.rowsAffected[0]??0}return await c.commit(),{updatedCount:l}}catch(l){throw await c.rollback(),l instanceof d?l:new d(500,{message:`Failed to update records in "${n}"`})}}async deleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await F(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(c=>c.value),i=a.transaction();await i.begin();try{let c=i.request();o.forEach((m,p)=>{c.input(`pk${p}`,m)});let l=o.map((m,p)=>`@pk${p}`).join(", "),u=await c.query(`DELETE FROM [${e}] WHERE [${s}] IN (${l})`);return await i.commit(),{deletedCount:u.rowsAffected[0]??0,fkViolation:!1,relatedRecords:[]}}catch(c){if(await i.rollback(),c.number===qd)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,n)};throw c instanceof d?c:new d(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await F(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(c=>c.value),i=a.transaction();await i.begin();try{let c=await this.getForeignKeyReferences(e,n),l=0,u=new Set,m=new Set,p=async(h,w,S,A)=>{let N=`${h}.${w}`;if(A.has(N))return;A.add(N);let R=await this.getForeignKeyReferences(h,n);for(let H of R){let $=i.request();S.forEach((P,ue)=>{$.input(`val${ue}`,P)});let J=S.map((P,ue)=>`@val${ue}`).join(", "),ee=(await $.query(`SELECT [${H.referencedColumn}] FROM [${h}] WHERE [${w}] IN (${J})`)).recordset.map(P=>P[H.referencedColumn]);ee.length>0&&await p(H.referencingTable,H.referencingColumn,ee,A)}let _=i.request();S.forEach((H,$)=>{_.input(`delVal${$}`,H)});let D=S.map((H,$)=>`@delVal${$}`).join(", "),x=await _.query(`DELETE FROM [${h}] WHERE [${w}] IN (${D})`);l+=x.rowsAffected[0]??0,u.add(h)};for(let h of c)u.has(h.referencingTable)||await p(h.referencingTable,h.referencingColumn,o,m);let f=i.request();o.forEach((h,w)=>{f.input(`mainPk${w}`,h)});let b=o.map((h,w)=>`@mainPk${w}`).join(", "),T=await f.query(`DELETE FROM [${e}] WHERE [${s}] IN (${b})`);return await i.commit(),{deletedCount:(T.rowsAffected[0]??0)+l}}catch(c){throw await i.rollback(),c instanceof d?c:new d(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t||t.length===0)throw new d(400,{message:"At least one record is required"});let s=(await F(n)).transaction();try{let o=Object.keys(t[0]),i=o.map(l=>`[${l}]`).join(", "),c=await this.getBooleanColumnSet(e,n);await s.begin();for(let l=0;l<t.length;l++){let u=t[l],m=s.request(),p=o.map(b=>{let T=u[b];return c.has(b)&&typeof T=="string"?T==="true"?1:0:T}),f=o.map((b,T)=>`@p${l}_${T}`).join(", ");o.forEach((b,T)=>{m.input(`p${l}_${T}`,p[T])});try{await m.query(`INSERT INTO [${e}] (${i}) VALUES (${f})`)}catch(b){throw new d(500,{message:`Failed to insert record ${l+1}: ${b instanceof Error?b.message:String(b)}`})}}return await s.commit(),{success:!0,message:`Successfully inserted ${t.length} record${t.length!==1?"s":""}`,successCount:t.length,failureCount:0}}catch(o){throw await s.rollback(),o instanceof d?o:new d(500,{message:`Failed to bulk insert records into "${e}"`})}}async executeQuery({query:e,db:t}){let n=await F(t);if(!e?.trim())throw new d(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),s=performance.now(),o=await n.request().query(a).catch(c=>{throw this.wrapError(c)}),i=performance.now()-s;if(o.recordset){let c=o.recordset;return{columns:o.recordset.columns?Object.keys(o.recordset.columns):Object.keys(c[0]??{}),rows:c,rowCount:c.length,duration:i,message:c.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:o.rowsAffected[0]??0,duration:i,message:`OK \u2014 ${o.rowsAffected[0]??0} row(s) affected`}}async getForeignKeyReferences(e,t){return(await(await F(t)).request().input("tableName",e).query(`
176
176
  SELECT
177
177
  fk.name AS constraint_name,
178
178
  OBJECT_NAME(fk.parent_object_id) AS referencing_table,
@@ -190,7 +190,7 @@ ${o.join(`,
190
190
  ${t===void 0?"":"AND t.name = @tableName"}
191
191
  GROUP BY t.name
192
192
  ORDER BY t.name
193
- `);return new Map(a.recordset.map(s=>[s.tableName,Number(s.estimate)]))}async countRows(e,t,n,a){if(!n){let i=(await this.rowEstimates(e,t)).get(t)??0;if(i>=ut)return{total:i,estimated:!0}}let s=e.request();a.forEach((i,c)=>{s.input(`p${c}`,i)});let o=await s.query(`SELECT COUNT(*) as total FROM ${Ne(t)} ${n}`);return{total:Number(o.recordset[0]?.total??0),estimated:!1}}async getTableRowCount(e,t){let n=await F(t);try{let a=await n.request().query(`SELECT COUNT(*) as count FROM [${e}]`);return Number(a.recordset[0]?.count??0)}catch(a){if(!tc(a))throw a;return(await this.rowEstimates(n,e)).get(e)??0}}async getPrimaryKeyColumns(e,t){return(await e.request().input("tableName",t).query(`
193
+ `);return new Map(a.recordset.map(s=>[s.tableName,Number(s.estimate)]))}async countRows(e,t,n,a){if(!n){let i=(await this.rowEstimates(e,t)).get(t)??0;if(i>=mt)return{total:i,estimated:!0}}let s=e.request();a.forEach((i,c)=>{s.input(`p${c}`,i)});let o=await s.query(`SELECT COUNT(*) as total FROM ${Ae(t)} ${n}`);return{total:Number(o.recordset[0]?.total??0),estimated:!1}}async getTableRowCount(e,t){let n=await F(t);try{let a=await n.request().query(`SELECT COUNT(*) as count FROM [${e}]`);return Number(a.recordset[0]?.count??0)}catch(a){if(!rc(a))throw a;return(await this.rowEstimates(n,e)).get(e)??0}}async getPrimaryKeyColumns(e,t){return(await e.request().input("tableName",t).query(`
194
194
  SELECT ku.COLUMN_NAME AS columnName
195
195
  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
196
196
  JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
@@ -218,13 +218,13 @@ ${o.join(`,
218
218
  WHERE i.object_id = OBJECT_ID(QUOTENAME('dbo') + '.' + QUOTENAME(@tableName))
219
219
  AND i.type > 0 AND i.is_hypothetical = 0
220
220
  ORDER BY i.is_primary_key DESC, i.name, ic.is_included_column, ic.key_ordinal, ic.index_column_id
221
- `),a=new Map;for(let s of n.recordset){let o=a.get(s.indexName)??{index:{indexName:s.indexName,columns:[],isUnique:s.isUnique,method:s.typeDesc.toLowerCase(),kind:s.isPrimaryKey?"primary":s.isUniqueConstraint?"unique-constraint":"index",definition:null},row:s,keys:[],included:[]};a.set(s.indexName,o),s.columnName!==null&&(s.isIncluded&&!s.typeDesc.endsWith("COLUMNSTORE")?o.included.push(Ne(s.columnName)):(o.index.columns.push(s.columnName),o.keys.push(`${Ne(s.columnName)}${s.isDescending?" DESC":""}`)))}return[...a.values()].map(({index:s,row:o,keys:i,included:c})=>({...s,definition:o.filterDefinition===null?null:`CREATE ${o.isUnique?"UNIQUE ":""}${o.typeDesc} INDEX ${Ne(o.indexName)} ON ${Ne(t)} (${i.join(", ")})${c.length?` INCLUDE (${c.join(", ")})`:""} WHERE ${o.filterDefinition}`}))}async assertTableExists(e,t){let n=await e.request().input("tableName",t).query(`
221
+ `),a=new Map;for(let s of n.recordset){let o=a.get(s.indexName)??{index:{indexName:s.indexName,columns:[],isUnique:s.isUnique,method:s.typeDesc.toLowerCase(),kind:s.isPrimaryKey?"primary":s.isUniqueConstraint?"unique-constraint":"index",definition:null},row:s,keys:[],included:[]};a.set(s.indexName,o),s.columnName!==null&&(s.isIncluded&&!s.typeDesc.endsWith("COLUMNSTORE")?o.included.push(Ae(s.columnName)):(o.index.columns.push(s.columnName),o.keys.push(`${Ae(s.columnName)}${s.isDescending?" DESC":""}`)))}return[...a.values()].map(({index:s,row:o,keys:i,included:c})=>({...s,definition:o.filterDefinition===null?null:`CREATE ${o.isUnique?"UNIQUE ":""}${o.typeDesc} INDEX ${Ae(o.indexName)} ON ${Ae(t)} (${i.join(", ")})${c.length?` INCLUDE (${c.join(", ")})`:""} WHERE ${o.filterDefinition}`}))}async assertTableExists(e,t){let n=await e.request().input("tableName",t).query(`
222
222
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES
223
223
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND TABLE_SCHEMA = 'dbo'
224
224
  `);if(Number(n.recordset[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`})}async assertColumnExists(e,t,n){let a=await e.request().input("tableName",t).input("columnName",n).query(`
225
225
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS
226
226
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = 'dbo'
227
- `);if(Number(a.recordset[0]?.cnt??0)===0)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`})}parseCheckConstraintValues(e){let t=e.match(/'([^']+)'/g);return!t||t.length===0?null:t.map(n=>n.slice(1,-1))}makeCursor(e){return this.encodeCursor({values:{_offset:e},sortColumns:["_offset"]})}decodeOffsetCursor(e){let t=this.decodeCursor(e);return Number(t?.values._offset??0)}}});function gs(r){if(r.length===0)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=hr(n.columnName);switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${n.operator} ?`),t.push(n.value);break;case"is":n.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(n.value));break;case"is not":n.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(n.value));break;case"like":case"ilike":e.push(`${a} LIKE ?`),t.push(n.value);break;case"not like":case"not ilike":e.push(`${a} NOT LIKE ?`),t.push(n.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function bs(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${hr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${hr(r)} ${e?.toUpperCase()||"ASC"}`:""}function Ts(r,e,t){let{values:n,sortColumns:a}=r;if(a.length===0)return{clause:"",values:[]};let c=t==="asc"===(e==="asc")?">":"<",l=a.map(hr).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function Vd(r,e){if(e)return"JSON";let t=r.toLowerCase().trim();return{serial:"INT AUTO_INCREMENT",serial4:"INT AUTO_INCREMENT",bigserial:"BIGINT AUTO_INCREMENT",serial8:"BIGINT AUTO_INCREMENT",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",numeric:"DECIMAL",decimal:"DECIMAL",real:"FLOAT",float4:"FLOAT",float:"FLOAT","double precision":"DOUBLE",float8:"DOUBLE",money:"DECIMAL(19, 4)",boolean:"TINYINT(1)",bool:"TINYINT(1)",text:"LONGTEXT",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"CHAR(36)",json:"JSON",jsonb:"JSON",xml:"LONGTEXT",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME","timestamp without time zone":"DATETIME","timestamp with time zone":"DATETIME",timestamptz:"DATETIME",interval:"VARCHAR(255)",bytea:"LONGBLOB",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)",point:"POINT",line:"LINESTRING",polygon:"POLYGON"}[t]||r.toUpperCase()}function Yd(r,e){if(!r?.trim())return null;let t=r.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("uuid()")?!e.toUpperCase().includes("CHAR")&&!e.toUpperCase().includes("TEXT")?null:"(UUID())":t.includes("current_timestamp")||t.includes("now()")?"(CURRENT_TIMESTAMP)":t.includes("current_date")?"(CURRENT_DATE)":`(${r.trim()})`:t==="null"?"NULL":t==="true"?"1":t==="false"?"0":r.trim()}function gr(r,e={}){let t=Vd(r.columnType,r.isArray??!1),n=`\`${r.columnName}\` ${t}`;if(!r.isNullable&&!r.isPrimaryKey&&(n+=" NOT NULL"),r.defaultValue&&!t.includes("AUTO_INCREMENT")){let a=Yd(r.defaultValue,t);a!==null&&(n+=` DEFAULT ${a}`)}return(r.isIdentity||e.preserveAutoIncrement)&&!t.includes("AUTO_INCREMENT")&&(n+=" AUTO_INCREMENT"),e.includeUnique&&r.isUnique&&!r.isPrimaryKey&&(n+=" UNIQUE"),e.includePrimaryKey&&r.isPrimaryKey&&(n+=" PRIMARY KEY"),n}var hr,rc=R(()=>{"use strict";y();hr=r=>`\`${r.replaceAll("`","``")}\``});var ac,zd,Gd,Qd,Jd,Xd,Zd,sc,ep,se,br,oc=R(()=>{"use strict";y();j();Xe();Ze();mt();Q();ze();rc();ac=1451,zd=1217,Gd=1061,Qd=1062,Jd=1553,Xd=new Set([1059,1071,1167,1170,1280,3152]),Zd=1142,sc=1146,ep={System:"info",Error:"error",Warning:"warning",Note:"info"},se=r=>`\`${r.replaceAll("`","``")}\``,br=class extends re{mariaDb=new WeakMap;async runQuery(e,t,n){let a=await K(e),[s]=await a.execute(t,n);return s}quoteIdentifier(e){return se(e)}mapToUniversalType(e){return $n(e)}mapFromUniversalType(e){return{text:"LONGTEXT",number:"INT",boolean:"TINYINT(1)",json:"JSON",date:"DATETIME",array:"JSON",enum:"TEXT"}[e]??"LONGTEXT"}buildTableDataQuery(e){let{tableName:t,cursor:n="",limit:a=50,direction:s="asc",sort:o=[],order:i="asc",filters:c=[]}=e,l=[],u=i;Array.isArray(o)&&o.length>0?(l=o.map(C=>C.columnName),u=o[0].direction):typeof o=="string"&&o&&(l=[o]);let{clause:m,values:p}=gs(c),f="",b=[];if(n){let C=this.decodeCursor(n);if(C){let _=Ts(C,s,u);f=_.clause,b=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let h=bs((Array.isArray(o),o),i),w=h;s==="desc"?h?w=h.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):l.length>0&&(w=`ORDER BY ${l.map(C=>`${se(C)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`):!h&&l.length>0&&(w=`ORDER BY ${l.map(C=>`${se(C)} ${u.toUpperCase()}`).join(", ")}`);let S=`SELECT * FROM ${se(t)} ${T} ${w} LIMIT ${a+1}`,A=[...p,...b],N=`SELECT COUNT(*) as total FROM ${se(t)} ${m}`;return{sql:S,values:A,countSql:N,countValues:p}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){if(t.length===0)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:s=[],cursor:o}=e,i=[];Array.isArray(s)&&s.length>0?i=s.map(f=>f.columnName):typeof s=="string"&&s&&(i=[s]);let c=f=>this.encodeCursor({values:Object.fromEntries(i.map(b=>[b,f[b]])),sortColumns:i}),l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(n&&(m=c(u)),o&&(p=c(l))):(o&&(m=c(u)),n&&(p=c(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){let{tableName:t,db:n,limit:a=50,direction:s="asc",sort:o=[],order:i="asc",cursor:c,filters:l=[]}=e,u=await K(n),{clause:m,values:p}=gs(l),[f,{total:b,estimated:T}]=await Promise.all([this.getPrimaryKeyColumns(u,t),this.countRows(u,t,m,p)]).catch(P=>{throw P.errno===sc?new d(404,{message:`Table "${t}" does not exist`}):this.wrapError(P)}),h=[],w=i;Array.isArray(o)&&o.length>0?(h=o.map(P=>P.columnName),w=o[0].direction):typeof o=="string"&&o&&(h=[o]);let S=[...h,...f.filter(P=>!h.includes(P))],A="",N=[];if(c){let P=this.decodeCursor(c);if(P){let ue=Ts(P,s,w);A=ue.clause,N=ue.values}}let C="";m&&A?C=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${A}`:m?C=m:A&&(C=`WHERE ${A}`);let _=bs((Array.isArray(o),o),i),D=f.filter(P=>!h.includes(P)),x=_;if(s==="desc")if(_){if(x=_.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),D.length){let P=w==="asc"?"DESC":"ASC";x+=`, ${D.map(ue=>`${se(ue)} ${P}`).join(", ")}`}}else S.length>0&&(x=`ORDER BY ${S.map(P=>`${se(P)} ${w==="asc"?"DESC":"ASC"}`).join(", ")}`);else!_&&S.length>0?x=`ORDER BY ${S.map(P=>`${se(P)} ${w.toUpperCase()}`).join(", ")}`:D.length&&(x+=`, ${D.map(P=>`${se(P)} ${w.toUpperCase()}`).join(", ")}`);let[H]=await u.execute(`SELECT * FROM ${se(t)} ${C} ${x} LIMIT ${Math.floor(a)+1}`,[...p,...N]),$=H,J=$.length>a;J&&($=$.slice(0,a)),s==="desc"&&($=$.reverse());let X=null,ee=null;if($.length>0&&S.length>0){let P=$[0],ue=$[$.length-1],st=ge=>({values:Object.fromEntries(S.map(ot=>[ot,ge[ot]])),sortColumns:S});s==="asc"?(J&&(X=this.encodeCursor(st(ue))),c&&(ee=this.encodeCursor(st(P)))):(c&&(X=this.encodeCursor(st(ue))),J&&(ee=this.encodeCursor(st(P))))}return{data:$,meta:{limit:a,total:b,...T&&{totalEstimated:!0},hasNextPage:s==="asc"?J:!!c,hasPreviousPage:s==="asc"?!!c:J,nextCursor:X,prevCursor:ee}}}async getDatabasesList(){try{let e=await K(),[t]=await e.execute(`
227
+ `);if(Number(a.recordset[0]?.cnt??0)===0)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`})}parseCheckConstraintValues(e){let t=e.match(/'([^']+)'/g);return!t||t.length===0?null:t.map(n=>n.slice(1,-1))}makeCursor(e){return this.encodeCursor({values:{_offset:e},sortColumns:["_offset"]})}decodeOffsetCursor(e){let t=this.decodeCursor(e);return Number(t?.values._offset??0)}}});function Ts(r){if(r.length===0)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=br(n.columnName);switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${n.operator} ?`),t.push(n.value);break;case"is":n.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(n.value));break;case"is not":n.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(n.value));break;case"like":case"ilike":e.push(`${a} LIKE ?`),t.push(n.value);break;case"not like":case"not ilike":e.push(`${a} NOT LIKE ?`),t.push(n.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Es(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${br(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${br(r)} ${e?.toUpperCase()||"ASC"}`:""}function ws(r,e,t){let{values:n,sortColumns:a}=r;if(a.length===0)return{clause:"",values:[]};let c=t==="asc"===(e==="asc")?">":"<",l=a.map(br).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function Gd(r,e){if(e)return"JSON";let t=r.toLowerCase().trim();return{serial:"INT AUTO_INCREMENT",serial4:"INT AUTO_INCREMENT",bigserial:"BIGINT AUTO_INCREMENT",serial8:"BIGINT AUTO_INCREMENT",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",numeric:"DECIMAL",decimal:"DECIMAL",real:"FLOAT",float4:"FLOAT",float:"FLOAT","double precision":"DOUBLE",float8:"DOUBLE",money:"DECIMAL(19, 4)",boolean:"TINYINT(1)",bool:"TINYINT(1)",text:"LONGTEXT",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"CHAR(36)",json:"JSON",jsonb:"JSON",xml:"LONGTEXT",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME","timestamp without time zone":"DATETIME","timestamp with time zone":"DATETIME",timestamptz:"DATETIME",interval:"VARCHAR(255)",bytea:"LONGBLOB",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)",point:"POINT",line:"LINESTRING",polygon:"POLYGON"}[t]||r.toUpperCase()}function Qd(r,e){if(!r?.trim())return null;let t=r.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("uuid()")?!e.toUpperCase().includes("CHAR")&&!e.toUpperCase().includes("TEXT")?null:"(UUID())":t.includes("current_timestamp")||t.includes("now()")?"(CURRENT_TIMESTAMP)":t.includes("current_date")?"(CURRENT_DATE)":`(${r.trim()})`:t==="null"?"NULL":t==="true"?"1":t==="false"?"0":r.trim()}function Tr(r,e={}){let t=Gd(r.columnType,r.isArray??!1),n=`\`${r.columnName}\` ${t}`;if(!r.isNullable&&!r.isPrimaryKey&&(n+=" NOT NULL"),r.defaultValue&&!t.includes("AUTO_INCREMENT")){let a=Qd(r.defaultValue,t);a!==null&&(n+=` DEFAULT ${a}`)}return(r.isIdentity||e.preserveAutoIncrement)&&!t.includes("AUTO_INCREMENT")&&(n+=" AUTO_INCREMENT"),e.includeUnique&&r.isUnique&&!r.isPrimaryKey&&(n+=" UNIQUE"),e.includePrimaryKey&&r.isPrimaryKey&&(n+=" PRIMARY KEY"),n}var br,sc=C(()=>{"use strict";y();br=r=>`\`${r.replaceAll("`","``")}\``});var oc,Jd,Xd,Zd,ep,tp,np,ic,rp,se,Er,cc=C(()=>{"use strict";y();j();Ze();et();dt();bt();Q();Ge();sc();oc=1451,Jd=1217,Xd=1061,Zd=1062,ep=1553,tp=new Set([1059,1071,1167,1170,1280,3152]),np=1142,ic=1146,rp={System:"info",Error:"error",Warning:"warning",Note:"info"},se=r=>`\`${r.replaceAll("`","``")}\``,Er=class extends re{mariaDb=new WeakMap;async runQuery(e,t,n){let a=await K(e),[s]=await a.execute(t,n);return s}quoteIdentifier(e){return se(e)}mapToUniversalType(e){return kn(e)}mapFromUniversalType(e){return{text:"LONGTEXT",number:"INT",boolean:"TINYINT(1)",json:"JSON",date:"DATETIME",array:"JSON",enum:"TEXT"}[e]??"LONGTEXT"}buildTableDataQuery(e){let{tableName:t,cursor:n="",limit:a=50,direction:s="asc",sort:o=[],order:i="asc",filters:c=[]}=e,l=[],u=i;Array.isArray(o)&&o.length>0?(l=o.map(R=>R.columnName),u=o[0].direction):typeof o=="string"&&o&&(l=[o]);let{clause:m,values:p}=Ts(c),f="",b=[];if(n){let R=this.decodeCursor(n);if(R){let _=ws(R,s,u);f=_.clause,b=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let h=Es((Array.isArray(o),o),i),w=h;s==="desc"?h?w=h.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):l.length>0&&(w=`ORDER BY ${l.map(R=>`${se(R)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`):!h&&l.length>0&&(w=`ORDER BY ${l.map(R=>`${se(R)} ${u.toUpperCase()}`).join(", ")}`);let S=`SELECT * FROM ${se(t)} ${T} ${w} LIMIT ${a+1}`,A=[...p,...b],N=`SELECT COUNT(*) as total FROM ${se(t)} ${m}`;return{sql:S,values:A,countSql:N,countValues:p}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){if(t.length===0)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:s=[],cursor:o}=e,i=[];Array.isArray(s)&&s.length>0?i=s.map(f=>f.columnName):typeof s=="string"&&s&&(i=[s]);let c=f=>this.encodeCursor({values:Object.fromEntries(i.map(b=>[b,f[b]])),sortColumns:i}),l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(n&&(m=c(u)),o&&(p=c(l))):(o&&(m=c(u)),n&&(p=c(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){let{tableName:t,db:n,limit:a=50,direction:s="asc",sort:o=[],order:i="asc",cursor:c,filters:l=[]}=e,u=await K(n),{clause:m,values:p}=Ts(l),[f,{total:b,estimated:T}]=await Promise.all([this.getPrimaryKeyColumns(u,t),this.countRows(u,t,m,p)]).catch(P=>{throw P.errno===ic?new d(404,{message:`Table "${t}" does not exist`}):this.wrapError(P)}),h=[],w=i;Array.isArray(o)&&o.length>0?(h=o.map(P=>P.columnName),w=o[0].direction):typeof o=="string"&&o&&(h=[o]);let S=[...h,...f.filter(P=>!h.includes(P))],A="",N=[];if(c){let P=this.decodeCursor(c);if(P){let ue=ws(P,s,w);A=ue.clause,N=ue.values}}let R="";m&&A?R=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${A}`:m?R=m:A&&(R=`WHERE ${A}`);let _=Es((Array.isArray(o),o),i),D=f.filter(P=>!h.includes(P)),x=_;if(s==="desc")if(_){if(x=_.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),D.length){let P=w==="asc"?"DESC":"ASC";x+=`, ${D.map(ue=>`${se(ue)} ${P}`).join(", ")}`}}else S.length>0&&(x=`ORDER BY ${S.map(P=>`${se(P)} ${w==="asc"?"DESC":"ASC"}`).join(", ")}`);else!_&&S.length>0?x=`ORDER BY ${S.map(P=>`${se(P)} ${w.toUpperCase()}`).join(", ")}`:D.length&&(x+=`, ${D.map(P=>`${se(P)} ${w.toUpperCase()}`).join(", ")}`);let[H]=await u.execute(`SELECT * FROM ${se(t)} ${R} ${x} LIMIT ${Math.floor(a)+1}`,[...p,...N]),$=H,J=$.length>a;J&&($=$.slice(0,a)),s==="desc"&&($=$.reverse());let X=null,ee=null;if($.length>0&&S.length>0){let P=$[0],ue=$[$.length-1],ot=be=>({values:Object.fromEntries(S.map(it=>[it,be[it]])),sortColumns:S});s==="asc"?(J&&(X=this.encodeCursor(ot(ue))),c&&(ee=this.encodeCursor(ot(P)))):(c&&(X=this.encodeCursor(ot(ue))),J&&(ee=this.encodeCursor(ot(P))))}return{data:$,meta:{limit:a,total:b,...T&&{totalEstimated:!0},hasNextPage:s==="asc"?J:!!c,hasPreviousPage:s==="asc"?!!c:J,nextCursor:X,prevCursor:ee}}}async getDatabasesList(){try{let e=await K(),[t]=await e.execute(`
228
228
  SELECT
229
229
  s.SCHEMA_NAME AS name,
230
230
  CONCAT(ROUND(COALESCE(SUM(t.data_length + t.index_length), 0) / 1024 / 1024, 2), ' MB') AS size,
@@ -243,10 +243,10 @@ ${o.join(`,
243
243
  @@hostname AS host,
244
244
  @@port AS port,
245
245
  @@max_connections AS max_connections
246
- `),[n]=await e.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!t[0])throw new d(500,{message:"No connection information returned from server"});let a=t[0],s=_e(ve());return{host:String(a.host||s.host),port:Number(a.port||s.port),user:String(a.user),database:String(a.database_name??""),version:String(a.version),active_connections:Number(n[0]?.cnt??0),max_connections:Number(a.max_connections)}}async getTablesList(e){let t=await K(e),n=await this.rowEstimates(t);return Promise.all([...n].map(async([a,s])=>{if(s>=ut)return{tableName:a,rowCount:s,rowCountEstimated:!0};let[o]=await t.execute(`SELECT COUNT(*) as count FROM ${se(a)}`);return{tableName:a,rowCount:Number(o[0]?.count??0)}}))}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=await K(t),i=a.map(m=>gr(m)),c=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&c.push(`PRIMARY KEY (${l.map(m=>`\`${m.columnName}\``).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&c.push(`UNIQUE KEY \`uq_${n}_${m.columnName}\` (\`${m.columnName}\`)`);let u=s?.map(m=>`CONSTRAINT \`${`fk_${n}_${m.columnName}_${m.referencedTable}_${m.referencedColumn}`}\` FOREIGN KEY (\`${m.columnName}\`) REFERENCES \`${m.referencedTable}\` (\`${m.referencedColumn}\`) ON UPDATE ${m.onUpdate} ON DELETE ${m.onDelete}`)??[];await o.execute(`CREATE TABLE \`${n}\` (
246
+ `),[n]=await e.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!t[0])throw new d(500,{message:"No connection information returned from server"});let a=t[0],s=Oe(qe());return{host:String(a.host||s.host),port:Number(a.port||s.port),user:String(a.user),database:String(a.database_name??""),version:String(a.version),active_connections:Number(n[0]?.cnt??0),max_connections:Number(a.max_connections)}}async getTablesList(e){let t=await K(e),n=await this.rowEstimates(t);return Promise.all([...n].map(async([a,s])=>{if(s>=mt)return{tableName:a,rowCount:s,rowCountEstimated:!0};let[o]=await t.execute(`SELECT COUNT(*) as count FROM ${se(a)}`);return{tableName:a,rowCount:Number(o[0]?.count??0)}}))}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=await K(t),i=a.map(m=>Tr(m)),c=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&c.push(`PRIMARY KEY (${l.map(m=>`\`${m.columnName}\``).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&c.push(`UNIQUE KEY \`uq_${n}_${m.columnName}\` (\`${m.columnName}\`)`);let u=s?.map(m=>`CONSTRAINT \`${`fk_${n}_${m.columnName}_${m.referencedTable}_${m.referencedColumn}`}\` FOREIGN KEY (\`${m.columnName}\`) REFERENCES \`${m.referencedTable}\` (\`${m.referencedColumn}\`) ON UPDATE ${m.onUpdate} ON DELETE ${m.onDelete}`)??[];await o.execute(`CREATE TABLE \`${n}\` (
247
247
  ${[...i,...c,...u].join(`,
248
248
  `)}
249
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`)}async deleteTable(e){let{tableName:t,db:n,cascade:a}=e,s=await K(n),[o]=await s.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]);if(Number(o[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`});let i=await this.getTableRowCount(s,t);if(!a){let c=await this.getRelatedRecordsForTable(t,n);if(c.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:c}}try{if(a){let c=await s.getConnection();try{await c.execute("SET FOREIGN_KEY_CHECKS = 0"),await c.execute(`DROP TABLE \`${t}\``),await c.execute("SET FOREIGN_KEY_CHECKS = 1")}finally{c.release()}}else await s.execute(`DROP TABLE \`${t}\``);return{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(c){await s.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{});let l=c;if(l.errno===zd||l.errno===ac)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,n)};throw c instanceof d?c:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){try{let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await K(a);await this.assertTableExists(s,t);let[o]=await s.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[n]);if(Number(o[0]?.cnt??0)>0)throw new d(409,{message:`Table "${n}" already exists`});await s.execute(`RENAME TABLE \`${t.replaceAll("`","``")}\` TO \`${n.replaceAll("`","``")}\``)}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,db:t}){let n=await K(t),[a]=await n.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[e]);if(Number(a[0]?.cnt??0)===0)throw new d(404,{message:`Table "${e}" does not exist`});let[s]=await n.execute(`SHOW CREATE TABLE \`${e}\``),o=s[0],i=o?.["Create Table"]??o?.create_table??"";if(!i)throw new d(500,{message:`Failed to retrieve schema for table "${e}"`});return i}async getTableColumns({tableName:e,db:t}){let n=await K(t),a=await this.isMariaDb(n)?`EXISTS (
249
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`)}async deleteTable(e){let{tableName:t,db:n,cascade:a}=e,s=await K(n),[o]=await s.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]);if(Number(o[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`});let i=await this.getTableRowCount(s,t);if(!a){let c=await this.getRelatedRecordsForTable(t,n);if(c.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:c}}try{if(a){let c=await s.getConnection();try{await c.execute("SET FOREIGN_KEY_CHECKS = 0"),await c.execute(`DROP TABLE \`${t}\``),await c.execute("SET FOREIGN_KEY_CHECKS = 1")}finally{c.release()}}else await s.execute(`DROP TABLE \`${t}\``);return{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(c){await s.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{});let l=c;if(l.errno===Jd||l.errno===oc)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,n)};throw c instanceof d||pe(c)?c:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){try{let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await K(a);await this.assertTableExists(s,t);let[o]=await s.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[n]);if(Number(o[0]?.cnt??0)>0)throw new d(409,{message:`Table "${n}" already exists`});await s.execute(`RENAME TABLE \`${t.replaceAll("`","``")}\` TO \`${n.replaceAll("`","``")}\``)}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,db:t}){let n=await K(t),[a]=await n.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[e]);if(Number(a[0]?.cnt??0)===0)throw new d(404,{message:`Table "${e}" does not exist`});let[s]=await n.execute(`SHOW CREATE TABLE \`${e}\``),o=s[0],i=o?.["Create Table"]??o?.create_table??"";if(!i)throw new d(500,{message:`Failed to retrieve schema for table "${e}"`});return i}async getTableColumns({tableName:e,db:t}){let n=await K(t),a=await this.isMariaDb(n)?`EXISTS (
250
250
  SELECT 1 FROM information_schema.CHECK_CONSTRAINTS cc
251
251
  WHERE cc.CONSTRAINT_SCHEMA = c.TABLE_SCHEMA
252
252
  AND cc.TABLE_NAME = c.TABLE_NAME
@@ -272,13 +272,13 @@ ${o.join(`,
272
272
  AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
273
273
  WHERE c.TABLE_SCHEMA = DATABASE()
274
274
  AND c.TABLE_NAME = ?
275
- ORDER BY c.ORDINAL_POSITION`,[e]);if(!s||s.length===0)throw new d(404,{message:`Table "${e}" does not exist`});return s.map(o=>{let i=o.dataType==="enum"||o.dataType==="set",[c,l]=o.isJsonText?["json","json"]:[o.dataType,o.columnType];return{columnName:o.columnName,dataType:$n(c,l),dataTypeLabel:Hr(c,l),isNullable:!!o.isNullable,columnDefault:o.columnDefault??null,isPrimaryKey:!!o.isPrimaryKey,isForeignKey:!!o.isForeignKey,referencedTable:o.referencedTable??null,...o.referencedSchema&&{referencedSchema:o.referencedSchema},referencedColumn:o.referencedColumn??null,enumValues:i?this.parseMysqlEnumValues(o.columnType):null}})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,isArray:u,db:m}=e,p=await K(m);await this.assertTableExists(p,t);let[f]=await p.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,n]);if(Number(f[0]?.cnt??0)>0)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let b=gr({columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,isArray:u},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${t}\` ADD COLUMN ${b}`)}async deleteColumn(e){let{tableName:t,columnName:n,db:a}=e,s=await K(a);await this.assertTableExists(s,t),await this.assertColumnExists(s,t,n);let[o]=await s.execute(`ALTER TABLE \`${t}\` DROP COLUMN \`${n}\``);return{deletedCount:o.affectedRows}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o,db:i}=e,c=await K(i);await this.assertTableExists(c,t);let[l]=await c.execute("SELECT EXTRA FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ? LIMIT 1",[t,n]),u=l[0];if(!u)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});let m=gr({columnName:n,columnType:a,defaultValue:o,isNullable:s},{preserveAutoIncrement:u.EXTRA?.toLowerCase().includes("auto_increment")});await c.execute(`ALTER TABLE \`${t}\` MODIFY COLUMN ${m}`)}async renameColumn(e){let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await K(s);await this.assertTableExists(o,t),await this.assertColumnExists(o,t,n);let[i]=await o.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,a]);if(Number(i[0]?.cnt??0)>0)throw new d(409,{message:`Column "${a}" already exists in table "${t}"`});await o.execute(`ALTER TABLE \`${t}\` RENAME COLUMN \`${n}\` TO \`${a}\``)}async getServerLogs({db:e}){let t=await K(e);try{let[n]=await t.query(`${$e} SELECT UNIX_TIMESTAMP(LOGGED) AS epoch, THREAD_ID, PRIO,
275
+ ORDER BY c.ORDINAL_POSITION`,[e]);if(!s||s.length===0)throw new d(404,{message:`Table "${e}" does not exist`});return s.map(o=>{let i=o.dataType==="enum"||o.dataType==="set",[c,l]=o.isJsonText?["json","json"]:[o.dataType,o.columnType];return{columnName:o.columnName,dataType:kn(c,l),dataTypeLabel:Wr(c,l),isNullable:!!o.isNullable,columnDefault:o.columnDefault??null,isPrimaryKey:!!o.isPrimaryKey,isForeignKey:!!o.isForeignKey,referencedTable:o.referencedTable??null,...o.referencedSchema&&{referencedSchema:o.referencedSchema},referencedColumn:o.referencedColumn??null,enumValues:i?this.parseMysqlEnumValues(o.columnType):null}})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,isArray:u,db:m}=e,p=await K(m);await this.assertTableExists(p,t);let[f]=await p.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,n]);if(Number(f[0]?.cnt??0)>0)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let b=Tr({columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,isArray:u},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${t}\` ADD COLUMN ${b}`)}async deleteColumn(e){let{tableName:t,columnName:n,db:a}=e,s=await K(a);await this.assertTableExists(s,t),await this.assertColumnExists(s,t,n);let[o]=await s.execute(`ALTER TABLE \`${t}\` DROP COLUMN \`${n}\``);return{deletedCount:o.affectedRows}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o,db:i}=e,c=await K(i);await this.assertTableExists(c,t);let[l]=await c.execute("SELECT EXTRA FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ? LIMIT 1",[t,n]),u=l[0];if(!u)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});let m=Tr({columnName:n,columnType:a,defaultValue:o,isNullable:s},{preserveAutoIncrement:u.EXTRA?.toLowerCase().includes("auto_increment")});await c.execute(`ALTER TABLE \`${t}\` MODIFY COLUMN ${m}`)}async renameColumn(e){let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await K(s);await this.assertTableExists(o,t),await this.assertColumnExists(o,t,n);let[i]=await o.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,a]);if(Number(i[0]?.cnt??0)>0)throw new d(409,{message:`Column "${a}" already exists in table "${t}"`});await o.execute(`ALTER TABLE \`${t}\` RENAME COLUMN \`${n}\` TO \`${a}\``)}async getServerLogs({db:e}){let t=await K(e);try{let[n]=await t.query(`${Me} SELECT UNIX_TIMESTAMP(LOGGED) AS epoch, THREAD_ID, PRIO,
276
276
  ERROR_CODE, SUBSYSTEM, DATA
277
- FROM performance_schema.error_log ORDER BY LOGGED DESC LIMIT ${500}`);return{available:!0,source:"performance_schema.error_log",entries:Oe(n.reverse().map(a=>({ts:new Date(Number(a.epoch)*1e3).toISOString(),level:ep[a.PRIO]??"info",rawLevel:String(a.PRIO),source:a.SUBSYSTEM?String(a.SUBSYSTEM):void 0,code:a.ERROR_CODE?String(a.ERROR_CODE):void 0,message:String(a.DATA),detail:he({thread:a.THREAD_ID})})))}}catch(n){let a=n.errno;if(a===Zd)return ne("Reading the server log needs: GRANT SELECT ON performance_schema.error_log TO <user>;");if(a===sc)return ne("The server keeps no error_log table. It needs MySQL 8.0.22 or later; MariaDB has no equivalent.");throw this.wrapError(n)}}async getTableIndexes({tableName:e,db:t}){try{return await this.listIndexes(await K(t),e)}catch(n){throw this.wrapError(n)}}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o,db:i}=e;try{let c=await K(i);await this.assertTableExists(c,t);let[l]=await c.execute("SELECT COLUMN_NAME AS columnName FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]),u=new Set(l.map(p=>String(p.columnName))),m=a.find(p=>!u.has(p));if(m!==void 0)throw new d(400,{message:`Column "${m}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});await c.query(`CREATE ${s?"UNIQUE ":""}INDEX ${se(n)} ON ${se(t)} (${a.map(se).join(", ")})`)}catch(c){let l=c.errno;throw c instanceof Error&&(l===Gd||l===Qd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&Xd.has(l)?new d(400,{message:c.message,cause:c}):this.wrapError(c)}}async dropIndex({tableName:e,indexName:t,db:n}){try{let a=await K(n),s=(await this.listIndexes(a,e)).find(o=>o.indexName===t);if(!s)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(s.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});await a.query(`DROP INDEX ${se(t)} ON ${se(e)}`)}catch(a){throw a instanceof Error&&a.errno===Jd?new d(400,{message:a.message,cause:a}):this.wrapError(a)}}async addRecord({db:e,params:t}){let{tableName:n,data:a}=t,s=await K(e),o=await this.getBooleanColumnSet(n,e),i=Object.keys(a),c=Object.values(a).map((u,m)=>o.has(i[m])&&typeof u=="string"?u==="true"?1:0:u),[l]=await s.execute(`INSERT INTO \`${n}\` (${i.map(u=>`\`${u}\``).join(", ")}) VALUES (${i.map(()=>"?").join(", ")})`,c);if(l.affectedRows===0)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:l.affectedRows}}async updateRecords({params:e,db:t}){let{tableName:n}=e,a=await K(t),s=await this.getBooleanColumnSet(n,t),o=this.resolveKeyColumns(e);this.assertWholeKey(await this.getPrimaryKeyColumns(a,n),o);let i=this.groupUpdatesByKey(e,o),c=await a.getConnection();await c.beginTransaction();try{let l=0;for(let{keyValues:u,rowUpdates:m}of i){let p=m.map(h=>`\`${h.columnName}\` = ${h.useDefault?"DEFAULT":"?"}`),f=m.filter(h=>!h.useDefault).map(h=>h.value!==null&&typeof h.value=="object"?JSON.stringify(h.value):s.has(h.columnName)&&typeof h.value=="string"?h.value==="true"?1:0:h.value);f.push(...u);let b=o.map(h=>`\`${h}\` = ?`),[T]=await c.execute(`UPDATE \`${n}\` SET ${p.join(", ")} WHERE ${b.join(" AND ")}`,f);if(T.affectedRows===0)throw new d(404,{message:`Record with ${this.describeKey(o,u)} not found in table "${n}"`});l+=T.affectedRows}return await c.commit(),{updatedCount:l}}catch(l){throw await c.rollback(),l instanceof d?l:new d(500,{message:`Failed to update records in "${n}"`})}finally{c.release()}}async deleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await K(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(l=>l.value),i=o.map(()=>"?").join(", "),c=await a.getConnection();await c.beginTransaction();try{let[l]=await c.execute(`DELETE FROM \`${e}\` WHERE \`${s}\` IN (${i})`,o);return await c.commit(),{deletedCount:l.affectedRows,fkViolation:!1,relatedRecords:[]}}catch(l){if(await c.rollback(),l.errno===ac)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,n)};throw l instanceof d?l:new d(500,{message:`Failed to delete records from "${e}"`})}finally{c.release()}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await K(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(c=>c.value),i=await a.getConnection();await i.beginTransaction();try{let c=await this.getForeignKeyReferences(e,n),l=0,u=new Map,m=async(b,T,h)=>{let w=`${b}.${T}`,S=u.get(w)??new Set;u.set(w,S);let A=h.filter(D=>!S.has(String(D)));if(A.length===0)return;for(let D of A)S.add(String(D));let N=await this.getForeignKeyReferences(b,n);for(let D of N){let x=A.map(()=>"?").join(", "),[H]=await i.execute(`SELECT \`${D.referencedColumn}\` FROM \`${b}\` WHERE \`${T}\` IN (${x})`,A),$=H.map(J=>J[D.referencedColumn]);$.length>0&&await m(D.referencingTable,D.referencingColumn,$)}let C=A.map(()=>"?").join(", "),[_]=await i.execute(`DELETE FROM \`${b}\` WHERE \`${T}\` IN (${C})`,A);l+=_.affectedRows};for(let b of c)await m(b.referencingTable,b.referencingColumn,o);let p=o.map(()=>"?").join(", "),[f]=await i.execute(`DELETE FROM \`${e}\` WHERE \`${s}\` IN (${p})`,o);return await i.commit(),{deletedCount:f.affectedRows+l}}catch(c){throw await i.rollback(),c instanceof d?c:new d(500,{message:`Failed to force delete records from "${e}"`})}finally{i.release()}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t||t.length===0)throw new d(400,{message:"At least one record is required"});let s=await(await K(n)).getConnection();try{let o=Object.keys(t[0]),i=o.map(l=>`\`${l}\``).join(", "),c=await this.getBooleanColumnSet(e,n);await s.beginTransaction();for(let l=0;l<t.length;l++){let u=t[l],m=o.map(p=>{let f=u[p];return c.has(p)&&typeof f=="string"?f==="true"?1:0:f});try{await s.execute(`INSERT INTO \`${e}\` (${i}) VALUES (${o.map(()=>"?").join(", ")})`,m)}catch(p){throw new d(500,{message:`Failed to insert record ${l+1}: ${p instanceof Error?p.message:String(p)}`})}}return await s.commit(),{success:!0,message:`Successfully inserted ${t.length} record${t.length!==1?"s":""}`,successCount:t.length,failureCount:0}}catch(o){throw await s.rollback(),o instanceof d?o:new d(500,{message:`Failed to bulk insert records into "${e}"`})}finally{s.release()}}async executeQuery({query:e,db:t}){let n=await K(t);if(!e?.trim())throw new d(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),s=performance.now(),[o,i]=await n.execute(a),c=performance.now()-s;if(Array.isArray(o)){let u=o;return{columns:i?i.map(p=>p.name):Object.keys(u[0]??{}),rows:u,rowCount:u.length,duration:c,message:u.length===0?"OK":void 0}}let l=o;return{columns:[],rows:[],rowCount:l.affectedRows,duration:c,message:`OK \u2014 ${l.affectedRows} row(s) affected`}}async rowEstimates(e,t){let n=await e.getConnection();try{await n.query("SET SESSION information_schema_stats_expiry = 0").catch(()=>{});let[a]=await n.query(`SELECT table_name AS tableName, table_rows AS estimate
277
+ FROM performance_schema.error_log ORDER BY LOGGED DESC LIMIT ${500}`);return{available:!0,source:"performance_schema.error_log",entries:Ie(n.reverse().map(a=>({ts:new Date(Number(a.epoch)*1e3).toISOString(),level:rp[a.PRIO]??"info",rawLevel:String(a.PRIO),source:a.SUBSYSTEM?String(a.SUBSYSTEM):void 0,code:a.ERROR_CODE?String(a.ERROR_CODE):void 0,message:String(a.DATA),detail:ge({thread:a.THREAD_ID})})))}}catch(n){let a=n.errno;if(a===np)return ne("Reading the server log needs: GRANT SELECT ON performance_schema.error_log TO <user>;");if(a===ic)return ne("The server keeps no error_log table. It needs MySQL 8.0.22 or later; MariaDB has no equivalent.");throw this.wrapError(n)}}async getTableIndexes({tableName:e,db:t}){try{return await this.listIndexes(await K(t),e)}catch(n){throw this.wrapError(n)}}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o,db:i}=e;try{let c=await K(i);await this.assertTableExists(c,t);let[l]=await c.execute("SELECT COLUMN_NAME AS columnName FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]),u=new Set(l.map(p=>String(p.columnName))),m=a.find(p=>!u.has(p));if(m!==void 0)throw new d(400,{message:`Column "${m}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});await c.query(`CREATE ${s?"UNIQUE ":""}INDEX ${se(n)} ON ${se(t)} (${a.map(se).join(", ")})`)}catch(c){let l=c.errno;throw c instanceof Error&&(l===Xd||l===Zd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&tp.has(l)?new d(400,{message:c.message,cause:c}):this.wrapError(c)}}async dropIndex({tableName:e,indexName:t,db:n}){try{let a=await K(n),s=(await this.listIndexes(a,e)).find(o=>o.indexName===t);if(!s)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(s.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});await a.query(`DROP INDEX ${se(t)} ON ${se(e)}`)}catch(a){throw a instanceof Error&&a.errno===ep?new d(400,{message:a.message,cause:a}):this.wrapError(a)}}async addRecord({db:e,params:t}){let{tableName:n,data:a}=t,s=await K(e),o=await this.getBooleanColumnSet(n,e),i=Object.keys(a),c=Object.values(a).map((u,m)=>o.has(i[m])&&typeof u=="string"?u==="true"?1:0:u),[l]=await s.execute(`INSERT INTO \`${n}\` (${i.map(u=>`\`${u}\``).join(", ")}) VALUES (${i.map(()=>"?").join(", ")})`,c);if(l.affectedRows===0)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:l.affectedRows}}async updateRecords({params:e,db:t}){let{tableName:n}=e,a=await K(t),s=await this.getBooleanColumnSet(n,t),o=this.resolveKeyColumns(e);this.assertWholeKey(await this.getPrimaryKeyColumns(a,n),o);let i=this.groupUpdatesByKey(e,o),c=await a.getConnection();await c.beginTransaction();try{let l=0;for(let{keyValues:u,rowUpdates:m}of i){let p=m.map(h=>`\`${h.columnName}\` = ${h.useDefault?"DEFAULT":"?"}`),f=m.filter(h=>!h.useDefault).map(h=>h.value!==null&&typeof h.value=="object"?JSON.stringify(h.value):s.has(h.columnName)&&typeof h.value=="string"?h.value==="true"?1:0:h.value);f.push(...u);let b=o.map(h=>`\`${h}\` = ?`),[T]=await c.execute(`UPDATE \`${n}\` SET ${p.join(", ")} WHERE ${b.join(" AND ")}`,f);if(T.affectedRows===0)throw new d(404,{message:`Record with ${this.describeKey(o,u)} not found in table "${n}"`});l+=T.affectedRows}return await c.commit(),{updatedCount:l}}catch(l){throw await c.rollback(),l instanceof d||pe(l)?l:new d(500,{message:`Failed to update records in "${n}"`})}finally{c.release()}}async deleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await K(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(l=>l.value),i=o.map(()=>"?").join(", "),c=await a.getConnection();await c.beginTransaction();try{let[l]=await c.execute(`DELETE FROM \`${e}\` WHERE \`${s}\` IN (${i})`,o);return await c.commit(),{deletedCount:l.affectedRows,fkViolation:!1,relatedRecords:[]}}catch(l){if(await c.rollback(),l.errno===oc)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,n)};throw l instanceof d||pe(l)?l:new d(500,{message:`Failed to delete records from "${e}"`})}finally{c.release()}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:n}){let a=await K(n),s=t[0]?.columnName;if(!s)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(a,e));let o=t.map(c=>c.value),i=await a.getConnection();await i.beginTransaction();try{let c=await this.getForeignKeyReferences(e,n),l=0,u=new Map,m=async(b,T,h)=>{let w=`${b}.${T}`,S=u.get(w)??new Set;u.set(w,S);let A=h.filter(D=>!S.has(String(D)));if(A.length===0)return;for(let D of A)S.add(String(D));let N=await this.getForeignKeyReferences(b,n);for(let D of N){let x=A.map(()=>"?").join(", "),[H]=await i.execute(`SELECT \`${D.referencedColumn}\` FROM \`${b}\` WHERE \`${T}\` IN (${x})`,A),$=H.map(J=>J[D.referencedColumn]);$.length>0&&await m(D.referencingTable,D.referencingColumn,$)}let R=A.map(()=>"?").join(", "),[_]=await i.execute(`DELETE FROM \`${b}\` WHERE \`${T}\` IN (${R})`,A);l+=_.affectedRows};for(let b of c)await m(b.referencingTable,b.referencingColumn,o);let p=o.map(()=>"?").join(", "),[f]=await i.execute(`DELETE FROM \`${e}\` WHERE \`${s}\` IN (${p})`,o);return await i.commit(),{deletedCount:f.affectedRows+l}}catch(c){throw await i.rollback(),c instanceof d||pe(c)?c:new d(500,{message:`Failed to force delete records from "${e}"`})}finally{i.release()}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t||t.length===0)throw new d(400,{message:"At least one record is required"});let s=await(await K(n)).getConnection();try{let o=Object.keys(t[0]),i=o.map(l=>`\`${l}\``).join(", "),c=await this.getBooleanColumnSet(e,n);await s.beginTransaction();for(let l=0;l<t.length;l++){let u=t[l],m=o.map(p=>{let f=u[p];return c.has(p)&&typeof f=="string"?f==="true"?1:0:f});try{await s.execute(`INSERT INTO \`${e}\` (${i}) VALUES (${o.map(()=>"?").join(", ")})`,m)}catch(p){throw pe(p)?p:new d(500,{message:`Failed to insert record ${l+1}: ${p instanceof Error?p.message:String(p)}`})}}return await s.commit(),{success:!0,message:`Successfully inserted ${t.length} record${t.length!==1?"s":""}`,successCount:t.length,failureCount:0}}catch(o){throw await s.rollback(),o instanceof d||pe(o)?o:new d(500,{message:`Failed to bulk insert records into "${e}"`})}finally{s.release()}}async executeQuery({query:e,db:t}){let n=await K(t);if(!e?.trim())throw new d(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),s=performance.now(),[o,i]=await n.execute(a),c=performance.now()-s;if(Array.isArray(o)){let u=o;return{columns:i?i.map(p=>p.name):Object.keys(u[0]??{}),rows:u,rowCount:u.length,duration:c,message:u.length===0?"OK":void 0}}let l=o;return{columns:[],rows:[],rowCount:l.affectedRows,duration:c,message:`OK \u2014 ${l.affectedRows} row(s) affected`}}async rowEstimates(e,t){let n=await e.getConnection();try{await n.query("SET SESSION information_schema_stats_expiry = 0").catch(()=>{});let[a]=await n.query(`SELECT table_name AS tableName, table_rows AS estimate
278
278
  FROM information_schema.tables
279
279
  WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'
280
280
  ${t===void 0?"":"AND table_name = ?"}
281
- ORDER BY table_name`,t===void 0?[]:[t]);return new Map(a.map(s=>[s.tableName,Number(s.estimate??0)]))}finally{n.release()}}async countRows(e,t,n,a){if(!n){let o=(await this.rowEstimates(e,t)).get(t)??0;if(o>=ut)return{total:o,estimated:!0}}let[s]=await e.execute(`SELECT COUNT(*) as total FROM ${se(t)} ${n}`,a);return{total:Number(s[0]?.total??0),estimated:!1}}isMariaDb(e){let t=this.mariaDb.get(e);return t||(t=e.query("SELECT VERSION() LIKE '%MariaDB%' AS mariadb").then(([n])=>Number(n[0]?.mariadb)===1).catch(n=>{throw this.mariaDb.delete(e),n}),this.mariaDb.set(e,t)),t}async getPrimaryKeyColumns(e,t){let[n]=await e.execute(`SELECT COLUMN_NAME as column_name
281
+ ORDER BY table_name`,t===void 0?[]:[t]);return new Map(a.map(s=>[s.tableName,Number(s.estimate??0)]))}finally{n.release()}}async countRows(e,t,n,a){if(!n){let o=(await this.rowEstimates(e,t)).get(t)??0;if(o>=mt)return{total:o,estimated:!0}}let[s]=await e.execute(`SELECT COUNT(*) as total FROM ${se(t)} ${n}`,a);return{total:Number(s[0]?.total??0),estimated:!1}}isMariaDb(e){let t=this.mariaDb.get(e);return t||(t=e.query("SELECT VERSION() LIKE '%MariaDB%' AS mariadb").then(([n])=>Number(n[0]?.mariadb)===1).catch(n=>{throw this.mariaDb.delete(e),n}),this.mariaDb.set(e,t)),t}async getPrimaryKeyColumns(e,t){let[n]=await e.execute(`SELECT COLUMN_NAME as column_name
282
282
  FROM information_schema.COLUMNS
283
283
  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_KEY = 'PRI'
284
284
  ORDER BY ORDINAL_POSITION`,[t]);return n.map(a=>a.column_name)}async getForeignKeyReferences(e,t){let n=await K(t),[a]=await n.execute(`SELECT
@@ -294,24 +294,24 @@ ${o.join(`,
294
294
  AND kcu.TABLE_NAME = tc.TABLE_NAME
295
295
  WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
296
296
  AND kcu.TABLE_SCHEMA = DATABASE()
297
- AND kcu.REFERENCED_TABLE_NAME = ?`,[e]);return a.map(s=>({constraintName:s.constraint_name,referencingTable:s.referencing_table,referencingColumn:s.referencing_column,referencedTable:s.referenced_table,referencedColumn:s.referenced_column}))}async getRelatedRecordsForTable(e,t){let n=await this.getForeignKeyReferences(e,t);if(n.length===0)return[];let a=await K(t),s=[];for(let o of n){let[i]=await a.execute(`SELECT * FROM \`${o.referencingTable}\` LIMIT 100`);i.length>0&&s.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:i})}return s}async getRelatedRecords(e,t,n){let a=await this.getForeignKeyReferences(e,n);if(a.length===0)return[];let s=await K(n),o=t.map(l=>l.value),i=[],c=new Map;for(let l of a){let u=`${l.referencingTable}.${l.referencingColumn}`;c.has(u)||c.set(u,[]),c.get(u)?.push(l)}for(let[,l]of c){let u=l[0];if(!u||!t.find(b=>b.columnName===u.referencedColumn))continue;let p=o.map(()=>"?").join(", "),[f]=await s.execute(`SELECT * FROM \`${u.referencingTable}\` WHERE \`${u.referencingColumn}\` IN (${p}) LIMIT 100`,o);f.length>0&&i.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:f})}return i}async getTableRowCount(e,t){let[n]=await e.execute(`SELECT COUNT(*) as count FROM \`${t}\``);return Number(n[0]?.count??0)}async getBooleanColumnSet(e,t){let n=await this.getTableColumns({tableName:e,db:t});return new Set(n.filter(a=>a.dataTypeLabel==="boolean").map(a=>a.columnName))}async listIndexes(e,t){await this.assertTableExists(e,t);let[n]=await e.execute("SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? ORDER BY INDEX_NAME, SEQ_IN_INDEX",[t]),a=new Map;for(let s of n){let o=String(s.INDEX_NAME),i=a.get(o)??{index:{indexName:o,columns:[],isUnique:Number(s.NON_UNIQUE)===0,method:s.INDEX_TYPE?String(s.INDEX_TYPE).toLowerCase():null,kind:o==="PRIMARY"?"primary":Number(s.NON_UNIQUE)===0?"unique-constraint":"index",definition:null},parts:[],hasExpression:!1};a.set(o,i);let c=s.EXPRESSION??null;s.COLUMN_NAME===null&&c!==null?(i.index.columns.push(c),i.parts.push(`(${c})${s.COLLATION==="D"?" DESC":""}`),i.hasExpression=!0):(i.index.columns.push(String(s.COLUMN_NAME)),i.parts.push(`${se(String(s.COLUMN_NAME))}${s.SUB_PART===null?"":`(${s.SUB_PART})`}${s.COLLATION==="D"?" DESC":""}`))}return[...a.values()].map(({index:s,parts:o,hasExpression:i})=>({...s,definition:i?`CREATE ${s.isUnique?"UNIQUE ":""}INDEX ${se(s.indexName)} ON ${se(t)} (${o.join(", ")})`:null})).sort((s,o)=>+(o.kind==="primary")-+(s.kind==="primary")||(s.indexName<o.indexName?-1:1))}async assertTableExists(e,t){let[n]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]);if(Number(n[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`})}async assertColumnExists(e,t,n){let[a]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,n]);if(Number(a[0]?.cnt??0)===0)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`})}parseMysqlEnumValues(e){let t=e.match(/^(?:enum|set)\((.+)\)$/i);return t?.[1]?t[1].split(",").map(n=>n.trim().replace(/^'|'$/g,"")):null}}});function mc(r,e,t){let n=[];for(let a of r){let s=O(a.columnName),o=t.get(a.columnName),i=a.value.toLowerCase()==="null";switch(a.operator){case"=":case"!=":case">":case">=":case"<":case"<=":n.push(`${s} ${a.operator} ${Ue(a.value,o,e)}`);break;case"is":n.push(i?`${s} IS NULL`:`${s} = ${Ue(a.value,o,e)}`);break;case"is not":n.push(i?`${s} IS NOT NULL`:`${s} != ${Ue(a.value,o,e)}`);break;case"like":n.push(`${Rn(s,o)} LIKE ${e(a.value)}`);break;case"not like":n.push(`${Rn(s,o)} NOT LIKE ${e(a.value)}`);break;case"ilike":n.push(`UPPER(${Rn(s,o)}) LIKE UPPER(${e(a.value)})`);break;case"not ilike":n.push(`UPPER(${Rn(s,o)}) NOT LIKE UPPER(${e(a.value)})`);break}}return n}function Ss(r,e,t){if(e)throw new d(400,{message:"Oracle has no array column type. Use a json column (JSON on Oracle 23ai) instead."});let n=r.toLowerCase().trim();return{serial:"NUMBER(10)",serial4:"NUMBER(10)",bigserial:"NUMBER(19)",serial8:"NUMBER(19)",smallserial:"NUMBER(5)",serial2:"NUMBER(5)",int:"NUMBER(10)",int4:"NUMBER(10)",integer:"NUMBER(10)",bigint:"NUMBER(19)",int8:"NUMBER(19)",smallint:"NUMBER(5)",int2:"NUMBER(5)",tinyint:"NUMBER(3)",numeric:"NUMBER",decimal:"NUMBER",real:"BINARY_FLOAT",float4:"BINARY_FLOAT",float:"BINARY_DOUBLE","double precision":"BINARY_DOUBLE",float8:"BINARY_DOUBLE",money:"NUMBER(19,4)",boolean:t?"BOOLEAN":"NUMBER(1)",bool:t?"BOOLEAN":"NUMBER(1)",text:"VARCHAR2(4000)",varchar:"VARCHAR2(255)","character varying":"VARCHAR2(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR(1)",uuid:"VARCHAR2(36)",json:t?"JSON":"CLOB",jsonb:t?"JSON":"CLOB",xml:"CLOB",date:"DATE",time:"VARCHAR2(18)","time without time zone":"VARCHAR2(18)",timestamp:"TIMESTAMP","timestamp without time zone":"TIMESTAMP","timestamp with time zone":"TIMESTAMP WITH TIME ZONE",timestamptz:"TIMESTAMP WITH TIME ZONE",interval:"INTERVAL DAY TO SECOND",bytea:"BLOB",inet:"VARCHAR2(45)",cidr:"VARCHAR2(45)",macaddr:"VARCHAR2(17)",macaddr8:"VARCHAR2(23)",point:"VARCHAR2(4000)",line:"VARCHAR2(4000)",polygon:"VARCHAR2(4000)"}[n]??r.toUpperCase()}function Cs(r,e){let t=r.trim(),n=t.toLowerCase();return n==="now()"||n==="current_timestamp"?"CURRENT_TIMESTAMP":n==="current_date"?"CURRENT_DATE":n==="true"||n==="false"?e?n.toUpperCase():n==="true"?"1":"0":t}var O,dt,Es,ws,ic,tp,cc,np,Rn,rp,Ue,Nn,lc,uc,dc,ap,pc,fc,yc=R(()=>{"use strict";y();Q();O=r=>{if(r.includes('"')||r.includes("\0"))throw new d(400,{message:`Oracle identifiers cannot contain double quotes: ${r}`});return`"${r}"`},dt=()=>{let r=[];return{values:r,bind:t=>(r.push(t),`:${r.length}`)}},Es='YYYY-MM-DD"T"HH24:MI:SS',ws=`${Es}.FF9`,ic=`${ws}TZH:TZM`,tp=/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?)?\s*(Z|[+-]\d{2}(?::?\d{2})?)?$/i,cc=r=>{let e=r.toUpperCase();return e==="DATE"?"date":e.startsWith("TIMESTAMP")?e.includes("WITH LOCAL TIME ZONE")?"timestampLtz":e.includes("WITH TIME ZONE")?"timestampTz":"timestamp":null},np=r=>{let e=r?cc(r):null;return e==="date"?Es:e==="timestampTz"?ic:e?ws:null},Rn=(r,e)=>{let t=np(e);return t?`TO_CHAR(${r}, '${t}')`:r},rp=(r,e)=>{let t=r instanceof Date?r.toISOString():r;if(typeof t!="string")throw new d(400,{message:`Invalid Oracle ${e} value`});let n=t.trim().match(tp);if(!n)throw new d(400,{message:`Invalid Oracle date or timestamp value: ${t}`});let[,a,s,o,i="00",c="00",l="00",u="",m]=n,p=`${a}-${s}-${o}T${i}:${c}:${l}`;if(e==="date")return p;let f=`${p}.${u.padEnd(9,"0")}`;if(e==="timestamp")return f;if(!m||m.toUpperCase()==="Z")return`${f}+00:00`;let b=m.replace(":","");return`${f}${b.slice(0,3)}:${b.slice(3).padEnd(2,"0")}`},Ue=(r,e,t)=>{let n=e?cc(e):null;if(!n)return t(r);let a=t(r==null?null:rp(r,n));return n==="date"?`TO_DATE(${a}, '${Es}')`:n==="timestamp"?`TO_TIMESTAMP(${a}, '${ws}')`:`TO_TIMESTAMP_TZ(${a}, '${ic}')`},Nn=(r,e)=>r.map(({COLUMN_NAME:t,DATA_TYPE:n})=>{let a=`${e?`${e}.`:""}${O(t)}`,s=Rn(a,n);return s===a?a:`${s} AS ${O(t)}`}).join(", "),lc=r=>{let e=new Map;for(let t of r){let n=e.get(t.CONSTRAINT_NAME);if(n){n.columns.push(t.REFERENCING_COLUMN),n.referencedColumns.push(t.REFERENCED_COLUMN);continue}e.set(t.CONSTRAINT_NAME,{constraintName:t.CONSTRAINT_NAME,referencingTable:t.REFERENCING_TABLE,columns:[t.REFERENCING_COLUMN],referencedTable:t.REFERENCED_TABLE,referencedColumns:[t.REFERENCED_COLUMN]})}return[...e.values()]},uc=r=>r.length?`WHERE ${r.join(" AND ")}`:"";dc=(r,e)=>`ORDER BY ${r.map(t=>`${e?`${e}.`:""}${t.column===null?"ROWID":O(t.column)} ${t.direction.toUpperCase()}`).join(", ")}`,ap=new Set(["serial","serial4","bigserial","serial8","smallserial","serial2"]),pc=r=>ap.has(r.toLowerCase().trim());fc="GENERATED BY DEFAULT ON NULL AS IDENTITY"});var hc,gc=R(()=>{"use strict";y();hc=r=>{if(typeof r!="string"||!/^[+-]?\d+$/.test(r))return r;let e=Number(r);return Number.isSafeInteger(e)?e:r}});var Rs,bc,Tc,gt,Ec,sp,op,wc,Tr,ip,cp,lp,up,mp,Ns,Sc,dp,Er,Cc=R(()=>{"use strict";y();j();Xe();Ze();mt();Rt();Q();ze();yc();gc();Rs=r=>r.oracleServerVersion>=23e8,bc=r=>Buffer.isBuffer(r)?r.toString("hex"):r,Tc=r=>{let e=He("oracle");switch(r.dbType){case e.DB_TYPE_NUMBER:return{type:e.STRING,converter:hc};case e.DB_TYPE_CLOB:case e.DB_TYPE_NCLOB:return{type:e.STRING};case e.DB_TYPE_BLOB:return{type:e.BUFFER,converter:bc};case e.DB_TYPE_RAW:case e.DB_TYPE_LONG_RAW:return{converter:bc}}},gt=(r,e)=>r==null?null:typeof r=="boolean"?e==="BOOLEAN"?r:Number(r):typeof r=="bigint"?r.toString():r instanceof Date||typeof r!="object"?r:JSON.stringify(r),Ec=r=>{let e=r.DATA_DEFAULT?.trim();return e&&e.toUpperCase()!=="NULL"?e:null},sp=r=>{switch(r.DATA_TYPE){case"NUMBER":return r.DATA_PRECISION===null?r.DATA_SCALE===0?"INTEGER":"NUMBER":r.DATA_SCALE?`NUMBER(${r.DATA_PRECISION},${r.DATA_SCALE})`:`NUMBER(${r.DATA_PRECISION})`;case"FLOAT":return`FLOAT(${r.DATA_PRECISION})`;case"VARCHAR2":case"NVARCHAR2":case"CHAR":case"NCHAR":return`${r.DATA_TYPE}(${r.CHAR_LENGTH})`;case"RAW":return`RAW(${r.DATA_LENGTH})`;default:return r.DATA_TYPE}},op=(r,e)=>`${e?`${e}.`:""}${r==="ROWID"?"ROWID":O(r)}`,wc=r=>r.columns.map((e,t)=>`c.${O(e)} = p.${O(r.referencedColumns[t])}`).join(" AND "),Tr=(r,e,t)=>`(${r.keys.map(n=>`(${r.columns.map((a,s)=>`${op(a,e)} = ${t(n[s],a)}`).join(" AND ")})`).join(" OR ")})`,ip=r=>{let e=He("oracle");return r.dbType===e.DB_TYPE_DATE||r.dbType===e.DB_TYPE_TIMESTAMP||r.dbType===e.DB_TYPE_TIMESTAMP_TZ||r.dbType===e.DB_TYPE_TIMESTAMP_LTZ},cp=[["ORA-01758","A NOT NULL column added to a table with rows needs a default value."],["ORA-01439","Oracle can only change a column to an unrelated type while the column is empty."],["ORA-22858","Oracle cannot convert this column to or from a LOB (CLOB/BLOB) type."],["ORA-00932","Oracle cannot compare, sort or filter CLOB, BLOB or JSON values this way."],["ORA-22848","Oracle cannot sort or compare CLOB, BLOB or JSON values."],["ORA-12899","The value is too long for the column."],["ORA-01441","The column holds values longer than the new type allows."],["ORA-30675","Oracle identity columns must have a numeric type."],["ORA-01861","Dates must be written as YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS."],["ORA-01830","Dates must be written as YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS."],["ORA-01843","Dates must be written as YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS."]],lp=["ORA-00955","ORA-01408","ORA-01452"],up=["ORA-00972","ORA-01450","ORA-02327","ORA-02329"],mp="ORA-02429",Ns=(r,e)=>r instanceof Error&&e.some(t=>r.message.startsWith(t)),Sc={CASCADE:" ON DELETE CASCADE","SET NULL":" ON DELETE SET NULL",RESTRICT:"","NO ACTION":""},dp={1:"fatal",2:"error",8:"warning",16:"info"},Er=class extends re{async runQuery(e,t,n){return this.withConnection(a=>this.query(a,t,n))}quoteIdentifier(e){return O(e)}mapToUniversalType(e){return Un(e)}mapFromUniversalType(e){return{text:"VARCHAR2(4000)",number:"NUMBER",boolean:"BOOLEAN",json:"JSON",date:"TIMESTAMP",array:"JSON",enum:"VARCHAR2(255)"}[e]??"VARCHAR2(4000)"}buildTableDataQuery(e){throw new Error("OracleAdapter.getTableData builds its own query")}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){throw new Error("OracleAdapter.getTableData builds its own cursors")}wrapError(e){if(e instanceof Error&&!(e instanceof d)){let t=cp.find(([n])=>e.message.startsWith(n));if(t)return new d(400,{message:`${t[1]} (${e.message.split(`
297
+ AND kcu.REFERENCED_TABLE_NAME = ?`,[e]);return a.map(s=>({constraintName:s.constraint_name,referencingTable:s.referencing_table,referencingColumn:s.referencing_column,referencedTable:s.referenced_table,referencedColumn:s.referenced_column}))}async getRelatedRecordsForTable(e,t){let n=await this.getForeignKeyReferences(e,t);if(n.length===0)return[];let a=await K(t),s=[];for(let o of n){let[i]=await a.execute(`SELECT * FROM \`${o.referencingTable}\` LIMIT 100`);i.length>0&&s.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:i})}return s}async getRelatedRecords(e,t,n){let a=await this.getForeignKeyReferences(e,n);if(a.length===0)return[];let s=await K(n),o=t.map(l=>l.value),i=[],c=new Map;for(let l of a){let u=`${l.referencingTable}.${l.referencingColumn}`;c.has(u)||c.set(u,[]),c.get(u)?.push(l)}for(let[,l]of c){let u=l[0];if(!u||!t.find(b=>b.columnName===u.referencedColumn))continue;let p=o.map(()=>"?").join(", "),[f]=await s.execute(`SELECT * FROM \`${u.referencingTable}\` WHERE \`${u.referencingColumn}\` IN (${p}) LIMIT 100`,o);f.length>0&&i.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:f})}return i}async getTableRowCount(e,t){let[n]=await e.execute(`SELECT COUNT(*) as count FROM \`${t}\``);return Number(n[0]?.count??0)}async getBooleanColumnSet(e,t){let n=await this.getTableColumns({tableName:e,db:t});return new Set(n.filter(a=>a.dataTypeLabel==="boolean").map(a=>a.columnName))}async listIndexes(e,t){await this.assertTableExists(e,t);let[n]=await e.execute("SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? ORDER BY INDEX_NAME, SEQ_IN_INDEX",[t]),a=new Map;for(let s of n){let o=String(s.INDEX_NAME),i=a.get(o)??{index:{indexName:o,columns:[],isUnique:Number(s.NON_UNIQUE)===0,method:s.INDEX_TYPE?String(s.INDEX_TYPE).toLowerCase():null,kind:o==="PRIMARY"?"primary":Number(s.NON_UNIQUE)===0?"unique-constraint":"index",definition:null},parts:[],hasExpression:!1};a.set(o,i);let c=s.EXPRESSION??null;s.COLUMN_NAME===null&&c!==null?(i.index.columns.push(c),i.parts.push(`(${c})${s.COLLATION==="D"?" DESC":""}`),i.hasExpression=!0):(i.index.columns.push(String(s.COLUMN_NAME)),i.parts.push(`${se(String(s.COLUMN_NAME))}${s.SUB_PART===null?"":`(${s.SUB_PART})`}${s.COLLATION==="D"?" DESC":""}`))}return[...a.values()].map(({index:s,parts:o,hasExpression:i})=>({...s,definition:i?`CREATE ${s.isUnique?"UNIQUE ":""}INDEX ${se(s.indexName)} ON ${se(t)} (${o.join(", ")})`:null})).sort((s,o)=>+(o.kind==="primary")-+(s.kind==="primary")||(s.indexName<o.indexName?-1:1))}async assertTableExists(e,t){let[n]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]);if(Number(n[0]?.cnt??0)===0)throw new d(404,{message:`Table "${t}" does not exist`})}async assertColumnExists(e,t,n){let[a]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,n]);if(Number(a[0]?.cnt??0)===0)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`})}parseMysqlEnumValues(e){let t=e.match(/^(?:enum|set)\((.+)\)$/i);return t?.[1]?t[1].split(",").map(n=>n.trim().replace(/^'|'$/g,"")):null}}});function pc(r,e,t){let n=[];for(let a of r){let s=O(a.columnName),o=t.get(a.columnName),i=a.value.toLowerCase()==="null";switch(a.operator){case"=":case"!=":case">":case">=":case"<":case"<=":n.push(`${s} ${a.operator} ${Be(a.value,o,e)}`);break;case"is":n.push(i?`${s} IS NULL`:`${s} = ${Be(a.value,o,e)}`);break;case"is not":n.push(i?`${s} IS NOT NULL`:`${s} != ${Be(a.value,o,e)}`);break;case"like":n.push(`${An(s,o)} LIKE ${e(a.value)}`);break;case"not like":n.push(`${An(s,o)} NOT LIKE ${e(a.value)}`);break;case"ilike":n.push(`UPPER(${An(s,o)}) LIKE UPPER(${e(a.value)})`);break;case"not ilike":n.push(`UPPER(${An(s,o)}) NOT LIKE UPPER(${e(a.value)})`);break}}return n}function Cs(r,e,t){if(e)throw new d(400,{message:"Oracle has no array column type. Use a json column (JSON on Oracle 23ai) instead."});let n=r.toLowerCase().trim();return{serial:"NUMBER(10)",serial4:"NUMBER(10)",bigserial:"NUMBER(19)",serial8:"NUMBER(19)",smallserial:"NUMBER(5)",serial2:"NUMBER(5)",int:"NUMBER(10)",int4:"NUMBER(10)",integer:"NUMBER(10)",bigint:"NUMBER(19)",int8:"NUMBER(19)",smallint:"NUMBER(5)",int2:"NUMBER(5)",tinyint:"NUMBER(3)",numeric:"NUMBER",decimal:"NUMBER",real:"BINARY_FLOAT",float4:"BINARY_FLOAT",float:"BINARY_DOUBLE","double precision":"BINARY_DOUBLE",float8:"BINARY_DOUBLE",money:"NUMBER(19,4)",boolean:t?"BOOLEAN":"NUMBER(1)",bool:t?"BOOLEAN":"NUMBER(1)",text:"VARCHAR2(4000)",varchar:"VARCHAR2(255)","character varying":"VARCHAR2(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR(1)",uuid:"VARCHAR2(36)",json:t?"JSON":"CLOB",jsonb:t?"JSON":"CLOB",xml:"CLOB",date:"DATE",time:"VARCHAR2(18)","time without time zone":"VARCHAR2(18)",timestamp:"TIMESTAMP","timestamp without time zone":"TIMESTAMP","timestamp with time zone":"TIMESTAMP WITH TIME ZONE",timestamptz:"TIMESTAMP WITH TIME ZONE",interval:"INTERVAL DAY TO SECOND",bytea:"BLOB",inet:"VARCHAR2(45)",cidr:"VARCHAR2(45)",macaddr:"VARCHAR2(17)",macaddr8:"VARCHAR2(23)",point:"VARCHAR2(4000)",line:"VARCHAR2(4000)",polygon:"VARCHAR2(4000)"}[n]??r.toUpperCase()}function Ns(r,e){let t=r.trim(),n=t.toLowerCase();return n==="now()"||n==="current_timestamp"?"CURRENT_TIMESTAMP":n==="current_date"?"CURRENT_DATE":n==="true"||n==="false"?e?n.toUpperCase():n==="true"?"1":"0":t}var O,pt,Ss,Rs,lc,ap,uc,sp,An,op,Be,Dn,mc,dc,fc,ip,yc,hc,gc=C(()=>{"use strict";y();Q();O=r=>{if(r.includes('"')||r.includes("\0"))throw new d(400,{message:`Oracle identifiers cannot contain double quotes: ${r}`});return`"${r}"`},pt=()=>{let r=[];return{values:r,bind:t=>(r.push(t),`:${r.length}`)}},Ss='YYYY-MM-DD"T"HH24:MI:SS',Rs=`${Ss}.FF9`,lc=`${Rs}TZH:TZM`,ap=/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?)?\s*(Z|[+-]\d{2}(?::?\d{2})?)?$/i,uc=r=>{let e=r.toUpperCase();return e==="DATE"?"date":e.startsWith("TIMESTAMP")?e.includes("WITH LOCAL TIME ZONE")?"timestampLtz":e.includes("WITH TIME ZONE")?"timestampTz":"timestamp":null},sp=r=>{let e=r?uc(r):null;return e==="date"?Ss:e==="timestampTz"?lc:e?Rs:null},An=(r,e)=>{let t=sp(e);return t?`TO_CHAR(${r}, '${t}')`:r},op=(r,e)=>{let t=r instanceof Date?r.toISOString():r;if(typeof t!="string")throw new d(400,{message:`Invalid Oracle ${e} value`});let n=t.trim().match(ap);if(!n)throw new d(400,{message:`Invalid Oracle date or timestamp value: ${t}`});let[,a,s,o,i="00",c="00",l="00",u="",m]=n,p=`${a}-${s}-${o}T${i}:${c}:${l}`;if(e==="date")return p;let f=`${p}.${u.padEnd(9,"0")}`;if(e==="timestamp")return f;if(!m||m.toUpperCase()==="Z")return`${f}+00:00`;let b=m.replace(":","");return`${f}${b.slice(0,3)}:${b.slice(3).padEnd(2,"0")}`},Be=(r,e,t)=>{let n=e?uc(e):null;if(!n)return t(r);let a=t(r==null?null:op(r,n));return n==="date"?`TO_DATE(${a}, '${Ss}')`:n==="timestamp"?`TO_TIMESTAMP(${a}, '${Rs}')`:`TO_TIMESTAMP_TZ(${a}, '${lc}')`},Dn=(r,e)=>r.map(({COLUMN_NAME:t,DATA_TYPE:n})=>{let a=`${e?`${e}.`:""}${O(t)}`,s=An(a,n);return s===a?a:`${s} AS ${O(t)}`}).join(", "),mc=r=>{let e=new Map;for(let t of r){let n=e.get(t.CONSTRAINT_NAME);if(n){n.columns.push(t.REFERENCING_COLUMN),n.referencedColumns.push(t.REFERENCED_COLUMN);continue}e.set(t.CONSTRAINT_NAME,{constraintName:t.CONSTRAINT_NAME,referencingTable:t.REFERENCING_TABLE,columns:[t.REFERENCING_COLUMN],referencedTable:t.REFERENCED_TABLE,referencedColumns:[t.REFERENCED_COLUMN]})}return[...e.values()]},dc=r=>r.length?`WHERE ${r.join(" AND ")}`:"";fc=(r,e)=>`ORDER BY ${r.map(t=>`${e?`${e}.`:""}${t.column===null?"ROWID":O(t.column)} ${t.direction.toUpperCase()}`).join(", ")}`,ip=new Set(["serial","serial4","bigserial","serial8","smallserial","serial2"]),yc=r=>ip.has(r.toLowerCase().trim());hc="GENERATED BY DEFAULT ON NULL AS IDENTITY"});var bc,Tc=C(()=>{"use strict";y();bc=r=>{if(typeof r!="string"||!/^[+-]?\d+$/.test(r))return r;let e=Number(r);return Number.isSafeInteger(e)?e:r}});var As,Ec,wc,Tt,Sc,cp,lp,Rc,wr,up,mp,dp,pp,fp,Ds,Cc,yp,Sr,Nc=C(()=>{"use strict";y();j();Ze();et();dt();bt();Q();Ge();gc();Tc();As=r=>r.oracleServerVersion>=23e8,Ec=r=>Buffer.isBuffer(r)?r.toString("hex"):r,wc=r=>{let e=We("oracle");switch(r.dbType){case e.DB_TYPE_NUMBER:return{type:e.STRING,converter:bc};case e.DB_TYPE_CLOB:case e.DB_TYPE_NCLOB:return{type:e.STRING};case e.DB_TYPE_BLOB:return{type:e.BUFFER,converter:Ec};case e.DB_TYPE_RAW:case e.DB_TYPE_LONG_RAW:return{converter:Ec}}},Tt=(r,e)=>r==null?null:typeof r=="boolean"?e==="BOOLEAN"?r:Number(r):typeof r=="bigint"?r.toString():r instanceof Date||typeof r!="object"?r:JSON.stringify(r),Sc=r=>{let e=r.DATA_DEFAULT?.trim();return e&&e.toUpperCase()!=="NULL"?e:null},cp=r=>{switch(r.DATA_TYPE){case"NUMBER":return r.DATA_PRECISION===null?r.DATA_SCALE===0?"INTEGER":"NUMBER":r.DATA_SCALE?`NUMBER(${r.DATA_PRECISION},${r.DATA_SCALE})`:`NUMBER(${r.DATA_PRECISION})`;case"FLOAT":return`FLOAT(${r.DATA_PRECISION})`;case"VARCHAR2":case"NVARCHAR2":case"CHAR":case"NCHAR":return`${r.DATA_TYPE}(${r.CHAR_LENGTH})`;case"RAW":return`RAW(${r.DATA_LENGTH})`;default:return r.DATA_TYPE}},lp=(r,e)=>`${e?`${e}.`:""}${r==="ROWID"?"ROWID":O(r)}`,Rc=r=>r.columns.map((e,t)=>`c.${O(e)} = p.${O(r.referencedColumns[t])}`).join(" AND "),wr=(r,e,t)=>`(${r.keys.map(n=>`(${r.columns.map((a,s)=>`${lp(a,e)} = ${t(n[s],a)}`).join(" AND ")})`).join(" OR ")})`,up=r=>{let e=We("oracle");return r.dbType===e.DB_TYPE_DATE||r.dbType===e.DB_TYPE_TIMESTAMP||r.dbType===e.DB_TYPE_TIMESTAMP_TZ||r.dbType===e.DB_TYPE_TIMESTAMP_LTZ},mp=[["ORA-01758","A NOT NULL column added to a table with rows needs a default value."],["ORA-01439","Oracle can only change a column to an unrelated type while the column is empty."],["ORA-22858","Oracle cannot convert this column to or from a LOB (CLOB/BLOB) type."],["ORA-00932","Oracle cannot compare, sort or filter CLOB, BLOB or JSON values this way."],["ORA-22848","Oracle cannot sort or compare CLOB, BLOB or JSON values."],["ORA-12899","The value is too long for the column."],["ORA-01441","The column holds values longer than the new type allows."],["ORA-30675","Oracle identity columns must have a numeric type."],["ORA-01861","Dates must be written as YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS."],["ORA-01830","Dates must be written as YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS."],["ORA-01843","Dates must be written as YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS."]],dp=["ORA-00955","ORA-01408","ORA-01452"],pp=["ORA-00972","ORA-01450","ORA-02327","ORA-02329"],fp="ORA-02429",Ds=(r,e)=>r instanceof Error&&e.some(t=>r.message.startsWith(t)),Cc={CASCADE:" ON DELETE CASCADE","SET NULL":" ON DELETE SET NULL",RESTRICT:"","NO ACTION":""},yp={1:"fatal",2:"error",8:"warning",16:"info"},Sr=class extends re{async runQuery(e,t,n){return this.withConnection(a=>this.query(a,t,n))}quoteIdentifier(e){return O(e)}mapToUniversalType(e){return Bn(e)}mapFromUniversalType(e){return{text:"VARCHAR2(4000)",number:"NUMBER",boolean:"BOOLEAN",json:"JSON",date:"TIMESTAMP",array:"JSON",enum:"VARCHAR2(255)"}[e]??"VARCHAR2(4000)"}buildTableDataQuery(e){throw new Error("OracleAdapter.getTableData builds its own query")}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){throw new Error("OracleAdapter.getTableData builds its own cursors")}wrapError(e){if(e instanceof Error&&!(e instanceof d)){let t=mp.find(([n])=>e.message.startsWith(n));if(t)return new d(400,{message:`${t[1]} (${e.message.split(`
298
298
  `)[0]})`,cause:e});if(e.message.startsWith("ORA-00955"))return new d(409,{message:e.message.split(`
299
- `)[0],cause:e})}return super.wrapError(e)}async withConnection(e){try{let t=await(await ss()).getConnection();try{return await e(t)}finally{await t.close()}}catch(t){throw this.wrapError(t)}}inTransaction(e){return this.withConnection(async t=>{try{let n=await e(t);return await t.commit(),n}catch(n){throw await t.rollback().catch(()=>{}),n}})}async query(e,t,n=[]){return(await e.execute(t,n,{outFormat:He("oracle").OUT_FORMAT_OBJECT,fetchTypeHandler:Tc})).rows??[]}async execute(e,t,n=[]){return(await e.execute(t,n)).rowsAffected??0}async getTableData(e){let{tableName:t,limit:n=50,sort:a=[],order:s="asc",cursor:o,filters:i=[]}=e;return this.withConnection(async c=>{let l=await this.requireColumns(c,t),u=new Map(l.map(D=>[D.COLUMN_NAME,D.DATA_TYPE])),m=await this.primaryKey(c,t),p=this.orderTerms(a,s,m.length?m:[null]),f=o?Number(this.decodeCursor(o)?.values._offset??0):0,{values:b,bind:T}=dt(),h=uc(mc(i,T,u)),w=[...b],[S]=await this.query(c,`SELECT COUNT(*) AS "total" FROM ${O(t)} ${h}`,w),A="t",N=await this.query(c,`SELECT ${Nn(l,A)} FROM ${O(t)} ${A} ${h} ${dc(p,A)} OFFSET ${T(f)} ROWS FETCH NEXT ${T(n+1)} ROWS ONLY`,b),C=N.length>n,_=D=>this.encodeCursor({values:{_offset:D},sortColumns:["_offset"]});return{data:N.slice(0,n).map(D=>this.normalizeRow(D)),meta:{limit:n,total:Number(S?.total??0),hasNextPage:C,hasPreviousPage:f>0,nextCursor:C?_(f+n):null,prevCursor:f>0?_(Math.max(0,f-n)):null}}})}async exportTableData({tableName:e}){return this.withConnection(async t=>{let n=await this.requireColumns(t,e),a=await this.query(t,`SELECT ${Nn(n)} FROM ${O(e)}`);if(!a.length)throw new d(404,{message:`Table "${e}" does not exist or has no data`});return{cols:n.map(s=>s.COLUMN_NAME),rows:a}})}async getDatabasesList(){return this.withConnection(async e=>{let[t]=await this.query(e,`SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS name, USER AS owner,
299
+ `)[0],cause:e})}return super.wrapError(e)}async withConnection(e){try{let t=await(await is()).getConnection();try{return await e(t)}finally{await t.close()}}catch(t){throw this.wrapError(t)}}inTransaction(e){return this.withConnection(async t=>{try{let n=await e(t);return await t.commit(),n}catch(n){throw await t.rollback().catch(()=>{}),n}})}async query(e,t,n=[]){return(await e.execute(t,n,{outFormat:We("oracle").OUT_FORMAT_OBJECT,fetchTypeHandler:wc})).rows??[]}async execute(e,t,n=[]){return(await e.execute(t,n)).rowsAffected??0}async getTableData(e){let{tableName:t,limit:n=50,sort:a=[],order:s="asc",cursor:o,filters:i=[]}=e;return this.withConnection(async c=>{let l=await this.requireColumns(c,t),u=new Map(l.map(D=>[D.COLUMN_NAME,D.DATA_TYPE])),m=await this.primaryKey(c,t),p=this.orderTerms(a,s,m.length?m:[null]),f=o?Number(this.decodeCursor(o)?.values._offset??0):0,{values:b,bind:T}=pt(),h=dc(pc(i,T,u)),w=[...b],[S]=await this.query(c,`SELECT COUNT(*) AS "total" FROM ${O(t)} ${h}`,w),A="t",N=await this.query(c,`SELECT ${Dn(l,A)} FROM ${O(t)} ${A} ${h} ${fc(p,A)} OFFSET ${T(f)} ROWS FETCH NEXT ${T(n+1)} ROWS ONLY`,b),R=N.length>n,_=D=>this.encodeCursor({values:{_offset:D},sortColumns:["_offset"]});return{data:N.slice(0,n).map(D=>this.normalizeRow(D)),meta:{limit:n,total:Number(S?.total??0),hasNextPage:R,hasPreviousPage:f>0,nextCursor:R?_(f+n):null,prevCursor:f>0?_(Math.max(0,f-n)):null}}})}async exportTableData({tableName:e}){return this.withConnection(async t=>{let n=await this.requireColumns(t,e),a=await this.query(t,`SELECT ${Dn(n)} FROM ${O(e)}`);if(!a.length)throw new d(404,{message:`Table "${e}" does not exist or has no data`});return{cols:n.map(s=>s.COLUMN_NAME),rows:a}})}async getDatabasesList(){return this.withConnection(async e=>{let[t]=await this.query(e,`SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS name, USER AS owner,
300
300
  (SELECT NVL(SUM(bytes), 0) FROM user_segments) AS bytes,
301
301
  (SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET') AS encoding
302
- FROM dual`);return t?[{name:t.NAME,size:this.formatBytes(Number(t.BYTES)),owner:t.OWNER,encoding:t.ENCODING}]:[]})}async getCurrentDatabase(){return this.withConnection(async e=>({db:await this.containerName(e)}))}async getDatabaseConnectionInfo(){let e=await ss().catch(t=>{throw this.wrapError(t)});return this.withConnection(async t=>{let[n]=await this.query(t,"SELECT USER AS u FROM dual"),{host:a,port:s}=_e(ve());return{host:a,port:s,user:n?.U??"",database:await this.containerName(t),version:`Oracle ${t.oracleServerVersionString}`,active_connections:e.connectionsInUse,max_connections:e.poolMax}})}async getTablesList(e){return this.withConnection(async t=>{let n=await this.query(t,`SELECT table_name, num_rows FROM user_tables
302
+ FROM dual`);return t?[{name:t.NAME,size:this.formatBytes(Number(t.BYTES)),owner:t.OWNER,encoding:t.ENCODING}]:[]})}async getCurrentDatabase(){return this.withConnection(async e=>({db:await this.containerName(e)}))}async getDatabaseConnectionInfo(){let e=await is().catch(t=>{throw this.wrapError(t)});return this.withConnection(async t=>{let[n]=await this.query(t,"SELECT USER AS u FROM dual"),{host:a,port:s}=Oe(qe());return{host:a,port:s,user:n?.U??"",database:await this.containerName(t),version:`Oracle ${t.oracleServerVersionString}`,active_connections:e.connectionsInUse,max_connections:e.poolMax}})}async getTablesList(e){return this.withConnection(async t=>{let n=await this.query(t,`SELECT table_name, num_rows FROM user_tables
303
303
  WHERE dropped = 'NO' AND nested = 'NO' AND secondary = 'N' AND (iot_type IS NULL OR iot_type = 'IOT')
304
- ORDER BY table_name`),a=n.filter(o=>o.NUM_ROWS===null||o.NUM_ROWS<1e5),s=new Map;if(a.length){let o=await this.query(t,a.map((i,c)=>`SELECT ${c} AS n, COUNT(*) AS c FROM ${O(i.TABLE_NAME)}`).join(" UNION ALL "));for(let i of o)s.set(a[i.N].TABLE_NAME,Number(i.C))}return n.map(o=>({tableName:o.TABLE_NAME,rowCount:s.get(o.TABLE_NAME)??Number(o.NUM_ROWS??0)}))})}async createTable({tableData:e}){let{tableName:t,fields:n,foreignKeys:a=[]}=e;for(let s of a){if(s.onUpdate!=="NO ACTION"&&s.onUpdate!=="RESTRICT")throw new d(400,{message:`Oracle foreign keys have no ON UPDATE actions (${s.onUpdate} on "${s.columnName}"). Use NO ACTION.`});if(!(s.onDelete in Sc))throw new d(400,{message:`Oracle foreign keys do not support ON DELETE ${s.onDelete} (on "${s.columnName}"). Use CASCADE, SET NULL or NO ACTION.`})}await this.withConnection(async s=>{let o=Rs(s),i=n.filter(l=>l.isPrimaryKey).map(l=>l.columnName),c=n.map(l=>this.columnDefinition(l,{withConstraints:!1,native:o}));i.length&&c.push(`PRIMARY KEY (${i.map(O).join(", ")})`);for(let l of n)l.isUnique&&!l.isPrimaryKey&&c.push(`UNIQUE (${O(l.columnName)})`);for(let l of a)c.push(`FOREIGN KEY (${O(l.columnName)}) REFERENCES ${O(l.referencedTable)} (${O(l.referencedColumn)})${Sc[l.onDelete]}`);await s.execute(`CREATE TABLE ${O(t)} (${c.join(", ")})`)})}async deleteTable({tableName:e,cascade:t}){return this.withConnection(async n=>{await this.requireColumns(n,e);let a=(await this.foreignKeys(n,"referenced",e)).filter(o=>o.referencingTable!==e);if(a.length&&!t)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.sampleReferencingRows(n,a)};let[s]=await this.query(n,`SELECT COUNT(*) AS c FROM ${O(e)}`);return await n.execute(`DROP TABLE ${O(e)}${t?" CASCADE CONSTRAINTS":""}`),{deletedCount:Number(s?.C??0),fkViolation:!1,relatedRecords:[]}})}async renameTable({tableName:e,newTableName:t}){this.assertDifferentTableName(e,t),await this.withConnection(async n=>{if(await this.requireColumns(n,e),(await this.columns(n,t)).length)throw new d(409,{message:`Table "${t}" already exists`});await n.execute(`ALTER TABLE ${O(e)} RENAME TO ${O(t)}`)})}async getTableSchema({tableName:e}){return this.withConnection(async t=>{await this.requireColumns(t,e),await t.execute(`BEGIN
304
+ ORDER BY table_name`),a=n.filter(o=>o.NUM_ROWS===null||o.NUM_ROWS<1e5),s=new Map;if(a.length){let o=await this.query(t,a.map((i,c)=>`SELECT ${c} AS n, COUNT(*) AS c FROM ${O(i.TABLE_NAME)}`).join(" UNION ALL "));for(let i of o)s.set(a[i.N].TABLE_NAME,Number(i.C))}return n.map(o=>({tableName:o.TABLE_NAME,rowCount:s.get(o.TABLE_NAME)??Number(o.NUM_ROWS??0)}))})}async createTable({tableData:e}){let{tableName:t,fields:n,foreignKeys:a=[]}=e;for(let s of a){if(s.onUpdate!=="NO ACTION"&&s.onUpdate!=="RESTRICT")throw new d(400,{message:`Oracle foreign keys have no ON UPDATE actions (${s.onUpdate} on "${s.columnName}"). Use NO ACTION.`});if(!(s.onDelete in Cc))throw new d(400,{message:`Oracle foreign keys do not support ON DELETE ${s.onDelete} (on "${s.columnName}"). Use CASCADE, SET NULL or NO ACTION.`})}await this.withConnection(async s=>{let o=As(s),i=n.filter(l=>l.isPrimaryKey).map(l=>l.columnName),c=n.map(l=>this.columnDefinition(l,{withConstraints:!1,native:o}));i.length&&c.push(`PRIMARY KEY (${i.map(O).join(", ")})`);for(let l of n)l.isUnique&&!l.isPrimaryKey&&c.push(`UNIQUE (${O(l.columnName)})`);for(let l of a)c.push(`FOREIGN KEY (${O(l.columnName)}) REFERENCES ${O(l.referencedTable)} (${O(l.referencedColumn)})${Cc[l.onDelete]}`);await s.execute(`CREATE TABLE ${O(t)} (${c.join(", ")})`)})}async deleteTable({tableName:e,cascade:t}){return this.withConnection(async n=>{await this.requireColumns(n,e);let a=(await this.foreignKeys(n,"referenced",e)).filter(o=>o.referencingTable!==e);if(a.length&&!t)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.sampleReferencingRows(n,a)};let[s]=await this.query(n,`SELECT COUNT(*) AS c FROM ${O(e)}`);return await n.execute(`DROP TABLE ${O(e)}${t?" CASCADE CONSTRAINTS":""}`),{deletedCount:Number(s?.C??0),fkViolation:!1,relatedRecords:[]}})}async renameTable({tableName:e,newTableName:t}){this.assertDifferentTableName(e,t),await this.withConnection(async n=>{if(await this.requireColumns(n,e),(await this.columns(n,t)).length)throw new d(409,{message:`Table "${t}" already exists`});await n.execute(`ALTER TABLE ${O(e)} RENAME TO ${O(t)}`)})}async getTableSchema({tableName:e}){return this.withConnection(async t=>{await this.requireColumns(t,e),await t.execute(`BEGIN
305
305
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
306
306
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
307
- END;`);let[n]=await this.query(t,"SELECT DBMS_METADATA.GET_DDL('TABLE', :1) AS ddl FROM dual",[e]);return n?.DDL.trim()??""})}async getTableColumns({tableName:e}){return this.withConnection(async t=>{let n=await this.requireColumns(t,e),a=new Set(await this.primaryKey(t,e)),s=new Map((await this.foreignKeys(t,"referencing",e)).flatMap(o=>o.columns.map((i,c)=>[i,{referencedTable:o.referencedTable,referencedColumn:o.referencedColumns[c]}])));return n.map(o=>{let i=s.get(o.COLUMN_NAME),c=sp(o);return{columnName:o.COLUMN_NAME,dataType:Un(c),dataTypeLabel:Yr(c),isNullable:o.NULLABLE==="Y",columnDefault:o.GENERATION_TYPE?`GENERATED ${o.GENERATION_TYPE}${o.DEFAULT_ON_NULL==="YES"?" ON NULL":""} AS IDENTITY`:Ec(o),isPrimaryKey:a.has(o.COLUMN_NAME),isForeignKey:!!i,referencedTable:i?.referencedTable??null,referencedColumn:i?.referencedColumn??null,enumValues:null}})})}async addColumn(e){let{tableName:t,columnName:n}=e;await this.withConnection(async a=>{if((await this.requireColumns(a,t)).some(i=>i.COLUMN_NAME===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let o=this.columnDefinition(e,{withConstraints:!0,native:Rs(a)});await a.execute(`ALTER TABLE ${O(t)} ADD (${o})`)})}async deleteColumn({tableName:e,columnName:t}){return await this.withConnection(async n=>{await this.requireColumn(n,e,t),await n.execute(`ALTER TABLE ${O(e)} DROP COLUMN ${O(t)}`)}),{deletedCount:1}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o}=e;await this.withConnection(async i=>{let c=Rs(i),l=(await this.requireColumn(i,t,n)).find(m=>m.COLUMN_NAME===n),u=`${O(n)} ${Ss(a,!1,c)}`;o?.trim()?u+=` DEFAULT ${Cs(o,c)}`:l&&!l.GENERATION_TYPE&&Ec(l)&&(u+=" DEFAULT NULL"),l?.NULLABLE==="Y"!==s&&(u+=s?" NULL":" NOT NULL"),await i.execute(`ALTER TABLE ${O(t)} MODIFY (${u})`)})}async renameColumn({tableName:e,columnName:t,newColumnName:n}){await this.withConnection(async a=>{if((await this.requireColumn(a,e,t)).some(o=>o.COLUMN_NAME===n))throw new d(409,{message:`Column "${n}" already exists in table "${e}"`});await a.execute(`ALTER TABLE ${O(e)} RENAME COLUMN ${O(t)} TO ${O(n)}`)})}async getServerLogs(){return this.withConnection(async e=>{try{let t=await this.query(e,`${$e} SELECT TO_CHAR(SYS_EXTRACT_UTC(ORIGINATING_TIMESTAMP),
307
+ END;`);let[n]=await this.query(t,"SELECT DBMS_METADATA.GET_DDL('TABLE', :1) AS ddl FROM dual",[e]);return n?.DDL.trim()??""})}async getTableColumns({tableName:e}){return this.withConnection(async t=>{let n=await this.requireColumns(t,e),a=new Set(await this.primaryKey(t,e)),s=new Map((await this.foreignKeys(t,"referencing",e)).flatMap(o=>o.columns.map((i,c)=>[i,{referencedTable:o.referencedTable,referencedColumn:o.referencedColumns[c]}])));return n.map(o=>{let i=s.get(o.COLUMN_NAME),c=cp(o);return{columnName:o.COLUMN_NAME,dataType:Bn(c),dataTypeLabel:Gr(c),isNullable:o.NULLABLE==="Y",columnDefault:o.GENERATION_TYPE?`GENERATED ${o.GENERATION_TYPE}${o.DEFAULT_ON_NULL==="YES"?" ON NULL":""} AS IDENTITY`:Sc(o),isPrimaryKey:a.has(o.COLUMN_NAME),isForeignKey:!!i,referencedTable:i?.referencedTable??null,referencedColumn:i?.referencedColumn??null,enumValues:null}})})}async addColumn(e){let{tableName:t,columnName:n}=e;await this.withConnection(async a=>{if((await this.requireColumns(a,t)).some(i=>i.COLUMN_NAME===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let o=this.columnDefinition(e,{withConstraints:!0,native:As(a)});await a.execute(`ALTER TABLE ${O(t)} ADD (${o})`)})}async deleteColumn({tableName:e,columnName:t}){return await this.withConnection(async n=>{await this.requireColumn(n,e,t),await n.execute(`ALTER TABLE ${O(e)} DROP COLUMN ${O(t)}`)}),{deletedCount:1}}async alterColumn(e){let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o}=e;await this.withConnection(async i=>{let c=As(i),l=(await this.requireColumn(i,t,n)).find(m=>m.COLUMN_NAME===n),u=`${O(n)} ${Cs(a,!1,c)}`;o?.trim()?u+=` DEFAULT ${Ns(o,c)}`:l&&!l.GENERATION_TYPE&&Sc(l)&&(u+=" DEFAULT NULL"),l?.NULLABLE==="Y"!==s&&(u+=s?" NULL":" NOT NULL"),await i.execute(`ALTER TABLE ${O(t)} MODIFY (${u})`)})}async renameColumn({tableName:e,columnName:t,newColumnName:n}){await this.withConnection(async a=>{if((await this.requireColumn(a,e,t)).some(o=>o.COLUMN_NAME===n))throw new d(409,{message:`Column "${n}" already exists in table "${e}"`});await a.execute(`ALTER TABLE ${O(e)} RENAME COLUMN ${O(t)} TO ${O(n)}`)})}async getServerLogs(){return this.withConnection(async e=>{try{let t=await this.query(e,`${Me} SELECT TO_CHAR(SYS_EXTRACT_UTC(ORIGINATING_TIMESTAMP),
308
308
  'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') AS TS, MESSAGE_LEVEL, COMPONENT_ID, PROCESS_ID,
309
309
  MODULE_ID, MESSAGE_TEXT
310
310
  FROM V$DIAG_ALERT_EXT
311
- ORDER BY ORIGINATING_TIMESTAMP DESC FETCH FIRST ${500} ROWS ONLY`);return{available:!0,source:"V$DIAG_ALERT_EXT (alert log)",entries:Oe(t.reverse().map(n=>({ts:n.TS,level:dp[n.MESSAGE_LEVEL]??"debug",rawLevel:String(n.MESSAGE_LEVEL),source:n.COMPONENT_ID??void 0,code:/ORA-\d+/.exec(n.MESSAGE_TEXT)?.[0],message:n.MESSAGE_TEXT.trim(),detail:he({process:n.PROCESS_ID,module:n.MODULE_ID})})))}}catch(t){if(t instanceof Error&&t.message.startsWith("ORA-00942:"))return ne("Reading the alert log needs: GRANT SELECT ON V_$DIAG_ALERT_EXT TO <user>; or SELECT ANY DICTIONARY.");throw t}})}async getTableIndexes({tableName:e}){return this.withConnection(t=>this.listIndexes(t,e))}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o}=e;await this.withConnection(async i=>{let c=await this.requireColumns(i,t),l=a.find(m=>!c.some(p=>p.COLUMN_NAME===m));if(l!==void 0)throw new d(400,{message:`Column "${l}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});let u=`CREATE ${s?"UNIQUE ":""}INDEX ${O(n)} ON ${O(t)} (${a.map(m=>O(m)).join(", ")})`;try{await i.execute(u)}catch(m){throw Ns(m,lp)?new d(409,{message:m.message.split(`
312
- `)[0],cause:m}):Ns(m,up)?new d(400,{message:m.message.split(`
313
- `)[0],cause:m}):m}})}async dropIndex({tableName:e,indexName:t}){await this.withConnection(async n=>{let a=(await this.listIndexes(n,e)).find(s=>s.indexName===t);if(!a)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(a.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});try{await n.execute(`DROP INDEX ${O(t)}`)}catch(s){throw Ns(s,[mp])?new d(400,{message:s.message.split(`
314
- `)[0],cause:s}):s}})}async addRecord({params:e}){let{tableName:t,data:n}=e,a=Object.keys(n);if(!a.length)throw new d(400,{message:"No data provided for insert"});return{insertedCount:await this.inTransaction(async o=>{let i=await this.columnTypes(o,t),{values:c,bind:l}=dt(),u=a.map(m=>Ue(gt(n[m],i.get(m)),i.get(m),l));return this.execute(o,`INSERT INTO ${O(t)} (${a.map(O).join(", ")}) VALUES (${u.join(", ")})`,c)})}}async updateRecords({params:e}){let{tableName:t}=e,n=this.resolveKeyColumns(e),a=this.groupUpdatesByKey(e,n);return{updatedCount:await this.inTransaction(async o=>{this.assertWholeKey(await this.primaryKey(o,t),n);let i=await this.columnTypes(o,t),c=0;for(let{keyValues:l,rowUpdates:u}of a){let{values:m,bind:p}=dt(),f=u.map(h=>`${O(h.columnName)} = ${h.useDefault?"DEFAULT":Ue(gt(h.value,i.get(h.columnName)),i.get(h.columnName),p)}`).join(", "),b=n.map((h,w)=>`${O(h)} = ${Ue(gt(l[w],i.get(h)),i.get(h),p)}`).join(" AND "),T=await this.execute(o,`UPDATE ${O(t)} SET ${f} WHERE ${b}`,m);if(T===0)throw new d(404,{message:`Record with ${this.describeKey(n,l)} not found in table "${t}"`});c+=T}return c})}}async deleteRecords({tableName:e,primaryKeys:t}){let n=t[0]?.columnName;if(!n)throw new d(400,{message:"Primary key column name is required"});let a={columns:[n],keys:t.map(s=>[s.value])};return this.withConnection(async s=>{this.assertDeletableKey(await this.primaryKey(s,e));let o=await this.columnTypes(s,e);try{let{values:i,bind:c}=dt(),l=Tr(a,void 0,(m,p)=>Ue(gt(m,o.get(p)),o.get(p),c)),u=await this.execute(s,`DELETE FROM ${O(e)} WHERE ${l}`,i);return await s.commit(),{deletedCount:u,fkViolation:!1,relatedRecords:[]}}catch(i){if(await s.rollback().catch(()=>{}),!(i instanceof Error)||!i.message.startsWith("ORA-02292"))throw i;let c=[];for(let l of await this.foreignKeys(s,"referenced",e)){let u=await this.requireColumns(s,l.referencingTable),{values:m,bind:p}=dt(),f=Tr(a,"p",(T,h)=>Ue(gt(T,o.get(h)),o.get(h),p)),b=await this.query(s,`SELECT ${Nn(u,"c")} FROM ${O(l.referencingTable)} c JOIN ${O(e)} p ON ${wc(l)} WHERE ${f} FETCH FIRST 100 ROWS ONLY`,m);b.length&&c.push({tableName:l.referencingTable,columnName:l.columns.join(", "),constraintName:l.constraintName,records:b})}return{deletedCount:0,fkViolation:!0,relatedRecords:c}}})}async forceDeleteRecords({tableName:e,primaryKeys:t}){let n=t[0]?.columnName;if(!n)throw new d(400,{message:"Primary key column name is required"});let a=async(o,i,c,l)=>{if(!c.keys.length)return 0;if(l.includes(i))throw new d(400,{message:`Cannot force delete: the foreign keys ${[...l,i].map(T=>`"${T}"`).join(" -> ")} form a cycle.`});let u=await this.columnTypes(o,i),m=0;for(let T of await this.foreignKeys(o,"referenced",i)){let{values:h,bind:w}=dt(),S=Tr(c,"p",(N,C)=>C==="ROWID"?`CHARTOROWID(${w(N)})`:Ue(gt(N,u.get(C)),u.get(C),w)),A=await this.query(o,`SELECT DISTINCT ROWIDTOCHAR(c.ROWID) AS "__rowid" FROM ${O(T.referencingTable)} c JOIN ${O(i)} p ON ${wc(T)} WHERE ${S}`,h);m+=await a(o,T.referencingTable,{columns:["ROWID"],keys:A.map(N=>[N.__rowid])},[...l,i])}let{values:p,bind:f}=dt(),b=Tr(c,void 0,(T,h)=>h==="ROWID"?`CHARTOROWID(${f(T)})`:Ue(gt(T,u.get(h)),u.get(h),f));return m+await this.execute(o,`DELETE FROM ${O(i)} WHERE ${b}`,p)};return{deletedCount:await this.inTransaction(async o=>(this.assertDeletableKey(await this.primaryKey(o,e)),a(o,e,{columns:[n],keys:t.map(i=>[i.value])},[])))}}async bulkInsertRecords({tableName:e,records:t}){if(!t?.length)throw new d(400,{message:"At least one record is required"});let n=Object.keys(t[0]),a=await this.inTransaction(async s=>{let o=await this.columnTypes(s,e),i=[],c=t.map((u,m)=>{let{values:p,bind:f}=dt(),b=n.map(T=>Ue(gt(u[T],o.get(T)),o.get(T),f));return m===0&&(i=b),p});return(await s.executeMany(`INSERT INTO ${O(e)} (${n.map(O).join(", ")}) VALUES (${i.join(", ")})`,c)).rowsAffected??t.length});return{success:!0,message:`Bulk insert completed: ${a} records inserted`,successCount:a,failureCount:0}}async executeQuery({query:e}){if(!e?.trim())throw new d(400,{message:"Query is required"});let t=e.trim().replace(/\n\s*\/$/,"").trim(),a=/^(BEGIN|DECLARE|CREATE\s+(OR\s+REPLACE\s+)?((NON)?EDITIONABLE\s+)?(PROCEDURE|FUNCTION|PACKAGE|TRIGGER|TYPE))\b/i.test(t)?t:t.replace(/;\s*$/,"");return this.withConnection(async s=>{let o=performance.now(),i=await s.execute(a,[],{outFormat:He("oracle").OUT_FORMAT_OBJECT,fetchTypeHandler:Tc,autoCommit:!0,resultSet:!0}),c=performance.now()-o;if(i.resultSet){if(i.metaData?.some(ip))throw await i.resultSet.close(),new d(400,{message:"Oracle query results with native DATE or TIMESTAMP columns must use TO_CHAR with an explicit format so fractional seconds are not lost."});let u;try{u=await i.resultSet.getRows()}finally{await i.resultSet.close()}return{columns:i.metaData?.map(m=>m.name)??[],rows:u,rowCount:u.length,duration:c,message:u.length===0?"OK":void 0}}let l=i.rowsAffected??0;return{columns:[],rows:[],rowCount:l,duration:c,message:i.rowsAffected===void 0?"OK":`OK (${l} rows affected)`}})}columnDefinition(e,{withConstraints:t,native:n}){let a=`${O(e.columnName)} ${Ss(e.columnType,e.isArray??!1,n)}`;return e.isIdentity||pc(e.columnType)?a+=` ${fc}`:e.defaultValue?.trim()&&(a+=` DEFAULT ${Cs(e.defaultValue,n)}`),!e.isNullable&&!e.isPrimaryKey&&(a+=" NOT NULL"),t&&(e.isPrimaryKey?a+=" PRIMARY KEY":e.isUnique&&(a+=" UNIQUE")),a}formatBytes(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}async containerName(e){let[t]=await this.query(e,"SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS db FROM dual");return t?.DB??""}columns(e,t){return this.query(e,`SELECT c.column_name, c.data_type, c.data_length, c.data_precision, c.data_scale, c.char_length,
311
+ ORDER BY ORIGINATING_TIMESTAMP DESC FETCH FIRST ${500} ROWS ONLY`);return{available:!0,source:"V$DIAG_ALERT_EXT (alert log)",entries:Ie(t.reverse().map(n=>({ts:n.TS,level:yp[n.MESSAGE_LEVEL]??"debug",rawLevel:String(n.MESSAGE_LEVEL),source:n.COMPONENT_ID??void 0,code:/ORA-\d+/.exec(n.MESSAGE_TEXT)?.[0],message:n.MESSAGE_TEXT.trim(),detail:ge({process:n.PROCESS_ID,module:n.MODULE_ID})})))}}catch(t){if(t instanceof Error&&t.message.startsWith("ORA-00942:"))return ne("Reading the alert log needs: GRANT SELECT ON V_$DIAG_ALERT_EXT TO <user>; or SELECT ANY DICTIONARY.");throw t}})}async getTableIndexes({tableName:e}){return this.withConnection(t=>this.listIndexes(t,e))}async createIndex(e){let{tableName:t,indexName:n,columns:a,isUnique:s,method:o}=e;await this.withConnection(async i=>{let c=await this.requireColumns(i,t),l=a.find(m=>!c.some(p=>p.COLUMN_NAME===m));if(l!==void 0)throw new d(400,{message:`Column "${l}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});let u=`CREATE ${s?"UNIQUE ":""}INDEX ${O(n)} ON ${O(t)} (${a.map(m=>O(m)).join(", ")})`;try{await i.execute(u)}catch(m){throw Ds(m,dp)?new d(409,{message:m.message.split(`
312
+ `)[0],cause:m}):Ds(m,pp)?new d(400,{message:m.message.split(`
313
+ `)[0],cause:m}):m}})}async dropIndex({tableName:e,indexName:t}){await this.withConnection(async n=>{let a=(await this.listIndexes(n,e)).find(s=>s.indexName===t);if(!a)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(a.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});try{await n.execute(`DROP INDEX ${O(t)}`)}catch(s){throw Ds(s,[fp])?new d(400,{message:s.message.split(`
314
+ `)[0],cause:s}):s}})}async addRecord({params:e}){let{tableName:t,data:n}=e,a=Object.keys(n);if(!a.length)throw new d(400,{message:"No data provided for insert"});return{insertedCount:await this.inTransaction(async o=>{let i=await this.columnTypes(o,t),{values:c,bind:l}=pt(),u=a.map(m=>Be(Tt(n[m],i.get(m)),i.get(m),l));return this.execute(o,`INSERT INTO ${O(t)} (${a.map(O).join(", ")}) VALUES (${u.join(", ")})`,c)})}}async updateRecords({params:e}){let{tableName:t}=e,n=this.resolveKeyColumns(e),a=this.groupUpdatesByKey(e,n);return{updatedCount:await this.inTransaction(async o=>{this.assertWholeKey(await this.primaryKey(o,t),n);let i=await this.columnTypes(o,t),c=0;for(let{keyValues:l,rowUpdates:u}of a){let{values:m,bind:p}=pt(),f=u.map(h=>`${O(h.columnName)} = ${h.useDefault?"DEFAULT":Be(Tt(h.value,i.get(h.columnName)),i.get(h.columnName),p)}`).join(", "),b=n.map((h,w)=>`${O(h)} = ${Be(Tt(l[w],i.get(h)),i.get(h),p)}`).join(" AND "),T=await this.execute(o,`UPDATE ${O(t)} SET ${f} WHERE ${b}`,m);if(T===0)throw new d(404,{message:`Record with ${this.describeKey(n,l)} not found in table "${t}"`});c+=T}return c})}}async deleteRecords({tableName:e,primaryKeys:t}){let n=t[0]?.columnName;if(!n)throw new d(400,{message:"Primary key column name is required"});let a={columns:[n],keys:t.map(s=>[s.value])};return this.withConnection(async s=>{this.assertDeletableKey(await this.primaryKey(s,e));let o=await this.columnTypes(s,e);try{let{values:i,bind:c}=pt(),l=wr(a,void 0,(m,p)=>Be(Tt(m,o.get(p)),o.get(p),c)),u=await this.execute(s,`DELETE FROM ${O(e)} WHERE ${l}`,i);return await s.commit(),{deletedCount:u,fkViolation:!1,relatedRecords:[]}}catch(i){if(await s.rollback().catch(()=>{}),!(i instanceof Error)||!i.message.startsWith("ORA-02292"))throw i;let c=[];for(let l of await this.foreignKeys(s,"referenced",e)){let u=await this.requireColumns(s,l.referencingTable),{values:m,bind:p}=pt(),f=wr(a,"p",(T,h)=>Be(Tt(T,o.get(h)),o.get(h),p)),b=await this.query(s,`SELECT ${Dn(u,"c")} FROM ${O(l.referencingTable)} c JOIN ${O(e)} p ON ${Rc(l)} WHERE ${f} FETCH FIRST 100 ROWS ONLY`,m);b.length&&c.push({tableName:l.referencingTable,columnName:l.columns.join(", "),constraintName:l.constraintName,records:b})}return{deletedCount:0,fkViolation:!0,relatedRecords:c}}})}async forceDeleteRecords({tableName:e,primaryKeys:t}){let n=t[0]?.columnName;if(!n)throw new d(400,{message:"Primary key column name is required"});let a=async(o,i,c,l)=>{if(!c.keys.length)return 0;if(l.includes(i))throw new d(400,{message:`Cannot force delete: the foreign keys ${[...l,i].map(T=>`"${T}"`).join(" -> ")} form a cycle.`});let u=await this.columnTypes(o,i),m=0;for(let T of await this.foreignKeys(o,"referenced",i)){let{values:h,bind:w}=pt(),S=wr(c,"p",(N,R)=>R==="ROWID"?`CHARTOROWID(${w(N)})`:Be(Tt(N,u.get(R)),u.get(R),w)),A=await this.query(o,`SELECT DISTINCT ROWIDTOCHAR(c.ROWID) AS "__rowid" FROM ${O(T.referencingTable)} c JOIN ${O(i)} p ON ${Rc(T)} WHERE ${S}`,h);m+=await a(o,T.referencingTable,{columns:["ROWID"],keys:A.map(N=>[N.__rowid])},[...l,i])}let{values:p,bind:f}=pt(),b=wr(c,void 0,(T,h)=>h==="ROWID"?`CHARTOROWID(${f(T)})`:Be(Tt(T,u.get(h)),u.get(h),f));return m+await this.execute(o,`DELETE FROM ${O(i)} WHERE ${b}`,p)};return{deletedCount:await this.inTransaction(async o=>(this.assertDeletableKey(await this.primaryKey(o,e)),a(o,e,{columns:[n],keys:t.map(i=>[i.value])},[])))}}async bulkInsertRecords({tableName:e,records:t}){if(!t?.length)throw new d(400,{message:"At least one record is required"});let n=Object.keys(t[0]),a=await this.inTransaction(async s=>{let o=await this.columnTypes(s,e),i=[],c=t.map((u,m)=>{let{values:p,bind:f}=pt(),b=n.map(T=>Be(Tt(u[T],o.get(T)),o.get(T),f));return m===0&&(i=b),p});return(await s.executeMany(`INSERT INTO ${O(e)} (${n.map(O).join(", ")}) VALUES (${i.join(", ")})`,c)).rowsAffected??t.length});return{success:!0,message:`Bulk insert completed: ${a} records inserted`,successCount:a,failureCount:0}}async executeQuery({query:e}){if(!e?.trim())throw new d(400,{message:"Query is required"});let t=e.trim().replace(/\n\s*\/$/,"").trim(),a=/^(BEGIN|DECLARE|CREATE\s+(OR\s+REPLACE\s+)?((NON)?EDITIONABLE\s+)?(PROCEDURE|FUNCTION|PACKAGE|TRIGGER|TYPE))\b/i.test(t)?t:t.replace(/;\s*$/,"");return this.withConnection(async s=>{let o=performance.now(),i=await s.execute(a,[],{outFormat:We("oracle").OUT_FORMAT_OBJECT,fetchTypeHandler:wc,autoCommit:!0,resultSet:!0}),c=performance.now()-o;if(i.resultSet){if(i.metaData?.some(up))throw await i.resultSet.close(),new d(400,{message:"Oracle query results with native DATE or TIMESTAMP columns must use TO_CHAR with an explicit format so fractional seconds are not lost."});let u;try{u=await i.resultSet.getRows()}finally{await i.resultSet.close()}return{columns:i.metaData?.map(m=>m.name)??[],rows:u,rowCount:u.length,duration:c,message:u.length===0?"OK":void 0}}let l=i.rowsAffected??0;return{columns:[],rows:[],rowCount:l,duration:c,message:i.rowsAffected===void 0?"OK":`OK (${l} rows affected)`}})}columnDefinition(e,{withConstraints:t,native:n}){let a=`${O(e.columnName)} ${Cs(e.columnType,e.isArray??!1,n)}`;return e.isIdentity||yc(e.columnType)?a+=` ${hc}`:e.defaultValue?.trim()&&(a+=` DEFAULT ${Ns(e.defaultValue,n)}`),!e.isNullable&&!e.isPrimaryKey&&(a+=" NOT NULL"),t&&(e.isPrimaryKey?a+=" PRIMARY KEY":e.isUnique&&(a+=" UNIQUE")),a}formatBytes(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}async containerName(e){let[t]=await this.query(e,"SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS db FROM dual");return t?.DB??""}columns(e,t){return this.query(e,`SELECT c.column_name, c.data_type, c.data_length, c.data_precision, c.data_scale, c.char_length,
315
315
  c.nullable, c.data_default, c.default_on_null, i.generation_type
316
316
  FROM user_tab_columns c
317
317
  LEFT JOIN user_tab_identity_cols i ON i.table_name = c.table_name AND i.column_name = c.column_name
@@ -332,20 +332,20 @@ ${o.join(`,
332
332
  JOIN user_constraints r ON r.constraint_name = c.r_constraint_name AND r.owner = c.r_owner
333
333
  JOIN user_cons_columns rc ON rc.constraint_name = r.constraint_name AND rc.position = cc.position
334
334
  WHERE c.constraint_type = 'R' AND ${t==="referencing"?"c":"r"}.table_name = :1
335
- ORDER BY c.constraint_name, cc.position`,[n]);return lc(a)}async sampleReferencingRows(e,t){let n=[];for(let a of t){let s=await this.requireColumns(e,a.referencingTable),o=await this.query(e,`SELECT ${Nn(s)} FROM ${O(a.referencingTable)} WHERE ${a.columns.map(i=>`${O(i)} IS NOT NULL`).join(" AND ")} FETCH FIRST 100 ROWS ONLY`);o.length&&n.push({tableName:a.referencingTable,columnName:a.columns.join(", "),constraintName:a.constraintName,records:o})}return n}}});var pp,fp,yp,As,hp,gp,bp,Tp,Ep,wp,Sp,Cp,Rp,Rc,Nc=R(()=>{"use strict";y();mt();pp={PANIC:"fatal",FATAL:"fatal",ERROR:"error",WARNING:"warning",NOTICE:"info",INFO:"info",LOG:"info"},fp=/^duration: ([\d.]+) ms(?:\s+(?:statement|(?:execute|bind|parse) [^:]*): ([\s\S]*))?$/,yp=/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?(?: (?:([A-Za-z]+)|([+-])(\d{2}):?(\d{2})?))?/,As=(r,e)=>{let t=yp.exec(r);if(!t)return;let[,n,a,s,o,i,c,l="",u,m,p,f="0"]=t,b=m?(m==="-"?-1:1)*(Number(p)*60+Number(f)):u==="UTC"||u==="GMT"?0:e,T=Number(l.padEnd(3,"0").slice(0,3)),h=Date.UTC(Number(n),Number(a)-1,Number(s),Number(o),Number(i),Number(c),T)-b*6e4;return new Date(h).toISOString()},hp=r=>{let e=fp.exec(r.message);return{ts:r.ts,level:pp[r.severity]??"debug",rawLevel:r.severity,source:r.source||void 0,code:r.code&&r.code!=="00000"?r.code:void 0,message:e?e[2]??"duration":r.message,durationMs:e?Number(e[1]):void 0,statement:r.statement||void 0,detail:r.detail}},gp=r=>r.message.includes($e)||r.statement?.includes($e),bp=/^(.*?)\b(DEBUG[1-5]|LOG|INFO|NOTICE|WARNING|ERROR|FATAL|PANIC|DETAIL|HINT|QUERY|CONTEXT|LOCATION|STATEMENT): {2}(.*)$/,Tp=new Set(["DETAIL","HINT","QUERY","CONTEXT","LOCATION","STATEMENT"]),Ep=(r,e)=>{let t=[],n=null;for(let a of r){if(a.startsWith(" ")){n?.(a.slice(1));continue}let s=bp.exec(a);if(!s){n=null;continue}let[,o,i,c]=s,l=t.at(-1);if(Tp.has(i)){if(!l)continue;if(i==="STATEMENT")l.statement=c,n=p=>{l.statement=`${l.statement}
335
+ ORDER BY c.constraint_name, cc.position`,[n]);return mc(a)}async sampleReferencingRows(e,t){let n=[];for(let a of t){let s=await this.requireColumns(e,a.referencingTable),o=await this.query(e,`SELECT ${Dn(s)} FROM ${O(a.referencingTable)} WHERE ${a.columns.map(i=>`${O(i)} IS NOT NULL`).join(" AND ")} FETCH FIRST 100 ROWS ONLY`);o.length&&n.push({tableName:a.referencingTable,columnName:a.columns.join(", "),constraintName:a.constraintName,records:o})}return n}}});var hp,gp,bp,_s,Tp,Ep,wp,Sp,Rp,Cp,Np,Ap,Dp,Ac,Dc=C(()=>{"use strict";y();dt();hp={PANIC:"fatal",FATAL:"fatal",ERROR:"error",WARNING:"warning",NOTICE:"info",INFO:"info",LOG:"info"},gp=/^duration: ([\d.]+) ms(?:\s+(?:statement|(?:execute|bind|parse) [^:]*): ([\s\S]*))?$/,bp=/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?(?: (?:([A-Za-z]+)|([+-])(\d{2}):?(\d{2})?))?/,_s=(r,e)=>{let t=bp.exec(r);if(!t)return;let[,n,a,s,o,i,c,l="",u,m,p,f="0"]=t,b=m?(m==="-"?-1:1)*(Number(p)*60+Number(f)):u==="UTC"||u==="GMT"?0:e,T=Number(l.padEnd(3,"0").slice(0,3)),h=Date.UTC(Number(n),Number(a)-1,Number(s),Number(o),Number(i),Number(c),T)-b*6e4;return new Date(h).toISOString()},Tp=r=>{let e=gp.exec(r.message);return{ts:r.ts,level:hp[r.severity]??"debug",rawLevel:r.severity,source:r.source||void 0,code:r.code&&r.code!=="00000"?r.code:void 0,message:e?e[2]??"duration":r.message,durationMs:e?Number(e[1]):void 0,statement:r.statement||void 0,detail:r.detail}},Ep=r=>r.message.includes(Me)||r.statement?.includes(Me),wp=/^(.*?)\b(DEBUG[1-5]|LOG|INFO|NOTICE|WARNING|ERROR|FATAL|PANIC|DETAIL|HINT|QUERY|CONTEXT|LOCATION|STATEMENT): {2}(.*)$/,Sp=new Set(["DETAIL","HINT","QUERY","CONTEXT","LOCATION","STATEMENT"]),Rp=(r,e)=>{let t=[],n=null;for(let a of r){if(a.startsWith(" ")){n?.(a.slice(1));continue}let s=wp.exec(a);if(!s){n=null;continue}let[,o,i,c]=s,l=t.at(-1);if(Sp.has(i)){if(!l)continue;if(i==="STATEMENT")l.statement=c,n=p=>{l.statement=`${l.statement}
336
336
  ${p}`};else{let p=i.toLowerCase();l.detail[p]=c,n=f=>{l.detail[p]=`${l.detail[p]}
337
- ${f}`}}continue}let u=As(o,e.logUtcOffsetMinutes)??l?.ts;if(!u)continue;let m={ts:u,severity:i,message:c,detail:he({pid:/\[(\d+)\]/.exec(o)?.[1]})};t.push(m),n=p=>{m.message=`${m.message}
338
- ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let o=r[s];a?o==='"'&&r[s+1]==='"'?(n+='"',s++):o==='"'?a=!1:n+=o:o==='"'?a=!0:o===","?(t.push(n),n=""):o===`
339
- `?(t.push(n),e.push(t),t=[],n=""):o!=="\r"&&(n+=o)}return(n||t.length)&&(t.push(n),e.push(t)),e},Sp=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/,Cp=(r,e)=>{let t=r;if(e.truncatedStart){let a=r.split(`
340
- `),s=a.findIndex((o,i)=>i>0&&Sp.test(o));t=s===-1?"":a.slice(s).join(`
341
- `)}let n=[];for(let a of wp(t)){let s=As(a[0]??"",e.logUtcOffsetMinutes);!s||!a[11]||n.push({ts:s,severity:a[11],code:a[12],message:a[13]??"",statement:a[19],source:a[23],detail:he({user:a[1],database:a[2],pid:a[3],client:a[4],application:a[22],detail:a[14],hint:a[15],query:a[16],context:a[18]})})}return n},Rp=(r,e)=>{let t=[];for(let n of r){let a;try{a=JSON.parse(n)}catch{continue}let s=As(a.timestamp??"",e.logUtcOffsetMinutes);!s||!a.error_severity||t.push({ts:s,severity:a.error_severity,code:a.state_code,message:a.message??"",statement:a.statement,source:a.backend_type,detail:he({user:a.user,database:a.dbname,pid:a.pid,client:a.remote_host,application:a.application_name,detail:a.detail,hint:a.hint,query:a.internal_query,context:a.context})})}return t},Rc=(r,e,t)=>{let n=r.split(`
342
- `);return t.truncatedStart&&e!=="csvlog"&&n.shift(),(e==="csvlog"?Cp(r,t):e==="jsonlog"?Rp(n,t):Ep(n,t)).filter(s=>!gp(s)).map(hp)}});function Ac(r){if(r.length===0)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=t.length+1,s=Jt(n.columnName);switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${s} ${n.operator} $${a}`),t.push(n.value);break;case"is":n.value.toLowerCase()==="null"?e.push(`${s} IS NULL`):(e.push(`${s} = $${a}`),t.push(n.value));break;case"is not":n.value.toLowerCase()==="null"?e.push(`${s} IS NOT NULL`):(e.push(`${s} != $${a}`),t.push(n.value));break;case"like":e.push(`${s}::text LIKE $${a}`),t.push(n.value);break;case"not like":e.push(`${s}::text NOT LIKE $${a}`),t.push(n.value);break;case"ilike":e.push(`${s}::text ILIKE $${a}`),t.push(n.value);break;case"not ilike":e.push(`${s}::text NOT ILIKE $${a}`),t.push(n.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Oc(r,e,t,n){let a=[],s=[],o=[];for(let i of r){let c=Jt(i.column),l=e[i.column]??null,{descending:u,nullsLast:m}=Dc(i,t);l!==null&&o.push(l);let p=`$${n+o.length-1}`,f=l===null?m?null:`${c} IS NOT NULL`:`${c} ${u?"<":">"} ${p}${m?` OR ${c} IS NULL`:""}`;f&&a.push(`(${[...s,`(${f})`].join(" AND ")})`),s.push(l===null?`${c} IS NULL`:`${c} = ${p}`)}return{clause:a.length?`(${a.join(" OR ")})`:"FALSE",values:o}}var Jt,Dc,_c,Np,et,pe,Ic=R(()=>{"use strict";y();Jt=r=>`"${r.replaceAll('"','""')}"`;Dc=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),_c=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=Dc(t,e);return`${Jt(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;Np=r=>`(SELECT sp.schema_name FROM unnest(current_schemas(false)) WITH ORDINALITY AS sp(schema_name, position)
337
+ ${f}`}}continue}let u=_s(o,e.logUtcOffsetMinutes)??l?.ts;if(!u)continue;let m={ts:u,severity:i,message:c,detail:ge({pid:/\[(\d+)\]/.exec(o)?.[1]})};t.push(m),n=p=>{m.message=`${m.message}
338
+ ${p}`}}return t},Cp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let o=r[s];a?o==='"'&&r[s+1]==='"'?(n+='"',s++):o==='"'?a=!1:n+=o:o==='"'?a=!0:o===","?(t.push(n),n=""):o===`
339
+ `?(t.push(n),e.push(t),t=[],n=""):o!=="\r"&&(n+=o)}return(n||t.length)&&(t.push(n),e.push(t)),e},Np=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/,Ap=(r,e)=>{let t=r;if(e.truncatedStart){let a=r.split(`
340
+ `),s=a.findIndex((o,i)=>i>0&&Np.test(o));t=s===-1?"":a.slice(s).join(`
341
+ `)}let n=[];for(let a of Cp(t)){let s=_s(a[0]??"",e.logUtcOffsetMinutes);!s||!a[11]||n.push({ts:s,severity:a[11],code:a[12],message:a[13]??"",statement:a[19],source:a[23],detail:ge({user:a[1],database:a[2],pid:a[3],client:a[4],application:a[22],detail:a[14],hint:a[15],query:a[16],context:a[18]})})}return n},Dp=(r,e)=>{let t=[];for(let n of r){let a;try{a=JSON.parse(n)}catch{continue}let s=_s(a.timestamp??"",e.logUtcOffsetMinutes);!s||!a.error_severity||t.push({ts:s,severity:a.error_severity,code:a.state_code,message:a.message??"",statement:a.statement,source:a.backend_type,detail:ge({user:a.user,database:a.dbname,pid:a.pid,client:a.remote_host,application:a.application_name,detail:a.detail,hint:a.hint,query:a.internal_query,context:a.context})})}return t},Ac=(r,e,t)=>{let n=r.split(`
342
+ `);return t.truncatedStart&&e!=="csvlog"&&n.shift(),(e==="csvlog"?Ap(r,t):e==="jsonlog"?Dp(n,t):Rp(n,t)).filter(s=>!Ep(s)).map(Tp)}});function _c(r){if(r.length===0)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=t.length+1,s=Zt(n.columnName);switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${s} ${n.operator} $${a}`),t.push(n.value);break;case"is":n.value.toLowerCase()==="null"?e.push(`${s} IS NULL`):(e.push(`${s} = $${a}`),t.push(n.value));break;case"is not":n.value.toLowerCase()==="null"?e.push(`${s} IS NOT NULL`):(e.push(`${s} != $${a}`),t.push(n.value));break;case"like":e.push(`${s}::text LIKE $${a}`),t.push(n.value);break;case"not like":e.push(`${s}::text NOT LIKE $${a}`),t.push(n.value);break;case"ilike":e.push(`${s}::text ILIKE $${a}`),t.push(n.value);break;case"not ilike":e.push(`${s}::text NOT ILIKE $${a}`),t.push(n.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function xc(r,e,t,n){let a=[],s=[],o=[];for(let i of r){let c=Zt(i.column),l=e[i.column]??null,{descending:u,nullsLast:m}=Oc(i,t);l!==null&&o.push(l);let p=`$${n+o.length-1}`,f=l===null?m?null:`${c} IS NOT NULL`:`${c} ${u?"<":">"} ${p}${m?` OR ${c} IS NULL`:""}`;f&&a.push(`(${[...s,`(${f})`].join(" AND ")})`),s.push(l===null?`${c} IS NULL`:`${c} = ${p}`)}return{clause:a.length?`(${a.join(" OR ")})`:"FALSE",values:o}}var Zt,Oc,Ic,_p,tt,fe,Lc=C(()=>{"use strict";y();Zt=r=>`"${r.replaceAll('"','""')}"`;Oc=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),Ic=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=Oc(t,e);return`${Zt(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;_p=r=>`(SELECT sp.schema_name FROM unnest(current_schemas(false)) WITH ORDINALITY AS sp(schema_name, position)
343
343
  JOIN information_schema.tables it
344
344
  ON it.table_schema = sp.schema_name AND it.table_name = ${r}
345
- ORDER BY sp.position LIMIT 1)`,et=(r,e)=>`COALESCE(${e}::text, ${Np(r)})`,pe=(r,e)=>e?`${Jt(e)}.${Jt(r)}`:Jt(r)});var wr,Ap,Sr,xc=R(()=>{"use strict";y();j();Xe();Ze();mt();Rt();Q();ze();Nc();Ic();wr=async(r,e)=>{let t=await r.connect();try{await t.query("BEGIN");let n=await e(t);return await t.query("COMMIT"),n}catch(n){throw await t.query("ROLLBACK"),n}finally{t.release()}},Ap=1024*1024,Sr=class extends re{databaseSizeSupport=new WeakMap;async runQuery(e,t,n){return(await(await W(e)).query(t,n)).rows}quoteIdentifier(e){return`"${e.replaceAll('"','""')}"`}mapToUniversalType(e){return Pn(e)}mapFromUniversalType(e){return{text:"TEXT",number:"INTEGER",boolean:"BOOLEAN",json:"JSONB",date:"TIMESTAMP WITH TIME ZONE",array:"TEXT[]",enum:"TEXT"}[e]??"TEXT"}buildTableDataQuery(){throw new Error("PgAdapter builds table data queries in getTableData")}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){throw new Error("PgAdapter builds cursors in getTableData")}async getTableData(e){let{tableName:t,schemaName:n,db:a,limit:s=50,direction:o="asc",sort:i=[],order:c="asc",cursor:l,filters:u=[]}=e,m=await W(a),p=pe(t,n),{clause:f,values:b}=Ac(u),[T,{total:h,estimated:w}]=await Promise.all([this.getPrimaryKeyColumns(m,p),this.countRows(m,p,f,b)]).catch(Y=>{throw je(Y)&&Y.code==="42P01"?new d(404,{message:`Table "${t}" does not exist`}):this.wrapError(Y)}),S=Array.isArray(i)?i.map(Y=>({column:Y.columnName,direction:Y.direction})):i?[{column:i,direction:c}]:[],A=T.length?T:["ctid"],N=S[0]?.direction??c,C=[...S,...A.filter(Y=>!S.some(pt=>pt.column===Y)).map(Y=>({column:Y,direction:N}))],_=C.map(Y=>Y.column),D=o==="desc",x=l?this.decodeCursor(l):null,{clause:H,values:$}=x?Oc(C,x.values,D,b.length+1):{clause:"",values:[]},J=[f.replace(/^WHERE\s+/i,""),H].filter(Boolean),X=J.length?`WHERE ${J.join(" AND ")}`:"",ee=_.includes("ctid"),P=[...T.map(Y=>this.quoteIdentifier(Y)),...ee?["ctid"]:[]],ue=b.length+$.length+1,ge=(await m.query(`SELECT ${["*",...P].join(", ")} FROM ${p} ${X} ${_c(C,D)} LIMIT $${ue}`,[...b,...$,s+1])).rows,ot=ge.length>s;ot&&(ge=ge.slice(0,s)),o==="desc"&&(ge=ge.reverse());let B=ge.map(Y=>{if(!ee)return Y;let{ctid:pt,...ql}=Y;return ql}).filter(Y=>Object.keys(Y).length>0),oe=Y=>({values:Object.fromEntries(_.map(pt=>[pt,Y[pt]])),sortColumns:_}),Or=null,Ir=null;if(ge.length>0){let Y=ge[0],pt=ge[ge.length-1];o==="asc"?(ot&&(Or=this.encodeCursor(oe(pt))),l&&(Ir=this.encodeCursor(oe(Y)))):(l&&(Or=this.encodeCursor(oe(pt))),ot&&(Ir=this.encodeCursor(oe(Y))))}return{data:B,meta:{limit:s,total:h,...w&&{totalEstimated:!0},hasNextPage:o==="asc"?ot:!!l,hasPreviousPage:o==="asc"?!!l:ot,nextCursor:Or,prevCursor:Ir}}}async countRows(e,t,n,a){if(n){let{rows:o}=await e.query(`SELECT COUNT(*) as total FROM ${t} ${n}`,a);return{total:Number(o[0].total),estimated:!1}}let{rows:s}=await e.query(`SELECT CASE WHEN reltuples >= $1 THEN reltuples::bigint
345
+ ORDER BY sp.position LIMIT 1)`,tt=(r,e)=>`COALESCE(${e}::text, ${_p(r)})`,fe=(r,e)=>e?`${Zt(e)}.${Zt(r)}`:Zt(r)});var Rr,Op,Cr,Pc=C(()=>{"use strict";y();j();Ze();et();dt();bt();Q();Ge();Dc();Lc();Rr=async(r,e)=>{let t=await r.connect();try{await t.query("BEGIN");let n=await e(t);return await t.query("COMMIT"),n}catch(n){throw await t.query("ROLLBACK"),n}finally{t.release()}},Op=1024*1024,Cr=class extends re{databaseSizeSupport=new WeakMap;async runQuery(e,t,n){return(await(await W(e)).query(t,n)).rows}quoteIdentifier(e){return`"${e.replaceAll('"','""')}"`}mapToUniversalType(e){return Mn(e)}mapFromUniversalType(e){return{text:"TEXT",number:"INTEGER",boolean:"BOOLEAN",json:"JSONB",date:"TIMESTAMP WITH TIME ZONE",array:"TEXT[]",enum:"TEXT"}[e]??"TEXT"}buildTableDataQuery(){throw new Error("PgAdapter builds table data queries in getTableData")}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){throw new Error("PgAdapter builds cursors in getTableData")}async getTableData(e){let{tableName:t,schemaName:n,db:a,limit:s=50,direction:o="asc",sort:i=[],order:c="asc",cursor:l,filters:u=[]}=e,m=await W(a),p=fe(t,n),{clause:f,values:b}=_c(u),[T,{total:h,estimated:w}]=await Promise.all([this.getPrimaryKeyColumns(m,p),this.countRows(m,p,f,b)]).catch(Y=>{throw Ue(Y)&&Y.code==="42P01"?new d(404,{message:`Table "${t}" does not exist`}):this.wrapError(Y)}),S=Array.isArray(i)?i.map(Y=>({column:Y.columnName,direction:Y.direction})):i?[{column:i,direction:c}]:[],A=T.length?T:["ctid"],N=S[0]?.direction??c,R=[...S,...A.filter(Y=>!S.some(ft=>ft.column===Y)).map(Y=>({column:Y,direction:N}))],_=R.map(Y=>Y.column),D=o==="desc",x=l?this.decodeCursor(l):null,{clause:H,values:$}=x?xc(R,x.values,D,b.length+1):{clause:"",values:[]},J=[f.replace(/^WHERE\s+/i,""),H].filter(Boolean),X=J.length?`WHERE ${J.join(" AND ")}`:"",ee=_.includes("ctid"),P=[...T.map(Y=>this.quoteIdentifier(Y)),...ee?["ctid"]:[]],ue=b.length+$.length+1,be=(await m.query(`SELECT ${["*",...P].join(", ")} FROM ${p} ${X} ${Ic(R,D)} LIMIT $${ue}`,[...b,...$,s+1])).rows,it=be.length>s;it&&(be=be.slice(0,s)),o==="desc"&&(be=be.reverse());let B=be.map(Y=>{if(!ee)return Y;let{ctid:ft,...Fl}=Y;return Fl}).filter(Y=>Object.keys(Y).length>0),oe=Y=>({values:Object.fromEntries(_.map(ft=>[ft,Y[ft]])),sortColumns:_}),xr=null,Lr=null;if(be.length>0){let Y=be[0],ft=be[be.length-1];o==="asc"?(it&&(xr=this.encodeCursor(oe(ft))),l&&(Lr=this.encodeCursor(oe(Y)))):(l&&(xr=this.encodeCursor(oe(ft))),it&&(Lr=this.encodeCursor(oe(Y))))}return{data:B,meta:{limit:s,total:h,...w&&{totalEstimated:!0},hasNextPage:o==="asc"?it:!!l,hasPreviousPage:o==="asc"?!!l:it,nextCursor:xr,prevCursor:Lr}}}async countRows(e,t,n,a){if(n){let{rows:o}=await e.query(`SELECT COUNT(*) as total FROM ${t} ${n}`,a);return{total:Number(o[0].total),estimated:!1}}let{rows:s}=await e.query(`SELECT CASE WHEN reltuples >= $1 THEN reltuples::bigint
346
346
  ELSE (SELECT COUNT(*) FROM ${t}) END as total,
347
347
  reltuples >= $1 as estimated
348
- FROM pg_catalog.pg_class WHERE oid = $2::regclass`,[ut,t]);return{total:Number(s[0].total),estimated:s[0].estimated===!0}}async getDatabasesList(){try{let e=await W(),t=await this.supportsDatabaseSize(e)?"pg_size_pretty(pg_database_size(d.datname))":"'unknown'",{rows:n}=await e.query(`
348
+ FROM pg_catalog.pg_class WHERE oid = $2::regclass`,[mt,t]);return{total:Number(s[0].total),estimated:s[0].estimated===!0}}async getDatabasesList(){try{let e=await W(),t=await this.supportsDatabaseSize(e)?"pg_size_pretty(pg_database_size(d.datname))":"'unknown'",{rows:n}=await e.query(`
349
349
  SELECT
350
350
  d.datname as name,
351
351
  ${t} as size,
@@ -364,7 +364,7 @@ ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
364
364
  inet_server_port()::int4 as port,
365
365
  (SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
366
366
  (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
367
- `);if(!t[0])throw new d(500,{message:"No connection information returned from database"});let{connectionInfoSchema:n}=await Promise.resolve().then(()=>(j(),Ho)),a=n.parse(t[0]),s=_e(ve());return{host:a.host||s.host,port:a.port||s.port,user:a.user,database:a.database,version:a.version.toString(),active_connections:a.active_connections,max_connections:a.max_connections}}async getTablesList(e){let t=await W(e),n=u=>u.replaceAll('"','""'),{rows:a}=await t.query(`
367
+ `);if(!t[0])throw new d(500,{message:"No connection information returned from database"});let{connectionInfoSchema:n}=await Promise.resolve().then(()=>(j(),Wo)),a=n.parse(t[0]),s=Oe(qe());return{host:a.host||s.host,port:a.port||s.port,user:a.user,database:a.database,version:a.version.toString(),active_connections:a.active_connections,max_connections:a.max_connections}}async getTablesList(e){let t=await W(e),n=u=>u.replaceAll('"','""'),{rows:a}=await t.query(`
368
368
  SELECT t.table_schema as "schemaName", t.table_name as "tableName", c.reltuples as "estimate"
369
369
  FROM information_schema.tables t
370
370
  JOIN pg_catalog.pg_namespace n ON n.nspname = t.table_schema
@@ -373,18 +373,18 @@ ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
373
373
  AND t.table_schema NOT IN ('pg_catalog', 'information_schema')
374
374
  AND t.table_schema NOT LIKE 'pg_toast%'
375
375
  ORDER BY t.table_schema, t.table_name;
376
- `);if(!a[0])return[];let s=a.flatMap((u,m)=>u.estimate<ut?[{...u,index:m}]:[]),o=4,i=Array.from({length:o},()=>[]);s.forEach((u,m)=>{i[m%o]?.push(`SELECT ${u.index} AS index, COUNT(*) AS count FROM "${n(u.schemaName)}"."${n(u.tableName)}"`)});let c=await Promise.all(i.filter(u=>u.length>0).map(u=>t.query(u.join(" UNION ALL ")))),l=new Map(c.flatMap(({rows:u})=>u.map(m=>[m.index,Number(m.count)])));return a.map((u,m)=>{let p=l.get(m);return{schemaName:u.schemaName,tableName:u.tableName,rowCount:p??Math.round(u.estimate),...p===void 0&&{rowCountEstimated:!0}}})}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=await W(t),i=a.filter(u=>u.isPrimaryKey).map(u=>u.columnName),c=a.map(u=>{let m=`"${u.columnName}" ${u.columnType}`;return u.isArray&&(m+="[]"),i.length===1&&u.isPrimaryKey&&(m+=" PRIMARY KEY"),u.isUnique&&!u.isPrimaryKey&&(m+=" UNIQUE"),u.isNullable||(m+=" NOT NULL"),u.isIdentity&&(m+=" GENERATED ALWAYS AS IDENTITY"),u.defaultValue&&!u.isIdentity&&(m+=` DEFAULT ${u.defaultValue}`),m});i.length>1&&c.push(`PRIMARY KEY (${i.map(u=>`"${u}"`).join(", ")})`);let l=s?.map(u=>`CONSTRAINT "${`fk_${n}_${u.columnName}_${u.referencedTable}_${u.referencedColumn}`}" FOREIGN KEY ("${u.columnName}") REFERENCES "${u.referencedTable}" ("${u.referencedColumn}") ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)??[];await o.query(`CREATE TABLE "${n}" (
376
+ `);if(!a[0])return[];let s=a.flatMap((u,m)=>u.estimate<mt?[{...u,index:m}]:[]),o=4,i=Array.from({length:o},()=>[]);s.forEach((u,m)=>{i[m%o]?.push(`SELECT ${u.index} AS index, COUNT(*) AS count FROM "${n(u.schemaName)}"."${n(u.tableName)}"`)});let c=await Promise.all(i.filter(u=>u.length>0).map(u=>t.query(u.join(" UNION ALL ")))),l=new Map(c.flatMap(({rows:u})=>u.map(m=>[m.index,Number(m.count)])));return a.map((u,m)=>{let p=l.get(m);return{schemaName:u.schemaName,tableName:u.tableName,rowCount:p??Math.round(u.estimate),...p===void 0&&{rowCountEstimated:!0}}})}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=await W(t),i=a.filter(u=>u.isPrimaryKey).map(u=>u.columnName),c=a.map(u=>{let m=`"${u.columnName}" ${u.columnType}`;return u.isArray&&(m+="[]"),i.length===1&&u.isPrimaryKey&&(m+=" PRIMARY KEY"),u.isUnique&&!u.isPrimaryKey&&(m+=" UNIQUE"),u.isNullable||(m+=" NOT NULL"),u.isIdentity&&(m+=" GENERATED ALWAYS AS IDENTITY"),u.defaultValue&&!u.isIdentity&&(m+=` DEFAULT ${u.defaultValue}`),m});i.length>1&&c.push(`PRIMARY KEY (${i.map(u=>`"${u}"`).join(", ")})`);let l=s?.map(u=>`CONSTRAINT "${`fk_${n}_${u.columnName}_${u.referencedTable}_${u.referencedColumn}`}" FOREIGN KEY ("${u.columnName}") REFERENCES "${u.referencedTable}" ("${u.referencedColumn}") ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)??[];await o.query(`CREATE TABLE "${n}" (
377
377
  ${[...c,...l].join(`,
378
378
  `)}
379
- );`)}async deleteTable(e){let{tableName:t,schemaName:n,db:a,cascade:s}=e,o=await W(a),i=pe(t,n);await this.assertTableExists(o,t,n);let c=await this.getTableRowCount(o,i);if(!s&&(await this.getFkConstraints(o,t,n)).length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(o,t,n)};try{return await o.query(`DROP TABLE ${i} ${s?"CASCADE":"RESTRICT"}`),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(l){if(l.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(o,t,n)};throw l instanceof d?l:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){try{let{tableName:t,newTableName:n,schemaName:a,db:s}=e;this.assertDifferentTableName(t,n);let o=await W(s),{rows:i}=await o.query(`SELECT table_schema as "schemaName" FROM information_schema.tables WHERE table_name = $1 AND table_schema NOT IN ('pg_catalog', 'information_schema') AND table_schema NOT LIKE 'pg_toast%';`,[t]),c=i.map(m=>m.schemaName);if(c.length===0)throw new d(404,{message:`Table "${t}" does not exist`});if(a&&!c.includes(a))throw new d(404,{message:`Table "${a}"."${t}" does not exist`});if(!a&&c.length>1)throw new d(400,{message:`Table "${t}" exists in multiple schemas (${c.join(", ")}); rename is ambiguous`});let l=a??c[0],{rows:u}=await o.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1 AND table_schema = $2) as exists;",[n,l]);if(u[0]?.exists)throw new d(409,{message:`Table "${n}" already exists`});await o.query(`ALTER TABLE "${l.replaceAll('"','""')}"."${t.replaceAll('"','""')}" RENAME TO "${n.replaceAll('"','""')}"`)}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,schemaName:t,db:n}){let a=await W(n),s=et("$1","$2"),o=[e,t??null],{rows:i}=await a.query(`SELECT table_schema as "schemaName" FROM information_schema.tables WHERE table_schema = ${s} AND table_name = $1`,o),c=i[0]?.schemaName;if(!c)throw new d(404,{message:`Table "${e}" does not exist`});let{rows:l}=await a.query(`SELECT column_name, data_type, udt_name, is_nullable, column_default, character_maximum_length, numeric_precision, numeric_scale
379
+ );`)}async deleteTable(e){let{tableName:t,schemaName:n,db:a,cascade:s}=e,o=await W(a),i=fe(t,n);await this.assertTableExists(o,t,n);let c=await this.getTableRowCount(o,i);if(!s&&(await this.getFkConstraints(o,t,n)).length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(o,t,n)};try{return await o.query(`DROP TABLE ${i} ${s?"CASCADE":"RESTRICT"}`),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(l){if(l.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(o,t,n)};throw l instanceof d||pe(l)?l:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){try{let{tableName:t,newTableName:n,schemaName:a,db:s}=e;this.assertDifferentTableName(t,n);let o=await W(s),{rows:i}=await o.query(`SELECT table_schema as "schemaName" FROM information_schema.tables WHERE table_name = $1 AND table_schema NOT IN ('pg_catalog', 'information_schema') AND table_schema NOT LIKE 'pg_toast%';`,[t]),c=i.map(m=>m.schemaName);if(c.length===0)throw new d(404,{message:`Table "${t}" does not exist`});if(a&&!c.includes(a))throw new d(404,{message:`Table "${a}"."${t}" does not exist`});if(!a&&c.length>1)throw new d(400,{message:`Table "${t}" exists in multiple schemas (${c.join(", ")}); rename is ambiguous`});let l=a??c[0],{rows:u}=await o.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1 AND table_schema = $2) as exists;",[n,l]);if(u[0]?.exists)throw new d(409,{message:`Table "${n}" already exists`});await o.query(`ALTER TABLE "${l.replaceAll('"','""')}"."${t.replaceAll('"','""')}" RENAME TO "${n.replaceAll('"','""')}"`)}catch(t){throw this.wrapError(t)}}async getTableSchema({tableName:e,schemaName:t,db:n}){let a=await W(n),s=tt("$1","$2"),o=[e,t??null],{rows:i}=await a.query(`SELECT table_schema as "schemaName" FROM information_schema.tables WHERE table_schema = ${s} AND table_name = $1`,o),c=i[0]?.schemaName;if(!c)throw new d(404,{message:`Table "${e}" does not exist`});let{rows:l}=await a.query(`SELECT column_name, data_type, udt_name, is_nullable, column_default, character_maximum_length, numeric_precision, numeric_scale
380
380
  FROM information_schema.columns WHERE table_schema = ${s} AND table_name = $1 ORDER BY ordinal_position`,o),{rows:u}=await a.query(`SELECT tc.constraint_name, tc.constraint_type, kcu.column_name, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name
381
381
  FROM information_schema.table_constraints tc
382
382
  JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
383
383
  LEFT JOIN information_schema.constraint_column_usage ccu ON tc.constraint_name = ccu.constraint_name AND tc.table_schema = ccu.table_schema AND tc.constraint_type = 'FOREIGN KEY'
384
384
  WHERE tc.table_schema = ${s} AND tc.table_name = $1 ORDER BY tc.constraint_type, tc.constraint_name`,o),{rows:m}=await a.query(`SELECT indexname, indexdef FROM pg_indexes WHERE schemaname = ${s} AND tablename = $1
385
- AND indexname NOT IN (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = ${s} AND table_name = $1 AND constraint_type = 'PRIMARY KEY')`,o),p=w=>{let{data_type:S,udt_name:A,character_maximum_length:N,numeric_precision:C,numeric_scale:_}=w;return S==="USER-DEFINED"?A:S==="ARRAY"?`${A.replace(/^_/,"")}[]`:(S==="character varying"||S==="varchar")&&N?`varchar(${N})`:S==="character"&&N?`char(${N})`:S==="numeric"&&C!==null?_!==null&&_>0?`numeric(${C}, ${_})`:`numeric(${C})`:S==="timestamp with time zone"?"timestamp with time zone":S==="timestamp without time zone"?"timestamp":{"character varying":"varchar",character:"char","double precision":"float8",integer:"integer",bigint:"bigint",smallint:"smallint",boolean:"boolean",text:"text",uuid:"uuid",json:"json",jsonb:"jsonb",date:"date",time:"time",bytea:"bytea"}[S]||S},f=[`create table ${c}.${e} (`],b=l.map(w=>{let S=` ${w.column_name} ${p(w)}`;return w.is_nullable==="NO"&&(S+=" not null"),w.column_default!==null&&(S+=` default ${w.column_default}`),S}),T=new Map;for(let w of u){let S=T.get(w.constraint_name)??[];S.push(w),T.set(w.constraint_name,S)}let h=[];for(let[w,S]of T){let A=S[0],N=S.map(C=>C.column_name).join(", ");A.constraint_type==="PRIMARY KEY"?h.push(` constraint ${w} primary key (${N})`):A.constraint_type==="FOREIGN KEY"?h.push(` constraint ${w} foreign key (${N}) references ${A.foreign_table_name} (${A.foreign_column_name})`):A.constraint_type==="UNIQUE"&&h.push(` constraint ${w} unique (${N})`)}f.push([...b,...h].join(`,
385
+ AND indexname NOT IN (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = ${s} AND table_name = $1 AND constraint_type = 'PRIMARY KEY')`,o),p=w=>{let{data_type:S,udt_name:A,character_maximum_length:N,numeric_precision:R,numeric_scale:_}=w;return S==="USER-DEFINED"?A:S==="ARRAY"?`${A.replace(/^_/,"")}[]`:(S==="character varying"||S==="varchar")&&N?`varchar(${N})`:S==="character"&&N?`char(${N})`:S==="numeric"&&R!==null?_!==null&&_>0?`numeric(${R}, ${_})`:`numeric(${R})`:S==="timestamp with time zone"?"timestamp with time zone":S==="timestamp without time zone"?"timestamp":{"character varying":"varchar",character:"char","double precision":"float8",integer:"integer",bigint:"bigint",smallint:"smallint",boolean:"boolean",text:"text",uuid:"uuid",json:"json",jsonb:"jsonb",date:"date",time:"time",bytea:"bytea"}[S]||S},f=[`create table ${c}.${e} (`],b=l.map(w=>{let S=` ${w.column_name} ${p(w)}`;return w.is_nullable==="NO"&&(S+=" not null"),w.column_default!==null&&(S+=` default ${w.column_default}`),S}),T=new Map;for(let w of u){let S=T.get(w.constraint_name)??[];S.push(w),T.set(w.constraint_name,S)}let h=[];for(let[w,S]of T){let A=S[0],N=S.map(R=>R.column_name).join(", ");A.constraint_type==="PRIMARY KEY"?h.push(` constraint ${w} primary key (${N})`):A.constraint_type==="FOREIGN KEY"?h.push(` constraint ${w} foreign key (${N}) references ${A.foreign_table_name} (${A.foreign_column_name})`):A.constraint_type==="UNIQUE"&&h.push(` constraint ${w} unique (${N})`)}f.push([...b,...h].join(`,
386
386
  `)),f.push(") tablespace pg_default;");for(let w of m)[...T.values()].some(A=>A[0].constraint_type==="UNIQUE"&&A[0].constraint_name===w.indexname)||(f.push(""),f.push(`${w.indexdef};`));return f.join(`
387
- `)}async getTableColumns({tableName:e,db:t,schemaName:n}){let a=await W(t),s=et("$1","$2"),{rows:o}=await a.query(`SELECT
387
+ `)}async getTableColumns({tableName:e,db:t,schemaName:n}){let a=await W(t),s=tt("$1","$2"),{rows:o}=await a.query(`SELECT
388
388
  c.column_name as "columnName", c.data_type as "dataType", c.udt_name as "udtName",
389
389
  c.is_nullable = 'YES' as "isNullable", c.column_default as "columnDefault",
390
390
  CASE WHEN pk.column_name IS NOT NULL THEN true ELSE false END as "isPrimaryKey",
@@ -407,11 +407,11 @@ ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
407
407
  JOIN information_schema.constraint_column_usage ccu ON tc.constraint_name = ccu.constraint_name AND tc.table_schema = ccu.table_schema
408
408
  WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = ${s} AND tc.table_name = $1
409
409
  ) fk ON c.column_name = fk.column_name
410
- WHERE c.table_schema = ${s} AND c.table_name = $1 ORDER BY c.ordinal_position;`,[e,n??null]);if(!o||o.length===0)throw new d(404,{message:`Table "${e}" does not exist`});return o.map(i=>{let c=null;return i.enumValues&&(Array.isArray(i.enumValues)?c=i.enumValues:typeof i.enumValues=="string"&&(c=i.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:i.columnName,dataType:Pn(i.dataType),dataTypeLabel:Kr(i.dataType),isNullable:i.isNullable,columnDefault:i.columnDefault,isPrimaryKey:i.isPrimaryKey,isForeignKey:i.isForeignKey,referencedTable:i.referencedTable,...i.referencedSchema&&{referencedSchema:i.referencedSchema},referencedColumn:i.referencedColumn,enumValues:c}})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,isArray:u,schemaName:m,db:p}=e,f=await W(p);await this.assertTableExists(f,t,m);let b=pe(t,m),{rows:T}=await f.query(`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${et("$1","$3")}) as exists;`,[t,n,m??null]);if(T[0]?.exists)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let h=`"${n}" ${a}`;u&&(h+="[]"),o&&(h+=" PRIMARY KEY"),c&&!o&&(h+=" UNIQUE"),i||(h+=" NOT NULL"),l&&(h+=" GENERATED ALWAYS AS IDENTITY"),s?.trim()&&!l&&(h+=` DEFAULT ${s.trim()}`),await f.query(`ALTER TABLE ${b} ADD COLUMN ${h}`)}async deleteColumn(e){let{tableName:t,schemaName:n,columnName:a,cascade:s,db:o}=e,i=await W(o);await this.assertTableExists(i,t,n);let c=pe(t,n),{rows:l}=await i.query(`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${et("$1","$3")}) as exists;`,[t,a,n??null]);if(!l[0]?.exists)throw new d(404,{message:`Column "${a}" does not exist in table "${t}"`});let{rowCount:u}=await i.query(`ALTER TABLE ${c} DROP COLUMN "${a}" ${s?"CASCADE":"RESTRICT"}`);return{deletedCount:u??0}}async alterColumn(e){let{tableName:t,schemaName:n,columnName:a,columnType:s,isNullable:o,defaultValue:i,db:c}=e,l=await W(c);await this.assertTableExists(l,t,n);let u=pe(t,n),{rows:m}=await l.query(`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${et("$1","$3")}) as exists;`,[t,a,n??null]);if(!m[0]?.exists)throw new d(404,{message:`Column "${a}" does not exist in table "${t}"`});await wr(l,async p=>{await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" TYPE ${s}`),await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" ${o?"DROP":"SET"} NOT NULL`),i?.trim()?await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" SET DEFAULT ${i.trim()}`):await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" DROP DEFAULT`)})}async renameColumn(e){let{tableName:t,schemaName:n,columnName:a,newColumnName:s,db:o}=e,i=await W(o),c=`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${et("$1","$3")}) as exists;`;await this.assertTableExists(i,t,n);let l=pe(t,n),{rows:u}=await i.query(c,[t,a,n??null]);if(!u[0]?.exists)throw new d(404,{message:`Column "${a}" does not exist in table "${t}"`});let{rows:m}=await i.query(c,[t,s,n??null]);if(m[0]?.exists)throw new d(409,{message:`Column "${s}" already exists in table "${t}"`});await i.query(`ALTER TABLE ${l} RENAME COLUMN "${a}" TO "${s}"`)}async getServerLogs({db:e}){let t=await W(e);try{let{rows:[n]}=await t.query(`${$e} SELECT current_setting('logging_collector') AS collector,
410
+ WHERE c.table_schema = ${s} AND c.table_name = $1 ORDER BY c.ordinal_position;`,[e,n??null]);if(!o||o.length===0)throw new d(404,{message:`Table "${e}" does not exist`});return o.map(i=>{let c=null;return i.enumValues&&(Array.isArray(i.enumValues)?c=i.enumValues:typeof i.enumValues=="string"&&(c=i.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:i.columnName,dataType:Mn(i.dataType),dataTypeLabel:jr(i.dataType),isNullable:i.isNullable,columnDefault:i.columnDefault,isPrimaryKey:i.isPrimaryKey,isForeignKey:i.isForeignKey,referencedTable:i.referencedTable,...i.referencedSchema&&{referencedSchema:i.referencedSchema},referencedColumn:i.referencedColumn,enumValues:c}})}async addColumn(e){let{tableName:t,columnName:n,columnType:a,defaultValue:s,isPrimaryKey:o,isNullable:i,isUnique:c,isIdentity:l,isArray:u,schemaName:m,db:p}=e,f=await W(p);await this.assertTableExists(f,t,m);let b=fe(t,m),{rows:T}=await f.query(`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${tt("$1","$3")}) as exists;`,[t,n,m??null]);if(T[0]?.exists)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let h=`"${n}" ${a}`;u&&(h+="[]"),o&&(h+=" PRIMARY KEY"),c&&!o&&(h+=" UNIQUE"),i||(h+=" NOT NULL"),l&&(h+=" GENERATED ALWAYS AS IDENTITY"),s?.trim()&&!l&&(h+=` DEFAULT ${s.trim()}`),await f.query(`ALTER TABLE ${b} ADD COLUMN ${h}`)}async deleteColumn(e){let{tableName:t,schemaName:n,columnName:a,cascade:s,db:o}=e,i=await W(o);await this.assertTableExists(i,t,n);let c=fe(t,n),{rows:l}=await i.query(`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${tt("$1","$3")}) as exists;`,[t,a,n??null]);if(!l[0]?.exists)throw new d(404,{message:`Column "${a}" does not exist in table "${t}"`});let{rowCount:u}=await i.query(`ALTER TABLE ${c} DROP COLUMN "${a}" ${s?"CASCADE":"RESTRICT"}`);return{deletedCount:u??0}}async alterColumn(e){let{tableName:t,schemaName:n,columnName:a,columnType:s,isNullable:o,defaultValue:i,db:c}=e,l=await W(c);await this.assertTableExists(l,t,n);let u=fe(t,n),{rows:m}=await l.query(`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${tt("$1","$3")}) as exists;`,[t,a,n??null]);if(!m[0]?.exists)throw new d(404,{message:`Column "${a}" does not exist in table "${t}"`});await Rr(l,async p=>{await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" TYPE ${s}`),await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" ${o?"DROP":"SET"} NOT NULL`),i?.trim()?await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" SET DEFAULT ${i.trim()}`):await p.query(`ALTER TABLE ${u} ALTER COLUMN "${a}" DROP DEFAULT`)})}async renameColumn(e){let{tableName:t,schemaName:n,columnName:a,newColumnName:s,db:o}=e,i=await W(o),c=`SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = ${tt("$1","$3")}) as exists;`;await this.assertTableExists(i,t,n);let l=fe(t,n),{rows:u}=await i.query(c,[t,a,n??null]);if(!u[0]?.exists)throw new d(404,{message:`Column "${a}" does not exist in table "${t}"`});let{rows:m}=await i.query(c,[t,s,n??null]);if(m[0]?.exists)throw new d(409,{message:`Column "${s}" already exists in table "${t}"`});await i.query(`ALTER TABLE ${l} RENAME COLUMN "${a}" TO "${s}"`)}async getServerLogs({db:e}){let t=await W(e);try{let{rows:[n]}=await t.query(`${Me} SELECT current_setting('logging_collector') AS collector,
411
411
  current_setting('log_destination') AS destination,
412
412
  EXTRACT(EPOCH FROM (now() AT TIME ZONE current_setting('log_timezone'))
413
- - (now() AT TIME ZONE 'UTC')) / 60 AS offset`);if(n.collector!=="on")return ne("logging_collector is off, so PostgreSQL writes its log to stderr, outside the database. Turn it on to read the log here.");let a=n.destination.split(",").map(u=>u.trim()),s=["jsonlog","csvlog"].find(u=>a.includes(u))??"stderr",{rows:[o]}=await t.query(`${$e} SELECT path, (pg_stat_file(path)).size AS size
414
- FROM pg_current_logfile($1) AS path`,[s]);if(!o.path||o.size===null)return ne("PostgreSQL has not opened a log file yet.");let i=Number(o.size),c=Math.max(0,i-Ap),{rows:[l]}=await t.query(`${$e} SELECT pg_read_binary_file($1, $2, $3) AS data`,[o.path,c,i-c]);return{available:!0,source:`${o.path} (${s})`,entries:Oe(Rc(l.data.toString("utf8"),s,{logUtcOffsetMinutes:Number(n.offset),truncatedStart:c>0}))}}catch(n){if(je(n)&&n.code==="42501")return ne("Reading the server log needs superuser, or: GRANT pg_monitor, pg_read_server_files TO <user>;");throw this.wrapError(n)}}async getTableIndexes({tableName:e,schemaName:t,db:n}){try{return(await this.listIndexes(await W(n),e,t)).map(({schemaName:s,...o})=>o)}catch(a){throw this.wrapError(a)}}async createIndex(e){let{tableName:t,schemaName:n,indexName:a,columns:s,isUnique:o,method:i="btree",db:c}=e;try{let l=await W(c);await this.assertTableExists(l,t,n);let{rows:u}=await l.query(`SELECT column_name as "columnName" FROM information_schema.columns WHERE table_name = $1 AND table_schema = ${et("$1","$2")}`,[t,n??null]),m=new Set(u.map(f=>f.columnName)),p=s.find(f=>!m.has(f));if(p!==void 0)throw new d(400,{message:`Column "${p}" does not exist in table "${t}"`});if(!M.pg.indexes.methods.includes(i))throw new d(400,{message:`Unsupported index method "${i}"`});await l.query(`CREATE ${o?"UNIQUE ":""}INDEX ${this.quoteIdentifier(a)} ON ${pe(t,n)} USING ${i} (${s.map(f=>this.quoteIdentifier(f)).join(", ")})`)}catch(l){let u=l.code;throw l instanceof Error&&(u==="42P07"||u==="23505")?new d(409,{message:l.message,cause:l}):l instanceof Error&&(u==="0A000"||u==="42704")?new d(400,{message:l.message,cause:l}):this.wrapError(l)}}async dropIndex({tableName:e,schemaName:t,indexName:n,db:a}){try{let s=await W(a),o=(await this.listIndexes(s,e,t)).find(i=>i.indexName===n);if(!o)throw new d(404,{message:`Index "${n}" does not exist on table "${e}"`});if(o.kind!=="index")throw new d(400,{message:`Index "${n}" backs a constraint; drop the constraint to remove it`});await s.query(`DROP INDEX ${this.quoteIdentifier(o.schemaName)}.${this.quoteIdentifier(n)}`)}catch(s){throw this.wrapError(s)}}async addRecord({db:e,schemaName:t,params:n}){let{tableName:a,data:s}=n,o=await W(e),i=Object.keys(s),c=Object.values(s),l=i.map((p,f)=>`$${f+1}`).join(", "),u=i.map(p=>`"${p}"`).join(", "),m=await o.query(`INSERT INTO ${pe(a,t)} (${u}) VALUES (${l}) RETURNING *`,c);if(m.rowCount===0)throw new d(500,{message:`Failed to insert record into "${a}"`});return{insertedCount:m.rowCount??0}}async updateRecords({params:e,schemaName:t,db:n}){let{tableName:a}=e,s=await W(n),o=pe(a,t),i=this.resolveKeyColumns(e);this.assertWholeKey(await this.getPrimaryKeyColumns(s,o),i);let c=this.groupUpdatesByKey(e,i);try{return await wr(s,async l=>{let u=0;for(let{keyValues:m,rowUpdates:p}of c){let f=[],b=p.map(w=>w.useDefault?`"${w.columnName}" = DEFAULT`:(f.push(w.value!==null&&typeof w.value=="object"?JSON.stringify(w.value):w.value),`"${w.columnName}" = $${f.length}`)),T=i.map((w,S)=>`"${w}" = $${f.length+S+1}`);f.push(...m);let h=await l.query(`UPDATE ${o} SET ${b.join(", ")} WHERE ${T.join(" AND ")} RETURNING *`,f);if(h.rowCount===0)throw new d(404,{message:`Record with ${this.describeKey(i,m)} not found in table "${a}"`});u+=h.rowCount??0}return{updatedCount:u}})}catch(l){throw l instanceof d||Kt(l)||ht(l)?l:new d(500,{message:`Failed to update records in "${a}"`})}}async deleteRecords({tableName:e,schemaName:t,primaryKeys:n,db:a}){let s=await W(a),o=pe(e,t),i=n[0]?.columnName;if(!i)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(s,o));let c=n.map(u=>u.value),l=c.map((u,m)=>`$${m+1}`).join(", ");try{return{deletedCount:(await s.query(`DELETE FROM ${o} WHERE "${i}" IN (${l}) RETURNING *`,c)).rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(u){if(u.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(s,e,t,n)};throw u instanceof d?u:new d(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,schemaName:t,primaryKeys:n,db:a}){let s=await W(a),o=pe(e,t),i=n[0]?.columnName;if(!i)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(s,o));let c=n.map(l=>l.value);try{return await wr(s,async l=>{let u=await this.getFkConstraints(l,e,t),m=0,p=async(T,h,w,S)=>{let A=pe(T,h),N=await this.getFkConstraints(l,T,h);for(let D of N){let x=S.map((J,X)=>`$${X+1}`).join(", "),{rows:H}=await l.query(`SELECT "${D.referencedColumn}" FROM ${A} WHERE "${w}" IN (${x})`,S),$=H.map(J=>J[D.referencedColumn]);$.length>0&&await p(D.referencingTable,D.referencingSchema,D.referencingColumn,$)}let C=S.map((D,x)=>`$${x+1}`).join(", "),_=await l.query(`DELETE FROM ${A} WHERE "${w}" IN (${C})`,S);m+=_.rowCount??0};for(let T of u)await p(T.referencingTable,T.referencingSchema,T.referencingColumn,c);let f=c.map((T,h)=>`$${h+1}`).join(", ");return{deletedCount:((await l.query(`DELETE FROM ${o} WHERE "${i}" IN (${f}) RETURNING *`,c)).rowCount??0)+m}})}catch(l){throw l instanceof d?l:new d(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,schemaName:t,records:n,db:a}){if(!n||n.length===0)throw new d(400,{message:"At least one record is required"});let s=await W(a);try{return await wr(s,async o=>{let i=Object.keys(n[0]),c=i.map(u=>`"${u}"`).join(", "),l=0;for(let u of n){let m=i.map(f=>u[f]),p=i.map((f,b)=>`$${b+1}`).join(", ");try{await o.query(`INSERT INTO ${pe(e,t)} (${c}) VALUES (${p}) RETURNING *`,m),l++}catch(f){throw Kt(f)||ht(f)?f:new d(500,{message:`Failed: ${f instanceof Error?f.message:String(f)}`})}}return{success:!0,message:`Bulk insert completed: ${l} records inserted`,successCount:l,failureCount:0}})}catch(o){throw o instanceof d||Kt(o)||ht(o)?o:new d(500,{message:`Failed to bulk insert records into "${e}"`})}}async exportTableData({tableName:e,schemaName:t,db:n}){try{let a=await W(n),{rows:s}=await a.query(`SELECT * FROM ${pe(e,t)}`);if(s.length===0)throw new d(404,{message:`Table "${e}" does not exist or has no data`});return{cols:Object.keys(s[0]),rows:s}}catch(a){throw this.wrapError(a)}}async executeQuery({query:e,db:t}){let n=await W(t);if(!e?.trim())throw new d(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),s=performance.now(),o=await n.query(a),i=performance.now()-s;return{columns:o.fields.map(c=>c.name),rows:o.rows,rowCount:o.rows.length,duration:i,message:o.rows.length===0?"OK":void 0}}supportsDatabaseSize(e){let t=this.databaseSizeSupport.get(e);return t||(t=e.query(`SELECT to_regprocedure('pg_database_size(name)') IS NOT NULL AS "supported"`).then(({rows:n})=>n[0]?.supported===!0).catch(n=>{throw this.databaseSizeSupport.delete(e),n}),this.databaseSizeSupport.set(e,t)),t}async assertTableExists(e,t,n){let{rows:a}=await e.query(`SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1 AND table_schema = ${et("$1","$2")}) as exists;`,[t,n??null]);if(!a[0]?.exists)throw new d(404,{message:`Table "${t}" does not exist`})}async listIndexes(e,t,n){await this.assertTableExists(e,t,n);let{rows:a}=await e.query(`SELECT
413
+ - (now() AT TIME ZONE 'UTC')) / 60 AS offset`);if(n.collector!=="on")return ne("logging_collector is off, so PostgreSQL writes its log to stderr, outside the database. Turn it on to read the log here.");let a=n.destination.split(",").map(u=>u.trim()),s=["jsonlog","csvlog"].find(u=>a.includes(u))??"stderr",{rows:[o]}=await t.query(`${Me} SELECT path, (pg_stat_file(path)).size AS size
414
+ FROM pg_current_logfile($1) AS path`,[s]);if(!o.path||o.size===null)return ne("PostgreSQL has not opened a log file yet.");let i=Number(o.size),c=Math.max(0,i-Op),{rows:[l]}=await t.query(`${Me} SELECT pg_read_binary_file($1, $2, $3) AS data`,[o.path,c,i-c]);return{available:!0,source:`${o.path} (${s})`,entries:Ie(Ac(l.data.toString("utf8"),s,{logUtcOffsetMinutes:Number(n.offset),truncatedStart:c>0}))}}catch(n){if(Ue(n)&&n.code==="42501")return ne("Reading the server log needs superuser, or: GRANT pg_monitor, pg_read_server_files TO <user>;");throw this.wrapError(n)}}async getTableIndexes({tableName:e,schemaName:t,db:n}){try{return(await this.listIndexes(await W(n),e,t)).map(({schemaName:s,...o})=>o)}catch(a){throw this.wrapError(a)}}async createIndex(e){let{tableName:t,schemaName:n,indexName:a,columns:s,isUnique:o,method:i="btree",db:c}=e;try{let l=await W(c);await this.assertTableExists(l,t,n);let{rows:u}=await l.query(`SELECT column_name as "columnName" FROM information_schema.columns WHERE table_name = $1 AND table_schema = ${tt("$1","$2")}`,[t,n??null]),m=new Set(u.map(f=>f.columnName)),p=s.find(f=>!m.has(f));if(p!==void 0)throw new d(400,{message:`Column "${p}" does not exist in table "${t}"`});if(!M.pg.indexes.methods.includes(i))throw new d(400,{message:`Unsupported index method "${i}"`});await l.query(`CREATE ${o?"UNIQUE ":""}INDEX ${this.quoteIdentifier(a)} ON ${fe(t,n)} USING ${i} (${s.map(f=>this.quoteIdentifier(f)).join(", ")})`)}catch(l){let u=l.code;throw l instanceof Error&&(u==="42P07"||u==="23505")?new d(409,{message:l.message,cause:l}):l instanceof Error&&(u==="0A000"||u==="42704")?new d(400,{message:l.message,cause:l}):this.wrapError(l)}}async dropIndex({tableName:e,schemaName:t,indexName:n,db:a}){try{let s=await W(a),o=(await this.listIndexes(s,e,t)).find(i=>i.indexName===n);if(!o)throw new d(404,{message:`Index "${n}" does not exist on table "${e}"`});if(o.kind!=="index")throw new d(400,{message:`Index "${n}" backs a constraint; drop the constraint to remove it`});await s.query(`DROP INDEX ${this.quoteIdentifier(o.schemaName)}.${this.quoteIdentifier(n)}`)}catch(s){throw this.wrapError(s)}}async addRecord({db:e,schemaName:t,params:n}){let{tableName:a,data:s}=n,o=await W(e),i=Object.keys(s),c=Object.values(s),l=i.map((p,f)=>`$${f+1}`).join(", "),u=i.map(p=>`"${p}"`).join(", "),m=await o.query(`INSERT INTO ${fe(a,t)} (${u}) VALUES (${l}) RETURNING *`,c);if(m.rowCount===0)throw new d(500,{message:`Failed to insert record into "${a}"`});return{insertedCount:m.rowCount??0}}async updateRecords({params:e,schemaName:t,db:n}){let{tableName:a}=e,s=await W(n),o=fe(a,t),i=this.resolveKeyColumns(e);this.assertWholeKey(await this.getPrimaryKeyColumns(s,o),i);let c=this.groupUpdatesByKey(e,i);try{return await Rr(s,async l=>{let u=0;for(let{keyValues:m,rowUpdates:p}of c){let f=[],b=p.map(w=>w.useDefault?`"${w.columnName}" = DEFAULT`:(f.push(w.value!==null&&typeof w.value=="object"?JSON.stringify(w.value):w.value),`"${w.columnName}" = $${f.length}`)),T=i.map((w,S)=>`"${w}" = $${f.length+S+1}`);f.push(...m);let h=await l.query(`UPDATE ${o} SET ${b.join(", ")} WHERE ${T.join(" AND ")} RETURNING *`,f);if(h.rowCount===0)throw new d(404,{message:`Record with ${this.describeKey(i,m)} not found in table "${a}"`});u+=h.rowCount??0}return{updatedCount:u}})}catch(l){throw l instanceof d||jt(l)||gt(l)||pe(l)?l:new d(500,{message:`Failed to update records in "${a}"`})}}async deleteRecords({tableName:e,schemaName:t,primaryKeys:n,db:a}){let s=await W(a),o=fe(e,t),i=n[0]?.columnName;if(!i)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(s,o));let c=n.map(u=>u.value),l=c.map((u,m)=>`$${m+1}`).join(", ");try{return{deletedCount:(await s.query(`DELETE FROM ${o} WHERE "${i}" IN (${l}) RETURNING *`,c)).rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(u){if(u.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(s,e,t,n)};throw u instanceof d||pe(u)?u:new d(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,schemaName:t,primaryKeys:n,db:a}){let s=await W(a),o=fe(e,t),i=n[0]?.columnName;if(!i)throw new d(400,{message:"Primary key column name is required"});this.assertDeletableKey(await this.getPrimaryKeyColumns(s,o));let c=n.map(l=>l.value);try{return await Rr(s,async l=>{let u=await this.getFkConstraints(l,e,t),m=0,p=async(T,h,w,S)=>{let A=fe(T,h),N=await this.getFkConstraints(l,T,h);for(let D of N){let x=S.map((J,X)=>`$${X+1}`).join(", "),{rows:H}=await l.query(`SELECT "${D.referencedColumn}" FROM ${A} WHERE "${w}" IN (${x})`,S),$=H.map(J=>J[D.referencedColumn]);$.length>0&&await p(D.referencingTable,D.referencingSchema,D.referencingColumn,$)}let R=S.map((D,x)=>`$${x+1}`).join(", "),_=await l.query(`DELETE FROM ${A} WHERE "${w}" IN (${R})`,S);m+=_.rowCount??0};for(let T of u)await p(T.referencingTable,T.referencingSchema,T.referencingColumn,c);let f=c.map((T,h)=>`$${h+1}`).join(", ");return{deletedCount:((await l.query(`DELETE FROM ${o} WHERE "${i}" IN (${f}) RETURNING *`,c)).rowCount??0)+m}})}catch(l){throw l instanceof d||pe(l)?l:new d(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,schemaName:t,records:n,db:a}){if(!n||n.length===0)throw new d(400,{message:"At least one record is required"});let s=await W(a);try{return await Rr(s,async o=>{let i=Object.keys(n[0]),c=i.map(u=>`"${u}"`).join(", "),l=0;for(let u of n){let m=i.map(f=>u[f]),p=i.map((f,b)=>`$${b+1}`).join(", ");try{await o.query(`INSERT INTO ${fe(e,t)} (${c}) VALUES (${p}) RETURNING *`,m),l++}catch(f){throw jt(f)||gt(f)||pe(f)?f:new d(500,{message:`Failed: ${f instanceof Error?f.message:String(f)}`})}}return{success:!0,message:`Bulk insert completed: ${l} records inserted`,successCount:l,failureCount:0}})}catch(o){throw o instanceof d||jt(o)||gt(o)||pe(o)?o:new d(500,{message:`Failed to bulk insert records into "${e}"`})}}async exportTableData({tableName:e,schemaName:t,db:n}){try{let a=await W(n),{rows:s}=await a.query(`SELECT * FROM ${fe(e,t)}`);if(s.length===0)throw new d(404,{message:`Table "${e}" does not exist or has no data`});return{cols:Object.keys(s[0]),rows:s}}catch(a){throw this.wrapError(a)}}async executeQuery({query:e,db:t}){let n=await W(t);if(!e?.trim())throw new d(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),s=performance.now(),o=await n.query(a),i=performance.now()-s;return{columns:o.fields.map(c=>c.name),rows:o.rows,rowCount:o.rows.length,duration:i,message:o.rows.length===0?"OK":void 0}}supportsDatabaseSize(e){let t=this.databaseSizeSupport.get(e);return t||(t=e.query(`SELECT to_regprocedure('pg_database_size(name)') IS NOT NULL AS "supported"`).then(({rows:n})=>n[0]?.supported===!0).catch(n=>{throw this.databaseSizeSupport.delete(e),n}),this.databaseSizeSupport.set(e,t)),t}async assertTableExists(e,t,n){let{rows:a}=await e.query(`SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1 AND table_schema = ${tt("$1","$2")}) as exists;`,[t,n??null]);if(!a[0]?.exists)throw new d(404,{message:`Table "${t}" does not exist`})}async listIndexes(e,t,n){await this.assertTableExists(e,t,n);let{rows:a}=await e.query(`SELECT
415
415
  ic.relname AS "indexName",
416
416
  n.nspname AS "schemaName",
417
417
  ARRAY(
@@ -433,7 +433,7 @@ ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
433
433
  JOIN pg_namespace n ON n.oid = ic.relnamespace
434
434
  JOIN pg_am am ON am.oid = ic.relam
435
435
  WHERE i.indrelid = $1::regclass
436
- ORDER BY i.indisprimary DESC, ic.relname`,[pe(t,n)]);return a}async getPrimaryKeyColumns(e,t){return(await e.query(`SELECT a.attname as column_name
436
+ ORDER BY i.indisprimary DESC, ic.relname`,[fe(t,n)]);return a}async getPrimaryKeyColumns(e,t){return(await e.query(`SELECT a.attname as column_name
437
437
  FROM pg_index i
438
438
  JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
439
439
  WHERE i.indrelid = $1::regclass AND i.indisprimary
@@ -442,8 +442,8 @@ ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
442
442
  FROM information_schema.table_constraints AS tc
443
443
  JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
444
444
  JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema
445
- WHERE tc.constraint_type = 'FOREIGN KEY' AND ccu.table_name = $1 AND ccu.table_schema = ${et("$1","$2")}`,[t,n??null]);return a.map(s=>({constraintName:s.constraint_name,referencingSchema:s.referencing_schema,referencingTable:s.referencing_table,referencingColumn:s.referencing_column,referencedTable:s.referenced_table,referencedColumn:s.referenced_column}))}async getRelatedRecordsForTable(e,t,n){let a=await this.getFkConstraints(e,t,n);if(a.length===0)return[];let s=[];for(let o of a){let{rows:i}=await e.query(`SELECT * FROM ${pe(o.referencingTable,o.referencingSchema)} LIMIT 100`);i.length>0&&s.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:i})}return s}async getRelatedRecords(e,t,n,a){let s=await this.getFkConstraints(e,t,n);if(s.length===0)return[];let o=[],i=a.map(l=>l.value),c=new Map;for(let l of s){let u=`${l.referencingSchema}.${l.referencingTable}.${l.referencingColumn}`,m=c.get(u)??[];m.push(l),c.set(u,m)}for(let[,l]of c){let u=l[0];if(!u||!a.find(b=>b.columnName===u.referencedColumn))continue;let p=i.map((b,T)=>`$${T+1}`).join(", "),{rows:f}=await e.query(`SELECT * FROM ${pe(u.referencingTable,u.referencingSchema)} WHERE "${u.referencingColumn}" IN (${p}) LIMIT 100`,i);f.length>0&&o.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:f})}return o}async getTableRowCount(e,t){let{rows:n}=await e.query(`SELECT COUNT(*) as count FROM ${t}`);return Number.parseInt(n[0]?.count??"0",10)}}});function vc(r){let e=[],t="",n=0,a=!1,s=!1;for(;n<r.length;){let o=r[n];if(a){o==="'"?a=!1:t+=o,n++;continue}if(s){if(o==="\\"&&n+1<r.length){t+=r[n+1],n+=2;continue}o==='"'?s=!1:t+=o,n++;continue}if(o==="'"){a=!0,n++;continue}if(o==='"'){s=!0,n++;continue}if(o===" "||o===" "||o===`
446
- `){t.length>0&&(e.push(t),t=""),n++;continue}t+=o,n++}if(a||s)throw new Error("Unterminated quoted string in command");return t.length>0&&e.push(t),e}function Uc(r,e){if(r.length===0)return Xt(e);let t=r[0]?.toUpperCase()??"",n=r[1]?.toUpperCase();if((t==="ZRANGE"||t==="ZREVRANGE"||t==="ZRANGEBYSCORE")&&r.some(s=>s.toUpperCase()==="WITHSCORES"))return _p(e);if(n){let s=`${t} ${n}`,o=Mc[s];if(o)return o(e)}let a=Mc[t];return a?a(e):typeof e=="string"||typeof e=="number"||e===null?Ae(e):Dp(e)?tt(e):Xt(e)}var Dp,kc,Xt,Ae,Lc,tt,Pc,_p,Op,$c,Mc,qc=R(()=>{"use strict";y();Dp=r=>Array.isArray(r)&&r.every(e=>typeof e=="string"||e===null),kc=r=>Array.isArray(r)&&r.length%2===0;Xt=r=>({columns:["result"],rows:[{result:typeof r=="string"?r:JSON.stringify(r,null,2)}],rowCount:1}),Ae=r=>r===null?{columns:["value"],rows:[{value:null}],rowCount:0}:{columns:["value"],rows:[{value:r}],rowCount:1},Lc=r=>({columns:["status"],rows:[{status:r}],rowCount:1}),tt=r=>Array.isArray(r)?{columns:["#","value"],rows:r.map((e,t)=>({"#":t,value:e})),rowCount:r.length}:Xt(r),Pc=r=>{if(!kc(r))return Xt(r);let e=[];for(let t=0;t<r.length;t+=2)e.push({field:r[t],value:r[t+1]});return{columns:["field","value"],rows:e,rowCount:e.length}},_p=r=>{if(!kc(r))return tt(r);let e=[];for(let t=0;t<r.length;t+=2)e.push({member:r[t],score:r[t+1]});return{columns:["member","score"],rows:e,rowCount:e.length}},Op=r=>{if(typeof r!="string")return Xt(r);let e=[],t="";for(let n of r.split(/\r?\n/)){if(!n.trim())continue;if(n.startsWith("#")){t=n.replace(/^#\s*/,"").trim();continue}let a=n.indexOf(":");a<0||e.push({section:t,key:n.slice(0,a),value:n.slice(a+1)})}return{columns:["section","key","value"],rows:e,rowCount:e.length}},$c=r=>{if(!Array.isArray(r))return Xt(r);let e=r.map(t=>{if(!Array.isArray(t)||t.length<2)return{id:null,fields:null};let[n,a]=t,s={};if(Array.isArray(a))for(let o=0;o<a.length;o+=2)s[String(a[o])]=a[o+1];return{id:n,fields:s}});return{columns:["id","fields"],rows:e,rowCount:e.length}},Mc={PING:Lc,GET:Ae,SET:Lc,TYPE:Ae,TTL:Ae,EXISTS:Ae,DBSIZE:Ae,DEL:Ae,INCR:Ae,DECR:Ae,STRLEN:Ae,LLEN:Ae,SCARD:Ae,ZCARD:Ae,HLEN:Ae,HGET:Ae,HMGET:tt,MGET:tt,KEYS:tt,LRANGE:tt,SMEMBERS:tt,HGETALL:Pc,HKEYS:tt,HVALS:tt,"CONFIG GET":Pc,ZRANGE:tt,INFO:Op,XRANGE:$c,XREVRANGE:$c}});import{createHash as Ip,randomBytes as xp}from"crypto";import{z as rt}from"zod";function Fc(r){let e={};for(let t of r.split(/\r?\n/)){if(!t||t.startsWith("#"))continue;let n=t.indexOf(":");n<0||(e[t.slice(0,n)]=t.slice(n+1))}return e}function Gp(r){let e=new Map;for(let t of r.split(/\r?\n/)){let n=t.match(/^db(\d+):keys=(\d+)/);n&&e.set(Number(n[1]),Number(n[2]))}return e}function Kc(r){let e=r.key;if(e==null||e==="")throw new d(400,{message:"Field 'key' is required"});return String(e)}function Is(r){let e=r.ttl;if(e==null||e==="")return null;let t=typeof e=="number"?e:Number.parseInt(String(e),10);return Number.isFinite(t)?t:null}function Nr(r){return typeof r=="string"?r:r==null?"":typeof r=="object"?JSON.stringify(r):String(r)}function Hc(r,e){if(typeof r=="string"){try{let t=JSON.parse(r);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{}throw new d(400,{message:`Value for ${e} must be a JSON object`})}if(r&&typeof r=="object"&&!Array.isArray(r))return r;throw new d(400,{message:`Value for ${e} must be a JSON object`})}function jc(r,e){if(Array.isArray(r))return r;if(typeof r=="string")try{let t=JSON.parse(r);if(Array.isArray(t))return t}catch{}throw new d(400,{message:`Value for ${e} must be a JSON array`})}function Qp(r){let e;if(Array.isArray(r))e=r;else if(typeof r=="string")try{e=JSON.parse(r)}catch{throw new d(400,{message:"Value for zset must be an array of {member, score} entries"})}else throw new d(400,{message:"Value for zset must be an array of {member, score} entries"});let t=[];for(let n of e){if(!n||typeof n!="object")throw new d(400,{message:"Each zset entry must be an object with 'member' and 'score'"});let a=n;if(a.member===void 0||a.score===void 0)throw new d(400,{message:"Each zset entry must include 'member' and 'score'"});let s=typeof a.score=="number"?a.score:Number(a.score);if(!Number.isFinite(s))throw new d(400,{message:`Invalid score: ${String(a.score)}`});t.push({member:String(a.member),score:s})}return t}function Jp(r){if(!r)return[];let e=[];for(let t=0;t<r.length;t+=2){let n=Number(r[t+1]);e.push({member:r[t],score:Number.isFinite(n)?n:0})}return e}function Xp(r){if(!Array.isArray(r))return{length:0,firstId:null,lastId:null};let e={};for(let o=0;o<r.length;o+=2)e[String(r[o])]=r[o+1];let t=typeof e.length=="number"?e.length:Number.parseInt(String(e.length??"0"),10)||0,n=e["first-entry"],a=e["last-entry"],s=o=>Array.isArray(o)&&typeof o[0]=="string"?o[0]:null;return{length:t,firstId:s(n),lastId:s(a)}}var On,Ds,An,Lp,Pp,$p,Mp,kp,vp,Up,qp,Bp,bt,Fp,De,Kp,Hp,Dn,jp,Ie,Wp,Cr,z,Rr,It,_n,_s,Me,Os,Vp,Yp,nt,Zt,en,Bc,zp,Ar,Wc=R(()=>{"use strict";y();Xe();Ze();mt();Q();qc();On=["strings","hashes","lists","sets","zsets","streams"],Ds={strings:"string",hashes:"hash",lists:"list",sets:"set",zsets:"zset",streams:"stream"},An="Schema is fixed for Redis tables; this operation is not supported",Lp="Sorting is not supported for Redis tables",Pp="Filtering is not supported for Redis tables",$p="Backward pagination is not supported for Redis tables (SCAN is forward-only)",Mp=10,kp=3e4,vp=1e4,Up=256*1024,qp=8*1024*1024,Bp=r=>On.includes(r),bt=r=>{if(!Bp(r))throw new d(404,{message:`Table "${r}" does not exist in Redis. Valid tables: ${On.join(", ")}`});return r},Fp=r=>/[\s"']/.test(r)||r===""?JSON.stringify(r):r,De=r=>{if(r==="")return _t();let e=Number.parseInt(r,10);if(!Number.isFinite(e)||e<0)throw new d(400,{message:`Invalid Redis database index: "${r}". Expected a non-negative integer.`});return e},Kp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Hp=r=>{try{return rt.object({scanCursor:rt.string().regex(/^\d+$/),search:rt.string().max(512).optional(),exactPattern:rt.boolean(),type:rt.enum(["string","hash","list","set","zset","stream"]).optional()}).parse(JSON.parse(Buffer.from(r,"base64url").toString("utf-8")))}catch{return null}},Dn=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),jp=r=>{try{return rt.object({key:rt.string().min(1).max(16*1024),type:rt.enum(["string","hash","list","set","zset","stream","unknown"]),cursor:rt.string().min(1).max(512),direction:rt.enum(["forward","backward"])}).parse(JSON.parse(Buffer.from(r,"base64url").toString("utf8")))}catch{return null}},Ie=r=>{let e=r.toString("utf8");return Buffer.from(e,"utf8").equals(r)?{base64:r.toString("base64url"),utf8:e}:{base64:r.toString("base64url")}},Wp=r=>r.replaceAll(/[\\*?[\]]/g,"\\$&"),Cr=r=>{let e=Buffer.isBuffer(r)?r.toString("utf8"):String(r);return["string","hash","list","set","zset","stream"].includes(e)?e:"unknown"},z=r=>Buffer.from(r,"base64url"),Rr=r=>r==="-"?Buffer.alloc(0):z(r),It=r=>Ip("sha256").update(r).digest("base64url"),_n=()=>new d(409,{message:"This key changed since it was loaded. Reload it or explicitly overwrite."}),_s=r=>{let e=r instanceof Error?r.message:String(r);return/(NOPERM|unknown command|not allowed|unsupported)/i.test(e)},Me=(r,e)=>{if(r!==e)throw new d(400,{message:`This operation requires a ${e} key, but the key is ${r}.`})},Os=r=>{if(r===null)throw _n();if(!Array.isArray(r))return;let e=r.find(t=>Array.isArray(t)&&t[0]instanceof Error);if(e)throw new d(400,{message:e[0].message})},Vp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Yp=r=>{try{return JSON.parse(Buffer.from(r,"base64url").toString("utf-8"))}catch{return null}},nt=r=>({columnName:r.columnName,dataType:r.dataType,dataTypeLabel:r.dataTypeLabel??(r.dataType==="number"?"int":r.dataType==="json"?"json":r.dataType==="array"?"array":"text"),isNullable:r.isNullable??!1,columnDefault:r.columnDefault??null,isPrimaryKey:r.isPrimaryKey??!1,isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}),Zt=nt({columnName:"key",dataType:"text",isPrimaryKey:!0}),en=nt({columnName:"ttl",dataType:"number",isNullable:!0}),Bc={strings:[Zt,nt({columnName:"value",dataType:"text",isNullable:!0}),en],hashes:[Zt,nt({columnName:"value",dataType:"json"}),en],lists:[Zt,nt({columnName:"value",dataType:"array"}),en],sets:[Zt,nt({columnName:"value",dataType:"array"}),en],zsets:[Zt,nt({columnName:"value",dataType:"json"}),en],streams:[Zt,nt({columnName:"length",dataType:"number"}),nt({columnName:"first-id",dataType:"text",isNullable:!0}),nt({columnName:"last-id",dataType:"text",isNullable:!0}),en]},zp={strings:`-- Redis string keys
445
+ WHERE tc.constraint_type = 'FOREIGN KEY' AND ccu.table_name = $1 AND ccu.table_schema = ${tt("$1","$2")}`,[t,n??null]);return a.map(s=>({constraintName:s.constraint_name,referencingSchema:s.referencing_schema,referencingTable:s.referencing_table,referencingColumn:s.referencing_column,referencedTable:s.referenced_table,referencedColumn:s.referenced_column}))}async getRelatedRecordsForTable(e,t,n){let a=await this.getFkConstraints(e,t,n);if(a.length===0)return[];let s=[];for(let o of a){let{rows:i}=await e.query(`SELECT * FROM ${fe(o.referencingTable,o.referencingSchema)} LIMIT 100`);i.length>0&&s.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:i})}return s}async getRelatedRecords(e,t,n,a){let s=await this.getFkConstraints(e,t,n);if(s.length===0)return[];let o=[],i=a.map(l=>l.value),c=new Map;for(let l of s){let u=`${l.referencingSchema}.${l.referencingTable}.${l.referencingColumn}`,m=c.get(u)??[];m.push(l),c.set(u,m)}for(let[,l]of c){let u=l[0];if(!u||!a.find(b=>b.columnName===u.referencedColumn))continue;let p=i.map((b,T)=>`$${T+1}`).join(", "),{rows:f}=await e.query(`SELECT * FROM ${fe(u.referencingTable,u.referencingSchema)} WHERE "${u.referencingColumn}" IN (${p}) LIMIT 100`,i);f.length>0&&o.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:f})}return o}async getTableRowCount(e,t){let{rows:n}=await e.query(`SELECT COUNT(*) as count FROM ${t}`);return Number.parseInt(n[0]?.count??"0",10)}}});function qc(r){let e=[],t="",n=0,a=!1,s=!1;for(;n<r.length;){let o=r[n];if(a){o==="'"?a=!1:t+=o,n++;continue}if(s){if(o==="\\"&&n+1<r.length){t+=r[n+1],n+=2;continue}o==='"'?s=!1:t+=o,n++;continue}if(o==="'"){a=!0,n++;continue}if(o==='"'){s=!0,n++;continue}if(o===" "||o===" "||o===`
446
+ `){t.length>0&&(e.push(t),t=""),n++;continue}t+=o,n++}if(a||s)throw new Error("Unterminated quoted string in command");return t.length>0&&e.push(t),e}function Bc(r,e){if(r.length===0)return en(e);let t=r[0]?.toUpperCase()??"",n=r[1]?.toUpperCase();if((t==="ZRANGE"||t==="ZREVRANGE"||t==="ZRANGEBYSCORE")&&r.some(s=>s.toUpperCase()==="WITHSCORES"))return xp(e);if(n){let s=`${t} ${n}`,o=vc[s];if(o)return o(e)}let a=vc[t];return a?a(e):typeof e=="string"||typeof e=="number"||e===null?De(e):Ip(e)?nt(e):en(e)}var Ip,Uc,en,De,$c,nt,Mc,xp,Lp,kc,vc,Fc=C(()=>{"use strict";y();Ip=r=>Array.isArray(r)&&r.every(e=>typeof e=="string"||e===null),Uc=r=>Array.isArray(r)&&r.length%2===0;en=r=>({columns:["result"],rows:[{result:typeof r=="string"?r:JSON.stringify(r,null,2)}],rowCount:1}),De=r=>r===null?{columns:["value"],rows:[{value:null}],rowCount:0}:{columns:["value"],rows:[{value:r}],rowCount:1},$c=r=>({columns:["status"],rows:[{status:r}],rowCount:1}),nt=r=>Array.isArray(r)?{columns:["#","value"],rows:r.map((e,t)=>({"#":t,value:e})),rowCount:r.length}:en(r),Mc=r=>{if(!Uc(r))return en(r);let e=[];for(let t=0;t<r.length;t+=2)e.push({field:r[t],value:r[t+1]});return{columns:["field","value"],rows:e,rowCount:e.length}},xp=r=>{if(!Uc(r))return nt(r);let e=[];for(let t=0;t<r.length;t+=2)e.push({member:r[t],score:r[t+1]});return{columns:["member","score"],rows:e,rowCount:e.length}},Lp=r=>{if(typeof r!="string")return en(r);let e=[],t="";for(let n of r.split(/\r?\n/)){if(!n.trim())continue;if(n.startsWith("#")){t=n.replace(/^#\s*/,"").trim();continue}let a=n.indexOf(":");a<0||e.push({section:t,key:n.slice(0,a),value:n.slice(a+1)})}return{columns:["section","key","value"],rows:e,rowCount:e.length}},kc=r=>{if(!Array.isArray(r))return en(r);let e=r.map(t=>{if(!Array.isArray(t)||t.length<2)return{id:null,fields:null};let[n,a]=t,s={};if(Array.isArray(a))for(let o=0;o<a.length;o+=2)s[String(a[o])]=a[o+1];return{id:n,fields:s}});return{columns:["id","fields"],rows:e,rowCount:e.length}},vc={PING:$c,GET:De,SET:$c,TYPE:De,TTL:De,EXISTS:De,DBSIZE:De,DEL:De,INCR:De,DECR:De,STRLEN:De,LLEN:De,SCARD:De,ZCARD:De,HLEN:De,HGET:De,HMGET:nt,MGET:nt,KEYS:nt,LRANGE:nt,SMEMBERS:nt,HGETALL:Mc,HKEYS:nt,HVALS:nt,"CONFIG GET":Mc,ZRANGE:nt,INFO:Lp,XRANGE:kc,XREVRANGE:kc}});import{createHash as Pp,randomBytes as $p}from"crypto";import{z as at}from"zod";function Hc(r){let e={};for(let t of r.split(/\r?\n/)){if(!t||t.startsWith("#"))continue;let n=t.indexOf(":");n<0||(e[t.slice(0,n)]=t.slice(n+1))}return e}function Xp(r){let e=new Map;for(let t of r.split(/\r?\n/)){let n=t.match(/^db(\d+):keys=(\d+)/);n&&e.set(Number(n[1]),Number(n[2]))}return e}function jc(r){let e=r.key;if(e==null||e==="")throw new d(400,{message:"Field 'key' is required"});return String(e)}function Ls(r){let e=r.ttl;if(e==null||e==="")return null;let t=typeof e=="number"?e:Number.parseInt(String(e),10);return Number.isFinite(t)?t:null}function Dr(r){return typeof r=="string"?r:r==null?"":typeof r=="object"?JSON.stringify(r):String(r)}function Wc(r,e){if(typeof r=="string"){try{let t=JSON.parse(r);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{}throw new d(400,{message:`Value for ${e} must be a JSON object`})}if(r&&typeof r=="object"&&!Array.isArray(r))return r;throw new d(400,{message:`Value for ${e} must be a JSON object`})}function Vc(r,e){if(Array.isArray(r))return r;if(typeof r=="string")try{let t=JSON.parse(r);if(Array.isArray(t))return t}catch{}throw new d(400,{message:`Value for ${e} must be a JSON array`})}function Zp(r){let e;if(Array.isArray(r))e=r;else if(typeof r=="string")try{e=JSON.parse(r)}catch{throw new d(400,{message:"Value for zset must be an array of {member, score} entries"})}else throw new d(400,{message:"Value for zset must be an array of {member, score} entries"});let t=[];for(let n of e){if(!n||typeof n!="object")throw new d(400,{message:"Each zset entry must be an object with 'member' and 'score'"});let a=n;if(a.member===void 0||a.score===void 0)throw new d(400,{message:"Each zset entry must include 'member' and 'score'"});let s=typeof a.score=="number"?a.score:Number(a.score);if(!Number.isFinite(s))throw new d(400,{message:`Invalid score: ${String(a.score)}`});t.push({member:String(a.member),score:s})}return t}function ef(r){if(!r)return[];let e=[];for(let t=0;t<r.length;t+=2){let n=Number(r[t+1]);e.push({member:r[t],score:Number.isFinite(n)?n:0})}return e}function tf(r){if(!Array.isArray(r))return{length:0,firstId:null,lastId:null};let e={};for(let o=0;o<r.length;o+=2)e[String(r[o])]=r[o+1];let t=typeof e.length=="number"?e.length:Number.parseInt(String(e.length??"0"),10)||0,n=e["first-entry"],a=e["last-entry"],s=o=>Array.isArray(o)&&typeof o[0]=="string"?o[0]:null;return{length:t,firstId:s(n),lastId:s(a)}}var xn,Os,_n,Mp,kp,vp,Up,qp,Bp,Fp,Kp,Hp,Et,jp,_e,Wp,Vp,On,Yp,xe,zp,Nr,z,Ar,xt,In,Is,ke,xs,Gp,Qp,rt,tn,nn,Kc,Jp,_r,Yc=C(()=>{"use strict";y();Ze();et();dt();Q();Fc();xn=["strings","hashes","lists","sets","zsets","streams"],Os={strings:"string",hashes:"hash",lists:"list",sets:"set",zsets:"zset",streams:"stream"},_n="Schema is fixed for Redis tables; this operation is not supported",Mp="Sorting is not supported for Redis tables",kp="Filtering is not supported for Redis tables",vp="Backward pagination is not supported for Redis tables (SCAN is forward-only)",Up=10,qp=3e4,Bp=1e4,Fp=256*1024,Kp=8*1024*1024,Hp=r=>xn.includes(r),Et=r=>{if(!Hp(r))throw new d(404,{message:`Table "${r}" does not exist in Redis. Valid tables: ${xn.join(", ")}`});return r},jp=r=>/[\s"']/.test(r)||r===""?JSON.stringify(r):r,_e=r=>{if(r==="")return Ot();let e=Number.parseInt(r,10);if(!Number.isFinite(e)||e<0)throw new d(400,{message:`Invalid Redis database index: "${r}". Expected a non-negative integer.`});return e},Wp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Vp=r=>{try{return at.object({scanCursor:at.string().regex(/^\d+$/),search:at.string().max(512).optional(),exactPattern:at.boolean(),type:at.enum(["string","hash","list","set","zset","stream"]).optional()}).parse(JSON.parse(Buffer.from(r,"base64url").toString("utf-8")))}catch{return null}},On=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Yp=r=>{try{return at.object({key:at.string().min(1).max(16*1024),type:at.enum(["string","hash","list","set","zset","stream","unknown"]),cursor:at.string().min(1).max(512),direction:at.enum(["forward","backward"])}).parse(JSON.parse(Buffer.from(r,"base64url").toString("utf8")))}catch{return null}},xe=r=>{let e=r.toString("utf8");return Buffer.from(e,"utf8").equals(r)?{base64:r.toString("base64url"),utf8:e}:{base64:r.toString("base64url")}},zp=r=>r.replaceAll(/[\\*?[\]]/g,"\\$&"),Nr=r=>{let e=Buffer.isBuffer(r)?r.toString("utf8"):String(r);return["string","hash","list","set","zset","stream"].includes(e)?e:"unknown"},z=r=>Buffer.from(r,"base64url"),Ar=r=>r==="-"?Buffer.alloc(0):z(r),xt=r=>Pp("sha256").update(r).digest("base64url"),In=()=>new d(409,{message:"This key changed since it was loaded. Reload it or explicitly overwrite."}),Is=r=>{let e=r instanceof Error?r.message:String(r);return/(NOPERM|unknown command|not allowed|unsupported)/i.test(e)},ke=(r,e)=>{if(r!==e)throw new d(400,{message:`This operation requires a ${e} key, but the key is ${r}.`})},xs=r=>{if(r===null)throw In();if(!Array.isArray(r))return;let e=r.find(t=>Array.isArray(t)&&t[0]instanceof Error);if(e)throw new d(400,{message:e[0].message})},Gp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Qp=r=>{try{return JSON.parse(Buffer.from(r,"base64url").toString("utf-8"))}catch{return null}},rt=r=>({columnName:r.columnName,dataType:r.dataType,dataTypeLabel:r.dataTypeLabel??(r.dataType==="number"?"int":r.dataType==="json"?"json":r.dataType==="array"?"array":"text"),isNullable:r.isNullable??!1,columnDefault:r.columnDefault??null,isPrimaryKey:r.isPrimaryKey??!1,isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}),tn=rt({columnName:"key",dataType:"text",isPrimaryKey:!0}),nn=rt({columnName:"ttl",dataType:"number",isNullable:!0}),Kc={strings:[tn,rt({columnName:"value",dataType:"text",isNullable:!0}),nn],hashes:[tn,rt({columnName:"value",dataType:"json"}),nn],lists:[tn,rt({columnName:"value",dataType:"array"}),nn],sets:[tn,rt({columnName:"value",dataType:"array"}),nn],zsets:[tn,rt({columnName:"value",dataType:"json"}),nn],streams:[tn,rt({columnName:"length",dataType:"number"}),rt({columnName:"first-id",dataType:"text",isNullable:!0}),rt({columnName:"last-id",dataType:"text",isNullable:!0}),nn]},Jp={strings:`-- Redis string keys
447
447
  -- Columns: key (text, PK), value (text), ttl (number, seconds; -1 = no TTL, -2 = missing)
448
448
  -- Backed by: GET / SET / EXPIRE`,hashes:`-- Redis hash keys
449
449
  -- Columns: key (text, PK), value (json: {field: value, ...}), ttl (number)
@@ -455,22 +455,22 @@ ${p}`}}return t},wp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
455
455
  -- Columns: key (text, PK), value (json: [{member, score}, ...]), ttl (number)
456
456
  -- Backed by: ZRANGE WITHSCORES / ZADD / EXPIRE`,streams:`-- Redis stream keys
457
457
  -- Columns: key (text, PK), length (number), first-id (text), last-id (text), ttl (number)
458
- -- Backed by: XINFO STREAM / XADD / EXPIRE (read-only \u2014 streams are append-only)`},Ar=class extends re{countCache=new WeakMap;runQuery(){throw new d(501,{message:"runQuery is not supported for Redis"})}buildTableDataQuery(e){throw new d(501,{message:"buildTableDataQuery is not supported for Redis"})}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){return{nextCursor:null,prevCursor:null}}quoteIdentifier(e){return e}mapToUniversalType(e){switch(e.toLowerCase()){case"string":return"text";case"hash":return"json";case"list":case"set":return"array";case"zset":case"stream":return"json";case"integer":case"number":case"ttl":return"number";default:return"text"}}mapFromUniversalType(e){return"string"}async scanKeys(e){try{let{db:t,limit:n,search:a,exactPattern:s,type:o,cursor:i}=e,c=De(t),l=await Re(c),u="0";if(i){let S=Hp(i);if(!S||S.search!==a||S.exactPattern!==s||S.type!==o)throw new d(400,{message:"Invalid or stale key scan cursor"});u=S.scanCursor}let m=a?s?a:`*${Wp(a)}*`:"*",p=[u,"MATCH",m,"COUNT",n];o&&p.push("TYPE",o);let[f,b]=await l.scanBuffer(...p),T=Buffer.isBuffer(f)?f.toString("utf8"):f,h=l.pipeline();for(let S of b)h.call("TYPE",S),h.pttl(S),h.call("MEMORY","USAGE",S);let w=await h.exec()??[];return{keys:b.map((S,A)=>{let N=A*3,C=w[N+2]?.[1];return{key:Ie(S),type:Cr(w[N]?.[1]),ttlMs:Number(w[N+1]?.[1]??-2),memoryBytes:C==null?null:Number(C)}}),nextCursor:T==="0"?null:Kp({scanCursor:T,search:a,exactPattern:s,type:o}),hasMore:T!=="0"}}catch(t){throw this.wrapError(t)}}async getKeyDetails(e){try{let{db:t,key:n,cursor:a,limit:s,full:o,direction:i}=e,c=Rr(n),l=await Re(De(t)),[u,m,p,f]=await Promise.all([l.callBuffer("TYPE",c),l.pttl(c),l.call("MEMORY","USAGE",c).catch(()=>null),l.callBuffer("DUMP",c)]),b=f;if(!b)throw new d(404,{message:"Redis key no longer exists"});let T=Cr(u),h={key:Ie(c),type:T,ttlMs:Number(m),memoryBytes:p===null?null:Number(p),revision:It(b)},w=a?jp(a):null;if(a&&(!w||w.key!==n||w.type!==T||w.direction!==i))throw new d(400,{message:"Invalid or stale key details cursor"});if(T==="string"){let S=await l.strlen(c),A=o?qp:Up,N=await l.getrangeBuffer(c,0,A-1);return{...h,length:S,value:{kind:"string",value:Ie(N),truncated:S>A},nextCursor:null,hasMore:!1}}if(T==="hash"){let[S,A]=await Promise.all([l.hlen(c),l.hscanBuffer(c,w?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N,D=[];for(let x=0;x<C.length;x+=2)D.push({field:Ie(C[x]),value:Ie(C[x+1])});return{...h,length:S,value:{kind:"hash",entries:D},nextCursor:_==="0"?null:Dn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="list"){let S=Number.parseInt(w?.cursor??"0",10),A=await l.llen(c),N=await l.lrangeBuffer(c,S,S+s-1),C=S+N.length,_=C<A;return{...h,length:A,value:{kind:"list",entries:N.map((D,x)=>({index:S+x,value:Ie(D)}))},nextCursor:_?Dn({key:n,type:T,cursor:String(C),direction:i}):null,hasMore:_}}if(T==="set"){let[S,A]=await Promise.all([l.scard(c),l.sscanBuffer(c,w?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N;return{...h,length:S,value:{kind:"set",members:C.map(Ie)},nextCursor:_==="0"?null:Dn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="zset"){let[S,A]=await Promise.all([l.zcard(c),l.zscanBuffer(c,w?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N,D=[];for(let x=0;x<C.length;x+=2)D.push({member:Ie(C[x]),score:(()=>{let H=C[x+1].toString("utf8");return H==="inf"?"inf":H==="-inf"?"-inf":Number(H)})()});return{...h,length:S,value:{kind:"zset",entries:D},nextCursor:_==="0"?null:Dn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="stream"){let S=w?.cursor??(i==="forward"?"-":"+"),[A,N]=await Promise.all([l.xlen(c),i==="forward"?l.xrangeBuffer(c,S,"+","COUNT",s+1):l.xrevrangeBuffer(c,S,"-","COUNT",s+1)]),C=N.length>s,D=N.slice(0,s).map(([H,$])=>{let J=[];for(let X=0;X<$.length;X+=2)J.push({field:Ie($[X]),value:Ie($[X+1])});return{id:H.toString("utf8"),fields:J}}),x=D.at(-1)?.id;return{...h,length:A,value:{kind:"stream",entries:D},nextCursor:C&&x?Dn({key:n,type:T,cursor:`(${x}`,direction:i}):null,hasMore:C}}return{...h,length:null,value:{kind:"unknown"},nextCursor:null,hasMore:!1}}catch(t){throw this.wrapError(t)}}async getStringChunk(e){try{let t=await Re(De(e.db)),n=Rr(e.key),a=Cr(await t.callBuffer("TYPE",n));if(a==="unknown")throw new d(404,{message:"Redis key no longer exists"});if(Me(a,"string"),e.expectedRevision){let c=await t.callBuffer("DUMP",n);if(!c||It(c)!==e.expectedRevision)throw _n()}let s=await t.strlen(n),o=await t.getrangeBuffer(n,e.offset,e.offset+e.limit-1),i=e.offset+o.length;return{chunk:Ie(o),length:s,nextOffset:i<s?i:null,hasMore:i<s}}catch(t){throw this.wrapError(t)}}async createKey(e){let t=null;try{t=await sr(De(e.db));let n=z(e.key.base64);if(await t.watch(n),await t.exists(n)!==0)throw new d(409,{message:"A Redis key with this name already exists."});if(e.type!==e.value.kind)throw new d(400,{message:"The initial value does not match the selected Redis key type."});let a=t.multi();switch(e.value.kind){case"string":a.set(n,z(e.value.value.base64));break;case"hash":a.hset(n,...e.value.entries.flatMap(({field:o,value:i})=>[z(o.base64),z(i.base64)]));break;case"list":a.rpush(n,...e.value.entries.map(o=>z(o.base64)));break;case"set":a.sadd(n,...e.value.members.map(o=>z(o.base64)));break;case"zset":a.zadd(n,...e.value.entries.flatMap(({member:o,score:i})=>[i,z(o.base64)]));break;case"stream":a.xadd(n,e.value.id,...e.value.fields.flatMap(({field:o,value:i})=>[z(o.base64),z(i.base64)]));break}e.ttlMs!==null&&a.pexpire(n,e.ttlMs),Os(await a.exec());let s=await t.callBuffer("DUMP",n);if(!s)throw _n();return{key:Ie(n),revision:It(s),deleted:!1}}catch(n){throw this.wrapError(n)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async applyKeyAction(e){let t=null;try{t=await sr(De(e.db));let n=Rr(e.key),a=e.operation.action==="rename"?z(e.operation.newKey.base64):null;a&&!a.equals(n)?await t.watch(n,a):await t.watch(n);let[s,o,i]=await Promise.all([t.callBuffer("DUMP",n),t.callBuffer("TYPE",n),t.pttl(n)]),c=s;if(!c)throw new d(404,{message:"Redis key no longer exists"});if(!e.force&&It(c)!==e.expectedRevision)throw _n();let l=Cr(o);if(a&&!a.equals(n)&&await t.exists(a)!==0)throw new d(409,{message:"A Redis key with the new name already exists."});let u=t.multi();switch(e.operation.action){case"rename":if(!a||a.equals(n))return{key:Ie(n),revision:It(c),deleted:!1};u.rename(n,a);break;case"setTtl":e.operation.ttlMs===null?u.persist(n):u.pexpire(n,e.operation.ttlMs);break;case"setString":Me(l,"string"),u.set(n,z(e.operation.value.base64)),i>0&&u.pexpire(n,i);break;case"upsertHash":Me(l,"hash"),u.hset(n,z(e.operation.field.base64),z(e.operation.value.base64));break;case"deleteHash":Me(l,"hash"),u.hdel(n,z(e.operation.field.base64));break;case"pushList":Me(l,"list"),e.operation.side==="left"?u.lpush(n,z(e.operation.value.base64)):u.rpush(n,z(e.operation.value.base64));break;case"setList":Me(l,"list"),u.lset(n,e.operation.index,z(e.operation.value.base64));break;case"deleteList":{Me(l,"list");let f=Buffer.concat([Buffer.from("db-studio:list-delete:"),xp(32)]);u.lset(n,e.operation.index,f),u.lrem(n,1,f);break}case"addSet":Me(l,"set"),u.sadd(n,z(e.operation.member.base64));break;case"removeSet":Me(l,"set"),u.srem(n,z(e.operation.member.base64));break;case"upsertZset":Me(l,"zset"),u.zadd(n,e.operation.score,z(e.operation.member.base64));break;case"removeZset":Me(l,"zset"),u.zrem(n,z(e.operation.member.base64));break;case"appendStream":Me(l,"stream"),u.xadd(n,e.operation.id,...e.operation.fields.flatMap(({field:f,value:b})=>[z(f.base64),z(b.base64)]));break;case"deleteStream":Me(l,"stream"),u.xdel(n,e.operation.id);break}Os(await u.exec());let m=a&&!a.equals(n)?a:n,p=await t.callBuffer("DUMP",m);return{key:Ie(m),revision:p?It(p):null,deleted:p===null}}catch(n){throw this.wrapError(n)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async deleteKey(e){let t=null;try{t=await sr(De(e.db));let n=Rr(e.key);await t.watch(n);let a=await t.callBuffer("DUMP",n);if(!a)throw new d(404,{message:"Redis key no longer exists"});if(!e.force&&It(a)!==e.expectedRevision)throw _n();let s=t.multi().del(n);return Os(await s.exec()),{deleted:!0}}catch(n){throw this.wrapError(n)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async getDatabasesList(){try{let e=await Re(_t()),t=1,n=!1,a=null;try{a=await e.call("CONFIG","GET","databases")}catch(c){if(!_s(c))throw c}if(Array.isArray(a)&&a.length>=2){let c=Number.parseInt(String(a[1]),10);Number.isFinite(c)&&c>0&&(t=c,n=!0)}let s="";try{s=await e.info("keyspace")}catch(c){if(!_s(c))throw c}let o=Gp(s);return(n?Array.from({length:t},(c,l)=>l):[_t()]).map(c=>({name:String(c),size:`${o.get(c)??0} keys`,owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:String(_t())}}async getDatabaseConnectionInfo(){try{let e=await Re(_t()),[t,n]=await Promise.all([e.info("server"),e.info("clients")]),a=Fc(t),s=Fc(n),o=Number.parseInt(s.maxclients??"0",10);if(!Number.isFinite(o)||o===0){let c=await e.call("CONFIG","GET","maxclients").catch(l=>{if(!_s(l))throw l;return null});Array.isArray(c)&&c.length>=2&&(o=Number.parseInt(String(c[1]),10)||0)}let i=e.options;return{host:i.host??null,port:i.port??null,user:i.username||"default",database:String(i.db??_t()),version:a.redis_version??"unknown",active_connections:Number.parseInt(s.connected_clients??"0",10)||0,max_connections:o||0}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=De(e),n=await this.getCachedCounts(t);return On.map(a=>({tableName:a,rowCount:n[a]}))}catch(t){throw this.wrapError(t)}}async createTable(){throw new d(400,{message:"Redis tables are fixed; cannot create new ones"})}async deleteTable(e){throw new d(400,{message:"Bulk deletion of Redis tables is not supported. Use FLUSHDB from the query runner to clear the entire logical database."})}async renameTable(e){throw new d(400,{message:An})}async getTableSchema({tableName:e}){let t=bt(e);return zp[t]}async getTableColumns({tableName:e}){let t=bt(e);return Bc[t]}async addColumn(e){throw new d(400,{message:An})}async deleteColumn(e){throw new d(400,{message:An})}async alterColumn(e){throw new d(400,{message:An})}async renameColumn(e){throw new d(400,{message:An})}async getTableData(e){try{let{tableName:t,db:n,cursor:a,limit:s=50,direction:o="asc",sort:i,filters:c}=e;if(o==="desc")throw new d(400,{message:$p});if(i&&i.length>0)throw new d(400,{message:Lp});if(c&&c.length>0)throw new d(400,{message:Pp});let l=bt(t),u=Ds[l],m=De(n),p=await Re(m),f="0";if(a){let D=Yp(a);if(!D||D.type!==l)throw new d(400,{message:"Invalid or mismatched cursor"});f=D.scanCursor}let b=[],T=0,h=!1;for(;b.length<s&&T<Mp;){let[D,x]=await p.scan(f,"MATCH","*","COUNT",Math.max(s*2,100),"TYPE",u);if(b.push(...x),f=D,T++,D==="0"){h=!0;break}}let w=b.slice(0,s),S=b.slice(s),A=await this.hydrateRows(p,l,w),N=await p.dbsize(),C=!h||S.length>0,_=C&&!h?Vp({scanCursor:f,type:l}):null;return{data:A,meta:{limit:s,total:N,hasNextPage:C,hasPreviousPage:!1,nextCursor:_,prevCursor:null}}}catch(t){throw this.wrapError(t)}}async hydrateRows(e,t,n){if(n.length===0)return[];let a=e.pipeline();for(let c of n)a.ttl(c);let s=await a.exec()??[],o=e.pipeline();for(let c of n)switch(t){case"strings":o.get(c);break;case"hashes":o.hgetall(c);break;case"lists":o.lrange(c,0,-1);break;case"sets":o.smembers(c);break;case"zsets":o.zrange(c,"0","-1","WITHSCORES");break;case"streams":o.xinfo("STREAM",c);break}let i=await o.exec()??[];return n.map((c,l)=>{let u=s[l]?.[1]??-2,m=i[l]?.[1];if(t==="streams"){let f=Xp(m);return this.normalizeRow({key:c,length:f.length,"first-id":f.firstId,"last-id":f.lastId,ttl:u})}let p;switch(t){case"strings":p=m??null;break;case"hashes":p=m;break;case"lists":case"sets":p=m;break;case"zsets":p=Jp(m);break}return this.normalizeRow({key:c,value:p,ttl:u})})}async getCachedCounts(e){let t=await Re(e),n=this.countCache.get(t);if(n&&Date.now()-n.timestamp<kp)return n.counts;let a={},s=t.pipeline();for(let i of On)s.scan("0","MATCH","*","COUNT",vp,"TYPE",Ds[i]);let o=await s.exec()??[];return On.forEach((i,c)=>{let l=o[c]?.[1];a[i]=l?.[1]?.length??0}),this.countCache.set(t,{timestamp:Date.now(),counts:a}),a}async addRecord({db:e,params:t}){try{let{tableName:n,data:a}=t,s=bt(n),o=Kc(a),i=Is(a),c=await Re(De(e));return await this.writeRecord(c,s,o,a.value,{mode:"create",ttl:i}),this.countCache.delete(c),{insertedCount:1}}catch(n){throw this.wrapError(n)}}async updateRecords({db:e,params:t}){try{let{tableName:n,updates:a,primaryKey:s,primaryKeys:o}=t,i=bt(n),c=o?.[0]||s||"key",l=await Re(De(e)),u=new Map;for(let p of a){let f=p.rowData[c];if(f==null)throw new d(400,{message:`Primary key "${c}" not found in row data`});let b=String(f),T=u.get(b)??{...p.rowData};T[p.columnName]=p.value,u.set(b,T)}let m=0;for(let[p,f]of u.entries()){let b=f.value,T=Is(f);await this.writeRecord(l,i,p,b,{mode:"update",ttl:T});let h=f[c],w=h==null?p:String(h);if(w!==p&&await l.renamenx(p,w)===0)throw new d(409,{message:`Key "${w}" already exists`});m++}return{updatedCount:m}}catch(n){throw this.wrapError(n)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:n,db:a}=e;bt(t);let s=await Re(De(a)),o=n.map(c=>String(c.value));if(o.length===0)return{deletedCount:0,fkViolation:!1,relatedRecords:[]};let i=await s.del(...o);return this.countCache.delete(s),{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(t){throw this.wrapError(t)}}async forceDeleteRecords(e){return{deletedCount:(await this.deleteRecords(e)).deletedCount}}async bulkInsertRecords(e){try{let{tableName:t,records:n,db:a}=e;if(!n||n.length===0)throw new d(400,{message:"At least one record is required"});let s=bt(t),o=await Re(De(a)),i=[],c=0;for(let l=0;l<n.length;l++){let u=n[l];try{let m=Kc(u),p=Is(u);await this.writeRecord(o,s,m,u.value,{mode:"create",ttl:p}),c++}catch(m){i.push({recordIndex:l,error:m instanceof Error?m.message:String(m)})}}return this.countCache.delete(o),{success:i.length===0,message:`Inserted ${c} of ${n.length} record${n.length===1?"":"s"}`,successCount:c,failureCount:i.length,...i.length>0?{errors:i}:{}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let n=bt(e),a=De(t),s=await Re(a),o=Ds[n],i=[],c="0";do{let[m,p]=await s.scan(c,"MATCH","*","COUNT",1e3,"TYPE",o);i.push(...p),c=m}while(c!=="0");if(i.length===0)throw new d(404,{message:`Table "${e}" has no data`});let l=await this.hydrateRows(s,n,i);return{cols:Bc[n].map(m=>m.columnName),rows:l}}catch(n){throw this.wrapError(n)}}async writeRecord(e,t,n,a,s){if(t==="streams"&&s.mode==="update")throw new d(400,{message:"Streams are append-only; updating a stream record is not supported"});if(s.mode==="create")if(t==="strings"){if(await e.set(n,typeof a=="string"?a:JSON.stringify(a),"NX")===null)throw new d(409,{message:`Key "${n}" already exists`})}else{if(await e.exists(n))throw new d(409,{message:`Key "${n}" already exists`});await this.writeCollectionValue(e,t,n,a)}else if(t==="strings"){if(await e.set(n,typeof a=="string"?a:JSON.stringify(a),"XX")===null)throw new d(404,{message:`Key "${n}" does not exist`})}else{if(!await e.exists(n))throw new d(404,{message:`Key "${n}" does not exist`});await e.del(n),await this.writeCollectionValue(e,t,n,a)}s.ttl!==null&&s.ttl>0&&await e.expire(n,s.ttl)}async writeCollectionValue(e,t,n,a){switch(t){case"hashes":{let s=Hc(a,"hash"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Nr(c));if(o.length===0)throw new d(400,{message:"Hash must have at least one field"});await e.hset(n,...o);return}case"lists":{let s=jc(a,"list");if(s.length===0)throw new d(400,{message:"List must have at least one element"});await e.rpush(n,...s.map(Nr));return}case"sets":{let s=jc(a,"set");if(s.length===0)throw new d(400,{message:"Set must have at least one member"});await e.sadd(n,...s.map(Nr));return}case"zsets":{let s=Qp(a);if(s.length===0)throw new d(400,{message:"Sorted set must have at least one member"});let o=[];for(let i of s)o.push(i.score,i.member);await e.zadd(n,...o);return}case"streams":{let s=Hc(a,"stream"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Nr(c));if(o.length===0)throw new d(400,{message:"Stream entry must have at least one field"});await e.xadd(n,"*",...o);return}}}async getServerLogs({db:e}){try{let t=await Re(De(e)),n=await t.call("SLOWLOG","GET","128"),a=await t.call("LATENCY","LATEST").catch(()=>[])??[],s=[...n.reverse().map(([o,i,c,l,u,m])=>({ts:new Date(Number(i)*1e3).toISOString(),level:"info",rawLevel:"slowlog",message:l.map(Fp).join(" "),durationMs:Number(c)/1e3,detail:he({id:o,client:u,client_name:m})})),...a.map(([o,i,c,l])=>({ts:new Date(Number(i)*1e3).toISOString(),level:"warning",rawLevel:"latency",source:o,message:`latency spike: ${o}`,durationMs:Number(c),detail:he({max_ms:l})}))];return{available:!0,source:"SLOWLOG GET + LATENCY LATEST",entries:Oe(s)}}catch(t){if(t instanceof Error&&t.message.startsWith("NOPERM"))return ne("Reading the slow log needs the +slowlog command, and +latency for latency spikes.");if(t instanceof Error&&t.message.startsWith("ERR unknown command"))return ne("This Redis server has SLOWLOG turned off.");throw this.wrapError(t)}}async executeQuery({query:e,db:t}){let n=performance.now();try{if(!e?.trim())throw new d(400,{message:"Query is required"});let a;try{a=vc(e.trim())}catch(u){throw new d(400,{message:u instanceof Error?u.message:"Invalid Redis command"})}if(a.length===0)throw new d(400,{message:"Empty command"});let s=await Re(De(t)),[o,...i]=a,c;try{c=await s.call(o,...i)}catch(u){let m=u instanceof Error?u.message:String(u);return{columns:["error"],rows:[{error:m}],rowCount:0,duration:performance.now()-n,error:m}}return{...Uc(a,c),duration:performance.now()-n,message:typeof c=="string"?c:void 0}}catch(a){throw this.wrapError(a)}}}});function xs(r){if(!r.length)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=In(n.columnName);switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${n.operator} ?`),t.push(n.value);break;case"is":n.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(n.value));break;case"is not":n.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(n.value));break;case"like":e.push(`CAST(${a} AS TEXT) LIKE ?`),t.push(n.value);break;case"not like":e.push(`CAST(${a} AS TEXT) NOT LIKE ?`),t.push(n.value);break;case"ilike":e.push(`CAST(${a} AS TEXT) LIKE ? COLLATE NOCASE`),t.push(n.value);break;case"not ilike":e.push(`CAST(${a} AS TEXT) NOT LIKE ? COLLATE NOCASE`),t.push(n.value);break;default:break}}return e.length?{clause:`WHERE ${e.join(" AND ")}`,values:t}:{clause:"",values:[]}}function Ls(r,e){return Array.isArray(r)?r.length?`ORDER BY ${r.map(t=>`${In(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:"":r&&typeof r=="string"?`ORDER BY ${In(r)} ${e?.toUpperCase()||"ASC"}`:""}function Ps(r,e,t){let{values:n,sortColumns:a}=r;if(!a.length)return{clause:"",values:[]};let c=t==="asc"===(e==="asc")?">":"<",l=a.map(In).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function xt(r,e){let t=e;for(;t<r.length;)if(/\s/.test(r[t]))t++;else if(r.startsWith("--",t)){let n=r.indexOf(`
459
- `,t);t=n===-1?r.length:n+1}else if(r.startsWith("/*",t)){let n=r.indexOf("*/",t+2);t=n===-1?r.length:n+2}else break;return t}function zc(r){let e=[],t=0,n=!1,a=xt(r,0);for(;a<r.length;){let s=r[a];if(s===";"){t===0&&(n=!0,e=[]),a=xt(r,a+1);continue}if(n)return!0;let o=Tt[s];if(o){let i=r.indexOf(o,a+1);a=i===-1?r.length:i+1}else if(/[A-Za-z_]/.test(s)){let i=/^[A-Za-z_][A-Za-z0-9_$]*/.exec(r.slice(a))?.[0]??s,c=i.toUpperCase();e[0]==="CREATE"&&(e[1]==="TRIGGER"||(e[1]==="TEMP"||e[1]==="TEMPORARY")&&e[2]==="TRIGGER")&&(c==="BEGIN"||t>0&&c==="CASE")?t++:t>0&&c==="END"&&t--,e.length<3&&e.push(c),a+=i.length}else a++;a=xt(r,a)}return!1}function Gc(r){return Zp.test(r.slice(xt(r,0)))}function Vc(r,e){let t=Tt[r[e]],n=e+1;for(;n<r.length;)if(r[n]!==t)n++;else if(t!=="]"&&r[n+1]===t)n+=2;else return n+1;return n}function Yc(r){let e=[],t=xt(r,0);for(;t<r.length;){let n=t;if(Tt[r[t]])t=Vc(r,t);else if(r[t]==="("){let s=0;do{if(Tt[r[t]]){t=Vc(r,t);continue}if(r.startsWith("--",t)||r.startsWith("/*",t)){t=xt(r,t);continue}r[t]==="("?s++:r[t]===")"&&s--,t++}while(s>0&&t<r.length)}else if(r[t]===","||r[t]===")")t++;else for(;t<r.length&&!/[\s,()'"`[]/.test(r[t]);)t++;let a=r.slice(n,t);e.push(/^[^,()'"`[]/.test(a)?{text:a,word:a.toUpperCase()}:{text:a}),t=xt(r,t)}return e}function rf(r){let e=[];return r.forEach((t,n)=>{t.word!==void 0&&Qc.has(t.word)&&!(r[n-1]?.word==="SET"&&(t.word==="NULL"||t.word==="DEFAULT"))&&!(t.word==="NOT"&&r[n+1]?.word==="DEFERRABLE")||e.length===0?e.push([t]):e[e.length-1].push(t)}),e}function Jc(r,e,t,n){let a=Yc(r),s=a.findIndex(u=>u.text.startsWith("("));if(a[0]?.word!=="CREATE"||a[1]?.word!=="TABLE"||s===-1)return null;let o=[[]];for(let u of Yc(a[s].text.slice(1,-1)))u.text===","?o.push([]):o[o.length-1].push(u);let i=0,c=o.map(u=>{let[m,...p]=u;if(!(m&&!(m.word&&tf.has(m.word)))||ef(m.text).toLowerCase()!==t.toLowerCase())return u.map(h=>h.text).join(" ");i++;let b=p.findIndex(h=>h.word&&Qc.has(h.word)),T=[];for(let h of rf(b===-1?[]:p.slice(b)))h[0].word&&nf.has(h[0].word)?T.at(-1)?.[0].word==="CONSTRAINT"&&T.pop():T.push(h);return[m.text,n.type,...T.flat().map(h=>h.text),...n.notNull?["NOT NULL"]:[],...n.defaultValue?[`DEFAULT ${n.defaultValue}`]:[]].join(" ")});if(i!==1)return null;let l=a.slice(s+1).map(u=>u.text);return[`CREATE TABLE ${In(e)} (${c.join(", ")})`,...l].join(" ")}var In,Tt,Zp,ef,tf,Qc,nf,Xc=R(()=>{"use strict";y();In=r=>`"${r.replaceAll('"','""')}"`;Tt={"'":"'",'"':'"',"`":"`","[":"]"};Zp=/^(begin|start\s+transaction|commit|end|rollback|savepoint|release)\b/i;ef=r=>Tt[r[0]]?r.slice(1,-1).replaceAll(`${Tt[r[0]]}${Tt[r[0]]}`,Tt[r[0]]):r,tf=new Set(["CONSTRAINT","PRIMARY","UNIQUE","CHECK","FOREIGN"]),Qc=new Set(["CONSTRAINT","PRIMARY","NOT","NULL","UNIQUE","CHECK","DEFAULT","COLLATE","REFERENCES","GENERATED","AS"]),nf=new Set(["NOT","NULL","DEFAULT"])});var af,sf,of,cf,Lt,lf,uf,mf,$s,G,Zc,Dr,el=R(()=>{"use strict";y();j();Xe();Ze();Q();Xc();af={"'":"'",'"':'"',"`":"`","[":"]"},sf=r=>{let e=[],t=0,n=-1;for(let a=0;a<r.length;a++){let s=r[a]??"",o=af[s];if(o){if(a=r.indexOf(o,a+1),a===-1)break}else if(s==="-"&&r[a+1]==="-"){if(a=r.indexOf(`
460
- `,a+2),a===-1)break}else if(s==="/"&&r[a+1]==="*"){let i=r.indexOf("*/",a+2);if(i===-1)break;a=i+1}else if(s==="(")t++===0&&(n=a+1);else if(s===")"&&--t===0){e.push(r.slice(n,a).trim());break}else s===","&&t===1&&(e.push(r.slice(n,a).trim()),n=a+1)}return e},of=r=>r.every(e=>e!==null),cf=r=>r==null?null:typeof r=="boolean"?r?1:0:typeof r=="string"||typeof r=="number"||typeof r=="bigint"?r:r instanceof Date?r.toISOString():JSON.stringify(r),Lt=(r,e=[])=>({sql:r,args:e.map(cf)}),lf=BigInt(Number.MIN_SAFE_INTEGER),uf=BigInt(Number.MAX_SAFE_INTEGER),mf=r=>typeof r=="bigint"?r>=lf&&r<=uf?Number(r):r.toString():r instanceof ArrayBuffer?Buffer.from(r):r,$s=({columns:r,rows:e})=>e.map(t=>Object.fromEntries(r.map((n,a)=>[n,mf(t[a])]))),G=async(r,e,t=[])=>$s(await r.execute(Lt(e,t))),Zc=r=>r instanceof Error&&r.message.includes("FOREIGN KEY constraint failed"),Dr=class extends re{schemaChange=Promise.resolve();serializeSchemaChange(e){let t=this.schemaChange.then(e);return this.schemaChange=t.catch(()=>{}),t}async runQuery(e,t,n){return await G(await V(),t,n)}quoteIdentifier(e){return`"${e.replaceAll('"','""')}"`}mapToUniversalType(e){return kn(e)}mapFromUniversalType(e){return{text:"TEXT",number:"INTEGER",boolean:"INTEGER",json:"TEXT",date:"TEXT",array:"TEXT",enum:"TEXT"}[e]??"TEXT"}buildTableDataQuery(e){let{tableName:t,cursor:n="",limit:a=50,direction:s="asc",sort:o=[],order:i="asc",filters:c=[]}=e,l=[],u=i;Array.isArray(o)&&o.length>0?(l=o.map(C=>C.columnName),u=o[0].direction):typeof o=="string"&&o&&(l=[o]),l.length||(l=["rowid"]);let{clause:m,values:p}=xs(c),f="",b=[];if(n){let C=this.decodeCursor(n);if(C){let _=Ps(C,s,u);f=_.clause,b=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let h=Ls((Array.isArray(o),o),i),w=h;s==="desc"?h?w=h.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):w=`ORDER BY ${l.map(C=>`${this.quoteIdentifier(C)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`:h||(w=`ORDER BY ${l.map(C=>`${this.quoteIdentifier(C)} ${u.toUpperCase()}`).join(", ")}`);let S=`SELECT * FROM ${this.quoteIdentifier(t)} ${T} ${w} LIMIT ?`,A=[...p,...b,a+1],N=`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${m}`;return{sql:S,values:A,countSql:N,countValues:p}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){if(!t.length)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:s=[],cursor:o}=e,i=[];Array.isArray(s)&&s.length>0?i=s.map(f=>f.columnName):typeof s=="string"&&s&&(i=[s]),i.length||(i=["rowid"]);let c=f=>{let b={values:Object.fromEntries(i.map(T=>[T,f[T]])),sortColumns:i};return this.encodeCursor(b)},l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(n&&(m=c(u)),o&&(p=c(l))):(o&&(m=c(u)),n&&(p=c(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){try{let{tableName:t,db:n,limit:a=50,direction:s="asc",sort:o=[],order:i="asc",cursor:c,filters:l=[]}=e,u=await V(),m=await G(u,`PRAGMA table_info(${this.quoteIdentifier(t)})`);if(m.length===0)throw new d(404,{message:`Table "${t}" does not exist`});let p=m.filter(B=>B.pk>0).sort((B,oe)=>B.pk-oe.pk).map(B=>B.name),f=[],b=i;Array.isArray(o)&&o.length>0?(f=o.map(B=>B.columnName),b=o[0].direction):typeof o=="string"&&o&&(f=[o]);let T=[...f,...p.filter(B=>!f.includes(B))],h=T.length===0;h&&T.push("rowid");let{clause:w,values:S}=xs(l),A="",N=[];if(c){let B=this.decodeCursor(c);if(B){let oe=Ps(B,s,b);A=oe.clause,N=oe.values}}let C="";w&&A?C=`WHERE ${w.replace(/^WHERE\s+/i,"")} AND ${A}`:w?C=w:A&&(C=`WHERE ${A}`);let _=Ls((Array.isArray(o),o),i),D=p.filter(B=>!f.includes(B)),x=_;if(s==="desc")if(_){if(x=_.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),D.length){let B=b==="asc"?"DESC":"ASC";x+=`, ${D.map(oe=>`${this.quoteIdentifier(oe)} ${B}`).join(", ")}`}}else x=`ORDER BY ${T.map(B=>`${this.quoteIdentifier(B)} ${b==="asc"?"DESC":"ASC"}`).join(", ")}`;else _?D.length&&(x+=`, ${D.map(B=>`${this.quoteIdentifier(B)} ${b.toUpperCase()}`).join(", ")}`):x=`ORDER BY ${T.map(B=>`${this.quoteIdentifier(B)} ${b.toUpperCase()}`).join(", ")}`;let[H]=await G(u,`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${w}`,S),$=Number(H?.total??0),X=await G(u,`SELECT ${h?"*, rowid":"*"} FROM ${this.quoteIdentifier(t)} ${C} ${x} LIMIT ?`,[...S,...N,a+1]),ee=X.length>a,P=ee?X.slice(0,a):X;s==="desc"&&(P=P.reverse());let ue=B=>({values:Object.fromEntries(T.map(oe=>[oe,B[oe]])),sortColumns:T}),st=null,ge=null;if(P.length>0){let B=P[0],oe=P[P.length-1];s==="asc"?(ee&&(st=this.encodeCursor(ue(oe))),c&&(ge=this.encodeCursor(ue(B)))):(c&&(st=this.encodeCursor(ue(oe))),ee&&(ge=this.encodeCursor(ue(B))))}return{data:h?P.map(({rowid:B,...oe})=>oe):P,meta:{limit:a,total:$,hasNextPage:s==="asc"?ee:!!c,hasPreviousPage:s==="asc"?!!c:ee,nextCursor:st,prevCursor:ge}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{let{name:e,size:t}=await(await V()).info();return[{name:e,size:t,owner:"",encoding:"UTF-8"}]}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){try{return{db:(await(await V()).info()).name}}catch(e){throw this.wrapError(e)}}async getDatabaseConnectionInfo(){try{let{name:e,version:t}=await(await V()).info();return{host:null,port:null,user:"",database:e,version:t,active_connections:1,max_connections:1}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=await V(),n=await G(t,`SELECT name FROM sqlite_master
458
+ -- Backed by: XINFO STREAM / XADD / EXPIRE (read-only \u2014 streams are append-only)`},_r=class extends re{countCache=new WeakMap;runQuery(){throw new d(501,{message:"runQuery is not supported for Redis"})}buildTableDataQuery(e){throw new d(501,{message:"buildTableDataQuery is not supported for Redis"})}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){return{nextCursor:null,prevCursor:null}}quoteIdentifier(e){return e}mapToUniversalType(e){switch(e.toLowerCase()){case"string":return"text";case"hash":return"json";case"list":case"set":return"array";case"zset":case"stream":return"json";case"integer":case"number":case"ttl":return"number";default:return"text"}}mapFromUniversalType(e){return"string"}async scanKeys(e){try{let{db:t,limit:n,search:a,exactPattern:s,type:o,cursor:i}=e,c=_e(t),l=await Ne(c),u="0";if(i){let S=Vp(i);if(!S||S.search!==a||S.exactPattern!==s||S.type!==o)throw new d(400,{message:"Invalid or stale key scan cursor"});u=S.scanCursor}let m=a?s?a:`*${zp(a)}*`:"*",p=[u,"MATCH",m,"COUNT",n];o&&p.push("TYPE",o);let[f,b]=await l.scanBuffer(...p),T=Buffer.isBuffer(f)?f.toString("utf8"):f,h=l.pipeline();for(let S of b)h.call("TYPE",S),h.pttl(S),h.call("MEMORY","USAGE",S);let w=await h.exec()??[];return{keys:b.map((S,A)=>{let N=A*3,R=w[N+2]?.[1];return{key:xe(S),type:Nr(w[N]?.[1]),ttlMs:Number(w[N+1]?.[1]??-2),memoryBytes:R==null?null:Number(R)}}),nextCursor:T==="0"?null:Wp({scanCursor:T,search:a,exactPattern:s,type:o}),hasMore:T!=="0"}}catch(t){throw this.wrapError(t)}}async getKeyDetails(e){try{let{db:t,key:n,cursor:a,limit:s,full:o,direction:i}=e,c=Ar(n),l=await Ne(_e(t)),[u,m,p,f]=await Promise.all([l.callBuffer("TYPE",c),l.pttl(c),l.call("MEMORY","USAGE",c).catch(()=>null),l.callBuffer("DUMP",c)]),b=f;if(!b)throw new d(404,{message:"Redis key no longer exists"});let T=Nr(u),h={key:xe(c),type:T,ttlMs:Number(m),memoryBytes:p===null?null:Number(p),revision:xt(b)},w=a?Yp(a):null;if(a&&(!w||w.key!==n||w.type!==T||w.direction!==i))throw new d(400,{message:"Invalid or stale key details cursor"});if(T==="string"){let S=await l.strlen(c),A=o?Kp:Fp,N=await l.getrangeBuffer(c,0,A-1);return{...h,length:S,value:{kind:"string",value:xe(N),truncated:S>A},nextCursor:null,hasMore:!1}}if(T==="hash"){let[S,A]=await Promise.all([l.hlen(c),l.hscanBuffer(c,w?.cursor??"0","COUNT",String(s))]),[N,R]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N,D=[];for(let x=0;x<R.length;x+=2)D.push({field:xe(R[x]),value:xe(R[x+1])});return{...h,length:S,value:{kind:"hash",entries:D},nextCursor:_==="0"?null:On({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="list"){let S=Number.parseInt(w?.cursor??"0",10),A=await l.llen(c),N=await l.lrangeBuffer(c,S,S+s-1),R=S+N.length,_=R<A;return{...h,length:A,value:{kind:"list",entries:N.map((D,x)=>({index:S+x,value:xe(D)}))},nextCursor:_?On({key:n,type:T,cursor:String(R),direction:i}):null,hasMore:_}}if(T==="set"){let[S,A]=await Promise.all([l.scard(c),l.sscanBuffer(c,w?.cursor??"0","COUNT",String(s))]),[N,R]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N;return{...h,length:S,value:{kind:"set",members:R.map(xe)},nextCursor:_==="0"?null:On({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="zset"){let[S,A]=await Promise.all([l.zcard(c),l.zscanBuffer(c,w?.cursor??"0","COUNT",String(s))]),[N,R]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N,D=[];for(let x=0;x<R.length;x+=2)D.push({member:xe(R[x]),score:(()=>{let H=R[x+1].toString("utf8");return H==="inf"?"inf":H==="-inf"?"-inf":Number(H)})()});return{...h,length:S,value:{kind:"zset",entries:D},nextCursor:_==="0"?null:On({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="stream"){let S=w?.cursor??(i==="forward"?"-":"+"),[A,N]=await Promise.all([l.xlen(c),i==="forward"?l.xrangeBuffer(c,S,"+","COUNT",s+1):l.xrevrangeBuffer(c,S,"-","COUNT",s+1)]),R=N.length>s,D=N.slice(0,s).map(([H,$])=>{let J=[];for(let X=0;X<$.length;X+=2)J.push({field:xe($[X]),value:xe($[X+1])});return{id:H.toString("utf8"),fields:J}}),x=D.at(-1)?.id;return{...h,length:A,value:{kind:"stream",entries:D},nextCursor:R&&x?On({key:n,type:T,cursor:`(${x}`,direction:i}):null,hasMore:R}}return{...h,length:null,value:{kind:"unknown"},nextCursor:null,hasMore:!1}}catch(t){throw this.wrapError(t)}}async getStringChunk(e){try{let t=await Ne(_e(e.db)),n=Ar(e.key),a=Nr(await t.callBuffer("TYPE",n));if(a==="unknown")throw new d(404,{message:"Redis key no longer exists"});if(ke(a,"string"),e.expectedRevision){let c=await t.callBuffer("DUMP",n);if(!c||xt(c)!==e.expectedRevision)throw In()}let s=await t.strlen(n),o=await t.getrangeBuffer(n,e.offset,e.offset+e.limit-1),i=e.offset+o.length;return{chunk:xe(o),length:s,nextOffset:i<s?i:null,hasMore:i<s}}catch(t){throw this.wrapError(t)}}async createKey(e){let t=null;try{t=await ir(_e(e.db));let n=z(e.key.base64);if(await t.watch(n),await t.exists(n)!==0)throw new d(409,{message:"A Redis key with this name already exists."});if(e.type!==e.value.kind)throw new d(400,{message:"The initial value does not match the selected Redis key type."});let a=t.multi();switch(e.value.kind){case"string":a.set(n,z(e.value.value.base64));break;case"hash":a.hset(n,...e.value.entries.flatMap(({field:o,value:i})=>[z(o.base64),z(i.base64)]));break;case"list":a.rpush(n,...e.value.entries.map(o=>z(o.base64)));break;case"set":a.sadd(n,...e.value.members.map(o=>z(o.base64)));break;case"zset":a.zadd(n,...e.value.entries.flatMap(({member:o,score:i})=>[i,z(o.base64)]));break;case"stream":a.xadd(n,e.value.id,...e.value.fields.flatMap(({field:o,value:i})=>[z(o.base64),z(i.base64)]));break}e.ttlMs!==null&&a.pexpire(n,e.ttlMs),xs(await a.exec());let s=await t.callBuffer("DUMP",n);if(!s)throw In();return{key:xe(n),revision:xt(s),deleted:!1}}catch(n){throw this.wrapError(n)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async applyKeyAction(e){let t=null;try{t=await ir(_e(e.db));let n=Ar(e.key),a=e.operation.action==="rename"?z(e.operation.newKey.base64):null;a&&!a.equals(n)?await t.watch(n,a):await t.watch(n);let[s,o,i]=await Promise.all([t.callBuffer("DUMP",n),t.callBuffer("TYPE",n),t.pttl(n)]),c=s;if(!c)throw new d(404,{message:"Redis key no longer exists"});if(!e.force&&xt(c)!==e.expectedRevision)throw In();let l=Nr(o);if(a&&!a.equals(n)&&await t.exists(a)!==0)throw new d(409,{message:"A Redis key with the new name already exists."});let u=t.multi();switch(e.operation.action){case"rename":if(!a||a.equals(n))return{key:xe(n),revision:xt(c),deleted:!1};u.rename(n,a);break;case"setTtl":e.operation.ttlMs===null?u.persist(n):u.pexpire(n,e.operation.ttlMs);break;case"setString":ke(l,"string"),u.set(n,z(e.operation.value.base64)),i>0&&u.pexpire(n,i);break;case"upsertHash":ke(l,"hash"),u.hset(n,z(e.operation.field.base64),z(e.operation.value.base64));break;case"deleteHash":ke(l,"hash"),u.hdel(n,z(e.operation.field.base64));break;case"pushList":ke(l,"list"),e.operation.side==="left"?u.lpush(n,z(e.operation.value.base64)):u.rpush(n,z(e.operation.value.base64));break;case"setList":ke(l,"list"),u.lset(n,e.operation.index,z(e.operation.value.base64));break;case"deleteList":{ke(l,"list");let f=Buffer.concat([Buffer.from("db-studio:list-delete:"),$p(32)]);u.lset(n,e.operation.index,f),u.lrem(n,1,f);break}case"addSet":ke(l,"set"),u.sadd(n,z(e.operation.member.base64));break;case"removeSet":ke(l,"set"),u.srem(n,z(e.operation.member.base64));break;case"upsertZset":ke(l,"zset"),u.zadd(n,e.operation.score,z(e.operation.member.base64));break;case"removeZset":ke(l,"zset"),u.zrem(n,z(e.operation.member.base64));break;case"appendStream":ke(l,"stream"),u.xadd(n,e.operation.id,...e.operation.fields.flatMap(({field:f,value:b})=>[z(f.base64),z(b.base64)]));break;case"deleteStream":ke(l,"stream"),u.xdel(n,e.operation.id);break}xs(await u.exec());let m=a&&!a.equals(n)?a:n,p=await t.callBuffer("DUMP",m);return{key:xe(m),revision:p?xt(p):null,deleted:p===null}}catch(n){throw this.wrapError(n)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async deleteKey(e){let t=null;try{t=await ir(_e(e.db));let n=Ar(e.key);await t.watch(n);let a=await t.callBuffer("DUMP",n);if(!a)throw new d(404,{message:"Redis key no longer exists"});if(!e.force&&xt(a)!==e.expectedRevision)throw In();let s=t.multi().del(n);return xs(await s.exec()),{deleted:!0}}catch(n){throw this.wrapError(n)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async getDatabasesList(){try{let e=await Ne(Ot()),t=1,n=!1,a=null;try{a=await e.call("CONFIG","GET","databases")}catch(c){if(!Is(c))throw c}if(Array.isArray(a)&&a.length>=2){let c=Number.parseInt(String(a[1]),10);Number.isFinite(c)&&c>0&&(t=c,n=!0)}let s="";try{s=await e.info("keyspace")}catch(c){if(!Is(c))throw c}let o=Xp(s);return(n?Array.from({length:t},(c,l)=>l):[Ot()]).map(c=>({name:String(c),size:`${o.get(c)??0} keys`,owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:String(Ot())}}async getDatabaseConnectionInfo(){try{let e=await Ne(Ot()),[t,n]=await Promise.all([e.info("server"),e.info("clients")]),a=Hc(t),s=Hc(n),o=Number.parseInt(s.maxclients??"0",10);if(!Number.isFinite(o)||o===0){let c=await e.call("CONFIG","GET","maxclients").catch(l=>{if(!Is(l))throw l;return null});Array.isArray(c)&&c.length>=2&&(o=Number.parseInt(String(c[1]),10)||0)}let i=e.options;return{host:i.host??null,port:i.port??null,user:i.username||"default",database:String(i.db??Ot()),version:a.redis_version??"unknown",active_connections:Number.parseInt(s.connected_clients??"0",10)||0,max_connections:o||0}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=_e(e),n=await this.getCachedCounts(t);return xn.map(a=>({tableName:a,rowCount:n[a]}))}catch(t){throw this.wrapError(t)}}async createTable(){throw new d(400,{message:"Redis tables are fixed; cannot create new ones"})}async deleteTable(e){throw new d(400,{message:"Bulk deletion of Redis tables is not supported. Use FLUSHDB from the query runner to clear the entire logical database."})}async renameTable(e){throw new d(400,{message:_n})}async getTableSchema({tableName:e}){let t=Et(e);return Jp[t]}async getTableColumns({tableName:e}){let t=Et(e);return Kc[t]}async addColumn(e){throw new d(400,{message:_n})}async deleteColumn(e){throw new d(400,{message:_n})}async alterColumn(e){throw new d(400,{message:_n})}async renameColumn(e){throw new d(400,{message:_n})}async getTableData(e){try{let{tableName:t,db:n,cursor:a,limit:s=50,direction:o="asc",sort:i,filters:c}=e;if(o==="desc")throw new d(400,{message:vp});if(i&&i.length>0)throw new d(400,{message:Mp});if(c&&c.length>0)throw new d(400,{message:kp});let l=Et(t),u=Os[l],m=_e(n),p=await Ne(m),f="0";if(a){let D=Qp(a);if(!D||D.type!==l)throw new d(400,{message:"Invalid or mismatched cursor"});f=D.scanCursor}let b=[],T=0,h=!1;for(;b.length<s&&T<Up;){let[D,x]=await p.scan(f,"MATCH","*","COUNT",Math.max(s*2,100),"TYPE",u);if(b.push(...x),f=D,T++,D==="0"){h=!0;break}}let w=b.slice(0,s),S=b.slice(s),A=await this.hydrateRows(p,l,w),N=await p.dbsize(),R=!h||S.length>0,_=R&&!h?Gp({scanCursor:f,type:l}):null;return{data:A,meta:{limit:s,total:N,hasNextPage:R,hasPreviousPage:!1,nextCursor:_,prevCursor:null}}}catch(t){throw this.wrapError(t)}}async hydrateRows(e,t,n){if(n.length===0)return[];let a=e.pipeline();for(let c of n)a.ttl(c);let s=await a.exec()??[],o=e.pipeline();for(let c of n)switch(t){case"strings":o.get(c);break;case"hashes":o.hgetall(c);break;case"lists":o.lrange(c,0,-1);break;case"sets":o.smembers(c);break;case"zsets":o.zrange(c,"0","-1","WITHSCORES");break;case"streams":o.xinfo("STREAM",c);break}let i=await o.exec()??[];return n.map((c,l)=>{let u=s[l]?.[1]??-2,m=i[l]?.[1];if(t==="streams"){let f=tf(m);return this.normalizeRow({key:c,length:f.length,"first-id":f.firstId,"last-id":f.lastId,ttl:u})}let p;switch(t){case"strings":p=m??null;break;case"hashes":p=m;break;case"lists":case"sets":p=m;break;case"zsets":p=ef(m);break}return this.normalizeRow({key:c,value:p,ttl:u})})}async getCachedCounts(e){let t=await Ne(e),n=this.countCache.get(t);if(n&&Date.now()-n.timestamp<qp)return n.counts;let a={},s=t.pipeline();for(let i of xn)s.scan("0","MATCH","*","COUNT",Bp,"TYPE",Os[i]);let o=await s.exec()??[];return xn.forEach((i,c)=>{let l=o[c]?.[1];a[i]=l?.[1]?.length??0}),this.countCache.set(t,{timestamp:Date.now(),counts:a}),a}async addRecord({db:e,params:t}){try{let{tableName:n,data:a}=t,s=Et(n),o=jc(a),i=Ls(a),c=await Ne(_e(e));return await this.writeRecord(c,s,o,a.value,{mode:"create",ttl:i}),this.countCache.delete(c),{insertedCount:1}}catch(n){throw this.wrapError(n)}}async updateRecords({db:e,params:t}){try{let{tableName:n,updates:a,primaryKey:s,primaryKeys:o}=t,i=Et(n),c=o?.[0]||s||"key",l=await Ne(_e(e)),u=new Map;for(let p of a){let f=p.rowData[c];if(f==null)throw new d(400,{message:`Primary key "${c}" not found in row data`});let b=String(f),T=u.get(b)??{...p.rowData};T[p.columnName]=p.value,u.set(b,T)}let m=0;for(let[p,f]of u.entries()){let b=f.value,T=Ls(f);await this.writeRecord(l,i,p,b,{mode:"update",ttl:T});let h=f[c],w=h==null?p:String(h);if(w!==p&&await l.renamenx(p,w)===0)throw new d(409,{message:`Key "${w}" already exists`});m++}return{updatedCount:m}}catch(n){throw this.wrapError(n)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:n,db:a}=e;Et(t);let s=await Ne(_e(a)),o=n.map(c=>String(c.value));if(o.length===0)return{deletedCount:0,fkViolation:!1,relatedRecords:[]};let i=await s.del(...o);return this.countCache.delete(s),{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(t){throw this.wrapError(t)}}async forceDeleteRecords(e){return{deletedCount:(await this.deleteRecords(e)).deletedCount}}async bulkInsertRecords(e){try{let{tableName:t,records:n,db:a}=e;if(!n||n.length===0)throw new d(400,{message:"At least one record is required"});let s=Et(t),o=await Ne(_e(a)),i=[],c=0;for(let l=0;l<n.length;l++){let u=n[l];try{let m=jc(u),p=Ls(u);await this.writeRecord(o,s,m,u.value,{mode:"create",ttl:p}),c++}catch(m){i.push({recordIndex:l,error:m instanceof Error?m.message:String(m)})}}return this.countCache.delete(o),{success:i.length===0,message:`Inserted ${c} of ${n.length} record${n.length===1?"":"s"}`,successCount:c,failureCount:i.length,...i.length>0?{errors:i}:{}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let n=Et(e),a=_e(t),s=await Ne(a),o=Os[n],i=[],c="0";do{let[m,p]=await s.scan(c,"MATCH","*","COUNT",1e3,"TYPE",o);i.push(...p),c=m}while(c!=="0");if(i.length===0)throw new d(404,{message:`Table "${e}" has no data`});let l=await this.hydrateRows(s,n,i);return{cols:Kc[n].map(m=>m.columnName),rows:l}}catch(n){throw this.wrapError(n)}}async writeRecord(e,t,n,a,s){if(t==="streams"&&s.mode==="update")throw new d(400,{message:"Streams are append-only; updating a stream record is not supported"});if(s.mode==="create")if(t==="strings"){if(await e.set(n,typeof a=="string"?a:JSON.stringify(a),"NX")===null)throw new d(409,{message:`Key "${n}" already exists`})}else{if(await e.exists(n))throw new d(409,{message:`Key "${n}" already exists`});await this.writeCollectionValue(e,t,n,a)}else if(t==="strings"){if(await e.set(n,typeof a=="string"?a:JSON.stringify(a),"XX")===null)throw new d(404,{message:`Key "${n}" does not exist`})}else{if(!await e.exists(n))throw new d(404,{message:`Key "${n}" does not exist`});await e.del(n),await this.writeCollectionValue(e,t,n,a)}s.ttl!==null&&s.ttl>0&&await e.expire(n,s.ttl)}async writeCollectionValue(e,t,n,a){switch(t){case"hashes":{let s=Wc(a,"hash"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Dr(c));if(o.length===0)throw new d(400,{message:"Hash must have at least one field"});await e.hset(n,...o);return}case"lists":{let s=Vc(a,"list");if(s.length===0)throw new d(400,{message:"List must have at least one element"});await e.rpush(n,...s.map(Dr));return}case"sets":{let s=Vc(a,"set");if(s.length===0)throw new d(400,{message:"Set must have at least one member"});await e.sadd(n,...s.map(Dr));return}case"zsets":{let s=Zp(a);if(s.length===0)throw new d(400,{message:"Sorted set must have at least one member"});let o=[];for(let i of s)o.push(i.score,i.member);await e.zadd(n,...o);return}case"streams":{let s=Wc(a,"stream"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Dr(c));if(o.length===0)throw new d(400,{message:"Stream entry must have at least one field"});await e.xadd(n,"*",...o);return}}}async getServerLogs({db:e}){try{let t=await Ne(_e(e)),n=await t.call("SLOWLOG","GET","128"),a=await t.call("LATENCY","LATEST").catch(()=>[])??[],s=[...n.reverse().map(([o,i,c,l,u,m])=>({ts:new Date(Number(i)*1e3).toISOString(),level:"info",rawLevel:"slowlog",message:l.map(jp).join(" "),durationMs:Number(c)/1e3,detail:ge({id:o,client:u,client_name:m})})),...a.map(([o,i,c,l])=>({ts:new Date(Number(i)*1e3).toISOString(),level:"warning",rawLevel:"latency",source:o,message:`latency spike: ${o}`,durationMs:Number(c),detail:ge({max_ms:l})}))];return{available:!0,source:"SLOWLOG GET + LATENCY LATEST",entries:Ie(s)}}catch(t){if(t instanceof Error&&t.message.startsWith("NOPERM"))return ne("Reading the slow log needs the +slowlog command, and +latency for latency spikes.");if(t instanceof Error&&t.message.startsWith("ERR unknown command"))return ne("This Redis server has SLOWLOG turned off.");throw this.wrapError(t)}}async executeQuery({query:e,db:t}){let n=performance.now();try{if(!e?.trim())throw new d(400,{message:"Query is required"});let a;try{a=qc(e.trim())}catch(u){throw new d(400,{message:u instanceof Error?u.message:"Invalid Redis command"})}if(a.length===0)throw new d(400,{message:"Empty command"});let s=await Ne(_e(t)),[o,...i]=a,c;try{c=await s.call(o,...i)}catch(u){let m=u instanceof Error?u.message:String(u);return{columns:["error"],rows:[{error:m}],rowCount:0,duration:performance.now()-n,error:m}}return{...Bc(a,c),duration:performance.now()-n,message:typeof c=="string"?c:void 0}}catch(a){throw this.wrapError(a)}}}});function Ps(r){if(!r.length)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=Ln(n.columnName);switch(n.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${n.operator} ?`),t.push(n.value);break;case"is":n.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(n.value));break;case"is not":n.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(n.value));break;case"like":e.push(`CAST(${a} AS TEXT) LIKE ?`),t.push(n.value);break;case"not like":e.push(`CAST(${a} AS TEXT) NOT LIKE ?`),t.push(n.value);break;case"ilike":e.push(`CAST(${a} AS TEXT) LIKE ? COLLATE NOCASE`),t.push(n.value);break;case"not ilike":e.push(`CAST(${a} AS TEXT) NOT LIKE ? COLLATE NOCASE`),t.push(n.value);break;default:break}}return e.length?{clause:`WHERE ${e.join(" AND ")}`,values:t}:{clause:"",values:[]}}function $s(r,e){return Array.isArray(r)?r.length?`ORDER BY ${r.map(t=>`${Ln(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:"":r&&typeof r=="string"?`ORDER BY ${Ln(r)} ${e?.toUpperCase()||"ASC"}`:""}function Ms(r,e,t){let{values:n,sortColumns:a}=r;if(!a.length)return{clause:"",values:[]};let c=t==="asc"===(e==="asc")?">":"<",l=a.map(Ln).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function Lt(r,e){let t=e;for(;t<r.length;)if(/\s/.test(r[t]))t++;else if(r.startsWith("--",t)){let n=r.indexOf(`
459
+ `,t);t=n===-1?r.length:n+1}else if(r.startsWith("/*",t)){let n=r.indexOf("*/",t+2);t=n===-1?r.length:n+2}else break;return t}function Qc(r){let e=[],t=0,n=!1,a=Lt(r,0);for(;a<r.length;){let s=r[a];if(s===";"){t===0&&(n=!0,e=[]),a=Lt(r,a+1);continue}if(n)return!0;let o=wt[s];if(o){let i=r.indexOf(o,a+1);a=i===-1?r.length:i+1}else if(/[A-Za-z_]/.test(s)){let i=/^[A-Za-z_][A-Za-z0-9_$]*/.exec(r.slice(a))?.[0]??s,c=i.toUpperCase();e[0]==="CREATE"&&(e[1]==="TRIGGER"||(e[1]==="TEMP"||e[1]==="TEMPORARY")&&e[2]==="TRIGGER")&&(c==="BEGIN"||t>0&&c==="CASE")?t++:t>0&&c==="END"&&t--,e.length<3&&e.push(c),a+=i.length}else a++;a=Lt(r,a)}return!1}function Jc(r){return nf.test(r.slice(Lt(r,0)))}function zc(r,e){let t=wt[r[e]],n=e+1;for(;n<r.length;)if(r[n]!==t)n++;else if(t!=="]"&&r[n+1]===t)n+=2;else return n+1;return n}function Gc(r){let e=[],t=Lt(r,0);for(;t<r.length;){let n=t;if(wt[r[t]])t=zc(r,t);else if(r[t]==="("){let s=0;do{if(wt[r[t]]){t=zc(r,t);continue}if(r.startsWith("--",t)||r.startsWith("/*",t)){t=Lt(r,t);continue}r[t]==="("?s++:r[t]===")"&&s--,t++}while(s>0&&t<r.length)}else if(r[t]===","||r[t]===")")t++;else for(;t<r.length&&!/[\s,()'"`[]/.test(r[t]);)t++;let a=r.slice(n,t);e.push(/^[^,()'"`[]/.test(a)?{text:a,word:a.toUpperCase()}:{text:a}),t=Lt(r,t)}return e}function of(r){let e=[];return r.forEach((t,n)=>{t.word!==void 0&&Xc.has(t.word)&&!(r[n-1]?.word==="SET"&&(t.word==="NULL"||t.word==="DEFAULT"))&&!(t.word==="NOT"&&r[n+1]?.word==="DEFERRABLE")||e.length===0?e.push([t]):e[e.length-1].push(t)}),e}function Zc(r,e,t,n){let a=Gc(r),s=a.findIndex(u=>u.text.startsWith("("));if(a[0]?.word!=="CREATE"||a[1]?.word!=="TABLE"||s===-1)return null;let o=[[]];for(let u of Gc(a[s].text.slice(1,-1)))u.text===","?o.push([]):o[o.length-1].push(u);let i=0,c=o.map(u=>{let[m,...p]=u;if(!(m&&!(m.word&&af.has(m.word)))||rf(m.text).toLowerCase()!==t.toLowerCase())return u.map(h=>h.text).join(" ");i++;let b=p.findIndex(h=>h.word&&Xc.has(h.word)),T=[];for(let h of of(b===-1?[]:p.slice(b)))h[0].word&&sf.has(h[0].word)?T.at(-1)?.[0].word==="CONSTRAINT"&&T.pop():T.push(h);return[m.text,n.type,...T.flat().map(h=>h.text),...n.notNull?["NOT NULL"]:[],...n.defaultValue?[`DEFAULT ${n.defaultValue}`]:[]].join(" ")});if(i!==1)return null;let l=a.slice(s+1).map(u=>u.text);return[`CREATE TABLE ${Ln(e)} (${c.join(", ")})`,...l].join(" ")}var Ln,wt,nf,rf,af,Xc,sf,el=C(()=>{"use strict";y();Ln=r=>`"${r.replaceAll('"','""')}"`;wt={"'":"'",'"':'"',"`":"`","[":"]"};nf=/^(begin|start\s+transaction|commit|end|rollback|savepoint|release)\b/i;rf=r=>wt[r[0]]?r.slice(1,-1).replaceAll(`${wt[r[0]]}${wt[r[0]]}`,wt[r[0]]):r,af=new Set(["CONSTRAINT","PRIMARY","UNIQUE","CHECK","FOREIGN"]),Xc=new Set(["CONSTRAINT","PRIMARY","NOT","NULL","UNIQUE","CHECK","DEFAULT","COLLATE","REFERENCES","GENERATED","AS"]),sf=new Set(["NOT","NULL","DEFAULT"])});var cf,lf,uf,mf,Pt,df,pf,ff,ks,G,tl,Or,nl=C(()=>{"use strict";y();j();Ze();et();Q();el();cf={"'":"'",'"':'"',"`":"`","[":"]"},lf=r=>{let e=[],t=0,n=-1;for(let a=0;a<r.length;a++){let s=r[a]??"",o=cf[s];if(o){if(a=r.indexOf(o,a+1),a===-1)break}else if(s==="-"&&r[a+1]==="-"){if(a=r.indexOf(`
460
+ `,a+2),a===-1)break}else if(s==="/"&&r[a+1]==="*"){let i=r.indexOf("*/",a+2);if(i===-1)break;a=i+1}else if(s==="(")t++===0&&(n=a+1);else if(s===")"&&--t===0){e.push(r.slice(n,a).trim());break}else s===","&&t===1&&(e.push(r.slice(n,a).trim()),n=a+1)}return e},uf=r=>r.every(e=>e!==null),mf=r=>r==null?null:typeof r=="boolean"?r?1:0:typeof r=="string"||typeof r=="number"||typeof r=="bigint"?r:r instanceof Date?r.toISOString():JSON.stringify(r),Pt=(r,e=[])=>({sql:r,args:e.map(mf)}),df=BigInt(Number.MIN_SAFE_INTEGER),pf=BigInt(Number.MAX_SAFE_INTEGER),ff=r=>typeof r=="bigint"?r>=df&&r<=pf?Number(r):r.toString():r instanceof ArrayBuffer?Buffer.from(r):r,ks=({columns:r,rows:e})=>e.map(t=>Object.fromEntries(r.map((n,a)=>[n,ff(t[a])]))),G=async(r,e,t=[])=>ks(await r.execute(Pt(e,t))),tl=r=>r instanceof Error&&r.message.includes("FOREIGN KEY constraint failed"),Or=class extends re{schemaChange=Promise.resolve();serializeSchemaChange(e){let t=this.schemaChange.then(e);return this.schemaChange=t.catch(()=>{}),t}async runQuery(e,t,n){return await G(await V(),t,n)}quoteIdentifier(e){return`"${e.replaceAll('"','""')}"`}mapToUniversalType(e){return Un(e)}mapFromUniversalType(e){return{text:"TEXT",number:"INTEGER",boolean:"INTEGER",json:"TEXT",date:"TEXT",array:"TEXT",enum:"TEXT"}[e]??"TEXT"}buildTableDataQuery(e){let{tableName:t,cursor:n="",limit:a=50,direction:s="asc",sort:o=[],order:i="asc",filters:c=[]}=e,l=[],u=i;Array.isArray(o)&&o.length>0?(l=o.map(R=>R.columnName),u=o[0].direction):typeof o=="string"&&o&&(l=[o]),l.length||(l=["rowid"]);let{clause:m,values:p}=Ps(c),f="",b=[];if(n){let R=this.decodeCursor(n);if(R){let _=Ms(R,s,u);f=_.clause,b=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let h=$s((Array.isArray(o),o),i),w=h;s==="desc"?h?w=h.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):w=`ORDER BY ${l.map(R=>`${this.quoteIdentifier(R)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`:h||(w=`ORDER BY ${l.map(R=>`${this.quoteIdentifier(R)} ${u.toUpperCase()}`).join(", ")}`);let S=`SELECT * FROM ${this.quoteIdentifier(t)} ${T} ${w} LIMIT ?`,A=[...p,...b,a+1],N=`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${m}`;return{sql:S,values:A,countSql:N,countValues:p}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,n){if(!t.length)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:s=[],cursor:o}=e,i=[];Array.isArray(s)&&s.length>0?i=s.map(f=>f.columnName):typeof s=="string"&&s&&(i=[s]),i.length||(i=["rowid"]);let c=f=>{let b={values:Object.fromEntries(i.map(T=>[T,f[T]])),sortColumns:i};return this.encodeCursor(b)},l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(n&&(m=c(u)),o&&(p=c(l))):(o&&(m=c(u)),n&&(p=c(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){try{let{tableName:t,db:n,limit:a=50,direction:s="asc",sort:o=[],order:i="asc",cursor:c,filters:l=[]}=e,u=await V(),m=await G(u,`PRAGMA table_info(${this.quoteIdentifier(t)})`);if(m.length===0)throw new d(404,{message:`Table "${t}" does not exist`});let p=m.filter(B=>B.pk>0).sort((B,oe)=>B.pk-oe.pk).map(B=>B.name),f=[],b=i;Array.isArray(o)&&o.length>0?(f=o.map(B=>B.columnName),b=o[0].direction):typeof o=="string"&&o&&(f=[o]);let T=[...f,...p.filter(B=>!f.includes(B))],h=T.length===0;h&&T.push("rowid");let{clause:w,values:S}=Ps(l),A="",N=[];if(c){let B=this.decodeCursor(c);if(B){let oe=Ms(B,s,b);A=oe.clause,N=oe.values}}let R="";w&&A?R=`WHERE ${w.replace(/^WHERE\s+/i,"")} AND ${A}`:w?R=w:A&&(R=`WHERE ${A}`);let _=$s((Array.isArray(o),o),i),D=p.filter(B=>!f.includes(B)),x=_;if(s==="desc")if(_){if(x=_.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),D.length){let B=b==="asc"?"DESC":"ASC";x+=`, ${D.map(oe=>`${this.quoteIdentifier(oe)} ${B}`).join(", ")}`}}else x=`ORDER BY ${T.map(B=>`${this.quoteIdentifier(B)} ${b==="asc"?"DESC":"ASC"}`).join(", ")}`;else _?D.length&&(x+=`, ${D.map(B=>`${this.quoteIdentifier(B)} ${b.toUpperCase()}`).join(", ")}`):x=`ORDER BY ${T.map(B=>`${this.quoteIdentifier(B)} ${b.toUpperCase()}`).join(", ")}`;let[H]=await G(u,`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${w}`,S),$=Number(H?.total??0),X=await G(u,`SELECT ${h?"*, rowid":"*"} FROM ${this.quoteIdentifier(t)} ${R} ${x} LIMIT ?`,[...S,...N,a+1]),ee=X.length>a,P=ee?X.slice(0,a):X;s==="desc"&&(P=P.reverse());let ue=B=>({values:Object.fromEntries(T.map(oe=>[oe,B[oe]])),sortColumns:T}),ot=null,be=null;if(P.length>0){let B=P[0],oe=P[P.length-1];s==="asc"?(ee&&(ot=this.encodeCursor(ue(oe))),c&&(be=this.encodeCursor(ue(B)))):(c&&(ot=this.encodeCursor(ue(oe))),ee&&(be=this.encodeCursor(ue(B))))}return{data:h?P.map(({rowid:B,...oe})=>oe):P,meta:{limit:a,total:$,hasNextPage:s==="asc"?ee:!!c,hasPreviousPage:s==="asc"?!!c:ee,nextCursor:ot,prevCursor:be}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{let{name:e,size:t}=await(await V()).info();return[{name:e,size:t,owner:"",encoding:"UTF-8"}]}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){try{return{db:(await(await V()).info()).name}}catch(e){throw this.wrapError(e)}}async getDatabaseConnectionInfo(){try{let{name:e,version:t}=await(await V()).info();return{host:null,port:null,user:"",database:e,version:t,active_connections:1,max_connections:1}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=await V(),n=await G(t,`SELECT name FROM sqlite_master
461
461
  WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT GLOB '_cf_*'
462
- ORDER BY name`);if(!n.length)return[];let a=await t.batch(n.map(s=>`SELECT COUNT(*) as count FROM ${this.quoteIdentifier(s.name)}`),"read");return n.map((s,o)=>({tableName:s.name,rowCount:$s(a[o])[0]?.count??0}))}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=a.filter(u=>u.isPrimaryKey).map(u=>u.columnName),i=a.map(u=>{if(o.length===1&&u.isPrimaryKey&&u.isIdentity)return`"${u.columnName}" INTEGER PRIMARY KEY AUTOINCREMENT`;let m=`"${u.columnName}" ${u.columnType}`;return o.length===1&&u.isPrimaryKey&&(m+=" PRIMARY KEY"),u.isUnique&&!u.isPrimaryKey&&(m+=" UNIQUE"),!u.isNullable&&!u.isPrimaryKey&&(m+=" NOT NULL"),u.defaultValue?.trim()&&!u.isIdentity&&(m+=` DEFAULT ${u.defaultValue.trim()}`),m});o.length>1&&i.push(`PRIMARY KEY (${o.map(u=>`"${u}"`).join(", ")})`);let c=s?.map(u=>`FOREIGN KEY ("${u.columnName}") REFERENCES "${u.referencedTable}" ("${u.referencedColumn}") ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)??[];await(await V()).execute(`CREATE TABLE "${n}" (${[...i,...c].join(", ")})`)}async deleteTable(e){let{tableName:t,cascade:n}=e,a=await V();if(!await this.tableExists(a,t))throw new d(404,{message:`Table "${t}" does not exist`});let[s]=await G(a,`SELECT COUNT(*) as count FROM "${t}"`),o=s?.count??0;if(!n&&(await this.getFkReferencesForTable(a,t)).length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(a,t)};try{return await a.execute(`DROP TABLE "${t}"`),{deletedCount:o,fkViolation:!1,relatedRecords:[]}}catch(i){if((i instanceof Error?i.message:String(i)).includes("FOREIGN KEY constraint"))return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(a,t)};throw i instanceof d?i:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await V();if(!await this.tableExists(s,t))throw new d(404,{message:`Table "${t}" does not exist`});if(await this.tableExists(s,n))throw new d(409,{message:`Table "${n}" already exists`});try{await s.execute(`ALTER TABLE ${this.quoteIdentifier(t)} RENAME TO ${this.quoteIdentifier(n)}`)}catch(o){throw this.wrapError(o)}}async getTableSchema({tableName:e,db:t}){try{let[n]=await G(await V(),"SELECT sql FROM sqlite_master WHERE type='table' AND name=?",[e]);if(!n)throw new d(404,{message:`Table "${e}" does not exist`});return n.sql}catch(n){throw n instanceof d?n:this.wrapError(n)}}async getTableColumns({tableName:e,db:t}){try{let n=await V();if(!await this.tableExists(n,e))throw new d(404,{message:`Table "${e}" does not exist`});let a=await G(n,`PRAGMA table_info(${this.quoteIdentifier(e)})`),s=await G(n,`PRAGMA foreign_key_list("${e}")`),o=new Map;for(let i of s)o.set(i.from,i);return a.map(i=>{let c=o.get(i.name),l=i.type.toLowerCase();return{columnName:i.name,dataType:kn(l),dataTypeLabel:Wr(l),isNullable:i.notnull===0&&i.pk===0,columnDefault:i.dflt_value,isPrimaryKey:i.pk>0,isForeignKey:o.has(i.name),referencedTable:c?.table??null,referencedColumn:c?.to??null,enumValues:null}})}catch(n){throw n instanceof d?n:this.wrapError(n)}}async addColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,columnType:a,defaultValue:s,isNullable:o,isUnique:i,db:c}=e,l=await V();if(!await this.tableExists(l,t))throw new d(404,{message:`Table "${t}" does not exist`});if((await G(l,`PRAGMA table_info(${this.quoteIdentifier(t)})`)).some(p=>p.name===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let m=`"${n}" ${a}`;i&&(m+=" UNIQUE"),o||(m+=" NOT NULL"),s?.trim()&&(m+=` DEFAULT ${s.trim()}`);try{await l.execute(`ALTER TABLE "${t}" ADD COLUMN ${m}`)}catch(p){throw this.wrapError(p)}})}async deleteColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,db:a}=e,s=await V();if(!await this.tableExists(s,t))throw new d(404,{message:`Table "${t}" does not exist`});if(!(await G(s,`PRAGMA table_info(${this.quoteIdentifier(t)})`)).some(i=>i.name===n))throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});try{await s.execute(`ALTER TABLE "${t}" DROP COLUMN "${n}"`)}catch(i){throw this.wrapError(i)}return{deletedCount:1}})}async alterColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o,db:i}=e,c=await V(),l=C=>this.quoteIdentifier(C);if(!await this.tableExists(c,t))throw new d(404,{message:`Table "${t}" does not exist`});let u=await G(c,`PRAGMA table_info(${l(t)})`),m=u.find(C=>C.name===n);if(!m)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});let p=`${t}_alter_${Date.now()}`,[f]=await G(c,"SELECT sql FROM sqlite_master WHERE type='table' AND name=?",[t]),b=Jc(f?.sql??"",p,n,{type:a,notNull:!s&&!m.pk,defaultValue:o?.trim()||null});if(!b)throw new d(400,{message:`Cannot edit columns of "${t}": its definition could not be read`});let T=u.map(C=>l(C.name)).join(", "),h=C=>`'${C.replaceAll("'","''")}'`,w=/\bAUTOINCREMENT\b/i.test(b)?[`DELETE FROM sqlite_sequence WHERE name = ${h(p)}`,`INSERT INTO sqlite_sequence (name, seq) SELECT ${h(p)}, seq FROM sqlite_sequence WHERE name = ${h(t)}`]:[],S=await G(c,"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name=? AND sql IS NOT NULL",[t]),A=await G(c,"SELECT sql FROM sqlite_master WHERE type='trigger' AND tbl_name=?",[t]),N=new Set((await this.getFkReferencesForTable(c,t,{includeSelf:!0})).map(C=>C.referencingTable));try{await c.rebuildTable([b,`INSERT INTO ${l(p)} (${T}) SELECT ${T} FROM ${l(t)}`,...w,`DROP TABLE ${l(t)}`,`ALTER TABLE ${l(p)} RENAME TO ${l(t)}`,...S.map(({sql:C})=>C),...A.map(({sql:C})=>C)],[...N])}catch(C){throw this.wrapError(C)}})}async renameColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await V();if(!await this.tableExists(o,t))throw new d(404,{message:`Table "${t}" does not exist`});let i=await G(o,`PRAGMA table_info(${this.quoteIdentifier(t)})`);if(!i.some(c=>c.name===n))throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});if(i.some(c=>c.name===a))throw new d(409,{message:`Column "${a}" already exists in table "${t}"`});try{await o.execute(`ALTER TABLE "${t}" RENAME COLUMN "${n}" TO "${a}"`)}catch(c){throw this.wrapError(c)}})}async getTableIndexes({tableName:e}){try{return await this.listIndexes(await V(),e)}catch(t){throw this.wrapError(t)}}async createIndex(e){return this.serializeSchemaChange(async()=>{let{tableName:t,indexName:n,columns:a,isUnique:s,method:o}=e;try{let i=await V();if(!await this.tableExists(i,t))throw new d(404,{message:`Table "${t}" does not exist`});let c=await G(i,`PRAGMA table_info(${this.quoteIdentifier(t)})`),l=a.find(u=>!c.some(m=>m.name===u));if(l!==void 0)throw new d(400,{message:`Column "${l}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});await i.execute(`CREATE ${s?"UNIQUE ":""}INDEX ${this.quoteIdentifier(n)} ON ${this.quoteIdentifier(t)} (${a.map(u=>this.quoteIdentifier(u)).join(", ")})`)}catch(i){throw i instanceof Error&&/already exists|there is already|UNIQUE constraint failed/.test(i.message)?new d(409,{message:i.message,cause:i}):i instanceof Error&&i.message.includes("reserved for internal use")?new d(400,{message:i.message,cause:i}):this.wrapError(i)}})}async dropIndex({tableName:e,indexName:t}){return this.serializeSchemaChange(async()=>{try{let n=await V(),a=(await this.listIndexes(n,e)).find(s=>s.indexName===t);if(!a)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(a.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});await n.execute(`DROP INDEX ${this.quoteIdentifier(t)}`)}catch(n){throw this.wrapError(n)}})}async addRecord({params:e}){let{tableName:t,data:n}=e,a=Object.keys(n);if(!a.length)throw new d(400,{message:"No data provided for insert"});let s=a.map(i=>`"${i}"`).join(", "),o=a.map(()=>"?").join(", ");try{let c=await(await V()).execute(Lt(`INSERT INTO "${t}" (${s}) VALUES (${o})`,Object.values(n)));if(c.rowsAffected===0)throw new d(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:c.rowsAffected}}catch(i){throw this.wrapError(i)}}async updateRecords({db:e,params:t}){let{tableName:n}=t,a=this.resolveKeyColumns(t),s=this.groupUpdatesByKey(t,a),o=a.map(i=>`"${i}" = ?`).join(" AND ");try{let i=await V();this.assertWholeKey(await this.getPrimaryKeyColumns(i,n),a);let c=s.flatMap(({keyValues:l,rowUpdates:u})=>[Lt(`UPDATE "${n}" SET ${u.map(m=>`"${m.columnName}" = ?`).join(", ")} WHERE ${o}`,[...u.map(m=>m.value),...l]),"SELECT CASE WHEN changes() = 0 THEN abs(-9223372036854775808) END"]);try{return{updatedCount:(await i.batch(c,"write")).reduce((u,m,p)=>p%2===0?u+m.rowsAffected:u,0)}}catch(l){if(!(l instanceof Error&&l.message.includes("integer overflow")))throw l;let u=await i.batch(s.map(({keyValues:p})=>Lt(`SELECT 1 FROM "${n}" WHERE ${o} LIMIT 1`,p)),"read"),m=s.find((p,f)=>u[f].rows.length===0);throw m?new d(404,{message:`Record with ${this.describeKey(a,m.keyValues)} not found in table "${n}"`}):l}}catch(i){throw this.wrapError(i)}}async deleteRecords({tableName:e,primaryKeys:t,db:n}){let a=t[0]?.columnName;if(!a)throw new d(400,{message:"Primary key column name is required"});let s=t.map(c=>c.value),o=s.map(()=>"?").join(", "),i=await V();try{return this.assertDeletableKey(await this.getPrimaryKeyColumns(i,e)),{deletedCount:(await i.execute(Lt(`DELETE FROM "${e}" WHERE "${a}" IN (${o})`,s))).rowsAffected,fkViolation:!1,relatedRecords:[]}}catch(c){if(Zc(c))return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(i,e,t)};throw this.wrapError(c)}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:n}){let a=t[0]?.columnName;if(!a)throw new d(400,{message:"Primary key column name is required"});let s=c=>this.quoteIdentifier(c),o=t.map(c=>c.value),i=`${s(a)} IN (${o.map(()=>"?").join(", ")})`;try{let c=await V();this.assertDeletableKey(await this.getPrimaryKeyColumns(c,e));let l=await this.getForeignKeysByParent(c),u=[],m=async(f,b,T)=>{for(let h of l.get(f)??[]){if(T.includes(h.childTable))continue;let w=of(h.parentColumns)?h.parentColumns:await this.getPrimaryKeyColumns(c,f),S=`(${h.childColumns.map(s).join(", ")}) IN (SELECT ${w.map(s).join(", ")} FROM ${s(f)} WHERE ${b})`;await m(h.childTable,S,[...T,h.childTable])}u.push(Lt(`DELETE FROM ${s(f)} WHERE ${b}`,o))};return await m(e,i,[e]),{deletedCount:(await c.batch(u,"write")).reduce((f,b)=>f+b.rowsAffected,0)}}catch(c){throw Zc(c)?new d(409,{message:`Cannot force delete from "${e}": rows are still referenced through a foreign key cycle`}):this.wrapError(c)}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t?.length)throw new d(400,{message:"At least one record is required"});let a=Object.keys(t[0]),s=a.map(c=>`"${c}"`).join(", "),o=a.map(()=>"?").join(", "),i=`INSERT INTO "${e}" (${s}) VALUES (${o})`;try{return await(await V()).batch(t.map(l=>Lt(i,a.map(u=>l[u]))),"write"),{success:!0,message:`Bulk insert completed: ${t.length} records inserted`,successCount:t.length,failureCount:0}}catch(c){throw this.wrapError(c)}}async executeQuery({query:e,db:t}){if(!e?.trim())throw new d(400,{message:"Query is required"});let n=e.trim().replace(/;+$/,"");if(Gc(n))throw new d(400,{message:"Transaction statements (BEGIN, COMMIT, ROLLBACK, SAVEPOINT, RELEASE) are not supported in the query runner: each query runs on its own connection, so a transaction cannot span queries."});if(zc(n))throw new d(400,{message:"The query runner runs one statement at a time. Run each statement separately."});let a=performance.now();try{let s=await(await V()).execute(n),o=performance.now()-a;if(s.columns.length>0){let i=$s(s);return{columns:s.columns,rows:i,rowCount:i.length,duration:o,message:i.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:s.rowsAffected,duration:o,message:`OK (${s.rowsAffected} rows affected)`}}catch(s){throw this.wrapError(s)}}async tableExists(e,t){return(await G(e,"SELECT name FROM sqlite_master WHERE type='table' AND name=?",[t])).length>0}async listIndexes(e,t){if(!await this.tableExists(e,t))throw new d(404,{message:`Table "${t}" does not exist`});let n=await G(e,`SELECT il.name AS indexName, il."unique" AS isUnique, il.origin, il.partial, m.sql,
462
+ ORDER BY name`);if(!n.length)return[];let a=await t.batch(n.map(s=>`SELECT COUNT(*) as count FROM ${this.quoteIdentifier(s.name)}`),"read");return n.map((s,o)=>({tableName:s.name,rowCount:ks(a[o])[0]?.count??0}))}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){let{tableName:n,fields:a,foreignKeys:s}=e,o=a.filter(u=>u.isPrimaryKey).map(u=>u.columnName),i=a.map(u=>{if(o.length===1&&u.isPrimaryKey&&u.isIdentity)return`"${u.columnName}" INTEGER PRIMARY KEY AUTOINCREMENT`;let m=`"${u.columnName}" ${u.columnType}`;return o.length===1&&u.isPrimaryKey&&(m+=" PRIMARY KEY"),u.isUnique&&!u.isPrimaryKey&&(m+=" UNIQUE"),!u.isNullable&&!u.isPrimaryKey&&(m+=" NOT NULL"),u.defaultValue?.trim()&&!u.isIdentity&&(m+=` DEFAULT ${u.defaultValue.trim()}`),m});o.length>1&&i.push(`PRIMARY KEY (${o.map(u=>`"${u}"`).join(", ")})`);let c=s?.map(u=>`FOREIGN KEY ("${u.columnName}") REFERENCES "${u.referencedTable}" ("${u.referencedColumn}") ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)??[];await(await V()).execute(`CREATE TABLE "${n}" (${[...i,...c].join(", ")})`)}async deleteTable(e){let{tableName:t,cascade:n}=e,a=await V();if(!await this.tableExists(a,t))throw new d(404,{message:`Table "${t}" does not exist`});let[s]=await G(a,`SELECT COUNT(*) as count FROM "${t}"`),o=s?.count??0;if(!n&&(await this.getFkReferencesForTable(a,t)).length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(a,t)};try{return await a.execute(`DROP TABLE "${t}"`),{deletedCount:o,fkViolation:!1,relatedRecords:[]}}catch(i){if((i instanceof Error?i.message:String(i)).includes("FOREIGN KEY constraint"))return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(a,t)};throw i instanceof d?i:new d(500,{message:`Failed to delete table "${t}"`})}}async renameTable(e){let{tableName:t,newTableName:n,db:a}=e;this.assertDifferentTableName(t,n);let s=await V();if(!await this.tableExists(s,t))throw new d(404,{message:`Table "${t}" does not exist`});if(await this.tableExists(s,n))throw new d(409,{message:`Table "${n}" already exists`});try{await s.execute(`ALTER TABLE ${this.quoteIdentifier(t)} RENAME TO ${this.quoteIdentifier(n)}`)}catch(o){throw this.wrapError(o)}}async getTableSchema({tableName:e,db:t}){try{let[n]=await G(await V(),"SELECT sql FROM sqlite_master WHERE type='table' AND name=?",[e]);if(!n)throw new d(404,{message:`Table "${e}" does not exist`});return n.sql}catch(n){throw n instanceof d?n:this.wrapError(n)}}async getTableColumns({tableName:e,db:t}){try{let n=await V();if(!await this.tableExists(n,e))throw new d(404,{message:`Table "${e}" does not exist`});let a=await G(n,`PRAGMA table_info(${this.quoteIdentifier(e)})`),s=await G(n,`PRAGMA foreign_key_list("${e}")`),o=new Map;for(let i of s)o.set(i.from,i);return a.map(i=>{let c=o.get(i.name),l=i.type.toLowerCase();return{columnName:i.name,dataType:Un(l),dataTypeLabel:Yr(l),isNullable:i.notnull===0&&i.pk===0,columnDefault:i.dflt_value,isPrimaryKey:i.pk>0,isForeignKey:o.has(i.name),referencedTable:c?.table??null,referencedColumn:c?.to??null,enumValues:null}})}catch(n){throw n instanceof d?n:this.wrapError(n)}}async addColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,columnType:a,defaultValue:s,isNullable:o,isUnique:i,db:c}=e,l=await V();if(!await this.tableExists(l,t))throw new d(404,{message:`Table "${t}" does not exist`});if((await G(l,`PRAGMA table_info(${this.quoteIdentifier(t)})`)).some(p=>p.name===n))throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let m=`"${n}" ${a}`;i&&(m+=" UNIQUE"),o||(m+=" NOT NULL"),s?.trim()&&(m+=` DEFAULT ${s.trim()}`);try{await l.execute(`ALTER TABLE "${t}" ADD COLUMN ${m}`)}catch(p){throw this.wrapError(p)}})}async deleteColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,db:a}=e,s=await V();if(!await this.tableExists(s,t))throw new d(404,{message:`Table "${t}" does not exist`});if(!(await G(s,`PRAGMA table_info(${this.quoteIdentifier(t)})`)).some(i=>i.name===n))throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});try{await s.execute(`ALTER TABLE "${t}" DROP COLUMN "${n}"`)}catch(i){throw this.wrapError(i)}return{deletedCount:1}})}async alterColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,columnType:a,isNullable:s,defaultValue:o,db:i}=e,c=await V(),l=R=>this.quoteIdentifier(R);if(!await this.tableExists(c,t))throw new d(404,{message:`Table "${t}" does not exist`});let u=await G(c,`PRAGMA table_info(${l(t)})`),m=u.find(R=>R.name===n);if(!m)throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});let p=`${t}_alter_${Date.now()}`,[f]=await G(c,"SELECT sql FROM sqlite_master WHERE type='table' AND name=?",[t]),b=Zc(f?.sql??"",p,n,{type:a,notNull:!s&&!m.pk,defaultValue:o?.trim()||null});if(!b)throw new d(400,{message:`Cannot edit columns of "${t}": its definition could not be read`});let T=u.map(R=>l(R.name)).join(", "),h=R=>`'${R.replaceAll("'","''")}'`,w=/\bAUTOINCREMENT\b/i.test(b)?[`DELETE FROM sqlite_sequence WHERE name = ${h(p)}`,`INSERT INTO sqlite_sequence (name, seq) SELECT ${h(p)}, seq FROM sqlite_sequence WHERE name = ${h(t)}`]:[],S=await G(c,"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name=? AND sql IS NOT NULL",[t]),A=await G(c,"SELECT sql FROM sqlite_master WHERE type='trigger' AND tbl_name=?",[t]),N=new Set((await this.getFkReferencesForTable(c,t,{includeSelf:!0})).map(R=>R.referencingTable));try{await c.rebuildTable([b,`INSERT INTO ${l(p)} (${T}) SELECT ${T} FROM ${l(t)}`,...w,`DROP TABLE ${l(t)}`,`ALTER TABLE ${l(p)} RENAME TO ${l(t)}`,...S.map(({sql:R})=>R),...A.map(({sql:R})=>R)],[...N])}catch(R){throw this.wrapError(R)}})}async renameColumn(e){return this.serializeSchemaChange(async()=>{let{tableName:t,columnName:n,newColumnName:a,db:s}=e,o=await V();if(!await this.tableExists(o,t))throw new d(404,{message:`Table "${t}" does not exist`});let i=await G(o,`PRAGMA table_info(${this.quoteIdentifier(t)})`);if(!i.some(c=>c.name===n))throw new d(404,{message:`Column "${n}" does not exist in table "${t}"`});if(i.some(c=>c.name===a))throw new d(409,{message:`Column "${a}" already exists in table "${t}"`});try{await o.execute(`ALTER TABLE "${t}" RENAME COLUMN "${n}" TO "${a}"`)}catch(c){throw this.wrapError(c)}})}async getTableIndexes({tableName:e}){try{return await this.listIndexes(await V(),e)}catch(t){throw this.wrapError(t)}}async createIndex(e){return this.serializeSchemaChange(async()=>{let{tableName:t,indexName:n,columns:a,isUnique:s,method:o}=e;try{let i=await V();if(!await this.tableExists(i,t))throw new d(404,{message:`Table "${t}" does not exist`});let c=await G(i,`PRAGMA table_info(${this.quoteIdentifier(t)})`),l=a.find(u=>!c.some(m=>m.name===u));if(l!==void 0)throw new d(400,{message:`Column "${l}" does not exist in table "${t}"`});if(o!==void 0)throw new d(400,{message:`Unsupported index method "${o}"`});await i.execute(`CREATE ${s?"UNIQUE ":""}INDEX ${this.quoteIdentifier(n)} ON ${this.quoteIdentifier(t)} (${a.map(u=>this.quoteIdentifier(u)).join(", ")})`)}catch(i){throw i instanceof Error&&/already exists|there is already|UNIQUE constraint failed/.test(i.message)?new d(409,{message:i.message,cause:i}):i instanceof Error&&i.message.includes("reserved for internal use")?new d(400,{message:i.message,cause:i}):this.wrapError(i)}})}async dropIndex({tableName:e,indexName:t}){return this.serializeSchemaChange(async()=>{try{let n=await V(),a=(await this.listIndexes(n,e)).find(s=>s.indexName===t);if(!a)throw new d(404,{message:`Index "${t}" does not exist on table "${e}"`});if(a.kind!=="index")throw new d(400,{message:`Index "${t}" backs a constraint; drop the constraint to remove it`});await n.execute(`DROP INDEX ${this.quoteIdentifier(t)}`)}catch(n){throw this.wrapError(n)}})}async addRecord({params:e}){let{tableName:t,data:n}=e,a=Object.keys(n);if(!a.length)throw new d(400,{message:"No data provided for insert"});let s=a.map(i=>`"${i}"`).join(", "),o=a.map(()=>"?").join(", ");try{let c=await(await V()).execute(Pt(`INSERT INTO "${t}" (${s}) VALUES (${o})`,Object.values(n)));if(c.rowsAffected===0)throw new d(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:c.rowsAffected}}catch(i){throw this.wrapError(i)}}async updateRecords({db:e,params:t}){let{tableName:n}=t,a=this.resolveKeyColumns(t),s=this.groupUpdatesByKey(t,a),o=a.map(i=>`"${i}" = ?`).join(" AND ");try{let i=await V();this.assertWholeKey(await this.getPrimaryKeyColumns(i,n),a);let c=s.flatMap(({keyValues:l,rowUpdates:u})=>[Pt(`UPDATE "${n}" SET ${u.map(m=>`"${m.columnName}" = ?`).join(", ")} WHERE ${o}`,[...u.map(m=>m.value),...l]),"SELECT CASE WHEN changes() = 0 THEN abs(-9223372036854775808) END"]);try{return{updatedCount:(await i.batch(c,"write")).reduce((u,m,p)=>p%2===0?u+m.rowsAffected:u,0)}}catch(l){if(!(l instanceof Error&&l.message.includes("integer overflow")))throw l;let u=await i.batch(s.map(({keyValues:p})=>Pt(`SELECT 1 FROM "${n}" WHERE ${o} LIMIT 1`,p)),"read"),m=s.find((p,f)=>u[f].rows.length===0);throw m?new d(404,{message:`Record with ${this.describeKey(a,m.keyValues)} not found in table "${n}"`}):l}}catch(i){throw this.wrapError(i)}}async deleteRecords({tableName:e,primaryKeys:t,db:n}){let a=t[0]?.columnName;if(!a)throw new d(400,{message:"Primary key column name is required"});let s=t.map(c=>c.value),o=s.map(()=>"?").join(", "),i=await V();try{return this.assertDeletableKey(await this.getPrimaryKeyColumns(i,e)),{deletedCount:(await i.execute(Pt(`DELETE FROM "${e}" WHERE "${a}" IN (${o})`,s))).rowsAffected,fkViolation:!1,relatedRecords:[]}}catch(c){if(tl(c))return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(i,e,t)};throw this.wrapError(c)}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:n}){let a=t[0]?.columnName;if(!a)throw new d(400,{message:"Primary key column name is required"});let s=c=>this.quoteIdentifier(c),o=t.map(c=>c.value),i=`${s(a)} IN (${o.map(()=>"?").join(", ")})`;try{let c=await V();this.assertDeletableKey(await this.getPrimaryKeyColumns(c,e));let l=await this.getForeignKeysByParent(c),u=[],m=async(f,b,T)=>{for(let h of l.get(f)??[]){if(T.includes(h.childTable))continue;let w=uf(h.parentColumns)?h.parentColumns:await this.getPrimaryKeyColumns(c,f),S=`(${h.childColumns.map(s).join(", ")}) IN (SELECT ${w.map(s).join(", ")} FROM ${s(f)} WHERE ${b})`;await m(h.childTable,S,[...T,h.childTable])}u.push(Pt(`DELETE FROM ${s(f)} WHERE ${b}`,o))};return await m(e,i,[e]),{deletedCount:(await c.batch(u,"write")).reduce((f,b)=>f+b.rowsAffected,0)}}catch(c){throw tl(c)?new d(409,{message:`Cannot force delete from "${e}": rows are still referenced through a foreign key cycle`}):this.wrapError(c)}}async bulkInsertRecords({tableName:e,records:t,db:n}){if(!t?.length)throw new d(400,{message:"At least one record is required"});let a=Object.keys(t[0]),s=a.map(c=>`"${c}"`).join(", "),o=a.map(()=>"?").join(", "),i=`INSERT INTO "${e}" (${s}) VALUES (${o})`;try{return await(await V()).batch(t.map(l=>Pt(i,a.map(u=>l[u]))),"write"),{success:!0,message:`Bulk insert completed: ${t.length} records inserted`,successCount:t.length,failureCount:0}}catch(c){throw this.wrapError(c)}}async executeQuery({query:e,db:t}){if(!e?.trim())throw new d(400,{message:"Query is required"});let n=e.trim().replace(/;+$/,"");if(Jc(n))throw new d(400,{message:"Transaction statements (BEGIN, COMMIT, ROLLBACK, SAVEPOINT, RELEASE) are not supported in the query runner: each query runs on its own connection, so a transaction cannot span queries."});if(Qc(n))throw new d(400,{message:"The query runner runs one statement at a time. Run each statement separately."});let a=performance.now();try{let s=await(await V()).execute(n),o=performance.now()-a;if(s.columns.length>0){let i=ks(s);return{columns:s.columns,rows:i,rowCount:i.length,duration:o,message:i.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:s.rowsAffected,duration:o,message:`OK (${s.rowsAffected} rows affected)`}}catch(s){throw this.wrapError(s)}}async tableExists(e,t){return(await G(e,"SELECT name FROM sqlite_master WHERE type='table' AND name=?",[t])).length>0}async listIndexes(e,t){if(!await this.tableExists(e,t))throw new d(404,{message:`Table "${t}" does not exist`});let n=await G(e,`SELECT il.name AS indexName, il."unique" AS isUnique, il.origin, il.partial, m.sql,
463
463
  xi.seqno, xi.cid, xi.name AS columnName
464
464
  FROM pragma_index_list(?) il
465
465
  JOIN pragma_index_xinfo(il.name) xi ON xi.key = 1
466
466
  LEFT JOIN sqlite_master m ON m.type = 'index' AND m.name = il.name
467
- ORDER BY il.origin = 'pk' DESC, il.name, xi.seqno`,[t]),a=new Map;for(let s of n){let o=a.get(s.indexName)??{indexName:s.indexName,columns:[],isUnique:s.isUnique===1,method:null,kind:s.origin==="pk"?"primary":s.origin==="u"?"unique-constraint":"index",definition:s.partial===1?s.sql:null};a.set(s.indexName,o),s.columnName!==null?o.columns.push(s.columnName):(o.columns.push(sf(s.sql??"")[s.seqno]??""),o.definition=s.sql)}return[...a.values()]}async getPrimaryKeyColumns(e,t){return(await G(e,`PRAGMA table_info(${this.quoteIdentifier(t)})`)).filter(a=>a.pk>0).sort((a,s)=>a.pk-s.pk).map(a=>a.name)}async getForeignKeysByParent(e){let t=await G(e,`SELECT m.name AS child, f.id, f."table" AS parent, f."from", f."to"
467
+ ORDER BY il.origin = 'pk' DESC, il.name, xi.seqno`,[t]),a=new Map;for(let s of n){let o=a.get(s.indexName)??{indexName:s.indexName,columns:[],isUnique:s.isUnique===1,method:null,kind:s.origin==="pk"?"primary":s.origin==="u"?"unique-constraint":"index",definition:s.partial===1?s.sql:null};a.set(s.indexName,o),s.columnName!==null?o.columns.push(s.columnName):(o.columns.push(lf(s.sql??"")[s.seqno]??""),o.definition=s.sql)}return[...a.values()]}async getPrimaryKeyColumns(e,t){return(await G(e,`PRAGMA table_info(${this.quoteIdentifier(t)})`)).filter(a=>a.pk>0).sort((a,s)=>a.pk-s.pk).map(a=>a.name)}async getForeignKeysByParent(e){let t=await G(e,`SELECT m.name AS child, f.id, f."table" AS parent, f."from", f."to"
468
468
  FROM sqlite_master m JOIN pragma_foreign_key_list(m.name) f
469
469
  WHERE m.type = 'table' AND m.name NOT LIKE 'sqlite_%' AND m.name NOT GLOB '_cf_*'
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 tl(){be.register("pg",new Sr),be.register("mysql",new br),be.register("mssql",new yr),be.register("mongodb",new pr),be.register("sqlite",new Dr),be.register("redis",new Ar),be.register("duckdb",new ur),be.register("oracle",new Er),be.register("clickhouse",new ir)}var nl=R(()=>{"use strict";y();Dt();Mi();Ki();Ji();nc();oc();Cc();xc();Wc();el()});import{NotFoundError as df,ParseError as pf,ValidationError as ff}from"elysia";import{ZodError as yf}from"zod";function rl(r,e){let{pathname:t}=new URL(e.url),n=pn(e.method,t),a=fn(t),{status:s,body:o}=gf(r);return Z(s>=500?"error":"warn","request_failed",{operation:n,db_type:a,method:e.method,status:s,...ye(r)}),wa(r,{operation:n,status:s,dbType:a}),Response.json({...o,requestId:ct()},{status:s})}var hf,gf,al=R(()=>{"use strict";y();Rt();Q();yn();Ye();hf=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")||je(r)&&r.code?.startsWith("08")===!0},gf=r=>r instanceof d?{status:r.status,body:{error:r.message}}:r instanceof ff?{status:400,body:{error:"Validation error",details:r.all[0]?.message??"Invalid request"}}:r instanceof yf?{status:400,body:{error:"Validation error",details:r.issues[0].message}}:r instanceof pf?{status:400,body:{error:"Malformed JSON in request body"}}:r instanceof df?{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."}}:Kt(r)?{status:409,body:{error:r.message}}:ht(r)?{status:400,body:{error:r.message}}:je(r)&&r.code==="42501"?{status:403,body:{error:r.message}}:r instanceof Error&&hf(r)?{status:503,body:{error:"Database connection failed",details:r.message}}:{status:500,body:{error:r instanceof Error?r.message:"Internal server error"}}});function ol(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 rl(){Te.register("pg",new Cr),Te.register("mysql",new Er),Te.register("mssql",new gr),Te.register("mongodb",new yr),Te.register("sqlite",new Or),Te.register("redis",new _r),Te.register("duckdb",new dr),Te.register("oracle",new Sr),Te.register("clickhouse",new lr)}var al=C(()=>{"use strict";y();_t();vi();ji();Zi();ac();cc();Nc();Pc();Yc();nl()});import{NotFoundError as yf,ParseError as hf,ValidationError as gf}from"elysia";import{ZodError as bf}from"zod";function sl(r,e){let{pathname:t}=new URL(e.url),n=yn(e.method,t),a=hn(t),{status:s,body:o}=Ef(r);return Z(s>=500?"error":"warn","request_failed",{operation:n,db_type:a,method:e.method,status:s,...he(r)}),Ra(r,{operation:n,status:s,dbType:a}),Response.json({...o,requestId:lt()},{status:s})}var Tf,Ef,ol=C(()=>{"use strict";y();bt();Q();gn();ze();Tf=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.name==="ConnectionError"||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")||Ue(r)&&r.code?.startsWith("08")===!0},Ef=r=>r instanceof d?{status:r.status,body:{error:r.message}}:r instanceof gf?{status:400,body:{error:"Validation error",details:r.all[0]?.message??"Invalid request"}}:r instanceof bf?{status:400,body:{error:"Validation error",details:r.issues[0].message}}:r instanceof hf?{status:400,body:{error:"Malformed JSON in request body"}}:r instanceof yf?{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."}}:jt(r)?{status:409,body:{error:r.message}}:gt(r)?{status:400,body:{error:r.message}}:pe(r)?{status:403,body:{error:rr}}:Ue(r)&&r.code==="42501"?{status:403,body:{error:r.message}}:r instanceof Error&&Tf(r)?{status:503,body:{error:"Database connection failed",details:r.message}}:{status:500,body:{error:r instanceof Error?r.message:"Internal server error"}}});function cl(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=M[r.dbType].label;return e.includes("mongo")?`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
476
476
 
@@ -486,7 +486,7 @@ The user chose not to share their database schema. Do not claim to know their ta
486
486
  6. IMPORTANT: When the user asks about collections, fields, or any schema information, answer DIRECTLY from the "Database Context" above \u2014 do NOT generate a query to retrieve schema info you already have
487
487
 
488
488
  **Database Context:**
489
- ${sl(r)}
489
+ ${il(r)}
490
490
 
491
491
  **Guidelines:**
492
492
  1. Always generate syntactically correct MongoDB queries
@@ -548,7 +548,7 @@ This will return the top 5 customers by revenue."`:`You are a database assistant
548
548
  7. IMPORTANT: When the user asks about tables, columns, relationships, or any schema information, answer DIRECTLY from the "Database Context" above \u2014 do NOT generate a SQL query to retrieve schema info you already have
549
549
 
550
550
  **Database Context:**
551
- ${sl(r)}
551
+ ${il(r)}
552
552
 
553
553
  **Guidelines:**
554
554
  1. Always generate syntactically correct SQL for the database type (${t})
@@ -586,7 +586,7 @@ LIMIT 5;
586
586
 
587
587
  This will return the 5 customers with the highest total order value. You might also want to see:
588
588
  - Revenue trends over time for these customers
589
- - Their most frequently ordered products"`}function sl(r){let t=`Database Type: ${M[r.dbType].label}
589
+ - Their most frequently ordered products"`}function il(r){let t=`Database Type: ${M[r.dbType].label}
590
590
 
591
591
  `;t+=`**Tables and Columns:**
592
592
  `;for(let n of r.tables){t+=`
@@ -598,13 +598,13 @@ 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 il=R(()=>{"use strict";y();j()});function bf(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 Tf(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 Ef(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",ye(n)),[]}}async function cl(r){let e=At(),t=Vt(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 Ef(t,i,r)).map(bf)}))),s=Tf(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",ye(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var ll=R(()=>{"use strict";y();Dt();Je();Ye()});import{Elysia as wf}from"elysia";var Sf,Cf,ul,ml,dl=R(()=>{"use strict";y();an();j();Q();Ye();il();ll();Sf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),Cf=new Set(["localhost","127.0.0.1","::1","[::1]"]),ul=()=>{let r;try{r=new URL(it.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=Cf.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},ml=new wf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=ul();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":ct()??""}});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 cl(o):null,u=ol(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${ul()}/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":ct()??""},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,b]of p.headers)Sf.has(f)||(s.headers[f]=b);return p.body},{body:Br})});import{Elysia as Rf}from"elysia";var pl,fl=R(()=>{"use strict";y();j();ts();xa();pl=new Rf({prefix:"/connections"}).get("/",async()=>({data:await wn()})).post("/",async({body:r})=>{let e=await nr(r.url,{requireExistingFile:!0});return{data:await wn(e)}},{body:Gr}).post("/:id/connect",async({params:r})=>({data:await wn(await Za(r.id))})).patch("/:id",async({params:r,body:e})=>({data:await es(r.id,e)}),{body:Qr}).delete("/:id",async({params:r})=>(await fi(r.id),{data:"Connection removed"}))});import{Elysia as Nf}from"elysia";var yl,hl=R(()=>{"use strict";y();Dt();Je();yl=new Nf({prefix:"/databases"}).derive(()=>{let r=At();return{dbType:r,adapter:Vt(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 Af}from"elysia";var at,tn=R(()=>{"use strict";y();j();Dt();Je();Q();at=new Af().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!be.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${be.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!gn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=At();if(a!==t)throw new d(409,{message:`The open connection is ${M[a].label}. Reload the page.`});return{dbType:t,adapter:Vt(t)}})});import{Elysia as Df}from"elysia";var gl,bl=R(()=>{"use strict";y();j();Dt();tn();gl=new Df({prefix:"/keys"}).use(at).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:Oi(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:na}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:U,body:oa}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:sa,params:Bt}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:aa,params:Bt}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:U,params:Bt,body:ia}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:ca,params:Bt})});import{Elysia as _f}from"elysia";var Tl,El=R(()=>{"use strict";y();j();tn();Tl=new _f({prefix:"/logs"}).use(at).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:U})});import{Elysia as Of}from"elysia";var wl,Sl=R(()=>{"use strict";y();j();tn();wl=new Of({prefix:"/query"}).use(at).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:U,body:ea})});import{Elysia as If}from"elysia";var Cl,Rl=R(()=>{"use strict";y();j();Q();tn();Cl=new If({prefix:"/records"}).use(at).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:k,body:$r}).patch("/",async({adapter:r,dbType:e,query:{db:t,schemaName:n},body:a})=>{if(!M[e].cellDefault&&a.updates.some(o=>o.useDefault))throw new d(400,{message:`${M[e].label} cannot set a cell to its column default`});let{updatedCount:s}=await r.updateRecords({params:a,schemaName:n,db:t});return{data:`Updated ${s} records in "${a.tableName}"`}},{query:k,body:ma}).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:k,body:Bn}).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:k,body:Bn}).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:k,body:qr})});async function Al({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(Nl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(Nl(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 xf,Nl,Dl=R(()=>{"use strict";y();xf=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,Nl=(r,e)=>[r,...e?.map(t=>r?.map(n=>xf(t[n])))??[]]});import{Elysia as Lf}from"elysia";var Pf,_l,Ol=R(()=>{"use strict";y();j();tn();Dl();Pf={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},_l=new Lf({prefix:"/tables"}).use(at).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:U}).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:U}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:U,body:Xr}).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:Zr,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:U,params:ie,body:ln}).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:Ur,params:we}).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:k,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:k,params:we,body:jn}).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:k,params:we,body:kt}).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:k,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:k,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:k,params:ie,body:Fn}).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:k,params:Kn}).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:k,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:ua,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 Al({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":Pf[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:ta,params:ie})});import{Elysia as $f}from"elysia";import{z as Il}from"zod";var Mf,xl,Ll=R(()=>{"use strict";y();yn();Mf=Il.object({enabled:Il.boolean()}).strict(),xl=new $f({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Xn(!1),Ea(),{data:Jn()})).put("/preference",({body:r,status:e})=>{let t=Mf.safeParse(r);return t.success?(Xn(t.data.enabled),{data:Jn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:ga()}}))});var kl={};Pt(kl,{createServer:()=>Xf});import{createHash as kf,timingSafeEqual as vf}from"crypto";import{existsSync as Pl}from"fs";import{readFile as Uf,stat as qf}from"fs/promises";import qe from"path";import{fileURLToPath as Bf}from"url";import{cors as Ff}from"@elysiajs/cors";import{node as Kf}from"@elysiajs/node";import{Elysia as Hf}from"elysia";var xn,jf,Wf,Vf,Ml,Yf,zf,Gf,$l,Qf,Jf,Xf,vl=R(()=>{"use strict";y();an();Dt();nl();Je();Q();al();yn();Ye();dl();fl();hl();bl();El();Sl();Rl();Ol();Ll();({API_PREFIX:xn}=it),jf=()=>{if(process.env.NODE_ENV==="development")return qe.resolve(process.cwd(),"../web/dist");let r=qe.dirname(Bf(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!Pl(n)&&Pl(a)?t:e},Wf={".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"},Vf=async(r,e)=>{let t=qe.join(r,"index.html");try{let s=qe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${qe.sep}`)&&(await qf(s)).isFile()&&(t=s)}catch{}let n=await Uf(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":Wf[qe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},Ml=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}},Yf=new Set(["localhost","127.0.0.1","[::1]","::1"]),zf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Yf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},Gf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!Ml(r.headers.get("origin"))},$l=r=>kf("sha256").update(r).digest(),Qf=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&&vf($l(t.slice(n+1)),$l(e))},Jf=(r,e)=>{let{pathname:t}=new URL(r.url),n=pn(r.method,t),a=fn(t),s={requestId:Vo(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??ka()??void 0};return Yo(s,async()=>{if(!t.startsWith(`${xn}/`)||t.startsWith(`${xn}/telemetry`))return e();let o=performance.now(),i=a&&be.has(a)?a:void 0,c=await Sa(n,i,e);return Zn({event:"server_operation",properties:{operation:n,method:r.method,outcome:Ta(c.status),duration_bucket:ba(performance.now()-o),db_type:i}}),c})},Xf=()=>{tl();let r=jf(),e=new Hf({adapter:Kf()}).wrap((t,n)=>(...a)=>Jf(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=ct(),!zf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Qf(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(`${xn}/`)&&Gf(t))throw new d(403,{message:"Cross-site request refused"})}).use(Ff({origin:t=>Ml(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})=>rl(t,n)).group(xn,t=>t.use(pl).use(yl).use(ml).use(xl).group("/:dbType",n=>n.use(_l).use(Cl).use(wl).use(gl).use(Tl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${xn}/`)?Vf(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});y();y();(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]="e012c80c-8f8e-4594-9fe3-0d50414e6c59",r._sentryDebugIdIdentifier="sentry-dbid-e012c80c-8f8e-4594-9fe3-0d50414e6c59")}catch{}})();y();an();import{intro as Zf,log as nn,outro as Ul,spinner as ey}from"@clack/prompts";import rn from"picocolors";y();import{program as Lr}from"commander";var Ws=()=>{Lr.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=Lr.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Lr.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};y();var Vs=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;y();import{access as Fl,readFile as Kl}from"fs/promises";import{dirname as Hl,resolve as Pr}from"path";import{parse as jl}from"dotenv";var Wl=async r=>{let e=Pr(r);for(;;){let t=Pr(e,".env");try{return await Fl(t),t}catch{}let n=Hl(e);if(n===e)return null;e=n}},$t=async r=>{let e;if(r?e=Pr(r):e=await Wl(process.cwd()),!e)return null;try{let t=await Kl(e,"utf-8");return jl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};y();import Vl from"open";var Ys=r=>r===!0,zs=async r=>{await Vl(r)};da();y();xr();j();import{intro as am,outro as sm}from"@clack/prompts";import Ft from"picocolors";var jo=()=>{am(Ft.inverse(" db-studio ")),console.log(Ft.bold(`
601
+ `}return t}var ll=C(()=>{"use strict";y();j()});function wf(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 Sf(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 Rf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",he(n)),[]}}async function ul(r){let e=Dt(),t=zt(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 Rf(t,i,r)).map(wf)}))),s=Sf(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",he(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var ml=C(()=>{"use strict";y();_t();Xe();ze()});import{Elysia as Cf}from"elysia";var Nf,Af,dl,pl,fl=C(()=>{"use strict";y();on();j();Q();ze();ll();ml();Nf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),Af=new Set(["localhost","127.0.0.1","::1","[::1]"]),dl=()=>{let r;try{r=new URL(ct.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=Af.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},pl=new Cf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=dl();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":lt()??""}});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 ul(o):null,u=cl(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${dl()}/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":lt()??""},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,b]of p.headers)Nf.has(f)||(s.headers[f]=b);return p.body},{body:Kr})});import{Elysia as Df}from"elysia";var yl,hl=C(()=>{"use strict";y();j();rs();Pa();yl=new Df({prefix:"/connections"}).get("/",async()=>({data:await Rn()})).post("/",async({body:r})=>{let e=await ar(r.url,{requireExistingFile:!0});return{data:await Rn(e)}},{body:Jr}).post("/:id/connect",async({params:r})=>({data:await Rn(await ts(r.id))})).patch("/:id",async({params:r,body:e})=>({data:await ns(r.id,e)}),{body:Xr}).delete("/:id",async({params:r})=>(await hi(r.id),{data:"Connection removed"}))});import{Elysia as _f}from"elysia";var gl,bl=C(()=>{"use strict";y();_t();Xe();gl=new _f({prefix:"/databases"}).derive(()=>{let r=Dt();return{dbType:r,adapter:zt(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 Of}from"elysia";var st,rn=C(()=>{"use strict";y();j();_t();Xe();Q();st=new Of().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!Te.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${Te.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!Tn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Dt();if(a!==t)throw new d(409,{message:`The open connection is ${M[a].label}. Reload the page.`});return{dbType:t,adapter:zt(t)}})});import{Elysia as If}from"elysia";var Tl,El=C(()=>{"use strict";y();j();_t();rn();Tl=new If({prefix:"/keys"}).use(st).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:xi(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:aa}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:U,body:ca}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:ia,params:Ft}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:oa,params:Ft}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:U,params:Ft,body:la}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:ua,params:Ft})});import{Elysia as xf}from"elysia";var wl,Sl=C(()=>{"use strict";y();j();rn();wl=new xf({prefix:"/logs"}).use(st).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:U})});import{Elysia as Lf}from"elysia";var Rl,Cl=C(()=>{"use strict";y();j();rn();Rl=new Lf({prefix:"/query"}).use(st).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:U,body:na})});import{Elysia as Pf}from"elysia";var Nl,Al=C(()=>{"use strict";y();j();Q();rn();Nl=new Pf({prefix:"/records"}).use(st).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:k,body:kr}).patch("/",async({adapter:r,dbType:e,query:{db:t,schemaName:n},body:a})=>{if(!M[e].cellDefault&&a.updates.some(o=>o.useDefault))throw new d(400,{message:`${M[e].label} cannot set a cell to its column default`});let{updatedCount:s}=await r.updateRecords({params:a,schemaName:n,db:t});return{data:`Updated ${s} records in "${a.tableName}"`}},{query:k,body:pa}).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:k,body:Kn}).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:k,body:Kn}).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:k,body:Fr})});async function _l({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(Dl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(Dl(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 $f,Dl,Ol=C(()=>{"use strict";y();$f=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,Dl=(r,e)=>[r,...e?.map(t=>r?.map(n=>$f(t[n])))??[]]});import{Elysia as Mf}from"elysia";var kf,Il,xl=C(()=>{"use strict";y();j();rn();Ol();kf={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},Il=new Mf({prefix:"/tables"}).use(st).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:U}).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:U}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:U,body:ea}).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:ta,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:U,params:ie,body:mn}).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:Br,params:Se}).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:k,params:ie,body:Ke}).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:k,params:Se,body:Vn}).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:k,params:Se,body:vt}).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:k,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:k,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:k,params:ie,body:Hn}).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:k,params:jn}).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:k,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:da,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 _l({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":kf[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:ra,params:ie})});import{Elysia as vf}from"elysia";import{z as Ll}from"zod";var Uf,Pl,$l=C(()=>{"use strict";y();gn();Uf=Ll.object({enabled:Ll.boolean()}).strict(),Pl=new vf({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Zn(!1),Sa(),{data:Xn()})).put("/preference",({body:r,status:e})=>{let t=Uf.safeParse(r);return t.success?(Zn(t.data.enabled),{data:Xn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:Ta()}}))});var Ul={};$t(Ul,{createServer:()=>ty});import{createHash as qf,timingSafeEqual as Bf}from"crypto";import{existsSync as Ml}from"fs";import{readFile as Ff,stat as Kf}from"fs/promises";import Fe from"path";import{fileURLToPath as Hf}from"url";import{cors as jf}from"@elysiajs/cors";import{node as Wf}from"@elysiajs/node";import{Elysia as Vf}from"elysia";var Pn,Yf,zf,Gf,vl,Qf,Jf,Xf,kl,Zf,ey,ty,ql=C(()=>{"use strict";y();on();_t();al();Xe();Q();ol();gn();ze();fl();hl();bl();El();Sl();Cl();Al();xl();$l();({API_PREFIX:Pn}=ct),Yf=()=>{if(process.env.NODE_ENV==="development")return Fe.resolve(process.cwd(),"../web/dist");let r=Fe.dirname(Hf(import.meta.url)),e=Fe.resolve(r,"./web-dist"),t=Fe.resolve(process.cwd(),"../web/dist"),n=Fe.resolve(e,"index.html"),a=Fe.resolve(t,"index.html");return!Ml(n)&&Ml(a)?t:e},zf={".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"},Gf=async(r,e)=>{let t=Fe.join(r,"index.html");try{let s=Fe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${Fe.sep}`)&&(await Kf(s)).isFile()&&(t=s)}catch{}let n=await Ff(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(Fe.join(r,"assets",Fe.sep));return new Response(n,{headers:{"Content-Type":zf[Fe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},vl=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}},Qf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Jf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Qf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},Xf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!vl(r.headers.get("origin"))},kl=r=>qf("sha256").update(r).digest(),Zf=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&&Bf(kl(t.slice(n+1)),kl(e))},ey=(r,e)=>{let{pathname:t}=new URL(r.url),n=yn(r.method,t),a=hn(t),s={requestId:zo(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??Ua()??void 0};return Go(s,async()=>{if(!t.startsWith(`${Pn}/`)||t.startsWith(`${Pn}/telemetry`))return e();let o=performance.now(),i=a&&Te.has(a)?a:void 0,c=await Ca(n,i,e);return er({event:"server_operation",properties:{operation:n,method:r.method,outcome:wa(c.status),duration_bucket:Ea(performance.now()-o),db_type:i}}),c})},ty=()=>{rl();let r=Yf(),e=new Vf({adapter:Wf()}).wrap((t,n)=>(...a)=>ey(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=lt(),!Jf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Zf(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(`${Pn}/`)&&Xf(t))throw new d(403,{message:"Cross-site request refused"})}).use(jf({origin:t=>vl(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})=>sl(t,n)).group(Pn,t=>t.use(yl).use(gl).use(pl).use(Pl).group("/:dbType",n=>n.use(Il).use(Nl).use(Rl).use(Tl).use(wl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${Pn}/`)?Gf(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});y();y();(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]="d5ffff7b-e2bd-4bad-903c-0e7d70a592ee",r._sentryDebugIdIdentifier="sentry-dbid-d5ffff7b-e2bd-4bad-903c-0e7d70a592ee")}catch{}})();y();on();import{intro as ny,log as an,outro as Bl,spinner as ry}from"@clack/prompts";import sn from"picocolors";y();import{program as $r}from"commander";var Ys=()=>{$r.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=$r.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&$r.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};y();var zs=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;y();import{access as Hl,readFile as jl}from"fs/promises";import{dirname as Wl,resolve as Mr}from"path";import{parse as Vl}from"dotenv";var Yl=async r=>{let e=Mr(r);for(;;){let t=Mr(e,".env");try{return await Hl(t),t}catch{}let n=Wl(e);if(n===e)return null;e=n}},Mt=async r=>{let e;if(r?e=Mr(r):e=await Yl(process.cwd()),!e)return null;try{let t=await jl(e,"utf-8");return Vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};y();import zl from"open";var Gs=r=>r===!0,Qs=async r=>{await zl(r)};fa();y();Pr();j();import{intro as om,outro as im}from"@clack/prompts";import Kt from"picocolors";var Vo=()=>{om(Kt.inverse(" db-studio ")),console.log(Kt.bold(`
602
602
  Usage:`)),console.log(` db-studio [options]
603
- `),console.log(Ft.bold("Supported Databases:")),console.log(` ${Object.values(M).map(({label:r})=>r).join(", ")}
604
- `),console.log(Ft.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
603
+ `),console.log(Kt.bold("Supported Databases:")),console.log(` ${Object.values(M).map(({label:r})=>r).join(", ")}
604
+ `),console.log(Kt.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
605
605
  `),console.log("Without a database URL, open the printed address and choose one in the browser."),console.log(`Connections are saved to ~/.dbstudio/connections.json.
606
- `),console.log(Ft.bold("Examples:")),console.log(" db-studio"),console.log(" db-studio -e .env.local"),console.log(" db-studio -p 4000"),console.log(" db-studio -d postgresql://user:pass@localhost:5432/mydb"),console.log(" db-studio -n MY_DATABASE_URL"),console.log(" db-studio -e .env.production -n PROD_DB_URL"),console.log(` db-studio --status
607
- `),sm(Ft.green(`For more information, visit: ${Hs.SITE_DOCS_LINK}`))};y();an();j();import{intro as pm,note as fm,outro as Qo}from"@clack/prompts";import Ke from"picocolors";ze();var Jo=async(r,e,t)=>{pm(Ke.inverse(" db-studio "));let n=t||it.VAR_NAME,a=null;if(e)a=e;else{let s=r?await $t(r):await $t();s?.[n]?a=s[n]:process.env[n]&&(a=process.env[n]??null)}a?Qo(Ke.green(`\u2713 Database connection configured (using ${n})`)):(fm(Ke.red(`\u2717 ${n} not found`),"Status"),console.log(Ke.yellow(`
608
- To configure database connection:`)),console.log(Ke.dim(` \u2022 Supported databases: ${Object.values(M).map(({label:s})=>s).join(", ")}`)),console.log(Ke.dim(` \u2022 Also via wire-compatible URLs: ${Object.keys(zn).map(s=>`${s}://`).join(", ")}`)),console.log(Ke.dim(` \u2022 Add ${n} to your .env file or set it in process.env`)),console.log(Ke.dim(" \u2022 Use -d flag: db-studio -d <url>")),console.log(Ke.dim(" \u2022 Use -e flag: db-studio -e <path-to-env>")),console.log(Ke.dim(` \u2022 Use -n flag: db-studio -n <var-name>
609
- `)),Qo(Ke.yellow("\u26A0 No database connection configured")))};y();ya();import{intro as hm,outro as gm}from"@clack/prompts";import Xo from"picocolors";var Zo=()=>{hm(Xo.inverse(" db-studio ")),gm(Xo.green(`\u{1F680} db-studio v${wt.version}`))};var ty=async()=>{let{env:r,port:e,databaseUrl:t,varName:n,open:a,status:s,help:o,version:i}=Ws();o&&(jo(),process.exit(0)),i&&(Zo(),process.exit(0)),s&&(await Jo(r,t,n),process.exit(0)),Zf(rn.inverse(" db-studio "));let c=r?await $t(r):await $t();if(c)for(let[N,C]of Object.entries(c))process.env[N]===void 0&&(process.env[N]=C);let l=Number.parseInt(e??process.env.PORT??String(it.PORT),10),u=process.env.HOST??"127.0.0.1";if(!["127.0.0.1","localhost","::1"].includes(u)&&!process.env.DB_STUDIO_PASSWORD){let{randomBytes:N}=await import("crypto");process.env.DB_STUDIO_PASSWORD=N(18).toString("base64url"),nn.warn(`HOST=${u} exposes db-studio to the network, so it asks for a password (set DB_STUDIO_PASSWORD to choose one). Sign in with any username and the password ${rn.cyan(process.env.DB_STUDIO_PASSWORD)}`)}let m=n||it.VAR_NAME,p=t||Vs(c,m),{flushServerObservability:f,initServerObservability:b}=await Promise.resolve().then(()=>(yn(),ai));if(b(),p){nn.success(t?"Using database URL from --database-url":c?.[m]?`Found ${m} in ${r??".env"}`:`Found ${m} in environment`);let{getDatabaseConnectionDetails:N}=await Promise.resolve().then(()=>(Na(),si)),{connect:C}=await Promise.resolve().then(()=>(ts(),_i)),_=N(p),D=_?`${_.name} at ${_.destination}`:"the database",x=ey();x.start(`Connecting to ${D}...`);try{await C(p),x.stop(`Connected to ${D}`)}catch(H){throw x.stop(`Could not connect to ${D}`),H}}else nn.info(`No ${m} found. Choose a database in the browser.`);let{createServer:T}=await Promise.resolve().then(()=>(vl(),kl)),{closeAllDbPools:h}=await Promise.resolve().then(()=>(Je(),Xa)),{app:w}=T(),S=async()=>{let N=new Promise(C=>setTimeout(C,5e3));await Promise.race([w.server?.stop(),N]),await Promise.race([Promise.allSettled([h(),f()]),N]),process.exit(0)};process.once("SIGINT",S),process.once("SIGTERM",S),w.listen({hostname:u,port:l});let A=process.env.DB_STUDIO_SERVER_URL??process.env.PORTLESS_URL??`http://localhost:${l}`;if(nn.success(`Server listening at ${rn.cyan(A)}`),Ys(a))try{await zs(A),nn.success("Opened db-studio in your browser")}catch{nn.warn(`Could not open your browser. Visit ${rn.cyan(A)}`)}Ul(rn.green("Ready"))};process.env.NODE_ENV!=="test"&&ty().catch(r=>{let e=r instanceof Error?r.message:String(r);Ul(rn.red(`Startup failed: ${Vn(e)}`)),process.exit(1)});var CR=void 0;export{CR as default,ty as main};
606
+ `),console.log(Kt.bold("Examples:")),console.log(" db-studio"),console.log(" db-studio -e .env.local"),console.log(" db-studio -p 4000"),console.log(" db-studio -d postgresql://user:pass@localhost:5432/mydb"),console.log(" db-studio -n MY_DATABASE_URL"),console.log(" db-studio -e .env.production -n PROD_DB_URL"),console.log(` db-studio --status
607
+ `),im(Kt.green(`For more information, visit: ${Ws.SITE_DOCS_LINK}`))};y();on();j();import{intro as ym,note as hm,outro as Xo}from"@clack/prompts";import je from"picocolors";Ge();var Zo=async(r,e,t)=>{ym(je.inverse(" db-studio "));let n=t||ct.VAR_NAME,a=null;if(e)a=e;else{let s=r?await Mt(r):await Mt();s?.[n]?a=s[n]:process.env[n]&&(a=process.env[n]??null)}a?Xo(je.green(`\u2713 Database connection configured (using ${n})`)):(hm(je.red(`\u2717 ${n} not found`),"Status"),console.log(je.yellow(`
608
+ To configure database connection:`)),console.log(je.dim(` \u2022 Supported databases: ${Object.values(M).map(({label:s})=>s).join(", ")}`)),console.log(je.dim(` \u2022 Also via wire-compatible URLs: ${Object.keys(Qn).map(s=>`${s}://`).join(", ")}`)),console.log(je.dim(` \u2022 Add ${n} to your .env file or set it in process.env`)),console.log(je.dim(" \u2022 Use -d flag: db-studio -d <url>")),console.log(je.dim(" \u2022 Use -e flag: db-studio -e <path-to-env>")),console.log(je.dim(` \u2022 Use -n flag: db-studio -n <var-name>
609
+ `)),Xo(je.yellow("\u26A0 No database connection configured")))};y();ga();import{intro as bm,outro as Tm}from"@clack/prompts";import ei from"picocolors";var ti=()=>{bm(ei.inverse(" db-studio ")),Tm(ei.green(`\u{1F680} db-studio v${Rt.version}`))};var ay=async()=>{let{env:r,port:e,databaseUrl:t,varName:n,open:a,status:s,help:o,version:i}=Ys();o&&(Vo(),process.exit(0)),i&&(ti(),process.exit(0)),s&&(await Zo(r,t,n),process.exit(0)),ny(sn.inverse(" db-studio "));let c=r?await Mt(r):await Mt();if(c)for(let[N,R]of Object.entries(c))process.env[N]===void 0&&(process.env[N]=R);let l=Number.parseInt(e??process.env.PORT??String(ct.PORT),10),u=process.env.HOST??"127.0.0.1";if(!["127.0.0.1","localhost","::1"].includes(u)&&!process.env.DB_STUDIO_PASSWORD){let{randomBytes:N}=await import("crypto");process.env.DB_STUDIO_PASSWORD=N(18).toString("base64url"),an.warn(`HOST=${u} exposes db-studio to the network, so it asks for a password (set DB_STUDIO_PASSWORD to choose one). Sign in with any username and the password ${sn.cyan(process.env.DB_STUDIO_PASSWORD)}`)}let m=n||ct.VAR_NAME,p=t||zs(c,m),{flushServerObservability:f,initServerObservability:b}=await Promise.resolve().then(()=>(gn(),oi));if(b(),p){an.success(t?"Using database URL from --database-url":c?.[m]?`Found ${m} in ${r??".env"}`:`Found ${m} in environment`);let{getDatabaseConnectionDetails:N}=await Promise.resolve().then(()=>(Da(),ii)),{connect:R}=await Promise.resolve().then(()=>(rs(),Ii)),_=N(p),D=_?`${_.name} at ${_.destination}`:"the database",x=ry();x.start(`Connecting to ${D}...`);try{await R(p),x.stop(`Connected to ${D}`)}catch(H){throw x.stop(`Could not connect to ${D}`),H}}else an.info(`No ${m} found. Choose a database in the browser.`);let{createServer:T}=await Promise.resolve().then(()=>(ql(),Ul)),{closeAllDbPools:h}=await Promise.resolve().then(()=>(Xe(),es)),{app:w}=T(),S=async()=>{let N=new Promise(R=>setTimeout(R,5e3));await Promise.race([w.server?.stop(),N]),await Promise.race([Promise.allSettled([h(),f()]),N]),process.exit(0)};process.once("SIGINT",S),process.once("SIGTERM",S),w.listen({hostname:u,port:l});let A=process.env.DB_STUDIO_SERVER_URL??process.env.PORTLESS_URL??`http://localhost:${l}`;if(an.success(`Server listening at ${sn.cyan(A)}`),Gs(a))try{await Qs(A),an.success("Opened db-studio in your browser")}catch{an.warn(`Could not open your browser. Visit ${sn.cyan(A)}`)}Bl(sn.green("Ready"))};process.env.NODE_ENV!=="test"&&ay().catch(r=>{let e=r instanceof Error?r.message:String(r);Bl(sn.red(`Startup failed: ${zn(e)}`)),process.exit(1)});var _C=void 0;export{_C as default,ay as main};
610
610
  //# sourceMappingURL=index.js.map