db-studio 1.2.8 → 1.2.10

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 (136) hide show
  1. package/dist/core-dist/assets/{_baseUniq-DeTP8pep.js → _baseUniq-CAv_sUq0.js} +1 -1
  2. package/dist/core-dist/assets/{mermaid-VLURNSYL-DIO6bwbh.js → _pathlessLayout-CZkGDKr3.js} +60 -60
  3. package/dist/core-dist/assets/_queryId-BlJwBNE7.js +1 -0
  4. package/dist/core-dist/assets/_table-Bg3Jhj3R.js +1 -0
  5. package/dist/core-dist/assets/{arc-BoR-jFRR.js → arc-BJuKLB46.js} +1 -1
  6. package/dist/core-dist/assets/architecture-U656AL7Q-CG9_JmIP.js +1 -0
  7. package/dist/core-dist/assets/architectureDiagram-VXUJARFQ-BlKpMHgP.js +36 -0
  8. package/dist/core-dist/assets/{blockDiagram-VD42YOAC-CeAErDmg.js → blockDiagram-VD42YOAC-BzzsEP95.js} +2 -2
  9. package/dist/core-dist/assets/{c4Diagram-YG6GDRKO-OSVEUkvh.js → c4Diagram-YG6GDRKO-BnbEJDnT.js} +4 -4
  10. package/dist/core-dist/assets/channel-CymmV4CK.js +1 -0
  11. package/dist/core-dist/assets/{chunk-4BX2VUAB-BEVdK-cK.js → chunk-4BX2VUAB-BBlBt29z.js} +1 -1
  12. package/dist/core-dist/assets/{chunk-55IACEB6-BhPxNRfI.js → chunk-55IACEB6-DNkirFYu.js} +1 -1
  13. package/dist/core-dist/assets/{chunk-B4BG7PRW-BIYfgIK7.js → chunk-B4BG7PRW-DplPr675.js} +1 -1
  14. package/dist/core-dist/assets/{chunk-DI55MBZ5-usB5CT3s.js → chunk-DI55MBZ5-CuowJrst.js} +1 -1
  15. package/dist/core-dist/assets/{chunk-FMBD7UC4-D_zfIsjm.js → chunk-FMBD7UC4-CDLqhL7O.js} +1 -1
  16. package/dist/core-dist/assets/{chunk-QN33PNHL-BZgTlwI6.js → chunk-QN33PNHL-T2K3kI4j.js} +1 -1
  17. package/dist/core-dist/assets/{chunk-QZHKN3VN-DVUwvM1e.js → chunk-QZHKN3VN-Cn74Pd79.js} +1 -1
  18. package/dist/core-dist/assets/{chunk-TZMSLE5B-D0G1xb6O.js → chunk-TZMSLE5B-jRgtCDM3.js} +1 -1
  19. package/dist/core-dist/assets/classDiagram-2ON5EDUG-DsppMAOR.js +1 -0
  20. package/dist/core-dist/assets/classDiagram-v2-WZHVMYZB-DsppMAOR.js +1 -0
  21. package/dist/core-dist/assets/clone-tRzPOHdE.js +1 -0
  22. package/dist/core-dist/assets/{code-block-IT6T5CEO-CVoIiHLl.js → code-block-IT6T5CEO-CY4ZkvyN.js} +3 -3
  23. package/dist/core-dist/assets/cose-bilkent-S5V4N54A-Dj3H49oa.js +1 -0
  24. package/dist/core-dist/assets/cssMode-CF1T5vEU.js +1 -0
  25. package/dist/core-dist/assets/dagre-6UL2VRFP-Cly5tuXN.js +4 -0
  26. package/dist/core-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  27. package/dist/core-dist/assets/diagram-PSM6KHXK-DL2Q8K3B.js +24 -0
  28. package/dist/core-dist/assets/diagram-QEK2KX5R-DizZ-655.js +43 -0
  29. package/dist/core-dist/assets/diagram-S2PKOQOG-BzPXNCcq.js +24 -0
  30. package/dist/core-dist/assets/{erDiagram-Q2GNP2WA-BYhHqY5d.js → erDiagram-Q2GNP2WA-BofISlfK.js} +2 -2
  31. package/dist/core-dist/assets/{flowDiagram-NV44I4VS--B_JCKG9.js → flowDiagram-NV44I4VS-CraoKtH-.js} +2 -2
  32. package/dist/core-dist/assets/{format-cell-value-DJ9wR-dS.js → format-cell-value-BZxeFaA8.js} +1 -1
  33. package/dist/core-dist/assets/{freemarker2-C8JhQdZP.js → freemarker2-BIvjYnfp.js} +2 -2
  34. package/dist/core-dist/assets/ganttDiagram-JELNMOA3-BRvyb8VW.js +267 -0
  35. package/dist/core-dist/assets/gitGraph-F6HP7TQM-XNCl7HYP.js +1 -0
  36. package/dist/core-dist/assets/gitGraphDiagram-NY62KEGX-DKWRoQuV.js +65 -0
  37. package/dist/core-dist/assets/{graph-B4OompRX.js → graph-CiH4Elhg.js} +1 -1
  38. package/dist/core-dist/assets/handlebars-CK7lLchY.js +1 -0
  39. package/dist/core-dist/assets/html-D4oGQ6da.js +1 -0
  40. package/dist/core-dist/assets/htmlMode-UdBCLKNC.js +1 -0
  41. package/dist/core-dist/assets/index-BGJonb8r.js +1 -0
  42. package/dist/core-dist/assets/index-BTbtGsf1.js +1 -0
  43. package/dist/core-dist/assets/index-C1hGVAGZ.css +1 -0
  44. package/dist/core-dist/assets/index-DT0YxcHG.js +1 -0
  45. package/dist/core-dist/assets/index-D_Jinmad.js +93 -0
  46. package/dist/core-dist/assets/index-VbLkqC9g.js +1 -0
  47. package/dist/core-dist/assets/indexes-DUg8pguA.js +1 -0
  48. package/dist/core-dist/assets/info-NVLQJR56-C0BKzANU.js +1 -0
  49. package/dist/core-dist/assets/infoDiagram-WHAUD3N6-CJI0qAk5.js +2 -0
  50. package/dist/core-dist/assets/javascript-DVJFYsQU.js +1 -0
  51. package/dist/core-dist/assets/{journeyDiagram-XKPGCS4Q-DVnTCfN2.js → journeyDiagram-XKPGCS4Q-CbUo2D0u.js} +2 -2
  52. package/dist/core-dist/assets/{jsonMode-DDnE0tij.js → jsonMode-BxHkXShz.js} +2 -2
  53. package/dist/core-dist/assets/{kanban-definition-3W4ZIXB7-BCv733kL.js → kanban-definition-3W4ZIXB7-BI8V_-kx.js} +2 -2
  54. package/dist/core-dist/assets/{layout-Yc_iIB-x.js → layout-BwolAo18.js} +1 -1
  55. package/dist/core-dist/assets/{linear-Ccvhuns4.js → linear-DmRzTBeT.js} +1 -1
  56. package/dist/core-dist/assets/liquid-C5m2c79-.js +1 -0
  57. package/dist/core-dist/assets/logs-DvzMaNSj.js +1 -0
  58. package/dist/core-dist/assets/{lspLanguageFeatures-GQiniNAU.js → lspLanguageFeatures-Bi1yNEJU.js} +1 -1
  59. package/dist/core-dist/assets/mdx-DIQtb_gN.js +1 -0
  60. package/dist/core-dist/assets/mermaid-VLURNSYL-BwQZ3L24.js +1 -0
  61. package/dist/core-dist/assets/{treemap-KMMF4GRG-DbHVk-Xm.js → mermaid-parser.core-GpQo11SQ.js} +49 -48
  62. package/dist/core-dist/assets/{mermaid.core-slM-mBGw.js → mermaid.core-BmMdWyIh.js} +5 -5
  63. package/dist/core-dist/assets/{min-n8lTmAvY.js → min-CBpbEBoX.js} +1 -1
  64. package/dist/core-dist/assets/{mindmap-definition-VGOIOE7T-CZwrzjwH.js → mindmap-definition-VGOIOE7T-B5j249CZ.js} +2 -2
  65. package/dist/core-dist/assets/ordinal-BENe2yWM.js +1 -0
  66. package/dist/core-dist/assets/packet-BFZMPI3H-B3dLa20l.js +1 -0
  67. package/dist/core-dist/assets/pie-7BOR55EZ-SduROXgQ.js +1 -0
  68. package/dist/core-dist/assets/pieDiagram-ADFJNKIX-DWDcg6KO.js +30 -0
  69. package/dist/core-dist/assets/python-DsM0goT4.js +1 -0
  70. package/dist/core-dist/assets/{quadrantDiagram-AYHSOK5B-BZqGtn9b.js → quadrantDiagram-AYHSOK5B-XoLRHaBF.js} +2 -2
  71. package/dist/core-dist/assets/{queries.store-CbImnNJo.js → queries.store-DO7682hm.js} +1 -1
  72. package/dist/core-dist/assets/radar-NHE76QYJ-BUhlCoHu.js +1 -0
  73. package/dist/core-dist/assets/razor-CzWHKXwU.js +1 -0
  74. package/dist/core-dist/assets/{requirementDiagram-UZGBJVZJ-Dp1yAO4V.js → requirementDiagram-UZGBJVZJ-DY4QxjKx.js} +5 -5
  75. package/dist/core-dist/assets/{runner-tab-D2hjlCAt.js → runner-tab-D0elRWLb.js} +4 -4
  76. package/dist/core-dist/assets/sankeyDiagram-TZEHDZUN-C4xfe9wH.js +10 -0
  77. package/dist/core-dist/assets/schema-BII6kTqY.js +1 -0
  78. package/dist/core-dist/assets/{sequenceDiagram-WL72ISMW-DxWRatq4.js → sequenceDiagram-WL72ISMW-DWhVOvUA.js} +2 -2
  79. package/dist/core-dist/assets/{spinner-DRgNI7eU.js → spinner-MM9EZ74I.js} +1 -1
  80. package/dist/core-dist/assets/stateDiagram-FKZM4ZOC-B70Aswf4.js +1 -0
  81. package/dist/core-dist/assets/stateDiagram-v2-4FDKWEC3-Dc-RHAld.js +1 -0
  82. package/dist/core-dist/assets/{timeline-definition-IT6M3QCI-Dp45IwZ4.js → timeline-definition-IT6M3QCI-CjREf6gn.js} +2 -2
  83. package/dist/core-dist/assets/treemap-KMMF4GRG-Bbfo1cUw.js +1 -0
  84. package/dist/core-dist/assets/{tsMode-CE083Imf.js → tsMode-womOZTe5.js} +2 -2
  85. package/dist/core-dist/assets/typescript-ClkwQ9Fj.js +1 -0
  86. package/dist/core-dist/assets/visualizer-BTAd--C0.js +1 -0
  87. package/dist/core-dist/assets/xml-BIMxtbHt.js +1 -0
  88. package/dist/core-dist/assets/{xychartDiagram-PRI3JC2R-Dfqks87e.js → xychartDiagram-PRI3JC2R-kLx_CqKx.js} +2 -2
  89. package/dist/core-dist/assets/yaml-DblqwOQB.js +1 -0
  90. package/dist/core-dist/index.html +2 -2
  91. package/dist/index.js +26 -26
  92. package/dist/index.js.map +1 -1
  93. package/package.json +4 -8
  94. package/dist/core-dist/assets/_queryId-xb71ELMT.js +0 -1
  95. package/dist/core-dist/assets/_table-CPYKXxJK.js +0 -1
  96. package/dist/core-dist/assets/architectureDiagram-VXUJARFQ-CZLHhedK.js +0 -36
  97. package/dist/core-dist/assets/channel-CNjzrXvL.js +0 -1
  98. package/dist/core-dist/assets/classDiagram-2ON5EDUG-BhJm11nN.js +0 -1
  99. package/dist/core-dist/assets/classDiagram-v2-WZHVMYZB-BhJm11nN.js +0 -1
  100. package/dist/core-dist/assets/clone-CpKDUrON.js +0 -1
  101. package/dist/core-dist/assets/cose-bilkent-S5V4N54A-mPMfO63b.js +0 -1
  102. package/dist/core-dist/assets/cssMode-BbbavvFK.js +0 -1
  103. package/dist/core-dist/assets/dagre-6UL2VRFP-C2kq_KdG.js +0 -4
  104. package/dist/core-dist/assets/defaultLocale-C4B-KCzX.js +0 -1
  105. package/dist/core-dist/assets/diagram-PSM6KHXK-dnGx_20I.js +0 -24
  106. package/dist/core-dist/assets/diagram-QEK2KX5R-DUffoXTA.js +0 -43
  107. package/dist/core-dist/assets/diagram-S2PKOQOG-DknjRkcy.js +0 -24
  108. package/dist/core-dist/assets/ganttDiagram-JELNMOA3-fwVvPSFQ.js +0 -267
  109. package/dist/core-dist/assets/gitGraphDiagram-NY62KEGX-B1Rw385f.js +0 -65
  110. package/dist/core-dist/assets/handlebars-B9xzXuR2.js +0 -1
  111. package/dist/core-dist/assets/html-DhJbXNLg.js +0 -1
  112. package/dist/core-dist/assets/htmlMode-CSFATZjY.js +0 -1
  113. package/dist/core-dist/assets/index-BAVByTDE.js +0 -93
  114. package/dist/core-dist/assets/index-BjpaRjp0.css +0 -1
  115. package/dist/core-dist/assets/index-C1V1hQQg.js +0 -1
  116. package/dist/core-dist/assets/index-Cpv2wm86.js +0 -1
  117. package/dist/core-dist/assets/index-DQ8lDHvH.js +0 -1
  118. package/dist/core-dist/assets/index-DwoOS22k.js +0 -1
  119. package/dist/core-dist/assets/indexes-DvT7ztBf.js +0 -1
  120. package/dist/core-dist/assets/infoDiagram-WHAUD3N6-Ca5DIjt4.js +0 -2
  121. package/dist/core-dist/assets/javascript-XYqgRwCU.js +0 -1
  122. package/dist/core-dist/assets/liquid-BEKYmbJG.js +0 -1
  123. package/dist/core-dist/assets/logs-CJ_qckmn.js +0 -1
  124. package/dist/core-dist/assets/mdx-BwwPudXS.js +0 -1
  125. package/dist/core-dist/assets/ordinal-Cboi1Yqb.js +0 -1
  126. package/dist/core-dist/assets/pieDiagram-ADFJNKIX-Dij_1qyq.js +0 -30
  127. package/dist/core-dist/assets/python-CNAm6jim.js +0 -1
  128. package/dist/core-dist/assets/razor-1KPvGS6J.js +0 -1
  129. package/dist/core-dist/assets/sankeyDiagram-TZEHDZUN-D8yL2HOj.js +0 -10
  130. package/dist/core-dist/assets/schema-Dug6AN9b.js +0 -1
  131. package/dist/core-dist/assets/stateDiagram-FKZM4ZOC-OB1RLZSz.js +0 -1
  132. package/dist/core-dist/assets/stateDiagram-v2-4FDKWEC3-CRUlT-Qs.js +0 -1
  133. package/dist/core-dist/assets/typescript-CWvqEMrx.js +0 -1
  134. package/dist/core-dist/assets/visualizer-BO_uVLiI.js +0 -1
  135. package/dist/core-dist/assets/xml-D48gAAGL.js +0 -1
  136. package/dist/core-dist/assets/yaml-B9qGdCLx.js +0 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var Nt=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var vt=(t,e)=>{for(var r in e)Nt(t,r,{get:e[r],enumerable:!0})};var N,I=f(()=>{"use strict";N={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",PROXY_URL:process.env.NODE_ENV==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});import{Pool as Ft}from"pg";var U,Kt,C,Y=f(()=>{"use strict";U=null,Kt=()=>{if(!U){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{U=new Ft({connectionString:process.env.DATABASE_URL}),U.on("error",t=>{})}catch(t){throw t}}return U},C=new Proxy({},{get(t,e){try{return Kt()[e]}catch(r){throw r}}})});import{Pool as Te}from"pg";var G,Vt,b,T=f(()=>{"use strict";G=class{pools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let r=new URL(e);this.baseConfig={url:e,host:r.hostname,port:Number.parseInt(r.port,10)||5432,user:r.username,password:r.password}}catch(r){throw new Error(`Failed to parse DATABASE_URL: ${r}`)}}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(!e){let r=this.baseConfig.url;r&&(e=new URL(r).pathname.slice(1))}try{let r=new URL(this.baseConfig.url);return r.pathname=`/${e}`,r.toString()}catch(r){throw new Error(`Failed to build connection string for database "${e}": ${r instanceof Error?r.message:String(r)}`)}}getPool(e){let r=this.buildConnectionString(e);if(!this.pools.has(r)){let o={connectionString:r,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new Te(o);a.on("error",n=>{}),this.pools.set(r,a)}return this.pools.get(r)??new Te({connectionString:r})}async closePool(e){let r=this.pools.get(e);r&&(await r.end(),this.pools.delete(e))}async closePoolByDatabase(e){let r=this.buildConnectionString(e);await this.closePool(r)}async closeAll(){let e=Array.from(this.pools.entries()).map(async([r,o])=>{await o.end()});await Promise.all(e),this.pools.clear()}getActivePools(){return Array.from(this.pools.keys())}},Vt=new G,b=t=>Vt.getPool(t)});function Se(t){let e=t.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(")?D.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"?D.number:e==="boolean"||e==="bool"?D.boolean:e==="json"||e==="jsonb"?D.json:(e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"||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",D.text)}function Ne(t){let e=t.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?p.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?p.bigint:e==="smallint"||e==="int2"?p.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?p.numeric:e==="real"||e==="float4"?p.float:e==="double precision"||e==="float8"||e==="float"?p.double:e==="money"?p.money:e==="boolean"||e==="bool"?p.boolean:e==="text"?p.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?p.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?p.char:e==="json"?p.json:e==="jsonb"?p.jsonb:e==="xml"?p.xml:e==="uuid"?p.uuid:e==="date"?p.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?p.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?p.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?p.timestamptz:e==="interval"||e.startsWith("interval")?p.interval:e==="bytea"?p.bytea:e==="inet"?p.inet:e==="cidr"?p.cidr:e==="macaddr"?p.macaddr:e==="macaddr8"?p.macaddr8:e==="point"?p.point:e==="line"?p.line:e==="polygon"?p.polygon:e.startsWith("array")||e.includes("[]")?p.text:e.startsWith("user-defined")||e==="enum"?p.enum:p.text}var D,p,ve=f(()=>{"use strict";D={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"};p={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",boolean:"boolean",text:"text",varchar:"varchar",char:"char",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",array:"array",enum:"enum"}});var F,J=f(()=>{"use strict";T();ve();F=async(t,e)=>{let o=await b(e).connect();try{return(await o.query(`
2
+ var Kt=Object.defineProperty;var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var Mt=(t,e)=>{for(var r in e)Kt(t,r,{get:e[r],enumerable:!0})};var ue=m(()=>{"use strict"});var R,de=m(()=>{"use strict";R={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",PROXY_URL:process.env.NODE_ENV==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var pe=m(()=>{"use strict"});var fe,B=m(()=>{"use strict";fe={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",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:["database","management","studio","spreadsheet","ai","sql"],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_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"/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 ge=m(()=>{"use strict"});var q=m(()=>{"use strict";ue();de();pe();B();ge()});import{Pool as nr}from"pg";var j,ar,x,G=m(()=>{"use strict";j=null,ar=()=>{if(!j){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{j=new nr({connectionString:process.env.DATABASE_URL}),j.on("error",t=>{})}catch(t){throw t}}return j},x=new Proxy({},{get(t,e){try{return ar()[e]}catch(r){throw r}}})});var xe=m(()=>{"use strict"});var D,Y=m(()=>{"use strict";D={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"}});function Ae(t){let e=t.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(")?D.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"?D.number:e==="boolean"||e==="bool"?D.boolean:e==="json"||e==="jsonb"?D.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?D.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"?D.text:D.text}function $e(t){let e=t.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?f.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?f.bigint:e==="smallint"||e==="int2"?f.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?f.numeric:e==="real"||e==="float4"?f.float:e==="double precision"||e==="float8"||e==="float"?f.double:e==="money"?f.money:e==="boolean"||e==="bool"?f.boolean:e==="text"?f.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?f.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?f.char:e==="json"?f.json:e==="jsonb"?f.jsonb:e==="xml"?f.xml:e==="uuid"?f.uuid:e==="date"?f.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?f.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?f.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?f.timestamptz:e==="interval"||e.startsWith("interval")?f.interval:e==="bytea"?f.bytea:e==="inet"?f.inet:e==="cidr"?f.cidr:e==="macaddr"?f.macaddr:e==="macaddr8"?f.macaddr8:e==="point"?f.point:e==="line"?f.line:e==="polygon"?f.polygon:e.startsWith("array")||e.includes("[]")?f.text:e.startsWith("user-defined")||e==="enum"?f.enum:f.text}var f,Le=m(()=>{"use strict";Y();f={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",boolean:"boolean",text:"text",varchar:"varchar",char:"char",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",array:"array",enum:"enum"}});var Pe=m(()=>{"use strict"});import{z as sr}from"zod";var ir,J,X=m(()=>{"use strict";ir=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],J=sr.enum(ir)});import{z as l}from"zod";var cr,ko,Ie,F,Oe,qe,ke,Z,Ue,T,je=m(()=>{"use strict";X();cr=l.object({columnName:l.string().min(1),columnType:l.string().min(1),defaultValue:l.string(),isPrimaryKey:l.boolean(),isNullable:l.boolean(),isUnique:l.boolean(),isIdentity:l.boolean(),isArray:l.boolean()}),ko=l.object({columnName:l.string().min(1),referencedTable:l.string().min(1),referencedColumn:l.string().min(1),onUpdate:J,onDelete:J}),Ie=l.object({tableName:l.string().min(1,"Table name is required"),fields:l.array(cr).min(1,"At least one field is required")}),F=l.object({tableName:l.string().min(1,"Table name is required")}),Oe=l.object({page:l.string().optional().default("1").transform(Number),pageSize:l.string().optional().default("50").transform(Number),sort:l.string().optional().default(""),order:l.enum(["asc","desc"]).optional(),filters:l.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})}),qe=l.object({tableName:l.string().min(1,"Table name is required"),data:l.record(l.string(),l.any())}),ke=l.object({tableName:l.string().min(1,"Table name is required"),updates:l.array(l.object({rowData:l.any(),columnName:l.string().min(1),value:l.any()})).min(1,"At least one update is required"),primaryKey:l.string().optional()}),Z=l.object({tableName:l.string().min(1,"Table name is required"),primaryKeys:l.array(l.object({columnName:l.string().min(1),value:l.any()})).min(1,"At least one primary key is required")}),Ue=l.object({query:l.string().min(1,"Query is required")}),T=l.object({database:l.string().optional()})});var Fe=m(()=>{"use strict"});var Ke=m(()=>{"use strict"});var Me=m(()=>{"use strict"});var We=m(()=>{"use strict"});var Ve=m(()=>{"use strict"});var He=m(()=>{"use strict"});var Be=m(()=>{"use strict"});var Qe=m(()=>{"use strict"});var ze=m(()=>{"use strict"});var v=m(()=>{"use strict";xe();Le();Pe();je();Y();Fe();Ke();Me();We();X();Ve();He();Be();Qe();ze()});import{Pool as Ge}from"pg";var ee,lr,b,S=m(()=>{"use strict";ee=class{pools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let r=new URL(e);this.baseConfig={url:e,host:r.hostname,port:Number.parseInt(r.port,10)||5432,user:r.username,password:r.password}}catch(r){throw new Error(`Failed to parse DATABASE_URL: ${r}`)}}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(!e){let r=this.baseConfig.url;r&&(e=new URL(r).pathname.slice(1))}try{let r=new URL(this.baseConfig.url);return r.pathname=`/${e}`,r.toString()}catch(r){throw new Error(`Failed to build connection string for database "${e}": ${r instanceof Error?r.message:String(r)}`)}}getPool(e){let r=this.buildConnectionString(e);if(!this.pools.has(r)){let o={connectionString:r,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new Ge(o);a.on("error",n=>{}),this.pools.set(r,a)}return this.pools.get(r)??new Ge({connectionString:r})}async closePool(e){let r=this.pools.get(e);r&&(await r.end(),this.pools.delete(e))}async closePoolByDatabase(e){let r=this.buildConnectionString(e);await this.closePool(r)}async closeAll(){let e=Array.from(this.pools.entries()).map(async([r,o])=>{await o.end()});await Promise.all(e),this.pools.clear()}getActivePools(){return Array.from(this.pools.keys())}},lr=new ee,b=t=>lr.getPool(t)});var K,te=m(()=>{"use strict";v();S();K=async(t,e)=>{let o=await b(e).connect();try{return(await o.query(`
3
3
  SELECT
4
4
  c.column_name as "columnName",
5
5
  c.data_type as "dataType",
@@ -48,18 +48,18 @@ var Nt=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var vt=(t,e)=>{f
48
48
  WHERE c.table_schema = 'public'
49
49
  AND c.table_name = $1
50
50
  ORDER BY c.ordinal_position;
51
- `,[t])).rows.map(n=>{let s=null;return n.enumValues&&(Array.isArray(n.enumValues)?s=n.enumValues:typeof n.enumValues=="string"&&(s=n.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:n.columnName,dataType:Se(n.dataType),dataTypeLabel:Ne(n.dataType),isNullable:n.isNullable,columnDefault:n.columnDefault,isPrimaryKey:n.isPrimaryKey,isForeignKey:n.isForeignKey,referencedTable:n.referencedTable,referencedColumn:n.referencedColumn,enumValues:s}})}finally{o.release()}}});async function Wt(){let t=await C.connect();try{return(await t.query(`
51
+ `,[t])).rows.map(n=>{let s=null;return n.enumValues&&(Array.isArray(n.enumValues)?s=n.enumValues:typeof n.enumValues=="string"&&(s=n.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:n.columnName,dataType:Ae(n.dataType),dataTypeLabel:$e(n.dataType),isNullable:n.isNullable,columnDefault:n.columnDefault,isPrimaryKey:n.isPrimaryKey,isForeignKey:n.isForeignKey,referencedTable:n.referencedTable,referencedColumn:n.referencedColumn,enumValues:s}})}finally{o.release()}}});async function mr(){let t=await x.connect();try{return(await t.query(`
52
52
  SELECT table_name
53
53
  FROM information_schema.tables
54
54
  WHERE table_schema = 'public'
55
55
  AND table_type = 'BASE TABLE'
56
56
  ORDER BY table_name;
57
- `)).rows.map(r=>r.table_name)}finally{t.release()}}async function Mt(t){let e=await C.connect();try{return(await e.query(`
57
+ `)).rows.map(r=>r.table_name)}finally{t.release()}}async function ur(t){let e=await x.connect();try{return(await e.query(`
58
58
  SELECT obj_description(oid) as description
59
59
  FROM pg_class
60
60
  WHERE relname = $1
61
61
  AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public');
62
- `,[t])).rows[0]?.description||void 0}finally{e.release()}}async function Bt(t){let e=await C.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function Ht(t){let e={name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable};return t.isPrimaryKey&&(e.isPrimaryKey=!0),t.isForeignKey&&t.referencedTable&&t.referencedColumn&&(e.foreignKey=`${t.referencedTable}.${t.referencedColumn}`),t.enumValues&&t.enumValues.length>0&&(e.enumValues=t.enumValues,e.description=`Enum values: ${t.enumValues.join(", ")}`),e}function Qt(t){let e=[];for(let r of t)for(let o of r.columns)if(o.foreignKey){let[a,n]=o.foreignKey.split(".");e.push({fromTable:r.name,fromColumn:o.name,toTable:a,toColumn:n})}return e}async function zt(t={}){let{includeSampleData:e=!1,includeDescriptions:r=!0}=t;try{let a=(await Wt()).map(async i=>{let[m,u,d]=await Promise.all([F(i),r?Mt(i):Promise.resolve(void 0),e?Bt(i):Promise.resolve([])]),l={name:i,columns:m.map(Ht)};return u&&(l.description=u),d.length>0&&(l.sampleData=d),l}),n=await Promise.all(a),s=Qt(n);return{dbType:"PostgreSQL",tables:n,relationships:s}}catch(o){throw new Error(`Failed to fetch database schema: ${o instanceof Error?o.message:"Unknown error"}`)}}async function De(){return zt({includeSampleData:!0,includeDescriptions:!0})}var Re=f(()=>{"use strict";Y();J()});function Ce(t){return`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
62
+ `,[t])).rows[0]?.description||void 0}finally{e.release()}}async function dr(t){let e=await x.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function pr(t){let e={name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable};return t.isPrimaryKey&&(e.isPrimaryKey=!0),t.isForeignKey&&t.referencedTable&&t.referencedColumn&&(e.foreignKey=`${t.referencedTable}.${t.referencedColumn}`),t.enumValues&&t.enumValues.length>0&&(e.enumValues=t.enumValues,e.description=`Enum values: ${t.enumValues.join(", ")}`),e}function fr(t){let e=[];for(let r of t)for(let o of r.columns)if(o.foreignKey){let[a,n]=o.foreignKey.split(".");e.push({fromTable:r.name,fromColumn:o.name,toTable:a,toColumn:n})}return e}async function gr(t={}){let{includeSampleData:e=!1,includeDescriptions:r=!0}=t;try{let a=(await mr()).map(async i=>{let[d,u,p]=await Promise.all([K(i),r?ur(i):Promise.resolve(void 0),e?dr(i):Promise.resolve([])]),c={name:i,columns:d.map(pr)};return u&&(c.description=u),p.length>0&&(c.sampleData=p),c}),n=await Promise.all(a),s=fr(n);return{dbType:"PostgreSQL",tables:n,relationships:s}}catch(o){throw new Error(`Failed to fetch database schema: ${o instanceof Error?o.message:"Unknown error"}`)}}async function Ye(){return gr({includeSampleData:!0,includeDescriptions:!0})}var Je=m(()=>{"use strict";G();te()});function Xe(t){return`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
63
63
 
64
64
  **Your Role:**
65
65
  1. Keep responses SHORT - 2-3 sentences maximum unless generating SQL
@@ -74,7 +74,7 @@ var Nt=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var vt=(t,e)=>{f
74
74
  6. No preamble, no apologies, get straight to the answer
75
75
 
76
76
  **Database Context:**
77
- ${Yt(t)}
77
+ ${br(t)}
78
78
 
79
79
  **Guidelines:**
80
80
  1. Always generate syntactically correct SQL for the database type (${t.dbType})
@@ -112,7 +112,7 @@ LIMIT 5;
112
112
 
113
113
  This will return the 5 customers with the highest total order value. You might also want to see:
114
114
  - Revenue trends over time for these customers
115
- - Their most frequently ordered products"`}function Yt(t){let e=`Database Type: ${t.dbType}
115
+ - Their most frequently ordered products"`}function br(t){let e=`Database Type: ${t.dbType}
116
116
 
117
117
  `;e+=`**Tables and Columns:**
118
118
  `;for(let r of t.tables){e+=`
@@ -126,7 +126,7 @@ This will return the 5 customers with the highest total order value. You might a
126
126
  `)}if(t.relationships&&t.relationships.length>0){e+=`
127
127
  **Relationships:**
128
128
  `;for(let r of t.relationships)e+=` - ${r.fromTable}.${r.fromColumn} -> ${r.toTable}.${r.toColumn}
129
- `}return e}var _e=f(()=>{"use strict"});import{Hono as Gt}from"hono";var X,$e=f(()=>{"use strict";Re();I();_e();X=new Gt;X.post("/",async t=>{try{let{messages:e,conversationId:r}=await t.req.json(),o=await De(),a=Ce(o),n={messages:e,conversationId:r,systemPrompt:a},s=await fetch(`${N.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!s.ok){let u=await s.json();return t.json({error:u.error||"Proxy request failed"},s.status)}let{readable:i,writable:m}=new TransformStream;return s.body?.pipeTo(m),new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(e){let r=e instanceof Error?e.message:"An error occurred";return t.json({error:r},500)}})});import{z as c}from"zod";var Jt,xe,Xt,Zt,Pe,K,Ae,Le,Oe,Z,qe,L,_=f(()=>{"use strict";Jt=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],xe=c.enum(Jt),Xt=c.object({columnName:c.string().min(1),columnType:c.string().min(1),defaultValue:c.string(),isPrimaryKey:c.boolean(),isNullable:c.boolean(),isUnique:c.boolean(),isIdentity:c.boolean(),isArray:c.boolean()}),Zt=c.object({columnName:c.string().min(1),referencedTable:c.string().min(1),referencedColumn:c.string().min(1),onUpdate:xe,onDelete:xe}),Pe=c.object({tableName:c.string().min(1,"Table name is required"),fields:c.array(Xt).min(1,"At least one field is required"),foreignKeys:c.array(Zt).optional()}),K=c.object({tableName:c.string().min(1,"Table name is required")}),Ae=c.object({page:c.string().optional().default("1").transform(Number),pageSize:c.string().optional().default("50").transform(Number),sort:c.string().optional().default(""),order:c.enum(["asc","desc"]).optional(),filters:c.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})}),Le=c.object({tableName:c.string().min(1,"Table name is required"),data:c.record(c.string(),c.any())}),Oe=c.object({tableName:c.string().min(1,"Table name is required"),updates:c.array(c.object({rowData:c.any(),columnName:c.string().min(1),value:c.any()})).min(1,"At least one update is required"),primaryKey:c.string().optional()}),Z=c.object({tableName:c.string().min(1,"Table name is required"),primaryKeys:c.array(c.object({columnName:c.string().min(1),value:c.any()})).min(1,"At least one primary key is required")}),qe=c.object({query:c.string().min(1,"Query is required")}),L=c.object({database:c.string().optional()})});var $,V=f(()=>{"use strict";$=(t,e,r)=>{let o=e instanceof Error?e.message:r,a=!1;return e&&typeof e=="object"&&"code"in e?a=e.code==="ECONNREFUSED":e&&typeof e=="object"&&"errors"in e&&Array.isArray(e.errors)&&(a=e.errors?.some(s=>s.code==="ECONNREFUSED")??!1),a?t.json({success:!1,message:"Cannot connect to database. Please check your DATABASE_URL and ensure the database server is running.",error:o},503):t.json({success:!1,message:o},500)}});import{zValidator as ke}from"@hono/zod-validator";import{Hono as er}from"hono";var ee,Ie=f(()=>{"use strict";J();_();V();ee=new er;ee.get("/",ke("param",K),ke("query",L),async t=>{try{let{tableName:e}=t.req.valid("param"),{database:r}=t.req.valid("query"),o=await F(e,r);return t.json(o)}catch(e){return $(t,e,"Failed to fetch columns")}})});var tr,rr,je,Ue=f(()=>{"use strict";T();tr=t=>{if(t.length===0)return{clause:"",values:[]};let e=[],r=[];for(let o of t){let a=r.length+1,n=`"${o.columnName}"`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${o.operator} $${a}`),r.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = $${a}`),r.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != $${a}`),r.push(o.value));break;case"like":e.push(`${n}::text LIKE $${a}`),r.push(o.value);break;case"not like":e.push(`${n}::text NOT LIKE $${a}`),r.push(o.value);break;case"ilike":e.push(`${n}::text ILIKE $${a}`),r.push(o.value);break;case"not ilike":e.push(`${n}::text NOT ILIKE $${a}`),r.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:r}},rr=(t,e)=>Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(o=>`"${o.columnName}" ${o.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY "${t}" ${e?.toUpperCase()||"ASC"}`:"",je=async(t,e=1,r=50,o="",a="asc",n=[],s)=>{let i=rr((Array.isArray(o),o),a),{clause:m,values:u}=tr(n),l=await b(s).connect();try{let g=(e-1)*r,w=await l.query(`SELECT COUNT(*) as total FROM "${t}" ${m}`,u),y=Number(w.rows[0].total),E=Math.ceil(y/r),S=u.length+1,h=u.length+2;return{data:(await l.query(`SELECT * FROM "${t}" ${m} ${i} LIMIT $${S} OFFSET $${h}`,[...u,r,g])).rows,meta:{page:e,limit:r,total:y,totalPages:E,hasNextPage:e<E,hasPreviousPage:e>1}}}finally{l.release()}}});import{zValidator as Fe}from"@hono/zod-validator";import{Hono as or}from"hono";var te,Ke=f(()=>{"use strict";Ue();_();V();te=new or;te.get("/",Fe("param",K),Fe("query",Ae),async t=>{try{let{tableName:e}=t.req.valid("param"),{page:r,pageSize:o,sort:a,order:n,filters:s}=t.req.valid("query"),i="";if(a)try{let d=JSON.parse(a);Array.isArray(d)?i=d:i=a}catch{i=a}let m=t.req.query("database"),u=await je(e,r,o,i,n,s,m);return t.json(u)}catch(e){return $(t,e,"Failed to fetch table data")}})});async function Ve(){return(await b().query(`
129
+ `}return e}var Ze=m(()=>{"use strict"});import{Hono as yr}from"hono";var re,et=m(()=>{"use strict";q();Je();Ze();re=new yr;re.post("/",async t=>{try{let{messages:e,conversationId:r}=await t.req.json(),o=await Ye(),a=Xe(o),n={messages:e,conversationId:r,systemPrompt:a},s=await fetch(`${R.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!s.ok){let u=await s.json();return t.json({error:u.error||"Proxy request failed"},s.status)}let{readable:i,writable:d}=new TransformStream;return s.body?.pipeTo(d),new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(e){let r=e instanceof Error?e.message:"An error occurred";return t.json({error:r},500)}})});var A,M=m(()=>{"use strict";A=(t,e,r)=>{let o=e instanceof Error?e.message:r,a=!1;return e&&typeof e=="object"&&"code"in e?a=e.code==="ECONNREFUSED":e&&typeof e=="object"&&"errors"in e&&Array.isArray(e.errors)&&(a=e.errors?.some(s=>s.code==="ECONNREFUSED")??!1),a?t.json({success:!1,message:"Cannot connect to database. Please check your DATABASE_URL and ensure the database server is running.",error:o},503):t.json({success:!1,message:o},500)}});import{zValidator as tt}from"@hono/zod-validator";import{Hono as hr}from"hono";var oe,rt=m(()=>{"use strict";v();te();M();oe=new hr;oe.get("/",tt("param",F),tt("query",T),async t=>{try{let{tableName:e}=t.req.valid("param"),{database:r}=t.req.valid("query"),o=await K(e,r);return t.json(o)}catch(e){return A(t,e,"Failed to fetch columns")}})});var Er,wr,ot,nt=m(()=>{"use strict";S();Er=t=>{if(t.length===0)return{clause:"",values:[]};let e=[],r=[];for(let o of t){let a=r.length+1,n=`"${o.columnName}"`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${o.operator} $${a}`),r.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = $${a}`),r.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != $${a}`),r.push(o.value));break;case"like":e.push(`${n}::text LIKE $${a}`),r.push(o.value);break;case"not like":e.push(`${n}::text NOT LIKE $${a}`),r.push(o.value);break;case"ilike":e.push(`${n}::text ILIKE $${a}`),r.push(o.value);break;case"not ilike":e.push(`${n}::text NOT ILIKE $${a}`),r.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:r}},wr=(t,e)=>Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(o=>`"${o.columnName}" ${o.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY "${t}" ${e?.toUpperCase()||"ASC"}`:"",ot=async(t,e=1,r=50,o="",a="asc",n=[],s)=>{let i=wr((Array.isArray(o),o),a),{clause:d,values:u}=Er(n),c=await b(s).connect();try{let g=(e-1)*r,w=await c.query(`SELECT COUNT(*) as total FROM "${t}" ${d}`,u),y=Number(w.rows[0].total),E=Math.ceil(y/r),N=u.length+1,h=u.length+2;return{data:(await c.query(`SELECT * FROM "${t}" ${d} ${i} LIMIT $${N} OFFSET $${h}`,[...u,r,g])).rows,meta:{page:e,limit:r,total:y,totalPages:E,hasNextPage:e<E,hasPreviousPage:e>1}}}finally{c.release()}}});import{zValidator as at}from"@hono/zod-validator";import{Hono as Tr}from"hono";var ne,st=m(()=>{"use strict";v();nt();M();ne=new Tr;ne.get("/",at("param",F),at("query",Oe),async t=>{try{let{tableName:e}=t.req.valid("param"),{page:r,pageSize:o,sort:a,order:n,filters:s}=t.req.valid("query"),i="";if(a)try{let p=JSON.parse(a);Array.isArray(p)?i=p:i=a}catch{i=a}let d=t.req.query("database"),u=await ot(e,r,o,i,n,s,d);return t.json(u)}catch(e){return A(t,e,"Failed to fetch table data")}})});async function it(){return(await b().query(`
130
130
  SELECT
131
131
  d.datname as name,
132
132
  pg_size_pretty(pg_database_size(d.datname)) as size,
@@ -135,7 +135,7 @@ This will return the 5 customers with the highest total order value. You might a
135
135
  FROM pg_catalog.pg_database d
136
136
  WHERE d.datistemplate = false
137
137
  ORDER BY d.datname;
138
- `)).rows}async function We(){return(await b().query("SELECT current_database() as database;")).rows[0]}async function Me(){let o=(await b().query(`
138
+ `)).rows}async function ct(){return(await b().query("SELECT current_database() as database;")).rows[0]}async function lt(){let o=(await b().query(`
139
139
  SELECT
140
140
  version() as version,
141
141
  current_database() as database,
@@ -144,7 +144,7 @@ This will return the 5 customers with the highest total order value. You might a
144
144
  inet_server_port() as port,
145
145
  (SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
146
146
  (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
147
- `)).rows[0],a=process.env.DATABASE_URL,n="localhost",s=5432;if(a)try{let i=new URL(a);n=i.hostname,s=Number.parseInt(i.port,10)||5432}catch{}return{host:o.host||n,port:o.port||s,user:o.user,database:o.database,version:o.version,activeConnections:Number.parseInt(o.active_connections,10),maxConnections:Number.parseInt(o.max_connections,10)}}var Be=f(()=>{"use strict";T()});import{Hono as nr}from"hono";var O,He=f(()=>{"use strict";Be();O=new nr;O.get("/",async t=>{try{let e=await Ve();return t.json(e)}catch{return t.json({error:"Failed to fetch databases list"},500)}});O.get("/current",async t=>{try{let e=await We();return t.json(e)}catch{return t.json({error:"Failed to fetch current database"},500)}});O.get("/connection",async t=>{try{let e=await Me();return t.json(e)}catch{return t.json({error:"Failed to fetch database connection info"},500)}})});var Qe,ze=f(()=>{"use strict";T();Qe=async t=>{let{query:e,database:r}=t,a=await b(r).connect();try{if(!e||!e.trim())throw new Error("Query cannot be empty");let n=e.trim().replace(/;+$/,""),s=performance.now(),i=await a.query(n),m=performance.now()-s;return{columns:i.fields.map(d=>d.name),rows:i.rows,rowCount:i.rows.length,duration:m,message:i.rows.length===0?"OK":void 0}}catch(n){let s=n instanceof Error?n.message:"Unknown error occurred";throw new Error(s)}finally{a.release()}}});import{zValidator as ar}from"@hono/zod-validator";import{Hono as sr}from"hono";var re,Ye=f(()=>{"use strict";ze();_();re=new sr;re.post("/",ar("json",qe),async t=>{try{let{query:e}=t.req.valid("json"),r=t.req.query("database"),o=await Qe({query:e,database:r});return t.json(o)}catch(e){let r=e instanceof Error?e.message:"Unknown error";return t.json({status:"error",error:r},500)}})});var oe,ir,Ge,Je,Xe=f(()=>{"use strict";T();oe=async(t,e)=>(await b(e).query(`
147
+ `)).rows[0],a=process.env.DATABASE_URL,n="localhost",s=5432;if(a)try{let i=new URL(a);n=i.hostname,s=Number.parseInt(i.port,10)||5432}catch{}return{host:o.host||n,port:o.port||s,user:o.user,database:o.database,version:o.version,activeConnections:Number.parseInt(o.active_connections,10),maxConnections:Number.parseInt(o.max_connections,10)}}var mt=m(()=>{"use strict";S()});import{Hono as Sr}from"hono";var I,ut=m(()=>{"use strict";mt();I=new Sr;I.get("/",async t=>{try{let e=await it();return t.json(e)}catch{return t.json({error:"Failed to fetch databases list"},500)}});I.get("/current",async t=>{try{let e=await ct();return t.json(e)}catch{return t.json({error:"Failed to fetch current database"},500)}});I.get("/connection",async t=>{try{let e=await lt();return t.json(e)}catch{return t.json({error:"Failed to fetch database connection info"},500)}})});var dt,pt=m(()=>{"use strict";S();dt=async t=>{let{query:e,database:r}=t,a=await b(r).connect();try{if(!e||!e.trim())throw new Error("Query cannot be empty");let n=e.trim().replace(/;+$/,""),s=performance.now(),i=await a.query(n),d=performance.now()-s;return{columns:i.fields.map(p=>p.name),rows:i.rows,rowCount:i.rows.length,duration:d,message:i.rows.length===0?"OK":void 0}}catch(n){let s=n instanceof Error?n.message:"Unknown error occurred";throw new Error(s)}finally{a.release()}}});import{zValidator as Nr}from"@hono/zod-validator";import{Hono as Rr}from"hono";var ae,ft=m(()=>{"use strict";v();pt();ae=new Rr;ae.post("/",Nr("json",Ue),async t=>{try{let{query:e}=t.req.valid("json"),r=t.req.query("database"),o=await dt({query:e,database:r});return t.json(o)}catch(e){let r=e instanceof Error?e.message:"Unknown error";return t.json({status:"error",error:r},500)}})});var se,Dr,gt,bt,yt=m(()=>{"use strict";S();se=async(t,e)=>(await b(e).query(`
148
148
  SELECT
149
149
  tc.constraint_name,
150
150
  tc.table_name as referencing_table,
@@ -160,39 +160,39 @@ This will return the 5 customers with the highest total order value. You might a
160
160
  AND ccu.table_schema = tc.table_schema
161
161
  WHERE tc.constraint_type = 'FOREIGN KEY'
162
162
  AND ccu.table_name = $1
163
- `,[t])).rows.map(({row:n})=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column})),ir=async(t,e,r)=>{let o=await oe(t,r);if(o.length===0)return[];let a=[],n=b(r),s=new Map;for(let m of o){let u=`${m.referencingTable}.${m.referencingColumn}`;s.has(u)||s.set(u,[]),s.get(u)?.push(m)}let i=e.map(m=>m.value);for(let[m,u]of s){let d=u[0];if(!d||!e.find(y=>y.columnName===d.referencedColumn))continue;let g=i.map((y,E)=>`$${E+1}`).join(", "),w=`
164
- SELECT * FROM "${d.referencingTable}"
165
- WHERE "${d.referencingColumn}" IN (${g})
163
+ `,[t])).rows.map(({row:n})=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column})),Dr=async(t,e,r)=>{let o=await se(t,r);if(o.length===0)return[];let a=[],n=b(r),s=new Map;for(let d of o){let u=`${d.referencingTable}.${d.referencingColumn}`;s.has(u)||s.set(u,[]),s.get(u)?.push(d)}let i=e.map(d=>d.value);for(let[d,u]of s){let p=u[0];if(!p||!e.find(y=>y.columnName===p.referencedColumn))continue;let g=i.map((y,E)=>`$${E+1}`).join(", "),w=`
164
+ SELECT * FROM "${p.referencingTable}"
165
+ WHERE "${p.referencingColumn}" IN (${g})
166
166
  LIMIT 100
167
- `;try{let y=await n.query(w,i);y.rows.length>0&&a.push({tableName:d.referencingTable,columnName:d.referencingColumn,constraintName:d.constraintName,records:y.rows})}catch{}}return a},Ge=async t=>{let{tableName:e,primaryKeys:r,database:o}=t,n=await b(o).connect();try{await n.query("BEGIN");let s=r[0]?.columnName;if(!s)throw new Error("Primary key column name is required");let i=r.map(l=>l.value),m=i.map((l,g)=>`$${g+1}`).join(", "),u=`
167
+ `;try{let y=await n.query(w,i);y.rows.length>0&&a.push({tableName:p.referencingTable,columnName:p.referencingColumn,constraintName:p.constraintName,records:y.rows})}catch{}}return a},gt=async t=>{let{tableName:e,primaryKeys:r,database:o}=t,n=await b(o).connect();try{await n.query("BEGIN");let s=r[0]?.columnName;if(!s)throw new Error("Primary key column name is required");let i=r.map(c=>c.value),d=i.map((c,g)=>`$${g+1}`).join(", "),u=`
168
168
  DELETE FROM "${e}"
169
- WHERE "${s}" IN (${m})
169
+ WHERE "${s}" IN (${d})
170
170
  RETURNING *
171
- `,d=await n.query(u,i);return await n.query("COMMIT"),{success:!0,message:`Successfully deleted ${d.rowCount} ${d.rowCount===1?"record":"records"} from "${e}"`,deletedCount:d.rowCount??0}}catch(s){if(await n.query("ROLLBACK"),s.code==="23503")return{success:!1,message:"Cannot delete: Records are referenced by other tables",fkViolation:!0,relatedRecords:await ir(e,r)};throw s}finally{n.release()}},Je=async t=>{let{tableName:e,primaryKeys:r,database:o}=t,n=await b(o).connect();try{await n.query("BEGIN");let s=r[0]?.columnName;if(!s)throw new Error("Primary key column name is required");let i=r.map(h=>h.value),m=await oe(e,o),u=0,d=new Set,l=async(h,P,q)=>{let yt=await oe(h,o);for(let A of yt){let H=q.map((ie,St)=>`$${St+1}`).join(", "),Tt=`
172
- SELECT "${A.referencedColumn}" FROM "${h}"
173
- WHERE "${P}" IN (${H})
174
- `,se=(await n.query(Tt,q)).rows.map(({row:ie})=>ie[A.referencedColumn]);se.length>0&&await l(A.referencingTable,A.referencingColumn,se)}let ht=q.map((A,H)=>`$${H+1}`).join(", "),Et=`
171
+ `,p=await n.query(u,i);return await n.query("COMMIT"),{success:!0,message:`Successfully deleted ${p.rowCount} ${p.rowCount===1?"record":"records"} from "${e}"`,deletedCount:p.rowCount??0}}catch(s){if(await n.query("ROLLBACK"),s.code==="23503")return{success:!1,message:"Cannot delete: Records are referenced by other tables",fkViolation:!0,relatedRecords:await Dr(e,r)};throw s}finally{n.release()}},bt=async t=>{let{tableName:e,primaryKeys:r,database:o}=t,n=await b(o).connect();try{await n.query("BEGIN");let s=r[0]?.columnName;if(!s)throw new Error("Primary key column name is required");let i=r.map(h=>h.value),d=await se(e,o),u=0,p=new Set,c=async(h,L,O)=>{let Ot=await se(h,o);for(let P of Ot){let H=O.map((me,Ft)=>`$${Ft+1}`).join(", "),jt=`
172
+ SELECT "${P.referencedColumn}" FROM "${h}"
173
+ WHERE "${L}" IN (${H})
174
+ `,le=(await n.query(jt,O)).rows.map(({row:me})=>me[P.referencedColumn]);le.length>0&&await c(P.referencingTable,P.referencingColumn,le)}let qt=O.map((P,H)=>`$${H+1}`).join(", "),kt=`
175
175
  DELETE FROM "${h}"
176
- WHERE "${P}" IN (${ht})
177
- `,wt=await n.query(Et,q);u+=wt.rowCount??0,d.add(h)};for(let h of m)d.has(h.referencingTable)||await l(h.referencingTable,h.referencingColumn,i);let g=i.map((h,P)=>`$${P+1}`).join(", "),w=`
176
+ WHERE "${L}" IN (${qt})
177
+ `,Ut=await n.query(kt,O);u+=Ut.rowCount??0,p.add(h)};for(let h of d)p.has(h.referencingTable)||await c(h.referencingTable,h.referencingColumn,i);let g=i.map((h,L)=>`$${L+1}`).join(", "),w=`
178
178
  DELETE FROM "${e}"
179
179
  WHERE "${s}" IN (${g})
180
180
  RETURNING *
181
- `,y=await n.query(w,i);await n.query("COMMIT");let E=y.rowCount??0;return{success:!0,message:u>0?`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}" and ${u} related ${u===1?"record":"records"} from other tables`:`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}"`,deletedCount:E+u}}catch(s){throw await n.query("ROLLBACK"),s}finally{n.release()}}});var Ze,et=f(()=>{"use strict";T();Ze=async t=>{let{tableName:e,data:r,database:o}=t,n=await b(o).connect();try{let s=Object.keys(r),i=Object.values(r),m=s.map((g,w)=>`$${w+1}`).join(", "),u=s.map(g=>`"${g}"`).join(", "),d=`
181
+ `,y=await n.query(w,i);await n.query("COMMIT");let E=y.rowCount??0;return{success:!0,message:u>0?`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}" and ${u} related ${u===1?"record":"records"} from other tables`:`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}"`,deletedCount:E+u}}catch(s){throw await n.query("ROLLBACK"),s}finally{n.release()}}});var ht,Et=m(()=>{"use strict";S();ht=async t=>{let{tableName:e,data:r,database:o}=t,n=await b(o).connect();try{let s=Object.keys(r),i=Object.values(r),d=s.map((g,w)=>`$${w+1}`).join(", "),u=s.map(g=>`"${g}"`).join(", "),p=`
182
182
  INSERT INTO "${e}" (${u})
183
- VALUES (${m})
183
+ VALUES (${d})
184
184
  RETURNING *
185
- `,l=await n.query(d,i);return{success:!0,message:`Record inserted into "${e}" successfully`,data:l.rows[0]}}catch(s){throw s}finally{n.release()}}});var tt,rt=f(()=>{"use strict";T();tt=async t=>{let{tableName:e,updates:r,primaryKey:o="id",database:a}=t,s=await b(a).connect();try{await s.query("BEGIN");let i=new Map;for(let d of r){let l=d.rowData[o];if(l===void 0)throw new Error(`Primary key "${o}" not found in row data. Please ensure the row has a primary key.`);i.has(l)||i.set(l,[]),i.get(l)?.push({columnName:d.columnName,value:d.value,rowData:d.rowData})}let m=[],u=0;for(let[d,l]of i.entries()){let g=l.map((S,h)=>`"${S.columnName}" = $${h+1}`),w=l.map(S=>S.value!==null&&typeof S.value=="object"?JSON.stringify(S.value):S.value);w.push(d);let y=`
185
+ `,c=await n.query(p,i);return{success:!0,message:`Record inserted into "${e}" successfully`,data:c.rows[0]}}catch(s){throw s}finally{n.release()}}});var wt,Tt=m(()=>{"use strict";S();wt=async t=>{let{tableName:e,updates:r,primaryKey:o="id",database:a}=t,s=await b(a).connect();try{await s.query("BEGIN");let i=new Map;for(let p of r){let c=p.rowData[o];if(c===void 0)throw new Error(`Primary key "${o}" not found in row data. Please ensure the row has a primary key.`);i.has(c)||i.set(c,[]),i.get(c)?.push({columnName:p.columnName,value:p.value,rowData:p.rowData})}let d=[],u=0;for(let[p,c]of i.entries()){let g=c.map((N,h)=>`"${N.columnName}" = $${h+1}`),w=c.map(N=>N.value!==null&&typeof N.value=="object"?JSON.stringify(N.value):N.value);w.push(p);let y=`
186
186
  UPDATE "${e}"
187
187
  SET ${g.join(", ")}
188
188
  WHERE "${o}" = $${w.length}
189
189
  RETURNING *
190
- `,E=await s.query(y,w);if(E.rowCount===0)throw new Error(`Record with ${o} = ${d} not found in table "${e}"`);m.push(E.rows[0]),u+=E.rowCount||0}return await s.query("COMMIT"),{success:!0,message:`Successfully updated ${u} ${u===1?"row":"rows"} in "${e}"`,data:m,updatedCount:u}}catch(i){throw await s.query("ROLLBACK"),i}finally{s.release()}}});import{zValidator as v}from"@hono/zod-validator";import{Hono as cr}from"hono";import{z as ot}from"zod";var W,x,nt=f(()=>{"use strict";Xe();et();rt();_();W=ot.object({database:ot.string()}),x=new cr;x.post("/",v("json",Le),v("query",W),async t=>{try{let e=t.req.valid("json"),{tableName:r,data:o}=e,{database:a}=t.req.valid("query"),n=await Ze({tableName:r,data:o,database:a});return t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to create record",detail:r},500)}});x.patch("/",v("json",Oe),v("query",W),async t=>{try{let e=t.req.valid("json"),{tableName:r,updates:o,primaryKey:a}=e,{database:n}=t.req.valid("query"),s=await tt({tableName:r,updates:o,primaryKey:a,database:n});return t.json(s)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to update records",detail:r},500)}});x.delete("/",v("json",Z),v("query",W),async t=>{try{let e=t.req.valid("json"),{tableName:r,primaryKeys:o}=e,{database:a}=t.req.valid("query"),n=await Ge({tableName:r,primaryKeys:o,database:a});return n.fkViolation?t.json(n,409):t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to delete records",detail:r},500)}});x.delete("/force",v("json",Z),v("query",W),async t=>{try{let e=t.req.valid("json"),{tableName:r,primaryKeys:o}=e,{database:a}=t.req.valid("query"),n=await Je({tableName:r,primaryKeys:o,database:a});return t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to force delete records",detail:r},500)}})});var at,st=f(()=>{"use strict";T();at=async(t,e)=>{let{tableName:r,fields:o,foreignKeys:a}=t,s=await b(e).connect();try{let i=o.map(l=>{let g=`"${l.columnName}" ${l.columnType}`;return l.isArray&&(g+="[]"),l.isPrimaryKey&&(g+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(g+=" UNIQUE"),l.isNullable||(g+=" NOT NULL"),l.isIdentity&&(g+=" GENERATED ALWAYS AS IDENTITY"),l.defaultValue&&!l.isIdentity&&(g+=` DEFAULT ${l.defaultValue}`),g}),m=a?.map(l=>`CONSTRAINT "${`fk_${r}_${l.columnName}_${l.referencedTable}_${l.referencedColumn}`}" FOREIGN KEY ("${l.columnName}") REFERENCES "${l.referencedTable}" ("${l.referencedColumn}") ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`)||[],u=[...i,...m],d=`
190
+ `,E=await s.query(y,w);if(E.rowCount===0)throw new Error(`Record with ${o} = ${p} not found in table "${e}"`);d.push(E.rows[0]),u+=E.rowCount||0}return await s.query("COMMIT"),{success:!0,message:`Successfully updated ${u} ${u===1?"row":"rows"} in "${e}"`,data:d,updatedCount:u}}catch(i){throw await s.query("ROLLBACK"),i}finally{s.release()}}});import{zValidator as _}from"@hono/zod-validator";import{Hono as _r}from"hono";var $,St=m(()=>{"use strict";v();yt();Et();Tt();$=new _r;$.post("/",_("json",qe),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,data:o}=e,{database:a}=t.req.valid("query"),n=await ht({tableName:r,data:o,database:a});return t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to create record",detail:r},500)}});$.patch("/",_("json",ke),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,updates:o,primaryKey:a}=e,{database:n}=t.req.valid("query"),s=await wt({tableName:r,updates:o,primaryKey:a,database:n});return t.json(s)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to update records",detail:r},500)}});$.delete("/",_("json",Z),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,primaryKeys:o}=e,{database:a}=t.req.valid("query"),n=await gt({tableName:r,primaryKeys:o,database:a});return n.fkViolation?t.json(n,409):t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to delete records",detail:r},500)}});$.delete("/force",_("json",Z),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,primaryKeys:o}=e,{database:a}=t.req.valid("query"),n=await bt({tableName:r,primaryKeys:o,database:a});return t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to force delete records",detail:r},500)}})});var Nt,Rt=m(()=>{"use strict";S();Nt=async(t,e)=>{let{tableName:r,fields:o,foreignKeys:a}=t,s=await b(e).connect();try{let i=o.map(c=>{let g=`"${c.columnName}" ${c.columnType}`;return c.isArray&&(g+="[]"),c.isPrimaryKey&&(g+=" PRIMARY KEY"),c.isUnique&&!c.isPrimaryKey&&(g+=" UNIQUE"),c.isNullable||(g+=" NOT NULL"),c.isIdentity&&(g+=" GENERATED ALWAYS AS IDENTITY"),c.defaultValue&&!c.isIdentity&&(g+=` DEFAULT ${c.defaultValue}`),g}),d=a?.map(c=>`CONSTRAINT "${`fk_${r}_${c.columnName}_${c.referencedTable}_${c.referencedColumn}`}" FOREIGN KEY ("${c.columnName}") REFERENCES "${c.referencedTable}" ("${c.referencedColumn}") ON UPDATE ${c.onUpdate} ON DELETE ${c.onDelete}`)||[],u=[...i,...d],p=`
191
191
  CREATE TABLE "${r}" (
192
192
  ${u.join(`,
193
193
  `)}
194
194
  );
195
- `;return await s.query(d),{success:!0,tableName:r,message:`Table "${r}" created successfully`}}catch(i){throw i}finally{s.release()}}});var it,ct=f(()=>{"use strict";T();it=async t=>{let r=await b(t).connect();try{return(await r.query(`
195
+ `;return await s.query(p),{success:!0,tableName:r,message:`Table "${r}" created successfully`}}catch(i){throw i}finally{s.release()}}});var Dt,_t=m(()=>{"use strict";S();Dt=async t=>{let r=await b(t).connect();try{return(await r.query(`
196
196
  SELECT
197
197
  t.table_name as "tableName",
198
198
  COALESCE(s.n_live_tup, 0) as "rowCount"
@@ -201,5 +201,5 @@ This will return the 5 customers with the highest total order value. You might a
201
201
  WHERE t.table_schema = 'public'
202
202
  AND t.table_type = 'BASE TABLE'
203
203
  ORDER BY t.table_name;
204
- `)).rows.map(a=>({tableName:a.tableName,rowCount:Number(a.rowCount)}))}finally{r.release()}}});import{zValidator as ne}from"@hono/zod-validator";import{Hono as lr}from"hono";var M,lt=f(()=>{"use strict";st();ct();_();V();M=new lr;M.get("/",ne("query",L),async t=>{try{let{database:e}=t.req.valid("query"),r=await it(e);return t.json(r)}catch(e){return $(t,e,"Failed to fetch tables")}});M.post("/",ne("json",Pe),ne("query",L),async t=>{try{let e=t.req.valid("json"),{database:r}=t.req.valid("query"),o=await at(e,r);return t.json(o)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to create table",detail:r},500)}})});import{Hono as ur}from"hono";var ut,mr,dr,mt,dt=f(()=>{"use strict";Y();ut=async()=>{let t=await C.connect();try{return await t.query("SELECT 1"),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:"Unknown error"}}finally{t.release()}},mr=5e3,dr=1e4,mt=t=>{let e=new ur;return e.get("/",t(()=>{let r;return{onOpen:async(o,a)=>{try{let n=await ut();a.send(JSON.stringify({...n,status:n.success?"connected":"failed",timestamp:new Date().toISOString()}))}catch{a.send(JSON.stringify({success:!1,status:"failed",error:"Initial check failed",timestamp:new Date().toISOString()}))}r=setInterval(async()=>{try{let n=await Promise.race([ut(),new Promise((s,i)=>setTimeout(()=>i({success:!1,error:"Database check timeout"}),dr))]);a.send(JSON.stringify({...n,status:n.success?"connected":"failed",timestamp:new Date().toISOString()}))}catch(n){a.send(JSON.stringify({success:!1,status:"failed",error:n instanceof Error?n.message:"Check failed",timestamp:new Date().toISOString()}))}},mr)},onMessage(o,a){},onClose:()=>{r&&clearInterval(r)},onError:o=>{r&&clearInterval(r)}}})),e}});var gt={};vt(gt,{createServer:()=>hr});import B from"path";import{fileURLToPath as pr}from"url";import{serveStatic as pt}from"@hono/node-server/serve-static";import{createNodeWebSocket as fr}from"@hono/node-ws";import{Hono as gr}from"hono";import{cors as br}from"hono/cors";import{logger as yr}from"hono/logger";var ft,hr,bt=f(()=>{"use strict";$e();Ie();Ke();He();Ye();nt();lt();dt();ft=()=>{if(process.env.NODE_ENV==="development")return B.resolve(process.cwd(),"../core/dist");let t=B.dirname(pr(import.meta.url));return B.resolve(t,"./core-dist")},hr=()=>{let t=new gr({strict:!1}),{upgradeWebSocket:e,injectWebSocket:r}=fr({app:t});return t.use("/*",br()),process.env.NODE_ENV==="development"&&t.use(yr()),t.use("/favicon.ico",pt({path:B.resolve(ft(),"favicon.ico")})),t.use("*",async(o,a)=>{o.header("Access-Control-Allow-Origin","*"),o.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),o.header("Access-Control-Allow-Headers","Content-Type"),await a()}),t.route("/ws",mt(e)),t.route("/databases",O),t.route("/tables",M),t.route("/tables/:tableName/columns",ee),t.route("/tables/:tableName/data",te),t.route("/records",x),t.route("/query",re),t.route("/chat",X),t.use("/*",pt({root:ft()})),{app:t,injectWebSocket:r}}});import{intro as Er,outro as wr}from"@clack/prompts";import{serve as Tr}from"@hono/node-server";import Sr from"open";import ae from"picocolors";import{program as ce}from"commander";var le=()=>(ce.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("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv),ce.opts());import{readFile as Dt}from"fs/promises";import{resolve as Rt}from"path";import{cancel as k,isCancel as Q,note as ue,select as Ct,spinner as _t,text as me}from"@clack/prompts";import{parse as $t}from"dotenv";import z from"picocolors";var de=async(t,e)=>{let r=e||"DATABASE_URL";if(t?.[r])return t[r];let o=_t();o.start("Looking for database connection..."),t?ue(z.red(`${r} not found in .env`)):ue(z.red("No .env file found in current directory"));let a=await Ct({message:`How do you want to provide ${r}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((Q(a)||a==="cancel")&&(k("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){o.start("Waiting for path...");let s=await me({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(m){if(!m.trim())return"Path is required"}});Q(s)&&(k("Cancelled."),process.exit(0)),o.stop("Trying custom .env...");let i=Rt(s);try{let m=await Dt(i,"utf-8"),u=$t(m);if(u[r])return u[r];throw new Error(`${r} still missing in custom file`)}catch(m){let u=m;k(`Cannot read or parse file: ${z.dim(u.message)}`),process.exit(1)}}o.stop("Manual input...");let n=await me({message:`Paste your ${r}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(s){if(!s.trim())return"Connection string is required!";try{new URL(s);return}catch{return"Must be a valid URL format"}}});return Q(n)&&(k("Cancelled."),process.exit(0)),n.trim()};import{access as xt,readFile as Pt}from"fs/promises";import{resolve as pe}from"path";import{parse as At}from"dotenv";var R=async t=>{let e=t?pe(t):pe(process.cwd(),".env");try{await xt(e);let r=await Pt(e,"utf-8");return At(r)}catch(r){if(r instanceof Error&&r.message.includes("ENOENT"))return null;throw r}};import{intro as Lt,outro as Ot}from"@clack/prompts";import fe from"picocolors";var ge=()=>{Lt(fe.inverse(" db-studio ")),Ot(fe.green("For more information, visit: https://dbstudio.sh/docs"))};import{intro as qt,note as kt,outro as be}from"@clack/prompts";import j from"picocolors";I();var ye=async(t,e,r)=>{qt(j.inverse(" db-studio "));let o=r||N.VAR_NAME,a=null;if(e)a=e;else{let n=t?await R(t):await R(N.ENV);n?.[o]&&(a=n[o])}a?be(j.green(`\u2713 Database connection configured (using ${o})`)):(kt(j.red(`\u2717 ${o} not found`),"Status"),be(j.yellow("\u26A0 No database connection configured")))};import{intro as jt,outro as Ut}from"@clack/prompts";import Ee from"picocolors";var he={name:"db-studio",type:"module",version:"1.2.8",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","database client","postgres","postgresql","database gui","sql client","database studio","postgres gui","ai sql","sql editor","er diagram","database management","data browser","spreadsheet database","postgres admin","mysql client","sqlite client","database tool","developer tools"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",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:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup","build:release":"tsup --minify --sourcemap",start:"node dist/index.js",check:"biome check --write --unsafe --verbose"},dependencies:{"@clack/prompts":"^0.11.0","@hono/node-server":"^1.19.7","@hono/node-ws":"^1.2.0","@hono/zod-validator":"^0.7.6","@tanstack/ai-openai":"^0.2.1","@upstash/redis":"^1.36.1",commander:"^12.1.0",dotenv:"^16.4.7",hono:"^4.10.4",open:"^10.0.2",pg:"^8.13.1",picocolors:"^1.1.1",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@biomejs/cli-linux-x64":"^2.2.6","@types/node":"^20.11.17","@types/pg":"^8.16.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^5.8.3",wrangler:"^4.4.0"}};var we=()=>{jt(Ee.inverse(" db-studio ")),Ut(Ee.green(`\u{1F680} db-studio v${he.version}`))};I();var Nr=async()=>{let{env:t,port:e,databaseUrl:r,varName:o,status:a,help:n,version:s}=le();n&&(ge(),process.exit(0)),s&&(we(),process.exit(0)),a&&(await ye(t,r,o),process.exit(0)),Er(ae.inverse(" db-studio "));let i=e?parseInt(e,10):N.PORT,m=o||N.VAR_NAME,u=t?await R(t):await R(N.ENV),d=r||await de(u,m);process.env.DATABASE_URL=d;let{createServer:l}=await Promise.resolve().then(()=>(bt(),gt)),{app:g,injectWebSocket:w}=l(),y=Tr({fetch:g.fetch,port:i});w(y),wr(ae.green(`Server running at ${ae.cyan(`http://localhost:${i}`)}`)),process.env.NODE_ENV&&process.env.NODE_ENV!=="development"&&await Sr(`http://localhost:${i}`)};Nr().catch(t=>{process.exit(1)});export{Nr as main};
204
+ `)).rows.map(a=>({tableName:a.tableName,rowCount:Number(a.rowCount)}))}finally{r.release()}}});import{zValidator as ie}from"@hono/zod-validator";import{Hono as vr}from"hono";var W,vt=m(()=>{"use strict";v();Rt();_t();M();W=new vr;W.get("/",ie("query",T),async t=>{try{let{database:e}=t.req.valid("query"),r=await Dt(e);return t.json(r)}catch(e){return A(t,e,"Failed to fetch tables")}});W.post("/",ie("json",Ie),ie("query",T),async t=>{try{let e=t.req.valid("json"),{database:r}=t.req.valid("query"),o=await Nt(e,r);return t.json(o)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to create table",detail:r},500)}})});import{Hono as Cr}from"hono";var Ct,xr,Ar,xt,At=m(()=>{"use strict";G();Ct=async()=>{let t=await x.connect();try{return await t.query("SELECT 1"),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:"Unknown error"}}finally{t.release()}},xr=5e3,Ar=1e4,xt=t=>{let e=new Cr;return e.get("/",t(()=>{let r;return{onOpen:async(o,a)=>{try{let n=await Ct();a.send(JSON.stringify({...n,status:n.success?"connected":"failed",timestamp:new Date().toISOString()}))}catch{a.send(JSON.stringify({success:!1,status:"failed",error:"Initial check failed",timestamp:new Date().toISOString()}))}r=setInterval(async()=>{try{let n=await Promise.race([Ct(),new Promise((s,i)=>setTimeout(()=>i({success:!1,error:"Database check timeout"}),Ar))]);a.send(JSON.stringify({...n,status:n.success?"connected":"failed",timestamp:new Date().toISOString()}))}catch(n){a.send(JSON.stringify({success:!1,status:"failed",error:n instanceof Error?n.message:"Check failed",timestamp:new Date().toISOString()}))}},xr)},onMessage(o,a){},onClose:()=>{r&&clearInterval(r)},onError:o=>{r&&clearInterval(r)}}})),e}});var Pt={};Mt(Pt,{createServer:()=>qr});import V from"path";import{fileURLToPath as $r}from"url";import{serveStatic as $t}from"@hono/node-server/serve-static";import{createNodeWebSocket as Lr}from"@hono/node-ws";import{Hono as Pr}from"hono";import{cors as Ir}from"hono/cors";import{logger as Or}from"hono/logger";var Lt,qr,It=m(()=>{"use strict";et();rt();st();ut();ft();St();vt();At();Lt=()=>{if(process.env.NODE_ENV==="development")return V.resolve(process.cwd(),"../core/dist");let t=V.dirname($r(import.meta.url));return V.resolve(t,"./core-dist")},qr=()=>{let t=new Pr({strict:!1}),{upgradeWebSocket:e,injectWebSocket:r}=Lr({app:t});return t.use("/*",Ir()),process.env.NODE_ENV==="development"&&t.use(Or()),t.use("/favicon.ico",$t({path:V.resolve(Lt(),"favicon.ico")})),t.use("*",async(o,a)=>{o.header("Access-Control-Allow-Origin","*"),o.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),o.header("Access-Control-Allow-Headers","Content-Type"),await a()}),t.route("/ws",xt(e)),t.route("/databases",I),t.route("/tables",W),t.route("/tables/:tableName/columns",oe),t.route("/tables/:tableName/data",ne),t.route("/records",$),t.route("/query",ae),t.route("/chat",re),t.use("/*",$t({root:Lt()})),{app:t,injectWebSocket:r}}});q();import{intro as kr,outro as Ur}from"@clack/prompts";import{serve as jr}from"@hono/node-server";import Fr from"open";import ce from"picocolors";import{program as be}from"commander";var ye=()=>(be.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("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv),be.opts());import{readFile as Wt}from"fs/promises";import{resolve as Vt}from"path";import{cancel as k,isCancel as Q,note as he,select as Ht,spinner as Bt,text as Ee}from"@clack/prompts";import{parse as Qt}from"dotenv";import z from"picocolors";var we=async(t,e)=>{let r=e||"DATABASE_URL";if(t?.[r])return t[r];let o=Bt();o.start("Looking for database connection..."),t?he(z.red(`${r} not found in .env`)):he(z.red("No .env file found in current directory"));let a=await Ht({message:`How do you want to provide ${r}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((Q(a)||a==="cancel")&&(k("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){o.start("Waiting for path...");let s=await Ee({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(d){if(!d.trim())return"Path is required"}});Q(s)&&(k("Cancelled."),process.exit(0)),o.stop("Trying custom .env...");let i=Vt(s);try{let d=await Wt(i,"utf-8"),u=Qt(d);if(u[r])return u[r];throw new Error(`${r} still missing in custom file`)}catch(d){let u=d;k(`Cannot read or parse file: ${z.dim(u.message)}`),process.exit(1)}}o.stop("Manual input...");let n=await Ee({message:`Paste your ${r}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(s){if(!s.trim())return"Connection string is required!";try{new URL(s);return}catch{return"Must be a valid URL format"}}});return Q(n)&&(k("Cancelled."),process.exit(0)),n.trim()};import{access as zt,readFile as Gt}from"fs/promises";import{resolve as Te}from"path";import{parse as Yt}from"dotenv";var C=async t=>{let e=t?Te(t):Te(process.cwd(),".env");try{await zt(e);let r=await Gt(e,"utf-8");return Yt(r)}catch(r){if(r instanceof Error&&r.message.includes("ENOENT"))return null;throw r}};B();import{intro as Jt,outro as Xt}from"@clack/prompts";import Se from"picocolors";var Ne=()=>{Jt(Se.inverse(" db-studio ")),Xt(Se.green(`For more information, visit: ${fe.SITE_DOCS_LINK}`))};q();import{intro as Zt,note as er,outro as Re}from"@clack/prompts";import U from"picocolors";var De=async(t,e,r)=>{Zt(U.inverse(" db-studio "));let o=r||R.VAR_NAME,a=null;if(e)a=e;else{let n=t?await C(t):await C(R.ENV);n?.[o]&&(a=n[o])}a?Re(U.green(`\u2713 Database connection configured (using ${o})`)):(er(U.red(`\u2717 ${o} not found`),"Status"),Re(U.yellow("\u26A0 No database connection configured")))};import{intro as rr,outro as or}from"@clack/prompts";import ve from"picocolors";var _e={name:"db-studio",type:"module",version:"1.2.9",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","database client","postgres","postgresql","database gui","sql client","database studio","postgres gui","ai sql","sql editor","er diagram","database management","data browser","spreadsheet database","postgres admin","mysql client","sqlite client","database tool","developer tools"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",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:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",start:"node dist/index.js",check:"biome check --write --unsafe --verbose"},dependencies:{"@clack/prompts":"^0.11.0","@hono/node-server":"^1.19.7","@hono/node-ws":"^1.2.0","@hono/zod-validator":"^0.7.6",commander:"^12.1.0",dotenv:"^16.4.7",hono:"^4.10.4",open:"^10.0.2",pg:"^8.13.1",picocolors:"^1.1.1",zod:"^4.2.1"},devDependencies:{shared:"workspace:*","@biomejs/biome":"^2.2.6","@types/node":"^20.11.17","@types/pg":"^8.16.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^5.8.3"}};var Ce=()=>{rr(ve.inverse(" db-studio ")),or(ve.green(`\u{1F680} db-studio v${_e.version}`))};var Kr=async()=>{let{env:t,port:e,databaseUrl:r,varName:o,status:a,help:n,version:s}=ye();n&&(Ne(),process.exit(0)),s&&(Ce(),process.exit(0)),a&&(await De(t,r,o),process.exit(0)),kr(ce.inverse(" db-studio "));let i=e?parseInt(e,10):R.PORT,d=o||R.VAR_NAME,u=t?await C(t):await C(R.ENV),p=r||await we(u,d);process.env.DATABASE_URL=p;let{createServer:c}=await Promise.resolve().then(()=>(It(),Pt)),{app:g,injectWebSocket:w}=c(),y=jr({fetch:g.fetch,port:i});w(y),Ur(ce.green(`Server running at ${ce.cyan(`http://localhost:${i}`)}`)),process.env.NODE_ENV&&process.env.NODE_ENV!=="development"&&await Fr(`http://localhost:${i}`)};Kr().catch(t=>{process.exit(1)});export{Kr as main};
205
205
  //# sourceMappingURL=index.js.map