db-studio 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +22 -22
  3. package/dist/index.js.map +1 -1
  4. package/dist/web-dist/assets/{_pathlessLayout-BQk5gSGn.js → _pathlessLayout-aKKQKRJX.js} +1 -1
  5. package/dist/web-dist/assets/_pathlessLayout-s6cwJxH6.js +2 -0
  6. package/dist/web-dist/assets/{_queryId-Buy3oA5p.js → _queryId-DnPgn-AJ.js} +1 -1
  7. package/dist/web-dist/assets/{_table-CQ2NX0I8.js → _table-Bgt0zJ9m.js} +1 -1
  8. package/dist/web-dist/assets/{_table-BnMBHUzk.js → _table-CU8PHZQE.js} +1 -1
  9. package/dist/web-dist/assets/{_table-CE0TjrEn.js → _table-DIbpzW3q.js} +1 -1
  10. package/dist/web-dist/assets/{abap-B7CMCXo3.js → abap-DQayJW6v.js} +1 -1
  11. package/dist/web-dist/assets/{apex-D6pniLV0.js → apex-Djzlm7in.js} +1 -1
  12. package/dist/web-dist/assets/{azcli-DayXln6N.js → azcli-Bbikkqe4.js} +1 -1
  13. package/dist/web-dist/assets/{badge-BIuMcm7O.js → badge-HtbO9hWg.js} +1 -1
  14. package/dist/web-dist/assets/{bat-knBi4IWo.js → bat-BUFda2RT.js} +1 -1
  15. package/dist/web-dist/assets/{bicep-CqySwd8I.js → bicep-CuUgDHWX.js} +1 -1
  16. package/dist/web-dist/assets/{browser-DQEdJbyz.js → browser-B6gU7HWo.js} +1 -1
  17. package/dist/web-dist/assets/{bundle-mjs-qYDTi1yn.js → bundle-mjs-DEMZsBkP.js} +1 -1
  18. package/dist/web-dist/assets/{cameligo-D1w-uj2C.js → cameligo-DITobApP.js} +1 -1
  19. package/dist/web-dist/assets/{chat-sidebar-CApWlRXq.js → chat-sidebar-Cr2fVFDF.js} +4 -4
  20. package/dist/web-dist/assets/{clojure-D7bkK2B8.js → clojure-DTFcSI8F.js} +1 -1
  21. package/dist/web-dist/assets/{code-editor-Dwq67W-h.js → code-editor-BpsclD2u.js} +1 -1
  22. package/dist/web-dist/assets/{coffee-Dpij46Wn.js → coffee-CmIRg0oP.js} +1 -1
  23. package/dist/web-dist/assets/{connect-B0x9CNlf.js → connect-BM4hZPnz.js} +1 -1
  24. package/dist/web-dist/assets/{constants-BFCsZ8ll.js → constants-BBxXyYPa.js} +3 -3
  25. package/dist/web-dist/assets/{cpp-DWDORc6B.js → cpp-BwBWpZT1.js} +1 -1
  26. package/dist/web-dist/assets/{csharp-FpOMvD_o.js → csharp-BnWK75m3.js} +1 -1
  27. package/dist/web-dist/assets/{csp-4WiITR2R.js → csp-Dohj3XYI.js} +1 -1
  28. package/dist/web-dist/assets/{css-DMOWqvgH.js → css-DN4GbnxY.js} +1 -1
  29. package/dist/web-dist/assets/{cssMode-DHL98brF.js → cssMode-CiAtMuTk.js} +1 -1
  30. package/dist/web-dist/assets/{cypher-Byev8hZE.js → cypher-CKAK8eD4.js} +1 -1
  31. package/dist/web-dist/assets/{dart--T4f3SxI.js → dart-imWXBTLy.js} +1 -1
  32. package/dist/web-dist/assets/{database.store-BAbH5Geu.js → database.store-73Wsz2L5.js} +10 -10
  33. package/dist/web-dist/assets/{dist-D4lNl-zm.js → dist-D4HUXaJv.js} +1 -1
  34. package/dist/web-dist/assets/{dist-C_AEsM_Y.js → dist-DwRWhVwY.js} +1 -1
  35. package/dist/web-dist/assets/{dockerfile-CTL_qQGw.js → dockerfile-CXOK4zpC.js} +1 -1
  36. package/dist/web-dist/assets/{ecl-D2-VZ5jm.js → ecl-lOrW9o9k.js} +1 -1
  37. package/dist/web-dist/assets/{editor.api-DaW7cLxE.js → editor.api-DSevzNN8.js} +1 -1
  38. package/dist/web-dist/assets/{elixir-C__1cTub.js → elixir-DgvzEwPU.js} +1 -1
  39. package/dist/web-dist/assets/{esm-DHRCgDAS.js → esm-DC8GK2En.js} +1 -1
  40. package/dist/web-dist/assets/{flow9-U08FhG_o.js → flow9-l3BJy5NQ.js} +1 -1
  41. package/dist/web-dist/assets/{format-cell-value-BDXXdObX.js → format-cell-value-CuhjnBNV.js} +1 -1
  42. package/dist/web-dist/assets/{freemarker2-EL1xRRz-.js → freemarker2-73G2DeCz.js} +1 -1
  43. package/dist/web-dist/assets/{fsharp-BYeUdvUi.js → fsharp-sfou20I_.js} +1 -1
  44. package/dist/web-dist/assets/{go-D7V_ae37.js → go-DnjkNg4Q.js} +1 -1
  45. package/dist/web-dist/assets/{graphql-C-zVsbUk.js → graphql-BJFXvNDL.js} +1 -1
  46. package/dist/web-dist/assets/{handlebars-BgZpkJkF.js → handlebars-DXg2L0KG.js} +1 -1
  47. package/dist/web-dist/assets/{hcl-B7_QCGTQ.js → hcl-B4FYtDde.js} +1 -1
  48. package/dist/web-dist/assets/{highlighted-body-OFNGDK62-D8XE2uMh.js → highlighted-body-OFNGDK62-Bi4CQl8I.js} +1 -1
  49. package/dist/web-dist/assets/{html-e4Xrzf8r.js → html-BvAUQUXw.js} +1 -1
  50. package/dist/web-dist/assets/{htmlMode-B6WabTqV.js → htmlMode-hZ3EloXT.js} +1 -1
  51. package/dist/web-dist/assets/{icons-D72QQyd5.js → icons-CheF8KGp.js} +1 -1
  52. package/dist/web-dist/assets/{index-DlECfzV9.js → index-YCx2RIFq.js} +4 -4
  53. package/dist/web-dist/assets/{indexes-BBz0Je_a.js → indexes-BYqaS45O.js} +1 -1
  54. package/dist/web-dist/assets/{ini-B8RMyZP2.js → ini-H3EW14Oa.js} +1 -1
  55. package/dist/web-dist/assets/{java-B0bzjGsf.js → java-Cu5qHMXc.js} +1 -1
  56. package/dist/web-dist/assets/{javascript-BSAFurIc.js → javascript-bJHYh6Or.js} +1 -1
  57. package/dist/web-dist/assets/{json-editor-DoEopjNh.js → json-editor-ZcSS1MRc.js} +1 -1
  58. package/dist/web-dist/assets/{jsonMode-CMXGrtoZ.js → jsonMode-CDMOUPss.js} +1 -1
  59. package/dist/web-dist/assets/{julia-Bg58EZ4Y.js → julia-CZ0npMib.js} +1 -1
  60. package/dist/web-dist/assets/{keys-6E3ilH7R.js → keys-By5o7bPm.js} +1 -1
  61. package/dist/web-dist/assets/{kotlin-DW9Z0gYb.js → kotlin-BpW0qHIt.js} +1 -1
  62. package/dist/web-dist/assets/{label-Dcwj4aRe.js → label-C93T1BbF.js} +1 -1
  63. package/dist/web-dist/assets/{less-Bx9gqQ4s.js → less-DTBM-Kxp.js} +1 -1
  64. package/dist/web-dist/assets/{lexon-CSuDDXgE.js → lexon-CLOvNp8v.js} +1 -1
  65. package/dist/web-dist/assets/{liquid-BmNDruwv.js → liquid-IpfBCIUY.js} +1 -1
  66. package/dist/web-dist/assets/{logs-BgfXuAGG.js → logs-CnLvqVtL.js} +1 -1
  67. package/dist/web-dist/assets/{lspLanguageFeatures-CvWt81ki.js → lspLanguageFeatures-CnYZSn_O.js} +1 -1
  68. package/dist/web-dist/assets/{lua-CyCE05f5.js → lua-BERpVknn.js} +1 -1
  69. package/dist/web-dist/assets/{m3-B4TowLdg.js → m3-B_gILjHh.js} +1 -1
  70. package/dist/web-dist/assets/{markdown-DUAXYKYX.js → markdown-DamaZSqy.js} +1 -1
  71. package/dist/web-dist/assets/{mdx-DWKx4rlR.js → mdx-BTw_ghf-.js} +1 -1
  72. package/dist/web-dist/assets/{mermaid-GHXKKRXX-Ci1jaQj_.js → mermaid-GHXKKRXX-B7fOqMvZ.js} +1 -1
  73. package/dist/web-dist/assets/{middleware-YebY3a0i.js → middleware-DKaxoFZs.js} +1 -1
  74. package/dist/web-dist/assets/{mips-B8pYMMky.js → mips-BkjI-_01.js} +1 -1
  75. package/dist/web-dist/assets/{module-BfdI0fnl.js → module-BbdCXsK0.js} +1 -1
  76. package/dist/web-dist/assets/{monaco-theme-C8nJMjlg.js → monaco-theme-DkPj5STI.js} +4 -4
  77. package/dist/web-dist/assets/{msdax-Dl7lqaqA.js → msdax-5OSOIuww.js} +1 -1
  78. package/dist/web-dist/assets/{mysql-CxF1irIT.js → mysql-CMtxQW5J.js} +1 -1
  79. package/dist/web-dist/assets/{objective-c-nxQNwVWR.js → objective-c-CoW52So-.js} +1 -1
  80. package/dist/web-dist/assets/{overlay.store-D93IGU3a.js → overlay.store-BL-3zX6X.js} +1 -1
  81. package/dist/web-dist/assets/{pascal-CJDb1n8F.js → pascal-BxyU4sPJ.js} +1 -1
  82. package/dist/web-dist/assets/{pascaligo-DNMesjCc.js → pascaligo-C63_040U.js} +1 -1
  83. package/dist/web-dist/assets/{perl-Ct14C4yC.js → perl-ayfptt23.js} +1 -1
  84. package/dist/web-dist/assets/{personal-preferences.store-BXE0mRKp.js → personal-preferences.store-BIr71Re8.js} +1 -1
  85. package/dist/web-dist/assets/{pgsql-B2EenuF0.js → pgsql-CPGqMVI3.js} +1 -1
  86. package/dist/web-dist/assets/{php-D953oiSq.js → php-DA-YJ6wI.js} +1 -1
  87. package/dist/web-dist/assets/{pla-DTXlQw1d.js → pla-DesDCKWW.js} +1 -1
  88. package/dist/web-dist/assets/{postiats-JN8Ouz04.js → postiats-B8yhii_n.js} +1 -1
  89. package/dist/web-dist/assets/{powerquery-5V8-uvAS.js → powerquery-CG8tCOct.js} +1 -1
  90. package/dist/web-dist/assets/{powershell-CB8eXyFq.js → powershell-C68aZHza.js} +1 -1
  91. package/dist/web-dist/assets/{preload-helper-B3GI5Aqe.js → preload-helper-DZhPwQp1.js} +1 -1
  92. package/dist/web-dist/assets/{protobuf-B9TJJ9C4.js → protobuf-OaVxpJrs.js} +1 -1
  93. package/dist/web-dist/assets/{pug-Bm8fNuV-.js → pug-0lOSC2rA.js} +1 -1
  94. package/dist/web-dist/assets/{python-C5yAejbi.js → python-C8ab8TeJ.js} +1 -1
  95. package/dist/web-dist/assets/{qsharp-R8gbdykE.js → qsharp-BmHeDwNl.js} +1 -1
  96. package/dist/web-dist/assets/{queries.store-Qbtkt7ze.js → queries.store-Dwdw-Gej.js} +1 -1
  97. package/dist/web-dist/assets/{query-runner-DwuQkpxh.js → query-runner-C430BH5I.js} +3 -3
  98. package/dist/web-dist/assets/{r-M-_jtR31.js → r-DoHxhOJg.js} +1 -1
  99. package/dist/web-dist/assets/{radix-ui-41WpuKNR.js → radix-ui-ByvuE8TW.js} +1 -1
  100. package/dist/web-dist/assets/{razor-C1QqRako.js → razor-DynaHCXX.js} +1 -1
  101. package/dist/web-dist/assets/{react-46S5qMHL.js → react-CKF1H7h0.js} +1 -1
  102. package/dist/web-dist/assets/{react-dom-BmawA5F6.js → react-dom-DQQG0g0D.js} +1 -1
  103. package/dist/web-dist/assets/{redis-Se45CWCe.js → redis-CSL-jfR-.js} +1 -1
  104. package/dist/web-dist/assets/{redis-value-DG_0UKZy.js → redis-value-Bf0tOet0.js} +1 -1
  105. package/dist/web-dist/assets/{redshift-6LxiBjWf.js → redshift-Cb-LWZ8f.js} +1 -1
  106. package/dist/web-dist/assets/{restructuredtext-DQZZ8qkw.js → restructuredtext-DTqnvYsu.js} +1 -1
  107. package/dist/web-dist/assets/{rolldown-runtime-CpVMLIgb.js → rolldown-runtime-0wqQW3ea.js} +1 -1
  108. package/dist/web-dist/assets/{ruby-CCIHgGuA.js → ruby-DbgDuslH.js} +1 -1
  109. package/dist/web-dist/assets/{runner-DOkX5y17.js → runner-DFzqBXp0.js} +1 -1
  110. package/dist/web-dist/assets/{rust-DE79jE85.js → rust-CWzrsIL_.js} +1 -1
  111. package/dist/web-dist/assets/{sb-vTusoyll.js → sb-BghszYt-.js} +1 -1
  112. package/dist/web-dist/assets/{scala-BfDNOQ4o.js → scala-Cw9RU1Qz.js} +1 -1
  113. package/dist/web-dist/assets/schema-B_EtHxTf.js +1 -0
  114. package/dist/web-dist/assets/{schema-CgNnxiB7.js → schema-iTfBKwXl.js} +1 -1
  115. package/dist/web-dist/assets/{scheme-07Nz-Ikg.js → scheme-DeYmvmAH.js} +1 -1
  116. package/dist/web-dist/assets/{scss-C2T-BIyo.js → scss-D_S6B2H1.js} +1 -1
  117. package/dist/web-dist/assets/{select-DzeVPveq.js → select-DU0HoKZ4.js} +1 -1
  118. package/dist/web-dist/assets/{separator-3IoeVup6.js → separator-CZgXYjVQ.js} +1 -1
  119. package/dist/web-dist/assets/{sheet-sidebar-Bne7asEZ.js → sheet-sidebar-KvxY47ZZ.js} +1 -1
  120. package/dist/web-dist/assets/{shell-CYk99G96.js → shell-B59ItoUV.js} +1 -1
  121. package/dist/web-dist/assets/{solidity-DZfw6XST.js → solidity-De0h6YhL.js} +1 -1
  122. package/dist/web-dist/assets/{sophia-9ELY8Wd6.js → sophia-DWmKHYE0.js} +1 -1
  123. package/dist/web-dist/assets/{sparql-DBCoTLhO.js → sparql-0sKQlAae.js} +1 -1
  124. package/dist/web-dist/assets/{spinner-Z77kD_hS.js → spinner-FJ-tXoFX.js} +1 -1
  125. package/dist/web-dist/assets/{sql-DSSHZrVP.js → sql-Cafrv7gm.js} +1 -1
  126. package/dist/web-dist/assets/{st-9goatbhG.js → st-qkFqcB41.js} +1 -1
  127. package/dist/web-dist/assets/{swift-C8IWUoth.js → swift-CDPKFfVs.js} +1 -1
  128. package/dist/web-dist/assets/{systemverilog-DFmMGPsp.js → systemverilog-rjtBmhAJ.js} +1 -1
  129. package/dist/web-dist/assets/{table-Cwbi0FDw.js → table-DmoKTp5U.js} +1 -1
  130. package/dist/web-dist/assets/{tables-BPh2zM7Q.js → tables-By-PTDwU.js} +4 -4
  131. package/dist/web-dist/assets/{tanstack-BE6ru2gB.js → tanstack-Cb7WFPRi.js} +1 -1
  132. package/dist/web-dist/assets/{tcl-9sp6ieFk.js → tcl-C0NrUCCP.js} +1 -1
  133. package/dist/web-dist/assets/{tsMode-BjCfzjtF.js → tsMode-C2yuf0pi.js} +1 -1
  134. package/dist/web-dist/assets/{twig-PTQx-ucO.js → twig-RBrBABOf.js} +1 -1
  135. package/dist/web-dist/assets/{typescript-BGXEvFAl.js → typescript-DWkZjHjp.js} +1 -1
  136. package/dist/web-dist/assets/{typespec-k1Hrq-4g.js → typespec-DfQiGud4.js} +1 -1
  137. package/dist/web-dist/assets/{use-database-engine-CKCp55rb.js → use-database-engine-Mwmv8X7V.js} +1 -1
  138. package/dist/web-dist/assets/{use-theme-CLKCtULg.js → use-theme-BLw5dtZV.js} +1 -1
  139. package/dist/web-dist/assets/{utils-Cr2_fSDl.js → utils-awMbhLwX.js} +1 -1
  140. package/dist/web-dist/assets/{vb-BBuEtOk5.js → vb-BslxQW9i.js} +1 -1
  141. package/dist/web-dist/assets/{visualizer-XPaDmMrd.js → visualizer-LoD_yU5U.js} +1 -1
  142. package/dist/web-dist/assets/{vscode-jtB6jKBB.js → vscode-Ba8jYSS7.js} +1 -1
  143. package/dist/web-dist/assets/{wgsl-MO-DpoEc.js → wgsl-Bq67ZIFU.js} +1 -1
  144. package/dist/web-dist/assets/{workers-7JruDoqH.js → workers-rMl5Xrk2.js} +1 -1
  145. package/dist/web-dist/assets/{xml-C0nHIB7q.js → xml-PfDqoe6w.js} +1 -1
  146. package/dist/web-dist/assets/{yaml-CN9StMra.js → yaml-CIuY3cB5.js} +1 -1
  147. package/dist/web-dist/index.html +30 -30
  148. package/package.json +2 -3
  149. package/dist/web-dist/assets/_pathlessLayout-WF7WipqP.js +0 -2
  150. package/dist/web-dist/assets/schema-B8WxzFU1.js +0 -1
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- var Pl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var It=(r,e)=>{for(var t in e)Pl(r,t,{get:e[t],enumerable:!0})};var h=R(()=>{"use strict";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};r.SENTRY_RELEASE={id:"db-studio@2.0.0"}}catch{}})()});var Ps=R(()=>{"use strict";h()});var $s=R(()=>{"use strict";h()});var Ms=R(()=>{"use strict";h()});var vs,ks,ot,Us=R(()=>{"use strict";h();vs=globalThis.process?.env,ks=vs?.NODE_ENV,ot={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:ks==="development",PROXY_URL:vs?.DB_STUDIO_PROXY_URL??(ks==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var qs=R(()=>{"use strict";h()});var Bs,_r=R(()=>{"use strict";h();Bs={AUTHOR:"H\xFCsam \u{1F951} <husam@ql3.dev>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"db-studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var Fs=R(()=>{"use strict";h()});var tn=R(()=>{"use strict";h();Ps();$s();Ms();Us();qs();_r();Fs()});import{z as bt}from"zod";var v,M,xt,dt,Bl,Fl,ie,Te=R(()=>{"use strict";h();v=bt.object({db:bt.string("Database name is required")}),M=v.extend({schemaName:bt.string().optional()}),xt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],dt=bt.enum(xt,{message:"Invalid database type"}),Bl=v.extend({dbType:dt}),Fl=bt.object({dbType:dt}),ie=bt.object({tableName:bt.string("Table name is required")})});import{z as je}from"zod";var Be,Hl,Kl,Vs=R(()=>{"use strict";h();Te();Be=je.object({columnName:je.string("Column name is required"),columnType:je.string("Column type is required"),defaultValue:je.string().optional(),isPrimaryKey:je.boolean().default(!1),isNullable:je.boolean().default(!1),isUnique:je.boolean().default(!1),isIdentity:je.boolean().default(!1),isArray:je.boolean().default(!1)}),Hl=ie,Kl=je.object({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName,columnName:Be.shape.columnName,columnType:Be.shape.columnType,defaultValue:Be.shape.defaultValue,isPrimaryKey:Be.shape.isPrimaryKey,isNullable:Be.shape.isNullable,isUnique:Be.shape.isUnique,isIdentity:Be.shape.isIdentity,isArray:Be.shape.isArray})});import{z as nn}from"zod";var Lr,Ys=R(()=>{"use strict";h();Lr=nn.object({tableName:nn.string("Table name is required"),data:nn.record(nn.string("Column name is required"),nn.any())})});import{z as jl}from"zod";var zs,xr,Gs,Pr,$r=R(()=>{"use strict";h();zs=["gemini","openai","anthropic","grok","openrouter"],xr=jl.enum(zs),Gs=[{id:"gemini",label:"Google Gemini",models:[{id:"gemini-3-flash-preview",label:"Gemini 3 Flash"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro"}]},{id:"openai",label:"OpenAI",models:[{id:"gpt-5.2",label:"GPT-5.2"},{id:"gpt-5-mini",label:"GPT-5 mini"}]},{id:"anthropic",label:"Anthropic",models:[{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5"}]},{id:"grok",label:"xAI Grok",models:[{id:"grok-4.6",label:"Grok 4.6"},{id:"grok-4.5",label:"Grok 4.5"}]},{id:"openrouter",label:"OpenRouter",models:[{id:"openai/gpt-5.2",label:"GPT-5.2 via OpenRouter"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet 4.6 via OpenRouter"}]}],Pr=r=>Gs.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Fe}from"zod";var Mr,Ee,Wl,Vl,On=R(()=>{"use strict";h();Te();Mr=M.extend({cascade:Fe.string().optional().transform(r=>r==="true")}),Ee=Fe.object({tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required")}),Wl=Fe.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,cascade:Fe.boolean().optional()}),Vl=Fe.object({message:Fe.string("Message is required"),tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required"),deletedCount:Fe.number("Deleted count is required").default(0)})});import{z as rn}from"zod";var Pt,Yl,zl,Qs=R(()=>{"use strict";h();Te();On();Pt=rn.object({columnType:rn.string("Column type is required"),isNullable:rn.boolean(),defaultValue:rn.string().nullable().optional()}),Yl=Ee,zl=rn.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,columnType:Pt.shape.columnType,isNullable:Pt.shape.isNullable,defaultValue:Pt.shape.defaultValue})});var Js=R(()=>{"use strict";h()});import{z as $t}from"zod";var kr,Xs=R(()=>{"use strict";h();kr=$t.object({tableName:$t.string().min(1,"Table name is required"),records:$t.array($t.record($t.string(),$t.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var Gl,Ql,vr,Zs=R(()=>{"use strict";h();$r();Te();Gl=me.object({type:me.string(),content:me.string().optional()}).passthrough(),Ql=me.object({provider:xr.optional().default("gemini"),model:me.string().min(1).optional(),messages:me.array(me.object({id:me.string(),role:me.enum(["user","assistant","system","tool","reasoning"]),content:me.union([me.string(),me.null(),me.array(me.unknown())]).optional(),parts:me.array(Gl).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:v.shape.db,includeSchema:me.boolean().optional().default(!0)})}),vr=Ql.transform(r=>({...r,model:r.model??Pr(r.provider)}))});var eo=R(()=>{"use strict";h()});import{z as Le}from"zod";var Jl,to,x,Xl,no,Zl,Ur=R(()=>{"use strict";h();Jl=["text","boolean","number","enum","json","date","array"],to=Le.enum(Jl),x={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Xl=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],no=Le.enum(Xl),Zl=Le.object({columnName:Le.string(),dataType:to,dataTypeLabel:no,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 In(r){let e=r?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?x.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"?x.number:e==="boolean"||e==="bool"?x.boolean:e==="json"||e==="jsonb"?x.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?x.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"?x.text:x.text}function qr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?b.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?b.bigint:e==="smallint"||e==="int2"?b.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?b.numeric:e==="real"||e==="float4"?b.float:e==="double precision"||e==="float8"||e==="float"?b.double:e==="money"?b.money:e==="boolean"||e==="bool"?b.boolean:e==="text"?b.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?b.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?b.char:e==="json"?b.json:e==="jsonb"?b.jsonb:e==="xml"?b.xml:e==="uuid"?b.uuid:e==="date"?b.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?b.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?b.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?b.timestamptz:e==="interval"||e.startsWith("interval")?b.interval:e==="bytea"?b.bytea:e==="inet"?b.inet:e==="cidr"?b.cidr:e==="macaddr"?b.macaddr:e==="macaddr8"?b.macaddr8:e==="point"?b.point:e==="line"?b.line:e==="polygon"?b.polygon:e.startsWith("array")||e.includes("[]")?b.text:e.startsWith("user-defined")||e==="enum"?b.enum:b.text}function Ln(r,e){let t=r?.toLowerCase().trim()||"",n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?x.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"?x.number:t==="boolean"||t==="bool"?x.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?x.date:t==="json"?x.json:t==="enum"||t==="set"?x.enum:x.text}function Br(r,e){if(!r)return b.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?b.boolean:t==="tinyint"?b.tinyint:t==="smallint"?b.smallint:t==="mediumint"?b.mediumint:t==="int"||t==="integer"?b.int:t==="bigint"?b.bigint:t==="decimal"||t==="numeric"?b.numeric:t==="float"||t==="real"?b.float:t==="double"?b.double:t==="bit"?b.bit:t==="boolean"||t==="bool"?b.boolean:t==="char"?b.char:t==="varchar"?b.varchar:t==="tinytext"?b.tinytext:t==="text"?b.text:t==="mediumtext"?b.mediumtext:t==="longtext"?b.longtext:t==="binary"?b.binary:t==="varbinary"?b.varbinary:t==="tinyblob"?b.tinyblob:t==="blob"?b.blob:t==="mediumblob"?b.mediumblob:t==="longblob"?b.longblob:t==="json"?b.json:t==="date"?b.date:t==="time"?b.time:t==="datetime"?b.datetime:t==="timestamp"?b.timestamp:t==="year"?b.year:t==="enum"?b.enum:t==="set"?b.set:b.text}function xn(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"?x.number:e==="bit"?x.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?x.date:e==="json"?x.json:x.text}function Fr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="tinyint"?b.tinyint:e==="smallint"?b.smallint:e==="int"?b.int:e==="bigint"?b.bigint:e==="decimal"||e==="numeric"?b.numeric:e==="float"||e==="real"?b.float:e==="money"||e==="smallmoney"?b.money:e==="bit"?b.boolean:e==="char"?b.char:e==="varchar"?b.varchar:e==="text"?b.text:e==="nchar"?b.char:e==="nvarchar"?b.varchar:e==="ntext"?b.text:e==="binary"?b.binary:e==="varbinary"?b.varbinary:e==="image"?b.blob:e==="uniqueidentifier"?b.uuid:e==="date"?b.date:e==="time"?b.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?b.datetime:e==="datetimeoffset"?b.timestamptz:e==="json"?b.json:e==="xml"?b.xml:b.text}function Pn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?x.boolean:e==="json"?x.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?x.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?x.number:x.text}function Hr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?b.int:e==="bigint"||e.startsWith("bigint(")?b.bigint:e==="smallint"||e.startsWith("smallint(")?b.smallint:e==="tinyint"||e.startsWith("tinyint(")?b.tinyint:e==="mediumint"||e.startsWith("mediumint(")?b.mediumint:e.includes("int")?b.int:e==="real"||e==="float"||e.startsWith("float(")?b.float:e==="double"||e==="double precision"||e.startsWith("double(")?b.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?b.numeric:e==="boolean"||e==="bool"?b.boolean:e==="text"||e==="clob"?b.text:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="char"||e.startsWith("char(")?b.char:e==="json"?b.json:e==="date"?b.date:e==="time"?b.time:e==="datetime"?b.datetime:e==="timestamp"?b.timestamp:e==="blob"?b.blob:b.text}function $n(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?x.json:e==="boolean"||e==="bool"?x.boolean:e.startsWith("enum")?x.enum:e==="interval"?x.text:e==="date"||e.startsWith("time")||e==="datetime"?x.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?x.number:x.text}function Kr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?b.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?b.json:e.startsWith("enum")?b.enum:e==="interval"?b.interval:e==="tinyint"||e==="utinyint"?b.tinyint:e==="smallint"||e==="usmallint"?b.smallint:e==="integer"||e==="int"?b.int:e.includes("int")||e==="bignum"?b.bigint:e.startsWith("decimal")||e.startsWith("numeric")?b.numeric:e==="float"||e==="real"?b.float:e==="double"?b.double:e==="boolean"||e==="bool"?b.boolean:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="uuid"?b.uuid:e==="date"?b.date:e==="timestamp with time zone"||e==="timestamptz"?b.timestamptz:e.startsWith("timestamp")||e==="datetime"?b.timestamp:e.startsWith("time")?b.time:e==="blob"||e==="bytea"?b.blob:e==="bit"||e==="bitstring"?b.bit:b.text}function Mn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"?x.boolean:e==="json"?x.json:e==="date"||e.startsWith("timestamp")?x.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?x.number:x.text}function jr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return b.boolean;if(e==="json")return b.json;if(e==="xmltype")return b.xml;if(e==="integer")return b.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return b.smallint;if(n<=10)return b.int;if(n<=19)return b.bigint}return e.startsWith("number")?b.numeric:e==="binary_float"?b.float:e==="binary_double"||e.startsWith("float")?b.double:e.startsWith("varchar")||e.startsWith("nvarchar")?b.varchar:e.startsWith("char")||e.startsWith("nchar")?b.char:e.startsWith("timestamp")&&e.endsWith("time zone")?b.timestamptz:e==="date"||e.startsWith("timestamp")?b.timestamp:e.startsWith("interval")?b.interval:e==="blob"||e==="long raw"?b.blob:e.startsWith("raw")?b.varbinary:b.text}function Mt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function kn(r){let e=Mt(r);return e.startsWith("Array(")?x.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?x.enum:e==="Bool"?x.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?x.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?x.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?x.json:x.text}function Wr(r){let e=Mt(r);return e.startsWith("Array(")?b.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?b.enum:e==="Bool"?b.boolean:/^U?Int8$/.test(e)?b.tinyint:/^U?Int16$/.test(e)?b.smallint:/^U?Int32$/.test(e)?b.int:/^U?Int(64|128|256)$/.test(e)?b.bigint:e==="Float32"||e==="BFloat16"?b.float:e==="Float64"?b.double:e.startsWith("Decimal")?b.numeric:e.startsWith("FixedString(")?b.char:e==="UUID"?b.uuid:e==="IPv4"||e==="IPv6"?b.inet:e==="Date"||e==="Date32"?b.date:e.startsWith("DateTime64")?b.timestamp:e.startsWith("DateTime")?b.datetime:e.startsWith("Time")?b.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?b.json:b.text}var b,ro=R(()=>{"use strict";h();Ur();b={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as we}from"zod";var ao,an,so,eu,Vr,Yr,oo=R(()=>{"use strict";h();Te();ao=["red","orange","amber","green","teal","blue","violet","pink"],an=we.enum(ao),so=we.object({id:we.string(),name:we.string(),color:an.nullable(),lastUsedAt:we.number(),dbType:dt,maskedUrl:we.string()}),eu=we.object({connections:we.array(so),active:we.object({id:we.string().nullable(),dbType:dt,connectionId:we.string()}).nullable()}),Vr=we.object({url:we.string().trim().min(1,"Paste a connection URL")}),Yr=we.object({name:we.string().trim().min(1,"Name is required").max(100).optional(),color:an.nullable().optional()})});import{z as de}from"zod";var io,zr,co,lo,Gr,uo=R(()=>{"use strict";h();io=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],zr=de.enum(io),co=de.object({columnName:de.string("Column name is required"),columnType:de.string("Column type is required"),defaultValue:de.string().optional(),isPrimaryKey:de.boolean().default(!1),isNullable:de.boolean().default(!1),isUnique:de.boolean().default(!1),isIdentity:de.boolean().default(!1),isArray:de.boolean().default(!1)}),lo=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:zr.default("NO ACTION"),onDelete:zr.default("NO ACTION")}),Gr=de.object({tableName:de.string("Table name is required"),fields:de.array(co).min(1,"At least one field is required"),foreignKeys:de.array(lo).optional()})});var K,We,mo=R(()=>{"use strict";h();Te();K={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,rowMutation:!0,indexes:{methods:["btree","hash","gin","gist","spgist","brin"],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},sqlite:{label:"SQLite / libSQL / D1",protocols:["sqlite","libsql","d1"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!1},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"DuckDB cannot alter or rename a table that has an index, or alter or drop a column an index covers."},serverLogs:!1},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},We=r=>xt.find(e=>K[e].protocols.includes(r))});import{z as Se}from"zod";var po,tu,nu,fo=R(()=>{"use strict";h();Te();po=Se.object({name:Se.string("Name is required"),size:Se.string("Size is required"),owner:Se.string("Owner is required"),encoding:Se.string("Encoding is required")}),tu=Se.object({databases:Se.array(po),dbType:dt}),nu=Se.object({version:Se.string("Version is required"),database:Se.string("Database is required"),user:Se.string("User is required"),host:Se.string("Host is required").nullable(),port:Se.number("Port is required").nullable(),active_connections:Se.coerce.number("Active connections is required"),max_connections:Se.coerce.number("Max connections is required")})});var ho=R(()=>{"use strict";h()});import{z as kt}from"zod";var vn,yo=R(()=>{"use strict";h();vn=kt.object({tableName:kt.string("Table name is required"),primaryKeys:kt.array(kt.object({columnName:kt.string("Column name is required"),value:kt.any()})).min(1,"At least one primary key is required")})});import{z as ru}from"zod";var Qr,go=R(()=>{"use strict";h();Te();Qr=M.extend({cascade:ru.string().optional().transform(r=>r==="true")})});import{z as bo}from"zod";var Jr,To=R(()=>{"use strict";h();Jr=bo.object({query:bo.string("Query is required")})});import{z as au}from"zod";var Eo,Xr,wo=R(()=>{"use strict";h();Te();Eo=["csv","xlsx","json"],Xr=M.extend({format:au.enum(Eo,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var So,su,Un,ou,qn,iu,Co=R(()=>{"use strict";h();Te();So=["primary","unique-constraint","index"],su=ce.object({indexName:ce.string(),columns:ce.array(ce.string()),isUnique:ce.boolean(),isSparse:ce.boolean().optional(),expireAfterSeconds:ce.number().nonnegative().optional(),method:ce.string().nullable(),kind:ce.enum(So),definition:ce.string().nullable()}),Un=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),ou=Un.extend({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName}),qn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),iu=qn.extend({db:v.shape.db,schemaName:M.shape.schemaName})});import{z as E}from"zod";var Bn,k,Zr,ea,cu,ta,vt,lu,uu,mu,du,pu,fu,hu,Ro,yu,na,gu,bu,Tu,Eu,wu,Su,Cu,ra,Ru,Nu,Au,Du,_u,Ou,Iu,Lu,xu,Pu,$u,Mu,ku,vu,Uu,aa,sa,qu,No=R(()=>{"use strict";h();Bn=E.enum(["string","hash","list","set","zset","stream","unknown"]),k=E.object({base64:E.string().max(16*1024*1024).refine(r=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(r),"Invalid unpadded base64url value"),utf8:E.string().optional()}),Zr=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(200).default(50),search:E.string().max(512).optional(),exactPattern:E.stringbool().default(!1),type:Bn.exclude(["unknown"]).optional()}),ea=E.object({key:k,type:Bn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),cu=E.object({keys:E.array(ea),nextCursor:E.string().nullable(),hasMore:E.boolean()}),ta=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(500).default(100),full:E.stringbool().default(!1),direction:E.enum(["forward","backward"]).default("forward")}),vt=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),lu=E.object({kind:E.literal("string"),value:k,truncated:E.boolean()}),uu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k}))}),mu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:k}))}),du=E.object({kind:E.literal("set"),members:E.array(k)}),pu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),fu=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:k,value:k}))}))}),hu=E.object({kind:E.literal("unknown")}),Ro=E.discriminatedUnion("kind",[lu,uu,mu,du,pu,fu,hu]),yu=ea.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Ro,nextCursor:E.string().nullable(),hasMore:E.boolean()}),na=E.object({db:E.string(),offset:E.coerce.number().int().nonnegative().default(0),limit:E.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:E.string().optional()}),gu=E.object({chunk:k,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),bu=E.object({kind:E.literal("string"),value:k}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k})).min(1)}),Eu=E.object({kind:E.literal("list"),entries:E.array(k).min(1)}),wu=E.object({kind:E.literal("set"),members:E.array(k).min(1)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.number()})).min(1)}),Cu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),ra=E.object({key:k,type:Bn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Cu]),ttlMs:E.number().int().positive().nullable().default(null)}),Ru=E.object({key:k,revision:E.string().nullable(),deleted:E.boolean()}),Nu=E.object({action:E.literal("rename"),newKey:k}),Au=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),Du=E.object({action:E.literal("setString"),value:k}),_u=E.object({action:E.literal("upsertHash"),field:k,value:k}),Ou=E.object({action:E.literal("deleteHash"),field:k}),Iu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:k}),Lu=E.object({action:E.literal("setList"),index:E.number().int(),value:k}),xu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Pu=E.object({action:E.literal("addSet"),member:k}),$u=E.object({action:E.literal("removeSet"),member:k}),Mu=E.object({action:E.literal("upsertZset"),member:k,score:E.number()}),ku=E.object({action:E.literal("removeZset"),member:k}),vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),Uu=E.object({action:E.literal("deleteStream"),id:E.string()}),aa=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[Nu,Au,Du,_u,Ou,Iu,Lu,xu,Pu,$u,Mu,ku,vu,Uu])}),sa=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),qu=E.object({deleted:E.boolean()})});var Ao=R(()=>{"use strict";h()});import{z as oa}from"zod";var Fn,Bu,Fu,Do=R(()=>{"use strict";h();Te();On();Fn=oa.object({newColumnName:oa.string("New column name is required")}),Bu=Ee,Fu=oa.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,newColumnName:Fn.shape.newColumnName})});import{z as Hn}from"zod";var sn,Hu,Ku,_o=R(()=>{"use strict";h();Te();sn=Hn.object({newTableName:Hn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Hn.string().trim().min(1).optional()}),Hu=ie,Ku=Hn.object({db:v.shape.db,tableName:ie.shape.tableName,newTableName:sn.shape.newTableName,schemaName:sn.shape.schemaName})});import{z as Me}from"zod";var Oo,Io,ju,Lo=R(()=>{"use strict";h();Oo=["fatal","error","warning","info","debug"],Io=Me.enum(Oo),ju=Me.object({ts:Me.string(),level:Io,rawLevel:Me.string(),source:Me.string().optional(),code:Me.string().optional(),message:Me.string(),durationMs:Me.number().optional(),statement:Me.string().optional(),detail:Me.record(Me.string(),Me.string())})});import{z as U}from"zod";var xo,on,Po,$o,Wu,ia,Mo=R(()=>{"use strict";h();Te();xo=U.object({columnName:U.string(),operator:U.string(),value:U.string()}),on=["asc","desc"],Po=U.object({columnName:U.string(),direction:U.enum(on)}),$o=U.object({limit:U.number(),total:U.number(),totalEstimated:U.boolean().optional(),hasNextPage:U.boolean(),hasPreviousPage:U.boolean(),nextCursor:U.string().nullable(),prevCursor:U.string().nullable()}),Wu=U.object({data:U.array(U.record(U.string(),U.unknown())),meta:$o}),ia=U.object({db:v.shape.db,schemaName:M.shape.schemaName,cursor:U.string().optional(),limit:U.string().optional().default("50").transform(Number),direction:U.enum(on).optional().default(on[0]),sort:U.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(U.union([U.string(),U.array(Po)])),order:U.enum(on).optional(),filters:U.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(U.array(xo))})});import{z as cn}from"zod";var Vu,ko=R(()=>{"use strict";h();Vu=cn.object({tableName:cn.string("Table name is required"),schemaName:cn.string().optional(),rowCount:cn.coerce.number("Row count is required"),rowCountEstimated:cn.boolean().optional()})});import{z as vo}from"zod";var Yu,Uo=R(()=>{"use strict";h();Yu=vo.object({schema:vo.string()})});import{z as ke}from"zod";var ca,qo=R(()=>{"use strict";h();ca=ke.object({tableName:ke.string("Table name is required"),primaryKey:ke.string("Primary key is required").default("id"),primaryKeys:ke.array(ke.string().min(1)).min(1).optional(),updates:ke.array(ke.object({rowData:ke.record(ke.string("Column name is required"),ke.any()),columnName:ke.string("Column name is required"),value:ke.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Bo={};It(Bo,{AI_PROVIDERS:()=>zs,AI_PROVIDER_OPTIONS:()=>Gs,CONNECTION_COLORS:()=>ao,DATABASE_ENGINES:()=>K,DATABASE_TYPES:()=>xt,DataTypes:()=>x,FOREIGN_KEY_ACTIONS:()=>io,FORMAT_TYPES:()=>Eo,INDEX_KINDS:()=>So,SERVER_LOG_LEVELS:()=>Oo,StandardizedDataType:()=>b,addColumnParamSchema:()=>Hl,addColumnParamsSchema:()=>Kl,addColumnSchema:()=>Be,addRecordSchema:()=>Lr,aiProviderSchema:()=>xr,alterColumnParamSchema:()=>Yl,alterColumnParamsSchema:()=>zl,alterColumnSchema:()=>Pt,bulkInsertRecordsSchema:()=>kr,chatSchema:()=>vr,columnInfoSchema:()=>Zl,connectUrlSchema:()=>Vr,connectionColorSchema:()=>an,connectionInfoSchema:()=>nu,connectionSummarySchema:()=>so,connectionsStateSchema:()=>eu,createIndexParamsSchema:()=>ou,createIndexSchema:()=>Un,createKeySchema:()=>ra,createTableSchema:()=>Gr,currentDatabaseSchema:()=>Bl,dataTypesSchema:()=>to,databaseInfoSchema:()=>po,databaseListSchema:()=>tu,databaseSchema:()=>v,databaseTypeParamSchema:()=>Fl,databaseTypeSchema:()=>dt,dbTypeFromProtocol:()=>We,deleteColumnParamSchema:()=>Ee,deleteColumnParamsSchema:()=>Wl,deleteColumnQuerySchema:()=>Mr,deleteColumnSuccessResponseSchema:()=>Vl,deleteKeyQuerySchema:()=>sa,deleteKeyResultSchema:()=>qu,deleteRecordSchema:()=>vn,deleteTableQuerySchema:()=>Qr,dropIndexParamSchema:()=>qn,dropIndexParamsSchema:()=>iu,encodedRedisValueSchema:()=>k,executeQuerySchema:()=>Jr,exportTableSchema:()=>Xr,fieldDataSchema:()=>co,filterSchema:()=>xo,foreignKeyActionSchema:()=>zr,foreignKeyDataSchema:()=>lo,getDefaultAiModel:()=>Pr,indexInfoSchema:()=>su,keyActionSchema:()=>aa,keyDetailsQuerySchema:()=>ta,keyDetailsResultSchema:()=>yu,keyParamSchema:()=>vt,keyRawQuerySchema:()=>na,keyRawResultSchema:()=>gu,keyScanQuerySchema:()=>Zr,keyScanResultSchema:()=>cu,keyWriteResultSchema:()=>Ru,mapClickhouseToDataType:()=>kn,mapDuckdbToDataType:()=>$n,mapMssqlToDataType:()=>xn,mapMysqlToDataType:()=>Ln,mapOracleToDataType:()=>Mn,mapPostgresToDataType:()=>In,mapSqliteToDataType:()=>Pn,redisKeySummarySchema:()=>ea,redisKeyTypeSchema:()=>Bn,redisKeyValueSchema:()=>Ro,renameColumnParamSchema:()=>Bu,renameColumnParamsSchema:()=>Fu,renameColumnSchema:()=>Fn,renameTableParamSchema:()=>Hu,renameTableParamsSchema:()=>Ku,renameTableSchema:()=>sn,serverLogEntrySchema:()=>ju,serverLogLevelSchema:()=>Io,sortDirections:()=>on,sortSchema:()=>Po,standardizeClickhouseDataTypeLabel:()=>Wr,standardizeDataTypeLabel:()=>qr,standardizeDuckdbDataTypeLabel:()=>Kr,standardizeMssqlDataTypeLabel:()=>Fr,standardizeMysqlDataTypeLabel:()=>Br,standardizeOracleDataTypeLabel:()=>jr,standardizeSqliteDataTypeLabel:()=>Hr,standardizedDataTypeSchema:()=>no,tableDataMetaSchema:()=>$o,tableDataQuerySchema:()=>ia,tableDataResultSchema:()=>Wu,tableInfoSchema:()=>Vu,tableNameSchema:()=>ie,tableQuerySchema:()=>M,tableSchemaResultSchema:()=>Yu,unwrapClickhouseType:()=>Mt,updateConnectionSchema:()=>Yr,updateRecordsSchema:()=>ca});var j=R(()=>{"use strict";h();Vs();Ys();$r();Qs();Js();Xs();Zs();eo();ro();Ur();oo();uo();Te();mo();fo();ho();On();yo();go();To();wo();Co();No();Ao();Do();_o();Lo();Mo();ko();Uo();qo()});var zu,Gu,Qu,Kn,la=R(()=>{"use strict";h();j();zu=Object.values(K).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),Gu=new RegExp(`\\b(?:${zu}):\\/\\/\\S+`,"gi"),Qu=/\b(authToken=)[^&\s]+/gi,Kn=r=>r.replace(Gu,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(Qu,"$1[redacted]")});var d,X=R(()=>{"use strict";h();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}}});import{AsyncLocalStorage as Zu}from"async_hooks";import{randomUUID as Ho}from"crypto";var em,tm,jn,Ko,jo,it,ua,nm,rm,am,Wo,ma,fe,Z,Ve=R(()=>{"use strict";h();X();em=Ho(),tm=/^[A-Za-z0-9_-]{8,64}$/,jn=new Zu,Ko=r=>r&&tm.test(r)?r:Ho(),jo=(r,e)=>jn.run(r,e),it=()=>jn.getStore()?.requestId,ua=()=>jn.getStore()?.connectionId,nm=r=>{let e=r instanceof d?"HTTPException":r instanceof Error?r.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},rm=/^[A-Z0-9_-]{2,32}$/,am=[[/^timeout exceeded when trying to connect$/,"POOL_ACQUIRE_TIMEOUT"],[/^(timeout expired|Connection terminated due to connection timeout)$/,"CONNECT_TIMEOUT"],[/^Connection terminated/,"CONNECTION_TERMINATED"],[/^Client has encountered a connection error/,"CONNECTION_BROKEN"]],Wo=r=>{if(!(r instanceof Error))return;let{code:e,errno:t,number:n,cause:a}=r;return typeof n=="number"&&Number.isSafeInteger(n)?String(n):typeof e=="string"&&rm.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):r.name==="ReplyError"?r.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:am.find(([s])=>s.test(r.message))?.[1]??Wo(a)},ma=r=>r instanceof d&&r.cause?r.cause:r,fe=r=>{let e=ma(r);return{error_type:nm(e),error_code:Wo(e)}},Z=(r,e,t={})=>{let n=jn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:em,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
3
- `)}});function _e(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||sm(e)}}catch(e){return Z("error","database_url_unparseable",fe(e)),{host:"localhost",port:5432}}}var Wn,sm,Vo,Ye=R(()=>{"use strict";h();j();Ve();Wn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},sm=r=>{let e=r.protocol.replace(":",""),t=We(e);return Wn[e]?.defaultPort??(t&&K[t].defaultPort)??5432},Vo=r=>{let e=new URL(r),t=Wn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Tt,da=R(()=>{Tt={name:"db-studio",type:"module",version:"2.0.0",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <husam@ql3.dev>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"Apache-2.0",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"portless run","dev:app":"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify",prepack:"cd ../web && bun run build && cd ../server && bun run build",start:`sh -c 'APP_PORT=\${PORT:-3333}; portless proxy start >/dev/null && portless alias db-studio "$APP_PORT" --force >/dev/null && HOST=127.0.0.1 PORT="$APP_PORT" DB_STUDIO_SERVER_URL=https://db-studio.localhost node dist/index.js'`,format:"biome check --write --unsafe",typecheck:"tsc --noEmit",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",e2e:"tsx e2e/contract.ts","e2e:perf":"tsx e2e/perf.ts","e2e:grid":"tsx e2e/grid.ts","e2e:schema-routing":"tsx e2e/schema-routing.ts","e2e:visualizer":"tsx e2e/visualizer.ts"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@clickhouse/client":"^1.24.0","@duckdb/node-api":"^1.5.6-r.1","@elysiajs/cors":"^1.4.2","@elysiajs/node":"^1.4.5","@libsql/client":"^0.18.0","@sentry/node":"^10.73.0",commander:"^15.0.0",dotenv:"^18.0.0",elysia:"^1.4.30",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",oracledb:"^7.0.1",pg:"^8.20.0",picocolors:"^1.1.1","posthog-node":"^5.20.0",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/oracledb":"^7.0.3","@types/pg":"^8.16.0","@vitest/coverage-v8":"^5.0.0","playwright-core":"1.61.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^5.0.0"}}});var ti={};It(ti,{captureInstallationActive:()=>ga,captureServerError:()=>ba,captureServerEvent:()=>Qn,databaseTypeForRequest:()=>mn,durationBucket:()=>ha,flushServerObservability:()=>Sm,getTelemetryConfig:()=>zn,initServerObservability:()=>ei,operationForRequest:()=>un,outcomeForStatus:()=>ya,resetTelemetryId:()=>fa,setTelemetryEnabled:()=>Gn,startServerSpan:()=>Ta});import{randomUUID as Jo}from"crypto";import{existsSync as mm,mkdirSync as dm,readFileSync as pm,writeFileSync as fm}from"fs";import{homedir as pa,platform as hm}from"os";import Vn from"path";import*as xe from"@sentry/node";import{PostHog as ym}from"posthog-node";var gm,Xo,Yn,bm,Tm,pt,Et,Em,wm,wt,ln,zn,Gn,fa,ha,ya,Zo,un,mn,ei,Sm,Qn,ga,Cm,ba,Ta,dn=R(()=>{"use strict";h();j();Ve();da();gm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",Xo=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Vn.join(pa(),".local","state"));return Vn.join(r||Vn.join(pa(),".db-studio"),"db-studio","telemetry.json")},Yn=r=>{try{let e=Xo();dm(Vn.dirname(e),{recursive:!0}),fm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},bm=()=>({installationId:Jo(),enabled:!0}),Tm=()=>{let r=Xo();try{if(mm(r)){let t=JSON.parse(pm(r,"utf8"));if(typeof t.installationId=="string"&&typeof t.enabled=="boolean")return{installationId:t.installationId,enabled:t.enabled,lastActiveAt:typeof t.lastActiveAt=="string"?t.lastActiveAt:void 0}}}catch{}let e=bm();return Yn(e),e},Em="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",wm="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",wt=()=>pt??=Tm(),ln=()=>!gm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&wt().enabled,zn=()=>({enabled:ln(),installationId:wt().installationId,appVersion:Tt.version}),Gn=r=>{pt={...wt(),enabled:r},Yn(pt),r?(Et?.enable(),ei()):(Et?.disable(),xe.close(500))},fa=()=>(pt={...wt(),installationId:Jo(),lastActiveAt:void 0},Yn(pt),pt.installationId),ha=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",ya=r=>r>=500?"server_error":r>=400?"client_error":"success",Zo=new RegExp(`^/api/(${xt.join("|")})(?=/|$)`),un=(r,e)=>{let t=e.replace(Zo,"/api"),a=[[/^\/api\/databases(?:\/|$)/,"databases"],[/^\/api\/tables(?:\/|$)/,"tables"],[/^\/api\/records(?:\/|$)/,"records"],[/^\/api\/query(?:\/|$)/,"query"],[/^\/api\/keys(?:\/|$)/,"keys"],[/^\/api\/chat(?:\/|$)/,"chat"]].find(([s])=>s.test(t))?.[1]??"other";return`${r.toLowerCase()}_${a}`},mn=r=>r.match(Zo)?.[1],ei=()=>{if(!ln())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Em;r&&(!xe.isInitialized()||xe.getClient()?.getOptions().enabled===!1)&&xe.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${Tt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:wt().installationId},delete t.breadcrumbs,delete t.server_name,t},beforeSendSpan(t){return{...t,data:Object.fromEntries(Object.entries(t.data??{}).filter(([n])=>n.startsWith("db_studio.")))}}});let e=process.env.DB_STUDIO_POSTHOG_KEY??wm;e&&!Et&&(Et=new ym(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Sm=()=>Promise.allSettled([Et?.shutdown(2e3),xe.close(2e3)]),Qn=r=>{!ln()||!Et||Et.capture({distinctId:wt().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:Tt.version,$geoip_disable:!1}})},ga=()=>{if(!ln())return;let r=wt(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(pt={...r,lastActiveAt:new Date().toISOString()},Yn(pt),Qn({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:hm()}}))},Cm=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=pa(),s=r.stack.split(`
2
+ var Pl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var It=(r,e)=>{for(var t in e)Pl(r,t,{get:e[t],enumerable:!0})};var h=R(()=>{"use strict";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};r.SENTRY_RELEASE={id:"db-studio@2.0.1"}}catch{}})()});var Ps=R(()=>{"use strict";h()});var $s=R(()=>{"use strict";h()});var Ms=R(()=>{"use strict";h()});var vs,ks,ot,Us=R(()=>{"use strict";h();vs=globalThis.process?.env,ks=vs?.NODE_ENV,ot={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:ks==="development",PROXY_URL:vs?.DB_STUDIO_PROXY_URL??(ks==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var qs=R(()=>{"use strict";h()});var Bs,_r=R(()=>{"use strict";h();Bs={AUTHOR:"H\xFCsam \u{1F951} <husam@ql3.dev>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"Every database. One studio. Browse tables, edit records, and run queries in a free, open-source database GUI.",SITE_KEYWORDS:["database studio","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"db-studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"db-studio | Every database. One studio",SITE_COLOR:"#1447e6"}});var Fs=R(()=>{"use strict";h()});var tn=R(()=>{"use strict";h();Ps();$s();Ms();Us();qs();_r();Fs()});import{z as bt}from"zod";var v,M,Lt,dt,Bl,Fl,ie,Te=R(()=>{"use strict";h();v=bt.object({db:bt.string("Database name is required")}),M=v.extend({schemaName:bt.string().optional()}),Lt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],dt=bt.enum(Lt,{message:"Invalid database type"}),Bl=v.extend({dbType:dt}),Fl=bt.object({dbType:dt}),ie=bt.object({tableName:bt.string("Table name is required")})});import{z as je}from"zod";var Be,Hl,Kl,Vs=R(()=>{"use strict";h();Te();Be=je.object({columnName:je.string("Column name is required"),columnType:je.string("Column type is required"),defaultValue:je.string().optional(),isPrimaryKey:je.boolean().default(!1),isNullable:je.boolean().default(!1),isUnique:je.boolean().default(!1),isIdentity:je.boolean().default(!1),isArray:je.boolean().default(!1)}),Hl=ie,Kl=je.object({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName,columnName:Be.shape.columnName,columnType:Be.shape.columnType,defaultValue:Be.shape.defaultValue,isPrimaryKey:Be.shape.isPrimaryKey,isNullable:Be.shape.isNullable,isUnique:Be.shape.isUnique,isIdentity:Be.shape.isIdentity,isArray:Be.shape.isArray})});import{z as nn}from"zod";var xr,Ys=R(()=>{"use strict";h();xr=nn.object({tableName:nn.string("Table name is required"),data:nn.record(nn.string("Column name is required"),nn.any())})});import{z as jl}from"zod";var zs,Lr,Gs,Pr,$r=R(()=>{"use strict";h();zs=["gemini","openai","anthropic","grok","openrouter"],Lr=jl.enum(zs),Gs=[{id:"gemini",label:"Google Gemini",models:[{id:"gemini-3-flash-preview",label:"Gemini 3 Flash"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro"}]},{id:"openai",label:"OpenAI",models:[{id:"gpt-5.2",label:"GPT-5.2"},{id:"gpt-5-mini",label:"GPT-5 mini"}]},{id:"anthropic",label:"Anthropic",models:[{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5"}]},{id:"grok",label:"xAI Grok",models:[{id:"grok-4.6",label:"Grok 4.6"},{id:"grok-4.5",label:"Grok 4.5"}]},{id:"openrouter",label:"OpenRouter",models:[{id:"openai/gpt-5.2",label:"GPT-5.2 via OpenRouter"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet 4.6 via OpenRouter"}]}],Pr=r=>Gs.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Fe}from"zod";var Mr,Ee,Wl,Vl,On=R(()=>{"use strict";h();Te();Mr=M.extend({cascade:Fe.string().optional().transform(r=>r==="true")}),Ee=Fe.object({tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required")}),Wl=Fe.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,cascade:Fe.boolean().optional()}),Vl=Fe.object({message:Fe.string("Message is required"),tableName:Fe.string("Table name is required"),columnName:Fe.string("Column name is required"),deletedCount:Fe.number("Deleted count is required").default(0)})});import{z as rn}from"zod";var Pt,Yl,zl,Qs=R(()=>{"use strict";h();Te();On();Pt=rn.object({columnType:rn.string("Column type is required"),isNullable:rn.boolean(),defaultValue:rn.string().nullable().optional()}),Yl=Ee,zl=rn.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,columnType:Pt.shape.columnType,isNullable:Pt.shape.isNullable,defaultValue:Pt.shape.defaultValue})});var Js=R(()=>{"use strict";h()});import{z as $t}from"zod";var kr,Xs=R(()=>{"use strict";h();kr=$t.object({tableName:$t.string().min(1,"Table name is required"),records:$t.array($t.record($t.string(),$t.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var Gl,Ql,vr,Zs=R(()=>{"use strict";h();$r();Te();Gl=me.object({type:me.string(),content:me.string().optional()}).passthrough(),Ql=me.object({provider:Lr.optional().default("gemini"),model:me.string().min(1).optional(),messages:me.array(me.object({id:me.string(),role:me.enum(["user","assistant","system","tool","reasoning"]),content:me.union([me.string(),me.null(),me.array(me.unknown())]).optional(),parts:me.array(Gl).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:v.shape.db,includeSchema:me.boolean().optional().default(!0)})}),vr=Ql.transform(r=>({...r,model:r.model??Pr(r.provider)}))});var eo=R(()=>{"use strict";h()});import{z as xe}from"zod";var Jl,to,L,Xl,no,Zl,Ur=R(()=>{"use strict";h();Jl=["text","boolean","number","enum","json","date","array"],to=xe.enum(Jl),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Xl=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],no=xe.enum(Xl),Zl=xe.object({columnName:xe.string(),dataType:to,dataTypeLabel:no,isNullable:xe.boolean(),columnDefault:xe.string().nullable(),isPrimaryKey:xe.boolean(),isForeignKey:xe.boolean(),referencedTable:xe.string().nullable(),referencedSchema:xe.string().optional(),referencedColumn:xe.string().nullable(),enumValues:xe.array(xe.string()).nullable()})});function In(r){let e=r?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?L.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?L.number:e==="boolean"||e==="bool"?L.boolean:e==="json"||e==="jsonb"?L.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?L.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?L.text:L.text}function qr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?b.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?b.bigint:e==="smallint"||e==="int2"?b.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?b.numeric:e==="real"||e==="float4"?b.float:e==="double precision"||e==="float8"||e==="float"?b.double:e==="money"?b.money:e==="boolean"||e==="bool"?b.boolean:e==="text"?b.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?b.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?b.char:e==="json"?b.json:e==="jsonb"?b.jsonb:e==="xml"?b.xml:e==="uuid"?b.uuid:e==="date"?b.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?b.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?b.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?b.timestamptz:e==="interval"||e.startsWith("interval")?b.interval:e==="bytea"?b.bytea:e==="inet"?b.inet:e==="cidr"?b.cidr:e==="macaddr"?b.macaddr:e==="macaddr8"?b.macaddr8:e==="point"?b.point:e==="line"?b.line:e==="polygon"?b.polygon:e.startsWith("array")||e.includes("[]")?b.text:e.startsWith("user-defined")||e==="enum"?b.enum:b.text}function xn(r,e){let t=r?.toLowerCase().trim()||"",n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?L.boolean:t==="tinyint"||t==="smallint"||t==="mediumint"||t==="int"||t==="integer"||t==="bigint"||t==="decimal"||t==="numeric"||t==="float"||t==="double"||t==="real"||t==="bit"?L.number:t==="boolean"||t==="bool"?L.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?L.date:t==="json"?L.json:t==="enum"||t==="set"?L.enum:L.text}function Br(r,e){if(!r)return b.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?b.boolean:t==="tinyint"?b.tinyint:t==="smallint"?b.smallint:t==="mediumint"?b.mediumint:t==="int"||t==="integer"?b.int:t==="bigint"?b.bigint:t==="decimal"||t==="numeric"?b.numeric:t==="float"||t==="real"?b.float:t==="double"?b.double:t==="bit"?b.bit:t==="boolean"||t==="bool"?b.boolean:t==="char"?b.char:t==="varchar"?b.varchar:t==="tinytext"?b.tinytext:t==="text"?b.text:t==="mediumtext"?b.mediumtext:t==="longtext"?b.longtext:t==="binary"?b.binary:t==="varbinary"?b.varbinary:t==="tinyblob"?b.tinyblob:t==="blob"?b.blob:t==="mediumblob"?b.mediumblob:t==="longblob"?b.longblob:t==="json"?b.json:t==="date"?b.date:t==="time"?b.time:t==="datetime"?b.datetime:t==="timestamp"?b.timestamp:t==="year"?b.year:t==="enum"?b.enum:t==="set"?b.set:b.text}function Ln(r){let e=r?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?L.number:e==="bit"?L.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?L.date:e==="json"?L.json:L.text}function Fr(r){if(!r)return b.text;let e=r.toLowerCase().trim();return e==="tinyint"?b.tinyint:e==="smallint"?b.smallint:e==="int"?b.int:e==="bigint"?b.bigint:e==="decimal"||e==="numeric"?b.numeric:e==="float"||e==="real"?b.float:e==="money"||e==="smallmoney"?b.money:e==="bit"?b.boolean:e==="char"?b.char:e==="varchar"?b.varchar:e==="text"?b.text:e==="nchar"?b.char:e==="nvarchar"?b.varchar:e==="ntext"?b.text:e==="binary"?b.binary:e==="varbinary"?b.varbinary:e==="image"?b.blob:e==="uniqueidentifier"?b.uuid:e==="date"?b.date:e==="time"?b.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?b.datetime:e==="datetimeoffset"?b.timestamptz:e==="json"?b.json:e==="xml"?b.xml:b.text}function Pn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?L.boolean:e==="json"?L.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?L.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?L.number:L.text}function Hr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?b.int:e==="bigint"||e.startsWith("bigint(")?b.bigint:e==="smallint"||e.startsWith("smallint(")?b.smallint:e==="tinyint"||e.startsWith("tinyint(")?b.tinyint:e==="mediumint"||e.startsWith("mediumint(")?b.mediumint:e.includes("int")?b.int:e==="real"||e==="float"||e.startsWith("float(")?b.float:e==="double"||e==="double precision"||e.startsWith("double(")?b.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?b.numeric:e==="boolean"||e==="bool"?b.boolean:e==="text"||e==="clob"?b.text:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="char"||e.startsWith("char(")?b.char:e==="json"?b.json:e==="date"?b.date:e==="time"?b.time:e==="datetime"?b.datetime:e==="timestamp"?b.timestamp:e==="blob"?b.blob:b.text}function $n(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?L.json:e==="boolean"||e==="bool"?L.boolean:e.startsWith("enum")?L.enum:e==="interval"?L.text:e==="date"||e.startsWith("time")||e==="datetime"?L.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?L.number:L.text}function Kr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?b.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?b.json:e.startsWith("enum")?b.enum:e==="interval"?b.interval:e==="tinyint"||e==="utinyint"?b.tinyint:e==="smallint"||e==="usmallint"?b.smallint:e==="integer"||e==="int"?b.int:e.includes("int")||e==="bignum"?b.bigint:e.startsWith("decimal")||e.startsWith("numeric")?b.numeric:e==="float"||e==="real"?b.float:e==="double"?b.double:e==="boolean"||e==="bool"?b.boolean:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="uuid"?b.uuid:e==="date"?b.date:e==="timestamp with time zone"||e==="timestamptz"?b.timestamptz:e.startsWith("timestamp")||e==="datetime"?b.timestamp:e.startsWith("time")?b.time:e==="blob"||e==="bytea"?b.blob:e==="bit"||e==="bitstring"?b.bit:b.text}function Mn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"?L.boolean:e==="json"?L.json:e==="date"||e.startsWith("timestamp")?L.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?L.number:L.text}function jr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return b.boolean;if(e==="json")return b.json;if(e==="xmltype")return b.xml;if(e==="integer")return b.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return b.smallint;if(n<=10)return b.int;if(n<=19)return b.bigint}return e.startsWith("number")?b.numeric:e==="binary_float"?b.float:e==="binary_double"||e.startsWith("float")?b.double:e.startsWith("varchar")||e.startsWith("nvarchar")?b.varchar:e.startsWith("char")||e.startsWith("nchar")?b.char:e.startsWith("timestamp")&&e.endsWith("time zone")?b.timestamptz:e==="date"||e.startsWith("timestamp")?b.timestamp:e.startsWith("interval")?b.interval:e==="blob"||e==="long raw"?b.blob:e.startsWith("raw")?b.varbinary:b.text}function Mt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function kn(r){let e=Mt(r);return e.startsWith("Array(")?L.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?L.enum:e==="Bool"?L.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?L.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?L.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?L.json:L.text}function Wr(r){let e=Mt(r);return e.startsWith("Array(")?b.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?b.enum:e==="Bool"?b.boolean:/^U?Int8$/.test(e)?b.tinyint:/^U?Int16$/.test(e)?b.smallint:/^U?Int32$/.test(e)?b.int:/^U?Int(64|128|256)$/.test(e)?b.bigint:e==="Float32"||e==="BFloat16"?b.float:e==="Float64"?b.double:e.startsWith("Decimal")?b.numeric:e.startsWith("FixedString(")?b.char:e==="UUID"?b.uuid:e==="IPv4"||e==="IPv6"?b.inet:e==="Date"||e==="Date32"?b.date:e.startsWith("DateTime64")?b.timestamp:e.startsWith("DateTime")?b.datetime:e.startsWith("Time")?b.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?b.json:b.text}var b,ro=R(()=>{"use strict";h();Ur();b={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as we}from"zod";var ao,an,so,eu,Vr,Yr,oo=R(()=>{"use strict";h();Te();ao=["red","orange","amber","green","teal","blue","violet","pink"],an=we.enum(ao),so=we.object({id:we.string(),name:we.string(),color:an.nullable(),lastUsedAt:we.number(),dbType:dt,maskedUrl:we.string()}),eu=we.object({connections:we.array(so),active:we.object({id:we.string().nullable(),dbType:dt,connectionId:we.string()}).nullable()}),Vr=we.object({url:we.string().trim().min(1,"Paste a connection URL")}),Yr=we.object({name:we.string().trim().min(1,"Name is required").max(100).optional(),color:an.nullable().optional()})});import{z as de}from"zod";var io,zr,co,lo,Gr,uo=R(()=>{"use strict";h();io=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],zr=de.enum(io),co=de.object({columnName:de.string("Column name is required"),columnType:de.string("Column type is required"),defaultValue:de.string().optional(),isPrimaryKey:de.boolean().default(!1),isNullable:de.boolean().default(!1),isUnique:de.boolean().default(!1),isIdentity:de.boolean().default(!1),isArray:de.boolean().default(!1)}),lo=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:zr.default("NO ACTION"),onDelete:zr.default("NO ACTION")}),Gr=de.object({tableName:de.string("Table name is required"),fields:de.array(co).min(1,"At least one field is required"),foreignKeys:de.array(lo).optional()})});var K,We,mo=R(()=>{"use strict";h();Te();K={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,rowMutation:!0,indexes:{methods:["btree","hash","gin","gist","spgist","brin"],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},sqlite:{label:"SQLite / libSQL / D1",protocols:["sqlite","libsql","d1"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!1},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"DuckDB cannot alter or rename a table that has an index, or alter or drop a column an index covers."},serverLogs:!1},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},We=r=>Lt.find(e=>K[e].protocols.includes(r))});import{z as Se}from"zod";var po,tu,nu,fo=R(()=>{"use strict";h();Te();po=Se.object({name:Se.string("Name is required"),size:Se.string("Size is required"),owner:Se.string("Owner is required"),encoding:Se.string("Encoding is required")}),tu=Se.object({databases:Se.array(po),dbType:dt}),nu=Se.object({version:Se.string("Version is required"),database:Se.string("Database is required"),user:Se.string("User is required"),host:Se.string("Host is required").nullable(),port:Se.number("Port is required").nullable(),active_connections:Se.coerce.number("Active connections is required"),max_connections:Se.coerce.number("Max connections is required")})});var ho=R(()=>{"use strict";h()});import{z as kt}from"zod";var vn,yo=R(()=>{"use strict";h();vn=kt.object({tableName:kt.string("Table name is required"),primaryKeys:kt.array(kt.object({columnName:kt.string("Column name is required"),value:kt.any()})).min(1,"At least one primary key is required")})});import{z as ru}from"zod";var Qr,go=R(()=>{"use strict";h();Te();Qr=M.extend({cascade:ru.string().optional().transform(r=>r==="true")})});import{z as bo}from"zod";var Jr,To=R(()=>{"use strict";h();Jr=bo.object({query:bo.string("Query is required")})});import{z as au}from"zod";var Eo,Xr,wo=R(()=>{"use strict";h();Te();Eo=["csv","xlsx","json"],Xr=M.extend({format:au.enum(Eo,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var So,su,Un,ou,qn,iu,Co=R(()=>{"use strict";h();Te();So=["primary","unique-constraint","index"],su=ce.object({indexName:ce.string(),columns:ce.array(ce.string()),isUnique:ce.boolean(),isSparse:ce.boolean().optional(),expireAfterSeconds:ce.number().nonnegative().optional(),method:ce.string().nullable(),kind:ce.enum(So),definition:ce.string().nullable()}),Un=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),ou=Un.extend({db:v.shape.db,tableName:ie.shape.tableName,schemaName:M.shape.schemaName}),qn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),iu=qn.extend({db:v.shape.db,schemaName:M.shape.schemaName})});import{z as E}from"zod";var Bn,k,Zr,ea,cu,ta,vt,lu,uu,mu,du,pu,fu,hu,Ro,yu,na,gu,bu,Tu,Eu,wu,Su,Cu,ra,Ru,Nu,Au,Du,_u,Ou,Iu,xu,Lu,Pu,$u,Mu,ku,vu,Uu,aa,sa,qu,No=R(()=>{"use strict";h();Bn=E.enum(["string","hash","list","set","zset","stream","unknown"]),k=E.object({base64:E.string().max(16*1024*1024).refine(r=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(r),"Invalid unpadded base64url value"),utf8:E.string().optional()}),Zr=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(200).default(50),search:E.string().max(512).optional(),exactPattern:E.stringbool().default(!1),type:Bn.exclude(["unknown"]).optional()}),ea=E.object({key:k,type:Bn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),cu=E.object({keys:E.array(ea),nextCursor:E.string().nullable(),hasMore:E.boolean()}),ta=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(500).default(100),full:E.stringbool().default(!1),direction:E.enum(["forward","backward"]).default("forward")}),vt=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),lu=E.object({kind:E.literal("string"),value:k,truncated:E.boolean()}),uu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k}))}),mu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:k}))}),du=E.object({kind:E.literal("set"),members:E.array(k)}),pu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),fu=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:k,value:k}))}))}),hu=E.object({kind:E.literal("unknown")}),Ro=E.discriminatedUnion("kind",[lu,uu,mu,du,pu,fu,hu]),yu=ea.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Ro,nextCursor:E.string().nullable(),hasMore:E.boolean()}),na=E.object({db:E.string(),offset:E.coerce.number().int().nonnegative().default(0),limit:E.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:E.string().optional()}),gu=E.object({chunk:k,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),bu=E.object({kind:E.literal("string"),value:k}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:k,value:k})).min(1)}),Eu=E.object({kind:E.literal("list"),entries:E.array(k).min(1)}),wu=E.object({kind:E.literal("set"),members:E.array(k).min(1)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:k,score:E.number()})).min(1)}),Cu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),ra=E.object({key:k,type:Bn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Cu]),ttlMs:E.number().int().positive().nullable().default(null)}),Ru=E.object({key:k,revision:E.string().nullable(),deleted:E.boolean()}),Nu=E.object({action:E.literal("rename"),newKey:k}),Au=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),Du=E.object({action:E.literal("setString"),value:k}),_u=E.object({action:E.literal("upsertHash"),field:k,value:k}),Ou=E.object({action:E.literal("deleteHash"),field:k}),Iu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:k}),xu=E.object({action:E.literal("setList"),index:E.number().int(),value:k}),Lu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Pu=E.object({action:E.literal("addSet"),member:k}),$u=E.object({action:E.literal("removeSet"),member:k}),Mu=E.object({action:E.literal("upsertZset"),member:k,score:E.number()}),ku=E.object({action:E.literal("removeZset"),member:k}),vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:k,value:k})).min(1)}),Uu=E.object({action:E.literal("deleteStream"),id:E.string()}),aa=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[Nu,Au,Du,_u,Ou,Iu,xu,Lu,Pu,$u,Mu,ku,vu,Uu])}),sa=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),qu=E.object({deleted:E.boolean()})});var Ao=R(()=>{"use strict";h()});import{z as oa}from"zod";var Fn,Bu,Fu,Do=R(()=>{"use strict";h();Te();On();Fn=oa.object({newColumnName:oa.string("New column name is required")}),Bu=Ee,Fu=oa.object({db:v.shape.db,tableName:Ee.shape.tableName,schemaName:M.shape.schemaName,columnName:Ee.shape.columnName,newColumnName:Fn.shape.newColumnName})});import{z as Hn}from"zod";var sn,Hu,Ku,_o=R(()=>{"use strict";h();Te();sn=Hn.object({newTableName:Hn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Hn.string().trim().min(1).optional()}),Hu=ie,Ku=Hn.object({db:v.shape.db,tableName:ie.shape.tableName,newTableName:sn.shape.newTableName,schemaName:sn.shape.schemaName})});import{z as Me}from"zod";var Oo,Io,ju,xo=R(()=>{"use strict";h();Oo=["fatal","error","warning","info","debug"],Io=Me.enum(Oo),ju=Me.object({ts:Me.string(),level:Io,rawLevel:Me.string(),source:Me.string().optional(),code:Me.string().optional(),message:Me.string(),durationMs:Me.number().optional(),statement:Me.string().optional(),detail:Me.record(Me.string(),Me.string())})});import{z as U}from"zod";var Lo,on,Po,$o,Wu,ia,Mo=R(()=>{"use strict";h();Te();Lo=U.object({columnName:U.string(),operator:U.string(),value:U.string()}),on=["asc","desc"],Po=U.object({columnName:U.string(),direction:U.enum(on)}),$o=U.object({limit:U.number(),total:U.number(),totalEstimated:U.boolean().optional(),hasNextPage:U.boolean(),hasPreviousPage:U.boolean(),nextCursor:U.string().nullable(),prevCursor:U.string().nullable()}),Wu=U.object({data:U.array(U.record(U.string(),U.unknown())),meta:$o}),ia=U.object({db:v.shape.db,schemaName:M.shape.schemaName,cursor:U.string().optional(),limit:U.string().optional().default("50").transform(Number),direction:U.enum(on).optional().default(on[0]),sort:U.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(U.union([U.string(),U.array(Po)])),order:U.enum(on).optional(),filters:U.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(U.array(Lo))})});import{z as cn}from"zod";var Vu,ko=R(()=>{"use strict";h();Vu=cn.object({tableName:cn.string("Table name is required"),schemaName:cn.string().optional(),rowCount:cn.coerce.number("Row count is required"),rowCountEstimated:cn.boolean().optional()})});import{z as vo}from"zod";var Yu,Uo=R(()=>{"use strict";h();Yu=vo.object({schema:vo.string()})});import{z as ke}from"zod";var ca,qo=R(()=>{"use strict";h();ca=ke.object({tableName:ke.string("Table name is required"),primaryKey:ke.string("Primary key is required").default("id"),primaryKeys:ke.array(ke.string().min(1)).min(1).optional(),updates:ke.array(ke.object({rowData:ke.record(ke.string("Column name is required"),ke.any()),columnName:ke.string("Column name is required"),value:ke.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Bo={};It(Bo,{AI_PROVIDERS:()=>zs,AI_PROVIDER_OPTIONS:()=>Gs,CONNECTION_COLORS:()=>ao,DATABASE_ENGINES:()=>K,DATABASE_TYPES:()=>Lt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>io,FORMAT_TYPES:()=>Eo,INDEX_KINDS:()=>So,SERVER_LOG_LEVELS:()=>Oo,StandardizedDataType:()=>b,addColumnParamSchema:()=>Hl,addColumnParamsSchema:()=>Kl,addColumnSchema:()=>Be,addRecordSchema:()=>xr,aiProviderSchema:()=>Lr,alterColumnParamSchema:()=>Yl,alterColumnParamsSchema:()=>zl,alterColumnSchema:()=>Pt,bulkInsertRecordsSchema:()=>kr,chatSchema:()=>vr,columnInfoSchema:()=>Zl,connectUrlSchema:()=>Vr,connectionColorSchema:()=>an,connectionInfoSchema:()=>nu,connectionSummarySchema:()=>so,connectionsStateSchema:()=>eu,createIndexParamsSchema:()=>ou,createIndexSchema:()=>Un,createKeySchema:()=>ra,createTableSchema:()=>Gr,currentDatabaseSchema:()=>Bl,dataTypesSchema:()=>to,databaseInfoSchema:()=>po,databaseListSchema:()=>tu,databaseSchema:()=>v,databaseTypeParamSchema:()=>Fl,databaseTypeSchema:()=>dt,dbTypeFromProtocol:()=>We,deleteColumnParamSchema:()=>Ee,deleteColumnParamsSchema:()=>Wl,deleteColumnQuerySchema:()=>Mr,deleteColumnSuccessResponseSchema:()=>Vl,deleteKeyQuerySchema:()=>sa,deleteKeyResultSchema:()=>qu,deleteRecordSchema:()=>vn,deleteTableQuerySchema:()=>Qr,dropIndexParamSchema:()=>qn,dropIndexParamsSchema:()=>iu,encodedRedisValueSchema:()=>k,executeQuerySchema:()=>Jr,exportTableSchema:()=>Xr,fieldDataSchema:()=>co,filterSchema:()=>Lo,foreignKeyActionSchema:()=>zr,foreignKeyDataSchema:()=>lo,getDefaultAiModel:()=>Pr,indexInfoSchema:()=>su,keyActionSchema:()=>aa,keyDetailsQuerySchema:()=>ta,keyDetailsResultSchema:()=>yu,keyParamSchema:()=>vt,keyRawQuerySchema:()=>na,keyRawResultSchema:()=>gu,keyScanQuerySchema:()=>Zr,keyScanResultSchema:()=>cu,keyWriteResultSchema:()=>Ru,mapClickhouseToDataType:()=>kn,mapDuckdbToDataType:()=>$n,mapMssqlToDataType:()=>Ln,mapMysqlToDataType:()=>xn,mapOracleToDataType:()=>Mn,mapPostgresToDataType:()=>In,mapSqliteToDataType:()=>Pn,redisKeySummarySchema:()=>ea,redisKeyTypeSchema:()=>Bn,redisKeyValueSchema:()=>Ro,renameColumnParamSchema:()=>Bu,renameColumnParamsSchema:()=>Fu,renameColumnSchema:()=>Fn,renameTableParamSchema:()=>Hu,renameTableParamsSchema:()=>Ku,renameTableSchema:()=>sn,serverLogEntrySchema:()=>ju,serverLogLevelSchema:()=>Io,sortDirections:()=>on,sortSchema:()=>Po,standardizeClickhouseDataTypeLabel:()=>Wr,standardizeDataTypeLabel:()=>qr,standardizeDuckdbDataTypeLabel:()=>Kr,standardizeMssqlDataTypeLabel:()=>Fr,standardizeMysqlDataTypeLabel:()=>Br,standardizeOracleDataTypeLabel:()=>jr,standardizeSqliteDataTypeLabel:()=>Hr,standardizedDataTypeSchema:()=>no,tableDataMetaSchema:()=>$o,tableDataQuerySchema:()=>ia,tableDataResultSchema:()=>Wu,tableInfoSchema:()=>Vu,tableNameSchema:()=>ie,tableQuerySchema:()=>M,tableSchemaResultSchema:()=>Yu,unwrapClickhouseType:()=>Mt,updateConnectionSchema:()=>Yr,updateRecordsSchema:()=>ca});var j=R(()=>{"use strict";h();Vs();Ys();$r();Qs();Js();Xs();Zs();eo();ro();Ur();oo();uo();Te();mo();fo();ho();On();yo();go();To();wo();Co();No();Ao();Do();_o();xo();Mo();ko();Uo();qo()});var zu,Gu,Qu,Kn,la=R(()=>{"use strict";h();j();zu=Object.values(K).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),Gu=new RegExp(`\\b(?:${zu}):\\/\\/\\S+`,"gi"),Qu=/\b(authToken=)[^&\s]+/gi,Kn=r=>r.replace(Gu,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(Qu,"$1[redacted]")});var d,X=R(()=>{"use strict";h();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}}});import{AsyncLocalStorage as Zu}from"async_hooks";import{randomUUID as Ho}from"crypto";var em,tm,jn,Ko,jo,it,ua,nm,rm,am,Wo,ma,fe,Z,Ve=R(()=>{"use strict";h();X();em=Ho(),tm=/^[A-Za-z0-9_-]{8,64}$/,jn=new Zu,Ko=r=>r&&tm.test(r)?r:Ho(),jo=(r,e)=>jn.run(r,e),it=()=>jn.getStore()?.requestId,ua=()=>jn.getStore()?.connectionId,nm=r=>{let e=r instanceof d?"HTTPException":r instanceof Error?r.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},rm=/^[A-Z0-9_-]{2,32}$/,am=[[/^timeout exceeded when trying to connect$/,"POOL_ACQUIRE_TIMEOUT"],[/^(timeout expired|Connection terminated due to connection timeout)$/,"CONNECT_TIMEOUT"],[/^Connection terminated/,"CONNECTION_TERMINATED"],[/^Client has encountered a connection error/,"CONNECTION_BROKEN"]],Wo=r=>{if(!(r instanceof Error))return;let{code:e,errno:t,number:n,cause:a}=r;return typeof n=="number"&&Number.isSafeInteger(n)?String(n):typeof e=="string"&&rm.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):r.name==="ReplyError"?r.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:am.find(([s])=>s.test(r.message))?.[1]??Wo(a)},ma=r=>r instanceof d&&r.cause?r.cause:r,fe=r=>{let e=ma(r);return{error_type:nm(e),error_code:Wo(e)}},Z=(r,e,t={})=>{let n=jn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:em,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
3
+ `)}});function _e(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||sm(e)}}catch(e){return Z("error","database_url_unparseable",fe(e)),{host:"localhost",port:5432}}}var Wn,sm,Vo,Ye=R(()=>{"use strict";h();j();Ve();Wn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},sm=r=>{let e=r.protocol.replace(":",""),t=We(e);return Wn[e]?.defaultPort??(t&&K[t].defaultPort)??5432},Vo=r=>{let e=new URL(r),t=Wn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Tt,da=R(()=>{Tt={name:"db-studio",type:"module",version:"2.0.1",description:"Every database. One studio. Browse tables, edit records, design schemas, and run queries across SQL, document, and key-value databases. Free and open source.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <husam@ql3.dev>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"Apache-2.0",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"portless run","dev:app":"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify",prepack:"cd ../web && bun run build && cd ../server && bun run build",start:`sh -c 'APP_PORT=\${PORT:-3333}; portless proxy start >/dev/null && portless alias db-studio "$APP_PORT" --force >/dev/null && HOST=127.0.0.1 PORT="$APP_PORT" DB_STUDIO_SERVER_URL=https://db-studio.localhost node dist/index.js'`,format:"biome check --write --unsafe",typecheck:"tsc --noEmit",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",e2e:"tsx e2e/contract.ts","e2e:perf":"tsx e2e/perf.ts","e2e:grid":"tsx e2e/grid.ts","e2e:schema-routing":"tsx e2e/schema-routing.ts","e2e:visualizer":"tsx e2e/visualizer.ts"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@clickhouse/client":"^1.24.0","@duckdb/node-api":"^1.5.6-r.1","@elysiajs/cors":"^1.4.2","@elysiajs/node":"^1.4.5","@libsql/client":"^0.18.0","@sentry/node":"^10.73.0",commander:"^15.0.0",dotenv:"^18.0.0",elysia:"^1.4.30",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",oracledb:"^7.0.1",pg:"^8.20.0",picocolors:"^1.1.1","posthog-node":"^5.20.0",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/oracledb":"^7.0.3","@types/pg":"^8.16.0","@vitest/coverage-v8":"^5.0.0","playwright-core":"1.61.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^5.0.0"}}});var ti={};It(ti,{captureInstallationActive:()=>ga,captureServerError:()=>ba,captureServerEvent:()=>Qn,databaseTypeForRequest:()=>mn,durationBucket:()=>ha,flushServerObservability:()=>Sm,getTelemetryConfig:()=>zn,initServerObservability:()=>ei,operationForRequest:()=>un,outcomeForStatus:()=>ya,resetTelemetryId:()=>fa,setTelemetryEnabled:()=>Gn,startServerSpan:()=>Ta});import{randomUUID as Jo}from"crypto";import{existsSync as mm,mkdirSync as dm,readFileSync as pm,writeFileSync as fm}from"fs";import{homedir as pa,platform as hm}from"os";import Vn from"path";import*as Le from"@sentry/node";import{PostHog as ym}from"posthog-node";var gm,Xo,Yn,bm,Tm,pt,Et,Em,wm,wt,ln,zn,Gn,fa,ha,ya,Zo,un,mn,ei,Sm,Qn,ga,Cm,ba,Ta,dn=R(()=>{"use strict";h();j();Ve();da();gm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",Xo=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Vn.join(pa(),".local","state"));return Vn.join(r||Vn.join(pa(),".db-studio"),"db-studio","telemetry.json")},Yn=r=>{try{let e=Xo();dm(Vn.dirname(e),{recursive:!0}),fm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},bm=()=>({installationId:Jo(),enabled:!0}),Tm=()=>{let r=Xo();try{if(mm(r)){let t=JSON.parse(pm(r,"utf8"));if(typeof t.installationId=="string"&&typeof t.enabled=="boolean")return{installationId:t.installationId,enabled:t.enabled,lastActiveAt:typeof t.lastActiveAt=="string"?t.lastActiveAt:void 0}}}catch{}let e=bm();return Yn(e),e},Em="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",wm="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",wt=()=>pt??=Tm(),ln=()=>!gm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&wt().enabled,zn=()=>({enabled:ln(),installationId:wt().installationId,appVersion:Tt.version}),Gn=r=>{pt={...wt(),enabled:r},Yn(pt),r?(Et?.enable(),ei()):(Et?.disable(),Le.close(500))},fa=()=>(pt={...wt(),installationId:Jo(),lastActiveAt:void 0},Yn(pt),pt.installationId),ha=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",ya=r=>r>=500?"server_error":r>=400?"client_error":"success",Zo=new RegExp(`^/api/(${Lt.join("|")})(?=/|$)`),un=(r,e)=>{let t=e.replace(Zo,"/api"),a=[[/^\/api\/databases(?:\/|$)/,"databases"],[/^\/api\/tables(?:\/|$)/,"tables"],[/^\/api\/records(?:\/|$)/,"records"],[/^\/api\/query(?:\/|$)/,"query"],[/^\/api\/keys(?:\/|$)/,"keys"],[/^\/api\/chat(?:\/|$)/,"chat"]].find(([s])=>s.test(t))?.[1]??"other";return`${r.toLowerCase()}_${a}`},mn=r=>r.match(Zo)?.[1],ei=()=>{if(!ln())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Em;r&&(!Le.isInitialized()||Le.getClient()?.getOptions().enabled===!1)&&Le.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${Tt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:wt().installationId},delete t.breadcrumbs,delete t.server_name,t},beforeSendSpan(t){return{...t,data:Object.fromEntries(Object.entries(t.data??{}).filter(([n])=>n.startsWith("db_studio.")))}}});let e=process.env.DB_STUDIO_POSTHOG_KEY??wm;e&&!Et&&(Et=new ym(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Sm=()=>Promise.allSettled([Et?.shutdown(2e3),Le.close(2e3)]),Qn=r=>{!ln()||!Et||Et.capture({distinctId:wt().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:Tt.version,$geoip_disable:!1}})},ga=()=>{if(!ln())return;let r=wt(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(pt={...r,lastActiveAt:new Date().toISOString()},Yn(pt),Qn({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:hm()}}))},Cm=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=pa(),s=r.stack.split(`
4
4
  `).slice(1).filter(o=>/^\s*at\s/.test(o)).map(o=>o.replaceAll(a,"~"));n.stack=[`${e}: ${t}`,...s].join(`
5
- `)}return n},ba=(r,{operation:e,status:t,dbType:n})=>{if(!ln()||t<500)return;let{error_type:a,error_code:s}=fe(r),o=it(),i=`${e} failed with ${t}${s?` ${s}`:""}`;xe.captureException(Cm(ma(r),a,i),{tags:{operation:e,source:"server",release:Tt.version,status:String(t),...n?{db_type:n}:{},error_type:a,...s?{error_code:s}:{},...o?{request_id:o}:{}},fingerprint:[e,String(t),a,s??"unknown"]})},Ta=(r,e,t)=>xe.startSpan({name:r,op:"http.server",attributes:{"db_studio.operation":r,...e?{"db_studio.db_type":e}:{}}},t)});var ni={};It(ni,{checkDatabaseConnection:()=>wa,getDatabaseConnectionDetails:()=>Nm});var Rm,Ea,Nm,wa,Sa=R(()=>{"use strict";h();j();Ye();Rm=2e3,Ea=async r=>{let e;try{return await Promise.race([r,new Promise((t,n)=>{e=setTimeout(()=>n(new Error("Database startup check timed out")),Rm)})])}finally{e&&clearTimeout(e)}},Nm=r=>{let e=We(r.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{label:t,defaultPort:n}=K[e];if(r.startsWith("sqlite://"))return{type:e,name:t,destination:"local file"};if(r.startsWith("d1://"))return{type:e,name:t,destination:"Cloudflare D1"};if(n===null)return{type:e,name:t,destination:new URL(r).host};let{host:a,port:s}=_e(r);return{type:e,name:t,destination:`${a}:${s}`}},wa=async r=>{switch(r.getDbType()){case"pg":await Ea(r.getPgPool().then(e=>e.query("SELECT 1")));return;case"mysql":await(await r.getMysqlPool()).query("SELECT 1");return;case"mssql":await(await r.getMssqlPool()).request().query("SELECT 1");return;case"mongodb":{await(await r.getMongoClient()).db(r.getMongoDbName()).command({ping:1});return}case"sqlite":await Ea(r.getSqliteClient().then(e=>e.execute("SELECT 1")));return;case"redis":await(await r.getRedisClient()).ping();return;case"duckdb":await r.withDuckdbConnection(e=>e.run("SELECT 1"));return;case"oracle":{let e=await(await r.getOraclePool()).getConnection();await e.execute("SELECT 1 FROM dual").finally(()=>e.close());return}case"clickhouse":await Ea(r.getClickhouseClient().then(e=>e.query({query:"SELECT 1"})))}}});import{randomUUID as Am}from"crypto";import{chmod as Dm,mkdir as _m,readFile as Om,rename as Im,writeFile as Lm}from"fs/promises";import{homedir as xm}from"os";import{basename as Pm,join as si,resolve as $m}from"path";import{z as ft}from"zod";var Mm,km,oi,Jn,ri,ii,vm,Um,qt,ci,qm,ai,Ca,Bm,Ra,Na,Aa,Da,li,ui,mi,di,_a=R(()=>{"use strict";h();j();X();Mm=ft.object({id:ft.string(),name:ft.string(),url:ft.string(),color:an.nullable(),lastUsedAt:ft.number()}),km=ft.object({version:ft.literal(1),connections:ft.array(Mm)}),oi=()=>process.env.DB_STUDIO_CONFIG_DIR??si(xm(),".dbstudio"),Jn=()=>si(oi(),"connections.json"),ri="\u2022\u2022\u2022\u2022",ii=/^(sqlite|duckdb):\/\/(.*)$/,vm=new Set(["authtoken","password","token"]),Um=r=>{try{return decodeURIComponent(r.replaceAll("+"," ")).toLowerCase()}catch{return r.toLowerCase()}},qt=r=>r.replace(/^([a-z][a-z0-9+.-]*:\/\/[^:/@?#]*:)[^/?#]*@/i,`$1${ri}@`).replace(/([?&])([^=&#]*)=[^&#]*/g,(e,t,n)=>vm.has(Um(n))?`${t}${n}=${ri}`:e),ci=(r,e=process.cwd())=>{let t=r.trim(),n=t.match(ii);if(!n)return t;let[,a,s=""]=n;return s===":memory:"||s.startsWith("/")?t:`${a}://${$m(e,s)}`},qm=r=>{let e=r.match(ii);if(e)return Pm(e[2]??"")||r;try{let t=new URL(r),n=decodeURIComponent(t.pathname.replace(/^\/+|\/+$/g,""));return n?`${t.hostname}/${n}`:t.hostname}catch{return qt(r)}},ai=r=>qt(r),Ca=async()=>{let r;try{r=await Om(Jn(),"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}let e=km.safeParse(JSON.parse(r));if(!e.success)throw new Error(`${Jn()} is not a valid connections file`);return e.data.connections},Bm=async r=>{let e=oi();await _m(e,{recursive:!0,mode:448}),await Dm(e,448);let t=`${Jn()}.${process.pid}.tmp`;await Lm(t,`${JSON.stringify({version:1,connections:r},null," ")}
6
- `,{mode:384}),await Im(t,Jn())},Ra=Promise.resolve(),Na=r=>{let e=Ra.then(async()=>{let[t,n]=r(await Ca());return await Bm(t),n});return Ra=e.catch(()=>{}),e},Aa=()=>new d(404,{message:"Saved connection not found"}),Da=()=>Ra.then(Ca,Ca),li=async r=>{let e=(await Da()).find(t=>t.id===r);if(!e)throw Aa();return e},ui=r=>Na(e=>{let t=e.find(a=>ai(a.url)===ai(r)),n=t?{...t,url:r,lastUsedAt:Date.now()}:{id:Am(),name:qm(r),url:r,color:null,lastUsedAt:Date.now()};return[t?e.map(a=>a.id===n.id?n:a):[...e,n],n]}),mi=(r,{name:e,color:t})=>Na(n=>{let a=n.find(o=>o.id===r);if(!a)throw Aa();let s={...a,name:e??a.name,color:t===void 0?a.color:t};return[n.map(o=>o.id===r?s:o),s]}),di=r=>Na(e=>{if(!e.some(t=>t.id===r))throw Aa();return[e.filter(t=>t.id!==r),void 0]})});import{statSync as Fm}from"fs";var Oa,Hm,pi,Ia=R(()=>{"use strict";h();Oa=r=>r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`,Hm=r=>{if(!r)return"in-memory";try{return Oa(Fm(r).size)}catch{return"N/A"}},pi=r=>({execute:e=>r.execute(e),batch:(e,t)=>r.batch(e,t),rebuildTable:async e=>{await r.migrate(e)},info:async()=>{let[e,t]=await Promise.all([r.execute("PRAGMA database_list"),r.execute("SELECT sqlite_version()")]),n=e.rows.find(a=>a.name==="main")?.file;return{name:"main",size:r.protocol==="file"?Hm(typeof n=="string"?n:""):"N/A",version:`SQLite ${t.rows[0]?.[0]}`}},close:()=>r.close()})});var yi,Km,jm,Wm,fi,hi,gi,bi=R(()=>{"use strict";h();X();Ia();yi=r=>{let{host:e,pathname:t,searchParams:n}=new URL(r),a=decodeURIComponent(t.slice(1)),s=n.get("authToken")||process.env.CLOUDFLARE_API_TOKEN;if(!e)throw new Error("The Cloudflare D1 URL has no account id: put it where the host goes");if(!a)throw new Error("The Cloudflare D1 URL has no database id: put it where the path goes");if(!s)throw new Error("The Cloudflare D1 URL has no authToken parameter and CLOUDFLARE_API_TOKEN is not set");return{accountId:e,databaseId:a,token:s}},Km=BigInt(Number.MIN_SAFE_INTEGER),jm=BigInt(Number.MAX_SAFE_INTEGER),Wm=r=>typeof r!="bigint"?r:r>=Km&&r<=jm?Number(r):r.toString(),fi=r=>typeof r=="string"?{sql:r,params:[]}:{sql:r.sql,params:r.args.map(Wm)},hi=({results:r,meta:e})=>({columns:r.columns,rows:r.rows.map(t=>t.map(n=>Array.isArray(n)?Uint8Array.from(n).buffer:n)),rowsAffected:e.changes}),gi=({accountId:r,databaseId:e,token:t})=>{let n=`https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(r)}/d1/database/${encodeURIComponent(e)}`,a=async(o,i)=>{let c=await fetch(`${n}${o}`,{method:i===void 0?"GET":"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:i===void 0?void 0:JSON.stringify(i),signal:AbortSignal.timeout(3e4)}),l=await c.text(),u;try{u=JSON.parse(l)}catch{u=void 0}let m=u?.errors?.[0]?.message;if(c.status===401||c.status===403)throw new Error(`${m??"Cloudflare D1 refused the API token"} (HTTP status ${c.status})`);if(!u?.success||u.result===null)throw new Error(m??`Cloudflare D1 request failed with HTTP status ${c.status}`);return u.result},s=async o=>o.length?(await a("/raw",{batch:o.map(fi)})).map(hi):[];return{execute:async o=>hi((await a("/raw",fi(o)))[0]),batch:s,rebuildTable:async(o,i)=>{if(i.length){let c=i.map(u=>`"${u}"`).join(", "),l=i.length===1?"references":"reference";throw new d(400,{message:`Cloudflare D1 always enforces foreign keys, so changing a column of a table that ${c} ${l} would delete or block their rows`})}await s(o)},info:async()=>{let{name:o,file_size:i}=await a("");return{name:o,size:Oa(i),version:"Cloudflare D1"}},close:()=>{}}}});var Vm,pn,ze,Ke,Ge,Bt,St=R(()=>{"use strict";h();Vm={pg:()=>import("pg"),mysql:()=>import("mysql2/promise"),mssql:()=>import("mssql").then(r=>r.default),mongodb:()=>import("mongodb"),sqlite:()=>import("@libsql/client"),redis:()=>import("ioredis"),duckdb:()=>import("@duckdb/node-api"),oracle:()=>import("oracledb").then(r=>r.default),clickhouse:()=>import("@clickhouse/client")},pn={},ze=async r=>{let e=pn[r]??await Vm[r]();return pn[r]=e,e},Ke=r=>{let e=pn[r];if(!e)throw new Error(`The ${r} driver is used before a connection opened`);return e},Ge=r=>pn.pg!==void 0&&r instanceof pn.pg.DatabaseError,Bt=r=>Ge(r)&&r.code?.startsWith("23")===!0});var za={};It(za,{DatabaseManager:()=>Ht,closeAllDbPools:()=>Qm,coerceObjectId:()=>gn,getClickhouseClient:()=>va,getConnectionUrl:()=>Ua,getDbPool:()=>$a,getDbType:()=>Ct,getIsolatedRedisClient:()=>Va,getMongoClient:()=>Ha,getMongoDb:()=>ja,getMongoDbName:()=>Ka,getMssqlPool:()=>ka,getMysqlPool:()=>Ma,getOpenConnection:()=>hn,getOraclePool:()=>Fa,getRedisClient:()=>Wa,getRedisDefaultDb:()=>Ya,getSqliteClient:()=>qa,isValidObjectId:()=>yn,latestConnectionId:()=>xa,openConnection:()=>La,requestConnectionId:()=>Pa,withDuckdbConnection:()=>Ba});import{resolve as Ym}from"path";import{pathToFileURL as zm}from"url";var Ft,Ht,fn,Xn,Gm,La,hn,xa,Pa,Ce,$a,Ma,ka,va,Ct,Ua,Qm,qa,Ba,Fa,Ha,Ka,ja,Wa,Va,Ya,yn,gn,Qe=R(()=>{"use strict";h();j();bi();St();X();Ve();Ia();Ye();Ft=r=>{try{return decodeURIComponent(r.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return r}},Ht=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;sqliteClient=null;duckdb=null;duckdbQueue=Promise.resolve();oraclePool=null;redisClients=new Map;redisClusterChecked=!1;clickhouseClients=new Map;baseConfig;constructor(e=null){this.baseConfig=e?this.parseConfig(e):null}detectDbType(e){let t=e.protocol.replace(":",""),n=We(t);if(n)return n;let a=Object.values(K).map(({label:s,protocols:o})=>`${s} (${o.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}parseConfig(e){let t=We(e.split("://")[0]);if(t&&K[t].defaultPort===null)return{url:e,host:"localhost",port:0,user:"",password:"",dbType:t};let n,a;try{n=Vo(e),a=new URL(n)}catch{throw new Error("The connection URL is not a valid URL")}let s=this.detectDbType(a);return{url:n,host:a.hostname,port:Number.parseInt(a.port,10)||(K[s].defaultPort??0),user:Ft(a.username),password:Ft(a.password),dbType:s}}config(){if(!this.baseConfig)throw new d(409,{message:"No database is connected"});return this.baseConfig}getDbType(){return this.config().dbType}getConnectionUrl(){return this.config().url}buildConnectionString(e){let t=this.config();if(K[t.dbType].defaultPort===null)return t.url;try{let n=new URL(t.url);return e&&(n.pathname=`/${encodeURIComponent(e)}`),n.toString()}catch(n){throw new Error(`Failed to build connection string for database "${e}": ${n instanceof Error?n.message:String(n)}`)}}getSqliteClient(){let{url:e,dbType:t}=this.config();if(t!=="sqlite")throw new Error("The connection is not a sqlite://, libsql:// or d1:// connection");return this.sqliteClient??=this.openSqliteClient(e).catch(n=>{throw this.sqliteClient=null,n}),this.sqliteClient}async openSqliteClient(e){if(e.startsWith("d1://"))return gi(yi(e));let t=e.startsWith("sqlite://")?e.slice(9):null,n=t===null?e:t===":memory:"?t:zm(Ym(t)).href,{createClient:a}=await ze("sqlite"),s=a({url:n,intMode:"bigint"});return s.protocol==="file"&&(await s.execute("PRAGMA journal_mode = WAL"),await s.execute("PRAGMA foreign_keys = ON")),pi(s)}async closeSqliteClient(){let e=this.sqliteClient;this.sqliteClient=null,e&&(await e.catch(()=>null))?.close()}withDuckdbConnection(e){let t=this.duckdbQueue.then(async()=>e((await this.openDuckdb()).connection));return this.duckdbQueue=t.catch(()=>{}),t}openDuckdb(){let e=this.config();if(e.dbType!=="duckdb")throw new Error("The connection is not a duckdb:// connection");if(!this.duckdb){let t=e.url.replace(/^duckdb:\/\//,"");this.duckdb=(async()=>{try{let{DuckDBInstance:n}=await ze("duckdb"),a=await n.create(t,{checkpoint_threshold:"0b"});return{instance:a,connection:await a.connect()}}catch(n){this.duckdb=null;let a=n instanceof Error?n.message:String(n);throw a.includes("Could not set lock on file")?new Error(`The DuckDB file "${t}" is locked by another process. Close the other program using it and try again. (${a})`):n}})()}return this.duckdb}async closeDuckdb(){let e=this.duckdb;this.duckdb=null;let t=await e?.catch(()=>null);t?.connection.closeSync(),t?.instance.closeSync()}getOraclePool(){let{url:e,host:t,port:n,user:a,password:s,dbType:o}=this.config();if(o!=="oracle")throw new Error("The connection is not an oracle:// connection");let i=decodeURIComponent(new URL(e).pathname.slice(1));return this.oraclePool??=ze("oracle").then(c=>c.createPool({user:a,password:s,connectString:`${t}:${n}/${i}`,poolMin:0,poolMax:10,connectTimeout:5,sessionCallback:(l,u,m)=>{l.execute("ALTER SESSION SET TIME_ZONE = '+00:00'").then(()=>l.execute(`ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9' NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM' NLS_NUMERIC_CHARACTERS = '.,'`)).then(()=>m(),m)}})).catch(c=>{throw this.oraclePool=null,c}),this.oraclePool}async closeOraclePool(){let e=this.oraclePool;this.oraclePool=null,await(await e?.catch(()=>null))?.close(0)}async getPgPool(e){let t=this.buildConnectionString(e),{Pool:n}=await ze("pg");if(!this.pgPools.has(t)){let a={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:1e4},s=new n({...a,onConnect:o=>o.query(`SELECT set_config(
5
+ `)}return n},ba=(r,{operation:e,status:t,dbType:n})=>{if(!ln()||t<500)return;let{error_type:a,error_code:s}=fe(r),o=it(),i=`${e} failed with ${t}${s?` ${s}`:""}`;Le.captureException(Cm(ma(r),a,i),{tags:{operation:e,source:"server",release:Tt.version,status:String(t),...n?{db_type:n}:{},error_type:a,...s?{error_code:s}:{},...o?{request_id:o}:{}},fingerprint:[e,String(t),a,s??"unknown"]})},Ta=(r,e,t)=>Le.startSpan({name:r,op:"http.server",attributes:{"db_studio.operation":r,...e?{"db_studio.db_type":e}:{}}},t)});var ni={};It(ni,{checkDatabaseConnection:()=>wa,getDatabaseConnectionDetails:()=>Nm});var Rm,Ea,Nm,wa,Sa=R(()=>{"use strict";h();j();Ye();Rm=2e3,Ea=async r=>{let e;try{return await Promise.race([r,new Promise((t,n)=>{e=setTimeout(()=>n(new Error("Database startup check timed out")),Rm)})])}finally{e&&clearTimeout(e)}},Nm=r=>{let e=We(r.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{label:t,defaultPort:n}=K[e];if(r.startsWith("sqlite://"))return{type:e,name:t,destination:"local file"};if(r.startsWith("d1://"))return{type:e,name:t,destination:"Cloudflare D1"};if(n===null)return{type:e,name:t,destination:new URL(r).host};let{host:a,port:s}=_e(r);return{type:e,name:t,destination:`${a}:${s}`}},wa=async r=>{switch(r.getDbType()){case"pg":await Ea(r.getPgPool().then(e=>e.query("SELECT 1")));return;case"mysql":await(await r.getMysqlPool()).query("SELECT 1");return;case"mssql":await(await r.getMssqlPool()).request().query("SELECT 1");return;case"mongodb":{await(await r.getMongoClient()).db(r.getMongoDbName()).command({ping:1});return}case"sqlite":await Ea(r.getSqliteClient().then(e=>e.execute("SELECT 1")));return;case"redis":await(await r.getRedisClient()).ping();return;case"duckdb":await r.withDuckdbConnection(e=>e.run("SELECT 1"));return;case"oracle":{let e=await(await r.getOraclePool()).getConnection();await e.execute("SELECT 1 FROM dual").finally(()=>e.close());return}case"clickhouse":await Ea(r.getClickhouseClient().then(e=>e.query({query:"SELECT 1"})))}}});import{randomUUID as Am}from"crypto";import{chmod as Dm,mkdir as _m,readFile as Om,rename as Im,writeFile as xm}from"fs/promises";import{homedir as Lm}from"os";import{basename as Pm,join as si,resolve as $m}from"path";import{z as ft}from"zod";var Mm,km,oi,Jn,ri,ii,vm,Um,qt,ci,qm,ai,Ca,Bm,Ra,Na,Aa,Da,li,ui,mi,di,_a=R(()=>{"use strict";h();j();X();Mm=ft.object({id:ft.string(),name:ft.string(),url:ft.string(),color:an.nullable(),lastUsedAt:ft.number()}),km=ft.object({version:ft.literal(1),connections:ft.array(Mm)}),oi=()=>process.env.DB_STUDIO_CONFIG_DIR??si(Lm(),".dbstudio"),Jn=()=>si(oi(),"connections.json"),ri="\u2022\u2022\u2022\u2022",ii=/^(sqlite|duckdb):\/\/(.*)$/,vm=new Set(["authtoken","password","token"]),Um=r=>{try{return decodeURIComponent(r.replaceAll("+"," ")).toLowerCase()}catch{return r.toLowerCase()}},qt=r=>r.replace(/^([a-z][a-z0-9+.-]*:\/\/[^:/@?#]*:)[^/?#]*@/i,`$1${ri}@`).replace(/([?&])([^=&#]*)=[^&#]*/g,(e,t,n)=>vm.has(Um(n))?`${t}${n}=${ri}`:e),ci=(r,e=process.cwd())=>{let t=r.trim(),n=t.match(ii);if(!n)return t;let[,a,s=""]=n;return s===":memory:"||s.startsWith("/")?t:`${a}://${$m(e,s)}`},qm=r=>{let e=r.match(ii);if(e)return Pm(e[2]??"")||r;try{let t=new URL(r),n=decodeURIComponent(t.pathname.replace(/^\/+|\/+$/g,""));return n?`${t.hostname}/${n}`:t.hostname}catch{return qt(r)}},ai=r=>qt(r),Ca=async()=>{let r;try{r=await Om(Jn(),"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}let e=km.safeParse(JSON.parse(r));if(!e.success)throw new Error(`${Jn()} is not a valid connections file`);return e.data.connections},Bm=async r=>{let e=oi();await _m(e,{recursive:!0,mode:448}),await Dm(e,448);let t=`${Jn()}.${process.pid}.tmp`;await xm(t,`${JSON.stringify({version:1,connections:r},null," ")}
6
+ `,{mode:384}),await Im(t,Jn())},Ra=Promise.resolve(),Na=r=>{let e=Ra.then(async()=>{let[t,n]=r(await Ca());return await Bm(t),n});return Ra=e.catch(()=>{}),e},Aa=()=>new d(404,{message:"Saved connection not found"}),Da=()=>Ra.then(Ca,Ca),li=async r=>{let e=(await Da()).find(t=>t.id===r);if(!e)throw Aa();return e},ui=r=>Na(e=>{let t=e.find(a=>ai(a.url)===ai(r)),n=t?{...t,url:r,lastUsedAt:Date.now()}:{id:Am(),name:qm(r),url:r,color:null,lastUsedAt:Date.now()};return[t?e.map(a=>a.id===n.id?n:a):[...e,n],n]}),mi=(r,{name:e,color:t})=>Na(n=>{let a=n.find(o=>o.id===r);if(!a)throw Aa();let s={...a,name:e??a.name,color:t===void 0?a.color:t};return[n.map(o=>o.id===r?s:o),s]}),di=r=>Na(e=>{if(!e.some(t=>t.id===r))throw Aa();return[e.filter(t=>t.id!==r),void 0]})});import{statSync as Fm}from"fs";var Oa,Hm,pi,Ia=R(()=>{"use strict";h();Oa=r=>r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`,Hm=r=>{if(!r)return"in-memory";try{return Oa(Fm(r).size)}catch{return"N/A"}},pi=r=>({execute:e=>r.execute(e),batch:(e,t)=>r.batch(e,t),rebuildTable:async e=>{await r.migrate(e)},info:async()=>{let[e,t]=await Promise.all([r.execute("PRAGMA database_list"),r.execute("SELECT sqlite_version()")]),n=e.rows.find(a=>a.name==="main")?.file;return{name:"main",size:r.protocol==="file"?Hm(typeof n=="string"?n:""):"N/A",version:`SQLite ${t.rows[0]?.[0]}`}},close:()=>r.close()})});var yi,Km,jm,Wm,fi,hi,gi,bi=R(()=>{"use strict";h();X();Ia();yi=r=>{let{host:e,pathname:t,searchParams:n}=new URL(r),a=decodeURIComponent(t.slice(1)),s=n.get("authToken")||process.env.CLOUDFLARE_API_TOKEN;if(!e)throw new Error("The Cloudflare D1 URL has no account id: put it where the host goes");if(!a)throw new Error("The Cloudflare D1 URL has no database id: put it where the path goes");if(!s)throw new Error("The Cloudflare D1 URL has no authToken parameter and CLOUDFLARE_API_TOKEN is not set");return{accountId:e,databaseId:a,token:s}},Km=BigInt(Number.MIN_SAFE_INTEGER),jm=BigInt(Number.MAX_SAFE_INTEGER),Wm=r=>typeof r!="bigint"?r:r>=Km&&r<=jm?Number(r):r.toString(),fi=r=>typeof r=="string"?{sql:r,params:[]}:{sql:r.sql,params:r.args.map(Wm)},hi=({results:r,meta:e})=>({columns:r.columns,rows:r.rows.map(t=>t.map(n=>Array.isArray(n)?Uint8Array.from(n).buffer:n)),rowsAffected:e.changes}),gi=({accountId:r,databaseId:e,token:t})=>{let n=`https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(r)}/d1/database/${encodeURIComponent(e)}`,a=async(o,i)=>{let c=await fetch(`${n}${o}`,{method:i===void 0?"GET":"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:i===void 0?void 0:JSON.stringify(i),signal:AbortSignal.timeout(3e4)}),l=await c.text(),u;try{u=JSON.parse(l)}catch{u=void 0}let m=u?.errors?.[0]?.message;if(c.status===401||c.status===403)throw new Error(`${m??"Cloudflare D1 refused the API token"} (HTTP status ${c.status})`);if(!u?.success||u.result===null)throw new Error(m??`Cloudflare D1 request failed with HTTP status ${c.status}`);return u.result},s=async o=>o.length?(await a("/raw",{batch:o.map(fi)})).map(hi):[];return{execute:async o=>hi((await a("/raw",fi(o)))[0]),batch:s,rebuildTable:async(o,i)=>{if(i.length){let c=i.map(u=>`"${u}"`).join(", "),l=i.length===1?"references":"reference";throw new d(400,{message:`Cloudflare D1 always enforces foreign keys, so changing a column of a table that ${c} ${l} would delete or block their rows`})}await s(o)},info:async()=>{let{name:o,file_size:i}=await a("");return{name:o,size:Oa(i),version:"Cloudflare D1"}},close:()=>{}}}});var Vm,pn,ze,Ke,Ge,Bt,St=R(()=>{"use strict";h();Vm={pg:()=>import("pg"),mysql:()=>import("mysql2/promise"),mssql:()=>import("mssql").then(r=>r.default),mongodb:()=>import("mongodb"),sqlite:()=>import("@libsql/client"),redis:()=>import("ioredis"),duckdb:()=>import("@duckdb/node-api"),oracle:()=>import("oracledb").then(r=>r.default),clickhouse:()=>import("@clickhouse/client")},pn={},ze=async r=>{let e=pn[r]??await Vm[r]();return pn[r]=e,e},Ke=r=>{let e=pn[r];if(!e)throw new Error(`The ${r} driver is used before a connection opened`);return e},Ge=r=>pn.pg!==void 0&&r instanceof pn.pg.DatabaseError,Bt=r=>Ge(r)&&r.code?.startsWith("23")===!0});var za={};It(za,{DatabaseManager:()=>Ht,closeAllDbPools:()=>Qm,coerceObjectId:()=>gn,getClickhouseClient:()=>va,getConnectionUrl:()=>Ua,getDbPool:()=>$a,getDbType:()=>Ct,getIsolatedRedisClient:()=>Va,getMongoClient:()=>Ha,getMongoDb:()=>ja,getMongoDbName:()=>Ka,getMssqlPool:()=>ka,getMysqlPool:()=>Ma,getOpenConnection:()=>hn,getOraclePool:()=>Fa,getRedisClient:()=>Wa,getRedisDefaultDb:()=>Ya,getSqliteClient:()=>qa,isValidObjectId:()=>yn,latestConnectionId:()=>La,openConnection:()=>xa,requestConnectionId:()=>Pa,withDuckdbConnection:()=>Ba});import{resolve as Ym}from"path";import{pathToFileURL as zm}from"url";var Ft,Ht,fn,Xn,Gm,xa,hn,La,Pa,Ce,$a,Ma,ka,va,Ct,Ua,Qm,qa,Ba,Fa,Ha,Ka,ja,Wa,Va,Ya,yn,gn,Qe=R(()=>{"use strict";h();j();bi();St();X();Ve();Ia();Ye();Ft=r=>{try{return decodeURIComponent(r.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return r}},Ht=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;sqliteClient=null;duckdb=null;duckdbQueue=Promise.resolve();oraclePool=null;redisClients=new Map;redisClusterChecked=!1;clickhouseClients=new Map;baseConfig;constructor(e=null){this.baseConfig=e?this.parseConfig(e):null}detectDbType(e){let t=e.protocol.replace(":",""),n=We(t);if(n)return n;let a=Object.values(K).map(({label:s,protocols:o})=>`${s} (${o.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}parseConfig(e){let t=We(e.split("://")[0]);if(t&&K[t].defaultPort===null)return{url:e,host:"localhost",port:0,user:"",password:"",dbType:t};let n,a;try{n=Vo(e),a=new URL(n)}catch{throw new Error("The connection URL is not a valid URL")}let s=this.detectDbType(a);return{url:n,host:a.hostname,port:Number.parseInt(a.port,10)||(K[s].defaultPort??0),user:Ft(a.username),password:Ft(a.password),dbType:s}}config(){if(!this.baseConfig)throw new d(409,{message:"No database is connected"});return this.baseConfig}getDbType(){return this.config().dbType}getConnectionUrl(){return this.config().url}buildConnectionString(e){let t=this.config();if(K[t.dbType].defaultPort===null)return t.url;try{let n=new URL(t.url);return e&&(n.pathname=`/${encodeURIComponent(e)}`),n.toString()}catch(n){throw new Error(`Failed to build connection string for database "${e}": ${n instanceof Error?n.message:String(n)}`)}}getSqliteClient(){let{url:e,dbType:t}=this.config();if(t!=="sqlite")throw new Error("The connection is not a sqlite://, libsql:// or d1:// connection");return this.sqliteClient??=this.openSqliteClient(e).catch(n=>{throw this.sqliteClient=null,n}),this.sqliteClient}async openSqliteClient(e){if(e.startsWith("d1://"))return gi(yi(e));let t=e.startsWith("sqlite://")?e.slice(9):null,n=t===null?e:t===":memory:"?t:zm(Ym(t)).href,{createClient:a}=await ze("sqlite"),s=a({url:n,intMode:"bigint"});return s.protocol==="file"&&(await s.execute("PRAGMA journal_mode = WAL"),await s.execute("PRAGMA foreign_keys = ON")),pi(s)}async closeSqliteClient(){let e=this.sqliteClient;this.sqliteClient=null,e&&(await e.catch(()=>null))?.close()}withDuckdbConnection(e){let t=this.duckdbQueue.then(async()=>e((await this.openDuckdb()).connection));return this.duckdbQueue=t.catch(()=>{}),t}openDuckdb(){let e=this.config();if(e.dbType!=="duckdb")throw new Error("The connection is not a duckdb:// connection");if(!this.duckdb){let t=e.url.replace(/^duckdb:\/\//,"");this.duckdb=(async()=>{try{let{DuckDBInstance:n}=await ze("duckdb"),a=await n.create(t,{checkpoint_threshold:"0b"});return{instance:a,connection:await a.connect()}}catch(n){this.duckdb=null;let a=n instanceof Error?n.message:String(n);throw a.includes("Could not set lock on file")?new Error(`The DuckDB file "${t}" is locked by another process. Close the other program using it and try again. (${a})`):n}})()}return this.duckdb}async closeDuckdb(){let e=this.duckdb;this.duckdb=null;let t=await e?.catch(()=>null);t?.connection.closeSync(),t?.instance.closeSync()}getOraclePool(){let{url:e,host:t,port:n,user:a,password:s,dbType:o}=this.config();if(o!=="oracle")throw new Error("The connection is not an oracle:// connection");let i=decodeURIComponent(new URL(e).pathname.slice(1));return this.oraclePool??=ze("oracle").then(c=>c.createPool({user:a,password:s,connectString:`${t}:${n}/${i}`,poolMin:0,poolMax:10,connectTimeout:5,sessionCallback:(l,u,m)=>{l.execute("ALTER SESSION SET TIME_ZONE = '+00:00'").then(()=>l.execute(`ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9' NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM' NLS_NUMERIC_CHARACTERS = '.,'`)).then(()=>m(),m)}})).catch(c=>{throw this.oraclePool=null,c}),this.oraclePool}async closeOraclePool(){let e=this.oraclePool;this.oraclePool=null,await(await e?.catch(()=>null))?.close(0)}async getPgPool(e){let t=this.buildConnectionString(e),{Pool:n}=await ze("pg");if(!this.pgPools.has(t)){let a={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:1e4},s=new n({...a,onConnect:o=>o.query(`SELECT set_config(
7
7
  'search_path',
8
8
  COALESCE(
9
9
  'public, ' || string_agg(quote_ident(nspname), ', ' ORDER BY nspname),
@@ -14,7 +14,7 @@ var Pl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var It=(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",...fe(i)})})});s.on("error",o=>{Z("error","db_pool_error",{db_type:"pg",...fe(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 ze("mysql");if(!this.mysqlPools.has(n)){let s=new URL(n),o=Ft(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.mysqlPools.set(n,i)}return this.mysqlPools.get(n)}async getMssqlPool(e){let t=this.config(),n=this.buildConnectionString(e),a=await ze("mssql");if(!this.mssqlPools.has(n)){let s=new URL(n),o=Ft(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",...fe(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=Ft(n.pathname.slice(1))||"default",{ClickHouseLogLevel:s,createClient:o}=await ze("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},log:{level:s.OFF}});return this.clickhouseClients.set(a,l),l}async getMongoClient(){if(!this.mongoClient){let{url:e}=this.config(),{MongoClient:t}=await ze("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 Ft(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 ze("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()}},fn=new Map,Xn=null,Gm=new Ht,La=(r,e)=>{fn.set(r,e),Xn=r},hn=r=>fn.get(r),xa=()=>Xn,Pa=()=>{let r=ua();return r&&fn.has(r)?r:Xn},Ce=()=>fn.get(ua()??Xn??"")??Gm,$a=r=>Ce().getPgPool(r),Ma=r=>Ce().getMysqlPool(r),ka=async r=>Ce().getMssqlPool(r),va=r=>Ce().getClickhouseClient(r),Ct=()=>Ce().getDbType(),Ua=()=>Ce().getConnectionUrl(),Qm=async()=>{await Promise.all([...fn.values()].map(r=>r.closeAll()))},qa=()=>Ce().getSqliteClient(),Ba=r=>Ce().withDuckdbConnection(r),Fa=()=>Ce().getOraclePool(),Ha=()=>Ce().getMongoClient(),Ka=()=>Ce().getMongoDbName(),ja=r=>Ce().getMongoDb(r),Wa=r=>Ce().getRedisClient(r),Va=r=>Ce().getIsolatedRedisClient(r),Ya=()=>Ce().getRedisDefaultDb(),yn=r=>typeof r=="string"&&Ke("mongodb").ObjectId.isValid(r),gn=r=>{let{ObjectId:e}=Ke("mongodb");return typeof r=="string"&&e.isValid(r)?new e(r):r}});var Si={};It(Si,{connect:()=>Zn,connectSaved:()=>Qa,getConnectionsState:()=>bn,summarize:()=>Ja});import{randomUUID as Jm}from"crypto";import{access as Xm}from"fs/promises";var Ti,Ga,Zm,Ei,ed,Zn,Qa,wi,bn,Ja,Xa=R(()=>{"use strict";h();j();Sa();la();_a();Qe();X();Ve();Ti=Promise.resolve(),Ga=new Map,Zm=/^(?:sqlite|duckdb):\/\/(.+)$/,Ei=r=>Kn(r instanceof Error?r.message:String(r)),ed=async r=>{let e=[...Ga].find(([,a])=>a===r)?.[0];if(e)return e;let t;try{t=new Ht(r)}catch(a){throw new d(400,{message:Ei(a),cause:a})}try{await wa(t)}catch(a){throw await t.closeAll().catch(()=>{}),new d(400,{message:`Could not connect: ${Ei(a)}`,cause:a})}let n=Jm();return La(n,t),Ga.set(n,r),n},Zn=(r,{requireExistingFile:e=!1}={})=>{let t=ci(r),n=Ti.then(async()=>{let a=t.match(Zm)?.[1];e&&a&&a!==":memory:"&&await Xm(a).catch(()=>{throw new d(400,{message:`No database file at ${a}`})});let s=await ed(t);return await ui(t).catch(o=>{Z("warn","connection_save_failed",fe(o))}),s});return Ti=n.catch(()=>{}),n},Qa=async r=>{let e=await li(r);return Zn(e.url,{requireExistingFile:!0})},wi=r=>{let e=We(r.url.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{id:t,name:n,color:a,lastUsedAt:s}=r;return{id:t,name:n,color:a,lastUsedAt:s,dbType:e,maskedUrl:qt(r.url)}},bn=async(r=Pa())=>{let e=await Da(),t=e.map(wi).filter(s=>s!==null).sort((s,o)=>o.lastUsedAt-s.lastUsedAt),n=r&&Ga.get(r),a=r&&hn(r);return!r||!n||!a?{connections:t,active:null}:{connections:t,active:{id:e.find(s=>qt(s.url)===qt(n))?.id??null,dbType:a.getDbType(),connectionId:r}}},Ja=r=>{let e=wi(r);if(!e)throw new d(500,{message:"Saved connection has an unknown engine"});return e}});function Kt(r){return ge.get(r)}function Ci(r,e){if(!td(r))throw new d(400,{message:`Key browsing is not supported for database type: "${e}"`});return r}var Za,ge,td,Rt=R(()=>{"use strict";h();X();Za=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()]}},ge=new Za;td=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 nd(){throw new d(400,{message:"Server logs are not supported for this database type"})}function es(){throw new d(400,{message:"Indexes are not supported for this database type"})}var ct,re,Je=R(()=>{"use strict";h();St();X();ct=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 Ge(e)&&e.code==="42501"||e.name==="RequestError"&&(a===229||a===230)?new d(403,{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."||Ge(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}),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 es()}createIndex(e){return es()}dropIndex(e){return es()}getServerLogs(e){return nd()}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,F,B,V,ts,ns,er,tr,te,Re,nr,Nt,At,ve,Xe=R(()=>{"use strict";h();Qe();W=r=>$a(r),F=r=>Ma(r),B=r=>ka(r),V=()=>qa(),ts=r=>Ba(r),ns=()=>Fa(),er=()=>Ha(),tr=()=>Ka(),te=r=>ja(r),Re=r=>Wa(r),nr=r=>Va(r),Nt=()=>Ya(),At=r=>va(r),ve=()=>Ua()});var Pe,ne,Oe,he,lt=R(()=>{"use strict";h();Pe="/* 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 Ri(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=rs(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 Ni(r,e,t){let n=Array.isArray(r)?r:r?[{columnName:r,direction:e}]:[],a=(n[0]?.direction??e).toUpperCase(),s=[...n.map(o=>`${rs(o.columnName)} ${o.direction.toUpperCase()}`),...t.map(o=>`${o} ${a}`)];return s.length?`ORDER BY ${s.join(", ")}`:""}function rd(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 rr(r,e){let t=rs(r.columnName);if(r.isIdentity||/serial/i.test(r.columnType))return`${t} UInt64 DEFAULT generateSnowflakeID()`;let n=rd(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 ${ad[o.toLowerCase()]??o}`),s}var ae,rs,ad,Ai=R(()=>{"use strict";h();ae=r=>`\`${r.replaceAll("\\","\\\\").replaceAll("`","\\`")}\``,rs=ae;ad={"now()":"now()",current_timestamp:"now()","current_timestamp()":"now()",current_date:"today()","gen_random_uuid()":"generateUUIDv4()","uuid_generate_v4()":"generateUUIDv4()"}});import{ClickHouseError as Di}from"@clickhouse/client";var sd,_i,od,id,ar,Oi=R(()=>{"use strict";h();j();Je();Xe();lt();X();Ye();Ai();sd={mutations_sync:"2"},_i=r=>/^(LowCardinality\()?Nullable\(/.test(r),od=(r,e)=>{if(r==null)return null;let t=Mt(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},id={Fatal:"fatal",Critical:"fatal",Error:"error",Warning:"warning"},ar=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 kn(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",...fe(i)})})});s.on("error",o=>{Z("error","db_pool_error",{db_type:"pg",...fe(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 ze("mysql");if(!this.mysqlPools.has(n)){let s=new URL(n),o=Ft(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.mysqlPools.set(n,i)}return this.mysqlPools.get(n)}async getMssqlPool(e){let t=this.config(),n=this.buildConnectionString(e),a=await ze("mssql");if(!this.mssqlPools.has(n)){let s=new URL(n),o=Ft(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",...fe(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=Ft(n.pathname.slice(1))||"default",{ClickHouseLogLevel:s,createClient:o}=await ze("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},log:{level:s.OFF}});return this.clickhouseClients.set(a,l),l}async getMongoClient(){if(!this.mongoClient){let{url:e}=this.config(),{MongoClient:t}=await ze("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 Ft(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 ze("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()}},fn=new Map,Xn=null,Gm=new Ht,xa=(r,e)=>{fn.set(r,e),Xn=r},hn=r=>fn.get(r),La=()=>Xn,Pa=()=>{let r=ua();return r&&fn.has(r)?r:Xn},Ce=()=>fn.get(ua()??Xn??"")??Gm,$a=r=>Ce().getPgPool(r),Ma=r=>Ce().getMysqlPool(r),ka=async r=>Ce().getMssqlPool(r),va=r=>Ce().getClickhouseClient(r),Ct=()=>Ce().getDbType(),Ua=()=>Ce().getConnectionUrl(),Qm=async()=>{await Promise.all([...fn.values()].map(r=>r.closeAll()))},qa=()=>Ce().getSqliteClient(),Ba=r=>Ce().withDuckdbConnection(r),Fa=()=>Ce().getOraclePool(),Ha=()=>Ce().getMongoClient(),Ka=()=>Ce().getMongoDbName(),ja=r=>Ce().getMongoDb(r),Wa=r=>Ce().getRedisClient(r),Va=r=>Ce().getIsolatedRedisClient(r),Ya=()=>Ce().getRedisDefaultDb(),yn=r=>typeof r=="string"&&Ke("mongodb").ObjectId.isValid(r),gn=r=>{let{ObjectId:e}=Ke("mongodb");return typeof r=="string"&&e.isValid(r)?new e(r):r}});var Si={};It(Si,{connect:()=>Zn,connectSaved:()=>Qa,getConnectionsState:()=>bn,summarize:()=>Ja});import{randomUUID as Jm}from"crypto";import{access as Xm}from"fs/promises";var Ti,Ga,Zm,Ei,ed,Zn,Qa,wi,bn,Ja,Xa=R(()=>{"use strict";h();j();Sa();la();_a();Qe();X();Ve();Ti=Promise.resolve(),Ga=new Map,Zm=/^(?:sqlite|duckdb):\/\/(.+)$/,Ei=r=>Kn(r instanceof Error?r.message:String(r)),ed=async r=>{let e=[...Ga].find(([,a])=>a===r)?.[0];if(e)return e;let t;try{t=new Ht(r)}catch(a){throw new d(400,{message:Ei(a),cause:a})}try{await wa(t)}catch(a){throw await t.closeAll().catch(()=>{}),new d(400,{message:`Could not connect: ${Ei(a)}`,cause:a})}let n=Jm();return xa(n,t),Ga.set(n,r),n},Zn=(r,{requireExistingFile:e=!1}={})=>{let t=ci(r),n=Ti.then(async()=>{let a=t.match(Zm)?.[1];e&&a&&a!==":memory:"&&await Xm(a).catch(()=>{throw new d(400,{message:`No database file at ${a}`})});let s=await ed(t);return await ui(t).catch(o=>{Z("warn","connection_save_failed",fe(o))}),s});return Ti=n.catch(()=>{}),n},Qa=async r=>{let e=await li(r);return Zn(e.url,{requireExistingFile:!0})},wi=r=>{let e=We(r.url.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{id:t,name:n,color:a,lastUsedAt:s}=r;return{id:t,name:n,color:a,lastUsedAt:s,dbType:e,maskedUrl:qt(r.url)}},bn=async(r=Pa())=>{let e=await Da(),t=e.map(wi).filter(s=>s!==null).sort((s,o)=>o.lastUsedAt-s.lastUsedAt),n=r&&Ga.get(r),a=r&&hn(r);return!r||!n||!a?{connections:t,active:null}:{connections:t,active:{id:e.find(s=>qt(s.url)===qt(n))?.id??null,dbType:a.getDbType(),connectionId:r}}},Ja=r=>{let e=wi(r);if(!e)throw new d(500,{message:"Saved connection has an unknown engine"});return e}});function Kt(r){return ge.get(r)}function Ci(r,e){if(!td(r))throw new d(400,{message:`Key browsing is not supported for database type: "${e}"`});return r}var Za,ge,td,Rt=R(()=>{"use strict";h();X();Za=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()]}},ge=new Za;td=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 nd(){throw new d(400,{message:"Server logs are not supported for this database type"})}function es(){throw new d(400,{message:"Indexes are not supported for this database type"})}var ct,re,Je=R(()=>{"use strict";h();St();X();ct=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 Ge(e)&&e.code==="42501"||e.name==="RequestError"&&(a===229||a===230)?new d(403,{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."||Ge(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}),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 es()}createIndex(e){return es()}dropIndex(e){return es()}getServerLogs(e){return nd()}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,F,B,V,ts,ns,er,tr,te,Re,nr,Nt,At,ve,Xe=R(()=>{"use strict";h();Qe();W=r=>$a(r),F=r=>Ma(r),B=r=>ka(r),V=()=>qa(),ts=r=>Ba(r),ns=()=>Fa(),er=()=>Ha(),tr=()=>Ka(),te=r=>ja(r),Re=r=>Wa(r),nr=r=>Va(r),Nt=()=>Ya(),At=r=>va(r),ve=()=>Ua()});var Pe,ne,Oe,he,lt=R(()=>{"use strict";h();Pe="/* 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 Ri(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=rs(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 Ni(r,e,t){let n=Array.isArray(r)?r:r?[{columnName:r,direction:e}]:[],a=(n[0]?.direction??e).toUpperCase(),s=[...n.map(o=>`${rs(o.columnName)} ${o.direction.toUpperCase()}`),...t.map(o=>`${o} ${a}`)];return s.length?`ORDER BY ${s.join(", ")}`:""}function rd(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 rr(r,e){let t=rs(r.columnName);if(r.isIdentity||/serial/i.test(r.columnType))return`${t} UInt64 DEFAULT generateSnowflakeID()`;let n=rd(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 ${ad[o.toLowerCase()]??o}`),s}var ae,rs,ad,Ai=R(()=>{"use strict";h();ae=r=>`\`${r.replaceAll("\\","\\\\").replaceAll("`","\\`")}\``,rs=ae;ad={"now()":"now()",current_timestamp:"now()","current_timestamp()":"now()",current_date:"today()","gen_random_uuid()":"generateUUIDv4()","uuid_generate_v4()":"generateUUIDv4()"}});import{ClickHouseError as Di}from"@clickhouse/client";var sd,_i,od,id,ar,Oi=R(()=>{"use strict";h();j();Je();Xe();lt();X();Ye();Ai();sd={mutations_sync:"2"},_i=r=>/^(LowCardinality\()?Nullable\(/.test(r),od=(r,e)=>{if(r==null)return null;let t=Mt(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},id={Fatal:"fatal",Critical:"fatal",Error:"error",Warning:"warning"},ar=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 kn(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
@@ -42,7 +42,7 @@ var Pl=Object.defineProperty;var R=(r,e)=>()=>(r&&(e=r(r=0)),e);var It=(r,e)=>{f
42
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:id[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 Di&&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 At(e)).query({query:t,query_params:n,format:"JSONEachRow"})).json()}async command(e,t,n={},a={}){await(await At(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}=Ri(a),m=Ni(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=od(c,l);return u===null&&!_i(l)?[]:[[i,u]]})));await(await At(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 At(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 Ii(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 Pi(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}=Li(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 sr(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,as,Li,xi,cd,ss,$i=R(()=>{"use strict";h();I=r=>`"${r.replaceAll('"','""')}"`,as=r=>r.length?`WHERE ${r.join(" AND ")}`:"";Li=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),xi=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=Li(t,e);return`${I(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;cd=new Set(["serial","serial4","bigserial","serial8","smallserial","serial2"]),ss=r=>cd.has(r.toLowerCase().trim())});import{statSync as ld}from"fs";var Wt,ud,Mi,is,be,os,Tn,or,md,dd,pd,fd,ir,ki=R(()=>{"use strict";h();j();Je();Xe();St();X();$i();Wt="database_name = current_database() AND schema_name = current_schema()",ud=r=>{let{DuckDBTypeId:e}=Ke("duckdb");return r===e.BIGINT||r===e.UBIGINT||r===e.HUGEINT||r===e.UHUGEINT},Mi=r=>{let e=r.columnTypes(),t=r.columnNames().filter((a,s)=>ud(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},is=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),be=async(r,e,t=[])=>Mi(await r.runAndReadAll(e,t.map(is))),os=async(r,e,t=[])=>(await r.runAndReadAll(e,t.map(is))).rowsChanged,Tn=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}},or=r=>r.map(()=>"?").join(", "),md=r=>r.columns.map((e,t)=>`c.${I(e)} = p.${I(r.referencedColumns[t])}`).join(" AND "),dd=r=>r.flatMap(e=>[...(e.column_default??"").matchAll(/nextval\('([^']+)'\)/g)].map(t=>t[1])),pd=[["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."]],fd=new Set(["CASCADE","SET NULL","SET DEFAULT"]),ir=class extends re{async runQuery(e,t,n){return ts(a=>be(a,t,n))}quoteIdentifier(e){return I(e)}mapToUniversalType(e){return $n(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=pd.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 ts(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=Ii(c),g=i?this.decodeCursor(i):null,T=g?Pi(m,g.values,p):null,y=xi(m,p),S=u.length?"*":"*, rowid",w=as(T?[...f.conditions,T.clause]:f.conditions),[A]=await be(l,`SELECT COUNT(*) AS total FROM ${I(t)} ${as(f.conditions)}`,f.values),N=await be(l,`SELECT ${S} FROM ${I(t)} ${w} ${y} LIMIT ?`,[...f.values,...T?.values??[],n+1]),C=N.length>n,_=N.slice(0,n);p&&_.reverse();let D=J=>this.encodeCursor({values:Object.fromEntries(m.map(ee=>[ee.column,J[ee.column]])),sortColumns:m.map(ee=>ee.column)}),L=_[0],H=_.at(-1),$=p?!!i:C,Q=p?C:!!i;return{data:_.map(J=>{if(u.length)return this.normalizeRow(J);let{rowid:ee,...P}=J;return this.normalizeRow(P)}),meta:{limit:n,total:Number(A?.total??0),hasNextPage:$,hasPreviousPage:Q,nextCursor:$&&H?D(H):null,prevCursor:Q&&L?D(L):null}}})}async getDatabasesList(){return this.withConnection(async e=>(await be(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 be(e,"SELECT current_database() AS db");return{db:t.db}})}async getDatabaseConnectionInfo(){return this.withConnection(async e=>{let[t]=await be(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 be(t,`SELECT table_name FROM duckdb_tables() WHERE ${Wt} AND NOT temporary ORDER BY table_name`),a=[];for(let{table_name:s}of n){let[o]=await be(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=>fd.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)} ${sr(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||ss(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=>Tn(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 be(n,`SELECT COUNT(*) AS count FROM ${I(e)}`);await n.run(`DROP TABLE ${I(e)}`);for(let i of dd(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 be(t,`SELECT sql FROM duckdb_tables() WHERE ${Wt} 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:$n(o.data_type),dataTypeLabel:Kr(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||ss(a)?`${t}_${n}_seq`:null,u=`${I(n)} ${sr(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 Tn(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 Tn(c,async()=>{await c.run(`${i} TYPE ${sr(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=>os(o,`INSERT INTO ${I(t)} (${a.map(I).join(", ")}) VALUES (${or(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=>Tn(o,async()=>{this.assertWholeKey(await this.primaryKey(o,t),n);let i=0;for(let{keyValues:c,rowUpdates:l}of a){let u=await os(o,`UPDATE ${I(t)} SET ${l.map(m=>`${I(m.columnName)} = ?`).join(", ")} WHERE ${n.map(m=>`${I(m)} = ?`).join(" AND ")}`,[...l.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 os(s,`DELETE FROM ${I(e)} WHERE ${I(n)} IN (${or(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 be(s,`SELECT c.* FROM ${I(c.table)} c JOIN ${I(e)} p ON ${md(c)} WHERE p.${I(n)} IN (${or(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=>Tn(s,async()=>{let o=await s.prepare(`INSERT INTO ${I(e)} (${n.map(I).join(", ")}) VALUES (${or(n)})`);for(let i of t)o.bind(n.map(c=>is(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}=Ke("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=Mi(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=ld(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 be(e,`SELECT column_name, data_type, is_nullable, column_default FROM duckdb_columns() WHERE ${Wt} 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 be(e,`SELECT index_name, is_unique, expressions::VARCHAR[] AS keys, sql FROM duckdb_indexes() WHERE ${Wt} 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 be(e,`SELECT constraint_column_names AS columns FROM duckdb_constraints() WHERE ${Wt} AND table_name = ? AND constraint_type = 'PRIMARY KEY'`,[t]);return n?.columns??[]}async foreignKeys(e,t,n){return be(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 ${Wt} AND constraint_type = 'FOREIGN KEY' AND ${t} = ?`,[n])}async sampleReferencingRows(e,t){let n=[];for(let a of t){let s=await be(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 hd,vi,Ui=R(()=>{"use strict";h();hd=new Set(["admin","config","local"]),vi=(r,e)=>{let t=r.filter(n=>!hd.has(n.name)||n.name===e);return!e||t.some(n=>n.name===e)?t:[...t,{name:e,sizeOnDisk:0}]}});function qi(r){if(!r||r.length===0)return{};let e=[];for(let t of r){let n=t.columnName,a=yd(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:cr(String(a)),$options:""}});break;case"not like":e.push({[n]:{$not:{$regex:cr(String(a)),$options:""}}});break;case"ilike":e.push({[n]:{$regex:cr(String(a)),$options:"i"}});break;case"not ilike":e.push({[n]:{$not:{$regex:cr(String(a)),$options:"i"}}});break;default:e.push({[n]:a});break}}return e.length?{$and:e}:{}}function cs(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 ls(r){return Buffer.from(JSON.stringify({offset:r})).toString("base64url")}function Bi(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 cr,yd,Fi=R(()=>{"use strict";h();Qe();cr=r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),yd=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:yn(e)?gn(e):e}});var lr,Vt,gd,bd,Td,Ed,wd,Hi,En,Sd,ji,Cd,Rd,Nd,Yt,Ad,Dd,_d,Ki,Od,ur,Wi=R(()=>{"use strict";h();Je();Xe();lt();Qe();X();Ve();Ui();Ye();Fi();lr=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=>lr(e)):Object.fromEntries(Object.entries(r).map(([e,t])=>[e,lr(t)])):r,Vt=r=>lr(r),gd=["sparse","expireAfterSeconds","partialFilterExpression","collation"],bd=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 gd){let l=r[c];l!=null&&l!==!1&&(o[c]=lr(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})}},Td=new Set([85,86,11e3]),Ed=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",wd=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"}},Hi=r=>typeof r=="string"&&yn(r),En=r=>gn(r),Sd=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]}`},ji=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Cd=r=>{let e=r.trim();if(ji.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Rd=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"},Nd=(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}},Yt=r=>{if(r._id&&typeof r._id=="string")return{...r,_id:En(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"?En(t):t)}};if(Array.isArray(e.$nin))return{...r,_id:{...e,$nin:e.$nin.map(t=>typeof t=="string"?En(t):t)}}}return r},Ad=13,Dd=8e3,_d=51803,Ki={F:"fatal",E:"error",W:"warning",I:"info"},Od=({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:Ki[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:Ki[e]??"debug",rawLevel:e,source:t,message:s,detail:he({id:n,ctx:a,...o})}},ur=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(Vt(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=qi(l??[]),f=cs(i??"",c),g=s&&s>0?s:50,T=Bi(a),y=Number.isFinite(T)&&T>=0?T:0,S=o==="desc"?Math.max(y-g,0):y,[w,A]=await Promise.all([m.countDocuments(p),m.find(p).sort(f).skip(S).limit(g).toArray()]),N=A.map(D=>Vt(D)),C=S+g,_=Math.max(S-g,0);return{data:N,meta:{limit:g,total:w,hasNextPage:C<w,hasPreviousPage:S>0,nextCursor:C<w?ls(C):null,prevCursor:S>0?ls(_):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=>Vt(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 er()).db().admin().listDatabases()).databases??[];if(!a[0])throw new d(500,{message:"No databases returned from MongoDB"});return vi(a,tr()).map(s=>({name:s.name,size:Sd(s.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:tr()}}async getDatabaseConnectionInfo(){try{let t=(await er()).db().admin(),n=_e(ve()),a={};try{a=await t.serverStatus()}catch(s){Z("warn","db_server_status_failed",fe(s))}return{host:n.host,port:n.port,user:"n/a",database:tr(),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=Cd(l.columnType);if(!ji.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[g,T]of Object.entries(f)){let y=Rd(T);c.has(g)||(c.set(g,new Set),l.set(g,0)),c.get(g)?.add(y),l.set(g,(l.get(g)??0)+1)}let u={},m=[];for(let[f,g]of c.entries()){let T=l.get(f)??0,y=Array.from(g).filter(w=>w!=="null"),S=g.has("null")||T<o.length;T===o.length&&o.length>0&&!S&&m.push(f),u[f]=y.length===1?{bsonType:S?[y[0],"null"]:y[0]}:{bsonType:S?[...y,"null"]:y}}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=Ed(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:wd(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=Nd(s,a);await c.collection(t).updateMany({},{$set:{[n]:m}});let f=l[0].options?.validator?.$jsonSchema??{},g={...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:g,...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 er(),{log:t}=await e.db("admin").command({getLog:"global"}),n=t.flatMap(a=>{try{return[Od(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===Ad)return ne("Reading the server log needs the getLog action, which the clusterMonitor role grants.");if(t===Dd)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(bd).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"&&Td.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=Vt(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(g=>g.columnName==="_id"))throw new d(400,{message:'The "_id" field is immutable and cannot be updated.'});let m={};for(let g of u)m[g.columnName]=g.value;let p={};i.forEach((g,T)=>{let y=l[T];p[g]=g==="_id"&&Hi(y)?En(y):y});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"&&Hi(u.value)?En(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=Vt(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=Yt(n.filter??{}),g=s.find(f,n.options??{});g.sort(n.sort??cs("",void 0)),n.skip&&g.skip(n.skip),n.limit&&g.limit(n.limit),i=await g.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=Yt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let g=await s.updateOne(f,n.update,n.options??{});c=g.matchedCount??0,l=`OK (${g.modifiedCount??0} modified)`;break}case"updateMany":{let f=Yt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let g=await s.updateMany(f,n.update,n.options??{});c=g.matchedCount??0,l=`OK (${g.modifiedCount??0} modified)`;break}case"deleteOne":{let f=Yt(n.filter??{});c=(await s.deleteOne(f,n.options??{})).deletedCount??0,l="OK";break}case"deleteMany":{let f=Yt(n.filter??{});c=(await s.deleteMany(f,n.options??{})).deletedCount??0,l="OK";break}case"count":{let f=Yt(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=>Vt(f));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:c,duration:u,message:l}}catch(n){throw this.wrapError(n)}}}});function us(r,e=0){if(r.length===0)return{clause:"",values:[],nextIdx:e};let t=[],n=[],a=e;for(let s of r){let o=mr(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 ms(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${mr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${mr(r)} ${e?.toUpperCase()||"ASC"}`:""}function Vi(r,e,t){let n=ms(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=>`${mr(i)} ${s}`).join(", ");return o?n?`${n}, ${o}`:`ORDER BY ${o}`:n||"ORDER BY (SELECT NULL)"}function ds(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 ps(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 Yi(r,e={}){let t=ds(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=ps(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 mr,zi=R(()=>{"use strict";h();mr=r=>`[${r.replaceAll("]","]]")}]`});var Id,Ld,xd,Gi,Pd,$d,Md,kd,vd,Ud,qd,Ne,dr,Qi=R(()=>{"use strict";h();j();Je();Xe();lt();X();Ye();zi();Id=547,Ld=15003,xd=27219,Gi=r=>[229,230].includes(r.number??0),Pd=2812,$d=/^Error: (\d+), Severity: (\d+), State: (\d+)\.?$/,Md=3726,kd=1913,vd=1505,Ud=new Set([1919,1978]),qd=3723,Ne=r=>`[${r.replaceAll("]","]]")}]`,dr=class extends re{async runQuery(e,t,n){let s=(await B(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 xn(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}=us(n,0),m=ms(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`,g=[...l,p,o+1],T=`SELECT COUNT(*) as total FROM ${Ne(t)} ${c}`;return{sql:f,values:g,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 B(n),u=i?this.decodeOffsetCursor(i):0,{clause:m,values:p,nextIdx:f}=us(c,0),[g,{total:T,estimated:y}]=await Promise.all([this.getPrimaryKeyColumns(l,t),this.countRows(l,t,m,p)]),S=Vi(s,o,g),w=l.request();p.forEach((_,D)=>{w.input(`p${D}`,_)}),w.input(`p${f}`,u),w.input(`p${f+1}`,a+1);let N=(await w.query(`SELECT * FROM ${Ne(t)} ${m} ${S} 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,...y&&{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 B()).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=od(c,l);return u===null&&!_i(l)?[]:[[i,u]]})));await(await At(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 At(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 Ii(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 Pi(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}=xi(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 sr(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,as,xi,Li,cd,ss,$i=R(()=>{"use strict";h();I=r=>`"${r.replaceAll('"','""')}"`,as=r=>r.length?`WHERE ${r.join(" AND ")}`:"";xi=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),Li=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=xi(t,e);return`${I(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;cd=new Set(["serial","serial4","bigserial","serial8","smallserial","serial2"]),ss=r=>cd.has(r.toLowerCase().trim())});import{statSync as ld}from"fs";var Wt,ud,Mi,is,be,os,Tn,or,md,dd,pd,fd,ir,ki=R(()=>{"use strict";h();j();Je();Xe();St();X();$i();Wt="database_name = current_database() AND schema_name = current_schema()",ud=r=>{let{DuckDBTypeId:e}=Ke("duckdb");return r===e.BIGINT||r===e.UBIGINT||r===e.HUGEINT||r===e.UHUGEINT},Mi=r=>{let e=r.columnTypes(),t=r.columnNames().filter((a,s)=>ud(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},is=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),be=async(r,e,t=[])=>Mi(await r.runAndReadAll(e,t.map(is))),os=async(r,e,t=[])=>(await r.runAndReadAll(e,t.map(is))).rowsChanged,Tn=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}},or=r=>r.map(()=>"?").join(", "),md=r=>r.columns.map((e,t)=>`c.${I(e)} = p.${I(r.referencedColumns[t])}`).join(" AND "),dd=r=>r.flatMap(e=>[...(e.column_default??"").matchAll(/nextval\('([^']+)'\)/g)].map(t=>t[1])),pd=[["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."]],fd=new Set(["CASCADE","SET NULL","SET DEFAULT"]),ir=class extends re{async runQuery(e,t,n){return ts(a=>be(a,t,n))}quoteIdentifier(e){return I(e)}mapToUniversalType(e){return $n(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=pd.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 ts(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=Ii(c),g=i?this.decodeCursor(i):null,T=g?Pi(m,g.values,p):null,y=Li(m,p),S=u.length?"*":"*, rowid",w=as(T?[...f.conditions,T.clause]:f.conditions),[A]=await be(l,`SELECT COUNT(*) AS total FROM ${I(t)} ${as(f.conditions)}`,f.values),N=await be(l,`SELECT ${S} FROM ${I(t)} ${w} ${y} LIMIT ?`,[...f.values,...T?.values??[],n+1]),C=N.length>n,_=N.slice(0,n);p&&_.reverse();let D=J=>this.encodeCursor({values:Object.fromEntries(m.map(ee=>[ee.column,J[ee.column]])),sortColumns:m.map(ee=>ee.column)}),x=_[0],H=_.at(-1),$=p?!!i:C,Q=p?C:!!i;return{data:_.map(J=>{if(u.length)return this.normalizeRow(J);let{rowid:ee,...P}=J;return this.normalizeRow(P)}),meta:{limit:n,total:Number(A?.total??0),hasNextPage:$,hasPreviousPage:Q,nextCursor:$&&H?D(H):null,prevCursor:Q&&x?D(x):null}}})}async getDatabasesList(){return this.withConnection(async e=>(await be(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 be(e,"SELECT current_database() AS db");return{db:t.db}})}async getDatabaseConnectionInfo(){return this.withConnection(async e=>{let[t]=await be(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 be(t,`SELECT table_name FROM duckdb_tables() WHERE ${Wt} AND NOT temporary ORDER BY table_name`),a=[];for(let{table_name:s}of n){let[o]=await be(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=>fd.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)} ${sr(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||ss(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=>Tn(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 be(n,`SELECT COUNT(*) AS count FROM ${I(e)}`);await n.run(`DROP TABLE ${I(e)}`);for(let i of dd(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 be(t,`SELECT sql FROM duckdb_tables() WHERE ${Wt} 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:$n(o.data_type),dataTypeLabel:Kr(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||ss(a)?`${t}_${n}_seq`:null,u=`${I(n)} ${sr(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 Tn(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 Tn(c,async()=>{await c.run(`${i} TYPE ${sr(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=>os(o,`INSERT INTO ${I(t)} (${a.map(I).join(", ")}) VALUES (${or(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=>Tn(o,async()=>{this.assertWholeKey(await this.primaryKey(o,t),n);let i=0;for(let{keyValues:c,rowUpdates:l}of a){let u=await os(o,`UPDATE ${I(t)} SET ${l.map(m=>`${I(m.columnName)} = ?`).join(", ")} WHERE ${n.map(m=>`${I(m)} = ?`).join(" AND ")}`,[...l.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 os(s,`DELETE FROM ${I(e)} WHERE ${I(n)} IN (${or(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 be(s,`SELECT c.* FROM ${I(c.table)} c JOIN ${I(e)} p ON ${md(c)} WHERE p.${I(n)} IN (${or(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=>Tn(s,async()=>{let o=await s.prepare(`INSERT INTO ${I(e)} (${n.map(I).join(", ")}) VALUES (${or(n)})`);for(let i of t)o.bind(n.map(c=>is(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}=Ke("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=Mi(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=ld(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 be(e,`SELECT column_name, data_type, is_nullable, column_default FROM duckdb_columns() WHERE ${Wt} 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 be(e,`SELECT index_name, is_unique, expressions::VARCHAR[] AS keys, sql FROM duckdb_indexes() WHERE ${Wt} 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 be(e,`SELECT constraint_column_names AS columns FROM duckdb_constraints() WHERE ${Wt} AND table_name = ? AND constraint_type = 'PRIMARY KEY'`,[t]);return n?.columns??[]}async foreignKeys(e,t,n){return be(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 ${Wt} AND constraint_type = 'FOREIGN KEY' AND ${t} = ?`,[n])}async sampleReferencingRows(e,t){let n=[];for(let a of t){let s=await be(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 hd,vi,Ui=R(()=>{"use strict";h();hd=new Set(["admin","config","local"]),vi=(r,e)=>{let t=r.filter(n=>!hd.has(n.name)||n.name===e);return!e||t.some(n=>n.name===e)?t:[...t,{name:e,sizeOnDisk:0}]}});function qi(r){if(!r||r.length===0)return{};let e=[];for(let t of r){let n=t.columnName,a=yd(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:cr(String(a)),$options:""}});break;case"not like":e.push({[n]:{$not:{$regex:cr(String(a)),$options:""}}});break;case"ilike":e.push({[n]:{$regex:cr(String(a)),$options:"i"}});break;case"not ilike":e.push({[n]:{$not:{$regex:cr(String(a)),$options:"i"}}});break;default:e.push({[n]:a});break}}return e.length?{$and:e}:{}}function cs(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 ls(r){return Buffer.from(JSON.stringify({offset:r})).toString("base64url")}function Bi(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 cr,yd,Fi=R(()=>{"use strict";h();Qe();cr=r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),yd=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:yn(e)?gn(e):e}});var lr,Vt,gd,bd,Td,Ed,wd,Hi,En,Sd,ji,Cd,Rd,Nd,Yt,Ad,Dd,_d,Ki,Od,ur,Wi=R(()=>{"use strict";h();Je();Xe();lt();Qe();X();Ve();Ui();Ye();Fi();lr=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=>lr(e)):Object.fromEntries(Object.entries(r).map(([e,t])=>[e,lr(t)])):r,Vt=r=>lr(r),gd=["sparse","expireAfterSeconds","partialFilterExpression","collation"],bd=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 gd){let l=r[c];l!=null&&l!==!1&&(o[c]=lr(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})}},Td=new Set([85,86,11e3]),Ed=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",wd=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"}},Hi=r=>typeof r=="string"&&yn(r),En=r=>gn(r),Sd=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]}`},ji=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Cd=r=>{let e=r.trim();if(ji.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Rd=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"},Nd=(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}},Yt=r=>{if(r._id&&typeof r._id=="string")return{...r,_id:En(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"?En(t):t)}};if(Array.isArray(e.$nin))return{...r,_id:{...e,$nin:e.$nin.map(t=>typeof t=="string"?En(t):t)}}}return r},Ad=13,Dd=8e3,_d=51803,Ki={F:"fatal",E:"error",W:"warning",I:"info"},Od=({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:Ki[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:Ki[e]??"debug",rawLevel:e,source:t,message:s,detail:he({id:n,ctx:a,...o})}},ur=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(Vt(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=qi(l??[]),f=cs(i??"",c),g=s&&s>0?s:50,T=Bi(a),y=Number.isFinite(T)&&T>=0?T:0,S=o==="desc"?Math.max(y-g,0):y,[w,A]=await Promise.all([m.countDocuments(p),m.find(p).sort(f).skip(S).limit(g).toArray()]),N=A.map(D=>Vt(D)),C=S+g,_=Math.max(S-g,0);return{data:N,meta:{limit:g,total:w,hasNextPage:C<w,hasPreviousPage:S>0,nextCursor:C<w?ls(C):null,prevCursor:S>0?ls(_):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=>Vt(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 er()).db().admin().listDatabases()).databases??[];if(!a[0])throw new d(500,{message:"No databases returned from MongoDB"});return vi(a,tr()).map(s=>({name:s.name,size:Sd(s.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:tr()}}async getDatabaseConnectionInfo(){try{let t=(await er()).db().admin(),n=_e(ve()),a={};try{a=await t.serverStatus()}catch(s){Z("warn","db_server_status_failed",fe(s))}return{host:n.host,port:n.port,user:"n/a",database:tr(),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=Cd(l.columnType);if(!ji.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[g,T]of Object.entries(f)){let y=Rd(T);c.has(g)||(c.set(g,new Set),l.set(g,0)),c.get(g)?.add(y),l.set(g,(l.get(g)??0)+1)}let u={},m=[];for(let[f,g]of c.entries()){let T=l.get(f)??0,y=Array.from(g).filter(w=>w!=="null"),S=g.has("null")||T<o.length;T===o.length&&o.length>0&&!S&&m.push(f),u[f]=y.length===1?{bsonType:S?[y[0],"null"]:y[0]}:{bsonType:S?[...y,"null"]:y}}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=Ed(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:wd(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=Nd(s,a);await c.collection(t).updateMany({},{$set:{[n]:m}});let f=l[0].options?.validator?.$jsonSchema??{},g={...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:g,...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 er(),{log:t}=await e.db("admin").command({getLog:"global"}),n=t.flatMap(a=>{try{return[Od(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===Ad)return ne("Reading the server log needs the getLog action, which the clusterMonitor role grants.");if(t===Dd)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(bd).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"&&Td.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=Vt(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(g=>g.columnName==="_id"))throw new d(400,{message:'The "_id" field is immutable and cannot be updated.'});let m={};for(let g of u)m[g.columnName]=g.value;let p={};i.forEach((g,T)=>{let y=l[T];p[g]=g==="_id"&&Hi(y)?En(y):y});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"&&Hi(u.value)?En(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=Vt(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=Yt(n.filter??{}),g=s.find(f,n.options??{});g.sort(n.sort??cs("",void 0)),n.skip&&g.skip(n.skip),n.limit&&g.limit(n.limit),i=await g.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=Yt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let g=await s.updateOne(f,n.update,n.options??{});c=g.matchedCount??0,l=`OK (${g.modifiedCount??0} modified)`;break}case"updateMany":{let f=Yt(n.filter??{});if(!n.update)throw new d(400,{message:"update is required"});let g=await s.updateMany(f,n.update,n.options??{});c=g.matchedCount??0,l=`OK (${g.modifiedCount??0} modified)`;break}case"deleteOne":{let f=Yt(n.filter??{});c=(await s.deleteOne(f,n.options??{})).deletedCount??0,l="OK";break}case"deleteMany":{let f=Yt(n.filter??{});c=(await s.deleteMany(f,n.options??{})).deletedCount??0,l="OK";break}case"count":{let f=Yt(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=>Vt(f));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:c,duration:u,message:l}}catch(n){throw this.wrapError(n)}}}});function us(r,e=0){if(r.length===0)return{clause:"",values:[],nextIdx:e};let t=[],n=[],a=e;for(let s of r){let o=mr(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 ms(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${mr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${mr(r)} ${e?.toUpperCase()||"ASC"}`:""}function Vi(r,e,t){let n=ms(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=>`${mr(i)} ${s}`).join(", ");return o?n?`${n}, ${o}`:`ORDER BY ${o}`:n||"ORDER BY (SELECT NULL)"}function ds(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 ps(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 Yi(r,e={}){let t=ds(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=ps(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 mr,zi=R(()=>{"use strict";h();mr=r=>`[${r.replaceAll("]","]]")}]`});var Id,xd,Ld,Gi,Pd,$d,Md,kd,vd,Ud,qd,Ne,dr,Qi=R(()=>{"use strict";h();j();Je();Xe();lt();X();Ye();zi();Id=547,xd=15003,Ld=27219,Gi=r=>[229,230].includes(r.number??0),Pd=2812,$d=/^Error: (\d+), Severity: (\d+), State: (\d+)\.?$/,Md=3726,kd=1913,vd=1505,Ud=new Set([1919,1978]),qd=3723,Ne=r=>`[${r.replaceAll("]","]]")}]`,dr=class extends re{async runQuery(e,t,n){let s=(await B(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 Ln(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}=us(n,0),m=ms(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`,g=[...l,p,o+1],T=`SELECT COUNT(*) as total FROM ${Ne(t)} ${c}`;return{sql:f,values:g,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 B(n),u=i?this.decodeOffsetCursor(i):0,{clause:m,values:p,nextIdx:f}=us(c,0),[g,{total:T,estimated:y}]=await Promise.all([this.getPrimaryKeyColumns(l,t),this.countRows(l,t,m,p)]),S=Vi(s,o,g),w=l.request();p.forEach((_,D)=>{w.input(`p${D}`,_)}),w.input(`p${f}`,u),w.input(`p${f+1}`,a+1);let N=(await w.query(`SELECT * FROM ${Ne(t)} ${m} ${S} 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,...y&&{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 B()).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,
@@ -157,7 +157,7 @@ ${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":xn(i.dataType),dataTypeLabel:c?"enum":Fr(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 B(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":Ln(i.dataType),dataTypeLabel:c?"enum":Fr(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 B(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
163
  `);if(Number(p.recordset[0]?.cnt??0)>0)throw new d(409,{message:`Column "${n}" already exists in table "${t}"`});let f=Yi({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 B(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 B(i);await this.assertTableExists(c,t),await this.assertColumnExists(c,t,n);let u=(await c.request().input("tableName",t).input("columnName",n).query(`
@@ -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 B(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 B(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=$d.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===Ld||a===xd)return ne("Reading the error log needs the securityadmin server role: ALTER SERVER ROLE securityadmin ADD MEMBER <login>;");if(a===Pd)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 B(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 B(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 B(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=$d.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===xd||a===Ld)return ne("Reading the error log needs the securityadmin server role: ALTER SERVER ROLE securityadmin ADD MEMBER <login>;");if(a===Pd)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 B(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 B(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===vd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&Ud.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 B(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===qd?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 B(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 y=a[T];return o.has(T)&&typeof y=="string"?y==="true"?1:0:y}),m=l.map(T=>`[${T}]`).join(", "),p=l.map((T,y)=>`@param${y}`).join(", "),f=s.request();l.forEach((T,y)=>{f.input(`param${y}`,u[y])});let g=await f.query(`INSERT INTO [${n}] (${m}) VALUES (${p})`);if(g.rowsAffected[0]===0)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:g.rowsAffected[0]??0}}async updateRecords({params:e,db:t}){let{tableName:n}=e,a=await B(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((y,S)=>`[${y.columnName}] = @value${S}`);m.forEach((y,S)=>{let w=y.value;w!==null&&typeof w=="object"&&(w=JSON.stringify(w)),s.has(y.columnName)&&typeof w=="string"&&(w=w==="true"?1:0),p.input(`value${S}`,w)}),u.forEach((y,S)=>{p.input(`pkValue${S}`,y)});let g=o.map((y,S)=>`[${y}] = @pkValue${S}`),T=await p.query(`UPDATE [${n}] SET ${f.join(", ")} WHERE ${g.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 B(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===Id)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 B(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(y,S,w,A)=>{let N=`${y}.${S}`;if(A.has(N))return;A.add(N);let C=await this.getForeignKeyReferences(y,n);for(let H of C){let $=i.request();w.forEach((P,ue)=>{$.input(`val${ue}`,P)});let Q=w.map((P,ue)=>`@val${ue}`).join(", "),ee=(await $.query(`SELECT [${H.referencedColumn}] FROM [${y}] WHERE [${S}] IN (${Q})`)).recordset.map(P=>P[H.referencedColumn]);ee.length>0&&await p(H.referencingTable,H.referencingColumn,ee,A)}let _=i.request();w.forEach((H,$)=>{_.input(`delVal${$}`,H)});let D=w.map((H,$)=>`@delVal${$}`).join(", "),L=await _.query(`DELETE FROM [${y}] WHERE [${S}] IN (${D})`);l+=L.rowsAffected[0]??0,u.add(y)};for(let y of c)u.has(y.referencingTable)||await p(y.referencingTable,y.referencingColumn,o,m);let f=i.request();o.forEach((y,S)=>{f.input(`mainPk${S}`,y)});let g=o.map((y,S)=>`@mainPk${S}`).join(", "),T=await f.query(`DELETE FROM [${e}] WHERE [${s}] IN (${g})`);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 B(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(g=>{let T=u[g];return c.has(g)&&typeof T=="string"?T==="true"?1:0:T}),f=o.map((g,T)=>`@p${l}_${T}`).join(", ");o.forEach((g,T)=>{m.input(`p${l}_${T}`,p[T])});try{await m.query(`INSERT INTO [${e}] (${i}) VALUES (${f})`)}catch(g){throw new d(500,{message:`Failed to insert record ${l+1}: ${g instanceof Error?g.message:String(g)}`})}}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 B(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 B(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 ${Ne(n)} ON [dbo].${Ne(t)} (${a.map(Ne).join(", ")})`)}catch(c){let l=c.number;throw c instanceof Error&&(l===kd||l===vd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&Ud.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 B(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===qd?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 B(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 y=a[T];return o.has(T)&&typeof y=="string"?y==="true"?1:0:y}),m=l.map(T=>`[${T}]`).join(", "),p=l.map((T,y)=>`@param${y}`).join(", "),f=s.request();l.forEach((T,y)=>{f.input(`param${y}`,u[y])});let g=await f.query(`INSERT INTO [${n}] (${m}) VALUES (${p})`);if(g.rowsAffected[0]===0)throw new d(500,{message:`Failed to insert record into "${n}"`});return{insertedCount:g.rowsAffected[0]??0}}async updateRecords({params:e,db:t}){let{tableName:n}=e,a=await B(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((y,S)=>`[${y.columnName}] = @value${S}`);m.forEach((y,S)=>{let w=y.value;w!==null&&typeof w=="object"&&(w=JSON.stringify(w)),s.has(y.columnName)&&typeof w=="string"&&(w=w==="true"?1:0),p.input(`value${S}`,w)}),u.forEach((y,S)=>{p.input(`pkValue${S}`,y)});let g=o.map((y,S)=>`[${y}] = @pkValue${S}`),T=await p.query(`UPDATE [${n}] SET ${f.join(", ")} WHERE ${g.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 B(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===Id)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 B(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(y,S,w,A)=>{let N=`${y}.${S}`;if(A.has(N))return;A.add(N);let C=await this.getForeignKeyReferences(y,n);for(let H of C){let $=i.request();w.forEach((P,ue)=>{$.input(`val${ue}`,P)});let Q=w.map((P,ue)=>`@val${ue}`).join(", "),ee=(await $.query(`SELECT [${H.referencedColumn}] FROM [${y}] WHERE [${S}] IN (${Q})`)).recordset.map(P=>P[H.referencedColumn]);ee.length>0&&await p(H.referencingTable,H.referencingColumn,ee,A)}let _=i.request();w.forEach((H,$)=>{_.input(`delVal${$}`,H)});let D=w.map((H,$)=>`@delVal${$}`).join(", "),x=await _.query(`DELETE FROM [${y}] WHERE [${S}] IN (${D})`);l+=x.rowsAffected[0]??0,u.add(y)};for(let y of c)u.has(y.referencingTable)||await p(y.referencingTable,y.referencingColumn,o,m);let f=i.request();o.forEach((y,S)=>{f.input(`mainPk${S}`,y)});let g=o.map((y,S)=>`@mainPk${S}`).join(", "),T=await f.query(`DELETE FROM [${e}] WHERE [${s}] IN (${g})`);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 B(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(g=>{let T=u[g];return c.has(g)&&typeof T=="string"?T==="true"?1:0:T}),f=o.map((g,T)=>`@p${l}_${T}`).join(", ");o.forEach((g,T)=>{m.input(`p${l}_${T}`,p[T])});try{await m.query(`INSERT INTO [${e}] (${i}) VALUES (${f})`)}catch(g){throw new d(500,{message:`Failed to insert record ${l+1}: ${g instanceof Error?g.message:String(g)}`})}}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 B(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 B(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,
@@ -224,7 +224,7 @@ ${o.join(`,
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 fs(r){if(r.length===0)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=pr(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 hs(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${pr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${pr(r)} ${e?.toUpperCase()||"ASC"}`:""}function ys(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(pr).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function Bd(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 Fd(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 fr(r,e={}){let t=Bd(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=Fd(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 pr,Ji=R(()=>{"use strict";h();pr=r=>`\`${r.replaceAll("`","``")}\``});var Xi,Hd,Kd,jd,Wd,Vd,Yd,zd,Gd,se,hr,Zi=R(()=>{"use strict";h();j();Je();Xe();lt();X();Ye();Ji();Xi=1451,Hd=1217,Kd=1061,jd=1062,Wd=1553,Vd=new Set([1059,1071,1167,1170,1280,3152]),Yd=1142,zd=1146,Gd={System:"info",Error:"error",Warning:"warning",Note:"info"},se=r=>`\`${r.replaceAll("`","``")}\``,hr=class extends re{mariaDb=new WeakMap;async runQuery(e,t,n){let a=await F(e),[s]=await a.execute(t,n);return s}quoteIdentifier(e){return se(e)}mapToUniversalType(e){return Ln(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}=fs(c),f="",g=[];if(n){let C=this.decodeCursor(n);if(C){let _=ys(C,s,u);f=_.clause,g=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let y=hs((Array.isArray(o),o),i),S=y;s==="desc"?y?S=y.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):l.length>0&&(S=`ORDER BY ${l.map(C=>`${se(C)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`):!y&&l.length>0&&(S=`ORDER BY ${l.map(C=>`${se(C)} ${u.toUpperCase()}`).join(", ")}`);let w=`SELECT * FROM ${se(t)} ${T} ${S} LIMIT ${a+1}`,A=[...p,...g],N=`SELECT COUNT(*) as total FROM ${se(t)} ${m}`;return{sql:w,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(g=>[g,f[g]])),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 F(n),{clause:m,values:p}=fs(l),[f,{total:g,estimated:T}]=await Promise.all([this.getPrimaryKeyColumns(u,t),this.countRows(u,t,m,p)]),y=[],S=i;Array.isArray(o)&&o.length>0?(y=o.map(P=>P.columnName),S=o[0].direction):typeof o=="string"&&o&&(y=[o]);let w=[...y,...f.filter(P=>!y.includes(P))],A="",N=[];if(c){let P=this.decodeCursor(c);if(P){let ue=ys(P,s,S);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 _=hs((Array.isArray(o),o),i),D=f.filter(P=>!y.includes(P)),L=_;if(s==="desc")if(_){if(L=_.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),D.length){let P=S==="asc"?"DESC":"ASC";L+=`, ${D.map(ue=>`${se(ue)} ${P}`).join(", ")}`}}else w.length>0&&(L=`ORDER BY ${w.map(P=>`${se(P)} ${S==="asc"?"DESC":"ASC"}`).join(", ")}`);else!_&&w.length>0?L=`ORDER BY ${w.map(P=>`${se(P)} ${S.toUpperCase()}`).join(", ")}`:D.length&&(L+=`, ${D.map(P=>`${se(P)} ${S.toUpperCase()}`).join(", ")}`);let[H]=await u.execute(`SELECT * FROM ${se(t)} ${C} ${L} LIMIT ${Math.floor(a)+1}`,[...p,...N]),$=H,Q=$.length>a;Q&&($=$.slice(0,a)),s==="desc"&&($=$.reverse());let J=null,ee=null;if($.length>0&&w.length>0){let P=$[0],ue=$[$.length-1],at=ye=>({values:Object.fromEntries(w.map(st=>[st,ye[st]])),sortColumns:w});s==="asc"?(Q&&(J=this.encodeCursor(at(ue))),c&&(ee=this.encodeCursor(at(P)))):(c&&(J=this.encodeCursor(at(ue))),Q&&(ee=this.encodeCursor(at(P))))}return{data:$,meta:{limit:a,total:g,...T&&{totalEstimated:!0},hasNextPage:s==="asc"?Q:!!c,hasPreviousPage:s==="asc"?!!c:Q,nextCursor:J,prevCursor:ee}}}async getDatabasesList(){try{let e=await F(),[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 fs(r){if(r.length===0)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=pr(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 hs(r,e){return Array.isArray(r)?r.length===0?"":`ORDER BY ${r.map(t=>`${pr(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:r&&typeof r=="string"?`ORDER BY ${pr(r)} ${e?.toUpperCase()||"ASC"}`:""}function ys(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(pr).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function Bd(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 Fd(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 fr(r,e={}){let t=Bd(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=Fd(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 pr,Ji=R(()=>{"use strict";h();pr=r=>`\`${r.replaceAll("`","``")}\``});var Xi,Hd,Kd,jd,Wd,Vd,Yd,zd,Gd,se,hr,Zi=R(()=>{"use strict";h();j();Je();Xe();lt();X();Ye();Ji();Xi=1451,Hd=1217,Kd=1061,jd=1062,Wd=1553,Vd=new Set([1059,1071,1167,1170,1280,3152]),Yd=1142,zd=1146,Gd={System:"info",Error:"error",Warning:"warning",Note:"info"},se=r=>`\`${r.replaceAll("`","``")}\``,hr=class extends re{mariaDb=new WeakMap;async runQuery(e,t,n){let a=await F(e),[s]=await a.execute(t,n);return s}quoteIdentifier(e){return se(e)}mapToUniversalType(e){return xn(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}=fs(c),f="",g=[];if(n){let C=this.decodeCursor(n);if(C){let _=ys(C,s,u);f=_.clause,g=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let y=hs((Array.isArray(o),o),i),S=y;s==="desc"?y?S=y.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):l.length>0&&(S=`ORDER BY ${l.map(C=>`${se(C)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`):!y&&l.length>0&&(S=`ORDER BY ${l.map(C=>`${se(C)} ${u.toUpperCase()}`).join(", ")}`);let w=`SELECT * FROM ${se(t)} ${T} ${S} LIMIT ${a+1}`,A=[...p,...g],N=`SELECT COUNT(*) as total FROM ${se(t)} ${m}`;return{sql:w,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(g=>[g,f[g]])),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 F(n),{clause:m,values:p}=fs(l),[f,{total:g,estimated:T}]=await Promise.all([this.getPrimaryKeyColumns(u,t),this.countRows(u,t,m,p)]),y=[],S=i;Array.isArray(o)&&o.length>0?(y=o.map(P=>P.columnName),S=o[0].direction):typeof o=="string"&&o&&(y=[o]);let w=[...y,...f.filter(P=>!y.includes(P))],A="",N=[];if(c){let P=this.decodeCursor(c);if(P){let ue=ys(P,s,S);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 _=hs((Array.isArray(o),o),i),D=f.filter(P=>!y.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=S==="asc"?"DESC":"ASC";x+=`, ${D.map(ue=>`${se(ue)} ${P}`).join(", ")}`}}else w.length>0&&(x=`ORDER BY ${w.map(P=>`${se(P)} ${S==="asc"?"DESC":"ASC"}`).join(", ")}`);else!_&&w.length>0?x=`ORDER BY ${w.map(P=>`${se(P)} ${S.toUpperCase()}`).join(", ")}`:D.length&&(x+=`, ${D.map(P=>`${se(P)} ${S.toUpperCase()}`).join(", ")}`);let[H]=await u.execute(`SELECT * FROM ${se(t)} ${C} ${x} LIMIT ${Math.floor(a)+1}`,[...p,...N]),$=H,Q=$.length>a;Q&&($=$.slice(0,a)),s==="desc"&&($=$.reverse());let J=null,ee=null;if($.length>0&&w.length>0){let P=$[0],ue=$[$.length-1],at=ye=>({values:Object.fromEntries(w.map(st=>[st,ye[st]])),sortColumns:w});s==="asc"?(Q&&(J=this.encodeCursor(at(ue))),c&&(ee=this.encodeCursor(at(P)))):(c&&(J=this.encodeCursor(at(ue))),Q&&(ee=this.encodeCursor(at(P))))}return{data:$,meta:{limit:a,total:g,...T&&{totalEstimated:!0},hasNextPage:s==="asc"?Q:!!c,hasPreviousPage:s==="asc"?!!c:Q,nextCursor:J,prevCursor:ee}}}async getDatabasesList(){try{let e=await F(),[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,
@@ -272,9 +272,9 @@ ${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:Ln(c,l),dataTypeLabel:Br(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 F(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 g=fr({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 ${g}`)}async deleteColumn(e){let{tableName:t,columnName:n,db:a}=e,s=await F(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 F(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=fr({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 F(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 F(e);try{let[n]=await t.query(`${Pe} 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:xn(c,l),dataTypeLabel:Br(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 F(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 g=fr({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 ${g}`)}async deleteColumn(e){let{tableName:t,columnName:n,db:a}=e,s=await F(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 F(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=fr({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 F(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 F(e);try{let[n]=await t.query(`${Pe} 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:Gd[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===Yd)return ne("Reading the server log needs: GRANT SELECT ON performance_schema.error_log TO <user>;");if(a===zd)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 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.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===Kd||l===jd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&Vd.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.query(`DROP INDEX ${se(t)} ON ${se(e)}`)}catch(a){throw a instanceof Error&&a.errno===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=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 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=await a.getConnection();await c.beginTransaction();try{let l=0;for(let{keyValues:u,rowUpdates:m}of i){let p=m.map(y=>`\`${y.columnName}\` = ?`),f=m.map(y=>y.value!==null&&typeof y.value=="object"?JSON.stringify(y.value):s.has(y.columnName)&&typeof y.value=="string"?y.value==="true"?1:0:y.value);f.push(...u);let g=o.map(y=>`\`${y}\` = ?`),[T]=await c.execute(`UPDATE \`${n}\` SET ${p.join(", ")} WHERE ${g.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 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(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===Xi)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 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=await a.getConnection();await i.beginTransaction();try{let c=await this.getForeignKeyReferences(e,n),l=0,u=new Map,m=async(g,T,y)=>{let S=`${g}.${T}`,w=u.get(S)??new Set;u.set(S,w);let A=y.filter(D=>!w.has(String(D)));if(A.length===0)return;for(let D of A)w.add(String(D));let N=await this.getForeignKeyReferences(g,n);for(let D of N){let L=A.map(()=>"?").join(", "),[H]=await i.execute(`SELECT \`${D.referencedColumn}\` FROM \`${g}\` WHERE \`${T}\` IN (${L})`,A),$=H.map(Q=>Q[D.referencedColumn]);$.length>0&&await m(D.referencingTable,D.referencingColumn,$)}let C=A.map(()=>"?").join(", "),[_]=await i.execute(`DELETE FROM \`${g}\` WHERE \`${T}\` IN (${C})`,A);l+=_.affectedRows};for(let g of c)await m(g.referencingTable,g.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 F(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 F(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:Oe(n.reverse().map(a=>({ts:new Date(Number(a.epoch)*1e3).toISOString(),level:Gd[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===Yd)return ne("Reading the server log needs: GRANT SELECT ON performance_schema.error_log TO <user>;");if(a===zd)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 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.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===Kd||l===jd)?new d(409,{message:c.message,cause:c}):c instanceof Error&&l!==void 0&&Vd.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.query(`DROP INDEX ${se(t)} ON ${se(e)}`)}catch(a){throw a instanceof Error&&a.errno===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=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 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=await a.getConnection();await c.beginTransaction();try{let l=0;for(let{keyValues:u,rowUpdates:m}of i){let p=m.map(y=>`\`${y.columnName}\` = ?`),f=m.map(y=>y.value!==null&&typeof y.value=="object"?JSON.stringify(y.value):s.has(y.columnName)&&typeof y.value=="string"?y.value==="true"?1:0:y.value);f.push(...u);let g=o.map(y=>`\`${y}\` = ?`),[T]=await c.execute(`UPDATE \`${n}\` SET ${p.join(", ")} WHERE ${g.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 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(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===Xi)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 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=await a.getConnection();await i.beginTransaction();try{let c=await this.getForeignKeyReferences(e,n),l=0,u=new Map,m=async(g,T,y)=>{let S=`${g}.${T}`,w=u.get(S)??new Set;u.set(S,w);let A=y.filter(D=>!w.has(String(D)));if(A.length===0)return;for(let D of A)w.add(String(D));let N=await this.getForeignKeyReferences(g,n);for(let D of N){let x=A.map(()=>"?").join(", "),[H]=await i.execute(`SELECT \`${D.referencedColumn}\` FROM \`${g}\` WHERE \`${T}\` IN (${x})`,A),$=H.map(Q=>Q[D.referencedColumn]);$.length>0&&await m(D.referencingTable,D.referencingColumn,$)}let C=A.map(()=>"?").join(", "),[_]=await i.execute(`DELETE FROM \`${g}\` WHERE \`${T}\` IN (${C})`,A);l+=_.affectedRows};for(let g of c)await m(g.referencingTable,g.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 F(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 F(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 = ?"}
@@ -342,7 +342,7 @@ ${p}`}}return t},yp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
342
342
  `);return t.truncatedStart&&e!=="csvlog"&&n.shift(),(e==="csvlog"?bp(r,t):e==="jsonlog"?Tp(n,t):hp(n,t)).filter(s=>!dp(s)).map(mp)}});function Tc(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 Sc(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}=Ec(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,Ec,wc,Ep,Ze,pe,Cc=R(()=>{"use strict";h();zt=r=>`"${r.replaceAll('"','""')}"`;Ec=(r,e)=>({descending:r.direction==="desc"!==e,nullsLast:!e}),wc=(r,e=!1)=>`ORDER BY ${r.map(t=>{let{descending:n,nullsLast:a}=Ec(t,e);return`${zt(t.column)} ${n?"DESC":"ASC"} NULLS ${a?"LAST":"FIRST"}`}).join(", ")}`;Ep=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)`,Ze=(r,e)=>`COALESCE(${e}::text, ${Ep(r)})`,pe=(r,e)=>e?`${zt(e)}.${zt(r)}`:zt(r)});var br,wp,Tr,Rc=R(()=>{"use strict";h();j();Je();Xe();lt();St();X();Ye();bc();Cc();br=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()}},wp=1024*1024,Tr=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 In(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:g}=Tc(u),[T,{total:y,estimated:S}]=await Promise.all([this.getPrimaryKeyColumns(m,p),this.countRows(m,p,f,g)]).catch(Y=>{throw Ge(Y)&&Y.code==="42P01"?new d(404,{message:`Table "${t}" does not exist`}):this.wrapError(Y)}),w=Array.isArray(i)?i.map(Y=>({column:Y.columnName,direction:Y.direction})):i?[{column:i,direction:c}]:[],A=T.length?T:["ctid"],N=w[0]?.direction??c,C=[...w,...A.filter(Y=>!w.some(mt=>mt.column===Y)).map(Y=>({column:Y,direction:N}))],_=C.map(Y=>Y.column),D=o==="desc",L=l?this.decodeCursor(l):null,{clause:H,values:$}=L?Sc(C,L.values,D,g.length+1):{clause:"",values:[]},Q=[f.replace(/^WHERE\s+/i,""),H].filter(Boolean),J=Q.length?`WHERE ${Q.join(" AND ")}`:"",ee=_.includes("ctid"),P=[...T.map(Y=>this.quoteIdentifier(Y)),...ee?["ctid"]:[]],ue=g.length+$.length+1,ye=(await m.query(`SELECT ${["*",...P].join(", ")} FROM ${p} ${J} ${wc(C,D)} LIMIT $${ue}`,[...g,...$,s+1])).rows,st=ye.length>s;st&&(ye=ye.slice(0,s)),o==="desc"&&(ye=ye.reverse());let q=ye.map(Y=>{if(!ee)return Y;let{ctid:mt,...xl}=Y;return xl}).filter(Y=>Object.keys(Y).length>0),oe=Y=>({values:Object.fromEntries(_.map(mt=>[mt,Y[mt]])),sortColumns:_}),Ar=null,Dr=null;if(ye.length>0){let Y=ye[0],mt=ye[ye.length-1];o==="asc"?(st&&(Ar=this.encodeCursor(oe(mt))),l&&(Dr=this.encodeCursor(oe(Y)))):(l&&(Ar=this.encodeCursor(oe(mt))),st&&(Dr=this.encodeCursor(oe(Y))))}return{data:q,meta:{limit:s,total:y,...S&&{totalEstimated:!0},hasNextPage:o==="asc"?st:!!l,hasPreviousPage:o==="asc"?!!l:st,nextCursor:Ar,prevCursor:Dr}}}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)`,Ze=(r,e)=>`COALESCE(${e}::text, ${Ep(r)})`,pe=(r,e)=>e?`${zt(e)}.${zt(r)}`:zt(r)});var br,wp,Tr,Rc=R(()=>{"use strict";h();j();Je();Xe();lt();St();X();Ye();bc();Cc();br=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()}},wp=1024*1024,Tr=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 In(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:g}=Tc(u),[T,{total:y,estimated:S}]=await Promise.all([this.getPrimaryKeyColumns(m,p),this.countRows(m,p,f,g)]).catch(Y=>{throw Ge(Y)&&Y.code==="42P01"?new d(404,{message:`Table "${t}" does not exist`}):this.wrapError(Y)}),w=Array.isArray(i)?i.map(Y=>({column:Y.columnName,direction:Y.direction})):i?[{column:i,direction:c}]:[],A=T.length?T:["ctid"],N=w[0]?.direction??c,C=[...w,...A.filter(Y=>!w.some(mt=>mt.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?Sc(C,x.values,D,g.length+1):{clause:"",values:[]},Q=[f.replace(/^WHERE\s+/i,""),H].filter(Boolean),J=Q.length?`WHERE ${Q.join(" AND ")}`:"",ee=_.includes("ctid"),P=[...T.map(Y=>this.quoteIdentifier(Y)),...ee?["ctid"]:[]],ue=g.length+$.length+1,ye=(await m.query(`SELECT ${["*",...P].join(", ")} FROM ${p} ${J} ${wc(C,D)} LIMIT $${ue}`,[...g,...$,s+1])).rows,st=ye.length>s;st&&(ye=ye.slice(0,s)),o==="desc"&&(ye=ye.reverse());let q=ye.map(Y=>{if(!ee)return Y;let{ctid:mt,...Ll}=Y;return Ll}).filter(Y=>Object.keys(Y).length>0),oe=Y=>({values:Object.fromEntries(_.map(mt=>[mt,Y[mt]])),sortColumns:_}),Ar=null,Dr=null;if(ye.length>0){let Y=ye[0],mt=ye[ye.length-1];o==="asc"?(st&&(Ar=this.encodeCursor(oe(mt))),l&&(Dr=this.encodeCursor(oe(Y)))):(l&&(Ar=this.encodeCursor(oe(mt))),st&&(Dr=this.encodeCursor(oe(Y))))}return{data:q,meta:{limit:s,total:y,...S&&{totalEstimated:!0},hasNextPage:o==="asc"?st:!!l,hasPreviousPage:o==="asc"?!!l:st,nextCursor:Ar,prevCursor:Dr}}}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
348
  FROM pg_catalog.pg_class WHERE oid = $2::regclass`,[ct,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(`
@@ -411,7 +411,7 @@ ${p}`}}return t},yp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
411
411
  current_setting('log_destination') AS destination,
412
412
  EXTRACT(EPOCH FROM (now() AT TIME ZONE current_setting('log_timezone'))
413
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(`${Pe} 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-wp),{rows:[l]}=await t.query(`${Pe} SELECT pg_read_binary_file($1, $2, $3) AS data`,[o.path,c,i-c]);return{available:!0,source:`${o.path} (${s})`,entries:Oe(gc(l.data.toString("utf8"),s,{logUtcOffsetMinutes:Number(n.offset),truncatedStart:c>0}))}}catch(n){if(Ge(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 = ${Ze("$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(!K.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 br(s,async l=>{let u=0;for(let{keyValues:m,rowUpdates:p}of c){let f=p.map((S,w)=>`"${S.columnName}" = $${w+1}`),g=p.map(S=>S.value!==null&&typeof S.value=="object"?JSON.stringify(S.value):S.value),T=i.map((S,w)=>`"${S}" = $${g.length+w+1}`);g.push(...m);let y=await l.query(`UPDATE ${o} SET ${f.join(", ")} WHERE ${T.join(" AND ")} RETURNING *`,g);if(y.rowCount===0)throw new d(404,{message:`Record with ${this.describeKey(i,m)} not found in table "${a}"`});u+=y.rowCount??0}return{updatedCount:u}})}catch(l){throw l instanceof d||Bt(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 br(s,async l=>{let u=await this.getFkConstraints(l,e,t),m=0,p=async(T,y,S,w)=>{let A=pe(T,y),N=await this.getFkConstraints(l,T,y);for(let D of N){let L=w.map((Q,J)=>`$${J+1}`).join(", "),{rows:H}=await l.query(`SELECT "${D.referencedColumn}" FROM ${A} WHERE "${S}" IN (${L})`,w),$=H.map(Q=>Q[D.referencedColumn]);$.length>0&&await p(D.referencingTable,D.referencingSchema,D.referencingColumn,$)}let C=w.map((D,L)=>`$${L+1}`).join(", "),_=await l.query(`DELETE FROM ${A} WHERE "${S}" IN (${C})`,w);m+=_.rowCount??0};for(let T of u)await p(T.referencingTable,T.referencingSchema,T.referencingColumn,c);let f=c.map((T,y)=>`$${y+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 br(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,g)=>`$${g+1}`).join(", ");try{await o.query(`INSERT INTO ${pe(e,t)} (${c}) VALUES (${p}) RETURNING *`,m),l++}catch(f){throw Bt(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||Bt(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 = ${Ze("$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
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-wp),{rows:[l]}=await t.query(`${Pe} SELECT pg_read_binary_file($1, $2, $3) AS data`,[o.path,c,i-c]);return{available:!0,source:`${o.path} (${s})`,entries:Oe(gc(l.data.toString("utf8"),s,{logUtcOffsetMinutes:Number(n.offset),truncatedStart:c>0}))}}catch(n){if(Ge(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 = ${Ze("$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(!K.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 br(s,async l=>{let u=0;for(let{keyValues:m,rowUpdates:p}of c){let f=p.map((S,w)=>`"${S.columnName}" = $${w+1}`),g=p.map(S=>S.value!==null&&typeof S.value=="object"?JSON.stringify(S.value):S.value),T=i.map((S,w)=>`"${S}" = $${g.length+w+1}`);g.push(...m);let y=await l.query(`UPDATE ${o} SET ${f.join(", ")} WHERE ${T.join(" AND ")} RETURNING *`,g);if(y.rowCount===0)throw new d(404,{message:`Record with ${this.describeKey(i,m)} not found in table "${a}"`});u+=y.rowCount??0}return{updatedCount:u}})}catch(l){throw l instanceof d||Bt(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 br(s,async l=>{let u=await this.getFkConstraints(l,e,t),m=0,p=async(T,y,S,w)=>{let A=pe(T,y),N=await this.getFkConstraints(l,T,y);for(let D of N){let x=w.map((Q,J)=>`$${J+1}`).join(", "),{rows:H}=await l.query(`SELECT "${D.referencedColumn}" FROM ${A} WHERE "${S}" IN (${x})`,w),$=H.map(Q=>Q[D.referencedColumn]);$.length>0&&await p(D.referencingTable,D.referencingSchema,D.referencingColumn,$)}let C=w.map((D,x)=>`$${x+1}`).join(", "),_=await l.query(`DELETE FROM ${A} WHERE "${S}" IN (${C})`,w);m+=_.rowCount??0};for(let T of u)await p(T.referencingTable,T.referencingSchema,T.referencingColumn,c);let f=c.map((T,y)=>`$${y+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 br(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,g)=>`$${g+1}`).join(", ");try{await o.query(`INSERT INTO ${pe(e,t)} (${c}) VALUES (${p}) RETURNING *`,m),l++}catch(f){throw Bt(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||Bt(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 = ${Ze("$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(
@@ -443,7 +443,7 @@ ${p}`}}return t},yp=r=>{let e=[],t=[],n="",a=!1;for(let s=0;s<r.length;s++){let
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
445
  WHERE tc.constraint_type = 'FOREIGN KEY' AND ccu.table_name = $1 AND ccu.table_schema = ${Ze("$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(g=>g.columnName===u.referencedColumn))continue;let p=i.map((g,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 Ic(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 Lc(r,e){if(r.length===0)return Gt(e);let t=r[0]?.toUpperCase()??"",n=r[1]?.toUpperCase();if((t==="ZRANGE"||t==="ZREVRANGE"||t==="ZRANGEBYSCORE")&&r.some(s=>s.toUpperCase()==="WITHSCORES"))return Cp(e);if(n){let s=`${t} ${n}`,o=_c[s];if(o)return o(e)}let a=_c[t];return a?a(e):typeof e=="string"||typeof e=="number"||e===null?Ae(e):Sp(e)?et(e):Gt(e)}var Sp,Oc,Gt,Ae,Nc,et,Ac,Cp,Rp,Dc,_c,xc=R(()=>{"use strict";h();Sp=r=>Array.isArray(r)&&r.every(e=>typeof e=="string"||e===null),Oc=r=>Array.isArray(r)&&r.length%2===0;Gt=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},Nc=r=>({columns:["status"],rows:[{status:r}],rowCount:1}),et=r=>Array.isArray(r)?{columns:["#","value"],rows:r.map((e,t)=>({"#":t,value:e})),rowCount:r.length}:Gt(r),Ac=r=>{if(!Oc(r))return Gt(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}},Cp=r=>{if(!Oc(r))return et(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}},Rp=r=>{if(typeof r!="string")return Gt(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}},Dc=r=>{if(!Array.isArray(r))return Gt(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}},_c={PING:Nc,GET:Ae,SET:Nc,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:et,MGET:et,KEYS:et,LRANGE:et,SMEMBERS:et,HGETALL:Ac,HKEYS:et,HVALS:et,"CONFIG GET":Ac,ZRANGE:et,INFO:Rp,XRANGE:Dc,XREVRANGE:Dc}});import{createHash as Np,randomBytes as Ap}from"crypto";import{z as nt}from"zod";function $c(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 jp(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 Mc(r){let e=r.key;if(e==null||e==="")throw new d(400,{message:"Field 'key' is required"});return String(e)}function Ds(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 Sr(r){return typeof r=="string"?r:r==null?"":typeof r=="object"?JSON.stringify(r):String(r)}function kc(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 Wp(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 Vp(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 Yp(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 An,Rs,Cn,Dp,_p,Op,Ip,Lp,xp,Pp,$p,Mp,yt,kp,De,vp,Up,Rn,qp,Ie,Bp,Er,z,wr,Dt,Nn,Ns,$e,As,Fp,Hp,tt,Qt,Jt,Pc,Kp,Cr,Uc=R(()=>{"use strict";h();Je();Xe();lt();X();xc();An=["strings","hashes","lists","sets","zsets","streams"],Rs={strings:"string",hashes:"hash",lists:"list",sets:"set",zsets:"zset",streams:"stream"},Cn="Schema is fixed for Redis tables; this operation is not supported",Dp="Sorting is not supported for Redis tables",_p="Filtering is not supported for Redis tables",Op="Backward pagination is not supported for Redis tables (SCAN is forward-only)",Ip=10,Lp=3e4,xp=1e4,Pp=256*1024,$p=8*1024*1024,Mp=r=>An.includes(r),yt=r=>{if(!Mp(r))throw new d(404,{message:`Table "${r}" does not exist in Redis. Valid tables: ${An.join(", ")}`});return r},kp=r=>/[\s"']/.test(r)||r===""?JSON.stringify(r):r,De=r=>{if(r==="")return Nt();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},vp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Up=r=>{try{return nt.object({scanCursor:nt.string().regex(/^\d+$/),search:nt.string().max(512).optional(),exactPattern:nt.boolean(),type:nt.enum(["string","hash","list","set","zset","stream"]).optional()}).parse(JSON.parse(Buffer.from(r,"base64url").toString("utf-8")))}catch{return null}},Rn=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),qp=r=>{try{return nt.object({key:nt.string().min(1).max(16*1024),type:nt.enum(["string","hash","list","set","zset","stream","unknown"]),cursor:nt.string().min(1).max(512),direction:nt.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")}},Bp=r=>r.replaceAll(/[\\*?[\]]/g,"\\$&"),Er=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"),wr=r=>r==="-"?Buffer.alloc(0):z(r),Dt=r=>Np("sha256").update(r).digest("base64url"),Nn=()=>new d(409,{message:"This key changed since it was loaded. Reload it or explicitly overwrite."}),Ns=r=>{let e=r instanceof Error?r.message:String(r);return/(NOPERM|unknown command|not allowed|unsupported)/i.test(e)},$e=(r,e)=>{if(r!==e)throw new d(400,{message:`This operation requires a ${e} key, but the key is ${r}.`})},As=r=>{if(r===null)throw Nn();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})},Fp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Hp=r=>{try{return JSON.parse(Buffer.from(r,"base64url").toString("utf-8"))}catch{return null}},tt=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}),Qt=tt({columnName:"key",dataType:"text",isPrimaryKey:!0}),Jt=tt({columnName:"ttl",dataType:"number",isNullable:!0}),Pc={strings:[Qt,tt({columnName:"value",dataType:"text",isNullable:!0}),Jt],hashes:[Qt,tt({columnName:"value",dataType:"json"}),Jt],lists:[Qt,tt({columnName:"value",dataType:"array"}),Jt],sets:[Qt,tt({columnName:"value",dataType:"array"}),Jt],zsets:[Qt,tt({columnName:"value",dataType:"json"}),Jt],streams:[Qt,tt({columnName:"length",dataType:"number"}),tt({columnName:"first-id",dataType:"text",isNullable:!0}),tt({columnName:"last-id",dataType:"text",isNullable:!0}),Jt]},Kp={strings:`-- Redis string keys
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 xc(r,e){if(r.length===0)return Gt(e);let t=r[0]?.toUpperCase()??"",n=r[1]?.toUpperCase();if((t==="ZRANGE"||t==="ZREVRANGE"||t==="ZRANGEBYSCORE")&&r.some(s=>s.toUpperCase()==="WITHSCORES"))return Cp(e);if(n){let s=`${t} ${n}`,o=_c[s];if(o)return o(e)}let a=_c[t];return a?a(e):typeof e=="string"||typeof e=="number"||e===null?Ae(e):Sp(e)?et(e):Gt(e)}var Sp,Oc,Gt,Ae,Nc,et,Ac,Cp,Rp,Dc,_c,Lc=R(()=>{"use strict";h();Sp=r=>Array.isArray(r)&&r.every(e=>typeof e=="string"||e===null),Oc=r=>Array.isArray(r)&&r.length%2===0;Gt=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},Nc=r=>({columns:["status"],rows:[{status:r}],rowCount:1}),et=r=>Array.isArray(r)?{columns:["#","value"],rows:r.map((e,t)=>({"#":t,value:e})),rowCount:r.length}:Gt(r),Ac=r=>{if(!Oc(r))return Gt(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}},Cp=r=>{if(!Oc(r))return et(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}},Rp=r=>{if(typeof r!="string")return Gt(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}},Dc=r=>{if(!Array.isArray(r))return Gt(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}},_c={PING:Nc,GET:Ae,SET:Nc,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:et,MGET:et,KEYS:et,LRANGE:et,SMEMBERS:et,HGETALL:Ac,HKEYS:et,HVALS:et,"CONFIG GET":Ac,ZRANGE:et,INFO:Rp,XRANGE:Dc,XREVRANGE:Dc}});import{createHash as Np,randomBytes as Ap}from"crypto";import{z as nt}from"zod";function $c(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 jp(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 Mc(r){let e=r.key;if(e==null||e==="")throw new d(400,{message:"Field 'key' is required"});return String(e)}function Ds(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 Sr(r){return typeof r=="string"?r:r==null?"":typeof r=="object"?JSON.stringify(r):String(r)}function kc(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 Wp(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 Vp(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 Yp(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 An,Rs,Cn,Dp,_p,Op,Ip,xp,Lp,Pp,$p,Mp,yt,kp,De,vp,Up,Rn,qp,Ie,Bp,Er,z,wr,Dt,Nn,Ns,$e,As,Fp,Hp,tt,Qt,Jt,Pc,Kp,Cr,Uc=R(()=>{"use strict";h();Je();Xe();lt();X();Lc();An=["strings","hashes","lists","sets","zsets","streams"],Rs={strings:"string",hashes:"hash",lists:"list",sets:"set",zsets:"zset",streams:"stream"},Cn="Schema is fixed for Redis tables; this operation is not supported",Dp="Sorting is not supported for Redis tables",_p="Filtering is not supported for Redis tables",Op="Backward pagination is not supported for Redis tables (SCAN is forward-only)",Ip=10,xp=3e4,Lp=1e4,Pp=256*1024,$p=8*1024*1024,Mp=r=>An.includes(r),yt=r=>{if(!Mp(r))throw new d(404,{message:`Table "${r}" does not exist in Redis. Valid tables: ${An.join(", ")}`});return r},kp=r=>/[\s"']/.test(r)||r===""?JSON.stringify(r):r,De=r=>{if(r==="")return Nt();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},vp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Up=r=>{try{return nt.object({scanCursor:nt.string().regex(/^\d+$/),search:nt.string().max(512).optional(),exactPattern:nt.boolean(),type:nt.enum(["string","hash","list","set","zset","stream"]).optional()}).parse(JSON.parse(Buffer.from(r,"base64url").toString("utf-8")))}catch{return null}},Rn=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),qp=r=>{try{return nt.object({key:nt.string().min(1).max(16*1024),type:nt.enum(["string","hash","list","set","zset","stream","unknown"]),cursor:nt.string().min(1).max(512),direction:nt.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")}},Bp=r=>r.replaceAll(/[\\*?[\]]/g,"\\$&"),Er=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"),wr=r=>r==="-"?Buffer.alloc(0):z(r),Dt=r=>Np("sha256").update(r).digest("base64url"),Nn=()=>new d(409,{message:"This key changed since it was loaded. Reload it or explicitly overwrite."}),Ns=r=>{let e=r instanceof Error?r.message:String(r);return/(NOPERM|unknown command|not allowed|unsupported)/i.test(e)},$e=(r,e)=>{if(r!==e)throw new d(400,{message:`This operation requires a ${e} key, but the key is ${r}.`})},As=r=>{if(r===null)throw Nn();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})},Fp=r=>Buffer.from(JSON.stringify(r)).toString("base64url"),Hp=r=>{try{return JSON.parse(Buffer.from(r,"base64url").toString("utf-8"))}catch{return null}},tt=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}),Qt=tt({columnName:"key",dataType:"text",isPrimaryKey:!0}),Jt=tt({columnName:"ttl",dataType:"number",isNullable:!0}),Pc={strings:[Qt,tt({columnName:"value",dataType:"text",isNullable:!0}),Jt],hashes:[Qt,tt({columnName:"value",dataType:"json"}),Jt],lists:[Qt,tt({columnName:"value",dataType:"array"}),Jt],sets:[Qt,tt({columnName:"value",dataType:"array"}),Jt],zsets:[Qt,tt({columnName:"value",dataType:"json"}),Jt],streams:[Qt,tt({columnName:"length",dataType:"number"}),tt({columnName:"first-id",dataType:"text",isNullable:!0}),tt({columnName:"last-id",dataType:"text",isNullable:!0}),Jt]},Kp={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,11 +455,11 @@ ${p}`}}return t},yp=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)`},Cr=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 w=Up(i);if(!w||w.search!==a||w.exactPattern!==s||w.type!==o)throw new d(400,{message:"Invalid or stale key scan cursor"});u=w.scanCursor}let m=a?s?a:`*${Bp(a)}*`:"*",p=[u,"MATCH",m,"COUNT",n];o&&p.push("TYPE",o);let[f,g]=await l.scanBuffer(...p),T=Buffer.isBuffer(f)?f.toString("utf8"):f,y=l.pipeline();for(let w of g)y.call("TYPE",w),y.pttl(w),y.call("MEMORY","USAGE",w);let S=await y.exec()??[];return{keys:g.map((w,A)=>{let N=A*3,C=S[N+2]?.[1];return{key:Ie(w),type:Er(S[N]?.[1]),ttlMs:Number(S[N+1]?.[1]??-2),memoryBytes:C==null?null:Number(C)}}),nextCursor:T==="0"?null:vp({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=wr(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)]),g=f;if(!g)throw new d(404,{message:"Redis key no longer exists"});let T=Er(u),y={key:Ie(c),type:T,ttlMs:Number(m),memoryBytes:p===null?null:Number(p),revision:Dt(g)},S=a?qp(a):null;if(a&&(!S||S.key!==n||S.type!==T||S.direction!==i))throw new d(400,{message:"Invalid or stale key details cursor"});if(T==="string"){let w=await l.strlen(c),A=o?$p:Pp,N=await l.getrangeBuffer(c,0,A-1);return{...y,length:w,value:{kind:"string",value:Ie(N),truncated:w>A},nextCursor:null,hasMore:!1}}if(T==="hash"){let[w,A]=await Promise.all([l.hlen(c),l.hscanBuffer(c,S?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N,D=[];for(let L=0;L<C.length;L+=2)D.push({field:Ie(C[L]),value:Ie(C[L+1])});return{...y,length:w,value:{kind:"hash",entries:D},nextCursor:_==="0"?null:Rn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="list"){let w=Number.parseInt(S?.cursor??"0",10),A=await l.llen(c),N=await l.lrangeBuffer(c,w,w+s-1),C=w+N.length,_=C<A;return{...y,length:A,value:{kind:"list",entries:N.map((D,L)=>({index:w+L,value:Ie(D)}))},nextCursor:_?Rn({key:n,type:T,cursor:String(C),direction:i}):null,hasMore:_}}if(T==="set"){let[w,A]=await Promise.all([l.scard(c),l.sscanBuffer(c,S?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N;return{...y,length:w,value:{kind:"set",members:C.map(Ie)},nextCursor:_==="0"?null:Rn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="zset"){let[w,A]=await Promise.all([l.zcard(c),l.zscanBuffer(c,S?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N,D=[];for(let L=0;L<C.length;L+=2)D.push({member:Ie(C[L]),score:(()=>{let H=C[L+1].toString("utf8");return H==="inf"?"inf":H==="-inf"?"-inf":Number(H)})()});return{...y,length:w,value:{kind:"zset",entries:D},nextCursor:_==="0"?null:Rn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="stream"){let w=S?.cursor??(i==="forward"?"-":"+"),[A,N]=await Promise.all([l.xlen(c),i==="forward"?l.xrangeBuffer(c,w,"+","COUNT",s+1):l.xrevrangeBuffer(c,w,"-","COUNT",s+1)]),C=N.length>s,D=N.slice(0,s).map(([H,$])=>{let Q=[];for(let J=0;J<$.length;J+=2)Q.push({field:Ie($[J]),value:Ie($[J+1])});return{id:H.toString("utf8"),fields:Q}}),L=D.at(-1)?.id;return{...y,length:A,value:{kind:"stream",entries:D},nextCursor:C&&L?Rn({key:n,type:T,cursor:`(${L}`,direction:i}):null,hasMore:C}}return{...y,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=wr(e.key),a=Er(await t.callBuffer("TYPE",n));if(a==="unknown")throw new d(404,{message:"Redis key no longer exists"});if($e(a,"string"),e.expectedRevision){let c=await t.callBuffer("DUMP",n);if(!c||Dt(c)!==e.expectedRevision)throw Nn()}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 nr(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),As(await a.exec());let s=await t.callBuffer("DUMP",n);if(!s)throw Nn();return{key:Ie(n),revision:Dt(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 nr(De(e.db));let n=wr(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&&Dt(c)!==e.expectedRevision)throw Nn();let l=Er(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:Dt(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":$e(l,"string"),u.set(n,z(e.operation.value.base64)),i>0&&u.pexpire(n,i);break;case"upsertHash":$e(l,"hash"),u.hset(n,z(e.operation.field.base64),z(e.operation.value.base64));break;case"deleteHash":$e(l,"hash"),u.hdel(n,z(e.operation.field.base64));break;case"pushList":$e(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":$e(l,"list"),u.lset(n,e.operation.index,z(e.operation.value.base64));break;case"deleteList":{$e(l,"list");let f=Buffer.concat([Buffer.from("db-studio:list-delete:"),Ap(32)]);u.lset(n,e.operation.index,f),u.lrem(n,1,f);break}case"addSet":$e(l,"set"),u.sadd(n,z(e.operation.member.base64));break;case"removeSet":$e(l,"set"),u.srem(n,z(e.operation.member.base64));break;case"upsertZset":$e(l,"zset"),u.zadd(n,e.operation.score,z(e.operation.member.base64));break;case"removeZset":$e(l,"zset"),u.zrem(n,z(e.operation.member.base64));break;case"appendStream":$e(l,"stream"),u.xadd(n,e.operation.id,...e.operation.fields.flatMap(({field:f,value:g})=>[z(f.base64),z(g.base64)]));break;case"deleteStream":$e(l,"stream"),u.xdel(n,e.operation.id);break}As(await u.exec());let m=a&&!a.equals(n)?a:n,p=await t.callBuffer("DUMP",m);return{key:Ie(m),revision:p?Dt(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 nr(De(e.db));let n=wr(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&&Dt(a)!==e.expectedRevision)throw Nn();let s=t.multi().del(n);return As(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(Nt()),t=1,n=!1,a=null;try{a=await e.call("CONFIG","GET","databases")}catch(c){if(!Ns(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(!Ns(c))throw c}let o=jp(s);return(n?Array.from({length:t},(c,l)=>l):[Nt()]).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(Nt())}}async getDatabaseConnectionInfo(){try{let e=await Re(Nt()),[t,n]=await Promise.all([e.info("server"),e.info("clients")]),a=$c(t),s=$c(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(!Ns(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??Nt()),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 An.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:Cn})}async getTableSchema({tableName:e}){let t=yt(e);return Kp[t]}async getTableColumns({tableName:e}){let t=yt(e);return Pc[t]}async addColumn(e){throw new d(400,{message:Cn})}async deleteColumn(e){throw new d(400,{message:Cn})}async alterColumn(e){throw new d(400,{message:Cn})}async renameColumn(e){throw new d(400,{message:Cn})}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:Op});if(i&&i.length>0)throw new d(400,{message:Dp});if(c&&c.length>0)throw new d(400,{message:_p});let l=yt(t),u=Rs[l],m=De(n),p=await Re(m),f="0";if(a){let D=Hp(a);if(!D||D.type!==l)throw new d(400,{message:"Invalid or mismatched cursor"});f=D.scanCursor}let g=[],T=0,y=!1;for(;g.length<s&&T<Ip;){let[D,L]=await p.scan(f,"MATCH","*","COUNT",Math.max(s*2,100),"TYPE",u);if(g.push(...L),f=D,T++,D==="0"){y=!0;break}}let S=g.slice(0,s),w=g.slice(s),A=await this.hydrateRows(p,l,S),N=await p.dbsize(),C=!y||w.length>0,_=C&&!y?Fp({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=Yp(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=Vp(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<Lp)return n.counts;let a={},s=t.pipeline();for(let i of An)s.scan("0","MATCH","*","COUNT",xp,"TYPE",Rs[i]);let o=await s.exec()??[];return An.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=yt(n),o=Mc(a),i=Ds(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=yt(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 g=String(f),T=u.get(g)??{...p.rowData};T[p.columnName]=p.value,u.set(g,T)}let m=0;for(let[p,f]of u.entries()){let g=f.value,T=Ds(f);await this.writeRecord(l,i,p,g,{mode:"update",ttl:T});let y=f[c],S=y==null?p:String(y);if(S!==p&&await l.renamenx(p,S)===0)throw new d(409,{message:`Key "${S}" already exists`});m++}return{updatedCount:m}}catch(n){throw this.wrapError(n)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:n,db:a}=e;yt(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=yt(t),o=await Re(De(a)),i=[],c=0;for(let l=0;l<n.length;l++){let u=n[l];try{let m=Mc(u),p=Ds(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=yt(e),a=De(t),s=await Re(a),o=Rs[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:Pc[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=kc(a,"hash"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Sr(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(Sr));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(Sr));return}case"zsets":{let s=Wp(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=kc(a,"stream"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Sr(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(kp).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=Ic(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{...Lc(a,c),duration:performance.now()-n,message:typeof c=="string"?c:void 0}}catch(a){throw this.wrapError(a)}}}});function _s(r){if(!r.length)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=Dn(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 Os(r,e){return Array.isArray(r)?r.length?`ORDER BY ${r.map(t=>`${Dn(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:"":r&&typeof r=="string"?`ORDER BY ${Dn(r)} ${e?.toUpperCase()||"ASC"}`:""}function Is(r,e,t){let{values:n,sortColumns:a}=r;if(!a.length)return{clause:"",values:[]};let c=t==="asc"===(e==="asc")?">":"<",l=a.map(Dn).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function _t(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 Fc(r){let e=[],t=0,n=!1,a=_t(r,0);for(;a<r.length;){let s=r[a];if(s===";"){t===0&&(n=!0,e=[]),a=_t(r,a+1);continue}if(n)return!0;let o=gt[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=_t(r,a)}return!1}function Hc(r){return zp.test(r.slice(_t(r,0)))}function qc(r,e){let t=gt[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 Bc(r){let e=[],t=_t(r,0);for(;t<r.length;){let n=t;if(gt[r[t]])t=qc(r,t);else if(r[t]==="("){let s=0;do{if(gt[r[t]]){t=qc(r,t);continue}if(r.startsWith("--",t)||r.startsWith("/*",t)){t=_t(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=_t(r,t)}return e}function Xp(r){let e=[];return r.forEach((t,n)=>{t.word!==void 0&&Kc.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=Bc(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 Bc(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&&Qp.has(m.word)))||Gp(m.text).toLowerCase()!==t.toLowerCase())return u.map(y=>y.text).join(" ");i++;let g=p.findIndex(y=>y.word&&Kc.has(y.word)),T=[];for(let y of Xp(g===-1?[]:p.slice(g)))y[0].word&&Jp.has(y[0].word)?T.at(-1)?.[0].word==="CONSTRAINT"&&T.pop():T.push(y);return[m.text,n.type,...T.flat().map(y=>y.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 ${Dn(e)} (${c.join(", ")})`,...l].join(" ")}var Dn,gt,zp,Gp,Qp,Kc,Jp,Wc=R(()=>{"use strict";h();Dn=r=>`"${r.replaceAll('"','""')}"`;gt={"'":"'",'"':'"',"`":"`","[":"]"};zp=/^(begin|start\s+transaction|commit|end|rollback|savepoint|release)\b/i;Gp=r=>gt[r[0]]?r.slice(1,-1).replaceAll(`${gt[r[0]]}${gt[r[0]]}`,gt[r[0]]):r,Qp=new Set(["CONSTRAINT","PRIMARY","UNIQUE","CHECK","FOREIGN"]),Kc=new Set(["CONSTRAINT","PRIMARY","NOT","NULL","UNIQUE","CHECK","DEFAULT","COLLATE","REFERENCES","GENERATED","AS"]),Jp=new Set(["NOT","NULL","DEFAULT"])});var Zp,ef,tf,nf,Ot,rf,af,sf,Ls,G,Vc,Rr,Yc=R(()=>{"use strict";h();j();Je();Xe();X();Wc();Zp={"'":"'",'"':'"',"`":"`","[":"]"},ef=r=>{let e=[],t=0,n=-1;for(let a=0;a<r.length;a++){let s=r[a]??"",o=Zp[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},tf=r=>r.every(e=>e!==null),nf=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),Ot=(r,e=[])=>({sql:r,args:e.map(nf)}),rf=BigInt(Number.MIN_SAFE_INTEGER),af=BigInt(Number.MAX_SAFE_INTEGER),sf=r=>typeof r=="bigint"?r>=rf&&r<=af?Number(r):r.toString():r instanceof ArrayBuffer?Buffer.from(r):r,Ls=({columns:r,rows:e})=>e.map(t=>Object.fromEntries(r.map((n,a)=>[n,sf(t[a])]))),G=async(r,e,t=[])=>Ls(await r.execute(Ot(e,t))),Vc=r=>r instanceof Error&&r.message.includes("FOREIGN KEY constraint failed"),Rr=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 Pn(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}=_s(c),f="",g=[];if(n){let C=this.decodeCursor(n);if(C){let _=Is(C,s,u);f=_.clause,g=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let y=Os((Array.isArray(o),o),i),S=y;s==="desc"?y?S=y.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):S=`ORDER BY ${l.map(C=>`${this.quoteIdentifier(C)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`:y||(S=`ORDER BY ${l.map(C=>`${this.quoteIdentifier(C)} ${u.toUpperCase()}`).join(", ")}`);let w=`SELECT * FROM ${this.quoteIdentifier(t)} ${T} ${S} LIMIT ?`,A=[...p,...g,a+1],N=`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${m}`;return{sql:w,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 g={values:Object.fromEntries(i.map(T=>[T,f[T]])),sortColumns:i};return this.encodeCursor(g)},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(q=>q.pk>0).sort((q,oe)=>q.pk-oe.pk).map(q=>q.name),f=[],g=i;Array.isArray(o)&&o.length>0?(f=o.map(q=>q.columnName),g=o[0].direction):typeof o=="string"&&o&&(f=[o]);let T=[...f,...p.filter(q=>!f.includes(q))],y=T.length===0;y&&T.push("rowid");let{clause:S,values:w}=_s(l),A="",N=[];if(c){let q=this.decodeCursor(c);if(q){let oe=Is(q,s,g);A=oe.clause,N=oe.values}}let C="";S&&A?C=`WHERE ${S.replace(/^WHERE\s+/i,"")} AND ${A}`:S?C=S:A&&(C=`WHERE ${A}`);let _=Os((Array.isArray(o),o),i),D=p.filter(q=>!f.includes(q)),L=_;if(s==="desc")if(_){if(L=_.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),D.length){let q=g==="asc"?"DESC":"ASC";L+=`, ${D.map(oe=>`${this.quoteIdentifier(oe)} ${q}`).join(", ")}`}}else L=`ORDER BY ${T.map(q=>`${this.quoteIdentifier(q)} ${g==="asc"?"DESC":"ASC"}`).join(", ")}`;else _?D.length&&(L+=`, ${D.map(q=>`${this.quoteIdentifier(q)} ${g.toUpperCase()}`).join(", ")}`):L=`ORDER BY ${T.map(q=>`${this.quoteIdentifier(q)} ${g.toUpperCase()}`).join(", ")}`;let[H]=await G(u,`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${S}`,w),$=Number(H?.total??0),J=await G(u,`SELECT ${y?"*, rowid":"*"} FROM ${this.quoteIdentifier(t)} ${C} ${L} LIMIT ?`,[...w,...N,a+1]),ee=J.length>a,P=ee?J.slice(0,a):J;s==="desc"&&(P=P.reverse());let ue=q=>({values:Object.fromEntries(T.map(oe=>[oe,q[oe]])),sortColumns:T}),at=null,ye=null;if(P.length>0){let q=P[0],oe=P[P.length-1];s==="asc"?(ee&&(at=this.encodeCursor(ue(oe))),c&&(ye=this.encodeCursor(ue(q)))):(c&&(at=this.encodeCursor(ue(oe))),ee&&(ye=this.encodeCursor(ue(q))))}return{data:y?P.map(({rowid:q,...oe})=>oe):P,meta:{limit:a,total:$,hasNextPage:s==="asc"?ee:!!c,hasPreviousPage:s==="asc"?!!c:ee,nextCursor:at,prevCursor:ye}}}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)`},Cr=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 w=Up(i);if(!w||w.search!==a||w.exactPattern!==s||w.type!==o)throw new d(400,{message:"Invalid or stale key scan cursor"});u=w.scanCursor}let m=a?s?a:`*${Bp(a)}*`:"*",p=[u,"MATCH",m,"COUNT",n];o&&p.push("TYPE",o);let[f,g]=await l.scanBuffer(...p),T=Buffer.isBuffer(f)?f.toString("utf8"):f,y=l.pipeline();for(let w of g)y.call("TYPE",w),y.pttl(w),y.call("MEMORY","USAGE",w);let S=await y.exec()??[];return{keys:g.map((w,A)=>{let N=A*3,C=S[N+2]?.[1];return{key:Ie(w),type:Er(S[N]?.[1]),ttlMs:Number(S[N+1]?.[1]??-2),memoryBytes:C==null?null:Number(C)}}),nextCursor:T==="0"?null:vp({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=wr(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)]),g=f;if(!g)throw new d(404,{message:"Redis key no longer exists"});let T=Er(u),y={key:Ie(c),type:T,ttlMs:Number(m),memoryBytes:p===null?null:Number(p),revision:Dt(g)},S=a?qp(a):null;if(a&&(!S||S.key!==n||S.type!==T||S.direction!==i))throw new d(400,{message:"Invalid or stale key details cursor"});if(T==="string"){let w=await l.strlen(c),A=o?$p:Pp,N=await l.getrangeBuffer(c,0,A-1);return{...y,length:w,value:{kind:"string",value:Ie(N),truncated:w>A},nextCursor:null,hasMore:!1}}if(T==="hash"){let[w,A]=await Promise.all([l.hlen(c),l.hscanBuffer(c,S?.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{...y,length:w,value:{kind:"hash",entries:D},nextCursor:_==="0"?null:Rn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="list"){let w=Number.parseInt(S?.cursor??"0",10),A=await l.llen(c),N=await l.lrangeBuffer(c,w,w+s-1),C=w+N.length,_=C<A;return{...y,length:A,value:{kind:"list",entries:N.map((D,x)=>({index:w+x,value:Ie(D)}))},nextCursor:_?Rn({key:n,type:T,cursor:String(C),direction:i}):null,hasMore:_}}if(T==="set"){let[w,A]=await Promise.all([l.scard(c),l.sscanBuffer(c,S?.cursor??"0","COUNT",String(s))]),[N,C]=A,_=Buffer.isBuffer(N)?N.toString("utf8"):N;return{...y,length:w,value:{kind:"set",members:C.map(Ie)},nextCursor:_==="0"?null:Rn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="zset"){let[w,A]=await Promise.all([l.zcard(c),l.zscanBuffer(c,S?.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{...y,length:w,value:{kind:"zset",entries:D},nextCursor:_==="0"?null:Rn({key:n,type:T,cursor:_,direction:i}),hasMore:_!=="0"}}if(T==="stream"){let w=S?.cursor??(i==="forward"?"-":"+"),[A,N]=await Promise.all([l.xlen(c),i==="forward"?l.xrangeBuffer(c,w,"+","COUNT",s+1):l.xrevrangeBuffer(c,w,"-","COUNT",s+1)]),C=N.length>s,D=N.slice(0,s).map(([H,$])=>{let Q=[];for(let J=0;J<$.length;J+=2)Q.push({field:Ie($[J]),value:Ie($[J+1])});return{id:H.toString("utf8"),fields:Q}}),x=D.at(-1)?.id;return{...y,length:A,value:{kind:"stream",entries:D},nextCursor:C&&x?Rn({key:n,type:T,cursor:`(${x}`,direction:i}):null,hasMore:C}}return{...y,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=wr(e.key),a=Er(await t.callBuffer("TYPE",n));if(a==="unknown")throw new d(404,{message:"Redis key no longer exists"});if($e(a,"string"),e.expectedRevision){let c=await t.callBuffer("DUMP",n);if(!c||Dt(c)!==e.expectedRevision)throw Nn()}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 nr(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),As(await a.exec());let s=await t.callBuffer("DUMP",n);if(!s)throw Nn();return{key:Ie(n),revision:Dt(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 nr(De(e.db));let n=wr(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&&Dt(c)!==e.expectedRevision)throw Nn();let l=Er(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:Dt(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":$e(l,"string"),u.set(n,z(e.operation.value.base64)),i>0&&u.pexpire(n,i);break;case"upsertHash":$e(l,"hash"),u.hset(n,z(e.operation.field.base64),z(e.operation.value.base64));break;case"deleteHash":$e(l,"hash"),u.hdel(n,z(e.operation.field.base64));break;case"pushList":$e(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":$e(l,"list"),u.lset(n,e.operation.index,z(e.operation.value.base64));break;case"deleteList":{$e(l,"list");let f=Buffer.concat([Buffer.from("db-studio:list-delete:"),Ap(32)]);u.lset(n,e.operation.index,f),u.lrem(n,1,f);break}case"addSet":$e(l,"set"),u.sadd(n,z(e.operation.member.base64));break;case"removeSet":$e(l,"set"),u.srem(n,z(e.operation.member.base64));break;case"upsertZset":$e(l,"zset"),u.zadd(n,e.operation.score,z(e.operation.member.base64));break;case"removeZset":$e(l,"zset"),u.zrem(n,z(e.operation.member.base64));break;case"appendStream":$e(l,"stream"),u.xadd(n,e.operation.id,...e.operation.fields.flatMap(({field:f,value:g})=>[z(f.base64),z(g.base64)]));break;case"deleteStream":$e(l,"stream"),u.xdel(n,e.operation.id);break}As(await u.exec());let m=a&&!a.equals(n)?a:n,p=await t.callBuffer("DUMP",m);return{key:Ie(m),revision:p?Dt(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 nr(De(e.db));let n=wr(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&&Dt(a)!==e.expectedRevision)throw Nn();let s=t.multi().del(n);return As(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(Nt()),t=1,n=!1,a=null;try{a=await e.call("CONFIG","GET","databases")}catch(c){if(!Ns(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(!Ns(c))throw c}let o=jp(s);return(n?Array.from({length:t},(c,l)=>l):[Nt()]).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(Nt())}}async getDatabaseConnectionInfo(){try{let e=await Re(Nt()),[t,n]=await Promise.all([e.info("server"),e.info("clients")]),a=$c(t),s=$c(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(!Ns(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??Nt()),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 An.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:Cn})}async getTableSchema({tableName:e}){let t=yt(e);return Kp[t]}async getTableColumns({tableName:e}){let t=yt(e);return Pc[t]}async addColumn(e){throw new d(400,{message:Cn})}async deleteColumn(e){throw new d(400,{message:Cn})}async alterColumn(e){throw new d(400,{message:Cn})}async renameColumn(e){throw new d(400,{message:Cn})}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:Op});if(i&&i.length>0)throw new d(400,{message:Dp});if(c&&c.length>0)throw new d(400,{message:_p});let l=yt(t),u=Rs[l],m=De(n),p=await Re(m),f="0";if(a){let D=Hp(a);if(!D||D.type!==l)throw new d(400,{message:"Invalid or mismatched cursor"});f=D.scanCursor}let g=[],T=0,y=!1;for(;g.length<s&&T<Ip;){let[D,x]=await p.scan(f,"MATCH","*","COUNT",Math.max(s*2,100),"TYPE",u);if(g.push(...x),f=D,T++,D==="0"){y=!0;break}}let S=g.slice(0,s),w=g.slice(s),A=await this.hydrateRows(p,l,S),N=await p.dbsize(),C=!y||w.length>0,_=C&&!y?Fp({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=Yp(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=Vp(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<xp)return n.counts;let a={},s=t.pipeline();for(let i of An)s.scan("0","MATCH","*","COUNT",Lp,"TYPE",Rs[i]);let o=await s.exec()??[];return An.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=yt(n),o=Mc(a),i=Ds(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=yt(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 g=String(f),T=u.get(g)??{...p.rowData};T[p.columnName]=p.value,u.set(g,T)}let m=0;for(let[p,f]of u.entries()){let g=f.value,T=Ds(f);await this.writeRecord(l,i,p,g,{mode:"update",ttl:T});let y=f[c],S=y==null?p:String(y);if(S!==p&&await l.renamenx(p,S)===0)throw new d(409,{message:`Key "${S}" already exists`});m++}return{updatedCount:m}}catch(n){throw this.wrapError(n)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:n,db:a}=e;yt(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=yt(t),o=await Re(De(a)),i=[],c=0;for(let l=0;l<n.length;l++){let u=n[l];try{let m=Mc(u),p=Ds(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=yt(e),a=De(t),s=await Re(a),o=Rs[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:Pc[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=kc(a,"hash"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Sr(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(Sr));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(Sr));return}case"zsets":{let s=Wp(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=kc(a,"stream"),o=[];for(let[i,c]of Object.entries(s))o.push(i,Sr(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(kp).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=Ic(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{...xc(a,c),duration:performance.now()-n,message:typeof c=="string"?c:void 0}}catch(a){throw this.wrapError(a)}}}});function _s(r){if(!r.length)return{clause:"",values:[]};let e=[],t=[];for(let n of r){let a=Dn(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 Os(r,e){return Array.isArray(r)?r.length?`ORDER BY ${r.map(t=>`${Dn(t.columnName)} ${t.direction.toUpperCase()}`).join(", ")}`:"":r&&typeof r=="string"?`ORDER BY ${Dn(r)} ${e?.toUpperCase()||"ASC"}`:""}function Is(r,e,t){let{values:n,sortColumns:a}=r;if(!a.length)return{clause:"",values:[]};let c=t==="asc"===(e==="asc")?">":"<",l=a.map(Dn).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>n[p]);return{clause:`(${l}) ${c} (${u})`,values:m}}function _t(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 Fc(r){let e=[],t=0,n=!1,a=_t(r,0);for(;a<r.length;){let s=r[a];if(s===";"){t===0&&(n=!0,e=[]),a=_t(r,a+1);continue}if(n)return!0;let o=gt[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=_t(r,a)}return!1}function Hc(r){return zp.test(r.slice(_t(r,0)))}function qc(r,e){let t=gt[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 Bc(r){let e=[],t=_t(r,0);for(;t<r.length;){let n=t;if(gt[r[t]])t=qc(r,t);else if(r[t]==="("){let s=0;do{if(gt[r[t]]){t=qc(r,t);continue}if(r.startsWith("--",t)||r.startsWith("/*",t)){t=_t(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=_t(r,t)}return e}function Xp(r){let e=[];return r.forEach((t,n)=>{t.word!==void 0&&Kc.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=Bc(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 Bc(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&&Qp.has(m.word)))||Gp(m.text).toLowerCase()!==t.toLowerCase())return u.map(y=>y.text).join(" ");i++;let g=p.findIndex(y=>y.word&&Kc.has(y.word)),T=[];for(let y of Xp(g===-1?[]:p.slice(g)))y[0].word&&Jp.has(y[0].word)?T.at(-1)?.[0].word==="CONSTRAINT"&&T.pop():T.push(y);return[m.text,n.type,...T.flat().map(y=>y.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 ${Dn(e)} (${c.join(", ")})`,...l].join(" ")}var Dn,gt,zp,Gp,Qp,Kc,Jp,Wc=R(()=>{"use strict";h();Dn=r=>`"${r.replaceAll('"','""')}"`;gt={"'":"'",'"':'"',"`":"`","[":"]"};zp=/^(begin|start\s+transaction|commit|end|rollback|savepoint|release)\b/i;Gp=r=>gt[r[0]]?r.slice(1,-1).replaceAll(`${gt[r[0]]}${gt[r[0]]}`,gt[r[0]]):r,Qp=new Set(["CONSTRAINT","PRIMARY","UNIQUE","CHECK","FOREIGN"]),Kc=new Set(["CONSTRAINT","PRIMARY","NOT","NULL","UNIQUE","CHECK","DEFAULT","COLLATE","REFERENCES","GENERATED","AS"]),Jp=new Set(["NOT","NULL","DEFAULT"])});var Zp,ef,tf,nf,Ot,rf,af,sf,xs,G,Vc,Rr,Yc=R(()=>{"use strict";h();j();Je();Xe();X();Wc();Zp={"'":"'",'"':'"',"`":"`","[":"]"},ef=r=>{let e=[],t=0,n=-1;for(let a=0;a<r.length;a++){let s=r[a]??"",o=Zp[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},tf=r=>r.every(e=>e!==null),nf=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),Ot=(r,e=[])=>({sql:r,args:e.map(nf)}),rf=BigInt(Number.MIN_SAFE_INTEGER),af=BigInt(Number.MAX_SAFE_INTEGER),sf=r=>typeof r=="bigint"?r>=rf&&r<=af?Number(r):r.toString():r instanceof ArrayBuffer?Buffer.from(r):r,xs=({columns:r,rows:e})=>e.map(t=>Object.fromEntries(r.map((n,a)=>[n,sf(t[a])]))),G=async(r,e,t=[])=>xs(await r.execute(Ot(e,t))),Vc=r=>r instanceof Error&&r.message.includes("FOREIGN KEY constraint failed"),Rr=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 Pn(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}=_s(c),f="",g=[];if(n){let C=this.decodeCursor(n);if(C){let _=Is(C,s,u);f=_.clause,g=_.values}}let T="";m&&f?T=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${f}`:m?T=m:f&&(T=`WHERE ${f}`);let y=Os((Array.isArray(o),o),i),S=y;s==="desc"?y?S=y.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):S=`ORDER BY ${l.map(C=>`${this.quoteIdentifier(C)} ${u==="asc"?"DESC":"ASC"}`).join(", ")}`:y||(S=`ORDER BY ${l.map(C=>`${this.quoteIdentifier(C)} ${u.toUpperCase()}`).join(", ")}`);let w=`SELECT * FROM ${this.quoteIdentifier(t)} ${T} ${S} LIMIT ?`,A=[...p,...g,a+1],N=`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${m}`;return{sql:w,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 g={values:Object.fromEntries(i.map(T=>[T,f[T]])),sortColumns:i};return this.encodeCursor(g)},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(q=>q.pk>0).sort((q,oe)=>q.pk-oe.pk).map(q=>q.name),f=[],g=i;Array.isArray(o)&&o.length>0?(f=o.map(q=>q.columnName),g=o[0].direction):typeof o=="string"&&o&&(f=[o]);let T=[...f,...p.filter(q=>!f.includes(q))],y=T.length===0;y&&T.push("rowid");let{clause:S,values:w}=_s(l),A="",N=[];if(c){let q=this.decodeCursor(c);if(q){let oe=Is(q,s,g);A=oe.clause,N=oe.values}}let C="";S&&A?C=`WHERE ${S.replace(/^WHERE\s+/i,"")} AND ${A}`:S?C=S:A&&(C=`WHERE ${A}`);let _=Os((Array.isArray(o),o),i),D=p.filter(q=>!f.includes(q)),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 q=g==="asc"?"DESC":"ASC";x+=`, ${D.map(oe=>`${this.quoteIdentifier(oe)} ${q}`).join(", ")}`}}else x=`ORDER BY ${T.map(q=>`${this.quoteIdentifier(q)} ${g==="asc"?"DESC":"ASC"}`).join(", ")}`;else _?D.length&&(x+=`, ${D.map(q=>`${this.quoteIdentifier(q)} ${g.toUpperCase()}`).join(", ")}`):x=`ORDER BY ${T.map(q=>`${this.quoteIdentifier(q)} ${g.toUpperCase()}`).join(", ")}`;let[H]=await G(u,`SELECT COUNT(*) as total FROM ${this.quoteIdentifier(t)} ${S}`,w),$=Number(H?.total??0),J=await G(u,`SELECT ${y?"*, rowid":"*"} FROM ${this.quoteIdentifier(t)} ${C} ${x} LIMIT ?`,[...w,...N,a+1]),ee=J.length>a,P=ee?J.slice(0,a):J;s==="desc"&&(P=P.reverse());let ue=q=>({values:Object.fromEntries(T.map(oe=>[oe,q[oe]])),sortColumns:T}),at=null,ye=null;if(P.length>0){let q=P[0],oe=P[P.length-1];s==="asc"?(ee&&(at=this.encodeCursor(ue(oe))),c&&(ye=this.encodeCursor(ue(q)))):(c&&(at=this.encodeCursor(ue(oe))),ee&&(ye=this.encodeCursor(ue(q))))}return{data:y?P.map(({rowid:q,...oe})=>oe):P,meta:{limit:a,total:$,hasNextPage:s==="asc"?ee:!!c,hasPreviousPage:s==="asc"?!!c:ee,nextCursor:at,prevCursor:ye}}}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:Ls(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:Pn(l),dataTypeLabel:Hr(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]),g=jc(f?.sql??"",p,n,{type:a,notNull:!s&&!m.pk,defaultValue:o?.trim()||null});if(!g)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(", "),y=C=>`'${C.replaceAll("'","''")}'`,S=/\bAUTOINCREMENT\b/i.test(g)?[`DELETE FROM sqlite_sequence WHERE name = ${y(p)}`,`INSERT INTO sqlite_sequence (name, seq) SELECT ${y(p)}, seq FROM sqlite_sequence WHERE name = ${y(t)}`]:[],w=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([g,`INSERT INTO ${l(p)} (${T}) SELECT ${T} FROM ${l(t)}`,...S,`DROP TABLE ${l(t)}`,`ALTER TABLE ${l(p)} RENAME TO ${l(t)}`,...w.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(Ot(`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})=>[Ot(`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})=>Ot(`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(Ot(`DELETE FROM "${e}" WHERE "${a}" IN (${o})`,s))).rowsAffected,fkViolation:!1,relatedRecords:[]}}catch(c){if(Vc(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,g,T)=>{for(let y of l.get(f)??[]){if(T.includes(y.childTable))continue;let S=tf(y.parentColumns)?y.parentColumns:await this.getPrimaryKeyColumns(c,f),w=`(${y.childColumns.map(s).join(", ")}) IN (SELECT ${S.map(s).join(", ")} FROM ${s(f)} WHERE ${g})`;await m(y.childTable,w,[...T,y.childTable])}u.push(Ot(`DELETE FROM ${s(f)} WHERE ${g}`,o))};return await m(e,i,[e]),{deletedCount:(await c.batch(u,"write")).reduce((f,g)=>f+g.rowsAffected,0)}}catch(c){throw Vc(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=>Ot(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(Hc(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(Fc(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=Ls(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:xs(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:Pn(l),dataTypeLabel:Hr(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]),g=jc(f?.sql??"",p,n,{type:a,notNull:!s&&!m.pk,defaultValue:o?.trim()||null});if(!g)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(", "),y=C=>`'${C.replaceAll("'","''")}'`,S=/\bAUTOINCREMENT\b/i.test(g)?[`DELETE FROM sqlite_sequence WHERE name = ${y(p)}`,`INSERT INTO sqlite_sequence (name, seq) SELECT ${y(p)}, seq FROM sqlite_sequence WHERE name = ${y(t)}`]:[],w=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([g,`INSERT INTO ${l(p)} (${T}) SELECT ${T} FROM ${l(t)}`,...S,`DROP TABLE ${l(t)}`,`ALTER TABLE ${l(p)} RENAME TO ${l(t)}`,...w.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(Ot(`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})=>[Ot(`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})=>Ot(`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(Ot(`DELETE FROM "${e}" WHERE "${a}" IN (${o})`,s))).rowsAffected,fkViolation:!1,relatedRecords:[]}}catch(c){if(Vc(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,g,T)=>{for(let y of l.get(f)??[]){if(T.includes(y.childTable))continue;let S=tf(y.parentColumns)?y.parentColumns:await this.getPrimaryKeyColumns(c,f),w=`(${y.childColumns.map(s).join(", ")}) IN (SELECT ${S.map(s).join(", ")} FROM ${s(f)} WHERE ${g})`;await m(y.childTable,w,[...T,y.childTable])}u.push(Ot(`DELETE FROM ${s(f)} WHERE ${g}`,o))};return await m(e,i,[e]),{deletedCount:(await c.batch(u,"write")).reduce((f,g)=>f+g.rowsAffected,0)}}catch(c){throw Vc(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=>Ot(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(Hc(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(Fc(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=xs(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
@@ -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 el=R(()=>{"use strict";h();j()});function pf(r){let e={name:r.columnName,type:r.dataTypeLabel,nullable:r.isNullable};return r.isPrimaryKey&&(e.isPrimaryKey=!0),r.isForeignKey&&r.referencedTable&&r.referencedColumn&&(e.foreignKey=`${r.referencedTable}.${r.referencedColumn}`),r.enumValues&&r.enumValues.length>0&&(e.enumValues=r.enumValues,e.description=`Enum values: ${r.enumValues.join(", ")}`),e}function ff(r){let e=[];for(let t of r)for(let n of t.columns)if(n.foreignKey){let[a,s]=n.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:n.name,toTable:a,toColumn:s})}return e}async function hf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",fe(n)),[]}}async function tl(r){let e=Ct(),t=Kt(e);try{let n=await t.getTablesList(r),a=await Promise.all(n.map(async({schemaName:o,tableName:i})=>({name:o?`${o}.${i}`:i,columns:(await hf(t,i,r)).map(pf)}))),s=ff(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",fe(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var nl=R(()=>{"use strict";h();Rt();Qe();Ve()});import{Elysia as yf}from"elysia";var gf,bf,rl,al,sl=R(()=>{"use strict";h();tn();j();X();Ve();el();nl();gf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),bf=new Set(["localhost","127.0.0.1","::1","[::1]"]),rl=()=>{let r;try{r=new URL(ot.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=bf.has(r.hostname)||r.hostname.endsWith(".localhost");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&e))throw new d(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return r.origin},al=new yf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=rl();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":r["cf-connecting-ip"]??"","x-real-ip":r["x-real-ip"]??"","x-forwarded-for":r["x-forwarded-for"]??"","x-api-key":r["x-api-key"]??"","x-request-id":it()??""}});return t.ok?await t.json():(Z("warn","chat_limit_unavailable",{proxy_status:t.status}),{limit:3,used:3,remaining:0})}catch{return{limit:3,used:3,remaining:0}}}).post("/",async({body:{messages:r,data:e,provider:t,model:n},headers:a,set:s})=>{let{db:o,conversationId:i,includeSchema:c}=e,l=c?await tl(o):null,u=Zc(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${rl()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":a["cf-connecting-ip"]??"","x-real-ip":a["x-real-ip"]??"","x-forwarded-for":a["x-forwarded-for"]??"","x-api-key":a["x-api-key"]??"","x-byok-gemini":a["x-byok-gemini"]??"","x-byok-openai":a["x-byok-openai"]??"","x-byok-anthropic":a["x-byok-anthropic"]??"","x-byok-grok":a["x-byok-grok"]??"","x-byok-openrouter":a["x-byok-openrouter"]??"","x-request-id":it()??""},body:JSON.stringify(m)});if(!p.ok){Z("warn","chat_proxy_rejected",{proxy_status:p.status,provider:t,model:n});let f=await p.json();return Response.json({error:f.error||"Proxy request failed"},{status:p.status})}for(let[f,g]of p.headers)gf.has(f)||(s.headers[f]=g);return p.body},{body:vr})});import{Elysia as Tf}from"elysia";var ol,il=R(()=>{"use strict";h();j();Xa();_a();ol=new Tf({prefix:"/connections"}).get("/",async()=>({data:await bn()})).post("/",async({body:r})=>{let e=await Zn(r.url,{requireExistingFile:!0});return{data:await bn(e)}},{body:Vr}).post("/:id/connect",async({params:r})=>({data:await bn(await Qa(r.id))})).patch("/:id",async({params:r,body:e})=>({data:Ja(await mi(r.id,e))}),{body:Yr}).delete("/:id",async({params:r})=>(await di(r.id),{data:"Connection removed"}))});import{Elysia as Ef}from"elysia";var cl,ll=R(()=>{"use strict";h();Rt();Qe();cl=new Ef({prefix:"/databases"}).derive(()=>{let r=Ct();return{dbType:r,adapter:Kt(r)}}).get("/",async({adapter:r,dbType:e})=>({data:{databases:await r.getDatabasesList(),dbType:e}})).get("/current",async({adapter:r,dbType:e})=>({data:{db:(await r.getCurrentDatabase()).db,dbType:e}})).get("/connection",async({adapter:r})=>({data:await r.getDatabaseConnectionInfo()}))});import{Elysia as wf}from"elysia";var rt,Xt=R(()=>{"use strict";h();j();Rt();Qe();X();rt=new wf().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!ge.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${ge.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!hn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Ct();if(a!==t)throw new d(409,{message:`The open connection is ${K[a].label}. Reload the page.`});return{dbType:t,adapter:Kt(t)}})});import{Elysia as Sf}from"elysia";var ul,ml=R(()=>{"use strict";h();j();Rt();Xt();ul=new Sf({prefix:"/keys"}).use(rt).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:Ci(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:Zr}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:v,body:ra}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:na,params:vt}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:ta,params:vt}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:v,params:vt,body:aa}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:sa,params:vt})});import{Elysia as Cf}from"elysia";var dl,pl=R(()=>{"use strict";h();j();Xt();dl=new Cf({prefix:"/logs"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:v})});import{Elysia as Rf}from"elysia";var fl,hl=R(()=>{"use strict";h();j();Xt();fl=new Rf({prefix:"/query"}).use(rt).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:v,body:Jr})});import{Elysia as Nf}from"elysia";var yl,gl=R(()=>{"use strict";h();j();Xt();yl=new Nf({prefix:"/records"}).use(rt).post("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,data:a}})=>{let{insertedCount:s}=await r.addRecord({db:e,schemaName:t,params:{tableName:n,data:a}});return{data:`Record inserted into "${n}" with ${s} rows inserted`}},{query:M,body:Lr}).patch("/",async({adapter:r,query:{db:e,schemaName:t},body:n})=>{let{updatedCount:a}=await r.updateRecords({params:n,schemaName:t,db:e});return{data:`Updated ${a} records in "${n.tableName}"`}},{query:M,body:ca}).delete("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a},status:s})=>{let{deletedCount:o,fkViolation:i,relatedRecords:c}=await r.deleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e});return i?s(409,{data:{deletedCount:0,fkViolation:!0,relatedRecords:c}}):{data:{deletedCount:o,fkViolation:!1,relatedRecords:[]}}},{query:M,body:vn}).delete("/force",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a}})=>({data:await r.forceDeleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e})}),{query:M,body:vn}).post("/bulk",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,records:a}})=>({data:await r.bulkInsertRecords({tableName:n,schemaName:t,records:a,db:e})}),{query:M,body:kr})});async function Tl({cols:r,rows:e,format:t,tableName:n}){if(t==="json"){let o=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(o,"utf-8"))}let{utils:a,write:s}=await import("xlsx");switch(t){case"csv":{let o=a.aoa_to_sheet(bl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(bl(r,e)),i=a.book_new();a.book_append_sheet(i,o,n.slice(0,31));let c=s(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var Af,bl,El=R(()=>{"use strict";h();Af=r=>r==null||r instanceof Date?r:Buffer.isBuffer(r)?`0x${r.toString("hex")}`:typeof r=="object"?JSON.stringify(r):typeof r=="bigint"?r.toString():r,bl=(r,e)=>[r,...e?.map(t=>r?.map(n=>Af(t[n])))??[]]});import{Elysia as Df}from"elysia";var _f,wl,Sl=R(()=>{"use strict";h();j();Xt();El();_f={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},wl=new Df({prefix:"/tables"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:v}).get("/graph",async({adapter:r,query:{db:e}})=>{let t=await r.getTablesList(e);return{data:await Promise.all(t.map(async n=>({...n,columns:await r.getTableColumns({tableName:n.tableName,schemaName:n.schemaName,db:e})})))}},{query:v}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:v,body:Gr}).delete("/:tableName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a}})=>({data:await r.deleteTable({tableName:a,schemaName:t,db:e,cascade:n})}),{query:Qr,params:ie}).patch("/:tableName/rename",async({adapter:r,query:{db:e},params:{tableName:t},body:n})=>(await r.renameTable({tableName:t,db:e,...n}),{data:`Table "${t}" renamed to "${n.newTableName}"`}),{query:v,params:ie,body:sn}).delete("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a,columnName:s}})=>{let{deletedCount:o}=await r.deleteColumn({schemaName:t,tableName:a,columnName:s,cascade:n,db:e});return{data:`Column "${s}" deleted successfully from table "${a}" with ${o} rows deleted`}},{query:Mr,params:Ee}).post("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.addColumn({tableName:n,schemaName:t,db:e,...a}),{data:`Column "${a.columnName}" added successfully to table "${n}"`}),{query:M,params:ie,body:Be}).patch("/:tableName/columns/:columnName/rename",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.renameColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" renamed to "${s.newColumnName}" in table "${n}"`}),{query:M,params:Ee,body:Fn}).patch("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.alterColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" updated successfully in table "${n}"`}),{query:M,params:Ee,body:Pt}).get("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableColumns({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).get("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableIndexes({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).post("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.createIndex({tableName:n,schemaName:t,db:e,...a}),{data:`Index "${a.indexName}" created successfully on table "${n}"`}),{query:M,params:ie,body:Un}).delete("/:tableName/indexes/:indexName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,indexName:a}})=>(await r.dropIndex({tableName:n,schemaName:t,indexName:a,db:e}),{data:`Index "${a}" dropped successfully from table "${n}"`}),{query:M,params:qn}).get("/:tableName/schema",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:{schema:await r.getTableSchema({tableName:n,schemaName:t,db:e})}}),{query:M,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:ia,params:ie}).get("/:tableName/export",async({adapter:r,query:{db:e,schemaName:t,format:n},params:{tableName:a}})=>{let{cols:s,rows:o}=await r.exportTableData({tableName:a,schemaName:t,db:e});return new Response(await Tl({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":_f[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:Xr,params:ie})});import{Elysia as Of}from"elysia";import{z as Cl}from"zod";var If,Rl,Nl=R(()=>{"use strict";h();dn();If=Cl.object({enabled:Cl.boolean()}).strict(),Rl=new Of({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Gn(!1),ga(),{data:zn()})).put("/preference",({body:r,status:e})=>{let t=If.safeParse(r);return t.success?(Gn(t.data.enabled),{data:zn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:fa()}}))});var Ol={};It(Ol,{createServer:()=>Yf});import{createHash as Lf,timingSafeEqual as xf}from"crypto";import{existsSync as Al}from"fs";import{readFile as Pf,stat as $f}from"fs/promises";import qe from"path";import{fileURLToPath as Mf}from"url";import{cors as kf}from"@elysiajs/cors";import{node as vf}from"@elysiajs/node";import{Elysia as Uf}from"elysia";var _n,qf,Bf,Ff,_l,Hf,Kf,jf,Dl,Wf,Vf,Yf,Il=R(()=>{"use strict";h();tn();Rt();Gc();Qe();X();Jc();dn();Ve();sl();il();ll();ml();pl();hl();gl();Sl();Nl();({API_PREFIX:_n}=ot),qf=()=>{if(process.env.NODE_ENV==="development")return qe.resolve(process.cwd(),"../web/dist");let r=qe.dirname(Mf(import.meta.url)),e=qe.resolve(r,"./web-dist"),t=qe.resolve(process.cwd(),"../web/dist"),n=qe.resolve(e,"index.html"),a=qe.resolve(t,"index.html");return!Al(n)&&Al(a)?t:e},Bf={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".ttf":"font/ttf",".woff2":"font/woff2"},Ff=async(r,e)=>{let t=qe.join(r,"index.html");try{let s=qe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${qe.sep}`)&&(await $f(s)).isFile()&&(t=s)}catch{}let n=await Pf(t).catch(s=>{if(s.code==="ENOENT")return null;throw s});if(n===null)return new Response('The web app is not built. Run "bun run build" in the repository root, then restart db-studio.',{status:404,headers:{"Content-Type":"text/plain; charset=utf-8"}});let a=t.startsWith(qe.join(r,"assets",qe.sep));return new Response(n,{headers:{"Content-Type":Bf[qe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},_l=r=>{if(!r)return!1;if((process.env.ALLOWED_ORIGINS?.split(",").map(t=>t.trim()).filter(Boolean)??[]).includes(r))return!0;if(process.env.NODE_ENV!=="development")return!1;try{let{hostname:t}=new URL(r);return t==="localhost"||t.endsWith(".localhost")||t==="127.0.0.1"}catch{return!1}},Hf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Kf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Hf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},jf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!_l(r.headers.get("origin"))},Dl=r=>Lf("sha256").update(r).digest(),Wf=r=>{let e=process.env.DB_STUDIO_PASSWORD;if(!e)return!0;if(!r?.startsWith("Basic "))return!1;let t=Buffer.from(r.slice(6),"base64").toString("utf8"),n=t.indexOf(":");return n!==-1&&xf(Dl(t.slice(n+1)),Dl(e))},Vf=(r,e)=>{let{pathname:t}=new URL(r.url),n=un(r.method,t),a=mn(t),s={requestId:Ko(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??xa()??void 0};return jo(s,async()=>{if(!t.startsWith(`${_n}/`)||t.startsWith(`${_n}/telemetry`))return e();let o=performance.now(),i=a&&ge.has(a)?a:void 0,c=await Ta(n,i,e);return Qn({event:"server_operation",properties:{operation:n,method:r.method,outcome:ya(c.status),duration_bucket:ha(performance.now()-o),db_type:i}}),c})},Yf=()=>{zc();let r=qf(),e=new Uf({adapter:vf()}).wrap((t,n)=>(...a)=>Vf(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=it(),!Kf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Wf(t.headers.get("authorization")))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="db-studio", charset="UTF-8"'}});if(new URL(t.url).pathname.startsWith(`${_n}/`)&&jf(t))throw new d(403,{message:"Cross-site request refused"})}).use(kf({origin:t=>_l(t.headers.get("origin")),methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowedHeaders:["Content-Type","Authorization","X-Run-Id","X-Request-Id","X-Connection-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],credentials:!1,maxAge:600})).onTransform(t=>{t.query=Object.fromEntries(new URL(t.request.url).searchParams);let n=t.request.headers.get("content-type")??"";if(t.body!==void 0&&!/^application\/([\w.-]+\+)?json/.test(n))throw new d(400,{message:"Request body must be JSON"})}).onError(({error:t,request:n})=>Qc(t,n)).group(_n,t=>t.use(ol).use(cl).use(al).use(Rl).group("/:dbType",n=>n.use(wl).use(yl).use(fl).use(ul).use(dl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${_n}/`)?Ff(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});h();h();(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="c6c34ab8-f7c3-4c43-b729-9404785784f3",r._sentryDebugIdIdentifier="sentry-dbid-c6c34ab8-f7c3-4c43-b729-9404785784f3")}catch{}})();h();tn();import{intro as zf,log as Zt,outro as Ll,spinner as Gf}from"@clack/prompts";import en from"picocolors";h();import{program as Or}from"commander";var Hs=()=>{Or.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("--open","Open db-studio in the default browser").option("--no-open","Do not open db-studio in the default browser").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv);let r=Or.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Or.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};h();var Ks=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;h();import{access as $l,readFile as Ml}from"fs/promises";import{dirname as kl,resolve as Ir}from"path";import{parse as vl}from"dotenv";var Ul=async r=>{let e=Ir(r);for(;;){let t=Ir(e,".env");try{return await $l(t),t}catch{}let n=kl(e);if(n===e)return null;e=n}},Lt=async r=>{let e;if(r?e=Ir(r):e=await Ul(process.cwd()),!e)return null;try{let t=await Ml(e,"utf-8");return vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};h();import ql from"open";var js=r=>r===!0,Ws=async r=>{await ql(r)};la();h();_r();j();import{intro as Ju,outro as Xu}from"@clack/prompts";import Ut from"picocolors";var Fo=()=>{Ju(Ut.inverse(" db-studio ")),console.log(Ut.bold(`
601
+ `}return t}var el=R(()=>{"use strict";h();j()});function pf(r){let e={name:r.columnName,type:r.dataTypeLabel,nullable:r.isNullable};return r.isPrimaryKey&&(e.isPrimaryKey=!0),r.isForeignKey&&r.referencedTable&&r.referencedColumn&&(e.foreignKey=`${r.referencedTable}.${r.referencedColumn}`),r.enumValues&&r.enumValues.length>0&&(e.enumValues=r.enumValues,e.description=`Enum values: ${r.enumValues.join(", ")}`),e}function ff(r){let e=[];for(let t of r)for(let n of t.columns)if(n.foreignKey){let[a,s]=n.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:n.name,toTable:a,toColumn:s})}return e}async function hf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",fe(n)),[]}}async function tl(r){let e=Ct(),t=Kt(e);try{let n=await t.getTablesList(r),a=await Promise.all(n.map(async({schemaName:o,tableName:i})=>({name:o?`${o}.${i}`:i,columns:(await hf(t,i,r)).map(pf)}))),s=ff(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",fe(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var nl=R(()=>{"use strict";h();Rt();Qe();Ve()});import{Elysia as yf}from"elysia";var gf,bf,rl,al,sl=R(()=>{"use strict";h();tn();j();X();Ve();el();nl();gf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),bf=new Set(["localhost","127.0.0.1","::1","[::1]"]),rl=()=>{let r;try{r=new URL(ot.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=bf.has(r.hostname)||r.hostname.endsWith(".localhost");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&e))throw new d(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return r.origin},al=new yf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=rl();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":r["cf-connecting-ip"]??"","x-real-ip":r["x-real-ip"]??"","x-forwarded-for":r["x-forwarded-for"]??"","x-api-key":r["x-api-key"]??"","x-request-id":it()??""}});return t.ok?await t.json():(Z("warn","chat_limit_unavailable",{proxy_status:t.status}),{limit:3,used:3,remaining:0})}catch{return{limit:3,used:3,remaining:0}}}).post("/",async({body:{messages:r,data:e,provider:t,model:n},headers:a,set:s})=>{let{db:o,conversationId:i,includeSchema:c}=e,l=c?await tl(o):null,u=Zc(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${rl()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":a["cf-connecting-ip"]??"","x-real-ip":a["x-real-ip"]??"","x-forwarded-for":a["x-forwarded-for"]??"","x-api-key":a["x-api-key"]??"","x-byok-gemini":a["x-byok-gemini"]??"","x-byok-openai":a["x-byok-openai"]??"","x-byok-anthropic":a["x-byok-anthropic"]??"","x-byok-grok":a["x-byok-grok"]??"","x-byok-openrouter":a["x-byok-openrouter"]??"","x-request-id":it()??""},body:JSON.stringify(m)});if(!p.ok){Z("warn","chat_proxy_rejected",{proxy_status:p.status,provider:t,model:n});let f=await p.json();return Response.json({error:f.error||"Proxy request failed"},{status:p.status})}for(let[f,g]of p.headers)gf.has(f)||(s.headers[f]=g);return p.body},{body:vr})});import{Elysia as Tf}from"elysia";var ol,il=R(()=>{"use strict";h();j();Xa();_a();ol=new Tf({prefix:"/connections"}).get("/",async()=>({data:await bn()})).post("/",async({body:r})=>{let e=await Zn(r.url,{requireExistingFile:!0});return{data:await bn(e)}},{body:Vr}).post("/:id/connect",async({params:r})=>({data:await bn(await Qa(r.id))})).patch("/:id",async({params:r,body:e})=>({data:Ja(await mi(r.id,e))}),{body:Yr}).delete("/:id",async({params:r})=>(await di(r.id),{data:"Connection removed"}))});import{Elysia as Ef}from"elysia";var cl,ll=R(()=>{"use strict";h();Rt();Qe();cl=new Ef({prefix:"/databases"}).derive(()=>{let r=Ct();return{dbType:r,adapter:Kt(r)}}).get("/",async({adapter:r,dbType:e})=>({data:{databases:await r.getDatabasesList(),dbType:e}})).get("/current",async({adapter:r,dbType:e})=>({data:{db:(await r.getCurrentDatabase()).db,dbType:e}})).get("/connection",async({adapter:r})=>({data:await r.getDatabaseConnectionInfo()}))});import{Elysia as wf}from"elysia";var rt,Xt=R(()=>{"use strict";h();j();Rt();Qe();X();rt=new wf().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!ge.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${ge.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!hn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Ct();if(a!==t)throw new d(409,{message:`The open connection is ${K[a].label}. Reload the page.`});return{dbType:t,adapter:Kt(t)}})});import{Elysia as Sf}from"elysia";var ul,ml=R(()=>{"use strict";h();j();Rt();Xt();ul=new Sf({prefix:"/keys"}).use(rt).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:Ci(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:Zr}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:v,body:ra}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:na,params:vt}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:ta,params:vt}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:v,params:vt,body:aa}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:sa,params:vt})});import{Elysia as Cf}from"elysia";var dl,pl=R(()=>{"use strict";h();j();Xt();dl=new Cf({prefix:"/logs"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:v})});import{Elysia as Rf}from"elysia";var fl,hl=R(()=>{"use strict";h();j();Xt();fl=new Rf({prefix:"/query"}).use(rt).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:v,body:Jr})});import{Elysia as Nf}from"elysia";var yl,gl=R(()=>{"use strict";h();j();Xt();yl=new Nf({prefix:"/records"}).use(rt).post("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,data:a}})=>{let{insertedCount:s}=await r.addRecord({db:e,schemaName:t,params:{tableName:n,data:a}});return{data:`Record inserted into "${n}" with ${s} rows inserted`}},{query:M,body:xr}).patch("/",async({adapter:r,query:{db:e,schemaName:t},body:n})=>{let{updatedCount:a}=await r.updateRecords({params:n,schemaName:t,db:e});return{data:`Updated ${a} records in "${n.tableName}"`}},{query:M,body:ca}).delete("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a},status:s})=>{let{deletedCount:o,fkViolation:i,relatedRecords:c}=await r.deleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e});return i?s(409,{data:{deletedCount:0,fkViolation:!0,relatedRecords:c}}):{data:{deletedCount:o,fkViolation:!1,relatedRecords:[]}}},{query:M,body:vn}).delete("/force",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a}})=>({data:await r.forceDeleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e})}),{query:M,body:vn}).post("/bulk",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,records:a}})=>({data:await r.bulkInsertRecords({tableName:n,schemaName:t,records:a,db:e})}),{query:M,body:kr})});async function Tl({cols:r,rows:e,format:t,tableName:n}){if(t==="json"){let o=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(o,"utf-8"))}let{utils:a,write:s}=await import("xlsx");switch(t){case"csv":{let o=a.aoa_to_sheet(bl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(bl(r,e)),i=a.book_new();a.book_append_sheet(i,o,n.slice(0,31));let c=s(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var Af,bl,El=R(()=>{"use strict";h();Af=r=>r==null||r instanceof Date?r:Buffer.isBuffer(r)?`0x${r.toString("hex")}`:typeof r=="object"?JSON.stringify(r):typeof r=="bigint"?r.toString():r,bl=(r,e)=>[r,...e?.map(t=>r?.map(n=>Af(t[n])))??[]]});import{Elysia as Df}from"elysia";var _f,wl,Sl=R(()=>{"use strict";h();j();Xt();El();_f={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},wl=new Df({prefix:"/tables"}).use(rt).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:v}).get("/graph",async({adapter:r,query:{db:e}})=>{let t=await r.getTablesList(e);return{data:await Promise.all(t.map(async n=>({...n,columns:await r.getTableColumns({tableName:n.tableName,schemaName:n.schemaName,db:e})})))}},{query:v}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:v,body:Gr}).delete("/:tableName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a}})=>({data:await r.deleteTable({tableName:a,schemaName:t,db:e,cascade:n})}),{query:Qr,params:ie}).patch("/:tableName/rename",async({adapter:r,query:{db:e},params:{tableName:t},body:n})=>(await r.renameTable({tableName:t,db:e,...n}),{data:`Table "${t}" renamed to "${n.newTableName}"`}),{query:v,params:ie,body:sn}).delete("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a,columnName:s}})=>{let{deletedCount:o}=await r.deleteColumn({schemaName:t,tableName:a,columnName:s,cascade:n,db:e});return{data:`Column "${s}" deleted successfully from table "${a}" with ${o} rows deleted`}},{query:Mr,params:Ee}).post("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.addColumn({tableName:n,schemaName:t,db:e,...a}),{data:`Column "${a.columnName}" added successfully to table "${n}"`}),{query:M,params:ie,body:Be}).patch("/:tableName/columns/:columnName/rename",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.renameColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" renamed to "${s.newColumnName}" in table "${n}"`}),{query:M,params:Ee,body:Fn}).patch("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.alterColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" updated successfully in table "${n}"`}),{query:M,params:Ee,body:Pt}).get("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableColumns({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).get("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableIndexes({tableName:n,schemaName:t,db:e})}),{query:M,params:ie}).post("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.createIndex({tableName:n,schemaName:t,db:e,...a}),{data:`Index "${a.indexName}" created successfully on table "${n}"`}),{query:M,params:ie,body:Un}).delete("/:tableName/indexes/:indexName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,indexName:a}})=>(await r.dropIndex({tableName:n,schemaName:t,indexName:a,db:e}),{data:`Index "${a}" dropped successfully from table "${n}"`}),{query:M,params:qn}).get("/:tableName/schema",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:{schema:await r.getTableSchema({tableName:n,schemaName:t,db:e})}}),{query:M,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:ia,params:ie}).get("/:tableName/export",async({adapter:r,query:{db:e,schemaName:t,format:n},params:{tableName:a}})=>{let{cols:s,rows:o}=await r.exportTableData({tableName:a,schemaName:t,db:e});return new Response(await Tl({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":_f[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:Xr,params:ie})});import{Elysia as Of}from"elysia";import{z as Cl}from"zod";var If,Rl,Nl=R(()=>{"use strict";h();dn();If=Cl.object({enabled:Cl.boolean()}).strict(),Rl=new Of({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Gn(!1),ga(),{data:zn()})).put("/preference",({body:r,status:e})=>{let t=If.safeParse(r);return t.success?(Gn(t.data.enabled),{data:zn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:fa()}}))});var Ol={};It(Ol,{createServer:()=>Yf});import{createHash as xf,timingSafeEqual as Lf}from"crypto";import{existsSync as Al}from"fs";import{readFile as Pf,stat as $f}from"fs/promises";import qe from"path";import{fileURLToPath as Mf}from"url";import{cors as kf}from"@elysiajs/cors";import{node as vf}from"@elysiajs/node";import{Elysia as Uf}from"elysia";var _n,qf,Bf,Ff,_l,Hf,Kf,jf,Dl,Wf,Vf,Yf,Il=R(()=>{"use strict";h();tn();Rt();Gc();Qe();X();Jc();dn();Ve();sl();il();ll();ml();pl();hl();gl();Sl();Nl();({API_PREFIX:_n}=ot),qf=()=>{if(process.env.NODE_ENV==="development")return qe.resolve(process.cwd(),"../web/dist");let r=qe.dirname(Mf(import.meta.url)),e=qe.resolve(r,"./web-dist"),t=qe.resolve(process.cwd(),"../web/dist"),n=qe.resolve(e,"index.html"),a=qe.resolve(t,"index.html");return!Al(n)&&Al(a)?t:e},Bf={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".ttf":"font/ttf",".woff2":"font/woff2"},Ff=async(r,e)=>{let t=qe.join(r,"index.html");try{let s=qe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${qe.sep}`)&&(await $f(s)).isFile()&&(t=s)}catch{}let n=await Pf(t).catch(s=>{if(s.code==="ENOENT")return null;throw s});if(n===null)return new Response('The web app is not built. Run "bun run build" in the repository root, then restart db-studio.',{status:404,headers:{"Content-Type":"text/plain; charset=utf-8"}});let a=t.startsWith(qe.join(r,"assets",qe.sep));return new Response(n,{headers:{"Content-Type":Bf[qe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},_l=r=>{if(!r)return!1;if((process.env.ALLOWED_ORIGINS?.split(",").map(t=>t.trim()).filter(Boolean)??[]).includes(r))return!0;if(process.env.NODE_ENV!=="development")return!1;try{let{hostname:t}=new URL(r);return t==="localhost"||t.endsWith(".localhost")||t==="127.0.0.1"}catch{return!1}},Hf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Kf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Hf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},jf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!_l(r.headers.get("origin"))},Dl=r=>xf("sha256").update(r).digest(),Wf=r=>{let e=process.env.DB_STUDIO_PASSWORD;if(!e)return!0;if(!r?.startsWith("Basic "))return!1;let t=Buffer.from(r.slice(6),"base64").toString("utf8"),n=t.indexOf(":");return n!==-1&&Lf(Dl(t.slice(n+1)),Dl(e))},Vf=(r,e)=>{let{pathname:t}=new URL(r.url),n=un(r.method,t),a=mn(t),s={requestId:Ko(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??La()??void 0};return jo(s,async()=>{if(!t.startsWith(`${_n}/`)||t.startsWith(`${_n}/telemetry`))return e();let o=performance.now(),i=a&&ge.has(a)?a:void 0,c=await Ta(n,i,e);return Qn({event:"server_operation",properties:{operation:n,method:r.method,outcome:ya(c.status),duration_bucket:ha(performance.now()-o),db_type:i}}),c})},Yf=()=>{zc();let r=qf(),e=new Uf({adapter:vf()}).wrap((t,n)=>(...a)=>Vf(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=it(),!Kf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Wf(t.headers.get("authorization")))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="db-studio", charset="UTF-8"'}});if(new URL(t.url).pathname.startsWith(`${_n}/`)&&jf(t))throw new d(403,{message:"Cross-site request refused"})}).use(kf({origin:t=>_l(t.headers.get("origin")),methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowedHeaders:["Content-Type","Authorization","X-Run-Id","X-Request-Id","X-Connection-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],credentials:!1,maxAge:600})).onTransform(t=>{t.query=Object.fromEntries(new URL(t.request.url).searchParams);let n=t.request.headers.get("content-type")??"";if(t.body!==void 0&&!/^application\/([\w.-]+\+)?json/.test(n))throw new d(400,{message:"Request body must be JSON"})}).onError(({error:t,request:n})=>Qc(t,n)).group(_n,t=>t.use(ol).use(cl).use(al).use(Rl).group("/:dbType",n=>n.use(wl).use(yl).use(fl).use(ul).use(dl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${_n}/`)?Ff(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});h();h();(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="df9bb6d3-52f1-4d68-b9f9-716636f8ece1",r._sentryDebugIdIdentifier="sentry-dbid-df9bb6d3-52f1-4d68-b9f9-716636f8ece1")}catch{}})();h();tn();import{intro as zf,log as Zt,outro as xl,spinner as Gf}from"@clack/prompts";import en from"picocolors";h();import{program as Or}from"commander";var Hs=()=>{Or.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("--open","Open db-studio in the default browser").option("--no-open","Do not open db-studio in the default browser").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv);let r=Or.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Or.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};h();var Ks=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;h();import{access as $l,readFile as Ml}from"fs/promises";import{dirname as kl,resolve as Ir}from"path";import{parse as vl}from"dotenv";var Ul=async r=>{let e=Ir(r);for(;;){let t=Ir(e,".env");try{return await $l(t),t}catch{}let n=kl(e);if(n===e)return null;e=n}},xt=async r=>{let e;if(r?e=Ir(r):e=await Ul(process.cwd()),!e)return null;try{let t=await Ml(e,"utf-8");return vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};h();import ql from"open";var js=r=>r===!0,Ws=async r=>{await ql(r)};la();h();_r();j();import{intro as Ju,outro as Xu}from"@clack/prompts";import Ut from"picocolors";var Fo=()=>{Ju(Ut.inverse(" db-studio ")),console.log(Ut.bold(`
602
602
  Usage:`)),console.log(` db-studio [options]
603
603
  `),console.log(Ut.bold("Supported Databases:")),console.log(` ${Object.values(K).map(({label:r})=>r).join(", ")}
604
604
  `),console.log(Ut.bold("Options:")),console.log(" -e, --env <path> Path to custom .env file"),console.log(" -p, --port <port> Port to run the server on (default: 3333)"),console.log(" -d, --database-url <url> Database URL to use"),console.log(" --open Open db-studio in the default browser (off by default)"),console.log(" --no-open Do not open db-studio in the default browser"),console.log(" -n, --var-name <name> Custom environment variable name (default: DATABASE_URL)"),console.log(" -s, --status Show status of the database connection"),console.log(" -h, --help Show this help message"),console.log(` -v, --version Show version number
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
606
  `),console.log(Ut.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
- `),Xu(Ut.green(`For more information, visit: ${Bs.SITE_DOCS_LINK}`))};h();tn();j();import{intro as om,note as im,outro as Yo}from"@clack/prompts";import He from"picocolors";Ye();var zo=async(r,e,t)=>{om(He.inverse(" db-studio "));let n=t||ot.VAR_NAME,a=null;if(e)a=e;else{let s=r?await Lt(r):await Lt();s?.[n]?a=s[n]:process.env[n]&&(a=process.env[n]??null)}a?Yo(He.green(`\u2713 Database connection configured (using ${n})`)):(im(He.red(`\u2717 ${n} not found`),"Status"),console.log(He.yellow(`
607
+ `),Xu(Ut.green(`For more information, visit: ${Bs.SITE_DOCS_LINK}`))};h();tn();j();import{intro as om,note as im,outro as Yo}from"@clack/prompts";import He from"picocolors";Ye();var zo=async(r,e,t)=>{om(He.inverse(" db-studio "));let n=t||ot.VAR_NAME,a=null;if(e)a=e;else{let s=r?await xt(r):await xt();s?.[n]?a=s[n]:process.env[n]&&(a=process.env[n]??null)}a?Yo(He.green(`\u2713 Database connection configured (using ${n})`)):(im(He.red(`\u2717 ${n} not found`),"Status"),console.log(He.yellow(`
608
608
  To configure database connection:`)),console.log(He.dim(` \u2022 Supported databases: ${Object.values(K).map(({label:s})=>s).join(", ")}`)),console.log(He.dim(` \u2022 Also via wire-compatible URLs: ${Object.keys(Wn).map(s=>`${s}://`).join(", ")}`)),console.log(He.dim(` \u2022 Add ${n} to your .env file or set it in process.env`)),console.log(He.dim(" \u2022 Use -d flag: db-studio -d <url>")),console.log(He.dim(" \u2022 Use -e flag: db-studio -e <path-to-env>")),console.log(He.dim(` \u2022 Use -n flag: db-studio -n <var-name>
609
- `)),Yo(He.yellow("\u26A0 No database connection configured")))};h();da();import{intro as lm,outro as um}from"@clack/prompts";import Go from"picocolors";var Qo=()=>{lm(Go.inverse(" db-studio ")),um(Go.green(`\u{1F680} db-studio v${Tt.version}`))};var Qf=async()=>{let{env:r,port:e,databaseUrl:t,varName:n,open:a,status:s,help:o,version:i}=Hs();o&&(Fo(),process.exit(0)),i&&(Qo(),process.exit(0)),s&&(await zo(r,t,n),process.exit(0)),zf(en.inverse(" db-studio "));let c=r?await Lt(r):await Lt();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(ot.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"),Zt.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 ${en.cyan(process.env.DB_STUDIO_PASSWORD)}`)}let m=n||ot.VAR_NAME,p=t||Ks(c,m),{flushServerObservability:f,initServerObservability:g}=await Promise.resolve().then(()=>(dn(),ti));if(g(),p){Zt.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(()=>(Sa(),ni)),{connect:C}=await Promise.resolve().then(()=>(Xa(),Si)),_=N(p),D=_?`${_.name} at ${_.destination}`:"the database",L=Gf();L.start(`Connecting to ${D}...`);try{await C(p),L.stop(`Connected to ${D}`)}catch(H){throw L.stop(`Could not connect to ${D}`),H}}else Zt.info(`No ${m} found. Choose a database in the browser.`);let{createServer:T}=await Promise.resolve().then(()=>(Il(),Ol)),{closeAllDbPools:y}=await Promise.resolve().then(()=>(Qe(),za)),{app:S}=T(),w=async()=>{let N=new Promise(C=>setTimeout(C,5e3));await Promise.race([S.server?.stop(),N]),await Promise.race([Promise.allSettled([y(),f()]),N]),process.exit(0)};process.once("SIGINT",w),process.once("SIGTERM",w),S.listen({hostname:u,port:l});let A=process.env.DB_STUDIO_SERVER_URL??process.env.PORTLESS_URL??`http://localhost:${l}`;if(Zt.success(`Server listening at ${en.cyan(A)}`),js(a))try{await Ws(A),Zt.success("Opened db-studio in your browser")}catch{Zt.warn(`Could not open your browser. Visit ${en.cyan(A)}`)}Ll(en.green("Ready"))};process.env.NODE_ENV!=="test"&&Qf().catch(r=>{let e=r instanceof Error?r.message:String(r);Ll(en.red(`Startup failed: ${Kn(e)}`)),process.exit(1)});var gR=void 0;export{gR as default,Qf as main};
609
+ `)),Yo(He.yellow("\u26A0 No database connection configured")))};h();da();import{intro as lm,outro as um}from"@clack/prompts";import Go from"picocolors";var Qo=()=>{lm(Go.inverse(" db-studio ")),um(Go.green(`\u{1F680} db-studio v${Tt.version}`))};var Qf=async()=>{let{env:r,port:e,databaseUrl:t,varName:n,open:a,status:s,help:o,version:i}=Hs();o&&(Fo(),process.exit(0)),i&&(Qo(),process.exit(0)),s&&(await zo(r,t,n),process.exit(0)),zf(en.inverse(" db-studio "));let c=r?await xt(r):await xt();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(ot.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"),Zt.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 ${en.cyan(process.env.DB_STUDIO_PASSWORD)}`)}let m=n||ot.VAR_NAME,p=t||Ks(c,m),{flushServerObservability:f,initServerObservability:g}=await Promise.resolve().then(()=>(dn(),ti));if(g(),p){Zt.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(()=>(Sa(),ni)),{connect:C}=await Promise.resolve().then(()=>(Xa(),Si)),_=N(p),D=_?`${_.name} at ${_.destination}`:"the database",x=Gf();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 Zt.info(`No ${m} found. Choose a database in the browser.`);let{createServer:T}=await Promise.resolve().then(()=>(Il(),Ol)),{closeAllDbPools:y}=await Promise.resolve().then(()=>(Qe(),za)),{app:S}=T(),w=async()=>{let N=new Promise(C=>setTimeout(C,5e3));await Promise.race([S.server?.stop(),N]),await Promise.race([Promise.allSettled([y(),f()]),N]),process.exit(0)};process.once("SIGINT",w),process.once("SIGTERM",w),S.listen({hostname:u,port:l});let A=process.env.DB_STUDIO_SERVER_URL??process.env.PORTLESS_URL??`http://localhost:${l}`;if(Zt.success(`Server listening at ${en.cyan(A)}`),js(a))try{await Ws(A),Zt.success("Opened db-studio in your browser")}catch{Zt.warn(`Could not open your browser. Visit ${en.cyan(A)}`)}xl(en.green("Ready"))};process.env.NODE_ENV!=="test"&&Qf().catch(r=>{let e=r instanceof Error?r.message:String(r);xl(en.red(`Startup failed: ${Kn(e)}`)),process.exit(1)});var gR=void 0;export{gR as default,Qf as main};
610
610
  //# sourceMappingURL=index.js.map