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