db-studio 1.3.27 → 1.3.33

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 (70) hide show
  1. package/dist/core-dist/assets/{_baseUniq-C_vPXkJP.js → _baseUniq-p5pzSIGg.js} +1 -1
  2. package/dist/core-dist/assets/{_pathlessLayout-BXQIga5f.js → _pathlessLayout-bNFwtzio.js} +2 -2
  3. package/dist/core-dist/assets/{_queryId-D8-CsguU.js → _queryId-CoulYCHZ.js} +1 -1
  4. package/dist/core-dist/assets/_table-D5wliAP3.js +8 -0
  5. package/dist/core-dist/assets/{arc-1V0QxUK8.js → arc-D4Z6A87O.js} +1 -1
  6. package/dist/core-dist/assets/{architectureDiagram-VXUJARFQ-CFri9V3F.js → architectureDiagram-VXUJARFQ-CoK5V8Gq.js} +1 -1
  7. package/dist/core-dist/assets/{blockDiagram-VD42YOAC-ClhIgJjQ.js → blockDiagram-VD42YOAC-C5HbbFu4.js} +1 -1
  8. package/dist/core-dist/assets/{c4Diagram-YG6GDRKO-BO3ObrTD.js → c4Diagram-YG6GDRKO-nT6ePZrr.js} +1 -1
  9. package/dist/core-dist/assets/{cdoe-editor-BxMx7GmC.js → cdoe-editor-itVA__0A.js} +1 -1
  10. package/dist/core-dist/assets/channel-RRrTb5YX.js +1 -0
  11. package/dist/core-dist/assets/{chunk-4BX2VUAB-BMfKmWOX.js → chunk-4BX2VUAB-C0cKTKuS.js} +1 -1
  12. package/dist/core-dist/assets/{chunk-55IACEB6-CQJI28O-.js → chunk-55IACEB6-CS37Jqhh.js} +1 -1
  13. package/dist/core-dist/assets/{chunk-B4BG7PRW-iEBvSKmc.js → chunk-B4BG7PRW-CNxT4kr_.js} +1 -1
  14. package/dist/core-dist/assets/{chunk-DI55MBZ5-D3zKvHrW.js → chunk-DI55MBZ5-Dlh63cJN.js} +1 -1
  15. package/dist/core-dist/assets/{chunk-FMBD7UC4-Y2ZVa7Rr.js → chunk-FMBD7UC4-zlhbJE8N.js} +1 -1
  16. package/dist/core-dist/assets/{chunk-QN33PNHL-B41HyhcX.js → chunk-QN33PNHL-CBxCREMZ.js} +1 -1
  17. package/dist/core-dist/assets/{chunk-QZHKN3VN-DSPK-keG.js → chunk-QZHKN3VN-CjOf_UT-.js} +1 -1
  18. package/dist/core-dist/assets/{chunk-TZMSLE5B--SKjjh8g.js → chunk-TZMSLE5B-C8_nfweM.js} +1 -1
  19. package/dist/core-dist/assets/classDiagram-2ON5EDUG-Bo8bE3Gj.js +1 -0
  20. package/dist/core-dist/assets/classDiagram-v2-WZHVMYZB-Bo8bE3Gj.js +1 -0
  21. package/dist/core-dist/assets/clone-tDnlR_HJ.js +1 -0
  22. package/dist/core-dist/assets/{code-block-IT6T5CEO-D8dr238E.js → code-block-IT6T5CEO-CI7D1Ckp.js} +1 -1
  23. package/dist/core-dist/assets/{cose-bilkent-S5V4N54A-Ca3KmLQf.js → cose-bilkent-S5V4N54A-pMpZq0EL.js} +1 -1
  24. package/dist/core-dist/assets/{dagre-6UL2VRFP-CcoGFqDF.js → dagre-6UL2VRFP-Cst9zRrY.js} +1 -1
  25. package/dist/core-dist/assets/{diagram-PSM6KHXK-B7cDrRFX.js → diagram-PSM6KHXK-BXpUEAWs.js} +1 -1
  26. package/dist/core-dist/assets/{diagram-QEK2KX5R-DpZEtDNm.js → diagram-QEK2KX5R-Ceeu-b2e.js} +1 -1
  27. package/dist/core-dist/assets/{diagram-S2PKOQOG-BVMLYlwm.js → diagram-S2PKOQOG-B2WHBnj5.js} +1 -1
  28. package/dist/core-dist/assets/{erDiagram-Q2GNP2WA-VjZvcfHt.js → erDiagram-Q2GNP2WA-C_yvmhoA.js} +1 -1
  29. package/dist/core-dist/assets/{flowDiagram-NV44I4VS-BPYKonp8.js → flowDiagram-NV44I4VS-Z3pNI5g9.js} +1 -1
  30. package/dist/core-dist/assets/{ganttDiagram-JELNMOA3-YZ7JH3lc.js → ganttDiagram-JELNMOA3-BKJSG4df.js} +1 -1
  31. package/dist/core-dist/assets/{gitGraphDiagram-NY62KEGX-_zgpjSlg.js → gitGraphDiagram-NY62KEGX-xd8UZtkJ.js} +1 -1
  32. package/dist/core-dist/assets/{graph-6tmbx1dj.js → graph-BiTFYAoZ.js} +1 -1
  33. package/dist/core-dist/assets/{index-CG7j3ZfO.js → index-B8zdJg_q.js} +3 -3
  34. package/dist/core-dist/assets/index-CI-PCTpD.css +1 -0
  35. package/dist/core-dist/assets/{index-DUtjV0B-.js → index-Ck69W-AH.js} +1 -1
  36. package/dist/core-dist/assets/index-D2I1nxdU.js +1 -0
  37. package/dist/core-dist/assets/{infoDiagram-WHAUD3N6-Kg_R2eW0.js → infoDiagram-WHAUD3N6-CRdg8M2S.js} +1 -1
  38. package/dist/core-dist/assets/{journeyDiagram-XKPGCS4Q-DonaYC7V.js → journeyDiagram-XKPGCS4Q-C4rNrDv0.js} +1 -1
  39. package/dist/core-dist/assets/{kanban-definition-3W4ZIXB7-ReikhLs4.js → kanban-definition-3W4ZIXB7-D4bdMcnq.js} +1 -1
  40. package/dist/core-dist/assets/{layout-DUsCRHb6.js → layout-WHeMgL_l.js} +1 -1
  41. package/dist/core-dist/assets/{linear-4gAoSSyZ.js → linear-CPEHgNrr.js} +1 -1
  42. package/dist/core-dist/assets/{mermaid-VLURNSYL-K7TEQe9D.js → mermaid-VLURNSYL-y089KhWi.js} +4 -4
  43. package/dist/core-dist/assets/{mermaid.core-wqPk7i-K.js → mermaid.core-BxHPE-d6.js} +5 -5
  44. package/dist/core-dist/assets/{min-DccFXwe3.js → min-kHWoRv33.js} +1 -1
  45. package/dist/core-dist/assets/{mindmap-definition-VGOIOE7T-BYxGaEpf.js → mindmap-definition-VGOIOE7T-CJJOhLu9.js} +1 -1
  46. package/dist/core-dist/assets/{pieDiagram-ADFJNKIX-B3IVwgaD.js → pieDiagram-ADFJNKIX-CAk_tXAT.js} +1 -1
  47. package/dist/core-dist/assets/{quadrantDiagram-AYHSOK5B-Bi-7QC6c.js → quadrantDiagram-AYHSOK5B-C8Per30k.js} +1 -1
  48. package/dist/core-dist/assets/{queries.store-B01mhBzt.js → queries.store-DO6JjVaD.js} +1 -1
  49. package/dist/core-dist/assets/{requirementDiagram-UZGBJVZJ-CGELnJfh.js → requirementDiagram-UZGBJVZJ-EDXv7-B6.js} +1 -1
  50. package/dist/core-dist/assets/{runner-tab-CslhxcLx.js → runner-tab-DEnOfqHr.js} +3 -3
  51. package/dist/core-dist/assets/{sankeyDiagram-TZEHDZUN-BQIc9Mj1.js → sankeyDiagram-TZEHDZUN-CQ57PXul.js} +1 -1
  52. package/dist/core-dist/assets/{scroll-area-BYB-APTE.js → scroll-area-C3MoruNP.js} +1 -1
  53. package/dist/core-dist/assets/{sequenceDiagram-WL72ISMW-CLV__peW.js → sequenceDiagram-WL72ISMW-DgKiIj0U.js} +1 -1
  54. package/dist/core-dist/assets/{stateDiagram-FKZM4ZOC-D7OFCqBP.js → stateDiagram-FKZM4ZOC-DRNqRhHl.js} +1 -1
  55. package/dist/core-dist/assets/stateDiagram-v2-4FDKWEC3-D167gXuY.js +1 -0
  56. package/dist/core-dist/assets/{timeline-definition-IT6M3QCI-CG5XhHfw.js → timeline-definition-IT6M3QCI-CFZd4jmL.js} +1 -1
  57. package/dist/core-dist/assets/{treemap-KMMF4GRG-DIPpBEKk.js → treemap-KMMF4GRG-C306sutZ.js} +1 -1
  58. package/dist/core-dist/assets/{xychartDiagram-PRI3JC2R-yz236FKW.js → xychartDiagram-PRI3JC2R-CIwcgBI2.js} +1 -1
  59. package/dist/core-dist/index.html +2 -2
  60. package/dist/index.js +36 -45
  61. package/dist/index.js.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/core-dist/assets/_table-B5Z_vACA.js +0 -8
  64. package/dist/core-dist/assets/channel-DyPXV-hW.js +0 -1
  65. package/dist/core-dist/assets/classDiagram-2ON5EDUG-BuWyGwZg.js +0 -1
  66. package/dist/core-dist/assets/classDiagram-v2-WZHVMYZB-BuWyGwZg.js +0 -1
  67. package/dist/core-dist/assets/clone-B6TL1LpG.js +0 -1
  68. package/dist/core-dist/assets/index-BXRBzRx2.css +0 -1
  69. package/dist/core-dist/assets/index-DucqSMyl.js +0 -1
  70. package/dist/core-dist/assets/stateDiagram-v2-4FDKWEC3-BJrnETjC.js +0 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var zo=Object.defineProperty;var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ko=(t,e)=>{for(var o in e)zo(t,o,{get:e[o],enumerable:!0})};var qe=m(()=>{"use strict"});var M,Ie=m(()=>{"use strict";M={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 Oe=m(()=>{"use strict"});var Le,he=m(()=>{"use strict";Le={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:"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 ke=m(()=>{"use strict"});var oe=m(()=>{"use strict";qe();Ie();Oe();he();ke()});import{z as Z}from"zod";var Ge,Je=m(()=>{"use strict";Ge=Z.object({tableName:Z.string("Table name is required"),data:Z.record(Z.string("Column name is required"),Z.any())})});var Xe=m(()=>{"use strict"});import{z as W}from"zod";var Ze,et=m(()=>{"use strict";Ze=W.object({tableName:W.string().min(1,"Table name is required"),records:W.array(W.record(W.string(),W.any())).min(1,"At least one record is required")})});import{z as B}from"zod";var S,cr,ne,Za,tt,V,j=m(()=>{"use strict";S=B.object({db:B.string("Database name is required")}),cr=["pg"],ne=B.enum(cr,{message:"Invalid database type"}),Za=S.extend({dbType:ne}),tt=B.object({dbType:ne}),V=B.object({tableName:B.string("Table name is required")})});import{z as Q}from"zod";var ot,rt=m(()=>{"use strict";j();ot=Q.object({messages:Q.array(Q.object({role:Q.enum(["user","assistant"]),content:Q.string("Content is required")})),conversationId:Q.string().optional(),db:S.shape.db})});var at=m(()=>{"use strict"});import{z as A}from"zod";var lr,mr,U,ur,pr,nn,Ee=m(()=>{"use strict";lr=["text","boolean","number","enum","json","date","array"],mr=A.enum(lr),U={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},ur=["int","bigint","smallint","numeric","float","double","money","boolean","text","varchar","char","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","array","enum"],pr=A.enum(ur),nn=A.object({columnName:A.string(),dataType:mr,dataTypeLabel:pr,isNullable:A.boolean(),columnDefault:A.string().nullable(),isPrimaryKey:A.boolean(),isForeignKey:A.boolean(),referencedTable:A.string().nullable(),referencedColumn:A.string().nullable(),enumValues:A.array(A.string()).nullable()})});function nt(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(")?U.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"?U.number:e==="boolean"||e==="bool"?U.boolean:e==="json"||e==="jsonb"?U.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?U.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"?U.text:U.text}function st(t){if(!t)return b.text;let e=t.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}var b,it=m(()=>{"use strict";Ee();b={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"}});import{z as _}from"zod";var dr,ct,fr,br,lt,mt=m(()=>{"use strict";dr=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],ct=_.enum(dr),fr=_.object({columnName:_.string("Column name is required"),columnType:_.string("Column type is required"),defaultValue:_.string().optional(),isPrimaryKey:_.boolean().default(!1),isNullable:_.boolean().default(!1),isUnique:_.boolean().default(!1),isIdentity:_.boolean().default(!1),isArray:_.boolean().default(!1)}),br=_.object({columnName:_.string("Column name is required"),referencedTable:_.string("Referenced table is required"),referencedColumn:_.string("Referenced column is required"),onUpdate:ct.default("NO ACTION"),onDelete:ct.default("NO ACTION")}),lt=_.object({tableName:_.string("Table name is required"),fields:_.array(fr).min(1,"At least one field is required"),foreignKeys:_.array(br).optional()})});import{z as C}from"zod";var yr,fn,ut,pt=m(()=>{"use strict";j();yr=C.object({name:C.string("Name is required"),size:C.string("Size is required"),owner:C.string("Owner is required"),encoding:C.string("Encoding is required")}),fn=C.object({databases:C.array(yr),dbType:ne}),ut=C.object({version:C.string("Version is required"),database:C.string("Database is required"),user:C.string("User is required"),host:C.string("Host is required").nullable(),port:C.number("Port is required").nullable(),active_connections:C.coerce.number("Active connections is required"),max_connections:C.coerce.number("Max connections is required")})});var dt=m(()=>{"use strict"});import{z as $}from"zod";var ft,se,gn,Tn,bt=m(()=>{"use strict";j();ft=S.extend({cascade:$.string().optional().transform(t=>t==="true")}),se=$.object({tableName:$.string("Table name is required"),columnName:$.string("Column name is required")}),gn=$.object({db:S.shape.db,tableName:se.shape.tableName,columnName:se.shape.columnName,cascade:$.boolean().optional()}),Tn=$.object({message:$.string("Message is required"),tableName:$.string("Table name is required"),columnName:$.string("Column name is required"),deletedCount:$.number("Deleted count is required").default(0)})});import{z as Y}from"zod";var _e,yt=m(()=>{"use strict";_e=Y.object({tableName:Y.string("Table name is required"),primaryKeys:Y.array(Y.object({columnName:Y.string("Column name is required"),value:Y.any()})).min(1,"At least one primary key is required")})});import{z as hr}from"zod";var ht,gt=m(()=>{"use strict";j();ht=S.extend({cascade:hr.string().optional().transform(t=>t==="true")})});import{z as Tt}from"zod";var St,Et=m(()=>{"use strict";St=Tt.object({query:Tt.string("Query is required")})});import{z as gr}from"zod";var Tr,_t,Rt=m(()=>{"use strict";j();Tr=["csv","xlsx","json"],_t=S.extend({format:gr.enum(Tr,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var wt=m(()=>{"use strict"});import{z as T}from"zod";var qn,ie,In,Sr,On,Dt,Ct=m(()=>{"use strict";j();qn=T.object({columnName:T.string(),operator:T.string(),value:T.string()}),ie=["asc","desc"],In=T.object({columnName:T.string(),direction:T.enum(ie)}),Sr=T.object({limit:T.number(),total:T.number(),hasNextPage:T.boolean(),hasPreviousPage:T.boolean(),nextCursor:T.string().nullable(),prevCursor:T.string().nullable()}),On=T.object({data:T.array(T.record(T.string(),T.unknown())),meta:Sr}),Dt=T.object({db:S.shape.db,cursor:T.string().optional(),limit:T.string().optional().default("50").transform(Number),direction:T.enum(ie).optional().default(ie[0]),sort:T.string().optional().transform(t=>{if(!t)return"";try{let e=JSON.parse(t);return Array.isArray(e)?e:t}catch{return t}}),order:T.enum(ie).optional(),filters:T.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})})});import{z as Re}from"zod";var jn,xt=m(()=>{"use strict";jn=Re.object({tableName:Re.string("Table name is required"),rowCount:Re.coerce.number("Row count is required")})});import{z as Nt}from"zod";var Hn,vt=m(()=>{"use strict";Hn=Nt.object({schema:Nt.string()})});import{z as q}from"zod";var At,$t=m(()=>{"use strict";At=q.object({tableName:q.string("Table name is required"),primaryKey:q.string("Primary key is required").default("id"),updates:q.array(q.object({rowData:q.record(q.string("Column name is required"),q.any()),columnName:q.string("Column name is required"),value:q.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var F=m(()=>{"use strict";Je();Xe();et();rt();at();it();Ee();mt();j();pt();dt();bt();yt();gt();Et();Rt();wt();Ct();xt();vt();$t()});import{HTTPException as Er}from"hono/http-exception";import{DatabaseError as _r}from"pg";import{ZodError as Rr}from"zod";function Pt(t,e){if(t instanceof Er)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof Rr){let o=t.issues[0];return e.json({error:"Validation error",details:o.message},400)}return t instanceof Error&&(t.message.includes("ECONNREFUSED")||t.message.includes("connection refused")||t.message.includes("timeout expired")||t.message.includes("Connection terminated")||t instanceof _r&&t.code?.startsWith("08"))?e.json({error:"Database connection failed",details:t.message},503):e.json({error:t instanceof Error?t.message:"Internal server error"},500)}var qt,It=m(()=>{"use strict";qt=(t,e)=>{if(!t.success){let o=t.error?.issues[0];return e.json({error:"Validation error",details:o?.message??"Unknown validation error"},400)}}});import{Pool as wr}from"pg";var ce,Dr,we,Ot=m(()=>{"use strict";ce=null,Dr=()=>{if(!ce){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{ce=new wr({connectionString:process.env.DATABASE_URL}),ce.on("error",t=>{})}catch(t){throw t}}return ce},we=new Proxy({},{get(t,e){try{return Dr()[e]}catch(o){throw o}}})});import{Pool as Lt}from"pg";var De,kt,f,Ce,w=m(()=>{"use strict";De=class{pools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let o=e.protocol.replace(":","");return"pg"}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 o=new URL(e);this.baseConfig={url:e,host:o.hostname,port:Number.parseInt(o.port,10)||5432,user:o.username,password:o.password,dbType:this.detectDbType(o)}}catch(o){throw new Error(`Failed to parse DATABASE_URL: ${o}`)}}getDbType(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(!e){let o=this.baseConfig.url;o&&(e=new URL(o).pathname.slice(1))}try{let o=new URL(this.baseConfig.url);return o.pathname=`/${e}`,o.toString()}catch(o){throw new Error(`Failed to build connection string for database "${e}": ${o instanceof Error?o.message:String(o)}`)}}getPool(e){let o=this.buildConnectionString(e);if(!this.pools.has(o)){let r={connectionString:o,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new Lt(r);a.on("error",n=>{}),this.pools.set(o,a)}return this.pools.get(o)??new Lt({connectionString:o})}async closePool(e){let o=this.pools.get(e);o&&(await o.end(),this.pools.delete(e))}async closePoolByDatabase(e){let o=this.buildConnectionString(e);await this.closePool(o)}async closeAll(){let e=Array.from(this.pools.entries()).map(async([o,r])=>{await r.end()});await Promise.all(e),this.pools.clear()}getActivePools(){return Array.from(this.pools.keys())}},kt=new De,f=t=>kt.getPool(t),Ce=()=>kt.getDbType()});import{HTTPException as Cr}from"hono/http-exception";async function le({tableName:t,db:e}){let o=f(e),r=`
2
+ var zo=Object.defineProperty;var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ko=(t,e)=>{for(var o in e)zo(t,o,{get:e[o],enumerable:!0})};var qe=m(()=>{"use strict"});var M,Ie=m(()=>{"use strict";M={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 Oe=m(()=>{"use strict"});var Le,he=m(()=>{"use strict";Le={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:"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 ke=m(()=>{"use strict"});var oe=m(()=>{"use strict";qe();Ie();Oe();he();ke()});import{z as Z}from"zod";var Ge,Je=m(()=>{"use strict";Ge=Z.object({tableName:Z.string("Table name is required"),data:Z.record(Z.string("Column name is required"),Z.any())})});var Xe=m(()=>{"use strict"});import{z as W}from"zod";var Ze,et=m(()=>{"use strict";Ze=W.object({tableName:W.string().min(1,"Table name is required"),records:W.array(W.record(W.string(),W.any())).min(1,"At least one record is required")})});import{z as B}from"zod";var S,cr,ne,Za,tt,V,j=m(()=>{"use strict";S=B.object({db:B.string("Database name is required")}),cr=["pg"],ne=B.enum(cr,{message:"Invalid database type"}),Za=S.extend({dbType:ne}),tt=B.object({dbType:ne}),V=B.object({tableName:B.string("Table name is required")})});import{z as Q}from"zod";var ot,rt=m(()=>{"use strict";j();ot=Q.object({messages:Q.array(Q.object({role:Q.enum(["user","assistant"]),content:Q.string("Content is required")})),conversationId:Q.string().optional(),db:S.shape.db})});var at=m(()=>{"use strict"});import{z as A}from"zod";var lr,mr,U,ur,pr,nn,Ee=m(()=>{"use strict";lr=["text","boolean","number","enum","json","date","array"],mr=A.enum(lr),U={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},ur=["int","bigint","smallint","numeric","float","double","money","boolean","text","varchar","char","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","array","enum"],pr=A.enum(ur),nn=A.object({columnName:A.string(),dataType:mr,dataTypeLabel:pr,isNullable:A.boolean(),columnDefault:A.string().nullable(),isPrimaryKey:A.boolean(),isForeignKey:A.boolean(),referencedTable:A.string().nullable(),referencedColumn:A.string().nullable(),enumValues:A.array(A.string()).nullable()})});function nt(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(")?U.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"?U.number:e==="boolean"||e==="bool"?U.boolean:e==="json"||e==="jsonb"?U.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?U.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"?U.text:U.text}function st(t){if(!t)return b.text;let e=t.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}var b,it=m(()=>{"use strict";Ee();b={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"}});import{z as R}from"zod";var dr,ct,fr,br,lt,mt=m(()=>{"use strict";dr=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],ct=R.enum(dr),fr=R.object({columnName:R.string("Column name is required"),columnType:R.string("Column type is required"),defaultValue:R.string().optional(),isPrimaryKey:R.boolean().default(!1),isNullable:R.boolean().default(!1),isUnique:R.boolean().default(!1),isIdentity:R.boolean().default(!1),isArray:R.boolean().default(!1)}),br=R.object({columnName:R.string("Column name is required"),referencedTable:R.string("Referenced table is required"),referencedColumn:R.string("Referenced column is required"),onUpdate:ct.default("NO ACTION"),onDelete:ct.default("NO ACTION")}),lt=R.object({tableName:R.string("Table name is required"),fields:R.array(fr).min(1,"At least one field is required"),foreignKeys:R.array(br).optional()})});import{z as C}from"zod";var yr,fn,ut,pt=m(()=>{"use strict";j();yr=C.object({name:C.string("Name is required"),size:C.string("Size is required"),owner:C.string("Owner is required"),encoding:C.string("Encoding is required")}),fn=C.object({databases:C.array(yr),dbType:ne}),ut=C.object({version:C.string("Version is required"),database:C.string("Database is required"),user:C.string("User is required"),host:C.string("Host is required").nullable(),port:C.number("Port is required").nullable(),active_connections:C.coerce.number("Active connections is required"),max_connections:C.coerce.number("Max connections is required")})});var dt=m(()=>{"use strict"});import{z as $}from"zod";var ft,se,gn,Tn,bt=m(()=>{"use strict";j();ft=S.extend({cascade:$.string().optional().transform(t=>t==="true")}),se=$.object({tableName:$.string("Table name is required"),columnName:$.string("Column name is required")}),gn=$.object({db:S.shape.db,tableName:se.shape.tableName,columnName:se.shape.columnName,cascade:$.boolean().optional()}),Tn=$.object({message:$.string("Message is required"),tableName:$.string("Table name is required"),columnName:$.string("Column name is required"),deletedCount:$.number("Deleted count is required").default(0)})});import{z as Y}from"zod";var Re,yt=m(()=>{"use strict";Re=Y.object({tableName:Y.string("Table name is required"),primaryKeys:Y.array(Y.object({columnName:Y.string("Column name is required"),value:Y.any()})).min(1,"At least one primary key is required")})});import{z as hr}from"zod";var ht,gt=m(()=>{"use strict";j();ht=S.extend({cascade:hr.string().optional().transform(t=>t==="true")})});import{z as Tt}from"zod";var St,Et=m(()=>{"use strict";St=Tt.object({query:Tt.string("Query is required")})});import{z as gr}from"zod";var Tr,Rt,wt=m(()=>{"use strict";j();Tr=["csv","xlsx","json"],Rt=S.extend({format:gr.enum(Tr,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var _t=m(()=>{"use strict"});import{z as T}from"zod";var qn,ie,In,Sr,On,Dt,Ct=m(()=>{"use strict";j();qn=T.object({columnName:T.string(),operator:T.string(),value:T.string()}),ie=["asc","desc"],In=T.object({columnName:T.string(),direction:T.enum(ie)}),Sr=T.object({limit:T.number(),total:T.number(),hasNextPage:T.boolean(),hasPreviousPage:T.boolean(),nextCursor:T.string().nullable(),prevCursor:T.string().nullable()}),On=T.object({data:T.array(T.record(T.string(),T.unknown())),meta:Sr}),Dt=T.object({db:S.shape.db,cursor:T.string().optional(),limit:T.string().optional().default("50").transform(Number),direction:T.enum(ie).optional().default(ie[0]),sort:T.string().optional().transform(t=>{if(!t)return"";try{let e=JSON.parse(t);return Array.isArray(e)?e:t}catch{return t}}),order:T.enum(ie).optional(),filters:T.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})})});import{z as we}from"zod";var jn,xt=m(()=>{"use strict";jn=we.object({tableName:we.string("Table name is required"),rowCount:we.coerce.number("Row count is required")})});import{z as Nt}from"zod";var Hn,vt=m(()=>{"use strict";Hn=Nt.object({schema:Nt.string()})});import{z as q}from"zod";var At,$t=m(()=>{"use strict";At=q.object({tableName:q.string("Table name is required"),primaryKey:q.string("Primary key is required").default("id"),updates:q.array(q.object({rowData:q.record(q.string("Column name is required"),q.any()),columnName:q.string("Column name is required"),value:q.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var F=m(()=>{"use strict";Je();Xe();et();rt();at();it();Ee();mt();j();pt();dt();bt();yt();gt();Et();wt();_t();Ct();xt();vt();$t()});import{HTTPException as Er}from"hono/http-exception";import{DatabaseError as Rr}from"pg";import{ZodError as wr}from"zod";function Pt(t,e){if(t instanceof Er)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof wr){let o=t.issues[0];return e.json({error:"Validation error",details:o.message},400)}return t instanceof Error&&(t.message.includes("ECONNREFUSED")||t.message.includes("connection refused")||t.message.includes("timeout expired")||t.message.includes("Connection terminated")||t instanceof Rr&&t.code?.startsWith("08"))?e.json({error:"Database connection failed",details:t.message},503):e.json({error:t instanceof Error?t.message:"Internal server error"},500)}var qt,It=m(()=>{"use strict";qt=(t,e)=>{if(!t.success){let o=t.error?.issues[0];return e.json({error:"Validation error",details:o?.message??"Unknown validation error"},400)}}});import{Pool as _r}from"pg";var ce,Dr,_e,Ot=m(()=>{"use strict";ce=null,Dr=()=>{if(!ce){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{ce=new _r({connectionString:process.env.DATABASE_URL}),ce.on("error",t=>{})}catch(t){throw t}}return ce},_e=new Proxy({},{get(t,e){try{return Dr()[e]}catch(o){throw o}}})});import{Pool as Lt}from"pg";var De,kt,f,Ce,_=m(()=>{"use strict";De=class{pools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let o=e.protocol.replace(":","");if(o==="postgres"||o==="postgresql")return"pg";throw new Error(`Unsupported database type: ${o}. Currently only PostgreSQL is supported. Please use a PostgreSQL connection string (postgres:// or postgresql://).`)}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 o=new URL(e);this.baseConfig={url:e,host:o.hostname,port:Number.parseInt(o.port,10)||5432,user:o.username,password:o.password,dbType:this.detectDbType(o)}}catch(o){throw new Error(o instanceof Error?o.message:String(o))}}getDbType(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(!e){let o=this.baseConfig.url;o&&(e=new URL(o).pathname.slice(1))}try{let o=new URL(this.baseConfig.url);return o.pathname=`/${e}`,o.toString()}catch(o){throw new Error(`Failed to build connection string for database "${e}": ${o instanceof Error?o.message:String(o)}`)}}getPool(e){let o=this.buildConnectionString(e);if(!this.pools.has(o)){let r={connectionString:o,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},n=new Lt(r);n.on("error",a=>{}),this.pools.set(o,n)}return this.pools.get(o)??new Lt({connectionString:o})}async closePool(e){let o=this.pools.get(e);o&&(await o.end(),this.pools.delete(e))}async closePoolByDatabase(e){let o=this.buildConnectionString(e);await this.closePool(o)}async closeAll(){let e=Array.from(this.pools.entries()).map(async([o,r])=>{await r.end()});await Promise.all(e),this.pools.clear()}getActivePools(){return Array.from(this.pools.keys())}},kt=new De,f=t=>kt.getPool(t),Ce=()=>kt.getDbType()});import{HTTPException as Cr}from"hono/http-exception";async function le({tableName:t,db:e}){let o=f(e),r=`
3
3
  SELECT
4
4
  c.column_name as "columnName",
5
5
  c.data_type as "dataType",
@@ -48,18 +48,18 @@ var zo=Object.defineProperty;var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ko=(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
- `,{rows:a}=await o.query(r,[t]);if(!a||a.length===0)throw new Cr(404,{message:`Table "${t}" does not exist`});return a.map(n=>{let i=null;return n.enumValues&&(Array.isArray(n.enumValues)?i=n.enumValues:typeof n.enumValues=="string"&&(i=n.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:n.columnName,dataType:nt(n.dataType),dataTypeLabel:st(n.dataType),isNullable:n.isNullable,columnDefault:n.columnDefault,isPrimaryKey:n.isPrimaryKey,isForeignKey:n.isForeignKey,referencedTable:n.referencedTable,referencedColumn:n.referencedColumn,enumValues:i}})}var xe=m(()=>{"use strict";F();w()});async function xr(t){let e=f(t),o=`
51
+ `,{rows:n}=await o.query(r,[t]);if(!n||n.length===0)throw new Cr(404,{message:`Table "${t}" does not exist`});return n.map(a=>{let i=null;return a.enumValues&&(Array.isArray(a.enumValues)?i=a.enumValues:typeof a.enumValues=="string"&&(i=a.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:a.columnName,dataType:nt(a.dataType),dataTypeLabel:st(a.dataType),isNullable:a.isNullable,columnDefault:a.columnDefault,isPrimaryKey:a.isPrimaryKey,isForeignKey:a.isForeignKey,referencedTable:a.referencedTable,referencedColumn:a.referencedColumn,enumValues:i}})}var xe=m(()=>{"use strict";F();_()});async function xr(t){let e=f(t),o=`
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:r}=await e.query(o);return r.map(a=>a.table_name)}async function Nr(t){let e=await we.connect();try{return(await e.query(`
57
+ `,{rows:r}=await e.query(o);return r.map(n=>n.table_name)}async function Nr(t){let e=await _e.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 vr(t){let e=await we.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function Ar(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 $r(t){let e=[];for(let o of t)for(let r of o.columns)if(r.foreignKey){let[a,n]=r.foreignKey.split(".");e.push({fromTable:o.name,fromColumn:r.name,toTable:a,toColumn:n})}return e}async function Pr(t,e={}){let{includeSampleData:o=!1,includeDescriptions:r=!0}=e;try{let n=(await xr(t)).map(async s=>{let[u,l,p]=await Promise.all([le({tableName:s,db:t}),r?Nr(s):Promise.resolve(void 0),o?vr(s):Promise.resolve([])]),y={name:s,columns:u.map(Ar)};return l&&(y.description=l),p.length>0&&(y.sampleData=p.map(E=>Object.fromEntries(Object.entries(E).map(([d,g])=>[d,String(g)])))),y}),i=await Promise.all(n),c=$r(i);return{dbType:"PostgreSQL",tables:i,relationships:c}}catch(a){throw new Error(`Failed to fetch database schema: ${a instanceof Error?a.message:"Unknown error"}`)}}async function jt(t){return Pr(t,{includeSampleData:!0,includeDescriptions:!0})}var Ut=m(()=>{"use strict";Ot();w();xe()});function Ft(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 vr(t){let e=await _e.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function Ar(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 $r(t){let e=[];for(let o of t)for(let r of o.columns)if(r.foreignKey){let[n,a]=r.foreignKey.split(".");e.push({fromTable:o.name,fromColumn:r.name,toTable:n,toColumn:a})}return e}async function Pr(t,e={}){let{includeSampleData:o=!1,includeDescriptions:r=!0}=e;try{let a=(await xr(t)).map(async s=>{let[u,l,p]=await Promise.all([le({tableName:s,db:t}),r?Nr(s):Promise.resolve(void 0),o?vr(s):Promise.resolve([])]),y={name:s,columns:u.map(Ar)};return l&&(y.description=l),p.length>0&&(y.sampleData=p.map(E=>Object.fromEntries(Object.entries(E).map(([d,g])=>[d,String(g)])))),y}),i=await Promise.all(a),c=$r(i);return{dbType:"PostgreSQL",tables:i,relationships:c}}catch(n){throw new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}async function jt(t){return Pr(t,{includeSampleData:!0,includeDescriptions:!0})}var Ut=m(()=>{"use strict";Ot();_();xe()});function Ft(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
@@ -119,14 +119,14 @@ This will return the 5 customers with the highest total order value. You might a
119
119
  ### ${o.name}
120
120
  `,o.description&&(e+=`Description: ${o.description}
121
121
  `),e+=`Columns:
122
- `;for(let r of o.columns){let a=r.isPrimaryKey?" [PRIMARY KEY]":"",n=r.foreignKey?` [FK -> ${r.foreignKey}]`:"",i=r.nullable?"NULL":"NOT NULL";e+=` - ${r.name}: ${r.type} ${i}${a}${n}
122
+ `;for(let r of o.columns){let n=r.isPrimaryKey?" [PRIMARY KEY]":"",a=r.foreignKey?` [FK -> ${r.foreignKey}]`:"",i=r.nullable?"NULL":"NOT NULL";e+=` - ${r.name}: ${r.type} ${i}${n}${a}
123
123
  `,r.description&&(e+=` ${r.description}
124
124
  `)}o.sampleData&&o.sampleData.length>0&&(e+=`Sample data (${o.sampleData.length} rows):
125
125
  `,e+=`${JSON.stringify(o.sampleData.slice(0,3),null,2)}
126
126
  `)}if(t.relationships&&t.relationships.length>0){e+=`
127
127
  **Relationships:**
128
128
  `;for(let o of t.relationships)e+=` - ${o.fromTable}.${o.fromColumn} -> ${o.toTable}.${o.toColumn}
129
- `}return e}var Ht=m(()=>{"use strict"});import{zValidator as Ir}from"@hono/zod-validator";import{Hono as Or}from"hono";var Mt,zt=m(()=>{"use strict";oe();F();Ut();Ht();Mt=new Or().basePath("/chat").post("/",Ir("json",ot),async t=>{let{messages:e,conversationId:o,db:r}=t.req.valid("json"),a=await jt(r),n=Ft(a),i={messages:e,conversationId:o,systemPrompt:n},c=await fetch(`${M.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!c.ok){let l=await c.json();return t.json({error:l.error||"Proxy request failed"},c.status)}let{readable:s,writable:u}=new TransformStream;return c.body?.pipeTo(u),new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})})});function Kt(){let t=process.env.DATABASE_URL;if(!t)return{host:"localhost",port:5432};try{let e=new URL(t);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||5432}}catch{return{host:"localhost",port:5432}}}var Wt=m(()=>{"use strict"});import{HTTPException as Ne}from"hono/http-exception";async function Bt(){let t=f(),e=`
129
+ `}return e}var Ht=m(()=>{"use strict"});import{zValidator as Ir}from"@hono/zod-validator";import{Hono as Or}from"hono";var Mt,zt=m(()=>{"use strict";oe();F();Ut();Ht();Mt=new Or().basePath("/chat").post("/",Ir("json",ot),async t=>{let{messages:e,conversationId:o,db:r}=t.req.valid("json"),n=await jt(r),a=Ft(n),i={messages:e,conversationId:o,systemPrompt:a},c=await fetch(`${M.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!c.ok){let l=await c.json();return t.json({error:l.error||"Proxy request failed"},c.status)}let{readable:s,writable:u}=new TransformStream;return c.body?.pipeTo(u),new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})})});function Kt(){let t=process.env.DATABASE_URL;if(!t)return{host:"localhost",port:5432};try{let e=new URL(t);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||5432}}catch{return{host:"localhost",port:5432}}}var Wt=m(()=>{"use strict"});import{HTTPException as Ne}from"hono/http-exception";async function Bt(){let t=f(),e=`
130
130
  SELECT
131
131
  d.datname as name,
132
132
  pg_size_pretty(pg_database_size(d.datname)) as size,
@@ -144,15 +144,15 @@ 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:o}=await t.query(e);if(!o[0])throw new Ne(500,{message:"No connection information returned from database"});let r=ut.parse(o[0]),a=Kt();return{host:r.host||a.host,port:r.port||a.port,user:r.user,database:r.database,version:r.version.toString(),active_connections:r.active_connections,max_connections:r.max_connections}}var Yt=m(()=>{"use strict";F();w();Wt()});import{Hono as Lr}from"hono";var Gt,Jt=m(()=>{"use strict";Yt();w();Gt=new Lr().basePath("/databases").get("/",async t=>{let e=await Bt(),o=Ce();return t.json({data:{databases:e,dbType:o}},200)}).get("/current",async t=>{let e=await Vt(),o=Ce();return t.json({data:{db:e.db,dbType:o}},200)}).get("/connection",async t=>{let e=await Qt();return t.json({data:e},200)})});import{HTTPException as kr}from"hono/http-exception";var Xt,Zt=m(()=>{"use strict";w();Xt=async({query:t,db:e})=>{let o=f(e);if(!t||!t.trim())throw new kr(400,{message:"Query is required"});let r=t.trim().replace(/;+$/,""),a=performance.now(),n=await o.query(r),i=performance.now()-a;return{columns:n.fields.map(s=>s.name),rows:n.rows,rowCount:n.rows.length,duration:i,message:n.rows.length===0?"OK":void 0}}});import{zValidator as eo}from"@hono/zod-validator";import{Hono as jr}from"hono";var to,oo=m(()=>{"use strict";F();Zt();to=new jr().basePath("/query").post("/",eo("query",S),eo("json",St),async t=>{let{query:e}=t.req.valid("json"),{db:o}=t.req.valid("query"),r=await Xt({query:e,db:o});return t.json({data:r},200)})});import{HTTPException as Ur}from"hono/http-exception";async function ro({db:t,params:e}){let{tableName:o,data:r}=e,a=f(t),n=Object.keys(r),i=Object.values(r),c=n.map((p,y)=>`$${y+1}`).join(", "),s=n.map(p=>`"${p}"`).join(", "),u=`
147
+ `,{rows:o}=await t.query(e);if(!o[0])throw new Ne(500,{message:"No connection information returned from database"});let r=ut.parse(o[0]),n=Kt();return{host:r.host||n.host,port:r.port||n.port,user:r.user,database:r.database,version:r.version.toString(),active_connections:r.active_connections,max_connections:r.max_connections}}var Yt=m(()=>{"use strict";F();_();Wt()});import{Hono as Lr}from"hono";var Gt,Jt=m(()=>{"use strict";Yt();_();Gt=new Lr().basePath("/databases").get("/",async t=>{let e=await Bt(),o=Ce();return t.json({data:{databases:e,dbType:o}},200)}).get("/current",async t=>{let e=await Vt(),o=Ce();return t.json({data:{db:e.db,dbType:o}},200)}).get("/connection",async t=>{let e=await Qt();return t.json({data:e},200)})});import{HTTPException as kr}from"hono/http-exception";var Xt,Zt=m(()=>{"use strict";_();Xt=async({query:t,db:e})=>{let o=f(e);if(!t||!t.trim())throw new kr(400,{message:"Query is required"});let r=t.trim().replace(/;+$/,""),n=performance.now(),a=await o.query(r),i=performance.now()-n;return{columns:a.fields.map(s=>s.name),rows:a.rows,rowCount:a.rows.length,duration:i,message:a.rows.length===0?"OK":void 0}}});import{zValidator as eo}from"@hono/zod-validator";import{Hono as jr}from"hono";var to,oo=m(()=>{"use strict";F();Zt();to=new jr().basePath("/query").post("/",eo("query",S),eo("json",St),async t=>{let{query:e}=t.req.valid("json"),{db:o}=t.req.valid("query"),r=await Xt({query:e,db:o});return t.json({data:r},200)})});import{HTTPException as Ur}from"hono/http-exception";async function ro({db:t,params:e}){let{tableName:o,data:r}=e,n=f(t),a=Object.keys(r),i=Object.values(r),c=a.map((p,y)=>`$${y+1}`).join(", "),s=a.map(p=>`"${p}"`).join(", "),u=`
148
148
  INSERT INTO "${o}" (${s})
149
149
  VALUES (${c})
150
150
  RETURNING *
151
- `,l=await a.query(u,i);if(l.rowCount===0)throw new Ur(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:l.rowCount??0}}var ao=m(()=>{"use strict";w()});import{HTTPException as me}from"hono/http-exception";var no,so=m(()=>{"use strict";w();no=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new me(400,{message:"At least one record is required"});let a=await f(o).connect();try{let n=Object.keys(e[0]),i=n.map(l=>`"${l}"`).join(", "),c=0,s=0,u=[];await a.query("BEGIN");for(let l=0;l<e.length;l++){let p=e[l],y=n.map(g=>p[g]),E=n.map((g,h)=>`$${h+1}`).join(", "),d=`
151
+ `,l=await n.query(u,i);if(l.rowCount===0)throw new Ur(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:l.rowCount??0}}var ao=m(()=>{"use strict";_()});import{HTTPException as me}from"hono/http-exception";var no,so=m(()=>{"use strict";_();no=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new me(400,{message:"At least one record is required"});let n=await f(o).connect();try{let a=Object.keys(e[0]),i=a.map(l=>`"${l}"`).join(", "),c=0,s=0,u=[];await n.query("BEGIN");for(let l=0;l<e.length;l++){let p=e[l],y=a.map(g=>p[g]),E=a.map((g,h)=>`$${h+1}`).join(", "),d=`
152
152
  INSERT INTO "${t}" (${i})
153
153
  VALUES (${E})
154
154
  RETURNING *
155
- `;try{await a.query(d,y),c++}catch(g){throw new me(500,{message:`Failed: ${g instanceof Error?g.message:String(g)}`})}}return await a.query("COMMIT"),{success:s===0,message:`Bulk insert completed: ${c} records inserted${s>0?`, ${s} failed`:""}`,successCount:c,failureCount:s,errors:u.length>0?u:void 0}}catch(n){throw await a.query("ROLLBACK"),n instanceof me?n:new me(500,{message:`Failed to bulk insert records into "${t}"`})}finally{a.release()}}});import{HTTPException as G}from"hono/http-exception";async function ve(t,e){return(await f(e).query(`
155
+ `;try{await n.query(d,y),c++}catch(g){throw new me(500,{message:`Failed: ${g instanceof Error?g.message:String(g)}`})}}return await n.query("COMMIT"),{success:s===0,message:`Bulk insert completed: ${c} records inserted${s>0?`, ${s} failed`:""}`,successCount:c,failureCount:s,errors:u.length>0?u:void 0}}catch(a){throw await n.query("ROLLBACK"),a instanceof me?a:new me(500,{message:`Failed to bulk insert records into "${t}"`})}finally{n.release()}}});import{HTTPException as G}from"hono/http-exception";async function ve(t,e){return(await f(e).query(`
156
156
  SELECT
157
157
  tc.constraint_name,
158
158
  tc.table_name as referencing_table,
@@ -168,45 +168,45 @@ This will return the 5 customers with the highest total order value. You might a
168
168
  AND ccu.table_schema = tc.table_schema
169
169
  WHERE tc.constraint_type = 'FOREIGN KEY'
170
170
  AND ccu.table_name = $1
171
- `,[t])).rows.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function Fr(t,e,o){let r=await ve(t,o);if(r.length===0)return[];let a=[],n=f(o),i=new Map;for(let s of r){let u=`${s.referencingTable}.${s.referencingColumn}`;i.has(u)||i.set(u,[]),i.get(u)?.push(s)}let c=e.map(s=>s.value);for(let[s,u]of i){let l=u[0];if(!l||!e.find(g=>g.columnName===l.referencedColumn))continue;let y=c.map((g,h)=>`$${h+1}`).join(", "),E=`
171
+ `,[t])).rows.map(a=>({constraintName:a.constraint_name,referencingTable:a.referencing_table,referencingColumn:a.referencing_column,referencedTable:a.referenced_table,referencedColumn:a.referenced_column}))}async function Fr(t,e,o){let r=await ve(t,o);if(r.length===0)return[];let n=[],a=f(o),i=new Map;for(let s of r){let u=`${s.referencingTable}.${s.referencingColumn}`;i.has(u)||i.set(u,[]),i.get(u)?.push(s)}let c=e.map(s=>s.value);for(let[s,u]of i){let l=u[0];if(!l||!e.find(g=>g.columnName===l.referencedColumn))continue;let y=c.map((g,h)=>`$${h+1}`).join(", "),E=`
172
172
  SELECT * FROM "${l.referencingTable}"
173
173
  WHERE "${l.referencingColumn}" IN (${y})
174
174
  LIMIT 100
175
- `,d=await n.query(E,c);d.rows.length>0&&a.push({tableName:l.referencingTable,columnName:l.referencingColumn,constraintName:l.constraintName,records:d.rows})}return a}async function io({tableName:t,primaryKeys:e,db:o}){let r=f(o),a=e[0]?.columnName;if(!a)throw new G(400,{message:"Primary key column name is required"});let n=e.map(s=>s.value),i=n.map((s,u)=>`$${u+1}`).join(", "),c=`
175
+ `,d=await a.query(E,c);d.rows.length>0&&n.push({tableName:l.referencingTable,columnName:l.referencingColumn,constraintName:l.constraintName,records:d.rows})}return n}async function io({tableName:t,primaryKeys:e,db:o}){let r=f(o),n=e[0]?.columnName;if(!n)throw new G(400,{message:"Primary key column name is required"});let a=e.map(s=>s.value),i=a.map((s,u)=>`$${u+1}`).join(", "),c=`
176
176
  DELETE FROM "${t}"
177
- WHERE "${a}" IN (${i})
177
+ WHERE "${n}" IN (${i})
178
178
  RETURNING *
179
- `;try{await r.query("BEGIN");let s=await r.query(c,n);return await r.query("COMMIT"),{deletedCount:s.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(s){if(await r.query("ROLLBACK"),s.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await Fr(t,e,o)};throw s instanceof G?s:new G(500,{message:`Failed to delete records from "${t}"`})}}async function co({tableName:t,primaryKeys:e,db:o}){let r=f(o),a=e[0]?.columnName;if(!a)throw new G(400,{message:"Primary key column name is required"});let n=e.map(i=>i.value);await r.query("BEGIN");try{let i=await ve(t,o),c=0,s=new Set,u=async(d,g,h)=>{let R=await ve(d,o);for(let O of R){let J=h.map((k,X)=>`$${X+1}`).join(", "),z=`
179
+ `;try{await r.query("BEGIN");let s=await r.query(c,a);return await r.query("COMMIT"),{deletedCount:s.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(s){if(await r.query("ROLLBACK"),s.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await Fr(t,e,o)};throw s instanceof G?s:new G(500,{message:`Failed to delete records from "${t}"`})}}async function co({tableName:t,primaryKeys:e,db:o}){let r=f(o),n=e[0]?.columnName;if(!n)throw new G(400,{message:"Primary key column name is required"});let a=e.map(i=>i.value);await r.query("BEGIN");try{let i=await ve(t,o),c=0,s=new Set,u=async(d,g,h)=>{let w=await ve(d,o);for(let O of w){let J=h.map((k,X)=>`$${X+1}`).join(", "),z=`
180
180
  SELECT "${O.referencedColumn}" FROM "${d}"
181
181
  WHERE "${g}" IN (${J})
182
182
  `,v=(await r.query(z,h)).rows.map(({row:k})=>k[O.referencedColumn]);v.length>0&&await u(O.referencingTable,O.referencingColumn,v)}let D=h.map((O,J)=>`$${J+1}`).join(", "),P=`
183
183
  DELETE FROM "${d}"
184
184
  WHERE "${g}" IN (${D})
185
- `,H=await r.query(P,h);c+=H.rowCount??0,s.add(d)};for(let d of i)s.has(d.referencingTable)||await u(d.referencingTable,d.referencingColumn,n);let l=n.map((d,g)=>`$${g+1}`).join(", "),p=`
185
+ `,H=await r.query(P,h);c+=H.rowCount??0,s.add(d)};for(let d of i)s.has(d.referencingTable)||await u(d.referencingTable,d.referencingColumn,a);let l=a.map((d,g)=>`$${g+1}`).join(", "),p=`
186
186
  DELETE FROM "${t}"
187
- WHERE "${a}" IN (${l})
187
+ WHERE "${n}" IN (${l})
188
188
  RETURNING *
189
- `,y=await r.query(p,n);return await r.query("COMMIT"),{deletedCount:(y.rowCount??0)+c}}catch(i){throw await r.query("ROLLBACK"),i instanceof G?i:new G(500,{message:`Failed to force delete records from "${t}"`})}}var lo=m(()=>{"use strict";w()});import{HTTPException as ue}from"hono/http-exception";async function mo({params:t,db:e}){let{tableName:o,updates:r,primaryKey:a}=t,n=f(e),i=new Map;for(let c of r){let s=c.rowData[a];if(s==null)throw new ue(400,{message:`Primary key "${a}" not found in row data. Please ensure the row has a "${a}" column.`});i.has(s)||i.set(s,[]),i.get(s)?.push({columnName:c.columnName,value:c.value,rowData:c.rowData})}await n.query("BEGIN");try{let c=0;for(let[s,u]of i.entries()){let l=u.map((d,g)=>`"${d.columnName}" = $${g+1}`),p=u.map(d=>d.value!==null&&typeof d.value=="object"?JSON.stringify(d.value):d.value);p.push(s);let y=`
189
+ `,y=await r.query(p,a);return await r.query("COMMIT"),{deletedCount:(y.rowCount??0)+c}}catch(i){throw await r.query("ROLLBACK"),i instanceof G?i:new G(500,{message:`Failed to force delete records from "${t}"`})}}var lo=m(()=>{"use strict";_()});import{HTTPException as ue}from"hono/http-exception";async function mo({params:t,db:e}){let{tableName:o,updates:r,primaryKey:n}=t,a=f(e),i=new Map;for(let c of r){let s=c.rowData[n];if(s==null)throw new ue(400,{message:`Primary key "${n}" not found in row data. Please ensure the row has a "${n}" column.`});i.has(s)||i.set(s,[]),i.get(s)?.push({columnName:c.columnName,value:c.value,rowData:c.rowData})}await a.query("BEGIN");try{let c=0;for(let[s,u]of i.entries()){let l=u.map((d,g)=>`"${d.columnName}" = $${g+1}`),p=u.map(d=>d.value!==null&&typeof d.value=="object"?JSON.stringify(d.value):d.value);p.push(s);let y=`
190
190
  UPDATE "${o}"
191
191
  SET ${l.join(", ")}
192
- WHERE "${a}" = $${p.length}
192
+ WHERE "${n}" = $${p.length}
193
193
  RETURNING *
194
- `,E=await n.query(y,p);if(E.rowCount===0)throw new ue(404,{message:`Record with ${a} = ${s} not found in table "${o}"`});c+=E.rowCount??0}return await n.query("COMMIT"),{updatedCount:c}}catch(c){throw await n.query("ROLLBACK"),c instanceof ue?c:new ue(500,{message:`Failed to update records in "${o}"`})}}var uo=m(()=>{"use strict";w()});import{zValidator as I}from"@hono/zod-validator";import{Hono as Hr}from"hono";var po,fo=m(()=>{"use strict";F();ao();so();lo();uo();po=new Hr().basePath("/records").post("/",I("query",S),I("json",Ge),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,data:r}=t.req.valid("json"),{insertedCount:a}=await ro({db:e,params:{tableName:o,data:r}});return t.json({data:`Record inserted into "${o}" with ${a} rows inserted`},200)}).patch("/",I("query",S),I("json",At),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKey:r,updates:a}=t.req.valid("json"),{updatedCount:n}=await mo({params:{tableName:o,primaryKey:r,updates:a},db:e});return t.json({data:`Updated ${n} records in "${o}"`},200)}).delete("/",I("query",S),I("json",_e),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:r}=t.req.valid("json"),{deletedCount:a,fkViolation:n,relatedRecords:i}=await io({tableName:o,primaryKeys:r,db:e});return n?t.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:i}},409):t.json({data:{deletedCount:a,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",I("query",S),I("json",_e),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:r}=t.req.valid("json"),a=await co({tableName:o,primaryKeys:r,db:e});return t.json({data:a},200)}).post("/bulk",I("query",S),I("json",Ze),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,records:r}=t.req.valid("json"),a=await no({tableName:o,records:r,db:e});return t.json({data:a},200)})});async function bo({tableData:t,db:e}){let{tableName:o,fields:r,foreignKeys:a}=t,n=f(e),i=r.map(l=>{let p=`"${l.columnName}" ${l.columnType}`;return l.isArray&&(p+="[]"),l.isPrimaryKey&&(p+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(p+=" UNIQUE"),l.isNullable||(p+=" NOT NULL"),l.isIdentity&&(p+=" GENERATED ALWAYS AS IDENTITY"),l.defaultValue&&!l.isIdentity&&(p+=` DEFAULT ${l.defaultValue}`),p}),c=a?.map(l=>`CONSTRAINT "${`fk_${o}_${l.columnName}_${l.referencedTable}_${l.referencedColumn}`}" FOREIGN KEY ("${l.columnName}") REFERENCES "${l.referencedTable}" ("${l.referencedColumn}") ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`)||[],s=[...i,...c],u=`
194
+ `,E=await a.query(y,p);if(E.rowCount===0)throw new ue(404,{message:`Record with ${n} = ${s} not found in table "${o}"`});c+=E.rowCount??0}return await a.query("COMMIT"),{updatedCount:c}}catch(c){throw await a.query("ROLLBACK"),c instanceof ue?c:new ue(500,{message:`Failed to update records in "${o}"`})}}var uo=m(()=>{"use strict";_()});import{zValidator as I}from"@hono/zod-validator";import{Hono as Hr}from"hono";var po,fo=m(()=>{"use strict";F();ao();so();lo();uo();po=new Hr().basePath("/records").post("/",I("query",S),I("json",Ge),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,data:r}=t.req.valid("json"),{insertedCount:n}=await ro({db:e,params:{tableName:o,data:r}});return t.json({data:`Record inserted into "${o}" with ${n} rows inserted`},200)}).patch("/",I("query",S),I("json",At),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKey:r,updates:n}=t.req.valid("json"),{updatedCount:a}=await mo({params:{tableName:o,primaryKey:r,updates:n},db:e});return t.json({data:`Updated ${a} records in "${o}"`},200)}).delete("/",I("query",S),I("json",Re),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:r}=t.req.valid("json"),{deletedCount:n,fkViolation:a,relatedRecords:i}=await io({tableName:o,primaryKeys:r,db:e});return a?t.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:i}},409):t.json({data:{deletedCount:n,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",I("query",S),I("json",Re),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:r}=t.req.valid("json"),n=await co({tableName:o,primaryKeys:r,db:e});return t.json({data:n},200)}).post("/bulk",I("query",S),I("json",Ze),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,records:r}=t.req.valid("json"),n=await no({tableName:o,records:r,db:e});return t.json({data:n},200)})});async function bo({tableData:t,db:e}){let{tableName:o,fields:r,foreignKeys:n}=t,a=f(e),i=r.map(l=>{let p=`"${l.columnName}" ${l.columnType}`;return l.isArray&&(p+="[]"),l.isPrimaryKey&&(p+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(p+=" UNIQUE"),l.isNullable||(p+=" NOT NULL"),l.isIdentity&&(p+=" GENERATED ALWAYS AS IDENTITY"),l.defaultValue&&!l.isIdentity&&(p+=` DEFAULT ${l.defaultValue}`),p}),c=n?.map(l=>`CONSTRAINT "${`fk_${o}_${l.columnName}_${l.referencedTable}_${l.referencedColumn}`}" FOREIGN KEY ("${l.columnName}") REFERENCES "${l.referencedTable}" ("${l.referencedColumn}") ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`)||[],s=[...i,...c],u=`
195
195
  CREATE TABLE "${o}" (
196
196
  ${s.join(`,
197
197
  `)}
198
198
  );
199
- `;await n.query(u)}var yo=m(()=>{"use strict";w()});import{HTTPException as ho}from"hono/http-exception";async function go(t){let{tableName:e,columnName:o,cascade:r,db:a}=t,n=f(a),i=`
199
+ `;await a.query(u)}var yo=m(()=>{"use strict";_()});import{HTTPException as ho}from"hono/http-exception";async function go(t){let{tableName:e,columnName:o,cascade:r,db:n}=t,a=f(n),i=`
200
200
  SELECT EXISTS (
201
201
  SELECT 1 FROM information_schema.tables
202
202
  WHERE table_name = $1 AND table_schema = 'public'
203
203
  ) as exists;
204
- `,{rows:c}=await n.query(i,[e]);if(!c[0]?.exists)throw new ho(404,{message:`Table "${e}" does not exist`});let s=`
204
+ `,{rows:c}=await a.query(i,[e]);if(!c[0]?.exists)throw new ho(404,{message:`Table "${e}" does not exist`});let s=`
205
205
  SELECT EXISTS (
206
206
  SELECT 1 FROM information_schema.columns
207
207
  WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
208
208
  ) as exists;
209
- `,{rows:u}=await n.query(s,[e,o]);if(!u[0]?.exists)throw new ho(404,{message:`Column "${o}" does not exist in table "${e}"`});let p=`ALTER TABLE "${e}" DROP COLUMN "${o}" ${r?"CASCADE":"RESTRICT"}`,{rowCount:y}=await n.query(p);return{deletedCount:y??0}}var To=m(()=>{"use strict";w()});import{HTTPException as Ae}from"hono/http-exception";async function Mr(t,e){return(await f(e).query(`
209
+ `,{rows:u}=await a.query(s,[e,o]);if(!u[0]?.exists)throw new ho(404,{message:`Column "${o}" does not exist in table "${e}"`});let p=`ALTER TABLE "${e}" DROP COLUMN "${o}" ${r?"CASCADE":"RESTRICT"}`,{rowCount:y}=await a.query(p);return{deletedCount:y??0}}var To=m(()=>{"use strict";_()});import{HTTPException as Ae}from"hono/http-exception";async function Mr(t,e){return(await f(e).query(`
210
210
  SELECT
211
211
  tc.constraint_name,
212
212
  tc.table_name as referencing_table,
@@ -222,35 +222,26 @@ This will return the 5 customers with the highest total order value. You might a
222
222
  AND ccu.table_schema = tc.table_schema
223
223
  WHERE tc.constraint_type = 'FOREIGN KEY'
224
224
  AND ccu.table_name = $1
225
- `,[t])).rows.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function So(t,e){let o=await Mr(t,e);if(o.length===0)return[];let r=[],a=f(e);for(let n of o){let i=`
226
- SELECT * FROM "${n.referencingTable}"
225
+ `,[t])).rows.map(a=>({constraintName:a.constraint_name,referencingTable:a.referencing_table,referencingColumn:a.referencing_column,referencedTable:a.referenced_table,referencedColumn:a.referenced_column}))}async function So(t,e){let o=await Mr(t,e);if(o.length===0)return[];let r=[],n=f(e);for(let a of o){let i=`
226
+ SELECT * FROM "${a.referencingTable}"
227
227
  LIMIT 100
228
- `,c=await a.query(i);c.rows.length>0&&r.push({tableName:n.referencingTable,columnName:n.referencingColumn,constraintName:n.constraintName,records:c.rows})}return r}async function zr(t,e){let r=await f(e).query(`SELECT COUNT(*) as count FROM "${t}"`);return Number.parseInt(r.rows[0]?.count??"0",10)}async function Eo(t){let{tableName:e,db:o,cascade:r}=t,a=f(o),n=`
228
+ `,c=await n.query(i);c.rows.length>0&&r.push({tableName:a.referencingTable,columnName:a.referencingColumn,constraintName:a.constraintName,records:c.rows})}return r}async function zr(t,e){let r=await f(e).query(`SELECT COUNT(*) as count FROM "${t}"`);return Number.parseInt(r.rows[0]?.count??"0",10)}async function Eo(t){let{tableName:e,db:o,cascade:r}=t,n=f(o),a=`
229
229
  SELECT EXISTS (
230
230
  SELECT 1 FROM information_schema.tables
231
231
  WHERE table_name = $1 AND table_schema = 'public'
232
232
  ) as exists;
233
- `,{rows:i}=await a.query(n,[e]);if(!i[0]?.exists)throw new Ae(404,{message:`Table "${e}" does not exist`});let c=await zr(e,o);if(!r){let s=await So(e,o);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{let u=`DROP TABLE "${e}" ${r?"CASCADE":"RESTRICT"}`;return await a.query(u),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(s){if(s.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await So(e,o)};throw s instanceof Ae?s:new Ae(500,{message:`Failed to delete table "${e}"`})}}var _o=m(()=>{"use strict";w()});import{HTTPException as Kr}from"hono/http-exception";async function Ro({tableName:t,db:e}){let o=f(e),{rows:r}=await o.query(`SELECT * FROM "${t}"`);if(!r||r.length===0)throw new Kr(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(r[0]),rows:r}}var wo=m(()=>{"use strict";w()});import{HTTPException as Wr}from"hono/http-exception";async function Do(t){let e=f(t),o=`
234
- SELECT
235
- t.table_name as "tableName",
236
- CASE
237
- WHEN s.n_live_tup IS NULL OR s.n_live_tup = 0
238
- THEN (SELECT COUNT(*) FROM information_schema.tables
239
- WHERE table_schema = 'public'
240
- AND table_name = t.table_name)
241
- ELSE s.n_live_tup
242
- END::integer as "rowCount"
243
- FROM information_schema.tables t
244
- LEFT JOIN pg_stat_user_tables s ON t.table_name = s.relname
245
- WHERE t.table_schema = 'public'
246
- AND t.table_type = 'BASE TABLE'
247
- ORDER BY t.table_name;
248
- `,{rows:r}=await e.query(o);if(!r[0])throw new Wr(500,{message:"No tables returned from database"});return r}var Co=m(()=>{"use strict";w()});import{HTTPException as Br}from"hono/http-exception";async function xo({tableName:t,db:e}){let o=f(e),r=`
233
+ `,{rows:i}=await n.query(a,[e]);if(!i[0]?.exists)throw new Ae(404,{message:`Table "${e}" does not exist`});let c=await zr(e,o);if(!r){let s=await So(e,o);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{let u=`DROP TABLE "${e}" ${r?"CASCADE":"RESTRICT"}`;return await n.query(u),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(s){if(s.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await So(e,o)};throw s instanceof Ae?s:new Ae(500,{message:`Failed to delete table "${e}"`})}}var Ro=m(()=>{"use strict";_()});import{HTTPException as Kr}from"hono/http-exception";async function wo({tableName:t,db:e}){let o=f(e),{rows:r}=await o.query(`SELECT * FROM "${t}"`);if(!r||r.length===0)throw new Kr(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(r[0]),rows:r}}var _o=m(()=>{"use strict";_()});import{HTTPException as Wr}from"hono/http-exception";async function Do(t){let e=f(t),o=`
234
+ SELECT table_name as "tableName"
235
+ FROM information_schema.tables
236
+ WHERE table_schema = 'public'
237
+ AND table_type = 'BASE TABLE'
238
+ ORDER BY table_name;
239
+ `,{rows:r}=await e.query(o);if(!r[0])throw new Wr(500,{message:"No tables returned from database"});return await Promise.all(r.map(async a=>{let i=`SELECT COUNT(*)::integer as count FROM "${a.tableName}"`,{rows:c}=await e.query(i);return{tableName:a.tableName,rowCount:c[0]?.count??0}}))}var Co=m(()=>{"use strict";_()});import{HTTPException as Br}from"hono/http-exception";async function xo({tableName:t,db:e}){let o=f(e),r=`
249
240
  SELECT EXISTS (
250
241
  SELECT 1 FROM information_schema.tables
251
242
  WHERE table_schema = 'public' AND table_name = $1
252
243
  ) as exists
253
- `,{rows:a}=await o.query(r,[t]);if(!a[0]?.exists)throw new Br(404,{message:`Table "${t}" does not exist`});let n=`
244
+ `,{rows:n}=await o.query(r,[t]);if(!n[0]?.exists)throw new Br(404,{message:`Table "${t}" does not exist`});let a=`
254
245
  SELECT
255
246
  column_name,
256
247
  data_type,
@@ -263,7 +254,7 @@ ORDER BY t.table_name;
263
254
  FROM information_schema.columns
264
255
  WHERE table_schema = 'public' AND table_name = $1
265
256
  ORDER BY ordinal_position
266
- `,{rows:i}=await o.query(n,[t]),c=`
257
+ `,{rows:i}=await o.query(a,[t]),c=`
267
258
  SELECT
268
259
  tc.constraint_name,
269
260
  tc.constraint_type,
@@ -289,11 +280,11 @@ ORDER BY t.table_name;
289
280
  FROM information_schema.table_constraints
290
281
  WHERE table_schema = 'public' AND table_name = $1 AND constraint_type = 'PRIMARY KEY'
291
282
  )
292
- `,{rows:l}=await o.query(u,[t]),p=[];p.push(`create table public.${t} (`);let y=[];for(let h of i){let R=` ${h.column_name} ${Vr(h)}`;h.is_nullable==="NO"&&(R+=" not null"),h.column_default!==null&&(R+=` default ${h.column_default}`),y.push(R)}let E=new Map;for(let h of s){let R=E.get(h.constraint_name)||[];R.push(h),E.set(h.constraint_name,R)}let d=[];for(let[h,R]of E){let D=R[0],P=R.map(H=>H.column_name).join(", ");if(D.constraint_type==="PRIMARY KEY")d.push(` constraint ${h} primary key (${P})`);else if(D.constraint_type==="FOREIGN KEY"){let H=D.foreign_table_name,O=D.foreign_column_name;d.push(` constraint ${h} foreign key (${P}) references ${H} (${O})`)}else D.constraint_type==="UNIQUE"&&d.push(` constraint ${h} unique (${P})`)}let g=[...y,...d];p.push(g.join(`,
283
+ `,{rows:l}=await o.query(u,[t]),p=[];p.push(`create table public.${t} (`);let y=[];for(let h of i){let w=` ${h.column_name} ${Vr(h)}`;h.is_nullable==="NO"&&(w+=" not null"),h.column_default!==null&&(w+=` default ${h.column_default}`),y.push(w)}let E=new Map;for(let h of s){let w=E.get(h.constraint_name)||[];w.push(h),E.set(h.constraint_name,w)}let d=[];for(let[h,w]of E){let D=w[0],P=w.map(H=>H.column_name).join(", ");if(D.constraint_type==="PRIMARY KEY")d.push(` constraint ${h} primary key (${P})`);else if(D.constraint_type==="FOREIGN KEY"){let H=D.foreign_table_name,O=D.foreign_column_name;d.push(` constraint ${h} foreign key (${P}) references ${H} (${O})`)}else D.constraint_type==="UNIQUE"&&d.push(` constraint ${h} unique (${P})`)}let g=[...y,...d];p.push(g.join(`,
293
284
  `)),p.push(") tablespace pg_default;");for(let h of l)Array.from(E.values()).some(D=>D[0].constraint_type==="UNIQUE"&&D[0].constraint_name===h.indexname)||(p.push(""),p.push(`${h.indexdef};`));return p.join(`
294
- `)}function Vr(t){let{data_type:e,udt_name:o,character_maximum_length:r,numeric_precision:a,numeric_scale:n}=t;return e==="USER-DEFINED"?o:e==="ARRAY"?`${o.replace(/^_/,"")}[]`:(e==="character varying"||e==="varchar")&&r?`varchar(${r})`:e==="character"&&r?`char(${r})`:e==="numeric"&&a!==null?n!==null&&n>0?`numeric(${a}, ${n})`:`numeric(${a})`:e==="timestamp with time zone"?"timestamp with time zone":e==="timestamp without time zone"?"timestamp":{"character varying":"varchar",character:"char","double precision":"float8",integer:"integer",bigint:"bigint",smallint:"smallint",boolean:"boolean",text:"text",uuid:"uuid",json:"json",jsonb:"jsonb",date:"date",time:"time",bytea:"bytea"}[e]||e}var No=m(()=>{"use strict";w()});function vo(t){if(t.length===0)return{clause:"",values:[]};let e=[],o=[];for(let r of t){let a=o.length+1,n=`"${r.columnName}"`;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${r.operator} $${a}`),o.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = $${a}`),o.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != $${a}`),o.push(r.value));break;case"like":e.push(`${n}::text LIKE $${a}`),o.push(r.value);break;case"not like":e.push(`${n}::text NOT LIKE $${a}`),o.push(r.value);break;case"ilike":e.push(`${n}::text ILIKE $${a}`),o.push(r.value);break;case"not ilike":e.push(`${n}::text NOT ILIKE $${a}`),o.push(r.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:o}}function Ao(t,e){return Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(r=>`"${r.columnName}" ${r.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY "${t}" ${e?.toUpperCase()||"ASC"}`:""}function $o(t,e,o,r){let{values:a,sortColumns:n}=t,i=[],c=[],l=o==="asc"===(e==="asc");if(n.length>0){let p=n.map(d=>`"${d}"`).join(", "),y=n.map((d,g)=>`$${r+g}`).join(", "),E=l?">":"<";i.push(`(${p}) ${E} (${y})`);for(let d of n)c.push(a[d])}return{clause:i.length>0?`(${i.join(" AND ")})`:"",values:c}}var Po=m(()=>{"use strict"});var pe,Qr,Yr,qo,Io=m(()=>{"use strict";w();Po();pe=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),Qr=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},Yr=async(t,e)=>{let o=`"${e}"`;return(await t.query(`SELECT a.attname as column_name
285
+ `)}function Vr(t){let{data_type:e,udt_name:o,character_maximum_length:r,numeric_precision:n,numeric_scale:a}=t;return e==="USER-DEFINED"?o:e==="ARRAY"?`${o.replace(/^_/,"")}[]`:(e==="character varying"||e==="varchar")&&r?`varchar(${r})`:e==="character"&&r?`char(${r})`:e==="numeric"&&n!==null?a!==null&&a>0?`numeric(${n}, ${a})`:`numeric(${n})`:e==="timestamp with time zone"?"timestamp with time zone":e==="timestamp without time zone"?"timestamp":{"character varying":"varchar",character:"char","double precision":"float8",integer:"integer",bigint:"bigint",smallint:"smallint",boolean:"boolean",text:"text",uuid:"uuid",json:"json",jsonb:"jsonb",date:"date",time:"time",bytea:"bytea"}[e]||e}var No=m(()=>{"use strict";_()});function vo(t){if(t.length===0)return{clause:"",values:[]};let e=[],o=[];for(let r of t){let n=o.length+1,a=`"${r.columnName}"`;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${r.operator} $${n}`),o.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = $${n}`),o.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != $${n}`),o.push(r.value));break;case"like":e.push(`${a}::text LIKE $${n}`),o.push(r.value);break;case"not like":e.push(`${a}::text NOT LIKE $${n}`),o.push(r.value);break;case"ilike":e.push(`${a}::text ILIKE $${n}`),o.push(r.value);break;case"not ilike":e.push(`${a}::text NOT ILIKE $${n}`),o.push(r.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:o}}function Ao(t,e){return Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(r=>`"${r.columnName}" ${r.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY "${t}" ${e?.toUpperCase()||"ASC"}`:""}function $o(t,e,o,r){let{values:n,sortColumns:a}=t,i=[],c=[],l=o==="asc"===(e==="asc");if(a.length>0){let p=a.map(d=>`"${d}"`).join(", "),y=a.map((d,g)=>`$${r+g}`).join(", "),E=l?">":"<";i.push(`(${p}) ${E} (${y})`);for(let d of a)c.push(n[d])}return{clause:i.length>0?`(${i.join(" AND ")})`:"",values:c}}var Po=m(()=>{"use strict"});var pe,Qr,Yr,qo,Io=m(()=>{"use strict";_();Po();pe=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),Qr=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},Yr=async(t,e)=>{let o=`"${e}"`;return(await t.query(`SELECT a.attname as column_name
295
286
  FROM pg_index i
296
287
  JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
297
288
  WHERE i.indrelid = $1::regclass AND i.indisprimary
298
- ORDER BY array_position(i.indkey, a.attnum)`,[o])).rows.map(a=>a.column_name)},qo=async({tableName:t,cursor:e="",limit:o=50,direction:r="asc",sort:a=[],order:n="asc",filters:i=[],db:c})=>{let s=f(c),u=await Yr(s,t),l=[],p=n;Array.isArray(a)&&a.length>0?(l=a.map(N=>N.columnName),p=a[0].direction):typeof a=="string"&&a&&(l=[a]);let y=[...l,...u.filter(N=>!l.includes(N))];y.length===0&&y.push("ctid");let{clause:E,values:d}=vo(i),g="",h=[];if(e){let N=Qr(e);if(N){let L=$o(N,r,p,d.length+1);g=L.clause,h=L.values}}let R="";E&&g?R=`WHERE ${E.replace(/^WHERE\s+/i,"")} AND ${g}`:E?R=E:g&&(R=`WHERE ${g}`);let D=Ao((Array.isArray(a),a),n),P=D;r==="desc"?D?P=D.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):P=`ORDER BY ${y.map(L=>`"${L}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!D&&y.length>0&&(P=`ORDER BY ${y.map(L=>`"${L}" ${p.toUpperCase()}`).join(", ")}`);let H=await s.query(`SELECT COUNT(*) as total FROM "${t}" ${E}`,d),O=Number(H.rows[0].total),J=d.length+h.length+1,z=await s.query(`SELECT * FROM "${t}" ${R} ${P} LIMIT $${J}`,[...d,...h,o+1]),v=z.fields&&z.fields.length>0?z.rows.filter(N=>Object.keys(N).length>0):z.rows,k=v.length>o;k&&(v=v.slice(0,o)),r==="desc"&&(v=v.reverse());let X=null,ye=null;if(v.length>0){let N=v[0],L=v[v.length-1],te=Mo=>({values:Object.fromEntries(y.map(Pe=>[Pe,Mo[Pe]])),sortColumns:y});r==="asc"?(k&&(X=pe(te(L))),e&&(ye=pe(te(N)))):(e&&(X=pe(te(L))),k&&(ye=pe(te(N))))}return{data:v,meta:{limit:o,total:O,hasNextPage:r==="asc"?k:!!e,hasPreviousPage:r==="asc"?!!e:k,nextCursor:X,prevCursor:ye}}}});import{utils as ee,write as Gr}from"xlsx";function Oo({cols:t,rows:e,format:o,tableName:r}){switch(o){case"json":{let a=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(a,"utf-8"))}case"csv":{let a=[t,...e?.map(c=>t?.map(s=>c[s]))??[]],n=ee.aoa_to_sheet(a),i=ee.sheet_to_csv(n);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let a=[t,...e?.map(s=>t?.map(u=>s[u]))??[]],n=ee.aoa_to_sheet(a),i=ee.book_new();ee.book_append_sheet(i,n,r.slice(0,31));let c=Gr(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var Lo=m(()=>{"use strict"});import{zValidator as x}from"@hono/zod-validator";import{Hono as Jr}from"hono";var ko,jo=m(()=>{"use strict";F();yo();To();_o();wo();xe();Co();No();Io();Lo();ko=new Jr().basePath("/tables").get("/",x("query",S),async t=>{let{db:e}=t.req.valid("query"),o=await Do(e);return t.json({data:o},200)}).post("/",x("query",S),x("json",lt),async t=>{let{db:e}=t.req.valid("query"),o=t.req.valid("json");return await bo({tableData:o,db:e}),t.json({data:`Table ${o.tableName} created successfully`},200)}).delete("/:tableName",x("query",ht),x("param",V),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:r}=t.req.valid("param"),a=await Eo({tableName:r,db:e,cascade:o});return t.json({data:a},200)}).delete("/:tableName/columns/:columnName",x("query",ft),x("param",se),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:r,columnName:a}=t.req.valid("param"),{deletedCount:n}=await go({tableName:r,columnName:a,cascade:o,db:e});return t.json({data:`Column "${a}" deleted successfully from table "${r}" with ${n} rows deleted`},200)}).get("/:tableName/columns",x("query",S),x("param",V),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),r=await le({tableName:o,db:e});return t.json({data:r},200)}).get("/:tableName/schema",x("query",S),x("param",V),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),r=await xo({tableName:o,db:e});return t.json({data:{schema:r}},200)}).get("/:tableName/data",x("param",V),x("query",Dt),async t=>{let{tableName:e}=t.req.valid("param"),{cursor:o,limit:r,direction:a,sort:n,order:i,filters:c,db:s}=t.req.valid("query"),u=await qo({tableName:e,cursor:o,limit:r,direction:a,sort:n,order:i,filters:c,db:s});return t.json({data:u},200)}).get("/:tableName/export",x("param",V),x("query",_t),async t=>{let{tableName:e}=t.req.valid("param"),{db:o,format:r}=t.req.valid("query"),{cols:a,rows:n}=await Ro({tableName:e,db:o}),i=Oo({cols:a,rows:n,format:r,tableName:e}),c;switch(r){case"csv":c="text/csv";break;case"xlsx":c="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":c="application/json";break}return new Response(i,{headers:{"Content-Type":c??"","Content-Disposition":`attachment; filename="${e}_export.${r}"`}})})});var Uo={};Ko(Uo,{createServer:()=>aa});import be from"path";import{fileURLToPath as Xr}from"url";import{serveStatic as de}from"@hono/node-server/serve-static";import{zValidator as Zr}from"@hono/zod-validator";import{Hono as ea}from"hono";import{cors as ta}from"hono/cors";import{logger as oa}from"hono/logger";import{prettyJSON as ra}from"hono/pretty-json";var fe,aa,Fo=m(()=>{"use strict";F();It();zt();Jt();oo();fo();jo();fe=()=>{if(process.env.NODE_ENV==="development")return be.resolve(process.cwd(),"../core/dist");let t=be.dirname(Xr(import.meta.url));return be.resolve(t,"./core-dist")},aa=()=>({app:new ea({strict:!1}).use("/*",ta()).use(ra({space:2})).use(process.env.NODE_ENV==="development"?oa():(e,o)=>o()).use("/favicon.ico",de({path:be.resolve(fe(),"favicon.ico")})).use("*",async(e,o)=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),await o()}).onError(Pt).route("/",Gt).use("/assets/*",de({root:fe()})).use("/image.png",de({root:fe()})).use("/:dbType/*",Zr("param",tt,qt)).use("/:dbType/*",async(e,o)=>{let r=e.req.param("dbType");e.set("dbType",r),await o()}).route("/:dbType",ko).route("/:dbType",po).route("/:dbType",to).route("/:dbType",Mt).use("/*",de({root:fe()}))})});oe();import{intro as na,outro as sa}from"@clack/prompts";import{serve as ia}from"@hono/node-server";import ca from"open";import $e from"picocolors";import{program as je}from"commander";var Ue=()=>(je.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),je.opts());import{readFile as Wo}from"fs/promises";import{resolve as Bo}from"path";import{cancel as re,isCancel as ge,note as Fe,select as Vo,spinner as Qo,text as He}from"@clack/prompts";import{parse as Yo}from"dotenv";import Te from"picocolors";var Me=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let r=Qo();r.start("Looking for database connection..."),t?Fe(Te.red(`${o} not found in .env or process.env`)):Fe(Te.red(`No .env file found and ${o} not set in process.env`));let a=await Vo({message:`How do you want to provide ${o}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((ge(a)||a==="cancel")&&(re("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){r.start("Waiting for path...");let i=await He({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s.trim())return"Path is required"}});ge(i)&&(re("Cancelled."),process.exit(0)),r.stop("Trying custom .env...");let c=Bo(i);try{let s=await Wo(c,"utf-8"),u=Yo(s);if(u[o])return u[o];throw new Error(`${o} still missing in custom file`)}catch(s){let u=s;re(`Cannot read or parse file: ${Te.dim(u.message)}`),process.exit(1)}}r.stop("Manual input...");let n=await He({message:`Paste your ${o}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(i){if(!i.trim())return"Connection string is required!";try{new URL(i);return}catch{return"Must be a valid URL format"}}});return ge(n)&&(re("Cancelled."),process.exit(0)),n.trim()};import{access as Go,readFile as Jo}from"fs/promises";import{dirname as Xo,resolve as Se}from"path";import{parse as Zo}from"dotenv";var er=async t=>{let e=Se(t);for(;;){let o=Se(e,".env");try{return await Go(o),o}catch{}let r=Xo(e);if(r===e)return null;e=r}},K=async t=>{let e;if(t?e=Se(t):e=await er(process.cwd()),!e)return null;try{let o=await Jo(e,"utf-8");return Zo(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};he();import{intro as tr,outro as or}from"@clack/prompts";import ze from"picocolors";var Ke=()=>{tr(ze.inverse(" db-studio ")),or(ze.green(`For more information, visit: ${Le.SITE_DOCS_LINK}`))};oe();import{intro as rr,note as ar,outro as We}from"@clack/prompts";import ae from"picocolors";var Be=async(t,e,o)=>{rr(ae.inverse(" db-studio "));let r=o||M.VAR_NAME,a=null;if(e)a=e;else{let n=t?await K(t):await K();n?.[r]?a=n[r]:process.env[r]&&(a=process.env[r]??null)}a?We(ae.green(`\u2713 Database connection configured (using ${r})`)):(ar(ae.red(`\u2717 ${r} not found`),"Status"),We(ae.yellow("\u26A0 No database connection configured")))};import{intro as sr,outro as ir}from"@clack/prompts";import Qe from"picocolors";var Ve={name:"db-studio",type:"module",version:"1.3.27",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",prepack:"cd ../core && bun run build && cd ../server && bun run build",start:"node dist/index.js",check:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^1.19.7","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",dotenv:"^17.3.1",hono:"^4.10.4",open:"^11.0.0",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@types/node":"^20.11.17","@types/pg":"^8.16.0","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^5.8.3",vitest:"^4.0.17"}};var Ye=()=>{sr(Qe.inverse(" db-studio ")),ir(Qe.green(`\u{1F680} db-studio v${Ve.version}`))};var la=async()=>{let{env:t,port:e,databaseUrl:o,varName:r,status:a,help:n,version:i}=Ue();n&&(Ke(),process.exit(0)),i&&(Ye(),process.exit(0)),a&&(await Be(t,o,r),process.exit(0)),na($e.inverse(" db-studio "));let c=e?parseInt(e,10):M.PORT,s=r||M.VAR_NAME,u=t?await K(t):await K(),l=o||await Me(u,s);process.env.DATABASE_URL=l;let{createServer:p}=await Promise.resolve().then(()=>(Fo(),Uo)),{app:y}=p();ia({fetch:y.fetch,port:c}),sa($e.green(`Server running at ${$e.cyan(`http://localhost:${c}`)}`)),process.env.NODE_ENV&&process.env.NODE_ENV!=="development"&&await ca(`http://localhost:${c}`)};la().catch(t=>{process.exit(1)});export{la as main};
289
+ ORDER BY array_position(i.indkey, a.attnum)`,[o])).rows.map(n=>n.column_name)},qo=async({tableName:t,cursor:e="",limit:o=50,direction:r="asc",sort:n=[],order:a="asc",filters:i=[],db:c})=>{let s=f(c),u=await Yr(s,t),l=[],p=a;Array.isArray(n)&&n.length>0?(l=n.map(N=>N.columnName),p=n[0].direction):typeof n=="string"&&n&&(l=[n]);let y=[...l,...u.filter(N=>!l.includes(N))];y.length===0&&y.push("ctid");let{clause:E,values:d}=vo(i),g="",h=[];if(e){let N=Qr(e);if(N){let L=$o(N,r,p,d.length+1);g=L.clause,h=L.values}}let w="";E&&g?w=`WHERE ${E.replace(/^WHERE\s+/i,"")} AND ${g}`:E?w=E:g&&(w=`WHERE ${g}`);let D=Ao((Array.isArray(n),n),a),P=D;r==="desc"?D?P=D.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):P=`ORDER BY ${y.map(L=>`"${L}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!D&&y.length>0&&(P=`ORDER BY ${y.map(L=>`"${L}" ${p.toUpperCase()}`).join(", ")}`);let H=await s.query(`SELECT COUNT(*) as total FROM "${t}" ${E}`,d),O=Number(H.rows[0].total),J=d.length+h.length+1,z=await s.query(`SELECT * FROM "${t}" ${w} ${P} LIMIT $${J}`,[...d,...h,o+1]),v=z.fields&&z.fields.length>0?z.rows.filter(N=>Object.keys(N).length>0):z.rows,k=v.length>o;k&&(v=v.slice(0,o)),r==="desc"&&(v=v.reverse());let X=null,ye=null;if(v.length>0){let N=v[0],L=v[v.length-1],te=Mo=>({values:Object.fromEntries(y.map(Pe=>[Pe,Mo[Pe]])),sortColumns:y});r==="asc"?(k&&(X=pe(te(L))),e&&(ye=pe(te(N)))):(e&&(X=pe(te(L))),k&&(ye=pe(te(N))))}return{data:v,meta:{limit:o,total:O,hasNextPage:r==="asc"?k:!!e,hasPreviousPage:r==="asc"?!!e:k,nextCursor:X,prevCursor:ye}}}});import{utils as ee,write as Gr}from"xlsx";function Oo({cols:t,rows:e,format:o,tableName:r}){switch(o){case"json":{let n=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(n,"utf-8"))}case"csv":{let n=[t,...e?.map(c=>t?.map(s=>c[s]))??[]],a=ee.aoa_to_sheet(n),i=ee.sheet_to_csv(a);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let n=[t,...e?.map(s=>t?.map(u=>s[u]))??[]],a=ee.aoa_to_sheet(n),i=ee.book_new();ee.book_append_sheet(i,a,r.slice(0,31));let c=Gr(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var Lo=m(()=>{"use strict"});import{zValidator as x}from"@hono/zod-validator";import{Hono as Jr}from"hono";var ko,jo=m(()=>{"use strict";F();yo();To();Ro();_o();xe();Co();No();Io();Lo();ko=new Jr().basePath("/tables").get("/",x("query",S),async t=>{let{db:e}=t.req.valid("query"),o=await Do(e);return t.json({data:o},200)}).post("/",x("query",S),x("json",lt),async t=>{let{db:e}=t.req.valid("query"),o=t.req.valid("json");return await bo({tableData:o,db:e}),t.json({data:`Table ${o.tableName} created successfully`},200)}).delete("/:tableName",x("query",ht),x("param",V),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:r}=t.req.valid("param"),n=await Eo({tableName:r,db:e,cascade:o});return t.json({data:n},200)}).delete("/:tableName/columns/:columnName",x("query",ft),x("param",se),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:r,columnName:n}=t.req.valid("param"),{deletedCount:a}=await go({tableName:r,columnName:n,cascade:o,db:e});return t.json({data:`Column "${n}" deleted successfully from table "${r}" with ${a} rows deleted`},200)}).get("/:tableName/columns",x("query",S),x("param",V),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),r=await le({tableName:o,db:e});return t.json({data:r},200)}).get("/:tableName/schema",x("query",S),x("param",V),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),r=await xo({tableName:o,db:e});return t.json({data:{schema:r}},200)}).get("/:tableName/data",x("param",V),x("query",Dt),async t=>{let{tableName:e}=t.req.valid("param"),{cursor:o,limit:r,direction:n,sort:a,order:i,filters:c,db:s}=t.req.valid("query"),u=await qo({tableName:e,cursor:o,limit:r,direction:n,sort:a,order:i,filters:c,db:s});return t.json({data:u},200)}).get("/:tableName/export",x("param",V),x("query",Rt),async t=>{let{tableName:e}=t.req.valid("param"),{db:o,format:r}=t.req.valid("query"),{cols:n,rows:a}=await wo({tableName:e,db:o}),i=Oo({cols:n,rows:a,format:r,tableName:e}),c;switch(r){case"csv":c="text/csv";break;case"xlsx":c="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":c="application/json";break}return new Response(i,{headers:{"Content-Type":c??"","Content-Disposition":`attachment; filename="${e}_export.${r}"`}})})});var Uo={};Ko(Uo,{createServer:()=>aa});import be from"path";import{fileURLToPath as Xr}from"url";import{serveStatic as de}from"@hono/node-server/serve-static";import{zValidator as Zr}from"@hono/zod-validator";import{Hono as ea}from"hono";import{cors as ta}from"hono/cors";import{logger as oa}from"hono/logger";import{prettyJSON as ra}from"hono/pretty-json";var fe,aa,Fo=m(()=>{"use strict";F();It();zt();Jt();oo();fo();jo();fe=()=>{if(process.env.NODE_ENV==="development")return be.resolve(process.cwd(),"../core/dist");let t=be.dirname(Xr(import.meta.url));return be.resolve(t,"./core-dist")},aa=()=>({app:new ea({strict:!1}).use("/*",ta()).use(ra({space:2})).use(process.env.NODE_ENV==="development"?oa():(e,o)=>o()).use("/favicon.ico",de({path:be.resolve(fe(),"favicon.ico")})).use("*",async(e,o)=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),await o()}).onError(Pt).route("/",Gt).use("/assets/*",de({root:fe()})).use("/image.png",de({root:fe()})).use("/:dbType/*",Zr("param",tt,qt)).use("/:dbType/*",async(e,o)=>{let r=e.req.param("dbType");e.set("dbType",r),await o()}).route("/:dbType",ko).route("/:dbType",po).route("/:dbType",to).route("/:dbType",Mt).use("/*",de({root:fe()}))})});oe();import{intro as na,outro as sa}from"@clack/prompts";import{serve as ia}from"@hono/node-server";import ca from"open";import $e from"picocolors";import{program as je}from"commander";var Ue=()=>(je.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),je.opts());import{readFile as Wo}from"fs/promises";import{resolve as Bo}from"path";import{cancel as re,isCancel as ge,note as Fe,select as Vo,spinner as Qo,text as He}from"@clack/prompts";import{parse as Yo}from"dotenv";import Te from"picocolors";var Me=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let r=Qo();r.start("Looking for database connection..."),t?Fe(Te.red(`${o} not found in .env or process.env`)):Fe(Te.red(`No .env file found and ${o} not set in process.env`));let n=await Vo({message:`How do you want to provide ${o}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((ge(n)||n==="cancel")&&(re("No database connection provided. Exiting..."),process.exit(0)),n==="other-env"){r.start("Waiting for path...");let i=await He({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s.trim())return"Path is required"}});ge(i)&&(re("Cancelled."),process.exit(0)),r.stop("Trying custom .env...");let c=Bo(i);try{let s=await Wo(c,"utf-8"),u=Yo(s);if(u[o])return u[o];throw new Error(`${o} still missing in custom file`)}catch(s){let u=s;re(`Cannot read or parse file: ${Te.dim(u.message)}`),process.exit(1)}}r.stop("Manual input...");let a=await He({message:`Paste your ${o}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(i){if(!i.trim())return"Connection string is required!";try{new URL(i);return}catch{return"Must be a valid URL format"}}});return ge(a)&&(re("Cancelled."),process.exit(0)),a.trim()};import{access as Go,readFile as Jo}from"fs/promises";import{dirname as Xo,resolve as Se}from"path";import{parse as Zo}from"dotenv";var er=async t=>{let e=Se(t);for(;;){let o=Se(e,".env");try{return await Go(o),o}catch{}let r=Xo(e);if(r===e)return null;e=r}},K=async t=>{let e;if(t?e=Se(t):e=await er(process.cwd()),!e)return null;try{let o=await Jo(e,"utf-8");return Zo(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};he();import{intro as tr,outro as or}from"@clack/prompts";import ze from"picocolors";var Ke=()=>{tr(ze.inverse(" db-studio ")),or(ze.green(`For more information, visit: ${Le.SITE_DOCS_LINK}`))};oe();import{intro as rr,note as ar,outro as We}from"@clack/prompts";import ae from"picocolors";var Be=async(t,e,o)=>{rr(ae.inverse(" db-studio "));let r=o||M.VAR_NAME,n=null;if(e)n=e;else{let a=t?await K(t):await K();a?.[r]?n=a[r]:process.env[r]&&(n=process.env[r]??null)}n?We(ae.green(`\u2713 Database connection configured (using ${r})`)):(ar(ae.red(`\u2717 ${r} not found`),"Status"),We(ae.yellow("\u26A0 No database connection configured")))};import{intro as sr,outro as ir}from"@clack/prompts";import Qe from"picocolors";var Ve={name:"db-studio",type:"module",version:"1.3.33",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",prepack:"cd ../core && bun run build && cd ../server && bun run build",start:"node dist/index.js",check:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^1.19.7","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",dotenv:"^17.3.1",hono:"^4.10.4",open:"^11.0.0",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@types/node":"^20.11.17","@types/pg":"^8.16.0","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^5.8.3",vitest:"^4.0.17"}};var Ye=()=>{sr(Qe.inverse(" db-studio ")),ir(Qe.green(`\u{1F680} db-studio v${Ve.version}`))};var la=async()=>{let{env:t,port:e,databaseUrl:o,varName:r,status:n,help:a,version:i}=Ue();a&&(Ke(),process.exit(0)),i&&(Ye(),process.exit(0)),n&&(await Be(t,o,r),process.exit(0)),na($e.inverse(" db-studio "));let c=e?parseInt(e,10):M.PORT,s=r||M.VAR_NAME,u=t?await K(t):await K(),l=o||await Me(u,s);process.env.DATABASE_URL=l;let{createServer:p}=await Promise.resolve().then(()=>(Fo(),Uo)),{app:y}=p();ia({fetch:y.fetch,port:c}),sa($e.green(`Server running at ${$e.cyan(`http://localhost:${c}`)}`)),process.env.NODE_ENV&&process.env.NODE_ENV!=="development"&&await ca(`http://localhost:${c}`)};la().catch(t=>{process.exit(1)});export{la as main};
299
290
  //# sourceMappingURL=index.js.map