db-studio 1.5.0 → 1.6.2

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 (41) hide show
  1. package/README.md +44 -0
  2. package/dist/core-dist/assets/_pathlessLayout-C6DihnsN.js +1 -0
  3. package/dist/core-dist/assets/_queryId-Dp0aC9mO.js +1 -0
  4. package/dist/core-dist/assets/_table-D-Om_ZWr.js +8 -0
  5. package/dist/core-dist/assets/_table-oMebxIBG.js +39 -0
  6. package/dist/core-dist/assets/{cdoe-editor-CsnVz62S.js → cdoe-editor-SdZQ1WiR.js} +1 -1
  7. package/dist/core-dist/assets/{dialog-C7B5v45l.js → dialog-jogVSiaL.js} +1 -1
  8. package/dist/core-dist/assets/icons-B2mES2Qq.js +1 -0
  9. package/dist/core-dist/assets/{index-BKJZ_DtH.js → index-C7KJNEv-.js} +1 -1
  10. package/dist/core-dist/assets/index-C9jsi0UO.js +1 -0
  11. package/dist/core-dist/assets/index-CJ0NUCyi.js +58 -0
  12. package/dist/core-dist/assets/index-CTFnCamQ.js +1 -0
  13. package/dist/core-dist/assets/index-CVuaUgmF.js +1 -0
  14. package/dist/core-dist/assets/index-DQOVykiS.js +1 -0
  15. package/dist/core-dist/assets/{indexes-chzZ9aUc.js → indexes-DESnDRwn.js} +1 -1
  16. package/dist/core-dist/assets/logs-DKdQRaOz.js +1 -0
  17. package/dist/core-dist/assets/{queries.store-kf8rwRRK.js → queries.store-Cfzf5198.js} +1 -1
  18. package/dist/core-dist/assets/{radix-ui-DdSZPsGt.js → radix-ui-c-7GrHMM.js} +1 -1
  19. package/dist/core-dist/assets/{react-dom-CFlhbIUR.js → react-dom-BcUZDRtY.js} +1 -1
  20. package/dist/core-dist/assets/runner-tab-C3hNjCPD.js +3 -0
  21. package/dist/core-dist/assets/{scroll-area-CGOQphQG.js → scroll-area-BqJhlKZJ.js} +1 -1
  22. package/dist/core-dist/assets/{tanstack-VIQ5XZ7a.js → tanstack-BaWakKkc.js} +1 -1
  23. package/dist/core-dist/assets/{tooltip-eBZ2rltH.js → tooltip-BoaJ5LJp.js} +1 -1
  24. package/dist/core-dist/assets/{use-delete-column-CqTA9IkF.js → use-delete-column-Bg30Zigo.js} +1 -1
  25. package/dist/core-dist/assets/{visualizer-CW4V7-VL.js → visualizer-CQGMZpWZ.js} +1 -1
  26. package/dist/core-dist/index.html +5 -5
  27. package/dist/index.js +398 -182
  28. package/dist/index.js.map +1 -1
  29. package/package.json +16 -14
  30. package/dist/core-dist/assets/_pathlessLayout-BSFx2CpL.js +0 -1
  31. package/dist/core-dist/assets/_queryId-CgXpSMOd.js +0 -1
  32. package/dist/core-dist/assets/_table-7G_H-EMC.js +0 -8
  33. package/dist/core-dist/assets/_table-BD8P3EpN.js +0 -39
  34. package/dist/core-dist/assets/icons-BTbp9JOE.js +0 -1
  35. package/dist/core-dist/assets/index-BbUfG55J.js +0 -1
  36. package/dist/core-dist/assets/index-C0XbK31u.js +0 -58
  37. package/dist/core-dist/assets/index-CywuOneB.js +0 -1
  38. package/dist/core-dist/assets/index-CzPkrj7Y.js +0 -1
  39. package/dist/core-dist/assets/index-DpF8uPY5.js +0 -1
  40. package/dist/core-dist/assets/logs-BC5WPG0r.js +0 -1
  41. package/dist/core-dist/assets/runner-tab-D2PzASo9.js +0 -3
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var fr=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var yr=(a,e)=>{for(var t in e)fr(a,t,{get:e[t],enumerable:!0})};var nt=d(()=>{"use strict"});var st=d(()=>{"use strict"});var it=d(()=>{"use strict"});var Z,lt=d(()=>{"use strict";Z={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 ct=d(()=>{"use strict"});var mt,Oe=d(()=>{"use strict";mt={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 ut=d(()=>{"use strict"});var ye=d(()=>{"use strict";nt();st();it();lt();ct();Oe();ut()});import{z as ae}from"zod";var C,$r,he,Fs,wt,G,B=d(()=>{"use strict";C=ae.object({db:ae.string("Database name is required")}),$r=["pg","mysql"],he=ae.enum($r,{message:"Invalid database type"}),Fs=C.extend({dbType:he}),wt=ae.object({dbType:he}),G=ae.object({tableName:ae.string("Table name is required")})});import{z as W}from"zod";var V,Ks,Nt=d(()=>{"use strict";B();V=W.object({columnName:W.string("Column name is required"),columnType:W.string("Column type is required"),defaultValue:W.string().optional(),isPrimaryKey:W.boolean().default(!1),isNullable:W.boolean().default(!1),isUnique:W.boolean().default(!1),isIdentity:W.boolean().default(!1),isArray:W.boolean().default(!1)}),Ks=W.object({db:C.shape.db,tableName:G.shape.tableName,columnName:V.shape.columnName,columnType:V.shape.columnType,defaultValue:V.shape.defaultValue,isPrimaryKey:V.shape.isPrimaryKey,isNullable:V.shape.isNullable,isUnique:V.shape.isUnique,isIdentity:V.shape.isIdentity,isArray:V.shape.isArray})});import{z as ce}from"zod";var At,Dt=d(()=>{"use strict";At=ce.object({tableName:ce.string("Table name is required"),data:ce.record(ce.string("Column name is required"),ce.any())})});import{z as j}from"zod";var _t,U,Gs,Js,ge=d(()=>{"use strict";B();_t=C.extend({cascade:j.string().optional().transform(a=>a==="true")}),U=j.object({tableName:j.string("Table name is required"),columnName:j.string("Column name is required")}),Gs=j.object({db:C.shape.db,tableName:U.shape.tableName,columnName:U.shape.columnName,cascade:j.boolean().optional()}),Js=j.object({message:j.string("Message is required"),tableName:j.string("Table name is required"),columnName:j.string("Column name is required"),deletedCount:j.number("Deleted count is required").default(0)})});import{z as me}from"zod";var ue,ai,xt=d(()=>{"use strict";B();ge();ue=me.object({columnType:me.string("Column type is required"),isNullable:me.boolean(),defaultValue:me.string().nullable().optional()}),ai=me.object({db:C.shape.db,tableName:U.shape.tableName,columnName:U.shape.columnName,columnType:ue.shape.columnType,isNullable:ue.shape.isNullable,defaultValue:ue.shape.defaultValue})});var Pt=d(()=>{"use strict"});import{z as oe}from"zod";var Lt,vt=d(()=>{"use strict";Lt=oe.object({tableName:oe.string().min(1,"Table name is required"),records:oe.array(oe.record(oe.string(),oe.any())).min(1,"At least one record is required")})});import{z as re}from"zod";var $t,qt=d(()=>{"use strict";B();$t=re.object({messages:re.array(re.object({role:re.enum(["user","assistant"]),content:re.string("Content is required")})),conversationId:re.string().optional(),db:C.shape.db})});var Ot=d(()=>{"use strict"});import{z as F}from"zod";var qr,Or,v,Mr,Ir,mi,Ue=d(()=>{"use strict";qr=["text","boolean","number","enum","json","date","array"],Or=F.enum(qr),v={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Mr=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],Ir=F.enum(Mr),mi=F.object({columnName:F.string(),dataType:Or,dataTypeLabel:Ir,isNullable:F.boolean(),columnDefault:F.string().nullable(),isPrimaryKey:F.boolean(),isForeignKey:F.boolean(),referencedTable:F.string().nullable(),referencedColumn:F.string().nullable(),enumValues:F.array(F.string()).nullable()})});function Mt(a){let e=a?.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(")?v.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"?v.number:e==="boolean"||e==="bool"?v.boolean:e==="json"||e==="jsonb"?v.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?v.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"?v.text:v.text}function It(a){if(!a)return y.text;let e=a.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?y.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?y.bigint:e==="smallint"||e==="int2"?y.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?y.numeric:e==="real"||e==="float4"?y.float:e==="double precision"||e==="float8"||e==="float"?y.double:e==="money"?y.money:e==="boolean"||e==="bool"?y.boolean:e==="text"?y.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?y.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?y.char:e==="json"?y.json:e==="jsonb"?y.jsonb:e==="xml"?y.xml:e==="uuid"?y.uuid:e==="date"?y.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?y.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?y.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?y.timestamptz:e==="interval"||e.startsWith("interval")?y.interval:e==="bytea"?y.bytea:e==="inet"?y.inet:e==="cidr"?y.cidr:e==="macaddr"?y.macaddr:e==="macaddr8"?y.macaddr8:e==="point"?y.point:e==="line"?y.line:e==="polygon"?y.polygon:e.startsWith("array")||e.includes("[]")?y.text:e.startsWith("user-defined")||e==="enum"?y.enum:y.text}function kt(a,e){let t=a?.toLowerCase().trim()||"",o=e?.toLowerCase().trim()||"";return t==="tinyint"&&o==="tinyint(1)"?v.boolean:t==="tinyint"||t==="smallint"||t==="mediumint"||t==="int"||t==="integer"||t==="bigint"||t==="decimal"||t==="numeric"||t==="float"||t==="double"||t==="real"||t==="bit"?v.number:t==="boolean"||t==="bool"?v.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?v.date:t==="json"?v.json:t==="enum"||t==="set"?v.enum:v.text}function Ut(a,e){if(!a)return y.text;let t=a.toLowerCase().trim(),o=e?.toLowerCase().trim()||"";return t==="tinyint"&&o==="tinyint(1)"?y.boolean:t==="tinyint"?y.tinyint:t==="smallint"?y.smallint:t==="mediumint"?y.mediumint:t==="int"||t==="integer"?y.int:t==="bigint"?y.bigint:t==="decimal"||t==="numeric"?y.numeric:t==="float"||t==="real"?y.float:t==="double"?y.double:t==="bit"?y.bit:t==="boolean"||t==="bool"?y.boolean:t==="char"?y.char:t==="varchar"?y.varchar:t==="tinytext"?y.tinytext:t==="text"?y.text:t==="mediumtext"?y.mediumtext:t==="longtext"?y.longtext:t==="binary"?y.binary:t==="varbinary"?y.varbinary:t==="tinyblob"?y.tinyblob:t==="blob"?y.blob:t==="mediumblob"?y.mediumblob:t==="longblob"?y.longblob:t==="json"?y.json:t==="date"?y.date:t==="time"?y.time:t==="datetime"?y.datetime:t==="timestamp"?y.timestamp:t==="year"?y.year:t==="enum"?y.enum:t==="set"?y.set:y.text}var y,Ft=d(()=>{"use strict";Ue();y={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as x}from"zod";var kr,Ht,Ur,Fr,Bt,jt=d(()=>{"use strict";kr=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Ht=x.enum(kr),Ur=x.object({columnName:x.string("Column name is required"),columnType:x.string("Column type is required"),defaultValue:x.string().optional(),isPrimaryKey:x.boolean().default(!1),isNullable:x.boolean().default(!1),isUnique:x.boolean().default(!1),isIdentity:x.boolean().default(!1),isArray:x.boolean().default(!1)}),Fr=x.object({columnName:x.string("Column name is required"),referencedTable:x.string("Referenced table is required"),referencedColumn:x.string("Referenced column is required"),onUpdate:Ht.default("NO ACTION"),onDelete:Ht.default("NO ACTION")}),Bt=x.object({tableName:x.string("Table name is required"),fields:x.array(Ur).min(1,"At least one field is required"),foreignKeys:x.array(Fr).optional()})});import{z as $}from"zod";var Hr,hi,Kt,Wt=d(()=>{"use strict";B();Hr=$.object({name:$.string("Name is required"),size:$.string("Size is required"),owner:$.string("Owner is required"),encoding:$.string("Encoding is required")}),hi=$.object({databases:$.array(Hr),dbType:he}),Kt=$.object({version:$.string("Version is required"),database:$.string("Database is required"),user:$.string("User is required"),host:$.string("Host is required").nullable(),port:$.number("Port is required").nullable(),active_connections:$.coerce.number("Active connections is required"),max_connections:$.coerce.number("Max connections is required")})});var Vt=d(()=>{"use strict"});import{z as ne}from"zod";var Fe,zt=d(()=>{"use strict";Fe=ne.object({tableName:ne.string("Table name is required"),primaryKeys:ne.array(ne.object({columnName:ne.string("Column name is required"),value:ne.any()})).min(1,"At least one primary key is required")})});import{z as Br}from"zod";var Yt,Qt=d(()=>{"use strict";B();Yt=C.extend({cascade:Br.string().optional().transform(a=>a==="true")})});import{z as Gt}from"zod";var Jt,Xt=d(()=>{"use strict";Jt=Gt.object({query:Gt.string("Query is required")})});import{z as jr}from"zod";var Kr,Zt,ea=d(()=>{"use strict";B();Kr=["csv","xlsx","json"],Zt=C.extend({format:jr.enum(Kr,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var ta=d(()=>{"use strict"});import{z as He}from"zod";var Be,$i,aa=d(()=>{"use strict";B();ge();Be=He.object({newColumnName:He.string("New column name is required")}),$i=He.object({db:C.shape.db,tableName:U.shape.tableName,columnName:U.shape.columnName,newColumnName:Be.shape.newColumnName})});import{z as w}from"zod";var Ii,Ee,ki,Wr,Ui,oa,ra=d(()=>{"use strict";B();Ii=w.object({columnName:w.string(),operator:w.string(),value:w.string()}),Ee=["asc","desc"],ki=w.object({columnName:w.string(),direction:w.enum(Ee)}),Wr=w.object({limit:w.number(),total:w.number(),hasNextPage:w.boolean(),hasPreviousPage:w.boolean(),nextCursor:w.string().nullable(),prevCursor:w.string().nullable()}),Ui=w.object({data:w.array(w.record(w.string(),w.unknown())),meta:Wr}),oa=w.object({db:C.shape.db,cursor:w.string().optional(),limit:w.string().optional().default("50").transform(Number),direction:w.enum(Ee).optional().default(Ee[0]),sort:w.string().optional().transform(a=>{if(!a)return"";try{let e=JSON.parse(a);return Array.isArray(e)?e:a}catch{return a}}),order:w.enum(Ee).optional(),filters:w.string().optional().transform(a=>{if(!a)return[];try{return JSON.parse(a)}catch{return[]}})})});import{z as je}from"zod";var Bi,na=d(()=>{"use strict";Bi=je.object({tableName:je.string("Table name is required"),rowCount:je.coerce.number("Row count is required")})});import{z as sa}from"zod";var Wi,ia=d(()=>{"use strict";Wi=sa.object({schema:sa.string()})});import{z}from"zod";var la,ca=d(()=>{"use strict";la=z.object({tableName:z.string("Table name is required"),primaryKey:z.string("Primary key is required").default("id"),updates:z.array(z.object({rowData:z.record(z.string("Column name is required"),z.any()),columnName:z.string("Column name is required"),value:z.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var J=d(()=>{"use strict";Nt();Dt();xt();Pt();vt();qt();Ot();Ft();Ue();jt();B();Wt();Vt();ge();zt();Qt();Xt();ea();ta();aa();ra();na();ia();ca()});import{HTTPException as Vr}from"hono/http-exception";import{DatabaseError as zr}from"pg";import{ZodError as Yr}from"zod";function ma(a,e){if(a instanceof Vr)return e.json({error:a.message??"Internal server error"},a.status);if(a instanceof Yr){let t=a.issues[0];return e.json({error:"Validation error",details:t.message},400)}if(a instanceof Error){let t=a;if(t.code==="ECONNREFUSED"||t.code==="ENOTFOUND"||t.code==="ETIMEDOUT"||t.code==="ER_ACCESS_DENIED_ERROR"||t.code==="ER_BAD_HOST_ERROR"||t.code==="ECONNRESET"||t.errno===1045||t.errno===2003||t.errno===2002||a.message.includes("ECONNREFUSED")||a.message.includes("connection refused")||a.message.includes("timeout expired")||a.message.includes("Connection terminated")||a instanceof zr&&a.code?.startsWith("08"))return e.json({error:"Database connection failed",details:a.message},503)}return e.json({error:a instanceof Error?a.message:"Internal server error"},500)}var ua,pa=d(()=>{"use strict";ua=(a,e)=>{if(!a.success){let t=a.error?.issues[0];return e.json({error:"Validation error",details:t?.message??"Unknown validation error"},400)}}});import{Pool as Qr}from"pg";var Se,Gr,Ke,da=d(()=>{"use strict";Se=null,Gr=()=>{if(!Se){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{Se=new Qr({connectionString:process.env.DATABASE_URL}),Se.on("error",a=>{})}catch(a){throw a}}return Se},Ke=new Proxy({},{get(a,e){try{return Gr()[e]}catch(t){throw t}}})});import{createPool as Jr}from"mysql2/promise";import{Pool as fa}from"pg";var We,Ve,g,E,Re,S=d(()=>{"use strict";We=class{pgPools=new Map;mysqlPools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let t=e.protocol.replace(":","");if(t==="postgres"||t==="postgresql")return"pg";if(t==="mysql"||t==="mysql2")return"mysql";throw new Error(`Unsupported database type: ${t}. Supported types: PostgreSQL (postgres://) and MySQL (mysql://).`)}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 t=new URL(e);this.baseConfig={url:e,host:t.hostname,port:Number.parseInt(t.port,10)||(this.detectDbType(t)==="mysql"?3306:5432),user:t.username,password:t.password,dbType:this.detectDbType(t)}}catch(t){throw new Error(t instanceof Error?t.message:String(t))}}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");e||(e=new URL(this.baseConfig.url).pathname.slice(1));try{let t=new URL(this.baseConfig.url);return t.pathname=`/${e}`,t.toString()}catch(t){throw new Error(`Failed to build connection string for database "${e}": ${t instanceof Error?t.message:String(t)}`)}}getPgPool(e){let t=this.buildConnectionString(e);if(!this.pgPools.has(t)){let o={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},r=new fa(o);r.on("error",n=>{}),this.pgPools.set(t,r)}return this.pgPools.get(t)??new fa({connectionString:t})}getMysqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let t=this.buildConnectionString(e);if(!this.mysqlPools.has(t)){let r=new URL(t).pathname.slice(1),n=Jr({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:r||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.mysqlPools.set(t,n)}return this.mysqlPools.get(t)}getPool(e){return this.getPgPool(e)}async closePgPool(e){let t=this.pgPools.get(e);t&&(await t.end(),this.pgPools.delete(e))}async closeMysqlPool(e){let t=this.mysqlPools.get(e);t&&(await t.end(),this.mysqlPools.delete(e))}async closePool(e){await this.closePgPool(e),await this.closeMysqlPool(e)}async closePoolByDatabase(e){let t=this.buildConnectionString(e);await this.closePool(t)}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([o,r])=>{await r.end()}),t=Array.from(this.mysqlPools.entries()).map(async([o,r])=>{await r.end()});await Promise.all([...e,...t]),this.pgPools.clear(),this.mysqlPools.clear()}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys())]}},Ve=new We,g=a=>Ve.getPgPool(a),E=a=>Ve.getMysqlPool(a),Re=()=>Ve.getDbType()});import{HTTPException as Xr}from"hono/http-exception";async function Ce({tableName:a,db:e}){let t=g(e),o=`
2
+ var sn=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var ln=(a,e)=>{for(var t in e)sn(a,t,{get:e[t],enumerable:!0})};var yt=d(()=>{"use strict"});var Tt=d(()=>{"use strict"});var Et=d(()=>{"use strict"});var ae,gt=d(()=>{"use strict";ae={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 ht=d(()=>{"use strict"});var Nt,Ve=d(()=>{"use strict";Nt={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:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"DB Studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var Ct=d(()=>{"use strict"});var Ce=d(()=>{"use strict";yt();Tt();Et();gt();ht();Ve();Ct()});import{z as ne}from"zod";var A,_n,Se,Pl,qt,Z,V=d(()=>{"use strict";A=ne.object({db:ne.string("Database name is required")}),_n=["pg","mysql","mssql"],Se=ne.enum(_n,{message:"Invalid database type"}),Pl=A.extend({dbType:Se}),qt=ne.object({dbType:Se}),Z=ne.object({tableName:ne.string("Table name is required")})});import{z as Q}from"zod";var z,vl,$t=d(()=>{"use strict";V();z=Q.object({columnName:Q.string("Column name is required"),columnType:Q.string("Column type is required"),defaultValue:Q.string().optional(),isPrimaryKey:Q.boolean().default(!1),isNullable:Q.boolean().default(!1),isUnique:Q.boolean().default(!1),isIdentity:Q.boolean().default(!1),isArray:Q.boolean().default(!1)}),vl=Q.object({db:A.shape.db,tableName:Z.shape.tableName,columnName:z.shape.columnName,columnType:z.shape.columnType,defaultValue:z.shape.defaultValue,isPrimaryKey:z.shape.isPrimaryKey,isNullable:z.shape.isNullable,isUnique:z.shape.isUnique,isIdentity:z.shape.isIdentity,isArray:z.shape.isArray})});import{z as fe}from"zod";var vt,kt=d(()=>{"use strict";vt=fe.object({tableName:fe.string("Table name is required"),data:fe.record(fe.string("Column name is required"),fe.any())})});import{z as W}from"zod";var Ut,j,jl,Kl,_e=d(()=>{"use strict";V();Ut=A.extend({cascade:W.string().optional().transform(a=>a==="true")}),j=W.object({tableName:W.string("Table name is required"),columnName:W.string("Column name is required")}),jl=W.object({db:A.shape.db,tableName:j.shape.tableName,columnName:j.shape.columnName,cascade:W.boolean().optional()}),Kl=W.object({message:W.string("Message is required"),tableName:W.string("Table name is required"),columnName:W.string("Column name is required"),deletedCount:W.number("Deleted count is required").default(0)})});import{z as be}from"zod";var ye,zl,Ft=d(()=>{"use strict";V();_e();ye=be.object({columnType:be.string("Column type is required"),isNullable:be.boolean(),defaultValue:be.string().nullable().optional()}),zl=be.object({db:A.shape.db,tableName:j.shape.tableName,columnName:j.shape.columnName,columnType:ye.shape.columnType,isNullable:ye.shape.isNullable,defaultValue:ye.shape.defaultValue})});var Ht=d(()=>{"use strict"});import{z as se}from"zod";var Bt,jt=d(()=>{"use strict";Bt=se.object({tableName:se.string().min(1,"Table name is required"),records:se.array(se.record(se.string(),se.any())).min(1,"At least one record is required")})});import{z as ie}from"zod";var Kt,Vt=d(()=>{"use strict";V();Kt=ie.object({messages:ie.array(ie.object({role:ie.enum(["user","assistant"]),content:ie.string("Content is required")})),conversationId:ie.string().optional(),db:A.shape.db})});var Wt=d(()=>{"use strict"});import{z as K}from"zod";var wn,Dn,P,Ln,xn,oc,ze=d(()=>{"use strict";wn=["text","boolean","number","enum","json","date","array"],Dn=K.enum(wn),P={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Ln=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],xn=K.enum(Ln),oc=K.object({columnName:K.string(),dataType:Dn,dataTypeLabel:xn,isNullable:K.boolean(),columnDefault:K.string().nullable(),isPrimaryKey:K.boolean(),isForeignKey:K.boolean(),referencedTable:K.string().nullable(),referencedColumn:K.string().nullable(),enumValues:K.array(K.string()).nullable()})});function Yt(a){let e=a?.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(")?P.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"?P.number:e==="boolean"||e==="bool"?P.boolean:e==="json"||e==="jsonb"?P.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?P.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"?P.text:P.text}function Qt(a){if(!a)return f.text;let e=a.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?f.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?f.bigint:e==="smallint"||e==="int2"?f.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?f.numeric:e==="real"||e==="float4"?f.float:e==="double precision"||e==="float8"||e==="float"?f.double:e==="money"?f.money:e==="boolean"||e==="bool"?f.boolean:e==="text"?f.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?f.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?f.char:e==="json"?f.json:e==="jsonb"?f.jsonb:e==="xml"?f.xml:e==="uuid"?f.uuid:e==="date"?f.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?f.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?f.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?f.timestamptz:e==="interval"||e.startsWith("interval")?f.interval:e==="bytea"?f.bytea:e==="inet"?f.inet:e==="cidr"?f.cidr:e==="macaddr"?f.macaddr:e==="macaddr8"?f.macaddr8:e==="point"?f.point:e==="line"?f.line:e==="polygon"?f.polygon:e.startsWith("array")||e.includes("[]")?f.text:e.startsWith("user-defined")||e==="enum"?f.enum:f.text}function zt(a,e){let t=a?.toLowerCase().trim()||"",o=e?.toLowerCase().trim()||"";return t==="tinyint"&&o==="tinyint(1)"?P.boolean:t==="tinyint"||t==="smallint"||t==="mediumint"||t==="int"||t==="integer"||t==="bigint"||t==="decimal"||t==="numeric"||t==="float"||t==="double"||t==="real"||t==="bit"?P.number:t==="boolean"||t==="bool"?P.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?P.date:t==="json"?P.json:t==="enum"||t==="set"?P.enum:P.text}function Gt(a,e){if(!a)return f.text;let t=a.toLowerCase().trim(),o=e?.toLowerCase().trim()||"";return t==="tinyint"&&o==="tinyint(1)"?f.boolean:t==="tinyint"?f.tinyint:t==="smallint"?f.smallint:t==="mediumint"?f.mediumint:t==="int"||t==="integer"?f.int:t==="bigint"?f.bigint:t==="decimal"||t==="numeric"?f.numeric:t==="float"||t==="real"?f.float:t==="double"?f.double:t==="bit"?f.bit:t==="boolean"||t==="bool"?f.boolean:t==="char"?f.char:t==="varchar"?f.varchar:t==="tinytext"?f.tinytext:t==="text"?f.text:t==="mediumtext"?f.mediumtext:t==="longtext"?f.longtext:t==="binary"?f.binary:t==="varbinary"?f.varbinary:t==="tinyblob"?f.tinyblob:t==="blob"?f.blob:t==="mediumblob"?f.mediumblob:t==="longblob"?f.longblob:t==="json"?f.json:t==="date"?f.date:t==="time"?f.time:t==="datetime"?f.datetime:t==="timestamp"?f.timestamp:t==="year"?f.year:t==="enum"?f.enum:t==="set"?f.set:f.text}function Jt(a){let e=a?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?P.number:e==="bit"?P.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?P.date:e==="json"?P.json:P.text}function Xt(a){if(!a)return f.text;let e=a.toLowerCase().trim();return e==="tinyint"?f.tinyint:e==="smallint"?f.smallint:e==="int"?f.int:e==="bigint"?f.bigint:e==="decimal"||e==="numeric"?f.numeric:e==="float"||e==="real"?f.float:e==="money"||e==="smallmoney"?f.money:e==="bit"?f.boolean:e==="char"?f.char:e==="varchar"?f.varchar:e==="text"?f.text:e==="nchar"?f.char:e==="nvarchar"?f.varchar:e==="ntext"?f.text:e==="binary"?f.binary:e==="varbinary"?f.varbinary:e==="image"?f.blob:e==="uniqueidentifier"?f.uuid:e==="date"?f.date:e==="time"?f.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?f.datetime:e==="datetimeoffset"?f.timestamptz:e==="json"?f.json:e==="xml"?f.xml:f.text}var f,Zt=d(()=>{"use strict";ze();f={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as $}from"zod";var Mn,ea,On,Pn,ta,aa=d(()=>{"use strict";Mn=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],ea=$.enum(Mn),On=$.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)}),Pn=$.object({columnName:$.string("Column name is required"),referencedTable:$.string("Referenced table is required"),referencedColumn:$.string("Referenced column is required"),onUpdate:ea.default("NO ACTION"),onDelete:ea.default("NO ACTION")}),ta=$.object({tableName:$.string("Table name is required"),fields:$.array(On).min(1,"At least one field is required"),foreignKeys:$.array(Pn).optional()})});import{z as F}from"zod";var In,uc,oa,ra=d(()=>{"use strict";V();In=F.object({name:F.string("Name is required"),size:F.string("Size is required"),owner:F.string("Owner is required"),encoding:F.string("Encoding is required")}),uc=F.object({databases:F.array(In),dbType:Se}),oa=F.object({version:F.string("Version is required"),database:F.string("Database is required"),user:F.string("User is required"),host:F.string("Host is required").nullable(),port:F.number("Port is required").nullable(),active_connections:F.coerce.number("Active connections is required"),max_connections:F.coerce.number("Max connections is required")})});var na=d(()=>{"use strict"});import{z as le}from"zod";var Ge,sa=d(()=>{"use strict";Ge=le.object({tableName:le.string("Table name is required"),primaryKeys:le.array(le.object({columnName:le.string("Column name is required"),value:le.any()})).min(1,"At least one primary key is required")})});import{z as qn}from"zod";var ia,la=d(()=>{"use strict";V();ia=A.extend({cascade:qn.string().optional().transform(a=>a==="true")})});import{z as ca}from"zod";var ma,ua=d(()=>{"use strict";ma=ca.object({query:ca.string("Query is required")})});import{z as $n}from"zod";var vn,pa,da=d(()=>{"use strict";V();vn=["csv","xlsx","json"],pa=A.extend({format:$n.enum(vn,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var fa=d(()=>{"use strict"});import{z as Je}from"zod";var Xe,_c,ba=d(()=>{"use strict";V();_e();Xe=Je.object({newColumnName:Je.string("New column name is required")}),_c=Je.object({db:A.shape.db,tableName:j.shape.tableName,columnName:j.shape.columnName,newColumnName:Xe.shape.newColumnName})});import{z as L}from"zod";var xc,we,Mc,kn,Oc,ya,Ta=d(()=>{"use strict";V();xc=L.object({columnName:L.string(),operator:L.string(),value:L.string()}),we=["asc","desc"],Mc=L.object({columnName:L.string(),direction:L.enum(we)}),kn=L.object({limit:L.number(),total:L.number(),hasNextPage:L.boolean(),hasPreviousPage:L.boolean(),nextCursor:L.string().nullable(),prevCursor:L.string().nullable()}),Oc=L.object({data:L.array(L.record(L.string(),L.unknown())),meta:kn}),ya=L.object({db:A.shape.db,cursor:L.string().optional(),limit:L.string().optional().default("50").transform(Number),direction:L.enum(we).optional().default(we[0]),sort:L.string().optional().transform(a=>{if(!a)return"";try{let e=JSON.parse(a);return Array.isArray(e)?e:a}catch{return a}}),order:L.enum(we).optional(),filters:L.string().optional().transform(a=>{if(!a)return[];try{return JSON.parse(a)}catch{return[]}})})});import{z as Ze}from"zod";var qc,Ea=d(()=>{"use strict";qc=Ze.object({tableName:Ze.string("Table name is required"),rowCount:Ze.coerce.number("Row count is required")})});import{z as ga}from"zod";var kc,ha=d(()=>{"use strict";kc=ga.object({schema:ga.string()})});import{z as G}from"zod";var Na,Ca=d(()=>{"use strict";Na=G.object({tableName:G.string("Table name is required"),primaryKey:G.string("Primary key is required").default("id"),updates:G.array(G.object({rowData:G.record(G.string("Column name is required"),G.any()),columnName:G.string("Column name is required"),value:G.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var J=d(()=>{"use strict";$t();kt();Ft();Ht();jt();Vt();Wt();Zt();ze();aa();V();ra();na();_e();sa();la();ua();da();fa();ba();Ta();Ea();ha();Ca()});import{HTTPException as Un}from"hono/http-exception";import{DatabaseError as Fn}from"pg";import{ZodError as Hn}from"zod";function Ra(a,e){if(a instanceof Un)return e.json({error:a.message??"Internal server error"},a.status);if(a instanceof Hn){let t=a.issues[0];return e.json({error:"Validation error",details:t.message},400)}if(a instanceof Error){let t=a;if(t.code==="ECONNREFUSED"||t.code==="ENOTFOUND"||t.code==="ETIMEDOUT"||t.code==="ER_ACCESS_DENIED_ERROR"||t.code==="ER_BAD_HOST_ERROR"||t.code==="ECONNRESET"||t.errno===1045||t.errno===2003||t.errno===2002||a.message.includes("ECONNREFUSED")||a.message.includes("connection refused")||a.message.includes("timeout expired")||a.message.includes("Connection terminated")||a instanceof Fn&&a.code?.startsWith("08"))return e.json({error:"Database connection failed",details:a.message},503)}return e.json({error:a instanceof Error?a.message:"Internal server error"},500)}var Aa,Sa=d(()=>{"use strict";Aa=(a,e)=>{if(!a.success){let t=a.error?.issues[0];return e.json({error:"Validation error",details:t?.message??"Unknown validation error"},400)}}});import{Pool as Bn}from"pg";var De,jn,et,_a=d(()=>{"use strict";De=null,jn=()=>{if(!De){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{De=new Bn({connectionString:process.env.DATABASE_URL}),De.on("error",a=>{})}catch(a){throw a}}return De},et=new Proxy({},{get(a,e){try{return jn()[e]}catch(t){throw t}}})});import Kn from"mssql";import{createPool as Vn}from"mysql2/promise";import{Pool as wa}from"pg";var tt,Le,N,C,R,xe,h=d(()=>{"use strict";tt=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let t=e.protocol.replace(":","");if(t==="postgres"||t==="postgresql")return"pg";if(t==="mysql"||t==="mysql2")return"mysql";if(t==="mssql"||t==="sqlserver")return"mssql";throw new Error(`Unsupported database type: ${t}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), and SQL Server (mssql://).`)}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 t=new URL(e);this.baseConfig={url:e,host:t.hostname,port:Number.parseInt(t.port,10)||(this.detectDbType(t)==="mysql"?3306:this.detectDbType(t)==="mssql"?1433:5432),user:t.username,password:t.password,dbType:this.detectDbType(t)}}catch(t){throw new Error(t instanceof Error?t.message:String(t))}}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");e||(e=new URL(this.baseConfig.url).pathname.slice(1));try{let t=new URL(this.baseConfig.url);return t.pathname=`/${e}`,t.toString()}catch(t){throw new Error(`Failed to build connection string for database "${e}": ${t instanceof Error?t.message:String(t)}`)}}getPgPool(e){let t=this.buildConnectionString(e);if(!this.pgPools.has(t)){let o={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},r=new wa(o);r.on("error",n=>{}),this.pgPools.set(t,r)}return this.pgPools.get(t)??new wa({connectionString:t})}getMysqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let t=this.buildConnectionString(e);if(!this.mysqlPools.has(t)){let r=new URL(t).pathname.slice(1),n=Vn({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:r||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.mysqlPools.set(t,n)}return this.mysqlPools.get(t)}async getMssqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let t=this.buildConnectionString(e);if(!this.mssqlPools.has(t)){let r=new URL(t).pathname.slice(1),n={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:r||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},l=await new Kn.ConnectionPool(n).connect();l.on("error",i=>{}),this.mssqlPools.set(t,l)}return this.mssqlPools.get(t)}getPool(e){return this.getPgPool(e)}async closePgPool(e){let t=this.pgPools.get(e);t&&(await t.end(),this.pgPools.delete(e))}async closeMysqlPool(e){let t=this.mysqlPools.get(e);t&&(await t.end(),this.mysqlPools.delete(e))}async closeMssqlPool(e){let t=this.mssqlPools.get(e);t&&(await t.close(),this.mssqlPools.delete(e))}async closePool(e){await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){let t=this.buildConnectionString(e);await this.closePool(t)}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([r,n])=>{await n.end()}),t=Array.from(this.mysqlPools.entries()).map(async([r,n])=>{await n.end()}),o=Array.from(this.mssqlPools.entries()).map(async([r,n])=>{await n.close()});await Promise.all([...e,...t,...o]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear()}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},Le=new tt,N=a=>Le.getPgPool(a),C=a=>Le.getMysqlPool(a),R=async a=>Le.getMssqlPool(a),xe=()=>Le.getDbType()});import{HTTPException as Wn}from"hono/http-exception";async function Me({tableName:a,db:e}){let t=N(e),o=`
3
3
  SELECT
4
4
  c.column_name as "columnName",
5
5
  c.data_type as "dataType",
@@ -48,18 +48,18 @@ var fr=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var yr=(a,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:r}=await t.query(o,[a]);if(!r||r.length===0)throw new Xr(404,{message:`Table "${a}" does not exist`});return r.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:Mt(n.dataType),dataTypeLabel:It(n.dataType),isNullable:n.isNullable,columnDefault:n.columnDefault,isPrimaryKey:n.isPrimaryKey,isForeignKey:n.isForeignKey,referencedTable:n.referencedTable,referencedColumn:n.referencedColumn,enumValues:i}})}var ze=d(()=>{"use strict";J();S()});async function Zr(a){let e=g(a),t=`
51
+ `,{rows:r}=await t.query(o,[a]);if(!r||r.length===0)throw new Wn(404,{message:`Table "${a}" does not exist`});return r.map(n=>{let l=null;return n.enumValues&&(Array.isArray(n.enumValues)?l=n.enumValues:typeof n.enumValues=="string"&&(l=n.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:n.columnName,dataType:Yt(n.dataType),dataTypeLabel:Qt(n.dataType),isNullable:n.isNullable,columnDefault:n.columnDefault,isPrimaryKey:n.isPrimaryKey,isForeignKey:n.isForeignKey,referencedTable:n.referencedTable,referencedColumn:n.referencedColumn,enumValues:l}})}var at=d(()=>{"use strict";J();h()});async function Qn(a){let e=N(a),t=`
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:o}=await e.query(t);return o.map(r=>r.table_name)}async function en(a){let e=await Ke.connect();try{return(await e.query(`
57
+ `,{rows:o}=await e.query(t);return o.map(r=>r.table_name)}async function zn(a){let e=await et.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
- `,[a])).rows[0]?.description||void 0}finally{e.release()}}async function tn(a){let e=await Ke.connect();try{return(await e.query(`SELECT * FROM "${a}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function an(a){let e={name:a.columnName,type:a.dataTypeLabel,nullable:a.isNullable};return a.isPrimaryKey&&(e.isPrimaryKey=!0),a.isForeignKey&&a.referencedTable&&a.referencedColumn&&(e.foreignKey=`${a.referencedTable}.${a.referencedColumn}`),a.enumValues&&a.enumValues.length>0&&(e.enumValues=a.enumValues,e.description=`Enum values: ${a.enumValues.join(", ")}`),e}function on(a){let e=[];for(let t of a)for(let o of t.columns)if(o.foreignKey){let[r,n]=o.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:o.name,toTable:r,toColumn:n})}return e}async function rn(a,e={}){let{includeSampleData:t=!1,includeDescriptions:o=!0}=e;try{let n=(await Zr(a)).map(async s=>{let[m,c,p]=await Promise.all([Ce({tableName:s,db:a}),o?en(s):Promise.resolve(void 0),t?tn(s):Promise.resolve([])]),u={name:s,columns:m.map(an)};return c&&(u.description=c),p.length>0&&(u.sampleData=p.map(b=>Object.fromEntries(Object.entries(b).map(([f,h])=>[f,String(h)])))),u}),i=await Promise.all(n),l=on(i);return{dbType:"PostgreSQL",tables:i,relationships:l}}catch(r){throw new Error(`Failed to fetch database schema: ${r instanceof Error?r.message:"Unknown error"}`)}}async function ya(a){return rn(a,{includeSampleData:!0,includeDescriptions:!0})}var ba=d(()=>{"use strict";da();S();ze()});function Ta(a){return`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
62
+ `,[a])).rows[0]?.description||void 0}finally{e.release()}}async function Gn(a){let e=await et.connect();try{return(await e.query(`SELECT * FROM "${a}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function Jn(a){let e={name:a.columnName,type:a.dataTypeLabel,nullable:a.isNullable};return a.isPrimaryKey&&(e.isPrimaryKey=!0),a.isForeignKey&&a.referencedTable&&a.referencedColumn&&(e.foreignKey=`${a.referencedTable}.${a.referencedColumn}`),a.enumValues&&a.enumValues.length>0&&(e.enumValues=a.enumValues,e.description=`Enum values: ${a.enumValues.join(", ")}`),e}function Xn(a){let e=[];for(let t of a)for(let o of t.columns)if(o.foreignKey){let[r,n]=o.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:o.name,toTable:r,toColumn:n})}return e}async function Zn(a,e={}){let{includeSampleData:t=!1,includeDescriptions:o=!0}=e;try{let n=(await Qn(a)).map(async s=>{let[c,m,p]=await Promise.all([Me({tableName:s,db:a}),o?zn(s):Promise.resolve(void 0),t?Gn(s):Promise.resolve([])]),u={name:s,columns:c.map(Jn)};return m&&(u.description=m),p.length>0&&(u.sampleData=p.map(E=>Object.fromEntries(Object.entries(E).map(([T,y])=>[T,String(y)])))),u}),l=await Promise.all(n),i=Xn(l);return{dbType:"PostgreSQL",tables:l,relationships:i}}catch(r){throw new Error(`Failed to fetch database schema: ${r instanceof Error?r.message:"Unknown error"}`)}}async function Da(a){return Zn(a,{includeSampleData:!0,includeDescriptions:!0})}var La=d(()=>{"use strict";_a();h();at()});function xa(a){return`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
63
63
 
64
64
  **Your Role:**
65
65
  1. Keep responses SHORT - 2-3 sentences maximum unless generating SQL
@@ -74,7 +74,7 @@ var fr=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var yr=(a,e)=>{f
74
74
  6. No preamble, no apologies, get straight to the answer
75
75
 
76
76
  **Database Context:**
77
- ${nn(a)}
77
+ ${es(a)}
78
78
 
79
79
  **Guidelines:**
80
80
  1. Always generate syntactically correct SQL for the database type (${a.dbType})
@@ -112,21 +112,34 @@ LIMIT 5;
112
112
 
113
113
  This will return the 5 customers with the highest total order value. You might also want to see:
114
114
  - Revenue trends over time for these customers
115
- - Their most frequently ordered products"`}function nn(a){let e=`Database Type: ${a.dbType}
115
+ - Their most frequently ordered products"`}function es(a){let e=`Database Type: ${a.dbType}
116
116
 
117
117
  `;e+=`**Tables and Columns:**
118
118
  `;for(let t of a.tables){e+=`
119
119
  ### ${t.name}
120
120
  `,t.description&&(e+=`Description: ${t.description}
121
121
  `),e+=`Columns:
122
- `;for(let o of t.columns){let r=o.isPrimaryKey?" [PRIMARY KEY]":"",n=o.foreignKey?` [FK -> ${o.foreignKey}]`:"",i=o.nullable?"NULL":"NOT NULL";e+=` - ${o.name}: ${o.type} ${i}${r}${n}
122
+ `;for(let o of t.columns){let r=o.isPrimaryKey?" [PRIMARY KEY]":"",n=o.foreignKey?` [FK -> ${o.foreignKey}]`:"",l=o.nullable?"NULL":"NOT NULL";e+=` - ${o.name}: ${o.type} ${l}${r}${n}
123
123
  `,o.description&&(e+=` ${o.description}
124
124
  `)}t.sampleData&&t.sampleData.length>0&&(e+=`Sample data (${t.sampleData.length} rows):
125
125
  `,e+=`${JSON.stringify(t.sampleData.slice(0,3),null,2)}
126
126
  `)}if(a.relationships&&a.relationships.length>0){e+=`
127
127
  **Relationships:**
128
128
  `;for(let t of a.relationships)e+=` - ${t.fromTable}.${t.fromColumn} -> ${t.toTable}.${t.toColumn}
129
- `}return e}var ha=d(()=>{"use strict"});import{zValidator as sn}from"@hono/zod-validator";import{Hono as ln}from"hono";var ga,Ea=d(()=>{"use strict";ye();J();ba();ha();ga=new ln().basePath("/chat").post("/",sn("json",$t),async a=>{let{messages:e,conversationId:t,db:o}=a.req.valid("json"),r=await ya(o),n=Ta(r),i={messages:e,conversationId:t,systemPrompt:n},l=await fetch(`${Z.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!l.ok){let c=await l.json();return a.json({error:c.error||"Proxy request failed"},l.status)}let{readable:s,writable:m}=new TransformStream;return l.body?.pipeTo(m),new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})})});function we(){let a=process.env.DATABASE_URL;if(!a)return{host:"localhost",port:5432};try{let e=new URL(a);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||5432}}catch{return{host:"localhost",port:5432}}}var Ye=d(()=>{"use strict"});import{HTTPException as Qe}from"hono/http-exception";async function Sa(){let a=g(),e=`
129
+ `}return e}var Ma=d(()=>{"use strict"});import{zValidator as ts}from"@hono/zod-validator";import{Hono as as}from"hono";var Oa,Pa=d(()=>{"use strict";Ce();J();La();Ma();Oa=new as().basePath("/chat").post("/",ts("json",Kt),async a=>{let{messages:e,conversationId:t,db:o}=a.req.valid("json"),r=await Da(o),n=xa(r),l={messages:e,conversationId:t,systemPrompt:n},i=await fetch(`${ae.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});if(!i.ok){let m=await i.json();return a.json({error:m.error||"Proxy request failed"},i.status)}let{readable:s,writable:c}=new TransformStream;return i.body?.pipeTo(c),new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})})});import{HTTPException as os}from"hono/http-exception";async function Ia({db:a,params:e}){let{tableName:t,data:o}=e,r=N(a),n=Object.keys(o),l=Object.values(o),i=n.map((p,u)=>`$${u+1}`).join(", "),s=n.map(p=>`"${p}"`).join(", "),c=`
130
+ INSERT INTO "${t}" (${s})
131
+ VALUES (${i})
132
+ RETURNING *
133
+ `,m=await r.query(c,l);if(m.rowCount===0)throw new os(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:m.rowCount??0}}var qa=d(()=>{"use strict";h()});import{HTTPException as Oe}from"hono/http-exception";var $a,va=d(()=>{"use strict";h();$a=async({tableName:a,records:e,db:t})=>{if(!e||e.length===0)throw new Oe(400,{message:"At least one record is required"});let r=await N(t).connect();try{let n=Object.keys(e[0]),l=n.map(m=>`"${m}"`).join(", "),i=0,s=0,c=[];await r.query("BEGIN");for(let m=0;m<e.length;m++){let p=e[m],u=n.map(y=>p[y]),E=n.map((y,b)=>`$${b+1}`).join(", "),T=`
134
+ INSERT INTO "${a}" (${l})
135
+ VALUES (${E})
136
+ RETURNING *
137
+ `;try{await r.query(T,u),i++}catch(y){throw new Oe(500,{message:`Failed: ${y instanceof Error?y.message:String(y)}`})}}return await r.query("COMMIT"),{success:s===0,message:`Bulk insert completed: ${i} records inserted${s>0?`, ${s} failed`:""}`,successCount:i,failureCount:s,errors:c.length>0?c:void 0}}catch(n){throw await r.query("ROLLBACK"),n instanceof Oe?n:new Oe(500,{message:`Failed to bulk insert records into "${a}"`})}finally{r.release()}}});async function ka({tableData:a,db:e}){let{tableName:t,fields:o,foreignKeys:r}=a,n=N(e),l=o.map(m=>{let p=`"${m.columnName}" ${m.columnType}`;return m.isArray&&(p+="[]"),m.isPrimaryKey&&(p+=" PRIMARY KEY"),m.isUnique&&!m.isPrimaryKey&&(p+=" UNIQUE"),m.isNullable||(p+=" NOT NULL"),m.isIdentity&&(p+=" GENERATED ALWAYS AS IDENTITY"),m.defaultValue&&!m.isIdentity&&(p+=` DEFAULT ${m.defaultValue}`),p}),i=r?.map(m=>`CONSTRAINT "${`fk_${t}_${m.columnName}_${m.referencedTable}_${m.referencedColumn}`}" FOREIGN KEY ("${m.columnName}") REFERENCES "${m.referencedTable}" ("${m.referencedColumn}") ON UPDATE ${m.onUpdate} ON DELETE ${m.onDelete}`)||[],s=[...l,...i],c=`
138
+ CREATE TABLE "${t}" (
139
+ ${s.join(`,
140
+ `)}
141
+ );
142
+ `;await n.query(c)}var Ua=d(()=>{"use strict";h()});function ce(){let a=process.env.DATABASE_URL;if(!a)return{host:"localhost",port:5432};try{let e=new URL(a);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||5432}}catch{return{host:"localhost",port:5432}}}var Pe=d(()=>{"use strict"});import{HTTPException as ot}from"hono/http-exception";async function Fa(){let a=N(),e=`
130
143
  SELECT
131
144
  d.datname as name,
132
145
  pg_size_pretty(pg_database_size(d.datname)) as size,
@@ -135,7 +148,7 @@ This will return the 5 customers with the highest total order value. You might a
135
148
  FROM pg_catalog.pg_database d
136
149
  WHERE d.datistemplate = false
137
150
  ORDER BY d.datname;
138
- `,{rows:t}=await a.query(e);if(!t[0])throw new Qe(500,{message:"No databases returned from database"});return t}async function Ra(){let a=g(),e="SELECT current_database() as database;",{rows:t}=await a.query(e);if(!t[0])throw new Qe(500,{message:"No current database returned from database"});return t[0]}async function Ca(){let a=g(),e=`
151
+ `,{rows:t}=await a.query(e);if(!t[0])throw new ot(500,{message:"No databases returned from database"});return t}async function Ha(){let a=N(),e="SELECT current_database() as database;",{rows:t}=await a.query(e);if(!t[0])throw new ot(500,{message:"No current database returned from database"});return t[0]}async function Ba(){let a=N(),e=`
139
152
  SELECT
140
153
  version() as version,
141
154
  current_database() as database,
@@ -144,40 +157,17 @@ This will return the 5 customers with the highest total order value. You might a
144
157
  inet_server_port() as port,
145
158
  (SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
146
159
  (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
147
- `,{rows:t}=await a.query(e);if(!t[0])throw new Qe(500,{message:"No connection information returned from database"});let o=Kt.parse(t[0]),r=we();return{host:o.host||r.host,port:o.port||r.port,user:o.user,database:o.database,version:o.version.toString(),active_connections:o.active_connections,max_connections:o.max_connections}}var wa=d(()=>{"use strict";J();S();Ye()});import{HTTPException as Ge}from"hono/http-exception";async function Na(){let a=E(),[e]=await a.execute(`
148
- SELECT
149
- s.SCHEMA_NAME AS name,
150
- CONCAT(
151
- ROUND(
152
- COALESCE(SUM(t.data_length + t.index_length), 0) / 1024 / 1024,
153
- 2
154
- ),
155
- ' MB'
156
- ) AS size,
157
- CURRENT_USER() AS owner,
158
- s.DEFAULT_CHARACTER_SET_NAME AS encoding
159
- FROM information_schema.SCHEMATA s
160
- LEFT JOIN information_schema.TABLES t
161
- ON t.TABLE_SCHEMA = s.SCHEMA_NAME
162
- GROUP BY s.SCHEMA_NAME, s.DEFAULT_CHARACTER_SET_NAME
163
- ORDER BY s.SCHEMA_NAME
164
- `);if(!e[0])throw new Ge(500,{message:"No databases returned from server"});return e}async function Aa(){let a=E(),[e]=await a.execute("SELECT DATABASE() AS db");if(!e[0])throw new Ge(500,{message:"No current database returned from server"});return e[0]}async function Da(){let a=E(),[e]=await a.execute(`
165
- SELECT
166
- VERSION() AS version,
167
- DATABASE() AS database_name,
168
- CURRENT_USER() AS user,
169
- @@hostname AS host,
170
- @@port AS port,
171
- @@max_connections AS max_connections
172
- `),[t]=await a.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!e[0])throw new Ge(500,{message:"No connection information returned from server"});let o=e[0],r=Number(t[0]?.cnt??0),n=we();return{host:String(o.host||n.host),port:Number(o.port||n.port),user:String(o.user),database:String(o.database_name??""),version:String(o.version),active_connections:r,max_connections:Number(o.max_connections)}}var _a=d(()=>{"use strict";S();Ye()});import{Hono as cn}from"hono";var xa,Pa=d(()=>{"use strict";wa();_a();S();xa=new cn().basePath("/databases").get("/",async a=>{let e=Re(),t=e==="mysql"?await Na():await Sa();return a.json({data:{databases:t,dbType:e}},200)}).get("/current",async a=>{let e=Re(),t=e==="mysql"?await Aa():await Ra();return a.json({data:{db:t.db,dbType:e}},200)}).get("/connection",async a=>{let t=Re()==="mysql"?await Da():await Ca();return a.json({data:t},200)})});import{HTTPException as mn}from"hono/http-exception";var La,va=d(()=>{"use strict";S();La=async({query:a,db:e})=>{let t=E(e);if(!a||!a.trim())throw new mn(400,{message:"Query is required"});let o=a.trim().replace(/;+$/,""),r=performance.now(),[n,i]=await t.execute(o),l=performance.now()-r;if(Array.isArray(n)){let m=n;return{columns:i?i.map(p=>p.name):Object.keys(m[0]??{}),rows:m,rowCount:m.length,duration:l,message:m.length===0?"OK":void 0}}let s=n;return{columns:[],rows:[],rowCount:s.affectedRows,duration:l,message:`OK \u2014 ${s.affectedRows} row(s) affected`}}});import{HTTPException as un}from"hono/http-exception";var $a,qa=d(()=>{"use strict";S();$a=async({query:a,db:e})=>{let t=g(e);if(!a||!a.trim())throw new un(400,{message:"Query is required"});let o=a.trim().replace(/;+$/,""),r=performance.now(),n=await t.query(o),i=performance.now()-r;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 Oa}from"@hono/zod-validator";import{Hono as pn}from"hono";var Ma,Ia=d(()=>{"use strict";J();va();qa();Ma=new pn().basePath("/query").post("/",Oa("query",C),Oa("json",Jt),async a=>{let{query:e}=a.req.valid("json"),{db:t}=a.req.valid("query"),r=a.get("dbType")==="mysql"?await La({query:e,db:t}):await $a({query:e,db:t});return a.json({data:r},200)})});import{HTTPException as dn}from"hono/http-exception";async function ka({db:a,params:e}){let{tableName:t,data:o}=e,r=g(a),n=Object.keys(o),i=Object.values(o),l=n.map((p,u)=>`$${u+1}`).join(", "),s=n.map(p=>`"${p}"`).join(", "),m=`
173
- INSERT INTO "${t}" (${s})
174
- VALUES (${l})
175
- RETURNING *
176
- `,c=await r.query(m,i);if(c.rowCount===0)throw new dn(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:c.rowCount??0}}var Ua=d(()=>{"use strict";S()});import{HTTPException as Ne}from"hono/http-exception";var Fa,Ha=d(()=>{"use strict";S();Fa=async({tableName:a,records:e,db:t})=>{if(!e||e.length===0)throw new Ne(400,{message:"At least one record is required"});let r=await g(t).connect();try{let n=Object.keys(e[0]),i=n.map(c=>`"${c}"`).join(", "),l=0,s=0,m=[];await r.query("BEGIN");for(let c=0;c<e.length;c++){let p=e[c],u=n.map(h=>p[h]),b=n.map((h,T)=>`$${T+1}`).join(", "),f=`
177
- INSERT INTO "${a}" (${i})
178
- VALUES (${b})
179
- RETURNING *
180
- `;try{await r.query(f,u),l++}catch(h){throw new Ne(500,{message:`Failed: ${h instanceof Error?h.message:String(h)}`})}}return await r.query("COMMIT"),{success:s===0,message:`Bulk insert completed: ${l} records inserted${s>0?`, ${s} failed`:""}`,successCount:l,failureCount:s,errors:m.length>0?m:void 0}}catch(n){throw await r.query("ROLLBACK"),n instanceof Ne?n:new Ne(500,{message:`Failed to bulk insert records into "${a}"`})}finally{r.release()}}});import{HTTPException as se}from"hono/http-exception";async function Je(a,e){return(await g(e).query(`
160
+ `,{rows:t}=await a.query(e);if(!t[0])throw new ot(500,{message:"No connection information returned from database"});let o=oa.parse(t[0]),r=ce();return{host:o.host||r.host,port:o.port||r.port,user:o.user,database:o.database,version:o.version.toString(),active_connections:o.active_connections,max_connections:o.max_connections}}var ja=d(()=>{"use strict";J();h();Pe()});import{HTTPException as Ka}from"hono/http-exception";async function Va(a){let{tableName:e,columnName:t,cascade:o,db:r}=a,n=N(r),l=`
161
+ SELECT EXISTS (
162
+ SELECT 1 FROM information_schema.tables
163
+ WHERE table_name = $1 AND table_schema = 'public'
164
+ ) as exists;
165
+ `,{rows:i}=await n.query(l,[e]);if(!i[0]?.exists)throw new Ka(404,{message:`Table "${e}" does not exist`});let s=`
166
+ SELECT EXISTS (
167
+ SELECT 1 FROM information_schema.columns
168
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
169
+ ) as exists;
170
+ `,{rows:c}=await n.query(s,[e,t]);if(!c[0]?.exists)throw new Ka(404,{message:`Column "${t}" does not exist in table "${e}"`});let p=`ALTER TABLE "${e}" DROP COLUMN "${t}" ${o?"CASCADE":"RESTRICT"}`,{rowCount:u}=await n.query(p);return{deletedCount:u??0}}var Wa=d(()=>{"use strict";h()});import{HTTPException as me}from"hono/http-exception";async function rt(a,e){return(await N(e).query(`
181
171
  SELECT
182
172
  tc.constraint_name,
183
173
  tc.table_name as referencing_table,
@@ -193,25 +183,265 @@ This will return the 5 customers with the highest total order value. You might a
193
183
  AND ccu.table_schema = tc.table_schema
194
184
  WHERE tc.constraint_type = 'FOREIGN KEY'
195
185
  AND ccu.table_name = $1
196
- `,[a])).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 fn(a,e,t){let o=await Je(a,t);if(o.length===0)return[];let r=[],n=g(t),i=new Map;for(let s of o){let m=`${s.referencingTable}.${s.referencingColumn}`;i.has(m)||i.set(m,[]),i.get(m)?.push(s)}let l=e.map(s=>s.value);for(let[s,m]of i){let c=m[0];if(!c||!e.find(h=>h.columnName===c.referencedColumn))continue;let u=l.map((h,T)=>`$${T+1}`).join(", "),b=`
197
- SELECT * FROM "${c.referencingTable}"
198
- WHERE "${c.referencingColumn}" IN (${u})
186
+ `,[a])).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 cs(a,e,t){let o=await rt(a,t);if(o.length===0)return[];let r=[],n=N(t),l=new Map;for(let s of o){let c=`${s.referencingTable}.${s.referencingColumn}`;l.has(c)||l.set(c,[]),l.get(c)?.push(s)}let i=e.map(s=>s.value);for(let[s,c]of l){let m=c[0];if(!m||!e.find(y=>y.columnName===m.referencedColumn))continue;let u=i.map((y,b)=>`$${b+1}`).join(", "),E=`
187
+ SELECT * FROM "${m.referencingTable}"
188
+ WHERE "${m.referencingColumn}" IN (${u})
199
189
  LIMIT 100
200
- `,f=await n.query(b,l);f.rows.length>0&&r.push({tableName:c.referencingTable,columnName:c.referencingColumn,constraintName:c.constraintName,records:f.rows})}return r}async function Ba({tableName:a,primaryKeys:e,db:t}){let o=g(t),r=e[0]?.columnName;if(!r)throw new se(400,{message:"Primary key column name is required"});let n=e.map(s=>s.value),i=n.map((s,m)=>`$${m+1}`).join(", "),l=`
190
+ `,T=await n.query(E,i);T.rows.length>0&&r.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:T.rows})}return r}async function Ya({tableName:a,primaryKeys:e,db:t}){let o=N(t),r=e[0]?.columnName;if(!r)throw new me(400,{message:"Primary key column name is required"});let n=e.map(s=>s.value),l=n.map((s,c)=>`$${c+1}`).join(", "),i=`
201
191
  DELETE FROM "${a}"
202
- WHERE "${r}" IN (${i})
192
+ WHERE "${r}" IN (${l})
203
193
  RETURNING *
204
- `;try{await o.query("BEGIN");let s=await o.query(l,n);return await o.query("COMMIT"),{deletedCount:s.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(s){if(await o.query("ROLLBACK"),s.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await fn(a,e,t)};throw s instanceof se?s:new se(500,{message:`Failed to delete records from "${a}"`})}}async function ja({tableName:a,primaryKeys:e,db:t}){let o=g(t),r=e[0]?.columnName;if(!r)throw new se(400,{message:"Primary key column name is required"});let n=e.map(i=>i.value);await o.query("BEGIN");try{let i=await Je(a,t),l=0,s=new Set,m=async(f,h,T)=>{let R=await Je(f,t);for(let I of R){let k=T.map((O,Q)=>`$${Q+1}`).join(", "),K=`
205
- SELECT "${I.referencedColumn}" FROM "${f}"
206
- WHERE "${h}" IN (${k})
207
- `,_=(await o.query(K,T)).rows.map(({row:O})=>O[I.referencedColumn]);_.length>0&&await m(I.referencingTable,I.referencingColumn,_)}let D=T.map((I,k)=>`$${k+1}`).join(", "),P=`
208
- DELETE FROM "${f}"
209
- WHERE "${h}" IN (${D})
210
- `,H=await o.query(P,T);l+=H.rowCount??0,s.add(f)};for(let f of i)s.has(f.referencingTable)||await m(f.referencingTable,f.referencingColumn,n);let c=n.map((f,h)=>`$${h+1}`).join(", "),p=`
194
+ `;try{await o.query("BEGIN");let s=await o.query(i,n);return await o.query("COMMIT"),{deletedCount:s.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(s){if(await o.query("ROLLBACK"),s.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await cs(a,e,t)};throw s instanceof me?s:new me(500,{message:`Failed to delete records from "${a}"`})}}async function Qa({tableName:a,primaryKeys:e,db:t}){let o=N(t),r=e[0]?.columnName;if(!r)throw new me(400,{message:"Primary key column name is required"});let n=e.map(l=>l.value);await o.query("BEGIN");try{let l=await rt(a,t),i=0,s=new Set,c=async(T,y,b)=>{let g=await rt(T,t);for(let k of g){let H=b.map((U,Y)=>`$${Y+1}`).join(", "),B=`
195
+ SELECT "${k.referencedColumn}" FROM "${T}"
196
+ WHERE "${y}" IN (${H})
197
+ `,w=(await o.query(B,b)).rows.map(({row:U})=>U[k.referencedColumn]);w.length>0&&await c(k.referencingTable,k.referencingColumn,w)}let S=b.map((k,H)=>`$${H+1}`).join(", "),_=`
198
+ DELETE FROM "${T}"
199
+ WHERE "${y}" IN (${S})
200
+ `,v=await o.query(_,b);i+=v.rowCount??0,s.add(T)};for(let T of l)s.has(T.referencingTable)||await c(T.referencingTable,T.referencingColumn,n);let m=n.map((T,y)=>`$${y+1}`).join(", "),p=`
211
201
  DELETE FROM "${a}"
212
- WHERE "${r}" IN (${c})
202
+ WHERE "${r}" IN (${m})
213
203
  RETURNING *
214
- `,u=await o.query(p,n);return await o.query("COMMIT"),{deletedCount:(u.rowCount??0)+l}}catch(i){throw await o.query("ROLLBACK"),i instanceof se?i:new se(500,{message:`Failed to force delete records from "${a}"`})}}var Ka=d(()=>{"use strict";S()});import{HTTPException as yn}from"hono/http-exception";function bn(a){let e=a.match(/^(?:enum|set)\((.+)\)$/i);return e?.[1]?e[1].split(",").map(t=>t.trim().replace(/^'|'$/g,"")):null}async function X({tableName:a,db:e}){let t=E(e),o=`
204
+ `,u=await o.query(p,n);return await o.query("COMMIT"),{deletedCount:(u.rowCount??0)+i}}catch(l){throw await o.query("ROLLBACK"),l instanceof me?l:new me(500,{message:`Failed to force delete records from "${a}"`})}}var za=d(()=>{"use strict";h()});import{HTTPException as nt}from"hono/http-exception";async function us(a,e){return(await N(e).query(`
205
+ SELECT
206
+ tc.constraint_name,
207
+ tc.table_name as referencing_table,
208
+ kcu.column_name as referencing_column,
209
+ ccu.table_name AS referenced_table,
210
+ ccu.column_name AS referenced_column
211
+ FROM information_schema.table_constraints AS tc
212
+ JOIN information_schema.key_column_usage AS kcu
213
+ ON tc.constraint_name = kcu.constraint_name
214
+ AND tc.table_schema = kcu.table_schema
215
+ JOIN information_schema.constraint_column_usage AS ccu
216
+ ON ccu.constraint_name = tc.constraint_name
217
+ AND ccu.table_schema = tc.table_schema
218
+ WHERE tc.constraint_type = 'FOREIGN KEY'
219
+ AND ccu.table_name = $1
220
+ `,[a])).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 Ga(a,e){let t=await us(a,e);if(t.length===0)return[];let o=[],r=N(e);for(let n of t){let l=`
221
+ SELECT * FROM "${n.referencingTable}"
222
+ LIMIT 100
223
+ `,i=await r.query(l);i.rows.length>0&&o.push({tableName:n.referencingTable,columnName:n.referencingColumn,constraintName:n.constraintName,records:i.rows})}return o}async function ps(a,e){let o=await N(e).query(`SELECT COUNT(*) as count FROM "${a}"`);return Number.parseInt(o.rows[0]?.count??"0",10)}async function Ja(a){let{tableName:e,db:t,cascade:o}=a,r=N(t),n=`
224
+ SELECT EXISTS (
225
+ SELECT 1 FROM information_schema.tables
226
+ WHERE table_name = $1 AND table_schema = 'public'
227
+ ) as exists;
228
+ `,{rows:l}=await r.query(n,[e]);if(!l[0]?.exists)throw new nt(404,{message:`Table "${e}" does not exist`});let i=await ps(e,t);if(!o){let s=await Ga(e,t);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{let c=`DROP TABLE "${e}" ${o?"CASCADE":"RESTRICT"}`;return await r.query(c),{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(s){if(s.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await Ga(e,t)};throw s instanceof nt?s:new nt(500,{message:`Failed to delete table "${e}"`})}}var Xa=d(()=>{"use strict";h()});import{HTTPException as fs}from"hono/http-exception";async function Za({tableName:a,db:e}){let t=N(e),{rows:o}=await t.query(`SELECT * FROM "${a}"`);if(!o||o.length===0)throw new fs(404,{message:`Table "${a}" does not exist or has no data`});return{cols:Object.keys(o[0]),rows:o}}var eo=d(()=>{"use strict";h()});import{HTTPException as ys}from"hono/http-exception";function Ts(a){let e=a.match(/'([^']+)'/g);return!e||e.length===0?null:e.map(t=>t.slice(1,-1))}async function ee({tableName:a,db:e}){let t=await R(e),r=await t.request().input("tableName",a).query(`
229
+ SELECT
230
+ c.COLUMN_NAME AS columnName,
231
+ c.DATA_TYPE AS dataType,
232
+ CASE WHEN c.IS_NULLABLE = 'YES' THEN 1 ELSE 0 END AS isNullable,
233
+ c.COLUMN_DEFAULT AS columnDefault,
234
+ CASE
235
+ WHEN pk.COLUMN_NAME IS NOT NULL THEN 1
236
+ ELSE 0
237
+ END AS isPrimaryKey,
238
+ CASE
239
+ WHEN fk.COLUMN_NAME IS NOT NULL THEN 1
240
+ ELSE 0
241
+ END AS isForeignKey,
242
+ fk.REFERENCED_TABLE_NAME AS referencedTable,
243
+ fk.REFERENCED_COLUMN_NAME AS referencedColumn
244
+ FROM INFORMATION_SCHEMA.COLUMNS c
245
+ LEFT JOIN (
246
+ SELECT
247
+ ku.TABLE_SCHEMA,
248
+ ku.TABLE_NAME,
249
+ ku.COLUMN_NAME
250
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
251
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
252
+ ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
253
+ AND tc.TABLE_SCHEMA = ku.TABLE_SCHEMA
254
+ AND tc.TABLE_NAME = ku.TABLE_NAME
255
+ WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
256
+ ) pk ON c.TABLE_SCHEMA = pk.TABLE_SCHEMA
257
+ AND c.TABLE_NAME = pk.TABLE_NAME
258
+ AND c.COLUMN_NAME = pk.COLUMN_NAME
259
+ LEFT JOIN (
260
+ SELECT
261
+ ku.TABLE_SCHEMA,
262
+ ku.TABLE_NAME,
263
+ ku.COLUMN_NAME,
264
+ ku2.TABLE_NAME AS REFERENCED_TABLE_NAME,
265
+ ku2.COLUMN_NAME AS REFERENCED_COLUMN_NAME
266
+ FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
267
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
268
+ ON rc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
269
+ AND rc.CONSTRAINT_SCHEMA = ku.TABLE_SCHEMA
270
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku2
271
+ ON rc.UNIQUE_CONSTRAINT_NAME = ku2.CONSTRAINT_NAME
272
+ AND rc.UNIQUE_CONSTRAINT_SCHEMA = ku2.TABLE_SCHEMA
273
+ ) fk ON c.TABLE_SCHEMA = fk.TABLE_SCHEMA
274
+ AND c.TABLE_NAME = fk.TABLE_NAME
275
+ AND c.COLUMN_NAME = fk.COLUMN_NAME
276
+ WHERE c.TABLE_CATALOG = DB_NAME()
277
+ AND c.TABLE_NAME = @tableName
278
+ AND c.TABLE_SCHEMA = 'dbo'
279
+ ORDER BY c.ORDINAL_POSITION
280
+ `);if(!r.recordset||r.recordset.length===0)throw new ys(404,{message:`Table "${a}" does not exist`});let n=await t.request().input("tableName",a).query(`
281
+ SELECT
282
+ cc.COLUMN_NAME AS columnName,
283
+ chk.CHECK_CLAUSE AS checkClause
284
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS chk
285
+ JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cc
286
+ ON chk.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
287
+ AND cc.TABLE_SCHEMA = 'dbo'
288
+ WHERE cc.TABLE_NAME = @tableName
289
+ AND cc.TABLE_CATALOG = DB_NAME()
290
+ `),l=new Map;for(let i of n.recordset){let s=Ts(i.checkClause);s&&l.set(i.columnName,s)}return r.recordset.map(i=>{let s=i.dataType,c=l.get(i.columnName)??null;return{columnName:i.columnName,dataType:c?"enum":Jt(s),dataTypeLabel:c?"enum":Xt(s),isNullable:!!i.isNullable,columnDefault:i.columnDefault??null,isPrimaryKey:!!i.isPrimaryKey,isForeignKey:!!i.isForeignKey,referencedTable:i.referencedTable??null,referencedColumn:i.referencedColumn??null,enumValues:c}})}var Te=d(()=>{"use strict";J();h()});import{HTTPException as gs}from"hono/http-exception";async function to({db:a,params:e}){let{tableName:t,data:o}=e,r=await R(a),n=await ee({tableName:t,db:a}),l=new Set(n.filter(b=>b.dataTypeLabel==="boolean").map(b=>b.columnName)),i=await r.request().input("tableName",t).query("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@tableName) AND is_identity = 1"),s=new Set(i.recordset.map(b=>b.name)),c=Object.keys(o).filter(b=>!s.has(b)),m=c.map(b=>{let g=o[b];return l.has(b)&&typeof g=="string"?g==="true"?1:0:g}),p=c.map(b=>`[${b}]`).join(", "),u=c.map((b,g)=>`@param${g}`).join(", "),E=`
291
+ INSERT INTO [${t}] (${p})
292
+ VALUES (${u})
293
+ `,T=r.request();c.forEach((b,g)=>{T.input(`param${g}`,m[g])});let y=await T.query(E);if(y.rowsAffected[0]===0)throw new gs(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:y.rowsAffected[0]??0}}var ao=d(()=>{"use strict";h();Te()});import{HTTPException as Ie}from"hono/http-exception";var oo,ro=d(()=>{"use strict";h();Te();oo=async({tableName:a,records:e,db:t})=>{if(!e||e.length===0)throw new Ie(400,{message:"At least one record is required"});let r=(await R(t)).transaction();try{let n=Object.keys(e[0]),l=n.map(c=>`[${c}]`).join(", "),i=await ee({tableName:a,db:t}),s=new Set(i.filter(c=>c.dataTypeLabel==="boolean").map(c=>c.columnName));await r.begin();for(let c=0;c<e.length;c++){let m=e[c],p=r.request(),u=n.map(y=>{let b=m[y];return s.has(y)&&typeof b=="string"?b==="true"?1:0:b}),E=n.map((y,b)=>`@p${c}_${b}`).join(", ");n.forEach((y,b)=>{p.input(`p${c}_${b}`,u[b])});let T=`
294
+ INSERT INTO [${a}] (${l})
295
+ VALUES (${E})
296
+ `;try{await p.query(T)}catch(y){throw new Ie(500,{message:`Failed to insert record ${c+1}: ${y instanceof Error?y.message:String(y)}`})}}return await r.commit(),{success:!0,message:`Successfully inserted ${e.length} record${e.length!==1?"s":""}`,successCount:e.length,failureCount:0}}catch(n){throw await r.rollback(),n instanceof Ie?n:new Ie(500,{message:`Failed to bulk insert records into "${a}"`})}}});function Cs(a,e){let t=a.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("newid()")?e.toUpperCase().includes("UNIQUEIDENTIFIER")?"NEWID()":null:t.includes("getdate")||t.includes("current_timestamp")?"GETDATE()":a.trim():t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":a.trim()}function Rs(a,e){if(e)return"NVARCHAR(MAX)";let t=a.toLowerCase().trim();return{serial:"INT IDENTITY(1,1)",serial4:"INT IDENTITY(1,1)",bigserial:"BIGINT IDENTITY(1,1)",serial8:"BIGINT IDENTITY(1,1)",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",tinyint:"TINYINT",numeric:"NUMERIC",decimal:"DECIMAL",real:"REAL",float4:"REAL",float:"FLOAT","double precision":"FLOAT",float8:"FLOAT",money:"MONEY",boolean:"BIT",bool:"BIT",text:"NVARCHAR(MAX)",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"UNIQUEIDENTIFIER",json:"NVARCHAR(MAX)",jsonb:"NVARCHAR(MAX)",xml:"XML",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME2","timestamp without time zone":"DATETIME2","timestamp with time zone":"DATETIMEOFFSET",timestamptz:"DATETIMEOFFSET",interval:"VARCHAR(255)",bytea:"VARBINARY(MAX)",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)"}[t]||a.toUpperCase()}async function no({tableData:a,db:e}){let{tableName:t,fields:o,foreignKeys:r}=a,n=await R(e),l=o.map(u=>{let E=Rs(u.columnType,u.isArray??!1),T=`[${u.columnName}] ${E}`;if(!u.isNullable&&!u.isPrimaryKey&&(T+=" NOT NULL"),u.defaultValue&&!E.includes("IDENTITY")){let y=Cs(u.defaultValue,E);y!==null&&(T+=` DEFAULT ${y}`)}return T}),i=o.filter(u=>u.isPrimaryKey),s=[];if(i.length>0){let u=i.map(E=>`[${E.columnName}]`).join(", ");s.push(`PRIMARY KEY (${u})`)}for(let u of o)u.isUnique&&!u.isPrimaryKey&&s.push(`UNIQUE ([${u.columnName}])`);let c=r?.map(u=>`CONSTRAINT [${`FK_${t}_${u.columnName}`}] FOREIGN KEY ([${u.columnName}]) REFERENCES [${u.referencedTable}] ([${u.referencedColumn}]) ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)||[],m=[...l,...s,...c],p=`
297
+ CREATE TABLE [${t}] (
298
+ ${m.join(`,
299
+ `)}
300
+ )
301
+ `;await n.request().query(p)}var so=d(()=>{"use strict";h()});import{HTTPException as st}from"hono/http-exception";async function io(){let e=await(await R()).request().query(`
302
+ SELECT
303
+ d.name AS name,
304
+ CAST(
305
+ ROUND(
306
+ CAST(SUM(mf.size) * 8.0 / 1024 AS DECIMAL(10,2)),
307
+ 2
308
+ ) AS VARCHAR(20)
309
+ ) + ' MB' AS size,
310
+ SUSER_SNAME(d.owner_sid) AS owner,
311
+ d.collation_name AS encoding
312
+ FROM sys.databases d
313
+ JOIN sys.master_files mf ON d.database_id = mf.database_id
314
+ WHERE d.database_id > 4 -- Exclude system databases
315
+ GROUP BY d.name, d.owner_sid, d.collation_name
316
+ ORDER BY d.name
317
+ `);if(!e.recordset[0])throw new st(500,{message:"No databases returned from server"});return e.recordset}async function lo(){let e=await(await R()).request().query("SELECT DB_NAME() AS db");if(!e.recordset[0])throw new st(500,{message:"No current database returned from server"});return e.recordset[0]}async function co(){let e=await(await R()).request().query(`
318
+ SELECT
319
+ @@VERSION AS version,
320
+ DB_NAME() AS database_name,
321
+ SUSER_NAME() AS [user],
322
+ @@SERVERNAME AS host,
323
+ (SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS port,
324
+ @@MAX_CONNECTIONS AS max_connections,
325
+ (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS active_connections
326
+ `);if(!e.recordset[0])throw new st(500,{message:"No connection information returned from server"});let t=e.recordset[0],o=ce();return{host:String(t.host||o.host),port:Number(t.port||o.port),user:String(t.user),database:String(t.database_name??""),version:String(t.version),active_connections:Number(t.active_connections??0),max_connections:Number(t.max_connections)}}var mo=d(()=>{"use strict";h();Pe()});import{HTTPException as uo}from"hono/http-exception";async function po(a){let{tableName:e,columnName:t,db:o}=a,r=await R(o),n=await r.request().input("tableName",e).query(`
327
+ SELECT COUNT(*) as cnt
328
+ FROM INFORMATION_SCHEMA.TABLES
329
+ WHERE TABLE_CATALOG = DB_NAME()
330
+ AND TABLE_NAME = @tableName
331
+ AND TABLE_SCHEMA = 'dbo'
332
+ `);if(!(Number(n.recordset[0]?.cnt??0)>0))throw new uo(404,{message:`Table "${e}" does not exist`});let i=await r.request().input("tableName",e).input("columnName",t).query(`
333
+ SELECT COUNT(*) as cnt
334
+ FROM INFORMATION_SCHEMA.COLUMNS
335
+ WHERE TABLE_CATALOG = DB_NAME()
336
+ AND TABLE_NAME = @tableName
337
+ AND COLUMN_NAME = @columnName
338
+ AND TABLE_SCHEMA = 'dbo'
339
+ `);if(!(Number(i.recordset[0]?.cnt??0)>0))throw new uo(404,{message:`Column "${t}" does not exist in table "${e}"`});return{deletedCount:(await r.request().query(`ALTER TABLE [${e}] DROP COLUMN [${t}]`)).rowsAffected[0]??1}}var fo=d(()=>{"use strict";h()});import{HTTPException as ue}from"hono/http-exception";async function it(a,e){return(await(await R(e)).request().input("tableName",a).query(`
340
+ SELECT
341
+ fk.name AS constraint_name,
342
+ OBJECT_NAME(fk.parent_object_id) AS referencing_table,
343
+ COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS referencing_column,
344
+ OBJECT_NAME(fk.referenced_object_id) AS referenced_table,
345
+ COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS referenced_column
346
+ FROM sys.foreign_keys fk
347
+ INNER JOIN sys.foreign_key_columns fkc
348
+ ON fk.object_id = fkc.constraint_object_id
349
+ WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
350
+ `)).recordset.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function Ds(a,e,t){let o=await it(a,t);if(o.length===0)return[];let r=[],n=await R(t),l=e.map(s=>s.value),i=new Map;for(let s of o){let c=`${s.referencingTable}.${s.referencingColumn}`;i.has(c)||i.set(c,[]),i.get(c)?.push(s)}for(let[s,c]of i){let m=c[0];if(!m||!e.find(y=>y.columnName===m.referencedColumn))continue;let u=n.request();l.forEach((y,b)=>{u.input(`pk${b}`,y)});let E=l.map((y,b)=>`@pk${b}`).join(", "),T=await u.query(`
351
+ SELECT TOP 100 * FROM [${m.referencingTable}]
352
+ WHERE [${m.referencingColumn}] IN (${E})
353
+ `);T.recordset.length>0&&r.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:T.recordset})}return r}async function bo({tableName:a,primaryKeys:e,db:t}){let o=await R(t),r=e[0]?.columnName;if(!r)throw new ue(400,{message:"Primary key column name is required"});let n=e.map(i=>i.value),l=o.transaction();await l.begin();try{let i=l.request();n.forEach((m,p)=>{i.input(`pk${p}`,m)});let s=n.map((m,p)=>`@pk${p}`).join(", "),c=await i.query(`DELETE FROM [${a}] WHERE [${r}] IN (${s})`);return await l.commit(),{deletedCount:c.rowsAffected[0]??0,fkViolation:!1,relatedRecords:[]}}catch(i){if(await l.rollback(),i.number===ws)return{deletedCount:0,fkViolation:!0,relatedRecords:await Ds(a,e,t)};throw i instanceof ue?i:new ue(500,{message:`Failed to delete records from "${a}"`})}}async function yo({tableName:a,primaryKeys:e,db:t}){let o=await R(t),r=e[0]?.columnName;if(!r)throw new ue(400,{message:"Primary key column name is required"});let n=e.map(i=>i.value),l=o.transaction();await l.begin();try{let i=await it(a,t),s=0,c=new Set,m=new Set,p=async(y,b,g,S)=>{let _=`${y}.${b}`;if(S.has(_))return;S.add(_);let v=await it(y,t);for(let M of v){let w=l.request();g.forEach((D,q)=>{w.input(`val${q}`,D)});let U=g.map((D,q)=>`@val${q}`).join(", "),I=(await w.query(`
354
+ SELECT [${M.referencedColumn}] FROM [${y}]
355
+ WHERE [${b}] IN (${U})
356
+ `)).recordset.map(D=>D[M.referencedColumn]);I.length>0&&await p(M.referencingTable,M.referencingColumn,I,S)}let k=l.request();g.forEach((M,w)=>{k.input(`delVal${w}`,M)});let H=g.map((M,w)=>`@delVal${w}`).join(", "),B=await k.query(`DELETE FROM [${y}] WHERE [${b}] IN (${H})`);s+=B.rowsAffected[0]??0,c.add(y)};for(let y of i)c.has(y.referencingTable)||await p(y.referencingTable,y.referencingColumn,n,m);let u=l.request();n.forEach((y,b)=>{u.input(`mainPk${b}`,y)});let E=n.map((y,b)=>`@mainPk${b}`).join(", "),T=await u.query(`DELETE FROM [${a}] WHERE [${r}] IN (${E})`);return await l.commit(),{deletedCount:(T.rowsAffected[0]??0)+s}}catch(i){throw await l.rollback(),i instanceof ue?i:new ue(500,{message:`Failed to force delete records from "${a}"`})}}var ws,To=d(()=>{"use strict";h();ws=547});import{HTTPException as lt}from"hono/http-exception";async function go(a,e){return(await(await R(e)).request().input("tableName",a).query(`
357
+ SELECT
358
+ fk.name AS constraint_name,
359
+ OBJECT_NAME(fk.parent_object_id) AS referencing_table,
360
+ COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS referencing_column,
361
+ OBJECT_NAME(fk.referenced_object_id) AS referenced_table,
362
+ COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS referenced_column
363
+ FROM sys.foreign_keys fk
364
+ INNER JOIN sys.foreign_key_columns fkc
365
+ ON fk.object_id = fkc.constraint_object_id
366
+ WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
367
+ `)).recordset.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function Eo(a,e){let t=await go(a,e);if(t.length===0)return[];let o=[],r=await R(e);for(let n of t){let l=await r.request().query(`SELECT TOP 100 * FROM [${n.referencingTable}]`);l.recordset.length>0&&o.push({tableName:n.referencingTable,columnName:n.referencingColumn,constraintName:n.constraintName,records:l.recordset})}return o}async function Ms(a,e){let o=await(await R(e)).request().query(`SELECT COUNT(*) as count FROM [${a}]`);return Number(o.recordset[0]?.count??0)}async function ho(a){let{tableName:e,db:t,cascade:o}=a,r=await R(t),n=await r.request().input("tableName",e).query(`
368
+ SELECT COUNT(*) as cnt
369
+ FROM INFORMATION_SCHEMA.TABLES
370
+ WHERE TABLE_CATALOG = DB_NAME()
371
+ AND TABLE_NAME = @tableName
372
+ AND TABLE_SCHEMA = 'dbo'
373
+ `);if(!(Number(n.recordset[0]?.cnt??0)>0))throw new lt(404,{message:`Table "${e}" does not exist`});let i=await Ms(e,t);if(!o){let s=await Eo(e,t);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{if(o){let s=await go(e,t);for(let c of s)await r.request().query(`ALTER TABLE [${c.referencingTable}] DROP CONSTRAINT [${c.constraintName}]`)}return await r.request().query(`DROP TABLE [${e}]`),{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(s){if(s.number===xs)return{deletedCount:0,fkViolation:!0,relatedRecords:await Eo(e,t)};throw s instanceof lt?s:new lt(500,{message:`Failed to delete table "${e}"`})}}var xs,No=d(()=>{"use strict";h();xs=3726});import{HTTPException as Ps}from"hono/http-exception";async function Co({tableName:a,db:e}){let o=await(await R(e)).request().query(`SELECT * FROM [${a}]`);if(!o.recordset||o.recordset.length===0)throw new Ps(404,{message:`Table "${a}" does not exist or has no data`});return{cols:Object.keys(o.recordset[0]),rows:o.recordset}}var Ro=d(()=>{"use strict";h()});import{HTTPException as qs}from"hono/http-exception";var Ao,So=d(()=>{"use strict";h();Ao=async({query:a,db:e})=>{let t=await R(e);if(!a||!a.trim())throw new qs(400,{message:"Query is required"});let o=a.trim().replace(/;+$/,""),r=performance.now(),n=await t.request().query(o),l=performance.now()-r;if(n.recordset){let i=n.recordset;return{columns:n.recordset.columns?Object.keys(n.recordset.columns):Object.keys(i[0]??{}),rows:i,rowCount:i.length,duration:l,message:i.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:n.rowsAffected[0]??0,duration:l,message:`OK \u2014 ${n.rowsAffected[0]??0} row(s) affected`}}});async function _o(a){let e=await R(a),o=await e.request().query(`
374
+ SELECT table_name AS tableName
375
+ FROM information_schema.tables
376
+ WHERE table_catalog = DB_NAME()
377
+ AND table_type = 'BASE TABLE'
378
+ AND table_schema = 'dbo'
379
+ ORDER BY table_name
380
+ `);return!o.recordset||o.recordset.length===0?[]:await Promise.all(o.recordset.map(async n=>{let i=(await e.request().query(`SELECT COUNT(*) as count FROM [${n.tableName}]`)).recordset[0];return{tableName:n.tableName,rowCount:i?.count??0}}))}var wo=d(()=>{"use strict";h()});import{HTTPException as Do}from"hono/http-exception";async function Lo({tableName:a,db:e}){let t=await R(e),o=await t.request().input("tableName",a).query(`
381
+ SELECT COUNT(*) as cnt
382
+ FROM INFORMATION_SCHEMA.TABLES
383
+ WHERE TABLE_CATALOG = DB_NAME()
384
+ AND TABLE_NAME = @tableName
385
+ AND TABLE_SCHEMA = 'dbo'
386
+ `);if(!(Number(o.recordset[0]?.cnt??0)>0))throw new Do(404,{message:`Table "${a}" does not exist`});let n=await t.request().input("tableName",a).query(`
387
+ SELECT
388
+ c.COLUMN_NAME,
389
+ c.DATA_TYPE,
390
+ c.CHARACTER_MAXIMUM_LENGTH,
391
+ c.NUMERIC_PRECISION,
392
+ c.NUMERIC_SCALE,
393
+ c.IS_NULLABLE,
394
+ c.COLUMN_DEFAULT,
395
+ CASE
396
+ WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRIMARY KEY'
397
+ WHEN fk.COLUMN_NAME IS NOT NULL THEN 'FOREIGN KEY'
398
+ ELSE ''
399
+ END AS KEY_TYPE,
400
+ fk.REFERENCED_TABLE_NAME,
401
+ fk.REFERENCED_COLUMN_NAME
402
+ FROM INFORMATION_SCHEMA.COLUMNS c
403
+ LEFT JOIN (
404
+ SELECT ku.TABLE_SCHEMA, ku.TABLE_NAME, ku.COLUMN_NAME
405
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
406
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
407
+ ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
408
+ WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
409
+ ) pk ON c.TABLE_SCHEMA = pk.TABLE_SCHEMA
410
+ AND c.TABLE_NAME = pk.TABLE_NAME
411
+ AND c.COLUMN_NAME = pk.COLUMN_NAME
412
+ LEFT JOIN (
413
+ SELECT
414
+ ku.TABLE_SCHEMA,
415
+ ku.TABLE_NAME,
416
+ ku.COLUMN_NAME,
417
+ ku2.TABLE_NAME AS REFERENCED_TABLE_NAME,
418
+ ku2.COLUMN_NAME AS REFERENCED_COLUMN_NAME
419
+ FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
420
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
421
+ ON rc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
422
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku2
423
+ ON rc.UNIQUE_CONSTRAINT_NAME = ku2.CONSTRAINT_NAME
424
+ ) fk ON c.TABLE_SCHEMA = fk.TABLE_SCHEMA
425
+ AND c.TABLE_NAME = fk.TABLE_NAME
426
+ AND c.COLUMN_NAME = fk.COLUMN_NAME
427
+ WHERE c.TABLE_CATALOG = DB_NAME()
428
+ AND c.TABLE_NAME = @tableName
429
+ AND c.TABLE_SCHEMA = 'dbo'
430
+ ORDER BY c.ORDINAL_POSITION
431
+ `);if(!n.recordset||n.recordset.length===0)throw new Do(500,{message:`Failed to retrieve schema for table "${a}"`});let l=n.recordset.map(s=>{let c=` [${s.COLUMN_NAME}] ${s.DATA_TYPE}`;return s.CHARACTER_MAXIMUM_LENGTH?c+=s.CHARACTER_MAXIMUM_LENGTH===-1?"(MAX)":`(${s.CHARACTER_MAXIMUM_LENGTH})`:s.NUMERIC_PRECISION&&(s.NUMERIC_SCALE?c+=`(${s.NUMERIC_PRECISION},${s.NUMERIC_SCALE})`:c+=`(${s.NUMERIC_PRECISION})`),c+=s.IS_NULLABLE==="YES"?" NULL":" NOT NULL",s.COLUMN_DEFAULT&&(c+=` DEFAULT ${s.COLUMN_DEFAULT}`),c});return`CREATE TABLE [${a}] (
432
+ ${l.join(`,
433
+ `)}
434
+ )`}var xo=d(()=>{"use strict";h()});var Mo,Oo=d(()=>{"use strict";h();Mo=async({tableName:a,cursor:e="",limit:t=50,direction:o="asc",sort:r=[],order:n="asc",filters:l=[],db:i})=>{let s=await R(i),c=e?Number.parseInt(e,10):0,m=c*t,p="";Array.isArray(r)&&r.length>0?p=`ORDER BY ${r.map(v=>`[${v.columnName}] ${v.direction.toUpperCase()}`).join(", ")}`:typeof r=="string"&&r?p=`ORDER BY [${r}] ${n.toUpperCase()}`:p="ORDER BY (SELECT NULL)";let u=await s.request().query(`SELECT COUNT(*) as total FROM [${a}]`),E=Number(u.recordset[0]?.total??0),y=(await s.request().query(`
435
+ SELECT *
436
+ FROM [${a}]
437
+ ${p}
438
+ OFFSET ${m} ROWS
439
+ FETCH NEXT ${t+1} ROWS ONLY
440
+ `)).recordset,b=y.length>t;b&&(y=y.slice(0,t));let g=b?String(c+1):null,S=c>0?String(c-1):null;return{data:y,meta:{limit:t,total:E,hasNextPage:b,hasPreviousPage:c>0,nextCursor:g,prevCursor:S}}}});import{HTTPException as qe}from"hono/http-exception";async function Po({params:a,db:e}){let{tableName:t,updates:o,primaryKey:r}=a,n=await R(e),l=await ee({tableName:t,db:e}),i=new Set(l.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName)),s=new Map;for(let m of o){let p=m.rowData[r];if(p==null)throw new qe(400,{message:`Primary key "${r}" not found in row data.`});s.has(p)||s.set(p,[]),s.get(p)?.push({columnName:m.columnName,value:m.value,rowData:m.rowData})}let c=n.transaction();await c.begin();try{let m=0;for(let[p,u]of s.entries()){let E=u.map((g,S)=>`[${g.columnName}] = @value${S}`),T=c.request();u.forEach((g,S)=>{let _=g.value;_!==null&&typeof _=="object"&&(_=JSON.stringify(_)),i.has(g.columnName)&&typeof _=="string"&&(_=_==="true"?1:0),T.input(`value${S}`,_)}),T.input("pkValue",p);let y=`
441
+ UPDATE [${t}]
442
+ SET ${E.join(", ")}
443
+ WHERE [${r}] = @pkValue
444
+ `,b=await T.query(y);if(b.rowsAffected[0]===0)throw new qe(404,{message:`Record with ${r} = ${p} not found in table "${t}"`});m+=b.rowsAffected[0]??0}return await c.commit(),{updatedCount:m}}catch(m){throw await c.rollback(),m instanceof qe?m:new qe(500,{message:`Failed to update records in "${t}"`})}}var Io=d(()=>{"use strict";h();Te()});import{HTTPException as Hs}from"hono/http-exception";function Bs(a){let e=a.match(/^(?:enum|set)\((.+)\)$/i);return e?.[1]?e[1].split(",").map(t=>t.trim().replace(/^'|'$/g,"")):null}async function te({tableName:a,db:e}){let t=C(e),o=`
215
445
  SELECT
216
446
  c.COLUMN_NAME AS columnName,
217
447
  c.DATA_TYPE AS dataType,
@@ -231,13 +461,47 @@ This will return the 5 customers with the highest total order value. You might a
231
461
  WHERE c.TABLE_SCHEMA = DATABASE()
232
462
  AND c.TABLE_NAME = ?
233
463
  ORDER BY c.ORDINAL_POSITION
234
- `,[r]=await t.execute(o,[a]);if(!r||r.length===0)throw new yn(404,{message:`Table "${a}" does not exist`});return r.map(n=>{let i=n.dataType,l=n.columnType,m=i==="enum"||i==="set"?bn(l):null;return{columnName:n.columnName,dataType:kt(i,l),dataTypeLabel:Ut(i,l),isNullable:!!n.isNullable,columnDefault:n.columnDefault??null,isPrimaryKey:!!n.isPrimaryKey,isForeignKey:!!n.isForeignKey,referencedTable:n.referencedTable??null,referencedColumn:n.referencedColumn??null,enumValues:m}})}var pe=d(()=>{"use strict";J();S()});import{HTTPException as Tn}from"hono/http-exception";async function Wa({db:a,params:e}){let{tableName:t,data:o}=e,r=E(a),n=await X({tableName:t,db:a}),i=new Set(n.filter(b=>b.dataTypeLabel==="boolean").map(b=>b.columnName)),l=Object.keys(o),s=Object.values(o).map((b,f)=>{let h=l[f];return i.has(h)&&typeof b=="string"?b==="true"?1:0:b}),m=l.map(()=>"?").join(", "),c=l.map(b=>`\`${b}\``).join(", "),p=`
235
- INSERT INTO \`${t}\` (${c})
236
- VALUES (${m})
237
- `,[u]=await r.execute(p,s);if(u.affectedRows===0)throw new Tn(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:u.affectedRows}}var Va=d(()=>{"use strict";S();pe()});import{HTTPException as Ae}from"hono/http-exception";var za,Ya=d(()=>{"use strict";S();pe();za=async({tableName:a,records:e,db:t})=>{if(!e||e.length===0)throw new Ae(400,{message:"At least one record is required"});let r=await E(t).getConnection();try{let n=Object.keys(e[0]),i=n.map(m=>`\`${m}\``).join(", "),l=await X({tableName:a,db:t}),s=new Set(l.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName));await r.beginTransaction();for(let m=0;m<e.length;m++){let c=e[m],p=n.map(f=>{let h=c[f];return s.has(f)&&typeof h=="string"?h==="true"?1:0:h}),u=n.map(()=>"?").join(", "),b=`
238
- INSERT INTO \`${a}\` (${i})
464
+ `,[r]=await t.execute(o,[a]);if(!r||r.length===0)throw new Hs(404,{message:`Table "${a}" does not exist`});return r.map(n=>{let l=n.dataType,i=n.columnType,c=l==="enum"||l==="set"?Bs(i):null;return{columnName:n.columnName,dataType:zt(l,i),dataTypeLabel:Gt(l,i),isNullable:!!n.isNullable,columnDefault:n.columnDefault??null,isPrimaryKey:!!n.isPrimaryKey,isForeignKey:!!n.isForeignKey,referencedTable:n.referencedTable??null,referencedColumn:n.referencedColumn??null,enumValues:c}})}var Ee=d(()=>{"use strict";J();h()});import{HTTPException as Ks}from"hono/http-exception";async function qo({db:a,params:e}){let{tableName:t,data:o}=e,r=C(a),n=await te({tableName:t,db:a}),l=new Set(n.filter(E=>E.dataTypeLabel==="boolean").map(E=>E.columnName)),i=Object.keys(o),s=Object.values(o).map((E,T)=>{let y=i[T];return l.has(y)&&typeof E=="string"?E==="true"?1:0:E}),c=i.map(()=>"?").join(", "),m=i.map(E=>`\`${E}\``).join(", "),p=`
465
+ INSERT INTO \`${t}\` (${m})
466
+ VALUES (${c})
467
+ `,[u]=await r.execute(p,s);if(u.affectedRows===0)throw new Ks(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:u.affectedRows}}var $o=d(()=>{"use strict";h();Ee()});import{HTTPException as $e}from"hono/http-exception";var vo,ko=d(()=>{"use strict";h();Ee();vo=async({tableName:a,records:e,db:t})=>{if(!e||e.length===0)throw new $e(400,{message:"At least one record is required"});let r=await C(t).getConnection();try{let n=Object.keys(e[0]),l=n.map(c=>`\`${c}\``).join(", "),i=await te({tableName:a,db:t}),s=new Set(i.filter(c=>c.dataTypeLabel==="boolean").map(c=>c.columnName));await r.beginTransaction();for(let c=0;c<e.length;c++){let m=e[c],p=n.map(T=>{let y=m[T];return s.has(T)&&typeof y=="string"?y==="true"?1:0:y}),u=n.map(()=>"?").join(", "),E=`
468
+ INSERT INTO \`${a}\` (${l})
239
469
  VALUES (${u})
240
- `;try{await r.execute(b,p)}catch(f){throw new Ae(500,{message:`Failed to insert record ${m+1}: ${f instanceof Error?f.message:String(f)}`})}}return await r.commit(),{success:!0,message:`Successfully inserted ${e.length} record${e.length!==1?"s":""}`,successCount:e.length,failureCount:0}}catch(n){throw await r.rollback(),n instanceof Ae?n:new Ae(500,{message:`Failed to bulk insert records into "${a}"`})}finally{r.release()}}});import{HTTPException as ie}from"hono/http-exception";async function Xe(a,e){let t=E(e),[o]=await t.execute(`SELECT
470
+ `;try{await r.execute(E,p)}catch(T){throw new $e(500,{message:`Failed to insert record ${c+1}: ${T instanceof Error?T.message:String(T)}`})}}return await r.commit(),{success:!0,message:`Successfully inserted ${e.length} record${e.length!==1?"s":""}`,successCount:e.length,failureCount:0}}catch(n){throw await r.rollback(),n instanceof $e?n:new $e(500,{message:`Failed to bulk insert records into "${a}"`})}finally{r.release()}}});function Ys(a,e){if(!a?.trim())return null;let t=a.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("uuid()")?!e.toUpperCase().includes("CHAR")&&!e.toUpperCase().includes("TEXT")?null:"(UUID())":t.includes("current_timestamp")||t.includes("now()")?"(CURRENT_TIMESTAMP)":t.includes("current_date")?"(CURRENT_DATE)":`(${a.trim()})`:t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":a.trim()}function Qs(a,e){if(e)return"JSON";let t=a.toLowerCase().trim();return{serial:"INT AUTO_INCREMENT",serial4:"INT AUTO_INCREMENT",bigserial:"BIGINT AUTO_INCREMENT",serial8:"BIGINT AUTO_INCREMENT",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",numeric:"DECIMAL",decimal:"DECIMAL",real:"FLOAT",float4:"FLOAT",float:"FLOAT","double precision":"DOUBLE",float8:"DOUBLE",money:"DECIMAL(19, 4)",boolean:"TINYINT(1)",bool:"TINYINT(1)",text:"LONGTEXT",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"CHAR(36)",json:"JSON",jsonb:"JSON",xml:"LONGTEXT",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME","timestamp without time zone":"DATETIME","timestamp with time zone":"DATETIME",timestamptz:"DATETIME",interval:"VARCHAR(255)",bytea:"LONGBLOB",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)",point:"POINT",line:"LINESTRING",polygon:"POLYGON"}[t]||a.toUpperCase()}function pe(a,e={}){let t=Qs(a.columnType,a.isArray??!1),o=`\`${a.columnName}\` ${t}`;if(!a.isNullable&&!a.isPrimaryKey&&(o+=" NOT NULL"),a.defaultValue&&!t.includes("AUTO_INCREMENT")){let r=Ys(a.defaultValue,t);r!==null&&(o+=` DEFAULT ${r}`)}return(a.isIdentity||e.preserveAutoIncrement)&&!t.includes("AUTO_INCREMENT")&&(o+=" AUTO_INCREMENT"),e.includeUnique&&a.isUnique&&!a.isPrimaryKey&&(o+=" UNIQUE"),e.includePrimaryKey&&a.isPrimaryKey&&(o+=" PRIMARY KEY"),o}var ve=d(()=>{"use strict"});async function Uo({tableData:a,db:e}){let{tableName:t,fields:o,foreignKeys:r}=a,n=C(e),l=o.map(u=>pe(u)),i=o.filter(u=>u.isPrimaryKey),s=[];if(i.length>0){let u=i.map(E=>`\`${E.columnName}\``).join(", ");s.push(`PRIMARY KEY (${u})`)}for(let u of o)u.isUnique&&!u.isPrimaryKey&&s.push(`UNIQUE KEY \`uq_${t}_${u.columnName}\` (\`${u.columnName}\`)`);let c=r?.map(u=>`CONSTRAINT \`${`fk_${t}_${u.columnName}_${u.referencedTable}_${u.referencedColumn}`}\` FOREIGN KEY (\`${u.columnName}\`) REFERENCES \`${u.referencedTable}\` (\`${u.referencedColumn}\`) ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)||[],m=[...l,...s,...c],p=`
471
+ CREATE TABLE \`${t}\` (
472
+ ${m.join(`,
473
+ `)}
474
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
475
+ `;await n.execute(p)}var Fo=d(()=>{"use strict";h();ve()});import{HTTPException as ct}from"hono/http-exception";async function Ho(){let a=C(),[e]=await a.execute(`
476
+ SELECT
477
+ s.SCHEMA_NAME AS name,
478
+ CONCAT(
479
+ ROUND(
480
+ COALESCE(SUM(t.data_length + t.index_length), 0) / 1024 / 1024,
481
+ 2
482
+ ),
483
+ ' MB'
484
+ ) AS size,
485
+ CURRENT_USER() AS owner,
486
+ s.DEFAULT_CHARACTER_SET_NAME AS encoding
487
+ FROM information_schema.SCHEMATA s
488
+ LEFT JOIN information_schema.TABLES t
489
+ ON t.TABLE_SCHEMA = s.SCHEMA_NAME
490
+ GROUP BY s.SCHEMA_NAME, s.DEFAULT_CHARACTER_SET_NAME
491
+ ORDER BY s.SCHEMA_NAME
492
+ `);if(!e[0])throw new ct(500,{message:"No databases returned from server"});return e}async function Bo(){let a=C(),[e]=await a.execute("SELECT DATABASE() AS db");if(!e[0])throw new ct(500,{message:"No current database returned from server"});return e[0]}async function jo(){let a=C(),[e]=await a.execute(`
493
+ SELECT
494
+ VERSION() AS version,
495
+ DATABASE() AS database_name,
496
+ CURRENT_USER() AS user,
497
+ @@hostname AS host,
498
+ @@port AS port,
499
+ @@max_connections AS max_connections
500
+ `),[t]=await a.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!e[0])throw new ct(500,{message:"No connection information returned from server"});let o=e[0],r=Number(t[0]?.cnt??0),n=ce();return{host:String(o.host||n.host),port:Number(o.port||n.port),user:String(o.user),database:String(o.database_name??""),version:String(o.version),active_connections:r,max_connections:Number(o.max_connections)}}var Ko=d(()=>{"use strict";h();Pe()});import{HTTPException as Vo}from"hono/http-exception";async function Wo(a){let{tableName:e,columnName:t,db:o}=a,r=C(o),[n]=await r.execute(`SELECT COUNT(*) as cnt
501
+ FROM information_schema.TABLES
502
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(n[0]?.cnt??0)>0))throw new Vo(404,{message:`Table "${e}" does not exist`});let[i]=await r.execute(`SELECT COUNT(*) as cnt
503
+ FROM information_schema.COLUMNS
504
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,t]);if(!(Number(i[0]?.cnt??0)>0))throw new Vo(404,{message:`Column "${t}" does not exist in table "${e}"`});let[c]=await r.execute(`ALTER TABLE \`${e}\` DROP COLUMN \`${t}\``);return{deletedCount:c.affectedRows}}var Yo=d(()=>{"use strict";h()});import{HTTPException as de}from"hono/http-exception";async function mt(a,e){let t=C(e),[o]=await t.execute(`SELECT
241
505
  kcu.CONSTRAINT_NAME AS constraint_name,
242
506
  kcu.TABLE_NAME AS referencing_table,
243
507
  kcu.COLUMN_NAME AS referencing_column,
@@ -250,96 +514,10 @@ This will return the 5 customers with the highest total order value. You might a
250
514
  AND kcu.TABLE_NAME = tc.TABLE_NAME
251
515
  WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
252
516
  AND kcu.TABLE_SCHEMA = DATABASE()
253
- AND kcu.REFERENCED_TABLE_NAME = ?`,[a]);return o.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function gn(a,e,t){let o=await Xe(a,t);if(o.length===0)return[];let r=[],n=E(t),i=e.map(s=>s.value),l=new Map;for(let s of o){let m=`${s.referencingTable}.${s.referencingColumn}`;l.has(m)||l.set(m,[]),l.get(m)?.push(s)}for(let[s,m]of l){let c=m[0];if(!c||!e.find(f=>f.columnName===c.referencedColumn))continue;let u=i.map(()=>"?").join(", "),[b]=await n.execute(`SELECT * FROM \`${c.referencingTable}\`
254
- WHERE \`${c.referencingColumn}\` IN (${u})
255
- LIMIT 100`,i);b.length>0&&r.push({tableName:c.referencingTable,columnName:c.referencingColumn,constraintName:c.constraintName,records:b})}return r}async function Qa({tableName:a,primaryKeys:e,db:t}){let o=E(t),r=e[0]?.columnName;if(!r)throw new ie(400,{message:"Primary key column name is required"});let n=e.map(s=>s.value),i=n.map(()=>"?").join(", "),l=await o.getConnection();await l.beginTransaction();try{let[s]=await l.execute(`DELETE FROM \`${a}\` WHERE \`${r}\` IN (${i})`,n);return await l.commit(),{deletedCount:s.affectedRows,fkViolation:!1,relatedRecords:[]}}catch(s){if(await l.rollback(),s.errno===hn)return{deletedCount:0,fkViolation:!0,relatedRecords:await gn(a,e,t)};throw s instanceof ie?s:new ie(500,{message:`Failed to delete records from "${a}"`})}finally{l.release()}}async function Ga({tableName:a,primaryKeys:e,db:t}){let o=E(t),r=e[0]?.columnName;if(!r)throw new ie(400,{message:"Primary key column name is required"});let n=e.map(l=>l.value),i=await o.getConnection();await i.beginTransaction();try{await i.execute("SET FOREIGN_KEY_CHECKS = 0");let l=await Xe(a,t),s=0,m=new Set,c=new Set,p=async(f,h,T,R)=>{let D=`${f}.${h}`;if(R.has(D))return;R.add(D);let P=await Xe(f,t);for(let k of P){let K=T.map(()=>"?").join(", "),[q]=await i.execute(`SELECT \`${k.referencedColumn}\` FROM \`${f}\`
256
- WHERE \`${h}\` IN (${K})`,T),_=q.map(O=>O[k.referencedColumn]);_.length>0&&await p(k.referencingTable,k.referencingColumn,_,R)}let H=T.map(()=>"?").join(", "),[I]=await i.execute(`DELETE FROM \`${f}\` WHERE \`${h}\` IN (${H})`,T);s+=I.affectedRows,m.add(f)};for(let f of l)m.has(f.referencingTable)||await p(f.referencingTable,f.referencingColumn,n,c);let u=n.map(()=>"?").join(", "),[b]=await i.execute(`DELETE FROM \`${a}\` WHERE \`${r}\` IN (${u})`,n);return await i.execute("SET FOREIGN_KEY_CHECKS = 1"),await i.commit(),{deletedCount:b.affectedRows+s}}catch(l){throw await i.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await i.rollback(),l instanceof ie?l:new ie(500,{message:`Failed to force delete records from "${a}"`})}finally{i.release()}}var hn,Ja=d(()=>{"use strict";S();hn=1451});import{HTTPException as De}from"hono/http-exception";async function Xa({params:a,db:e}){let{tableName:t,updates:o,primaryKey:r}=a,n=E(e),i=await X({tableName:t,db:e}),l=new Set(i.filter(c=>c.dataTypeLabel==="boolean").map(c=>c.columnName)),s=new Map;for(let c of o){let p=c.rowData[r];if(p==null)throw new De(400,{message:`Primary key "${r}" not found in row data.`});s.has(p)||s.set(p,[]),s.get(p)?.push({columnName:c.columnName,value:c.value,rowData:c.rowData})}let m=await n.getConnection();await m.beginTransaction();try{let c=0;for(let[p,u]of s.entries()){let b=u.map(R=>`\`${R.columnName}\` = ?`),f=u.map(R=>R.value!==null&&typeof R.value=="object"?JSON.stringify(R.value):l.has(R.columnName)&&typeof R.value=="string"?R.value==="true"?1:0:R.value);f.push(p);let h=`
257
- UPDATE \`${t}\`
258
- SET ${b.join(", ")}
259
- WHERE \`${r}\` = ?
260
- `,[T]=await m.execute(h,f);if(T.affectedRows===0)throw new De(404,{message:`Record with ${r} = ${p} not found in table "${t}"`});c+=T.affectedRows}return await m.commit(),{updatedCount:c}}catch(c){throw await m.rollback(),c instanceof De?c:new De(500,{message:`Failed to update records in "${t}"`})}finally{m.release()}}var Za=d(()=>{"use strict";S();pe()});import{HTTPException as _e}from"hono/http-exception";async function eo({params:a,db:e}){let{tableName:t,updates:o,primaryKey:r}=a,n=g(e),i=new Map;for(let l of o){let s=l.rowData[r];if(s==null)throw new _e(400,{message:`Primary key "${r}" not found in row data. Please ensure the row has a "${r}" column.`});i.has(s)||i.set(s,[]),i.get(s)?.push({columnName:l.columnName,value:l.value,rowData:l.rowData})}await n.query("BEGIN");try{let l=0;for(let[s,m]of i.entries()){let c=m.map((f,h)=>`"${f.columnName}" = $${h+1}`),p=m.map(f=>f.value!==null&&typeof f.value=="object"?JSON.stringify(f.value):f.value);p.push(s);let u=`
261
- UPDATE "${t}"
262
- SET ${c.join(", ")}
263
- WHERE "${r}" = $${p.length}
264
- RETURNING *
265
- `,b=await n.query(u,p);if(b.rowCount===0)throw new _e(404,{message:`Record with ${r} = ${s} not found in table "${t}"`});l+=b.rowCount??0}return await n.query("COMMIT"),{updatedCount:l}}catch(l){throw await n.query("ROLLBACK"),l instanceof _e?l:new _e(500,{message:`Failed to update records in "${t}"`})}}var to=d(()=>{"use strict";S()});import{zValidator as Y}from"@hono/zod-validator";import{Hono as En}from"hono";var ao,oo=d(()=>{"use strict";J();Ua();Ha();Ka();Va();Ya();Ja();Za();to();ao=new En().basePath("/records").post("/",Y("query",C),Y("json",At),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,data:o}=a.req.valid("json"),r=a.get("dbType"),{insertedCount:n}=r==="mysql"?await Wa({db:e,params:{tableName:t,data:o}}):await ka({db:e,params:{tableName:t,data:o}});return a.json({data:`Record inserted into "${t}" with ${n} rows inserted`},200)}).patch("/",Y("query",C),Y("json",la),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,primaryKey:o,updates:r}=a.req.valid("json"),n=a.get("dbType"),{updatedCount:i}=n==="mysql"?await Xa({params:{tableName:t,primaryKey:o,updates:r},db:e}):await eo({params:{tableName:t,primaryKey:o,updates:r},db:e});return a.json({data:`Updated ${i} records in "${t}"`},200)}).delete("/",Y("query",C),Y("json",Fe),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,primaryKeys:o}=a.req.valid("json"),r=a.get("dbType"),{deletedCount:n,fkViolation:i,relatedRecords:l}=r==="mysql"?await Qa({tableName:t,primaryKeys:o,db:e}):await Ba({tableName:t,primaryKeys:o,db:e});return i?a.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:l}},409):a.json({data:{deletedCount:n,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",Y("query",C),Y("json",Fe),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,primaryKeys:o}=a.req.valid("json"),n=a.get("dbType")==="mysql"?await Ga({tableName:t,primaryKeys:o,db:e}):await ja({tableName:t,primaryKeys:o,db:e});return a.json({data:n},200)}).post("/bulk",Y("query",C),Y("json",Lt),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,records:o}=a.req.valid("json"),n=a.get("dbType")==="mysql"?await za({tableName:t,records:o,db:e}):await Fa({tableName:t,records:o,db:e});return a.json({data:n},200)})});import{HTTPException as ro}from"hono/http-exception";async function no(a){let{tableName:e,columnName:t,columnType:o,defaultValue:r,isPrimaryKey:n,isNullable:i,isUnique:l,isIdentity:s,isArray:m,db:c}=a,p=g(c),u=`
266
- SELECT EXISTS (
267
- SELECT 1 FROM information_schema.tables
268
- WHERE table_name = $1 AND table_schema = 'public'
269
- ) as exists;
270
- `,{rows:b}=await p.query(u,[e]);if(!b[0]?.exists)throw new ro(404,{message:`Table "${e}" does not exist`});let f=`
271
- SELECT EXISTS (
272
- SELECT 1 FROM information_schema.columns
273
- WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
274
- ) as exists;
275
- `,{rows:h}=await p.query(f,[e,t]);if(h[0]?.exists)throw new ro(409,{message:`Column "${t}" already exists in table "${e}"`});let T=`"${t}" ${o}`;m&&(T+="[]"),n&&(T+=" PRIMARY KEY"),l&&!n&&(T+=" UNIQUE"),i||(T+=" NOT NULL"),s&&(T+=" GENERATED ALWAYS AS IDENTITY"),r?.trim()&&!s&&(T+=` DEFAULT ${r.trim()}`),await p.query(`ALTER TABLE "${e}" ADD COLUMN ${T}`)}var so=d(()=>{"use strict";S()});import{HTTPException as io}from"hono/http-exception";async function lo(a){let{tableName:e,columnName:t,columnType:o,isNullable:r,defaultValue:n,db:i}=a,l=g(i),s=`
276
- SELECT EXISTS (
277
- SELECT 1 FROM information_schema.tables
278
- WHERE table_name = $1 AND table_schema = 'public'
279
- ) as exists;
280
- `,{rows:m}=await l.query(s,[e]);if(!m[0]?.exists)throw new io(404,{message:`Table "${e}" does not exist`});let c=`
281
- SELECT EXISTS (
282
- SELECT 1 FROM information_schema.columns
283
- WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
284
- ) as exists;
285
- `,{rows:p}=await l.query(c,[e,t]);if(!p[0]?.exists)throw new io(404,{message:`Column "${t}" does not exist in table "${e}"`});let u=await l.connect();try{await u.query("BEGIN"),await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" TYPE ${o}`),await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" ${r?"DROP":"SET"} NOT NULL`),n?.trim()?await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" SET DEFAULT ${n.trim()}`):await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" DROP DEFAULT`),await u.query("COMMIT")}catch(b){throw await u.query("ROLLBACK"),b}finally{u.release()}}var co=d(()=>{"use strict";S()});async function mo({tableData:a,db:e}){let{tableName:t,fields:o,foreignKeys:r}=a,n=g(e),i=o.map(c=>{let p=`"${c.columnName}" ${c.columnType}`;return c.isArray&&(p+="[]"),c.isPrimaryKey&&(p+=" PRIMARY KEY"),c.isUnique&&!c.isPrimaryKey&&(p+=" UNIQUE"),c.isNullable||(p+=" NOT NULL"),c.isIdentity&&(p+=" GENERATED ALWAYS AS IDENTITY"),c.defaultValue&&!c.isIdentity&&(p+=` DEFAULT ${c.defaultValue}`),p}),l=r?.map(c=>`CONSTRAINT "${`fk_${t}_${c.columnName}_${c.referencedTable}_${c.referencedColumn}`}" FOREIGN KEY ("${c.columnName}") REFERENCES "${c.referencedTable}" ("${c.referencedColumn}") ON UPDATE ${c.onUpdate} ON DELETE ${c.onDelete}`)||[],s=[...i,...l],m=`
286
- CREATE TABLE "${t}" (
287
- ${s.join(`,
288
- `)}
289
- );
290
- `;await n.query(m)}var uo=d(()=>{"use strict";S()});import{HTTPException as po}from"hono/http-exception";async function fo(a){let{tableName:e,columnName:t,cascade:o,db:r}=a,n=g(r),i=`
291
- SELECT EXISTS (
292
- SELECT 1 FROM information_schema.tables
293
- WHERE table_name = $1 AND table_schema = 'public'
294
- ) as exists;
295
- `,{rows:l}=await n.query(i,[e]);if(!l[0]?.exists)throw new po(404,{message:`Table "${e}" does not exist`});let s=`
296
- SELECT EXISTS (
297
- SELECT 1 FROM information_schema.columns
298
- WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
299
- ) as exists;
300
- `,{rows:m}=await n.query(s,[e,t]);if(!m[0]?.exists)throw new po(404,{message:`Column "${t}" does not exist in table "${e}"`});let p=`ALTER TABLE "${e}" DROP COLUMN "${t}" ${o?"CASCADE":"RESTRICT"}`,{rowCount:u}=await n.query(p);return{deletedCount:u??0}}var yo=d(()=>{"use strict";S()});import{HTTPException as Ze}from"hono/http-exception";async function Sn(a,e){return(await g(e).query(`
301
- SELECT
302
- tc.constraint_name,
303
- tc.table_name as referencing_table,
304
- kcu.column_name as referencing_column,
305
- ccu.table_name AS referenced_table,
306
- ccu.column_name AS referenced_column
307
- FROM information_schema.table_constraints AS tc
308
- JOIN information_schema.key_column_usage AS kcu
309
- ON tc.constraint_name = kcu.constraint_name
310
- AND tc.table_schema = kcu.table_schema
311
- JOIN information_schema.constraint_column_usage AS ccu
312
- ON ccu.constraint_name = tc.constraint_name
313
- AND ccu.table_schema = tc.table_schema
314
- WHERE tc.constraint_type = 'FOREIGN KEY'
315
- AND ccu.table_name = $1
316
- `,[a])).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 bo(a,e){let t=await Sn(a,e);if(t.length===0)return[];let o=[],r=g(e);for(let n of t){let i=`
317
- SELECT * FROM "${n.referencingTable}"
318
- LIMIT 100
319
- `,l=await r.query(i);l.rows.length>0&&o.push({tableName:n.referencingTable,columnName:n.referencingColumn,constraintName:n.constraintName,records:l.rows})}return o}async function Rn(a,e){let o=await g(e).query(`SELECT COUNT(*) as count FROM "${a}"`);return Number.parseInt(o.rows[0]?.count??"0",10)}async function To(a){let{tableName:e,db:t,cascade:o}=a,r=g(t),n=`
320
- SELECT EXISTS (
321
- SELECT 1 FROM information_schema.tables
322
- WHERE table_name = $1 AND table_schema = 'public'
323
- ) as exists;
324
- `,{rows:i}=await r.query(n,[e]);if(!i[0]?.exists)throw new Ze(404,{message:`Table "${e}" does not exist`});let l=await Rn(e,t);if(!o){let s=await bo(e,t);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{let m=`DROP TABLE "${e}" ${o?"CASCADE":"RESTRICT"}`;return await r.query(m),{deletedCount:l,fkViolation:!1,relatedRecords:[]}}catch(s){if(s.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await bo(e,t)};throw s instanceof Ze?s:new Ze(500,{message:`Failed to delete table "${e}"`})}}var ho=d(()=>{"use strict";S()});import{HTTPException as Cn}from"hono/http-exception";async function go({tableName:a,db:e}){let t=g(e),{rows:o}=await t.query(`SELECT * FROM "${a}"`);if(!o||o.length===0)throw new Cn(404,{message:`Table "${a}" does not exist or has no data`});return{cols:Object.keys(o[0]),rows:o}}var Eo=d(()=>{"use strict";S()});function wn(a,e){if(!a?.trim())return null;let t=a.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("uuid()")?!e.toUpperCase().includes("CHAR")&&!e.toUpperCase().includes("TEXT")?null:"(UUID())":t.includes("current_timestamp")||t.includes("now()")?"(CURRENT_TIMESTAMP)":t.includes("current_date")?"(CURRENT_DATE)":`(${a.trim()})`:t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":a.trim()}function Nn(a,e){if(e)return"JSON";let t=a.toLowerCase().trim();return{serial:"INT AUTO_INCREMENT",serial4:"INT AUTO_INCREMENT",bigserial:"BIGINT AUTO_INCREMENT",serial8:"BIGINT AUTO_INCREMENT",int:"INT",int4:"INT",integer:"INT",bigint:"BIGINT",int8:"BIGINT",smallint:"SMALLINT",int2:"SMALLINT",numeric:"DECIMAL",decimal:"DECIMAL",real:"FLOAT",float4:"FLOAT",float:"FLOAT","double precision":"DOUBLE",float8:"DOUBLE",money:"DECIMAL(19, 4)",boolean:"TINYINT(1)",bool:"TINYINT(1)",text:"LONGTEXT",varchar:"VARCHAR(255)","character varying":"VARCHAR(255)",char:"CHAR(1)",character:"CHAR(1)",bpchar:"CHAR",uuid:"CHAR(36)",json:"JSON",jsonb:"JSON",xml:"LONGTEXT",date:"DATE",time:"TIME","time without time zone":"TIME",timestamp:"DATETIME","timestamp without time zone":"DATETIME","timestamp with time zone":"DATETIME",timestamptz:"DATETIME",interval:"VARCHAR(255)",bytea:"LONGBLOB",inet:"VARCHAR(45)",cidr:"VARCHAR(45)",macaddr:"VARCHAR(17)",macaddr8:"VARCHAR(23)",point:"POINT",line:"LINESTRING",polygon:"POLYGON"}[t]||a.toUpperCase()}function le(a,e={}){let t=Nn(a.columnType,a.isArray??!1),o=`\`${a.columnName}\` ${t}`;if(!a.isNullable&&!a.isPrimaryKey&&(o+=" NOT NULL"),a.defaultValue&&!t.includes("AUTO_INCREMENT")){let r=wn(a.defaultValue,t);r!==null&&(o+=` DEFAULT ${r}`)}return(a.isIdentity||e.preserveAutoIncrement)&&!t.includes("AUTO_INCREMENT")&&(o+=" AUTO_INCREMENT"),e.includeUnique&&a.isUnique&&!a.isPrimaryKey&&(o+=" UNIQUE"),e.includePrimaryKey&&a.isPrimaryKey&&(o+=" PRIMARY KEY"),o}var xe=d(()=>{"use strict"});import{HTTPException as So}from"hono/http-exception";async function Ro(a){let{tableName:e,columnName:t,columnType:o,defaultValue:r,isPrimaryKey:n,isNullable:i,isUnique:l,isIdentity:s,isArray:m,db:c}=a,p=E(c),[u]=await p.execute(`SELECT COUNT(*) as cnt
325
- FROM information_schema.TABLES
326
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new So(404,{message:`Table "${e}" does not exist`});let[f]=await p.execute(`SELECT COUNT(*) as cnt
327
- FROM information_schema.COLUMNS
328
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,t]);if(Number(f[0]?.cnt??0)>0)throw new So(409,{message:`Column "${t}" already exists in table "${e}"`});let T=le({columnName:t,columnType:o,defaultValue:r,isPrimaryKey:n,isNullable:i,isUnique:l,isIdentity:s,isArray:m},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${e}\` ADD COLUMN ${T}`)}var Co=d(()=>{"use strict";S();xe()});import{HTTPException as wo}from"hono/http-exception";async function No(a){let{tableName:e,columnName:t,columnType:o,isNullable:r,defaultValue:n,db:i}=a,l=E(i),[s]=await l.execute(`SELECT COUNT(*) as cnt
329
- FROM information_schema.TABLES
330
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(s[0]?.cnt??0)>0))throw new wo(404,{message:`Table "${e}" does not exist`});let[c]=await l.execute(`SELECT EXTRA
331
- FROM information_schema.COLUMNS
332
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?
333
- LIMIT 1`,[e,t]),p=c[0];if(!p)throw new wo(404,{message:`Column "${t}" does not exist in table "${e}"`});let u=le({columnName:t,columnType:o,defaultValue:n,isNullable:r},{preserveAutoIncrement:p.EXTRA?.toLowerCase().includes("auto_increment")});await l.execute(`ALTER TABLE \`${e}\` MODIFY COLUMN ${u}`)}var Ao=d(()=>{"use strict";S();xe()});async function Do({tableData:a,db:e}){let{tableName:t,fields:o,foreignKeys:r}=a,n=E(e),i=o.map(u=>le(u)),l=o.filter(u=>u.isPrimaryKey),s=[];if(l.length>0){let u=l.map(b=>`\`${b.columnName}\``).join(", ");s.push(`PRIMARY KEY (${u})`)}for(let u of o)u.isUnique&&!u.isPrimaryKey&&s.push(`UNIQUE KEY \`uq_${t}_${u.columnName}\` (\`${u.columnName}\`)`);let m=r?.map(u=>`CONSTRAINT \`${`fk_${t}_${u.columnName}_${u.referencedTable}_${u.referencedColumn}`}\` FOREIGN KEY (\`${u.columnName}\`) REFERENCES \`${u.referencedTable}\` (\`${u.referencedColumn}\`) ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)||[],c=[...i,...s,...m],p=`
334
- CREATE TABLE \`${t}\` (
335
- ${c.join(`,
336
- `)}
337
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
338
- `;await n.execute(p)}var _o=d(()=>{"use strict";S();xe()});import{HTTPException as xo}from"hono/http-exception";async function Po(a){let{tableName:e,columnName:t,db:o}=a,r=E(o),[n]=await r.execute(`SELECT COUNT(*) as cnt
339
- FROM information_schema.TABLES
340
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(n[0]?.cnt??0)>0))throw new xo(404,{message:`Table "${e}" does not exist`});let[l]=await r.execute(`SELECT COUNT(*) as cnt
341
- FROM information_schema.COLUMNS
342
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,t]);if(!(Number(l[0]?.cnt??0)>0))throw new xo(404,{message:`Column "${t}" does not exist in table "${e}"`});let[m]=await r.execute(`ALTER TABLE \`${e}\` DROP COLUMN \`${t}\``);return{deletedCount:m.affectedRows}}var Lo=d(()=>{"use strict";S()});import{HTTPException as et}from"hono/http-exception";async function _n(a,e){let t=E(e),[o]=await t.execute(`SELECT
517
+ AND kcu.REFERENCED_TABLE_NAME = ?`,[a]);return o.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function Zs(a,e,t){let o=await mt(a,t);if(o.length===0)return[];let r=[],n=C(t),l=e.map(s=>s.value),i=new Map;for(let s of o){let c=`${s.referencingTable}.${s.referencingColumn}`;i.has(c)||i.set(c,[]),i.get(c)?.push(s)}for(let[s,c]of i){let m=c[0];if(!m||!e.find(T=>T.columnName===m.referencedColumn))continue;let u=l.map(()=>"?").join(", "),[E]=await n.execute(`SELECT * FROM \`${m.referencingTable}\`
518
+ WHERE \`${m.referencingColumn}\` IN (${u})
519
+ LIMIT 100`,l);E.length>0&&r.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:E})}return r}async function Qo({tableName:a,primaryKeys:e,db:t}){let o=C(t),r=e[0]?.columnName;if(!r)throw new de(400,{message:"Primary key column name is required"});let n=e.map(s=>s.value),l=n.map(()=>"?").join(", "),i=await o.getConnection();await i.beginTransaction();try{let[s]=await i.execute(`DELETE FROM \`${a}\` WHERE \`${r}\` IN (${l})`,n);return await i.commit(),{deletedCount:s.affectedRows,fkViolation:!1,relatedRecords:[]}}catch(s){if(await i.rollback(),s.errno===Xs)return{deletedCount:0,fkViolation:!0,relatedRecords:await Zs(a,e,t)};throw s instanceof de?s:new de(500,{message:`Failed to delete records from "${a}"`})}finally{i.release()}}async function zo({tableName:a,primaryKeys:e,db:t}){let o=C(t),r=e[0]?.columnName;if(!r)throw new de(400,{message:"Primary key column name is required"});let n=e.map(i=>i.value),l=await o.getConnection();await l.beginTransaction();try{await l.execute("SET FOREIGN_KEY_CHECKS = 0");let i=await mt(a,t),s=0,c=new Set,m=new Set,p=async(T,y,b,g)=>{let S=`${T}.${y}`;if(g.has(S))return;g.add(S);let _=await mt(T,t);for(let H of _){let B=b.map(()=>"?").join(", "),[M]=await l.execute(`SELECT \`${H.referencedColumn}\` FROM \`${T}\`
520
+ WHERE \`${y}\` IN (${B})`,b),w=M.map(U=>U[H.referencedColumn]);w.length>0&&await p(H.referencingTable,H.referencingColumn,w,g)}let v=b.map(()=>"?").join(", "),[k]=await l.execute(`DELETE FROM \`${T}\` WHERE \`${y}\` IN (${v})`,b);s+=k.affectedRows,c.add(T)};for(let T of i)c.has(T.referencingTable)||await p(T.referencingTable,T.referencingColumn,n,m);let u=n.map(()=>"?").join(", "),[E]=await l.execute(`DELETE FROM \`${a}\` WHERE \`${r}\` IN (${u})`,n);return await l.execute("SET FOREIGN_KEY_CHECKS = 1"),await l.commit(),{deletedCount:E.affectedRows+s}}catch(i){throw await l.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await l.rollback(),i instanceof de?i:new de(500,{message:`Failed to force delete records from "${a}"`})}finally{l.release()}}var Xs,Go=d(()=>{"use strict";h();Xs=1451});import{HTTPException as ut}from"hono/http-exception";async function oi(a,e){let t=C(e),[o]=await t.execute(`SELECT
343
521
  kcu.CONSTRAINT_NAME AS constraint_name,
344
522
  kcu.TABLE_NAME AS referencing_table,
345
523
  kcu.COLUMN_NAME AS referencing_column,
@@ -352,49 +530,37 @@ This will return the 5 customers with the highest total order value. You might a
352
530
  AND kcu.TABLE_NAME = tc.TABLE_NAME
353
531
  WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
354
532
  AND kcu.TABLE_SCHEMA = DATABASE()
355
- AND kcu.REFERENCED_TABLE_NAME = ?`,[a]);return o.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function vo(a,e){let t=await _n(a,e);if(t.length===0)return[];let o=[],r=E(e);for(let n of t){let[i]=await r.execute(`SELECT * FROM \`${n.referencingTable}\` LIMIT 100`);i.length>0&&o.push({tableName:n.referencingTable,columnName:n.referencingColumn,constraintName:n.constraintName,records:i})}return o}async function xn(a,e){let t=E(e),[o]=await t.execute(`SELECT COUNT(*) as count FROM \`${a}\``);return Number(o[0]?.count??0)}async function $o(a){let{tableName:e,db:t,cascade:o}=a,r=E(t),[n]=await r.execute(`SELECT COUNT(*) as cnt
356
- FROM information_schema.TABLES
357
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(n[0]?.cnt??0)>0))throw new et(404,{message:`Table "${e}" does not exist`});let l=await xn(e,t);if(!o){let s=await vo(e,t);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{if(o){let s=await r.getConnection();try{await s.execute("SET FOREIGN_KEY_CHECKS = 0"),await s.execute(`DROP TABLE \`${e}\``),await s.execute("SET FOREIGN_KEY_CHECKS = 1")}finally{s.release()}}else await r.execute(`DROP TABLE \`${e}\``);return{deletedCount:l,fkViolation:!1,relatedRecords:[]}}catch(s){await r.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{});let m=s;if(m.errno===An||m.errno===Dn)return{deletedCount:0,fkViolation:!0,relatedRecords:await vo(e,t)};throw s instanceof et?s:new et(500,{message:`Failed to delete table "${e}"`})}}var An,Dn,qo=d(()=>{"use strict";S();An=1217,Dn=1451});import{HTTPException as Pn}from"hono/http-exception";async function Oo({tableName:a,db:e}){let t=E(e),[o]=await t.execute(`SELECT * FROM \`${a}\``);if(!o||o.length===0)throw new Pn(404,{message:`Table "${a}" does not exist or has no data`});return{cols:Object.keys(o[0]),rows:o}}var Mo=d(()=>{"use strict";S()});import{HTTPException as tt}from"hono/http-exception";async function Io(a){let{tableName:e,columnName:t,newColumnName:o,db:r}=a,n=E(r),[i]=await n.execute(`SELECT COUNT(*) as cnt
533
+ AND kcu.REFERENCED_TABLE_NAME = ?`,[a]);return o.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function Jo(a,e){let t=await oi(a,e);if(t.length===0)return[];let o=[],r=C(e);for(let n of t){let[l]=await r.execute(`SELECT * FROM \`${n.referencingTable}\` LIMIT 100`);l.length>0&&o.push({tableName:n.referencingTable,columnName:n.referencingColumn,constraintName:n.constraintName,records:l})}return o}async function ri(a,e){let t=C(e),[o]=await t.execute(`SELECT COUNT(*) as count FROM \`${a}\``);return Number(o[0]?.count??0)}async function Xo(a){let{tableName:e,db:t,cascade:o}=a,r=C(t),[n]=await r.execute(`SELECT COUNT(*) as cnt
358
534
  FROM information_schema.TABLES
359
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(i[0]?.cnt??0)>0))throw new tt(404,{message:`Table "${e}" does not exist`});let[s]=await n.execute(`SELECT COUNT(*) as cnt
360
- FROM information_schema.COLUMNS
361
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,t]);if(!(Number(s[0]?.cnt??0)>0))throw new tt(404,{message:`Column "${t}" does not exist in table "${e}"`});let[c]=await n.execute(`SELECT COUNT(*) as cnt
362
- FROM information_schema.COLUMNS
363
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(Number(c[0]?.cnt??0)>0)throw new tt(409,{message:`Column "${o}" already exists in table "${e}"`});await n.execute(`ALTER TABLE \`${e}\` RENAME COLUMN \`${t}\` TO \`${o}\``)}var ko=d(()=>{"use strict";S()});async function Uo(a){let e=E(a),t=`
535
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(n[0]?.cnt??0)>0))throw new ut(404,{message:`Table "${e}" does not exist`});let i=await ri(e,t);if(!o){let s=await Jo(e,t);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{if(o){let s=await r.getConnection();try{await s.execute("SET FOREIGN_KEY_CHECKS = 0"),await s.execute(`DROP TABLE \`${e}\``),await s.execute("SET FOREIGN_KEY_CHECKS = 1")}finally{s.release()}}else await r.execute(`DROP TABLE \`${e}\``);return{deletedCount:i,fkViolation:!1,relatedRecords:[]}}catch(s){await r.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{});let c=s;if(c.errno===ti||c.errno===ai)return{deletedCount:0,fkViolation:!0,relatedRecords:await Jo(e,t)};throw s instanceof ut?s:new ut(500,{message:`Failed to delete table "${e}"`})}}var ti,ai,Zo=d(()=>{"use strict";h();ti=1217,ai=1451});import{HTTPException as si}from"hono/http-exception";async function er({tableName:a,db:e}){let t=C(e),[o]=await t.execute(`SELECT * FROM \`${a}\``);if(!o||o.length===0)throw new si(404,{message:`Table "${a}" does not exist or has no data`});return{cols:Object.keys(o[0]),rows:o}}var tr=d(()=>{"use strict";h()});import{HTTPException as li}from"hono/http-exception";var ar,or=d(()=>{"use strict";h();ar=async({query:a,db:e})=>{let t=C(e);if(!a||!a.trim())throw new li(400,{message:"Query is required"});let o=a.trim().replace(/;+$/,""),r=performance.now(),[n,l]=await t.execute(o),i=performance.now()-r;if(Array.isArray(n)){let c=n;return{columns:l?l.map(p=>p.name):Object.keys(c[0]??{}),rows:c,rowCount:c.length,duration:i,message:c.length===0?"OK":void 0}}let s=n;return{columns:[],rows:[],rowCount:s.affectedRows,duration:i,message:`OK \u2014 ${s.affectedRows} row(s) affected`}}});async function rr(a){let e=C(a),t=`
364
536
  SELECT table_name as tableName
365
537
  FROM information_schema.tables
366
538
  WHERE table_schema = DATABASE()
367
539
  AND table_type = 'BASE TABLE'
368
540
  ORDER BY table_name
369
- `,[o]=await e.execute(t);return!o||o.length===0?[]:await Promise.all(o.map(async n=>{let[i]=await e.execute(`SELECT COUNT(*) as count FROM \`${n.tableName}\``),l=i[0];return{tableName:n.tableName,rowCount:l?.count??0}}))}var Fo=d(()=>{"use strict";S()});import{HTTPException as Ho}from"hono/http-exception";async function Bo({tableName:a,db:e}){let t=E(e),[o]=await t.execute(`SELECT COUNT(*) as cnt
541
+ `,[o]=await e.execute(t);return!o||o.length===0?[]:await Promise.all(o.map(async n=>{let[l]=await e.execute(`SELECT COUNT(*) as count FROM \`${n.tableName}\``),i=l[0];return{tableName:n.tableName,rowCount:i?.count??0}}))}var nr=d(()=>{"use strict";h()});import{HTTPException as sr}from"hono/http-exception";async function ir({tableName:a,db:e}){let t=C(e),[o]=await t.execute(`SELECT COUNT(*) as cnt
370
542
  FROM information_schema.TABLES
371
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[a]);if(!(Number(o[0]?.cnt??0)>0))throw new Ho(404,{message:`Table "${a}" does not exist`});let[n]=await t.execute(`SHOW CREATE TABLE \`${a}\``),i=n[0],l=i?.["Create Table"]??i?.create_table??"";if(!l)throw new Ho(500,{message:`Failed to retrieve schema for table "${a}"`});return l}var jo=d(()=>{"use strict";S()});function Ko(a){if(a.length===0)return{clause:"",values:[]};let e=[],t=[];for(let o of a){let r=`\`${o.columnName}\``;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${r} ${o.operator} ?`),t.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${r} IS NULL`):(e.push(`${r} = ?`),t.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${r} IS NOT NULL`):(e.push(`${r} != ?`),t.push(o.value));break;case"like":case"ilike":e.push(`${r} LIKE ?`),t.push(o.value);break;case"not like":case"not ilike":e.push(`${r} NOT LIKE ?`),t.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Wo(a,e){return Array.isArray(a)?a.length===0?"":`ORDER BY ${a.map(o=>`\`${o.columnName}\` ${o.direction.toUpperCase()}`).join(", ")}`:a&&typeof a=="string"?`ORDER BY \`${a}\` ${e?.toUpperCase()||"ASC"}`:""}function Vo(a,e,t){let{values:o,sortColumns:r}=a,n=[],i=[],m=t==="asc"===(e==="asc");if(r.length>0){let c=r.map(b=>`\`${b}\``).join(", "),p=r.map(()=>"?").join(", "),u=m?">":"<";n.push(`(${c}) ${u} (${p})`);for(let b of r)i.push(o[b])}return{clause:n.length>0?`(${n.join(" AND ")})`:"",values:i}}var zo=d(()=>{"use strict"});var Pe,Ln,vn,Yo,Qo=d(()=>{"use strict";S();zo();Pe=a=>Buffer.from(JSON.stringify(a)).toString("base64url"),Ln=a=>{try{return JSON.parse(Buffer.from(a,"base64url").toString("utf-8"))}catch{return null}},vn=async(a,e)=>{let[t]=await a.execute(`SELECT COLUMN_NAME as column_name
543
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[a]);if(!(Number(o[0]?.cnt??0)>0))throw new sr(404,{message:`Table "${a}" does not exist`});let[n]=await t.execute(`SHOW CREATE TABLE \`${a}\``),l=n[0],i=l?.["Create Table"]??l?.create_table??"";if(!i)throw new sr(500,{message:`Failed to retrieve schema for table "${a}"`});return i}var lr=d(()=>{"use strict";h()});function cr(a){if(a.length===0)return{clause:"",values:[]};let e=[],t=[];for(let o of a){let r=`\`${o.columnName}\``;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${r} ${o.operator} ?`),t.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${r} IS NULL`):(e.push(`${r} = ?`),t.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${r} IS NOT NULL`):(e.push(`${r} != ?`),t.push(o.value));break;case"like":case"ilike":e.push(`${r} LIKE ?`),t.push(o.value);break;case"not like":case"not ilike":e.push(`${r} NOT LIKE ?`),t.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function mr(a,e){return Array.isArray(a)?a.length===0?"":`ORDER BY ${a.map(o=>`\`${o.columnName}\` ${o.direction.toUpperCase()}`).join(", ")}`:a&&typeof a=="string"?`ORDER BY \`${a}\` ${e?.toUpperCase()||"ASC"}`:""}function ur(a,e,t){let{values:o,sortColumns:r}=a,n=[],l=[],c=t==="asc"===(e==="asc");if(r.length>0){let m=r.map(E=>`\`${E}\``).join(", "),p=r.map(()=>"?").join(", "),u=c?">":"<";n.push(`(${m}) ${u} (${p})`);for(let E of r)l.push(o[E])}return{clause:n.length>0?`(${n.join(" AND ")})`:"",values:l}}var pr=d(()=>{"use strict"});var ke,pi,di,dr,fr=d(()=>{"use strict";h();pr();ke=a=>Buffer.from(JSON.stringify(a)).toString("base64url"),pi=a=>{try{return JSON.parse(Buffer.from(a,"base64url").toString("utf-8"))}catch{return null}},di=async(a,e)=>{let[t]=await a.execute(`SELECT COLUMN_NAME as column_name
372
544
  FROM information_schema.COLUMNS
373
545
  WHERE TABLE_SCHEMA = DATABASE()
374
546
  AND TABLE_NAME = ?
375
547
  AND COLUMN_KEY = 'PRI'
376
- ORDER BY ORDINAL_POSITION`,[e]);return t.map(o=>o.column_name)},Yo=async({tableName:a,cursor:e="",limit:t=50,direction:o="asc",sort:r=[],order:n="asc",filters:i=[],db:l})=>{let s=E(l),m=await vn(s,a),c=[],p=n;Array.isArray(r)&&r.length>0?(c=r.map(L=>L.columnName),p=r[0].direction):typeof r=="string"&&r&&(c=[r]);let u=[...c,...m.filter(L=>!c.includes(L))],{clause:b,values:f}=Ko(i),h="",T=[];if(e){let L=Ln(e);if(L){let N=Vo(L,o,p);h=N.clause,T=N.values}}let R="";b&&h?R=`WHERE ${b.replace(/^WHERE\s+/i,"")} AND ${h}`:b?R=b:h&&(R=`WHERE ${h}`);let D=Wo((Array.isArray(r),r),n),P=D;o==="desc"?D?P=D.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):u.length>0&&(P=`ORDER BY ${u.map(N=>`\`${N}\` ${p==="asc"?"DESC":"ASC"}`).join(", ")}`):!D&&u.length>0&&(P=`ORDER BY ${u.map(N=>`\`${N}\` ${p.toUpperCase()}`).join(", ")}`);let[H]=await s.execute(`SELECT COUNT(*) as total FROM \`${a}\` ${b}`,f),I=Number(H[0]?.total??0),k=Math.floor(t)+1,[K]=await s.execute(`SELECT * FROM \`${a}\` ${R} ${P} LIMIT ${k}`,[...f,...T]),q=K,_=q.length>t;_&&(q=q.slice(0,t)),o==="desc"&&(q=q.reverse());let O=null,Q=null;if(q.length>0&&u.length>0){let L=q[0],N=q[q.length-1],M=ee=>({values:Object.fromEntries(u.map(fe=>[fe,ee[fe]])),sortColumns:u});o==="asc"?(_&&(O=Pe(M(N))),e&&(Q=Pe(M(L)))):(e&&(O=Pe(M(N))),_&&(Q=Pe(M(L))))}return{data:q,meta:{limit:t,total:I,hasNextPage:o==="asc"?_:!!e,hasPreviousPage:o==="asc"?!!e:_,nextCursor:O,prevCursor:Q}}}});import{HTTPException as at}from"hono/http-exception";async function Go(a){let{tableName:e,columnName:t,newColumnName:o,db:r}=a,n=g(r),i=`
377
- SELECT EXISTS (
378
- SELECT 1 FROM information_schema.tables
379
- WHERE table_name = $1 AND table_schema = 'public'
380
- ) as exists;
381
- `,{rows:l}=await n.query(i,[e]);if(!l[0]?.exists)throw new at(404,{message:`Table "${e}" does not exist`});let s=`
382
- SELECT EXISTS (
383
- SELECT 1 FROM information_schema.columns
384
- WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
385
- ) as exists;
386
- `,{rows:m}=await n.query(s,[e,t]);if(!m[0]?.exists)throw new at(404,{message:`Column "${t}" does not exist in table "${e}"`});let{rows:c}=await n.query(s,[e,o]);if(c[0]?.exists)throw new at(409,{message:`Column "${o}" already exists in table "${e}"`});await n.query(`ALTER TABLE "${e}" RENAME COLUMN "${t}" TO "${o}"`)}var Jo=d(()=>{"use strict";S()});import{HTTPException as $n}from"hono/http-exception";async function Xo(a){let e=g(a),t=`
548
+ ORDER BY ORDINAL_POSITION`,[e]);return t.map(o=>o.column_name)},dr=async({tableName:a,cursor:e="",limit:t=50,direction:o="asc",sort:r=[],order:n="asc",filters:l=[],db:i})=>{let s=C(i),c=await di(s,a),m=[],p=n;Array.isArray(r)&&r.length>0?(m=r.map(I=>I.columnName),p=r[0].direction):typeof r=="string"&&r&&(m=[r]);let u=[...m,...c.filter(I=>!m.includes(I))],{clause:E,values:T}=cr(l),y="",b=[];if(e){let I=pi(e);if(I){let D=ur(I,o,p);y=D.clause,b=D.values}}let g="";E&&y?g=`WHERE ${E.replace(/^WHERE\s+/i,"")} AND ${y}`:E?g=E:y&&(g=`WHERE ${y}`);let S=mr((Array.isArray(r),r),n),_=S;o==="desc"?S?_=S.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):u.length>0&&(_=`ORDER BY ${u.map(D=>`\`${D}\` ${p==="asc"?"DESC":"ASC"}`).join(", ")}`):!S&&u.length>0&&(_=`ORDER BY ${u.map(D=>`\`${D}\` ${p.toUpperCase()}`).join(", ")}`);let[v]=await s.execute(`SELECT COUNT(*) as total FROM \`${a}\` ${E}`,T),k=Number(v[0]?.total??0),H=Math.floor(t)+1,[B]=await s.execute(`SELECT * FROM \`${a}\` ${g} ${_} LIMIT ${H}`,[...T,...b]),M=B,w=M.length>t;w&&(M=M.slice(0,t)),o==="desc"&&(M=M.reverse());let U=null,Y=null;if(M.length>0&&u.length>0){let I=M[0],D=M[M.length-1],q=oe=>({values:Object.fromEntries(u.map(Ne=>[Ne,oe[Ne]])),sortColumns:u});o==="asc"?(w&&(U=ke(q(D))),e&&(Y=ke(q(I)))):(e&&(U=ke(q(D))),w&&(Y=ke(q(I))))}return{data:M,meta:{limit:t,total:k,hasNextPage:o==="asc"?w:!!e,hasPreviousPage:o==="asc"?!!e:w,nextCursor:U,prevCursor:Y}}}});import{HTTPException as Ue}from"hono/http-exception";async function br({params:a,db:e}){let{tableName:t,updates:o,primaryKey:r}=a,n=C(e),l=await te({tableName:t,db:e}),i=new Set(l.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName)),s=new Map;for(let m of o){let p=m.rowData[r];if(p==null)throw new Ue(400,{message:`Primary key "${r}" not found in row data.`});s.has(p)||s.set(p,[]),s.get(p)?.push({columnName:m.columnName,value:m.value,rowData:m.rowData})}let c=await n.getConnection();await c.beginTransaction();try{let m=0;for(let[p,u]of s.entries()){let E=u.map(g=>`\`${g.columnName}\` = ?`),T=u.map(g=>g.value!==null&&typeof g.value=="object"?JSON.stringify(g.value):i.has(g.columnName)&&typeof g.value=="string"?g.value==="true"?1:0:g.value);T.push(p);let y=`
549
+ UPDATE \`${t}\`
550
+ SET ${E.join(", ")}
551
+ WHERE \`${r}\` = ?
552
+ `,[b]=await c.execute(y,T);if(b.affectedRows===0)throw new Ue(404,{message:`Record with ${r} = ${p} not found in table "${t}"`});m+=b.affectedRows}return await c.commit(),{updatedCount:m}}catch(m){throw await c.rollback(),m instanceof Ue?m:new Ue(500,{message:`Failed to update records in "${t}"`})}finally{c.release()}}var yr=d(()=>{"use strict";h();Ee()});import{HTTPException as yi}from"hono/http-exception";var Tr,Er=d(()=>{"use strict";h();Tr=async({query:a,db:e})=>{let t=N(e);if(!a||!a.trim())throw new yi(400,{message:"Query is required"});let o=a.trim().replace(/;+$/,""),r=performance.now(),n=await t.query(o),l=performance.now()-r;return{columns:n.fields.map(s=>s.name),rows:n.rows,rowCount:n.rows.length,duration:l,message:n.rows.length===0?"OK":void 0}}});import{HTTPException as Ei}from"hono/http-exception";async function gr(a){let e=N(a),t=`
387
553
  SELECT table_name as "tableName"
388
554
  FROM information_schema.tables
389
555
  WHERE table_schema = 'public'
390
556
  AND table_type = 'BASE TABLE'
391
557
  ORDER BY table_name;
392
- `,{rows:o}=await e.query(t);if(!o[0])throw new $n(500,{message:"No tables returned from database"});return await Promise.all(o.map(async n=>{let i=`SELECT COUNT(*)::integer as count FROM "${n.tableName}"`,{rows:l}=await e.query(i);return{tableName:n.tableName,rowCount:l[0]?.count??0}}))}var Zo=d(()=>{"use strict";S()});import{HTTPException as qn}from"hono/http-exception";async function er({tableName:a,db:e}){let t=g(e),o=`
558
+ `,{rows:o}=await e.query(t);if(!o[0])throw new Ei(500,{message:"No tables returned from database"});return await Promise.all(o.map(async n=>{let l=`SELECT COUNT(*)::integer as count FROM "${n.tableName}"`,{rows:i}=await e.query(l);return{tableName:n.tableName,rowCount:i[0]?.count??0}}))}var hr=d(()=>{"use strict";h()});import{HTTPException as hi}from"hono/http-exception";async function Nr({tableName:a,db:e}){let t=N(e),o=`
393
559
  SELECT EXISTS (
394
560
  SELECT 1 FROM information_schema.tables
395
561
  WHERE table_schema = 'public' AND table_name = $1
396
562
  ) as exists
397
- `,{rows:r}=await t.query(o,[a]);if(!r[0]?.exists)throw new qn(404,{message:`Table "${a}" does not exist`});let n=`
563
+ `,{rows:r}=await t.query(o,[a]);if(!r[0]?.exists)throw new hi(404,{message:`Table "${a}" does not exist`});let n=`
398
564
  SELECT
399
565
  column_name,
400
566
  data_type,
@@ -407,7 +573,7 @@ This will return the 5 customers with the highest total order value. You might a
407
573
  FROM information_schema.columns
408
574
  WHERE table_schema = 'public' AND table_name = $1
409
575
  ORDER BY ordinal_position
410
- `,{rows:i}=await t.query(n,[a]),l=`
576
+ `,{rows:l}=await t.query(n,[a]),i=`
411
577
  SELECT
412
578
  tc.constraint_name,
413
579
  tc.constraint_type,
@@ -424,7 +590,7 @@ This will return the 5 customers with the highest total order value. You might a
424
590
  AND tc.constraint_type = 'FOREIGN KEY'
425
591
  WHERE tc.table_schema = 'public' AND tc.table_name = $1
426
592
  ORDER BY tc.constraint_type, tc.constraint_name
427
- `,{rows:s}=await t.query(l,[a]),m=`
593
+ `,{rows:s}=await t.query(i,[a]),c=`
428
594
  SELECT indexname, indexdef
429
595
  FROM pg_indexes
430
596
  WHERE schemaname = 'public' AND tablename = $1
@@ -433,11 +599,61 @@ This will return the 5 customers with the highest total order value. You might a
433
599
  FROM information_schema.table_constraints
434
600
  WHERE table_schema = 'public' AND table_name = $1 AND constraint_type = 'PRIMARY KEY'
435
601
  )
436
- `,{rows:c}=await t.query(m,[a]),p=[];p.push(`create table public.${a} (`);let u=[];for(let T of i){let R=` ${T.column_name} ${On(T)}`;T.is_nullable==="NO"&&(R+=" not null"),T.column_default!==null&&(R+=` default ${T.column_default}`),u.push(R)}let b=new Map;for(let T of s){let R=b.get(T.constraint_name)||[];R.push(T),b.set(T.constraint_name,R)}let f=[];for(let[T,R]of b){let D=R[0],P=R.map(H=>H.column_name).join(", ");if(D.constraint_type==="PRIMARY KEY")f.push(` constraint ${T} primary key (${P})`);else if(D.constraint_type==="FOREIGN KEY"){let H=D.foreign_table_name,I=D.foreign_column_name;f.push(` constraint ${T} foreign key (${P}) references ${H} (${I})`)}else D.constraint_type==="UNIQUE"&&f.push(` constraint ${T} unique (${P})`)}let h=[...u,...f];p.push(h.join(`,
437
- `)),p.push(") tablespace pg_default;");for(let T of c)Array.from(b.values()).some(D=>D[0].constraint_type==="UNIQUE"&&D[0].constraint_name===T.indexname)||(p.push(""),p.push(`${T.indexdef};`));return p.join(`
438
- `)}function On(a){let{data_type:e,udt_name:t,character_maximum_length:o,numeric_precision:r,numeric_scale:n}=a;return e==="USER-DEFINED"?t:e==="ARRAY"?`${t.replace(/^_/,"")}[]`:(e==="character varying"||e==="varchar")&&o?`varchar(${o})`:e==="character"&&o?`char(${o})`:e==="numeric"&&r!==null?n!==null&&n>0?`numeric(${r}, ${n})`:`numeric(${r})`: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 tr=d(()=>{"use strict";S()});function ar(a){if(a.length===0)return{clause:"",values:[]};let e=[],t=[];for(let o of a){let r=t.length+1,n=`"${o.columnName}"`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${o.operator} $${r}`),t.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = $${r}`),t.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != $${r}`),t.push(o.value));break;case"like":e.push(`${n}::text LIKE $${r}`),t.push(o.value);break;case"not like":e.push(`${n}::text NOT LIKE $${r}`),t.push(o.value);break;case"ilike":e.push(`${n}::text ILIKE $${r}`),t.push(o.value);break;case"not ilike":e.push(`${n}::text NOT ILIKE $${r}`),t.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function or(a,e){return Array.isArray(a)?a.length===0?"":`ORDER BY ${a.map(o=>`"${o.columnName}" ${o.direction.toUpperCase()}`).join(", ")}`:a&&typeof a=="string"?`ORDER BY "${a}" ${e?.toUpperCase()||"ASC"}`:""}function rr(a,e,t,o){let{values:r,sortColumns:n}=a,i=[],l=[],c=t==="asc"===(e==="asc");if(n.length>0){let p=n.map(f=>`"${f}"`).join(", "),u=n.map((f,h)=>`$${o+h}`).join(", "),b=c?">":"<";i.push(`(${p}) ${b} (${u})`);for(let f of n)l.push(r[f])}return{clause:i.length>0?`(${i.join(" AND ")})`:"",values:l}}var nr=d(()=>{"use strict"});var Le,Mn,In,sr,ir=d(()=>{"use strict";S();nr();Le=a=>Buffer.from(JSON.stringify(a)).toString("base64url"),Mn=a=>{try{return JSON.parse(Buffer.from(a,"base64url").toString("utf-8"))}catch{return null}},In=async(a,e)=>{let t=`"${e}"`;return(await a.query(`SELECT a.attname as column_name
602
+ `,{rows:m}=await t.query(c,[a]),p=[];p.push(`create table public.${a} (`);let u=[];for(let b of l){let g=` ${b.column_name} ${Ni(b)}`;b.is_nullable==="NO"&&(g+=" not null"),b.column_default!==null&&(g+=` default ${b.column_default}`),u.push(g)}let E=new Map;for(let b of s){let g=E.get(b.constraint_name)||[];g.push(b),E.set(b.constraint_name,g)}let T=[];for(let[b,g]of E){let S=g[0],_=g.map(v=>v.column_name).join(", ");if(S.constraint_type==="PRIMARY KEY")T.push(` constraint ${b} primary key (${_})`);else if(S.constraint_type==="FOREIGN KEY"){let v=S.foreign_table_name,k=S.foreign_column_name;T.push(` constraint ${b} foreign key (${_}) references ${v} (${k})`)}else S.constraint_type==="UNIQUE"&&T.push(` constraint ${b} unique (${_})`)}let y=[...u,...T];p.push(y.join(`,
603
+ `)),p.push(") tablespace pg_default;");for(let b of m)Array.from(E.values()).some(S=>S[0].constraint_type==="UNIQUE"&&S[0].constraint_name===b.indexname)||(p.push(""),p.push(`${b.indexdef};`));return p.join(`
604
+ `)}function Ni(a){let{data_type:e,udt_name:t,character_maximum_length:o,numeric_precision:r,numeric_scale:n}=a;return e==="USER-DEFINED"?t:e==="ARRAY"?`${t.replace(/^_/,"")}[]`:(e==="character varying"||e==="varchar")&&o?`varchar(${o})`:e==="character"&&o?`char(${o})`:e==="numeric"&&r!==null?n!==null&&n>0?`numeric(${r}, ${n})`:`numeric(${r})`: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 Cr=d(()=>{"use strict";h()});function Rr(a){if(a.length===0)return{clause:"",values:[]};let e=[],t=[];for(let o of a){let r=t.length+1,n=`"${o.columnName}"`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${o.operator} $${r}`),t.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = $${r}`),t.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != $${r}`),t.push(o.value));break;case"like":e.push(`${n}::text LIKE $${r}`),t.push(o.value);break;case"not like":e.push(`${n}::text NOT LIKE $${r}`),t.push(o.value);break;case"ilike":e.push(`${n}::text ILIKE $${r}`),t.push(o.value);break;case"not ilike":e.push(`${n}::text NOT ILIKE $${r}`),t.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Ar(a,e){return Array.isArray(a)?a.length===0?"":`ORDER BY ${a.map(o=>`"${o.columnName}" ${o.direction.toUpperCase()}`).join(", ")}`:a&&typeof a=="string"?`ORDER BY "${a}" ${e?.toUpperCase()||"ASC"}`:""}function Sr(a,e,t,o){let{values:r,sortColumns:n}=a,l=[],i=[],m=t==="asc"===(e==="asc");if(n.length>0){let p=n.map(T=>`"${T}"`).join(", "),u=n.map((T,y)=>`$${o+y}`).join(", "),E=m?">":"<";l.push(`(${p}) ${E} (${u})`);for(let T of n)i.push(r[T])}return{clause:l.length>0?`(${l.join(" AND ")})`:"",values:i}}var _r=d(()=>{"use strict"});var Fe,Ri,Ai,wr,Dr=d(()=>{"use strict";h();_r();Fe=a=>Buffer.from(JSON.stringify(a)).toString("base64url"),Ri=a=>{try{return JSON.parse(Buffer.from(a,"base64url").toString("utf-8"))}catch{return null}},Ai=async(a,e)=>{let t=`"${e}"`;return(await a.query(`SELECT a.attname as column_name
439
605
  FROM pg_index i
440
606
  JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
441
607
  WHERE i.indrelid = $1::regclass AND i.indisprimary
442
- ORDER BY array_position(i.indkey, a.attnum)`,[t])).rows.map(r=>r.column_name)},sr=async({tableName:a,cursor:e="",limit:t=50,direction:o="asc",sort:r=[],order:n="asc",filters:i=[],db:l})=>{let s=g(l),m=await In(s,a),c=[],p=n;Array.isArray(r)&&r.length>0?(c=r.map(N=>N.columnName),p=r[0].direction):typeof r=="string"&&r&&(c=[r]);let u=[...c,...m.filter(N=>!c.includes(N))];u.length===0&&u.push("ctid");let{clause:b,values:f}=ar(i),h="",T=[];if(e){let N=Mn(e);if(N){let M=rr(N,o,p,f.length+1);h=M.clause,T=M.values}}let R="";b&&h?R=`WHERE ${b.replace(/^WHERE\s+/i,"")} AND ${h}`:b?R=b:h&&(R=`WHERE ${h}`);let D=or((Array.isArray(r),r),n),P=D;o==="desc"?D?P=D.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):P=`ORDER BY ${u.map(M=>`"${M}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!D&&u.length>0&&(P=`ORDER BY ${u.map(M=>`"${M}" ${p.toUpperCase()}`).join(", ")}`);let H=await s.query(`SELECT COUNT(*) as total FROM "${a}" ${b}`,f),I=Number(H.rows[0].total),k=f.length+T.length+1,K=await s.query(`SELECT * FROM "${a}" ${R} ${P} LIMIT $${k}`,[...f,...T,t+1]),_=K.fields&&K.fields.length>0?K.rows.filter(N=>Object.keys(N).length>0):K.rows,O=_.length>t;O&&(_=_.slice(0,t)),o==="desc"&&(_=_.reverse());let Q=null,L=null;if(_.length>0){let N=_[0],M=_[_.length-1],ee=fe=>({values:Object.fromEntries(u.map(rt=>[rt,fe[rt]])),sortColumns:u});o==="asc"?(O&&(Q=Le(ee(M))),e&&(L=Le(ee(N)))):(e&&(Q=Le(ee(M))),O&&(L=Le(ee(N))))}return{data:_,meta:{limit:t,total:I,hasNextPage:o==="asc"?O:!!e,hasPreviousPage:o==="asc"?!!e:O,nextCursor:Q,prevCursor:L}}}});import{utils as de,write as kn}from"xlsx";function lr({cols:a,rows:e,format:t,tableName:o}){switch(t){case"json":{let r=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(r,"utf-8"))}case"csv":{let r=[a,...e?.map(l=>a?.map(s=>l[s]))??[]],n=de.aoa_to_sheet(r),i=de.sheet_to_csv(n);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let r=[a,...e?.map(s=>a?.map(m=>s[m]))??[]],n=de.aoa_to_sheet(r),i=de.book_new();de.book_append_sheet(i,n,o.slice(0,31));let l=kn(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(l)}}}var cr=d(()=>{"use strict"});import{zValidator as A}from"@hono/zod-validator";import{Hono as Un}from"hono";var mr,ur=d(()=>{"use strict";J();so();co();uo();yo();ho();Eo();Co();Ao();_o();Lo();qo();Mo();ko();pe();Fo();jo();Qo();Jo();ze();Zo();tr();ir();cr();mr=new Un().basePath("/tables").get("/",A("query",C),async a=>{let{db:e}=a.req.valid("query"),o=a.get("dbType")==="mysql"?await Uo(e):await Xo(e);return a.json({data:o},200)}).post("/",A("query",C),A("json",Bt),async a=>{let{db:e}=a.req.valid("query"),t=a.req.valid("json");return a.get("dbType")==="mysql"?await Do({tableData:t,db:e}):await mo({tableData:t,db:e}),a.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",A("query",Yt),A("param",G),async a=>{let{db:e,cascade:t}=a.req.valid("query"),{tableName:o}=a.req.valid("param"),n=a.get("dbType")==="mysql"?await $o({tableName:o,db:e,cascade:t}):await To({tableName:o,db:e,cascade:t});return a.json({data:n},200)}).delete("/:tableName/columns/:columnName",A("query",_t),A("param",U),async a=>{let{db:e,cascade:t}=a.req.valid("query"),{tableName:o,columnName:r}=a.req.valid("param"),n=a.get("dbType"),{deletedCount:i}=n==="mysql"?await Po({tableName:o,columnName:r,cascade:t,db:e}):await fo({tableName:o,columnName:r,cascade:t,db:e});return a.json({data:`Column "${r}" deleted successfully from table "${o}" with ${i} rows deleted`},200)}).post("/:tableName/columns",A("query",C),A("param",G),A("json",V),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.req.valid("json");return a.get("dbType")==="mysql"?await Ro({tableName:t,db:e,...o}):await no({tableName:t,db:e,...o}),a.json({data:`Column "${o.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",A("query",C),A("param",U),A("json",Be),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,columnName:o}=a.req.valid("param"),r=a.req.valid("json");return a.get("dbType")==="mysql"?await Io({tableName:t,columnName:o,db:e,...r}):await Go({tableName:t,columnName:o,db:e,...r}),a.json({data:`Column "${o}" renamed to "${r.newColumnName}" in table "${t}"`},200)}).patch("/:tableName/columns/:columnName",A("query",C),A("param",U),A("json",ue),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,columnName:o}=a.req.valid("param"),r=a.req.valid("json");return a.get("dbType")==="mysql"?await No({tableName:t,columnName:o,db:e,...r}):await lo({tableName:t,columnName:o,db:e,...r}),a.json({data:`Column "${o}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",A("query",C),A("param",G),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),r=a.get("dbType")==="mysql"?await X({tableName:t,db:e}):await Ce({tableName:t,db:e});return a.json({data:r},200)}).get("/:tableName/schema",A("query",C),A("param",G),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),r=a.get("dbType")==="mysql"?await Bo({tableName:t,db:e}):await er({tableName:t,db:e});return a.json({data:{schema:r}},200)}).get("/:tableName/data",A("param",G),A("query",oa),async a=>{let{tableName:e}=a.req.valid("param"),{cursor:t,limit:o,direction:r,sort:n,order:i,filters:l,db:s}=a.req.valid("query"),c=a.get("dbType")==="mysql"?await Yo({tableName:e,cursor:t,limit:o,direction:r,sort:n,order:i,filters:l,db:s}):await sr({tableName:e,cursor:t,limit:o,direction:r,sort:n,order:i,filters:l,db:s});return a.json({data:c},200)}).get("/:tableName/export",A("param",G),A("query",Zt),async a=>{let{tableName:e}=a.req.valid("param"),{db:t,format:o}=a.req.valid("query"),r=a.get("dbType"),{cols:n,rows:i}=r==="mysql"?await Oo({tableName:e,db:t}):await go({tableName:e,db:t}),l=lr({cols:n,rows:i,format:o,tableName:e}),s;switch(o){case"csv":s="text/csv";break;case"xlsx":s="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":s="application/json";break}return new Response(l,{headers:{"Content-Type":s??"","Content-Disposition":`attachment; filename="${e}_export.${o}"`}})})});var pr={};yr(pr,{createServer:()=>Vn});import qe from"path";import{fileURLToPath as Fn}from"url";import{serveStatic as ve}from"@hono/node-server/serve-static";import{zValidator as Hn}from"@hono/zod-validator";import{Hono as Bn}from"hono";import{cors as jn}from"hono/cors";import{logger as Kn}from"hono/logger";import{prettyJSON as Wn}from"hono/pretty-json";var $e,Vn,dr=d(()=>{"use strict";J();pa();Ea();Pa();Ia();oo();ur();$e=()=>{if(process.env.NODE_ENV==="development")return qe.resolve(process.cwd(),"../core/dist");let a=qe.dirname(Fn(import.meta.url));return qe.resolve(a,"./core-dist")},Vn=()=>({app:new Bn({strict:!1}).use("/*",jn()).use(Wn({space:2})).use(process.env.NODE_ENV==="development"?Kn():(e,t)=>t()).use("/favicon.ico",ve({path:qe.resolve($e(),"favicon.ico")})).use("*",async(e,t)=>{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 t()}).onError(ma).route("/",xa).use("/assets/*",ve({root:$e()})).use("/image.png",ve({root:$e()})).use("/:dbType/*",Hn("param",wt,ua)).use("/:dbType/*",async(e,t)=>{let o=e.req.param("dbType");e.set("dbType",o),await t()}).route("/:dbType",mr).route("/:dbType",ao).route("/:dbType",Ma).route("/:dbType",ga).use("/*",ve({root:$e()}))})});ye();import{intro as zn,outro as Yn}from"@clack/prompts";import{serve as Qn}from"@hono/node-server";import ot from"picocolors";import{program as pt}from"commander";var dt=()=>(pt.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),pt.opts());import{readFile as br}from"fs/promises";import{resolve as Tr}from"path";import{cancel as be,isCancel as Me,note as ft,select as hr,spinner as gr,text as yt}from"@clack/prompts";import{parse as Er}from"dotenv";import Ie from"picocolors";var bt=async(a,e)=>{let t=e||"DATABASE_URL";if(a?.[t])return a[t];if(process.env[t])return process.env[t];let o=gr();o.start("Looking for database connection..."),a?ft(Ie.red(`${t} not found in .env or process.env`)):ft(Ie.red(`No .env file found and ${t} not set in process.env`));let r=await hr({message:`How do you want to provide ${t}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((Me(r)||r==="cancel")&&(be("No database connection provided. Exiting..."),process.exit(0)),r==="other-env"){o.start("Waiting for path...");let i=await yt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});Me(i)&&(be("Cancelled."),process.exit(0)),o.stop("Trying custom .env...");let l=Tr(i);try{let s=await br(l,"utf-8"),m=Er(s);if(m[t])return m[t];throw new Error(`${t} still missing in custom file`)}catch(s){let m=s;be(`Cannot read or parse file: ${Ie.dim(m.message)}`),process.exit(1)}}o.stop("Manual input...");let n=await yt({message:`Paste your ${t}`,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 Me(n)&&(be("Cancelled."),process.exit(0)),n.trim()};import{access as Sr,readFile as Rr}from"fs/promises";import{dirname as Cr,resolve as ke}from"path";import{parse as wr}from"dotenv";var Nr=async a=>{let e=ke(a);for(;;){let t=ke(e,".env");try{return await Sr(t),t}catch{}let o=Cr(e);if(o===e)return null;e=o}},te=async a=>{let e;if(a?e=ke(a):e=await Nr(process.cwd()),!e)return null;try{let t=await Rr(e,"utf-8");return wr(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};Oe();import{intro as Ar,outro as Dr}from"@clack/prompts";import Tt from"picocolors";var ht=()=>{Ar(Tt.inverse(" db-studio ")),Dr(Tt.green(`For more information, visit: ${mt.SITE_DOCS_LINK}`))};ye();import{intro as _r,note as xr,outro as gt}from"@clack/prompts";import Te from"picocolors";var Et=async(a,e,t)=>{_r(Te.inverse(" db-studio "));let o=t||Z.VAR_NAME,r=null;if(e)r=e;else{let n=a?await te(a):await te();n?.[o]?r=n[o]:process.env[o]&&(r=process.env[o]??null)}r?gt(Te.green(`\u2713 Database connection configured (using ${o})`)):(xr(Te.red(`\u2717 ${o} not found`),"Status"),gt(Te.yellow("\u26A0 No database connection configured")))};import{intro as Lr,outro as vr}from"@clack/prompts";import Rt from"picocolors";var St={name:"db-studio",type:"module",version:"1.5.0",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database","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",mysql2:"^3.18.2",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 Ct=()=>{Lr(Rt.inverse(" db-studio ")),vr(Rt.green(`\u{1F680} db-studio v${St.version}`))};var Gn=async()=>{let{env:a,port:e,databaseUrl:t,varName:o,status:r,help:n,version:i}=dt();n&&(ht(),process.exit(0)),i&&(Ct(),process.exit(0)),r&&(await Et(a,t,o),process.exit(0)),zn(ot.inverse(" db-studio "));let l=e?parseInt(e,10):Z.PORT,s=o||Z.VAR_NAME,m=a?await te(a):await te(),c=t||await bt(m,s);process.env.DATABASE_URL=c;let{createServer:p}=await Promise.resolve().then(()=>(dr(),pr)),{app:u}=p();Qn({fetch:u.fetch,port:l}),Yn(ot.green(`Server running at ${ot.cyan(`http://localhost:${l}`)}`))};Gn().catch(a=>{process.exit(1)});export{Gn as main};
608
+ ORDER BY array_position(i.indkey, a.attnum)`,[t])).rows.map(r=>r.column_name)},wr=async({tableName:a,cursor:e="",limit:t=50,direction:o="asc",sort:r=[],order:n="asc",filters:l=[],db:i})=>{let s=N(i),c=await Ai(s,a),m=[],p=n;Array.isArray(r)&&r.length>0?(m=r.map(D=>D.columnName),p=r[0].direction):typeof r=="string"&&r&&(m=[r]);let u=[...m,...c.filter(D=>!m.includes(D))];u.length===0&&u.push("ctid");let{clause:E,values:T}=Rr(l),y="",b=[];if(e){let D=Ri(e);if(D){let q=Sr(D,o,p,T.length+1);y=q.clause,b=q.values}}let g="";E&&y?g=`WHERE ${E.replace(/^WHERE\s+/i,"")} AND ${y}`:E?g=E:y&&(g=`WHERE ${y}`);let S=Ar((Array.isArray(r),r),n),_=S;o==="desc"?S?_=S.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):_=`ORDER BY ${u.map(q=>`"${q}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!S&&u.length>0&&(_=`ORDER BY ${u.map(q=>`"${q}" ${p.toUpperCase()}`).join(", ")}`);let v=await s.query(`SELECT COUNT(*) as total FROM "${a}" ${E}`,T),k=Number(v.rows[0].total),H=T.length+b.length+1,B=await s.query(`SELECT * FROM "${a}" ${g} ${_} LIMIT $${H}`,[...T,...b,t+1]),w=B.fields&&B.fields.length>0?B.rows.filter(D=>Object.keys(D).length>0):B.rows,U=w.length>t;U&&(w=w.slice(0,t)),o==="desc"&&(w=w.reverse());let Y=null,I=null;if(w.length>0){let D=w[0],q=w[w.length-1],oe=Ne=>({values:Object.fromEntries(u.map(bt=>[bt,Ne[bt]])),sortColumns:u});o==="asc"?(U&&(Y=Fe(oe(q))),e&&(I=Fe(oe(D)))):(e&&(Y=Fe(oe(q))),U&&(I=Fe(oe(D))))}return{data:w,meta:{limit:t,total:k,hasNextPage:o==="asc"?U:!!e,hasPreviousPage:o==="asc"?!!e:U,nextCursor:Y,prevCursor:I}}}});import{HTTPException as He}from"hono/http-exception";async function Lr({params:a,db:e}){let{tableName:t,updates:o,primaryKey:r}=a,n=N(e),l=new Map;for(let i of o){let s=i.rowData[r];if(s==null)throw new He(400,{message:`Primary key "${r}" not found in row data. Please ensure the row has a "${r}" column.`});l.has(s)||l.set(s,[]),l.get(s)?.push({columnName:i.columnName,value:i.value,rowData:i.rowData})}await n.query("BEGIN");try{let i=0;for(let[s,c]of l.entries()){let m=c.map((T,y)=>`"${T.columnName}" = $${y+1}`),p=c.map(T=>T.value!==null&&typeof T.value=="object"?JSON.stringify(T.value):T.value);p.push(s);let u=`
609
+ UPDATE "${t}"
610
+ SET ${m.join(", ")}
611
+ WHERE "${r}" = $${p.length}
612
+ RETURNING *
613
+ `,E=await n.query(u,p);if(E.rowCount===0)throw new He(404,{message:`Record with ${r} = ${s} not found in table "${t}"`});i+=E.rowCount??0}return await n.query("COMMIT"),{updatedCount:i}}catch(i){throw await n.query("ROLLBACK"),i instanceof He?i:new He(500,{message:`Failed to update records in "${t}"`})}}var xr=d(()=>{"use strict";h()});function O(a){return wi[a]}var wi,ge=d(()=>{"use strict";qa();va();Ua();ja();Wa();za();Xa();eo();ao();ro();so();mo();fo();To();No();Ro();So();Te();wo();xo();Oo();Io();$o();ko();Fo();Ko();Yo();Go();Zo();tr();or();Ee();nr();lr();fr();yr();Er();at();hr();Cr();Dr();xr();wi={pg:{addRecord:Ia,bulkInsertRecords:$a,createTable:ka,getDatabasesList:Fa,getCurrentDatabase:Ha,getDatabaseConnectionInfo:Ba,deleteColumn:Va,deleteRecords:Ya,forceDeleteRecords:Qa,deleteTable:Ja,exportTableData:Za,executeQuery:Tr,getTableColumns:Me,getTablesList:gr,getTableSchema:Nr,getTableData:wr,updateRecords:Lr},mysql:{addRecord:qo,bulkInsertRecords:vo,createTable:Uo,getDatabasesList:Ho,getCurrentDatabase:Bo,getDatabaseConnectionInfo:jo,deleteColumn:Wo,deleteRecords:Qo,forceDeleteRecords:zo,deleteTable:Xo,exportTableData:er,executeQuery:ar,getTableColumns:te,getTablesList:rr,getTableSchema:ir,getTableData:dr,updateRecords:br},mssql:{addRecord:to,bulkInsertRecords:oo,createTable:no,getDatabasesList:io,getCurrentDatabase:lo,getDatabaseConnectionInfo:co,deleteColumn:po,deleteRecords:bo,forceDeleteRecords:yo,deleteTable:ho,exportTableData:Co,executeQuery:Ao,getTableColumns:ee,getTablesList:_o,getTableSchema:Lo,getTableData:Mo,updateRecords:Po}}});import{Hono as Di}from"hono";var Mr,Or=d(()=>{"use strict";ge();h();Mr=new Di().basePath("/databases").get("/",async a=>{let e=xe(),o=await O(e).getDatabasesList();return a.json({data:{databases:o,dbType:e}},200)}).get("/current",async a=>{let e=xe(),o=await O(e).getCurrentDatabase();return a.json({data:{db:o.db,dbType:e}},200)}).get("/connection",async a=>{let e=xe(),o=await O(e).getDatabaseConnectionInfo();return a.json({data:o},200)})});import{zValidator as Pr}from"@hono/zod-validator";import{Hono as Li}from"hono";var Ir,qr=d(()=>{"use strict";J();ge();Ir=new Li().basePath("/query").post("/",Pr("query",A),Pr("json",ma),async a=>{let{query:e}=a.req.valid("json"),{db:t}=a.req.valid("query"),o=a.get("dbType"),n=await O(o).executeQuery({query:e,db:t});return a.json({data:n},200)})});import{zValidator as X}from"@hono/zod-validator";import{Hono as xi}from"hono";var $r,vr=d(()=>{"use strict";J();ge();$r=new xi().basePath("/records").post("/",X("query",A),X("json",vt),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,data:o}=a.req.valid("json"),r=a.get("dbType"),n=O(r),{insertedCount:l}=await n.addRecord({db:e,params:{tableName:t,data:o}});return a.json({data:`Record inserted into "${t}" with ${l} rows inserted`},200)}).patch("/",X("query",A),X("json",Na),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,primaryKey:o,updates:r}=a.req.valid("json"),n=a.get("dbType"),l=O(n),{updatedCount:i}=await l.updateRecords({params:{tableName:t,primaryKey:o,updates:r},db:e});return a.json({data:`Updated ${i} records in "${t}"`},200)}).delete("/",X("query",A),X("json",Ge),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,primaryKeys:o}=a.req.valid("json"),r=a.get("dbType"),n=O(r),{deletedCount:l,fkViolation:i,relatedRecords:s}=await n.deleteRecords({tableName:t,primaryKeys:o,db:e});return i?a.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:s}},409):a.json({data:{deletedCount:l,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",X("query",A),X("json",Ge),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,primaryKeys:o}=a.req.valid("json"),r=a.get("dbType"),l=await O(r).forceDeleteRecords({tableName:t,primaryKeys:o,db:e});return a.json({data:l},200)}).post("/bulk",X("query",A),X("json",Bt),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,records:o}=a.req.valid("json"),r=a.get("dbType"),l=await O(r).bulkInsertRecords({tableName:t,records:o,db:e});return a.json({data:l},200)})});import{HTTPException as kr}from"hono/http-exception";async function Ur(a){let{tableName:e,columnName:t,columnType:o,defaultValue:r,isPrimaryKey:n,isNullable:l,isUnique:i,isIdentity:s,isArray:c,db:m}=a,p=N(m),u=`
614
+ SELECT EXISTS (
615
+ SELECT 1 FROM information_schema.tables
616
+ WHERE table_name = $1 AND table_schema = 'public'
617
+ ) as exists;
618
+ `,{rows:E}=await p.query(u,[e]);if(!E[0]?.exists)throw new kr(404,{message:`Table "${e}" does not exist`});let T=`
619
+ SELECT EXISTS (
620
+ SELECT 1 FROM information_schema.columns
621
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
622
+ ) as exists;
623
+ `,{rows:y}=await p.query(T,[e,t]);if(y[0]?.exists)throw new kr(409,{message:`Column "${t}" already exists in table "${e}"`});let b=`"${t}" ${o}`;c&&(b+="[]"),n&&(b+=" PRIMARY KEY"),i&&!n&&(b+=" UNIQUE"),l||(b+=" NOT NULL"),s&&(b+=" GENERATED ALWAYS AS IDENTITY"),r?.trim()&&!s&&(b+=` DEFAULT ${r.trim()}`),await p.query(`ALTER TABLE "${e}" ADD COLUMN ${b}`)}var Fr=d(()=>{"use strict";h()});import{HTTPException as Hr}from"hono/http-exception";async function Br(a){let{tableName:e,columnName:t,columnType:o,isNullable:r,defaultValue:n,db:l}=a,i=N(l),s=`
624
+ SELECT EXISTS (
625
+ SELECT 1 FROM information_schema.tables
626
+ WHERE table_name = $1 AND table_schema = 'public'
627
+ ) as exists;
628
+ `,{rows:c}=await i.query(s,[e]);if(!c[0]?.exists)throw new Hr(404,{message:`Table "${e}" does not exist`});let m=`
629
+ SELECT EXISTS (
630
+ SELECT 1 FROM information_schema.columns
631
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
632
+ ) as exists;
633
+ `,{rows:p}=await i.query(m,[e,t]);if(!p[0]?.exists)throw new Hr(404,{message:`Column "${t}" does not exist in table "${e}"`});let u=await i.connect();try{await u.query("BEGIN"),await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" TYPE ${o}`),await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" ${r?"DROP":"SET"} NOT NULL`),n?.trim()?await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" SET DEFAULT ${n.trim()}`):await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${t}" DROP DEFAULT`),await u.query("COMMIT")}catch(E){throw await u.query("ROLLBACK"),E}finally{u.release()}}var jr=d(()=>{"use strict";h()});import{HTTPException as Kr}from"hono/http-exception";async function Vr(a){let{tableName:e,columnName:t,columnType:o,defaultValue:r,isPrimaryKey:n,isNullable:l,isUnique:i,isIdentity:s,isArray:c,db:m}=a,p=C(m),[u]=await p.execute(`SELECT COUNT(*) as cnt
634
+ FROM information_schema.TABLES
635
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new Kr(404,{message:`Table "${e}" does not exist`});let[T]=await p.execute(`SELECT COUNT(*) as cnt
636
+ FROM information_schema.COLUMNS
637
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,t]);if(Number(T[0]?.cnt??0)>0)throw new Kr(409,{message:`Column "${t}" already exists in table "${e}"`});let b=pe({columnName:t,columnType:o,defaultValue:r,isPrimaryKey:n,isNullable:l,isUnique:i,isIdentity:s,isArray:c},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${e}\` ADD COLUMN ${b}`)}var Wr=d(()=>{"use strict";h();ve()});import{HTTPException as Yr}from"hono/http-exception";async function Qr(a){let{tableName:e,columnName:t,columnType:o,isNullable:r,defaultValue:n,db:l}=a,i=C(l),[s]=await i.execute(`SELECT COUNT(*) as cnt
638
+ FROM information_schema.TABLES
639
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(s[0]?.cnt??0)>0))throw new Yr(404,{message:`Table "${e}" does not exist`});let[m]=await i.execute(`SELECT EXTRA
640
+ FROM information_schema.COLUMNS
641
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?
642
+ LIMIT 1`,[e,t]),p=m[0];if(!p)throw new Yr(404,{message:`Column "${t}" does not exist in table "${e}"`});let u=pe({columnName:t,columnType:o,defaultValue:n,isNullable:r},{preserveAutoIncrement:p.EXTRA?.toLowerCase().includes("auto_increment")});await i.execute(`ALTER TABLE \`${e}\` MODIFY COLUMN ${u}`)}var zr=d(()=>{"use strict";h();ve()});import{HTTPException as pt}from"hono/http-exception";async function Gr(a){let{tableName:e,columnName:t,newColumnName:o,db:r}=a,n=C(r),[l]=await n.execute(`SELECT COUNT(*) as cnt
643
+ FROM information_schema.TABLES
644
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(l[0]?.cnt??0)>0))throw new pt(404,{message:`Table "${e}" does not exist`});let[s]=await n.execute(`SELECT COUNT(*) as cnt
645
+ FROM information_schema.COLUMNS
646
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,t]);if(!(Number(s[0]?.cnt??0)>0))throw new pt(404,{message:`Column "${t}" does not exist in table "${e}"`});let[m]=await n.execute(`SELECT COUNT(*) as cnt
647
+ FROM information_schema.COLUMNS
648
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(Number(m[0]?.cnt??0)>0)throw new pt(409,{message:`Column "${o}" already exists in table "${e}"`});await n.execute(`ALTER TABLE \`${e}\` RENAME COLUMN \`${t}\` TO \`${o}\``)}var Jr=d(()=>{"use strict";h()});import{HTTPException as dt}from"hono/http-exception";async function Xr(a){let{tableName:e,columnName:t,newColumnName:o,db:r}=a,n=N(r),l=`
649
+ SELECT EXISTS (
650
+ SELECT 1 FROM information_schema.tables
651
+ WHERE table_name = $1 AND table_schema = 'public'
652
+ ) as exists;
653
+ `,{rows:i}=await n.query(l,[e]);if(!i[0]?.exists)throw new dt(404,{message:`Table "${e}" does not exist`});let s=`
654
+ SELECT EXISTS (
655
+ SELECT 1 FROM information_schema.columns
656
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
657
+ ) as exists;
658
+ `,{rows:c}=await n.query(s,[e,t]);if(!c[0]?.exists)throw new dt(404,{message:`Column "${t}" does not exist in table "${e}"`});let{rows:m}=await n.query(s,[e,o]);if(m[0]?.exists)throw new dt(409,{message:`Column "${o}" already exists in table "${e}"`});await n.query(`ALTER TABLE "${e}" RENAME COLUMN "${t}" TO "${o}"`)}var Zr=d(()=>{"use strict";h()});import{utils as he,write as Mi}from"xlsx";function en({cols:a,rows:e,format:t,tableName:o}){switch(t){case"json":{let r=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(r,"utf-8"))}case"csv":{let r=[a,...e?.map(i=>a?.map(s=>i[s]))??[]],n=he.aoa_to_sheet(r),l=he.sheet_to_csv(n);return new Uint8Array(Buffer.from(l,"utf-8"))}case"xlsx":{let r=[a,...e?.map(s=>a?.map(c=>s[c]))??[]],n=he.aoa_to_sheet(r),l=he.book_new();he.book_append_sheet(l,n,o.slice(0,31));let i=Mi(l,{bookType:"xlsx",type:"buffer"});return new Uint8Array(i)}}}var tn=d(()=>{"use strict"});import{zValidator as x}from"@hono/zod-validator";import{Hono as Oi}from"hono";var an,on=d(()=>{"use strict";J();Fr();jr();ge();Wr();zr();Jr();Zr();tn();an=new Oi().basePath("/tables").get("/",x("query",A),async a=>{let{db:e}=a.req.valid("query"),t=a.get("dbType"),r=await O(t).getTablesList(e);return a.json({data:r},200)}).post("/",x("query",A),x("json",ta),async a=>{let{db:e}=a.req.valid("query"),t=a.req.valid("json"),o=a.get("dbType");return await O(o).createTable({tableData:t,db:e}),a.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",x("query",ia),x("param",Z),async a=>{let{db:e,cascade:t}=a.req.valid("query"),{tableName:o}=a.req.valid("param"),r=a.get("dbType"),l=await O(r).deleteTable({tableName:o,db:e,cascade:t});return a.json({data:l},200)}).delete("/:tableName/columns/:columnName",x("query",Ut),x("param",j),async a=>{let{db:e,cascade:t}=a.req.valid("query"),{tableName:o,columnName:r}=a.req.valid("param"),n=a.get("dbType"),l=O(n),{deletedCount:i}=await l.deleteColumn({tableName:o,columnName:r,cascade:t,db:e});return a.json({data:`Column "${r}" deleted successfully from table "${o}" with ${i} rows deleted`},200)}).post("/:tableName/columns",x("query",A),x("param",Z),x("json",z),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.req.valid("json");return a.get("dbType")==="mysql"?await Vr({tableName:t,db:e,...o}):await Ur({tableName:t,db:e,...o}),a.json({data:`Column "${o.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",x("query",A),x("param",j),x("json",Xe),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,columnName:o}=a.req.valid("param"),r=a.req.valid("json");return a.get("dbType")==="mysql"?await Gr({tableName:t,columnName:o,db:e,...r}):await Xr({tableName:t,columnName:o,db:e,...r}),a.json({data:`Column "${o}" renamed to "${r.newColumnName}" in table "${t}"`},200)}).patch("/:tableName/columns/:columnName",x("query",A),x("param",j),x("json",ye),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,columnName:o}=a.req.valid("param"),r=a.req.valid("json");return a.get("dbType")==="mysql"?await Qr({tableName:t,columnName:o,db:e,...r}):await Br({tableName:t,columnName:o,db:e,...r}),a.json({data:`Column "${o}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",x("query",A),x("param",Z),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.get("dbType"),n=await O(o).getTableColumns({tableName:t,db:e});return a.json({data:n},200)}).get("/:tableName/schema",x("query",A),x("param",Z),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.get("dbType"),n=await O(o).getTableSchema({tableName:t,db:e});return a.json({data:{schema:n}},200)}).get("/:tableName/data",x("param",Z),x("query",ya),async a=>{let{tableName:e}=a.req.valid("param"),{cursor:t,limit:o,direction:r,sort:n,order:l,filters:i,db:s}=a.req.valid("query"),c=a.get("dbType"),p=await O(c).getTableData({tableName:e,cursor:t,limit:o,direction:r,sort:n,order:l,filters:i,db:s});return a.json({data:p},200)}).get("/:tableName/export",x("param",Z),x("query",pa),async a=>{let{tableName:e}=a.req.valid("param"),{db:t,format:o}=a.req.valid("query"),r=a.get("dbType"),n=O(r),{cols:l,rows:i}=await n.exportTableData({tableName:e,db:t}),s=en({cols:l,rows:i,format:o,tableName:e}),c;switch(o){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(s,{headers:{"Content-Type":c??"","Content-Disposition":`attachment; filename="${e}_export.${o}"`}})})});var rn={};ln(rn,{createServer:()=>Ui});import Ke from"path";import{fileURLToPath as Pi}from"url";import{serveStatic as Be}from"@hono/node-server/serve-static";import{zValidator as Ii}from"@hono/zod-validator";import{Hono as qi}from"hono";import{cors as $i}from"hono/cors";import{logger as vi}from"hono/logger";import{prettyJSON as ki}from"hono/pretty-json";var je,Ui,nn=d(()=>{"use strict";J();Sa();Pa();Or();qr();vr();on();je=()=>{if(process.env.NODE_ENV==="development")return Ke.resolve(process.cwd(),"../core/dist");let a=Ke.dirname(Pi(import.meta.url));return Ke.resolve(a,"./core-dist")},Ui=()=>({app:new qi({strict:!1}).use("/*",$i()).use(ki({space:2})).use(process.env.NODE_ENV==="development"?vi():(e,t)=>t()).use("/favicon.ico",Be({path:Ke.resolve(je(),"favicon.ico")})).use("*",async(e,t)=>{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 t()}).onError(Ra).route("/",Mr).use("/assets/*",Be({root:je()})).use("/image.png",Be({root:je()})).use("/:dbType/*",Ii("param",qt,Aa)).use("/:dbType/*",async(e,t)=>{let o=e.req.param("dbType");e.set("dbType",o),await t()}).route("/:dbType",an).route("/:dbType",$r).route("/:dbType",Ir).route("/:dbType",Oa).use("/*",Be({root:je()}))})});Ce();import{intro as Fi,outro as Hi}from"@clack/prompts";import{serve as Bi}from"@hono/node-server";import ft from"picocolors";import{program as Rt}from"commander";var At=()=>(Rt.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),Rt.opts());import{readFile as cn}from"fs/promises";import{resolve as mn}from"path";import{cancel as Re,isCancel as We,note as St,select as un,spinner as pn,text as _t}from"@clack/prompts";import{parse as dn}from"dotenv";import Ye from"picocolors";var wt=async(a,e)=>{let t=e||"DATABASE_URL";if(a?.[t])return a[t];if(process.env[t])return process.env[t];let o=pn();o.start("Looking for database connection..."),a?St(Ye.red(`${t} not found in .env or process.env`)):St(Ye.red(`No .env file found and ${t} not set in process.env`));let r=await un({message:`How do you want to provide ${t}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((We(r)||r==="cancel")&&(Re("No database connection provided. Exiting..."),process.exit(0)),r==="other-env"){o.start("Waiting for path...");let l=await _t({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});We(l)&&(Re("Cancelled."),process.exit(0)),o.stop("Trying custom .env...");let i=mn(l);try{let s=await cn(i,"utf-8"),c=dn(s);if(c[t])return c[t];throw new Error(`${t} still missing in custom file`)}catch(s){let c=s;Re(`Cannot read or parse file: ${Ye.dim(c.message)}`),process.exit(1)}}o.stop("Manual input...");let n=await _t({message:`Paste your ${t}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(l){if(!l?.trim())return"Connection string is required!";try{new URL(l);return}catch{return"Must be a valid URL format"}}});return We(n)&&(Re("Cancelled."),process.exit(0)),n.trim()};import{access as fn,readFile as bn}from"fs/promises";import{dirname as yn,resolve as Qe}from"path";import{parse as Tn}from"dotenv";var En=async a=>{let e=Qe(a);for(;;){let t=Qe(e,".env");try{return await fn(t),t}catch{}let o=yn(e);if(o===e)return null;e=o}},re=async a=>{let e;if(a?e=Qe(a):e=await En(process.cwd()),!e)return null;try{let t=await bn(e,"utf-8");return Tn(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};Ve();import{intro as gn,outro as hn}from"@clack/prompts";import Dt from"picocolors";var Lt=()=>{gn(Dt.inverse(" db-studio ")),hn(Dt.green(`For more information, visit: ${Nt.SITE_DOCS_LINK}`))};Ce();import{intro as Nn,note as Cn,outro as xt}from"@clack/prompts";import Ae from"picocolors";var Mt=async(a,e,t)=>{Nn(Ae.inverse(" db-studio "));let o=t||ae.VAR_NAME,r=null;if(e)r=e;else{let n=a?await re(a):await re();n?.[o]?r=n[o]:process.env[o]&&(r=process.env[o]??null)}r?xt(Ae.green(`\u2713 Database connection configured (using ${o})`)):(Cn(Ae.red(`\u2717 ${o} not found`),"Status"),xt(Ae.yellow("\u26A0 No database connection configured")))};import{intro as An,outro as Sn}from"@clack/prompts";import Pt from"picocolors";var Ot={name:"db-studio",type:"module",version:"1.6.2",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <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",mssql:"^12.2.0",mysql2:"^3.18.2",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","@types/mssql":"^9.1.9","@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 It=()=>{An(Pt.inverse(" db-studio ")),Sn(Pt.green(`\u{1F680} db-studio v${Ot.version}`))};var ji=async()=>{let{env:a,port:e,databaseUrl:t,varName:o,status:r,help:n,version:l}=At();n&&(Lt(),process.exit(0)),l&&(It(),process.exit(0)),r&&(await Mt(a,t,o),process.exit(0)),Fi(ft.inverse(" db-studio "));let i=e?parseInt(e,10):ae.PORT,s=o||ae.VAR_NAME,c=a?await re(a):await re(),m=t||await wt(c,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(nn(),rn)),{app:u}=p();Bi({fetch:u.fetch,port:i}),Hi(ft.green(`Server running at ${ft.cyan(`http://localhost:${i}`)}`))};ji().catch(a=>{process.exit(1)});export{ji as main};
443
659
  //# sourceMappingURL=index.js.map