db-studio 1.6.2 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core-dist/assets/_pathlessLayout-CrtbzsyH.js +1 -0
- package/dist/core-dist/assets/_queryId-D6O1_Xvj.js +1 -0
- package/dist/core-dist/assets/_table-5eHqhTIv.js +39 -0
- package/dist/core-dist/assets/{_table-D-Om_ZWr.js → _table-ai9HDUf8.js} +5 -5
- package/dist/core-dist/assets/cdoe-editor-Ct5sUeyy.js +9 -0
- package/dist/core-dist/assets/{dialog-jogVSiaL.js → dialog-BQZ4z_3G.js} +1 -1
- package/dist/core-dist/assets/index-BZAznU-i.js +57 -0
- package/dist/core-dist/assets/index-BZXeXns-.css +1 -0
- package/dist/core-dist/assets/index-Bxi6VqMh.js +1 -0
- package/dist/core-dist/assets/index-Xsj_t9Zu.js +1 -0
- package/dist/core-dist/assets/{queries.store-Cfzf5198.js → queries.store-QV4hp8zS.js} +1 -1
- package/dist/core-dist/assets/{runner-tab-C3hNjCPD.js → runner-tab-942uJn7n.js} +9 -3
- package/dist/core-dist/assets/{scroll-area-BqJhlKZJ.js → scroll-area-CPCU4NOC.js} +1 -1
- package/dist/core-dist/assets/{tooltip-BoaJ5LJp.js → tooltip-4I9-F957.js} +1 -1
- package/dist/core-dist/assets/{use-delete-column-Bg30Zigo.js → use-delete-column-VjacPbPI.js} +1 -1
- package/dist/core-dist/index.html +2 -2
- package/dist/index.js +195 -135
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/core-dist/assets/_pathlessLayout-C6DihnsN.js +0 -1
- package/dist/core-dist/assets/_queryId-Dp0aC9mO.js +0 -1
- package/dist/core-dist/assets/_table-oMebxIBG.js +0 -39
- package/dist/core-dist/assets/cdoe-editor-SdZQ1WiR.js +0 -9
- package/dist/core-dist/assets/index-C9jsi0UO.js +0 -1
- package/dist/core-dist/assets/index-CJ0NUCyi.js +0 -58
- package/dist/core-dist/assets/index-CVuaUgmF.js +0 -1
- package/dist/core-dist/assets/index-CwHrvESi.css +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var sn=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var ln=(a,e)=>{for(var t in e)sn(a,t,{get:e[t],enumerable:!0})};var yt=d(()=>{"use strict"});var Tt=d(()=>{"use strict"});var Et=d(()=>{"use strict"});var ae,gt=d(()=>{"use strict";ae={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",PROXY_URL:process.env.NODE_ENV==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var ht=d(()=>{"use strict"});var Nt,Ve=d(()=>{"use strict";Nt={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"DB Studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var Ct=d(()=>{"use strict"});var Ce=d(()=>{"use strict";yt();Tt();Et();gt();ht();Ve();Ct()});import{z as ne}from"zod";var A,_n,Se,Pl,qt,Z,V=d(()=>{"use strict";A=ne.object({db:ne.string("Database name is required")}),_n=["pg","mysql","mssql"],Se=ne.enum(_n,{message:"Invalid database type"}),Pl=A.extend({dbType:Se}),qt=ne.object({dbType:Se}),Z=ne.object({tableName:ne.string("Table name is required")})});import{z as Q}from"zod";var z,vl,$t=d(()=>{"use strict";V();z=Q.object({columnName:Q.string("Column name is required"),columnType:Q.string("Column type is required"),defaultValue:Q.string().optional(),isPrimaryKey:Q.boolean().default(!1),isNullable:Q.boolean().default(!1),isUnique:Q.boolean().default(!1),isIdentity:Q.boolean().default(!1),isArray:Q.boolean().default(!1)}),vl=Q.object({db:A.shape.db,tableName:Z.shape.tableName,columnName:z.shape.columnName,columnType:z.shape.columnType,defaultValue:z.shape.defaultValue,isPrimaryKey:z.shape.isPrimaryKey,isNullable:z.shape.isNullable,isUnique:z.shape.isUnique,isIdentity:z.shape.isIdentity,isArray:z.shape.isArray})});import{z as fe}from"zod";var vt,kt=d(()=>{"use strict";vt=fe.object({tableName:fe.string("Table name is required"),data:fe.record(fe.string("Column name is required"),fe.any())})});import{z as W}from"zod";var Ut,j,jl,Kl,_e=d(()=>{"use strict";V();Ut=A.extend({cascade:W.string().optional().transform(a=>a==="true")}),j=W.object({tableName:W.string("Table name is required"),columnName:W.string("Column name is required")}),jl=W.object({db:A.shape.db,tableName:j.shape.tableName,columnName:j.shape.columnName,cascade:W.boolean().optional()}),Kl=W.object({message:W.string("Message is required"),tableName:W.string("Table name is required"),columnName:W.string("Column name is required"),deletedCount:W.number("Deleted count is required").default(0)})});import{z as be}from"zod";var ye,zl,Ft=d(()=>{"use strict";V();_e();ye=be.object({columnType:be.string("Column type is required"),isNullable:be.boolean(),defaultValue:be.string().nullable().optional()}),zl=be.object({db:A.shape.db,tableName:j.shape.tableName,columnName:j.shape.columnName,columnType:ye.shape.columnType,isNullable:ye.shape.isNullable,defaultValue:ye.shape.defaultValue})});var Ht=d(()=>{"use strict"});import{z as se}from"zod";var Bt,jt=d(()=>{"use strict";Bt=se.object({tableName:se.string().min(1,"Table name is required"),records:se.array(se.record(se.string(),se.any())).min(1,"At least one record is required")})});import{z as ie}from"zod";var Kt,Vt=d(()=>{"use strict";V();Kt=ie.object({messages:ie.array(ie.object({role:ie.enum(["user","assistant"]),content:ie.string("Content is required")})),conversationId:ie.string().optional(),db:A.shape.db})});var Wt=d(()=>{"use strict"});import{z as K}from"zod";var wn,Dn,P,Ln,xn,oc,ze=d(()=>{"use strict";wn=["text","boolean","number","enum","json","date","array"],Dn=K.enum(wn),P={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Ln=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],xn=K.enum(Ln),oc=K.object({columnName:K.string(),dataType:Dn,dataTypeLabel:xn,isNullable:K.boolean(),columnDefault:K.string().nullable(),isPrimaryKey:K.boolean(),isForeignKey:K.boolean(),referencedTable:K.string().nullable(),referencedColumn:K.string().nullable(),enumValues:K.array(K.string()).nullable()})});function Yt(a){let e=a?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?P.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?P.number:e==="boolean"||e==="bool"?P.boolean:e==="json"||e==="jsonb"?P.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?P.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?P.text:P.text}function Qt(a){if(!a)return f.text;let e=a.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?f.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?f.bigint:e==="smallint"||e==="int2"?f.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?f.numeric:e==="real"||e==="float4"?f.float:e==="double precision"||e==="float8"||e==="float"?f.double:e==="money"?f.money:e==="boolean"||e==="bool"?f.boolean:e==="text"?f.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?f.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?f.char:e==="json"?f.json:e==="jsonb"?f.jsonb:e==="xml"?f.xml:e==="uuid"?f.uuid:e==="date"?f.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?f.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?f.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?f.timestamptz:e==="interval"||e.startsWith("interval")?f.interval:e==="bytea"?f.bytea:e==="inet"?f.inet:e==="cidr"?f.cidr:e==="macaddr"?f.macaddr:e==="macaddr8"?f.macaddr8:e==="point"?f.point:e==="line"?f.line:e==="polygon"?f.polygon:e.startsWith("array")||e.includes("[]")?f.text:e.startsWith("user-defined")||e==="enum"?f.enum:f.text}function zt(a,e){let t=a?.toLowerCase().trim()||"",o=e?.toLowerCase().trim()||"";return t==="tinyint"&&o==="tinyint(1)"?P.boolean:t==="tinyint"||t==="smallint"||t==="mediumint"||t==="int"||t==="integer"||t==="bigint"||t==="decimal"||t==="numeric"||t==="float"||t==="double"||t==="real"||t==="bit"?P.number:t==="boolean"||t==="bool"?P.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?P.date:t==="json"?P.json:t==="enum"||t==="set"?P.enum:P.text}function Gt(a,e){if(!a)return f.text;let t=a.toLowerCase().trim(),o=e?.toLowerCase().trim()||"";return t==="tinyint"&&o==="tinyint(1)"?f.boolean:t==="tinyint"?f.tinyint:t==="smallint"?f.smallint:t==="mediumint"?f.mediumint:t==="int"||t==="integer"?f.int:t==="bigint"?f.bigint:t==="decimal"||t==="numeric"?f.numeric:t==="float"||t==="real"?f.float:t==="double"?f.double:t==="bit"?f.bit:t==="boolean"||t==="bool"?f.boolean:t==="char"?f.char:t==="varchar"?f.varchar:t==="tinytext"?f.tinytext:t==="text"?f.text:t==="mediumtext"?f.mediumtext:t==="longtext"?f.longtext:t==="binary"?f.binary:t==="varbinary"?f.varbinary:t==="tinyblob"?f.tinyblob:t==="blob"?f.blob:t==="mediumblob"?f.mediumblob:t==="longblob"?f.longblob:t==="json"?f.json:t==="date"?f.date:t==="time"?f.time:t==="datetime"?f.datetime:t==="timestamp"?f.timestamp:t==="year"?f.year:t==="enum"?f.enum:t==="set"?f.set:f.text}function Jt(a){let e=a?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?P.number:e==="bit"?P.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?P.date:e==="json"?P.json:P.text}function Xt(a){if(!a)return f.text;let e=a.toLowerCase().trim();return e==="tinyint"?f.tinyint:e==="smallint"?f.smallint:e==="int"?f.int:e==="bigint"?f.bigint:e==="decimal"||e==="numeric"?f.numeric:e==="float"||e==="real"?f.float:e==="money"||e==="smallmoney"?f.money:e==="bit"?f.boolean:e==="char"?f.char:e==="varchar"?f.varchar:e==="text"?f.text:e==="nchar"?f.char:e==="nvarchar"?f.varchar:e==="ntext"?f.text:e==="binary"?f.binary:e==="varbinary"?f.varbinary:e==="image"?f.blob:e==="uniqueidentifier"?f.uuid:e==="date"?f.date:e==="time"?f.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?f.datetime:e==="datetimeoffset"?f.timestamptz:e==="json"?f.json:e==="xml"?f.xml:f.text}var f,Zt=d(()=>{"use strict";ze();f={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as $}from"zod";var Mn,ea,On,Pn,ta,aa=d(()=>{"use strict";Mn=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],ea=$.enum(Mn),On=$.object({columnName:$.string("Column name is required"),columnType:$.string("Column type is required"),defaultValue:$.string().optional(),isPrimaryKey:$.boolean().default(!1),isNullable:$.boolean().default(!1),isUnique:$.boolean().default(!1),isIdentity:$.boolean().default(!1),isArray:$.boolean().default(!1)}),Pn=$.object({columnName:$.string("Column name is required"),referencedTable:$.string("Referenced table is required"),referencedColumn:$.string("Referenced column is required"),onUpdate:ea.default("NO ACTION"),onDelete:ea.default("NO ACTION")}),ta=$.object({tableName:$.string("Table name is required"),fields:$.array(On).min(1,"At least one field is required"),foreignKeys:$.array(Pn).optional()})});import{z as F}from"zod";var In,uc,oa,ra=d(()=>{"use strict";V();In=F.object({name:F.string("Name is required"),size:F.string("Size is required"),owner:F.string("Owner is required"),encoding:F.string("Encoding is required")}),uc=F.object({databases:F.array(In),dbType:Se}),oa=F.object({version:F.string("Version is required"),database:F.string("Database is required"),user:F.string("User is required"),host:F.string("Host is required").nullable(),port:F.number("Port is required").nullable(),active_connections:F.coerce.number("Active connections is required"),max_connections:F.coerce.number("Max connections is required")})});var na=d(()=>{"use strict"});import{z as le}from"zod";var Ge,sa=d(()=>{"use strict";Ge=le.object({tableName:le.string("Table name is required"),primaryKeys:le.array(le.object({columnName:le.string("Column name is required"),value:le.any()})).min(1,"At least one primary key is required")})});import{z as qn}from"zod";var ia,la=d(()=>{"use strict";V();ia=A.extend({cascade:qn.string().optional().transform(a=>a==="true")})});import{z as ca}from"zod";var ma,ua=d(()=>{"use strict";ma=ca.object({query:ca.string("Query is required")})});import{z as $n}from"zod";var vn,pa,da=d(()=>{"use strict";V();vn=["csv","xlsx","json"],pa=A.extend({format:$n.enum(vn,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var fa=d(()=>{"use strict"});import{z as Je}from"zod";var Xe,_c,ba=d(()=>{"use strict";V();_e();Xe=Je.object({newColumnName:Je.string("New column name is required")}),_c=Je.object({db:A.shape.db,tableName:j.shape.tableName,columnName:j.shape.columnName,newColumnName:Xe.shape.newColumnName})});import{z as L}from"zod";var xc,we,Mc,kn,Oc,ya,Ta=d(()=>{"use strict";V();xc=L.object({columnName:L.string(),operator:L.string(),value:L.string()}),we=["asc","desc"],Mc=L.object({columnName:L.string(),direction:L.enum(we)}),kn=L.object({limit:L.number(),total:L.number(),hasNextPage:L.boolean(),hasPreviousPage:L.boolean(),nextCursor:L.string().nullable(),prevCursor:L.string().nullable()}),Oc=L.object({data:L.array(L.record(L.string(),L.unknown())),meta:kn}),ya=L.object({db:A.shape.db,cursor:L.string().optional(),limit:L.string().optional().default("50").transform(Number),direction:L.enum(we).optional().default(we[0]),sort:L.string().optional().transform(a=>{if(!a)return"";try{let e=JSON.parse(a);return Array.isArray(e)?e:a}catch{return a}}),order:L.enum(we).optional(),filters:L.string().optional().transform(a=>{if(!a)return[];try{return JSON.parse(a)}catch{return[]}})})});import{z as Ze}from"zod";var qc,Ea=d(()=>{"use strict";qc=Ze.object({tableName:Ze.string("Table name is required"),rowCount:Ze.coerce.number("Row count is required")})});import{z as ga}from"zod";var kc,ha=d(()=>{"use strict";kc=ga.object({schema:ga.string()})});import{z as G}from"zod";var Na,Ca=d(()=>{"use strict";Na=G.object({tableName:G.string("Table name is required"),primaryKey:G.string("Primary key is required").default("id"),updates:G.array(G.object({rowData:G.record(G.string("Column name is required"),G.any()),columnName:G.string("Column name is required"),value:G.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var J=d(()=>{"use strict";$t();kt();Ft();Ht();jt();Vt();Wt();Zt();ze();aa();V();ra();na();_e();sa();la();ua();da();fa();ba();Ta();Ea();ha();Ca()});import{HTTPException as Un}from"hono/http-exception";import{DatabaseError as Fn}from"pg";import{ZodError as Hn}from"zod";function Ra(a,e){if(a instanceof Un)return e.json({error:a.message??"Internal server error"},a.status);if(a instanceof Hn){let t=a.issues[0];return e.json({error:"Validation error",details:t.message},400)}if(a instanceof Error){let t=a;if(t.code==="ECONNREFUSED"||t.code==="ENOTFOUND"||t.code==="ETIMEDOUT"||t.code==="ER_ACCESS_DENIED_ERROR"||t.code==="ER_BAD_HOST_ERROR"||t.code==="ECONNRESET"||t.errno===1045||t.errno===2003||t.errno===2002||a.message.includes("ECONNREFUSED")||a.message.includes("connection refused")||a.message.includes("timeout expired")||a.message.includes("Connection terminated")||a instanceof Fn&&a.code?.startsWith("08"))return e.json({error:"Database connection failed",details:a.message},503)}return e.json({error:a instanceof Error?a.message:"Internal server error"},500)}var Aa,Sa=d(()=>{"use strict";Aa=(a,e)=>{if(!a.success){let t=a.error?.issues[0];return e.json({error:"Validation error",details:t?.message??"Unknown validation error"},400)}}});import{Pool as Bn}from"pg";var De,jn,et,_a=d(()=>{"use strict";De=null,jn=()=>{if(!De){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{De=new Bn({connectionString:process.env.DATABASE_URL}),De.on("error",a=>{})}catch(a){throw a}}return De},et=new Proxy({},{get(a,e){try{return jn()[e]}catch(t){throw t}}})});import Kn from"mssql";import{createPool as Vn}from"mysql2/promise";import{Pool as wa}from"pg";var tt,Le,N,C,R,xe,h=d(()=>{"use strict";tt=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let t=e.protocol.replace(":","");if(t==="postgres"||t==="postgresql")return"pg";if(t==="mysql"||t==="mysql2")return"mysql";if(t==="mssql"||t==="sqlserver")return"mssql";throw new Error(`Unsupported database type: ${t}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), and SQL Server (mssql://).`)}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let t=new URL(e);this.baseConfig={url:e,host:t.hostname,port:Number.parseInt(t.port,10)||(this.detectDbType(t)==="mysql"?3306:this.detectDbType(t)==="mssql"?1433:5432),user:t.username,password:t.password,dbType:this.detectDbType(t)}}catch(t){throw new Error(t instanceof Error?t.message:String(t))}}getDbType(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");e||(e=new URL(this.baseConfig.url).pathname.slice(1));try{let t=new URL(this.baseConfig.url);return t.pathname=`/${e}`,t.toString()}catch(t){throw new Error(`Failed to build connection string for database "${e}": ${t instanceof Error?t.message:String(t)}`)}}getPgPool(e){let t=this.buildConnectionString(e);if(!this.pgPools.has(t)){let o={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},r=new wa(o);r.on("error",n=>{}),this.pgPools.set(t,r)}return this.pgPools.get(t)??new wa({connectionString:t})}getMysqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let t=this.buildConnectionString(e);if(!this.mysqlPools.has(t)){let r=new URL(t).pathname.slice(1),n=Vn({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:r||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.mysqlPools.set(t,n)}return this.mysqlPools.get(t)}async getMssqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let t=this.buildConnectionString(e);if(!this.mssqlPools.has(t)){let r=new URL(t).pathname.slice(1),n={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:r||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},l=await new Kn.ConnectionPool(n).connect();l.on("error",i=>{}),this.mssqlPools.set(t,l)}return this.mssqlPools.get(t)}getPool(e){return this.getPgPool(e)}async closePgPool(e){let t=this.pgPools.get(e);t&&(await t.end(),this.pgPools.delete(e))}async closeMysqlPool(e){let t=this.mysqlPools.get(e);t&&(await t.end(),this.mysqlPools.delete(e))}async closeMssqlPool(e){let t=this.mssqlPools.get(e);t&&(await t.close(),this.mssqlPools.delete(e))}async closePool(e){await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){let t=this.buildConnectionString(e);await this.closePool(t)}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([r,n])=>{await n.end()}),t=Array.from(this.mysqlPools.entries()).map(async([r,n])=>{await n.end()}),o=Array.from(this.mssqlPools.entries()).map(async([r,n])=>{await n.close()});await Promise.all([...e,...t,...o]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear()}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},Le=new tt,N=a=>Le.getPgPool(a),C=a=>Le.getMysqlPool(a),R=async a=>Le.getMssqlPool(a),xe=()=>Le.getDbType()});import{HTTPException as Wn}from"hono/http-exception";async function Me({tableName:a,db:e}){let t=N(e),o=`
|
|
2
|
+
var cs=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pt=(t,e)=>{for(var o in e)cs(t,o,{get:e[o],enumerable:!0})};var It=f(()=>{"use strict"});var $t=f(()=>{"use strict"});var qt=f(()=>{"use strict"});var ls,se,kt=f(()=>{"use strict";ls=globalThis.process?.env?.NODE_ENV,se={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",PROXY_URL:ls==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var vt=f(()=>{"use strict"});var Ut,rt=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();rt();Ft()});import{z as pe}from"zod";var w,Ds,qe,Ql,Zt,ee,Q=f(()=>{"use strict";w=pe.object({db:pe.string("Database name is required")}),Ds=["pg","mysql","mssql","mongodb"],qe=pe.enum(Ds,{message:"Invalid database type"}),Ql=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,Gl,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)}),Gl=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 Ne}from"zod";var to,oo=f(()=>{"use strict";to=Ne.object({tableName:Ne.string("Table name is required"),data:Ne.record(Ne.string("Column name is required"),Ne.any())})});import{z as W}from"zod";var ao,K,om,am,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")}),om=W.object({db:w.shape.db,tableName:K.shape.tableName,columnName:K.shape.columnName,cascade:W.boolean().optional()}),am=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 Re}from"zod";var Ae,cm,no=f(()=>{"use strict";Q();ke();Ae=Re.object({columnType:Re.string("Column type is required"),isNullable:Re.boolean(),defaultValue:Re.string().nullable().optional()}),cm=Re.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 _s,Ms,I,xs,Ls,ym,lt=f(()=>{"use strict";_s=["text","boolean","number","enum","json","date","array"],Ms=V.enum(_s),I={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},xs=["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"],Ls=V.enum(xs),ym=V.object({columnName:V.string(),dataType:Ms,dataTypeLabel:Ls,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";lt();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 Os,Eo,Ps,Is,ho,Co=f(()=>{"use strict";Os=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Eo=U.enum(Os),Ps=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)}),Is=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(Ps).min(1,"At least one field is required"),foreignKeys:U.array(Is).optional()})});import{z as B}from"zod";var $s,Rm,So,No=f(()=>{"use strict";Q();$s=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")}),Rm=B.object({databases:B.array($s),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 Ro=f(()=>{"use strict"});import{z as be}from"zod";var mt,Ao=f(()=>{"use strict";mt=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 qs}from"zod";var wo,Do=f(()=>{"use strict";Q();wo=w.extend({cascade:qs.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 ks}from"zod";var vs,Lo,Oo=f(()=>{"use strict";Q();vs=["csv","xlsx","json"],Lo=w.extend({format:ks.enum(vs,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var Po=f(()=>{"use strict"});import{z as ut}from"zod";var pt,Um,Io=f(()=>{"use strict";Q();ke();pt=ut.object({newColumnName:ut.string("New column name is required")}),Um=ut.object({db:w.shape.db,tableName:K.shape.tableName,columnName:K.shape.columnName,newColumnName:pt.shape.newColumnName})});import{z as M}from"zod";var jm,ve,Km,Us,Vm,$o,qo=f(()=>{"use strict";Q();jm=M.object({columnName:M.string(),operator:M.string(),value:M.string()}),ve=["asc","desc"],Km=M.object({columnName:M.string(),direction:M.enum(ve)}),Us=M.object({limit:M.number(),total:M.number(),hasNextPage:M.boolean(),hasPreviousPage:M.boolean(),nextCursor:M.string().nullable(),prevCursor:M.string().nullable()}),Vm=M.object({data:M.array(M.record(M.string(),M.unknown())),meta:Us}),$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 Ue}from"zod";var Ym,ko=f(()=>{"use strict";Ym=Ue.object({tableName:Ue.string("Table name is required"),schemaName:Ue.string().optional(),rowCount:Ue.coerce.number("Row count is required")})});import{z as vo}from"zod";var Jm,Uo=f(()=>{"use strict";Jm=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();lt();Co();Q();No();Ro();ke();Ao();Do();xo();Oo();Po();Io();qo();ko();Uo();Bo()});import{HTTPException as Fs}from"hono/http-exception";import{DatabaseError as Bs}from"pg";import{ZodError as Hs}from"zod";function Ho(t,e){if(t instanceof Fs)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof Hs){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 Bs&&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:()=>je,getDbPool:()=>C,getDbType:()=>ce,getMongoClient:()=>Fe,getMongoDb:()=>x,getMongoDbName:()=>Be,getMssqlPool:()=>R,getMysqlPool:()=>S,isValidObjectId:()=>He});import{MongoClient as js,ObjectId as dt}from"mongodb";import Ks from"mssql";import{createPool as Vs}from"mysql2/promise";import{Pool as Vo}from"pg";var ft,ie,C,S,R,ce,Fe,Be,x,He,je,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=Vs({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 Ks.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 js(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),R=async t=>ie.getMssqlPool(t),ce=()=>ie.getDbType(),Fe=()=>ie.getMongoClient(),Be=()=>ie.getMongoDbName(),x=t=>ie.getMongoDb(t),He=t=>typeof t=="string"&&dt.isValid(t),je=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 Ke({tableName:t,db:e}){let n=await(await x(e)).collection(t).find({}).limit(Ws).toArray(),r=n.length,s=new Map,c=(i,l)=>{let m=zs(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:Gs(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=Js(s??[]),p=Go(n??"",r),u=o&&o>0?o:50,d=Ys(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()]),N=E.map(k=>we(k)),A=y+u,q=Math.max(y-u,0);return{data:N,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=Qs(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,Qs,Ws,Yo,Ys,we,zs,Gs,Js,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"]),Qs=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}},Ws=200,Yo=t=>Buffer.from(JSON.stringify({offset:t})).toString("base64url"),Ys=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},zs=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",Gs=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"}},Js=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:He(r)?je(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=je,bt=He});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 Ke({tableName:m,db:t}),u={name:m,columns:p.map(Xs)};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 Xs,na=f(()=>{"use strict";h();ye();Xs=t=>({name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable,isPrimaryKey:t.isPrimaryKey})});import{Pool as Zs}from"pg";var Ve,ei,yt,ra=f(()=>{"use strict";Ve=null,ei=()=>{if(!Ve){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{Ve=new Zs({connectionString:process.env.DATABASE_URL}),Ve.on("error",t=>{})}catch(t){throw t}}return Ve},yt=new Proxy({},{get(t,e){try{return ei()[e]}catch(o){throw o}}})});import{HTTPException as ti}from"hono/http-exception";async function Qe({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 sn=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var ln=(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:
|
|
51
|
+
`,{rows:n}=await o.query(a,[t]);if(!n||n.length===0)throw new ti(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 ai(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:
|
|
57
|
+
`,{rows:a}=await e.query(o);return a.map(n=>n.table_name)}async function ni(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
|
-
`,[
|
|
62
|
+
`,[t])).rows[0]?.description||void 0}finally{e.release()}}async function ri(t){let e=await yt.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function si(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 ii(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 ci(t,e={}){if(ce()==="mongodb")return aa(t,{includeSampleData:e.includeSampleData});let{includeSampleData:o=!1,includeDescriptions:a=!0}=e;try{let r=(await ai(t)).map(async i=>{let[l,m,p]=await Promise.all([Qe({tableName:i,db:t}),a?ni(i):Promise.resolve(void 0),o?ri(i):Promise.resolve([])]),u={name:i,columns:l.map(si)};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=ii(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 ci(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 sn=Object.defineProperty;var d=(a,e)=>()=>(a&&(e=a(a=0)),e);var ln=(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 ${
|
|
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
|
-
${
|
|
136
|
+
${ca(t)}
|
|
78
137
|
|
|
79
138
|
**Guidelines:**
|
|
80
|
-
1. Always generate syntactically correct SQL for the database type (${
|
|
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,34 +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
|
|
174
|
+
- Their most frequently ordered products"`}function ca(t){let o=`Database Type: ${t.dbType==="pg"?"PostgreSQL":t.dbType}
|
|
116
175
|
|
|
117
|
-
`;
|
|
118
|
-
`;for(let
|
|
119
|
-
### ${
|
|
120
|
-
`,
|
|
121
|
-
`),
|
|
122
|
-
`;for(let
|
|
123
|
-
`,
|
|
124
|
-
`)}
|
|
125
|
-
`,
|
|
126
|
-
`)}if(
|
|
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
|
|
129
|
-
`}return
|
|
130
|
-
INSERT INTO "${
|
|
131
|
-
VALUES (${
|
|
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 li}from"@hono/zod-validator";import{Hono as mi}from"hono";var ua,pa=f(()=>{"use strict";Pe();X();ia();ma();ua=new mi().basePath("/chat").post("/",li("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 ui}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})
|
|
132
191
|
RETURNING *
|
|
133
|
-
`,m=await
|
|
134
|
-
INSERT INTO "${
|
|
135
|
-
VALUES (${
|
|
192
|
+
`,m=await n.query(l,s);if(m.rowCount===0)throw new ui(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:m.rowCount??0}}var fa=f(()=>{"use strict";h()});import{HTTPException as We}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 We(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})
|
|
136
195
|
RETURNING *
|
|
137
|
-
`;try{await
|
|
138
|
-
CREATE TABLE "${
|
|
139
|
-
${
|
|
196
|
+
`;try{await n.query(g,u),c++}catch(y){throw new We(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 We?r:new We(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(`,
|
|
140
199
|
`)}
|
|
141
200
|
);
|
|
142
|
-
`;await
|
|
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=`
|
|
143
202
|
SELECT
|
|
144
203
|
d.datname as name,
|
|
145
204
|
pg_size_pretty(pg_database_size(d.datname)) as size,
|
|
@@ -148,7 +207,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
148
207
|
FROM pg_catalog.pg_database d
|
|
149
208
|
WHERE d.datistemplate = false
|
|
150
209
|
ORDER BY d.datname;
|
|
151
|
-
`,{rows:
|
|
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=`
|
|
152
211
|
SELECT
|
|
153
212
|
version() as version,
|
|
154
213
|
current_database() as database,
|
|
@@ -157,17 +216,17 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
157
216
|
inet_server_port() as port,
|
|
158
217
|
(SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
|
|
159
218
|
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
|
|
160
|
-
`,{rows:
|
|
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 Na}from"hono/http-exception";async function Ra(t){let{tableName:e,columnName:o,cascade:a,db:n}=t,r=C(n),s=`
|
|
161
220
|
SELECT EXISTS (
|
|
162
221
|
SELECT 1 FROM information_schema.tables
|
|
163
222
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
164
223
|
) as exists;
|
|
165
|
-
`,{rows:
|
|
224
|
+
`,{rows:c}=await r.query(s,[e]);if(!c[0]?.exists)throw new Na(404,{message:`Table "${e}" does not exist`});let i=`
|
|
166
225
|
SELECT EXISTS (
|
|
167
226
|
SELECT 1 FROM information_schema.columns
|
|
168
227
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
169
228
|
) as exists;
|
|
170
|
-
`,{rows:
|
|
229
|
+
`,{rows:l}=await r.query(i,[e,o]);if(!l[0]?.exists)throw new Na(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(`
|
|
171
230
|
SELECT
|
|
172
231
|
tc.constraint_name,
|
|
173
232
|
tc.table_name as referencing_table,
|
|
@@ -183,25 +242,25 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
183
242
|
AND ccu.table_schema = tc.table_schema
|
|
184
243
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
185
244
|
AND ccu.table_name = $1
|
|
186
|
-
`,[
|
|
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 gi(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=`
|
|
187
246
|
SELECT * FROM "${m.referencingTable}"
|
|
188
247
|
WHERE "${m.referencingColumn}" IN (${u})
|
|
189
248
|
LIMIT 100
|
|
190
|
-
`,
|
|
191
|
-
DELETE FROM "${
|
|
192
|
-
WHERE "${
|
|
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})
|
|
193
252
|
RETURNING *
|
|
194
|
-
`;try{await
|
|
195
|
-
SELECT "${k.referencedColumn}" FROM "${
|
|
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 gi(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}"
|
|
196
255
|
WHERE "${y}" IN (${H})
|
|
197
|
-
`,
|
|
198
|
-
DELETE FROM "${
|
|
199
|
-
WHERE "${y}" IN (${
|
|
200
|
-
`,
|
|
201
|
-
DELETE FROM "${
|
|
202
|
-
WHERE "${
|
|
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 N=b.map((k,H)=>`$${H+1}`).join(", "),A=`
|
|
257
|
+
DELETE FROM "${g}"
|
|
258
|
+
WHERE "${y}" IN (${N})
|
|
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})
|
|
203
262
|
RETURNING *
|
|
204
|
-
`,u=await
|
|
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 Ei(t,e){return(await C(e).query(`
|
|
205
264
|
SELECT
|
|
206
265
|
tc.constraint_name,
|
|
207
266
|
tc.table_name as referencing_table,
|
|
@@ -217,15 +276,15 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
217
276
|
AND ccu.table_schema = tc.table_schema
|
|
218
277
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
219
278
|
AND ccu.table_name = $1
|
|
220
|
-
`,[
|
|
221
|
-
SELECT * FROM "${
|
|
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 Ei(t,e);if(o.length===0)return[];let a=[],n=C(e);for(let r of o){let s=`
|
|
280
|
+
SELECT * FROM "${r.referencingTable}"
|
|
222
281
|
LIMIT 100
|
|
223
|
-
`,
|
|
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 hi(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=`
|
|
224
283
|
SELECT EXISTS (
|
|
225
284
|
SELECT 1 FROM information_schema.tables
|
|
226
285
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
227
286
|
) as exists;
|
|
228
|
-
`,{rows:
|
|
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 hi(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 Si}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 Si(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 Ri}from"hono/http-exception";async function ka(){let a=(await(await Fe()).db().admin().listDatabases()).databases??[];if(!a[0])throw new Ri(500,{message:"No databases returned from MongoDB"});return a.map(n=>({name:n.name,size:Ai(n.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}async function va(){return{db:Be()}}async function Ua(){let e=(await Fe()).db().admin(),o=oe(),a={};try{a=await e.serverStatus()}catch{}return{host:o.host,port:o.port,user:"n/a",database:Be(),version:a.version??"unknown",active_connections:a.connections?.current??0,max_connections:(a.connections?.current??0)+(a.connections?.available??0)}}var Ai,Fa=f(()=>{"use strict";h();De();Ai=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 wi}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 wi(404,{message:`Collection "${t}" does not exist`});let n=o.collection(t),r=await n.find({}).limit(Di).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=_i(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(N=>N!=="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 Di,_i,Ya=f(()=>{"use strict";h();Di=200,_i=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 Mi}from"hono/http-exception";function xi(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 R(e),n=await o.request().input("tableName",t).query(`
|
|
229
288
|
SELECT
|
|
230
289
|
c.COLUMN_NAME AS columnName,
|
|
231
290
|
c.DATA_TYPE AS dataType,
|
|
@@ -277,7 +336,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
277
336
|
AND c.TABLE_NAME = @tableName
|
|
278
337
|
AND c.TABLE_SCHEMA = 'dbo'
|
|
279
338
|
ORDER BY c.ORDINAL_POSITION
|
|
280
|
-
`);if(!
|
|
339
|
+
`);if(!n.recordset||n.recordset.length===0)throw new Mi(404,{message:`Table "${t}" does not exist`});let r=await o.request().input("tableName",t).query(`
|
|
281
340
|
SELECT
|
|
282
341
|
cc.COLUMN_NAME AS columnName,
|
|
283
342
|
chk.CHECK_CLAUSE AS checkClause
|
|
@@ -287,18 +346,18 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
287
346
|
AND cc.TABLE_SCHEMA = 'dbo'
|
|
288
347
|
WHERE cc.TABLE_NAME = @tableName
|
|
289
348
|
AND cc.TABLE_CATALOG = DB_NAME()
|
|
290
|
-
`),
|
|
291
|
-
INSERT INTO [${
|
|
349
|
+
`),s=new Map;for(let c of r.recordset){let i=xi(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 Oi}from"hono/http-exception";async function za({db:t,params:e}){let{tableName:o,data:a}=e,n=await R(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})
|
|
292
351
|
VALUES (${u})
|
|
293
|
-
`,
|
|
294
|
-
INSERT INTO [${
|
|
295
|
-
VALUES (${
|
|
296
|
-
`;try{await p.query(
|
|
297
|
-
CREATE TABLE [${
|
|
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 Oi(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:y.rowsAffected[0]??0}}var Ga=f(()=>{"use strict";h();_e()});import{HTTPException as Ye}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 Ye(400,{message:"At least one record is required"});let n=(await R(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 Ye(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 Ye?r:new Ye(500,{message:`Failed to bulk insert records into "${t}"`})}}});function $i(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 qi(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 R(e),s=a.map(u=>{let d=qi(u.columnType,u.isArray??!1),g=`[${u.columnName}] ${d}`;if(!u.isNullable&&!u.isPrimaryKey&&(g+=" NOT NULL"),u.defaultValue&&!d.includes("IDENTITY")){let y=$i(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}] (
|
|
298
357
|
${m.join(`,
|
|
299
358
|
`)}
|
|
300
359
|
)
|
|
301
|
-
`;await
|
|
360
|
+
`;await r.request().query(p)}var en=f(()=>{"use strict";h()});import{HTTPException as Nt}from"hono/http-exception";async function tn(){let e=await(await R()).request().query(`
|
|
302
361
|
SELECT
|
|
303
362
|
d.name AS name,
|
|
304
363
|
CAST(
|
|
@@ -314,7 +373,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
314
373
|
WHERE d.database_id > 4 -- Exclude system databases
|
|
315
374
|
GROUP BY d.name, d.owner_sid, d.collation_name
|
|
316
375
|
ORDER BY d.name
|
|
317
|
-
`);if(!e.recordset[0])throw new
|
|
376
|
+
`);if(!e.recordset[0])throw new Nt(500,{message:"No databases returned from server"});return e.recordset}async function on(){let e=await(await R()).request().query("SELECT DB_NAME() AS db");if(!e.recordset[0])throw new Nt(500,{message:"No current database returned from server"});return e.recordset[0]}async function an(){let e=await(await R()).request().query(`
|
|
318
377
|
SELECT
|
|
319
378
|
@@VERSION AS version,
|
|
320
379
|
DB_NAME() AS database_name,
|
|
@@ -323,20 +382,20 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
323
382
|
(SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS port,
|
|
324
383
|
@@MAX_CONNECTIONS AS max_connections,
|
|
325
384
|
(SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS active_connections
|
|
326
|
-
`);if(!e.recordset[0])throw new
|
|
385
|
+
`);if(!e.recordset[0])throw new Nt(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 R(a),r=await n.request().input("tableName",e).query(`
|
|
327
386
|
SELECT COUNT(*) as cnt
|
|
328
387
|
FROM INFORMATION_SCHEMA.TABLES
|
|
329
388
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
330
389
|
AND TABLE_NAME = @tableName
|
|
331
390
|
AND TABLE_SCHEMA = 'dbo'
|
|
332
|
-
`);if(!(Number(
|
|
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(`
|
|
333
392
|
SELECT COUNT(*) as cnt
|
|
334
393
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
335
394
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
336
395
|
AND TABLE_NAME = @tableName
|
|
337
396
|
AND COLUMN_NAME = @columnName
|
|
338
397
|
AND TABLE_SCHEMA = 'dbo'
|
|
339
|
-
`);if(!(Number(
|
|
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 Rt(t,e){return(await(await R(e)).request().input("tableName",t).query(`
|
|
340
399
|
SELECT
|
|
341
400
|
fk.name AS constraint_name,
|
|
342
401
|
OBJECT_NAME(fk.parent_object_id) AS referencing_table,
|
|
@@ -347,13 +406,13 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
347
406
|
INNER JOIN sys.foreign_key_columns fkc
|
|
348
407
|
ON fk.object_id = fkc.constraint_object_id
|
|
349
408
|
WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
|
|
350
|
-
`)).recordset.map(
|
|
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 Bi(t,e,o){let a=await Rt(t,o);if(a.length===0)return[];let n=[],r=await R(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(`
|
|
351
410
|
SELECT TOP 100 * FROM [${m.referencingTable}]
|
|
352
|
-
WHERE [${m.referencingColumn}] IN (${
|
|
353
|
-
`);
|
|
354
|
-
SELECT [${
|
|
355
|
-
WHERE [${b}] IN (${
|
|
356
|
-
`)).recordset.map(
|
|
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 R(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===Fi)return{deletedCount:0,fkViolation:!0,relatedRecords:await Bi(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 R(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 Rt(t,o),i=0,l=new Set,m=new Set,p=async(y,b,E,N)=>{let A=`${y}.${b}`;if(N.has(A))return;N.add(A);let q=await Rt(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,$,N)}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 Fi,un=f(()=>{"use strict";h();Fi=547});import{HTTPException as At}from"hono/http-exception";async function dn(t,e){return(await(await R(e)).request().input("tableName",t).query(`
|
|
357
416
|
SELECT
|
|
358
417
|
fk.name AS constraint_name,
|
|
359
418
|
OBJECT_NAME(fk.parent_object_id) AS referencing_table,
|
|
@@ -364,26 +423,26 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
364
423
|
INNER JOIN sys.foreign_key_columns fkc
|
|
365
424
|
ON fk.object_id = fkc.constraint_object_id
|
|
366
425
|
WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
|
|
367
|
-
`)).recordset.map(
|
|
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 R(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 Ki(t,e){let a=await(await R(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 R(o),r=await n.request().input("tableName",e).query(`
|
|
368
427
|
SELECT COUNT(*) as cnt
|
|
369
428
|
FROM INFORMATION_SCHEMA.TABLES
|
|
370
429
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
371
430
|
AND TABLE_NAME = @tableName
|
|
372
431
|
AND TABLE_SCHEMA = 'dbo'
|
|
373
|
-
`);if(!(Number(
|
|
432
|
+
`);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new At(404,{message:`Table "${e}" does not exist`});let c=await Ki(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===ji)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 ji,bn=f(()=>{"use strict";h();ji=3726});import{HTTPException as Qi}from"hono/http-exception";async function yn({tableName:t,db:e}){let a=await(await R(e)).request().query(`SELECT * FROM [${t}]`);if(!a.recordset||a.recordset.length===0)throw new Qi(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 Yi}from"hono/http-exception";var Tn,En=f(()=>{"use strict";h();Tn=async({query:t,db:e})=>{let o=await R(e);if(!t||!t.trim())throw new Yi(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 R(t),a=await e.request().query(`
|
|
374
433
|
SELECT table_name AS tableName
|
|
375
434
|
FROM information_schema.tables
|
|
376
435
|
WHERE table_catalog = DB_NAME()
|
|
377
436
|
AND table_type = 'BASE TABLE'
|
|
378
437
|
AND table_schema = 'dbo'
|
|
379
438
|
ORDER BY table_name
|
|
380
|
-
`);return!
|
|
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 Nn({tableName:t,db:e}){let o=await R(e),a=await o.request().input("tableName",t).query(`
|
|
381
440
|
SELECT COUNT(*) as cnt
|
|
382
441
|
FROM INFORMATION_SCHEMA.TABLES
|
|
383
442
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
384
443
|
AND TABLE_NAME = @tableName
|
|
385
444
|
AND TABLE_SCHEMA = 'dbo'
|
|
386
|
-
`);if(!(Number(
|
|
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(`
|
|
387
446
|
SELECT
|
|
388
447
|
c.COLUMN_NAME,
|
|
389
448
|
c.DATA_TYPE,
|
|
@@ -428,20 +487,20 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
428
487
|
AND c.TABLE_NAME = @tableName
|
|
429
488
|
AND c.TABLE_SCHEMA = 'dbo'
|
|
430
489
|
ORDER BY c.ORDINAL_POSITION
|
|
431
|
-
`);if(!
|
|
432
|
-
${
|
|
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(`,
|
|
433
492
|
`)}
|
|
434
|
-
)`}var
|
|
493
|
+
)`}var Rn=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 R(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(`
|
|
435
494
|
SELECT *
|
|
436
|
-
FROM [${
|
|
495
|
+
FROM [${t}]
|
|
437
496
|
${p}
|
|
438
497
|
OFFSET ${m} ROWS
|
|
439
|
-
FETCH NEXT ${
|
|
440
|
-
`)).recordset,b=y.length>
|
|
441
|
-
UPDATE [${
|
|
442
|
-
SET ${
|
|
443
|
-
WHERE [${
|
|
444
|
-
`,b=await
|
|
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,N=l>0?String(l-1):null;return{data:y,meta:{limit:o,total:d,hasNextPage:b,hasPreviousPage:l>0,nextCursor:E,prevCursor:N}}}});import{HTTPException as ze}from"hono/http-exception";async function Dn({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=await R(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 ze(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,N)=>`[${E.columnName}] = @value${N}`),g=l.request();u.forEach((E,N)=>{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${N}`,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 ze(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 ze?m:new ze(500,{message:`Failed to update records in "${o}"`})}}var _n=f(()=>{"use strict";h();_e()});import{HTTPException as ec}from"hono/http-exception";function tc(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=`
|
|
445
504
|
SELECT
|
|
446
505
|
c.COLUMN_NAME AS columnName,
|
|
447
506
|
c.DATA_TYPE AS dataType,
|
|
@@ -461,18 +520,18 @@ ${l.join(`,
|
|
|
461
520
|
WHERE c.TABLE_SCHEMA = DATABASE()
|
|
462
521
|
AND c.TABLE_NAME = ?
|
|
463
522
|
ORDER BY c.ORDINAL_POSITION
|
|
464
|
-
`,[
|
|
465
|
-
INSERT INTO \`${
|
|
466
|
-
VALUES (${
|
|
467
|
-
`,[u]=await
|
|
468
|
-
INSERT INTO \`${
|
|
523
|
+
`,[n]=await o.execute(a,[t]);if(!n||n.length===0)throw new ec(404,{message:`Table "${t}" does not exist`});return n.map(r=>{let s=r.dataType,c=r.columnType,l=s==="enum"||s==="set"?tc(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 ac}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 ac(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:u.affectedRows}}var xn=f(()=>{"use strict";h();Me()});import{HTTPException as Ge}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 Ge(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})
|
|
469
528
|
VALUES (${u})
|
|
470
|
-
`;try{await
|
|
471
|
-
CREATE TABLE \`${
|
|
529
|
+
`;try{await n.execute(d,p)}catch(g){throw new Ge(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 Ge?r:new Ge(500,{message:`Failed to bulk insert records into "${t}"`})}finally{n.release()}}});function sc(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 ic(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=ic(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=sc(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 Je=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}\` (
|
|
472
531
|
${m.join(`,
|
|
473
532
|
`)}
|
|
474
533
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
475
|
-
`;await
|
|
534
|
+
`;await r.execute(p)}var In=f(()=>{"use strict";h();Je()});import{HTTPException as wt}from"hono/http-exception";async function $n(){let t=S(),[e]=await t.execute(`
|
|
476
535
|
SELECT
|
|
477
536
|
s.SCHEMA_NAME AS name,
|
|
478
537
|
CONCAT(
|
|
@@ -489,7 +548,7 @@ ${l.join(`,
|
|
|
489
548
|
ON t.TABLE_SCHEMA = s.SCHEMA_NAME
|
|
490
549
|
GROUP BY s.SCHEMA_NAME, s.DEFAULT_CHARACTER_SET_NAME
|
|
491
550
|
ORDER BY s.SCHEMA_NAME
|
|
492
|
-
`);if(!e[0])throw new
|
|
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(`
|
|
493
552
|
SELECT
|
|
494
553
|
VERSION() AS version,
|
|
495
554
|
DATABASE() AS database_name,
|
|
@@ -497,11 +556,11 @@ ${l.join(`,
|
|
|
497
556
|
@@hostname AS host,
|
|
498
557
|
@@port AS port,
|
|
499
558
|
@@max_connections AS max_connections
|
|
500
|
-
`),[
|
|
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
|
|
501
560
|
FROM information_schema.TABLES
|
|
502
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(
|
|
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
|
|
503
562
|
FROM information_schema.COLUMNS
|
|
504
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,
|
|
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
|
|
505
564
|
kcu.CONSTRAINT_NAME AS constraint_name,
|
|
506
565
|
kcu.TABLE_NAME AS referencing_table,
|
|
507
566
|
kcu.COLUMN_NAME AS referencing_column,
|
|
@@ -514,10 +573,10 @@ ${l.join(`,
|
|
|
514
573
|
AND kcu.TABLE_NAME = tc.TABLE_NAME
|
|
515
574
|
WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
|
|
516
575
|
AND kcu.TABLE_SCHEMA = DATABASE()
|
|
517
|
-
AND kcu.REFERENCED_TABLE_NAME = ?`,[
|
|
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 pc(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}\`
|
|
518
577
|
WHERE \`${m.referencingColumn}\` IN (${u})
|
|
519
|
-
LIMIT 100`,
|
|
520
|
-
WHERE \`${y}\` IN (${
|
|
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===uc)return{deletedCount:0,fkViolation:!0,relatedRecords:await pc(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 N=`${g}.${y}`;if(E.has(N))return;E.add(N);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 uc,Kn=f(()=>{"use strict";h();uc=1451});import{HTTPException as _t}from"hono/http-exception";async function yc(t,e){let o=S(e),[a]=await o.execute(`SELECT
|
|
521
580
|
kcu.CONSTRAINT_NAME AS constraint_name,
|
|
522
581
|
kcu.TABLE_NAME AS referencing_table,
|
|
523
582
|
kcu.COLUMN_NAME AS referencing_column,
|
|
@@ -530,37 +589,38 @@ ${l.join(`,
|
|
|
530
589
|
AND kcu.TABLE_NAME = tc.TABLE_NAME
|
|
531
590
|
WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
|
|
532
591
|
AND kcu.TABLE_SCHEMA = DATABASE()
|
|
533
|
-
AND kcu.REFERENCED_TABLE_NAME = ?`,[
|
|
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 yc(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 gc(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
|
|
534
593
|
FROM information_schema.TABLES
|
|
535
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(
|
|
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 gc(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===fc||l.errno===bc)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 fc,bc,Wn=f(()=>{"use strict";h();fc=1217,bc=1451});import{HTTPException as Ec}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 Ec(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 Cc}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 Cc(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=`
|
|
536
595
|
SELECT table_name as tableName
|
|
537
596
|
FROM information_schema.tables
|
|
538
597
|
WHERE table_schema = DATABASE()
|
|
539
598
|
AND table_type = 'BASE TABLE'
|
|
540
599
|
ORDER BY table_name
|
|
541
|
-
`,[
|
|
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
|
|
542
601
|
FROM information_schema.TABLES
|
|
543
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_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 Xe,Ac,wc,ir,cr=f(()=>{"use strict";h();sr();Xe=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),Ac=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},wc=async(t,e)=>{let[o]=await t.execute(`SELECT COLUMN_NAME as column_name
|
|
544
603
|
FROM information_schema.COLUMNS
|
|
545
604
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
546
605
|
AND TABLE_NAME = ?
|
|
547
606
|
AND COLUMN_KEY = 'PRI'
|
|
548
|
-
ORDER BY ORDINAL_POSITION`,[e]);return
|
|
549
|
-
UPDATE \`${
|
|
550
|
-
SET ${
|
|
551
|
-
WHERE \`${
|
|
552
|
-
`,[b]=await
|
|
553
|
-
SELECT table_name as "tableName"
|
|
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 wc(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 $=Ac(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 N=nr((Array.isArray(n),n),r),A=N;a==="desc"?N?A=N.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(", ")}`):!N&&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=Xe(v(_))),e&&(Y=Xe(v($)))):(e&&(F=Xe(v(_))),D&&(Y=Xe(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 Ze}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 Ze(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 Ze(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 Ze?m:new Ze(500,{message:`Failed to update records in "${o}"`})}finally{l.release()}}var mr=f(()=>{"use strict";h();Me()});import{HTTPException as Mc}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 Mc(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 Lc}from"hono/http-exception";async function fr(t){let e=C(t),o=`
|
|
612
|
+
SELECT table_schema as "schemaName", table_name as "tableName"
|
|
554
613
|
FROM information_schema.tables
|
|
555
|
-
WHERE
|
|
556
|
-
AND
|
|
557
|
-
|
|
558
|
-
|
|
614
|
+
WHERE table_type = 'BASE TABLE'
|
|
615
|
+
AND table_schema NOT IN ('pg_catalog', 'information_schema')
|
|
616
|
+
AND table_schema NOT LIKE 'pg_toast%'
|
|
617
|
+
ORDER BY table_schema, table_name;
|
|
618
|
+
`,{rows:a}=await e.query(o);if(!a[0])throw new Lc(500,{message:"No tables returned from database"});return await Promise.all(a.map(async r=>{let s=dr(r.schemaName),c=dr(r.tableName),i=`SELECT COUNT(*)::integer as count FROM "${s}"."${c}"`,{rows:l}=await e.query(i);return{schemaName:r.schemaName,tableName:r.tableName,rowCount:l[0]?.count??0}}))}var dr,br=f(()=>{"use strict";h();dr=t=>t.replaceAll('"','""')});import{HTTPException as Pc}from"hono/http-exception";async function yr({tableName:t,db:e}){let o=C(e),a=`
|
|
559
619
|
SELECT EXISTS (
|
|
560
620
|
SELECT 1 FROM information_schema.tables
|
|
561
621
|
WHERE table_schema = 'public' AND table_name = $1
|
|
562
622
|
) as exists
|
|
563
|
-
`,{rows:
|
|
623
|
+
`,{rows:n}=await o.query(a,[t]);if(!n[0]?.exists)throw new Pc(404,{message:`Table "${t}" does not exist`});let r=`
|
|
564
624
|
SELECT
|
|
565
625
|
column_name,
|
|
566
626
|
data_type,
|
|
@@ -573,7 +633,7 @@ ${l.join(`,
|
|
|
573
633
|
FROM information_schema.columns
|
|
574
634
|
WHERE table_schema = 'public' AND table_name = $1
|
|
575
635
|
ORDER BY ordinal_position
|
|
576
|
-
`,{rows:
|
|
636
|
+
`,{rows:s}=await o.query(r,[t]),c=`
|
|
577
637
|
SELECT
|
|
578
638
|
tc.constraint_name,
|
|
579
639
|
tc.constraint_type,
|
|
@@ -590,7 +650,7 @@ ${l.join(`,
|
|
|
590
650
|
AND tc.constraint_type = 'FOREIGN KEY'
|
|
591
651
|
WHERE tc.table_schema = 'public' AND tc.table_name = $1
|
|
592
652
|
ORDER BY tc.constraint_type, tc.constraint_name
|
|
593
|
-
`,{rows:
|
|
653
|
+
`,{rows:i}=await o.query(c,[t]),l=`
|
|
594
654
|
SELECT indexname, indexdef
|
|
595
655
|
FROM pg_indexes
|
|
596
656
|
WHERE schemaname = 'public' AND tablename = $1
|
|
@@ -599,61 +659,61 @@ ${l.join(`,
|
|
|
599
659
|
FROM information_schema.table_constraints
|
|
600
660
|
WHERE table_schema = 'public' AND table_name = $1 AND constraint_type = 'PRIMARY KEY'
|
|
601
661
|
)
|
|
602
|
-
`,{rows:m}=await
|
|
603
|
-
`)),p.push(") tablespace pg_default;");for(let b of m)Array.from(
|
|
604
|
-
`)}function
|
|
662
|
+
`,{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} ${Ic(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 N=E[0],A=E.map(q=>q.column_name).join(", ");if(N.constraint_type==="PRIMARY KEY")g.push(` constraint ${b} primary key (${A})`);else if(N.constraint_type==="FOREIGN KEY"){let q=N.foreign_table_name,k=N.foreign_column_name;g.push(` constraint ${b} foreign key (${A}) references ${q} (${k})`)}else N.constraint_type==="UNIQUE"&&g.push(` constraint ${b} unique (${A})`)}let y=[...u,...g];p.push(y.join(`,
|
|
663
|
+
`)),p.push(") tablespace pg_default;");for(let b of m)Array.from(d.values()).some(N=>N[0].constraint_type==="UNIQUE"&&N[0].constraint_name===b.indexname)||(p.push(""),p.push(`${b.indexdef};`));return p.join(`
|
|
664
|
+
`)}function Ic(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 gr=f(()=>{"use strict";h()});function Tr(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 Er(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 hr(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 Cr=f(()=>{"use strict"});var et,qc,kc,Sr,Nr=f(()=>{"use strict";h();Cr();et=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),qc=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},kc=async(t,e)=>{let o=`"${e}"`;return(await t.query(`SELECT a.attname as column_name
|
|
605
665
|
FROM pg_index i
|
|
606
666
|
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
|
607
667
|
WHERE i.indrelid = $1::regclass AND i.indisprimary
|
|
608
|
-
ORDER BY array_position(i.indkey, a.attnum)`,[
|
|
609
|
-
UPDATE "${
|
|
668
|
+
ORDER BY array_position(i.indkey, a.attnum)`,[o])).rows.map(n=>n.column_name)},Sr=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 kc(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}=Tr(s),y="",b=[];if(e){let _=qc(e);if(_){let v=hr(_,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 N=Er((Array.isArray(n),n),r),A=N;a==="desc"?N?A=N.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(", ")}`:!N&&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=et(me(v))),e&&($=et(me(_)))):(e&&(Y=et(me(v))),F&&($=et(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 tt}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 tt(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=`
|
|
669
|
+
UPDATE "${o}"
|
|
610
670
|
SET ${m.join(", ")}
|
|
611
|
-
WHERE "${
|
|
671
|
+
WHERE "${n}" = $${p.length}
|
|
612
672
|
RETURNING *
|
|
613
|
-
`,
|
|
673
|
+
`,d=await r.query(u,p);if(d.rowCount===0)throw new tt(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 tt?c:new tt(500,{message:`Failed to update records in "${o}"`})}}var Ar=f(()=>{"use strict";h()});function P(t){return t==="mongodb"?wr.mongodb:wr[t]}var wr,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();Rn();wn();_n();xn();On();In();vn();Bn();Kn();Wn();zn();Jn();Me();Zn();or();cr();mr();pr();gt();br();gr();Nr();Ar();wr={pg:{addRecord:da,bulkInsertRecords:ba,createTable:ga,getDatabasesList:Ea,getCurrentDatabase:ha,getDatabaseConnectionInfo:Ca,deleteColumn:Ra,deleteRecords:wa,forceDeleteRecords:Da,deleteTable:xa,exportTableData:Oa,executeQuery:ur,getTableColumns:Qe,getTablesList:fr,getTableSchema:yr,getTableData:Sr,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:Ke,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:Nn,getTableData:An,updateRecords:Dn}}});import{Hono as Fc}from"hono";var Dr,_r=f(()=>{"use strict";xe();h();Dr=new Fc().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 Mr}from"@hono/zod-validator";import{Hono as Bc}from"hono";var xr,Lr=f(()=>{"use strict";X();xe();xr=new Bc().basePath("/query").post("/",Mr("query",w),Mr("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 Hc}from"hono";var Or,Pr=f(()=>{"use strict";X();xe();Or=new Hc().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",mt),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",mt),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 Ir}from"hono/http-exception";async function $r(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=`
|
|
614
674
|
SELECT EXISTS (
|
|
615
675
|
SELECT 1 FROM information_schema.tables
|
|
616
676
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
617
677
|
) as exists;
|
|
618
|
-
`,{rows:
|
|
678
|
+
`,{rows:d}=await p.query(u,[e]);if(!d[0]?.exists)throw new Ir(404,{message:`Table "${e}" does not exist`});let g=`
|
|
619
679
|
SELECT EXISTS (
|
|
620
680
|
SELECT 1 FROM information_schema.columns
|
|
621
681
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
622
682
|
) as exists;
|
|
623
|
-
`,{rows:y}=await p.query(
|
|
683
|
+
`,{rows:y}=await p.query(g,[e,o]);if(y[0]?.exists)throw new Ir(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 qr=f(()=>{"use strict";h()});import{HTTPException as kr}from"hono/http-exception";async function vr(t){let{tableName:e,columnName:o,columnType:a,isNullable:n,defaultValue:r,db:s}=t,c=C(s),i=`
|
|
624
684
|
SELECT EXISTS (
|
|
625
685
|
SELECT 1 FROM information_schema.tables
|
|
626
686
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
627
687
|
) as exists;
|
|
628
|
-
`,{rows:
|
|
688
|
+
`,{rows:l}=await c.query(i,[e]);if(!l[0]?.exists)throw new kr(404,{message:`Table "${e}" does not exist`});let m=`
|
|
629
689
|
SELECT EXISTS (
|
|
630
690
|
SELECT 1 FROM information_schema.columns
|
|
631
691
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
632
692
|
) as exists;
|
|
633
|
-
`,{rows:p}=await
|
|
693
|
+
`,{rows:p}=await c.query(m,[e,o]);if(!p[0]?.exists)throw new kr(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 Ur=f(()=>{"use strict";h()});import{HTTPException as Fr}from"hono/http-exception";async function Br({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 Fr(404,{message:`Collection "${t}" does not exist`});if(await s.collection(t).findOne({[e]:{$exists:!0}}))throw new Fr(409,{message:`Field "${e}" already exists in collection "${t}"`});let l=jc(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 jc,Hr=f(()=>{"use strict";h();jc=(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 jr({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 Kr({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 Vr=f(()=>{"use strict";h()});import{HTTPException as Qr}from"hono/http-exception";async function Wr(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
|
|
634
694
|
FROM information_schema.TABLES
|
|
635
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new
|
|
695
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new Qr(404,{message:`Table "${e}" does not exist`});let[g]=await p.execute(`SELECT COUNT(*) as cnt
|
|
636
696
|
FROM information_schema.COLUMNS
|
|
637
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,
|
|
697
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(Number(g[0]?.cnt??0)>0)throw new Qr(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 Yr=f(()=>{"use strict";h();Je()});import{HTTPException as zr}from"hono/http-exception";async function Gr(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
|
|
638
698
|
FROM information_schema.TABLES
|
|
639
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(
|
|
699
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(i[0]?.cnt??0)>0))throw new zr(404,{message:`Table "${e}" does not exist`});let[m]=await c.execute(`SELECT EXTRA
|
|
640
700
|
FROM information_schema.COLUMNS
|
|
641
701
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?
|
|
642
|
-
LIMIT 1`,[e,
|
|
702
|
+
LIMIT 1`,[e,o]),p=m[0];if(!p)throw new zr(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 Jr=f(()=>{"use strict";h();Je()});import{HTTPException as Mt}from"hono/http-exception";async function Xr(t){let{tableName:e,columnName:o,newColumnName:a,db:n}=t,r=S(n),[s]=await r.execute(`SELECT COUNT(*) as cnt
|
|
643
703
|
FROM information_schema.TABLES
|
|
644
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(
|
|
704
|
+
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
|
|
645
705
|
FROM information_schema.COLUMNS
|
|
646
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,
|
|
706
|
+
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
|
|
647
707
|
FROM information_schema.COLUMNS
|
|
648
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,
|
|
708
|
+
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 Zr=f(()=>{"use strict";h()});import{HTTPException as xt}from"hono/http-exception";async function es(t){let{tableName:e,columnName:o,newColumnName:a,db:n}=t,r=C(n),s=`
|
|
649
709
|
SELECT EXISTS (
|
|
650
710
|
SELECT 1 FROM information_schema.tables
|
|
651
711
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
652
712
|
) as exists;
|
|
653
|
-
`,{rows:
|
|
713
|
+
`,{rows:c}=await r.query(s,[e]);if(!c[0]?.exists)throw new xt(404,{message:`Table "${e}" does not exist`});let i=`
|
|
654
714
|
SELECT EXISTS (
|
|
655
715
|
SELECT 1 FROM information_schema.columns
|
|
656
716
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
657
717
|
) as exists;
|
|
658
|
-
`,{rows:c}=await n.query(s,[e,t]);if(!c[0]?.exists)throw new dt(404,{message:`Column "${t}" does not exist in table "${e}"`});let{rows:m}=await n.query(s,[e,o]);if(m[0]?.exists)throw new dt(409,{message:`Column "${o}" already exists in table "${e}"`});await n.query(`ALTER TABLE "${e}" RENAME COLUMN "${t}" TO "${o}"`)}var Zr=d(()=>{"use strict";h()});import{utils as he,write as Mi}from"xlsx";function en({cols:a,rows:e,format:t,tableName:o}){switch(t){case"json":{let r=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(r,"utf-8"))}case"csv":{let r=[a,...e?.map(i=>a?.map(s=>i[s]))??[]],n=he.aoa_to_sheet(r),l=he.sheet_to_csv(n);return new Uint8Array(Buffer.from(l,"utf-8"))}case"xlsx":{let r=[a,...e?.map(s=>a?.map(c=>s[c]))??[]],n=he.aoa_to_sheet(r),l=he.book_new();he.book_append_sheet(l,n,o.slice(0,31));let i=Mi(l,{bookType:"xlsx",type:"buffer"});return new Uint8Array(i)}}}var tn=d(()=>{"use strict"});import{zValidator as x}from"@hono/zod-validator";import{Hono as Oi}from"hono";var an,on=d(()=>{"use strict";J();Fr();jr();ge();Wr();zr();Jr();Zr();tn();an=new Oi().basePath("/tables").get("/",x("query",A),async a=>{let{db:e}=a.req.valid("query"),t=a.get("dbType"),r=await O(t).getTablesList(e);return a.json({data:r},200)}).post("/",x("query",A),x("json",ta),async a=>{let{db:e}=a.req.valid("query"),t=a.req.valid("json"),o=a.get("dbType");return await O(o).createTable({tableData:t,db:e}),a.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",x("query",ia),x("param",Z),async a=>{let{db:e,cascade:t}=a.req.valid("query"),{tableName:o}=a.req.valid("param"),r=a.get("dbType"),l=await O(r).deleteTable({tableName:o,db:e,cascade:t});return a.json({data:l},200)}).delete("/:tableName/columns/:columnName",x("query",Ut),x("param",j),async a=>{let{db:e,cascade:t}=a.req.valid("query"),{tableName:o,columnName:r}=a.req.valid("param"),n=a.get("dbType"),l=O(n),{deletedCount:i}=await l.deleteColumn({tableName:o,columnName:r,cascade:t,db:e});return a.json({data:`Column "${r}" deleted successfully from table "${o}" with ${i} rows deleted`},200)}).post("/:tableName/columns",x("query",A),x("param",Z),x("json",z),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.req.valid("json");return a.get("dbType")==="mysql"?await Vr({tableName:t,db:e,...o}):await Ur({tableName:t,db:e,...o}),a.json({data:`Column "${o.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",x("query",A),x("param",j),x("json",Xe),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,columnName:o}=a.req.valid("param"),r=a.req.valid("json");return a.get("dbType")==="mysql"?await Gr({tableName:t,columnName:o,db:e,...r}):await Xr({tableName:t,columnName:o,db:e,...r}),a.json({data:`Column "${o}" renamed to "${r.newColumnName}" in table "${t}"`},200)}).patch("/:tableName/columns/:columnName",x("query",A),x("param",j),x("json",ye),async a=>{let{db:e}=a.req.valid("query"),{tableName:t,columnName:o}=a.req.valid("param"),r=a.req.valid("json");return a.get("dbType")==="mysql"?await Qr({tableName:t,columnName:o,db:e,...r}):await Br({tableName:t,columnName:o,db:e,...r}),a.json({data:`Column "${o}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",x("query",A),x("param",Z),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.get("dbType"),n=await O(o).getTableColumns({tableName:t,db:e});return a.json({data:n},200)}).get("/:tableName/schema",x("query",A),x("param",Z),async a=>{let{db:e}=a.req.valid("query"),{tableName:t}=a.req.valid("param"),o=a.get("dbType"),n=await O(o).getTableSchema({tableName:t,db:e});return a.json({data:{schema:n}},200)}).get("/:tableName/data",x("param",Z),x("query",ya),async a=>{let{tableName:e}=a.req.valid("param"),{cursor:t,limit:o,direction:r,sort:n,order:l,filters:i,db:s}=a.req.valid("query"),c=a.get("dbType"),p=await O(c).getTableData({tableName:e,cursor:t,limit:o,direction:r,sort:n,order:l,filters:i,db:s});return a.json({data:p},200)}).get("/:tableName/export",x("param",Z),x("query",pa),async a=>{let{tableName:e}=a.req.valid("param"),{db:t,format:o}=a.req.valid("query"),r=a.get("dbType"),n=O(r),{cols:l,rows:i}=await n.exportTableData({tableName:e,db:t}),s=en({cols:l,rows:i,format:o,tableName:e}),c;switch(o){case"csv":c="text/csv";break;case"xlsx":c="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":c="application/json";break}return new Response(s,{headers:{"Content-Type":c??"","Content-Disposition":`attachment; filename="${e}_export.${o}"`}})})});var rn={};ln(rn,{createServer:()=>Ui});import Ke from"path";import{fileURLToPath as Pi}from"url";import{serveStatic as Be}from"@hono/node-server/serve-static";import{zValidator as Ii}from"@hono/zod-validator";import{Hono as qi}from"hono";import{cors as $i}from"hono/cors";import{logger as vi}from"hono/logger";import{prettyJSON as ki}from"hono/pretty-json";var je,Ui,nn=d(()=>{"use strict";J();Sa();Pa();Or();qr();vr();on();je=()=>{if(process.env.NODE_ENV==="development")return Ke.resolve(process.cwd(),"../core/dist");let a=Ke.dirname(Pi(import.meta.url));return Ke.resolve(a,"./core-dist")},Ui=()=>({app:new qi({strict:!1}).use("/*",$i()).use(ki({space:2})).use(process.env.NODE_ENV==="development"?vi():(e,t)=>t()).use("/favicon.ico",Be({path:Ke.resolve(je(),"favicon.ico")})).use("*",async(e,t)=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),await t()}).onError(Ra).route("/",Mr).use("/assets/*",Be({root:je()})).use("/image.png",Be({root:je()})).use("/:dbType/*",Ii("param",qt,Aa)).use("/:dbType/*",async(e,t)=>{let o=e.req.param("dbType");e.set("dbType",o),await t()}).route("/:dbType",an).route("/:dbType",$r).route("/:dbType",Ir).route("/:dbType",Oa).use("/*",Be({root:je()}))})});Ce();import{intro as Fi,outro as Hi}from"@clack/prompts";import{serve as Bi}from"@hono/node-server";import ft from"picocolors";import{program as Rt}from"commander";var At=()=>(Rt.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv),Rt.opts());import{readFile as cn}from"fs/promises";import{resolve as mn}from"path";import{cancel as Re,isCancel as We,note as St,select as un,spinner as pn,text as _t}from"@clack/prompts";import{parse as dn}from"dotenv";import Ye from"picocolors";var wt=async(a,e)=>{let t=e||"DATABASE_URL";if(a?.[t])return a[t];if(process.env[t])return process.env[t];let o=pn();o.start("Looking for database connection..."),a?St(Ye.red(`${t} not found in .env or process.env`)):St(Ye.red(`No .env file found and ${t} not set in process.env`));let r=await un({message:`How do you want to provide ${t}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((We(r)||r==="cancel")&&(Re("No database connection provided. Exiting..."),process.exit(0)),r==="other-env"){o.start("Waiting for path...");let l=await _t({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});We(l)&&(Re("Cancelled."),process.exit(0)),o.stop("Trying custom .env...");let i=mn(l);try{let s=await cn(i,"utf-8"),c=dn(s);if(c[t])return c[t];throw new Error(`${t} still missing in custom file`)}catch(s){let c=s;Re(`Cannot read or parse file: ${Ye.dim(c.message)}`),process.exit(1)}}o.stop("Manual input...");let n=await _t({message:`Paste your ${t}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(l){if(!l?.trim())return"Connection string is required!";try{new URL(l);return}catch{return"Must be a valid URL format"}}});return We(n)&&(Re("Cancelled."),process.exit(0)),n.trim()};import{access as fn,readFile as bn}from"fs/promises";import{dirname as yn,resolve as Qe}from"path";import{parse as Tn}from"dotenv";var En=async a=>{let e=Qe(a);for(;;){let t=Qe(e,".env");try{return await fn(t),t}catch{}let o=yn(e);if(o===e)return null;e=o}},re=async a=>{let e;if(a?e=Qe(a):e=await En(process.cwd()),!e)return null;try{let t=await bn(e,"utf-8");return Tn(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};Ve();import{intro as gn,outro as hn}from"@clack/prompts";import Dt from"picocolors";var Lt=()=>{gn(Dt.inverse(" db-studio ")),hn(Dt.green(`For more information, visit: ${Nt.SITE_DOCS_LINK}`))};Ce();import{intro as Nn,note as Cn,outro as xt}from"@clack/prompts";import Ae from"picocolors";var Mt=async(a,e,t)=>{Nn(Ae.inverse(" db-studio "));let o=t||ae.VAR_NAME,r=null;if(e)r=e;else{let n=a?await re(a):await re();n?.[o]?r=n[o]:process.env[o]&&(r=process.env[o]??null)}r?xt(Ae.green(`\u2713 Database connection configured (using ${o})`)):(Cn(Ae.red(`\u2717 ${o} not found`),"Status"),xt(Ae.yellow("\u26A0 No database connection configured")))};import{intro as An,outro as Sn}from"@clack/prompts";import Pt from"picocolors";var Ot={name:"db-studio",type:"module",version:"1.6.2",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",prepack:"cd ../core && bun run build && cd ../server && bun run build",start:"node dist/index.js",check:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^1.19.7","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",dotenv:"^17.3.1",hono:"^4.10.4",mssql:"^12.2.0",mysql2:"^3.18.2",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@types/node":"^20.11.17","@types/pg":"^8.16.0","@types/mssql":"^9.1.9","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^5.8.3",vitest:"^4.0.17"}};var It=()=>{An(Pt.inverse(" db-studio ")),Sn(Pt.green(`\u{1F680} db-studio v${Ot.version}`))};var ji=async()=>{let{env:a,port:e,databaseUrl:t,varName:o,status:r,help:n,version:l}=At();n&&(Lt(),process.exit(0)),l&&(It(),process.exit(0)),r&&(await Mt(a,t,o),process.exit(0)),Fi(ft.inverse(" db-studio "));let i=e?parseInt(e,10):ae.PORT,s=o||ae.VAR_NAME,c=a?await re(a):await re(),m=t||await wt(c,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(nn(),rn)),{app:u}=p();Bi({fetch:u.fetch,port:i}),Hi(ft.green(`Server running at ${ft.cyan(`http://localhost:${i}`)}`))};ji().catch(a=>{process.exit(1)});export{ji as main};
|
|
718
|
+
`,{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 ts=f(()=>{"use strict";h()});import{utils as Le,write as Kc}from"xlsx";function os({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=Kc(s,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var as=f(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as Vc}from"hono";var ns,rs=f(()=>{"use strict";X();qr();Ur();xe();Hr();Vr();Yr();Jr();Zr();ts();as();ns=new Vc().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 Wr({tableName:o,db:e,...a}):n==="mongodb"?await Br({tableName:o,db:e,...a}):await $r({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",pt),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 Xr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await jr({tableName:o,columnName:a,db:e,...n}):await es({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 Gr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await Kr({tableName:o,columnName:a,db:e,...n}):await vr({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=os({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 ss={};Pt(ss,{createServer:()=>Xc});import nt from"path";import{fileURLToPath as Qc}from"url";import{serveStatic as ot}from"@hono/node-server/serve-static";import{zValidator as Wc}from"@hono/zod-validator";import{Hono as Yc}from"hono";import{cors as zc}from"hono/cors";import{logger as Gc}from"hono/logger";import{prettyJSON as Jc}from"hono/pretty-json";var at,Xc,is=f(()=>{"use strict";X();Ko();pa();_r();Lr();Pr();rs();at=()=>{if(process.env.NODE_ENV==="development")return nt.resolve(process.cwd(),"../core/dist");let t=nt.dirname(Qc(import.meta.url));return nt.resolve(t,"./core-dist")},Xc=()=>({app:new Yc({strict:!1}).use("/*",zc()).use(Jc({space:2})).use(process.env.NODE_ENV==="development"?Gc():(e,o)=>o()).use("/favicon.ico",ot({path:nt.resolve(at(),"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("/",Dr).use("/assets/*",ot({root:at()})).use("/image.png",ot({root:at()})).use("/:dbType/*",Wc("param",Zt,jo)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",ns).route("/:dbType",Or).route("/:dbType",xr).route("/:dbType",ua).use("/*",ot({root:at()}))})});Pe();import{intro as Zc,outro as el}from"@clack/prompts";import{serve as tl}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 ms}from"fs/promises";import{resolve as us}from"path";import{cancel as Ie,isCancel as st,note as jt,select as ps,spinner as ds,text as Kt}from"@clack/prompts";import{parse as fs}from"dotenv";import it 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=ds();a.start("Looking for database connection..."),t?jt(it.red(`${o} not found in .env or process.env`)):jt(it.red(`No .env file found and ${o} not set in process.env`));let n=await ps({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((st(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"}});st(s)&&(Ie("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=us(s);try{let i=await ms(c,"utf-8"),l=fs(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: ${it.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 st(r)&&(Ie("Cancelled."),process.exit(0)),r.trim()};import{access as bs,readFile as ys}from"fs/promises";import{dirname as gs,resolve as ct}from"path";import{parse as Ts}from"dotenv";var Es=async t=>{let e=ct(t);for(;;){let o=ct(e,".env");try{return await bs(o),o}catch{}let a=gs(e);if(a===e)return null;e=a}},ue=async t=>{let e;if(t?e=ct(t):e=await Es(process.cwd()),!e)return null;try{let o=await ys(e,"utf-8");return Ts(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};rt();import{intro as hs,outro as Cs}from"@clack/prompts";import Qt from"picocolors";var Wt=()=>{hs(Qt.inverse(" db-studio ")),Cs(Qt.green(`For more information, visit: ${Ut.SITE_DOCS_LINK}`))};Pe();import{intro as Ss,note as Ns,outro as Yt}from"@clack/prompts";import $e from"picocolors";var zt=async(t,e,o)=>{Ss($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})`)):(Ns($e.red(`\u2717 ${a} not found`),"Status"),Yt($e.yellow("\u26A0 No database connection configured")))};import{intro as As,outro as ws}from"@clack/prompts";import Jt from"picocolors";var Gt={name:"db-studio",type:"module",version:"1.7.2",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",prepack:"cd ../core && bun run build && cd ../server && bun run build",start:"node dist/index.js",check:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^1.19.7","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",dotenv:"^17.3.1",hono:"^4.10.4",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=()=>{As(Jt.inverse(" db-studio ")),ws(Jt.green(`\u{1F680} db-studio v${Gt.version}`))};var ol=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)),Zc(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(()=>(is(),ss)),{app:u}=p();tl({fetch:u.fetch,port:c}),el(Lt.green(`Server running at ${Lt.cyan(`http://localhost:${c}`)}`))};ol().catch(t=>{process.exit(1)});export{ol as main};
|
|
659
719
|
//# sourceMappingURL=index.js.map
|