db-studio 1.5.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/core-dist/assets/{_pathlessLayout-B3hOmNOY.js → _pathlessLayout-BLRwD5g-.js} +1 -1
  2. package/dist/core-dist/assets/_queryId-BROKSsgS.js +1 -0
  3. package/dist/core-dist/assets/_table-CrFsb8Bd.js +8 -0
  4. package/dist/core-dist/assets/{_table-DIbBLMgY.js → _table-LJbpBTkW.js} +2 -2
  5. package/dist/core-dist/assets/cdoe-editor-CXS1wJCV.js +9 -0
  6. package/dist/core-dist/assets/{dialog-BtqI2R7E.js → dialog-NOXqo2EN.js} +1 -1
  7. package/dist/core-dist/assets/{index-CESnXcY7.js → index-Crj0r42w.js} +1 -1
  8. package/dist/core-dist/assets/index-D7H4Bs2r.js +57 -0
  9. package/dist/core-dist/assets/index-D7q1LI5S.js +1 -0
  10. package/dist/core-dist/assets/{queries.store-DCqn9r_M.js → queries.store-wzDhN-Dv.js} +1 -1
  11. package/dist/core-dist/assets/{runner-tab-CloOoJUy.js → runner-tab-BpzninmR.js} +9 -3
  12. package/dist/core-dist/assets/{scroll-area-D613A-kL.js → scroll-area-B8tj0yXD.js} +1 -1
  13. package/dist/core-dist/assets/{tooltip-B4cd0H8Q.js → tooltip-TM7R5amY.js} +1 -1
  14. package/dist/core-dist/assets/{use-delete-column-DxoXObaz.js → use-delete-column-kH939ilb.js} +1 -1
  15. package/dist/core-dist/index.html +1 -1
  16. package/dist/index.js +471 -196
  17. package/dist/index.js.map +1 -1
  18. package/package.json +5 -2
  19. package/dist/core-dist/assets/_queryId-B-Yx8vY8.js +0 -1
  20. package/dist/core-dist/assets/_table-C9ZV09Jc.js +0 -8
  21. package/dist/core-dist/assets/cdoe-editor-BUyGnaMR.js +0 -9
  22. package/dist/core-dist/assets/index-BV7euJxs.js +0 -1
  23. package/dist/core-dist/assets/index-DO_12lzR.js +0 -58
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:["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 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,Ir,Mr,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"},Ir=["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"],Mr=F.enum(Ir),mi=F.object({columnName:F.string(),dataType:Or,dataTypeLabel:Mr,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 It(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 Mt(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 Mi,Ee,ki,Wr,Ui,oa,ra=d(()=>{"use strict";B();Mi=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 is=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pt=(t,e)=>{for(var o in e)is(t,o,{get:e[o],enumerable:!0})};var It=f(()=>{"use strict"});var $t=f(()=>{"use strict"});var qt=f(()=>{"use strict"});var se,kt=f(()=>{"use strict";se={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 vt=f(()=>{"use strict"});var Ut,nt=f(()=>{"use strict";Ut={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 Ft=f(()=>{"use strict"});var Pe=f(()=>{"use strict";It();$t();qt();kt();vt();nt();Ft()});import{z as pe}from"zod";var w,As,qe,Kl,Zt,ee,Q=f(()=>{"use strict";w=pe.object({db:pe.string("Database name is required")}),As=["pg","mysql","mssql","mongodb"],qe=pe.enum(As,{message:"Invalid database type"}),Kl=w.extend({dbType:qe}),Zt=pe.object({dbType:qe}),ee=pe.object({tableName:pe.string("Table name is required")})});import{z}from"zod";var G,Yl,eo=f(()=>{"use strict";Q();G=z.object({columnName:z.string("Column name is required"),columnType:z.string("Column type is required"),defaultValue:z.string().optional(),isPrimaryKey:z.boolean().default(!1),isNullable:z.boolean().default(!1),isUnique:z.boolean().default(!1),isIdentity:z.boolean().default(!1),isArray:z.boolean().default(!1)}),Yl=z.object({db:w.shape.db,tableName:ee.shape.tableName,columnName:G.shape.columnName,columnType:G.shape.columnType,defaultValue:G.shape.defaultValue,isPrimaryKey:G.shape.isPrimaryKey,isNullable:G.shape.isNullable,isUnique:G.shape.isUnique,isIdentity:G.shape.isIdentity,isArray:G.shape.isArray})});import{z as Re}from"zod";var to,oo=f(()=>{"use strict";to=Re.object({tableName:Re.string("Table name is required"),data:Re.record(Re.string("Column name is required"),Re.any())})});import{z as W}from"zod";var ao,K,em,tm,ke=f(()=>{"use strict";Q();ao=w.extend({cascade:W.string().optional().transform(t=>t==="true")}),K=W.object({tableName:W.string("Table name is required"),columnName:W.string("Column name is required")}),em=W.object({db:w.shape.db,tableName:K.shape.tableName,columnName:K.shape.columnName,cascade:W.boolean().optional()}),tm=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 Ne}from"zod";var Ae,sm,no=f(()=>{"use strict";Q();ke();Ae=Ne.object({columnType:Ne.string("Column type is required"),isNullable:Ne.boolean(),defaultValue:Ne.string().nullable().optional()}),sm=Ne.object({db:w.shape.db,tableName:K.shape.tableName,columnName:K.shape.columnName,columnType:Ae.shape.columnType,isNullable:Ae.shape.isNullable,defaultValue:Ae.shape.defaultValue})});var ro=f(()=>{"use strict"});import{z as de}from"zod";var so,io=f(()=>{"use strict";so=de.object({tableName:de.string().min(1,"Table name is required"),records:de.array(de.record(de.string(),de.any())).min(1,"At least one record is required")})});import{z as fe}from"zod";var co,lo=f(()=>{"use strict";Q();co=fe.object({messages:fe.array(fe.object({role:fe.enum(["user","assistant"]),content:fe.string("Content is required")})),conversationId:fe.string().optional(),db:w.shape.db})});var mo=f(()=>{"use strict"});import{z as V}from"zod";var ws,Ds,I,_s,Ms,fm,ct=f(()=>{"use strict";ws=["text","boolean","number","enum","json","date","array"],Ds=V.enum(ws),I={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},_s=["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"],Ms=V.enum(_s),fm=V.object({columnName:V.string(),dataType:Ds,dataTypeLabel:Ms,isNullable:V.boolean(),columnDefault:V.string().nullable(),isPrimaryKey:V.boolean(),isForeignKey:V.boolean(),referencedTable:V.string().nullable(),referencedColumn:V.string().nullable(),enumValues:V.array(V.string()).nullable()})});function uo(t){let e=t?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?I.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"?I.number:e==="boolean"||e==="bool"?I.boolean:e==="json"||e==="jsonb"?I.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?I.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"?I.text:I.text}function po(t){if(!t)return T.text;let e=t.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?T.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?T.bigint:e==="smallint"||e==="int2"?T.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?T.numeric:e==="real"||e==="float4"?T.float:e==="double precision"||e==="float8"||e==="float"?T.double:e==="money"?T.money:e==="boolean"||e==="bool"?T.boolean:e==="text"?T.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?T.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?T.char:e==="json"?T.json:e==="jsonb"?T.jsonb:e==="xml"?T.xml:e==="uuid"?T.uuid:e==="date"?T.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?T.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?T.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?T.timestamptz:e==="interval"||e.startsWith("interval")?T.interval:e==="bytea"?T.bytea:e==="inet"?T.inet:e==="cidr"?T.cidr:e==="macaddr"?T.macaddr:e==="macaddr8"?T.macaddr8:e==="point"?T.point:e==="line"?T.line:e==="polygon"?T.polygon:e.startsWith("array")||e.includes("[]")?T.text:e.startsWith("user-defined")||e==="enum"?T.enum:T.text}function fo(t,e){let o=t?.toLowerCase().trim()||"",a=e?.toLowerCase().trim()||"";return o==="tinyint"&&a==="tinyint(1)"?I.boolean:o==="tinyint"||o==="smallint"||o==="mediumint"||o==="int"||o==="integer"||o==="bigint"||o==="decimal"||o==="numeric"||o==="float"||o==="double"||o==="real"||o==="bit"?I.number:o==="boolean"||o==="bool"?I.boolean:o==="date"||o==="datetime"||o==="timestamp"||o==="time"||o==="year"?I.date:o==="json"?I.json:o==="enum"||o==="set"?I.enum:I.text}function bo(t,e){if(!t)return T.text;let o=t.toLowerCase().trim(),a=e?.toLowerCase().trim()||"";return o==="tinyint"&&a==="tinyint(1)"?T.boolean:o==="tinyint"?T.tinyint:o==="smallint"?T.smallint:o==="mediumint"?T.mediumint:o==="int"||o==="integer"?T.int:o==="bigint"?T.bigint:o==="decimal"||o==="numeric"?T.numeric:o==="float"||o==="real"?T.float:o==="double"?T.double:o==="bit"?T.bit:o==="boolean"||o==="bool"?T.boolean:o==="char"?T.char:o==="varchar"?T.varchar:o==="tinytext"?T.tinytext:o==="text"?T.text:o==="mediumtext"?T.mediumtext:o==="longtext"?T.longtext:o==="binary"?T.binary:o==="varbinary"?T.varbinary:o==="tinyblob"?T.tinyblob:o==="blob"?T.blob:o==="mediumblob"?T.mediumblob:o==="longblob"?T.longblob:o==="json"?T.json:o==="date"?T.date:o==="time"?T.time:o==="datetime"?T.datetime:o==="timestamp"?T.timestamp:o==="year"?T.year:o==="enum"?T.enum:o==="set"?T.set:T.text}function yo(t){let e=t?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?I.number:e==="bit"?I.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?I.date:e==="json"?I.json:I.text}function go(t){if(!t)return T.text;let e=t.toLowerCase().trim();return e==="tinyint"?T.tinyint:e==="smallint"?T.smallint:e==="int"?T.int:e==="bigint"?T.bigint:e==="decimal"||e==="numeric"?T.numeric:e==="float"||e==="real"?T.float:e==="money"||e==="smallmoney"?T.money:e==="bit"?T.boolean:e==="char"?T.char:e==="varchar"?T.varchar:e==="text"?T.text:e==="nchar"?T.char:e==="nvarchar"?T.varchar:e==="ntext"?T.text:e==="binary"?T.binary:e==="varbinary"?T.varbinary:e==="image"?T.blob:e==="uniqueidentifier"?T.uuid:e==="date"?T.date:e==="time"?T.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?T.datetime:e==="datetimeoffset"?T.timestamptz:e==="json"?T.json:e==="xml"?T.xml:T.text}var T,To=f(()=>{"use strict";ct();T={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 U}from"zod";var xs,Eo,Ls,Os,ho,Co=f(()=>{"use strict";xs=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Eo=U.enum(xs),Ls=U.object({columnName:U.string("Column name is required"),columnType:U.string("Column type is required"),defaultValue:U.string().optional(),isPrimaryKey:U.boolean().default(!1),isNullable:U.boolean().default(!1),isUnique:U.boolean().default(!1),isIdentity:U.boolean().default(!1),isArray:U.boolean().default(!1)}),Os=U.object({columnName:U.string("Column name is required"),referencedTable:U.string("Referenced table is required"),referencedColumn:U.string("Referenced column is required"),onUpdate:Eo.default("NO ACTION"),onDelete:Eo.default("NO ACTION")}),ho=U.object({tableName:U.string("Table name is required"),fields:U.array(Ls).min(1,"At least one field is required"),foreignKeys:U.array(Os).optional()})});import{z as B}from"zod";var Ps,Sm,So,Ro=f(()=>{"use strict";Q();Ps=B.object({name:B.string("Name is required"),size:B.string("Size is required"),owner:B.string("Owner is required"),encoding:B.string("Encoding is required")}),Sm=B.object({databases:B.array(Ps),dbType:qe}),So=B.object({version:B.string("Version is required"),database:B.string("Database is required"),user:B.string("User is required"),host:B.string("Host is required").nullable(),port:B.number("Port is required").nullable(),active_connections:B.coerce.number("Active connections is required"),max_connections:B.coerce.number("Max connections is required")})});var No=f(()=>{"use strict"});import{z as be}from"zod";var lt,Ao=f(()=>{"use strict";lt=be.object({tableName:be.string("Table name is required"),primaryKeys:be.array(be.object({columnName:be.string("Column name is required"),value:be.any()})).min(1,"At least one primary key is required")})});import{z as Is}from"zod";var wo,Do=f(()=>{"use strict";Q();wo=w.extend({cascade:Is.string().optional().transform(t=>t==="true")})});import{z as _o}from"zod";var Mo,xo=f(()=>{"use strict";Mo=_o.object({query:_o.string("Query is required")})});import{z as $s}from"zod";var qs,Lo,Oo=f(()=>{"use strict";Q();qs=["csv","xlsx","json"],Lo=w.extend({format:$s.enum(qs,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var Po=f(()=>{"use strict"});import{z as mt}from"zod";var ut,km,Io=f(()=>{"use strict";Q();ke();ut=mt.object({newColumnName:mt.string("New column name is required")}),km=mt.object({db:w.shape.db,tableName:K.shape.tableName,columnName:K.shape.columnName,newColumnName:ut.shape.newColumnName})});import{z as M}from"zod";var Bm,ve,Hm,ks,jm,$o,qo=f(()=>{"use strict";Q();Bm=M.object({columnName:M.string(),operator:M.string(),value:M.string()}),ve=["asc","desc"],Hm=M.object({columnName:M.string(),direction:M.enum(ve)}),ks=M.object({limit:M.number(),total:M.number(),hasNextPage:M.boolean(),hasPreviousPage:M.boolean(),nextCursor:M.string().nullable(),prevCursor:M.string().nullable()}),jm=M.object({data:M.array(M.record(M.string(),M.unknown())),meta:ks}),$o=M.object({db:w.shape.db,cursor:M.string().optional(),limit:M.string().optional().default("50").transform(Number),direction:M.enum(ve).optional().default(ve[0]),sort:M.string().optional().transform(t=>{if(!t)return"";try{let e=JSON.parse(t);return Array.isArray(e)?e:t}catch{return t}}),order:M.enum(ve).optional(),filters:M.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})})});import{z as pt}from"zod";var Qm,ko=f(()=>{"use strict";Qm=pt.object({tableName:pt.string("Table name is required"),rowCount:pt.coerce.number("Row count is required")})});import{z as vo}from"zod";var zm,Uo=f(()=>{"use strict";zm=vo.object({schema:vo.string()})});import{z as J}from"zod";var Fo,Bo=f(()=>{"use strict";Fo=J.object({tableName:J.string("Table name is required"),primaryKey:J.string("Primary key is required").default("id"),updates:J.array(J.object({rowData:J.record(J.string("Column name is required"),J.any()),columnName:J.string("Column name is required"),value:J.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var X=f(()=>{"use strict";eo();oo();no();ro();io();lo();mo();To();ct();Co();Q();Ro();No();ke();Ao();Do();xo();Oo();Po();Io();qo();ko();Uo();Bo()});import{HTTPException as vs}from"hono/http-exception";import{DatabaseError as Us}from"pg";import{ZodError as Fs}from"zod";function Ho(t,e){if(t instanceof vs)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof Fs){let o=t.issues[0];return e.json({error:"Validation error",details:o.message},400)}if(t instanceof Error){let o=t;if(o.code==="ECONNREFUSED"||o.code==="ENOTFOUND"||o.code==="ETIMEDOUT"||o.code==="ER_ACCESS_DENIED_ERROR"||o.code==="ER_BAD_HOST_ERROR"||o.code==="ECONNRESET"||o.errno===1045||o.errno===2003||o.errno===2002||t.message.includes("ECONNREFUSED")||t.message.includes("connection refused")||t.message.includes("timeout expired")||t.message.includes("Connection terminated")||t.message.includes("MongoNetworkError")||t.message.includes("MongoServerSelectionError")||t instanceof Us&&t.code?.startsWith("08"))return e.json({error:"Database connection failed",details:t.message},503)}return e.json({error:t instanceof Error?t.message:"Internal server error"},500)}var jo,Ko=f(()=>{"use strict";jo=(t,e)=>{if(!t.success){let o=t.error?.issues[0];return e.json({error:"Validation error",details:o?.message??"Unknown validation error"},400)}}});var Qo={};Pt(Qo,{coerceObjectId:()=>He,getDbPool:()=>C,getDbType:()=>ce,getMongoClient:()=>Ue,getMongoDb:()=>x,getMongoDbName:()=>Fe,getMssqlPool:()=>N,getMysqlPool:()=>S,isValidObjectId:()=>Be});import{MongoClient as Bs,ObjectId as dt}from"mongodb";import Hs from"mssql";import{createPool as js}from"mysql2/promise";import{Pool as Vo}from"pg";var ft,ie,C,S,N,ce,Ue,Fe,x,Be,He,h=f(()=>{"use strict";ft=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let o=e.protocol.replace(":","");switch(o){case"postgres":case"postgresql":return"pg";case"mysql":case"mysql2":return"mysql";case"mssql":case"sqlserver":return"mssql";case"mongodb":case"mongodb+srv":return"mongodb";default:throw new Error(`Unsupported database type: ${o}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), SQL Server (mssql://), MongoDB (mongodb://).`)}}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let o=new URL(e);this.baseConfig={url:e,host:o.hostname,port:Number.parseInt(o.port,10)||(this.detectDbType(o)==="mysql"?3306:this.detectDbType(o)==="mssql"?1433:5432),user:o.username,password:o.password,dbType:this.detectDbType(o)}}catch(o){throw new Error(o instanceof Error?o.message:String(o))}}getDbType(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");e||(e=new URL(this.baseConfig.url).pathname.slice(1));try{let o=new URL(this.baseConfig.url);return o.pathname=`/${e}`,o.toString()}catch(o){throw new Error(`Failed to build connection string for database "${e}": ${o instanceof Error?o.message:String(o)}`)}}getPgPool(e){let o=this.buildConnectionString(e);if(!this.pgPools.has(o)){let a={connectionString:o,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},n=new Vo(a);n.on("error",r=>{}),this.pgPools.set(o,n)}return this.pgPools.get(o)??new Vo({connectionString:o})}getMysqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let o=this.buildConnectionString(e);if(!this.mysqlPools.has(o)){let n=new URL(o).pathname.slice(1),r=js({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:n||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.mysqlPools.set(o,r)}return this.mysqlPools.get(o)}async getMssqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let o=this.buildConnectionString(e);if(!this.mssqlPools.has(o)){let n=new URL(o).pathname.slice(1),r={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:n||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},s=await new Hs.ConnectionPool(r).connect();s.on("error",c=>{}),this.mssqlPools.set(o,s)}return this.mssqlPools.get(o)}getPool(e){return this.getPgPool(e)}async closePgPool(e){let o=this.pgPools.get(e);o&&(await o.end(),this.pgPools.delete(e))}async closeMysqlPool(e){let o=this.mysqlPools.get(e);o&&(await o.end(),this.mysqlPools.delete(e))}async closeMssqlPool(e){let o=this.mssqlPools.get(e);o&&(await o.close(),this.mssqlPools.delete(e))}async closePool(e){await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){let o=this.buildConnectionString(e);await this.closePool(o)}async getMongoClient(){if(!this.mongoClient){if(!this.baseConfig)throw new Error("Base configuration not initialized");let e=new Bs(this.baseConfig.url);try{await e.connect(),this.mongoClient=e}catch(o){try{await e.close()}catch{}throw o}}return this.mongoClient}getMongoDbName(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return new URL(this.baseConfig.url).pathname?.replace(/^\//,"")||"admin"}async getMongoDb(e){return(await this.getMongoClient()).db(e??this.getMongoDbName())}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([n,r])=>{await r.end()}),o=Array.from(this.mysqlPools.entries()).map(async([n,r])=>{await r.end()}),a=Array.from(this.mssqlPools.entries()).map(async([n,r])=>{await r.close()});await Promise.all([...e,...o,...a]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null)}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},ie=new ft,C=t=>ie.getPgPool(t),S=t=>ie.getMysqlPool(t),N=async t=>ie.getMssqlPool(t),ce=()=>ie.getDbType(),Ue=()=>ie.getMongoClient(),Fe=()=>ie.getMongoDbName(),x=t=>ie.getMongoDb(t),Be=t=>typeof t=="string"&&dt.isValid(t),He=t=>typeof t=="string"&&dt.isValid(t)?new dt(t):t});import{HTTPException as Wo}from"hono/http-exception";async function Jo(t){let e=await x(t),o=await e.listCollections().toArray(),a=[];for(let n of o){let r=n.name,s=await e.collection(r).estimatedDocumentCount();a.push({tableName:r,rowCount:s})}return a}async function je({tableName:t,db:e}){let n=await(await x(e)).collection(t).find({}).limit(Vs).toArray(),r=n.length,s=new Map,c=(i,l)=>{let m=Ws(l);if(!s.has(i))s.set(i,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=s.get(i);p&&(p.types.add(m),p.presentCount+=1)}};for(let i of n)for(let[l,m]of Object.entries(i)){if(m==null){if(!s.has(l))s.set(l,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=s.get(l);p&&(p.nullable=!0),p&&(p.presentCount+=1)}continue}c(l,m)}if(r>0)for(let i of s.values())i.presentCount<r&&(i.nullable=!0);return s.has("_id")||s.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:r}),Array.from(s.entries()).map(([i,l])=>{let m=l.types.values().next().value??"text";return{columnName:i,dataType:m,dataTypeLabel:Ys(m),isNullable:l.nullable,columnDefault:null,isPrimaryKey:i==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}async function Xo({tableName:t,cursor:e,limit:o,direction:a,sort:n,order:r,filters:s,db:c}){let l=(await x(c)).collection(t),m=zs(s??[]),p=Go(n??"",r),u=o&&o>0?o:50,d=Qs(e),g=Number.isFinite(d)&&d>=0?d:0,y=a==="desc"?Math.max(g-u,0):g,[b,E]=await Promise.all([l.countDocuments(m),l.find(m).sort(p).skip(y).limit(u).toArray()]),R=E.map(k=>we(k)),A=y+u,q=Math.max(y-u,0);return{data:R,meta:{limit:u,total:b,hasNextPage:A<b,hasPreviousPage:y>0,nextCursor:A<b?Yo(A):null,prevCursor:y>0?Yo(q):null}}}async function Zo({tableName:t,tableData:e,db:o}){let a=await x(o);if((await a.listCollections({name:t}).toArray()).length>0)throw new Wo(400,{message:`Collection "${t}" already exists`});let r=e?.fields??[];if(r.length===0){await a.createCollection(t);return}let s={},c=[];for(let i of r){let l=Ks(i.columnType);if(!zo.has(l))throw new Wo(400,{message:`Unsupported MongoDB BSON type "${i.columnType}" for field "${i.columnName}"`});i.isArray?s[i.columnName]={bsonType:"array",...l!=="array"?{items:{bsonType:l}}:{}}:s[i.columnName]={bsonType:l},i.isNullable||c.push(i.columnName)}await a.createCollection(t,{validator:{$jsonSchema:{bsonType:"object",required:c,properties:s,additionalProperties:!0}},validationAction:"error"})}async function ea({tableName:t,columnName:e,db:o}){return{deletedCount:(await(await x(o)).collection(t).updateMany({},{$unset:{[e]:""}})).modifiedCount}}async function ta({tableName:t,db:e}){let r=(await(await x(e)).collection(t).find({}).limit(1e4).toArray()).map(c=>we(c));return{cols:Array.from(new Set(r.flatMap(c=>Object.keys(c)))),rows:r}}var zo,Ks,Vs,Yo,Qs,we,Ws,Ys,zs,Go,te,oa,le,bt,ye=f(()=>{"use strict";h();zo=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Ks=t=>{let e=t.trim();if(zo.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Vs=200,Yo=t=>Buffer.from(JSON.stringify({offset:t})).toString("base64url"),Qs=t=>{if(!t)return 0;try{let e=JSON.parse(Buffer.from(t,"base64url").toString("utf-8"));return typeof e.offset=="number"?e.offset:0}catch{return 0}},we=t=>{if(t instanceof Date)return t.toISOString();if(typeof t=="bigint")return t.toString();if(t&&typeof t=="object"){if("_bsontype"in t&&t._bsontype==="ObjectId")return t.toHexString();if(Array.isArray(t))return t.map(o=>we(o));let e=Object.entries(t).map(([o,a])=>[o,we(a)]);return Object.fromEntries(e)}return t},Ws=t=>t instanceof Date?"date":t&&typeof t=="object"?Array.isArray(t)?"array":"_bsontype"in t?"text":"json":typeof t=="boolean"?"boolean":typeof t=="number"||typeof t=="bigint"?"number":"text",Ys=t=>{switch(t){case"number":return"numeric";case"boolean":return"boolean";case"json":return"json";case"date":return"date";case"array":return"array";case"enum":return"enum";default:return"text"}},zs=t=>{if(!t||t.length===0)return{};let e=[],o=n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=n=>{let r=n.trim();if(r==="null")return null;if(r==="true")return!0;if(r==="false")return!1;let s=Number(r);return!Number.isNaN(s)&&r!==""?s:Be(r)?He(r):r};for(let n of t){let r=n.columnName,s=a(n.value),c=n.operator.toLowerCase();if(r)switch(c){case"=":e.push({[r]:s});break;case"!=":e.push({[r]:{$ne:s}});break;case">":e.push({[r]:{$gt:s}});break;case">=":e.push({[r]:{$gte:s}});break;case"<":e.push({[r]:{$lt:s}});break;case"<=":e.push({[r]:{$lte:s}});break;case"is":e.push({[r]:s});break;case"is not":e.push({[r]:{$ne:s}});break;case"like":e.push({[r]:{$regex:o(String(s)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:o(String(s)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:o(String(s)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:o(String(s)),$options:"i"}}});break;default:e.push({[r]:s});break}}return e.length?{$and:e}:{}},Go=(t,e)=>{if(!t)return{_id:1};if(Array.isArray(t)){let o=t.map(a=>[a.columnName,a.direction==="desc"?-1:1]);return Object.fromEntries(o)}return typeof t=="string"&&t.length>0?{[t]:e==="desc"?-1:1}:{_id:1}};te=we,oa=Go,le=He,bt=Be});async function aa(t,e={}){let{includeSampleData:o=!1,maxTables:a}=e,n=await x(t),r=await n.listCollections().toArray(),c=(typeof a=="number"&&a>0?r.slice(0,a):r).map(async l=>{let m=l.name,p=await je({tableName:m,db:t}),u={name:m,columns:p.map(Gs)};if(o){let g=(await n.collection(m).find({}).limit(3).toArray()).map(y=>te(y));u.sampleData=g.map(y=>Object.fromEntries(Object.entries(y).map(([b,E])=>[b,String(E)])))}return u});return{dbType:"mongodb",tables:await Promise.all(c),relationships:[]}}var Gs,na=f(()=>{"use strict";h();ye();Gs=t=>({name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable,isPrimaryKey:t.isPrimaryKey})});import{Pool as Js}from"pg";var Ke,Xs,yt,ra=f(()=>{"use strict";Ke=null,Xs=()=>{if(!Ke){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{Ke=new Js({connectionString:process.env.DATABASE_URL}),Ke.on("error",t=>{})}catch(t){throw t}}return Ke},yt=new Proxy({},{get(t,e){try{return Xs()[e]}catch(o){throw o}}})});import{HTTPException as Zs}from"hono/http-exception";async function Ve({tableName:t,db:e}){let o=C(e),a=`
3
3
  SELECT
4
4
  c.column_name as "columnName",
5
5
  c.data_type as "dataType",
@@ -48,18 +48,77 @@ 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:It(n.dataType),dataTypeLabel:Mt(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:n}=await o.query(a,[t]);if(!n||n.length===0)throw new Zs(404,{message:`Table "${t}" does not exist`});return n.map(r=>{let s=null;return r.enumValues&&(Array.isArray(r.enumValues)?s=r.enumValues:typeof r.enumValues=="string"&&(s=r.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:r.columnName,dataType:uo(r.dataType),dataTypeLabel:po(r.dataType),isNullable:r.isNullable,columnDefault:r.columnDefault,isPrimaryKey:r.isPrimaryKey,isForeignKey:r.isForeignKey,referencedTable:r.referencedTable,referencedColumn:r.referencedColumn,enumValues:s}})}var gt=f(()=>{"use strict";X();h()});async function ti(t){let e=C(t),o=`
52
52
  SELECT table_name
53
53
  FROM information_schema.tables
54
54
  WHERE table_schema = 'public'
55
55
  AND table_type = 'BASE TABLE'
56
56
  ORDER BY table_name;
57
- `,{rows: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:a}=await e.query(o);return a.map(n=>n.table_name)}async function oi(t){let e=await yt.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
+ `,[t])).rows[0]?.description||void 0}finally{e.release()}}async function ai(t){let e=await yt.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function ni(t){let e={name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable};return t.isPrimaryKey&&(e.isPrimaryKey=!0),t.isForeignKey&&t.referencedTable&&t.referencedColumn&&(e.foreignKey=`${t.referencedTable}.${t.referencedColumn}`),t.enumValues&&t.enumValues.length>0&&(e.enumValues=t.enumValues,e.description=`Enum values: ${t.enumValues.join(", ")}`),e}function ri(t){let e=[];for(let o of t)for(let a of o.columns)if(a.foreignKey){let[n,r]=a.foreignKey.split(".");e.push({fromTable:o.name,fromColumn:a.name,toTable:n,toColumn:r})}return e}async function si(t,e={}){if(ce()==="mongodb")return aa(t,{includeSampleData:e.includeSampleData});let{includeSampleData:o=!1,includeDescriptions:a=!0}=e;try{let r=(await ti(t)).map(async i=>{let[l,m,p]=await Promise.all([Ve({tableName:i,db:t}),a?oi(i):Promise.resolve(void 0),o?ai(i):Promise.resolve([])]),u={name:i,columns:l.map(ni)};return m&&(u.description=m),p.length>0&&(u.sampleData=p.map(d=>Object.fromEntries(Object.entries(d).map(([g,y])=>[g,String(y)])))),u}),s=await Promise.all(r),c=ri(s);return{dbType:"pg",tables:s,relationships:c}}catch(n){throw new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}async function sa(t){return si(t,{includeSampleData:!0,includeDescriptions:!0})}var ia=f(()=>{"use strict";na();ra();h();gt()});function la(t){let e=t.dbType.toLowerCase(),o=t.dbType==="pg"?"PostgreSQL":t.dbType;return e.includes("mongo")?`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
63
+
64
+ **Your Role:**
65
+ 1. Keep responses SHORT - 2-3 sentences maximum unless generating a query
66
+ 2. When generating MongoDB queries:
67
+ - Provide 1 sentence explanation
68
+ - The MongoDB query in a JSON code block
69
+ - 1 sentence about expected results
70
+ 3. Use exact collection/field names from the schema
71
+ 4. If query is unclear, ask ONE specific clarifying question
72
+ 5. No preamble, no apologies, get straight to the answer
73
+
74
+ **Database Context:**
75
+ ${ca(t)}
76
+
77
+ **Guidelines:**
78
+ 1. Always generate syntactically correct MongoDB queries
79
+ 2. Use proper collection/field names exactly as defined in the schema
80
+ 3. When generating queries, wrap them in \`\`\`json code blocks
81
+ 4. Explain what the query does in plain language
82
+ 5. Suggest relevant follow-up questions or analyses
83
+ 6. If a request is ambiguous, ask clarifying questions
84
+ 7. Warn about potentially expensive operations (collection scans, large aggregations)
85
+ 8. Consider data privacy - remind users not to share sensitive data externally
86
+
87
+ **Query Format:**
88
+ Return a JSON object with the following shape:
89
+ {
90
+ "collection": "collectionName",
91
+ "operation": "find|aggregate|insertOne|insertMany|updateOne|updateMany|deleteOne|deleteMany|count",
92
+ "filter": { ... },
93
+ "pipeline": [ ... ],
94
+ "document": { ... } | [ ... ],
95
+ "update": { ... },
96
+ "options": { ... },
97
+ "sort": { "field": 1 },
98
+ "limit": 100,
99
+ "skip": 0
100
+ }
101
+
102
+ Only include the fields needed for the chosen operation.
103
+
104
+ **Example:**
105
+ User: "Show me the top 5 customers by revenue"
106
+
107
+ Response: "I'll aggregate orders to calculate total revenue per customer.
108
+
109
+ \`\`\`json
110
+ {
111
+ "collection": "orders",
112
+ "operation": "aggregate",
113
+ "pipeline": [
114
+ { "$group": { "_id": "$customer_id", "total": { "$sum": "$total_amount" } } },
115
+ { "$sort": { "total": -1 } },
116
+ { "$limit": 5 }
117
+ ]
118
+ }
119
+ \`\`\`
120
+
121
+ This will return the top 5 customers by revenue."`:`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
63
122
 
64
123
  **Your Role:**
65
124
  1. Keep responses SHORT - 2-3 sentences maximum unless generating SQL
@@ -69,15 +128,15 @@ var fr=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var yr=(a,e)=>{f
69
128
  - 1 sentence about expected results
70
129
  - NO verbose explanations
71
130
  3. Use exact table/column names from the schema
72
- 4. Generate valid ${a.dbType} syntax
131
+ 4. Generate valid ${o} syntax
73
132
  5. If query is unclear, ask ONE specific clarifying question
74
133
  6. No preamble, no apologies, get straight to the answer
75
134
 
76
135
  **Database Context:**
77
- ${nn(a)}
136
+ ${ca(t)}
78
137
 
79
138
  **Guidelines:**
80
- 1. Always generate syntactically correct SQL for the database type (${a.dbType})
139
+ 1. Always generate syntactically correct SQL for the database type (${o})
81
140
  2. Use proper table/column names exactly as defined in the schema
82
141
  3. When generating queries, wrap them in \`\`\`sql code blocks
83
142
  4. Explain what the query does in plain language
@@ -112,21 +171,34 @@ LIMIT 5;
112
171
 
113
172
  This will return the 5 customers with the highest total order value. You might also want to see:
114
173
  - Revenue trends over time for these customers
115
- - Their most frequently ordered products"`}function nn(a){let e=`Database Type: ${a.dbType}
174
+ - Their most frequently ordered products"`}function ca(t){let o=`Database Type: ${t.dbType==="pg"?"PostgreSQL":t.dbType}
116
175
 
117
- `;e+=`**Tables and Columns:**
118
- `;for(let t of a.tables){e+=`
119
- ### ${t.name}
120
- `,t.description&&(e+=`Description: ${t.description}
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}
123
- `,o.description&&(e+=` ${o.description}
124
- `)}t.sampleData&&t.sampleData.length>0&&(e+=`Sample data (${t.sampleData.length} rows):
125
- `,e+=`${JSON.stringify(t.sampleData.slice(0,3),null,2)}
126
- `)}if(a.relationships&&a.relationships.length>0){e+=`
176
+ `;o+=`**Tables and Columns:**
177
+ `;for(let a of t.tables){o+=`
178
+ ### ${a.name}
179
+ `,a.description&&(o+=`Description: ${a.description}
180
+ `),o+=`Columns:
181
+ `;for(let n of a.columns){let r=n.isPrimaryKey?" [PRIMARY KEY]":"",s=n.foreignKey?` [FK -> ${n.foreignKey}]`:"",c=n.nullable?"NULL":"NOT NULL";o+=` - ${n.name}: ${n.type} ${c}${r}${s}
182
+ `,n.description&&(o+=` ${n.description}
183
+ `)}a.sampleData&&a.sampleData.length>0&&(o+=`Sample data (${a.sampleData.length} rows):
184
+ `,o+=`${JSON.stringify(a.sampleData.slice(0,3),null,2)}
185
+ `)}if(t.relationships&&t.relationships.length>0){o+=`
127
186
  **Relationships:**
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=`
187
+ `;for(let a of t.relationships)o+=` - ${a.fromTable}.${a.fromColumn} -> ${a.toTable}.${a.toColumn}
188
+ `}return o}var ma=f(()=>{"use strict"});import{zValidator as ii}from"@hono/zod-validator";import{Hono as ci}from"hono";var ua,pa=f(()=>{"use strict";Pe();X();ia();ma();ua=new ci().basePath("/chat").post("/",ii("json",co),async t=>{let{messages:e,conversationId:o,db:a}=t.req.valid("json"),n=await sa(a),r=la(n),s={messages:e,conversationId:o,systemPrompt:r},c=await fetch(`${se.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!c.ok){let m=await c.json();return t.json({error:m.error||"Proxy request failed"},c.status)}let{readable:i,writable:l}=new TransformStream;return c.body?.pipeTo(l),new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})})});import{HTTPException as li}from"hono/http-exception";async function da({db:t,params:e}){let{tableName:o,data:a}=e,n=C(t),r=Object.keys(a),s=Object.values(a),c=r.map((p,u)=>`$${u+1}`).join(", "),i=r.map(p=>`"${p}"`).join(", "),l=`
189
+ INSERT INTO "${o}" (${i})
190
+ VALUES (${c})
191
+ RETURNING *
192
+ `,m=await n.query(l,s);if(m.rowCount===0)throw new li(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:m.rowCount??0}}var fa=f(()=>{"use strict";h()});import{HTTPException as Qe}from"hono/http-exception";var ba,ya=f(()=>{"use strict";h();ba=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new Qe(400,{message:"At least one record is required"});let n=await C(o).connect();try{let r=Object.keys(e[0]),s=r.map(m=>`"${m}"`).join(", "),c=0,i=0,l=[];await n.query("BEGIN");for(let m=0;m<e.length;m++){let p=e[m],u=r.map(y=>p[y]),d=r.map((y,b)=>`$${b+1}`).join(", "),g=`
193
+ INSERT INTO "${t}" (${s})
194
+ VALUES (${d})
195
+ RETURNING *
196
+ `;try{await n.query(g,u),c++}catch(y){throw new Qe(500,{message:`Failed: ${y instanceof Error?y.message:String(y)}`})}}return await n.query("COMMIT"),{success:i===0,message:`Bulk insert completed: ${c} records inserted${i>0?`, ${i} failed`:""}`,successCount:c,failureCount:i,errors:l.length>0?l:void 0}}catch(r){throw await n.query("ROLLBACK"),r instanceof Qe?r:new Qe(500,{message:`Failed to bulk insert records into "${t}"`})}finally{n.release()}}});async function ga({tableData:t,db:e}){let{tableName:o,fields:a,foreignKeys:n}=t,r=C(e),s=a.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}),c=n?.map(m=>`CONSTRAINT "${`fk_${o}_${m.columnName}_${m.referencedTable}_${m.referencedColumn}`}" FOREIGN KEY ("${m.columnName}") REFERENCES "${m.referencedTable}" ("${m.referencedColumn}") ON UPDATE ${m.onUpdate} ON DELETE ${m.onDelete}`)||[],i=[...s,...c],l=`
197
+ CREATE TABLE "${o}" (
198
+ ${i.join(`,
199
+ `)}
200
+ );
201
+ `;await r.query(l)}var Ta=f(()=>{"use strict";h()});function oe(){let t=process.env.DATABASE_URL;if(!t)return{host:"localhost",port:5432};try{let e=new URL(t),o=e.protocol.replace(":",""),a=o==="mongodb"||o==="mongodb+srv"?27017:5432;return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||a}}catch{return{host:"localhost",port:5432}}}var De=f(()=>{"use strict"});import{HTTPException as Tt}from"hono/http-exception";async function Ea(){let t=C(),e=`
130
202
  SELECT
131
203
  d.datname as name,
132
204
  pg_size_pretty(pg_database_size(d.datname)) as size,
@@ -135,7 +207,7 @@ This will return the 5 customers with the highest total order value. You might a
135
207
  FROM pg_catalog.pg_database d
136
208
  WHERE d.datistemplate = false
137
209
  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=`
210
+ `,{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No databases returned from database"});return o}async function ha(){let t=C(),e="SELECT current_database() as database;",{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No current database returned from database"});return o[0]}async function Ca(){let t=C(),e=`
139
211
  SELECT
140
212
  version() as version,
141
213
  current_database() as database,
@@ -144,40 +216,17 @@ This will return the 5 customers with the highest total order value. You might a
144
216
  inet_server_port() as port,
145
217
  (SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
146
218
  (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 Ia,Ma=d(()=>{"use strict";J();va();qa();Ia=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(`
219
+ `,{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No connection information returned from database"});let a=So.parse(o[0]),n=oe();return{host:a.host||n.host,port:a.port||n.port,user:a.user,database:a.database,version:a.version.toString(),active_connections:a.active_connections,max_connections:a.max_connections}}var Sa=f(()=>{"use strict";X();h();De()});import{HTTPException as Ra}from"hono/http-exception";async function Na(t){let{tableName:e,columnName:o,cascade:a,db:n}=t,r=C(n),s=`
220
+ SELECT EXISTS (
221
+ SELECT 1 FROM information_schema.tables
222
+ WHERE table_name = $1 AND table_schema = 'public'
223
+ ) as exists;
224
+ `,{rows:c}=await r.query(s,[e]);if(!c[0]?.exists)throw new Ra(404,{message:`Table "${e}" does not exist`});let i=`
225
+ SELECT EXISTS (
226
+ SELECT 1 FROM information_schema.columns
227
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
228
+ ) as exists;
229
+ `,{rows:l}=await r.query(i,[e,o]);if(!l[0]?.exists)throw new Ra(404,{message:`Column "${o}" does not exist in table "${e}"`});let p=`ALTER TABLE "${e}" DROP COLUMN "${o}" ${a?"CASCADE":"RESTRICT"}`,{rowCount:u}=await r.query(p);return{deletedCount:u??0}}var Aa=f(()=>{"use strict";h()});import{HTTPException as ge}from"hono/http-exception";async function Et(t,e){return(await C(e).query(`
181
230
  SELECT
182
231
  tc.constraint_name,
183
232
  tc.table_name as referencing_table,
@@ -193,25 +242,265 @@ This will return the 5 customers with the highest total order value. You might a
193
242
  AND ccu.table_schema = tc.table_schema
194
243
  WHERE tc.constraint_type = 'FOREIGN KEY'
195
244
  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})
245
+ `,[t])).rows.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function bi(t,e,o){let a=await Et(t,o);if(a.length===0)return[];let n=[],r=C(o),s=new Map;for(let i of a){let l=`${i.referencingTable}.${i.referencingColumn}`;s.has(l)||s.set(l,[]),s.get(l)?.push(i)}let c=e.map(i=>i.value);for(let[i,l]of s){let m=l[0];if(!m||!e.find(y=>y.columnName===m.referencedColumn))continue;let u=c.map((y,b)=>`$${b+1}`).join(", "),d=`
246
+ SELECT * FROM "${m.referencingTable}"
247
+ WHERE "${m.referencingColumn}" IN (${u})
199
248
  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=`
201
- DELETE FROM "${a}"
202
- WHERE "${r}" IN (${i})
249
+ `,g=await r.query(d,c);g.rows.length>0&&n.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:g.rows})}return n}async function wa({tableName:t,primaryKeys:e,db:o}){let a=C(o),n=e[0]?.columnName;if(!n)throw new ge(400,{message:"Primary key column name is required"});let r=e.map(i=>i.value),s=r.map((i,l)=>`$${l+1}`).join(", "),c=`
250
+ DELETE FROM "${t}"
251
+ WHERE "${n}" IN (${s})
203
252
  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 M of R){let k=T.map((O,Q)=>`$${Q+1}`).join(", "),K=`
205
- SELECT "${M.referencedColumn}" FROM "${f}"
206
- WHERE "${h}" IN (${k})
207
- `,_=(await o.query(K,T)).rows.map(({row:O})=>O[M.referencedColumn]);_.length>0&&await m(M.referencingTable,M.referencingColumn,_)}let D=T.map((M,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=`
211
- DELETE FROM "${a}"
212
- WHERE "${r}" IN (${c})
253
+ `;try{await a.query("BEGIN");let i=await a.query(c,r);return await a.query("COMMIT"),{deletedCount:i.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(i){if(await a.query("ROLLBACK"),i.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await bi(t,e,o)};throw i instanceof ge?i:new ge(500,{message:`Failed to delete records from "${t}"`})}}async function Da({tableName:t,primaryKeys:e,db:o}){let a=C(o),n=e[0]?.columnName;if(!n)throw new ge(400,{message:"Primary key column name is required"});let r=e.map(s=>s.value);await a.query("BEGIN");try{let s=await Et(t,o),c=0,i=new Set,l=async(g,y,b)=>{let E=await Et(g,o);for(let k of E){let H=b.map((F,Y)=>`$${Y+1}`).join(", "),j=`
254
+ SELECT "${k.referencedColumn}" FROM "${g}"
255
+ WHERE "${y}" IN (${H})
256
+ `,D=(await a.query(j,b)).rows.map(({row:F})=>F[k.referencedColumn]);D.length>0&&await l(k.referencingTable,k.referencingColumn,D)}let R=b.map((k,H)=>`$${H+1}`).join(", "),A=`
257
+ DELETE FROM "${g}"
258
+ WHERE "${y}" IN (${R})
259
+ `,q=await a.query(A,b);c+=q.rowCount??0,i.add(g)};for(let g of s)i.has(g.referencingTable)||await l(g.referencingTable,g.referencingColumn,r);let m=r.map((g,y)=>`$${y+1}`).join(", "),p=`
260
+ DELETE FROM "${t}"
261
+ WHERE "${n}" IN (${m})
213
262
  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=`
263
+ `,u=await a.query(p,r);return await a.query("COMMIT"),{deletedCount:(u.rowCount??0)+c}}catch(s){throw await a.query("ROLLBACK"),s instanceof ge?s:new ge(500,{message:`Failed to force delete records from "${t}"`})}}var _a=f(()=>{"use strict";h()});import{HTTPException as ht}from"hono/http-exception";async function gi(t,e){return(await C(e).query(`
264
+ SELECT
265
+ tc.constraint_name,
266
+ tc.table_name as referencing_table,
267
+ kcu.column_name as referencing_column,
268
+ ccu.table_name AS referenced_table,
269
+ ccu.column_name AS referenced_column
270
+ FROM information_schema.table_constraints AS tc
271
+ JOIN information_schema.key_column_usage AS kcu
272
+ ON tc.constraint_name = kcu.constraint_name
273
+ AND tc.table_schema = kcu.table_schema
274
+ JOIN information_schema.constraint_column_usage AS ccu
275
+ ON ccu.constraint_name = tc.constraint_name
276
+ AND ccu.table_schema = tc.table_schema
277
+ WHERE tc.constraint_type = 'FOREIGN KEY'
278
+ AND ccu.table_name = $1
279
+ `,[t])).rows.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function Ma(t,e){let o=await gi(t,e);if(o.length===0)return[];let a=[],n=C(e);for(let r of o){let s=`
280
+ SELECT * FROM "${r.referencingTable}"
281
+ LIMIT 100
282
+ `,c=await n.query(s);c.rows.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:c.rows})}return a}async function Ti(t,e){let a=await C(e).query(`SELECT COUNT(*) as count FROM "${t}"`);return Number.parseInt(a.rows[0]?.count??"0",10)}async function xa(t){let{tableName:e,db:o,cascade:a}=t,n=C(o),r=`
283
+ SELECT EXISTS (
284
+ SELECT 1 FROM information_schema.tables
285
+ WHERE table_name = $1 AND table_schema = 'public'
286
+ ) as exists;
287
+ `,{rows:s}=await n.query(r,[e]);if(!s[0]?.exists)throw new ht(404,{message:`Table "${e}" does not exist`});let c=await Ti(e,o);if(!a){let i=await Ma(e,o);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{let l=`DROP TABLE "${e}" ${a?"CASCADE":"RESTRICT"}`;return await n.query(l),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(i){if(i.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await Ma(e,o)};throw i instanceof ht?i:new ht(500,{message:`Failed to delete table "${e}"`})}}var La=f(()=>{"use strict";h()});import{HTTPException as hi}from"hono/http-exception";async function Oa({tableName:t,db:e}){let o=C(e),{rows:a}=await o.query(`SELECT * FROM "${t}"`);if(!a||a.length===0)throw new hi(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}var Pa=f(()=>{"use strict";h()});import{HTTPException as Ia}from"hono/http-exception";var $a,qa=f(()=>{"use strict";h();ye();$a=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new Ia(400,{message:"At least one record is required"});let n=(await x(o)).collection(t),r=e.map(s=>{let c=te(s);return(c._id===""||c._id===null)&&delete c._id,c});try{let s=await n.insertMany(r,{ordered:!1});return{success:!0,message:`Successfully inserted ${s.insertedCount} record${s.insertedCount!==1?"s":""}`,successCount:s.insertedCount,failureCount:e.length-s.insertedCount}}catch(s){throw new Ia(500,{message:`Bulk insert failed: ${s instanceof Error?s.message:String(s)}`})}}});import{HTTPException as Si}from"hono/http-exception";async function ka(){let a=(await(await Ue()).db().admin().listDatabases()).databases??[];if(!a[0])throw new Si(500,{message:"No databases returned from MongoDB"});return a.map(n=>({name:n.name,size:Ri(n.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}async function va(){return{db:Fe()}}async function Ua(){let e=(await Ue()).db().admin(),o=oe(),a={};try{a=await e.serverStatus()}catch{}return{host:o.host,port:o.port,user:"n/a",database:Fe(),version:a.version??"unknown",active_connections:a.connections?.current??0,max_connections:(a.connections?.current??0)+(a.connections?.available??0)}}var Ri,Fa=f(()=>{"use strict";h();De();Ri=t=>{if(!Number.isFinite(t))return"n/a";let e=["B","KB","MB","GB","TB"],o=t,a=0;for(;o>=1024&&a<e.length-1;)o/=1024,a+=1;return`${o.toFixed(1)} ${e[a]}`}});import{HTTPException as ae}from"hono/http-exception";var Te,Ba,Ha=f(()=>{"use strict";h();ye();Te=t=>{if(t._id&&typeof t._id=="string")return{...t,_id:le(t._id)};if(t._id&&typeof t._id=="object"){let e=t._id;if(Array.isArray(e.$in))return{...t,_id:{...e,$in:e.$in.map(o=>typeof o=="string"?le(o):o)}};if(Array.isArray(e.$nin))return{...t,_id:{...e,$nin:e.$nin.map(o=>typeof o=="string"?le(o):o)}}}return t},Ba=async({query:t,db:e})=>{if(!t||!t.trim())throw new ae(400,{message:"Query is required"});let o;try{o=JSON.parse(t)}catch{throw new ae(400,{message:"Mongo query must be valid JSON"})}if(!o.collection||!o.operation)throw new ae(400,{message:"Mongo query must include collection and operation"});let n=(await x(e)).collection(o.collection),r=performance.now(),s=[],c=0,i;switch(o.operation){case"find":{let u=Te(o.filter??{}),d=n.find(u,o.options??{}),g=o.sort??oa("",void 0);d.sort(g),o.skip&&d.skip(o.skip),o.limit&&d.limit(o.limit),s=await d.toArray(),c=s.length;break}case"aggregate":{let u=o.pipeline??[];s=await n.aggregate(u,o.options??{}).toArray(),c=s.length;break}case"insertOne":{let u=o.document;if(!u)throw new ae(400,{message:"document is required"});c=(await n.insertOne(u)).insertedId?1:0,i="OK";break}case"insertMany":{let u=o.document;if(!Array.isArray(u))throw new ae(400,{message:"document array is required"});c=(await n.insertMany(u)).insertedCount??0,i="OK";break}case"updateOne":{let u=Te(o.filter??{});if(!o.update)throw new ae(400,{message:"update is required"});let d=await n.updateOne(u,o.update,o.options??{});c=d.matchedCount??0,i=`OK (${d.modifiedCount??0} modified)`;break}case"updateMany":{let u=Te(o.filter??{});if(!o.update)throw new ae(400,{message:"update is required"});let d=await n.updateMany(u,o.update,o.options??{});c=d.matchedCount??0,i=`OK (${d.modifiedCount??0} modified)`;break}case"deleteOne":{let u=Te(o.filter??{});c=(await n.deleteOne(u,o.options??{})).deletedCount??0,i="OK";break}case"deleteMany":{let u=Te(o.filter??{});c=(await n.deleteMany(u,o.options??{})).deletedCount??0,i="OK";break}case"count":{let u=Te(o.filter??{});c=await n.countDocuments(u),s=[{count:c}],i="OK";break}default:throw new ae(400,{message:"Unsupported Mongo operation"})}let l=performance.now()-r,m=s.map(u=>te(u));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:c,duration:l,message:i}}});import{HTTPException as Ct}from"hono/http-exception";async function ja({db:t,params:e}){let{tableName:o,data:a}=e,r=(await x(t)).collection(o),s=te(a);if((s._id===""||s._id===null)&&delete s._id,!(await r.insertOne(s)).insertedId)throw new Ct(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:1}}async function Ka({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,s=(await x(e)).collection(o),c=0,i=n||"_id",l=new Map;for(let m of a){let p=m.rowData[i];if(p==null)throw new Ct(400,{message:`Primary key "${i}" not found in row data.`});l.has(p)||l.set(p,{}),l.get(p)[m.columnName]=m.value}for(let[m,p]of l.entries()){let u=i==="_id"&&bt(m)?le(m):m,d=await s.updateOne({[i]:u},{$set:p});if(d.matchedCount===0)throw new Ct(404,{message:`Record with ${i} = ${String(m)} not found in "${o}"`});c+=d.modifiedCount}return{updatedCount:c}}async function St({tableName:t,primaryKeys:e,db:o}){let n=(await x(o)).collection(t),r=e[0]?.columnName??"_id",s=e.map(i=>r==="_id"&&bt(i.value)?le(i.value):i.value);return{deletedCount:(await n.deleteMany({[r]:{$in:s}})).deletedCount??0}}async function Va({tableName:t,primaryKeys:e,db:o}){return{deletedCount:(await St({tableName:t,primaryKeys:e,db:o})).deletedCount}}var Qa=f(()=>{"use strict";h();ye()});import{HTTPException as Ni}from"hono/http-exception";async function Wa({tableName:t,db:e}){let o=await x(e);if((await o.listCollections({name:t}).toArray()).length===0)throw new Ni(404,{message:`Collection "${t}" does not exist`});let n=o.collection(t),r=await n.find({}).limit(Ai).toArray(),s=await n.estimatedDocumentCount(),c=new Map,i=new Map;for(let u of r)for(let[d,g]of Object.entries(u)){let y=wi(g);c.has(d)||(c.set(d,new Set),i.set(d,0)),c.get(d)?.add(y),i.set(d,(i.get(d)??0)+1)}let l={},m=[];for(let[u,d]of c.entries()){let g=i.get(u)??0,y=g===r.length&&r.length>0,b=Array.from(d).filter(R=>R!=="null"),E=d.has("null")||g<r.length;y&&!E&&m.push(u),l[u]=b.length===1?{bsonType:E?[b[0],"null"]:b[0]}:{bsonType:E?[...b,"null"]:b}}let p={collection:t,estimatedDocumentCount:s,sampledDocuments:r.length,jsonSchema:{bsonType:"object",required:m.length>0?m:void 0,properties:l}};return JSON.stringify(p,null,2)}var Ai,wi,Ya=f(()=>{"use strict";h();Ai=200,wi=t=>{if(t==null)return"null";if(t instanceof Date)return"date";if(typeof t=="boolean")return"bool";if(typeof t=="number")return Number.isInteger(t)?"int":"double";if(typeof t=="bigint")return"long";if(Array.isArray(t))return"array";if(typeof t=="object"){if("_bsontype"in t){let e=t._bsontype;return e==="ObjectId"?"objectId":e==="Decimal128"?"decimal":e==="Binary"?"binData":e==="Timestamp"?"timestamp":e.toLowerCase()}return"object"}return"string"}});import{HTTPException as Di}from"hono/http-exception";function _i(t){let e=t.match(/'([^']+)'/g);return!e||e.length===0?null:e.map(o=>o.slice(1,-1))}async function ne({tableName:t,db:e}){let o=await N(e),n=await o.request().input("tableName",t).query(`
288
+ SELECT
289
+ c.COLUMN_NAME AS columnName,
290
+ c.DATA_TYPE AS dataType,
291
+ CASE WHEN c.IS_NULLABLE = 'YES' THEN 1 ELSE 0 END AS isNullable,
292
+ c.COLUMN_DEFAULT AS columnDefault,
293
+ CASE
294
+ WHEN pk.COLUMN_NAME IS NOT NULL THEN 1
295
+ ELSE 0
296
+ END AS isPrimaryKey,
297
+ CASE
298
+ WHEN fk.COLUMN_NAME IS NOT NULL THEN 1
299
+ ELSE 0
300
+ END AS isForeignKey,
301
+ fk.REFERENCED_TABLE_NAME AS referencedTable,
302
+ fk.REFERENCED_COLUMN_NAME AS referencedColumn
303
+ FROM INFORMATION_SCHEMA.COLUMNS c
304
+ LEFT JOIN (
305
+ SELECT
306
+ ku.TABLE_SCHEMA,
307
+ ku.TABLE_NAME,
308
+ ku.COLUMN_NAME
309
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
310
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
311
+ ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
312
+ AND tc.TABLE_SCHEMA = ku.TABLE_SCHEMA
313
+ AND tc.TABLE_NAME = ku.TABLE_NAME
314
+ WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
315
+ ) pk ON c.TABLE_SCHEMA = pk.TABLE_SCHEMA
316
+ AND c.TABLE_NAME = pk.TABLE_NAME
317
+ AND c.COLUMN_NAME = pk.COLUMN_NAME
318
+ LEFT JOIN (
319
+ SELECT
320
+ ku.TABLE_SCHEMA,
321
+ ku.TABLE_NAME,
322
+ ku.COLUMN_NAME,
323
+ ku2.TABLE_NAME AS REFERENCED_TABLE_NAME,
324
+ ku2.COLUMN_NAME AS REFERENCED_COLUMN_NAME
325
+ FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
326
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
327
+ ON rc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
328
+ AND rc.CONSTRAINT_SCHEMA = ku.TABLE_SCHEMA
329
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku2
330
+ ON rc.UNIQUE_CONSTRAINT_NAME = ku2.CONSTRAINT_NAME
331
+ AND rc.UNIQUE_CONSTRAINT_SCHEMA = ku2.TABLE_SCHEMA
332
+ ) fk ON c.TABLE_SCHEMA = fk.TABLE_SCHEMA
333
+ AND c.TABLE_NAME = fk.TABLE_NAME
334
+ AND c.COLUMN_NAME = fk.COLUMN_NAME
335
+ WHERE c.TABLE_CATALOG = DB_NAME()
336
+ AND c.TABLE_NAME = @tableName
337
+ AND c.TABLE_SCHEMA = 'dbo'
338
+ ORDER BY c.ORDINAL_POSITION
339
+ `);if(!n.recordset||n.recordset.length===0)throw new Di(404,{message:`Table "${t}" does not exist`});let r=await o.request().input("tableName",t).query(`
340
+ SELECT
341
+ cc.COLUMN_NAME AS columnName,
342
+ chk.CHECK_CLAUSE AS checkClause
343
+ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS chk
344
+ JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cc
345
+ ON chk.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
346
+ AND cc.TABLE_SCHEMA = 'dbo'
347
+ WHERE cc.TABLE_NAME = @tableName
348
+ AND cc.TABLE_CATALOG = DB_NAME()
349
+ `),s=new Map;for(let c of r.recordset){let i=_i(c.checkClause);i&&s.set(c.columnName,i)}return n.recordset.map(c=>{let i=c.dataType,l=s.get(c.columnName)??null;return{columnName:c.columnName,dataType:l?"enum":yo(i),dataTypeLabel:l?"enum":go(i),isNullable:!!c.isNullable,columnDefault:c.columnDefault??null,isPrimaryKey:!!c.isPrimaryKey,isForeignKey:!!c.isForeignKey,referencedTable:c.referencedTable??null,referencedColumn:c.referencedColumn??null,enumValues:l}})}var _e=f(()=>{"use strict";X();h()});import{HTTPException as xi}from"hono/http-exception";async function za({db:t,params:e}){let{tableName:o,data:a}=e,n=await N(t),r=await ne({tableName:o,db:t}),s=new Set(r.filter(b=>b.dataTypeLabel==="boolean").map(b=>b.columnName)),c=await n.request().input("tableName",o).query("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@tableName) AND is_identity = 1"),i=new Set(c.recordset.map(b=>b.name)),l=Object.keys(a).filter(b=>!i.has(b)),m=l.map(b=>{let E=a[b];return s.has(b)&&typeof E=="string"?E==="true"?1:0:E}),p=l.map(b=>`[${b}]`).join(", "),u=l.map((b,E)=>`@param${E}`).join(", "),d=`
350
+ INSERT INTO [${o}] (${p})
351
+ VALUES (${u})
352
+ `,g=n.request();l.forEach((b,E)=>{g.input(`param${E}`,m[E])});let y=await g.query(d);if(y.rowsAffected[0]===0)throw new xi(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:y.rowsAffected[0]??0}}var Ga=f(()=>{"use strict";h();_e()});import{HTTPException as We}from"hono/http-exception";var Ja,Xa=f(()=>{"use strict";h();_e();Ja=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new We(400,{message:"At least one record is required"});let n=(await N(o)).transaction();try{let r=Object.keys(e[0]),s=r.map(l=>`[${l}]`).join(", "),c=await ne({tableName:t,db:o}),i=new Set(c.filter(l=>l.dataTypeLabel==="boolean").map(l=>l.columnName));await n.begin();for(let l=0;l<e.length;l++){let m=e[l],p=n.request(),u=r.map(y=>{let b=m[y];return i.has(y)&&typeof b=="string"?b==="true"?1:0:b}),d=r.map((y,b)=>`@p${l}_${b}`).join(", ");r.forEach((y,b)=>{p.input(`p${l}_${b}`,u[b])});let g=`
353
+ INSERT INTO [${t}] (${s})
354
+ VALUES (${d})
355
+ `;try{await p.query(g)}catch(y){throw new We(500,{message:`Failed to insert record ${l+1}: ${y instanceof Error?y.message:String(y)}`})}}return await n.commit(),{success:!0,message:`Successfully inserted ${e.length} record${e.length!==1?"s":""}`,successCount:e.length,failureCount:0}}catch(r){throw await n.rollback(),r instanceof We?r:new We(500,{message:`Failed to bulk insert records into "${t}"`})}}});function Pi(t,e){let o=t.trim().toLowerCase();return o.includes("(")&&o.includes(")")?o.includes("newid()")?e.toUpperCase().includes("UNIQUEIDENTIFIER")?"NEWID()":null:o.includes("getdate")||o.includes("current_timestamp")?"GETDATE()":t.trim():o==="null"?"NULL":o==="true"||o==="false"?o==="true"?"1":"0":t.trim()}function Ii(t,e){if(e)return"NVARCHAR(MAX)";let o=t.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)"}[o]||t.toUpperCase()}async function Za({tableData:t,db:e}){let{tableName:o,fields:a,foreignKeys:n}=t,r=await N(e),s=a.map(u=>{let d=Ii(u.columnType,u.isArray??!1),g=`[${u.columnName}] ${d}`;if(!u.isNullable&&!u.isPrimaryKey&&(g+=" NOT NULL"),u.defaultValue&&!d.includes("IDENTITY")){let y=Pi(u.defaultValue,d);y!==null&&(g+=` DEFAULT ${y}`)}return g}),c=a.filter(u=>u.isPrimaryKey),i=[];if(c.length>0){let u=c.map(d=>`[${d.columnName}]`).join(", ");i.push(`PRIMARY KEY (${u})`)}for(let u of a)u.isUnique&&!u.isPrimaryKey&&i.push(`UNIQUE ([${u.columnName}])`);let l=n?.map(u=>`CONSTRAINT [${`FK_${o}_${u.columnName}`}] FOREIGN KEY ([${u.columnName}]) REFERENCES [${u.referencedTable}] ([${u.referencedColumn}]) ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)||[],m=[...s,...i,...l],p=`
356
+ CREATE TABLE [${o}] (
357
+ ${m.join(`,
358
+ `)}
359
+ )
360
+ `;await r.request().query(p)}var en=f(()=>{"use strict";h()});import{HTTPException as Rt}from"hono/http-exception";async function tn(){let e=await(await N()).request().query(`
361
+ SELECT
362
+ d.name AS name,
363
+ CAST(
364
+ ROUND(
365
+ CAST(SUM(mf.size) * 8.0 / 1024 AS DECIMAL(10,2)),
366
+ 2
367
+ ) AS VARCHAR(20)
368
+ ) + ' MB' AS size,
369
+ SUSER_SNAME(d.owner_sid) AS owner,
370
+ d.collation_name AS encoding
371
+ FROM sys.databases d
372
+ JOIN sys.master_files mf ON d.database_id = mf.database_id
373
+ WHERE d.database_id > 4 -- Exclude system databases
374
+ GROUP BY d.name, d.owner_sid, d.collation_name
375
+ ORDER BY d.name
376
+ `);if(!e.recordset[0])throw new Rt(500,{message:"No databases returned from server"});return e.recordset}async function on(){let e=await(await N()).request().query("SELECT DB_NAME() AS db");if(!e.recordset[0])throw new Rt(500,{message:"No current database returned from server"});return e.recordset[0]}async function an(){let e=await(await N()).request().query(`
377
+ SELECT
378
+ @@VERSION AS version,
379
+ DB_NAME() AS database_name,
380
+ SUSER_NAME() AS [user],
381
+ @@SERVERNAME AS host,
382
+ (SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS port,
383
+ @@MAX_CONNECTIONS AS max_connections,
384
+ (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS active_connections
385
+ `);if(!e.recordset[0])throw new Rt(500,{message:"No connection information returned from server"});let o=e.recordset[0],a=oe();return{host:String(o.host||a.host),port:Number(o.port||a.port),user:String(o.user),database:String(o.database_name??""),version:String(o.version),active_connections:Number(o.active_connections??0),max_connections:Number(o.max_connections)}}var nn=f(()=>{"use strict";h();De()});import{HTTPException as rn}from"hono/http-exception";async function sn(t){let{tableName:e,columnName:o,db:a}=t,n=await N(a),r=await n.request().input("tableName",e).query(`
386
+ SELECT COUNT(*) as cnt
387
+ FROM INFORMATION_SCHEMA.TABLES
388
+ WHERE TABLE_CATALOG = DB_NAME()
389
+ AND TABLE_NAME = @tableName
390
+ AND TABLE_SCHEMA = 'dbo'
391
+ `);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new rn(404,{message:`Table "${e}" does not exist`});let c=await n.request().input("tableName",e).input("columnName",o).query(`
392
+ SELECT COUNT(*) as cnt
393
+ FROM INFORMATION_SCHEMA.COLUMNS
394
+ WHERE TABLE_CATALOG = DB_NAME()
395
+ AND TABLE_NAME = @tableName
396
+ AND COLUMN_NAME = @columnName
397
+ AND TABLE_SCHEMA = 'dbo'
398
+ `);if(!(Number(c.recordset[0]?.cnt??0)>0))throw new rn(404,{message:`Column "${o}" does not exist in table "${e}"`});return{deletedCount:(await n.request().query(`ALTER TABLE [${e}] DROP COLUMN [${o}]`)).rowsAffected[0]??1}}var cn=f(()=>{"use strict";h()});import{HTTPException as Ee}from"hono/http-exception";async function Nt(t,e){return(await(await N(e)).request().input("tableName",t).query(`
399
+ SELECT
400
+ fk.name AS constraint_name,
401
+ OBJECT_NAME(fk.parent_object_id) AS referencing_table,
402
+ COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS referencing_column,
403
+ OBJECT_NAME(fk.referenced_object_id) AS referenced_table,
404
+ COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS referenced_column
405
+ FROM sys.foreign_keys fk
406
+ INNER JOIN sys.foreign_key_columns fkc
407
+ ON fk.object_id = fkc.constraint_object_id
408
+ WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
409
+ `)).recordset.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function Ui(t,e,o){let a=await Nt(t,o);if(a.length===0)return[];let n=[],r=await N(o),s=e.map(i=>i.value),c=new Map;for(let i of a){let l=`${i.referencingTable}.${i.referencingColumn}`;c.has(l)||c.set(l,[]),c.get(l)?.push(i)}for(let[i,l]of c){let m=l[0];if(!m||!e.find(y=>y.columnName===m.referencedColumn))continue;let u=r.request();s.forEach((y,b)=>{u.input(`pk${b}`,y)});let d=s.map((y,b)=>`@pk${b}`).join(", "),g=await u.query(`
410
+ SELECT TOP 100 * FROM [${m.referencingTable}]
411
+ WHERE [${m.referencingColumn}] IN (${d})
412
+ `);g.recordset.length>0&&n.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:g.recordset})}return n}async function ln({tableName:t,primaryKeys:e,db:o}){let a=await N(o),n=e[0]?.columnName;if(!n)throw new Ee(400,{message:"Primary key column name is required"});let r=e.map(c=>c.value),s=a.transaction();await s.begin();try{let c=s.request();r.forEach((m,p)=>{c.input(`pk${p}`,m)});let i=r.map((m,p)=>`@pk${p}`).join(", "),l=await c.query(`DELETE FROM [${t}] WHERE [${n}] IN (${i})`);return await s.commit(),{deletedCount:l.rowsAffected[0]??0,fkViolation:!1,relatedRecords:[]}}catch(c){if(await s.rollback(),c.number===vi)return{deletedCount:0,fkViolation:!0,relatedRecords:await Ui(t,e,o)};throw c instanceof Ee?c:new Ee(500,{message:`Failed to delete records from "${t}"`})}}async function mn({tableName:t,primaryKeys:e,db:o}){let a=await N(o),n=e[0]?.columnName;if(!n)throw new Ee(400,{message:"Primary key column name is required"});let r=e.map(c=>c.value),s=a.transaction();await s.begin();try{let c=await Nt(t,o),i=0,l=new Set,m=new Set,p=async(y,b,E,R)=>{let A=`${y}.${b}`;if(R.has(A))return;R.add(A);let q=await Nt(y,o);for(let O of q){let D=s.request();E.forEach((_,v)=>{D.input(`val${v}`,_)});let F=E.map((_,v)=>`@val${v}`).join(", "),$=(await D.query(`
413
+ SELECT [${O.referencedColumn}] FROM [${y}]
414
+ WHERE [${b}] IN (${F})
415
+ `)).recordset.map(_=>_[O.referencedColumn]);$.length>0&&await p(O.referencingTable,O.referencingColumn,$,R)}let k=s.request();E.forEach((O,D)=>{k.input(`delVal${D}`,O)});let H=E.map((O,D)=>`@delVal${D}`).join(", "),j=await k.query(`DELETE FROM [${y}] WHERE [${b}] IN (${H})`);i+=j.rowsAffected[0]??0,l.add(y)};for(let y of c)l.has(y.referencingTable)||await p(y.referencingTable,y.referencingColumn,r,m);let u=s.request();r.forEach((y,b)=>{u.input(`mainPk${b}`,y)});let d=r.map((y,b)=>`@mainPk${b}`).join(", "),g=await u.query(`DELETE FROM [${t}] WHERE [${n}] IN (${d})`);return await s.commit(),{deletedCount:(g.rowsAffected[0]??0)+i}}catch(c){throw await s.rollback(),c instanceof Ee?c:new Ee(500,{message:`Failed to force delete records from "${t}"`})}}var vi,un=f(()=>{"use strict";h();vi=547});import{HTTPException as At}from"hono/http-exception";async function dn(t,e){return(await(await N(e)).request().input("tableName",t).query(`
416
+ SELECT
417
+ fk.name AS constraint_name,
418
+ OBJECT_NAME(fk.parent_object_id) AS referencing_table,
419
+ COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS referencing_column,
420
+ OBJECT_NAME(fk.referenced_object_id) AS referenced_table,
421
+ COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS referenced_column
422
+ FROM sys.foreign_keys fk
423
+ INNER JOIN sys.foreign_key_columns fkc
424
+ ON fk.object_id = fkc.constraint_object_id
425
+ WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
426
+ `)).recordset.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function pn(t,e){let o=await dn(t,e);if(o.length===0)return[];let a=[],n=await N(e);for(let r of o){let s=await n.request().query(`SELECT TOP 100 * FROM [${r.referencingTable}]`);s.recordset.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:s.recordset})}return a}async function Hi(t,e){let a=await(await N(e)).request().query(`SELECT COUNT(*) as count FROM [${t}]`);return Number(a.recordset[0]?.count??0)}async function fn(t){let{tableName:e,db:o,cascade:a}=t,n=await N(o),r=await n.request().input("tableName",e).query(`
427
+ SELECT COUNT(*) as cnt
428
+ FROM INFORMATION_SCHEMA.TABLES
429
+ WHERE TABLE_CATALOG = DB_NAME()
430
+ AND TABLE_NAME = @tableName
431
+ AND TABLE_SCHEMA = 'dbo'
432
+ `);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new At(404,{message:`Table "${e}" does not exist`});let c=await Hi(e,o);if(!a){let i=await pn(e,o);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{if(a){let i=await dn(e,o);for(let l of i)await n.request().query(`ALTER TABLE [${l.referencingTable}] DROP CONSTRAINT [${l.constraintName}]`)}return await n.request().query(`DROP TABLE [${e}]`),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(i){if(i.number===Bi)return{deletedCount:0,fkViolation:!0,relatedRecords:await pn(e,o)};throw i instanceof At?i:new At(500,{message:`Failed to delete table "${e}"`})}}var Bi,bn=f(()=>{"use strict";h();Bi=3726});import{HTTPException as Ki}from"hono/http-exception";async function yn({tableName:t,db:e}){let a=await(await N(e)).request().query(`SELECT * FROM [${t}]`);if(!a.recordset||a.recordset.length===0)throw new Ki(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(a.recordset[0]),rows:a.recordset}}var gn=f(()=>{"use strict";h()});import{HTTPException as Qi}from"hono/http-exception";var Tn,En=f(()=>{"use strict";h();Tn=async({query:t,db:e})=>{let o=await N(e);if(!t||!t.trim())throw new Qi(400,{message:"Query is required"});let a=t.trim().replace(/;+$/,""),n=performance.now(),r=await o.request().query(a),s=performance.now()-n;if(r.recordset){let c=r.recordset;return{columns:r.recordset.columns?Object.keys(r.recordset.columns):Object.keys(c[0]??{}),rows:c,rowCount:c.length,duration:s,message:c.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:r.rowsAffected[0]??0,duration:s,message:`OK \u2014 ${r.rowsAffected[0]??0} row(s) affected`}}});async function hn(t){let e=await N(t),a=await e.request().query(`
433
+ SELECT table_name AS tableName
434
+ FROM information_schema.tables
435
+ WHERE table_catalog = DB_NAME()
436
+ AND table_type = 'BASE TABLE'
437
+ AND table_schema = 'dbo'
438
+ ORDER BY table_name
439
+ `);return!a.recordset||a.recordset.length===0?[]:await Promise.all(a.recordset.map(async r=>{let c=(await e.request().query(`SELECT COUNT(*) as count FROM [${r.tableName}]`)).recordset[0];return{tableName:r.tableName,rowCount:c?.count??0}}))}var Cn=f(()=>{"use strict";h()});import{HTTPException as Sn}from"hono/http-exception";async function Rn({tableName:t,db:e}){let o=await N(e),a=await o.request().input("tableName",t).query(`
440
+ SELECT COUNT(*) as cnt
441
+ FROM INFORMATION_SCHEMA.TABLES
442
+ WHERE TABLE_CATALOG = DB_NAME()
443
+ AND TABLE_NAME = @tableName
444
+ AND TABLE_SCHEMA = 'dbo'
445
+ `);if(!(Number(a.recordset[0]?.cnt??0)>0))throw new Sn(404,{message:`Table "${t}" does not exist`});let r=await o.request().input("tableName",t).query(`
446
+ SELECT
447
+ c.COLUMN_NAME,
448
+ c.DATA_TYPE,
449
+ c.CHARACTER_MAXIMUM_LENGTH,
450
+ c.NUMERIC_PRECISION,
451
+ c.NUMERIC_SCALE,
452
+ c.IS_NULLABLE,
453
+ c.COLUMN_DEFAULT,
454
+ CASE
455
+ WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRIMARY KEY'
456
+ WHEN fk.COLUMN_NAME IS NOT NULL THEN 'FOREIGN KEY'
457
+ ELSE ''
458
+ END AS KEY_TYPE,
459
+ fk.REFERENCED_TABLE_NAME,
460
+ fk.REFERENCED_COLUMN_NAME
461
+ FROM INFORMATION_SCHEMA.COLUMNS c
462
+ LEFT JOIN (
463
+ SELECT ku.TABLE_SCHEMA, ku.TABLE_NAME, ku.COLUMN_NAME
464
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
465
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
466
+ ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
467
+ WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
468
+ ) pk ON c.TABLE_SCHEMA = pk.TABLE_SCHEMA
469
+ AND c.TABLE_NAME = pk.TABLE_NAME
470
+ AND c.COLUMN_NAME = pk.COLUMN_NAME
471
+ LEFT JOIN (
472
+ SELECT
473
+ ku.TABLE_SCHEMA,
474
+ ku.TABLE_NAME,
475
+ ku.COLUMN_NAME,
476
+ ku2.TABLE_NAME AS REFERENCED_TABLE_NAME,
477
+ ku2.COLUMN_NAME AS REFERENCED_COLUMN_NAME
478
+ FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
479
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
480
+ ON rc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
481
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku2
482
+ ON rc.UNIQUE_CONSTRAINT_NAME = ku2.CONSTRAINT_NAME
483
+ ) fk ON c.TABLE_SCHEMA = fk.TABLE_SCHEMA
484
+ AND c.TABLE_NAME = fk.TABLE_NAME
485
+ AND c.COLUMN_NAME = fk.COLUMN_NAME
486
+ WHERE c.TABLE_CATALOG = DB_NAME()
487
+ AND c.TABLE_NAME = @tableName
488
+ AND c.TABLE_SCHEMA = 'dbo'
489
+ ORDER BY c.ORDINAL_POSITION
490
+ `);if(!r.recordset||r.recordset.length===0)throw new Sn(500,{message:`Failed to retrieve schema for table "${t}"`});let s=r.recordset.map(i=>{let l=` [${i.COLUMN_NAME}] ${i.DATA_TYPE}`;return i.CHARACTER_MAXIMUM_LENGTH?l+=i.CHARACTER_MAXIMUM_LENGTH===-1?"(MAX)":`(${i.CHARACTER_MAXIMUM_LENGTH})`:i.NUMERIC_PRECISION&&(i.NUMERIC_SCALE?l+=`(${i.NUMERIC_PRECISION},${i.NUMERIC_SCALE})`:l+=`(${i.NUMERIC_PRECISION})`),l+=i.IS_NULLABLE==="YES"?" NULL":" NOT NULL",i.COLUMN_DEFAULT&&(l+=` DEFAULT ${i.COLUMN_DEFAULT}`),l});return`CREATE TABLE [${t}] (
491
+ ${s.join(`,
492
+ `)}
493
+ )`}var Nn=f(()=>{"use strict";h()});var An,wn=f(()=>{"use strict";h();An=async({tableName:t,cursor:e="",limit:o=50,direction:a="asc",sort:n=[],order:r="asc",filters:s=[],db:c})=>{let i=await N(c),l=e?Number.parseInt(e,10):0,m=l*o,p="";Array.isArray(n)&&n.length>0?p=`ORDER BY ${n.map(q=>`[${q.columnName}] ${q.direction.toUpperCase()}`).join(", ")}`:typeof n=="string"&&n?p=`ORDER BY [${n}] ${r.toUpperCase()}`:p="ORDER BY (SELECT NULL)";let u=await i.request().query(`SELECT COUNT(*) as total FROM [${t}]`),d=Number(u.recordset[0]?.total??0),y=(await i.request().query(`
494
+ SELECT *
495
+ FROM [${t}]
496
+ ${p}
497
+ OFFSET ${m} ROWS
498
+ FETCH NEXT ${o+1} ROWS ONLY
499
+ `)).recordset,b=y.length>o;b&&(y=y.slice(0,o));let E=b?String(l+1):null,R=l>0?String(l-1):null;return{data:y,meta:{limit:o,total:d,hasNextPage:b,hasPreviousPage:l>0,nextCursor:E,prevCursor:R}}}});import{HTTPException as Ye}from"hono/http-exception";async function Dn({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=await N(e),s=await ne({tableName:o,db:e}),c=new Set(s.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName)),i=new Map;for(let m of a){let p=m.rowData[n];if(p==null)throw new Ye(400,{message:`Primary key "${n}" not found in row data.`});i.has(p)||i.set(p,[]),i.get(p)?.push({columnName:m.columnName,value:m.value,rowData:m.rowData})}let l=r.transaction();await l.begin();try{let m=0;for(let[p,u]of i.entries()){let d=u.map((E,R)=>`[${E.columnName}] = @value${R}`),g=l.request();u.forEach((E,R)=>{let A=E.value;A!==null&&typeof A=="object"&&(A=JSON.stringify(A)),c.has(E.columnName)&&typeof A=="string"&&(A=A==="true"?1:0),g.input(`value${R}`,A)}),g.input("pkValue",p);let y=`
500
+ UPDATE [${o}]
501
+ SET ${d.join(", ")}
502
+ WHERE [${n}] = @pkValue
503
+ `,b=await g.query(y);if(b.rowsAffected[0]===0)throw new Ye(404,{message:`Record with ${n} = ${p} not found in table "${o}"`});m+=b.rowsAffected[0]??0}return await l.commit(),{updatedCount:m}}catch(m){throw await l.rollback(),m instanceof Ye?m:new Ye(500,{message:`Failed to update records in "${o}"`})}}var _n=f(()=>{"use strict";h();_e()});import{HTTPException as Xi}from"hono/http-exception";function Zi(t){let e=t.match(/^(?:enum|set)\((.+)\)$/i);return e?.[1]?e[1].split(",").map(o=>o.trim().replace(/^'|'$/g,"")):null}async function re({tableName:t,db:e}){let o=S(e),a=`
215
504
  SELECT
216
505
  c.COLUMN_NAME AS columnName,
217
506
  c.DATA_TYPE AS dataType,
@@ -231,13 +520,47 @@ This will return the 5 customers with the highest total order value. You might a
231
520
  WHERE c.TABLE_SCHEMA = DATABASE()
232
521
  AND c.TABLE_NAME = ?
233
522
  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})
523
+ `,[n]=await o.execute(a,[t]);if(!n||n.length===0)throw new Xi(404,{message:`Table "${t}" does not exist`});return n.map(r=>{let s=r.dataType,c=r.columnType,l=s==="enum"||s==="set"?Zi(c):null;return{columnName:r.columnName,dataType:fo(s,c),dataTypeLabel:bo(s,c),isNullable:!!r.isNullable,columnDefault:r.columnDefault??null,isPrimaryKey:!!r.isPrimaryKey,isForeignKey:!!r.isForeignKey,referencedTable:r.referencedTable??null,referencedColumn:r.referencedColumn??null,enumValues:l}})}var Me=f(()=>{"use strict";X();h()});import{HTTPException as tc}from"hono/http-exception";async function Mn({db:t,params:e}){let{tableName:o,data:a}=e,n=S(t),r=await re({tableName:o,db:t}),s=new Set(r.filter(d=>d.dataTypeLabel==="boolean").map(d=>d.columnName)),c=Object.keys(a),i=Object.values(a).map((d,g)=>{let y=c[g];return s.has(y)&&typeof d=="string"?d==="true"?1:0:d}),l=c.map(()=>"?").join(", "),m=c.map(d=>`\`${d}\``).join(", "),p=`
524
+ INSERT INTO \`${o}\` (${m})
525
+ VALUES (${l})
526
+ `,[u]=await n.execute(p,i);if(u.affectedRows===0)throw new tc(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:u.affectedRows}}var xn=f(()=>{"use strict";h();Me()});import{HTTPException as ze}from"hono/http-exception";var Ln,On=f(()=>{"use strict";h();Me();Ln=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new ze(400,{message:"At least one record is required"});let n=await S(o).getConnection();try{let r=Object.keys(e[0]),s=r.map(l=>`\`${l}\``).join(", "),c=await re({tableName:t,db:o}),i=new Set(c.filter(l=>l.dataTypeLabel==="boolean").map(l=>l.columnName));await n.beginTransaction();for(let l=0;l<e.length;l++){let m=e[l],p=r.map(g=>{let y=m[g];return i.has(g)&&typeof y=="string"?y==="true"?1:0:y}),u=r.map(()=>"?").join(", "),d=`
527
+ INSERT INTO \`${t}\` (${s})
239
528
  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
529
+ `;try{await n.execute(d,p)}catch(g){throw new ze(500,{message:`Failed to insert record ${l+1}: ${g instanceof Error?g.message:String(g)}`})}}return await n.commit(),{success:!0,message:`Successfully inserted ${e.length} record${e.length!==1?"s":""}`,successCount:e.length,failureCount:0}}catch(r){throw await n.rollback(),r instanceof ze?r:new ze(500,{message:`Failed to bulk insert records into "${t}"`})}finally{n.release()}}});function nc(t,e){if(!t?.trim())return null;let o=t.trim().toLowerCase();return o.includes("(")&&o.includes(")")?o.includes("uuid()")?!e.toUpperCase().includes("CHAR")&&!e.toUpperCase().includes("TEXT")?null:"(UUID())":o.includes("current_timestamp")||o.includes("now()")?"(CURRENT_TIMESTAMP)":o.includes("current_date")?"(CURRENT_DATE)":`(${t.trim()})`:o==="null"?"NULL":o==="true"||o==="false"?o==="true"?"1":"0":t.trim()}function rc(t,e){if(e)return"JSON";let o=t.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"}[o]||t.toUpperCase()}function he(t,e={}){let o=rc(t.columnType,t.isArray??!1),a=`\`${t.columnName}\` ${o}`;if(!t.isNullable&&!t.isPrimaryKey&&(a+=" NOT NULL"),t.defaultValue&&!o.includes("AUTO_INCREMENT")){let n=nc(t.defaultValue,o);n!==null&&(a+=` DEFAULT ${n}`)}return(t.isIdentity||e.preserveAutoIncrement)&&!o.includes("AUTO_INCREMENT")&&(a+=" AUTO_INCREMENT"),e.includeUnique&&t.isUnique&&!t.isPrimaryKey&&(a+=" UNIQUE"),e.includePrimaryKey&&t.isPrimaryKey&&(a+=" PRIMARY KEY"),a}var Ge=f(()=>{"use strict"});async function Pn({tableData:t,db:e}){let{tableName:o,fields:a,foreignKeys:n}=t,r=S(e),s=a.map(u=>he(u)),c=a.filter(u=>u.isPrimaryKey),i=[];if(c.length>0){let u=c.map(d=>`\`${d.columnName}\``).join(", ");i.push(`PRIMARY KEY (${u})`)}for(let u of a)u.isUnique&&!u.isPrimaryKey&&i.push(`UNIQUE KEY \`uq_${o}_${u.columnName}\` (\`${u.columnName}\`)`);let l=n?.map(u=>`CONSTRAINT \`${`fk_${o}_${u.columnName}_${u.referencedTable}_${u.referencedColumn}`}\` FOREIGN KEY (\`${u.columnName}\`) REFERENCES \`${u.referencedTable}\` (\`${u.referencedColumn}\`) ON UPDATE ${u.onUpdate} ON DELETE ${u.onDelete}`)||[],m=[...s,...i,...l],p=`
530
+ CREATE TABLE \`${o}\` (
531
+ ${m.join(`,
532
+ `)}
533
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
534
+ `;await r.execute(p)}var In=f(()=>{"use strict";h();Ge()});import{HTTPException as wt}from"hono/http-exception";async function $n(){let t=S(),[e]=await t.execute(`
535
+ SELECT
536
+ s.SCHEMA_NAME AS name,
537
+ CONCAT(
538
+ ROUND(
539
+ COALESCE(SUM(t.data_length + t.index_length), 0) / 1024 / 1024,
540
+ 2
541
+ ),
542
+ ' MB'
543
+ ) AS size,
544
+ CURRENT_USER() AS owner,
545
+ s.DEFAULT_CHARACTER_SET_NAME AS encoding
546
+ FROM information_schema.SCHEMATA s
547
+ LEFT JOIN information_schema.TABLES t
548
+ ON t.TABLE_SCHEMA = s.SCHEMA_NAME
549
+ GROUP BY s.SCHEMA_NAME, s.DEFAULT_CHARACTER_SET_NAME
550
+ ORDER BY s.SCHEMA_NAME
551
+ `);if(!e[0])throw new wt(500,{message:"No databases returned from server"});return e}async function qn(){let t=S(),[e]=await t.execute("SELECT DATABASE() AS db");if(!e[0])throw new wt(500,{message:"No current database returned from server"});return e[0]}async function kn(){let t=S(),[e]=await t.execute(`
552
+ SELECT
553
+ VERSION() AS version,
554
+ DATABASE() AS database_name,
555
+ CURRENT_USER() AS user,
556
+ @@hostname AS host,
557
+ @@port AS port,
558
+ @@max_connections AS max_connections
559
+ `),[o]=await t.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!e[0])throw new wt(500,{message:"No connection information returned from server"});let a=e[0],n=Number(o[0]?.cnt??0),r=oe();return{host:String(a.host||r.host),port:Number(a.port||r.port),user:String(a.user),database:String(a.database_name??""),version:String(a.version),active_connections:n,max_connections:Number(a.max_connections)}}var vn=f(()=>{"use strict";h();De()});import{HTTPException as Un}from"hono/http-exception";async function Fn(t){let{tableName:e,columnName:o,db:a}=t,n=S(a),[r]=await n.execute(`SELECT COUNT(*) as cnt
560
+ FROM information_schema.TABLES
561
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(r[0]?.cnt??0)>0))throw new Un(404,{message:`Table "${e}" does not exist`});let[c]=await n.execute(`SELECT COUNT(*) as cnt
562
+ FROM information_schema.COLUMNS
563
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(!(Number(c[0]?.cnt??0)>0))throw new Un(404,{message:`Column "${o}" does not exist in table "${e}"`});let[l]=await n.execute(`ALTER TABLE \`${e}\` DROP COLUMN \`${o}\``);return{deletedCount:l.affectedRows}}var Bn=f(()=>{"use strict";h()});import{HTTPException as Ce}from"hono/http-exception";async function Dt(t,e){let o=S(e),[a]=await o.execute(`SELECT
241
564
  kcu.CONSTRAINT_NAME AS constraint_name,
242
565
  kcu.TABLE_NAME AS referencing_table,
243
566
  kcu.COLUMN_NAME AS referencing_column,
@@ -250,96 +573,10 @@ This will return the 5 customers with the highest total order value. You might a
250
573
  AND kcu.TABLE_NAME = tc.TABLE_NAME
251
574
  WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
252
575
  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(", "),[M]=await i.execute(`DELETE FROM \`${f}\` WHERE \`${h}\` IN (${H})`,T);s+=M.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
576
+ AND kcu.REFERENCED_TABLE_NAME = ?`,[t]);return a.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function mc(t,e,o){let a=await Dt(t,o);if(a.length===0)return[];let n=[],r=S(o),s=e.map(i=>i.value),c=new Map;for(let i of a){let l=`${i.referencingTable}.${i.referencingColumn}`;c.has(l)||c.set(l,[]),c.get(l)?.push(i)}for(let[i,l]of c){let m=l[0];if(!m||!e.find(g=>g.columnName===m.referencedColumn))continue;let u=s.map(()=>"?").join(", "),[d]=await r.execute(`SELECT * FROM \`${m.referencingTable}\`
577
+ WHERE \`${m.referencingColumn}\` IN (${u})
578
+ LIMIT 100`,s);d.length>0&&n.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:d})}return n}async function Hn({tableName:t,primaryKeys:e,db:o}){let a=S(o),n=e[0]?.columnName;if(!n)throw new Ce(400,{message:"Primary key column name is required"});let r=e.map(i=>i.value),s=r.map(()=>"?").join(", "),c=await a.getConnection();await c.beginTransaction();try{let[i]=await c.execute(`DELETE FROM \`${t}\` WHERE \`${n}\` IN (${s})`,r);return await c.commit(),{deletedCount:i.affectedRows,fkViolation:!1,relatedRecords:[]}}catch(i){if(await c.rollback(),i.errno===lc)return{deletedCount:0,fkViolation:!0,relatedRecords:await mc(t,e,o)};throw i instanceof Ce?i:new Ce(500,{message:`Failed to delete records from "${t}"`})}finally{c.release()}}async function jn({tableName:t,primaryKeys:e,db:o}){let a=S(o),n=e[0]?.columnName;if(!n)throw new Ce(400,{message:"Primary key column name is required"});let r=e.map(c=>c.value),s=await a.getConnection();await s.beginTransaction();try{await s.execute("SET FOREIGN_KEY_CHECKS = 0");let c=await Dt(t,o),i=0,l=new Set,m=new Set,p=async(g,y,b,E)=>{let R=`${g}.${y}`;if(E.has(R))return;E.add(R);let A=await Dt(g,o);for(let H of A){let j=b.map(()=>"?").join(", "),[O]=await s.execute(`SELECT \`${H.referencedColumn}\` FROM \`${g}\`
579
+ WHERE \`${y}\` IN (${j})`,b),D=O.map(F=>F[H.referencedColumn]);D.length>0&&await p(H.referencingTable,H.referencingColumn,D,E)}let q=b.map(()=>"?").join(", "),[k]=await s.execute(`DELETE FROM \`${g}\` WHERE \`${y}\` IN (${q})`,b);i+=k.affectedRows,l.add(g)};for(let g of c)l.has(g.referencingTable)||await p(g.referencingTable,g.referencingColumn,r,m);let u=r.map(()=>"?").join(", "),[d]=await s.execute(`DELETE FROM \`${t}\` WHERE \`${n}\` IN (${u})`,r);return await s.execute("SET FOREIGN_KEY_CHECKS = 1"),await s.commit(),{deletedCount:d.affectedRows+i}}catch(c){throw await s.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await s.rollback(),c instanceof Ce?c:new Ce(500,{message:`Failed to force delete records from "${t}"`})}finally{s.release()}}var lc,Kn=f(()=>{"use strict";h();lc=1451});import{HTTPException as _t}from"hono/http-exception";async function fc(t,e){let o=S(e),[a]=await o.execute(`SELECT
343
580
  kcu.CONSTRAINT_NAME AS constraint_name,
344
581
  kcu.TABLE_NAME AS referencing_table,
345
582
  kcu.COLUMN_NAME AS referencing_column,
@@ -352,49 +589,37 @@ This will return the 5 customers with the highest total order value. You might a
352
589
  AND kcu.TABLE_NAME = tc.TABLE_NAME
353
590
  WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
354
591
  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 Io=d(()=>{"use strict";S()});import{HTTPException as tt}from"hono/http-exception";async function Mo(a){let{tableName:e,columnName:t,newColumnName:o,db:r}=a,n=E(r),[i]=await n.execute(`SELECT COUNT(*) as cnt
592
+ AND kcu.REFERENCED_TABLE_NAME = ?`,[t]);return a.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function Vn(t,e){let o=await fc(t,e);if(o.length===0)return[];let a=[],n=S(e);for(let r of o){let[s]=await n.execute(`SELECT * FROM \`${r.referencingTable}\` LIMIT 100`);s.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:s})}return a}async function bc(t,e){let o=S(e),[a]=await o.execute(`SELECT COUNT(*) as count FROM \`${t}\``);return Number(a[0]?.count??0)}async function Qn(t){let{tableName:e,db:o,cascade:a}=t,n=S(o),[r]=await n.execute(`SELECT COUNT(*) as cnt
358
593
  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=`
594
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(r[0]?.cnt??0)>0))throw new _t(404,{message:`Table "${e}" does not exist`});let c=await bc(e,o);if(!a){let i=await Vn(e,o);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{if(a){let i=await n.getConnection();try{await i.execute("SET FOREIGN_KEY_CHECKS = 0"),await i.execute(`DROP TABLE \`${e}\``),await i.execute("SET FOREIGN_KEY_CHECKS = 1")}finally{i.release()}}else await n.execute(`DROP TABLE \`${e}\``);return{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(i){await n.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{});let l=i;if(l.errno===pc||l.errno===dc)return{deletedCount:0,fkViolation:!0,relatedRecords:await Vn(e,o)};throw i instanceof _t?i:new _t(500,{message:`Failed to delete table "${e}"`})}}var pc,dc,Wn=f(()=>{"use strict";h();pc=1217,dc=1451});import{HTTPException as gc}from"hono/http-exception";async function Yn({tableName:t,db:e}){let o=S(e),[a]=await o.execute(`SELECT * FROM \`${t}\``);if(!a||a.length===0)throw new gc(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}var zn=f(()=>{"use strict";h()});import{HTTPException as Ec}from"hono/http-exception";var Gn,Jn=f(()=>{"use strict";h();Gn=async({query:t,db:e})=>{let o=S(e);if(!t||!t.trim())throw new Ec(400,{message:"Query is required"});let a=t.trim().replace(/;+$/,""),n=performance.now(),[r,s]=await o.execute(a),c=performance.now()-n;if(Array.isArray(r)){let l=r;return{columns:s?s.map(p=>p.name):Object.keys(l[0]??{}),rows:l,rowCount:l.length,duration:c,message:l.length===0?"OK":void 0}}let i=r;return{columns:[],rows:[],rowCount:i.affectedRows,duration:c,message:`OK \u2014 ${i.affectedRows} row(s) affected`}}});async function Xn(t){let e=S(t),o=`
364
595
  SELECT table_name as tableName
365
596
  FROM information_schema.tables
366
597
  WHERE table_schema = DATABASE()
367
598
  AND table_type = 'BASE TABLE'
368
599
  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
600
+ `,[a]=await e.execute(o);return!a||a.length===0?[]:await Promise.all(a.map(async r=>{let[s]=await e.execute(`SELECT COUNT(*) as count FROM \`${r.tableName}\``),c=s[0];return{tableName:r.tableName,rowCount:c?.count??0}}))}var Zn=f(()=>{"use strict";h()});import{HTTPException as er}from"hono/http-exception";async function tr({tableName:t,db:e}){let o=S(e),[a]=await o.execute(`SELECT COUNT(*) as cnt
370
601
  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
602
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[t]);if(!(Number(a[0]?.cnt??0)>0))throw new er(404,{message:`Table "${t}" does not exist`});let[r]=await o.execute(`SHOW CREATE TABLE \`${t}\``),s=r[0],c=s?.["Create Table"]??s?.create_table??"";if(!c)throw new er(500,{message:`Failed to retrieve schema for table "${t}"`});return c}var or=f(()=>{"use strict";h()});function ar(t){if(t.length===0)return{clause:"",values:[]};let e=[],o=[];for(let a of t){let n=`\`${a.columnName}\``;switch(a.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${a.operator} ?`),o.push(a.value);break;case"is":a.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = ?`),o.push(a.value));break;case"is not":a.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != ?`),o.push(a.value));break;case"like":case"ilike":e.push(`${n} LIKE ?`),o.push(a.value);break;case"not like":case"not ilike":e.push(`${n} NOT LIKE ?`),o.push(a.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:o}}function nr(t,e){return Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(a=>`\`${a.columnName}\` ${a.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY \`${t}\` ${e?.toUpperCase()||"ASC"}`:""}function rr(t,e,o){let{values:a,sortColumns:n}=t,r=[],s=[],l=o==="asc"===(e==="asc");if(n.length>0){let m=n.map(d=>`\`${d}\``).join(", "),p=n.map(()=>"?").join(", "),u=l?">":"<";r.push(`(${m}) ${u} (${p})`);for(let d of n)s.push(a[d])}return{clause:r.length>0?`(${r.join(" AND ")})`:"",values:s}}var sr=f(()=>{"use strict"});var Je,Rc,Nc,ir,cr=f(()=>{"use strict";h();sr();Je=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),Rc=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},Nc=async(t,e)=>{let[o]=await t.execute(`SELECT COLUMN_NAME as column_name
372
603
  FROM information_schema.COLUMNS
373
604
  WHERE TABLE_SCHEMA = DATABASE()
374
605
  AND TABLE_NAME = ?
375
606
  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),M=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],I=ee=>({values:Object.fromEntries(u.map(fe=>[fe,ee[fe]])),sortColumns:u});o==="asc"?(_&&(O=Pe(I(N))),e&&(Q=Pe(I(L)))):(e&&(O=Pe(I(N))),_&&(Q=Pe(I(L))))}return{data:q,meta:{limit:t,total:M,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=`
607
+ ORDER BY ORDINAL_POSITION`,[e]);return o.map(a=>a.column_name)},ir=async({tableName:t,cursor:e="",limit:o=50,direction:a="asc",sort:n=[],order:r="asc",filters:s=[],db:c})=>{let i=S(c),l=await Nc(i,t),m=[],p=r;Array.isArray(n)&&n.length>0?(m=n.map($=>$.columnName),p=n[0].direction):typeof n=="string"&&n&&(m=[n]);let u=[...m,...l.filter($=>!m.includes($))],{clause:d,values:g}=ar(s),y="",b=[];if(e){let $=Rc(e);if($){let _=rr($,a,p);y=_.clause,b=_.values}}let E="";d&&y?E=`WHERE ${d.replace(/^WHERE\s+/i,"")} AND ${y}`:d?E=d:y&&(E=`WHERE ${y}`);let R=nr((Array.isArray(n),n),r),A=R;a==="desc"?R?A=R.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):u.length>0&&(A=`ORDER BY ${u.map(_=>`\`${_}\` ${p==="asc"?"DESC":"ASC"}`).join(", ")}`):!R&&u.length>0&&(A=`ORDER BY ${u.map(_=>`\`${_}\` ${p.toUpperCase()}`).join(", ")}`);let[q]=await i.execute(`SELECT COUNT(*) as total FROM \`${t}\` ${d}`,g),k=Number(q[0]?.total??0),H=Math.floor(o)+1,[j]=await i.execute(`SELECT * FROM \`${t}\` ${E} ${A} LIMIT ${H}`,[...g,...b]),O=j,D=O.length>o;D&&(O=O.slice(0,o)),a==="desc"&&(O=O.reverse());let F=null,Y=null;if(O.length>0&&u.length>0){let $=O[0],_=O[O.length-1],v=me=>({values:Object.fromEntries(u.map(Oe=>[Oe,me[Oe]])),sortColumns:u});a==="asc"?(D&&(F=Je(v(_))),e&&(Y=Je(v($)))):(e&&(F=Je(v(_))),D&&(Y=Je(v($))))}return{data:O,meta:{limit:o,total:k,hasNextPage:a==="asc"?D:!!e,hasPreviousPage:a==="asc"?!!e:D,nextCursor:F,prevCursor:Y}}}});import{HTTPException as Xe}from"hono/http-exception";async function lr({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=S(e),s=await re({tableName:o,db:e}),c=new Set(s.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName)),i=new Map;for(let m of a){let p=m.rowData[n];if(p==null)throw new Xe(400,{message:`Primary key "${n}" not found in row data.`});i.has(p)||i.set(p,[]),i.get(p)?.push({columnName:m.columnName,value:m.value,rowData:m.rowData})}let l=await r.getConnection();await l.beginTransaction();try{let m=0;for(let[p,u]of i.entries()){let d=u.map(E=>`\`${E.columnName}\` = ?`),g=u.map(E=>E.value!==null&&typeof E.value=="object"?JSON.stringify(E.value):c.has(E.columnName)&&typeof E.value=="string"?E.value==="true"?1:0:E.value);g.push(p);let y=`
608
+ UPDATE \`${o}\`
609
+ SET ${d.join(", ")}
610
+ WHERE \`${n}\` = ?
611
+ `,[b]=await l.execute(y,g);if(b.affectedRows===0)throw new Xe(404,{message:`Record with ${n} = ${p} not found in table "${o}"`});m+=b.affectedRows}return await l.commit(),{updatedCount:m}}catch(m){throw await l.rollback(),m instanceof Xe?m:new Xe(500,{message:`Failed to update records in "${o}"`})}finally{l.release()}}var mr=f(()=>{"use strict";h();Me()});import{HTTPException as Dc}from"hono/http-exception";var ur,pr=f(()=>{"use strict";h();ur=async({query:t,db:e})=>{let o=C(e);if(!t||!t.trim())throw new Dc(400,{message:"Query is required"});let a=t.trim().replace(/;+$/,""),n=performance.now(),r=await o.query(a),s=performance.now()-n;return{columns:r.fields.map(i=>i.name),rows:r.rows,rowCount:r.rows.length,duration:s,message:r.rows.length===0?"OK":void 0}}});import{HTTPException as Mc}from"hono/http-exception";async function dr(t){let e=C(t),o=`
387
612
  SELECT table_name as "tableName"
388
613
  FROM information_schema.tables
389
614
  WHERE table_schema = 'public'
390
615
  AND table_type = 'BASE TABLE'
391
616
  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=`
617
+ `,{rows:a}=await e.query(o);if(!a[0])throw new Mc(500,{message:"No tables returned from database"});return await Promise.all(a.map(async r=>{let s=`SELECT COUNT(*)::integer as count FROM "${r.tableName}"`,{rows:c}=await e.query(s);return{tableName:r.tableName,rowCount:c[0]?.count??0}}))}var fr=f(()=>{"use strict";h()});import{HTTPException as Lc}from"hono/http-exception";async function br({tableName:t,db:e}){let o=C(e),a=`
393
618
  SELECT EXISTS (
394
619
  SELECT 1 FROM information_schema.tables
395
620
  WHERE table_schema = 'public' AND table_name = $1
396
621
  ) 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=`
622
+ `,{rows:n}=await o.query(a,[t]);if(!n[0]?.exists)throw new Lc(404,{message:`Table "${t}" does not exist`});let r=`
398
623
  SELECT
399
624
  column_name,
400
625
  data_type,
@@ -407,7 +632,7 @@ This will return the 5 customers with the highest total order value. You might a
407
632
  FROM information_schema.columns
408
633
  WHERE table_schema = 'public' AND table_name = $1
409
634
  ORDER BY ordinal_position
410
- `,{rows:i}=await t.query(n,[a]),l=`
635
+ `,{rows:s}=await o.query(r,[t]),c=`
411
636
  SELECT
412
637
  tc.constraint_name,
413
638
  tc.constraint_type,
@@ -424,7 +649,7 @@ This will return the 5 customers with the highest total order value. You might a
424
649
  AND tc.constraint_type = 'FOREIGN KEY'
425
650
  WHERE tc.table_schema = 'public' AND tc.table_name = $1
426
651
  ORDER BY tc.constraint_type, tc.constraint_name
427
- `,{rows:s}=await t.query(l,[a]),m=`
652
+ `,{rows:i}=await o.query(c,[t]),l=`
428
653
  SELECT indexname, indexdef
429
654
  FROM pg_indexes
430
655
  WHERE schemaname = 'public' AND tablename = $1
@@ -433,11 +658,61 @@ This will return the 5 customers with the highest total order value. You might a
433
658
  FROM information_schema.table_constraints
434
659
  WHERE table_schema = 'public' AND table_name = $1 AND constraint_type = 'PRIMARY KEY'
435
660
  )
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,M=D.foreign_column_name;f.push(` constraint ${T} foreign key (${P}) references ${H} (${M})`)}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,In,Mn,sr,ir=d(()=>{"use strict";S();nr();Le=a=>Buffer.from(JSON.stringify(a)).toString("base64url"),In=a=>{try{return JSON.parse(Buffer.from(a,"base64url").toString("utf-8"))}catch{return null}},Mn=async(a,e)=>{let t=`"${e}"`;return(await a.query(`SELECT a.attname as column_name
661
+ `,{rows:m}=await o.query(l,[t]),p=[];p.push(`create table public.${t} (`);let u=[];for(let b of s){let E=` ${b.column_name} ${Oc(b)}`;b.is_nullable==="NO"&&(E+=" not null"),b.column_default!==null&&(E+=` default ${b.column_default}`),u.push(E)}let d=new Map;for(let b of i){let E=d.get(b.constraint_name)||[];E.push(b),d.set(b.constraint_name,E)}let g=[];for(let[b,E]of d){let R=E[0],A=E.map(q=>q.column_name).join(", ");if(R.constraint_type==="PRIMARY KEY")g.push(` constraint ${b} primary key (${A})`);else if(R.constraint_type==="FOREIGN KEY"){let q=R.foreign_table_name,k=R.foreign_column_name;g.push(` constraint ${b} foreign key (${A}) references ${q} (${k})`)}else R.constraint_type==="UNIQUE"&&g.push(` constraint ${b} unique (${A})`)}let y=[...u,...g];p.push(y.join(`,
662
+ `)),p.push(") tablespace pg_default;");for(let b of m)Array.from(d.values()).some(R=>R[0].constraint_type==="UNIQUE"&&R[0].constraint_name===b.indexname)||(p.push(""),p.push(`${b.indexdef};`));return p.join(`
663
+ `)}function Oc(t){let{data_type:e,udt_name:o,character_maximum_length:a,numeric_precision:n,numeric_scale:r}=t;return e==="USER-DEFINED"?o:e==="ARRAY"?`${o.replace(/^_/,"")}[]`:(e==="character varying"||e==="varchar")&&a?`varchar(${a})`:e==="character"&&a?`char(${a})`:e==="numeric"&&n!==null?r!==null&&r>0?`numeric(${n}, ${r})`:`numeric(${n})`:e==="timestamp with time zone"?"timestamp with time zone":e==="timestamp without time zone"?"timestamp":{"character varying":"varchar",character:"char","double precision":"float8",integer:"integer",bigint:"bigint",smallint:"smallint",boolean:"boolean",text:"text",uuid:"uuid",json:"json",jsonb:"jsonb",date:"date",time:"time",bytea:"bytea"}[e]||e}var yr=f(()=>{"use strict";h()});function gr(t){if(t.length===0)return{clause:"",values:[]};let e=[],o=[];for(let a of t){let n=o.length+1,r=`"${a.columnName}"`;switch(a.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${r} ${a.operator} $${n}`),o.push(a.value);break;case"is":a.value.toLowerCase()==="null"?e.push(`${r} IS NULL`):(e.push(`${r} = $${n}`),o.push(a.value));break;case"is not":a.value.toLowerCase()==="null"?e.push(`${r} IS NOT NULL`):(e.push(`${r} != $${n}`),o.push(a.value));break;case"like":e.push(`${r}::text LIKE $${n}`),o.push(a.value);break;case"not like":e.push(`${r}::text NOT LIKE $${n}`),o.push(a.value);break;case"ilike":e.push(`${r}::text ILIKE $${n}`),o.push(a.value);break;case"not ilike":e.push(`${r}::text NOT ILIKE $${n}`),o.push(a.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:o}}function Tr(t,e){return Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(a=>`"${a.columnName}" ${a.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY "${t}" ${e?.toUpperCase()||"ASC"}`:""}function Er(t,e,o,a){let{values:n,sortColumns:r}=t,s=[],c=[],m=o==="asc"===(e==="asc");if(r.length>0){let p=r.map(g=>`"${g}"`).join(", "),u=r.map((g,y)=>`$${a+y}`).join(", "),d=m?">":"<";s.push(`(${p}) ${d} (${u})`);for(let g of r)c.push(n[g])}return{clause:s.length>0?`(${s.join(" AND ")})`:"",values:c}}var hr=f(()=>{"use strict"});var Ze,Ic,$c,Cr,Sr=f(()=>{"use strict";h();hr();Ze=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),Ic=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},$c=async(t,e)=>{let o=`"${e}"`;return(await t.query(`SELECT a.attname as column_name
439
664
  FROM pg_index i
440
665
  JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
441
666
  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 Mn(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=In(e);if(N){let I=rr(N,o,p,f.length+1);h=I.clause,T=I.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(I=>`"${I}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!D&&u.length>0&&(P=`ORDER BY ${u.map(I=>`"${I}" ${p.toUpperCase()}`).join(", ")}`);let H=await s.query(`SELECT COUNT(*) as total FROM "${a}" ${b}`,f),M=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],I=_[_.length-1],ee=fe=>({values:Object.fromEntries(u.map(rt=>[rt,fe[rt]])),sortColumns:u});o==="asc"?(O&&(Q=Le(ee(I))),e&&(L=Le(ee(N)))):(e&&(Q=Le(ee(I))),O&&(L=Le(ee(N))))}return{data:_,meta:{limit:t,total:M,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();Io();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 Mo({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();Ma();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",Ia).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 Ie,note as ft,select as hr,spinner as gr,text as yt}from"@clack/prompts";import{parse as Er}from"dotenv";import Me 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(Me.red(`${t} not found in .env or process.env`)):ft(Me.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((Ie(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"}});Ie(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: ${Me.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 Ie(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.1",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",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};
667
+ ORDER BY array_position(i.indkey, a.attnum)`,[o])).rows.map(n=>n.column_name)},Cr=async({tableName:t,cursor:e="",limit:o=50,direction:a="asc",sort:n=[],order:r="asc",filters:s=[],db:c})=>{let i=C(c),l=await $c(i,t),m=[],p=r;Array.isArray(n)&&n.length>0?(m=n.map(_=>_.columnName),p=n[0].direction):typeof n=="string"&&n&&(m=[n]);let u=[...m,...l.filter(_=>!m.includes(_))];u.length===0&&u.push("ctid");let{clause:d,values:g}=gr(s),y="",b=[];if(e){let _=Ic(e);if(_){let v=Er(_,a,p,g.length+1);y=v.clause,b=v.values}}let E="";d&&y?E=`WHERE ${d.replace(/^WHERE\s+/i,"")} AND ${y}`:d?E=d:y&&(E=`WHERE ${y}`);let R=Tr((Array.isArray(n),n),r),A=R;a==="desc"?R?A=R.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):A=`ORDER BY ${u.map(v=>`"${v}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!R&&u.length>0&&(A=`ORDER BY ${u.map(v=>`"${v}" ${p.toUpperCase()}`).join(", ")}`);let q=await i.query(`SELECT COUNT(*) as total FROM "${t}" ${d}`,g),k=Number(q.rows[0].total),H=g.length+b.length+1,j=await i.query(`SELECT * FROM "${t}" ${E} ${A} LIMIT $${H}`,[...g,...b,o+1]),D=j.fields&&j.fields.length>0?j.rows.filter(_=>Object.keys(_).length>0):j.rows,F=D.length>o;F&&(D=D.slice(0,o)),a==="desc"&&(D=D.reverse());let Y=null,$=null;if(D.length>0){let _=D[0],v=D[D.length-1],me=Oe=>({values:Object.fromEntries(u.map(Ot=>[Ot,Oe[Ot]])),sortColumns:u});a==="asc"?(F&&(Y=Ze(me(v))),e&&($=Ze(me(_)))):(e&&(Y=Ze(me(v))),F&&($=Ze(me(_))))}return{data:D,meta:{limit:o,total:k,hasNextPage:a==="asc"?F:!!e,hasPreviousPage:a==="asc"?!!e:F,nextCursor:Y,prevCursor:$}}}});import{HTTPException as et}from"hono/http-exception";async function Rr({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=C(e),s=new Map;for(let c of a){let i=c.rowData[n];if(i==null)throw new et(400,{message:`Primary key "${n}" not found in row data. Please ensure the row has a "${n}" column.`});s.has(i)||s.set(i,[]),s.get(i)?.push({columnName:c.columnName,value:c.value,rowData:c.rowData})}await r.query("BEGIN");try{let c=0;for(let[i,l]of s.entries()){let m=l.map((g,y)=>`"${g.columnName}" = $${y+1}`),p=l.map(g=>g.value!==null&&typeof g.value=="object"?JSON.stringify(g.value):g.value);p.push(i);let u=`
668
+ UPDATE "${o}"
669
+ SET ${m.join(", ")}
670
+ WHERE "${n}" = $${p.length}
671
+ RETURNING *
672
+ `,d=await r.query(u,p);if(d.rowCount===0)throw new et(404,{message:`Record with ${n} = ${i} not found in table "${o}"`});c+=d.rowCount??0}return await r.query("COMMIT"),{updatedCount:c}}catch(c){throw await r.query("ROLLBACK"),c instanceof et?c:new et(500,{message:`Failed to update records in "${o}"`})}}var Nr=f(()=>{"use strict";h()});function P(t){return t==="mongodb"?Ar.mongodb:Ar[t]}var Ar,xe=f(()=>{"use strict";fa();ya();Ta();Sa();Aa();_a();La();Pa();qa();Fa();Ha();Qa();Ya();ye();Ga();Xa();en();nn();cn();un();bn();gn();En();_e();Cn();Nn();wn();_n();xn();On();In();vn();Bn();Kn();Wn();zn();Jn();Me();Zn();or();cr();mr();pr();gt();fr();yr();Sr();Nr();Ar={pg:{addRecord:da,bulkInsertRecords:ba,createTable:ga,getDatabasesList:Ea,getCurrentDatabase:ha,getDatabaseConnectionInfo:Ca,deleteColumn:Na,deleteRecords:wa,forceDeleteRecords:Da,deleteTable:xa,exportTableData:Oa,executeQuery:ur,getTableColumns:Ve,getTablesList:dr,getTableSchema:br,getTableData:Cr,updateRecords:Rr},mysql:{addRecord:Mn,bulkInsertRecords:Ln,createTable:Pn,getDatabasesList:$n,getCurrentDatabase:qn,getDatabaseConnectionInfo:kn,deleteColumn:Fn,deleteRecords:Hn,forceDeleteRecords:jn,deleteTable:Qn,exportTableData:Yn,executeQuery:Gn,getTableColumns:re,getTablesList:Xn,getTableSchema:tr,getTableData:ir,updateRecords:lr},mongodb:{addRecord:({db:t,params:e})=>ja({db:t,params:e}),bulkInsertRecords:$a,createTable:({db:t,tableData:e})=>Zo({tableName:e?.tableName??"",tableData:e,db:t}),getDatabasesList:ka,getCurrentDatabase:va,getDatabaseConnectionInfo:Ua,deleteColumn:({db:t,tableName:e,columnName:o})=>ea({tableName:e,columnName:o,db:t}),deleteRecords:St,forceDeleteRecords:Va,deleteTable:async({db:t,tableName:e})=>{let{getMongoDb:o}=await Promise.resolve().then(()=>(h(),Qo));await(await o(t)).collection(e).drop()},exportTableData:({db:t,tableName:e})=>ta({tableName:e,db:t}),executeQuery:({query:t,db:e})=>Ba({query:t,db:e}),getTableColumns:je,getTablesList:({db:t})=>Jo(t),getTableSchema:Wa,getTableData:Xo,updateRecords:({db:t,params:e})=>Ka({db:t,params:e})},mssql:{addRecord:za,bulkInsertRecords:Ja,createTable:Za,getDatabasesList:tn,getCurrentDatabase:on,getDatabaseConnectionInfo:an,deleteColumn:sn,deleteRecords:ln,forceDeleteRecords:mn,deleteTable:fn,exportTableData:yn,executeQuery:Tn,getTableColumns:ne,getTablesList:hn,getTableSchema:Rn,getTableData:An,updateRecords:Dn}}});import{Hono as vc}from"hono";var wr,Dr=f(()=>{"use strict";xe();h();wr=new vc().basePath("/databases").get("/",async t=>{let e=ce(),a=await P(e).getDatabasesList();return t.json({data:{databases:a,dbType:e}},200)}).get("/current",async t=>{let e=ce(),a=await P(e).getCurrentDatabase();return t.json({data:{db:a.db,dbType:e}},200)}).get("/connection",async t=>{let e=ce(),a=await P(e).getDatabaseConnectionInfo();return t.json({data:a},200)})});import{zValidator as _r}from"@hono/zod-validator";import{Hono as Uc}from"hono";var Mr,xr=f(()=>{"use strict";X();xe();Mr=new Uc().basePath("/query").post("/",_r("query",w),_r("json",Mo),async t=>{let{query:e}=t.req.valid("json"),{db:o}=t.req.valid("query"),a=t.get("dbType"),r=await P(a).executeQuery({query:e,db:o});return t.json({data:r},200)})});import{zValidator as Z}from"@hono/zod-validator";import{Hono as Fc}from"hono";var Lr,Or=f(()=>{"use strict";X();xe();Lr=new Fc().basePath("/records").post("/",Z("query",w),Z("json",to),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,data:a}=t.req.valid("json"),n=t.get("dbType"),r=P(n),{insertedCount:s}=await r.addRecord({db:e,params:{tableName:o,data:a}});return t.json({data:`Record inserted into "${o}" with ${s} rows inserted`},200)}).patch("/",Z("query",w),Z("json",Fo),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKey:a,updates:n}=t.req.valid("json"),r=t.get("dbType"),s=P(r),{updatedCount:c}=await s.updateRecords({params:{tableName:o,primaryKey:a,updates:n},db:e});return t.json({data:`Updated ${c} records in "${o}"`},200)}).delete("/",Z("query",w),Z("json",lt),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:a}=t.req.valid("json"),n=t.get("dbType"),r=P(n),{deletedCount:s,fkViolation:c,relatedRecords:i}=await r.deleteRecords({tableName:o,primaryKeys:a,db:e});return c?t.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:i}},409):t.json({data:{deletedCount:s,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",Z("query",w),Z("json",lt),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:a}=t.req.valid("json"),n=t.get("dbType"),s=await P(n).forceDeleteRecords({tableName:o,primaryKeys:a,db:e});return t.json({data:s},200)}).post("/bulk",Z("query",w),Z("json",so),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,records:a}=t.req.valid("json"),n=t.get("dbType"),s=await P(n).bulkInsertRecords({tableName:o,records:a,db:e});return t.json({data:s},200)})});import{HTTPException as Pr}from"hono/http-exception";async function Ir(t){let{tableName:e,columnName:o,columnType:a,defaultValue:n,isPrimaryKey:r,isNullable:s,isUnique:c,isIdentity:i,isArray:l,db:m}=t,p=C(m),u=`
673
+ SELECT EXISTS (
674
+ SELECT 1 FROM information_schema.tables
675
+ WHERE table_name = $1 AND table_schema = 'public'
676
+ ) as exists;
677
+ `,{rows:d}=await p.query(u,[e]);if(!d[0]?.exists)throw new Pr(404,{message:`Table "${e}" does not exist`});let g=`
678
+ SELECT EXISTS (
679
+ SELECT 1 FROM information_schema.columns
680
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
681
+ ) as exists;
682
+ `,{rows:y}=await p.query(g,[e,o]);if(y[0]?.exists)throw new Pr(409,{message:`Column "${o}" already exists in table "${e}"`});let b=`"${o}" ${a}`;l&&(b+="[]"),r&&(b+=" PRIMARY KEY"),c&&!r&&(b+=" UNIQUE"),s||(b+=" NOT NULL"),i&&(b+=" GENERATED ALWAYS AS IDENTITY"),n?.trim()&&!i&&(b+=` DEFAULT ${n.trim()}`),await p.query(`ALTER TABLE "${e}" ADD COLUMN ${b}`)}var $r=f(()=>{"use strict";h()});import{HTTPException as qr}from"hono/http-exception";async function kr(t){let{tableName:e,columnName:o,columnType:a,isNullable:n,defaultValue:r,db:s}=t,c=C(s),i=`
683
+ SELECT EXISTS (
684
+ SELECT 1 FROM information_schema.tables
685
+ WHERE table_name = $1 AND table_schema = 'public'
686
+ ) as exists;
687
+ `,{rows:l}=await c.query(i,[e]);if(!l[0]?.exists)throw new qr(404,{message:`Table "${e}" does not exist`});let m=`
688
+ SELECT EXISTS (
689
+ SELECT 1 FROM information_schema.columns
690
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
691
+ ) as exists;
692
+ `,{rows:p}=await c.query(m,[e,o]);if(!p[0]?.exists)throw new qr(404,{message:`Column "${o}" does not exist in table "${e}"`});let u=await c.connect();try{await u.query("BEGIN"),await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${o}" TYPE ${a}`),await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${o}" ${n?"DROP":"SET"} NOT NULL`),r?.trim()?await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${o}" SET DEFAULT ${r.trim()}`):await u.query(`ALTER TABLE "${e}" ALTER COLUMN "${o}" DROP DEFAULT`),await u.query("COMMIT")}catch(d){throw await u.query("ROLLBACK"),d}finally{u.release()}}var vr=f(()=>{"use strict";h()});import{HTTPException as Ur}from"hono/http-exception";async function Fr({tableName:t,columnName:e,columnType:o,defaultValue:a,isNullable:n,db:r}){let s=await x(r),c=await s.listCollections({name:t}).toArray();if(c.length===0)throw new Ur(404,{message:`Collection "${t}" does not exist`});if(await s.collection(t).findOne({[e]:{$exists:!0}}))throw new Ur(409,{message:`Field "${e}" already exists in collection "${t}"`});let l=Bc(a,o);await s.collection(t).updateMany({},{$set:{[e]:l}});let p=c[0].options?.validator?.$jsonSchema??{},u={...p.properties??{},[e]:{bsonType:n?[o,"null"]:o}},d=[...p.required??[]];!n&&!d.includes(e)&&d.push(e),await s.command({collMod:t,validator:{$jsonSchema:{...p,bsonType:"object",properties:u,...d.length>0?{required:d}:{}}},validationAction:"warn"})}var Bc,Br=f(()=>{"use strict";h();Bc=(t,e)=>{if(t!=null&&t.trim()!=="")try{return JSON.parse(t)}catch{return t}switch(e){case"string":return"";case"int":case"long":case"double":case"decimal":return 0;case"bool":return!1;case"array":return[];case"object":return{};case"date":return new Date;default:return null}}});import{HTTPException as Se}from"hono/http-exception";async function Hr({tableName:t,columnName:e,newColumnName:o,db:a}){let n=await x(a);if((await n.listCollections({name:t}).toArray()).length===0)throw new Se(404,{message:`Collection "${t}" does not exist`});if(e==="_id")throw new Se(400,{message:'Cannot rename the "_id" field'});if(!await n.collection(t).findOne({[e]:{$exists:!0}}))throw new Se(404,{message:`Field "${e}" does not exist in collection "${t}"`});if(await n.collection(t).findOne({[o]:{$exists:!0}}))throw new Se(409,{message:`Field "${o}" already exists in collection "${t}"`});await n.collection(t).updateMany({[e]:{$exists:!0}},{$rename:{[e]:o}})}async function jr({tableName:t,columnName:e,columnType:o,isNullable:a,db:n}){let r=await x(n),s=await r.listCollections({name:t}).toArray();if(s.length===0)throw new Se(404,{message:`Collection "${t}" does not exist`});if(e==="_id")throw new Se(400,{message:'Cannot alter the "_id" field'});let i=s[0].options?.validator?.$jsonSchema??{},l={...i.properties??{}},m=[...i.required??[]],p=a?[o,"null"]:o;l[e]={bsonType:p};let u=m.indexOf(e);!a&&u===-1?m.push(e):a&&u!==-1&&m.splice(u,1),await r.command({collMod:t,validator:{$jsonSchema:{...i,bsonType:"object",properties:l,...m.length>0?{required:m}:{}}},validationAction:"warn"})}var Kr=f(()=>{"use strict";h()});import{HTTPException as Vr}from"hono/http-exception";async function Qr(t){let{tableName:e,columnName:o,columnType:a,defaultValue:n,isPrimaryKey:r,isNullable:s,isUnique:c,isIdentity:i,isArray:l,db:m}=t,p=S(m),[u]=await p.execute(`SELECT COUNT(*) as cnt
693
+ FROM information_schema.TABLES
694
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new Vr(404,{message:`Table "${e}" does not exist`});let[g]=await p.execute(`SELECT COUNT(*) as cnt
695
+ FROM information_schema.COLUMNS
696
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(Number(g[0]?.cnt??0)>0)throw new Vr(409,{message:`Column "${o}" already exists in table "${e}"`});let b=he({columnName:o,columnType:a,defaultValue:n,isPrimaryKey:r,isNullable:s,isUnique:c,isIdentity:i,isArray:l},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${e}\` ADD COLUMN ${b}`)}var Wr=f(()=>{"use strict";h();Ge()});import{HTTPException as Yr}from"hono/http-exception";async function zr(t){let{tableName:e,columnName:o,columnType:a,isNullable:n,defaultValue:r,db:s}=t,c=S(s),[i]=await c.execute(`SELECT COUNT(*) as cnt
697
+ FROM information_schema.TABLES
698
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(i[0]?.cnt??0)>0))throw new Yr(404,{message:`Table "${e}" does not exist`});let[m]=await c.execute(`SELECT EXTRA
699
+ FROM information_schema.COLUMNS
700
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?
701
+ LIMIT 1`,[e,o]),p=m[0];if(!p)throw new Yr(404,{message:`Column "${o}" does not exist in table "${e}"`});let u=he({columnName:o,columnType:a,defaultValue:r,isNullable:n},{preserveAutoIncrement:p.EXTRA?.toLowerCase().includes("auto_increment")});await c.execute(`ALTER TABLE \`${e}\` MODIFY COLUMN ${u}`)}var Gr=f(()=>{"use strict";h();Ge()});import{HTTPException as Mt}from"hono/http-exception";async function Jr(t){let{tableName:e,columnName:o,newColumnName:a,db:n}=t,r=S(n),[s]=await r.execute(`SELECT COUNT(*) as cnt
702
+ FROM information_schema.TABLES
703
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(s[0]?.cnt??0)>0))throw new Mt(404,{message:`Table "${e}" does not exist`});let[i]=await r.execute(`SELECT COUNT(*) as cnt
704
+ FROM information_schema.COLUMNS
705
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(!(Number(i[0]?.cnt??0)>0))throw new Mt(404,{message:`Column "${o}" does not exist in table "${e}"`});let[m]=await r.execute(`SELECT COUNT(*) as cnt
706
+ FROM information_schema.COLUMNS
707
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,a]);if(Number(m[0]?.cnt??0)>0)throw new Mt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.execute(`ALTER TABLE \`${e}\` RENAME COLUMN \`${o}\` TO \`${a}\``)}var Xr=f(()=>{"use strict";h()});import{HTTPException as xt}from"hono/http-exception";async function Zr(t){let{tableName:e,columnName:o,newColumnName:a,db:n}=t,r=C(n),s=`
708
+ SELECT EXISTS (
709
+ SELECT 1 FROM information_schema.tables
710
+ WHERE table_name = $1 AND table_schema = 'public'
711
+ ) as exists;
712
+ `,{rows:c}=await r.query(s,[e]);if(!c[0]?.exists)throw new xt(404,{message:`Table "${e}" does not exist`});let i=`
713
+ SELECT EXISTS (
714
+ SELECT 1 FROM information_schema.columns
715
+ WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
716
+ ) as exists;
717
+ `,{rows:l}=await r.query(i,[e,o]);if(!l[0]?.exists)throw new xt(404,{message:`Column "${o}" does not exist in table "${e}"`});let{rows:m}=await r.query(i,[e,a]);if(m[0]?.exists)throw new xt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.query(`ALTER TABLE "${e}" RENAME COLUMN "${o}" TO "${a}"`)}var es=f(()=>{"use strict";h()});import{utils as Le,write as Hc}from"xlsx";function ts({cols:t,rows:e,format:o,tableName:a}){switch(o){case"json":{let n=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(n,"utf-8"))}case"csv":{let n=[t,...e?.map(c=>t?.map(i=>c[i]))??[]],r=Le.aoa_to_sheet(n),s=Le.sheet_to_csv(r);return new Uint8Array(Buffer.from(s,"utf-8"))}case"xlsx":{let n=[t,...e?.map(i=>t?.map(l=>i[l]))??[]],r=Le.aoa_to_sheet(n),s=Le.book_new();Le.book_append_sheet(s,r,a.slice(0,31));let c=Hc(s,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var os=f(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as jc}from"hono";var as,ns=f(()=>{"use strict";X();$r();vr();xe();Br();Kr();Wr();Gr();Xr();es();os();as=new jc().basePath("/tables").get("/",L("query",w),async t=>{let{db:e}=t.req.valid("query"),o=t.get("dbType"),n=await P(o).getTablesList(e);return t.json({data:n},200)}).post("/",L("query",w),L("json",ho),async t=>{let{db:e}=t.req.valid("query"),o=t.req.valid("json"),a=t.get("dbType");return await P(a).createTable({tableData:o,db:e}),t.json({data:`Table ${o.tableName} created successfully`},200)}).delete("/:tableName",L("query",wo),L("param",ee),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a}=t.req.valid("param"),n=t.get("dbType"),s=await P(n).deleteTable({tableName:a,db:e,cascade:o});return t.json({data:s},200)}).delete("/:tableName/columns/:columnName",L("query",ao),L("param",K),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a,columnName:n}=t.req.valid("param"),r=t.get("dbType"),s=P(r),{deletedCount:c}=await s.deleteColumn({tableName:a,columnName:n,cascade:o,db:e});return t.json({data:`Column "${n}" deleted successfully from table "${a}" with ${c} rows deleted`},200)}).post("/:tableName/columns",L("query",w),L("param",ee),L("json",G),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.req.valid("json"),n=t.get("dbType");return n==="mysql"?await Qr({tableName:o,db:e,...a}):n==="mongodb"?await Fr({tableName:o,db:e,...a}):await Ir({tableName:o,db:e,...a}),t.json({data:`Column "${a.columnName}" added successfully to table "${o}"`},200)}).patch("/:tableName/columns/:columnName/rename",L("query",w),L("param",K),L("json",ut),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,columnName:a}=t.req.valid("param"),n=t.req.valid("json"),r=t.get("dbType");return r==="mysql"?await Jr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await Hr({tableName:o,columnName:a,db:e,...n}):await Zr({tableName:o,columnName:a,db:e,...n}),t.json({data:`Column "${a}" renamed to "${n.newColumnName}" in table "${o}"`},200)}).patch("/:tableName/columns/:columnName",L("query",w),L("param",K),L("json",Ae),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,columnName:a}=t.req.valid("param"),n=t.req.valid("json"),r=t.get("dbType");return r==="mysql"?await zr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await jr({tableName:o,columnName:a,db:e,...n}):await kr({tableName:o,columnName:a,db:e,...n}),t.json({data:`Column "${a}" updated successfully in table "${o}"`},200)}).get("/:tableName/columns",L("query",w),L("param",ee),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.get("dbType"),r=await P(a).getTableColumns({tableName:o,db:e});return t.json({data:r},200)}).get("/:tableName/schema",L("query",w),L("param",ee),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.get("dbType"),r=await P(a).getTableSchema({tableName:o,db:e});return t.json({data:{schema:r}},200)}).get("/:tableName/data",L("param",ee),L("query",$o),async t=>{let{tableName:e}=t.req.valid("param"),{cursor:o,limit:a,direction:n,sort:r,order:s,filters:c,db:i}=t.req.valid("query"),l=t.get("dbType"),p=await P(l).getTableData({tableName:e,cursor:o,limit:a,direction:n,sort:r,order:s,filters:c,db:i});return t.json({data:p},200)}).get("/:tableName/export",L("param",ee),L("query",Lo),async t=>{let{tableName:e}=t.req.valid("param"),{db:o,format:a}=t.req.valid("query"),n=t.get("dbType"),r=P(n),{cols:s,rows:c}=await r.exportTableData({tableName:e,db:o}),i=ts({cols:s,rows:c,format:a,tableName:e}),l;switch(a){case"csv":l="text/csv";break;case"xlsx":l="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":l="application/json";break}return new Response(i,{headers:{"Content-Type":l??"","Content-Disposition":`attachment; filename="${e}_export.${a}"`}})})});var rs={};Pt(rs,{createServer:()=>Gc});import at from"path";import{fileURLToPath as Kc}from"url";import{serveStatic as tt}from"@hono/node-server/serve-static";import{zValidator as Vc}from"@hono/zod-validator";import{Hono as Qc}from"hono";import{cors as Wc}from"hono/cors";import{logger as Yc}from"hono/logger";import{prettyJSON as zc}from"hono/pretty-json";var ot,Gc,ss=f(()=>{"use strict";X();Ko();pa();Dr();xr();Or();ns();ot=()=>{if(process.env.NODE_ENV==="development")return at.resolve(process.cwd(),"../core/dist");let t=at.dirname(Kc(import.meta.url));return at.resolve(t,"./core-dist")},Gc=()=>({app:new Qc({strict:!1}).use("/*",Wc()).use(zc({space:2})).use(process.env.NODE_ENV==="development"?Yc():(e,o)=>o()).use("/favicon.ico",tt({path:at.resolve(ot(),"favicon.ico")})).use("*",async(e,o)=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),await o()}).onError(Ho).route("/",wr).use("/assets/*",tt({root:ot()})).use("/image.png",tt({root:ot()})).use("/:dbType/*",Vc("param",Zt,jo)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",as).route("/:dbType",Lr).route("/:dbType",Mr).route("/:dbType",ua).use("/*",tt({root:ot()}))})});Pe();import{intro as Jc,outro as Xc}from"@clack/prompts";import{serve as Zc}from"@hono/node-server";import Lt from"picocolors";import{program as Bt}from"commander";var Ht=()=>(Bt.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),Bt.opts());import{readFile as cs}from"fs/promises";import{resolve as ls}from"path";import{cancel as Ie,isCancel as rt,note as jt,select as ms,spinner as us,text as Kt}from"@clack/prompts";import{parse as ps}from"dotenv";import st from"picocolors";var Vt=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let a=us();a.start("Looking for database connection..."),t?jt(st.red(`${o} not found in .env or process.env`)):jt(st.red(`No .env file found and ${o} not set in process.env`));let n=await ms({message:`How do you want to provide ${o}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((rt(n)||n==="cancel")&&(Ie("No database connection provided. Exiting..."),process.exit(0)),n==="other-env"){a.start("Waiting for path...");let s=await Kt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(i){if(!i?.trim())return"Path is required"}});rt(s)&&(Ie("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=ls(s);try{let i=await cs(c,"utf-8"),l=ps(i);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(i){let l=i;Ie(`Cannot read or parse file: ${st.dim(l.message)}`),process.exit(1)}}a.stop("Manual input...");let r=await Kt({message:`Paste your ${o}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(s){if(!s?.trim())return"Connection string is required!";try{new URL(s);return}catch{return"Must be a valid URL format"}}});return rt(r)&&(Ie("Cancelled."),process.exit(0)),r.trim()};import{access as ds,readFile as fs}from"fs/promises";import{dirname as bs,resolve as it}from"path";import{parse as ys}from"dotenv";var gs=async t=>{let e=it(t);for(;;){let o=it(e,".env");try{return await ds(o),o}catch{}let a=bs(e);if(a===e)return null;e=a}},ue=async t=>{let e;if(t?e=it(t):e=await gs(process.cwd()),!e)return null;try{let o=await fs(e,"utf-8");return ys(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};nt();import{intro as Ts,outro as Es}from"@clack/prompts";import Qt from"picocolors";var Wt=()=>{Ts(Qt.inverse(" db-studio ")),Es(Qt.green(`For more information, visit: ${Ut.SITE_DOCS_LINK}`))};Pe();import{intro as hs,note as Cs,outro as Yt}from"@clack/prompts";import $e from"picocolors";var zt=async(t,e,o)=>{hs($e.inverse(" db-studio "));let a=o||se.VAR_NAME,n=null;if(e)n=e;else{let r=t?await ue(t):await ue();r?.[a]?n=r[a]:process.env[a]&&(n=process.env[a]??null)}n?Yt($e.green(`\u2713 Database connection configured (using ${a})`)):(Cs($e.red(`\u2717 ${a} not found`),"Status"),Yt($e.yellow("\u26A0 No database connection configured")))};import{intro as Rs,outro as Ns}from"@clack/prompts";import Jt from"picocolors";var Gt={name:"db-studio",type:"module",version:"1.7.0",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <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",mongodb:"^7.1.1",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 Xt=()=>{Rs(Jt.inverse(" db-studio ")),Ns(Jt.green(`\u{1F680} db-studio v${Gt.version}`))};var el=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:s}=Ht();r&&(Wt(),process.exit(0)),s&&(Xt(),process.exit(0)),n&&(await zt(t,o,a),process.exit(0)),Jc(Lt.inverse(" db-studio "));let c=e?parseInt(e,10):se.PORT,i=a||se.VAR_NAME,l=t?await ue(t):await ue(),m=o||await Vt(l,i);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(ss(),rs)),{app:u}=p();Zc({fetch:u.fetch,port:c}),Xc(Lt.green(`Server running at ${Lt.cyan(`http://localhost:${c}`)}`))};el().catch(t=>{process.exit(1)});export{el as main};
443
718
  //# sourceMappingURL=index.js.map