db-studio 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/index.js +29 -27
  2. package/dist/index.js.map +1 -1
  3. package/dist/web-dist/assets/_pathlessLayout-C6coCMpi.js +1 -0
  4. package/dist/web-dist/assets/{_pathlessLayout-ciCuJ1PR.js.map → _pathlessLayout-C6coCMpi.js.map} +1 -1
  5. package/dist/web-dist/assets/_pathlessLayout-DoBLI2ja.js +132 -0
  6. package/dist/web-dist/assets/_pathlessLayout-DoBLI2ja.js.map +1 -0
  7. package/dist/web-dist/assets/_queryId-Chj34V6b.js +1 -0
  8. package/dist/web-dist/assets/{_queryId-6swfGplM.js.map → _queryId-Chj34V6b.js.map} +1 -1
  9. package/dist/web-dist/assets/{_table-DHk3bHnN.js → _table-Bg4NvAi4.js} +1 -1
  10. package/dist/web-dist/assets/{_table-DHk3bHnN.js.map → _table-Bg4NvAi4.js.map} +1 -1
  11. package/dist/web-dist/assets/_table-CHFe8v3q.js +1 -0
  12. package/dist/web-dist/assets/{_table-dUsH_2LP.js.map → _table-CHFe8v3q.js.map} +1 -1
  13. package/dist/web-dist/assets/ai-assistant-D2oc4TtC.js +1 -0
  14. package/dist/web-dist/assets/ai-assistant-D2oc4TtC.js.map +1 -0
  15. package/dist/web-dist/assets/browser-B3ZulIJb.js +1 -0
  16. package/dist/web-dist/assets/{browser-CKmBpcoz.js.map → browser-B3ZulIJb.js.map} +1 -1
  17. package/dist/web-dist/assets/code-editor-q3FlZk-L.js +9 -0
  18. package/dist/web-dist/assets/code-editor-q3FlZk-L.js.map +1 -0
  19. package/dist/web-dist/assets/{database.store-BvoUSH8Y.js → database.store-O79u8Fhj.js} +1 -1
  20. package/dist/web-dist/assets/{database.store-BvoUSH8Y.js.map → database.store-O79u8Fhj.js.map} +1 -1
  21. package/dist/web-dist/assets/{dist-C-7rnx4R.js → dist-DBHqGKiG.js} +1 -1
  22. package/dist/web-dist/assets/{dist-C-7rnx4R.js.map → dist-DBHqGKiG.js.map} +1 -1
  23. package/dist/web-dist/assets/highlighted-body-OFNGDK62-CFFJC4SW.js +1 -0
  24. package/dist/web-dist/assets/{highlighted-body-OFNGDK62-qZDgwznf.js.map → highlighted-body-OFNGDK62-CFFJC4SW.js.map} +1 -1
  25. package/dist/web-dist/assets/{icons-0UA1AvNu.js → icons-CtpwLWUI.js} +1 -1
  26. package/dist/web-dist/assets/icons-CtpwLWUI.js.map +1 -0
  27. package/dist/web-dist/assets/index-Cyl_0l9I.css +2 -0
  28. package/dist/web-dist/assets/index-XoXxezo4.js +35 -0
  29. package/dist/web-dist/assets/index-XoXxezo4.js.map +1 -0
  30. package/dist/web-dist/assets/{indexes-D-oUHra7.js → indexes-C9QqJKhp.js} +1 -1
  31. package/dist/web-dist/assets/{indexes-D-oUHra7.js.map → indexes-C9QqJKhp.js.map} +1 -1
  32. package/dist/web-dist/assets/{logs-wkipM6zd.js → logs-B8ah8F7D.js} +1 -1
  33. package/dist/web-dist/assets/{logs-wkipM6zd.js.map → logs-B8ah8F7D.js.map} +1 -1
  34. package/dist/web-dist/assets/mermaid-GHXKKRXX-TpVEoP0K.js +1 -0
  35. package/dist/web-dist/assets/popover-wbdw6Hmx.js +1 -0
  36. package/dist/web-dist/assets/popover-wbdw6Hmx.js.map +1 -0
  37. package/dist/web-dist/assets/queries.store-CoJVGJKk.js +1 -0
  38. package/dist/web-dist/assets/queries.store-CoJVGJKk.js.map +1 -0
  39. package/dist/web-dist/assets/query-runner-Bgs0j50a.js +17 -0
  40. package/dist/web-dist/assets/query-runner-Bgs0j50a.js.map +1 -0
  41. package/dist/web-dist/assets/radix-ui-CgJOuzDv.js +51 -0
  42. package/dist/web-dist/assets/radix-ui-CgJOuzDv.js.map +1 -0
  43. package/dist/web-dist/assets/react-Cxb6eTZp.js +1 -0
  44. package/dist/web-dist/assets/{react-B_x-GW6a.js.map → react-Cxb6eTZp.js.map} +1 -1
  45. package/dist/web-dist/assets/{react-dom-CsRkF-uK.js → react-dom-yg5bT29P.js} +1 -1
  46. package/dist/web-dist/assets/{react-dom-CsRkF-uK.js.map → react-dom-yg5bT29P.js.map} +1 -1
  47. package/dist/web-dist/assets/redis-value-COa6YzFD.js +1 -0
  48. package/dist/web-dist/assets/{redis-value-Dq29EMpv.js.map → redis-value-COa6YzFD.js.map} +1 -1
  49. package/dist/web-dist/assets/runner-DW5iXMmq.js +1 -0
  50. package/dist/web-dist/assets/{runner-CL63BPMX.js.map → runner-DW5iXMmq.js.map} +1 -1
  51. package/dist/web-dist/assets/schema-CtOicTEt.js +64 -0
  52. package/dist/web-dist/assets/schema-CtOicTEt.js.map +1 -0
  53. package/dist/web-dist/assets/{schema-CIr5j9z3.js → schema-oy5o_4bt.js} +1 -1
  54. package/dist/web-dist/assets/{schema-CIr5j9z3.js.map → schema-oy5o_4bt.js.map} +1 -1
  55. package/dist/web-dist/assets/{table-BoQghHv7.js → table-CN9ZTCOi.js} +1 -1
  56. package/dist/web-dist/assets/{table-BoQghHv7.js.map → table-CN9ZTCOi.js.map} +1 -1
  57. package/dist/web-dist/assets/{tanstack-C-qfmRNM.js → tanstack-g1w0v_rJ.js} +6 -6
  58. package/dist/web-dist/assets/tanstack-g1w0v_rJ.js.map +1 -0
  59. package/dist/web-dist/assets/tooltip-B7gM8xl3.js +9 -0
  60. package/dist/web-dist/assets/tooltip-B7gM8xl3.js.map +1 -0
  61. package/dist/web-dist/assets/{visualizer-qFaRAy7F.js → visualizer-DcEwqmuY.js} +1 -1
  62. package/dist/web-dist/assets/{visualizer-qFaRAy7F.js.map → visualizer-DcEwqmuY.js.map} +1 -1
  63. package/dist/web-dist/index.html +12 -12
  64. package/package.json +1 -1
  65. package/dist/web-dist/assets/_pathlessLayout-CJRtdlfu.js +0 -132
  66. package/dist/web-dist/assets/_pathlessLayout-CJRtdlfu.js.map +0 -1
  67. package/dist/web-dist/assets/_pathlessLayout-ciCuJ1PR.js +0 -1
  68. package/dist/web-dist/assets/_queryId-6swfGplM.js +0 -1
  69. package/dist/web-dist/assets/_table-dUsH_2LP.js +0 -1
  70. package/dist/web-dist/assets/browser-CKmBpcoz.js +0 -1
  71. package/dist/web-dist/assets/code-editor-C9H5SO98.js +0 -9
  72. package/dist/web-dist/assets/code-editor-C9H5SO98.js.map +0 -1
  73. package/dist/web-dist/assets/highlighted-body-OFNGDK62-qZDgwznf.js +0 -1
  74. package/dist/web-dist/assets/icons-0UA1AvNu.js.map +0 -1
  75. package/dist/web-dist/assets/index-BSNZ1oRs.js +0 -35
  76. package/dist/web-dist/assets/index-BSNZ1oRs.js.map +0 -1
  77. package/dist/web-dist/assets/index-BWKgNfEb.css +0 -2
  78. package/dist/web-dist/assets/mermaid-GHXKKRXX-BZ1Tdv8E.js +0 -1
  79. package/dist/web-dist/assets/popover-WwEzK7ho.js +0 -1
  80. package/dist/web-dist/assets/popover-WwEzK7ho.js.map +0 -1
  81. package/dist/web-dist/assets/query-runner-B-lngX3P.js +0 -9
  82. package/dist/web-dist/assets/query-runner-B-lngX3P.js.map +0 -1
  83. package/dist/web-dist/assets/radix-ui-6dcJ5m4U.js +0 -51
  84. package/dist/web-dist/assets/radix-ui-6dcJ5m4U.js.map +0 -1
  85. package/dist/web-dist/assets/react-B_x-GW6a.js +0 -1
  86. package/dist/web-dist/assets/redis-value-Dq29EMpv.js +0 -1
  87. package/dist/web-dist/assets/runner-CL63BPMX.js +0 -1
  88. package/dist/web-dist/assets/schema-BNzZaUjg.js +0 -64
  89. package/dist/web-dist/assets/schema-BNzZaUjg.js.map +0 -1
  90. package/dist/web-dist/assets/tanstack-C-qfmRNM.js.map +0 -1
  91. package/dist/web-dist/assets/toggle-group-CxRlYNqR.js +0 -1
  92. package/dist/web-dist/assets/toggle-group-CxRlYNqR.js.map +0 -1
  93. package/dist/web-dist/assets/tooltip-1-bWFncb.js +0 -9
  94. package/dist/web-dist/assets/tooltip-1-bWFncb.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var po=Object.defineProperty;var N=(n,e)=>()=>(n&&(e=n(n=0)),e);var Yt=(n,e)=>{for(var t in e)po(n,t,{get:e[t],enumerable:!0})};var Gr=N(()=>{"use strict"});var Qr=N(()=>{"use strict"});var Jr=N(()=>{"use strict"});var Zr,Xr,Ce,en=N(()=>{"use strict";Zr=globalThis.process?.env,Xr=Zr?.NODE_ENV,Ce={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:Xr==="development",PROXY_URL:Zr?.DB_STUDIO_PROXY_URL??(Xr==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var tn=N(()=>{"use strict"});var rn,Gt=N(()=>{"use strict";rn={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"db-studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var nn=N(()=>{"use strict"});var et=N(()=>{"use strict";Gr();Qr();Jr();en();tn();Gt();nn()});import Oo from"better-sqlite3";import{Redis as vo}from"ioredis";import{MongoClient as Lo,ObjectId as er}from"mongodb";import Mo from"mssql";import{createPool as ko}from"mysql2/promise";import{Pool as hn}from"pg";var tr,be,bt,gt,ht,$e,Tt,Et,wt,Tn,Rt,En,wn,Ct,St,ke=N(()=>{"use strict";tr=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;sqliteDb=null;redisClients=new Map;redisClusterChecked=!1;baseConfig=null;initError=null;constructor(){try{this.initializeBaseConfig()}catch(e){this.initError=e instanceof Error?e:new Error(String(e))}}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";case"sqlite":return"sqlite";case"redis":case"rediss":return"redis";default:throw new Error(`Unsupported database type: ${t}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), SQL Server (mssql://), MongoDB (mongodb://), SQLite (sqlite://), Redis/Valkey (redis:// or rediss://).`)}}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");if(e.startsWith("sqlite://")){this.baseConfig={url:e,host:"localhost",port:0,user:"",password:"",dbType:"sqlite"};return}try{let t=new URL(e),r=this.detectDbType(t),a=r==="mysql"?3306:r==="mssql"?1433:r==="mongodb"?27017:r==="redis"?6379:5432;this.baseConfig={url:e,host:t.hostname,port:Number.parseInt(t.port,10)||a,user:t.username,password:t.password,dbType:r}}catch(t){throw new Error(t instanceof Error?t.message:String(t))}}getDbType(){if(this.initError)throw this.initError;if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(this.initError)throw this.initError;if(!this.baseConfig)throw new Error("Base configuration not initialized");if(this.baseConfig.dbType==="sqlite")return this.baseConfig.url;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)}`)}}getSqliteDb(){if(!this.baseConfig||this.baseConfig.dbType!=="sqlite")throw new Error("DATABASE_URL is not a sqlite:// connection");if(!this.sqliteDb){let e=this.baseConfig.url.replace(/^sqlite:\/\//,""),t=new Oo(e);t.pragma("journal_mode = WAL"),t.pragma("foreign_keys = ON"),this.sqliteDb=t}return this.sqliteDb}closeSqliteDb(){this.sqliteDb&&(this.sqliteDb.close(),this.sqliteDb=null)}getPgPool(e){let t=this.buildConnectionString(e);if(!this.pgPools.has(t)){let r={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new hn(r);a.on("error",o=>{}),this.pgPools.set(t,a)}return this.pgPools.get(t)??new hn({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 a=new URL(t).pathname.slice(1),o=ko({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:a||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 a=new URL(t).pathname.slice(1),o={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:a||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},s=await new Mo.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){if(this.baseConfig?.dbType==="sqlite"&&e===this.baseConfig.url){this.closeSqliteDb();return}await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){if(this.baseConfig?.dbType==="sqlite"){this.closeSqliteDb();return}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 Lo(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 getRedisClient(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(this.baseConfig.dbType!=="redis")throw new Error("DATABASE_URL is not a redis:// connection");let t=e??this.getRedisDefaultDb(),r=this.redisClients.get(t);if(r)return r;let a=new URL(this.baseConfig.url),o={host:this.baseConfig.host,port:this.baseConfig.port,db:t,lazyConnect:!0,maxRetriesPerRequest:1,enableReadyCheck:!0,connectTimeout:2e3};this.baseConfig.user&&(o.username=decodeURIComponent(this.baseConfig.user)),this.baseConfig.password&&(o.password=decodeURIComponent(this.baseConfig.password)),a.protocol==="rediss:"&&(o.tls={});let s=new vo(o);try{if(await s.connect(),!this.redisClusterChecked){let c=await s.info("server");if(/^redis_mode:(cluster|sentinel)\b/m.test(c))throw await s.quit().catch(()=>{}),new Error("Redis cluster and Sentinel modes are not supported. Use a standalone redis:// connection.");let i=c.match(/^redis_version:([^\r\n]+)/m)?.[1],[l=0,u=0]=i?.split(".").map(Number)??[];if(l<6||l===6&&u<2)throw await s.quit().catch(()=>{}),new Error(`Redis 6.2 or newer is required. Connected server reports ${i??"an unknown version"}.`);this.redisClusterChecked=!0}}catch(c){throw await s.quit().catch(()=>{}),c}return this.redisClients.set(t,s),s}async getIsolatedRedisClient(e){let t=(await this.getRedisClient(e)).duplicate();return await t.connect(),t}getRedisDefaultDb(){if(!this.baseConfig)return 0;try{let t=new URL(this.baseConfig.url).pathname.replace(/^\//,"");if(!t)return 0;let r=Number.parseInt(t,10);return Number.isFinite(r)?r:0}catch{return 0}}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([o,s])=>{await s.end()}),t=Array.from(this.mysqlPools.entries()).map(async([o,s])=>{await s.end()}),r=Array.from(this.mssqlPools.entries()).map(async([o,s])=>{await s.close()});await Promise.all([...e,...t,...r]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null),this.closeSqliteDb();let a=Array.from(this.redisClients.entries()).map(async([o,s])=>{await s.quit().catch(()=>{})});await Promise.all(a),this.redisClients.clear(),this.redisClusterChecked=!1}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},be=new tr,bt=n=>be.getPgPool(n),gt=n=>be.getMysqlPool(n),ht=async n=>be.getMssqlPool(n),$e=()=>be.getDbType(),Tt=()=>be.getSqliteDb(),Et=()=>be.getMongoClient(),wt=()=>be.getMongoDbName(),Tn=n=>be.getMongoDb(n),Rt=n=>be.getRedisClient(n),En=n=>be.getIsolatedRedisClient(n),wn=()=>be.getRedisDefaultDb(),Ct=n=>typeof n=="string"&&er.isValid(n),St=n=>typeof n=="string"&&er.isValid(n)?new er(n):n});var Cn={};Yt(Cn,{checkDatabaseConnection:()=>Fo,getDatabaseConnectionDetails:()=>Bo});var Rn,qo,Uo,Bo,Fo,Sn=N(()=>{"use strict";ke();Rn={pg:"PostgreSQL",mysql:"MySQL",mssql:"SQL Server",mongodb:"MongoDB",sqlite:"SQLite",redis:"Redis"},qo=2e3,Uo=async n=>{let e;try{return await Promise.race([n,new Promise((t,r)=>{e=setTimeout(()=>r(new Error("Database startup check timed out")),qo)})])}finally{e&&clearTimeout(e)}},Bo=n=>{let e=$e();if(e==="sqlite")return{type:e,name:Rn[e],destination:"local file"};let t=new URL(n),r={pg:5432,mysql:3306,mssql:1433,mongodb:27017,redis:6379},a=Number.parseInt(t.port,10)||r[e];return{type:e,name:Rn[e],destination:`${t.hostname}:${a}`}},Fo=async n=>{switch(n){case"pg":await Uo(bt().query("SELECT 1"));return;case"mysql":await gt().query("SELECT 1");return;case"mssql":await(await ht()).request().query("SELECT 1");return;case"mongodb":{await(await Et()).db(wt()).command({ping:1});return}case"sqlite":Tt().prepare("SELECT 1").get();return;case"redis":await(await Rt()).ping()}}});import{HTTPException as Nn}from"hono/http-exception";function L(n){return pe.get(n)}function Ie(n,e){if(!jo(n))throw new Nn(400,{message:`Key browsing is not supported for database type: "${e}"`});return n}var rr,pe,jo,Pe=N(()=>{"use strict";rr=class{adapters=new Map;register(e,t){this.adapters.set(e,t)}get(e){let t=this.adapters.get(e);if(!t)throw new Nn(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()]}},pe=new rr;jo=n=>"scanKeys"in n&&typeof n.scanKeys=="function"});import{HTTPException as Ke}from"hono/http-exception";import{DatabaseError as Ko}from"pg";function ee(n){throw new Ke(501,{message:`${n} is not implemented for this database type`})}var ce,qe=N(()=>{"use strict";ce=class{wrapError(e){if(e instanceof Ke)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.message.startsWith("NOAUTH")||e.message.startsWith("WRONGPASS")||e.message.startsWith("LOADING")||e.message.startsWith("BUSY")||e.message.startsWith("READONLY")||e.message.startsWith("CLUSTERDOWN")||e.message.includes("Redis cluster mode is not supported")||e instanceof Ko&&e.code?.startsWith("08")?new Ke(503,{message:e.message}):new Ke(500,{message:e.message})}return new Ke(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[r,a]of Object.entries(e))t[r]=a;return t}async getTableData(e){try{let{db:t,limit:r=50,direction:a="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>r;l&&(i=i.slice(0,r));let u=this.normalizeRows(i);a==="desc"&&(u=u.reverse());let{nextCursor:m,prevCursor:p}=this.buildCursors(e,u,l);return{data:u,meta:{limit:r,total:c,hasNextPage:a==="asc"?l:!!e.cursor,hasPreviousPage:a==="asc"?!!e.cursor:l,nextCursor:m,prevCursor:p}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let r=`SELECT * FROM ${this.quoteIdentifier(e)}`,a=await this.runQuery(t,r,[]);if(!a||a.length===0)throw new Ke(404,{message:`Table "${e}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}catch(r){throw this.wrapError(r)}}getDatabasesList(){return ee("getDatabasesList")}getCurrentDatabase(){return ee("getCurrentDatabase")}getDatabaseConnectionInfo(){return ee("getDatabaseConnectionInfo")}getTablesList(e){return ee("getTablesList")}createTable(e){return ee("createTable")}deleteTable(e){return ee("deleteTable")}getTableSchema(e){return ee("getTableSchema")}getTableColumns(e){return ee("getTableColumns")}addColumn(e){return ee("addColumn")}deleteColumn(e){return ee("deleteColumn")}alterColumn(e){return ee("alterColumn")}renameColumn(e){return ee("renameColumn")}addRecord(e){return ee("addRecord")}updateRecords(e){return ee("updateRecords")}deleteRecords(e){return ee("deleteRecords")}forceDeleteRecords(e){return ee("forceDeleteRecords")}bulkInsertRecords(e){return ee("bulkInsertRecords")}executeQuery(e){return ee("executeQuery")}}});var Q,z,V,X,nr,ar,ne,ue,Nt,Ue,Be=N(()=>{"use strict";ke();Q=n=>bt(n),z=n=>gt(n),V=n=>ht(n),X=()=>Tt(),nr=()=>Et(),ar=()=>wt(),ne=n=>Tn(n),ue=n=>Rt(n),Nt=n=>En(n),Ue=()=>wn()});function Oe(){let n=process.env.DATABASE_URL;if(!n)return{host:"localhost",port:5432};try{let e=new URL(n),t=e.protocol.replace(":",""),r=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)||r}}catch{return{host:"localhost",port:5432}}}var tt=N(()=>{"use strict"});function An(n){if(!n||n.length===0)return{};let e=[];for(let t of n){let r=t.columnName,a=Ho(t.value),o=t.operator.toLowerCase();if(r)switch(o){case"=":e.push({[r]:a});break;case"!=":e.push({[r]:{$ne:a}});break;case">":e.push({[r]:{$gt:a}});break;case">=":e.push({[r]:{$gte:a}});break;case"<":e.push({[r]:{$lt:a}});break;case"<=":e.push({[r]:{$lte:a}});break;case"is":e.push({[r]:a});break;case"is not":e.push({[r]:{$ne:a}});break;case"like":e.push({[r]:{$regex:At(String(a)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:At(String(a)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:At(String(a)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:At(String(a)),$options:"i"}}});break;default:e.push({[r]:a});break}}return e.length?{$and:e}:{}}function or(n,e){return n?Array.isArray(n)?n.length===0?{_id:1}:Object.fromEntries(n.map(t=>[t.columnName,t.direction==="desc"?-1:1])):typeof n=="string"&&n.length>0?{[n]:e==="desc"?-1:1}:{_id:1}:{_id:1}}function sr(n){return Buffer.from(JSON.stringify({offset:n})).toString("base64url")}function Dn(n){if(!n)return 0;try{let e=JSON.parse(Buffer.from(n,"base64url").toString("utf-8"));return typeof e.offset=="number"?e.offset:0}catch{return 0}}var At,Ho,_n=N(()=>{"use strict";ke();At=n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Ho=n=>{let e=n.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:Ct(e)?St(e):e}});import{HTTPException as F}from"hono/http-exception";var ir,He,Vo,zo,xn,rt,Wo,Pn,Yo,Go,Qo,Ve,Dt,$n=N(()=>{"use strict";qe();Be();ke();tt();_n();ir=n=>n instanceof Date?n.toISOString():typeof n=="bigint"?n.toString():n&&typeof n=="object"?"_bsontype"in n&&n._bsontype==="ObjectId"?n.toHexString():Array.isArray(n)?n.map(e=>ir(e)):Object.fromEntries(Object.entries(n).map(([e,t])=>[e,ir(t)])):n,He=n=>ir(n),Vo=n=>n instanceof Date?"date":n&&typeof n=="object"?Array.isArray(n)?"array":"_bsontype"in n?"text":"json":typeof n=="boolean"?"boolean":typeof n=="number"||typeof n=="bigint"?"number":"text",zo=n=>{switch(n){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"}},xn=n=>typeof n=="string"&&Ct(n),rt=n=>St(n),Wo=n=>{if(!Number.isFinite(n))return"n/a";let e=["B","KB","MB","GB","TB"],t=n,r=0;for(;t>=1024&&r<e.length-1;)t/=1024,r++;return`${t.toFixed(1)} ${e[r]}`},Pn=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),Yo=n=>{let e=n.trim();if(Pn.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},Go=n=>{if(n==null)return"null";if(n instanceof Date)return"date";if(typeof n=="boolean")return"bool";if(typeof n=="number")return Number.isInteger(n)?"int":"double";if(typeof n=="bigint")return"long";if(Array.isArray(n))return"array";if(typeof n=="object"){let e=n._bsontype;return e==="ObjectId"?"objectId":e==="Decimal128"?"decimal":e==="Binary"?"binData":e==="Timestamp"?"timestamp":e?e.toLowerCase():"object"}return"string"},Qo=(n,e)=>{if(n!=null&&n.trim()!=="")try{return JSON.parse(n)}catch{return n}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}},Ve=n=>{if(n._id&&typeof n._id=="string")return{...n,_id:rt(n._id)};if(n._id&&typeof n._id=="object"){let e=n._id;if(Array.isArray(e.$in))return{...n,_id:{...e,$in:e.$in.map(t=>typeof t=="string"?rt(t):t)}};if(Array.isArray(e.$nin))return{...n,_id:{...e,$nin:e.$nin.map(t=>typeof t=="string"?rt(t):t)}}}return n},Dt=class extends ce{runQuery(){throw new F(501,{message:"runQuery is not supported for MongoDB"})}buildTableDataQuery(e){throw new F(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 F)return e;if(e instanceof Error){let t=e.name??"";if(t==="MongoNetworkError"||t==="MongoServerSelectionError"||t==="MongoTopologyClosedError")return new F(503,{message:e.message})}return super.wrapError(e)}async getTableData(e){try{let{tableName:t,db:r,cursor:a,limit:o,direction:s="asc",sort:c,order:i,filters:l}=e,m=(await ne(r)).collection(t),p=An(l??[]),d=or(c??"",i),f=o&&o>0?o:50,y=Dn(a),g=Number.isFinite(y)&&y>=0?y:0,E=s==="desc"?Math.max(g-f,0):g,[T,S]=await Promise.all([m.countDocuments(p),m.find(p).sort(d).skip(E).limit(f).toArray()]),C=S.map(A=>He(A)),R=E+f,w=Math.max(E-f,0);return{data:C,meta:{limit:f,total:T,hasNextPage:R<T,hasPreviousPage:E>0,nextCursor:R<T?sr(R):null,prevCursor:E>0?sr(w):null}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let s=(await(await ne(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(r){throw this.wrapError(r)}}async getDatabasesList(){try{let a=(await(await nr()).db().admin().listDatabases()).databases??[];if(!a[0])throw new F(500,{message:"No databases returned from MongoDB"});return a.map(o=>({name:o.name,size:Wo(o.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:ar()}}async getDatabaseConnectionInfo(){try{let t=(await nr()).db().admin(),r=Oe(),a={};try{a=await t.serverStatus()}catch{}return{host:r.host,port:r.port,user:"n/a",database:ar(),version:a.version??"unknown",active_connections:a.connections?.current??0,max_connections:(a.connections?.current??0)+(a.connections?.available??0)}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=await ne(e),r=await t.listCollections().toArray(),a=[];for(let o of r){let s=await t.collection(o.name).estimatedDocumentCount();a.push({tableName:o.name,rowCount:s})}return a}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){try{let r=e?.tableName??"",a=await ne(t);if((await a.listCollections({name:r}).toArray()).length>0)throw new F(400,{message:`Collection "${r}" already exists`});let s=e?.fields??[];if(s.length===0){await a.createCollection(r);return}let c={},i=[];for(let l of s){let u=Yo(l.columnType);if(!Pn.has(u))throw new F(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 a.createCollection(r,{validator:{$jsonSchema:{bsonType:"object",required:i,properties:c,additionalProperties:!0}},validationAction:"error"})}catch(r){throw this.wrapError(r)}}async deleteTable({tableName:e,db:t}){try{let a=(await ne(t)).collection(e),o=await a.estimatedDocumentCount();return await a.drop(),{deletedCount:o,fkViolation:!1,relatedRecords:[]}}catch(r){throw this.wrapError(r)}}async getTableSchema({tableName:e,db:t}){try{let r=await ne(t);if((await r.listCollections({name:e}).toArray()).length===0)throw new F(404,{message:`Collection "${e}" does not exist`});let o=r.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[f,y]of Object.entries(d)){let g=Go(y);i.has(f)||(i.set(f,new Set),l.set(f,0)),i.get(f)?.add(g),l.set(f,(l.get(f)??0)+1)}let u={},m=[];for(let[d,f]of i.entries()){let y=l.get(d)??0,g=Array.from(f).filter(T=>T!=="null"),E=f.has("null")||y<s.length;y===s.length&&s.length>0&&!E&&m.push(d),u[d]=g.length===1?{bsonType:E?[g[0],"null"]:g[0]}:{bsonType:E?[...g,"null"]:g}}let p={collection:e,estimatedDocumentCount:c,sampledDocuments:s.length,jsonSchema:{bsonType:"object",required:m.length>0?m:void 0,properties:u}};return JSON.stringify(p,null,2)}catch(r){throw this.wrapError(r)}}async getTableColumns({tableName:e,db:t}){try{let o=await(await ne(t)).collection(e).find({}).limit(200).toArray(),s=o.length,c=new Map,i=(l,u)=>{let m=Vo(u);if(!c.has(l))c.set(l,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=c.get(l);p.types.add(m),p.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 p=c.get(u);p.nullable=!0,p.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:zo(m),isNullable:u.nullable,columnDefault:null,isPrimaryKey:l==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}catch(r){throw this.wrapError(r)}}async addColumn(e){try{let{tableName:t,columnName:r,columnType:a,defaultValue:o,isNullable:s,db:c}=e,i=await ne(c),l=await i.listCollections({name:t}).toArray();if(l.length===0)throw new F(404,{message:`Collection "${t}" does not exist`});if(await i.collection(t).findOne({[r]:{$exists:!0}}))throw new F(409,{message:`Field "${r}" already exists in collection "${t}"`});let m=Qo(o,a);await i.collection(t).updateMany({},{$set:{[r]:m}});let d=l[0].options?.validator?.$jsonSchema??{},f={...d.properties??{},[r]:{bsonType:s?[a,"null"]:a}},y=[...d.required??[]];!s&&!y.includes(r)&&y.push(r),await i.command({collMod:t,validator:{$jsonSchema:{...d,bsonType:"object",properties:f,...y.length>0?{required:y}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async deleteColumn({tableName:e,columnName:t,db:r}){try{return{deletedCount:(await(await ne(r)).collection(e).updateMany({},{$unset:{[t]:""}})).modifiedCount}}catch(a){throw this.wrapError(a)}}async alterColumn(e){try{let{tableName:t,columnName:r,columnType:a,isNullable:o,db:s}=e,c=await ne(s),i=await c.listCollections({name:t}).toArray();if(i.length===0)throw new F(404,{message:`Collection "${t}" does not exist`});if(r==="_id")throw new F(400,{message:'Cannot alter the "_id" field'});let u=i[0].options?.validator?.$jsonSchema??{},m={...u.properties??{}},p=[...u.required??[]];m[r]={bsonType:o?[a,"null"]:a};let d=p.indexOf(r);!o&&d===-1?p.push(r):o&&d!==-1&&p.splice(d,1),await c.command({collMod:t,validator:{$jsonSchema:{...u,bsonType:"object",properties:m,...p.length>0?{required:p}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async renameColumn(e){try{let{tableName:t,columnName:r,newColumnName:a,db:o}=e,s=await ne(o);if((await s.listCollections({name:t}).toArray()).length===0)throw new F(404,{message:`Collection "${t}" does not exist`});if(r==="_id")throw new F(400,{message:'Cannot rename the "_id" field'});if(!await s.collection(t).findOne({[r]:{$exists:!0}}))throw new F(404,{message:`Field "${r}" does not exist in collection "${t}"`});if(await s.collection(t).findOne({[a]:{$exists:!0}}))throw new F(409,{message:`Field "${a}" already exists in collection "${t}"`});await s.collection(t).updateMany({[r]:{$exists:!0}},{$rename:{[r]:a}})}catch(t){throw this.wrapError(t)}}async addRecord({db:e,params:t}){try{let{tableName:r,data:a}=t,s=(await ne(e)).collection(r),c=He(a);if((c._id===""||c._id===null)&&delete c._id,!(await s.insertOne(c)).insertedId)throw new F(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:1}}catch(r){throw this.wrapError(r)}}async updateRecords({db:e,params:t}){try{let{tableName:r,updates:a,primaryKey:o}=t,c=(await ne(e)).collection(r),i=0,l=o||"_id",u=new Map;for(let m of a){let p=m.rowData[l];if(p==null)throw new F(400,{message:`Primary key "${l}" not found in row data.`});u.has(p)||u.set(p,{}),u.get(p)[m.columnName]=m.value}for(let[m,p]of u.entries()){let d=l==="_id"&&xn(m)?rt(m):m,f=await c.updateOne({[l]:d},{$set:p});if(f.matchedCount===0)throw new F(404,{message:`Record with ${l} = ${String(m)} not found in "${r}"`});i+=f.modifiedCount}return{updatedCount:i}}catch(r){throw this.wrapError(r)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:r,db:a}=e,s=(await ne(a)).collection(t),c=r[0]?.columnName??"_id",i=r.map(u=>c==="_id"&&xn(u.value)?rt(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:r,db:a}=e;if(!r||r.length===0)throw new F(400,{message:"At least one record is required"});let s=(await ne(a)).collection(t),c=r.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:r.length-i.insertedCount}}catch(t){throw this.wrapError(t)}}async executeQuery({query:e,db:t}){try{if(!e?.trim())throw new F(400,{message:"Query is required"});let r;try{r=JSON.parse(e)}catch{throw new F(400,{message:"Mongo query must be valid JSON"})}if(!r.collection||!r.operation)throw new F(400,{message:"Mongo query must include collection and operation"});let o=(await ne(t)).collection(r.collection),s=performance.now(),c=[],i=0,l;switch(r.operation){case"find":{let d=Ve(r.filter??{}),f=o.find(d,r.options??{});f.sort(r.sort??or("",void 0)),r.skip&&f.skip(r.skip),r.limit&&f.limit(r.limit),c=await f.toArray(),i=c.length;break}case"aggregate":{c=await o.aggregate(r.pipeline??[],r.options??{}).toArray(),i=c.length;break}case"insertOne":{let d=r.document;if(!d)throw new F(400,{message:"document is required"});i=(await o.insertOne(d)).insertedId?1:0,l="OK";break}case"insertMany":{let d=r.document;if(!Array.isArray(d))throw new F(400,{message:"document array is required"});i=(await o.insertMany(d)).insertedCount??0,l="OK";break}case"updateOne":{let d=Ve(r.filter??{});if(!r.update)throw new F(400,{message:"update is required"});let f=await o.updateOne(d,r.update,r.options??{});i=f.matchedCount??0,l=`OK (${f.modifiedCount??0} modified)`;break}case"updateMany":{let d=Ve(r.filter??{});if(!r.update)throw new F(400,{message:"update is required"});let f=await o.updateMany(d,r.update,r.options??{});i=f.matchedCount??0,l=`OK (${f.modifiedCount??0} modified)`;break}case"deleteOne":{let d=Ve(r.filter??{});i=(await o.deleteOne(d,r.options??{})).deletedCount??0,l="OK";break}case"deleteMany":{let d=Ve(r.filter??{});i=(await o.deleteMany(d,r.options??{})).deletedCount??0,l="OK";break}case"count":{let d=Ve(r.filter??{});i=await o.countDocuments(d),c=[{count:i}],l="OK";break}default:throw new F(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(r){throw this.wrapError(r)}}}});import{z as ze}from"zod";var P,On,nt,Jo,Xo,ge,he=N(()=>{"use strict";P=ze.object({db:ze.string("Database name is required")}),On=["pg","mysql","mssql","mongodb","sqlite","redis"],nt=ze.enum(On,{message:"Invalid database type"}),Jo=P.extend({dbType:nt}),Xo=ze.object({dbType:nt}),ge=ze.object({tableName:ze.string("Table name is required")})});import{z as Se}from"zod";var Te,Zo,es,vn=N(()=>{"use strict";he();Te=Se.object({columnName:Se.string("Column name is required"),columnType:Se.string("Column type is required"),defaultValue:Se.string().optional(),isPrimaryKey:Se.boolean().default(!1),isNullable:Se.boolean().default(!1),isUnique:Se.boolean().default(!1),isIdentity:Se.boolean().default(!1),isArray:Se.boolean().default(!1)}),Zo=ge,es=Se.object({db:P.shape.db,tableName:ge.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 at}from"zod";var lr,Ln=N(()=>{"use strict";lr=at.object({tableName:at.string("Table name is required"),data:at.record(at.string("Column name is required"),at.any())})});import{z as Ee}from"zod";var cr,oe,ts,rs,_t=N(()=>{"use strict";he();cr=P.extend({cascade:Ee.string().optional().transform(n=>n==="true")}),oe=Ee.object({tableName:Ee.string("Table name is required"),columnName:Ee.string("Column name is required")}),ts=Ee.object({db:P.shape.db,tableName:oe.shape.tableName,columnName:oe.shape.columnName,cascade:Ee.boolean().optional()}),rs=Ee.object({message:Ee.string("Message is required"),tableName:Ee.string("Table name is required"),columnName:Ee.string("Column name is required"),deletedCount:Ee.number("Deleted count is required").default(0)})});import{z as ot}from"zod";var We,ns,as,Mn=N(()=>{"use strict";he();_t();We=ot.object({columnType:ot.string("Column type is required"),isNullable:ot.boolean(),defaultValue:ot.string().nullable().optional()}),ns=oe,as=ot.object({db:P.shape.db,tableName:oe.shape.tableName,columnName:oe.shape.columnName,columnType:We.shape.columnType,isNullable:We.shape.isNullable,defaultValue:We.shape.defaultValue})});var kn=N(()=>{"use strict"});import{z as Ye}from"zod";var ur,In=N(()=>{"use strict";ur=Ye.object({tableName:Ye.string().min(1,"Table name is required"),records:Ye.array(Ye.record(Ye.string(),Ye.any())).min(1,"At least one record is required")})});import{z as we}from"zod";var os,mr,qn=N(()=>{"use strict";he();os=we.object({type:we.string(),content:we.string().optional()}).passthrough(),mr=we.object({messages:we.array(we.object({id:we.string(),role:we.enum(["user","assistant","system","tool"]),parts:we.array(os)}).passthrough()),data:we.object({conversationId:we.string().optional(),db:P.shape.db})})});var Un=N(()=>{"use strict"});import{z as fe}from"zod";var ss,Bn,K,is,Fn,ls,dr=N(()=>{"use strict";ss=["text","boolean","number","enum","json","date","array"],Bn=fe.enum(ss),K={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},is=["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"],Fn=fe.enum(is),ls=fe.object({columnName:fe.string(),dataType:Bn,dataTypeLabel:Fn,isNullable:fe.boolean(),columnDefault:fe.string().nullable(),isPrimaryKey:fe.boolean(),isForeignKey:fe.boolean(),referencedTable:fe.string().nullable(),referencedColumn:fe.string().nullable(),enumValues:fe.array(fe.string()).nullable()})});function xt(n){let e=n?.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(")?K.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"?K.number:e==="boolean"||e==="bool"?K.boolean:e==="json"||e==="jsonb"?K.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?K.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"?K.text:K.text}function pr(n){if(!n)return h.text;let e=n.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?h.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?h.bigint:e==="smallint"||e==="int2"?h.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?h.numeric:e==="real"||e==="float4"?h.float:e==="double precision"||e==="float8"||e==="float"?h.double:e==="money"?h.money:e==="boolean"||e==="bool"?h.boolean:e==="text"?h.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?h.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?h.char:e==="json"?h.json:e==="jsonb"?h.jsonb:e==="xml"?h.xml:e==="uuid"?h.uuid:e==="date"?h.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?h.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?h.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?h.timestamptz:e==="interval"||e.startsWith("interval")?h.interval:e==="bytea"?h.bytea:e==="inet"?h.inet:e==="cidr"?h.cidr:e==="macaddr"?h.macaddr:e==="macaddr8"?h.macaddr8:e==="point"?h.point:e==="line"?h.line:e==="polygon"?h.polygon:e.startsWith("array")||e.includes("[]")?h.text:e.startsWith("user-defined")||e==="enum"?h.enum:h.text}function Pt(n,e){let t=n?.toLowerCase().trim()||"",r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?K.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"?K.number:t==="boolean"||t==="bool"?K.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?K.date:t==="json"?K.json:t==="enum"||t==="set"?K.enum:K.text}function fr(n,e){if(!n)return h.text;let t=n.toLowerCase().trim(),r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?h.boolean:t==="tinyint"?h.tinyint:t==="smallint"?h.smallint:t==="mediumint"?h.mediumint:t==="int"||t==="integer"?h.int:t==="bigint"?h.bigint:t==="decimal"||t==="numeric"?h.numeric:t==="float"||t==="real"?h.float:t==="double"?h.double:t==="bit"?h.bit:t==="boolean"||t==="bool"?h.boolean:t==="char"?h.char:t==="varchar"?h.varchar:t==="tinytext"?h.tinytext:t==="text"?h.text:t==="mediumtext"?h.mediumtext:t==="longtext"?h.longtext:t==="binary"?h.binary:t==="varbinary"?h.varbinary:t==="tinyblob"?h.tinyblob:t==="blob"?h.blob:t==="mediumblob"?h.mediumblob:t==="longblob"?h.longblob:t==="json"?h.json:t==="date"?h.date:t==="time"?h.time:t==="datetime"?h.datetime:t==="timestamp"?h.timestamp:t==="year"?h.year:t==="enum"?h.enum:t==="set"?h.set:h.text}function $t(n){let e=n?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?K.number:e==="bit"?K.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?K.date:e==="json"?K.json:K.text}function yr(n){if(!n)return h.text;let e=n.toLowerCase().trim();return e==="tinyint"?h.tinyint:e==="smallint"?h.smallint:e==="int"?h.int:e==="bigint"?h.bigint:e==="decimal"||e==="numeric"?h.numeric:e==="float"||e==="real"?h.float:e==="money"||e==="smallmoney"?h.money:e==="bit"?h.boolean:e==="char"?h.char:e==="varchar"?h.varchar:e==="text"?h.text:e==="nchar"?h.char:e==="nvarchar"?h.varchar:e==="ntext"?h.text:e==="binary"?h.binary:e==="varbinary"?h.varbinary:e==="image"?h.blob:e==="uniqueidentifier"?h.uuid:e==="date"?h.date:e==="time"?h.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?h.datetime:e==="datetimeoffset"?h.timestamptz:e==="json"?h.json:e==="xml"?h.xml:h.text}function Ot(n){let e=n?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?K.boolean:e==="json"?K.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?K.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?K.number:K.text}function br(n){let e=n?.toLowerCase().trim()||"";return e==="integer"||e==="int"?h.int:e==="bigint"||e.startsWith("bigint(")?h.bigint:e==="smallint"||e.startsWith("smallint(")?h.smallint:e==="tinyint"||e.startsWith("tinyint(")?h.tinyint:e==="mediumint"||e.startsWith("mediumint(")?h.mediumint:e.includes("int")?h.int:e==="real"||e==="float"||e.startsWith("float(")?h.float:e==="double"||e==="double precision"||e.startsWith("double(")?h.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?h.numeric:e==="boolean"||e==="bool"?h.boolean:e==="text"||e==="clob"?h.text:e==="varchar"||e.startsWith("varchar(")?h.varchar:e==="char"||e.startsWith("char(")?h.char:e==="json"?h.json:e==="date"?h.date:e==="time"?h.time:e==="datetime"?h.datetime:e==="timestamp"?h.timestamp:e==="blob"?h.blob:h.text}var h,jn=N(()=>{"use strict";dr();h={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 te}from"zod";var Kn,gr,Hn,Vn,hr,zn=N(()=>{"use strict";Kn=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],gr=te.enum(Kn),Hn=te.object({columnName:te.string("Column name is required"),columnType:te.string("Column type is required"),defaultValue:te.string().optional(),isPrimaryKey:te.boolean().default(!1),isNullable:te.boolean().default(!1),isUnique:te.boolean().default(!1),isIdentity:te.boolean().default(!1),isArray:te.boolean().default(!1)}),Vn=te.object({columnName:te.string("Column name is required"),referencedTable:te.string("Referenced table is required"),referencedColumn:te.string("Referenced column is required"),onUpdate:gr.default("NO ACTION"),onDelete:gr.default("NO ACTION")}),hr=te.object({tableName:te.string("Table name is required"),fields:te.array(Hn).min(1,"At least one field is required"),foreignKeys:te.array(Vn).optional()})});import{z as se}from"zod";var Wn,cs,us,Yn=N(()=>{"use strict";he();Wn=se.object({name:se.string("Name is required"),size:se.string("Size is required"),owner:se.string("Owner is required"),encoding:se.string("Encoding is required")}),cs=se.object({databases:se.array(Wn),dbType:nt}),us=se.object({version:se.string("Version is required"),database:se.string("Database is required"),user:se.string("User is required"),host:se.string("Host is required").nullable(),port:se.number("Port is required").nullable(),active_connections:se.coerce.number("Active connections is required"),max_connections:se.coerce.number("Max connections is required")})});var Gn=N(()=>{"use strict"});import{z as Ge}from"zod";var vt,Qn=N(()=>{"use strict";vt=Ge.object({tableName:Ge.string("Table name is required"),primaryKeys:Ge.array(Ge.object({columnName:Ge.string("Column name is required"),value:Ge.any()})).min(1,"At least one primary key is required")})});import{z as ms}from"zod";var Tr,Jn=N(()=>{"use strict";he();Tr=P.extend({cascade:ms.string().optional().transform(n=>n==="true")})});import{z as Xn}from"zod";var Er,Zn=N(()=>{"use strict";Er=Xn.object({query:Xn.string("Query is required")})});import{z as ds}from"zod";var ea,wr,ta=N(()=>{"use strict";he();ea=["csv","xlsx","json"],wr=P.extend({format:ds.enum(ea,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as b}from"zod";var Lt,v,Rr,Cr,ps,Sr,Qe,fs,ys,bs,gs,hs,Ts,Es,ra,ws,Nr,Rs,Cs,Ss,Ns,As,Ds,_s,Ar,xs,Ps,$s,Os,vs,Ls,Ms,ks,Is,qs,Us,Bs,Fs,js,Ks,Dr,_r,Hs,na=N(()=>{"use strict";Lt=b.enum(["string","hash","list","set","zset","stream","unknown"]),v=b.object({base64:b.string().max(16*1024*1024).refine(n=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(n),"Invalid unpadded base64url value"),utf8:b.string().optional()}),Rr=b.object({db:b.string(),cursor:b.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:b.coerce.number().int().min(1).max(200).default(50),search:b.string().max(512).optional(),exactPattern:b.stringbool().default(!1),type:Lt.exclude(["unknown"]).optional()}),Cr=b.object({key:v,type:Lt,ttlMs:b.number().int(),memoryBytes:b.number().int().nonnegative().nullable()}),ps=b.object({keys:b.array(Cr),nextCursor:b.string().nullable(),hasMore:b.boolean()}),Sr=b.object({db:b.string(),cursor:b.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:b.coerce.number().int().min(1).max(500).default(100),full:b.stringbool().default(!1),direction:b.enum(["forward","backward"]).default("forward")}),Qe=b.object({key:b.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),fs=b.object({kind:b.literal("string"),value:v,truncated:b.boolean()}),ys=b.object({kind:b.literal("hash"),entries:b.array(b.object({field:v,value:v}))}),bs=b.object({kind:b.literal("list"),entries:b.array(b.object({index:b.number().int(),value:v}))}),gs=b.object({kind:b.literal("set"),members:b.array(v)}),hs=b.object({kind:b.literal("zset"),entries:b.array(b.object({member:v,score:b.union([b.number(),b.literal("inf"),b.literal("-inf")])}))}),Ts=b.object({kind:b.literal("stream"),entries:b.array(b.object({id:b.string(),fields:b.array(b.object({field:v,value:v}))}))}),Es=b.object({kind:b.literal("unknown")}),ra=b.discriminatedUnion("kind",[fs,ys,bs,gs,hs,Ts,Es]),ws=Cr.extend({length:b.number().int().nonnegative().nullable(),revision:b.string(),value:ra,nextCursor:b.string().nullable(),hasMore:b.boolean()}),Nr=b.object({db:b.string(),offset:b.coerce.number().int().nonnegative().default(0),limit:b.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:b.string().optional()}),Rs=b.object({chunk:v,length:b.number().int().nonnegative(),nextOffset:b.number().int().nonnegative().nullable(),hasMore:b.boolean()}),Cs=b.object({kind:b.literal("string"),value:v}),Ss=b.object({kind:b.literal("hash"),entries:b.array(b.object({field:v,value:v})).min(1)}),Ns=b.object({kind:b.literal("list"),entries:b.array(v).min(1)}),As=b.object({kind:b.literal("set"),members:b.array(v).min(1)}),Ds=b.object({kind:b.literal("zset"),entries:b.array(b.object({member:v,score:b.number()})).min(1)}),_s=b.object({kind:b.literal("stream"),id:b.string().default("*"),fields:b.array(b.object({field:v,value:v})).min(1)}),Ar=b.object({key:v,type:Lt.exclude(["unknown"]),value:b.discriminatedUnion("kind",[Cs,Ss,Ns,As,Ds,_s]),ttlMs:b.number().int().positive().nullable().default(null)}),xs=b.object({key:v,revision:b.string().nullable(),deleted:b.boolean()}),Ps=b.object({action:b.literal("rename"),newKey:v}),$s=b.object({action:b.literal("setTtl"),ttlMs:b.number().int().positive().nullable()}),Os=b.object({action:b.literal("setString"),value:v}),vs=b.object({action:b.literal("upsertHash"),field:v,value:v}),Ls=b.object({action:b.literal("deleteHash"),field:v}),Ms=b.object({action:b.literal("pushList"),side:b.enum(["left","right"]),value:v}),ks=b.object({action:b.literal("setList"),index:b.number().int(),value:v}),Is=b.object({action:b.literal("deleteList"),index:b.number().int()}),qs=b.object({action:b.literal("addSet"),member:v}),Us=b.object({action:b.literal("removeSet"),member:v}),Bs=b.object({action:b.literal("upsertZset"),member:v,score:b.number()}),Fs=b.object({action:b.literal("removeZset"),member:v}),js=b.object({action:b.literal("appendStream"),id:b.string().default("*"),fields:b.array(b.object({field:v,value:v})).min(1)}),Ks=b.object({action:b.literal("deleteStream"),id:b.string()}),Dr=b.object({expectedRevision:b.string(),force:b.boolean().default(!1),operation:b.discriminatedUnion("action",[Ps,$s,Os,vs,Ls,Ms,ks,Is,qs,Us,Bs,Fs,js,Ks])}),_r=b.object({db:b.string(),expectedRevision:b.string(),force:b.stringbool().default(!1)}),Hs=b.object({deleted:b.boolean()})});var aa=N(()=>{"use strict"});import{z as xr}from"zod";var Mt,Vs,zs,oa=N(()=>{"use strict";he();_t();Mt=xr.object({newColumnName:xr.string("New column name is required")}),Vs=oe,zs=xr.object({db:P.shape.db,tableName:oe.shape.tableName,columnName:oe.shape.columnName,newColumnName:Mt.shape.newColumnName})});import{z as H}from"zod";var Ws,st,Ys,sa,Gs,Pr,ia=N(()=>{"use strict";he();Ws=H.object({columnName:H.string(),operator:H.string(),value:H.string()}),st=["asc","desc"],Ys=H.object({columnName:H.string(),direction:H.enum(st)}),sa=H.object({limit:H.number(),total:H.number(),hasNextPage:H.boolean(),hasPreviousPage:H.boolean(),nextCursor:H.string().nullable(),prevCursor:H.string().nullable()}),Gs=H.object({data:H.array(H.record(H.string(),H.unknown())),meta:sa}),Pr=H.object({db:P.shape.db,cursor:H.string().optional(),limit:H.string().optional().default("50").transform(Number),direction:H.enum(st).optional().default(st[0]),sort:H.string().optional().transform(n=>{if(!n)return"";try{let e=JSON.parse(n);return Array.isArray(e)?e:n}catch{return n}}),order:H.enum(st).optional(),filters:H.string().optional().transform(n=>{if(!n)return[];try{return JSON.parse(n)}catch{return[]}})})});import{z as kt}from"zod";var Qs,la=N(()=>{"use strict";Qs=kt.object({tableName:kt.string("Table name is required"),schemaName:kt.string().optional(),rowCount:kt.coerce.number("Row count is required")})});import{z as ca}from"zod";var Js,ua=N(()=>{"use strict";Js=ca.object({schema:ca.string()})});import{z as Ne}from"zod";var $r,ma=N(()=>{"use strict";$r=Ne.object({tableName:Ne.string("Table name is required"),primaryKey:Ne.string("Primary key is required").default("id"),updates:Ne.array(Ne.object({rowData:Ne.record(Ne.string("Column name is required"),Ne.any()),columnName:Ne.string("Column name is required"),value:Ne.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var da={};Yt(da,{DATABASE_TYPES:()=>On,DataTypes:()=>K,FOREIGN_KEY_ACTIONS:()=>Kn,FORMAT_TYPES:()=>ea,StandardizedDataType:()=>h,addColumnParamSchema:()=>Zo,addColumnParamsSchema:()=>es,addColumnSchema:()=>Te,addRecordSchema:()=>lr,alterColumnParamSchema:()=>ns,alterColumnParamsSchema:()=>as,alterColumnSchema:()=>We,bulkInsertRecordsSchema:()=>ur,chatSchema:()=>mr,columnInfoSchema:()=>ls,connectionInfoSchema:()=>us,createKeySchema:()=>Ar,createTableSchema:()=>hr,currentDatabaseSchema:()=>Jo,dataTypesSchema:()=>Bn,databaseInfoSchema:()=>Wn,databaseListSchema:()=>cs,databaseSchema:()=>P,databaseTypeParamSchema:()=>Xo,databaseTypeSchema:()=>nt,deleteColumnParamSchema:()=>oe,deleteColumnParamsSchema:()=>ts,deleteColumnQuerySchema:()=>cr,deleteColumnSuccessResponseSchema:()=>rs,deleteKeyQuerySchema:()=>_r,deleteKeyResultSchema:()=>Hs,deleteRecordSchema:()=>vt,deleteTableQuerySchema:()=>Tr,encodedRedisValueSchema:()=>v,executeQuerySchema:()=>Er,exportTableSchema:()=>wr,fieldDataSchema:()=>Hn,filterSchema:()=>Ws,foreignKeyActionSchema:()=>gr,foreignKeyDataSchema:()=>Vn,keyActionSchema:()=>Dr,keyDetailsQuerySchema:()=>Sr,keyDetailsResultSchema:()=>ws,keyParamSchema:()=>Qe,keyRawQuerySchema:()=>Nr,keyRawResultSchema:()=>Rs,keyScanQuerySchema:()=>Rr,keyScanResultSchema:()=>ps,keyWriteResultSchema:()=>xs,mapMssqlToDataType:()=>$t,mapMysqlToDataType:()=>Pt,mapPostgresToDataType:()=>xt,mapSqliteToDataType:()=>Ot,redisKeySummarySchema:()=>Cr,redisKeyTypeSchema:()=>Lt,redisKeyValueSchema:()=>ra,renameColumnParamSchema:()=>Vs,renameColumnParamsSchema:()=>zs,renameColumnSchema:()=>Mt,sortDirections:()=>st,sortSchema:()=>Ys,standardizeDataTypeLabel:()=>pr,standardizeMssqlDataTypeLabel:()=>yr,standardizeMysqlDataTypeLabel:()=>fr,standardizeSqliteDataTypeLabel:()=>br,standardizedDataTypeSchema:()=>Fn,tableDataMetaSchema:()=>sa,tableDataQuerySchema:()=>Pr,tableDataResultSchema:()=>Gs,tableInfoSchema:()=>Qs,tableNameSchema:()=>ge,tableSchemaResultSchema:()=>Js,updateRecordsSchema:()=>$r});var Re=N(()=>{"use strict";vn();Ln();Mn();kn();In();qn();Un();jn();dr();zn();he();Yn();Gn();_t();Qn();Jn();Zn();ta();na();aa();oa();ia();la();ua();ma()});function Or(n,e=0){if(n.length===0)return{clause:"",values:[],nextIdx:e};let t=[],r=[],a=e;for(let o of n){let s=`[${o.columnName}]`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":t.push(`${s} ${o.operator} @p${a}`),r.push(o.value),a++;break;case"is":o.value.toLowerCase()==="null"?t.push(`${s} IS NULL`):(t.push(`${s} = @p${a}`),r.push(o.value),a++);break;case"is not":o.value.toLowerCase()==="null"?t.push(`${s} IS NOT NULL`):(t.push(`${s} != @p${a}`),r.push(o.value),a++);break;case"like":case"ilike":t.push(`${s} LIKE @p${a}`),r.push(o.value),a++;break;case"not like":case"not ilike":t.push(`${s} NOT LIKE @p${a}`),r.push(o.value),a++;break;default:break}}return t.length===0?{clause:"",values:[],nextIdx:e}:{clause:`WHERE ${t.join(" AND ")}`,values:r,nextIdx:a}}function vr(n,e){return Array.isArray(n)?n.length===0?"":`ORDER BY ${n.map(t=>`[${t.columnName}] ${t.direction.toUpperCase()}`).join(", ")}`:n&&typeof n=="string"?`ORDER BY [${n}] ${e?.toUpperCase()||"ASC"}`:""}function Lr(n,e){if(e)return"NVARCHAR(MAX)";let t=n.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]||n.toUpperCase()}function Mr(n,e){let t=n.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("newid()")?e.toUpperCase().includes("UNIQUEIDENTIFIER")?"NEWID()":null:t.includes("getdate")||t.includes("current_timestamp")?"GETDATE()":n.trim():t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":n.trim()}function pa(n,e={}){let t=Lr(n.columnType,n.isArray??!1),r=`[${n.columnName}] ${t}`;if(n.isIdentity&&!t.includes("IDENTITY")&&(r+=" IDENTITY(1,1)"),!n.isNullable&&!n.isPrimaryKey&&(r+=" NOT NULL"),n.defaultValue?.trim()&&!t.includes("IDENTITY")){let a=Mr(n.defaultValue,t);a!==null&&(r+=` DEFAULT ${a}`)}return e.includeUnique&&n.isUnique&&!n.isPrimaryKey&&(r+=" UNIQUE"),e.includePrimaryKey&&n.isPrimaryKey&&(r+=" PRIMARY KEY"),r}var fa=N(()=>{"use strict"});import{HTTPException as q}from"hono/http-exception";var Xs,Zs,It,ya=N(()=>{"use strict";Re();qe();Be();tt();fa();Xs=547,Zs=3726,It=class extends ce{async runQuery(e,t,r){let o=(await V(e)).request();return r.forEach((c,i)=>{o.input(`p${i}`,c)}),(await o.query(t)).recordset}quoteIdentifier(e){return`[${e}]`}mapToUniversalType(e){return $t(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:r=[],sort:a=[],order:o="asc",limit:s=50,cursor:c}=e,{clause:i,values:l,nextIdx:u}=Or(r,0),m=vr(a,o)||"ORDER BY (SELECT NULL)",p=c?this.decodeOffsetCursor(c):0,d=`SELECT * FROM [${t}] ${i} ${m} OFFSET @p${u} ROWS FETCH NEXT @p${u+1} ROWS ONLY`,f=[...l,p,s+1],y=`SELECT COUNT(*) as total FROM [${t}] ${i}`;return{sql:d,values:f,countSql:y,countValues:l}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){let{cursor:a,limit:o=50}=e,s=a?this.decodeOffsetCursor(a):0;return{nextCursor:r?this.makeCursor(s+o):null,prevCursor:s>0?this.makeCursor(Math.max(0,s-o)):null}}async getTableData(e){try{let{tableName:t,db:r,limit:a=50,sort:o=[],order:s="asc",cursor:c,filters:i=[]}=e,l=await V(r),u=c?this.decodeOffsetCursor(c):0,{clause:m,values:p,nextIdx:d}=Or(i,0),f=vr(o,s)||"ORDER BY (SELECT NULL)",y=l.request();p.forEach((w,A)=>{y.input(`p${A}`,w)});let g=await y.query(`SELECT COUNT(*) as total FROM [${t}] ${m}`),E=Number(g.recordset[0]?.total??0),T=l.request();p.forEach((w,A)=>{T.input(`p${A}`,w)}),T.input(`p${d}`,u),T.input(`p${d+1}`,a+1);let C=(await T.query(`SELECT * FROM [${t}] ${m} ${f} OFFSET @p${d} ROWS FETCH NEXT @p${d+1} ROWS ONLY`)).recordset,R=C.length>a;return R&&(C=C.slice(0,a)),{data:C,meta:{limit:a,total:E,hasNextPage:R,hasPreviousPage:u>0,nextCursor:R?this.makeCursor(u+a):null,prevCursor:u>0?this.makeCursor(Math.max(0,u-a)):null}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){let t=await(await V()).request().query(`
2
+ var wo=Object.defineProperty;var N=(n,e)=>()=>(n&&(e=n(n=0)),e);var Gt=(n,e)=>{for(var t in e)wo(n,t,{get:e[t],enumerable:!0})};var Zr=N(()=>{"use strict"});var en=N(()=>{"use strict"});var tn=N(()=>{"use strict"});var nn,rn,xe,an=N(()=>{"use strict";nn=globalThis.process?.env,rn=nn?.NODE_ENV,xe={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:rn==="development",PROXY_URL:nn?.DB_STUDIO_PROXY_URL??(rn==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var on=N(()=>{"use strict"});var sn,Qt=N(()=>{"use strict";sn={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"db-studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var ln=N(()=>{"use strict"});var et=N(()=>{"use strict";Zr();en();tn();an();on();Qt();ln()});import Bo from"better-sqlite3";import{Redis as Fo}from"ioredis";import{MongoClient as jo,ObjectId as tr}from"mongodb";import Ko from"mssql";import{createPool as Ho}from"mysql2/promise";import{Pool as Rn}from"pg";var rr,he,bt,ht,gt,ke,Tt,Et,wt,Sn,Rt,Cn,Nn,St,Ct,Me=N(()=>{"use strict";rr=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;sqliteDb=null;redisClients=new Map;redisClusterChecked=!1;baseConfig=null;initError=null;constructor(){try{this.initializeBaseConfig()}catch(e){this.initError=e instanceof Error?e:new Error(String(e))}}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";case"sqlite":return"sqlite";case"redis":case"rediss":return"redis";default:throw new Error(`Unsupported database type: ${t}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), SQL Server (mssql://), MongoDB (mongodb://), SQLite (sqlite://), Redis/Valkey (redis:// or rediss://).`)}}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");if(e.startsWith("sqlite://")){this.baseConfig={url:e,host:"localhost",port:0,user:"",password:"",dbType:"sqlite"};return}try{let t=new URL(e),r=this.detectDbType(t),a=r==="mysql"?3306:r==="mssql"?1433:r==="mongodb"?27017:r==="redis"?6379:5432;this.baseConfig={url:e,host:t.hostname,port:Number.parseInt(t.port,10)||a,user:t.username,password:t.password,dbType:r}}catch(t){throw new Error(t instanceof Error?t.message:String(t))}}getDbType(){if(this.initError)throw this.initError;if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(this.initError)throw this.initError;if(!this.baseConfig)throw new Error("Base configuration not initialized");if(this.baseConfig.dbType==="sqlite")return this.baseConfig.url;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)}`)}}getSqliteDb(){if(!this.baseConfig||this.baseConfig.dbType!=="sqlite")throw new Error("DATABASE_URL is not a sqlite:// connection");if(!this.sqliteDb){let e=this.baseConfig.url.replace(/^sqlite:\/\//,""),t=new Bo(e);t.pragma("journal_mode = WAL"),t.pragma("foreign_keys = ON"),this.sqliteDb=t}return this.sqliteDb}closeSqliteDb(){this.sqliteDb&&(this.sqliteDb.close(),this.sqliteDb=null)}getPgPool(e){let t=this.buildConnectionString(e);if(!this.pgPools.has(t)){let r={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new Rn(r);a.on("error",o=>{}),this.pgPools.set(t,a)}return this.pgPools.get(t)??new Rn({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 a=new URL(t).pathname.slice(1),o=Ho({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:a||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 a=new URL(t).pathname.slice(1),o={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:a||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},s=await new Ko.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){if(this.baseConfig?.dbType==="sqlite"&&e===this.baseConfig.url){this.closeSqliteDb();return}await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){if(this.baseConfig?.dbType==="sqlite"){this.closeSqliteDb();return}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 jo(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 getRedisClient(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(this.baseConfig.dbType!=="redis")throw new Error("DATABASE_URL is not a redis:// connection");let t=e??this.getRedisDefaultDb(),r=this.redisClients.get(t);if(r)return r;let a=new URL(this.baseConfig.url),o={host:this.baseConfig.host,port:this.baseConfig.port,db:t,lazyConnect:!0,maxRetriesPerRequest:1,enableReadyCheck:!0,connectTimeout:2e3};this.baseConfig.user&&(o.username=decodeURIComponent(this.baseConfig.user)),this.baseConfig.password&&(o.password=decodeURIComponent(this.baseConfig.password)),a.protocol==="rediss:"&&(o.tls={});let s=new Fo(o);try{if(await s.connect(),!this.redisClusterChecked){let c=await s.info("server");if(/^redis_mode:(cluster|sentinel)\b/m.test(c))throw await s.quit().catch(()=>{}),new Error("Redis cluster and Sentinel modes are not supported. Use a standalone redis:// connection.");let i=c.match(/^redis_version:([^\r\n]+)/m)?.[1],[l=0,u=0]=i?.split(".").map(Number)??[];if(l<6||l===6&&u<2)throw await s.quit().catch(()=>{}),new Error(`Redis 6.2 or newer is required. Connected server reports ${i??"an unknown version"}.`);this.redisClusterChecked=!0}}catch(c){throw await s.quit().catch(()=>{}),c}return this.redisClients.set(t,s),s}async getIsolatedRedisClient(e){let t=(await this.getRedisClient(e)).duplicate();return await t.connect(),t}getRedisDefaultDb(){if(!this.baseConfig)return 0;try{let t=new URL(this.baseConfig.url).pathname.replace(/^\//,"");if(!t)return 0;let r=Number.parseInt(t,10);return Number.isFinite(r)?r:0}catch{return 0}}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([o,s])=>{await s.end()}),t=Array.from(this.mysqlPools.entries()).map(async([o,s])=>{await s.end()}),r=Array.from(this.mssqlPools.entries()).map(async([o,s])=>{await s.close()});await Promise.all([...e,...t,...r]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null),this.closeSqliteDb();let a=Array.from(this.redisClients.entries()).map(async([o,s])=>{await s.quit().catch(()=>{})});await Promise.all(a),this.redisClients.clear(),this.redisClusterChecked=!1}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},he=new rr,bt=n=>he.getPgPool(n),ht=n=>he.getMysqlPool(n),gt=async n=>he.getMssqlPool(n),ke=()=>he.getDbType(),Tt=()=>he.getSqliteDb(),Et=()=>he.getMongoClient(),wt=()=>he.getMongoDbName(),Sn=n=>he.getMongoDb(n),Rt=n=>he.getRedisClient(n),Cn=n=>he.getIsolatedRedisClient(n),Nn=()=>he.getRedisDefaultDb(),St=n=>typeof n=="string"&&tr.isValid(n),Ct=n=>typeof n=="string"&&tr.isValid(n)?new tr(n):n});var Dn={};Gt(Dn,{checkDatabaseConnection:()=>Go,getDatabaseConnectionDetails:()=>Yo});var An,zo,Wo,Yo,Go,_n=N(()=>{"use strict";Me();An={pg:"PostgreSQL",mysql:"MySQL",mssql:"SQL Server",mongodb:"MongoDB",sqlite:"SQLite",redis:"Redis"},zo=2e3,Wo=async n=>{let e;try{return await Promise.race([n,new Promise((t,r)=>{e=setTimeout(()=>r(new Error("Database startup check timed out")),zo)})])}finally{e&&clearTimeout(e)}},Yo=n=>{let e=ke();if(e==="sqlite")return{type:e,name:An[e],destination:"local file"};let t=new URL(n),r={pg:5432,mysql:3306,mssql:1433,mongodb:27017,redis:6379},a=Number.parseInt(t.port,10)||r[e];return{type:e,name:An[e],destination:`${t.hostname}:${a}`}},Go=async n=>{switch(n){case"pg":await Wo(bt().query("SELECT 1"));return;case"mysql":await ht().query("SELECT 1");return;case"mssql":await(await gt()).request().query("SELECT 1");return;case"mongodb":{await(await Et()).db(wt()).command({ping:1});return}case"sqlite":Tt().prepare("SELECT 1").get();return;case"redis":await(await Rt()).ping()}}});import{HTTPException as xn}from"hono/http-exception";function O(n){return fe.get(n)}function Ie(n,e){if(!Qo(n))throw new xn(400,{message:`Key browsing is not supported for database type: "${e}"`});return n}var nr,fe,Qo,Pe=N(()=>{"use strict";nr=class{adapters=new Map;register(e,t){this.adapters.set(e,t)}get(e){let t=this.adapters.get(e);if(!t)throw new xn(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()]}},fe=new nr;Qo=n=>"scanKeys"in n&&typeof n.scanKeys=="function"});import{HTTPException as Ke}from"hono/http-exception";import{DatabaseError as Jo}from"pg";function ee(n){throw new Ke(501,{message:`${n} is not implemented for this database type`})}var ue,qe=N(()=>{"use strict";ue=class{wrapError(e){if(e instanceof Ke)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.message.startsWith("NOAUTH")||e.message.startsWith("WRONGPASS")||e.message.startsWith("LOADING")||e.message.startsWith("BUSY")||e.message.startsWith("READONLY")||e.message.startsWith("CLUSTERDOWN")||e.message.includes("Redis cluster mode is not supported")||e instanceof Jo&&e.code?.startsWith("08")?new Ke(503,{message:e.message}):new Ke(500,{message:e.message})}return new Ke(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[r,a]of Object.entries(e))t[r]=a;return t}async getTableData(e){try{let{db:t,limit:r=50,direction:a="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>r;l&&(i=i.slice(0,r));let u=this.normalizeRows(i);a==="desc"&&(u=u.reverse());let{nextCursor:m,prevCursor:d}=this.buildCursors(e,u,l);return{data:u,meta:{limit:r,total:c,hasNextPage:a==="asc"?l:!!e.cursor,hasPreviousPage:a==="asc"?!!e.cursor:l,nextCursor:m,prevCursor:d}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let r=`SELECT * FROM ${this.quoteIdentifier(e)}`,a=await this.runQuery(t,r,[]);if(!a||a.length===0)throw new Ke(404,{message:`Table "${e}" does not exist or has no data`});return{cols:Object.keys(a[0]),rows:a}}catch(r){throw this.wrapError(r)}}getDatabasesList(){return ee("getDatabasesList")}getCurrentDatabase(){return ee("getCurrentDatabase")}getDatabaseConnectionInfo(){return ee("getDatabaseConnectionInfo")}getTablesList(e){return ee("getTablesList")}createTable(e){return ee("createTable")}deleteTable(e){return ee("deleteTable")}getTableSchema(e){return ee("getTableSchema")}getTableColumns(e){return ee("getTableColumns")}addColumn(e){return ee("addColumn")}deleteColumn(e){return ee("deleteColumn")}alterColumn(e){return ee("alterColumn")}renameColumn(e){return ee("renameColumn")}addRecord(e){return ee("addRecord")}updateRecords(e){return ee("updateRecords")}deleteRecords(e){return ee("deleteRecords")}forceDeleteRecords(e){return ee("forceDeleteRecords")}bulkInsertRecords(e){return ee("bulkInsertRecords")}executeQuery(e){return ee("executeQuery")}}});var Q,z,V,X,ar,or,ae,me,Nt,Ue,Be=N(()=>{"use strict";Me();Q=n=>bt(n),z=n=>ht(n),V=n=>gt(n),X=()=>Tt(),ar=()=>Et(),or=()=>wt(),ae=n=>Sn(n),me=n=>Rt(n),Nt=n=>Cn(n),Ue=()=>Nn()});function $e(){let n=process.env.DATABASE_URL;if(!n)return{host:"localhost",port:5432};try{let e=new URL(n),t=e.protocol.replace(":",""),r=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)||r}}catch{return{host:"localhost",port:5432}}}var tt=N(()=>{"use strict"});function Pn(n){if(!n||n.length===0)return{};let e=[];for(let t of n){let r=t.columnName,a=Xo(t.value),o=t.operator.toLowerCase();if(r)switch(o){case"=":e.push({[r]:a});break;case"!=":e.push({[r]:{$ne:a}});break;case">":e.push({[r]:{$gt:a}});break;case">=":e.push({[r]:{$gte:a}});break;case"<":e.push({[r]:{$lt:a}});break;case"<=":e.push({[r]:{$lte:a}});break;case"is":e.push({[r]:a});break;case"is not":e.push({[r]:{$ne:a}});break;case"like":e.push({[r]:{$regex:At(String(a)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:At(String(a)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:At(String(a)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:At(String(a)),$options:"i"}}});break;default:e.push({[r]:a});break}}return e.length?{$and:e}:{}}function sr(n,e){return n?Array.isArray(n)?n.length===0?{_id:1}:Object.fromEntries(n.map(t=>[t.columnName,t.direction==="desc"?-1:1])):typeof n=="string"&&n.length>0?{[n]:e==="desc"?-1:1}:{_id:1}:{_id:1}}function ir(n){return Buffer.from(JSON.stringify({offset:n})).toString("base64url")}function kn(n){if(!n)return 0;try{let e=JSON.parse(Buffer.from(n,"base64url").toString("utf-8"));return typeof e.offset=="number"?e.offset:0}catch{return 0}}var At,Xo,$n=N(()=>{"use strict";Me();At=n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Xo=n=>{let e=n.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:St(e)?Ct(e):e}});import{HTTPException as F}from"hono/http-exception";var lr,He,Zo,es,vn,rt,ts,On,rs,ns,as,Ve,Dt,Ln=N(()=>{"use strict";qe();Be();Me();tt();$n();lr=n=>n instanceof Date?n.toISOString():typeof n=="bigint"?n.toString():n&&typeof n=="object"?"_bsontype"in n&&n._bsontype==="ObjectId"?n.toHexString():Array.isArray(n)?n.map(e=>lr(e)):Object.fromEntries(Object.entries(n).map(([e,t])=>[e,lr(t)])):n,He=n=>lr(n),Zo=n=>n instanceof Date?"date":n&&typeof n=="object"?Array.isArray(n)?"array":"_bsontype"in n?"text":"json":typeof n=="boolean"?"boolean":typeof n=="number"||typeof n=="bigint"?"number":"text",es=n=>{switch(n){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"}},vn=n=>typeof n=="string"&&St(n),rt=n=>Ct(n),ts=n=>{if(!Number.isFinite(n))return"n/a";let e=["B","KB","MB","GB","TB"],t=n,r=0;for(;t>=1024&&r<e.length-1;)t/=1024,r++;return`${t.toFixed(1)} ${e[r]}`},On=new Set(["double","string","object","array","binData","undefined","objectId","bool","date","null","regex","dbPointer","javascript","symbol","javascriptWithScope","int","timestamp","long","decimal","minKey","maxKey"]),rs=n=>{let e=n.trim();if(On.has(e))return e;switch(e.toLowerCase()){case"boolean":return"bool";case"objectid":return"objectId";case"binary":return"binData";default:return e}},ns=n=>{if(n==null)return"null";if(n instanceof Date)return"date";if(typeof n=="boolean")return"bool";if(typeof n=="number")return Number.isInteger(n)?"int":"double";if(typeof n=="bigint")return"long";if(Array.isArray(n))return"array";if(typeof n=="object"){let e=n._bsontype;return e==="ObjectId"?"objectId":e==="Decimal128"?"decimal":e==="Binary"?"binData":e==="Timestamp"?"timestamp":e?e.toLowerCase():"object"}return"string"},as=(n,e)=>{if(n!=null&&n.trim()!=="")try{return JSON.parse(n)}catch{return n}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}},Ve=n=>{if(n._id&&typeof n._id=="string")return{...n,_id:rt(n._id)};if(n._id&&typeof n._id=="object"){let e=n._id;if(Array.isArray(e.$in))return{...n,_id:{...e,$in:e.$in.map(t=>typeof t=="string"?rt(t):t)}};if(Array.isArray(e.$nin))return{...n,_id:{...e,$nin:e.$nin.map(t=>typeof t=="string"?rt(t):t)}}}return n},Dt=class extends ue{runQuery(){throw new F(501,{message:"runQuery is not supported for MongoDB"})}buildTableDataQuery(e){throw new F(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 F)return e;if(e instanceof Error){let t=e.name??"";if(t==="MongoNetworkError"||t==="MongoServerSelectionError"||t==="MongoTopologyClosedError")return new F(503,{message:e.message})}return super.wrapError(e)}async getTableData(e){try{let{tableName:t,db:r,cursor:a,limit:o,direction:s="asc",sort:c,order:i,filters:l}=e,m=(await ae(r)).collection(t),d=Pn(l??[]),p=sr(c??"",i),f=o&&o>0?o:50,y=kn(a),h=Number.isFinite(y)&&y>=0?y:0,E=s==="desc"?Math.max(h-f,0):h,[T,C]=await Promise.all([m.countDocuments(d),m.find(d).sort(p).skip(E).limit(f).toArray()]),S=C.map(A=>He(A)),R=E+f,w=Math.max(E-f,0);return{data:S,meta:{limit:f,total:T,hasNextPage:R<T,hasPreviousPage:E>0,nextCursor:R<T?ir(R):null,prevCursor:E>0?ir(w):null}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let s=(await(await ae(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(r){throw this.wrapError(r)}}async getDatabasesList(){try{let a=(await(await ar()).db().admin().listDatabases()).databases??[];if(!a[0])throw new F(500,{message:"No databases returned from MongoDB"});return a.map(o=>({name:o.name,size:ts(o.sizeOnDisk??0),owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:or()}}async getDatabaseConnectionInfo(){try{let t=(await ar()).db().admin(),r=$e(),a={};try{a=await t.serverStatus()}catch{}return{host:r.host,port:r.port,user:"n/a",database:or(),version:a.version??"unknown",active_connections:a.connections?.current??0,max_connections:(a.connections?.current??0)+(a.connections?.available??0)}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=await ae(e),r=await t.listCollections().toArray(),a=[];for(let o of r){let s=await t.collection(o.name).estimatedDocumentCount();a.push({tableName:o.name,rowCount:s})}return a}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){try{let r=e?.tableName??"",a=await ae(t);if((await a.listCollections({name:r}).toArray()).length>0)throw new F(400,{message:`Collection "${r}" already exists`});let s=e?.fields??[];if(s.length===0){await a.createCollection(r);return}let c={},i=[];for(let l of s){let u=rs(l.columnType);if(!On.has(u))throw new F(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 a.createCollection(r,{validator:{$jsonSchema:{bsonType:"object",required:i,properties:c,additionalProperties:!0}},validationAction:"error"})}catch(r){throw this.wrapError(r)}}async deleteTable({tableName:e,db:t}){try{let a=(await ae(t)).collection(e),o=await a.estimatedDocumentCount();return await a.drop(),{deletedCount:o,fkViolation:!1,relatedRecords:[]}}catch(r){throw this.wrapError(r)}}async getTableSchema({tableName:e,db:t}){try{let r=await ae(t);if((await r.listCollections({name:e}).toArray()).length===0)throw new F(404,{message:`Collection "${e}" does not exist`});let o=r.collection(e),s=await o.find({}).limit(200).toArray(),c=await o.estimatedDocumentCount(),i=new Map,l=new Map;for(let p of s)for(let[f,y]of Object.entries(p)){let h=ns(y);i.has(f)||(i.set(f,new Set),l.set(f,0)),i.get(f)?.add(h),l.set(f,(l.get(f)??0)+1)}let u={},m=[];for(let[p,f]of i.entries()){let y=l.get(p)??0,h=Array.from(f).filter(T=>T!=="null"),E=f.has("null")||y<s.length;y===s.length&&s.length>0&&!E&&m.push(p),u[p]=h.length===1?{bsonType:E?[h[0],"null"]:h[0]}:{bsonType:E?[...h,"null"]:h}}let d={collection:e,estimatedDocumentCount:c,sampledDocuments:s.length,jsonSchema:{bsonType:"object",required:m.length>0?m:void 0,properties:u}};return JSON.stringify(d,null,2)}catch(r){throw this.wrapError(r)}}async getTableColumns({tableName:e,db:t}){try{let o=await(await ae(t)).collection(e).find({}).limit(200).toArray(),s=o.length,c=new Map,i=(l,u)=>{let m=Zo(u);if(!c.has(l))c.set(l,{types:new Set([m]),nullable:!1,presentCount:1});else{let d=c.get(l);d.types.add(m),d.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 d=c.get(u);d.nullable=!0,d.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:es(m),isNullable:u.nullable,columnDefault:null,isPrimaryKey:l==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}catch(r){throw this.wrapError(r)}}async addColumn(e){try{let{tableName:t,columnName:r,columnType:a,defaultValue:o,isNullable:s,db:c}=e,i=await ae(c),l=await i.listCollections({name:t}).toArray();if(l.length===0)throw new F(404,{message:`Collection "${t}" does not exist`});if(await i.collection(t).findOne({[r]:{$exists:!0}}))throw new F(409,{message:`Field "${r}" already exists in collection "${t}"`});let m=as(o,a);await i.collection(t).updateMany({},{$set:{[r]:m}});let p=l[0].options?.validator?.$jsonSchema??{},f={...p.properties??{},[r]:{bsonType:s?[a,"null"]:a}},y=[...p.required??[]];!s&&!y.includes(r)&&y.push(r),await i.command({collMod:t,validator:{$jsonSchema:{...p,bsonType:"object",properties:f,...y.length>0?{required:y}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async deleteColumn({tableName:e,columnName:t,db:r}){try{return{deletedCount:(await(await ae(r)).collection(e).updateMany({},{$unset:{[t]:""}})).modifiedCount}}catch(a){throw this.wrapError(a)}}async alterColumn(e){try{let{tableName:t,columnName:r,columnType:a,isNullable:o,db:s}=e,c=await ae(s),i=await c.listCollections({name:t}).toArray();if(i.length===0)throw new F(404,{message:`Collection "${t}" does not exist`});if(r==="_id")throw new F(400,{message:'Cannot alter the "_id" field'});let u=i[0].options?.validator?.$jsonSchema??{},m={...u.properties??{}},d=[...u.required??[]];m[r]={bsonType:o?[a,"null"]:a};let p=d.indexOf(r);!o&&p===-1?d.push(r):o&&p!==-1&&d.splice(p,1),await c.command({collMod:t,validator:{$jsonSchema:{...u,bsonType:"object",properties:m,...d.length>0?{required:d}:{}}},validationAction:"warn"})}catch(t){throw this.wrapError(t)}}async renameColumn(e){try{let{tableName:t,columnName:r,newColumnName:a,db:o}=e,s=await ae(o);if((await s.listCollections({name:t}).toArray()).length===0)throw new F(404,{message:`Collection "${t}" does not exist`});if(r==="_id")throw new F(400,{message:'Cannot rename the "_id" field'});if(!await s.collection(t).findOne({[r]:{$exists:!0}}))throw new F(404,{message:`Field "${r}" does not exist in collection "${t}"`});if(await s.collection(t).findOne({[a]:{$exists:!0}}))throw new F(409,{message:`Field "${a}" already exists in collection "${t}"`});await s.collection(t).updateMany({[r]:{$exists:!0}},{$rename:{[r]:a}})}catch(t){throw this.wrapError(t)}}async addRecord({db:e,params:t}){try{let{tableName:r,data:a}=t,s=(await ae(e)).collection(r),c=He(a);if((c._id===""||c._id===null)&&delete c._id,!(await s.insertOne(c)).insertedId)throw new F(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:1}}catch(r){throw this.wrapError(r)}}async updateRecords({db:e,params:t}){try{let{tableName:r,updates:a,primaryKey:o}=t,c=(await ae(e)).collection(r),i=0,l=o||"_id",u=new Map;for(let m of a){let d=m.rowData[l];if(d==null)throw new F(400,{message:`Primary key "${l}" not found in row data.`});u.has(d)||u.set(d,{}),u.get(d)[m.columnName]=m.value}for(let[m,d]of u.entries()){let p=l==="_id"&&vn(m)?rt(m):m,f=await c.updateOne({[l]:p},{$set:d});if(f.matchedCount===0)throw new F(404,{message:`Record with ${l} = ${String(m)} not found in "${r}"`});i+=f.modifiedCount}return{updatedCount:i}}catch(r){throw this.wrapError(r)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:r,db:a}=e,s=(await ae(a)).collection(t),c=r[0]?.columnName??"_id",i=r.map(u=>c==="_id"&&vn(u.value)?rt(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:r,db:a}=e;if(!r||r.length===0)throw new F(400,{message:"At least one record is required"});let s=(await ae(a)).collection(t),c=r.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:r.length-i.insertedCount}}catch(t){throw this.wrapError(t)}}async executeQuery({query:e,db:t}){try{if(!e?.trim())throw new F(400,{message:"Query is required"});let r;try{r=JSON.parse(e)}catch{throw new F(400,{message:"Mongo query must be valid JSON"})}if(!r.collection||!r.operation)throw new F(400,{message:"Mongo query must include collection and operation"});let o=(await ae(t)).collection(r.collection),s=performance.now(),c=[],i=0,l;switch(r.operation){case"find":{let p=Ve(r.filter??{}),f=o.find(p,r.options??{});f.sort(r.sort??sr("",void 0)),r.skip&&f.skip(r.skip),r.limit&&f.limit(r.limit),c=await f.toArray(),i=c.length;break}case"aggregate":{c=await o.aggregate(r.pipeline??[],r.options??{}).toArray(),i=c.length;break}case"insertOne":{let p=r.document;if(!p)throw new F(400,{message:"document is required"});i=(await o.insertOne(p)).insertedId?1:0,l="OK";break}case"insertMany":{let p=r.document;if(!Array.isArray(p))throw new F(400,{message:"document array is required"});i=(await o.insertMany(p)).insertedCount??0,l="OK";break}case"updateOne":{let p=Ve(r.filter??{});if(!r.update)throw new F(400,{message:"update is required"});let f=await o.updateOne(p,r.update,r.options??{});i=f.matchedCount??0,l=`OK (${f.modifiedCount??0} modified)`;break}case"updateMany":{let p=Ve(r.filter??{});if(!r.update)throw new F(400,{message:"update is required"});let f=await o.updateMany(p,r.update,r.options??{});i=f.matchedCount??0,l=`OK (${f.modifiedCount??0} modified)`;break}case"deleteOne":{let p=Ve(r.filter??{});i=(await o.deleteOne(p,r.options??{})).deletedCount??0,l="OK";break}case"deleteMany":{let p=Ve(r.filter??{});i=(await o.deleteMany(p,r.options??{})).deletedCount??0,l="OK";break}case"count":{let p=Ve(r.filter??{});i=await o.countDocuments(p),c=[{count:i}],l="OK";break}default:throw new F(400,{message:"Unsupported Mongo operation"})}let u=performance.now()-s,m=c.map(p=>He(p));return{columns:m[0]?Object.keys(m[0]):[],rows:m,rowCount:i,duration:u,message:l}}catch(r){throw this.wrapError(r)}}}});import{z as ze}from"zod";var P,Mn,nt,os,ss,ge,Te=N(()=>{"use strict";P=ze.object({db:ze.string("Database name is required")}),Mn=["pg","mysql","mssql","mongodb","sqlite","redis"],nt=ze.enum(Mn,{message:"Invalid database type"}),os=P.extend({dbType:nt}),ss=ze.object({dbType:nt}),ge=ze.object({tableName:ze.string("Table name is required")})});import{z as Se}from"zod";var Ee,is,ls,In=N(()=>{"use strict";Te();Ee=Se.object({columnName:Se.string("Column name is required"),columnType:Se.string("Column type is required"),defaultValue:Se.string().optional(),isPrimaryKey:Se.boolean().default(!1),isNullable:Se.boolean().default(!1),isUnique:Se.boolean().default(!1),isIdentity:Se.boolean().default(!1),isArray:Se.boolean().default(!1)}),is=ge,ls=Se.object({db:P.shape.db,tableName:ge.shape.tableName,columnName:Ee.shape.columnName,columnType:Ee.shape.columnType,defaultValue:Ee.shape.defaultValue,isPrimaryKey:Ee.shape.isPrimaryKey,isNullable:Ee.shape.isNullable,isUnique:Ee.shape.isUnique,isIdentity:Ee.shape.isIdentity,isArray:Ee.shape.isArray})});import{z as at}from"zod";var cr,qn=N(()=>{"use strict";cr=at.object({tableName:at.string("Table name is required"),data:at.record(at.string("Column name is required"),at.any())})});import{z as cs}from"zod";var Un,ur,Bn,mr,dr=N(()=>{"use strict";Un=["gemini","openai","anthropic","grok","openrouter"],ur=cs.enum(Un),Bn=[{id:"gemini",label:"Google Gemini",models:[{id:"gemini-3-flash-preview",label:"Gemini 3 Flash"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro"}]},{id:"openai",label:"OpenAI",models:[{id:"gpt-5.2",label:"GPT-5.2"},{id:"gpt-5-mini",label:"GPT-5 mini"}]},{id:"anthropic",label:"Anthropic",models:[{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5"}]},{id:"grok",label:"xAI Grok",models:[{id:"grok-4.6",label:"Grok 4.6"},{id:"grok-4.5",label:"Grok 4.5"}]},{id:"openrouter",label:"OpenRouter",models:[{id:"openai/gpt-5.2",label:"GPT-5.2 via OpenRouter"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet 4.6 via OpenRouter"}]}],mr=n=>Bn.find(e=>e.id===n)?.models[0]?.id??"gemini-3-flash-preview"});import{z as we}from"zod";var pr,se,us,ms,_t=N(()=>{"use strict";Te();pr=P.extend({cascade:we.string().optional().transform(n=>n==="true")}),se=we.object({tableName:we.string("Table name is required"),columnName:we.string("Column name is required")}),us=we.object({db:P.shape.db,tableName:se.shape.tableName,columnName:se.shape.columnName,cascade:we.boolean().optional()}),ms=we.object({message:we.string("Message is required"),tableName:we.string("Table name is required"),columnName:we.string("Column name is required"),deletedCount:we.number("Deleted count is required").default(0)})});import{z as ot}from"zod";var We,ds,ps,Fn=N(()=>{"use strict";Te();_t();We=ot.object({columnType:ot.string("Column type is required"),isNullable:ot.boolean(),defaultValue:ot.string().nullable().optional()}),ds=se,ps=ot.object({db:P.shape.db,tableName:se.shape.tableName,columnName:se.shape.columnName,columnType:We.shape.columnType,isNullable:We.shape.isNullable,defaultValue:We.shape.defaultValue})});var jn=N(()=>{"use strict"});import{z as Ye}from"zod";var fr,Kn=N(()=>{"use strict";fr=Ye.object({tableName:Ye.string().min(1,"Table name is required"),records:Ye.array(Ye.record(Ye.string(),Ye.any())).min(1,"At least one record is required")})});import{z as te}from"zod";var fs,ys,yr,Hn=N(()=>{"use strict";dr();Te();fs=te.object({type:te.string(),content:te.string().optional()}).passthrough(),ys=te.object({provider:ur.optional().default("gemini"),model:te.string().min(1).optional(),messages:te.array(te.object({id:te.string(),role:te.enum(["user","assistant","system","tool","reasoning"]),content:te.union([te.string(),te.null(),te.array(te.unknown())]).optional(),parts:te.array(fs).optional()}).passthrough()),data:te.object({conversationId:te.string().optional(),db:P.shape.db,includeSchema:te.boolean().optional().default(!0)})}),yr=ys.transform(n=>({...n,model:n.model??mr(n.provider)}))});var Vn=N(()=>{"use strict"});import{z as ye}from"zod";var bs,zn,K,hs,Wn,gs,br=N(()=>{"use strict";bs=["text","boolean","number","enum","json","date","array"],zn=ye.enum(bs),K={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},hs=["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"],Wn=ye.enum(hs),gs=ye.object({columnName:ye.string(),dataType:zn,dataTypeLabel:Wn,isNullable:ye.boolean(),columnDefault:ye.string().nullable(),isPrimaryKey:ye.boolean(),isForeignKey:ye.boolean(),referencedTable:ye.string().nullable(),referencedColumn:ye.string().nullable(),enumValues:ye.array(ye.string()).nullable()})});function xt(n){let e=n?.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(")?K.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"?K.number:e==="boolean"||e==="bool"?K.boolean:e==="json"||e==="jsonb"?K.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?K.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"?K.text:K.text}function hr(n){if(!n)return g.text;let e=n.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?g.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?g.bigint:e==="smallint"||e==="int2"?g.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?g.numeric:e==="real"||e==="float4"?g.float:e==="double precision"||e==="float8"||e==="float"?g.double:e==="money"?g.money:e==="boolean"||e==="bool"?g.boolean:e==="text"?g.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?g.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?g.char:e==="json"?g.json:e==="jsonb"?g.jsonb:e==="xml"?g.xml:e==="uuid"?g.uuid:e==="date"?g.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?g.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?g.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?g.timestamptz:e==="interval"||e.startsWith("interval")?g.interval:e==="bytea"?g.bytea:e==="inet"?g.inet:e==="cidr"?g.cidr:e==="macaddr"?g.macaddr:e==="macaddr8"?g.macaddr8:e==="point"?g.point:e==="line"?g.line:e==="polygon"?g.polygon:e.startsWith("array")||e.includes("[]")?g.text:e.startsWith("user-defined")||e==="enum"?g.enum:g.text}function Pt(n,e){let t=n?.toLowerCase().trim()||"",r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?K.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"?K.number:t==="boolean"||t==="bool"?K.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?K.date:t==="json"?K.json:t==="enum"||t==="set"?K.enum:K.text}function gr(n,e){if(!n)return g.text;let t=n.toLowerCase().trim(),r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?g.boolean:t==="tinyint"?g.tinyint:t==="smallint"?g.smallint:t==="mediumint"?g.mediumint:t==="int"||t==="integer"?g.int:t==="bigint"?g.bigint:t==="decimal"||t==="numeric"?g.numeric:t==="float"||t==="real"?g.float:t==="double"?g.double:t==="bit"?g.bit:t==="boolean"||t==="bool"?g.boolean:t==="char"?g.char:t==="varchar"?g.varchar:t==="tinytext"?g.tinytext:t==="text"?g.text:t==="mediumtext"?g.mediumtext:t==="longtext"?g.longtext:t==="binary"?g.binary:t==="varbinary"?g.varbinary:t==="tinyblob"?g.tinyblob:t==="blob"?g.blob:t==="mediumblob"?g.mediumblob:t==="longblob"?g.longblob:t==="json"?g.json:t==="date"?g.date:t==="time"?g.time:t==="datetime"?g.datetime:t==="timestamp"?g.timestamp:t==="year"?g.year:t==="enum"?g.enum:t==="set"?g.set:g.text}function kt(n){let e=n?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?K.number:e==="bit"?K.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?K.date:e==="json"?K.json:K.text}function Tr(n){if(!n)return g.text;let e=n.toLowerCase().trim();return e==="tinyint"?g.tinyint:e==="smallint"?g.smallint:e==="int"?g.int:e==="bigint"?g.bigint:e==="decimal"||e==="numeric"?g.numeric:e==="float"||e==="real"?g.float:e==="money"||e==="smallmoney"?g.money:e==="bit"?g.boolean:e==="char"?g.char:e==="varchar"?g.varchar:e==="text"?g.text:e==="nchar"?g.char:e==="nvarchar"?g.varchar:e==="ntext"?g.text:e==="binary"?g.binary:e==="varbinary"?g.varbinary:e==="image"?g.blob:e==="uniqueidentifier"?g.uuid:e==="date"?g.date:e==="time"?g.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?g.datetime:e==="datetimeoffset"?g.timestamptz:e==="json"?g.json:e==="xml"?g.xml:g.text}function $t(n){let e=n?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?K.boolean:e==="json"?K.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?K.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?K.number:K.text}function Er(n){let e=n?.toLowerCase().trim()||"";return e==="integer"||e==="int"?g.int:e==="bigint"||e.startsWith("bigint(")?g.bigint:e==="smallint"||e.startsWith("smallint(")?g.smallint:e==="tinyint"||e.startsWith("tinyint(")?g.tinyint:e==="mediumint"||e.startsWith("mediumint(")?g.mediumint:e.includes("int")?g.int:e==="real"||e==="float"||e.startsWith("float(")?g.float:e==="double"||e==="double precision"||e.startsWith("double(")?g.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?g.numeric:e==="boolean"||e==="bool"?g.boolean:e==="text"||e==="clob"?g.text:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="char"||e.startsWith("char(")?g.char:e==="json"?g.json:e==="date"?g.date:e==="time"?g.time:e==="datetime"?g.datetime:e==="timestamp"?g.timestamp:e==="blob"?g.blob:g.text}var g,Yn=N(()=>{"use strict";br();g={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 re}from"zod";var Gn,wr,Qn,Jn,Rr,Xn=N(()=>{"use strict";Gn=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],wr=re.enum(Gn),Qn=re.object({columnName:re.string("Column name is required"),columnType:re.string("Column type is required"),defaultValue:re.string().optional(),isPrimaryKey:re.boolean().default(!1),isNullable:re.boolean().default(!1),isUnique:re.boolean().default(!1),isIdentity:re.boolean().default(!1),isArray:re.boolean().default(!1)}),Jn=re.object({columnName:re.string("Column name is required"),referencedTable:re.string("Referenced table is required"),referencedColumn:re.string("Referenced column is required"),onUpdate:wr.default("NO ACTION"),onDelete:wr.default("NO ACTION")}),Rr=re.object({tableName:re.string("Table name is required"),fields:re.array(Qn).min(1,"At least one field is required"),foreignKeys:re.array(Jn).optional()})});import{z as ie}from"zod";var Zn,Ts,Es,ea=N(()=>{"use strict";Te();Zn=ie.object({name:ie.string("Name is required"),size:ie.string("Size is required"),owner:ie.string("Owner is required"),encoding:ie.string("Encoding is required")}),Ts=ie.object({databases:ie.array(Zn),dbType:nt}),Es=ie.object({version:ie.string("Version is required"),database:ie.string("Database is required"),user:ie.string("User is required"),host:ie.string("Host is required").nullable(),port:ie.number("Port is required").nullable(),active_connections:ie.coerce.number("Active connections is required"),max_connections:ie.coerce.number("Max connections is required")})});var ta=N(()=>{"use strict"});import{z as Ge}from"zod";var vt,ra=N(()=>{"use strict";vt=Ge.object({tableName:Ge.string("Table name is required"),primaryKeys:Ge.array(Ge.object({columnName:Ge.string("Column name is required"),value:Ge.any()})).min(1,"At least one primary key is required")})});import{z as ws}from"zod";var Sr,na=N(()=>{"use strict";Te();Sr=P.extend({cascade:ws.string().optional().transform(n=>n==="true")})});import{z as aa}from"zod";var Cr,oa=N(()=>{"use strict";Cr=aa.object({query:aa.string("Query is required")})});import{z as Rs}from"zod";var sa,Nr,ia=N(()=>{"use strict";Te();sa=["csv","xlsx","json"],Nr=P.extend({format:Rs.enum(sa,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as b}from"zod";var Ot,v,Ar,Dr,Ss,_r,Qe,Cs,Ns,As,Ds,_s,xs,Ps,la,ks,xr,$s,vs,Os,Ls,Ms,Is,qs,Pr,Us,Bs,Fs,js,Ks,Hs,Vs,zs,Ws,Ys,Gs,Qs,Js,Xs,Zs,kr,$r,ei,ca=N(()=>{"use strict";Ot=b.enum(["string","hash","list","set","zset","stream","unknown"]),v=b.object({base64:b.string().max(16*1024*1024).refine(n=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(n),"Invalid unpadded base64url value"),utf8:b.string().optional()}),Ar=b.object({db:b.string(),cursor:b.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:b.coerce.number().int().min(1).max(200).default(50),search:b.string().max(512).optional(),exactPattern:b.stringbool().default(!1),type:Ot.exclude(["unknown"]).optional()}),Dr=b.object({key:v,type:Ot,ttlMs:b.number().int(),memoryBytes:b.number().int().nonnegative().nullable()}),Ss=b.object({keys:b.array(Dr),nextCursor:b.string().nullable(),hasMore:b.boolean()}),_r=b.object({db:b.string(),cursor:b.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:b.coerce.number().int().min(1).max(500).default(100),full:b.stringbool().default(!1),direction:b.enum(["forward","backward"]).default("forward")}),Qe=b.object({key:b.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),Cs=b.object({kind:b.literal("string"),value:v,truncated:b.boolean()}),Ns=b.object({kind:b.literal("hash"),entries:b.array(b.object({field:v,value:v}))}),As=b.object({kind:b.literal("list"),entries:b.array(b.object({index:b.number().int(),value:v}))}),Ds=b.object({kind:b.literal("set"),members:b.array(v)}),_s=b.object({kind:b.literal("zset"),entries:b.array(b.object({member:v,score:b.union([b.number(),b.literal("inf"),b.literal("-inf")])}))}),xs=b.object({kind:b.literal("stream"),entries:b.array(b.object({id:b.string(),fields:b.array(b.object({field:v,value:v}))}))}),Ps=b.object({kind:b.literal("unknown")}),la=b.discriminatedUnion("kind",[Cs,Ns,As,Ds,_s,xs,Ps]),ks=Dr.extend({length:b.number().int().nonnegative().nullable(),revision:b.string(),value:la,nextCursor:b.string().nullable(),hasMore:b.boolean()}),xr=b.object({db:b.string(),offset:b.coerce.number().int().nonnegative().default(0),limit:b.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:b.string().optional()}),$s=b.object({chunk:v,length:b.number().int().nonnegative(),nextOffset:b.number().int().nonnegative().nullable(),hasMore:b.boolean()}),vs=b.object({kind:b.literal("string"),value:v}),Os=b.object({kind:b.literal("hash"),entries:b.array(b.object({field:v,value:v})).min(1)}),Ls=b.object({kind:b.literal("list"),entries:b.array(v).min(1)}),Ms=b.object({kind:b.literal("set"),members:b.array(v).min(1)}),Is=b.object({kind:b.literal("zset"),entries:b.array(b.object({member:v,score:b.number()})).min(1)}),qs=b.object({kind:b.literal("stream"),id:b.string().default("*"),fields:b.array(b.object({field:v,value:v})).min(1)}),Pr=b.object({key:v,type:Ot.exclude(["unknown"]),value:b.discriminatedUnion("kind",[vs,Os,Ls,Ms,Is,qs]),ttlMs:b.number().int().positive().nullable().default(null)}),Us=b.object({key:v,revision:b.string().nullable(),deleted:b.boolean()}),Bs=b.object({action:b.literal("rename"),newKey:v}),Fs=b.object({action:b.literal("setTtl"),ttlMs:b.number().int().positive().nullable()}),js=b.object({action:b.literal("setString"),value:v}),Ks=b.object({action:b.literal("upsertHash"),field:v,value:v}),Hs=b.object({action:b.literal("deleteHash"),field:v}),Vs=b.object({action:b.literal("pushList"),side:b.enum(["left","right"]),value:v}),zs=b.object({action:b.literal("setList"),index:b.number().int(),value:v}),Ws=b.object({action:b.literal("deleteList"),index:b.number().int()}),Ys=b.object({action:b.literal("addSet"),member:v}),Gs=b.object({action:b.literal("removeSet"),member:v}),Qs=b.object({action:b.literal("upsertZset"),member:v,score:b.number()}),Js=b.object({action:b.literal("removeZset"),member:v}),Xs=b.object({action:b.literal("appendStream"),id:b.string().default("*"),fields:b.array(b.object({field:v,value:v})).min(1)}),Zs=b.object({action:b.literal("deleteStream"),id:b.string()}),kr=b.object({expectedRevision:b.string(),force:b.boolean().default(!1),operation:b.discriminatedUnion("action",[Bs,Fs,js,Ks,Hs,Vs,zs,Ws,Ys,Gs,Qs,Js,Xs,Zs])}),$r=b.object({db:b.string(),expectedRevision:b.string(),force:b.stringbool().default(!1)}),ei=b.object({deleted:b.boolean()})});var ua=N(()=>{"use strict"});import{z as vr}from"zod";var Lt,ti,ri,ma=N(()=>{"use strict";Te();_t();Lt=vr.object({newColumnName:vr.string("New column name is required")}),ti=se,ri=vr.object({db:P.shape.db,tableName:se.shape.tableName,columnName:se.shape.columnName,newColumnName:Lt.shape.newColumnName})});import{z as H}from"zod";var ni,st,ai,da,oi,Or,pa=N(()=>{"use strict";Te();ni=H.object({columnName:H.string(),operator:H.string(),value:H.string()}),st=["asc","desc"],ai=H.object({columnName:H.string(),direction:H.enum(st)}),da=H.object({limit:H.number(),total:H.number(),hasNextPage:H.boolean(),hasPreviousPage:H.boolean(),nextCursor:H.string().nullable(),prevCursor:H.string().nullable()}),oi=H.object({data:H.array(H.record(H.string(),H.unknown())),meta:da}),Or=H.object({db:P.shape.db,cursor:H.string().optional(),limit:H.string().optional().default("50").transform(Number),direction:H.enum(st).optional().default(st[0]),sort:H.string().optional().transform(n=>{if(!n)return"";try{let e=JSON.parse(n);return Array.isArray(e)?e:n}catch{return n}}),order:H.enum(st).optional(),filters:H.string().optional().transform(n=>{if(!n)return[];try{return JSON.parse(n)}catch{return[]}})})});import{z as Mt}from"zod";var si,fa=N(()=>{"use strict";si=Mt.object({tableName:Mt.string("Table name is required"),schemaName:Mt.string().optional(),rowCount:Mt.coerce.number("Row count is required")})});import{z as ya}from"zod";var ii,ba=N(()=>{"use strict";ii=ya.object({schema:ya.string()})});import{z as Ce}from"zod";var Lr,ha=N(()=>{"use strict";Lr=Ce.object({tableName:Ce.string("Table name is required"),primaryKey:Ce.string("Primary key is required").default("id"),updates:Ce.array(Ce.object({rowData:Ce.record(Ce.string("Column name is required"),Ce.any()),columnName:Ce.string("Column name is required"),value:Ce.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var ga={};Gt(ga,{AI_PROVIDERS:()=>Un,AI_PROVIDER_OPTIONS:()=>Bn,DATABASE_TYPES:()=>Mn,DataTypes:()=>K,FOREIGN_KEY_ACTIONS:()=>Gn,FORMAT_TYPES:()=>sa,StandardizedDataType:()=>g,addColumnParamSchema:()=>is,addColumnParamsSchema:()=>ls,addColumnSchema:()=>Ee,addRecordSchema:()=>cr,aiProviderSchema:()=>ur,alterColumnParamSchema:()=>ds,alterColumnParamsSchema:()=>ps,alterColumnSchema:()=>We,bulkInsertRecordsSchema:()=>fr,chatSchema:()=>yr,columnInfoSchema:()=>gs,connectionInfoSchema:()=>Es,createKeySchema:()=>Pr,createTableSchema:()=>Rr,currentDatabaseSchema:()=>os,dataTypesSchema:()=>zn,databaseInfoSchema:()=>Zn,databaseListSchema:()=>Ts,databaseSchema:()=>P,databaseTypeParamSchema:()=>ss,databaseTypeSchema:()=>nt,deleteColumnParamSchema:()=>se,deleteColumnParamsSchema:()=>us,deleteColumnQuerySchema:()=>pr,deleteColumnSuccessResponseSchema:()=>ms,deleteKeyQuerySchema:()=>$r,deleteKeyResultSchema:()=>ei,deleteRecordSchema:()=>vt,deleteTableQuerySchema:()=>Sr,encodedRedisValueSchema:()=>v,executeQuerySchema:()=>Cr,exportTableSchema:()=>Nr,fieldDataSchema:()=>Qn,filterSchema:()=>ni,foreignKeyActionSchema:()=>wr,foreignKeyDataSchema:()=>Jn,getDefaultAiModel:()=>mr,keyActionSchema:()=>kr,keyDetailsQuerySchema:()=>_r,keyDetailsResultSchema:()=>ks,keyParamSchema:()=>Qe,keyRawQuerySchema:()=>xr,keyRawResultSchema:()=>$s,keyScanQuerySchema:()=>Ar,keyScanResultSchema:()=>Ss,keyWriteResultSchema:()=>Us,mapMssqlToDataType:()=>kt,mapMysqlToDataType:()=>Pt,mapPostgresToDataType:()=>xt,mapSqliteToDataType:()=>$t,redisKeySummarySchema:()=>Dr,redisKeyTypeSchema:()=>Ot,redisKeyValueSchema:()=>la,renameColumnParamSchema:()=>ti,renameColumnParamsSchema:()=>ri,renameColumnSchema:()=>Lt,sortDirections:()=>st,sortSchema:()=>ai,standardizeDataTypeLabel:()=>hr,standardizeMssqlDataTypeLabel:()=>Tr,standardizeMysqlDataTypeLabel:()=>gr,standardizeSqliteDataTypeLabel:()=>Er,standardizedDataTypeSchema:()=>Wn,tableDataMetaSchema:()=>da,tableDataQuerySchema:()=>Or,tableDataResultSchema:()=>oi,tableInfoSchema:()=>si,tableNameSchema:()=>ge,tableSchemaResultSchema:()=>ii,updateRecordsSchema:()=>Lr});var Re=N(()=>{"use strict";In();qn();dr();Fn();jn();Kn();Hn();Vn();Yn();br();Xn();Te();ea();ta();_t();ra();na();oa();ia();ca();ua();ma();pa();fa();ba();ha()});function Mr(n,e=0){if(n.length===0)return{clause:"",values:[],nextIdx:e};let t=[],r=[],a=e;for(let o of n){let s=`[${o.columnName}]`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":t.push(`${s} ${o.operator} @p${a}`),r.push(o.value),a++;break;case"is":o.value.toLowerCase()==="null"?t.push(`${s} IS NULL`):(t.push(`${s} = @p${a}`),r.push(o.value),a++);break;case"is not":o.value.toLowerCase()==="null"?t.push(`${s} IS NOT NULL`):(t.push(`${s} != @p${a}`),r.push(o.value),a++);break;case"like":case"ilike":t.push(`${s} LIKE @p${a}`),r.push(o.value),a++;break;case"not like":case"not ilike":t.push(`${s} NOT LIKE @p${a}`),r.push(o.value),a++;break;default:break}}return t.length===0?{clause:"",values:[],nextIdx:e}:{clause:`WHERE ${t.join(" AND ")}`,values:r,nextIdx:a}}function Ir(n,e){return Array.isArray(n)?n.length===0?"":`ORDER BY ${n.map(t=>`[${t.columnName}] ${t.direction.toUpperCase()}`).join(", ")}`:n&&typeof n=="string"?`ORDER BY [${n}] ${e?.toUpperCase()||"ASC"}`:""}function qr(n,e){if(e)return"NVARCHAR(MAX)";let t=n.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]||n.toUpperCase()}function Ur(n,e){let t=n.trim().toLowerCase();return t.includes("(")&&t.includes(")")?t.includes("newid()")?e.toUpperCase().includes("UNIQUEIDENTIFIER")?"NEWID()":null:t.includes("getdate")||t.includes("current_timestamp")?"GETDATE()":n.trim():t==="null"?"NULL":t==="true"||t==="false"?t==="true"?"1":"0":n.trim()}function Ta(n,e={}){let t=qr(n.columnType,n.isArray??!1),r=`[${n.columnName}] ${t}`;if(n.isIdentity&&!t.includes("IDENTITY")&&(r+=" IDENTITY(1,1)"),!n.isNullable&&!n.isPrimaryKey&&(r+=" NOT NULL"),n.defaultValue?.trim()&&!t.includes("IDENTITY")){let a=Ur(n.defaultValue,t);a!==null&&(r+=` DEFAULT ${a}`)}return e.includeUnique&&n.isUnique&&!n.isPrimaryKey&&(r+=" UNIQUE"),e.includePrimaryKey&&n.isPrimaryKey&&(r+=" PRIMARY KEY"),r}var Ea=N(()=>{"use strict"});import{HTTPException as q}from"hono/http-exception";var li,ci,It,wa=N(()=>{"use strict";Re();qe();Be();tt();Ea();li=547,ci=3726,It=class extends ue{async runQuery(e,t,r){let o=(await V(e)).request();return r.forEach((c,i)=>{o.input(`p${i}`,c)}),(await o.query(t)).recordset}quoteIdentifier(e){return`[${e}]`}mapToUniversalType(e){return kt(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:r=[],sort:a=[],order:o="asc",limit:s=50,cursor:c}=e,{clause:i,values:l,nextIdx:u}=Mr(r,0),m=Ir(a,o)||"ORDER BY (SELECT NULL)",d=c?this.decodeOffsetCursor(c):0,p=`SELECT * FROM [${t}] ${i} ${m} OFFSET @p${u} ROWS FETCH NEXT @p${u+1} ROWS ONLY`,f=[...l,d,s+1],y=`SELECT COUNT(*) as total FROM [${t}] ${i}`;return{sql:p,values:f,countSql:y,countValues:l}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){let{cursor:a,limit:o=50}=e,s=a?this.decodeOffsetCursor(a):0;return{nextCursor:r?this.makeCursor(s+o):null,prevCursor:s>0?this.makeCursor(Math.max(0,s-o)):null}}async getTableData(e){try{let{tableName:t,db:r,limit:a=50,sort:o=[],order:s="asc",cursor:c,filters:i=[]}=e,l=await V(r),u=c?this.decodeOffsetCursor(c):0,{clause:m,values:d,nextIdx:p}=Mr(i,0),f=Ir(o,s)||"ORDER BY (SELECT NULL)",y=l.request();d.forEach((w,A)=>{y.input(`p${A}`,w)});let h=await y.query(`SELECT COUNT(*) as total FROM [${t}] ${m}`),E=Number(h.recordset[0]?.total??0),T=l.request();d.forEach((w,A)=>{T.input(`p${A}`,w)}),T.input(`p${p}`,u),T.input(`p${p+1}`,a+1);let S=(await T.query(`SELECT * FROM [${t}] ${m} ${f} OFFSET @p${p} ROWS FETCH NEXT @p${p+1} ROWS ONLY`)).recordset,R=S.length>a;return R&&(S=S.slice(0,a)),{data:S,meta:{limit:a,total:E,hasNextPage:R,hasPreviousPage:u>0,nextCursor:R?this.makeCursor(u+a):null,prevCursor:u>0?this.makeCursor(Math.max(0,u-a)):null}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){let t=await(await V()).request().query(`
3
3
  SELECT
4
4
  d.name AS name,
5
5
  CAST(ROUND(CAST(SUM(mf.size) * 8.0 / 1024 AS DECIMAL(10,2)), 2) AS VARCHAR(20)) + ' MB' AS size,
@@ -19,20 +19,20 @@ var po=Object.defineProperty;var N=(n,e)=>()=>(n&&(e=n(n=0)),e);var Yt=(n,e)=>{f
19
19
  (SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS port,
20
20
  @@MAX_CONNECTIONS AS max_connections,
21
21
  (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS active_connections
22
- `);if(!t.recordset[0])throw new q(500,{message:"No connection information returned from server"});let r=t.recordset[0],a=Oe();return{host:String(r.host||a.host),port:Number(r.port||a.port),user:String(r.user),database:String(r.database_name??""),version:String(r.version),active_connections:Number(r.active_connections??0),max_connections:Number(r.max_connections)}}async getTablesList(e){let t=await V(e),r=await t.request().query(`
22
+ `);if(!t.recordset[0])throw new q(500,{message:"No connection information returned from server"});let r=t.recordset[0],a=$e();return{host:String(r.host||a.host),port:Number(r.port||a.port),user:String(r.user),database:String(r.database_name??""),version:String(r.version),active_connections:Number(r.active_connections??0),max_connections:Number(r.max_connections)}}async getTablesList(e){let t=await V(e),r=await t.request().query(`
23
23
  SELECT table_name AS tableName
24
24
  FROM information_schema.tables
25
25
  WHERE table_catalog = DB_NAME()
26
26
  AND table_type = 'BASE TABLE'
27
27
  AND table_schema = 'dbo'
28
28
  ORDER BY table_name
29
- `);return!r.recordset||r.recordset.length===0?[]:Promise.all(r.recordset.map(async a=>{let o=await t.request().query(`SELECT COUNT(*) as count FROM [${a.tableName}]`);return{tableName:a.tableName,rowCount:o.recordset[0]?.count??0}}))}async createTable({tableData:e,db:t}){let{tableName:r,fields:a,foreignKeys:o}=e,s=await V(t),c=a.map(m=>{let p=Lr(m.columnType,m.isArray??!1),d=`[${m.columnName}] ${p}`;if(!m.isNullable&&!m.isPrimaryKey&&(d+=" NOT NULL"),m.defaultValue&&!p.includes("IDENTITY")){let f=Mr(m.defaultValue,p);f!==null&&(d+=` DEFAULT ${f}`)}return d}),i=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&i.push(`PRIMARY KEY (${l.map(m=>`[${m.columnName}]`).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&i.push(`UNIQUE ([${m.columnName}])`);let u=o?.map(m=>`CONSTRAINT [${`FK_${r}_${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 [${r}] (
29
+ `);return!r.recordset||r.recordset.length===0?[]:Promise.all(r.recordset.map(async a=>{let o=await t.request().query(`SELECT COUNT(*) as count FROM [${a.tableName}]`);return{tableName:a.tableName,rowCount:o.recordset[0]?.count??0}}))}async createTable({tableData:e,db:t}){let{tableName:r,fields:a,foreignKeys:o}=e,s=await V(t),c=a.map(m=>{let d=qr(m.columnType,m.isArray??!1),p=`[${m.columnName}] ${d}`;if(!m.isNullable&&!m.isPrimaryKey&&(p+=" NOT NULL"),m.defaultValue&&!d.includes("IDENTITY")){let f=Ur(m.defaultValue,d);f!==null&&(p+=` DEFAULT ${f}`)}return p}),i=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&i.push(`PRIMARY KEY (${l.map(m=>`[${m.columnName}]`).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&i.push(`UNIQUE ([${m.columnName}])`);let u=o?.map(m=>`CONSTRAINT [${`FK_${r}_${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 [${r}] (
30
30
  ${[...c,...i,...u].join(`,
31
31
  `)}
32
32
  )`)}async deleteTable(e){let{tableName:t,db:r,cascade:a}=e,o=await V(r),s=await o.request().input("tableName",t).query(`
33
33
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES
34
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 q(404,{message:`Table "${t}" does not exist`});let c=await this.getTableRowCount(t,r);if(!a){let i=await this.getRelatedRecordsForTable(t,r);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{if(a){let i=await this.getForeignKeyReferences(t,r);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===Zs)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,r)};throw i instanceof q?i:new q(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){let r=await V(t),a=await r.request().input("tableName",e).query(`
35
+ `);if(Number(s.recordset[0]?.cnt??0)===0)throw new q(404,{message:`Table "${t}" does not exist`});let c=await this.getTableRowCount(t,r);if(!a){let i=await this.getRelatedRecordsForTable(t,r);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{if(a){let i=await this.getForeignKeyReferences(t,r);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===ci)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,r)};throw i instanceof q?i:new q(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){let r=await V(t),a=await r.request().input("tableName",e).query(`
36
36
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES
37
37
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND TABLE_SCHEMA = 'dbo'
38
38
  `);if(Number(a.recordset[0]?.cnt??0)===0)throw new q(404,{message:`Table "${e}" does not exist`});let o=await r.request().input("tableName",e).query(`
@@ -118,10 +118,10 @@ ${s.join(`,
118
118
  JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cc
119
119
  ON chk.CONSTRAINT_NAME = cc.CONSTRAINT_NAME AND cc.TABLE_SCHEMA = 'dbo'
120
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 a.recordset.map(c=>{let i=s.get(c.columnName)??null;return{columnName:c.columnName,dataType:i?"enum":$t(c.dataType),dataTypeLabel:i?"enum":yr(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:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,db:u}=e,m=await V(u);await this.assertTableExists(m,t);let p=await m.request().input("tableName",t).input("columnName",r).query(`
121
+ `),s=new Map;for(let c of o.recordset){let i=this.parseCheckConstraintValues(c.checkClause);i&&s.set(c.columnName,i)}return a.recordset.map(c=>{let i=s.get(c.columnName)??null;return{columnName:c.columnName,dataType:i?"enum":kt(c.dataType),dataTypeLabel:i?"enum":Tr(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:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,db:u}=e,m=await V(u);await this.assertTableExists(m,t);let d=await m.request().input("tableName",t).input("columnName",r).query(`
122
122
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS
123
123
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = 'dbo'
124
- `);if(Number(p.recordset[0]?.cnt??0)>0)throw new q(409,{message:`Column "${r}" already exists in table "${t}"`});let d=pa({columnName:r,columnType:a,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:r,db:a}=e,o=await V(a);return await this.assertTableExists(o,t),await this.assertColumnExists(o,t,r),{deletedCount:(await o.request().query(`ALTER TABLE [${t}] DROP COLUMN [${r}]`)).rowsAffected[0]??1}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,isNullable:o,defaultValue:s,db:c}=e,i=await V(c);await this.assertTableExists(i,t),await this.assertColumnExists(i,t,r);let u=(await i.request().input("tableName",t).input("columnName",r).query(`
124
+ `);if(Number(d.recordset[0]?.cnt??0)>0)throw new q(409,{message:`Column "${r}" already exists in table "${t}"`});let p=Ta({columnName:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l},{includePrimaryKey:!0,includeUnique:!0});await m.request().query(`ALTER TABLE [${t}] ADD ${p}`)}async deleteColumn(e){let{tableName:t,columnName:r,db:a}=e,o=await V(a);return await this.assertTableExists(o,t),await this.assertColumnExists(o,t,r),{deletedCount:(await o.request().query(`ALTER TABLE [${t}] DROP COLUMN [${r}]`)).rowsAffected[0]??1}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,isNullable:o,defaultValue:s,db:c}=e,i=await V(c);await this.assertTableExists(i,t),await this.assertColumnExists(i,t,r);let u=(await i.request().input("tableName",t).input("columnName",r).query(`
125
125
  SELECT dc.name AS constraint_name
126
126
  FROM sys.default_constraints dc
127
127
  JOIN sys.columns c
@@ -130,7 +130,7 @@ ${s.join(`,
130
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 [${r}] ${a} ${m}`),s?.trim()&&await i.request().query(`ALTER TABLE [${t}] ADD DEFAULT ${s.trim()} FOR [${r}]`)}async renameColumn(e){let{tableName:t,columnName:r,newColumnName:a,db:o}=e,s=await V(o);await this.assertTableExists(s,t),await this.assertColumnExists(s,t,r);let c=await s.request().input("tableName",t).input("columnName",a).query(`
131
131
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS
132
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 q(409,{message:`Column "${a}" already exists in table "${t}"`});await s.request().query(`EXEC sp_rename '${t}.${r}', '${a}', 'COLUMN'`)}async addRecord({db:e,params:t}){let{tableName:r,data:a}=t,o=await V(e),s=await this.getBooleanColumnSet(r,e),c=await o.request().input("tableName",r).query("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@tableName) AND is_identity = 1"),i=new Set(c.recordset.map(y=>y.name)),l=Object.keys(a).filter(y=>!i.has(y)),u=l.map(y=>{let g=a[y];return s.has(y)&&typeof g=="string"?g==="true"?1:0:g}),m=l.map(y=>`[${y}]`).join(", "),p=l.map((y,g)=>`@param${g}`).join(", "),d=o.request();l.forEach((y,g)=>{d.input(`param${g}`,u[g])});let f=await d.query(`INSERT INTO [${r}] (${m}) VALUES (${p})`);if(f.rowsAffected[0]===0)throw new q(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:f.rowsAffected[0]??0}}async updateRecords({params:e,db:t}){let{tableName:r,updates:a,primaryKey:o}=e,s=await V(t),c=await this.getBooleanColumnSet(r,t),i=new Map;for(let u of a){let m=u.rowData[o];if(m==null)throw new q(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,p]of i.entries()){let d=l.request(),f=p.map((g,E)=>`[${g.columnName}] = @value${E}`);p.forEach((g,E)=>{let T=g.value;T!==null&&typeof T=="object"&&(T=JSON.stringify(T)),c.has(g.columnName)&&typeof T=="string"&&(T=T==="true"?1:0),d.input(`value${E}`,T)}),d.input("pkValue",m);let y=await d.query(`UPDATE [${r}] SET ${f.join(", ")} WHERE [${o}] = @pkValue`);if(y.rowsAffected[0]===0)throw new q(404,{message:`Record with ${o} = ${m} not found in table "${r}"`});u+=y.rowsAffected[0]??0}return await l.commit(),{updatedCount:u}}catch(u){throw await l.rollback(),u instanceof q?u:new q(500,{message:`Failed to update records in "${r}"`})}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=await V(r),o=t[0]?.columnName;if(!o)throw new q(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value),c=a.transaction();await c.begin();try{let i=c.request();s.forEach((m,p)=>{i.input(`pk${p}`,m)});let l=s.map((m,p)=>`@pk${p}`).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===Xs)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,r)};throw i instanceof q?i:new q(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=await V(r),o=t[0]?.columnName;if(!o)throw new q(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value),c=a.transaction();await c.begin();try{let i=await this.getForeignKeyReferences(e,r),l=0,u=new Set,m=new Set,p=async(g,E,T,S)=>{let C=`${g}.${E}`;if(S.has(C))return;S.add(C);let R=await this.getForeignKeyReferences(g,r);for(let x of R){let $=c.request();T.forEach((G,re)=>{$.input(`val${re}`,G)});let O=T.map((G,re)=>`@val${re}`).join(", "),j=(await $.query(`SELECT [${x.referencedColumn}] FROM [${g}] WHERE [${E}] IN (${O})`)).recordset.map(G=>G[x.referencedColumn]);j.length>0&&await p(x.referencingTable,x.referencingColumn,j,S)}let w=c.request();T.forEach((x,$)=>{w.input(`delVal${$}`,x)});let A=T.map((x,$)=>`@delVal${$}`).join(", "),_=await w.query(`DELETE FROM [${g}] WHERE [${E}] IN (${A})`);l+=_.rowsAffected[0]??0,u.add(g)};for(let g of i)u.has(g.referencingTable)||await p(g.referencingTable,g.referencingColumn,s,m);let d=c.request();s.forEach((g,E)=>{d.input(`mainPk${E}`,g)});let f=s.map((g,E)=>`@mainPk${E}`).join(", "),y=await d.query(`DELETE FROM [${e}] WHERE [${o}] IN (${f})`);return await c.commit(),{deletedCount:(y.rowsAffected[0]??0)+l}}catch(i){throw await c.rollback(),i instanceof q?i:new q(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t||t.length===0)throw new q(400,{message:"At least one record is required"});let o=(await V(r)).transaction();try{let s=Object.keys(t[0]),c=s.map(l=>`[${l}]`).join(", "),i=await this.getBooleanColumnSet(e,r);await o.begin();for(let l=0;l<t.length;l++){let u=t[l],m=o.request(),p=s.map(f=>{let y=u[f];return i.has(f)&&typeof y=="string"?y==="true"?1:0:y}),d=s.map((f,y)=>`@p${l}_${y}`).join(", ");s.forEach((f,y)=>{m.input(`p${l}_${y}`,p[y])});try{await m.query(`INSERT INTO [${e}] (${c}) VALUES (${d})`)}catch(f){throw new q(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 q?s:new q(500,{message:`Failed to bulk insert records into "${e}"`})}}async executeQuery({query:e,db:t}){let r=await V(t);if(!e?.trim())throw new q(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now(),s=await r.request().query(a),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 V(t)).request().input("tableName",e).query(`
133
+ `);if(Number(c.recordset[0]?.cnt??0)>0)throw new q(409,{message:`Column "${a}" already exists in table "${t}"`});await s.request().query(`EXEC sp_rename '${t}.${r}', '${a}', 'COLUMN'`)}async addRecord({db:e,params:t}){let{tableName:r,data:a}=t,o=await V(e),s=await this.getBooleanColumnSet(r,e),c=await o.request().input("tableName",r).query("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@tableName) AND is_identity = 1"),i=new Set(c.recordset.map(y=>y.name)),l=Object.keys(a).filter(y=>!i.has(y)),u=l.map(y=>{let h=a[y];return s.has(y)&&typeof h=="string"?h==="true"?1:0:h}),m=l.map(y=>`[${y}]`).join(", "),d=l.map((y,h)=>`@param${h}`).join(", "),p=o.request();l.forEach((y,h)=>{p.input(`param${h}`,u[h])});let f=await p.query(`INSERT INTO [${r}] (${m}) VALUES (${d})`);if(f.rowsAffected[0]===0)throw new q(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:f.rowsAffected[0]??0}}async updateRecords({params:e,db:t}){let{tableName:r,updates:a,primaryKey:o}=e,s=await V(t),c=await this.getBooleanColumnSet(r,t),i=new Map;for(let u of a){let m=u.rowData[o];if(m==null)throw new q(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,d]of i.entries()){let p=l.request(),f=d.map((h,E)=>`[${h.columnName}] = @value${E}`);d.forEach((h,E)=>{let T=h.value;T!==null&&typeof T=="object"&&(T=JSON.stringify(T)),c.has(h.columnName)&&typeof T=="string"&&(T=T==="true"?1:0),p.input(`value${E}`,T)}),p.input("pkValue",m);let y=await p.query(`UPDATE [${r}] SET ${f.join(", ")} WHERE [${o}] = @pkValue`);if(y.rowsAffected[0]===0)throw new q(404,{message:`Record with ${o} = ${m} not found in table "${r}"`});u+=y.rowsAffected[0]??0}return await l.commit(),{updatedCount:u}}catch(u){throw await l.rollback(),u instanceof q?u:new q(500,{message:`Failed to update records in "${r}"`})}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=await V(r),o=t[0]?.columnName;if(!o)throw new q(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value),c=a.transaction();await c.begin();try{let i=c.request();s.forEach((m,d)=>{i.input(`pk${d}`,m)});let l=s.map((m,d)=>`@pk${d}`).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===li)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,r)};throw i instanceof q?i:new q(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=await V(r),o=t[0]?.columnName;if(!o)throw new q(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value),c=a.transaction();await c.begin();try{let i=await this.getForeignKeyReferences(e,r),l=0,u=new Set,m=new Set,d=async(h,E,T,C)=>{let S=`${h}.${E}`;if(C.has(S))return;C.add(S);let R=await this.getForeignKeyReferences(h,r);for(let x of R){let k=c.request();T.forEach((G,ne)=>{k.input(`val${ne}`,G)});let $=T.map((G,ne)=>`@val${ne}`).join(", "),j=(await k.query(`SELECT [${x.referencedColumn}] FROM [${h}] WHERE [${E}] IN (${$})`)).recordset.map(G=>G[x.referencedColumn]);j.length>0&&await d(x.referencingTable,x.referencingColumn,j,C)}let w=c.request();T.forEach((x,k)=>{w.input(`delVal${k}`,x)});let A=T.map((x,k)=>`@delVal${k}`).join(", "),_=await w.query(`DELETE FROM [${h}] WHERE [${E}] IN (${A})`);l+=_.rowsAffected[0]??0,u.add(h)};for(let h of i)u.has(h.referencingTable)||await d(h.referencingTable,h.referencingColumn,s,m);let p=c.request();s.forEach((h,E)=>{p.input(`mainPk${E}`,h)});let f=s.map((h,E)=>`@mainPk${E}`).join(", "),y=await p.query(`DELETE FROM [${e}] WHERE [${o}] IN (${f})`);return await c.commit(),{deletedCount:(y.rowsAffected[0]??0)+l}}catch(i){throw await c.rollback(),i instanceof q?i:new q(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t||t.length===0)throw new q(400,{message:"At least one record is required"});let o=(await V(r)).transaction();try{let s=Object.keys(t[0]),c=s.map(l=>`[${l}]`).join(", "),i=await this.getBooleanColumnSet(e,r);await o.begin();for(let l=0;l<t.length;l++){let u=t[l],m=o.request(),d=s.map(f=>{let y=u[f];return i.has(f)&&typeof y=="string"?y==="true"?1:0:y}),p=s.map((f,y)=>`@p${l}_${y}`).join(", ");s.forEach((f,y)=>{m.input(`p${l}_${y}`,d[y])});try{await m.query(`INSERT INTO [${e}] (${c}) VALUES (${p})`)}catch(f){throw new q(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 q?s:new q(500,{message:`Failed to bulk insert records into "${e}"`})}}async executeQuery({query:e,db:t}){let r=await V(t);if(!e?.trim())throw new q(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now(),s=await r.request().query(a),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 V(t)).request().input("tableName",e).query(`
134
134
  SELECT
135
135
  fk.name AS constraint_name,
136
136
  OBJECT_NAME(fk.parent_object_id) AS referencing_table,
@@ -140,13 +140,13 @@ ${s.join(`,
140
140
  FROM sys.foreign_keys fk
141
141
  INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
142
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 r=await this.getForeignKeyReferences(e,t);if(r.length===0)return[];let a=await V(t),o=[];for(let s of r){let c=await a.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,r){let a=await this.getForeignKeyReferences(e,r);if(a.length===0)return[];let o=await V(r),s=t.map(l=>l.value),c=[],i=new Map;for(let l of a){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(y=>y.columnName===u.referencedColumn))continue;let p=o.request();s.forEach((y,g)=>{p.input(`pk${g}`,y)});let d=s.map((y,g)=>`@pk${g}`).join(", "),f=await p.query(`SELECT TOP 100 * FROM [${u.referencingTable}] WHERE [${u.referencingColumn}] IN (${d})`);f.recordset.length>0&&c.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:f.recordset})}return c}async getTableRowCount(e,t){let a=await(await V(t)).request().query(`SELECT COUNT(*) as count FROM [${e}]`);return Number(a.recordset[0]?.count??0)}async getBooleanColumnSet(e,t){let r=await this.getTableColumns({tableName:e,db:t});return new Set(r.filter(a=>a.dataTypeLabel==="boolean").map(a=>a.columnName))}async assertTableExists(e,t){let r=await e.request().input("tableName",t).query(`
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 r=await this.getForeignKeyReferences(e,t);if(r.length===0)return[];let a=await V(t),o=[];for(let s of r){let c=await a.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,r){let a=await this.getForeignKeyReferences(e,r);if(a.length===0)return[];let o=await V(r),s=t.map(l=>l.value),c=[],i=new Map;for(let l of a){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(y=>y.columnName===u.referencedColumn))continue;let d=o.request();s.forEach((y,h)=>{d.input(`pk${h}`,y)});let p=s.map((y,h)=>`@pk${h}`).join(", "),f=await d.query(`SELECT TOP 100 * FROM [${u.referencingTable}] WHERE [${u.referencingColumn}] IN (${p})`);f.recordset.length>0&&c.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:f.recordset})}return c}async getTableRowCount(e,t){let a=await(await V(t)).request().query(`SELECT COUNT(*) as count FROM [${e}]`);return Number(a.recordset[0]?.count??0)}async getBooleanColumnSet(e,t){let r=await this.getTableColumns({tableName:e,db:t});return new Set(r.filter(a=>a.dataTypeLabel==="boolean").map(a=>a.columnName))}async assertTableExists(e,t){let r=await e.request().input("tableName",t).query(`
144
144
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES
145
145
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND TABLE_SCHEMA = 'dbo'
146
146
  `);if(Number(r.recordset[0]?.cnt??0)===0)throw new q(404,{message:`Table "${t}" does not exist`})}async assertColumnExists(e,t,r){let a=await e.request().input("tableName",t).input("columnName",r).query(`
147
147
  SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS
148
148
  WHERE TABLE_CATALOG = DB_NAME() AND TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = 'dbo'
149
- `);if(Number(a.recordset[0]?.cnt??0)===0)throw new q(404,{message:`Column "${r}" does not exist in table "${t}"`})}parseCheckConstraintValues(e){let t=e.match(/'([^']+)'/g);return!t||t.length===0?null:t.map(r=>r.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 kr(n){if(n.length===0)return{clause:"",values:[]};let e=[],t=[];for(let r of n){let a=`\`${r.columnName}\``;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${r.operator} ?`),t.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(r.value));break;case"like":case"ilike":e.push(`${a} LIKE ?`),t.push(r.value);break;case"not like":case"not ilike":e.push(`${a} NOT LIKE ?`),t.push(r.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Ir(n,e){return Array.isArray(n)?n.length===0?"":`ORDER BY ${n.map(t=>`\`${t.columnName}\` ${t.direction.toUpperCase()}`).join(", ")}`:n&&typeof n=="string"?`ORDER BY \`${n}\` ${e?.toUpperCase()||"ASC"}`:""}function qr(n,e,t){let{values:r,sortColumns:a}=n;if(a.length===0)return{clause:"",values:[]};let i=t==="asc"===(e==="asc")?">":"<",l=a.map(p=>`\`${p}\``).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>r[p]);return{clause:`(${l}) ${i} (${u})`,values:m}}function ei(n,e){if(e)return"JSON";let t=n.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]||n.toUpperCase()}function ti(n,e){if(!n?.trim())return null;let t=n.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)":`(${n.trim()})`:t==="null"?"NULL":t==="true"?"1":t==="false"?"0":n.trim()}function qt(n,e={}){let t=ei(n.columnType,n.isArray??!1),r=`\`${n.columnName}\` ${t}`;if(!n.isNullable&&!n.isPrimaryKey&&(r+=" NOT NULL"),n.defaultValue&&!t.includes("AUTO_INCREMENT")){let a=ti(n.defaultValue,t);a!==null&&(r+=` DEFAULT ${a}`)}return(n.isIdentity||e.preserveAutoIncrement)&&!t.includes("AUTO_INCREMENT")&&(r+=" AUTO_INCREMENT"),e.includeUnique&&n.isUnique&&!n.isPrimaryKey&&(r+=" UNIQUE"),e.includePrimaryKey&&n.isPrimaryKey&&(r+=" PRIMARY KEY"),r}var ba=N(()=>{"use strict"});import{HTTPException as k}from"hono/http-exception";var ga,ri,Ut,ha=N(()=>{"use strict";Re();qe();Be();tt();ba();ga=1451,ri=1217,Ut=class extends ce{async runQuery(e,t,r){let a=z(e),[o]=await a.execute(t,r);return o}quoteIdentifier(e){return`\`${e}\``}mapToUniversalType(e){return Pt(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:r="",limit:a=50,direction:o="asc",sort:s=[],order:c="asc",filters:i=[]}=e,l=[],u=c;Array.isArray(s)&&s.length>0?(l=s.map(R=>R.columnName),u=s[0].direction):typeof s=="string"&&s&&(l=[s]);let{clause:m,values:p}=kr(i),d="",f=[];if(r){let R=this.decodeCursor(r);if(R){let w=qr(R,o,u);d=w.clause,f=w.values}}let y="";m&&d?y=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${d}`:m?y=m:d&&(y=`WHERE ${d}`);let g=Ir((Array.isArray(s),s),c),E=g;o==="desc"?g?E=g.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):l.length>0&&(E=`ORDER BY ${l.map(R=>`\`${R}\` ${u==="asc"?"DESC":"ASC"}`).join(", ")}`):!g&&l.length>0&&(E=`ORDER BY ${l.map(R=>`\`${R}\` ${u.toUpperCase()}`).join(", ")}`);let T=`SELECT * FROM \`${t}\` ${y} ${E} LIMIT ${a+1}`,S=[...p,...f],C=`SELECT COUNT(*) as total FROM \`${t}\` ${m}`;return{sql:T,values:S,countSql:C,countValues:p}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){if(t.length===0)return{nextCursor:null,prevCursor:null};let{direction:a="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(f=>[f,d[f]])),sortColumns:c}),l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(r&&(m=i(u)),s&&(p=i(l))):(s&&(m=i(u)),r&&(p=i(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){let{tableName:t,db:r,limit:a=50,direction:o="asc",sort:s=[],order:c="asc",cursor:i,filters:l=[]}=e,u=z(r),m=await this.getPrimaryKeyColumns(u,t),p=[],d=c;Array.isArray(s)&&s.length>0?(p=s.map(j=>j.columnName),d=s[0].direction):typeof s=="string"&&s&&(p=[s]);let f=[...p,...m.filter(j=>!p.includes(j))],{clause:y,values:g}=kr(l),E="",T=[];if(i){let j=this.decodeCursor(i);if(j){let G=qr(j,o,d);E=G.clause,T=G.values}}let S="";y&&E?S=`WHERE ${y.replace(/^WHERE\s+/i,"")} AND ${E}`:y?S=y:E&&(S=`WHERE ${E}`);let C=Ir((Array.isArray(s),s),c),R=C;o==="desc"?C?R=C.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):f.length>0&&(R=`ORDER BY ${f.map(j=>`\`${j}\` ${d==="asc"?"DESC":"ASC"}`).join(", ")}`):!C&&f.length>0&&(R=`ORDER BY ${f.map(j=>`\`${j}\` ${d.toUpperCase()}`).join(", ")}`);let[w]=await u.execute(`SELECT COUNT(*) as total FROM \`${t}\` ${y}`,g),A=Number(w[0]?.total??0),[_]=await u.execute(`SELECT * FROM \`${t}\` ${S} ${R} LIMIT ${Math.floor(a)+1}`,[...g,...T]),x=_,$=x.length>a;$&&(x=x.slice(0,a)),o==="desc"&&(x=x.reverse());let O=null,U=null;if(x.length>0&&f.length>0){let j=x[0],G=x[x.length-1],re=J=>({values:Object.fromEntries(f.map(Z=>[Z,J[Z]])),sortColumns:f});o==="asc"?($&&(O=this.encodeCursor(re(G))),i&&(U=this.encodeCursor(re(j)))):(i&&(O=this.encodeCursor(re(G))),$&&(U=this.encodeCursor(re(j))))}return{data:x,meta:{limit:a,total:A,hasNextPage:o==="asc"?$:!!i,hasPreviousPage:o==="asc"?!!i:$,nextCursor:O,prevCursor:U}}}async getDatabasesList(){let e=z(),[t]=await e.execute(`
149
+ `);if(Number(a.recordset[0]?.cnt??0)===0)throw new q(404,{message:`Column "${r}" does not exist in table "${t}"`})}parseCheckConstraintValues(e){let t=e.match(/'([^']+)'/g);return!t||t.length===0?null:t.map(r=>r.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 Br(n){if(n.length===0)return{clause:"",values:[]};let e=[],t=[];for(let r of n){let a=`\`${r.columnName}\``;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${r.operator} ?`),t.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(r.value));break;case"like":case"ilike":e.push(`${a} LIKE ?`),t.push(r.value);break;case"not like":case"not ilike":e.push(`${a} NOT LIKE ?`),t.push(r.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Fr(n,e){return Array.isArray(n)?n.length===0?"":`ORDER BY ${n.map(t=>`\`${t.columnName}\` ${t.direction.toUpperCase()}`).join(", ")}`:n&&typeof n=="string"?`ORDER BY \`${n}\` ${e?.toUpperCase()||"ASC"}`:""}function jr(n,e,t){let{values:r,sortColumns:a}=n;if(a.length===0)return{clause:"",values:[]};let i=t==="asc"===(e==="asc")?">":"<",l=a.map(d=>`\`${d}\``).join(", "),u=a.map(()=>"?").join(", "),m=a.map(d=>r[d]);return{clause:`(${l}) ${i} (${u})`,values:m}}function ui(n,e){if(e)return"JSON";let t=n.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]||n.toUpperCase()}function mi(n,e){if(!n?.trim())return null;let t=n.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)":`(${n.trim()})`:t==="null"?"NULL":t==="true"?"1":t==="false"?"0":n.trim()}function qt(n,e={}){let t=ui(n.columnType,n.isArray??!1),r=`\`${n.columnName}\` ${t}`;if(!n.isNullable&&!n.isPrimaryKey&&(r+=" NOT NULL"),n.defaultValue&&!t.includes("AUTO_INCREMENT")){let a=mi(n.defaultValue,t);a!==null&&(r+=` DEFAULT ${a}`)}return(n.isIdentity||e.preserveAutoIncrement)&&!t.includes("AUTO_INCREMENT")&&(r+=" AUTO_INCREMENT"),e.includeUnique&&n.isUnique&&!n.isPrimaryKey&&(r+=" UNIQUE"),e.includePrimaryKey&&n.isPrimaryKey&&(r+=" PRIMARY KEY"),r}var Ra=N(()=>{"use strict"});import{HTTPException as M}from"hono/http-exception";var Sa,di,Ut,Ca=N(()=>{"use strict";Re();qe();Be();tt();Ra();Sa=1451,di=1217,Ut=class extends ue{async runQuery(e,t,r){let a=z(e),[o]=await a.execute(t,r);return o}quoteIdentifier(e){return`\`${e}\``}mapToUniversalType(e){return Pt(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:r="",limit:a=50,direction:o="asc",sort:s=[],order:c="asc",filters:i=[]}=e,l=[],u=c;Array.isArray(s)&&s.length>0?(l=s.map(R=>R.columnName),u=s[0].direction):typeof s=="string"&&s&&(l=[s]);let{clause:m,values:d}=Br(i),p="",f=[];if(r){let R=this.decodeCursor(r);if(R){let w=jr(R,o,u);p=w.clause,f=w.values}}let y="";m&&p?y=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${p}`:m?y=m:p&&(y=`WHERE ${p}`);let h=Fr((Array.isArray(s),s),c),E=h;o==="desc"?h?E=h.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):l.length>0&&(E=`ORDER BY ${l.map(R=>`\`${R}\` ${u==="asc"?"DESC":"ASC"}`).join(", ")}`):!h&&l.length>0&&(E=`ORDER BY ${l.map(R=>`\`${R}\` ${u.toUpperCase()}`).join(", ")}`);let T=`SELECT * FROM \`${t}\` ${y} ${E} LIMIT ${a+1}`,C=[...d,...f],S=`SELECT COUNT(*) as total FROM \`${t}\` ${m}`;return{sql:T,values:C,countSql:S,countValues:d}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){if(t.length===0)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:o=[],cursor:s}=e,c=[];Array.isArray(o)&&o.length>0?c=o.map(p=>p.columnName):typeof o=="string"&&o&&(c=[o]);let i=p=>this.encodeCursor({values:Object.fromEntries(c.map(f=>[f,p[f]])),sortColumns:c}),l=t[0],u=t[t.length-1],m=null,d=null;return a==="asc"?(r&&(m=i(u)),s&&(d=i(l))):(s&&(m=i(u)),r&&(d=i(l))),{nextCursor:m,prevCursor:d}}async getTableData(e){let{tableName:t,db:r,limit:a=50,direction:o="asc",sort:s=[],order:c="asc",cursor:i,filters:l=[]}=e,u=z(r),m=await this.getPrimaryKeyColumns(u,t),d=[],p=c;Array.isArray(s)&&s.length>0?(d=s.map(j=>j.columnName),p=s[0].direction):typeof s=="string"&&s&&(d=[s]);let f=[...d,...m.filter(j=>!d.includes(j))],{clause:y,values:h}=Br(l),E="",T=[];if(i){let j=this.decodeCursor(i);if(j){let G=jr(j,o,p);E=G.clause,T=G.values}}let C="";y&&E?C=`WHERE ${y.replace(/^WHERE\s+/i,"")} AND ${E}`:y?C=y:E&&(C=`WHERE ${E}`);let S=Fr((Array.isArray(s),s),c),R=S;o==="desc"?S?R=S.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):f.length>0&&(R=`ORDER BY ${f.map(j=>`\`${j}\` ${p==="asc"?"DESC":"ASC"}`).join(", ")}`):!S&&f.length>0&&(R=`ORDER BY ${f.map(j=>`\`${j}\` ${p.toUpperCase()}`).join(", ")}`);let[w]=await u.execute(`SELECT COUNT(*) as total FROM \`${t}\` ${y}`,h),A=Number(w[0]?.total??0),[_]=await u.execute(`SELECT * FROM \`${t}\` ${C} ${R} LIMIT ${Math.floor(a)+1}`,[...h,...T]),x=_,k=x.length>a;k&&(x=x.slice(0,a)),o==="desc"&&(x=x.reverse());let $=null,U=null;if(x.length>0&&f.length>0){let j=x[0],G=x[x.length-1],ne=J=>({values:Object.fromEntries(f.map(Z=>[Z,J[Z]])),sortColumns:f});o==="asc"?(k&&($=this.encodeCursor(ne(G))),i&&(U=this.encodeCursor(ne(j)))):(i&&($=this.encodeCursor(ne(G))),k&&(U=this.encodeCursor(ne(j))))}return{data:x,meta:{limit:a,total:A,hasNextPage:o==="asc"?k:!!i,hasPreviousPage:o==="asc"?!!i:k,nextCursor:$,prevCursor:U}}}async getDatabasesList(){let e=z(),[t]=await e.execute(`
150
150
  SELECT
151
151
  s.SCHEMA_NAME AS name,
152
152
  CONCAT(ROUND(COALESCE(SUM(t.data_length + t.index_length), 0) / 1024 / 1024, 2), ' MB') AS size,
@@ -156,7 +156,7 @@ ${s.join(`,
156
156
  LEFT JOIN information_schema.TABLES t ON t.TABLE_SCHEMA = s.SCHEMA_NAME
157
157
  GROUP BY s.SCHEMA_NAME, s.DEFAULT_CHARACTER_SET_NAME
158
158
  ORDER BY s.SCHEMA_NAME
159
- `);if(!t[0])throw new k(500,{message:"No databases returned from server"});return t}async getCurrentDatabase(){let e=z(),[t]=await e.execute("SELECT DATABASE() AS db");if(!t[0])throw new k(500,{message:"No current database returned from server"});return t[0]}async getDatabaseConnectionInfo(){let e=z(),[t]=await e.execute(`
159
+ `);if(!t[0])throw new M(500,{message:"No databases returned from server"});return t}async getCurrentDatabase(){let e=z(),[t]=await e.execute("SELECT DATABASE() AS db");if(!t[0])throw new M(500,{message:"No current database returned from server"});return t[0]}async getDatabaseConnectionInfo(){let e=z(),[t]=await e.execute(`
160
160
  SELECT
161
161
  VERSION() AS version,
162
162
  DATABASE() AS database_name,
@@ -164,7 +164,7 @@ ${s.join(`,
164
164
  @@hostname AS host,
165
165
  @@port AS port,
166
166
  @@max_connections AS max_connections
167
- `),[r]=await e.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!t[0])throw new k(500,{message:"No connection information returned from server"});let a=t[0],o=Oe();return{host:String(a.host||o.host),port:Number(a.port||o.port),user:String(a.user),database:String(a.database_name??""),version:String(a.version),active_connections:Number(r[0]?.cnt??0),max_connections:Number(a.max_connections)}}async getTablesList(e){let t=z(e),[r]=await t.execute(`
167
+ `),[r]=await e.execute("SELECT COUNT(*) AS cnt FROM information_schema.PROCESSLIST");if(!t[0])throw new M(500,{message:"No connection information returned from server"});let a=t[0],o=$e();return{host:String(a.host||o.host),port:Number(a.port||o.port),user:String(a.user),database:String(a.database_name??""),version:String(a.version),active_connections:Number(r[0]?.cnt??0),max_connections:Number(a.max_connections)}}async getTablesList(e){let t=z(e),[r]=await t.execute(`
168
168
  SELECT table_name as tableName
169
169
  FROM information_schema.tables
170
170
  WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'
@@ -172,7 +172,7 @@ ${s.join(`,
172
172
  `);return!r||r.length===0?[]:Promise.all(r.map(async a=>{let[o]=await t.execute(`SELECT COUNT(*) as count FROM \`${a.tableName}\``);return{tableName:a.tableName,rowCount:o[0]?.count??0}}))}async createTable({tableData:e,db:t}){let{tableName:r,fields:a,foreignKeys:o}=e,s=z(t),c=a.map(m=>qt(m)),i=[],l=a.filter(m=>m.isPrimaryKey);l.length>0&&i.push(`PRIMARY KEY (${l.map(m=>`\`${m.columnName}\``).join(", ")})`);for(let m of a)m.isUnique&&!m.isPrimaryKey&&i.push(`UNIQUE KEY \`uq_${r}_${m.columnName}\` (\`${m.columnName}\`)`);let u=o?.map(m=>`CONSTRAINT \`${`fk_${r}_${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 \`${r}\` (
173
173
  ${[...c,...i,...u].join(`,
174
174
  `)}
175
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`)}async deleteTable(e){let{tableName:t,db:r,cascade:a}=e,o=z(r),[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 k(404,{message:`Table "${t}" does not exist`});let c=await this.getTableRowCount(o,t);if(!a){let i=await this.getRelatedRecordsForTable(t,r);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{if(a){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===ri||l.errno===ga)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,r)};throw i instanceof k?i:new k(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){let r=z(t),[a]=await r.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[e]);if(Number(a[0]?.cnt??0)===0)throw new k(404,{message:`Table "${e}" does not exist`});let[o]=await r.execute(`SHOW CREATE TABLE \`${e}\``),s=o[0],c=s?.["Create Table"]??s?.create_table??"";if(!c)throw new k(500,{message:`Failed to retrieve schema for table "${e}"`});return c}async getTableColumns({tableName:e,db:t}){let r=z(t),[a]=await r.execute(`SELECT
175
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`)}async deleteTable(e){let{tableName:t,db:r,cascade:a}=e,o=z(r),[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 M(404,{message:`Table "${t}" does not exist`});let c=await this.getTableRowCount(o,t);if(!a){let i=await this.getRelatedRecordsForTable(t,r);if(i.length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:i}}try{if(a){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===di||l.errno===Sa)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecordsForTable(t,r)};throw i instanceof M?i:new M(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){let r=z(t),[a]=await r.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[e]);if(Number(a[0]?.cnt??0)===0)throw new M(404,{message:`Table "${e}" does not exist`});let[o]=await r.execute(`SHOW CREATE TABLE \`${e}\``),s=o[0],c=s?.["Create Table"]??s?.create_table??"";if(!c)throw new M(500,{message:`Failed to retrieve schema for table "${e}"`});return c}async getTableColumns({tableName:e,db:t}){let r=z(t),[a]=await r.execute(`SELECT
176
176
  c.COLUMN_NAME AS columnName,
177
177
  c.DATA_TYPE AS dataType,
178
178
  c.COLUMN_TYPE AS columnType,
@@ -190,7 +190,7 @@ ${s.join(`,
190
190
  AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
191
191
  WHERE c.TABLE_SCHEMA = DATABASE()
192
192
  AND c.TABLE_NAME = ?
193
- ORDER BY c.ORDINAL_POSITION`,[e]);if(!a||a.length===0)throw new k(404,{message:`Table "${e}" does not exist`});return a.map(o=>{let s=o.dataType==="enum"||o.dataType==="set";return{columnName:o.columnName,dataType:Pt(o.dataType,o.columnType),dataTypeLabel:fr(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:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,isArray:u,db:m}=e,p=z(m);await this.assertTableExists(p,t);let[d]=await p.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,r]);if(Number(d[0]?.cnt??0)>0)throw new k(409,{message:`Column "${r}" already exists in table "${t}"`});let f=qt({columnName:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,isArray:u},{includePrimaryKey:!0,includeUnique:!0});await p.execute(`ALTER TABLE \`${t}\` ADD COLUMN ${f}`)}async deleteColumn(e){let{tableName:t,columnName:r,db:a}=e,o=z(a);await this.assertTableExists(o,t),await this.assertColumnExists(o,t,r);let[s]=await o.execute(`ALTER TABLE \`${t}\` DROP COLUMN \`${r}\``);return{deletedCount:s.affectedRows}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,isNullable:o,defaultValue:s,db:c}=e,i=z(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,r]),u=l[0];if(!u)throw new k(404,{message:`Column "${r}" does not exist in table "${t}"`});let m=qt({columnName:r,columnType:a,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:r,newColumnName:a,db:o}=e,s=z(o);await this.assertTableExists(s,t),await this.assertColumnExists(s,t,r);let[c]=await s.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,a]);if(Number(c[0]?.cnt??0)>0)throw new k(409,{message:`Column "${a}" already exists in table "${t}"`});await s.execute(`ALTER TABLE \`${t}\` RENAME COLUMN \`${r}\` TO \`${a}\``)}async addRecord({db:e,params:t}){let{tableName:r,data:a}=t,o=z(e),s=await this.getBooleanColumnSet(r,e),c=Object.keys(a),i=Object.values(a).map((u,m)=>s.has(c[m])&&typeof u=="string"?u==="true"?1:0:u),[l]=await o.execute(`INSERT INTO \`${r}\` (${c.map(u=>`\`${u}\``).join(", ")}) VALUES (${c.map(()=>"?").join(", ")})`,i);if(l.affectedRows===0)throw new k(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:l.affectedRows}}async updateRecords({params:e,db:t}){let{tableName:r,updates:a,primaryKey:o}=e,s=z(t),c=await this.getBooleanColumnSet(r,t),i=new Map;for(let u of a){let m=u.rowData[o];if(m==null)throw new k(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,p]of i.entries()){let d=p.map(g=>`\`${g.columnName}\` = ?`),f=p.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);f.push(m);let[y]=await l.execute(`UPDATE \`${r}\` SET ${d.join(", ")} WHERE \`${o}\` = ?`,f);if(y.affectedRows===0)throw new k(404,{message:`Record with ${o} = ${m} not found in table "${r}"`});u+=y.affectedRows}return await l.commit(),{updatedCount:u}}catch(u){throw await l.rollback(),u instanceof k?u:new k(500,{message:`Failed to update records in "${r}"`})}finally{l.release()}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=z(r),o=t[0]?.columnName;if(!o)throw new k(400,{message:"Primary key column name is required"});let s=t.map(l=>l.value),c=s.map(()=>"?").join(", "),i=await a.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===ga)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,r)};throw l instanceof k?l:new k(500,{message:`Failed to delete records from "${e}"`})}finally{i.release()}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=z(r),o=t[0]?.columnName;if(!o)throw new k(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value),c=await a.getConnection();await c.beginTransaction();try{await c.execute("SET FOREIGN_KEY_CHECKS = 0");let i=await this.getForeignKeyReferences(e,r),l=0,u=new Set,m=new Set,p=async(y,g,E,T)=>{let S=`${y}.${g}`;if(T.has(S))return;T.add(S);let C=await this.getForeignKeyReferences(y,r);for(let A of C){let _=E.map(()=>"?").join(", "),[x]=await c.execute(`SELECT \`${A.referencedColumn}\` FROM \`${y}\` WHERE \`${g}\` IN (${_})`,E),$=x.map(O=>O[A.referencedColumn]);$.length>0&&await p(A.referencingTable,A.referencingColumn,$,T)}let R=E.map(()=>"?").join(", "),[w]=await c.execute(`DELETE FROM \`${y}\` WHERE \`${g}\` IN (${R})`,E);l+=w.affectedRows,u.add(y)};for(let y of i)u.has(y.referencingTable)||await p(y.referencingTable,y.referencingColumn,s,m);let d=s.map(()=>"?").join(", "),[f]=await c.execute(`DELETE FROM \`${e}\` WHERE \`${o}\` IN (${d})`,s);return await c.execute("SET FOREIGN_KEY_CHECKS = 1"),await c.commit(),{deletedCount:f.affectedRows+l}}catch(i){throw await c.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await c.rollback(),i instanceof k?i:new k(500,{message:`Failed to force delete records from "${e}"`})}finally{c.release()}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t||t.length===0)throw new k(400,{message:"At least one record is required"});let o=await z(r).getConnection();try{let s=Object.keys(t[0]),c=s.map(l=>`\`${l}\``).join(", "),i=await this.getBooleanColumnSet(e,r);await o.beginTransaction();for(let l=0;l<t.length;l++){let u=t[l],m=s.map(p=>{let d=u[p];return i.has(p)&&typeof d=="string"?d==="true"?1:0:d});try{await o.execute(`INSERT INTO \`${e}\` (${c}) VALUES (${s.map(()=>"?").join(", ")})`,m)}catch(p){throw new k(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 k?s:new k(500,{message:`Failed to bulk insert records into "${e}"`})}finally{o.release()}}async executeQuery({query:e,db:t}){let r=z(t);if(!e?.trim())throw new k(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now(),[s,c]=await r.execute(a),i=performance.now()-o;if(Array.isArray(s)){let u=s;return{columns:c?c.map(p=>p.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[r]=await e.execute(`SELECT COLUMN_NAME as column_name
193
+ ORDER BY c.ORDINAL_POSITION`,[e]);if(!a||a.length===0)throw new M(404,{message:`Table "${e}" does not exist`});return a.map(o=>{let s=o.dataType==="enum"||o.dataType==="set";return{columnName:o.columnName,dataType:Pt(o.dataType,o.columnType),dataTypeLabel:gr(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:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,isArray:u,db:m}=e,d=z(m);await this.assertTableExists(d,t);let[p]=await d.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,r]);if(Number(p[0]?.cnt??0)>0)throw new M(409,{message:`Column "${r}" already exists in table "${t}"`});let f=qt({columnName:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,isArray:u},{includePrimaryKey:!0,includeUnique:!0});await d.execute(`ALTER TABLE \`${t}\` ADD COLUMN ${f}`)}async deleteColumn(e){let{tableName:t,columnName:r,db:a}=e,o=z(a);await this.assertTableExists(o,t),await this.assertColumnExists(o,t,r);let[s]=await o.execute(`ALTER TABLE \`${t}\` DROP COLUMN \`${r}\``);return{deletedCount:s.affectedRows}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,isNullable:o,defaultValue:s,db:c}=e,i=z(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,r]),u=l[0];if(!u)throw new M(404,{message:`Column "${r}" does not exist in table "${t}"`});let m=qt({columnName:r,columnType:a,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:r,newColumnName:a,db:o}=e,s=z(o);await this.assertTableExists(s,t),await this.assertColumnExists(s,t,r);let[c]=await s.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,a]);if(Number(c[0]?.cnt??0)>0)throw new M(409,{message:`Column "${a}" already exists in table "${t}"`});await s.execute(`ALTER TABLE \`${t}\` RENAME COLUMN \`${r}\` TO \`${a}\``)}async addRecord({db:e,params:t}){let{tableName:r,data:a}=t,o=z(e),s=await this.getBooleanColumnSet(r,e),c=Object.keys(a),i=Object.values(a).map((u,m)=>s.has(c[m])&&typeof u=="string"?u==="true"?1:0:u),[l]=await o.execute(`INSERT INTO \`${r}\` (${c.map(u=>`\`${u}\``).join(", ")}) VALUES (${c.map(()=>"?").join(", ")})`,i);if(l.affectedRows===0)throw new M(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:l.affectedRows}}async updateRecords({params:e,db:t}){let{tableName:r,updates:a,primaryKey:o}=e,s=z(t),c=await this.getBooleanColumnSet(r,t),i=new Map;for(let u of a){let m=u.rowData[o];if(m==null)throw new M(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,d]of i.entries()){let p=d.map(h=>`\`${h.columnName}\` = ?`),f=d.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);f.push(m);let[y]=await l.execute(`UPDATE \`${r}\` SET ${p.join(", ")} WHERE \`${o}\` = ?`,f);if(y.affectedRows===0)throw new M(404,{message:`Record with ${o} = ${m} not found in table "${r}"`});u+=y.affectedRows}return await l.commit(),{updatedCount:u}}catch(u){throw await l.rollback(),u instanceof M?u:new M(500,{message:`Failed to update records in "${r}"`})}finally{l.release()}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=z(r),o=t[0]?.columnName;if(!o)throw new M(400,{message:"Primary key column name is required"});let s=t.map(l=>l.value),c=s.map(()=>"?").join(", "),i=await a.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===Sa)return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(e,t,r)};throw l instanceof M?l:new M(500,{message:`Failed to delete records from "${e}"`})}finally{i.release()}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=z(r),o=t[0]?.columnName;if(!o)throw new M(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value),c=await a.getConnection();await c.beginTransaction();try{await c.execute("SET FOREIGN_KEY_CHECKS = 0");let i=await this.getForeignKeyReferences(e,r),l=0,u=new Set,m=new Set,d=async(y,h,E,T)=>{let C=`${y}.${h}`;if(T.has(C))return;T.add(C);let S=await this.getForeignKeyReferences(y,r);for(let A of S){let _=E.map(()=>"?").join(", "),[x]=await c.execute(`SELECT \`${A.referencedColumn}\` FROM \`${y}\` WHERE \`${h}\` IN (${_})`,E),k=x.map($=>$[A.referencedColumn]);k.length>0&&await d(A.referencingTable,A.referencingColumn,k,T)}let R=E.map(()=>"?").join(", "),[w]=await c.execute(`DELETE FROM \`${y}\` WHERE \`${h}\` IN (${R})`,E);l+=w.affectedRows,u.add(y)};for(let y of i)u.has(y.referencingTable)||await d(y.referencingTable,y.referencingColumn,s,m);let p=s.map(()=>"?").join(", "),[f]=await c.execute(`DELETE FROM \`${e}\` WHERE \`${o}\` IN (${p})`,s);return await c.execute("SET FOREIGN_KEY_CHECKS = 1"),await c.commit(),{deletedCount:f.affectedRows+l}}catch(i){throw await c.execute("SET FOREIGN_KEY_CHECKS = 1").catch(()=>{}),await c.rollback(),i instanceof M?i:new M(500,{message:`Failed to force delete records from "${e}"`})}finally{c.release()}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t||t.length===0)throw new M(400,{message:"At least one record is required"});let o=await z(r).getConnection();try{let s=Object.keys(t[0]),c=s.map(l=>`\`${l}\``).join(", "),i=await this.getBooleanColumnSet(e,r);await o.beginTransaction();for(let l=0;l<t.length;l++){let u=t[l],m=s.map(d=>{let p=u[d];return i.has(d)&&typeof p=="string"?p==="true"?1:0:p});try{await o.execute(`INSERT INTO \`${e}\` (${c}) VALUES (${s.map(()=>"?").join(", ")})`,m)}catch(d){throw new M(500,{message:`Failed to insert record ${l+1}: ${d instanceof Error?d.message:String(d)}`})}}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 M?s:new M(500,{message:`Failed to bulk insert records into "${e}"`})}finally{o.release()}}async executeQuery({query:e,db:t}){let r=z(t);if(!e?.trim())throw new M(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now(),[s,c]=await r.execute(a),i=performance.now()-o;if(Array.isArray(s)){let u=s;return{columns:c?c.map(d=>d.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[r]=await e.execute(`SELECT COLUMN_NAME as column_name
194
194
  FROM information_schema.COLUMNS
195
195
  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_KEY = 'PRI'
196
196
  ORDER BY ORDINAL_POSITION`,[t]);return r.map(a=>a.column_name)}async getForeignKeyReferences(e,t){let r=z(t),[a]=await r.execute(`SELECT
@@ -206,7 +206,7 @@ ${s.join(`,
206
206
  AND kcu.TABLE_NAME = tc.TABLE_NAME
207
207
  WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
208
208
  AND kcu.TABLE_SCHEMA = DATABASE()
209
- AND kcu.REFERENCED_TABLE_NAME = ?`,[e]);return a.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 r=await this.getForeignKeyReferences(e,t);if(r.length===0)return[];let a=z(t),o=[];for(let s of r){let[c]=await a.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,r){let a=await this.getForeignKeyReferences(e,r);if(a.length===0)return[];let o=z(r),s=t.map(l=>l.value),c=[],i=new Map;for(let l of a){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(f=>f.columnName===u.referencedColumn))continue;let p=s.map(()=>"?").join(", "),[d]=await o.execute(`SELECT * FROM \`${u.referencingTable}\` WHERE \`${u.referencingColumn}\` IN (${p}) 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[r]=await e.execute(`SELECT COUNT(*) as count FROM \`${t}\``);return Number(r[0]?.count??0)}async getBooleanColumnSet(e,t){let r=await this.getTableColumns({tableName:e,db:t});return new Set(r.filter(a=>a.dataTypeLabel==="boolean").map(a=>a.columnName))}async assertTableExists(e,t){let[r]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]);if(Number(r[0]?.cnt??0)===0)throw new k(404,{message:`Table "${t}" does not exist`})}async assertColumnExists(e,t,r){let[a]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,r]);if(Number(a[0]?.cnt??0)===0)throw new k(404,{message:`Column "${r}" does not exist in table "${t}"`})}parseMysqlEnumValues(e){let t=e.match(/^(?:enum|set)\((.+)\)$/i);return t?.[1]?t[1].split(",").map(r=>r.trim().replace(/^'|'$/g,"")):null}}});function Ur(n){if(n.length===0)return{clause:"",values:[]};let e=[],t=[];for(let r of n){let a=t.length+1,o=`"${r.columnName}"`;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${o} ${r.operator} $${a}`),t.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${o} IS NULL`):(e.push(`${o} = $${a}`),t.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${o} IS NOT NULL`):(e.push(`${o} != $${a}`),t.push(r.value));break;case"like":e.push(`${o}::text LIKE $${a}`),t.push(r.value);break;case"not like":e.push(`${o}::text NOT LIKE $${a}`),t.push(r.value);break;case"ilike":e.push(`${o}::text ILIKE $${a}`),t.push(r.value);break;case"not ilike":e.push(`${o}::text NOT ILIKE $${a}`),t.push(r.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Br(n,e){return Array.isArray(n)?n.length===0?"":`ORDER BY ${n.map(r=>`"${r.columnName}" ${r.direction.toUpperCase()}`).join(", ")}`:n&&typeof n=="string"?`ORDER BY "${n}" ${e?.toUpperCase()||"ASC"}`:""}function Fr(n,e,t,r){let{values:a,sortColumns:o}=n,s=[],c=[],u=t==="asc"===(e==="asc");if(o.length>0){let m=o.map(f=>`"${f}"`).join(", "),p=o.map((f,y)=>`$${r+y}`).join(", "),d=u?">":"<";s.push(`(${m}) ${d} (${p})`);for(let f of o)c.push(a[f])}return{clause:s.length>0?`(${s.join(" AND ")})`:"",values:c}}var Ta=N(()=>{"use strict"});import{HTTPException as M}from"hono/http-exception";var Bt,Ea=N(()=>{"use strict";Re();qe();Be();tt();Ta();Bt=class extends ce{async runQuery(e,t,r){return(await Q(e).query(t,r)).rows}quoteIdentifier(e){return`"${e}"`}mapToUniversalType(e){return xt(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:r="",limit:a=50,direction:o="asc",sort:s=[],order:c="asc",filters:i=[],db:l}=e,u=Q(l),m=[],p=c;Array.isArray(s)&&s.length>0?(m=s.map($=>$.columnName),p=s[0].direction):typeof s=="string"&&s&&(m=[s]);let d=m.length>0?[...m]:["ctid"],{clause:f,values:y}=Ur(i),g="",E=[];if(r){let $=this.decodeCursor(r);if($){let O=Fr($,o,p,y.length+1);g=O.clause,E=O.values}}let T="";f&&g?T=`WHERE ${f.replace(/^WHERE\s+/i,"")} AND ${g}`:f?T=f:g&&(T=`WHERE ${g}`);let S=Br((Array.isArray(s),s),c),C=S;o==="desc"?S?C=S.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):C=`ORDER BY ${d.map(O=>`"${O}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!S&&d.length>0&&(C=`ORDER BY ${d.map(O=>`"${O}" ${p.toUpperCase()}`).join(", ")}`);let R=y.length+E.length+1,w=`SELECT * FROM "${t}" ${T} ${C} LIMIT $${R}`,A=[...y,...E,a+1],_=`SELECT COUNT(*) as total FROM "${t}" ${f}`;return{sql:w,values:A,countSql:_,countValues:y}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){if(t.length===0)return{nextCursor:null,prevCursor:null};let{direction:a="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 f={values:Object.fromEntries(c.map(y=>[y,d[y]])),sortColumns:c};return this.encodeCursor(f)},l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(r&&(m=i(u)),s&&(p=i(l))):(s&&(m=i(u)),r&&(p=i(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){let{tableName:t,db:r,limit:a=50,direction:o="asc",sort:s=[],order:c="asc",cursor:i,filters:l=[]}=e,u=Q(r),m=await this.getPrimaryKeyColumns(u,t),p=[],d=c;Array.isArray(s)&&s.length>0?(p=s.map(J=>J.columnName),d=s[0].direction):typeof s=="string"&&s&&(p=[s]);let f=[...p,...m.filter(J=>!p.includes(J))];f.length===0&&f.push("ctid");let{clause:y,values:g}=Ur(l),E="",T=[];if(i){let J=this.decodeCursor(i);if(J){let Z=Fr(J,o,d,g.length+1);E=Z.clause,T=Z.values}}let S="";y&&E?S=`WHERE ${y.replace(/^WHERE\s+/i,"")} AND ${E}`:y?S=y:E&&(S=`WHERE ${E}`);let C=Br((Array.isArray(s),s),c),R=C;o==="desc"?C?R=C.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):R=`ORDER BY ${f.map(Z=>`"${Z}" ${d==="asc"?"DESC":"ASC"}`).join(", ")}`:!C&&f.length>0&&(R=`ORDER BY ${f.map(Z=>`"${Z}" ${d.toUpperCase()}`).join(", ")}`);let w=await u.query(`SELECT COUNT(*) as total FROM "${t}" ${y}`,g),A=Number(w.rows[0].total),_=g.length+T.length+1,x=await u.query(`SELECT * FROM "${t}" ${S} ${R} LIMIT $${_}`,[...g,...T,a+1]),O=x.fields&&x.fields.length>0?x.rows.filter(J=>Object.keys(J).length>0):x.rows,U=O.length>a;U&&(O=O.slice(0,a)),o==="desc"&&(O=O.reverse());let j=J=>({values:Object.fromEntries(f.map(Z=>[Z,J[Z]])),sortColumns:f}),G=null,re=null;if(O.length>0){let J=O[0],Z=O[O.length-1];o==="asc"?(U&&(G=this.encodeCursor(j(Z))),i&&(re=this.encodeCursor(j(J)))):(i&&(G=this.encodeCursor(j(Z))),U&&(re=this.encodeCursor(j(J))))}return{data:O,meta:{limit:a,total:A,hasNextPage:o==="asc"?U:!!i,hasPreviousPage:o==="asc"?!!i:U,nextCursor:G,prevCursor:re}}}async getDatabasesList(){let e=Q(),{rows:t}=await e.query(`
209
+ AND kcu.REFERENCED_TABLE_NAME = ?`,[e]);return a.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 r=await this.getForeignKeyReferences(e,t);if(r.length===0)return[];let a=z(t),o=[];for(let s of r){let[c]=await a.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,r){let a=await this.getForeignKeyReferences(e,r);if(a.length===0)return[];let o=z(r),s=t.map(l=>l.value),c=[],i=new Map;for(let l of a){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(f=>f.columnName===u.referencedColumn))continue;let d=s.map(()=>"?").join(", "),[p]=await o.execute(`SELECT * FROM \`${u.referencingTable}\` WHERE \`${u.referencingColumn}\` IN (${d}) LIMIT 100`,s);p.length>0&&c.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:p})}return c}async getTableRowCount(e,t){let[r]=await e.execute(`SELECT COUNT(*) as count FROM \`${t}\``);return Number(r[0]?.count??0)}async getBooleanColumnSet(e,t){let r=await this.getTableColumns({tableName:e,db:t});return new Set(r.filter(a=>a.dataTypeLabel==="boolean").map(a=>a.columnName))}async assertTableExists(e,t){let[r]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[t]);if(Number(r[0]?.cnt??0)===0)throw new M(404,{message:`Table "${t}" does not exist`})}async assertColumnExists(e,t,r){let[a]=await e.execute("SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",[t,r]);if(Number(a[0]?.cnt??0)===0)throw new M(404,{message:`Column "${r}" does not exist in table "${t}"`})}parseMysqlEnumValues(e){let t=e.match(/^(?:enum|set)\((.+)\)$/i);return t?.[1]?t[1].split(",").map(r=>r.trim().replace(/^'|'$/g,"")):null}}});function Kr(n){if(n.length===0)return{clause:"",values:[]};let e=[],t=[];for(let r of n){let a=t.length+1,o=`"${r.columnName}"`;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${o} ${r.operator} $${a}`),t.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${o} IS NULL`):(e.push(`${o} = $${a}`),t.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${o} IS NOT NULL`):(e.push(`${o} != $${a}`),t.push(r.value));break;case"like":e.push(`${o}::text LIKE $${a}`),t.push(r.value);break;case"not like":e.push(`${o}::text NOT LIKE $${a}`),t.push(r.value);break;case"ilike":e.push(`${o}::text ILIKE $${a}`),t.push(r.value);break;case"not ilike":e.push(`${o}::text NOT ILIKE $${a}`),t.push(r.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:t}}function Hr(n,e){return Array.isArray(n)?n.length===0?"":`ORDER BY ${n.map(r=>`"${r.columnName}" ${r.direction.toUpperCase()}`).join(", ")}`:n&&typeof n=="string"?`ORDER BY "${n}" ${e?.toUpperCase()||"ASC"}`:""}function Vr(n,e,t,r){let{values:a,sortColumns:o}=n,s=[],c=[],u=t==="asc"===(e==="asc");if(o.length>0){let m=o.map(f=>`"${f}"`).join(", "),d=o.map((f,y)=>`$${r+y}`).join(", "),p=u?">":"<";s.push(`(${m}) ${p} (${d})`);for(let f of o)c.push(a[f])}return{clause:s.length>0?`(${s.join(" AND ")})`:"",values:c}}var Na=N(()=>{"use strict"});import{HTTPException as L}from"hono/http-exception";var Bt,Aa=N(()=>{"use strict";Re();qe();Be();tt();Na();Bt=class extends ue{async runQuery(e,t,r){return(await Q(e).query(t,r)).rows}quoteIdentifier(e){return`"${e}"`}mapToUniversalType(e){return xt(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:r="",limit:a=50,direction:o="asc",sort:s=[],order:c="asc",filters:i=[],db:l}=e,u=Q(l),m=[],d=c;Array.isArray(s)&&s.length>0?(m=s.map(k=>k.columnName),d=s[0].direction):typeof s=="string"&&s&&(m=[s]);let p=m.length>0?[...m]:["ctid"],{clause:f,values:y}=Kr(i),h="",E=[];if(r){let k=this.decodeCursor(r);if(k){let $=Vr(k,o,d,y.length+1);h=$.clause,E=$.values}}let T="";f&&h?T=`WHERE ${f.replace(/^WHERE\s+/i,"")} AND ${h}`:f?T=f:h&&(T=`WHERE ${h}`);let C=Hr((Array.isArray(s),s),c),S=C;o==="desc"?C?S=C.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):S=`ORDER BY ${p.map($=>`"${$}" ${d==="asc"?"DESC":"ASC"}`).join(", ")}`:!C&&p.length>0&&(S=`ORDER BY ${p.map($=>`"${$}" ${d.toUpperCase()}`).join(", ")}`);let R=y.length+E.length+1,w=`SELECT * FROM "${t}" ${T} ${S} LIMIT $${R}`,A=[...y,...E,a+1],_=`SELECT COUNT(*) as total FROM "${t}" ${f}`;return{sql:w,values:A,countSql:_,countValues:y}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){if(t.length===0)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:o=[],cursor:s}=e,c=[];Array.isArray(o)&&o.length>0?c=o.map(p=>p.columnName):typeof o=="string"&&o&&(c=[o]),c.length===0&&(c=["ctid"]);let i=p=>{let f={values:Object.fromEntries(c.map(y=>[y,p[y]])),sortColumns:c};return this.encodeCursor(f)},l=t[0],u=t[t.length-1],m=null,d=null;return a==="asc"?(r&&(m=i(u)),s&&(d=i(l))):(s&&(m=i(u)),r&&(d=i(l))),{nextCursor:m,prevCursor:d}}async getTableData(e){let{tableName:t,db:r,limit:a=50,direction:o="asc",sort:s=[],order:c="asc",cursor:i,filters:l=[]}=e,u=Q(r),m=await this.getPrimaryKeyColumns(u,t),d=[],p=c;Array.isArray(s)&&s.length>0?(d=s.map(J=>J.columnName),p=s[0].direction):typeof s=="string"&&s&&(d=[s]);let f=[...d,...m.filter(J=>!d.includes(J))];f.length===0&&f.push("ctid");let{clause:y,values:h}=Kr(l),E="",T=[];if(i){let J=this.decodeCursor(i);if(J){let Z=Vr(J,o,p,h.length+1);E=Z.clause,T=Z.values}}let C="";y&&E?C=`WHERE ${y.replace(/^WHERE\s+/i,"")} AND ${E}`:y?C=y:E&&(C=`WHERE ${E}`);let S=Hr((Array.isArray(s),s),c),R=S;o==="desc"?S?R=S.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):R=`ORDER BY ${f.map(Z=>`"${Z}" ${p==="asc"?"DESC":"ASC"}`).join(", ")}`:!S&&f.length>0&&(R=`ORDER BY ${f.map(Z=>`"${Z}" ${p.toUpperCase()}`).join(", ")}`);let w=await u.query(`SELECT COUNT(*) as total FROM "${t}" ${y}`,h),A=Number(w.rows[0].total),_=h.length+T.length+1,x=await u.query(`SELECT * FROM "${t}" ${C} ${R} LIMIT $${_}`,[...h,...T,a+1]),$=x.fields&&x.fields.length>0?x.rows.filter(J=>Object.keys(J).length>0):x.rows,U=$.length>a;U&&($=$.slice(0,a)),o==="desc"&&($=$.reverse());let j=J=>({values:Object.fromEntries(f.map(Z=>[Z,J[Z]])),sortColumns:f}),G=null,ne=null;if($.length>0){let J=$[0],Z=$[$.length-1];o==="asc"?(U&&(G=this.encodeCursor(j(Z))),i&&(ne=this.encodeCursor(j(J)))):(i&&(G=this.encodeCursor(j(Z))),U&&(ne=this.encodeCursor(j(J))))}return{data:$,meta:{limit:a,total:A,hasNextPage:o==="asc"?U:!!i,hasPreviousPage:o==="asc"?!!i:U,nextCursor:G,prevCursor:ne}}}async getDatabasesList(){let e=Q(),{rows:t}=await e.query(`
210
210
  SELECT
211
211
  d.datname as name,
212
212
  pg_size_pretty(pg_database_size(d.datname)) as size,
@@ -215,7 +215,7 @@ ${s.join(`,
215
215
  FROM pg_catalog.pg_database d
216
216
  WHERE d.datistemplate = false
217
217
  ORDER BY d.datname;
218
- `);if(!t[0])throw new M(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 M(500,{message:"No current database returned from database"});return t[0]}async getDatabaseConnectionInfo(){let e=Q(),{rows:t}=await e.query(`
218
+ `);if(!t[0])throw new L(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 L(500,{message:"No current database returned from database"});return t[0]}async getDatabaseConnectionInfo(){let e=Q(),{rows:t}=await e.query(`
219
219
  SELECT
220
220
  version() as version,
221
221
  current_database() as database,
@@ -224,7 +224,7 @@ ${s.join(`,
224
224
  inet_server_port() as port,
225
225
  (SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
226
226
  (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
227
- `);if(!t[0])throw new M(500,{message:"No connection information returned from database"});let{connectionInfoSchema:r}=await Promise.resolve().then(()=>(Re(),da)),a=r.parse(t[0]),o=Oe();return{host:a.host||o.host,port:a.port||o.port,user:a.user,database:a.database,version:a.version.toString(),active_connections:a.active_connections,max_connections:a.max_connections}}async getTablesList(e){let t=Q(e),r=o=>o.replaceAll('"','""'),{rows:a}=await t.query(`
227
+ `);if(!t[0])throw new L(500,{message:"No connection information returned from database"});let{connectionInfoSchema:r}=await Promise.resolve().then(()=>(Re(),ga)),a=r.parse(t[0]),o=$e();return{host:a.host||o.host,port:a.port||o.port,user:a.user,database:a.database,version:a.version.toString(),active_connections:a.active_connections,max_connections:a.max_connections}}async getTablesList(e){let t=Q(e),r=o=>o.replaceAll('"','""'),{rows:a}=await t.query(`
228
228
  SELECT table_schema as "schemaName", table_name as "tableName"
229
229
  FROM information_schema.tables
230
230
  WHERE table_type = 'BASE TABLE'
@@ -234,14 +234,14 @@ ${s.join(`,
234
234
  `);return a[0]?Promise.all(a.map(async o=>{let{rows:s}=await t.query(`SELECT COUNT(*)::integer as count FROM "${r(o.schemaName)}"."${r(o.tableName)}"`);return{schemaName:o.schemaName,tableName:o.tableName,rowCount:s[0]?.count??0}})):[]}async createTable({tableData:e,db:t}){let{tableName:r,fields:a,foreignKeys:o}=e,s=Q(t),c=a.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_${r}_${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 "${r}" (
235
235
  ${[...c,...i].join(`,
236
236
  `)}
237
- );`)}async deleteTable(e){let{tableName:t,db:r,cascade:a}=e,o=Q(r),{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 M(404,{message:`Table "${t}" does not exist`});let c=await this.getTableRowCount(o,t);if(!a&&(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}" ${a?"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 M?i:new M(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){let r=Q(t),{rows:a}=await r.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = $1) as exists",[e]);if(!a[0]?.exists)throw new M(404,{message:`Table "${e}" does not exist`});let{rows:o}=await r.query(`SELECT column_name, data_type, udt_name, is_nullable, column_default, character_maximum_length, numeric_precision, numeric_scale
237
+ );`)}async deleteTable(e){let{tableName:t,db:r,cascade:a}=e,o=Q(r),{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 L(404,{message:`Table "${t}" does not exist`});let c=await this.getTableRowCount(o,t);if(!a&&(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}" ${a?"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 L?i:new L(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){let r=Q(t),{rows:a}=await r.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = $1) as exists",[e]);if(!a[0]?.exists)throw new L(404,{message:`Table "${e}" does not exist`});let{rows:o}=await r.query(`SELECT column_name, data_type, udt_name, is_nullable, column_default, character_maximum_length, numeric_precision, numeric_scale
238
238
  FROM information_schema.columns WHERE table_schema = 'public' AND table_name = $1 ORDER BY ordinal_position`,[e]),{rows:s}=await r.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
239
  FROM information_schema.table_constraints tc
240
240
  JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
241
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
242
  WHERE tc.table_schema = 'public' AND tc.table_name = $1 ORDER BY tc.constraint_type, tc.constraint_name`,[e]),{rows:c}=await r.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:f,udt_name:y,character_maximum_length:g,numeric_precision:E,numeric_scale:T}=d;return f==="USER-DEFINED"?y:f==="ARRAY"?`${y.replace(/^_/,"")}[]`:(f==="character varying"||f==="varchar")&&g?`varchar(${g})`:f==="character"&&g?`char(${g})`:f==="numeric"&&E!==null?T!==null&&T>0?`numeric(${E}, ${T})`:`numeric(${E})`:f==="timestamp with time zone"?"timestamp with time zone":f==="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"}[f]||f},l=[`create table public.${e} (`],u=o.map(d=>{let f=` ${d.column_name} ${i(d)}`;return d.is_nullable==="NO"&&(f+=" not null"),d.column_default!==null&&(f+=` default ${d.column_default}`),f}),m=new Map;for(let d of s){let f=m.get(d.constraint_name)??[];f.push(d),m.set(d.constraint_name,f)}let p=[];for(let[d,f]of m){let y=f[0],g=f.map(E=>E.column_name).join(", ");y.constraint_type==="PRIMARY KEY"?p.push(` constraint ${d} primary key (${g})`):y.constraint_type==="FOREIGN KEY"?p.push(` constraint ${d} foreign key (${g}) references ${y.foreign_table_name} (${y.foreign_column_name})`):y.constraint_type==="UNIQUE"&&p.push(` constraint ${d} unique (${g})`)}l.push([...u,...p].join(`,
244
- `)),l.push(") tablespace pg_default;");for(let d of c)[...m.values()].some(y=>y[0].constraint_type==="UNIQUE"&&y[0].constraint_name===d.indexname)||(l.push(""),l.push(`${d.indexdef};`));return l.join(`
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=p=>{let{data_type:f,udt_name:y,character_maximum_length:h,numeric_precision:E,numeric_scale:T}=p;return f==="USER-DEFINED"?y:f==="ARRAY"?`${y.replace(/^_/,"")}[]`:(f==="character varying"||f==="varchar")&&h?`varchar(${h})`:f==="character"&&h?`char(${h})`:f==="numeric"&&E!==null?T!==null&&T>0?`numeric(${E}, ${T})`:`numeric(${E})`:f==="timestamp with time zone"?"timestamp with time zone":f==="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"}[f]||f},l=[`create table public.${e} (`],u=o.map(p=>{let f=` ${p.column_name} ${i(p)}`;return p.is_nullable==="NO"&&(f+=" not null"),p.column_default!==null&&(f+=` default ${p.column_default}`),f}),m=new Map;for(let p of s){let f=m.get(p.constraint_name)??[];f.push(p),m.set(p.constraint_name,f)}let d=[];for(let[p,f]of m){let y=f[0],h=f.map(E=>E.column_name).join(", ");y.constraint_type==="PRIMARY KEY"?d.push(` constraint ${p} primary key (${h})`):y.constraint_type==="FOREIGN KEY"?d.push(` constraint ${p} foreign key (${h}) references ${y.foreign_table_name} (${y.foreign_column_name})`):y.constraint_type==="UNIQUE"&&d.push(` constraint ${p} unique (${h})`)}l.push([...u,...d].join(`,
244
+ `)),l.push(") tablespace pg_default;");for(let p of c)[...m.values()].some(y=>y[0].constraint_type==="UNIQUE"&&y[0].constraint_name===p.indexname)||(l.push(""),l.push(`${p.indexdef};`));return l.join(`
245
245
  `)}async getTableColumns({tableName:e,db:t}){let r=Q(t),{rows:a}=await r.query(`SELECT
246
246
  c.column_name as "columnName", c.data_type as "dataType", c.udt_name as "udtName",
247
247
  c.is_nullable = 'YES' as "isNullable", c.column_default as "columnDefault",
@@ -264,7 +264,7 @@ ${s.join(`,
264
264
  JOIN information_schema.constraint_column_usage ccu ON tc.constraint_name = ccu.constraint_name AND tc.table_schema = ccu.table_schema
265
265
  WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = 'public' AND tc.table_name = $1
266
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(!a||a.length===0)throw new M(404,{message:`Table "${e}" does not exist`});return a.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:xt(o.dataType),dataTypeLabel:pr(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:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,isArray:u,db:m}=e,p=Q(m),{rows:d}=await p.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 M(404,{message:`Table "${t}" does not exist`});let{rows:f}=await p.query("SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public') as exists;",[t,r]);if(f[0]?.exists)throw new M(409,{message:`Column "${r}" already exists in table "${t}"`});let y=`"${r}" ${a}`;u&&(y+="[]"),s&&(y+=" PRIMARY KEY"),i&&!s&&(y+=" UNIQUE"),c||(y+=" NOT NULL"),l&&(y+=" GENERATED ALWAYS AS IDENTITY"),o?.trim()&&!l&&(y+=` DEFAULT ${o.trim()}`),await p.query(`ALTER TABLE "${t}" ADD COLUMN ${y}`)}async deleteColumn(e){let{tableName:t,columnName:r,cascade:a,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 M(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,r]);if(!i[0]?.exists)throw new M(404,{message:`Column "${r}" does not exist in table "${t}"`});let{rowCount:l}=await s.query(`ALTER TABLE "${t}" DROP COLUMN "${r}" ${a?"CASCADE":"RESTRICT"}`);return{deletedCount:l??0}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,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 M(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,r]);if(!u[0]?.exists)throw new M(404,{message:`Column "${r}" does not exist in table "${t}"`});let m=await i.connect();try{await m.query("BEGIN"),await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" TYPE ${a}`),await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" ${o?"DROP":"SET"} NOT NULL`),s?.trim()?await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" SET DEFAULT ${s.trim()}`):await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" DROP DEFAULT`),await m.query("COMMIT")}catch(p){throw await m.query("ROLLBACK"),p}finally{m.release()}}async renameColumn(e){let{tableName:t,columnName:r,newColumnName:a,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 M(404,{message:`Table "${t}" does not exist`});let{rows:l}=await s.query(c,[t,r]);if(!l[0]?.exists)throw new M(404,{message:`Column "${r}" does not exist in table "${t}"`});let{rows:u}=await s.query(c,[t,a]);if(u[0]?.exists)throw new M(409,{message:`Column "${a}" already exists in table "${t}"`});await s.query(`ALTER TABLE "${t}" RENAME COLUMN "${r}" TO "${a}"`)}async addRecord({db:e,params:t}){let{tableName:r,data:a}=t,o=Q(e),s=Object.keys(a),c=Object.values(a),i=s.map((m,p)=>`$${p+1}`).join(", "),l=s.map(m=>`"${m}"`).join(", "),u=await o.query(`INSERT INTO "${r}" (${l}) VALUES (${i}) RETURNING *`,c);if(u.rowCount===0)throw new M(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:u.rowCount??0}}async updateRecords({params:e,db:t}){let{tableName:r,updates:a,primaryKey:o}=e,s=Q(t),c=new Map;for(let i of a){let l=i.rowData[o];if(l==null)throw new M(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((f,y)=>`"${f.columnName}" = $${y+1}`),p=u.map(f=>f.value!==null&&typeof f.value=="object"?JSON.stringify(f.value):f.value);p.push(l);let d=await s.query(`UPDATE "${r}" SET ${m.join(", ")} WHERE "${o}" = $${p.length} RETURNING *`,p);if(d.rowCount===0)throw new M(404,{message:`Record with ${o} = ${l} not found in table "${r}"`});i+=d.rowCount??0}return await s.query("COMMIT"),{updatedCount:i}}catch(i){throw await s.query("ROLLBACK"),i instanceof M?i:new M(500,{message:`Failed to update records in "${r}"`})}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=Q(r),o=t[0]?.columnName;if(!o)throw new M(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 a.query("BEGIN");let i=await a.query(`DELETE FROM "${e}" WHERE "${o}" IN (${c}) RETURNING *`,s);return await a.query("COMMIT"),{deletedCount:i.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(i){if(await a.query("ROLLBACK"),i.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(a,e,t,r)};throw i instanceof M?i:new M(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=Q(r),o=t[0]?.columnName;if(!o)throw new M(400,{message:"Primary key column name is required"});let s=t.map(c=>c.value);await a.query("BEGIN");try{let c=await this.getFkConstraints(a,e),i=0,l=new Set,u=async(d,f,y)=>{let g=await this.getFkConstraints(a,d);for(let S of g){let C=y.map((A,_)=>`$${_+1}`).join(", "),{rows:R}=await a.query(`SELECT "${S.referencedColumn}" FROM "${d}" WHERE "${f}" IN (${C})`,y),w=R.map(A=>A[S.referencedColumn]);w.length>0&&await u(S.referencingTable,S.referencingColumn,w)}let E=y.map((S,C)=>`$${C+1}`).join(", "),T=await a.query(`DELETE FROM "${d}" WHERE "${f}" IN (${E})`,y);i+=T.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,f)=>`$${f+1}`).join(", "),p=await a.query(`DELETE FROM "${e}" WHERE "${o}" IN (${m}) RETURNING *`,s);return await a.query("COMMIT"),{deletedCount:(p.rowCount??0)+i}}catch(c){throw await a.query("ROLLBACK"),c instanceof M?c:new M(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t||t.length===0)throw new M(400,{message:"At least one record is required"});let o=await Q(r).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(p=>l[p]),m=s.map((p,d)=>`$${d+1}`).join(", ");try{await o.query(`INSERT INTO "${e}" (${c}) VALUES (${m}) RETURNING *`,u),i++}catch(p){throw new M(500,{message:`Failed: ${p instanceof Error?p.message:String(p)}`})}}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 M?s:new M(500,{message:`Failed to bulk insert records into "${e}"`})}finally{o.release()}}async executeQuery({query:e,db:t}){let r=Q(t);if(!e?.trim())throw new M(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now(),s=await r.query(a),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
267
+ WHERE c.table_schema = 'public' AND c.table_name = $1 ORDER BY c.ordinal_position;`,[e]);if(!a||a.length===0)throw new L(404,{message:`Table "${e}" does not exist`});return a.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:xt(o.dataType),dataTypeLabel:hr(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:r,columnType:a,defaultValue:o,isPrimaryKey:s,isNullable:c,isUnique:i,isIdentity:l,isArray:u,db:m}=e,d=Q(m),{rows:p}=await d.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1 AND table_schema = 'public') as exists;",[t]);if(!p[0]?.exists)throw new L(404,{message:`Table "${t}" does not exist`});let{rows:f}=await d.query("SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public') as exists;",[t,r]);if(f[0]?.exists)throw new L(409,{message:`Column "${r}" already exists in table "${t}"`});let y=`"${r}" ${a}`;u&&(y+="[]"),s&&(y+=" PRIMARY KEY"),i&&!s&&(y+=" UNIQUE"),c||(y+=" NOT NULL"),l&&(y+=" GENERATED ALWAYS AS IDENTITY"),o?.trim()&&!l&&(y+=` DEFAULT ${o.trim()}`),await d.query(`ALTER TABLE "${t}" ADD COLUMN ${y}`)}async deleteColumn(e){let{tableName:t,columnName:r,cascade:a,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 L(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,r]);if(!i[0]?.exists)throw new L(404,{message:`Column "${r}" does not exist in table "${t}"`});let{rowCount:l}=await s.query(`ALTER TABLE "${t}" DROP COLUMN "${r}" ${a?"CASCADE":"RESTRICT"}`);return{deletedCount:l??0}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,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 L(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,r]);if(!u[0]?.exists)throw new L(404,{message:`Column "${r}" does not exist in table "${t}"`});let m=await i.connect();try{await m.query("BEGIN"),await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" TYPE ${a}`),await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" ${o?"DROP":"SET"} NOT NULL`),s?.trim()?await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" SET DEFAULT ${s.trim()}`):await m.query(`ALTER TABLE "${t}" ALTER COLUMN "${r}" DROP DEFAULT`),await m.query("COMMIT")}catch(d){throw await m.query("ROLLBACK"),d}finally{m.release()}}async renameColumn(e){let{tableName:t,columnName:r,newColumnName:a,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 L(404,{message:`Table "${t}" does not exist`});let{rows:l}=await s.query(c,[t,r]);if(!l[0]?.exists)throw new L(404,{message:`Column "${r}" does not exist in table "${t}"`});let{rows:u}=await s.query(c,[t,a]);if(u[0]?.exists)throw new L(409,{message:`Column "${a}" already exists in table "${t}"`});await s.query(`ALTER TABLE "${t}" RENAME COLUMN "${r}" TO "${a}"`)}async addRecord({db:e,params:t}){let{tableName:r,data:a}=t,o=Q(e),s=Object.keys(a),c=Object.values(a),i=s.map((m,d)=>`$${d+1}`).join(", "),l=s.map(m=>`"${m}"`).join(", "),u=await o.query(`INSERT INTO "${r}" (${l}) VALUES (${i}) RETURNING *`,c);if(u.rowCount===0)throw new L(500,{message:`Failed to insert record into "${r}"`});return{insertedCount:u.rowCount??0}}async updateRecords({params:e,db:t}){let{tableName:r,updates:a,primaryKey:o}=e,s=Q(t),c=new Map;for(let i of a){let l=i.rowData[o];if(l==null)throw new L(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((f,y)=>`"${f.columnName}" = $${y+1}`),d=u.map(f=>f.value!==null&&typeof f.value=="object"?JSON.stringify(f.value):f.value);d.push(l);let p=await s.query(`UPDATE "${r}" SET ${m.join(", ")} WHERE "${o}" = $${d.length} RETURNING *`,d);if(p.rowCount===0)throw new L(404,{message:`Record with ${o} = ${l} not found in table "${r}"`});i+=p.rowCount??0}return await s.query("COMMIT"),{updatedCount:i}}catch(i){throw await s.query("ROLLBACK"),i instanceof L?i:new L(500,{message:`Failed to update records in "${r}"`})}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=Q(r),o=t[0]?.columnName;if(!o)throw new L(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 a.query("BEGIN");let i=await a.query(`DELETE FROM "${e}" WHERE "${o}" IN (${c}) RETURNING *`,s);return await a.query("COMMIT"),{deletedCount:i.rowCount??0,fkViolation:!1,relatedRecords:[]}}catch(i){if(await a.query("ROLLBACK"),i.code==="23503")return{deletedCount:0,fkViolation:!0,relatedRecords:await this.getRelatedRecords(a,e,t,r)};throw i instanceof L?i:new L(500,{message:`Failed to delete records from "${e}"`})}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=Q(r),o=t[0]?.columnName;if(!o)throw new L(400,{message:"Primary key column name is required"});let s=t.map(c=>c.value);await a.query("BEGIN");try{let c=await this.getFkConstraints(a,e),i=0,l=new Set,u=async(p,f,y)=>{let h=await this.getFkConstraints(a,p);for(let C of h){let S=y.map((A,_)=>`$${_+1}`).join(", "),{rows:R}=await a.query(`SELECT "${C.referencedColumn}" FROM "${p}" WHERE "${f}" IN (${S})`,y),w=R.map(A=>A[C.referencedColumn]);w.length>0&&await u(C.referencingTable,C.referencingColumn,w)}let E=y.map((C,S)=>`$${S+1}`).join(", "),T=await a.query(`DELETE FROM "${p}" WHERE "${f}" IN (${E})`,y);i+=T.rowCount??0,l.add(p)};for(let p of c)l.has(p.referencingTable)||await u(p.referencingTable,p.referencingColumn,s);let m=s.map((p,f)=>`$${f+1}`).join(", "),d=await a.query(`DELETE FROM "${e}" WHERE "${o}" IN (${m}) RETURNING *`,s);return await a.query("COMMIT"),{deletedCount:(d.rowCount??0)+i}}catch(c){throw await a.query("ROLLBACK"),c instanceof L?c:new L(500,{message:`Failed to force delete records from "${e}"`})}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t||t.length===0)throw new L(400,{message:"At least one record is required"});let o=await Q(r).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(d=>l[d]),m=s.map((d,p)=>`$${p+1}`).join(", ");try{await o.query(`INSERT INTO "${e}" (${c}) VALUES (${m}) RETURNING *`,u),i++}catch(d){throw new L(500,{message:`Failed: ${d instanceof Error?d.message:String(d)}`})}}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 L?s:new L(500,{message:`Failed to bulk insert records into "${e}"`})}finally{o.release()}}async executeQuery({query:e,db:t}){let r=Q(t);if(!e?.trim())throw new L(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now(),s=await r.query(a),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
268
  FROM pg_index i
269
269
  JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
270
270
  WHERE i.indrelid = $1::regclass AND i.indisprimary
@@ -273,8 +273,8 @@ ${s.join(`,
273
273
  FROM information_schema.table_constraints AS tc
274
274
  JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
275
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 r.map(a=>({constraintName:a.constraint_name,referencingTable:a.referencing_table,referencingColumn:a.referencing_column,referencedTable:a.referenced_table,referencedColumn:a.referenced_column}))}async getFkReferencesForTable(e,t){return this.getFkConstraints(e,t)}async getRelatedRecordsForTable(e,t){let r=await this.getFkReferencesForTable(e,t);if(r.length===0)return[];let a=[];for(let o of r){let{rows:s}=await e.query(`SELECT * FROM "${o.referencingTable}" LIMIT 100`);s.length>0&&a.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:s})}return a}async getRelatedRecords(e,t,r,a){let o=await this.getFkConstraints(e,t);if(o.length===0)return[];let s=[],c=r.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||!r.find(f=>f.columnName===u.referencedColumn))continue;let p=c.map((f,y)=>`$${y+1}`).join(", "),{rows:d}=await e.query(`SELECT * FROM "${u.referencingTable}" WHERE "${u.referencingColumn}" IN (${p}) 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:r}=await e.query(`SELECT COUNT(*) as count FROM "${t}"`);return Number.parseInt(r[0]?.count??"0",10)}}});function Aa(n){let e=[],t="",r=0,a=!1,o=!1;for(;r<n.length;){let s=n[r];if(a){s==="'"?a=!1:t+=s,r++;continue}if(o){if(s==="\\"&&r+1<n.length){t+=n[r+1],r+=2;continue}s==='"'?o=!1:t+=s,r++;continue}if(s==="'"){a=!0,r++;continue}if(s==='"'){o=!0,r++;continue}if(s===" "||s===" "||s===`
277
- `){t.length>0&&(e.push(t),t=""),r++;continue}t+=s,r++}if(a||o)throw new Error("Unterminated quoted string in command");return t.length>0&&e.push(t),e}function Da(n,e){if(n.length===0)return Je(e);let t=n[0]?.toUpperCase()??"",r=n[1]?.toUpperCase();if((t==="ZRANGE"||t==="ZREVRANGE"||t==="ZRANGEBYSCORE")&&n.some(o=>o.toUpperCase()==="WITHSCORES"))return ai(e);if(r){let o=`${t} ${r}`,s=Sa[o];if(s)return s(e)}let a=Sa[t];return a?a(e):typeof e=="string"||typeof e=="number"||e===null?ie(e):ni(e)?Ae(e):Je(e)}var ni,Na,Je,ie,wa,Ae,Ra,ai,oi,Ca,Sa,_a=N(()=>{"use strict";ni=n=>Array.isArray(n)&&n.every(e=>typeof e=="string"||e===null),Na=n=>Array.isArray(n)&&n.length%2===0;Je=n=>({columns:["result"],rows:[{result:typeof n=="string"?n:JSON.stringify(n,null,2)}],rowCount:1}),ie=n=>n===null?{columns:["value"],rows:[{value:null}],rowCount:0}:{columns:["value"],rows:[{value:n}],rowCount:1},wa=n=>({columns:["status"],rows:[{status:n}],rowCount:1}),Ae=n=>Array.isArray(n)?{columns:["#","value"],rows:n.map((e,t)=>({"#":t,value:e})),rowCount:n.length}:Je(n),Ra=n=>{if(!Na(n))return Je(n);let e=[];for(let t=0;t<n.length;t+=2)e.push({field:n[t],value:n[t+1]});return{columns:["field","value"],rows:e,rowCount:e.length}},ai=n=>{if(!Na(n))return Ae(n);let e=[];for(let t=0;t<n.length;t+=2)e.push({member:n[t],score:n[t+1]});return{columns:["member","score"],rows:e,rowCount:e.length}},oi=n=>{if(typeof n!="string")return Je(n);let e=[],t="";for(let r of n.split(/\r?\n/)){if(!r.trim())continue;if(r.startsWith("#")){t=r.replace(/^#\s*/,"").trim();continue}let a=r.indexOf(":");a<0||e.push({section:t,key:r.slice(0,a),value:r.slice(a+1)})}return{columns:["section","key","value"],rows:e,rowCount:e.length}},Ca=n=>{if(!Array.isArray(n))return Je(n);let e=n.map(t=>{if(!Array.isArray(t)||t.length<2)return{id:null,fields:null};let[r,a]=t,o={};if(Array.isArray(a))for(let s=0;s<a.length;s+=2)o[String(a[s])]=a[s+1];return{id:r,fields:o}});return{columns:["id","fields"],rows:e,rowCount:e.length}},Sa={PING:wa,GET:ie,SET:wa,TYPE:ie,TTL:ie,EXISTS:ie,DBSIZE:ie,DEL:ie,INCR:ie,DECR:ie,STRLEN:ie,LLEN:ie,SCARD:ie,ZCARD:ie,HLEN:ie,HGET:ie,HMGET:Ae,MGET:Ae,KEYS:Ae,LRANGE:Ae,SMEMBERS:Ae,HGETALL:Ra,HKEYS:Ae,HVALS:Ae,"CONFIG GET":Ra,ZRANGE:Ae,INFO:oi,XRANGE:Ca,XREVRANGE:Ca}});import{createHash as si,randomBytes as ii}from"crypto";import{HTTPException as D}from"hono/http-exception";import{z as _e}from"zod";function Pa(n){let e={};for(let t of n.split(/\r?\n/)){if(!t||t.startsWith("#"))continue;let r=t.indexOf(":");r<0||(e[t.slice(0,r)]=t.slice(r+1))}return e}function Si(n){let e=new Map;for(let t of n.split(/\r?\n/)){let r=t.match(/^db(\d+):keys=(\d+)/);r&&e.set(Number(r[1]),Number(r[2]))}return e}function $a(n){let e=n.key;if(e==null||e==="")throw new D(400,{message:"Field 'key' is required"});return String(e)}function Vr(n){let e=n.ttl;if(e==null||e==="")return null;let t=typeof e=="number"?e:Number.parseInt(String(e),10);return Number.isFinite(t)?t:null}function Ht(n){return typeof n=="string"?n:n==null?"":typeof n=="object"?JSON.stringify(n):String(n)}function Oa(n,e){if(typeof n=="string"){try{let t=JSON.parse(n);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{}throw new D(400,{message:`Value for ${e} must be a JSON object`})}if(n&&typeof n=="object"&&!Array.isArray(n))return n;throw new D(400,{message:`Value for ${e} must be a JSON object`})}function va(n,e){if(Array.isArray(n))return n;if(typeof n=="string")try{let t=JSON.parse(n);if(Array.isArray(t))return t}catch{}throw new D(400,{message:`Value for ${e} must be a JSON array`})}function Ni(n){let e;if(Array.isArray(n))e=n;else if(typeof n=="string")try{e=JSON.parse(n)}catch{throw new D(400,{message:"Value for zset must be an array of {member, score} entries"})}else throw new D(400,{message:"Value for zset must be an array of {member, score} entries"});let t=[];for(let r of e){if(!r||typeof r!="object")throw new D(400,{message:"Each zset entry must be an object with 'member' and 'score'"});let a=r;if(a.member===void 0||a.score===void 0)throw new D(400,{message:"Each zset entry must include 'member' and 'score'"});let o=typeof a.score=="number"?a.score:Number(a.score);if(!Number.isFinite(o))throw new D(400,{message:`Invalid score: ${String(a.score)}`});t.push({member:String(a.member),score:o})}return t}function Ai(n){if(!n)return[];let e=[];for(let t=0;t<n.length;t+=2){let r=Number(n[t+1]);e.push({member:n[t],score:Number.isFinite(r)?r:0})}return e}function Di(n){if(!Array.isArray(n))return{length:0,firstId:null,lastId:null};let e={};for(let s=0;s<n.length;s+=2)e[String(n[s])]=n[s+1];let t=typeof e.length=="number"?e.length:Number.parseInt(String(e.length??"0"),10)||0,r=e["first-entry"],a=e["last-entry"],o=s=>Array.isArray(s)&&typeof s[0]=="string"?s[0]:null;return{length:t,firstId:o(r),lastId:o(a)}}var ct,jr,Ft,li,ci,ui,mi,di,pi,fi,yi,bi,ve,ae,gi,hi,it,Ti,me,Ei,jt,W,Kt,Fe,lt,Kr,de,Hr,wi,Ri,De,Xe,Ze,xa,Ci,Vt,La=N(()=>{"use strict";qe();Be();_a();ct=["strings","hashes","lists","sets","zsets","streams"],jr={strings:"string",hashes:"hash",lists:"list",sets:"set",zsets:"zset",streams:"stream"},Ft="Schema is fixed for Redis tables; this operation is not supported",li="Sorting is not supported for Redis tables",ci="Filtering is not supported for Redis tables",ui="Backward pagination is not supported for Redis tables (SCAN is forward-only)",mi=10,di=3e4,pi=1e4,fi=256*1024,yi=8*1024*1024,bi=n=>ct.includes(n),ve=n=>{if(!bi(n))throw new D(404,{message:`Table "${n}" does not exist in Redis. Valid tables: ${ct.join(", ")}`});return n},ae=n=>{if(n==="")return Ue();let e=Number.parseInt(n,10);if(!Number.isFinite(e)||e<0)throw new D(400,{message:`Invalid Redis database index: "${n}". Expected a non-negative integer.`});return e},gi=n=>Buffer.from(JSON.stringify(n)).toString("base64url"),hi=n=>{try{return _e.object({scanCursor:_e.string().regex(/^\d+$/),search:_e.string().max(512).optional(),exactPattern:_e.boolean(),type:_e.enum(["string","hash","list","set","zset","stream"]).optional()}).parse(JSON.parse(Buffer.from(n,"base64url").toString("utf-8")))}catch{return null}},it=n=>Buffer.from(JSON.stringify(n)).toString("base64url"),Ti=n=>{try{return _e.object({key:_e.string().min(1).max(16*1024),type:_e.enum(["string","hash","list","set","zset","stream","unknown"]),cursor:_e.string().min(1).max(512),direction:_e.enum(["forward","backward"])}).parse(JSON.parse(Buffer.from(n,"base64url").toString("utf8")))}catch{return null}},me=n=>{let e=n.toString("utf8");return Buffer.from(e,"utf8").equals(n)?{base64:n.toString("base64url"),utf8:e}:{base64:n.toString("base64url")}},Ei=n=>n.replaceAll(/[\\*?[\]]/g,"\\$&"),jt=n=>{let e=Buffer.isBuffer(n)?n.toString("utf8"):String(n);return["string","hash","list","set","zset","stream"].includes(e)?e:"unknown"},W=n=>Buffer.from(n,"base64url"),Kt=n=>n==="-"?Buffer.alloc(0):W(n),Fe=n=>si("sha256").update(n).digest("base64url"),lt=()=>new D(409,{message:"This key changed since it was loaded. Reload it or explicitly overwrite."}),Kr=n=>{let e=n instanceof Error?n.message:String(n);return/(NOPERM|unknown command|not allowed|unsupported)/i.test(e)},de=(n,e)=>{if(n!==e)throw new D(400,{message:`This operation requires a ${e} key, but the key is ${n}.`})},Hr=n=>{if(n===null)throw lt();if(!Array.isArray(n))return;let e=n.find(t=>Array.isArray(t)&&t[0]instanceof Error);if(e)throw new D(400,{message:e[0].message})},wi=n=>Buffer.from(JSON.stringify(n)).toString("base64url"),Ri=n=>{try{return JSON.parse(Buffer.from(n,"base64url").toString("utf-8"))}catch{return null}},De=n=>({columnName:n.columnName,dataType:n.dataType,dataTypeLabel:n.dataTypeLabel??(n.dataType==="number"?"int":n.dataType==="json"?"json":n.dataType==="array"?"array":"text"),isNullable:n.isNullable??!1,columnDefault:n.columnDefault??null,isPrimaryKey:n.isPrimaryKey??!1,isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}),Xe=De({columnName:"key",dataType:"text",isPrimaryKey:!0}),Ze=De({columnName:"ttl",dataType:"number",isNullable:!0}),xa={strings:[Xe,De({columnName:"value",dataType:"text",isNullable:!0}),Ze],hashes:[Xe,De({columnName:"value",dataType:"json"}),Ze],lists:[Xe,De({columnName:"value",dataType:"array"}),Ze],sets:[Xe,De({columnName:"value",dataType:"array"}),Ze],zsets:[Xe,De({columnName:"value",dataType:"json"}),Ze],streams:[Xe,De({columnName:"length",dataType:"number"}),De({columnName:"first-id",dataType:"text",isNullable:!0}),De({columnName:"last-id",dataType:"text",isNullable:!0}),Ze]},Ci={strings:`-- Redis string keys
276
+ WHERE tc.constraint_type = 'FOREIGN KEY' AND ccu.table_name = $1`,[t]);return r.map(a=>({constraintName:a.constraint_name,referencingTable:a.referencing_table,referencingColumn:a.referencing_column,referencedTable:a.referenced_table,referencedColumn:a.referenced_column}))}async getFkReferencesForTable(e,t){return this.getFkConstraints(e,t)}async getRelatedRecordsForTable(e,t){let r=await this.getFkReferencesForTable(e,t);if(r.length===0)return[];let a=[];for(let o of r){let{rows:s}=await e.query(`SELECT * FROM "${o.referencingTable}" LIMIT 100`);s.length>0&&a.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:s})}return a}async getRelatedRecords(e,t,r,a){let o=await this.getFkConstraints(e,t);if(o.length===0)return[];let s=[],c=r.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||!r.find(f=>f.columnName===u.referencedColumn))continue;let d=c.map((f,y)=>`$${y+1}`).join(", "),{rows:p}=await e.query(`SELECT * FROM "${u.referencingTable}" WHERE "${u.referencingColumn}" IN (${d}) LIMIT 100`,c);p.length>0&&s.push({tableName:u.referencingTable,columnName:u.referencingColumn,constraintName:u.constraintName,records:p})}return s}async getTableRowCount(e,t){let{rows:r}=await e.query(`SELECT COUNT(*) as count FROM "${t}"`);return Number.parseInt(r[0]?.count??"0",10)}}});function $a(n){let e=[],t="",r=0,a=!1,o=!1;for(;r<n.length;){let s=n[r];if(a){s==="'"?a=!1:t+=s,r++;continue}if(o){if(s==="\\"&&r+1<n.length){t+=n[r+1],r+=2;continue}s==='"'?o=!1:t+=s,r++;continue}if(s==="'"){a=!0,r++;continue}if(s==='"'){o=!0,r++;continue}if(s===" "||s===" "||s===`
277
+ `){t.length>0&&(e.push(t),t=""),r++;continue}t+=s,r++}if(a||o)throw new Error("Unterminated quoted string in command");return t.length>0&&e.push(t),e}function va(n,e){if(n.length===0)return Je(e);let t=n[0]?.toUpperCase()??"",r=n[1]?.toUpperCase();if((t==="ZRANGE"||t==="ZREVRANGE"||t==="ZRANGEBYSCORE")&&n.some(o=>o.toUpperCase()==="WITHSCORES"))return fi(e);if(r){let o=`${t} ${r}`,s=Pa[o];if(s)return s(e)}let a=Pa[t];return a?a(e):typeof e=="string"||typeof e=="number"||e===null?le(e):pi(e)?Ne(e):Je(e)}var pi,ka,Je,le,Da,Ne,_a,fi,yi,xa,Pa,Oa=N(()=>{"use strict";pi=n=>Array.isArray(n)&&n.every(e=>typeof e=="string"||e===null),ka=n=>Array.isArray(n)&&n.length%2===0;Je=n=>({columns:["result"],rows:[{result:typeof n=="string"?n:JSON.stringify(n,null,2)}],rowCount:1}),le=n=>n===null?{columns:["value"],rows:[{value:null}],rowCount:0}:{columns:["value"],rows:[{value:n}],rowCount:1},Da=n=>({columns:["status"],rows:[{status:n}],rowCount:1}),Ne=n=>Array.isArray(n)?{columns:["#","value"],rows:n.map((e,t)=>({"#":t,value:e})),rowCount:n.length}:Je(n),_a=n=>{if(!ka(n))return Je(n);let e=[];for(let t=0;t<n.length;t+=2)e.push({field:n[t],value:n[t+1]});return{columns:["field","value"],rows:e,rowCount:e.length}},fi=n=>{if(!ka(n))return Ne(n);let e=[];for(let t=0;t<n.length;t+=2)e.push({member:n[t],score:n[t+1]});return{columns:["member","score"],rows:e,rowCount:e.length}},yi=n=>{if(typeof n!="string")return Je(n);let e=[],t="";for(let r of n.split(/\r?\n/)){if(!r.trim())continue;if(r.startsWith("#")){t=r.replace(/^#\s*/,"").trim();continue}let a=r.indexOf(":");a<0||e.push({section:t,key:r.slice(0,a),value:r.slice(a+1)})}return{columns:["section","key","value"],rows:e,rowCount:e.length}},xa=n=>{if(!Array.isArray(n))return Je(n);let e=n.map(t=>{if(!Array.isArray(t)||t.length<2)return{id:null,fields:null};let[r,a]=t,o={};if(Array.isArray(a))for(let s=0;s<a.length;s+=2)o[String(a[s])]=a[s+1];return{id:r,fields:o}});return{columns:["id","fields"],rows:e,rowCount:e.length}},Pa={PING:Da,GET:le,SET:Da,TYPE:le,TTL:le,EXISTS:le,DBSIZE:le,DEL:le,INCR:le,DECR:le,STRLEN:le,LLEN:le,SCARD:le,ZCARD:le,HLEN:le,HGET:le,HMGET:Ne,MGET:Ne,KEYS:Ne,LRANGE:Ne,SMEMBERS:Ne,HGETALL:_a,HKEYS:Ne,HVALS:Ne,"CONFIG GET":_a,ZRANGE:Ne,INFO:yi,XRANGE:xa,XREVRANGE:xa}});import{createHash as bi,randomBytes as hi}from"crypto";import{HTTPException as D}from"hono/http-exception";import{z as De}from"zod";function Ma(n){let e={};for(let t of n.split(/\r?\n/)){if(!t||t.startsWith("#"))continue;let r=t.indexOf(":");r<0||(e[t.slice(0,r)]=t.slice(r+1))}return e}function Oi(n){let e=new Map;for(let t of n.split(/\r?\n/)){let r=t.match(/^db(\d+):keys=(\d+)/);r&&e.set(Number(r[1]),Number(r[2]))}return e}function Ia(n){let e=n.key;if(e==null||e==="")throw new D(400,{message:"Field 'key' is required"});return String(e)}function Gr(n){let e=n.ttl;if(e==null||e==="")return null;let t=typeof e=="number"?e:Number.parseInt(String(e),10);return Number.isFinite(t)?t:null}function Ht(n){return typeof n=="string"?n:n==null?"":typeof n=="object"?JSON.stringify(n):String(n)}function qa(n,e){if(typeof n=="string"){try{let t=JSON.parse(n);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{}throw new D(400,{message:`Value for ${e} must be a JSON object`})}if(n&&typeof n=="object"&&!Array.isArray(n))return n;throw new D(400,{message:`Value for ${e} must be a JSON object`})}function Ua(n,e){if(Array.isArray(n))return n;if(typeof n=="string")try{let t=JSON.parse(n);if(Array.isArray(t))return t}catch{}throw new D(400,{message:`Value for ${e} must be a JSON array`})}function Li(n){let e;if(Array.isArray(n))e=n;else if(typeof n=="string")try{e=JSON.parse(n)}catch{throw new D(400,{message:"Value for zset must be an array of {member, score} entries"})}else throw new D(400,{message:"Value for zset must be an array of {member, score} entries"});let t=[];for(let r of e){if(!r||typeof r!="object")throw new D(400,{message:"Each zset entry must be an object with 'member' and 'score'"});let a=r;if(a.member===void 0||a.score===void 0)throw new D(400,{message:"Each zset entry must include 'member' and 'score'"});let o=typeof a.score=="number"?a.score:Number(a.score);if(!Number.isFinite(o))throw new D(400,{message:`Invalid score: ${String(a.score)}`});t.push({member:String(a.member),score:o})}return t}function Mi(n){if(!n)return[];let e=[];for(let t=0;t<n.length;t+=2){let r=Number(n[t+1]);e.push({member:n[t],score:Number.isFinite(r)?r:0})}return e}function Ii(n){if(!Array.isArray(n))return{length:0,firstId:null,lastId:null};let e={};for(let s=0;s<n.length;s+=2)e[String(n[s])]=n[s+1];let t=typeof e.length=="number"?e.length:Number.parseInt(String(e.length??"0"),10)||0,r=e["first-entry"],a=e["last-entry"],o=s=>Array.isArray(s)&&typeof s[0]=="string"?s[0]:null;return{length:t,firstId:o(r),lastId:o(a)}}var ct,zr,Ft,gi,Ti,Ei,wi,Ri,Si,Ci,Ni,Ai,ve,oe,Di,_i,it,xi,de,Pi,jt,W,Kt,Fe,lt,Wr,pe,Yr,ki,$i,Ae,Xe,Ze,La,vi,Vt,Ba=N(()=>{"use strict";qe();Be();Oa();ct=["strings","hashes","lists","sets","zsets","streams"],zr={strings:"string",hashes:"hash",lists:"list",sets:"set",zsets:"zset",streams:"stream"},Ft="Schema is fixed for Redis tables; this operation is not supported",gi="Sorting is not supported for Redis tables",Ti="Filtering is not supported for Redis tables",Ei="Backward pagination is not supported for Redis tables (SCAN is forward-only)",wi=10,Ri=3e4,Si=1e4,Ci=256*1024,Ni=8*1024*1024,Ai=n=>ct.includes(n),ve=n=>{if(!Ai(n))throw new D(404,{message:`Table "${n}" does not exist in Redis. Valid tables: ${ct.join(", ")}`});return n},oe=n=>{if(n==="")return Ue();let e=Number.parseInt(n,10);if(!Number.isFinite(e)||e<0)throw new D(400,{message:`Invalid Redis database index: "${n}". Expected a non-negative integer.`});return e},Di=n=>Buffer.from(JSON.stringify(n)).toString("base64url"),_i=n=>{try{return De.object({scanCursor:De.string().regex(/^\d+$/),search:De.string().max(512).optional(),exactPattern:De.boolean(),type:De.enum(["string","hash","list","set","zset","stream"]).optional()}).parse(JSON.parse(Buffer.from(n,"base64url").toString("utf-8")))}catch{return null}},it=n=>Buffer.from(JSON.stringify(n)).toString("base64url"),xi=n=>{try{return De.object({key:De.string().min(1).max(16*1024),type:De.enum(["string","hash","list","set","zset","stream","unknown"]),cursor:De.string().min(1).max(512),direction:De.enum(["forward","backward"])}).parse(JSON.parse(Buffer.from(n,"base64url").toString("utf8")))}catch{return null}},de=n=>{let e=n.toString("utf8");return Buffer.from(e,"utf8").equals(n)?{base64:n.toString("base64url"),utf8:e}:{base64:n.toString("base64url")}},Pi=n=>n.replaceAll(/[\\*?[\]]/g,"\\$&"),jt=n=>{let e=Buffer.isBuffer(n)?n.toString("utf8"):String(n);return["string","hash","list","set","zset","stream"].includes(e)?e:"unknown"},W=n=>Buffer.from(n,"base64url"),Kt=n=>n==="-"?Buffer.alloc(0):W(n),Fe=n=>bi("sha256").update(n).digest("base64url"),lt=()=>new D(409,{message:"This key changed since it was loaded. Reload it or explicitly overwrite."}),Wr=n=>{let e=n instanceof Error?n.message:String(n);return/(NOPERM|unknown command|not allowed|unsupported)/i.test(e)},pe=(n,e)=>{if(n!==e)throw new D(400,{message:`This operation requires a ${e} key, but the key is ${n}.`})},Yr=n=>{if(n===null)throw lt();if(!Array.isArray(n))return;let e=n.find(t=>Array.isArray(t)&&t[0]instanceof Error);if(e)throw new D(400,{message:e[0].message})},ki=n=>Buffer.from(JSON.stringify(n)).toString("base64url"),$i=n=>{try{return JSON.parse(Buffer.from(n,"base64url").toString("utf-8"))}catch{return null}},Ae=n=>({columnName:n.columnName,dataType:n.dataType,dataTypeLabel:n.dataTypeLabel??(n.dataType==="number"?"int":n.dataType==="json"?"json":n.dataType==="array"?"array":"text"),isNullable:n.isNullable??!1,columnDefault:n.columnDefault??null,isPrimaryKey:n.isPrimaryKey??!1,isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}),Xe=Ae({columnName:"key",dataType:"text",isPrimaryKey:!0}),Ze=Ae({columnName:"ttl",dataType:"number",isNullable:!0}),La={strings:[Xe,Ae({columnName:"value",dataType:"text",isNullable:!0}),Ze],hashes:[Xe,Ae({columnName:"value",dataType:"json"}),Ze],lists:[Xe,Ae({columnName:"value",dataType:"array"}),Ze],sets:[Xe,Ae({columnName:"value",dataType:"array"}),Ze],zsets:[Xe,Ae({columnName:"value",dataType:"json"}),Ze],streams:[Xe,Ae({columnName:"length",dataType:"number"}),Ae({columnName:"first-id",dataType:"text",isNullable:!0}),Ae({columnName:"last-id",dataType:"text",isNullable:!0}),Ze]},vi={strings:`-- Redis string keys
278
278
  -- Columns: key (text, PK), value (text), ttl (number, seconds; -1 = no TTL, -2 = missing)
279
279
  -- Backed by: GET / SET / EXPIRE`,hashes:`-- Redis hash keys
280
280
  -- Columns: key (text, PK), value (json: {field: value, ...}), ttl (number)
@@ -286,7 +286,9 @@ ${s.join(`,
286
286
  -- Columns: key (text, PK), value (json: [{member, score}, ...]), ttl (number)
287
287
  -- Backed by: ZRANGE WITHSCORES / ZADD / EXPIRE`,streams:`-- Redis stream keys
288
288
  -- Columns: key (text, PK), length (number), first-id (text), last-id (text), ttl (number)
289
- -- Backed by: XINFO STREAM / XADD / EXPIRE (read-only \u2014 streams are append-only)`},Vt=class extends ce{countCache=new Map;runQuery(){throw new D(501,{message:"runQuery is not supported for Redis"})}buildTableDataQuery(e){throw new D(501,{message:"buildTableDataQuery is not supported for Redis"})}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){return{nextCursor:null,prevCursor:null}}quoteIdentifier(e){return e}mapToUniversalType(e){switch(e.toLowerCase()){case"string":return"text";case"hash":return"json";case"list":case"set":return"array";case"zset":case"stream":return"json";case"integer":case"number":case"ttl":return"number";default:return"text"}}mapFromUniversalType(e){return"string"}async scanKeys(e){try{let{db:t,limit:r,search:a,exactPattern:o,type:s,cursor:c}=e,i=ae(t),l=await ue(i),u="0";if(c){let T=hi(c);if(!T||T.search!==a||T.exactPattern!==o||T.type!==s)throw new D(400,{message:"Invalid or stale key scan cursor"});u=T.scanCursor}let m=a?o?a:`*${Ei(a)}*`:"*",p=[u,"MATCH",m,"COUNT",r];s&&p.push("TYPE",s);let[d,f]=await l.scanBuffer(...p),y=Buffer.isBuffer(d)?d.toString("utf8"):d,g=l.pipeline();for(let T of f)g.call("TYPE",T),g.pttl(T),g.call("MEMORY","USAGE",T);let E=await g.exec()??[];return{keys:f.map((T,S)=>{let C=S*3,R=E[C+2]?.[1];return{key:me(T),type:jt(E[C]?.[1]),ttlMs:Number(E[C+1]?.[1]??-2),memoryBytes:R==null?null:Number(R)}}),nextCursor:y==="0"?null:gi({scanCursor:y,search:a,exactPattern:o,type:s}),hasMore:y!=="0"}}catch(t){throw this.wrapError(t)}}async getKeyDetails(e){try{let{db:t,key:r,cursor:a,limit:o,full:s,direction:c}=e,i=Kt(r),l=await ue(ae(t)),[u,m,p,d]=await Promise.all([l.callBuffer("TYPE",i),l.pttl(i),l.call("MEMORY","USAGE",i).catch(()=>null),l.callBuffer("DUMP",i)]),f=d;if(!f)throw new D(404,{message:"Redis key no longer exists"});let y=jt(u),g={key:me(i),type:y,ttlMs:Number(m),memoryBytes:p===null?null:Number(p),revision:Fe(f)},E=a?Ti(a):null;if(a&&(!E||E.key!==r||E.type!==y||E.direction!==c))throw new D(400,{message:"Invalid or stale key details cursor"});if(y==="string"){let T=await l.strlen(i),S=s?yi:fi,C=await l.getrangeBuffer(i,0,S-1);return{...g,length:T,value:{kind:"string",value:me(C),truncated:T>S},nextCursor:null,hasMore:!1}}if(y==="hash"){let[T,S]=await Promise.all([l.hlen(i),l.hscanBuffer(i,E?.cursor??"0","COUNT",String(o))]),[C,R]=S,w=Buffer.isBuffer(C)?C.toString("utf8"):C,A=[];for(let _=0;_<R.length;_+=2)A.push({field:me(R[_]),value:me(R[_+1])});return{...g,length:T,value:{kind:"hash",entries:A},nextCursor:w==="0"?null:it({key:r,type:y,cursor:w,direction:c}),hasMore:w!=="0"}}if(y==="list"){let T=Number.parseInt(E?.cursor??"0",10),S=await l.llen(i),C=await l.lrangeBuffer(i,T,T+o-1),R=T+C.length,w=R<S;return{...g,length:S,value:{kind:"list",entries:C.map((A,_)=>({index:T+_,value:me(A)}))},nextCursor:w?it({key:r,type:y,cursor:String(R),direction:c}):null,hasMore:w}}if(y==="set"){let[T,S]=await Promise.all([l.scard(i),l.sscanBuffer(i,E?.cursor??"0","COUNT",String(o))]),[C,R]=S,w=Buffer.isBuffer(C)?C.toString("utf8"):C;return{...g,length:T,value:{kind:"set",members:R.map(me)},nextCursor:w==="0"?null:it({key:r,type:y,cursor:w,direction:c}),hasMore:w!=="0"}}if(y==="zset"){let[T,S]=await Promise.all([l.zcard(i),l.zscanBuffer(i,E?.cursor??"0","COUNT",String(o))]),[C,R]=S,w=Buffer.isBuffer(C)?C.toString("utf8"):C,A=[];for(let _=0;_<R.length;_+=2)A.push({member:me(R[_]),score:(()=>{let x=R[_+1].toString("utf8");return x==="inf"?"inf":x==="-inf"?"-inf":Number(x)})()});return{...g,length:T,value:{kind:"zset",entries:A},nextCursor:w==="0"?null:it({key:r,type:y,cursor:w,direction:c}),hasMore:w!=="0"}}if(y==="stream"){let T=E?.cursor??(c==="forward"?"-":"+"),[S,C]=await Promise.all([l.xlen(i),c==="forward"?l.xrangeBuffer(i,T,"+","COUNT",o+1):l.xrevrangeBuffer(i,T,"-","COUNT",o+1)]),R=C.length>o,A=C.slice(0,o).map(([x,$])=>{let O=[];for(let U=0;U<$.length;U+=2)O.push({field:me($[U]),value:me($[U+1])});return{id:x.toString("utf8"),fields:O}}),_=A.at(-1)?.id;return{...g,length:S,value:{kind:"stream",entries:A},nextCursor:R&&_?it({key:r,type:y,cursor:`(${_}`,direction:c}):null,hasMore:R}}return{...g,length:null,value:{kind:"unknown"},nextCursor:null,hasMore:!1}}catch(t){throw this.wrapError(t)}}async getStringChunk(e){try{let t=await ue(ae(e.db)),r=Kt(e.key),a=jt(await t.callBuffer("TYPE",r));if(a==="unknown")throw new D(404,{message:"Redis key no longer exists"});if(de(a,"string"),e.expectedRevision){let i=await t.callBuffer("DUMP",r);if(!i||Fe(i)!==e.expectedRevision)throw lt()}let o=await t.strlen(r),s=await t.getrangeBuffer(r,e.offset,e.offset+e.limit-1),c=e.offset+s.length;return{chunk:me(s),length:o,nextOffset:c<o?c:null,hasMore:c<o}}catch(t){throw this.wrapError(t)}}async createKey(e){let t=null;try{t=await Nt(ae(e.db));let r=W(e.key.base64);if(await t.watch(r),await t.exists(r)!==0)throw new D(409,{message:"A Redis key with this name already exists."});if(e.type!==e.value.kind)throw new D(400,{message:"The initial value does not match the selected Redis key type."});let a=t.multi();switch(e.value.kind){case"string":a.set(r,W(e.value.value.base64));break;case"hash":a.hset(r,...e.value.entries.flatMap(({field:s,value:c})=>[W(s.base64),W(c.base64)]));break;case"list":a.rpush(r,...e.value.entries.map(s=>W(s.base64)));break;case"set":a.sadd(r,...e.value.members.map(s=>W(s.base64)));break;case"zset":a.zadd(r,...e.value.entries.flatMap(({member:s,score:c})=>[c,W(s.base64)]));break;case"stream":a.xadd(r,e.value.id,...e.value.fields.flatMap(({field:s,value:c})=>[W(s.base64),W(c.base64)]));break}e.ttlMs!==null&&a.pexpire(r,e.ttlMs),Hr(await a.exec());let o=await t.callBuffer("DUMP",r);if(!o)throw lt();return{key:me(r),revision:Fe(o),deleted:!1}}catch(r){throw this.wrapError(r)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async applyKeyAction(e){let t=null;try{t=await Nt(ae(e.db));let r=Kt(e.key),a=e.operation.action==="rename"?W(e.operation.newKey.base64):null;a&&!a.equals(r)?await t.watch(r,a):await t.watch(r);let[o,s,c]=await Promise.all([t.callBuffer("DUMP",r),t.callBuffer("TYPE",r),t.pttl(r)]),i=o;if(!i)throw new D(404,{message:"Redis key no longer exists"});if(!e.force&&Fe(i)!==e.expectedRevision)throw lt();let l=jt(s);if(a&&!a.equals(r)&&await t.exists(a)!==0)throw new D(409,{message:"A Redis key with the new name already exists."});let u=t.multi();switch(e.operation.action){case"rename":if(!a||a.equals(r))return{key:me(r),revision:Fe(i),deleted:!1};u.rename(r,a);break;case"setTtl":e.operation.ttlMs===null?u.persist(r):u.pexpire(r,e.operation.ttlMs);break;case"setString":de(l,"string"),u.set(r,W(e.operation.value.base64)),c>0&&u.pexpire(r,c);break;case"upsertHash":de(l,"hash"),u.hset(r,W(e.operation.field.base64),W(e.operation.value.base64));break;case"deleteHash":de(l,"hash"),u.hdel(r,W(e.operation.field.base64));break;case"pushList":de(l,"list"),e.operation.side==="left"?u.lpush(r,W(e.operation.value.base64)):u.rpush(r,W(e.operation.value.base64));break;case"setList":de(l,"list"),u.lset(r,e.operation.index,W(e.operation.value.base64));break;case"deleteList":{de(l,"list");let d=Buffer.concat([Buffer.from("db-studio:list-delete:"),ii(32)]);u.lset(r,e.operation.index,d),u.lrem(r,1,d);break}case"addSet":de(l,"set"),u.sadd(r,W(e.operation.member.base64));break;case"removeSet":de(l,"set"),u.srem(r,W(e.operation.member.base64));break;case"upsertZset":de(l,"zset"),u.zadd(r,e.operation.score,W(e.operation.member.base64));break;case"removeZset":de(l,"zset"),u.zrem(r,W(e.operation.member.base64));break;case"appendStream":de(l,"stream"),u.xadd(r,e.operation.id,...e.operation.fields.flatMap(({field:d,value:f})=>[W(d.base64),W(f.base64)]));break;case"deleteStream":de(l,"stream"),u.xdel(r,e.operation.id);break}Hr(await u.exec());let m=a&&!a.equals(r)?a:r,p=await t.callBuffer("DUMP",m);return{key:me(m),revision:p?Fe(p):null,deleted:p===null}}catch(r){throw this.wrapError(r)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async deleteKey(e){let t=null;try{t=await Nt(ae(e.db));let r=Kt(e.key);await t.watch(r);let a=await t.callBuffer("DUMP",r);if(!a)throw new D(404,{message:"Redis key no longer exists"});if(!e.force&&Fe(a)!==e.expectedRevision)throw lt();let o=t.multi().del(r);return Hr(await o.exec()),{deleted:!0}}catch(r){throw this.wrapError(r)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async getDatabasesList(){try{let e=await ue(Ue()),t=1,r=!1,a=null;try{a=await e.call("CONFIG","GET","databases")}catch(i){if(!Kr(i))throw i}if(Array.isArray(a)&&a.length>=2){let i=Number.parseInt(String(a[1]),10);Number.isFinite(i)&&i>0&&(t=i,r=!0)}let o="";try{o=await e.info("keyspace")}catch(i){if(!Kr(i))throw i}let s=Si(o);return(r?Array.from({length:t},(i,l)=>l):[Ue()]).map(i=>({name:String(i),size:`${s.get(i)??0} keys`,owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:String(Ue())}}async getDatabaseConnectionInfo(){try{let e=await ue(Ue()),[t,r]=await Promise.all([e.info("server"),e.info("clients")]),a=Pa(t),o=Pa(r),s=Number.parseInt(o.maxclients??"0",10);if(!Number.isFinite(s)||s===0){let i=await e.call("CONFIG","GET","maxclients").catch(l=>{if(!Kr(l))throw l;return null});Array.isArray(i)&&i.length>=2&&(s=Number.parseInt(String(i[1]),10)||0)}let c=e.options;return{host:c.host??null,port:c.port??null,user:c.username||"default",database:String(c.db??Ue()),version:a.redis_version??"unknown",active_connections:Number.parseInt(o.connected_clients??"0",10)||0,max_connections:s||0}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=ae(e),r=await this.getCachedCounts(t);return ct.map(a=>({tableName:a,rowCount:r[a]}))}catch(t){throw this.wrapError(t)}}async createTable(){throw new D(400,{message:"Redis tables are fixed; cannot create new ones"})}async deleteTable(e){throw new D(400,{message:"Bulk deletion of Redis tables is not supported. Use FLUSHDB from the query runner to clear the entire logical database."})}async getTableSchema({tableName:e}){let t=ve(e);return Ci[t]}async getTableColumns({tableName:e}){let t=ve(e);return xa[t]}async addColumn(e){throw new D(400,{message:Ft})}async deleteColumn(e){throw new D(400,{message:Ft})}async alterColumn(e){throw new D(400,{message:Ft})}async renameColumn(e){throw new D(400,{message:Ft})}async getTableData(e){try{let{tableName:t,db:r,cursor:a,limit:o=50,direction:s="asc",sort:c,filters:i}=e;if(s==="desc")throw new D(400,{message:ui});if(c&&c.length>0)throw new D(400,{message:li});if(i&&i.length>0)throw new D(400,{message:ci});let l=ve(t),u=jr[l],m=ae(r),p=await ue(m),d="0";if(a){let A=Ri(a);if(!A||A.type!==l)throw new D(400,{message:"Invalid or mismatched cursor"});d=A.scanCursor}let f=[],y=0,g=!1;for(;f.length<o&&y<mi;){let[A,_]=await p.scan(d,"MATCH","*","COUNT",Math.max(o*2,100),"TYPE",u);if(f.push(..._),d=A,y++,A==="0"){g=!0;break}}let E=f.slice(0,o),T=f.slice(o),S=await this.hydrateRows(p,l,E),C=await p.dbsize(),R=!g||T.length>0,w=R&&!g?wi({scanCursor:d,type:l}):null;return{data:S,meta:{limit:o,total:C,hasNextPage:R,hasPreviousPage:!1,nextCursor:w,prevCursor:null}}}catch(t){throw this.wrapError(t)}}async hydrateRows(e,t,r){if(r.length===0)return[];let a=e.pipeline();for(let i of r)a.ttl(i);let o=await a.exec()??[],s=e.pipeline();for(let i of r)switch(t){case"strings":s.get(i);break;case"hashes":s.hgetall(i);break;case"lists":s.lrange(i,0,-1);break;case"sets":s.smembers(i);break;case"zsets":s.zrange(i,0,-1,"WITHSCORES");break;case"streams":s.xinfo("STREAM",i);break}let c=await s.exec()??[];return r.map((i,l)=>{let u=o[l]?.[1]??-2,m=c[l]?.[1];if(t==="streams"){let d=Di(m);return this.normalizeRow({key:i,length:d.length,"first-id":d.firstId,"last-id":d.lastId,ttl:u})}let p;switch(t){case"strings":p=m??null;break;case"hashes":p=m;break;case"lists":case"sets":p=m;break;case"zsets":p=Ai(m);break}return this.normalizeRow({key:i,value:p,ttl:u})})}async getCachedCounts(e){let t=this.countCache.get(e);if(t&&Date.now()-t.timestamp<di)return t.counts;let r=await ue(e),a={},o=r.pipeline();for(let c of ct)o.scan("0","MATCH","*","COUNT",pi,"TYPE",jr[c]);let s=await o.exec()??[];return ct.forEach((c,i)=>{let l=s[i]?.[1];a[c]=l?.[1]?.length??0}),this.countCache.set(e,{timestamp:Date.now(),counts:a}),a}async addRecord({db:e,params:t}){try{let{tableName:r,data:a}=t,o=ve(r),s=$a(a),c=Vr(a),i=await ue(ae(e));return await this.writeRecord(i,o,s,a.value,{mode:"create",ttl:c}),this.countCache.delete(ae(e)),{insertedCount:1}}catch(r){throw this.wrapError(r)}}async updateRecords({db:e,params:t}){try{let{tableName:r,updates:a,primaryKey:o}=t,s=ve(r),c=o||"key",i=await ue(ae(e)),l=new Map;for(let m of a){let p=m.rowData[c];if(p==null)throw new D(400,{message:`Primary key "${c}" not found in row data`});let d=String(p),f=l.get(d)??{...m.rowData};f[m.columnName]=m.value,l.set(d,f)}let u=0;for(let[m,p]of l.entries()){let d=p.value,f=Vr(p);await this.writeRecord(i,s,m,d,{mode:"update",ttl:f}),u++}return{updatedCount:u}}catch(r){throw this.wrapError(r)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:r,db:a}=e;ve(t);let o=await ue(ae(a)),s=r.map(i=>String(i.value));if(s.length===0)return{deletedCount:0,fkViolation:!1,relatedRecords:[]};let c=await o.del(...s);return this.countCache.delete(ae(a)),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(t){throw this.wrapError(t)}}async forceDeleteRecords(e){return{deletedCount:(await this.deleteRecords(e)).deletedCount}}async bulkInsertRecords(e){try{let{tableName:t,records:r,db:a}=e;if(!r||r.length===0)throw new D(400,{message:"At least one record is required"});let o=ve(t),s=await ue(ae(a)),c=[],i=0;for(let l=0;l<r.length;l++){let u=r[l];try{let m=$a(u),p=Vr(u);await this.writeRecord(s,o,m,u.value,{mode:"create",ttl:p}),i++}catch(m){c.push({recordIndex:l,error:m instanceof Error?m.message:String(m)})}}return this.countCache.delete(ae(a)),{success:c.length===0,message:`Inserted ${i} of ${r.length} record${r.length===1?"":"s"}`,successCount:i,failureCount:c.length,...c.length>0?{errors:c}:{}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let r=ve(e),a=ae(t),o=await ue(a),s=jr[r],c=[],i="0";do{let[m,p]=await o.scan(i,"MATCH","*","COUNT",1e3,"TYPE",s);c.push(...p),i=m}while(i!=="0");if(c.length===0)throw new D(404,{message:`Table "${e}" has no data`});let l=await this.hydrateRows(o,r,c);return{cols:xa[r].map(m=>m.columnName),rows:l}}catch(r){throw this.wrapError(r)}}async writeRecord(e,t,r,a,o){if(t==="streams"&&o.mode==="update")throw new D(400,{message:"Streams are append-only; updating a stream record is not supported"});if(o.mode==="create")if(t==="strings"){if(await e.set(r,typeof a=="string"?a:JSON.stringify(a),"NX")===null)throw new D(409,{message:`Key "${r}" already exists`})}else{if(await e.exists(r))throw new D(409,{message:`Key "${r}" already exists`});await this.writeCollectionValue(e,t,r,a)}else if(t==="strings"){if(await e.set(r,typeof a=="string"?a:JSON.stringify(a),"XX")===null)throw new D(404,{message:`Key "${r}" does not exist`})}else{if(!await e.exists(r))throw new D(404,{message:`Key "${r}" does not exist`});await e.del(r),await this.writeCollectionValue(e,t,r,a)}o.ttl!==null&&o.ttl>0&&await e.expire(r,o.ttl)}async writeCollectionValue(e,t,r,a){switch(t){case"hashes":{let o=Oa(a,"hash"),s=[];for(let[c,i]of Object.entries(o))s.push(c,Ht(i));if(s.length===0)throw new D(400,{message:"Hash must have at least one field"});await e.hset(r,...s);return}case"lists":{let o=va(a,"list");if(o.length===0)throw new D(400,{message:"List must have at least one element"});await e.rpush(r,...o.map(Ht));return}case"sets":{let o=va(a,"set");if(o.length===0)throw new D(400,{message:"Set must have at least one member"});await e.sadd(r,...o.map(Ht));return}case"zsets":{let o=Ni(a);if(o.length===0)throw new D(400,{message:"Sorted set must have at least one member"});let s=[];for(let c of o)s.push(c.score,c.member);await e.zadd(r,...s);return}case"streams":{let o=Oa(a,"stream"),s=[];for(let[c,i]of Object.entries(o))s.push(c,Ht(i));if(s.length===0)throw new D(400,{message:"Stream entry must have at least one field"});await e.xadd(r,"*",...s);return}}}async executeQuery({query:e,db:t}){let r=performance.now();try{if(!e?.trim())throw new D(400,{message:"Query is required"});let a;try{a=Aa(e.trim())}catch(u){throw new D(400,{message:u instanceof Error?u.message:"Invalid Redis command"})}if(a.length===0)throw new D(400,{message:"Empty command"});let o=await ue(ae(t)),[s,...c]=a,i;try{i=await o.call(s,...c)}catch(u){let m=u instanceof Error?u.message:String(u);return{columns:["error"],rows:[{error:m}],rowCount:0,duration:performance.now()-r,error:m}}return{...Da(a,i),duration:performance.now()-r,message:typeof i=="string"?i:void 0}}catch(a){throw this.wrapError(a)}}}});function zr(n){if(!n.length)return{clause:"",values:[]};let e=[],t=[];for(let r of n){let a=`"${r.columnName}"`;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${r.operator} ?`),t.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(r.value));break;case"like":e.push(`CAST(${a} AS TEXT) LIKE ?`),t.push(r.value);break;case"not like":e.push(`CAST(${a} AS TEXT) NOT LIKE ?`),t.push(r.value);break;case"ilike":e.push(`CAST(${a} AS TEXT) LIKE ? COLLATE NOCASE`),t.push(r.value);break;case"not ilike":e.push(`CAST(${a} AS TEXT) NOT LIKE ? COLLATE NOCASE`),t.push(r.value);break;default:break}}return e.length?{clause:`WHERE ${e.join(" AND ")}`,values:t}:{clause:"",values:[]}}function Wr(n,e){return Array.isArray(n)?n.length?`ORDER BY ${n.map(t=>`"${t.columnName}" ${t.direction.toUpperCase()}`).join(", ")}`:"":n&&typeof n=="string"?`ORDER BY "${n}" ${e?.toUpperCase()||"ASC"}`:""}function Yr(n,e,t){let{values:r,sortColumns:a}=n;if(!a.length)return{clause:"",values:[]};let i=t==="asc"===(e==="asc")?">":"<",l=a.map(p=>`"${p}"`).join(", "),u=a.map(()=>"?").join(", "),m=a.map(p=>r[p]);return{clause:`(${l}) ${i} (${u})`,values:m}}var Ma=N(()=>{"use strict"});import{statSync as _i}from"fs";import{HTTPException as I}from"hono/http-exception";var zt,ka=N(()=>{"use strict";Re();qe();Be();Ma();zt=class extends ce{async runQuery(e,t,r){return X().prepare(t).all(...r)}quoteIdentifier(e){return`"${e}"`}mapToUniversalType(e){return Ot(e)}mapFromUniversalType(e){return{text:"TEXT",number:"INTEGER",boolean:"INTEGER",json:"TEXT",date:"TEXT",array:"TEXT",enum:"TEXT"}[e]??"TEXT"}buildTableDataQuery(e){let{tableName:t,cursor:r="",limit:a=50,direction:o="asc",sort:s=[],order:c="asc",filters:i=[]}=e,l=[],u=c;Array.isArray(s)&&s.length>0?(l=s.map(R=>R.columnName),u=s[0].direction):typeof s=="string"&&s&&(l=[s]),l.length||(l=["rowid"]);let{clause:m,values:p}=zr(i),d="",f=[];if(r){let R=this.decodeCursor(r);if(R){let w=Yr(R,o,u);d=w.clause,f=w.values}}let y="";m&&d?y=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${d}`:m?y=m:d&&(y=`WHERE ${d}`);let g=Wr((Array.isArray(s),s),c),E=g;o==="desc"?g?E=g.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):E=`ORDER BY ${l.map(R=>`"${R}" ${u==="asc"?"DESC":"ASC"}`).join(", ")}`:g||(E=`ORDER BY ${l.map(R=>`"${R}" ${u.toUpperCase()}`).join(", ")}`);let T=`SELECT * FROM "${t}" ${y} ${E} LIMIT ?`,S=[...p,...f,a+1],C=`SELECT COUNT(*) as total FROM "${t}" ${m}`;return{sql:T,values:S,countSql:C,countValues:p}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){if(!t.length)return{nextCursor:null,prevCursor:null};let{direction:a="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||(c=["rowid"]);let i=d=>{let f={values:Object.fromEntries(c.map(y=>[y,d[y]])),sortColumns:c};return this.encodeCursor(f)},l=t[0],u=t[t.length-1],m=null,p=null;return a==="asc"?(r&&(m=i(u)),s&&(p=i(l))):(s&&(m=i(u)),r&&(p=i(l))),{nextCursor:m,prevCursor:p}}async getTableData(e){try{let{tableName:t,db:r,limit:a=50,direction:o="asc",sort:s=[],order:c="asc",cursor:i,filters:l=[]}=e,u=X(),p=u.prepare(`PRAGMA table_info("${t}")`).all().filter(B=>B.pk>0).sort((B,le)=>B.pk-le.pk).map(B=>B.name),d=[],f=c;Array.isArray(s)&&s.length>0?(d=s.map(B=>B.columnName),f=s[0].direction):typeof s=="string"&&s&&(d=[s]);let y=[...d,...p.filter(B=>!d.includes(B))],g=y.length===0;g&&y.push("rowid");let{clause:E,values:T}=zr(l),S="",C=[];if(i){let B=this.decodeCursor(i);if(B){let le=Yr(B,o,f);S=le.clause,C=le.values}}let R="";E&&S?R=`WHERE ${E.replace(/^WHERE\s+/i,"")} AND ${S}`:E?R=E:S&&(R=`WHERE ${S}`);let w=Wr((Array.isArray(s),s),c),A=p.filter(B=>!d.includes(B)),_=w;if(o==="desc")if(w){if(_=w.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),A.length){let B=f==="asc"?"DESC":"ASC";_+=`, ${A.map(le=>`"${le}" ${B}`).join(", ")}`}}else _=`ORDER BY ${y.map(B=>`"${B}" ${f==="asc"?"DESC":"ASC"}`).join(", ")}`;else w?A.length&&(_+=`, ${A.map(B=>`"${B}" ${f.toUpperCase()}`).join(", ")}`):_=`ORDER BY ${y.map(B=>`"${B}" ${f.toUpperCase()}`).join(", ")}`;let x=u.prepare(`SELECT COUNT(*) as total FROM "${t}" ${E}`).get(...T),$=Number(x?.total??0),O=g?"*, rowid":"*",U=u.prepare(`SELECT ${O} FROM "${t}" ${R} ${_} LIMIT ?`).all(...T,...C,a+1),j=U.length>a,G=j?U.slice(0,a):U;o==="desc"&&(G=G.reverse());let re=B=>({values:Object.fromEntries(y.map(le=>[le,B[le]])),sortColumns:y}),J=null,Z=null;if(G.length>0){let B=G[0],le=G[G.length-1];o==="asc"?(j&&(J=this.encodeCursor(re(le))),i&&(Z=this.encodeCursor(re(B)))):(i&&(J=this.encodeCursor(re(le))),j&&(Z=this.encodeCursor(re(B))))}return{data:g?G.map(({rowid:B,...le})=>le):G,meta:{limit:a,total:$,hasNextPage:o==="asc"?j:!!i,hasPreviousPage:o==="asc"?!!i:j,nextCursor:J,prevCursor:Z}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{let t=X().prepare("PRAGMA database_list").all();if(!t.length)throw new I(500,{message:"No databases returned from SQLite"});return t.map(r=>({name:r.name,size:this.getFileSize(r.file),owner:"",encoding:"UTF-8"}))}catch(e){throw e instanceof I?e:this.wrapError(e)}}async getCurrentDatabase(){try{return{db:X().prepare("PRAGMA database_list").all().find(a=>a.name==="main")?.name??"main"}}catch(e){throw this.wrapError(e)}}async getDatabaseConnectionInfo(){try{return{host:null,port:null,user:"",database:"main",version:`SQLite ${X().prepare("SELECT sqlite_version() as version").get().version}`,active_connections:1,max_connections:1}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=X();return t.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name").all().map(a=>{let o=t.prepare(`SELECT COUNT(*) as count FROM "${a.name}"`).get();return{tableName:a.name,rowCount:o?.count??0}})}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){let{tableName:r,fields:a,foreignKeys:o}=e,s=X(),c=a.map(l=>{if(l.isPrimaryKey&&l.isIdentity)return`"${l.columnName}" INTEGER PRIMARY KEY AUTOINCREMENT`;let u=`"${l.columnName}" ${l.columnType}`;return l.isPrimaryKey&&(u+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(u+=" UNIQUE"),!l.isNullable&&!l.isPrimaryKey&&(u+=" NOT NULL"),l.defaultValue?.trim()&&!l.isIdentity&&(u+=` DEFAULT ${l.defaultValue.trim()}`),u}),i=o?.map(l=>`FOREIGN KEY ("${l.columnName}") REFERENCES "${l.referencedTable}" ("${l.referencedColumn}") ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`)??[];s.prepare(`CREATE TABLE "${r}" (${[...c,...i].join(", ")})`).run()}async deleteTable(e){let{tableName:t,cascade:r}=e,a=X();if(!a.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});let c=a.prepare(`SELECT COUNT(*) as count FROM "${t}"`).get()?.count??0;if(!r&&this.getFkReferencesForTable(a,t).length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:this.getRelatedRecordsForTable(a,t)};try{return a.prepare(`DROP TABLE "${t}"`).run(),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(i){if((i instanceof Error?i.message:String(i)).includes("FOREIGN KEY constraint"))return{deletedCount:0,fkViolation:!0,relatedRecords:this.getRelatedRecordsForTable(a,t)};throw i instanceof I?i:new I(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){try{let a=X().prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name=?").get(e);if(!a)throw new I(404,{message:`Table "${e}" does not exist`});return a.sql}catch(r){throw r instanceof I?r:this.wrapError(r)}}async getTableColumns({tableName:e,db:t}){try{let r=X();if(!r.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(e))throw new I(404,{message:`Table "${e}" does not exist`});let o=r.prepare(`PRAGMA table_info("${e}")`).all(),s=r.prepare(`PRAGMA foreign_key_list("${e}")`).all(),c=new Map;for(let i of s)c.set(i.from,i);return o.map(i=>{let l=c.get(i.name),u=i.type.toLowerCase();return{columnName:i.name,dataType:Ot(u),dataTypeLabel:br(u),isNullable:i.notnull===0&&i.pk===0,columnDefault:i.dflt_value,isPrimaryKey:i.pk>0,isForeignKey:c.has(i.name),referencedTable:l?.table??null,referencedColumn:l?.to??null,enumValues:null}})}catch(r){throw r instanceof I?r:this.wrapError(r)}}async addColumn(e){let{tableName:t,columnName:r,columnType:a,defaultValue:o,isNullable:s,isUnique:c,db:i}=e,l=X();if(!l.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});if(l.prepare(`PRAGMA table_info("${t}")`).all().some(d=>d.name===r))throw new I(409,{message:`Column "${r}" already exists in table "${t}"`});let p=`"${r}" ${a}`;c&&(p+=" UNIQUE"),s||(p+=" NOT NULL"),o?.trim()&&(p+=` DEFAULT ${o.trim()}`);try{l.prepare(`ALTER TABLE "${t}" ADD COLUMN ${p}`).run()}catch(d){throw this.wrapError(d)}}async deleteColumn(e){let{tableName:t,columnName:r,db:a}=e,o=X();if(!o.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});if(!o.prepare(`PRAGMA table_info("${t}")`).all().some(i=>i.name===r))throw new I(404,{message:`Column "${r}" does not exist in table "${t}"`});try{o.prepare(`ALTER TABLE "${t}" DROP COLUMN "${r}"`).run()}catch(i){throw this.wrapError(i)}return{deletedCount:1}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,isNullable:o,defaultValue:s,db:c}=e,i=X();if(!i.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});let u=i.prepare(`PRAGMA table_info("${t}")`).all();if(!u.some(w=>w.name===r))throw new I(404,{message:`Column "${r}" does not exist in table "${t}"`});let m=u.filter(w=>w.pk>0).sort((w,A)=>w.pk-A.pk),p=m.length>1,d=u.map(w=>{let A=w.name===r,_=A?a:w.type,x=A?o:w.notnull===0,$=A?s?.trim()||null:w.dflt_value,O=w.pk>0,U=`"${w.name}" ${_}`;return!p&&O&&(U+=" PRIMARY KEY"),!O&&!x&&(U+=" NOT NULL"),$&&(U+=` DEFAULT ${$}`),U});p&&d.push(`PRIMARY KEY (${m.map(w=>`"${w.name}"`).join(", ")})`);let f=i.prepare(`PRAGMA foreign_key_list("${t}")`).all(),y=new Map;for(let w of f){let A=y.get(w.id)??[];A.push(w),y.set(w.id,A)}let g=Array.from(y.values()).map(w=>{let A=w.map(U=>`"${U.from}"`).join(", "),_=w.map(U=>`"${U.to}"`).join(", "),{table:x,on_update:$,on_delete:O}=w[0];return`FOREIGN KEY (${A}) REFERENCES "${x}" (${_}) ON UPDATE ${$} ON DELETE ${O}`}),E=u.map(w=>`"${w.name}"`).join(", "),T=`${t}_alter_${Date.now()}`,S=i.prepare("SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name=? AND sql IS NOT NULL").all(t),C=i.prepare("SELECT sql FROM sqlite_master WHERE type='trigger' AND tbl_name=?").all(t);i.pragma("foreign_keys = OFF");let R=i.transaction(()=>{i.prepare(`CREATE TABLE "${T}" (${[...d,...g].join(", ")})`).run(),i.prepare(`INSERT INTO "${T}" (${E}) SELECT ${E} FROM "${t}"`).run(),i.prepare(`DROP TABLE "${t}"`).run(),i.prepare(`ALTER TABLE "${T}" RENAME TO "${t}"`).run()});try{R();for(let{sql:w}of S)i.prepare(w).run();for(let{sql:w}of C)i.prepare(w).run()}catch(w){throw w instanceof I?w:this.wrapError(w)}finally{i.pragma("foreign_keys = ON")}}async renameColumn(e){let{tableName:t,columnName:r,newColumnName:a,db:o}=e,s=X();if(!s.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});let i=s.prepare(`PRAGMA table_info("${t}")`).all();if(!i.some(l=>l.name===r))throw new I(404,{message:`Column "${r}" does not exist in table "${t}"`});if(i.some(l=>l.name===a))throw new I(409,{message:`Column "${a}" already exists in table "${t}"`});try{s.prepare(`ALTER TABLE "${t}" RENAME COLUMN "${r}" TO "${a}"`).run()}catch(l){throw this.wrapError(l)}}async addRecord({params:e}){let{tableName:t,data:r}=e,a=X(),o=Object.keys(r);if(!o.length)throw new I(400,{message:"No data provided for insert"});let s=Object.values(r).map(l=>l!==null&&typeof l=="object"?JSON.stringify(l):l),c=o.map(l=>`"${l}"`).join(", "),i=o.map(()=>"?").join(", ");try{let l=a.prepare(`INSERT INTO "${t}" (${c}) VALUES (${i})`).run(...s);if(l.changes===0)throw new I(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:l.changes}}catch(l){throw this.wrapError(l)}}async updateRecords({db:e,params:t}){let{tableName:r,updates:a,primaryKey:o}=t,s=X(),c=new Map;for(let l of a){let u=l.rowData[o];if(u==null)throw new I(400,{message:`Primary key "${o}" not found in row data.`});c.has(u)||c.set(u,[]),c.get(u)?.push({columnName:l.columnName,value:l.value})}let i=s.transaction(()=>{let l=0;for(let[u,m]of c.entries()){let p=m.map(y=>`"${y.columnName}" = ?`).join(", "),d=[...m.map(y=>y.value!==null&&typeof y.value=="object"?JSON.stringify(y.value):y.value),u],f=s.prepare(`UPDATE "${r}" SET ${p} WHERE "${o}" = ?`).run(...d);if(f.changes===0)throw new I(404,{message:`Record with ${o} = ${u} not found in table "${r}"`});l+=f.changes}return l});try{return{updatedCount:i()}}catch(l){throw l instanceof I?l:this.wrapError(l)}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=X(),o=t[0]?.columnName;if(!o)throw new I(400,{message:"Primary key column name is required"});let s=t.map(l=>l.value),c=s.map(()=>"?").join(", "),i=a.transaction(()=>a.prepare(`DELETE FROM "${e}" WHERE "${o}" IN (${c})`).run(...s).changes);try{return{deletedCount:i(),fkViolation:!1,relatedRecords:[]}}catch(l){if((l instanceof Error?l.message:String(l)).includes("FOREIGN KEY constraint failed"))return{deletedCount:0,fkViolation:!0,relatedRecords:this.getRelatedRecords(a,e,t)};throw this.wrapError(l)}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=X(),o=t[0]?.columnName;if(!o)throw new I(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value);a.pragma("foreign_keys = OFF");let c=a.transaction(()=>{let i=this.getFkReferencesForTable(a,e),l=0;for(let p of i){let d=s.map(()=>"?").join(", "),f=a.prepare(`DELETE FROM "${p.referencingTable}" WHERE "${p.referencingColumn}" IN (${d})`).run(...s);l+=f.changes}let u=s.map(()=>"?").join(", ");return a.prepare(`DELETE FROM "${e}" WHERE "${o}" IN (${u})`).run(...s).changes+l});try{return{deletedCount:c()}}catch(i){throw i instanceof I?i:this.wrapError(i)}finally{a.pragma("foreign_keys = ON")}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t?.length)throw new I(400,{message:"At least one record is required"});let a=X(),o=Object.keys(t[0]),s=o.map(u=>`"${u}"`).join(", "),c=o.map(()=>"?").join(", "),i=a.prepare(`INSERT INTO "${e}" (${s}) VALUES (${c})`),l=a.transaction(u=>{let m=0;for(let p of u){let d=o.map(f=>{let y=p[f];return y!==null&&typeof y=="object"?JSON.stringify(y):y});i.run(...d),m++}return m});try{let u=l(t);return{success:!0,message:`Bulk insert completed: ${u} records inserted`,successCount:u,failureCount:0}}catch(u){throw u instanceof I?u:this.wrapError(u)}}async executeQuery({query:e,db:t}){let r=X();if(!e?.trim())throw new I(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now();try{let s=r.prepare(a);if(s.reader){let l=s.all(),u=performance.now()-o;return{columns:l.length>0?Object.keys(l[0]):[],rows:l,rowCount:l.length,duration:u,message:l.length===0?"OK":void 0}}let c=s.run(),i=performance.now()-o;return{columns:[],rows:[],rowCount:c.changes,duration:i,message:`OK (${c.changes} rows affected)`}}catch(s){throw this.wrapError(s)}}getFileSize(e){if(!e)return"in-memory";try{let r=_i(e).size;return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}catch{return"N/A"}}getFkReferencesForTable(e,t){let r=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all(),a=[];for(let o of r){if(o.name===t)continue;let s=e.prepare(`PRAGMA foreign_key_list("${o.name}")`).all();for(let c of s)c.table===t&&a.push({constraintName:`fk_${o.name}_${c.from}_${t}_${c.to}`,referencingTable:o.name,referencingColumn:c.from,referencedTable:t,referencedColumn:c.to})}return a}getRelatedRecordsForTable(e,t){let r=this.getFkReferencesForTable(e,t);if(!r.length)return[];let a=[];for(let o of r){let s=e.prepare(`SELECT * FROM "${o.referencingTable}" LIMIT 100`).all();s.length>0&&a.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:s})}return a}getRelatedRecords(e,t,r){let a=this.getFkReferencesForTable(e,t);if(!a.length)return[];let o=[];for(let s of a){if(!r.find(m=>m.columnName===s.referencedColumn))continue;let i=r.map(m=>m.value),l=i.map(()=>"?").join(", "),u=e.prepare(`SELECT * FROM "${s.referencingTable}" WHERE "${s.referencingColumn}" IN (${l}) LIMIT 100`).all(...i);u.length>0&&o.push({tableName:s.referencingTable,columnName:s.referencingColumn,constraintName:s.constraintName,records:u})}return o}}});function Ia(){pe.register("pg",new Bt),pe.register("mysql",new Ut),pe.register("mssql",new It),pe.register("mongodb",new Dt),pe.register("sqlite",new zt),pe.register("redis",new Vt)}var qa=N(()=>{"use strict";Pe();$n();ya();ha();Ea();La();ka()});import{HTTPException as xi}from"hono/http-exception";import{DatabaseError as Pi}from"pg";import{ZodError as $i}from"zod";function Ua(n,e){if(n instanceof xi)return e.json({error:n.message??"Internal server error"},n.status);if(n instanceof $i){let t=n.issues[0];return e.json({error:"Validation error",details:t.message},400)}if(n instanceof Error){let t=n;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||n.message.includes("ECONNREFUSED")||n.message.includes("connection refused")||n.message.includes("timeout expired")||n.message.includes("Connection terminated")||n.message.includes("MongoNetworkError")||n.message.includes("MongoServerSelectionError")||n instanceof Pi&&n.code?.startsWith("08"))return e.json({error:"Database connection failed",details:n.message},503)}return e.json({error:n instanceof Error?n.message:"Internal server error"},500)}var Ba=N(()=>{"use strict"});function ja(n){let e=n.dbType.toLowerCase(),t=n.dbType==="pg"?"PostgreSQL":n.dbType;return e.includes("mongo")?`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
289
+ -- Backed by: XINFO STREAM / XADD / EXPIRE (read-only \u2014 streams are append-only)`},Vt=class extends ue{countCache=new Map;runQuery(){throw new D(501,{message:"runQuery is not supported for Redis"})}buildTableDataQuery(e){throw new D(501,{message:"buildTableDataQuery is not supported for Redis"})}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(){return{nextCursor:null,prevCursor:null}}quoteIdentifier(e){return e}mapToUniversalType(e){switch(e.toLowerCase()){case"string":return"text";case"hash":return"json";case"list":case"set":return"array";case"zset":case"stream":return"json";case"integer":case"number":case"ttl":return"number";default:return"text"}}mapFromUniversalType(e){return"string"}async scanKeys(e){try{let{db:t,limit:r,search:a,exactPattern:o,type:s,cursor:c}=e,i=oe(t),l=await me(i),u="0";if(c){let T=_i(c);if(!T||T.search!==a||T.exactPattern!==o||T.type!==s)throw new D(400,{message:"Invalid or stale key scan cursor"});u=T.scanCursor}let m=a?o?a:`*${Pi(a)}*`:"*",d=[u,"MATCH",m,"COUNT",r];s&&d.push("TYPE",s);let[p,f]=await l.scanBuffer(...d),y=Buffer.isBuffer(p)?p.toString("utf8"):p,h=l.pipeline();for(let T of f)h.call("TYPE",T),h.pttl(T),h.call("MEMORY","USAGE",T);let E=await h.exec()??[];return{keys:f.map((T,C)=>{let S=C*3,R=E[S+2]?.[1];return{key:de(T),type:jt(E[S]?.[1]),ttlMs:Number(E[S+1]?.[1]??-2),memoryBytes:R==null?null:Number(R)}}),nextCursor:y==="0"?null:Di({scanCursor:y,search:a,exactPattern:o,type:s}),hasMore:y!=="0"}}catch(t){throw this.wrapError(t)}}async getKeyDetails(e){try{let{db:t,key:r,cursor:a,limit:o,full:s,direction:c}=e,i=Kt(r),l=await me(oe(t)),[u,m,d,p]=await Promise.all([l.callBuffer("TYPE",i),l.pttl(i),l.call("MEMORY","USAGE",i).catch(()=>null),l.callBuffer("DUMP",i)]),f=p;if(!f)throw new D(404,{message:"Redis key no longer exists"});let y=jt(u),h={key:de(i),type:y,ttlMs:Number(m),memoryBytes:d===null?null:Number(d),revision:Fe(f)},E=a?xi(a):null;if(a&&(!E||E.key!==r||E.type!==y||E.direction!==c))throw new D(400,{message:"Invalid or stale key details cursor"});if(y==="string"){let T=await l.strlen(i),C=s?Ni:Ci,S=await l.getrangeBuffer(i,0,C-1);return{...h,length:T,value:{kind:"string",value:de(S),truncated:T>C},nextCursor:null,hasMore:!1}}if(y==="hash"){let[T,C]=await Promise.all([l.hlen(i),l.hscanBuffer(i,E?.cursor??"0","COUNT",String(o))]),[S,R]=C,w=Buffer.isBuffer(S)?S.toString("utf8"):S,A=[];for(let _=0;_<R.length;_+=2)A.push({field:de(R[_]),value:de(R[_+1])});return{...h,length:T,value:{kind:"hash",entries:A},nextCursor:w==="0"?null:it({key:r,type:y,cursor:w,direction:c}),hasMore:w!=="0"}}if(y==="list"){let T=Number.parseInt(E?.cursor??"0",10),C=await l.llen(i),S=await l.lrangeBuffer(i,T,T+o-1),R=T+S.length,w=R<C;return{...h,length:C,value:{kind:"list",entries:S.map((A,_)=>({index:T+_,value:de(A)}))},nextCursor:w?it({key:r,type:y,cursor:String(R),direction:c}):null,hasMore:w}}if(y==="set"){let[T,C]=await Promise.all([l.scard(i),l.sscanBuffer(i,E?.cursor??"0","COUNT",String(o))]),[S,R]=C,w=Buffer.isBuffer(S)?S.toString("utf8"):S;return{...h,length:T,value:{kind:"set",members:R.map(de)},nextCursor:w==="0"?null:it({key:r,type:y,cursor:w,direction:c}),hasMore:w!=="0"}}if(y==="zset"){let[T,C]=await Promise.all([l.zcard(i),l.zscanBuffer(i,E?.cursor??"0","COUNT",String(o))]),[S,R]=C,w=Buffer.isBuffer(S)?S.toString("utf8"):S,A=[];for(let _=0;_<R.length;_+=2)A.push({member:de(R[_]),score:(()=>{let x=R[_+1].toString("utf8");return x==="inf"?"inf":x==="-inf"?"-inf":Number(x)})()});return{...h,length:T,value:{kind:"zset",entries:A},nextCursor:w==="0"?null:it({key:r,type:y,cursor:w,direction:c}),hasMore:w!=="0"}}if(y==="stream"){let T=E?.cursor??(c==="forward"?"-":"+"),[C,S]=await Promise.all([l.xlen(i),c==="forward"?l.xrangeBuffer(i,T,"+","COUNT",o+1):l.xrevrangeBuffer(i,T,"-","COUNT",o+1)]),R=S.length>o,A=S.slice(0,o).map(([x,k])=>{let $=[];for(let U=0;U<k.length;U+=2)$.push({field:de(k[U]),value:de(k[U+1])});return{id:x.toString("utf8"),fields:$}}),_=A.at(-1)?.id;return{...h,length:C,value:{kind:"stream",entries:A},nextCursor:R&&_?it({key:r,type:y,cursor:`(${_}`,direction:c}):null,hasMore:R}}return{...h,length:null,value:{kind:"unknown"},nextCursor:null,hasMore:!1}}catch(t){throw this.wrapError(t)}}async getStringChunk(e){try{let t=await me(oe(e.db)),r=Kt(e.key),a=jt(await t.callBuffer("TYPE",r));if(a==="unknown")throw new D(404,{message:"Redis key no longer exists"});if(pe(a,"string"),e.expectedRevision){let i=await t.callBuffer("DUMP",r);if(!i||Fe(i)!==e.expectedRevision)throw lt()}let o=await t.strlen(r),s=await t.getrangeBuffer(r,e.offset,e.offset+e.limit-1),c=e.offset+s.length;return{chunk:de(s),length:o,nextOffset:c<o?c:null,hasMore:c<o}}catch(t){throw this.wrapError(t)}}async createKey(e){let t=null;try{t=await Nt(oe(e.db));let r=W(e.key.base64);if(await t.watch(r),await t.exists(r)!==0)throw new D(409,{message:"A Redis key with this name already exists."});if(e.type!==e.value.kind)throw new D(400,{message:"The initial value does not match the selected Redis key type."});let a=t.multi();switch(e.value.kind){case"string":a.set(r,W(e.value.value.base64));break;case"hash":a.hset(r,...e.value.entries.flatMap(({field:s,value:c})=>[W(s.base64),W(c.base64)]));break;case"list":a.rpush(r,...e.value.entries.map(s=>W(s.base64)));break;case"set":a.sadd(r,...e.value.members.map(s=>W(s.base64)));break;case"zset":a.zadd(r,...e.value.entries.flatMap(({member:s,score:c})=>[c,W(s.base64)]));break;case"stream":a.xadd(r,e.value.id,...e.value.fields.flatMap(({field:s,value:c})=>[W(s.base64),W(c.base64)]));break}e.ttlMs!==null&&a.pexpire(r,e.ttlMs),Yr(await a.exec());let o=await t.callBuffer("DUMP",r);if(!o)throw lt();return{key:de(r),revision:Fe(o),deleted:!1}}catch(r){throw this.wrapError(r)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async applyKeyAction(e){let t=null;try{t=await Nt(oe(e.db));let r=Kt(e.key),a=e.operation.action==="rename"?W(e.operation.newKey.base64):null;a&&!a.equals(r)?await t.watch(r,a):await t.watch(r);let[o,s,c]=await Promise.all([t.callBuffer("DUMP",r),t.callBuffer("TYPE",r),t.pttl(r)]),i=o;if(!i)throw new D(404,{message:"Redis key no longer exists"});if(!e.force&&Fe(i)!==e.expectedRevision)throw lt();let l=jt(s);if(a&&!a.equals(r)&&await t.exists(a)!==0)throw new D(409,{message:"A Redis key with the new name already exists."});let u=t.multi();switch(e.operation.action){case"rename":if(!a||a.equals(r))return{key:de(r),revision:Fe(i),deleted:!1};u.rename(r,a);break;case"setTtl":e.operation.ttlMs===null?u.persist(r):u.pexpire(r,e.operation.ttlMs);break;case"setString":pe(l,"string"),u.set(r,W(e.operation.value.base64)),c>0&&u.pexpire(r,c);break;case"upsertHash":pe(l,"hash"),u.hset(r,W(e.operation.field.base64),W(e.operation.value.base64));break;case"deleteHash":pe(l,"hash"),u.hdel(r,W(e.operation.field.base64));break;case"pushList":pe(l,"list"),e.operation.side==="left"?u.lpush(r,W(e.operation.value.base64)):u.rpush(r,W(e.operation.value.base64));break;case"setList":pe(l,"list"),u.lset(r,e.operation.index,W(e.operation.value.base64));break;case"deleteList":{pe(l,"list");let p=Buffer.concat([Buffer.from("db-studio:list-delete:"),hi(32)]);u.lset(r,e.operation.index,p),u.lrem(r,1,p);break}case"addSet":pe(l,"set"),u.sadd(r,W(e.operation.member.base64));break;case"removeSet":pe(l,"set"),u.srem(r,W(e.operation.member.base64));break;case"upsertZset":pe(l,"zset"),u.zadd(r,e.operation.score,W(e.operation.member.base64));break;case"removeZset":pe(l,"zset"),u.zrem(r,W(e.operation.member.base64));break;case"appendStream":pe(l,"stream"),u.xadd(r,e.operation.id,...e.operation.fields.flatMap(({field:p,value:f})=>[W(p.base64),W(f.base64)]));break;case"deleteStream":pe(l,"stream"),u.xdel(r,e.operation.id);break}Yr(await u.exec());let m=a&&!a.equals(r)?a:r,d=await t.callBuffer("DUMP",m);return{key:de(m),revision:d?Fe(d):null,deleted:d===null}}catch(r){throw this.wrapError(r)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async deleteKey(e){let t=null;try{t=await Nt(oe(e.db));let r=Kt(e.key);await t.watch(r);let a=await t.callBuffer("DUMP",r);if(!a)throw new D(404,{message:"Redis key no longer exists"});if(!e.force&&Fe(a)!==e.expectedRevision)throw lt();let o=t.multi().del(r);return Yr(await o.exec()),{deleted:!0}}catch(r){throw this.wrapError(r)}finally{t&&await t.quit().catch(()=>t?.disconnect())}}async getDatabasesList(){try{let e=await me(Ue()),t=1,r=!1,a=null;try{a=await e.call("CONFIG","GET","databases")}catch(i){if(!Wr(i))throw i}if(Array.isArray(a)&&a.length>=2){let i=Number.parseInt(String(a[1]),10);Number.isFinite(i)&&i>0&&(t=i,r=!0)}let o="";try{o=await e.info("keyspace")}catch(i){if(!Wr(i))throw i}let s=Oi(o);return(r?Array.from({length:t},(i,l)=>l):[Ue()]).map(i=>({name:String(i),size:`${s.get(i)??0} keys`,owner:"n/a",encoding:"n/a"}))}catch(e){throw this.wrapError(e)}}async getCurrentDatabase(){return{db:String(Ue())}}async getDatabaseConnectionInfo(){try{let e=await me(Ue()),[t,r]=await Promise.all([e.info("server"),e.info("clients")]),a=Ma(t),o=Ma(r),s=Number.parseInt(o.maxclients??"0",10);if(!Number.isFinite(s)||s===0){let i=await e.call("CONFIG","GET","maxclients").catch(l=>{if(!Wr(l))throw l;return null});Array.isArray(i)&&i.length>=2&&(s=Number.parseInt(String(i[1]),10)||0)}let c=e.options;return{host:c.host??null,port:c.port??null,user:c.username||"default",database:String(c.db??Ue()),version:a.redis_version??"unknown",active_connections:Number.parseInt(o.connected_clients??"0",10)||0,max_connections:s||0}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=oe(e),r=await this.getCachedCounts(t);return ct.map(a=>({tableName:a,rowCount:r[a]}))}catch(t){throw this.wrapError(t)}}async createTable(){throw new D(400,{message:"Redis tables are fixed; cannot create new ones"})}async deleteTable(e){throw new D(400,{message:"Bulk deletion of Redis tables is not supported. Use FLUSHDB from the query runner to clear the entire logical database."})}async getTableSchema({tableName:e}){let t=ve(e);return vi[t]}async getTableColumns({tableName:e}){let t=ve(e);return La[t]}async addColumn(e){throw new D(400,{message:Ft})}async deleteColumn(e){throw new D(400,{message:Ft})}async alterColumn(e){throw new D(400,{message:Ft})}async renameColumn(e){throw new D(400,{message:Ft})}async getTableData(e){try{let{tableName:t,db:r,cursor:a,limit:o=50,direction:s="asc",sort:c,filters:i}=e;if(s==="desc")throw new D(400,{message:Ei});if(c&&c.length>0)throw new D(400,{message:gi});if(i&&i.length>0)throw new D(400,{message:Ti});let l=ve(t),u=zr[l],m=oe(r),d=await me(m),p="0";if(a){let A=$i(a);if(!A||A.type!==l)throw new D(400,{message:"Invalid or mismatched cursor"});p=A.scanCursor}let f=[],y=0,h=!1;for(;f.length<o&&y<wi;){let[A,_]=await d.scan(p,"MATCH","*","COUNT",Math.max(o*2,100),"TYPE",u);if(f.push(..._),p=A,y++,A==="0"){h=!0;break}}let E=f.slice(0,o),T=f.slice(o),C=await this.hydrateRows(d,l,E),S=await d.dbsize(),R=!h||T.length>0,w=R&&!h?ki({scanCursor:p,type:l}):null;return{data:C,meta:{limit:o,total:S,hasNextPage:R,hasPreviousPage:!1,nextCursor:w,prevCursor:null}}}catch(t){throw this.wrapError(t)}}async hydrateRows(e,t,r){if(r.length===0)return[];let a=e.pipeline();for(let i of r)a.ttl(i);let o=await a.exec()??[],s=e.pipeline();for(let i of r)switch(t){case"strings":s.get(i);break;case"hashes":s.hgetall(i);break;case"lists":s.lrange(i,0,-1);break;case"sets":s.smembers(i);break;case"zsets":s.zrange(i,0,-1,"WITHSCORES");break;case"streams":s.xinfo("STREAM",i);break}let c=await s.exec()??[];return r.map((i,l)=>{let u=o[l]?.[1]??-2,m=c[l]?.[1];if(t==="streams"){let p=Ii(m);return this.normalizeRow({key:i,length:p.length,"first-id":p.firstId,"last-id":p.lastId,ttl:u})}let d;switch(t){case"strings":d=m??null;break;case"hashes":d=m;break;case"lists":case"sets":d=m;break;case"zsets":d=Mi(m);break}return this.normalizeRow({key:i,value:d,ttl:u})})}async getCachedCounts(e){let t=this.countCache.get(e);if(t&&Date.now()-t.timestamp<Ri)return t.counts;let r=await me(e),a={},o=r.pipeline();for(let c of ct)o.scan("0","MATCH","*","COUNT",Si,"TYPE",zr[c]);let s=await o.exec()??[];return ct.forEach((c,i)=>{let l=s[i]?.[1];a[c]=l?.[1]?.length??0}),this.countCache.set(e,{timestamp:Date.now(),counts:a}),a}async addRecord({db:e,params:t}){try{let{tableName:r,data:a}=t,o=ve(r),s=Ia(a),c=Gr(a),i=await me(oe(e));return await this.writeRecord(i,o,s,a.value,{mode:"create",ttl:c}),this.countCache.delete(oe(e)),{insertedCount:1}}catch(r){throw this.wrapError(r)}}async updateRecords({db:e,params:t}){try{let{tableName:r,updates:a,primaryKey:o}=t,s=ve(r),c=o||"key",i=await me(oe(e)),l=new Map;for(let m of a){let d=m.rowData[c];if(d==null)throw new D(400,{message:`Primary key "${c}" not found in row data`});let p=String(d),f=l.get(p)??{...m.rowData};f[m.columnName]=m.value,l.set(p,f)}let u=0;for(let[m,d]of l.entries()){let p=d.value,f=Gr(d);await this.writeRecord(i,s,m,p,{mode:"update",ttl:f}),u++}return{updatedCount:u}}catch(r){throw this.wrapError(r)}}async deleteRecords(e){try{let{tableName:t,primaryKeys:r,db:a}=e;ve(t);let o=await me(oe(a)),s=r.map(i=>String(i.value));if(s.length===0)return{deletedCount:0,fkViolation:!1,relatedRecords:[]};let c=await o.del(...s);return this.countCache.delete(oe(a)),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(t){throw this.wrapError(t)}}async forceDeleteRecords(e){return{deletedCount:(await this.deleteRecords(e)).deletedCount}}async bulkInsertRecords(e){try{let{tableName:t,records:r,db:a}=e;if(!r||r.length===0)throw new D(400,{message:"At least one record is required"});let o=ve(t),s=await me(oe(a)),c=[],i=0;for(let l=0;l<r.length;l++){let u=r[l];try{let m=Ia(u),d=Gr(u);await this.writeRecord(s,o,m,u.value,{mode:"create",ttl:d}),i++}catch(m){c.push({recordIndex:l,error:m instanceof Error?m.message:String(m)})}}return this.countCache.delete(oe(a)),{success:c.length===0,message:`Inserted ${i} of ${r.length} record${r.length===1?"":"s"}`,successCount:i,failureCount:c.length,...c.length>0?{errors:c}:{}}}catch(t){throw this.wrapError(t)}}async exportTableData({tableName:e,db:t}){try{let r=ve(e),a=oe(t),o=await me(a),s=zr[r],c=[],i="0";do{let[m,d]=await o.scan(i,"MATCH","*","COUNT",1e3,"TYPE",s);c.push(...d),i=m}while(i!=="0");if(c.length===0)throw new D(404,{message:`Table "${e}" has no data`});let l=await this.hydrateRows(o,r,c);return{cols:La[r].map(m=>m.columnName),rows:l}}catch(r){throw this.wrapError(r)}}async writeRecord(e,t,r,a,o){if(t==="streams"&&o.mode==="update")throw new D(400,{message:"Streams are append-only; updating a stream record is not supported"});if(o.mode==="create")if(t==="strings"){if(await e.set(r,typeof a=="string"?a:JSON.stringify(a),"NX")===null)throw new D(409,{message:`Key "${r}" already exists`})}else{if(await e.exists(r))throw new D(409,{message:`Key "${r}" already exists`});await this.writeCollectionValue(e,t,r,a)}else if(t==="strings"){if(await e.set(r,typeof a=="string"?a:JSON.stringify(a),"XX")===null)throw new D(404,{message:`Key "${r}" does not exist`})}else{if(!await e.exists(r))throw new D(404,{message:`Key "${r}" does not exist`});await e.del(r),await this.writeCollectionValue(e,t,r,a)}o.ttl!==null&&o.ttl>0&&await e.expire(r,o.ttl)}async writeCollectionValue(e,t,r,a){switch(t){case"hashes":{let o=qa(a,"hash"),s=[];for(let[c,i]of Object.entries(o))s.push(c,Ht(i));if(s.length===0)throw new D(400,{message:"Hash must have at least one field"});await e.hset(r,...s);return}case"lists":{let o=Ua(a,"list");if(o.length===0)throw new D(400,{message:"List must have at least one element"});await e.rpush(r,...o.map(Ht));return}case"sets":{let o=Ua(a,"set");if(o.length===0)throw new D(400,{message:"Set must have at least one member"});await e.sadd(r,...o.map(Ht));return}case"zsets":{let o=Li(a);if(o.length===0)throw new D(400,{message:"Sorted set must have at least one member"});let s=[];for(let c of o)s.push(c.score,c.member);await e.zadd(r,...s);return}case"streams":{let o=qa(a,"stream"),s=[];for(let[c,i]of Object.entries(o))s.push(c,Ht(i));if(s.length===0)throw new D(400,{message:"Stream entry must have at least one field"});await e.xadd(r,"*",...s);return}}}async executeQuery({query:e,db:t}){let r=performance.now();try{if(!e?.trim())throw new D(400,{message:"Query is required"});let a;try{a=$a(e.trim())}catch(u){throw new D(400,{message:u instanceof Error?u.message:"Invalid Redis command"})}if(a.length===0)throw new D(400,{message:"Empty command"});let o=await me(oe(t)),[s,...c]=a,i;try{i=await o.call(s,...c)}catch(u){let m=u instanceof Error?u.message:String(u);return{columns:["error"],rows:[{error:m}],rowCount:0,duration:performance.now()-r,error:m}}return{...va(a,i),duration:performance.now()-r,message:typeof i=="string"?i:void 0}}catch(a){throw this.wrapError(a)}}}});function Qr(n){if(!n.length)return{clause:"",values:[]};let e=[],t=[];for(let r of n){let a=`"${r.columnName}"`;switch(r.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${a} ${r.operator} ?`),t.push(r.value);break;case"is":r.value.toLowerCase()==="null"?e.push(`${a} IS NULL`):(e.push(`${a} = ?`),t.push(r.value));break;case"is not":r.value.toLowerCase()==="null"?e.push(`${a} IS NOT NULL`):(e.push(`${a} != ?`),t.push(r.value));break;case"like":e.push(`CAST(${a} AS TEXT) LIKE ?`),t.push(r.value);break;case"not like":e.push(`CAST(${a} AS TEXT) NOT LIKE ?`),t.push(r.value);break;case"ilike":e.push(`CAST(${a} AS TEXT) LIKE ? COLLATE NOCASE`),t.push(r.value);break;case"not ilike":e.push(`CAST(${a} AS TEXT) NOT LIKE ? COLLATE NOCASE`),t.push(r.value);break;default:break}}return e.length?{clause:`WHERE ${e.join(" AND ")}`,values:t}:{clause:"",values:[]}}function Jr(n,e){return Array.isArray(n)?n.length?`ORDER BY ${n.map(t=>`"${t.columnName}" ${t.direction.toUpperCase()}`).join(", ")}`:"":n&&typeof n=="string"?`ORDER BY "${n}" ${e?.toUpperCase()||"ASC"}`:""}function Xr(n,e,t){let{values:r,sortColumns:a}=n;if(!a.length)return{clause:"",values:[]};let i=t==="asc"===(e==="asc")?">":"<",l=a.map(d=>`"${d}"`).join(", "),u=a.map(()=>"?").join(", "),m=a.map(d=>r[d]);return{clause:`(${l}) ${i} (${u})`,values:m}}var Fa=N(()=>{"use strict"});import{statSync as qi}from"fs";import{HTTPException as I}from"hono/http-exception";var zt,ja=N(()=>{"use strict";Re();qe();Be();Fa();zt=class extends ue{async runQuery(e,t,r){return X().prepare(t).all(...r)}quoteIdentifier(e){return`"${e}"`}mapToUniversalType(e){return $t(e)}mapFromUniversalType(e){return{text:"TEXT",number:"INTEGER",boolean:"INTEGER",json:"TEXT",date:"TEXT",array:"TEXT",enum:"TEXT"}[e]??"TEXT"}buildTableDataQuery(e){let{tableName:t,cursor:r="",limit:a=50,direction:o="asc",sort:s=[],order:c="asc",filters:i=[]}=e,l=[],u=c;Array.isArray(s)&&s.length>0?(l=s.map(R=>R.columnName),u=s[0].direction):typeof s=="string"&&s&&(l=[s]),l.length||(l=["rowid"]);let{clause:m,values:d}=Qr(i),p="",f=[];if(r){let R=this.decodeCursor(r);if(R){let w=Xr(R,o,u);p=w.clause,f=w.values}}let y="";m&&p?y=`WHERE ${m.replace(/^WHERE\s+/i,"")} AND ${p}`:m?y=m:p&&(y=`WHERE ${p}`);let h=Jr((Array.isArray(s),s),c),E=h;o==="desc"?h?E=h.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"):E=`ORDER BY ${l.map(R=>`"${R}" ${u==="asc"?"DESC":"ASC"}`).join(", ")}`:h||(E=`ORDER BY ${l.map(R=>`"${R}" ${u.toUpperCase()}`).join(", ")}`);let T=`SELECT * FROM "${t}" ${y} ${E} LIMIT ?`,C=[...d,...f,a+1],S=`SELECT COUNT(*) as total FROM "${t}" ${m}`;return{sql:T,values:C,countSql:S,countValues:d}}normalizeRows(e){return e.map(t=>this.normalizeRow(t))}buildCursors(e,t,r){if(!t.length)return{nextCursor:null,prevCursor:null};let{direction:a="asc",sort:o=[],cursor:s}=e,c=[];Array.isArray(o)&&o.length>0?c=o.map(p=>p.columnName):typeof o=="string"&&o&&(c=[o]),c.length||(c=["rowid"]);let i=p=>{let f={values:Object.fromEntries(c.map(y=>[y,p[y]])),sortColumns:c};return this.encodeCursor(f)},l=t[0],u=t[t.length-1],m=null,d=null;return a==="asc"?(r&&(m=i(u)),s&&(d=i(l))):(s&&(m=i(u)),r&&(d=i(l))),{nextCursor:m,prevCursor:d}}async getTableData(e){try{let{tableName:t,db:r,limit:a=50,direction:o="asc",sort:s=[],order:c="asc",cursor:i,filters:l=[]}=e,u=X(),d=u.prepare(`PRAGMA table_info("${t}")`).all().filter(B=>B.pk>0).sort((B,ce)=>B.pk-ce.pk).map(B=>B.name),p=[],f=c;Array.isArray(s)&&s.length>0?(p=s.map(B=>B.columnName),f=s[0].direction):typeof s=="string"&&s&&(p=[s]);let y=[...p,...d.filter(B=>!p.includes(B))],h=y.length===0;h&&y.push("rowid");let{clause:E,values:T}=Qr(l),C="",S=[];if(i){let B=this.decodeCursor(i);if(B){let ce=Xr(B,o,f);C=ce.clause,S=ce.values}}let R="";E&&C?R=`WHERE ${E.replace(/^WHERE\s+/i,"")} AND ${C}`:E?R=E:C&&(R=`WHERE ${C}`);let w=Jr((Array.isArray(s),s),c),A=d.filter(B=>!p.includes(B)),_=w;if(o==="desc")if(w){if(_=w.replace(/\bASC\b/gi,"TEMP_DESC").replace(/\bDESC\b/gi,"ASC").replace(/TEMP_DESC/g,"DESC"),A.length){let B=f==="asc"?"DESC":"ASC";_+=`, ${A.map(ce=>`"${ce}" ${B}`).join(", ")}`}}else _=`ORDER BY ${y.map(B=>`"${B}" ${f==="asc"?"DESC":"ASC"}`).join(", ")}`;else w?A.length&&(_+=`, ${A.map(B=>`"${B}" ${f.toUpperCase()}`).join(", ")}`):_=`ORDER BY ${y.map(B=>`"${B}" ${f.toUpperCase()}`).join(", ")}`;let x=u.prepare(`SELECT COUNT(*) as total FROM "${t}" ${E}`).get(...T),k=Number(x?.total??0),$=h?"*, rowid":"*",U=u.prepare(`SELECT ${$} FROM "${t}" ${R} ${_} LIMIT ?`).all(...T,...S,a+1),j=U.length>a,G=j?U.slice(0,a):U;o==="desc"&&(G=G.reverse());let ne=B=>({values:Object.fromEntries(y.map(ce=>[ce,B[ce]])),sortColumns:y}),J=null,Z=null;if(G.length>0){let B=G[0],ce=G[G.length-1];o==="asc"?(j&&(J=this.encodeCursor(ne(ce))),i&&(Z=this.encodeCursor(ne(B)))):(i&&(J=this.encodeCursor(ne(ce))),j&&(Z=this.encodeCursor(ne(B))))}return{data:h?G.map(({rowid:B,...ce})=>ce):G,meta:{limit:a,total:k,hasNextPage:o==="asc"?j:!!i,hasPreviousPage:o==="asc"?!!i:j,nextCursor:J,prevCursor:Z}}}catch(t){throw this.wrapError(t)}}async getDatabasesList(){try{let t=X().prepare("PRAGMA database_list").all();if(!t.length)throw new I(500,{message:"No databases returned from SQLite"});return t.map(r=>({name:r.name,size:this.getFileSize(r.file),owner:"",encoding:"UTF-8"}))}catch(e){throw e instanceof I?e:this.wrapError(e)}}async getCurrentDatabase(){try{return{db:X().prepare("PRAGMA database_list").all().find(a=>a.name==="main")?.name??"main"}}catch(e){throw this.wrapError(e)}}async getDatabaseConnectionInfo(){try{return{host:null,port:null,user:"",database:"main",version:`SQLite ${X().prepare("SELECT sqlite_version() as version").get().version}`,active_connections:1,max_connections:1}}catch(e){throw this.wrapError(e)}}async getTablesList(e){try{let t=X();return t.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name").all().map(a=>{let o=t.prepare(`SELECT COUNT(*) as count FROM "${a.name}"`).get();return{tableName:a.name,rowCount:o?.count??0}})}catch(t){throw this.wrapError(t)}}async createTable({tableData:e,db:t}){let{tableName:r,fields:a,foreignKeys:o}=e,s=X(),c=a.map(l=>{if(l.isPrimaryKey&&l.isIdentity)return`"${l.columnName}" INTEGER PRIMARY KEY AUTOINCREMENT`;let u=`"${l.columnName}" ${l.columnType}`;return l.isPrimaryKey&&(u+=" PRIMARY KEY"),l.isUnique&&!l.isPrimaryKey&&(u+=" UNIQUE"),!l.isNullable&&!l.isPrimaryKey&&(u+=" NOT NULL"),l.defaultValue?.trim()&&!l.isIdentity&&(u+=` DEFAULT ${l.defaultValue.trim()}`),u}),i=o?.map(l=>`FOREIGN KEY ("${l.columnName}") REFERENCES "${l.referencedTable}" ("${l.referencedColumn}") ON UPDATE ${l.onUpdate} ON DELETE ${l.onDelete}`)??[];s.prepare(`CREATE TABLE "${r}" (${[...c,...i].join(", ")})`).run()}async deleteTable(e){let{tableName:t,cascade:r}=e,a=X();if(!a.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});let c=a.prepare(`SELECT COUNT(*) as count FROM "${t}"`).get()?.count??0;if(!r&&this.getFkReferencesForTable(a,t).length>0)return{deletedCount:0,fkViolation:!0,relatedRecords:this.getRelatedRecordsForTable(a,t)};try{return a.prepare(`DROP TABLE "${t}"`).run(),{deletedCount:c,fkViolation:!1,relatedRecords:[]}}catch(i){if((i instanceof Error?i.message:String(i)).includes("FOREIGN KEY constraint"))return{deletedCount:0,fkViolation:!0,relatedRecords:this.getRelatedRecordsForTable(a,t)};throw i instanceof I?i:new I(500,{message:`Failed to delete table "${t}"`})}}async getTableSchema({tableName:e,db:t}){try{let a=X().prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name=?").get(e);if(!a)throw new I(404,{message:`Table "${e}" does not exist`});return a.sql}catch(r){throw r instanceof I?r:this.wrapError(r)}}async getTableColumns({tableName:e,db:t}){try{let r=X();if(!r.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(e))throw new I(404,{message:`Table "${e}" does not exist`});let o=r.prepare(`PRAGMA table_info("${e}")`).all(),s=r.prepare(`PRAGMA foreign_key_list("${e}")`).all(),c=new Map;for(let i of s)c.set(i.from,i);return o.map(i=>{let l=c.get(i.name),u=i.type.toLowerCase();return{columnName:i.name,dataType:$t(u),dataTypeLabel:Er(u),isNullable:i.notnull===0&&i.pk===0,columnDefault:i.dflt_value,isPrimaryKey:i.pk>0,isForeignKey:c.has(i.name),referencedTable:l?.table??null,referencedColumn:l?.to??null,enumValues:null}})}catch(r){throw r instanceof I?r:this.wrapError(r)}}async addColumn(e){let{tableName:t,columnName:r,columnType:a,defaultValue:o,isNullable:s,isUnique:c,db:i}=e,l=X();if(!l.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});if(l.prepare(`PRAGMA table_info("${t}")`).all().some(p=>p.name===r))throw new I(409,{message:`Column "${r}" already exists in table "${t}"`});let d=`"${r}" ${a}`;c&&(d+=" UNIQUE"),s||(d+=" NOT NULL"),o?.trim()&&(d+=` DEFAULT ${o.trim()}`);try{l.prepare(`ALTER TABLE "${t}" ADD COLUMN ${d}`).run()}catch(p){throw this.wrapError(p)}}async deleteColumn(e){let{tableName:t,columnName:r,db:a}=e,o=X();if(!o.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});if(!o.prepare(`PRAGMA table_info("${t}")`).all().some(i=>i.name===r))throw new I(404,{message:`Column "${r}" does not exist in table "${t}"`});try{o.prepare(`ALTER TABLE "${t}" DROP COLUMN "${r}"`).run()}catch(i){throw this.wrapError(i)}return{deletedCount:1}}async alterColumn(e){let{tableName:t,columnName:r,columnType:a,isNullable:o,defaultValue:s,db:c}=e,i=X();if(!i.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});let u=i.prepare(`PRAGMA table_info("${t}")`).all();if(!u.some(w=>w.name===r))throw new I(404,{message:`Column "${r}" does not exist in table "${t}"`});let m=u.filter(w=>w.pk>0).sort((w,A)=>w.pk-A.pk),d=m.length>1,p=u.map(w=>{let A=w.name===r,_=A?a:w.type,x=A?o:w.notnull===0,k=A?s?.trim()||null:w.dflt_value,$=w.pk>0,U=`"${w.name}" ${_}`;return!d&&$&&(U+=" PRIMARY KEY"),!$&&!x&&(U+=" NOT NULL"),k&&(U+=` DEFAULT ${k}`),U});d&&p.push(`PRIMARY KEY (${m.map(w=>`"${w.name}"`).join(", ")})`);let f=i.prepare(`PRAGMA foreign_key_list("${t}")`).all(),y=new Map;for(let w of f){let A=y.get(w.id)??[];A.push(w),y.set(w.id,A)}let h=Array.from(y.values()).map(w=>{let A=w.map(U=>`"${U.from}"`).join(", "),_=w.map(U=>`"${U.to}"`).join(", "),{table:x,on_update:k,on_delete:$}=w[0];return`FOREIGN KEY (${A}) REFERENCES "${x}" (${_}) ON UPDATE ${k} ON DELETE ${$}`}),E=u.map(w=>`"${w.name}"`).join(", "),T=`${t}_alter_${Date.now()}`,C=i.prepare("SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name=? AND sql IS NOT NULL").all(t),S=i.prepare("SELECT sql FROM sqlite_master WHERE type='trigger' AND tbl_name=?").all(t);i.pragma("foreign_keys = OFF");let R=i.transaction(()=>{i.prepare(`CREATE TABLE "${T}" (${[...p,...h].join(", ")})`).run(),i.prepare(`INSERT INTO "${T}" (${E}) SELECT ${E} FROM "${t}"`).run(),i.prepare(`DROP TABLE "${t}"`).run(),i.prepare(`ALTER TABLE "${T}" RENAME TO "${t}"`).run()});try{R();for(let{sql:w}of C)i.prepare(w).run();for(let{sql:w}of S)i.prepare(w).run()}catch(w){throw w instanceof I?w:this.wrapError(w)}finally{i.pragma("foreign_keys = ON")}}async renameColumn(e){let{tableName:t,columnName:r,newColumnName:a,db:o}=e,s=X();if(!s.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(t))throw new I(404,{message:`Table "${t}" does not exist`});let i=s.prepare(`PRAGMA table_info("${t}")`).all();if(!i.some(l=>l.name===r))throw new I(404,{message:`Column "${r}" does not exist in table "${t}"`});if(i.some(l=>l.name===a))throw new I(409,{message:`Column "${a}" already exists in table "${t}"`});try{s.prepare(`ALTER TABLE "${t}" RENAME COLUMN "${r}" TO "${a}"`).run()}catch(l){throw this.wrapError(l)}}async addRecord({params:e}){let{tableName:t,data:r}=e,a=X(),o=Object.keys(r);if(!o.length)throw new I(400,{message:"No data provided for insert"});let s=Object.values(r).map(l=>l!==null&&typeof l=="object"?JSON.stringify(l):l),c=o.map(l=>`"${l}"`).join(", "),i=o.map(()=>"?").join(", ");try{let l=a.prepare(`INSERT INTO "${t}" (${c}) VALUES (${i})`).run(...s);if(l.changes===0)throw new I(500,{message:`Failed to insert record into "${t}"`});return{insertedCount:l.changes}}catch(l){throw this.wrapError(l)}}async updateRecords({db:e,params:t}){let{tableName:r,updates:a,primaryKey:o}=t,s=X(),c=new Map;for(let l of a){let u=l.rowData[o];if(u==null)throw new I(400,{message:`Primary key "${o}" not found in row data.`});c.has(u)||c.set(u,[]),c.get(u)?.push({columnName:l.columnName,value:l.value})}let i=s.transaction(()=>{let l=0;for(let[u,m]of c.entries()){let d=m.map(y=>`"${y.columnName}" = ?`).join(", "),p=[...m.map(y=>y.value!==null&&typeof y.value=="object"?JSON.stringify(y.value):y.value),u],f=s.prepare(`UPDATE "${r}" SET ${d} WHERE "${o}" = ?`).run(...p);if(f.changes===0)throw new I(404,{message:`Record with ${o} = ${u} not found in table "${r}"`});l+=f.changes}return l});try{return{updatedCount:i()}}catch(l){throw l instanceof I?l:this.wrapError(l)}}async deleteRecords({tableName:e,primaryKeys:t,db:r}){let a=X(),o=t[0]?.columnName;if(!o)throw new I(400,{message:"Primary key column name is required"});let s=t.map(l=>l.value),c=s.map(()=>"?").join(", "),i=a.transaction(()=>a.prepare(`DELETE FROM "${e}" WHERE "${o}" IN (${c})`).run(...s).changes);try{return{deletedCount:i(),fkViolation:!1,relatedRecords:[]}}catch(l){if((l instanceof Error?l.message:String(l)).includes("FOREIGN KEY constraint failed"))return{deletedCount:0,fkViolation:!0,relatedRecords:this.getRelatedRecords(a,e,t)};throw this.wrapError(l)}}async forceDeleteRecords({tableName:e,primaryKeys:t,db:r}){let a=X(),o=t[0]?.columnName;if(!o)throw new I(400,{message:"Primary key column name is required"});let s=t.map(i=>i.value);a.pragma("foreign_keys = OFF");let c=a.transaction(()=>{let i=this.getFkReferencesForTable(a,e),l=0;for(let d of i){let p=s.map(()=>"?").join(", "),f=a.prepare(`DELETE FROM "${d.referencingTable}" WHERE "${d.referencingColumn}" IN (${p})`).run(...s);l+=f.changes}let u=s.map(()=>"?").join(", ");return a.prepare(`DELETE FROM "${e}" WHERE "${o}" IN (${u})`).run(...s).changes+l});try{return{deletedCount:c()}}catch(i){throw i instanceof I?i:this.wrapError(i)}finally{a.pragma("foreign_keys = ON")}}async bulkInsertRecords({tableName:e,records:t,db:r}){if(!t?.length)throw new I(400,{message:"At least one record is required"});let a=X(),o=Object.keys(t[0]),s=o.map(u=>`"${u}"`).join(", "),c=o.map(()=>"?").join(", "),i=a.prepare(`INSERT INTO "${e}" (${s}) VALUES (${c})`),l=a.transaction(u=>{let m=0;for(let d of u){let p=o.map(f=>{let y=d[f];return y!==null&&typeof y=="object"?JSON.stringify(y):y});i.run(...p),m++}return m});try{let u=l(t);return{success:!0,message:`Bulk insert completed: ${u} records inserted`,successCount:u,failureCount:0}}catch(u){throw u instanceof I?u:this.wrapError(u)}}async executeQuery({query:e,db:t}){let r=X();if(!e?.trim())throw new I(400,{message:"Query is required"});let a=e.trim().replace(/;+$/,""),o=performance.now();try{let s=r.prepare(a);if(s.reader){let l=s.all(),u=performance.now()-o;return{columns:l.length>0?Object.keys(l[0]):[],rows:l,rowCount:l.length,duration:u,message:l.length===0?"OK":void 0}}let c=s.run(),i=performance.now()-o;return{columns:[],rows:[],rowCount:c.changes,duration:i,message:`OK (${c.changes} rows affected)`}}catch(s){throw this.wrapError(s)}}getFileSize(e){if(!e)return"in-memory";try{let r=qi(e).size;return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}catch{return"N/A"}}getFkReferencesForTable(e,t){let r=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all(),a=[];for(let o of r){if(o.name===t)continue;let s=e.prepare(`PRAGMA foreign_key_list("${o.name}")`).all();for(let c of s)c.table===t&&a.push({constraintName:`fk_${o.name}_${c.from}_${t}_${c.to}`,referencingTable:o.name,referencingColumn:c.from,referencedTable:t,referencedColumn:c.to})}return a}getRelatedRecordsForTable(e,t){let r=this.getFkReferencesForTable(e,t);if(!r.length)return[];let a=[];for(let o of r){let s=e.prepare(`SELECT * FROM "${o.referencingTable}" LIMIT 100`).all();s.length>0&&a.push({tableName:o.referencingTable,columnName:o.referencingColumn,constraintName:o.constraintName,records:s})}return a}getRelatedRecords(e,t,r){let a=this.getFkReferencesForTable(e,t);if(!a.length)return[];let o=[];for(let s of a){if(!r.find(m=>m.columnName===s.referencedColumn))continue;let i=r.map(m=>m.value),l=i.map(()=>"?").join(", "),u=e.prepare(`SELECT * FROM "${s.referencingTable}" WHERE "${s.referencingColumn}" IN (${l}) LIMIT 100`).all(...i);u.length>0&&o.push({tableName:s.referencingTable,columnName:s.referencingColumn,constraintName:s.constraintName,records:u})}return o}}});function Ka(){fe.register("pg",new Bt),fe.register("mysql",new Ut),fe.register("mssql",new It),fe.register("mongodb",new Dt),fe.register("sqlite",new zt),fe.register("redis",new Vt)}var Ha=N(()=>{"use strict";Pe();Ln();wa();Ca();Aa();Ba();ja()});import{HTTPException as Ui}from"hono/http-exception";import{DatabaseError as Bi}from"pg";import{ZodError as Fi}from"zod";function Va(n,e){if(n instanceof Ui)return e.json({error:n.message??"Internal server error"},n.status);if(n instanceof Fi){let t=n.issues[0];return e.json({error:"Validation error",details:t.message},400)}if(n instanceof Error){let t=n;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||n.message.includes("ECONNREFUSED")||n.message.includes("connection refused")||n.message.includes("timeout expired")||n.message.includes("Connection terminated")||n.message.includes("MongoNetworkError")||n.message.includes("MongoServerSelectionError")||n instanceof Bi&&n.code?.startsWith("08"))return e.json({error:"Database connection failed",details:n.message},503)}return e.json({error:n instanceof Error?n.message:"Internal server error"},500)}var za=N(()=>{"use strict"});function Ya(n){if(!n)return`You are a database assistant for db-studio. Keep answers concise and focused.
290
+
291
+ The user chose not to share their database schema. Do not claim to know their table or column names. Ask for the minimum missing details needed to answer accurately, generate queries in fenced code blocks, and warn before potentially destructive or expensive operations.`;let e=n.dbType.toLowerCase(),t=n.dbType==="pg"?"PostgreSQL":n.dbType;return e.includes("mongo")?`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
290
292
 
291
293
  **Your Role:**
292
294
  1. Keep responses SHORT - 2-3 sentences maximum unless generating a query
@@ -300,7 +302,7 @@ ${s.join(`,
300
302
  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
301
303
 
302
304
  **Database Context:**
303
- ${Fa(n)}
305
+ ${Wa(n)}
304
306
 
305
307
  **Guidelines:**
306
308
  1. Always generate syntactically correct MongoDB queries
@@ -362,7 +364,7 @@ This will return the top 5 customers by revenue."`:`You are a database assistant
362
364
  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
363
365
 
364
366
  **Database Context:**
365
- ${Fa(n)}
367
+ ${Wa(n)}
366
368
 
367
369
  **Guidelines:**
368
370
  1. Always generate syntactically correct SQL for the database type (${t})
@@ -400,7 +402,7 @@ LIMIT 5;
400
402
 
401
403
  This will return the 5 customers with the highest total order value. You might also want to see:
402
404
  - Revenue trends over time for these customers
403
- - Their most frequently ordered products"`}function Fa(n){let t=`Database Type: ${n.dbType==="pg"?"PostgreSQL":n.dbType}
405
+ - Their most frequently ordered products"`}function Wa(n){let t=`Database Type: ${n.dbType==="pg"?"PostgreSQL":n.dbType}
404
406
 
405
407
  `;t+=`**Tables and Columns:**
406
408
  `;for(let r of n.tables){t+=`
@@ -414,5 +416,5 @@ This will return the 5 customers with the highest total order value. You might a
414
416
  `)}if(n.relationships&&n.relationships.length>0){t+=`
415
417
  **Relationships:**
416
418
  `;for(let r of n.relationships)t+=` - ${r.fromTable}.${r.fromColumn} -> ${r.toTable}.${r.toColumn}
417
- `}return t}var Ka=N(()=>{"use strict"});function Oi(n){let e={name:n.columnName,type:n.dataTypeLabel,nullable:n.isNullable};return n.isPrimaryKey&&(e.isPrimaryKey=!0),n.isForeignKey&&n.referencedTable&&n.referencedColumn&&(e.foreignKey=`${n.referencedTable}.${n.referencedColumn}`),n.enumValues&&n.enumValues.length>0&&(e.enumValues=n.enumValues,e.description=`Enum values: ${n.enumValues.join(", ")}`),e}function vi(n){let e=[];for(let t of n)for(let r of t.columns)if(r.foreignKey){let[a,o]=r.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:r.name,toTable:a,toColumn:o})}return e}function Li(n){if(n==null)return"";if(n instanceof Date)return n.toISOString();if(typeof n=="bigint")return n.toString();if(typeof n=="object")try{return JSON.stringify(n)}catch{return String(n)}return String(n)}async function Mi(n,e,t){try{return(await n.getTableData({tableName:e,db:t,limit:3})).data.map(a=>Object.fromEntries(Object.entries(a).map(([o,s])=>[o,Li(s)])))}catch{return[]}}async function ki(n,e={}){let t=$e(),{includeSampleData:r=!1,maxTables:a}=e,o=L(t);try{let s=await o.getTablesList(n),i=s.slice(0,a??s.length).map(m=>m.tableName).map(async m=>{let[p,d]=await Promise.all([o.getTableColumns({tableName:m,db:n}),r?Mi(o,m,n):Promise.resolve([])]),f={name:m,columns:p.map(Oi)};return d.length>0&&(f.sampleData=d),f}),l=await Promise.all(i),u=vi(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 Ha(n){return ki(n,{includeSampleData:!0,includeDescriptions:!0})}var Va=N(()=>{"use strict";Pe();ke()});import{zValidator as Ii}from"@hono/zod-validator";import{Hono as qi}from"hono";var za,Wa=N(()=>{"use strict";et();Re();Ka();Va();za=new qi().basePath("/chat").get("/limit",async n=>{let e=await fetch(`${Ce.PROXY_URL}/chat/limit`,{headers:{"cf-connecting-ip":n.req.header("cf-connecting-ip")??"","x-real-ip":n.req.header("x-real-ip")??"","x-forwarded-for":n.req.header("x-forwarded-for")??"","x-api-key":n.req.header("x-api-key")??""}}),t=await e.json();return n.json(t,e.status)}).post("/",Ii("json",mr),async n=>{let{messages:e,data:t}=n.req.valid("json"),{db:r,conversationId:a}=t,o=await Ha(r),s=ja(o),c={messages:e,conversationId:a,systemPrompt:s},i=await fetch(`${Ce.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":n.req.header("cf-connecting-ip")??"","x-real-ip":n.req.header("x-real-ip")??"","x-forwarded-for":n.req.header("x-forwarded-for")??"","x-api-key":n.req.header("x-api-key")??""},body:JSON.stringify(c)});if(!i.ok){let m=await i.json();return n.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 Ui}from"hono";var Ya,Ga=N(()=>{"use strict";Pe();ke();Ya=new Ui().basePath("/databases").get("/",async n=>{let e=$e(),r=await L(e).getDatabasesList();return n.json({data:{databases:r,dbType:e}},200)}).get("/current",async n=>{let e=$e(),r=await L(e).getCurrentDatabase();return n.json({data:{db:r.db,dbType:e}},200)}).get("/connection",async n=>{let e=$e(),r=await L(e).getDatabaseConnectionInfo();return n.json({data:r},200)})});import{zValidator as ye}from"@hono/zod-validator";import{Hono as Bi}from"hono";var Qa,Ja=N(()=>{"use strict";Re();Pe();Qa=new Bi().basePath("/keys").get("/",ye("query",Rr),async n=>{let e=n.req.valid("query"),t=n.get("dbType"),r=Ie(L(t),t);return n.json({data:await r.scanKeys(e)},200)}).post("/",ye("query",P),ye("json",Ar),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType"),a=Ie(L(r),r);return n.json({data:await a.createKey({db:e,...t})},200)}).get("/:key/raw",ye("param",Qe),ye("query",Nr),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=Ie(L(r),r);return n.json({data:await a.getStringChunk({...t,key:e})},200)}).get("/:key",ye("param",Qe),ye("query",Sr),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=Ie(L(r),r);return n.json({data:await a.getKeyDetails({...t,key:e})},200)}).post("/:key/actions",ye("param",Qe),ye("query",P),ye("json",Dr),async n=>{let{key:e}=n.req.valid("param"),{db:t}=n.req.valid("query"),r=n.req.valid("json"),a=n.get("dbType"),o=Ie(L(a),a);return n.json({data:await o.applyKeyAction({db:t,key:e,...r})},200)}).delete("/:key",ye("param",Qe),ye("query",_r),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=Ie(L(r),r);return n.json({data:await a.deleteKey({...t,key:e})},200)})});import{zValidator as Xa}from"@hono/zod-validator";import{Hono as Fi}from"hono";var Za,eo=N(()=>{"use strict";Re();Pe();Za=new Fi().basePath("/query").post("/",Xa("query",P),Xa("json",Er),async n=>{let{query:e}=n.req.valid("json"),{db:t}=n.req.valid("query"),r=n.get("dbType"),o=await L(r).executeQuery({query:e,db:t});return n.json({data:o},200)})});import{zValidator as xe}from"@hono/zod-validator";import{Hono as ji}from"hono";var to,ro=N(()=>{"use strict";Re();Pe();to=new ji().basePath("/records").post("/",xe("query",P),xe("json",lr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,data:r}=n.req.valid("json"),a=n.get("dbType"),o=L(a),{insertedCount:s}=await o.addRecord({db:e,params:{tableName:t,data:r}});return n.json({data:`Record inserted into "${t}" with ${s} rows inserted`},200)}).patch("/",xe("query",P),xe("json",$r),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKey:r,updates:a}=n.req.valid("json"),o=n.get("dbType"),s=L(o),{updatedCount:c}=await s.updateRecords({params:{tableName:t,primaryKey:r,updates:a},db:e});return n.json({data:`Updated ${c} records in "${t}"`},200)}).delete("/",xe("query",P),xe("json",vt),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),o=L(a),{deletedCount:s,fkViolation:c,relatedRecords:i}=await o.deleteRecords({tableName:t,primaryKeys:r,db:e});return c?n.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:i}},409):n.json({data:{deletedCount:s,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",xe("query",P),xe("json",vt),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),s=await L(a).forceDeleteRecords({tableName:t,primaryKeys:r,db:e});return n.json({data:s},200)}).post("/bulk",xe("query",P),xe("json",ur),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,records:r}=n.req.valid("json"),a=n.get("dbType"),s=await L(a).bulkInsertRecords({tableName:t,records:r,db:e});return n.json({data:s},200)})});import{utils as ut,write as Ki}from"xlsx";function no({cols:n,rows:e,format:t,tableName:r}){switch(t){case"json":{let a=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(a,"utf-8"))}case"csv":{let a=[n,...e?.map(c=>n?.map(i=>c[i]))??[]],o=ut.aoa_to_sheet(a),s=ut.sheet_to_csv(o);return new Uint8Array(Buffer.from(s,"utf-8"))}case"xlsx":{let a=[n,...e?.map(i=>n?.map(l=>i[l]))??[]],o=ut.aoa_to_sheet(a),s=ut.book_new();ut.book_append_sheet(s,o,r.slice(0,31));let c=Ki(s,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var ao=N(()=>{"use strict"});import{zValidator as Y}from"@hono/zod-validator";import{Hono as Hi}from"hono";var oo,so=N(()=>{"use strict";Re();Pe();ao();oo=new Hi().basePath("/tables").get("/",Y("query",P),async n=>{let{db:e}=n.req.valid("query"),t=n.get("dbType"),a=await L(t).getTablesList(e);return n.json({data:a},200)}).post("/",Y("query",P),Y("json",hr),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType");return await L(r).createTable({tableData:t,db:e}),n.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",Y("query",Tr),Y("param",ge),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r}=n.req.valid("param"),a=n.get("dbType"),s=await L(a).deleteTable({tableName:r,db:e,cascade:t});return n.json({data:s},200)}).delete("/:tableName/columns/:columnName",Y("query",cr),Y("param",oe),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r,columnName:a}=n.req.valid("param"),o=n.get("dbType"),s=L(o),{deletedCount:c}=await s.deleteColumn({tableName:r,columnName:a,cascade:t,db:e});return n.json({data:`Column "${a}" deleted successfully from table "${r}" with ${c} rows deleted`},200)}).post("/:tableName/columns",Y("query",P),Y("param",ge),Y("json",Te),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.req.valid("json"),a=n.get("dbType");return await L(a).addColumn({tableName:t,db:e,...r}),n.json({data:`Column "${r.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",Y("query",P),Y("param",oe),Y("json",Mt),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,columnName:r}=n.req.valid("param"),a=n.req.valid("json"),o=n.get("dbType");return await L(o).renameColumn({tableName:t,columnName:r,db:e,...a}),n.json({data:`Column "${r}" renamed to "${a.newColumnName}" in table "${t}"`},200)}).patch("/:tableName/columns/:columnName",Y("query",P),Y("param",oe),Y("json",We),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,columnName:r}=n.req.valid("param"),a=n.req.valid("json"),o=n.get("dbType");return await L(o).alterColumn({tableName:t,columnName:r,db:e,...a}),n.json({data:`Column "${r}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",Y("query",P),Y("param",ge),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await L(r).getTableColumns({tableName:t,db:e});return n.json({data:o},200)}).get("/:tableName/schema",Y("query",P),Y("param",ge),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await L(r).getTableSchema({tableName:t,db:e});return n.json({data:{schema:o}},200)}).get("/:tableName/data",Y("param",ge),Y("query",Pr),async n=>{let{tableName:e}=n.req.valid("param"),{cursor:t,limit:r,direction:a,sort:o,order:s,filters:c,db:i}=n.req.valid("query"),l=n.get("dbType"),m=await L(l).getTableData({tableName:e,cursor:t,limit:r,direction:a,sort:o,order:s,filters:c,db:i});return n.json({data:m},200)}).get("/:tableName/export",Y("param",ge),Y("query",wr),async n=>{let{tableName:e}=n.req.valid("param"),{db:t,format:r}=n.req.valid("query"),a=n.get("dbType"),o=L(a),{cols:s,rows:c}=await o.exportTableData({tableName:e,db:t}),i=no({cols:s,rows:c,format:r,tableName:e}),l;switch(r){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.${r}"`}})})});var co={};Yt(co,{createServer:()=>Zi});import{existsSync as io}from"fs";import Me from"path";import{fileURLToPath as Vi}from"url";import{serveStatic as mt}from"@hono/node-server/serve-static";import{zValidator as zi}from"@hono/zod-validator";import{Hono as Wi}from"hono";import{cors as Yi}from"hono/cors";import{HTTPException as Gi}from"hono/http-exception";import{logger as Qi}from"hono/logger";import{prettyJSON as Ji}from"hono/pretty-json";import{z as lo}from"zod";var Le,dt,Xi,Zi,uo=N(()=>{"use strict";et();Pe();qa();Ba();Wa();Ga();Ja();eo();ro();so();({API_PREFIX:Le}=Ce),dt=()=>{if(process.env.NODE_ENV==="development")return Me.resolve(process.cwd(),"../web/dist");let n=Me.dirname(Vi(import.meta.url)),e=Me.resolve(n,"./web-dist"),t=Me.resolve(process.cwd(),"../web/dist"),r=Me.resolve(e,"index.html"),a=Me.resolve(t,"index.html");return!io(r)&&io(a)?t:e},Xi=lo.object({dbType:lo.string().refine(n=>pe.getSupportedTypes().includes(n),{message:`Invalid database type. Supported types: ${pe.getSupportedTypes().join(", ")}`})}),Zi=()=>{Ia();let n=new Wi({strict:!1}).use("/*",Yi({origin:e=>{if(!e)return;if((process.env.ALLOWED_ORIGINS?.split(",").map(r=>r.trim()).filter(Boolean)??[]).includes(e))return e;if(process.env.NODE_ENV==="development")try{let r=new URL(e);if(r.hostname==="localhost"||r.hostname.endsWith(".localhost")||r.hostname==="127.0.0.1")return e}catch{}},allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})).use(Ji({space:2})).use(process.env.NODE_ENV==="development"?Qi():(e,t)=>t()).use("/favicon.ico",mt({path:Me.resolve(dt(),"favicon.ico")})).onError(Ua).route(Le,Ya).route(Le,za).use("/assets/*",mt({root:dt()})).use("/image.png",mt({root:dt()})).use(`${Le}/:dbType/*`,zi("param",Xi,(e,t)=>{if(!e.success){let r=t.req.param("dbType");throw new Gi(400,{message:`Invalid database type: "${r}". Supported types: ${pe.getSupportedTypes().join(", ")}`})}}),async(e,t)=>{let{dbType:r}=e.req.valid("param");e.set("dbType",r),await t()}).route(`${Le}/:dbType`,oo).route(`${Le}/:dbType`,to).route(`${Le}/:dbType`,Za).route(`${Le}/:dbType`,Qa);return process.env.NODE_ENV!=="test"&&(n.all(`${Le}/*`,e=>e.json({error:"Not found"},404)),n.use("/*",mt({root:dt()})),n.get("/*",mt({path:Me.resolve(dt(),"index.html")}))),{app:n}}});et();import{intro as el,log as Wt,outro as mo,spinner as tl}from"@clack/prompts";import{serve as rl}from"@hono/node-server";import pt from"picocolors";import{program as Qt}from"commander";var an=()=>{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("--open","Open db-studio in the default browser").option("--no-open","Do not open db-studio in the default browser").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv);let n=Qt.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Qt.error("Do not combine --open and --no-open"),{...n,open:e?!0:t?!1:void 0}};import{readFile as fo}from"fs/promises";import{resolve as yo}from"path";import{cancel as ft,isCancel as Jt,note as on,select as bo,spinner as go,text as sn}from"@clack/prompts";import{parse as ho}from"dotenv";import Xt from"picocolors";var ln=async(n,e)=>{let t=e||"DATABASE_URL";if(n?.[t])return n[t];if(process.env[t])return process.env[t];let r=go();r.start("Looking for database connection..."),n?on(Xt.red(`${t} not found in .env or process.env`)):on(Xt.red(`No .env file found and ${t} not set in process.env`));let a=await bo({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((Jt(a)||a==="cancel")&&(ft("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){r.start("Waiting for path...");let s=await sn({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(i){if(!i?.trim())return"Path is required"}});Jt(s)&&(ft("Cancelled."),process.exit(0)),r.stop("Trying custom .env...");let c=yo(s);try{let i=await fo(c,"utf-8"),l=ho(i);if(l[t])return l[t];throw new Error(`${t} still missing in custom file`)}catch(i){let l=i;ft(`Cannot read or parse file: ${Xt.dim(l.message)}`),process.exit(1)}}r.stop("Manual input...");let o=await sn({message:`Paste your ${t}`,placeholder:"postgresql://user:password@localhost:5432/mydb or sqlite:///path/to/db.sqlite",validate(s){if(!s?.trim())return"Connection string is required!";if(!s.trim().startsWith("sqlite://"))try{new URL(s);return}catch{return"Must be a valid URL format"}}});return Jt(o)&&(ft("Cancelled."),process.exit(0)),o.trim()};import{access as To,readFile as Eo}from"fs/promises";import{dirname as wo,resolve as Zt}from"path";import{parse as Ro}from"dotenv";var Co=async n=>{let e=Zt(n);for(;;){let t=Zt(e,".env");try{return await To(t),t}catch{}let r=wo(e);if(r===e)return null;e=r}},je=async n=>{let e;if(n?e=Zt(n):e=await Co(process.cwd()),!e)return null;try{let t=await Eo(e,"utf-8");return Ro(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};import So from"open";var cn=n=>n===!0,un=async n=>{await So(n)};Gt();import{intro as No,outro as Ao}from"@clack/prompts";import mn from"picocolors";var dn=()=>{No(mn.inverse(" db-studio ")),Ao(mn.green(`For more information, visit: ${rn.SITE_DOCS_LINK}`))};et();import{intro as Do,note as _o,outro as pn}from"@clack/prompts";import yt from"picocolors";var fn=async(n,e,t)=>{Do(yt.inverse(" db-studio "));let r=t||Ce.VAR_NAME,a=null;if(e)a=e;else{let o=n?await je(n):await je();o?.[r]?a=o[r]:process.env[r]&&(a=process.env[r]??null)}a?pn(yt.green(`\u2713 Database connection configured (using ${r})`)):(_o(yt.red(`\u2717 ${r} not found`),"Status"),pn(yt.yellow("\u26A0 No database connection configured")))};import{intro as Po,outro as $o}from"@clack/prompts";import bn from"picocolors";var yn={name:"db-studio",type:"module",version:"1.11.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:"Apache-2.0",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"portless run","dev:app":"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",prepack:"cd ../web && bun run build && cd ../server && bun run build",start:`sh -c 'APP_PORT=\${PORT:-3333}; portless proxy start >/dev/null && portless alias db-studio "$APP_PORT" --force >/dev/null && HOST=127.0.0.1 PORT="$APP_PORT" DB_STUDIO_SERVER_URL=https://db-studio.localhost node dist/index.js'`,format:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^2.0.0","@hono/zod-validator":"^0.9.0","better-sqlite3":"^13.0.3",commander:"^15.0.0",dotenv:"^17.3.1",hono:"^4.10.4",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@types/better-sqlite3":"^9.6.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/pg":"^8.16.0","@vitest/coverage-v8":"^4.0.17",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^4.0.17"}};var gn=()=>{Po(bn.inverse(" db-studio ")),$o(bn.green(`\u{1F680} db-studio v${yn.version}`))};var nl=async()=>{let{env:n,port:e,databaseUrl:t,varName:r,open:a,status:o,help:s,version:c}=an();s&&(dn(),process.exit(0)),c&&(gn(),process.exit(0)),o&&(await fn(n,t,r),process.exit(0)),el(pt.inverse(" db-studio "));let i=n?await je(n):await je();if(i)for(let[x,$]of Object.entries(i))process.env[x]===void 0&&(process.env[x]=$);let l=Number.parseInt(e??process.env.PORT??String(Ce.PORT),10),u=process.env.HOST,m=r||Ce.VAR_NAME,p=!!i?.[m],d=!!process.env[m],f=t||await ln(i,m),y=t?"Using database URL from --database-url":p?`Found ${m} in ${n??".env"}`:d?`Found ${m} in environment`:"Using database URL provided interactively";Wt.success(y),process.env.DATABASE_URL=f;let{checkDatabaseConnection:g,getDatabaseConnectionDetails:E}=await Promise.resolve().then(()=>(Sn(),Cn)),{type:T,name:S,destination:C}=E(f),R=tl();R.start(`Connecting to ${S}...`);try{await g(T),R.stop(`Connected to ${S} at ${C}`)}catch(x){throw R.stop(`Could not connect to ${S} at ${C}`),x}let{createServer:w}=await Promise.resolve().then(()=>(uo(),co)),{app:A}=w();rl({fetch:A.fetch,hostname:u,port:l});let _=process.env.DB_STUDIO_SERVER_URL??process.env.PORTLESS_URL??`http://localhost:${l}`;if(Wt.success(`Server listening at ${pt.cyan(_)}`),cn(a))try{await un(_),Wt.success("Opened db-studio in your browser")}catch{Wt.warn(`Could not open your browser. Visit ${pt.cyan(_)}`)}mo(pt.green("Ready"))};process.env.NODE_ENV!=="test"&&nl().catch(n=>{let t=(n instanceof Error?n.message:String(n)).replace(/\b(?:postgres(?:ql)?|mysql2?|mssql|sqlserver|mongodb(?:\+srv)?|sqlite|rediss?):\/\/\S+/gi,"the configured database");mo(pt.red(`Startup failed: ${t}`)),process.exit(1)});export{nl as main};
419
+ `}return t}var Ga=N(()=>{"use strict"});function ji(n){let e={name:n.columnName,type:n.dataTypeLabel,nullable:n.isNullable};return n.isPrimaryKey&&(e.isPrimaryKey=!0),n.isForeignKey&&n.referencedTable&&n.referencedColumn&&(e.foreignKey=`${n.referencedTable}.${n.referencedColumn}`),n.enumValues&&n.enumValues.length>0&&(e.enumValues=n.enumValues,e.description=`Enum values: ${n.enumValues.join(", ")}`),e}function Ki(n){let e=[];for(let t of n)for(let r of t.columns)if(r.foreignKey){let[a,o]=r.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:r.name,toTable:a,toColumn:o})}return e}function Hi(n){if(n==null)return"";if(n instanceof Date)return n.toISOString();if(typeof n=="bigint")return n.toString();if(typeof n=="object")try{return JSON.stringify(n)}catch{return String(n)}return String(n)}async function Vi(n,e,t){try{return(await n.getTableData({tableName:e,db:t,limit:3})).data.map(a=>Object.fromEntries(Object.entries(a).map(([o,s])=>[o,Hi(s)])))}catch{return[]}}async function zi(n,e,t){try{return await n.getTableColumns({tableName:e,db:t})}catch{return[]}}async function Wi(n,e={}){let t=ke(),{includeSampleData:r=!1,maxTables:a}=e,o=O(t);try{let s=await o.getTablesList(n),i=s.slice(0,a??s.length).map(async({schemaName:m,tableName:d})=>{let[p,f]=await Promise.all([zi(o,d,n),r?Vi(o,d,n):Promise.resolve([])]),y={name:m?`${m}.${d}`:d,columns:p.map(ji)};return f.length>0&&(y.sampleData=f),y}),l=await Promise.all(i),u=Ki(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 Qa(n){return Wi(n,{includeSampleData:!0,includeDescriptions:!0})}var Ja=N(()=>{"use strict";Pe();Me()});import{zValidator as Yi}from"@hono/zod-validator";import{Hono as Gi}from"hono";import{HTTPException as Xa}from"hono/http-exception";var Qi,Za,eo,to=N(()=>{"use strict";et();Re();Ga();Ja();Qi=new Set(["localhost","127.0.0.1","::1","[::1]"]),Za=()=>{let n;try{n=new URL(xe.PROXY_URL)}catch{throw new Xa(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=Qi.has(n.hostname)||n.hostname.endsWith(".localhost");if(n.protocol!=="https:"&&!(n.protocol==="http:"&&e))throw new Xa(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return n.origin},eo=new Gi().basePath("/chat").get("/limit",async n=>{let e=Za();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":n.req.header("cf-connecting-ip")??"","x-real-ip":n.req.header("x-real-ip")??"","x-forwarded-for":n.req.header("x-forwarded-for")??"","x-api-key":n.req.header("x-api-key")??""}});return t.ok?n.json(await t.json(),200):n.json({limit:3,used:3,remaining:0},200)}catch{return n.json({limit:3,used:3,remaining:0},200)}}).post("/",Yi("json",yr),async n=>{let{messages:e,data:t,provider:r,model:a}=n.req.valid("json"),{db:o,conversationId:s,includeSchema:c}=t,i=c?await Qa(o):null,l=Ya(i),u={messages:e,conversationId:s,systemPrompt:l,provider:r,model:a},m=await fetch(`${Za()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":n.req.header("cf-connecting-ip")??"","x-real-ip":n.req.header("x-real-ip")??"","x-forwarded-for":n.req.header("x-forwarded-for")??"","x-api-key":n.req.header("x-api-key")??"","x-byok-gemini":n.req.header("x-byok-gemini")??"","x-byok-openai":n.req.header("x-byok-openai")??"","x-byok-anthropic":n.req.header("x-byok-anthropic")??"","x-byok-grok":n.req.header("x-byok-grok")??"","x-byok-openrouter":n.req.header("x-byok-openrouter")??""},body:JSON.stringify(u)});if(!m.ok){let d=await m.json();return n.json({error:d.error||"Proxy request failed"},m.status)}return new Response(m.body,{status:m.status,headers:m.headers})})});import{Hono as Ji}from"hono";var ro,no=N(()=>{"use strict";Pe();Me();ro=new Ji().basePath("/databases").get("/",async n=>{let e=ke(),r=await O(e).getDatabasesList();return n.json({data:{databases:r,dbType:e}},200)}).get("/current",async n=>{let e=ke(),r=await O(e).getCurrentDatabase();return n.json({data:{db:r.db,dbType:e}},200)}).get("/connection",async n=>{let e=ke(),r=await O(e).getDatabaseConnectionInfo();return n.json({data:r},200)})});import{zValidator as be}from"@hono/zod-validator";import{Hono as Xi}from"hono";var ao,oo=N(()=>{"use strict";Re();Pe();ao=new Xi().basePath("/keys").get("/",be("query",Ar),async n=>{let e=n.req.valid("query"),t=n.get("dbType"),r=Ie(O(t),t);return n.json({data:await r.scanKeys(e)},200)}).post("/",be("query",P),be("json",Pr),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType"),a=Ie(O(r),r);return n.json({data:await a.createKey({db:e,...t})},200)}).get("/:key/raw",be("param",Qe),be("query",xr),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=Ie(O(r),r);return n.json({data:await a.getStringChunk({...t,key:e})},200)}).get("/:key",be("param",Qe),be("query",_r),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=Ie(O(r),r);return n.json({data:await a.getKeyDetails({...t,key:e})},200)}).post("/:key/actions",be("param",Qe),be("query",P),be("json",kr),async n=>{let{key:e}=n.req.valid("param"),{db:t}=n.req.valid("query"),r=n.req.valid("json"),a=n.get("dbType"),o=Ie(O(a),a);return n.json({data:await o.applyKeyAction({db:t,key:e,...r})},200)}).delete("/:key",be("param",Qe),be("query",$r),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=Ie(O(r),r);return n.json({data:await a.deleteKey({...t,key:e})},200)})});import{zValidator as so}from"@hono/zod-validator";import{Hono as Zi}from"hono";var io,lo=N(()=>{"use strict";Re();Pe();io=new Zi().basePath("/query").post("/",so("query",P),so("json",Cr),async n=>{let{query:e}=n.req.valid("json"),{db:t}=n.req.valid("query"),r=n.get("dbType"),o=await O(r).executeQuery({query:e,db:t});return n.json({data:o},200)})});import{zValidator as _e}from"@hono/zod-validator";import{Hono as el}from"hono";var co,uo=N(()=>{"use strict";Re();Pe();co=new el().basePath("/records").post("/",_e("query",P),_e("json",cr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,data:r}=n.req.valid("json"),a=n.get("dbType"),o=O(a),{insertedCount:s}=await o.addRecord({db:e,params:{tableName:t,data:r}});return n.json({data:`Record inserted into "${t}" with ${s} rows inserted`},200)}).patch("/",_e("query",P),_e("json",Lr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKey:r,updates:a}=n.req.valid("json"),o=n.get("dbType"),s=O(o),{updatedCount:c}=await s.updateRecords({params:{tableName:t,primaryKey:r,updates:a},db:e});return n.json({data:`Updated ${c} records in "${t}"`},200)}).delete("/",_e("query",P),_e("json",vt),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),o=O(a),{deletedCount:s,fkViolation:c,relatedRecords:i}=await o.deleteRecords({tableName:t,primaryKeys:r,db:e});return c?n.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:i}},409):n.json({data:{deletedCount:s,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",_e("query",P),_e("json",vt),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),s=await O(a).forceDeleteRecords({tableName:t,primaryKeys:r,db:e});return n.json({data:s},200)}).post("/bulk",_e("query",P),_e("json",fr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,records:r}=n.req.valid("json"),a=n.get("dbType"),s=await O(a).bulkInsertRecords({tableName:t,records:r,db:e});return n.json({data:s},200)})});import{utils as ut,write as tl}from"xlsx";function mo({cols:n,rows:e,format:t,tableName:r}){switch(t){case"json":{let a=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(a,"utf-8"))}case"csv":{let a=[n,...e?.map(c=>n?.map(i=>c[i]))??[]],o=ut.aoa_to_sheet(a),s=ut.sheet_to_csv(o);return new Uint8Array(Buffer.from(s,"utf-8"))}case"xlsx":{let a=[n,...e?.map(i=>n?.map(l=>i[l]))??[]],o=ut.aoa_to_sheet(a),s=ut.book_new();ut.book_append_sheet(s,o,r.slice(0,31));let c=tl(s,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var po=N(()=>{"use strict"});import{zValidator as Y}from"@hono/zod-validator";import{Hono as rl}from"hono";var fo,yo=N(()=>{"use strict";Re();Pe();po();fo=new rl().basePath("/tables").get("/",Y("query",P),async n=>{let{db:e}=n.req.valid("query"),t=n.get("dbType"),a=await O(t).getTablesList(e);return n.json({data:a},200)}).post("/",Y("query",P),Y("json",Rr),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType");return await O(r).createTable({tableData:t,db:e}),n.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",Y("query",Sr),Y("param",ge),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r}=n.req.valid("param"),a=n.get("dbType"),s=await O(a).deleteTable({tableName:r,db:e,cascade:t});return n.json({data:s},200)}).delete("/:tableName/columns/:columnName",Y("query",pr),Y("param",se),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r,columnName:a}=n.req.valid("param"),o=n.get("dbType"),s=O(o),{deletedCount:c}=await s.deleteColumn({tableName:r,columnName:a,cascade:t,db:e});return n.json({data:`Column "${a}" deleted successfully from table "${r}" with ${c} rows deleted`},200)}).post("/:tableName/columns",Y("query",P),Y("param",ge),Y("json",Ee),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.req.valid("json"),a=n.get("dbType");return await O(a).addColumn({tableName:t,db:e,...r}),n.json({data:`Column "${r.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",Y("query",P),Y("param",se),Y("json",Lt),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,columnName:r}=n.req.valid("param"),a=n.req.valid("json"),o=n.get("dbType");return await O(o).renameColumn({tableName:t,columnName:r,db:e,...a}),n.json({data:`Column "${r}" renamed to "${a.newColumnName}" in table "${t}"`},200)}).patch("/:tableName/columns/:columnName",Y("query",P),Y("param",se),Y("json",We),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,columnName:r}=n.req.valid("param"),a=n.req.valid("json"),o=n.get("dbType");return await O(o).alterColumn({tableName:t,columnName:r,db:e,...a}),n.json({data:`Column "${r}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",Y("query",P),Y("param",ge),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await O(r).getTableColumns({tableName:t,db:e});return n.json({data:o},200)}).get("/:tableName/schema",Y("query",P),Y("param",ge),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await O(r).getTableSchema({tableName:t,db:e});return n.json({data:{schema:o}},200)}).get("/:tableName/data",Y("param",ge),Y("query",Or),async n=>{let{tableName:e}=n.req.valid("param"),{cursor:t,limit:r,direction:a,sort:o,order:s,filters:c,db:i}=n.req.valid("query"),l=n.get("dbType"),m=await O(l).getTableData({tableName:e,cursor:t,limit:r,direction:a,sort:o,order:s,filters:c,db:i});return n.json({data:m},200)}).get("/:tableName/export",Y("param",ge),Y("query",Nr),async n=>{let{tableName:e}=n.req.valid("param"),{db:t,format:r}=n.req.valid("query"),a=n.get("dbType"),o=O(a),{cols:s,rows:c}=await o.exportTableData({tableName:e,db:t}),i=mo({cols:s,rows:c,format:r,tableName:e}),l;switch(r){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.${r}"`}})})});var go={};Gt(go,{createServer:()=>ml});import{existsSync as bo}from"fs";import Le from"path";import{fileURLToPath as nl}from"url";import{serveStatic as mt}from"@hono/node-server/serve-static";import{zValidator as al}from"@hono/zod-validator";import{Hono as ol}from"hono";import{cors as sl}from"hono/cors";import{HTTPException as il}from"hono/http-exception";import{logger as ll}from"hono/logger";import{prettyJSON as cl}from"hono/pretty-json";import{z as ho}from"zod";var Oe,dt,ul,ml,To=N(()=>{"use strict";et();Pe();Ha();za();to();no();oo();lo();uo();yo();({API_PREFIX:Oe}=xe),dt=()=>{if(process.env.NODE_ENV==="development")return Le.resolve(process.cwd(),"../web/dist");let n=Le.dirname(nl(import.meta.url)),e=Le.resolve(n,"./web-dist"),t=Le.resolve(process.cwd(),"../web/dist"),r=Le.resolve(e,"index.html"),a=Le.resolve(t,"index.html");return!bo(r)&&bo(a)?t:e},ul=ho.object({dbType:ho.string().refine(n=>fe.getSupportedTypes().includes(n),{message:`Invalid database type. Supported types: ${fe.getSupportedTypes().join(", ")}`})}),ml=()=>{Ka();let n=new ol({strict:!1}).use("/*",sl({origin:e=>{if(!e)return;if((process.env.ALLOWED_ORIGINS?.split(",").map(r=>r.trim()).filter(Boolean)??[]).includes(e))return e;if(process.env.NODE_ENV==="development")try{let r=new URL(e);if(r.hostname==="localhost"||r.hostname.endsWith(".localhost")||r.hostname==="127.0.0.1")return e}catch{}},allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","X-Run-Id","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"]})).use(cl({space:2})).use(process.env.NODE_ENV==="development"?ll():(e,t)=>t()).use("/favicon.ico",mt({path:Le.resolve(dt(),"favicon.ico")})).onError(Va).route(Oe,ro).route(Oe,eo).use("/assets/*",mt({root:dt()})).use("/image.png",mt({root:dt()})).use(`${Oe}/:dbType/*`,al("param",ul,(e,t)=>{if(!e.success){let r=t.req.param("dbType");throw new il(400,{message:`Invalid database type: "${r}". Supported types: ${fe.getSupportedTypes().join(", ")}`})}}),async(e,t)=>{let{dbType:r}=e.req.valid("param");e.set("dbType",r),await t()}).route(`${Oe}/:dbType`,fo).route(`${Oe}/:dbType`,co).route(`${Oe}/:dbType`,io).route(`${Oe}/:dbType`,ao);return process.env.NODE_ENV!=="test"&&(n.all(`${Oe}/*`,e=>e.json({error:"Not found"},404)),n.use("/*",mt({root:dt()})),n.get("/*",mt({path:Le.resolve(dt(),"index.html")}))),{app:n}}});et();import{intro as dl,log as Yt,outro as Eo,spinner as pl}from"@clack/prompts";import{serve as fl}from"@hono/node-server";import pt from"picocolors";import{program as Jt}from"commander";var cn=()=>{Jt.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("--open","Open db-studio in the default browser").option("--no-open","Do not open db-studio in the default browser").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv);let n=Jt.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&Jt.error("Do not combine --open and --no-open"),{...n,open:e?!0:t?!1:void 0}};import{readFile as Ro}from"fs/promises";import{resolve as So}from"path";import{cancel as ft,isCancel as Xt,note as un,select as Co,spinner as No,text as mn}from"@clack/prompts";import{parse as Ao}from"dotenv";import Zt from"picocolors";var dn=async(n,e)=>{let t=e||"DATABASE_URL";if(n?.[t])return n[t];if(process.env[t])return process.env[t];let r=No();r.start("Looking for database connection..."),n?un(Zt.red(`${t} not found in .env or process.env`)):un(Zt.red(`No .env file found and ${t} not set in process.env`));let a=await Co({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((Xt(a)||a==="cancel")&&(ft("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){r.start("Waiting for path...");let s=await mn({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(i){if(!i?.trim())return"Path is required"}});Xt(s)&&(ft("Cancelled."),process.exit(0)),r.stop("Trying custom .env...");let c=So(s);try{let i=await Ro(c,"utf-8"),l=Ao(i);if(l[t])return l[t];throw new Error(`${t} still missing in custom file`)}catch(i){let l=i;ft(`Cannot read or parse file: ${Zt.dim(l.message)}`),process.exit(1)}}r.stop("Manual input...");let o=await mn({message:`Paste your ${t}`,placeholder:"postgresql://user:password@localhost:5432/mydb or sqlite:///path/to/db.sqlite",validate(s){if(!s?.trim())return"Connection string is required!";if(!s.trim().startsWith("sqlite://"))try{new URL(s);return}catch{return"Must be a valid URL format"}}});return Xt(o)&&(ft("Cancelled."),process.exit(0)),o.trim()};import{access as Do,readFile as _o}from"fs/promises";import{dirname as xo,resolve as er}from"path";import{parse as Po}from"dotenv";var ko=async n=>{let e=er(n);for(;;){let t=er(e,".env");try{return await Do(t),t}catch{}let r=xo(e);if(r===e)return null;e=r}},je=async n=>{let e;if(n?e=er(n):e=await ko(process.cwd()),!e)return null;try{let t=await _o(e,"utf-8");return Po(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};import $o from"open";var pn=n=>n===!0,fn=async n=>{await $o(n)};Qt();import{intro as vo,outro as Oo}from"@clack/prompts";import yn from"picocolors";var bn=()=>{vo(yn.inverse(" db-studio ")),Oo(yn.green(`For more information, visit: ${sn.SITE_DOCS_LINK}`))};et();import{intro as Lo,note as Mo,outro as hn}from"@clack/prompts";import yt from"picocolors";var gn=async(n,e,t)=>{Lo(yt.inverse(" db-studio "));let r=t||xe.VAR_NAME,a=null;if(e)a=e;else{let o=n?await je(n):await je();o?.[r]?a=o[r]:process.env[r]&&(a=process.env[r]??null)}a?hn(yt.green(`\u2713 Database connection configured (using ${r})`)):(Mo(yt.red(`\u2717 ${r} not found`),"Status"),hn(yt.yellow("\u26A0 No database connection configured")))};import{intro as qo,outro as Uo}from"@clack/prompts";import En from"picocolors";var Tn={name:"db-studio",type:"module",version:"1.12.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:"Apache-2.0",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"portless run","dev:app":"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",prepack:"cd ../web && bun run build && cd ../server && bun run build",start:`sh -c 'APP_PORT=\${PORT:-3333}; portless proxy start >/dev/null && portless alias db-studio "$APP_PORT" --force >/dev/null && HOST=127.0.0.1 PORT="$APP_PORT" DB_STUDIO_SERVER_URL=https://db-studio.localhost node dist/index.js'`,format:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^2.0.0","@hono/zod-validator":"^0.9.0","better-sqlite3":"^13.0.3",commander:"^15.0.0",dotenv:"^17.3.1",hono:"^4.10.4",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@types/better-sqlite3":"^9.6.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/pg":"^8.16.0","@vitest/coverage-v8":"^4.0.17",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^4.0.17"}};var wn=()=>{qo(En.inverse(" db-studio ")),Uo(En.green(`\u{1F680} db-studio v${Tn.version}`))};var yl=async()=>{let{env:n,port:e,databaseUrl:t,varName:r,open:a,status:o,help:s,version:c}=cn();s&&(bn(),process.exit(0)),c&&(wn(),process.exit(0)),o&&(await gn(n,t,r),process.exit(0)),dl(pt.inverse(" db-studio "));let i=n?await je(n):await je();if(i)for(let[x,k]of Object.entries(i))process.env[x]===void 0&&(process.env[x]=k);let l=Number.parseInt(e??process.env.PORT??String(xe.PORT),10),u=process.env.HOST,m=r||xe.VAR_NAME,d=!!i?.[m],p=!!process.env[m],f=t||await dn(i,m),y=t?"Using database URL from --database-url":d?`Found ${m} in ${n??".env"}`:p?`Found ${m} in environment`:"Using database URL provided interactively";Yt.success(y),process.env.DATABASE_URL=f;let{checkDatabaseConnection:h,getDatabaseConnectionDetails:E}=await Promise.resolve().then(()=>(_n(),Dn)),{type:T,name:C,destination:S}=E(f),R=pl();R.start(`Connecting to ${C}...`);try{await h(T),R.stop(`Connected to ${C} at ${S}`)}catch(x){throw R.stop(`Could not connect to ${C} at ${S}`),x}let{createServer:w}=await Promise.resolve().then(()=>(To(),go)),{app:A}=w();fl({fetch:A.fetch,hostname:u,port:l});let _=process.env.DB_STUDIO_SERVER_URL??process.env.PORTLESS_URL??`http://localhost:${l}`;if(Yt.success(`Server listening at ${pt.cyan(_)}`),pn(a))try{await fn(_),Yt.success("Opened db-studio in your browser")}catch{Yt.warn(`Could not open your browser. Visit ${pt.cyan(_)}`)}Eo(pt.green("Ready"))};process.env.NODE_ENV!=="test"&&yl().catch(n=>{let t=(n instanceof Error?n.message:String(n)).replace(/\b(?:postgres(?:ql)?|mysql2?|mssql|sqlserver|mongodb(?:\+srv)?|sqlite|rediss?):\/\/\S+/gi,"the configured database");Eo(pt.red(`Startup failed: ${t}`)),process.exit(1)});export{yl as main};
418
420
  //# sourceMappingURL=index.js.map