db-studio 1.7.7 → 1.7.9
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-BU3Kyxsk.js → _pathlessLayout-Dh-wnEbU.js} +2 -2
- package/dist/core-dist/assets/{_queryId-CCHTTBV8.js → _queryId-k0QvsBGf.js} +1 -1
- package/dist/core-dist/assets/{_table-CJoa4R3j.js → _table-BuJCKd_h.js} +3 -3
- package/dist/core-dist/assets/{_table-DUXAj26I.js → _table-cCBv5kB-.js} +1 -1
- package/dist/core-dist/assets/{cdoe-editor-D9sNd-1b.js → cdoe-editor-IGx3GQWB.js} +1 -1
- package/dist/core-dist/assets/chat-sidebar-D2GaNd69.js +2 -0
- package/dist/core-dist/assets/{dist-BEhHk7ZM.js → dist-ZzQZZhtF.js} +1 -1
- package/dist/core-dist/assets/{dist-BI9dZvr6.js → dist-v6aWpqmu.js} +1 -1
- package/dist/core-dist/assets/{index-CcB1R3kx.js → index-BtQYs6UF.js} +11 -11
- package/dist/core-dist/assets/{queries.store-CitCTkPZ.js → queries.store-BtuppsNj.js} +1 -1
- package/dist/core-dist/assets/{runner-Be0RXHJn.js → runner-VSPg2lHo.js} +1 -1
- package/dist/core-dist/assets/{runner-tab-_ttjqcHa.js → runner-tab-BQH-lTnK.js} +3 -3
- package/dist/core-dist/assets/{scroll-area-B6qID65r.js → scroll-area-BnT9xy-y.js} +1 -1
- package/dist/core-dist/assets/{tooltip-BpcLhRow.js → tooltip-B3DXDN3Y.js} +1 -1
- package/dist/core-dist/assets/{use-delete-column-DUq6S2en.js → use-delete-column-B-oY2CU8.js} +1 -1
- package/dist/core-dist/assets/use-rate-limit-BenJo7Lk.js +1 -0
- package/dist/core-dist/index.html +1 -1
- package/dist/index.js +79 -77
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/core-dist/assets/chat-sidebar-Bsby7756.js +0 -2
- package/dist/core-dist/assets/use-rate-limit-HDhI0oS3.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
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 de}from"zod";var w,Ds,qe,Vl,Zt,ee,Q=f(()=>{"use strict";w=de.object({db:de.string("Database name is required")}),Ds=["pg","mysql","mssql","mongodb"],qe=de.enum(Ds,{message:"Invalid database type"}),Vl=w.extend({dbType:qe}),Zt=de.object({dbType:qe}),ee=de.object({tableName:de.string("Table name is required")})});import{z}from"zod";var G,zl,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)}),zl=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,tm,om,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")}),tm=W.object({db:w.shape.db,tableName:K.shape.tableName,columnName:K.shape.columnName,cascade:W.boolean().optional()}),om=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,im,no=f(()=>{"use strict";Q();ke();Ae=Re.object({columnType:Re.string("Column type is required"),isNullable:Re.boolean(),defaultValue:Re.string().nullable().optional()}),im=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 fe}from"zod";var so,io=f(()=>{"use strict";so=fe.object({tableName:fe.string().min(1,"Table name is required"),records:fe.array(fe.record(fe.string(),fe.any())).min(1,"At least one record is required")})});import{z as ie}from"zod";var co,lo=f(()=>{"use strict";Q();co=ie.object({messages:ie.array(ie.object({role:ie.enum(["user","assistant","system","tool"]),content:ie.string().nullable()})),data:ie.object({conversationId:ie.string().optional(),db:w.shape.db})})});var mo=f(()=>{"use strict"});import{z as V}from"zod";var _s,Ms,I,xs,Ls,bm,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),bm=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,Nm,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")}),Nm=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,vm,Io=f(()=>{"use strict";Q();ke();pt=ut.object({newColumnName:ut.string("New column name is required")}),vm=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 Hm,ve,jm,Us,Km,$o,qo=f(()=>{"use strict";Q();Hm=M.object({columnName:M.string(),operator:M.string(),value:M.string()}),ve=["asc","desc"],jm=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()}),Km=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 Wm,ko=f(()=>{"use strict";Wm=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 Gm,Uo=f(()=>{"use strict";Gm=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:()=>le,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,ce,C,S,R,le,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}},i=await new Ks.ConnectionPool(r).connect();i.on("error",c=>{}),this.mssqlPools.set(o,i)}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())]}},ce=new ft,C=t=>ce.getPgPool(t),S=t=>ce.getMysqlPool(t),R=async t=>ce.getMssqlPool(t),le=()=>ce.getDbType(),Fe=()=>ce.getMongoClient(),Be=()=>ce.getMongoDbName(),x=t=>ce.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,i=await e.collection(r).estimatedDocumentCount();a.push({tableName:r,rowCount:i})}return a}async function Ke({tableName:t,db:e}){let n=await(await x(e)).collection(t).find({}).limit(Ws).toArray(),r=n.length,i=new Map,c=(s,l)=>{let m=zs(l);if(!i.has(s))i.set(s,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=i.get(s);p&&(p.types.add(m),p.presentCount+=1)}};for(let s of n)for(let[l,m]of Object.entries(s)){if(m==null){if(!i.has(l))i.set(l,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=i.get(l);p&&(p.nullable=!0),p&&(p.presentCount+=1)}continue}c(l,m)}if(r>0)for(let s of i.values())s.presentCount<r&&(s.nullable=!0);return i.has("_id")||i.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:r}),Array.from(i.entries()).map(([s,l])=>{let m=l.types.values().next().value??"text";return{columnName:s,dataType:m,dataTypeLabel:Gs(m),isNullable:l.nullable,columnDefault:null,isPrimaryKey:s==="_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:i,db:c}){let l=(await x(c)).collection(t),m=Js(i??[]),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 i={},c=[];for(let s of r){let l=Qs(s.columnType);if(!zo.has(l))throw new Wo(400,{message:`Unsupported MongoDB BSON type "${s.columnType}" for field "${s.columnName}"`});s.isArray?i[s.columnName]={bsonType:"array",...l!=="array"?{items:{bsonType:l}}:{}}:i[s.columnName]={bsonType:l},s.isNullable||c.push(s.columnName)}await a.createCollection(t,{validator:{$jsonSchema:{bsonType:"object",required:c,properties:i,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,me,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 i=Number(r);return!Number.isNaN(i)&&r!==""?i:He(r)?je(r):r};for(let n of t){let r=n.columnName,i=a(n.value),c=n.operator.toLowerCase();if(r)switch(c){case"=":e.push({[r]:i});break;case"!=":e.push({[r]:{$ne:i}});break;case">":e.push({[r]:{$gt:i}});break;case">=":e.push({[r]:{$gte:i}});break;case"<":e.push({[r]:{$lt:i}});break;case"<=":e.push({[r]:{$lte:i}});break;case"is":e.push({[r]:i});break;case"is not":e.push({[r]:{$ne:i}});break;case"like":e.push({[r]:{$regex:o(String(i)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:o(String(i)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:o(String(i)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:o(String(i)),$options:"i"}}});break;default:e.push({[r]:i});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,me=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=`
|
|
2
|
+
var ls=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pt=(t,e)=>{for(var o in e)ls(t,o,{get:e[o],enumerable:!0})};var It=f(()=>{"use strict"});var $t=f(()=>{"use strict"});var qt=f(()=>{"use strict"});var kt,oe,vt=f(()=>{"use strict";kt=globalThis.process?.env?.NODE_ENV,oe={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",IS_DEV:kt==="development",PROXY_URL:kt==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var Ut=f(()=>{"use strict"});var Ft,rt=f(()=>{"use strict";Ft={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 Bt=f(()=>{"use strict"});var Pe=f(()=>{"use strict";It();$t();qt();vt();Ut();rt();Bt()});import{z as de}from"zod";var w,Ds,qe,Ql,eo,te,Q=f(()=>{"use strict";w=de.object({db:de.string("Database name is required")}),Ds=["pg","mysql","mssql","mongodb"],qe=de.enum(Ds,{message:"Invalid database type"}),Ql=w.extend({dbType:qe}),eo=de.object({dbType:qe}),te=de.object({tableName:de.string("Table name is required")})});import{z as G}from"zod";var J,Gl,to=f(()=>{"use strict";Q();J=G.object({columnName:G.string("Column name is required"),columnType:G.string("Column type is required"),defaultValue:G.string().optional(),isPrimaryKey:G.boolean().default(!1),isNullable:G.boolean().default(!1),isUnique:G.boolean().default(!1),isIdentity:G.boolean().default(!1),isArray:G.boolean().default(!1)}),Gl=G.object({db:w.shape.db,tableName:te.shape.tableName,columnName:J.shape.columnName,columnType:J.shape.columnType,defaultValue:J.shape.defaultValue,isPrimaryKey:J.shape.isPrimaryKey,isNullable:J.shape.isNullable,isUnique:J.shape.isUnique,isIdentity:J.shape.isIdentity,isArray:J.shape.isArray})});import{z as Ne}from"zod";var oo,ao=f(()=>{"use strict";oo=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 no,K,om,am,ke=f(()=>{"use strict";Q();no=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,ro=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 so=f(()=>{"use strict"});import{z as fe}from"zod";var io,co=f(()=>{"use strict";io=fe.object({tableName:fe.string().min(1,"Table name is required"),records:fe.array(fe.record(fe.string(),fe.any())).min(1,"At least one record is required")})});import{z as Y}from"zod";var _s,lo,mo=f(()=>{"use strict";Q();_s=Y.object({type:Y.string(),content:Y.string().optional()}).passthrough(),lo=Y.object({messages:Y.array(Y.object({id:Y.string(),role:Y.enum(["user","assistant","system","tool"]),parts:Y.array(_s)}).passthrough()),data:Y.object({conversationId:Y.string().optional(),db:w.shape.db})})});var uo=f(()=>{"use strict"});import{z as V}from"zod";var xs,Ms,I,Ls,Os,ym,lt=f(()=>{"use strict";xs=["text","boolean","number","enum","json","date","array"],Ms=V.enum(xs),I={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},Ls=["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"],Os=V.enum(Ls),ym=V.object({columnName:V.string(),dataType:Ms,dataTypeLabel:Os,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 po(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 fo(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 bo(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 yo(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 go(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 To(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,Eo=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 Ps,ho,Is,$s,Co,So=f(()=>{"use strict";Ps=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],ho=U.enum(Ps),Is=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)}),$s=U.object({columnName:U.string("Column name is required"),referencedTable:U.string("Referenced table is required"),referencedColumn:U.string("Referenced column is required"),onUpdate:ho.default("NO ACTION"),onDelete:ho.default("NO ACTION")}),Co=U.object({tableName:U.string("Table name is required"),fields:U.array(Is).min(1,"At least one field is required"),foreignKeys:U.array($s).optional()})});import{z as B}from"zod";var qs,Rm,No,Ro=f(()=>{"use strict";Q();qs=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(qs),dbType:qe}),No=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 Ao=f(()=>{"use strict"});import{z as be}from"zod";var mt,wo=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 ks}from"zod";var Do,_o=f(()=>{"use strict";Q();Do=w.extend({cascade:ks.string().optional().transform(t=>t==="true")})});import{z as xo}from"zod";var Mo,Lo=f(()=>{"use strict";Mo=xo.object({query:xo.string("Query is required")})});import{z as vs}from"zod";var Us,Oo,Po=f(()=>{"use strict";Q();Us=["csv","xlsx","json"],Oo=w.extend({format:vs.enum(Us,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var Io=f(()=>{"use strict"});import{z as ut}from"zod";var pt,Um,$o=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 x}from"zod";var jm,ve,Km,Fs,Vm,qo,ko=f(()=>{"use strict";Q();jm=x.object({columnName:x.string(),operator:x.string(),value:x.string()}),ve=["asc","desc"],Km=x.object({columnName:x.string(),direction:x.enum(ve)}),Fs=x.object({limit:x.number(),total:x.number(),hasNextPage:x.boolean(),hasPreviousPage:x.boolean(),nextCursor:x.string().nullable(),prevCursor:x.string().nullable()}),Vm=x.object({data:x.array(x.record(x.string(),x.unknown())),meta:Fs}),qo=x.object({db:w.shape.db,cursor:x.string().optional(),limit:x.string().optional().default("50").transform(Number),direction:x.enum(ve).optional().default(ve[0]),sort:x.string().optional().transform(t=>{if(!t)return"";try{let e=JSON.parse(t);return Array.isArray(e)?e:t}catch{return t}}),order:x.enum(ve).optional(),filters:x.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})})});import{z as Ue}from"zod";var Ym,vo=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 Uo}from"zod";var Jm,Fo=f(()=>{"use strict";Jm=Uo.object({schema:Uo.string()})});import{z as X}from"zod";var Bo,Ho=f(()=>{"use strict";Bo=X.object({tableName:X.string("Table name is required"),primaryKey:X.string("Primary key is required").default("id"),updates:X.array(X.object({rowData:X.record(X.string("Column name is required"),X.any()),columnName:X.string("Column name is required"),value:X.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Z=f(()=>{"use strict";to();ao();ro();so();co();mo();uo();Eo();lt();So();Q();Ro();Ao();ke();wo();_o();Lo();Po();Io();$o();ko();vo();Fo();Ho()});import{HTTPException as Bs}from"hono/http-exception";import{DatabaseError as Hs}from"pg";import{ZodError as js}from"zod";function jo(t,e){if(t instanceof Bs)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof js){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 Hs&&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 Ko,Vo=f(()=>{"use strict";Ko=(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 Wo={};Pt(Wo,{coerceObjectId:()=>je,getDbPool:()=>C,getDbType:()=>le,getMongoClient:()=>Fe,getMongoDb:()=>M,getMongoDbName:()=>Be,getMssqlPool:()=>R,getMysqlPool:()=>S,isValidObjectId:()=>He});import{MongoClient as Ks,ObjectId as dt}from"mongodb";import Vs from"mssql";import{createPool as Qs}from"mysql2/promise";import{Pool as Qo}from"pg";var ft,ce,C,S,R,le,Fe,Be,M,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 Qo(a);n.on("error",r=>{}),this.pgPools.set(o,n)}return this.pgPools.get(o)??new Qo({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=Qs({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}},i=await new Vs.ConnectionPool(r).connect();i.on("error",c=>{}),this.mssqlPools.set(o,i)}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 Ks(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())]}},ce=new ft,C=t=>ce.getPgPool(t),S=t=>ce.getMysqlPool(t),R=async t=>ce.getMssqlPool(t),le=()=>ce.getDbType(),Fe=()=>ce.getMongoClient(),Be=()=>ce.getMongoDbName(),M=t=>ce.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 Yo}from"hono/http-exception";async function Xo(t){let e=await M(t),o=await e.listCollections().toArray(),a=[];for(let n of o){let r=n.name,i=await e.collection(r).estimatedDocumentCount();a.push({tableName:r,rowCount:i})}return a}async function Ke({tableName:t,db:e}){let n=await(await M(e)).collection(t).find({}).limit(Ys).toArray(),r=n.length,i=new Map,c=(s,l)=>{let m=Gs(l);if(!i.has(s))i.set(s,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=i.get(s);p&&(p.types.add(m),p.presentCount+=1)}};for(let s of n)for(let[l,m]of Object.entries(s)){if(m==null){if(!i.has(l))i.set(l,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=i.get(l);p&&(p.nullable=!0),p&&(p.presentCount+=1)}continue}c(l,m)}if(r>0)for(let s of i.values())s.presentCount<r&&(s.nullable=!0);return i.has("_id")||i.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:r}),Array.from(i.entries()).map(([s,l])=>{let m=l.types.values().next().value??"text";return{columnName:s,dataType:m,dataTypeLabel:Js(m),isNullable:l.nullable,columnDefault:null,isPrimaryKey:s==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}async function Zo({tableName:t,cursor:e,limit:o,direction:a,sort:n,order:r,filters:i,db:c}){let l=(await M(c)).collection(t),m=Xs(i??[]),p=Jo(n??"",r),u=o&&o>0?o:50,d=zs(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?zo(A):null,prevCursor:y>0?zo(q):null}}}async function ea({tableName:t,tableData:e,db:o}){let a=await M(o);if((await a.listCollections({name:t}).toArray()).length>0)throw new Yo(400,{message:`Collection "${t}" already exists`});let r=e?.fields??[];if(r.length===0){await a.createCollection(t);return}let i={},c=[];for(let s of r){let l=Ws(s.columnType);if(!Go.has(l))throw new Yo(400,{message:`Unsupported MongoDB BSON type "${s.columnType}" for field "${s.columnName}"`});s.isArray?i[s.columnName]={bsonType:"array",...l!=="array"?{items:{bsonType:l}}:{}}:i[s.columnName]={bsonType:l},s.isNullable||c.push(s.columnName)}await a.createCollection(t,{validator:{$jsonSchema:{bsonType:"object",required:c,properties:i,additionalProperties:!0}},validationAction:"error"})}async function ta({tableName:t,columnName:e,db:o}){return{deletedCount:(await(await M(o)).collection(t).updateMany({},{$unset:{[e]:""}})).modifiedCount}}async function oa({tableName:t,db:e}){let r=(await(await M(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 Go,Ws,Ys,zo,zs,we,Gs,Js,Xs,Jo,ae,aa,me,bt,ye=f(()=>{"use strict";h();Go=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Ws=t=>{let e=t.trim();if(Go.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Ys=200,zo=t=>Buffer.from(JSON.stringify({offset:t})).toString("base64url"),zs=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},Gs=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",Js=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"}},Xs=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 i=Number(r);return!Number.isNaN(i)&&r!==""?i:He(r)?je(r):r};for(let n of t){let r=n.columnName,i=a(n.value),c=n.operator.toLowerCase();if(r)switch(c){case"=":e.push({[r]:i});break;case"!=":e.push({[r]:{$ne:i}});break;case">":e.push({[r]:{$gt:i}});break;case">=":e.push({[r]:{$gte:i}});break;case"<":e.push({[r]:{$lt:i}});break;case"<=":e.push({[r]:{$lte:i}});break;case"is":e.push({[r]:i});break;case"is not":e.push({[r]:{$ne:i}});break;case"like":e.push({[r]:{$regex:o(String(i)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:o(String(i)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:o(String(i)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:o(String(i)),$options:"i"}}});break;default:e.push({[r]:i});break}}return e.length?{$and:e}:{}},Jo=(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}};ae=we,aa=Jo,me=je,bt=He});async function na(t,e={}){let{includeSampleData:o=!1,maxTables:a}=e,n=await M(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(Zs)};if(o){let g=(await n.collection(m).find({}).limit(3).toArray()).map(y=>ae(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 Zs,ra=f(()=>{"use strict";h();ye();Zs=t=>({name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable,isPrimaryKey:t.isPrimaryKey})});import{Pool as ei}from"pg";var Ve,ti,yt,sa=f(()=>{"use strict";Ve=null,ti=()=>{if(!Ve){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{Ve=new ei({connectionString:process.env.DATABASE_URL}),Ve.on("error",t=>{})}catch(t){throw t}}return Ve},yt=new Proxy({},{get(t,e){try{return ti()[e]}catch(o){throw o}}})});import{HTTPException as oi}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,18 @@ var cs=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pt=(t,e)=>{f
|
|
|
48
48
|
WHERE c.table_schema = 'public'
|
|
49
49
|
AND c.table_name = $1
|
|
50
50
|
ORDER BY c.ordinal_position;
|
|
51
|
-
`,{rows:n}=await o.query(a,[t]);if(!n||n.length===0)throw new
|
|
51
|
+
`,{rows:n}=await o.query(a,[t]);if(!n||n.length===0)throw new oi(404,{message:`Table "${t}" does not exist`});return n.map(r=>{let i=null;return r.enumValues&&(Array.isArray(r.enumValues)?i=r.enumValues:typeof r.enumValues=="string"&&(i=r.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:r.columnName,dataType:po(r.dataType),dataTypeLabel:fo(r.dataType),isNullable:r.isNullable,columnDefault:r.columnDefault,isPrimaryKey:r.isPrimaryKey,isForeignKey:r.isForeignKey,referencedTable:r.referencedTable,referencedColumn:r.referencedColumn,enumValues:i}})}var gt=f(()=>{"use strict";Z();h()});async function ni(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:a}=await e.query(o);return a.map(n=>n.table_name)}async function
|
|
57
|
+
`,{rows:a}=await e.query(o);return a.map(n=>n.table_name)}async function ri(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
|
-
`,[t])).rows[0]?.description||void 0}finally{e.release()}}async function
|
|
62
|
+
`,[t])).rows[0]?.description||void 0}finally{e.release()}}async function si(t){let e=await yt.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function ii(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 ci(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 li(t,e={}){if(le()==="mongodb")return na(t,{includeSampleData:e.includeSampleData});let{includeSampleData:o=!1,includeDescriptions:a=!0}=e;try{let r=(await ni(t)).map(async s=>{let[l,m,p]=await Promise.all([Qe({tableName:s,db:t}),a?ri(s):Promise.resolve(void 0),o?si(s):Promise.resolve([])]),u={name:s,columns:l.map(ii)};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}),i=await Promise.all(r),c=ci(i);return{dbType:"pg",tables:i,relationships:c}}catch(n){throw new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}async function ia(t){return li(t,{includeSampleData:!0,includeDescriptions:!0})}var ca=f(()=>{"use strict";ra();sa();h();gt()});function ma(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
63
|
|
|
64
64
|
**Your Role:**
|
|
65
65
|
1. Keep responses SHORT - 2-3 sentences maximum unless generating a query
|
|
@@ -70,9 +70,10 @@ var cs=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pt=(t,e)=>{f
|
|
|
70
70
|
3. Use exact collection/field names from the schema
|
|
71
71
|
4. If query is unclear, ask ONE specific clarifying question
|
|
72
72
|
5. No preamble, no apologies, get straight to the answer
|
|
73
|
+
6. IMPORTANT: When the user asks about collections, fields, or any schema information, answer DIRECTLY from the "Database Context" above \u2014 do NOT generate a query to retrieve schema info you already have
|
|
73
74
|
|
|
74
75
|
**Database Context:**
|
|
75
|
-
${
|
|
76
|
+
${la(t)}
|
|
76
77
|
|
|
77
78
|
**Guidelines:**
|
|
78
79
|
1. Always generate syntactically correct MongoDB queries
|
|
@@ -131,9 +132,10 @@ This will return the top 5 customers by revenue."`:`You are a database assistant
|
|
|
131
132
|
4. Generate valid ${o} syntax
|
|
132
133
|
5. If query is unclear, ask ONE specific clarifying question
|
|
133
134
|
6. No preamble, no apologies, get straight to the answer
|
|
135
|
+
7. IMPORTANT: When the user asks about tables, columns, relationships, or any schema information, answer DIRECTLY from the "Database Context" above \u2014 do NOT generate a SQL query to retrieve schema info you already have
|
|
134
136
|
|
|
135
137
|
**Database Context:**
|
|
136
|
-
${
|
|
138
|
+
${la(t)}
|
|
137
139
|
|
|
138
140
|
**Guidelines:**
|
|
139
141
|
1. Always generate syntactically correct SQL for the database type (${o})
|
|
@@ -171,7 +173,7 @@ LIMIT 5;
|
|
|
171
173
|
|
|
172
174
|
This will return the 5 customers with the highest total order value. You might also want to see:
|
|
173
175
|
- Revenue trends over time for these customers
|
|
174
|
-
- Their most frequently ordered products"`}function
|
|
176
|
+
- Their most frequently ordered products"`}function la(t){let o=`Database Type: ${t.dbType==="pg"?"PostgreSQL":t.dbType}
|
|
175
177
|
|
|
176
178
|
`;o+=`**Tables and Columns:**
|
|
177
179
|
`;for(let a of t.tables){o+=`
|
|
@@ -185,20 +187,20 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
185
187
|
`)}if(t.relationships&&t.relationships.length>0){o+=`
|
|
186
188
|
**Relationships:**
|
|
187
189
|
`;for(let a of t.relationships)o+=` - ${a.fromTable}.${a.fromColumn} -> ${a.toTable}.${a.toColumn}
|
|
188
|
-
`}return o}var
|
|
190
|
+
`}return o}var ua=f(()=>{"use strict"});import{zValidator as mi}from"@hono/zod-validator";import{Hono as ui}from"hono";var pa,da=f(()=>{"use strict";Pe();Z();ca();ua();pa=new ui().basePath("/chat").get("/limit",async t=>{let e=await fetch(`${oe.PROXY_URL}/chat/limit`,{headers:{"cf-connecting-ip":t.req.header("cf-connecting-ip")??"","x-real-ip":t.req.header("x-real-ip")??"","x-forwarded-for":t.req.header("x-forwarded-for")??"","x-api-key":t.req.header("x-api-key")??""}}),o=await e.json();return t.json(o,e.status)}).post("/",mi("json",lo),async t=>{let{messages:e,data:o}=t.req.valid("json"),{db:a,conversationId:n}=o,r=await ia(a),i=ma(r),c={messages:e,conversationId:n,systemPrompt:i},s=await fetch(`${oe.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":t.req.header("cf-connecting-ip")??"","x-real-ip":t.req.header("x-real-ip")??"","x-forwarded-for":t.req.header("x-forwarded-for")??"","x-api-key":t.req.header("x-api-key")??""},body:JSON.stringify(c)});if(!s.ok){let p=await s.json();return t.json({error:p.error||"Proxy request failed"},s.status)}let{readable:l,writable:m}=new TransformStream;return s.body?.pipeTo(m),new Response(l,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})})});import{HTTPException as pi}from"hono/http-exception";async function fa({db:t,params:e}){let{tableName:o,data:a}=e,n=C(t),r=Object.keys(a),i=Object.values(a),c=r.map((p,u)=>`$${u+1}`).join(", "),s=r.map(p=>`"${p}"`).join(", "),l=`
|
|
189
191
|
INSERT INTO "${o}" (${s})
|
|
190
192
|
VALUES (${c})
|
|
191
193
|
RETURNING *
|
|
192
|
-
`,m=await n.query(l,i);if(m.rowCount===0)throw new
|
|
194
|
+
`,m=await n.query(l,i);if(m.rowCount===0)throw new pi(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:m.rowCount??0}}var ba=f(()=>{"use strict";h()});import{HTTPException as We}from"hono/http-exception";var ya,ga=f(()=>{"use strict";h();ya=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]),i=r.map(m=>`"${m}"`).join(", "),c=0,s=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
195
|
INSERT INTO "${t}" (${i})
|
|
194
196
|
VALUES (${d})
|
|
195
197
|
RETURNING *
|
|
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:s===0,message:`Bulk insert completed: ${c} records inserted${s>0?`, ${s} failed`:""}`,successCount:c,failureCount:s,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
|
|
198
|
+
`;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:s===0,message:`Bulk insert completed: ${c} records inserted${s>0?`, ${s} failed`:""}`,successCount:c,failureCount:s,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 Ta({tableData:t,db:e}){let{tableName:o,fields:a,foreignKeys:n}=t,r=C(e),i=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}`)||[],s=[...i,...c],l=`
|
|
197
199
|
CREATE TABLE "${o}" (
|
|
198
200
|
${s.join(`,
|
|
199
201
|
`)}
|
|
200
202
|
);
|
|
201
|
-
`;await r.query(l)}var
|
|
203
|
+
`;await r.query(l)}var Ea=f(()=>{"use strict";h()});function ne(){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 ha(){let t=C(),e=`
|
|
202
204
|
SELECT
|
|
203
205
|
d.datname as name,
|
|
204
206
|
pg_size_pretty(pg_database_size(d.datname)) as size,
|
|
@@ -207,7 +209,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
207
209
|
FROM pg_catalog.pg_database d
|
|
208
210
|
WHERE d.datistemplate = false
|
|
209
211
|
ORDER BY d.datname;
|
|
210
|
-
`,{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No databases returned from database"});return o}async function
|
|
212
|
+
`,{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No databases returned from database"});return o}async function Ca(){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 Sa(){let t=C(),e=`
|
|
211
213
|
SELECT
|
|
212
214
|
version() as version,
|
|
213
215
|
current_database() as database,
|
|
@@ -216,17 +218,17 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
216
218
|
inet_server_port() as port,
|
|
217
219
|
(SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
|
|
218
220
|
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
|
|
219
|
-
`,{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No connection information returned from database"});let a=
|
|
221
|
+
`,{rows:o}=await t.query(e);if(!o[0])throw new Tt(500,{message:"No connection information returned from database"});let a=No.parse(o[0]),n=ne();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 Na=f(()=>{"use strict";Z();h();De()});import{HTTPException as Ra}from"hono/http-exception";async function Aa(t){let{tableName:e,columnName:o,cascade:a,db:n}=t,r=C(n),i=`
|
|
220
222
|
SELECT EXISTS (
|
|
221
223
|
SELECT 1 FROM information_schema.tables
|
|
222
224
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
223
225
|
) as exists;
|
|
224
|
-
`,{rows:c}=await r.query(i,[e]);if(!c[0]?.exists)throw new
|
|
226
|
+
`,{rows:c}=await r.query(i,[e]);if(!c[0]?.exists)throw new Ra(404,{message:`Table "${e}" does not exist`});let s=`
|
|
225
227
|
SELECT EXISTS (
|
|
226
228
|
SELECT 1 FROM information_schema.columns
|
|
227
229
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
228
230
|
) as exists;
|
|
229
|
-
`,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new
|
|
231
|
+
`,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new Ra(404,{message:`Column "${o}" does not exist in table "${e}"`});let p=`ALTER TABLE "${e}" DROP COLUMN "${o}" ${a?"CASCADE":"RESTRICT"}`,{rowCount:u}=await r.query(p);return{deletedCount:u??0}}var wa=f(()=>{"use strict";h()});import{HTTPException as ge}from"hono/http-exception";async function Et(t,e){return(await C(e).query(`
|
|
230
232
|
SELECT
|
|
231
233
|
tc.constraint_name,
|
|
232
234
|
tc.table_name as referencing_table,
|
|
@@ -242,15 +244,15 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
242
244
|
AND ccu.table_schema = tc.table_schema
|
|
243
245
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
244
246
|
AND ccu.table_name = $1
|
|
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
|
|
247
|
+
`,[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 Ti(t,e,o){let a=await Et(t,o);if(a.length===0)return[];let n=[],r=C(o),i=new Map;for(let s of a){let l=`${s.referencingTable}.${s.referencingColumn}`;i.has(l)||i.set(l,[]),i.get(l)?.push(s)}let c=e.map(s=>s.value);for(let[s,l]of i){let m=l[0];if(!m||!e.find(y=>y.columnName===m.referencedColumn))continue;let u=c.map((y,b)=>`$${b+1}`).join(", "),d=`
|
|
246
248
|
SELECT * FROM "${m.referencingTable}"
|
|
247
249
|
WHERE "${m.referencingColumn}" IN (${u})
|
|
248
250
|
LIMIT 100
|
|
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
|
|
251
|
+
`,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 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),i=r.map((s,l)=>`$${l+1}`).join(", "),c=`
|
|
250
252
|
DELETE FROM "${t}"
|
|
251
253
|
WHERE "${n}" IN (${i})
|
|
252
254
|
RETURNING *
|
|
253
|
-
`;try{await a.query("BEGIN");let s=await a.query(c,r);return await a.query("COMMIT"),{deletedCount:s.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(s){if(await a.query("ROLLBACK"),s.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await
|
|
255
|
+
`;try{await a.query("BEGIN");let s=await a.query(c,r);return await a.query("COMMIT"),{deletedCount:s.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(s){if(await a.query("ROLLBACK"),s.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await Ti(t,e,o)};throw s instanceof ge?s:new ge(500,{message:`Failed to delete records from "${t}"`})}}async function _a({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);await a.query("BEGIN");try{let i=await Et(t,o),c=0,s=new Set,l=async(g,y,b)=>{let E=await Et(g,o);for(let k of E){let H=b.map((F,z)=>`$${z+1}`).join(", "),j=`
|
|
254
256
|
SELECT "${k.referencedColumn}" FROM "${g}"
|
|
255
257
|
WHERE "${y}" IN (${H})
|
|
256
258
|
`,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=`
|
|
@@ -260,7 +262,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
260
262
|
DELETE FROM "${t}"
|
|
261
263
|
WHERE "${n}" IN (${m})
|
|
262
264
|
RETURNING *
|
|
263
|
-
`,u=await a.query(p,r);return await a.query("COMMIT"),{deletedCount:(u.rowCount??0)+c}}catch(i){throw await a.query("ROLLBACK"),i instanceof ge?i:new ge(500,{message:`Failed to force delete records from "${t}"`})}}var
|
|
265
|
+
`,u=await a.query(p,r);return await a.query("COMMIT"),{deletedCount:(u.rowCount??0)+c}}catch(i){throw await a.query("ROLLBACK"),i instanceof ge?i:new ge(500,{message:`Failed to force delete records from "${t}"`})}}var xa=f(()=>{"use strict";h()});import{HTTPException as ht}from"hono/http-exception";async function hi(t,e){return(await C(e).query(`
|
|
264
266
|
SELECT
|
|
265
267
|
tc.constraint_name,
|
|
266
268
|
tc.table_name as referencing_table,
|
|
@@ -276,15 +278,15 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
276
278
|
AND ccu.table_schema = tc.table_schema
|
|
277
279
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
278
280
|
AND ccu.table_name = $1
|
|
279
|
-
`,[t])).rows.map(r=>({constraintName:r.constraint_name,referencingTable:r.referencing_table,referencingColumn:r.referencing_column,referencedTable:r.referenced_table,referencedColumn:r.referenced_column}))}async function Ma(t,e){let o=await
|
|
281
|
+
`,[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 hi(t,e);if(o.length===0)return[];let a=[],n=C(e);for(let r of o){let i=`
|
|
280
282
|
SELECT * FROM "${r.referencingTable}"
|
|
281
283
|
LIMIT 100
|
|
282
|
-
`,c=await n.query(i);c.rows.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:c.rows})}return a}async function
|
|
284
|
+
`,c=await n.query(i);c.rows.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:c.rows})}return a}async function Ci(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 La(t){let{tableName:e,db:o,cascade:a}=t,n=C(o),r=`
|
|
283
285
|
SELECT EXISTS (
|
|
284
286
|
SELECT 1 FROM information_schema.tables
|
|
285
287
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
286
288
|
) as exists;
|
|
287
|
-
`,{rows:i}=await n.query(r,[e]);if(!i[0]?.exists)throw new ht(404,{message:`Table "${e}" does not exist`});let c=await
|
|
289
|
+
`,{rows:i}=await n.query(r,[e]);if(!i[0]?.exists)throw new ht(404,{message:`Table "${e}" does not exist`});let c=await Ci(e,o);if(!a){let s=await Ma(e,o);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{let l=`DROP TABLE "${e}" ${a?"CASCADE":"RESTRICT"}`;return await n.query(l),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(s){if(s.code==="2BP01")return{deletedCount:0,fkViolation:!0,relatedRecords:await Ma(e,o)};throw s instanceof ht?s:new ht(500,{message:`Failed to delete table "${e}"`})}}var Oa=f(()=>{"use strict";h()});import{HTTPException as Ni}from"hono/http-exception";async function Pa({tableName:t,db:e}){let o=C(e),{rows:a}=await o.query(`SELECT * FROM "${t}"`);if(!a||a.length===0)throw new Ni(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}var Ia=f(()=>{"use strict";h()});import{HTTPException as $a}from"hono/http-exception";var qa,ka=f(()=>{"use strict";h();ye();qa=async({tableName:t,records:e,db:o})=>{if(!e||e.length===0)throw new $a(400,{message:"At least one record is required"});let n=(await M(o)).collection(t),r=e.map(i=>{let c=ae(i);return(c._id===""||c._id===null)&&delete c._id,c});try{let i=await n.insertMany(r,{ordered:!1});return{success:!0,message:`Successfully inserted ${i.insertedCount} record${i.insertedCount!==1?"s":""}`,successCount:i.insertedCount,failureCount:e.length-i.insertedCount}}catch(i){throw new $a(500,{message:`Bulk insert failed: ${i instanceof Error?i.message:String(i)}`})}}});import{HTTPException as Ai}from"hono/http-exception";async function va(){let a=(await(await Fe()).db().admin().listDatabases()).databases??[];if(!a[0])throw new Ai(500,{message:"No databases returned from MongoDB"});return a.map(n=>({name:n.name,size:wi(n.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}async function Ua(){return{db:Be()}}async function Fa(){let e=(await Fe()).db().admin(),o=ne(),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 wi,Ba=f(()=>{"use strict";h();De();wi=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 re}from"hono/http-exception";var Te,Ha,ja=f(()=>{"use strict";h();ye();Te=t=>{if(t._id&&typeof t._id=="string")return{...t,_id:me(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"?me(o):o)}};if(Array.isArray(e.$nin))return{...t,_id:{...e,$nin:e.$nin.map(o=>typeof o=="string"?me(o):o)}}}return t},Ha=async({query:t,db:e})=>{if(!t||!t.trim())throw new re(400,{message:"Query is required"});let o;try{o=JSON.parse(t)}catch{throw new re(400,{message:"Mongo query must be valid JSON"})}if(!o.collection||!o.operation)throw new re(400,{message:"Mongo query must include collection and operation"});let n=(await M(e)).collection(o.collection),r=performance.now(),i=[],c=0,s;switch(o.operation){case"find":{let u=Te(o.filter??{}),d=n.find(u,o.options??{}),g=o.sort??aa("",void 0);d.sort(g),o.skip&&d.skip(o.skip),o.limit&&d.limit(o.limit),i=await d.toArray(),c=i.length;break}case"aggregate":{let u=o.pipeline??[];i=await n.aggregate(u,o.options??{}).toArray(),c=i.length;break}case"insertOne":{let u=o.document;if(!u)throw new re(400,{message:"document is required"});c=(await n.insertOne(u)).insertedId?1:0,s="OK";break}case"insertMany":{let u=o.document;if(!Array.isArray(u))throw new re(400,{message:"document array is required"});c=(await n.insertMany(u)).insertedCount??0,s="OK";break}case"updateOne":{let u=Te(o.filter??{});if(!o.update)throw new re(400,{message:"update is required"});let d=await n.updateOne(u,o.update,o.options??{});c=d.matchedCount??0,s=`OK (${d.modifiedCount??0} modified)`;break}case"updateMany":{let u=Te(o.filter??{});if(!o.update)throw new re(400,{message:"update is required"});let d=await n.updateMany(u,o.update,o.options??{});c=d.matchedCount??0,s=`OK (${d.modifiedCount??0} modified)`;break}case"deleteOne":{let u=Te(o.filter??{});c=(await n.deleteOne(u,o.options??{})).deletedCount??0,s="OK";break}case"deleteMany":{let u=Te(o.filter??{});c=(await n.deleteMany(u,o.options??{})).deletedCount??0,s="OK";break}case"count":{let u=Te(o.filter??{});c=await n.countDocuments(u),i=[{count:c}],s="OK";break}default:throw new re(400,{message:"Unsupported Mongo operation"})}let l=performance.now()-r,m=i.map(u=>ae(u));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:c,duration:l,message:s}}});import{HTTPException as Ct}from"hono/http-exception";async function Ka({db:t,params:e}){let{tableName:o,data:a}=e,r=(await M(t)).collection(o),i=ae(a);if((i._id===""||i._id===null)&&delete i._id,!(await r.insertOne(i)).insertedId)throw new Ct(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:1}}async function Va({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,i=(await M(e)).collection(o),c=0,s=n||"_id",l=new Map;for(let m of a){let p=m.rowData[s];if(p==null)throw new Ct(400,{message:`Primary key "${s}" 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=s==="_id"&&bt(m)?me(m):m,d=await i.updateOne({[s]:u},{$set:p});if(d.matchedCount===0)throw new Ct(404,{message:`Record with ${s} = ${String(m)} not found in "${o}"`});c+=d.modifiedCount}return{updatedCount:c}}async function St({tableName:t,primaryKeys:e,db:o}){let n=(await M(o)).collection(t),r=e[0]?.columnName??"_id",i=e.map(s=>r==="_id"&&bt(s.value)?me(s.value):s.value);return{deletedCount:(await n.deleteMany({[r]:{$in:i}})).deletedCount??0}}async function Qa({tableName:t,primaryKeys:e,db:o}){return{deletedCount:(await St({tableName:t,primaryKeys:e,db:o})).deletedCount}}var Wa=f(()=>{"use strict";h();ye()});import{HTTPException as Di}from"hono/http-exception";async function Ya({tableName:t,db:e}){let o=await M(e);if((await o.listCollections({name:t}).toArray()).length===0)throw new Di(404,{message:`Collection "${t}" does not exist`});let n=o.collection(t),r=await n.find({}).limit(_i).toArray(),i=await n.estimatedDocumentCount(),c=new Map,s=new Map;for(let u of r)for(let[d,g]of Object.entries(u)){let y=xi(g);c.has(d)||(c.set(d,new Set),s.set(d,0)),c.get(d)?.add(y),s.set(d,(s.get(d)??0)+1)}let l={},m=[];for(let[u,d]of c.entries()){let g=s.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:i,sampledDocuments:r.length,jsonSchema:{bsonType:"object",required:m.length>0?m:void 0,properties:l}};return JSON.stringify(p,null,2)}var _i,xi,za=f(()=>{"use strict";h();_i=200,xi=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 Li(t){let e=t.match(/'([^']+)'/g);return!e||e.length===0?null:e.map(o=>o.slice(1,-1))}async function se({tableName:t,db:e}){let o=await R(e),n=await o.request().input("tableName",t).query(`
|
|
288
290
|
SELECT
|
|
289
291
|
c.COLUMN_NAME AS columnName,
|
|
290
292
|
c.DATA_TYPE AS dataType,
|
|
@@ -346,18 +348,18 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
346
348
|
AND cc.TABLE_SCHEMA = 'dbo'
|
|
347
349
|
WHERE cc.TABLE_NAME = @tableName
|
|
348
350
|
AND cc.TABLE_CATALOG = DB_NAME()
|
|
349
|
-
`),i=new Map;for(let c of r.recordset){let s=
|
|
351
|
+
`),i=new Map;for(let c of r.recordset){let s=Li(c.checkClause);s&&i.set(c.columnName,s)}return n.recordset.map(c=>{let s=c.dataType,l=i.get(c.columnName)??null;return{columnName:c.columnName,dataType:l?"enum":go(s),dataTypeLabel:l?"enum":To(s),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";Z();h()});import{HTTPException as Pi}from"hono/http-exception";async function Ga({db:t,params:e}){let{tableName:o,data:a}=e,n=await R(t),r=await se({tableName:o,db:t}),i=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"),s=new Set(c.recordset.map(b=>b.name)),l=Object.keys(a).filter(b=>!s.has(b)),m=l.map(b=>{let E=a[b];return i.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
352
|
INSERT INTO [${o}] (${p})
|
|
351
353
|
VALUES (${u})
|
|
352
|
-
`,g=n.request();l.forEach((b,E)=>{g.input(`param${E}`,m[E])});let y=await g.query(d);if(y.rowsAffected[0]===0)throw new
|
|
354
|
+
`,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 Pi(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:y.rowsAffected[0]??0}}var Ja=f(()=>{"use strict";h();_e()});import{HTTPException as Ye}from"hono/http-exception";var Xa,Za=f(()=>{"use strict";h();_e();Xa=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]),i=r.map(l=>`[${l}]`).join(", "),c=await se({tableName:t,db:o}),s=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 s.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
355
|
INSERT INTO [${t}] (${i})
|
|
354
356
|
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
|
|
357
|
+
`;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 qi(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 ki(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 en({tableData:t,db:e}){let{tableName:o,fields:a,foreignKeys:n}=t,r=await R(e),i=a.map(u=>{let d=ki(u.columnType,u.isArray??!1),g=`[${u.columnName}] ${d}`;if(!u.isNullable&&!u.isPrimaryKey&&(g+=" NOT NULL"),u.defaultValue&&!d.includes("IDENTITY")){let y=qi(u.defaultValue,d);y!==null&&(g+=` DEFAULT ${y}`)}return g}),c=a.filter(u=>u.isPrimaryKey),s=[];if(c.length>0){let u=c.map(d=>`[${d.columnName}]`).join(", ");s.push(`PRIMARY KEY (${u})`)}for(let u of a)u.isUnique&&!u.isPrimaryKey&&s.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=[...i,...s,...l],p=`
|
|
356
358
|
CREATE TABLE [${o}] (
|
|
357
359
|
${m.join(`,
|
|
358
360
|
`)}
|
|
359
361
|
)
|
|
360
|
-
`;await r.request().query(p)}var
|
|
362
|
+
`;await r.request().query(p)}var tn=f(()=>{"use strict";h()});import{HTTPException as Nt}from"hono/http-exception";async function on(){let e=await(await R()).request().query(`
|
|
361
363
|
SELECT
|
|
362
364
|
d.name AS name,
|
|
363
365
|
CAST(
|
|
@@ -373,7 +375,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
373
375
|
WHERE d.database_id > 4 -- Exclude system databases
|
|
374
376
|
GROUP BY d.name, d.owner_sid, d.collation_name
|
|
375
377
|
ORDER BY d.name
|
|
376
|
-
`);if(!e.recordset[0])throw new Nt(500,{message:"No databases returned from server"});return e.recordset}async function
|
|
378
|
+
`);if(!e.recordset[0])throw new Nt(500,{message:"No databases returned from server"});return e.recordset}async function an(){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 nn(){let e=await(await R()).request().query(`
|
|
377
379
|
SELECT
|
|
378
380
|
@@VERSION AS version,
|
|
379
381
|
DB_NAME() AS database_name,
|
|
@@ -382,20 +384,20 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
382
384
|
(SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS port,
|
|
383
385
|
@@MAX_CONNECTIONS AS max_connections,
|
|
384
386
|
(SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS active_connections
|
|
385
|
-
`);if(!e.recordset[0])throw new Nt(500,{message:"No connection information returned from server"});let o=e.recordset[0],a=
|
|
387
|
+
`);if(!e.recordset[0])throw new Nt(500,{message:"No connection information returned from server"});let o=e.recordset[0],a=ne();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 rn=f(()=>{"use strict";h();De()});import{HTTPException as sn}from"hono/http-exception";async function cn(t){let{tableName:e,columnName:o,db:a}=t,n=await R(a),r=await n.request().input("tableName",e).query(`
|
|
386
388
|
SELECT COUNT(*) as cnt
|
|
387
389
|
FROM INFORMATION_SCHEMA.TABLES
|
|
388
390
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
389
391
|
AND TABLE_NAME = @tableName
|
|
390
392
|
AND TABLE_SCHEMA = 'dbo'
|
|
391
|
-
`);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new
|
|
393
|
+
`);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new sn(404,{message:`Table "${e}" does not exist`});let c=await n.request().input("tableName",e).input("columnName",o).query(`
|
|
392
394
|
SELECT COUNT(*) as cnt
|
|
393
395
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
394
396
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
395
397
|
AND TABLE_NAME = @tableName
|
|
396
398
|
AND COLUMN_NAME = @columnName
|
|
397
399
|
AND TABLE_SCHEMA = 'dbo'
|
|
398
|
-
`);if(!(Number(c.recordset[0]?.cnt??0)>0))throw new
|
|
400
|
+
`);if(!(Number(c.recordset[0]?.cnt??0)>0))throw new sn(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 ln=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(`
|
|
399
401
|
SELECT
|
|
400
402
|
fk.name AS constraint_name,
|
|
401
403
|
OBJECT_NAME(fk.parent_object_id) AS referencing_table,
|
|
@@ -406,13 +408,13 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
406
408
|
INNER JOIN sys.foreign_key_columns fkc
|
|
407
409
|
ON fk.object_id = fkc.constraint_object_id
|
|
408
410
|
WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
|
|
409
|
-
`)).recordset.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function
|
|
411
|
+
`)).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 Hi(t,e,o){let a=await Rt(t,o);if(a.length===0)return[];let n=[],r=await R(o),i=e.map(s=>s.value),c=new Map;for(let s of a){let l=`${s.referencingTable}.${s.referencingColumn}`;c.has(l)||c.set(l,[]),c.get(l)?.push(s)}for(let[s,l]of c){let m=l[0];if(!m||!e.find(y=>y.columnName===m.referencedColumn))continue;let u=r.request();i.forEach((y,b)=>{u.input(`pk${b}`,y)});let d=i.map((y,b)=>`@pk${b}`).join(", "),g=await u.query(`
|
|
410
412
|
SELECT TOP 100 * FROM [${m.referencingTable}]
|
|
411
413
|
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
|
|
414
|
+
`);g.recordset.length>0&&n.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:g.recordset})}return n}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),i=a.transaction();await i.begin();try{let c=i.request();r.forEach((m,p)=>{c.input(`pk${p}`,m)});let s=r.map((m,p)=>`@pk${p}`).join(", "),l=await c.query(`DELETE FROM [${t}] WHERE [${n}] IN (${s})`);return await i.commit(),{deletedCount:l.rowsAffected[0]??0,fkViolation:!1,relatedRecords:[]}}catch(c){if(await i.rollback(),c.number===Bi)return{deletedCount:0,fkViolation:!0,relatedRecords:await Hi(t,e,o)};throw c instanceof Ee?c:new Ee(500,{message:`Failed to delete records from "${t}"`})}}async function un({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),i=a.transaction();await i.begin();try{let c=await Rt(t,o),s=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=i.request();E.forEach((_,v)=>{D.input(`val${v}`,_)});let F=E.map((_,v)=>`@val${v}`).join(", "),$=(await D.query(`
|
|
413
415
|
SELECT [${O.referencedColumn}] FROM [${y}]
|
|
414
416
|
WHERE [${b}] IN (${F})
|
|
415
|
-
`)).recordset.map(_=>_[O.referencedColumn]);$.length>0&&await p(O.referencingTable,O.referencingColumn,$,N)}let k=i.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})`);s+=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=i.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 i.commit(),{deletedCount:(g.rowsAffected[0]??0)+s}}catch(c){throw await i.rollback(),c instanceof Ee?c:new Ee(500,{message:`Failed to force delete records from "${t}"`})}}var
|
|
417
|
+
`)).recordset.map(_=>_[O.referencedColumn]);$.length>0&&await p(O.referencingTable,O.referencingColumn,$,N)}let k=i.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})`);s+=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=i.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 i.commit(),{deletedCount:(g.rowsAffected[0]??0)+s}}catch(c){throw await i.rollback(),c instanceof Ee?c:new Ee(500,{message:`Failed to force delete records from "${t}"`})}}var Bi,pn=f(()=>{"use strict";h();Bi=547});import{HTTPException as At}from"hono/http-exception";async function fn(t,e){return(await(await R(e)).request().input("tableName",t).query(`
|
|
416
418
|
SELECT
|
|
417
419
|
fk.name AS constraint_name,
|
|
418
420
|
OBJECT_NAME(fk.parent_object_id) AS referencing_table,
|
|
@@ -423,26 +425,26 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
423
425
|
INNER JOIN sys.foreign_key_columns fkc
|
|
424
426
|
ON fk.object_id = fkc.constraint_object_id
|
|
425
427
|
WHERE OBJECT_NAME(fk.referenced_object_id) = @tableName
|
|
426
|
-
`)).recordset.map(n=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column}))}async function
|
|
428
|
+
`)).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 dn(t,e){let o=await fn(t,e);if(o.length===0)return[];let a=[],n=await R(e);for(let r of o){let i=await n.request().query(`SELECT TOP 100 * FROM [${r.referencingTable}]`);i.recordset.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:i.recordset})}return a}async function Vi(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 bn(t){let{tableName:e,db:o,cascade:a}=t,n=await R(o),r=await n.request().input("tableName",e).query(`
|
|
427
429
|
SELECT COUNT(*) as cnt
|
|
428
430
|
FROM INFORMATION_SCHEMA.TABLES
|
|
429
431
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
430
432
|
AND TABLE_NAME = @tableName
|
|
431
433
|
AND TABLE_SCHEMA = 'dbo'
|
|
432
|
-
`);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new At(404,{message:`Table "${e}" does not exist`});let c=await
|
|
434
|
+
`);if(!(Number(r.recordset[0]?.cnt??0)>0))throw new At(404,{message:`Table "${e}" does not exist`});let c=await Vi(e,o);if(!a){let s=await dn(e,o);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{if(a){let s=await fn(e,o);for(let l of s)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(s){if(s.number===Ki)return{deletedCount:0,fkViolation:!0,relatedRecords:await dn(e,o)};throw s instanceof At?s:new At(500,{message:`Failed to delete table "${e}"`})}}var Ki,yn=f(()=>{"use strict";h();Ki=3726});import{HTTPException as Wi}from"hono/http-exception";async function gn({tableName:t,db:e}){let a=await(await R(e)).request().query(`SELECT * FROM [${t}]`);if(!a.recordset||a.recordset.length===0)throw new Wi(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(a.recordset[0]),rows:a.recordset}}var Tn=f(()=>{"use strict";h()});import{HTTPException as zi}from"hono/http-exception";var En,hn=f(()=>{"use strict";h();En=async({query:t,db:e})=>{let o=await R(e);if(!t||!t.trim())throw new zi(400,{message:"Query is required"});let a=t.trim().replace(/;+$/,""),n=performance.now(),r=await o.request().query(a),i=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:i,message:c.length===0?"OK":void 0}}return{columns:[],rows:[],rowCount:r.rowsAffected[0]??0,duration:i,message:`OK \u2014 ${r.rowsAffected[0]??0} row(s) affected`}}});async function Cn(t){let e=await R(t),a=await e.request().query(`
|
|
433
435
|
SELECT table_name AS tableName
|
|
434
436
|
FROM information_schema.tables
|
|
435
437
|
WHERE table_catalog = DB_NAME()
|
|
436
438
|
AND table_type = 'BASE TABLE'
|
|
437
439
|
AND table_schema = 'dbo'
|
|
438
440
|
ORDER BY table_name
|
|
439
|
-
`);return!a.recordset||a.recordset.length===0?[]:await Promise.all(a.recordset.map(async r=>{let c=(await e.request().query(`SELECT COUNT(*) as count FROM [${r.tableName}]`)).recordset[0];return{tableName:r.tableName,rowCount:c?.count??0}}))}var
|
|
441
|
+
`);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 Sn=f(()=>{"use strict";h()});import{HTTPException as Nn}from"hono/http-exception";async function Rn({tableName:t,db:e}){let o=await R(e),a=await o.request().input("tableName",t).query(`
|
|
440
442
|
SELECT COUNT(*) as cnt
|
|
441
443
|
FROM INFORMATION_SCHEMA.TABLES
|
|
442
444
|
WHERE TABLE_CATALOG = DB_NAME()
|
|
443
445
|
AND TABLE_NAME = @tableName
|
|
444
446
|
AND TABLE_SCHEMA = 'dbo'
|
|
445
|
-
`);if(!(Number(a.recordset[0]?.cnt??0)>0))throw new
|
|
447
|
+
`);if(!(Number(a.recordset[0]?.cnt??0)>0))throw new Nn(404,{message:`Table "${t}" does not exist`});let r=await o.request().input("tableName",t).query(`
|
|
446
448
|
SELECT
|
|
447
449
|
c.COLUMN_NAME,
|
|
448
450
|
c.DATA_TYPE,
|
|
@@ -487,20 +489,20 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
487
489
|
AND c.TABLE_NAME = @tableName
|
|
488
490
|
AND c.TABLE_SCHEMA = 'dbo'
|
|
489
491
|
ORDER BY c.ORDINAL_POSITION
|
|
490
|
-
`);if(!r.recordset||r.recordset.length===0)throw new
|
|
492
|
+
`);if(!r.recordset||r.recordset.length===0)throw new Nn(500,{message:`Failed to retrieve schema for table "${t}"`});let i=r.recordset.map(s=>{let l=` [${s.COLUMN_NAME}] ${s.DATA_TYPE}`;return s.CHARACTER_MAXIMUM_LENGTH?l+=s.CHARACTER_MAXIMUM_LENGTH===-1?"(MAX)":`(${s.CHARACTER_MAXIMUM_LENGTH})`:s.NUMERIC_PRECISION&&(s.NUMERIC_SCALE?l+=`(${s.NUMERIC_PRECISION},${s.NUMERIC_SCALE})`:l+=`(${s.NUMERIC_PRECISION})`),l+=s.IS_NULLABLE==="YES"?" NULL":" NOT NULL",s.COLUMN_DEFAULT&&(l+=` DEFAULT ${s.COLUMN_DEFAULT}`),l});return`CREATE TABLE [${t}] (
|
|
491
493
|
${i.join(`,
|
|
492
494
|
`)}
|
|
493
|
-
)`}var
|
|
495
|
+
)`}var An=f(()=>{"use strict";h()});var wn,Dn=f(()=>{"use strict";h();wn=async({tableName:t,cursor:e="",limit:o=50,direction:a="asc",sort:n=[],order:r="asc",filters:i=[],db:c})=>{let s=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 s.request().query(`SELECT COUNT(*) as total FROM [${t}]`),d=Number(u.recordset[0]?.total??0),y=(await s.request().query(`
|
|
494
496
|
SELECT *
|
|
495
497
|
FROM [${t}]
|
|
496
498
|
${p}
|
|
497
499
|
OFFSET ${m} ROWS
|
|
498
500
|
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
|
|
501
|
+
`)).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 _n({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=await R(e),i=await se({tableName:o,db:e}),c=new Set(i.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName)),s=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.`});s.has(p)||s.set(p,[]),s.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 s.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
502
|
UPDATE [${o}]
|
|
501
503
|
SET ${d.join(", ")}
|
|
502
504
|
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
|
|
505
|
+
`,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 xn=f(()=>{"use strict";h();_e()});import{HTTPException as tc}from"hono/http-exception";function oc(t){let e=t.match(/^(?:enum|set)\((.+)\)$/i);return e?.[1]?e[1].split(",").map(o=>o.trim().replace(/^'|'$/g,"")):null}async function ie({tableName:t,db:e}){let o=S(e),a=`
|
|
504
506
|
SELECT
|
|
505
507
|
c.COLUMN_NAME AS columnName,
|
|
506
508
|
c.DATA_TYPE AS dataType,
|
|
@@ -520,18 +522,18 @@ ${i.join(`,
|
|
|
520
522
|
WHERE c.TABLE_SCHEMA = DATABASE()
|
|
521
523
|
AND c.TABLE_NAME = ?
|
|
522
524
|
ORDER BY c.ORDINAL_POSITION
|
|
523
|
-
`,[n]=await o.execute(a,[t]);if(!n||n.length===0)throw new
|
|
525
|
+
`,[n]=await o.execute(a,[t]);if(!n||n.length===0)throw new tc(404,{message:`Table "${t}" does not exist`});return n.map(r=>{let i=r.dataType,c=r.columnType,l=i==="enum"||i==="set"?oc(c):null;return{columnName:r.columnName,dataType:bo(i,c),dataTypeLabel:yo(i,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 xe=f(()=>{"use strict";Z();h()});import{HTTPException as nc}from"hono/http-exception";async function Mn({db:t,params:e}){let{tableName:o,data:a}=e,n=S(t),r=await ie({tableName:o,db:t}),i=new Set(r.filter(d=>d.dataTypeLabel==="boolean").map(d=>d.columnName)),c=Object.keys(a),s=Object.values(a).map((d,g)=>{let y=c[g];return i.has(y)&&typeof d=="string"?d==="true"?1:0:d}),l=c.map(()=>"?").join(", "),m=c.map(d=>`\`${d}\``).join(", "),p=`
|
|
524
526
|
INSERT INTO \`${o}\` (${m})
|
|
525
527
|
VALUES (${l})
|
|
526
|
-
`,[u]=await n.execute(p,s);if(u.affectedRows===0)throw new
|
|
528
|
+
`,[u]=await n.execute(p,s);if(u.affectedRows===0)throw new nc(500,{message:`Failed to insert record into "${o}"`});return{insertedCount:u.affectedRows}}var Ln=f(()=>{"use strict";h();xe()});import{HTTPException as Ge}from"hono/http-exception";var On,Pn=f(()=>{"use strict";h();xe();On=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]),i=r.map(l=>`\`${l}\``).join(", "),c=await ie({tableName:t,db:o}),s=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 s.has(g)&&typeof y=="string"?y==="true"?1:0:y}),u=r.map(()=>"?").join(", "),d=`
|
|
527
529
|
INSERT INTO \`${t}\` (${i})
|
|
528
530
|
VALUES (${u})
|
|
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
|
|
531
|
+
`;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 ic(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 cc(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=cc(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=ic(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 In({tableData:t,db:e}){let{tableName:o,fields:a,foreignKeys:n}=t,r=S(e),i=a.map(u=>he(u)),c=a.filter(u=>u.isPrimaryKey),s=[];if(c.length>0){let u=c.map(d=>`\`${d.columnName}\``).join(", ");s.push(`PRIMARY KEY (${u})`)}for(let u of a)u.isUnique&&!u.isPrimaryKey&&s.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=[...i,...s,...l],p=`
|
|
530
532
|
CREATE TABLE \`${o}\` (
|
|
531
533
|
${m.join(`,
|
|
532
534
|
`)}
|
|
533
535
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
534
|
-
`;await r.execute(p)}var
|
|
536
|
+
`;await r.execute(p)}var $n=f(()=>{"use strict";h();Je()});import{HTTPException as wt}from"hono/http-exception";async function qn(){let t=S(),[e]=await t.execute(`
|
|
535
537
|
SELECT
|
|
536
538
|
s.SCHEMA_NAME AS name,
|
|
537
539
|
CONCAT(
|
|
@@ -548,7 +550,7 @@ ${i.join(`,
|
|
|
548
550
|
ON t.TABLE_SCHEMA = s.SCHEMA_NAME
|
|
549
551
|
GROUP BY s.SCHEMA_NAME, s.DEFAULT_CHARACTER_SET_NAME
|
|
550
552
|
ORDER BY s.SCHEMA_NAME
|
|
551
|
-
`);if(!e[0])throw new wt(500,{message:"No databases returned from server"});return e}async function
|
|
553
|
+
`);if(!e[0])throw new wt(500,{message:"No databases returned from server"});return e}async function kn(){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 vn(){let t=S(),[e]=await t.execute(`
|
|
552
554
|
SELECT
|
|
553
555
|
VERSION() AS version,
|
|
554
556
|
DATABASE() AS database_name,
|
|
@@ -556,11 +558,11 @@ ${i.join(`,
|
|
|
556
558
|
@@hostname AS host,
|
|
557
559
|
@@port AS port,
|
|
558
560
|
@@max_connections AS max_connections
|
|
559
|
-
`),[o]=await t.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!e[0])throw new wt(500,{message:"No connection information returned from server"});let a=e[0],n=Number(o[0]?.cnt??0),r=
|
|
561
|
+
`),[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=ne();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 Un=f(()=>{"use strict";h();De()});import{HTTPException as Fn}from"hono/http-exception";async function Bn(t){let{tableName:e,columnName:o,db:a}=t,n=S(a),[r]=await n.execute(`SELECT COUNT(*) as cnt
|
|
560
562
|
FROM information_schema.TABLES
|
|
561
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(r[0]?.cnt??0)>0))throw new
|
|
563
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(r[0]?.cnt??0)>0))throw new Fn(404,{message:`Table "${e}" does not exist`});let[c]=await n.execute(`SELECT COUNT(*) as cnt
|
|
562
564
|
FROM information_schema.COLUMNS
|
|
563
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(!(Number(c[0]?.cnt??0)>0))throw new
|
|
565
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(!(Number(c[0]?.cnt??0)>0))throw new Fn(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 Hn=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
|
|
564
566
|
kcu.CONSTRAINT_NAME AS constraint_name,
|
|
565
567
|
kcu.TABLE_NAME AS referencing_table,
|
|
566
568
|
kcu.COLUMN_NAME AS referencing_column,
|
|
@@ -573,10 +575,10 @@ ${i.join(`,
|
|
|
573
575
|
AND kcu.TABLE_NAME = tc.TABLE_NAME
|
|
574
576
|
WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
|
|
575
577
|
AND kcu.TABLE_SCHEMA = DATABASE()
|
|
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
|
|
578
|
+
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 dc(t,e,o){let a=await Dt(t,o);if(a.length===0)return[];let n=[],r=S(o),i=e.map(s=>s.value),c=new Map;for(let s of a){let l=`${s.referencingTable}.${s.referencingColumn}`;c.has(l)||c.set(l,[]),c.get(l)?.push(s)}for(let[s,l]of c){let m=l[0];if(!m||!e.find(g=>g.columnName===m.referencedColumn))continue;let u=i.map(()=>"?").join(", "),[d]=await r.execute(`SELECT * FROM \`${m.referencingTable}\`
|
|
577
579
|
WHERE \`${m.referencingColumn}\` IN (${u})
|
|
578
|
-
LIMIT 100`,i);d.length>0&&n.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:d})}return n}async function
|
|
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 i.execute(`DELETE FROM \`${g}\` WHERE \`${y}\` IN (${q})`,b);s+=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 i.execute(`DELETE FROM \`${t}\` WHERE \`${n}\` IN (${u})`,r);return await i.execute("SET FOREIGN_KEY_CHECKS = 1"),await i.commit(),{deletedCount:d.affectedRows+s}}catch(c){throw await i.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await i.rollback(),c instanceof Ce?c:new Ce(500,{message:`Failed to force delete records from "${t}"`})}finally{i.release()}}var
|
|
580
|
+
LIMIT 100`,i);d.length>0&&n.push({tableName:m.referencingTable,columnName:m.referencingColumn,constraintName:m.constraintName,records:d})}return n}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(s=>s.value),i=r.map(()=>"?").join(", "),c=await a.getConnection();await c.beginTransaction();try{let[s]=await c.execute(`DELETE FROM \`${t}\` WHERE \`${n}\` IN (${i})`,r);return await c.commit(),{deletedCount:s.affectedRows,fkViolation:!1,relatedRecords:[]}}catch(s){if(await c.rollback(),s.errno===pc)return{deletedCount:0,fkViolation:!0,relatedRecords:await dc(t,e,o)};throw s instanceof Ce?s:new Ce(500,{message:`Failed to delete records from "${t}"`})}finally{c.release()}}async function Kn({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),i=await a.getConnection();await i.beginTransaction();try{await i.execute("SET FOREIGN_KEY_CHECKS = 0");let c=await Dt(t,o),s=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 i.execute(`SELECT \`${H.referencedColumn}\` FROM \`${g}\`
|
|
581
|
+
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 i.execute(`DELETE FROM \`${g}\` WHERE \`${y}\` IN (${q})`,b);s+=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 i.execute(`DELETE FROM \`${t}\` WHERE \`${n}\` IN (${u})`,r);return await i.execute("SET FOREIGN_KEY_CHECKS = 1"),await i.commit(),{deletedCount:d.affectedRows+s}}catch(c){throw await i.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await i.rollback(),c instanceof Ce?c:new Ce(500,{message:`Failed to force delete records from "${t}"`})}finally{i.release()}}var pc,Vn=f(()=>{"use strict";h();pc=1451});import{HTTPException as _t}from"hono/http-exception";async function gc(t,e){let o=S(e),[a]=await o.execute(`SELECT
|
|
580
582
|
kcu.CONSTRAINT_NAME AS constraint_name,
|
|
581
583
|
kcu.TABLE_NAME AS referencing_table,
|
|
582
584
|
kcu.COLUMN_NAME AS referencing_column,
|
|
@@ -589,38 +591,38 @@ ${i.join(`,
|
|
|
589
591
|
AND kcu.TABLE_NAME = tc.TABLE_NAME
|
|
590
592
|
WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
|
|
591
593
|
AND kcu.TABLE_SCHEMA = DATABASE()
|
|
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
|
|
594
|
+
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 Qn(t,e){let o=await gc(t,e);if(o.length===0)return[];let a=[],n=S(e);for(let r of o){let[i]=await n.execute(`SELECT * FROM \`${r.referencingTable}\` LIMIT 100`);i.length>0&&a.push({tableName:r.referencingTable,columnName:r.referencingColumn,constraintName:r.constraintName,records:i})}return a}async function Tc(t,e){let o=S(e),[a]=await o.execute(`SELECT COUNT(*) as count FROM \`${t}\``);return Number(a[0]?.count??0)}async function Wn(t){let{tableName:e,db:o,cascade:a}=t,n=S(o),[r]=await n.execute(`SELECT COUNT(*) as cnt
|
|
593
595
|
FROM information_schema.TABLES
|
|
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
|
|
596
|
+
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 Tc(e,o);if(!a){let s=await Qn(e,o);if(s.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:s}}try{if(a){let s=await n.getConnection();try{await s.execute("SET FOREIGN_KEY_CHECKS = 0"),await s.execute(`DROP TABLE \`${e}\``),await s.execute("SET FOREIGN_KEY_CHECKS = 1")}finally{s.release()}}else await n.execute(`DROP TABLE \`${e}\``);return{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(s){await n.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{});let l=s;if(l.errno===bc||l.errno===yc)return{deletedCount:0,fkViolation:!0,relatedRecords:await Qn(e,o)};throw s instanceof _t?s:new _t(500,{message:`Failed to delete table "${e}"`})}}var bc,yc,Yn=f(()=>{"use strict";h();bc=1217,yc=1451});import{HTTPException as hc}from"hono/http-exception";async function zn({tableName:t,db:e}){let o=S(e),[a]=await o.execute(`SELECT * FROM \`${t}\``);if(!a||a.length===0)throw new hc(404,{message:`Table "${t}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}var Gn=f(()=>{"use strict";h()});import{HTTPException as Sc}from"hono/http-exception";var Jn,Xn=f(()=>{"use strict";h();Jn=async({query:t,db:e})=>{let o=S(e);if(!t||!t.trim())throw new Sc(400,{message:"Query is required"});let a=t.trim().replace(/;+$/,""),n=performance.now(),[r,i]=await o.execute(a),c=performance.now()-n;if(Array.isArray(r)){let l=r;return{columns:i?i.map(p=>p.name):Object.keys(l[0]??{}),rows:l,rowCount:l.length,duration:c,message:l.length===0?"OK":void 0}}let s=r;return{columns:[],rows:[],rowCount:s.affectedRows,duration:c,message:`OK \u2014 ${s.affectedRows} row(s) affected`}}});async function Zn(t){let e=S(t),o=`
|
|
595
597
|
SELECT table_name as tableName
|
|
596
598
|
FROM information_schema.tables
|
|
597
599
|
WHERE table_schema = DATABASE()
|
|
598
600
|
AND table_type = 'BASE TABLE'
|
|
599
601
|
ORDER BY table_name
|
|
600
|
-
`,[a]=await e.execute(o);return!a||a.length===0?[]:await Promise.all(a.map(async r=>{let[i]=await e.execute(`SELECT COUNT(*) as count FROM \`${r.tableName}\``),c=i[0];return{tableName:r.tableName,rowCount:c?.count??0}}))}var
|
|
602
|
+
`,[a]=await e.execute(o);return!a||a.length===0?[]:await Promise.all(a.map(async r=>{let[i]=await e.execute(`SELECT COUNT(*) as count FROM \`${r.tableName}\``),c=i[0];return{tableName:r.tableName,rowCount:c?.count??0}}))}var er=f(()=>{"use strict";h()});import{HTTPException as tr}from"hono/http-exception";async function or({tableName:t,db:e}){let o=S(e),[a]=await o.execute(`SELECT COUNT(*) as cnt
|
|
601
603
|
FROM information_schema.TABLES
|
|
602
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[t]);if(!(Number(a[0]?.cnt??0)>0))throw new
|
|
604
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[t]);if(!(Number(a[0]?.cnt??0)>0))throw new tr(404,{message:`Table "${t}" does not exist`});let[r]=await o.execute(`SHOW CREATE TABLE \`${t}\``),i=r[0],c=i?.["Create Table"]??i?.create_table??"";if(!c)throw new tr(500,{message:`Failed to retrieve schema for table "${t}"`});return c}var ar=f(()=>{"use strict";h()});function nr(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 rr(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 sr(t,e,o){let{values:a,sortColumns:n}=t,r=[],i=[],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)i.push(a[d])}return{clause:r.length>0?`(${r.join(" AND ")})`:"",values:i}}var ir=f(()=>{"use strict"});var Xe,wc,Dc,cr,lr=f(()=>{"use strict";h();ir();Xe=t=>Buffer.from(JSON.stringify(t)).toString("base64url"),wc=t=>{try{return JSON.parse(Buffer.from(t,"base64url").toString("utf-8"))}catch{return null}},Dc=async(t,e)=>{let[o]=await t.execute(`SELECT COLUMN_NAME as column_name
|
|
603
605
|
FROM information_schema.COLUMNS
|
|
604
606
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
605
607
|
AND TABLE_NAME = ?
|
|
606
608
|
AND COLUMN_KEY = 'PRI'
|
|
607
|
-
ORDER BY ORDINAL_POSITION`,[e]);return o.map(a=>a.column_name)},
|
|
609
|
+
ORDER BY ORDINAL_POSITION`,[e]);return o.map(a=>a.column_name)},cr=async({tableName:t,cursor:e="",limit:o=50,direction:a="asc",sort:n=[],order:r="asc",filters:i=[],db:c})=>{let s=S(c),l=await Dc(s,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}=nr(i),y="",b=[];if(e){let $=wc(e);if($){let _=sr($,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=rr((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 s.execute(`SELECT COUNT(*) as total FROM \`${t}\` ${d}`,g),k=Number(q[0]?.total??0),H=Math.floor(o)+1,[j]=await s.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,z=null;if(O.length>0&&u.length>0){let $=O[0],_=O[O.length-1],v=ue=>({values:Object.fromEntries(u.map(Oe=>[Oe,ue[Oe]])),sortColumns:u});a==="asc"?(D&&(F=Xe(v(_))),e&&(z=Xe(v($)))):(e&&(F=Xe(v(_))),D&&(z=Xe(v($))))}return{data:O,meta:{limit:o,total:k,hasNextPage:a==="asc"?D:!!e,hasPreviousPage:a==="asc"?!!e:D,nextCursor:F,prevCursor:z}}}});import{HTTPException as Ze}from"hono/http-exception";async function mr({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=S(e),i=await ie({tableName:o,db:e}),c=new Set(i.filter(m=>m.dataTypeLabel==="boolean").map(m=>m.columnName)),s=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.`});s.has(p)||s.set(p,[]),s.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 s.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
610
|
UPDATE \`${o}\`
|
|
609
611
|
SET ${d.join(", ")}
|
|
610
612
|
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
|
|
613
|
+
`,[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 ur=f(()=>{"use strict";h();xe()});import{HTTPException as Mc}from"hono/http-exception";var pr,dr=f(()=>{"use strict";h();pr=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),i=performance.now()-n;return{columns:r.fields.map(s=>s.name),rows:r.rows,rowCount:r.rows.length,duration:i,message:r.rows.length===0?"OK":void 0}}});async function br(t){let e=C(t),o=`
|
|
612
614
|
SELECT table_schema as "schemaName", table_name as "tableName"
|
|
613
615
|
FROM information_schema.tables
|
|
614
616
|
WHERE table_type = 'BASE TABLE'
|
|
615
617
|
AND table_schema NOT IN ('pg_catalog', 'information_schema')
|
|
616
618
|
AND table_schema NOT LIKE 'pg_toast%'
|
|
617
619
|
ORDER BY table_schema, table_name;
|
|
618
|
-
`,{rows:a}=await e.query(o);return a[0]?await Promise.all(a.map(async r=>{let i=
|
|
620
|
+
`,{rows:a}=await e.query(o);return a[0]?await Promise.all(a.map(async r=>{let i=fr(r.schemaName),c=fr(r.tableName),s=`SELECT COUNT(*)::integer as count FROM "${i}"."${c}"`,{rows:l}=await e.query(s);return{schemaName:r.schemaName,tableName:r.tableName,rowCount:l[0]?.count??0}})):[]}var fr,yr=f(()=>{"use strict";h();fr=t=>t.replaceAll('"','""')});import{HTTPException as Pc}from"hono/http-exception";async function gr({tableName:t,db:e}){let o=C(e),a=`
|
|
619
621
|
SELECT EXISTS (
|
|
620
622
|
SELECT 1 FROM information_schema.tables
|
|
621
623
|
WHERE table_schema = 'public' AND table_name = $1
|
|
622
624
|
) as exists
|
|
623
|
-
`,{rows:n}=await o.query(a,[t]);if(!n[0]?.exists)throw new
|
|
625
|
+
`,{rows:n}=await o.query(a,[t]);if(!n[0]?.exists)throw new Pc(404,{message:`Table "${t}" does not exist`});let r=`
|
|
624
626
|
SELECT
|
|
625
627
|
column_name,
|
|
626
628
|
data_type,
|
|
@@ -659,61 +661,61 @@ ${i.join(`,
|
|
|
659
661
|
FROM information_schema.table_constraints
|
|
660
662
|
WHERE table_schema = 'public' AND table_name = $1 AND constraint_type = 'PRIMARY KEY'
|
|
661
663
|
)
|
|
662
|
-
`,{rows:m}=await o.query(l,[t]),p=[];p.push(`create table public.${t} (`);let u=[];for(let b of i){let E=` ${b.column_name} ${
|
|
664
|
+
`,{rows:m}=await o.query(l,[t]),p=[];p.push(`create table public.${t} (`);let u=[];for(let b of i){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 s){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
665
|
`)),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
|
|
666
|
+
`)}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 Tr=f(()=>{"use strict";h()});function Er(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 hr(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 Cr(t,e,o,a){let{values:n,sortColumns:r}=t,i=[],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?">":"<";i.push(`(${p}) ${d} (${u})`);for(let g of r)c.push(n[g])}return{clause:i.length>0?`(${i.join(" AND ")})`:"",values:c}}var Sr=f(()=>{"use strict"});var et,qc,kc,Nr,Rr=f(()=>{"use strict";h();Sr();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
|
|
665
667
|
FROM pg_index i
|
|
666
668
|
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
|
667
669
|
WHERE i.indrelid = $1::regclass AND i.indisprimary
|
|
668
|
-
ORDER BY array_position(i.indkey, a.attnum)`,[o])).rows.map(n=>n.column_name)},
|
|
670
|
+
ORDER BY array_position(i.indkey, a.attnum)`,[o])).rows.map(n=>n.column_name)},Nr=async({tableName:t,cursor:e="",limit:o=50,direction:a="asc",sort:n=[],order:r="asc",filters:i=[],db:c})=>{let s=C(c),l=await kc(s,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}=Er(i),y="",b=[];if(e){let _=qc(e);if(_){let v=Cr(_,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=hr((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 s.query(`SELECT COUNT(*) as total FROM "${t}" ${d}`,g),k=Number(q.rows[0].total),H=g.length+b.length+1,j=await s.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 z=null,$=null;if(D.length>0){let _=D[0],v=D[D.length-1],ue=Oe=>({values:Object.fromEntries(u.map(Ot=>[Ot,Oe[Ot]])),sortColumns:u});a==="asc"?(F&&(z=et(ue(v))),e&&($=et(ue(_)))):(e&&(z=et(ue(v))),F&&($=et(ue(_))))}return{data:D,meta:{limit:o,total:k,hasNextPage:a==="asc"?F:!!e,hasPreviousPage:a==="asc"?!!e:F,nextCursor:z,prevCursor:$}}}});import{HTTPException as tt}from"hono/http-exception";async function Ar({params:t,db:e}){let{tableName:o,updates:a,primaryKey:n}=t,r=C(e),i=new Map;for(let c of a){let s=c.rowData[n];if(s==null)throw new tt(400,{message:`Primary key "${n}" not found in row data. Please ensure the row has a "${n}" column.`});i.has(s)||i.set(s,[]),i.get(s)?.push({columnName:c.columnName,value:c.value,rowData:c.rowData})}await r.query("BEGIN");try{let c=0;for(let[s,l]of i.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(s);let u=`
|
|
669
671
|
UPDATE "${o}"
|
|
670
672
|
SET ${m.join(", ")}
|
|
671
673
|
WHERE "${n}" = $${p.length}
|
|
672
674
|
RETURNING *
|
|
673
|
-
`,d=await r.query(u,p);if(d.rowCount===0)throw new tt(404,{message:`Record with ${n} = ${s} 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
|
|
675
|
+
`,d=await r.query(u,p);if(d.rowCount===0)throw new tt(404,{message:`Record with ${n} = ${s} 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 wr=f(()=>{"use strict";h()});function P(t){return t==="mongodb"?Dr.mongodb:Dr[t]}var Dr,Me=f(()=>{"use strict";ba();ga();Ea();Na();wa();xa();Oa();Ia();ka();Ba();ja();Wa();za();ye();Ja();Za();tn();rn();ln();pn();yn();Tn();hn();_e();Sn();An();Dn();xn();Ln();Pn();$n();Un();Hn();Vn();Yn();Gn();Xn();xe();er();ar();lr();ur();dr();gt();yr();Tr();Rr();wr();Dr={pg:{addRecord:fa,bulkInsertRecords:ya,createTable:Ta,getDatabasesList:ha,getCurrentDatabase:Ca,getDatabaseConnectionInfo:Sa,deleteColumn:Aa,deleteRecords:Da,forceDeleteRecords:_a,deleteTable:La,exportTableData:Pa,executeQuery:pr,getTableColumns:Qe,getTablesList:br,getTableSchema:gr,getTableData:Nr,updateRecords:Ar},mysql:{addRecord:Mn,bulkInsertRecords:On,createTable:In,getDatabasesList:qn,getCurrentDatabase:kn,getDatabaseConnectionInfo:vn,deleteColumn:Bn,deleteRecords:jn,forceDeleteRecords:Kn,deleteTable:Wn,exportTableData:zn,executeQuery:Jn,getTableColumns:ie,getTablesList:Zn,getTableSchema:or,getTableData:cr,updateRecords:mr},mongodb:{addRecord:({db:t,params:e})=>Ka({db:t,params:e}),bulkInsertRecords:qa,createTable:({db:t,tableData:e})=>ea({tableName:e?.tableName??"",tableData:e,db:t}),getDatabasesList:va,getCurrentDatabase:Ua,getDatabaseConnectionInfo:Fa,deleteColumn:({db:t,tableName:e,columnName:o})=>ta({tableName:e,columnName:o,db:t}),deleteRecords:St,forceDeleteRecords:Qa,deleteTable:async({db:t,tableName:e})=>{let{getMongoDb:o}=await Promise.resolve().then(()=>(h(),Wo));await(await o(t)).collection(e).drop()},exportTableData:({db:t,tableName:e})=>oa({tableName:e,db:t}),executeQuery:({query:t,db:e})=>Ha({query:t,db:e}),getTableColumns:Ke,getTablesList:({db:t})=>Xo(t),getTableSchema:Ya,getTableData:Zo,updateRecords:({db:t,params:e})=>Va({db:t,params:e})},mssql:{addRecord:Ga,bulkInsertRecords:Xa,createTable:en,getDatabasesList:on,getCurrentDatabase:an,getDatabaseConnectionInfo:nn,deleteColumn:cn,deleteRecords:mn,forceDeleteRecords:un,deleteTable:bn,exportTableData:gn,executeQuery:En,getTableColumns:se,getTablesList:Cn,getTableSchema:Rn,getTableData:wn,updateRecords:_n}}});import{Hono as Fc}from"hono";var _r,xr=f(()=>{"use strict";Me();h();_r=new Fc().basePath("/databases").get("/",async t=>{let e=le(),a=await P(e).getDatabasesList();return t.json({data:{databases:a,dbType:e}},200)}).get("/current",async t=>{let e=le(),a=await P(e).getCurrentDatabase();return t.json({data:{db:a.db,dbType:e}},200)}).get("/connection",async t=>{let e=le(),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 Lr,Or=f(()=>{"use strict";Z();Me();Lr=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 ee}from"@hono/zod-validator";import{Hono as Hc}from"hono";var Pr,Ir=f(()=>{"use strict";Z();Me();Pr=new Hc().basePath("/records").post("/",ee("query",w),ee("json",oo),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:i}=await r.addRecord({db:e,params:{tableName:o,data:a}});return t.json({data:`Record inserted into "${o}" with ${i} rows inserted`},200)}).patch("/",ee("query",w),ee("json",Bo),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKey:a,updates:n}=t.req.valid("json"),r=t.get("dbType"),i=P(r),{updatedCount:c}=await i.updateRecords({params:{tableName:o,primaryKey:a,updates:n},db:e});return t.json({data:`Updated ${c} records in "${o}"`},200)}).delete("/",ee("query",w),ee("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:i,fkViolation:c,relatedRecords:s}=await r.deleteRecords({tableName:o,primaryKeys:a,db:e});return c?t.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:s}},409):t.json({data:{deletedCount:i,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",ee("query",w),ee("json",mt),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,primaryKeys:a}=t.req.valid("json"),n=t.get("dbType"),i=await P(n).forceDeleteRecords({tableName:o,primaryKeys:a,db:e});return t.json({data:i},200)}).post("/bulk",ee("query",w),ee("json",io),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,records:a}=t.req.valid("json"),n=t.get("dbType"),i=await P(n).bulkInsertRecords({tableName:o,records:a,db:e});return t.json({data:i},200)})});import{HTTPException as $r}from"hono/http-exception";async function qr(t){let{tableName:e,columnName:o,columnType:a,defaultValue:n,isPrimaryKey:r,isNullable:i,isUnique:c,isIdentity:s,isArray:l,db:m}=t,p=C(m),u=`
|
|
674
676
|
SELECT EXISTS (
|
|
675
677
|
SELECT 1 FROM information_schema.tables
|
|
676
678
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
677
679
|
) as exists;
|
|
678
|
-
`,{rows:d}=await p.query(u,[e]);if(!d[0]?.exists)throw new
|
|
680
|
+
`,{rows:d}=await p.query(u,[e]);if(!d[0]?.exists)throw new $r(404,{message:`Table "${e}" does not exist`});let g=`
|
|
679
681
|
SELECT EXISTS (
|
|
680
682
|
SELECT 1 FROM information_schema.columns
|
|
681
683
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
682
684
|
) as exists;
|
|
683
|
-
`,{rows:y}=await p.query(g,[e,o]);if(y[0]?.exists)throw new
|
|
685
|
+
`,{rows:y}=await p.query(g,[e,o]);if(y[0]?.exists)throw new $r(409,{message:`Column "${o}" already exists in table "${e}"`});let b=`"${o}" ${a}`;l&&(b+="[]"),r&&(b+=" PRIMARY KEY"),c&&!r&&(b+=" UNIQUE"),i||(b+=" NOT NULL"),s&&(b+=" GENERATED ALWAYS AS IDENTITY"),n?.trim()&&!s&&(b+=` DEFAULT ${n.trim()}`),await p.query(`ALTER TABLE "${e}" ADD COLUMN ${b}`)}var kr=f(()=>{"use strict";h()});import{HTTPException as vr}from"hono/http-exception";async function Ur(t){let{tableName:e,columnName:o,columnType:a,isNullable:n,defaultValue:r,db:i}=t,c=C(i),s=`
|
|
684
686
|
SELECT EXISTS (
|
|
685
687
|
SELECT 1 FROM information_schema.tables
|
|
686
688
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
687
689
|
) as exists;
|
|
688
|
-
`,{rows:l}=await c.query(s,[e]);if(!l[0]?.exists)throw new
|
|
690
|
+
`,{rows:l}=await c.query(s,[e]);if(!l[0]?.exists)throw new vr(404,{message:`Table "${e}" does not exist`});let m=`
|
|
689
691
|
SELECT EXISTS (
|
|
690
692
|
SELECT 1 FROM information_schema.columns
|
|
691
693
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
692
694
|
) as exists;
|
|
693
|
-
`,{rows:p}=await c.query(m,[e,o]);if(!p[0]?.exists)throw new
|
|
695
|
+
`,{rows:p}=await c.query(m,[e,o]);if(!p[0]?.exists)throw new vr(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 Fr=f(()=>{"use strict";h()});import{HTTPException as Br}from"hono/http-exception";async function Hr({tableName:t,columnName:e,columnType:o,defaultValue:a,isNullable:n,db:r}){let i=await M(r),c=await i.listCollections({name:t}).toArray();if(c.length===0)throw new Br(404,{message:`Collection "${t}" does not exist`});if(await i.collection(t).findOne({[e]:{$exists:!0}}))throw new Br(409,{message:`Field "${e}" already exists in collection "${t}"`});let l=jc(a,o);await i.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 i.command({collMod:t,validator:{$jsonSchema:{...p,bsonType:"object",properties:u,...d.length>0?{required:d}:{}}},validationAction:"warn"})}var jc,jr=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 Kr({tableName:t,columnName:e,newColumnName:o,db:a}){let n=await M(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 Vr({tableName:t,columnName:e,columnType:o,isNullable:a,db:n}){let r=await M(n),i=await r.listCollections({name:t}).toArray();if(i.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 s=i[0].options?.validator?.$jsonSchema??{},l={...s.properties??{}},m=[...s.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:{...s,bsonType:"object",properties:l,...m.length>0?{required:m}:{}}},validationAction:"warn"})}var Qr=f(()=>{"use strict";h()});import{HTTPException as Wr}from"hono/http-exception";async function Yr(t){let{tableName:e,columnName:o,columnType:a,defaultValue:n,isPrimaryKey:r,isNullable:i,isUnique:c,isIdentity:s,isArray:l,db:m}=t,p=S(m),[u]=await p.execute(`SELECT COUNT(*) as cnt
|
|
694
696
|
FROM information_schema.TABLES
|
|
695
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new
|
|
697
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(u[0]?.cnt??0)>0))throw new Wr(404,{message:`Table "${e}" does not exist`});let[g]=await p.execute(`SELECT COUNT(*) as cnt
|
|
696
698
|
FROM information_schema.COLUMNS
|
|
697
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(Number(g[0]?.cnt??0)>0)throw new
|
|
699
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(Number(g[0]?.cnt??0)>0)throw new Wr(409,{message:`Column "${o}" already exists in table "${e}"`});let b=he({columnName:o,columnType:a,defaultValue:n,isPrimaryKey:r,isNullable:i,isUnique:c,isIdentity:s,isArray:l},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${e}\` ADD COLUMN ${b}`)}var zr=f(()=>{"use strict";h();Je()});import{HTTPException as Gr}from"hono/http-exception";async function Jr(t){let{tableName:e,columnName:o,columnType:a,isNullable:n,defaultValue:r,db:i}=t,c=S(i),[s]=await c.execute(`SELECT COUNT(*) as cnt
|
|
698
700
|
FROM information_schema.TABLES
|
|
699
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(s[0]?.cnt??0)>0))throw new
|
|
701
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(s[0]?.cnt??0)>0))throw new Gr(404,{message:`Table "${e}" does not exist`});let[m]=await c.execute(`SELECT EXTRA
|
|
700
702
|
FROM information_schema.COLUMNS
|
|
701
703
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?
|
|
702
|
-
LIMIT 1`,[e,o]),p=m[0];if(!p)throw new
|
|
704
|
+
LIMIT 1`,[e,o]),p=m[0];if(!p)throw new Gr(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 Xr=f(()=>{"use strict";h();Je()});import{HTTPException as xt}from"hono/http-exception";async function Zr(t){let{tableName:e,columnName:o,newColumnName:a,db:n}=t,r=S(n),[i]=await r.execute(`SELECT COUNT(*) as cnt
|
|
703
705
|
FROM information_schema.TABLES
|
|
704
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(i[0]?.cnt??0)>0))throw new
|
|
706
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,[e]);if(!(Number(i[0]?.cnt??0)>0))throw new xt(404,{message:`Table "${e}" does not exist`});let[s]=await r.execute(`SELECT COUNT(*) as cnt
|
|
705
707
|
FROM information_schema.COLUMNS
|
|
706
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(!(Number(s[0]?.cnt??0)>0))throw new
|
|
708
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,o]);if(!(Number(s[0]?.cnt??0)>0))throw new xt(404,{message:`Column "${o}" does not exist in table "${e}"`});let[m]=await r.execute(`SELECT COUNT(*) as cnt
|
|
707
709
|
FROM information_schema.COLUMNS
|
|
708
|
-
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,a]);if(Number(m[0]?.cnt??0)>0)throw new
|
|
710
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,[e,a]);if(Number(m[0]?.cnt??0)>0)throw new xt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.execute(`ALTER TABLE \`${e}\` RENAME COLUMN \`${o}\` TO \`${a}\``)}var es=f(()=>{"use strict";h()});import{HTTPException as Mt}from"hono/http-exception";async function ts(t){let{tableName:e,columnName:o,newColumnName:a,db:n}=t,r=C(n),i=`
|
|
709
711
|
SELECT EXISTS (
|
|
710
712
|
SELECT 1 FROM information_schema.tables
|
|
711
713
|
WHERE table_name = $1 AND table_schema = 'public'
|
|
712
714
|
) as exists;
|
|
713
|
-
`,{rows:c}=await r.query(i,[e]);if(!c[0]?.exists)throw new
|
|
715
|
+
`,{rows:c}=await r.query(i,[e]);if(!c[0]?.exists)throw new Mt(404,{message:`Table "${e}" does not exist`});let s=`
|
|
714
716
|
SELECT EXISTS (
|
|
715
717
|
SELECT 1 FROM information_schema.columns
|
|
716
718
|
WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
|
|
717
719
|
) as exists;
|
|
718
|
-
`,{rows:l}=await r.query(s,[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(s,[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 jc}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(s=>c[s]))??[]],r=Le.aoa_to_sheet(n),i=Le.sheet_to_csv(r);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let n=[t,...e?.map(s=>t?.map(l=>s[l]))??[]],r=Le.aoa_to_sheet(n),i=Le.book_new();Le.book_append_sheet(i,r,a.slice(0,31));let c=jc(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var as=f(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as Kc}from"hono";var ns,rs=f(()=>{"use strict";X();qr();Ur();xe();Hr();Vr();Yr();Jr();Zr();ts();as();ns=new Kc().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"),i=await P(n).deleteTable({tableName:a,db:e,cascade:o});return t.json({data:i},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"),i=P(r),{deletedCount:c}=await i.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:i,filters:c,db:s}=t.req.valid("query"),l=t.get("dbType"),p=await P(l).getTableData({tableName:e,cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s});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:i,rows:c}=await r.exportTableData({tableName:e,db:o}),s=os({cols:i,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(s,{headers:{"Content-Type":l??"","Content-Disposition":`attachment; filename="${e}_export.${a}"`}})})});var ss={};Pt(ss,{createServer:()=>Jc});import nt from"path";import{fileURLToPath as Vc}from"url";import{serveStatic as ot}from"@hono/node-server/serve-static";import{zValidator as Qc}from"@hono/zod-validator";import{Hono as Wc}from"hono";import{cors as Yc}from"hono/cors";import{logger as zc}from"hono/logger";import{prettyJSON as Gc}from"hono/pretty-json";var at,Jc,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(Vc(import.meta.url));return nt.resolve(t,"./core-dist")},Jc=()=>({app:new Wc({strict:!1}).use("/*",Yc()).use(Gc({space:2})).use(process.env.NODE_ENV==="development"?zc():(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).route("/",ua).use("/assets/*",ot({root:at()})).use("/image.png",ot({root:at()})).use("/:dbType/*",Qc("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).use("/*",ot({root:at()}))})});Pe();import{intro as Xc,outro as Zc}from"@clack/prompts";import{serve as el}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 i=await Kt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});st(i)&&(Ie("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=us(i);try{let s=await ms(c,"utf-8"),l=fs(s);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(s){let l=s;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(i){if(!i?.trim())return"Connection string is required!";try{new URL(i);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}},pe=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 pe(t):await pe();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.7",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":"^25.6.0","@types/pg":"^8.16.0","@types/mssql":"^12.3.0","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^6.0.3",vitest:"^4.0.17"}};var Xt=()=>{As(Jt.inverse(" db-studio ")),ws(Jt.green(`\u{1F680} db-studio v${Gt.version}`))};var tl=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:i}=Ht();r&&(Wt(),process.exit(0)),i&&(Xt(),process.exit(0)),n&&(await zt(t,o,a),process.exit(0)),Xc(Lt.inverse(" db-studio "));let c=e?parseInt(e,10):se.PORT,s=a||se.VAR_NAME,l=t?await pe(t):await pe(),m=o||await Vt(l,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(is(),ss)),{app:u}=p();el({fetch:u.fetch,port:c}),Zc(Lt.green(`Server running at ${Lt.cyan(`http://localhost:${c}`)}`))};tl().catch(t=>{process.exit(1)});export{tl as main};
|
|
720
|
+
`,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new Mt(404,{message:`Column "${o}" does not exist in table "${e}"`});let{rows:m}=await r.query(s,[e,a]);if(m[0]?.exists)throw new Mt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.query(`ALTER TABLE "${e}" RENAME COLUMN "${o}" TO "${a}"`)}var os=f(()=>{"use strict";h()});import{utils as Le,write as Kc}from"xlsx";function as({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(s=>c[s]))??[]],r=Le.aoa_to_sheet(n),i=Le.sheet_to_csv(r);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let n=[t,...e?.map(s=>t?.map(l=>s[l]))??[]],r=Le.aoa_to_sheet(n),i=Le.book_new();Le.book_append_sheet(i,r,a.slice(0,31));let c=Kc(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var ns=f(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as Vc}from"hono";var rs,ss=f(()=>{"use strict";Z();kr();Fr();Me();jr();Qr();zr();Xr();es();os();ns();rs=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",Co),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",Do),L("param",te),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a}=t.req.valid("param"),n=t.get("dbType"),i=await P(n).deleteTable({tableName:a,db:e,cascade:o});return t.json({data:i},200)}).delete("/:tableName/columns/:columnName",L("query",no),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"),i=P(r),{deletedCount:c}=await i.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",te),L("json",J),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 Yr({tableName:o,db:e,...a}):n==="mongodb"?await Hr({tableName:o,db:e,...a}):await qr({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 Zr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await Kr({tableName:o,columnName:a,db:e,...n}):await ts({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 Jr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await Vr({tableName:o,columnName:a,db:e,...n}):await Ur({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",te),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",te),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",te),L("query",qo),async t=>{let{tableName:e}=t.req.valid("param"),{cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s}=t.req.valid("query"),l=t.get("dbType"),p=await P(l).getTableData({tableName:e,cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s});return t.json({data:p},200)}).get("/:tableName/export",L("param",te),L("query",Oo),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:i,rows:c}=await r.exportTableData({tableName:e,db:o}),s=as({cols:i,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(s,{headers:{"Content-Type":l??"","Content-Disposition":`attachment; filename="${e}_export.${a}"`}})})});var is={};Pt(is,{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,cs=f(()=>{"use strict";Z();Vo();da();xr();Or();Ir();ss();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(jo).route("/",_r).route("/",pa).use("/assets/*",ot({root:at()})).use("/image.png",ot({root:at()})).use("/:dbType/*",Wc("param",eo,Ko)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",rs).route("/:dbType",Pr).route("/:dbType",Lr).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 Ht}from"commander";var jt=()=>(Ht.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),Ht.opts());import{readFile as ms}from"fs/promises";import{resolve as us}from"path";import{cancel as Ie,isCancel as st,note as Kt,select as ps,spinner as ds,text as Vt}from"@clack/prompts";import{parse as fs}from"dotenv";import it from"picocolors";var Qt=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?Kt(it.red(`${o} not found in .env or process.env`)):Kt(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 i=await Vt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});st(i)&&(Ie("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=us(i);try{let s=await ms(c,"utf-8"),l=fs(s);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(s){let l=s;Ie(`Cannot read or parse file: ${it.dim(l.message)}`),process.exit(1)}}a.stop("Manual input...");let r=await Vt({message:`Paste your ${o}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(i){if(!i?.trim())return"Connection string is required!";try{new URL(i);return}catch{return"Must be a valid URL format"}}});return 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}},pe=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 Wt from"picocolors";var Yt=()=>{hs(Wt.inverse(" db-studio ")),Cs(Wt.green(`For more information, visit: ${Ft.SITE_DOCS_LINK}`))};Pe();import{intro as Ss,note as Ns,outro as zt}from"@clack/prompts";import $e from"picocolors";var Gt=async(t,e,o)=>{Ss($e.inverse(" db-studio "));let a=o||oe.VAR_NAME,n=null;if(e)n=e;else{let r=t?await pe(t):await pe();r?.[a]?n=r[a]:process.env[a]&&(n=process.env[a]??null)}n?zt($e.green(`\u2713 Database connection configured (using ${a})`)):(Ns($e.red(`\u2717 ${a} not found`),"Status"),zt($e.yellow("\u26A0 No database connection configured")))};import{intro as As,outro as ws}from"@clack/prompts";import Xt from"picocolors";var Jt={name:"db-studio",type:"module",version:"1.7.9",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database 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":"^25.6.0","@types/pg":"^8.16.0","@types/mssql":"^12.3.0","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^6.0.3",vitest:"^4.0.17"}};var Zt=()=>{As(Xt.inverse(" db-studio ")),ws(Xt.green(`\u{1F680} db-studio v${Jt.version}`))};var ol=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:i}=jt();r&&(Yt(),process.exit(0)),i&&(Zt(),process.exit(0)),n&&(await Gt(t,o,a),process.exit(0)),Zc(Lt.inverse(" db-studio "));let c=e?parseInt(e,10):oe.PORT,s=a||oe.VAR_NAME,l=t?await pe(t):await pe(),m=o||await Qt(l,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(cs(),is)),{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};
|
|
719
721
|
//# sourceMappingURL=index.js.map
|