db-studio 1.16.1 → 1.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/web-dist/assets/{_pathlessLayout-Dm9EQxZz.js → _pathlessLayout-C0MMCDcm.js} +1 -1
- package/dist/web-dist/assets/{_pathlessLayout-KomQW7kv.js → _pathlessLayout-XjSpVK5x.js} +4 -4
- package/dist/web-dist/assets/{_queryId-Y0dZf-cC.js → _queryId-OFkn9Oa-.js} +1 -1
- package/dist/web-dist/assets/{_table-CzH4uICv.js → _table-DWUmdgY6.js} +1 -1
- package/dist/web-dist/assets/{_table-DvAv2WAN.js → _table-jJR4Ocv2.js} +1 -1
- package/dist/web-dist/assets/{badge-D5EgvXjr.js → badge-Bd7hbykP.js} +1 -1
- package/dist/web-dist/assets/{browser-CmMj9Etg.js → browser-B8_CLARX.js} +1 -1
- package/dist/web-dist/assets/{bundle-mjs-CoQqDXYI.js → bundle-mjs-g0oakdN9.js} +1 -1
- package/dist/web-dist/assets/{code-editor-DdbJIkjN.js → code-editor-CTRHqZru.js} +6 -6
- package/dist/web-dist/assets/{database.store-CHdcWrDH.js → database.store-DJ10NZng.js} +10 -10
- package/dist/web-dist/assets/{dist-6oMMpbb8.js → dist-DlZR7Oow.js} +1 -1
- package/dist/web-dist/assets/{format-cell-value-Db6gUQtt.js → format-cell-value-ClBO-Y4U.js} +1 -1
- package/dist/web-dist/assets/{highlighted-body-OFNGDK62-BSdYCCt8.js → highlighted-body-OFNGDK62-jkW4Egvm.js} +1 -1
- package/dist/web-dist/assets/{icons-DhXVo5Bo.js → icons-wNdPUgHM.js} +1 -1
- package/dist/web-dist/assets/{index-CXM-VMxb.js → index-BANk_UGi.js} +4 -4
- package/dist/web-dist/assets/{indexes-BaBT0iJv.js → indexes-hgIGRB__.js} +1 -1
- package/dist/web-dist/assets/{logs-BNgg_Pdy.js → logs-BnjjoFbl.js} +1 -1
- package/dist/web-dist/assets/{mermaid-GHXKKRXX-7XpYx0N7.js → mermaid-GHXKKRXX-BUBXMhKa.js} +1 -1
- package/dist/web-dist/assets/{middleware-BGupJOOn.js → middleware-Bet3mw2T.js} +1 -1
- package/dist/web-dist/assets/{monaco-editor-CjSWDgwd.js → monaco-editor-DxDiR4f3.js} +1 -1
- package/dist/web-dist/assets/{monitoring-BQqmb7Os.js → monitoring-DXY00d-N.js} +1 -1
- package/dist/web-dist/assets/{overlay.store-CIOj_XKm.js → overlay.store-DzkuYBKd.js} +2 -2
- package/dist/web-dist/assets/{queries.store-g9a07xjm.js → queries.store-BlC7QGq6.js} +1 -1
- package/dist/web-dist/assets/{query-runner-CA0GllMK.js → query-runner-CQWHEby5.js} +3 -3
- package/dist/web-dist/assets/{radix-ui-Cct0OxHG.js → radix-ui-D3kd-zkB.js} +1 -1
- package/dist/web-dist/assets/{react-CsZsK598.js → react-1w3eYWHr.js} +1 -1
- package/dist/web-dist/assets/{react-dom-CVM6YmrG.js → react-dom-CnDfVSZQ.js} +1 -1
- package/dist/web-dist/assets/{redis-value-IuKBQ6aR.js → redis-value-D7lbyO7s.js} +1 -1
- package/dist/web-dist/assets/{rolldown-runtime-D_EvJRSK.js → rolldown-runtime-Y-txFyxk.js} +1 -1
- package/dist/web-dist/assets/{runner-DdyjNmVH.js → runner-BqitD-mp.js} +1 -1
- package/dist/web-dist/assets/{schema-E1zLqsI0.js → schema-C27u7buH.js} +1 -1
- package/dist/web-dist/assets/schema-C8mAjJOp.js +1 -0
- package/dist/web-dist/assets/{table-BhJJs1xo.js → table-B1OYFDnr.js} +1 -1
- package/dist/web-dist/assets/{tanstack-Dwt_z01e.js → tanstack-BvmgSO8H.js} +1 -1
- package/dist/web-dist/assets/{use-database-engine-D1BTDQpy.js → use-database-engine-wK2YTpfJ.js} +1 -1
- package/dist/web-dist/assets/{visualizer-CeImbOqE.js → visualizer-CITcnwJh.js} +1 -1
- package/dist/web-dist/index.html +18 -18
- package/package.json +1 -1
- package/dist/web-dist/assets/schema-CDY7Uyya.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var sl=Object.defineProperty;var S=(n,e)=>()=>(n&&(e=n(n=0)),e);var nr=(n,e)=>{for(var t in e)sl(n,t,{get:e[t],enumerable:!0})};var h=S(()=>{"use strict";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};n.SENTRY_RELEASE={id:"db-studio@1.16.1"}}catch{}})()});var va=S(()=>{"use strict";h()});var qa=S(()=>{"use strict";h()});var Ua=S(()=>{"use strict";h()});var Fa,Ba,Xe,Ka=S(()=>{"use strict";h();Fa=globalThis.process?.env,Ba=Fa?.NODE_ENV,Xe={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:Ba==="development",PROXY_URL:Fa?.DB_STUDIO_PROXY_URL??(Ba==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var ja=S(()=>{"use strict";h()});var Ha,ln=S(()=>{"use strict";h();Ha={AUTHOR:"H\xFCsam \u{1F951} <husam@ql3.dev>",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 Wa=S(()=>{"use strict";h()});var kt=S(()=>{"use strict";h();va();qa();Ua();Ka();ja();ln();Wa()});import{z as yt}from"zod";var x,ht,xt,gl,Tl,Te,$e=S(()=>{"use strict";h();x=yt.object({db:yt.string("Database name is required")}),ht=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],xt=yt.enum(ht,{message:"Invalid database type"}),gl=x.extend({dbType:xt}),Tl=yt.object({dbType:xt}),Te=yt.object({tableName:yt.string("Table name is required")})});import{z as Ke}from"zod";var qe,El,wl,Xa=S(()=>{"use strict";h();$e();qe=Ke.object({columnName:Ke.string("Column name is required"),columnType:Ke.string("Column type is required"),defaultValue:Ke.string().optional(),isPrimaryKey:Ke.boolean().default(!1),isNullable:Ke.boolean().default(!1),isUnique:Ke.boolean().default(!1),isIdentity:Ke.boolean().default(!1),isArray:Ke.boolean().default(!1)}),El=Te,wl=Ke.object({db:x.shape.db,tableName:Te.shape.tableName,columnName:qe.shape.columnName,columnType:qe.shape.columnType,defaultValue:qe.shape.defaultValue,isPrimaryKey:qe.shape.isPrimaryKey,isNullable:qe.shape.isNullable,isUnique:qe.shape.isUnique,isIdentity:qe.shape.isIdentity,isArray:qe.shape.isArray})});import{z as vt}from"zod";var pn,Za=S(()=>{"use strict";h();pn=vt.object({tableName:vt.string("Table name is required"),data:vt.record(vt.string("Column name is required"),vt.any())})});import{z as Cl}from"zod";var eo,fn,to,yn,hn=S(()=>{"use strict";h();eo=["gemini","openai","anthropic","grok","openrouter"],fn=Cl.enum(eo),to=[{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"}]}],yn=n=>to.find(e=>e.id===n)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Ue}from"zod";var bn,Ee,Rl,Sl,or=S(()=>{"use strict";h();$e();bn=x.extend({cascade:Ue.string().optional().transform(n=>n==="true")}),Ee=Ue.object({tableName:Ue.string("Table name is required"),columnName:Ue.string("Column name is required")}),Rl=Ue.object({db:x.shape.db,tableName:Ee.shape.tableName,columnName:Ee.shape.columnName,cascade:Ue.boolean().optional()}),Sl=Ue.object({message:Ue.string("Message is required"),tableName:Ue.string("Table name is required"),columnName:Ue.string("Column name is required"),deletedCount:Ue.number("Deleted count is required").default(0)})});import{z as qt}from"zod";var bt,Al,Nl,ro=S(()=>{"use strict";h();$e();or();bt=qt.object({columnType:qt.string("Column type is required"),isNullable:qt.boolean(),defaultValue:qt.string().nullable().optional()}),Al=Ee,Nl=qt.object({db:x.shape.db,tableName:Ee.shape.tableName,columnName:Ee.shape.columnName,columnType:bt.shape.columnType,isNullable:bt.shape.isNullable,defaultValue:bt.shape.defaultValue})});var no=S(()=>{"use strict";h()});import{z as gt}from"zod";var gn,ao=S(()=>{"use strict";h();gn=gt.object({tableName:gt.string().min(1,"Table name is required"),records:gt.array(gt.record(gt.string(),gt.any())).min(1,"At least one record is required")})});import{z as fe}from"zod";var Dl,_l,Tn,oo=S(()=>{"use strict";h();hn();$e();Dl=fe.object({type:fe.string(),content:fe.string().optional()}).passthrough(),_l=fe.object({provider:fn.optional().default("gemini"),model:fe.string().min(1).optional(),messages:fe.array(fe.object({id:fe.string(),role:fe.enum(["user","assistant","system","tool","reasoning"]),content:fe.union([fe.string(),fe.null(),fe.array(fe.unknown())]).optional(),parts:fe.array(Dl).optional()}).passthrough()),data:fe.object({conversationId:fe.string().optional(),db:x.shape.db,includeSchema:fe.boolean().optional().default(!0)})}),Tn=_l.transform(n=>({...n,model:n.model??yn(n.provider)}))});var so=S(()=>{"use strict";h()});import{z as Ie}from"zod";var Ol,io,M,$l,lo,Pl,En=S(()=>{"use strict";h();Ol=["text","boolean","number","enum","json","date","array"],io=Ie.enum(Ol),M={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},$l=["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"],lo=Ie.enum($l),Pl=Ie.object({columnName:Ie.string(),dataType:io,dataTypeLabel:lo,isNullable:Ie.boolean(),columnDefault:Ie.string().nullable(),isPrimaryKey:Ie.boolean(),isForeignKey:Ie.boolean(),referencedTable:Ie.string().nullable(),referencedColumn:Ie.string().nullable(),enumValues:Ie.array(Ie.string()).nullable()})});function sr(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(")?M.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"?M.number:e==="boolean"||e==="bool"?M.boolean:e==="json"||e==="jsonb"?M.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?M.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"?M.text:M.text}function wn(n){if(!n)return b.text;let e=n.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?b.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?b.bigint:e==="smallint"||e==="int2"?b.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?b.numeric:e==="real"||e==="float4"?b.float:e==="double precision"||e==="float8"||e==="float"?b.double:e==="money"?b.money:e==="boolean"||e==="bool"?b.boolean:e==="text"?b.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?b.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?b.char:e==="json"?b.json:e==="jsonb"?b.jsonb:e==="xml"?b.xml:e==="uuid"?b.uuid:e==="date"?b.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?b.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?b.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?b.timestamptz:e==="interval"||e.startsWith("interval")?b.interval:e==="bytea"?b.bytea:e==="inet"?b.inet:e==="cidr"?b.cidr:e==="macaddr"?b.macaddr:e==="macaddr8"?b.macaddr8:e==="point"?b.point:e==="line"?b.line:e==="polygon"?b.polygon:e.startsWith("array")||e.includes("[]")?b.text:e.startsWith("user-defined")||e==="enum"?b.enum:b.text}function ir(n,e){let t=n?.toLowerCase().trim()||"",r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?M.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"?M.number:t==="boolean"||t==="bool"?M.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?M.date:t==="json"?M.json:t==="enum"||t==="set"?M.enum:M.text}function Cn(n,e){if(!n)return b.text;let t=n.toLowerCase().trim(),r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?b.boolean:t==="tinyint"?b.tinyint:t==="smallint"?b.smallint:t==="mediumint"?b.mediumint:t==="int"||t==="integer"?b.int:t==="bigint"?b.bigint:t==="decimal"||t==="numeric"?b.numeric:t==="float"||t==="real"?b.float:t==="double"?b.double:t==="bit"?b.bit:t==="boolean"||t==="bool"?b.boolean:t==="char"?b.char:t==="varchar"?b.varchar:t==="tinytext"?b.tinytext:t==="text"?b.text:t==="mediumtext"?b.mediumtext:t==="longtext"?b.longtext:t==="binary"?b.binary:t==="varbinary"?b.varbinary:t==="tinyblob"?b.tinyblob:t==="blob"?b.blob:t==="mediumblob"?b.mediumblob:t==="longblob"?b.longblob:t==="json"?b.json:t==="date"?b.date:t==="time"?b.time:t==="datetime"?b.datetime:t==="timestamp"?b.timestamp:t==="year"?b.year:t==="enum"?b.enum:t==="set"?b.set:b.text}function lr(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"?M.number:e==="bit"?M.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?M.date:e==="json"?M.json:M.text}function Rn(n){if(!n)return b.text;let e=n.toLowerCase().trim();return e==="tinyint"?b.tinyint:e==="smallint"?b.smallint:e==="int"?b.int:e==="bigint"?b.bigint:e==="decimal"||e==="numeric"?b.numeric:e==="float"||e==="real"?b.float:e==="money"||e==="smallmoney"?b.money:e==="bit"?b.boolean:e==="char"?b.char:e==="varchar"?b.varchar:e==="text"?b.text:e==="nchar"?b.char:e==="nvarchar"?b.varchar:e==="ntext"?b.text:e==="binary"?b.binary:e==="varbinary"?b.varbinary:e==="image"?b.blob:e==="uniqueidentifier"?b.uuid:e==="date"?b.date:e==="time"?b.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?b.datetime:e==="datetimeoffset"?b.timestamptz:e==="json"?b.json:e==="xml"?b.xml:b.text}function cr(n){let e=n?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?M.boolean:e==="json"?M.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?M.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?M.number:M.text}function Sn(n){let e=n?.toLowerCase().trim()||"";return e==="integer"||e==="int"?b.int:e==="bigint"||e.startsWith("bigint(")?b.bigint:e==="smallint"||e.startsWith("smallint(")?b.smallint:e==="tinyint"||e.startsWith("tinyint(")?b.tinyint:e==="mediumint"||e.startsWith("mediumint(")?b.mediumint:e.includes("int")?b.int:e==="real"||e==="float"||e.startsWith("float(")?b.float:e==="double"||e==="double precision"||e.startsWith("double(")?b.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?b.numeric:e==="boolean"||e==="bool"?b.boolean:e==="text"||e==="clob"?b.text:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="char"||e.startsWith("char(")?b.char:e==="json"?b.json:e==="date"?b.date:e==="time"?b.time:e==="datetime"?b.datetime:e==="timestamp"?b.timestamp:e==="blob"?b.blob:b.text}function ur(n){let e=n?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?M.json:e==="boolean"||e==="bool"?M.boolean:e.startsWith("enum")?M.enum:e==="interval"?M.text:e==="date"||e.startsWith("time")||e==="datetime"?M.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?M.number:M.text}function An(n){let e=n?.toLowerCase().trim()||"";return e.endsWith("]")?b.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?b.json:e.startsWith("enum")?b.enum:e==="interval"?b.interval:e==="tinyint"||e==="utinyint"?b.tinyint:e==="smallint"||e==="usmallint"?b.smallint:e==="integer"||e==="int"?b.int:e.includes("int")||e==="bignum"?b.bigint:e.startsWith("decimal")||e.startsWith("numeric")?b.numeric:e==="float"||e==="real"?b.float:e==="double"?b.double:e==="boolean"||e==="bool"?b.boolean:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="uuid"?b.uuid:e==="date"?b.date:e==="timestamp with time zone"||e==="timestamptz"?b.timestamptz:e.startsWith("timestamp")||e==="datetime"?b.timestamp:e.startsWith("time")?b.time:e==="blob"||e==="bytea"?b.blob:e==="bit"||e==="bitstring"?b.bit:b.text}function mr(n){let e=n?.toLowerCase().trim()||"";return e==="boolean"?M.boolean:e==="json"?M.json:e==="date"||e.startsWith("timestamp")?M.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?M.number:M.text}function Nn(n){let e=n?.toLowerCase().trim()||"";if(e==="boolean")return b.boolean;if(e==="json")return b.json;if(e==="xmltype")return b.xml;if(e==="integer")return b.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let r=Number(t[1]);if(r<=4)return b.smallint;if(r<=10)return b.int;if(r<=19)return b.bigint}return e.startsWith("number")?b.numeric:e==="binary_float"?b.float:e==="binary_double"||e.startsWith("float")?b.double:e.startsWith("varchar")||e.startsWith("nvarchar")?b.varchar:e.startsWith("char")||e.startsWith("nchar")?b.char:e.startsWith("timestamp")&&e.endsWith("time zone")?b.timestamptz:e==="date"||e.startsWith("timestamp")?b.timestamp:e.startsWith("interval")?b.interval:e==="blob"||e==="long raw"?b.blob:e.startsWith("raw")?b.varbinary:b.text}function Tt(n){let e=n.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function dr(n){let e=Tt(n);return e.startsWith("Array(")?M.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?M.enum:e==="Bool"?M.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?M.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?M.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?M.json:M.text}function Dn(n){let e=Tt(n);return e.startsWith("Array(")?b.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?b.enum:e==="Bool"?b.boolean:/^U?Int8$/.test(e)?b.tinyint:/^U?Int16$/.test(e)?b.smallint:/^U?Int32$/.test(e)?b.int:/^U?Int(64|128|256)$/.test(e)?b.bigint:e==="Float32"||e==="BFloat16"?b.float:e==="Float64"?b.double:e.startsWith("Decimal")?b.numeric:e.startsWith("FixedString(")?b.char:e==="UUID"?b.uuid:e==="IPv4"||e==="IPv6"?b.inet:e==="Date"||e==="Date32"?b.date:e.startsWith("DateTime64")?b.timestamp:e.startsWith("DateTime")?b.datetime:e.startsWith("Time")?b.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?b.json:b.text}var b,co=S(()=>{"use strict";h();En();b={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 ye}from"zod";var uo,_n,mo,po,On,fo=S(()=>{"use strict";h();uo=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],_n=ye.enum(uo),mo=ye.object({columnName:ye.string("Column name is required"),columnType:ye.string("Column type is required"),defaultValue:ye.string().optional(),isPrimaryKey:ye.boolean().default(!1),isNullable:ye.boolean().default(!1),isUnique:ye.boolean().default(!1),isIdentity:ye.boolean().default(!1),isArray:ye.boolean().default(!1)}),po=ye.object({columnName:ye.string("Column name is required"),referencedTable:ye.string("Referenced table is required"),referencedColumn:ye.string("Referenced column is required"),onUpdate:_n.default("NO ACTION"),onDelete:_n.default("NO ACTION")}),On=ye.object({tableName:ye.string("Table name is required"),fields:ye.array(mo).min(1,"At least one field is required"),foreignKeys:ye.array(po).optional()})});var ee,Et,yo=S(()=>{"use strict";h();$e();ee={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,rowMutation:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,rowMutation:!0},sqlite:{label:"SQLite / libSQL",protocols:["sqlite","libsql"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,rowMutation:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique."}},Et=n=>ht.find(e=>ee[e].protocols.includes(n))});import{z as we}from"zod";var ho,Il,Ll,bo=S(()=>{"use strict";h();$e();ho=we.object({name:we.string("Name is required"),size:we.string("Size is required"),owner:we.string("Owner is required"),encoding:we.string("Encoding is required")}),Il=we.object({databases:we.array(ho),dbType:xt}),Ll=we.object({version:we.string("Version is required"),database:we.string("Database is required"),user:we.string("User is required"),host:we.string("Host is required").nullable(),port:we.number("Port is required").nullable(),active_connections:we.coerce.number("Active connections is required"),max_connections:we.coerce.number("Max connections is required")})});var go=S(()=>{"use strict";h()});import{z as wt}from"zod";var pr,To=S(()=>{"use strict";h();pr=wt.object({tableName:wt.string("Table name is required"),primaryKeys:wt.array(wt.object({columnName:wt.string("Column name is required"),value:wt.any()})).min(1,"At least one primary key is required")})});import{z as Ml}from"zod";var $n,Eo=S(()=>{"use strict";h();$e();$n=x.extend({cascade:Ml.string().optional().transform(n=>n==="true")})});import{z as wo}from"zod";var Pn,Co=S(()=>{"use strict";h();Pn=wo.object({query:wo.string("Query is required")})});import{z as kl}from"zod";var Ro,In,So=S(()=>{"use strict";h();$e();Ro=["csv","xlsx","json"],In=x.extend({format:kl.enum(Ro,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as T}from"zod";var fr,B,Ln,Mn,xl,kn,Ct,vl,ql,Ul,Bl,Fl,Kl,jl,Ao,Hl,xn,Wl,Vl,Yl,zl,Gl,Ql,Jl,vn,Xl,Zl,ec,tc,rc,nc,ac,oc,sc,ic,lc,cc,uc,mc,dc,qn,Un,pc,No=S(()=>{"use strict";h();fr=T.enum(["string","hash","list","set","zset","stream","unknown"]),B=T.object({base64:T.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:T.string().optional()}),Ln=T.object({db:T.string(),cursor:T.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:T.coerce.number().int().min(1).max(200).default(50),search:T.string().max(512).optional(),exactPattern:T.stringbool().default(!1),type:fr.exclude(["unknown"]).optional()}),Mn=T.object({key:B,type:fr,ttlMs:T.number().int(),memoryBytes:T.number().int().nonnegative().nullable()}),xl=T.object({keys:T.array(Mn),nextCursor:T.string().nullable(),hasMore:T.boolean()}),kn=T.object({db:T.string(),cursor:T.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:T.coerce.number().int().min(1).max(500).default(100),full:T.stringbool().default(!1),direction:T.enum(["forward","backward"]).default("forward")}),Ct=T.object({key:T.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),vl=T.object({kind:T.literal("string"),value:B,truncated:T.boolean()}),ql=T.object({kind:T.literal("hash"),entries:T.array(T.object({field:B,value:B}))}),Ul=T.object({kind:T.literal("list"),entries:T.array(T.object({index:T.number().int(),value:B}))}),Bl=T.object({kind:T.literal("set"),members:T.array(B)}),Fl=T.object({kind:T.literal("zset"),entries:T.array(T.object({member:B,score:T.union([T.number(),T.literal("inf"),T.literal("-inf")])}))}),Kl=T.object({kind:T.literal("stream"),entries:T.array(T.object({id:T.string(),fields:T.array(T.object({field:B,value:B}))}))}),jl=T.object({kind:T.literal("unknown")}),Ao=T.discriminatedUnion("kind",[vl,ql,Ul,Bl,Fl,Kl,jl]),Hl=Mn.extend({length:T.number().int().nonnegative().nullable(),revision:T.string(),value:Ao,nextCursor:T.string().nullable(),hasMore:T.boolean()}),xn=T.object({db:T.string(),offset:T.coerce.number().int().nonnegative().default(0),limit:T.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:T.string().optional()}),Wl=T.object({chunk:B,length:T.number().int().nonnegative(),nextOffset:T.number().int().nonnegative().nullable(),hasMore:T.boolean()}),Vl=T.object({kind:T.literal("string"),value:B}),Yl=T.object({kind:T.literal("hash"),entries:T.array(T.object({field:B,value:B})).min(1)}),zl=T.object({kind:T.literal("list"),entries:T.array(B).min(1)}),Gl=T.object({kind:T.literal("set"),members:T.array(B).min(1)}),Ql=T.object({kind:T.literal("zset"),entries:T.array(T.object({member:B,score:T.number()})).min(1)}),Jl=T.object({kind:T.literal("stream"),id:T.string().default("*"),fields:T.array(T.object({field:B,value:B})).min(1)}),vn=T.object({key:B,type:fr.exclude(["unknown"]),value:T.discriminatedUnion("kind",[Vl,Yl,zl,Gl,Ql,Jl]),ttlMs:T.number().int().positive().nullable().default(null)}),Xl=T.object({key:B,revision:T.string().nullable(),deleted:T.boolean()}),Zl=T.object({action:T.literal("rename"),newKey:B}),ec=T.object({action:T.literal("setTtl"),ttlMs:T.number().int().positive().nullable()}),tc=T.object({action:T.literal("setString"),value:B}),rc=T.object({action:T.literal("upsertHash"),field:B,value:B}),nc=T.object({action:T.literal("deleteHash"),field:B}),ac=T.object({action:T.literal("pushList"),side:T.enum(["left","right"]),value:B}),oc=T.object({action:T.literal("setList"),index:T.number().int(),value:B}),sc=T.object({action:T.literal("deleteList"),index:T.number().int()}),ic=T.object({action:T.literal("addSet"),member:B}),lc=T.object({action:T.literal("removeSet"),member:B}),cc=T.object({action:T.literal("upsertZset"),member:B,score:T.number()}),uc=T.object({action:T.literal("removeZset"),member:B}),mc=T.object({action:T.literal("appendStream"),id:T.string().default("*"),fields:T.array(T.object({field:B,value:B})).min(1)}),dc=T.object({action:T.literal("deleteStream"),id:T.string()}),qn=T.object({expectedRevision:T.string(),force:T.boolean().default(!1),operation:T.discriminatedUnion("action",[Zl,ec,tc,rc,nc,ac,oc,sc,ic,lc,cc,uc,mc,dc])}),Un=T.object({db:T.string(),expectedRevision:T.string(),force:T.stringbool().default(!1)}),pc=T.object({deleted:T.boolean()})});var Do=S(()=>{"use strict";h()});import{z as Bn}from"zod";var yr,fc,yc,_o=S(()=>{"use strict";h();$e();or();yr=Bn.object({newColumnName:Bn.string("New column name is required")}),fc=Ee,yc=Bn.object({db:x.shape.db,tableName:Ee.shape.tableName,columnName:Ee.shape.columnName,newColumnName:yr.shape.newColumnName})});import{z as hr}from"zod";var Ut,hc,bc,Oo=S(()=>{"use strict";h();$e();Ut=hr.object({newTableName:hr.string("New table name is required").trim().min(1,"New table name is required"),schemaName:hr.string().trim().min(1).optional()}),hc=Te,bc=hr.object({db:x.shape.db,tableName:Te.shape.tableName,newTableName:Ut.shape.newTableName,schemaName:Ut.shape.schemaName})});import{z as G}from"zod";var gc,Bt,Tc,$o,Ec,Fn,Po=S(()=>{"use strict";h();$e();gc=G.object({columnName:G.string(),operator:G.string(),value:G.string()}),Bt=["asc","desc"],Tc=G.object({columnName:G.string(),direction:G.enum(Bt)}),$o=G.object({limit:G.number(),total:G.number(),hasNextPage:G.boolean(),hasPreviousPage:G.boolean(),nextCursor:G.string().nullable(),prevCursor:G.string().nullable()}),Ec=G.object({data:G.array(G.record(G.string(),G.unknown())),meta:$o}),Fn=G.object({db:x.shape.db,cursor:G.string().optional(),limit:G.string().optional().default("50").transform(Number),direction:G.enum(Bt).optional().default(Bt[0]),sort:G.string().optional().transform(n=>{if(!n)return"";try{let e=JSON.parse(n);return Array.isArray(e)?e:n}catch{return n}}),order:G.enum(Bt).optional(),filters:G.string().optional().transform(n=>{if(!n)return[];try{return JSON.parse(n)}catch{return[]}})})});import{z as br}from"zod";var wc,Io=S(()=>{"use strict";h();wc=br.object({tableName:br.string("Table name is required"),schemaName:br.string().optional(),rowCount:br.coerce.number("Row count is required")})});import{z as Lo}from"zod";var Cc,Mo=S(()=>{"use strict";h();Cc=Lo.object({schema:Lo.string()})});import{z as Le}from"zod";var Kn,ko=S(()=>{"use strict";h();Kn=Le.object({tableName:Le.string("Table name is required"),primaryKey:Le.string("Primary key is required").default("id"),primaryKeys:Le.array(Le.string().min(1)).min(1).optional(),updates:Le.array(Le.object({rowData:Le.record(Le.string("Column name is required"),Le.any()),columnName:Le.string("Column name is required"),value:Le.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var xo={};nr(xo,{AI_PROVIDERS:()=>eo,AI_PROVIDER_OPTIONS:()=>to,DATABASE_ENGINES:()=>ee,DATABASE_TYPES:()=>ht,DataTypes:()=>M,FOREIGN_KEY_ACTIONS:()=>uo,FORMAT_TYPES:()=>Ro,StandardizedDataType:()=>b,addColumnParamSchema:()=>El,addColumnParamsSchema:()=>wl,addColumnSchema:()=>qe,addRecordSchema:()=>pn,aiProviderSchema:()=>fn,alterColumnParamSchema:()=>Al,alterColumnParamsSchema:()=>Nl,alterColumnSchema:()=>bt,bulkInsertRecordsSchema:()=>gn,chatSchema:()=>Tn,columnInfoSchema:()=>Pl,connectionInfoSchema:()=>Ll,createKeySchema:()=>vn,createTableSchema:()=>On,currentDatabaseSchema:()=>gl,dataTypesSchema:()=>io,databaseInfoSchema:()=>ho,databaseListSchema:()=>Il,databaseSchema:()=>x,databaseTypeParamSchema:()=>Tl,databaseTypeSchema:()=>xt,dbTypeFromProtocol:()=>Et,deleteColumnParamSchema:()=>Ee,deleteColumnParamsSchema:()=>Rl,deleteColumnQuerySchema:()=>bn,deleteColumnSuccessResponseSchema:()=>Sl,deleteKeyQuerySchema:()=>Un,deleteKeyResultSchema:()=>pc,deleteRecordSchema:()=>pr,deleteTableQuerySchema:()=>$n,encodedRedisValueSchema:()=>B,executeQuerySchema:()=>Pn,exportTableSchema:()=>In,fieldDataSchema:()=>mo,filterSchema:()=>gc,foreignKeyActionSchema:()=>_n,foreignKeyDataSchema:()=>po,getDefaultAiModel:()=>yn,keyActionSchema:()=>qn,keyDetailsQuerySchema:()=>kn,keyDetailsResultSchema:()=>Hl,keyParamSchema:()=>Ct,keyRawQuerySchema:()=>xn,keyRawResultSchema:()=>Wl,keyScanQuerySchema:()=>Ln,keyScanResultSchema:()=>xl,keyWriteResultSchema:()=>Xl,mapClickhouseToDataType:()=>dr,mapDuckdbToDataType:()=>ur,mapMssqlToDataType:()=>lr,mapMysqlToDataType:()=>ir,mapOracleToDataType:()=>mr,mapPostgresToDataType:()=>sr,mapSqliteToDataType:()=>cr,redisKeySummarySchema:()=>Mn,redisKeyTypeSchema:()=>fr,redisKeyValueSchema:()=>Ao,renameColumnParamSchema:()=>fc,renameColumnParamsSchema:()=>yc,renameColumnSchema:()=>yr,renameTableParamSchema:()=>hc,renameTableParamsSchema:()=>bc,renameTableSchema:()=>Ut,sortDirections:()=>Bt,sortSchema:()=>Tc,standardizeClickhouseDataTypeLabel:()=>Dn,standardizeDataTypeLabel:()=>wn,standardizeDuckdbDataTypeLabel:()=>An,standardizeMssqlDataTypeLabel:()=>Rn,standardizeMysqlDataTypeLabel:()=>Cn,standardizeOracleDataTypeLabel:()=>Nn,standardizeSqliteDataTypeLabel:()=>Sn,standardizedDataTypeSchema:()=>lo,tableDataMetaSchema:()=>$o,tableDataQuerySchema:()=>Fn,tableDataResultSchema:()=>Ec,tableInfoSchema:()=>wc,tableNameSchema:()=>Te,tableSchemaResultSchema:()=>Cc,unwrapClickhouseType:()=>Tt,updateRecordsSchema:()=>Kn});var ae=S(()=>{"use strict";h();Xa();Za();hn();ro();no();ao();oo();so();co();En();fo();$e();yo();bo();go();or();To();Eo();Co();So();No();Do();_o();Oo();Po();Io();Mo();ko()});import{AsyncLocalStorage as _c}from"async_hooks";import{randomUUID as Uo}from"crypto";import{HTTPException as Bo}from"hono/http-exception";var Oc,$c,jn,Fo,Ko,lt,Pc,Ic,Lc,jo,Hn,le,Q,Ze=S(()=>{"use strict";h();Oc=Uo(),$c=/^[A-Za-z0-9_-]{8,64}$/,jn=new _c,Fo=n=>n&&$c.test(n)?n:Uo(),Ko=(n,e)=>jn.run(n,e),lt=()=>jn.getStore()?.requestId,Pc=n=>{let e=n instanceof Bo?"HTTPException":n instanceof Error?n.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},Ic=/^[A-Z0-9_-]{2,32}$/,Lc=[[/^timeout exceeded when trying to connect$/,"POOL_ACQUIRE_TIMEOUT"],[/^(timeout expired|Connection terminated due to connection timeout)$/,"CONNECT_TIMEOUT"],[/^Connection terminated/,"CONNECTION_TERMINATED"],[/^Client has encountered a connection error/,"CONNECTION_BROKEN"]],jo=n=>{if(!(n instanceof Error))return;let{code:e,errno:t,number:r,cause:a}=n;return typeof r=="number"&&Number.isSafeInteger(r)?String(r):typeof e=="string"&&Ic.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):n.name==="ReplyError"?n.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:Lc.find(([o])=>o.test(n.message))?.[1]??jo(a)},Hn=n=>n instanceof Bo&&n.cause?n.cause:n,le=n=>{let e=Hn(n);return{error_type:Pc(e),error_code:jo(e)}},Q=(n,e,t={})=>{let r=jn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:n,event:e,instance_id:Oc,request_id:r?.requestId,operation:r?.operation,db_type:r?.dbType,...t})}
|
|
3
|
-
`)}});function Ae(n=process.env.DATABASE_URL){if(!n)return{host:"localhost",port:5432};try{let e=new URL(n);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||Mc(e)}}catch(e){return Q("error","database_url_unparseable",le(e)),{host:"localhost",port:5432}}}var gr,Mc,Ho,je=S(()=>{"use strict";h();ae();Ze();gr={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},Mc=n=>{let e=n.protocol.replace(":",""),t=Et(e);return gr[e]?.defaultPort??(t&&ee[t].defaultPort)??5432},Ho=n=>{let e=new URL(n),t=gr[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):n}});var ct,Wn=S(()=>{ct={name:"db-studio",type:"module",version:"1.16.
|
|
2
|
+
var sl=Object.defineProperty;var S=(n,e)=>()=>(n&&(e=n(n=0)),e);var nr=(n,e)=>{for(var t in e)sl(n,t,{get:e[t],enumerable:!0})};var h=S(()=>{"use strict";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};n.SENTRY_RELEASE={id:"db-studio@1.16.2"}}catch{}})()});var va=S(()=>{"use strict";h()});var qa=S(()=>{"use strict";h()});var Ua=S(()=>{"use strict";h()});var Fa,Ba,Xe,Ka=S(()=>{"use strict";h();Fa=globalThis.process?.env,Ba=Fa?.NODE_ENV,Xe={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:Ba==="development",PROXY_URL:Fa?.DB_STUDIO_PROXY_URL??(Ba==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var ja=S(()=>{"use strict";h()});var Ha,ln=S(()=>{"use strict";h();Ha={AUTHOR:"H\xFCsam \u{1F951} <husam@ql3.dev>",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 Wa=S(()=>{"use strict";h()});var kt=S(()=>{"use strict";h();va();qa();Ua();Ka();ja();ln();Wa()});import{z as yt}from"zod";var x,ht,xt,gl,Tl,Te,$e=S(()=>{"use strict";h();x=yt.object({db:yt.string("Database name is required")}),ht=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],xt=yt.enum(ht,{message:"Invalid database type"}),gl=x.extend({dbType:xt}),Tl=yt.object({dbType:xt}),Te=yt.object({tableName:yt.string("Table name is required")})});import{z as Ke}from"zod";var qe,El,wl,Xa=S(()=>{"use strict";h();$e();qe=Ke.object({columnName:Ke.string("Column name is required"),columnType:Ke.string("Column type is required"),defaultValue:Ke.string().optional(),isPrimaryKey:Ke.boolean().default(!1),isNullable:Ke.boolean().default(!1),isUnique:Ke.boolean().default(!1),isIdentity:Ke.boolean().default(!1),isArray:Ke.boolean().default(!1)}),El=Te,wl=Ke.object({db:x.shape.db,tableName:Te.shape.tableName,columnName:qe.shape.columnName,columnType:qe.shape.columnType,defaultValue:qe.shape.defaultValue,isPrimaryKey:qe.shape.isPrimaryKey,isNullable:qe.shape.isNullable,isUnique:qe.shape.isUnique,isIdentity:qe.shape.isIdentity,isArray:qe.shape.isArray})});import{z as vt}from"zod";var pn,Za=S(()=>{"use strict";h();pn=vt.object({tableName:vt.string("Table name is required"),data:vt.record(vt.string("Column name is required"),vt.any())})});import{z as Cl}from"zod";var eo,fn,to,yn,hn=S(()=>{"use strict";h();eo=["gemini","openai","anthropic","grok","openrouter"],fn=Cl.enum(eo),to=[{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"}]}],yn=n=>to.find(e=>e.id===n)?.models[0]?.id??"gemini-3-flash-preview"});import{z as Ue}from"zod";var bn,Ee,Rl,Sl,or=S(()=>{"use strict";h();$e();bn=x.extend({cascade:Ue.string().optional().transform(n=>n==="true")}),Ee=Ue.object({tableName:Ue.string("Table name is required"),columnName:Ue.string("Column name is required")}),Rl=Ue.object({db:x.shape.db,tableName:Ee.shape.tableName,columnName:Ee.shape.columnName,cascade:Ue.boolean().optional()}),Sl=Ue.object({message:Ue.string("Message is required"),tableName:Ue.string("Table name is required"),columnName:Ue.string("Column name is required"),deletedCount:Ue.number("Deleted count is required").default(0)})});import{z as qt}from"zod";var bt,Al,Nl,ro=S(()=>{"use strict";h();$e();or();bt=qt.object({columnType:qt.string("Column type is required"),isNullable:qt.boolean(),defaultValue:qt.string().nullable().optional()}),Al=Ee,Nl=qt.object({db:x.shape.db,tableName:Ee.shape.tableName,columnName:Ee.shape.columnName,columnType:bt.shape.columnType,isNullable:bt.shape.isNullable,defaultValue:bt.shape.defaultValue})});var no=S(()=>{"use strict";h()});import{z as gt}from"zod";var gn,ao=S(()=>{"use strict";h();gn=gt.object({tableName:gt.string().min(1,"Table name is required"),records:gt.array(gt.record(gt.string(),gt.any())).min(1,"At least one record is required")})});import{z as fe}from"zod";var Dl,_l,Tn,oo=S(()=>{"use strict";h();hn();$e();Dl=fe.object({type:fe.string(),content:fe.string().optional()}).passthrough(),_l=fe.object({provider:fn.optional().default("gemini"),model:fe.string().min(1).optional(),messages:fe.array(fe.object({id:fe.string(),role:fe.enum(["user","assistant","system","tool","reasoning"]),content:fe.union([fe.string(),fe.null(),fe.array(fe.unknown())]).optional(),parts:fe.array(Dl).optional()}).passthrough()),data:fe.object({conversationId:fe.string().optional(),db:x.shape.db,includeSchema:fe.boolean().optional().default(!0)})}),Tn=_l.transform(n=>({...n,model:n.model??yn(n.provider)}))});var so=S(()=>{"use strict";h()});import{z as Ie}from"zod";var Ol,io,M,$l,lo,Pl,En=S(()=>{"use strict";h();Ol=["text","boolean","number","enum","json","date","array"],io=Ie.enum(Ol),M={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},$l=["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"],lo=Ie.enum($l),Pl=Ie.object({columnName:Ie.string(),dataType:io,dataTypeLabel:lo,isNullable:Ie.boolean(),columnDefault:Ie.string().nullable(),isPrimaryKey:Ie.boolean(),isForeignKey:Ie.boolean(),referencedTable:Ie.string().nullable(),referencedColumn:Ie.string().nullable(),enumValues:Ie.array(Ie.string()).nullable()})});function sr(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(")?M.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"?M.number:e==="boolean"||e==="bool"?M.boolean:e==="json"||e==="jsonb"?M.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?M.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"?M.text:M.text}function wn(n){if(!n)return b.text;let e=n.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?b.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?b.bigint:e==="smallint"||e==="int2"?b.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?b.numeric:e==="real"||e==="float4"?b.float:e==="double precision"||e==="float8"||e==="float"?b.double:e==="money"?b.money:e==="boolean"||e==="bool"?b.boolean:e==="text"?b.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?b.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?b.char:e==="json"?b.json:e==="jsonb"?b.jsonb:e==="xml"?b.xml:e==="uuid"?b.uuid:e==="date"?b.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?b.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?b.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?b.timestamptz:e==="interval"||e.startsWith("interval")?b.interval:e==="bytea"?b.bytea:e==="inet"?b.inet:e==="cidr"?b.cidr:e==="macaddr"?b.macaddr:e==="macaddr8"?b.macaddr8:e==="point"?b.point:e==="line"?b.line:e==="polygon"?b.polygon:e.startsWith("array")||e.includes("[]")?b.text:e.startsWith("user-defined")||e==="enum"?b.enum:b.text}function ir(n,e){let t=n?.toLowerCase().trim()||"",r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?M.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"?M.number:t==="boolean"||t==="bool"?M.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?M.date:t==="json"?M.json:t==="enum"||t==="set"?M.enum:M.text}function Cn(n,e){if(!n)return b.text;let t=n.toLowerCase().trim(),r=e?.toLowerCase().trim()||"";return t==="tinyint"&&r==="tinyint(1)"?b.boolean:t==="tinyint"?b.tinyint:t==="smallint"?b.smallint:t==="mediumint"?b.mediumint:t==="int"||t==="integer"?b.int:t==="bigint"?b.bigint:t==="decimal"||t==="numeric"?b.numeric:t==="float"||t==="real"?b.float:t==="double"?b.double:t==="bit"?b.bit:t==="boolean"||t==="bool"?b.boolean:t==="char"?b.char:t==="varchar"?b.varchar:t==="tinytext"?b.tinytext:t==="text"?b.text:t==="mediumtext"?b.mediumtext:t==="longtext"?b.longtext:t==="binary"?b.binary:t==="varbinary"?b.varbinary:t==="tinyblob"?b.tinyblob:t==="blob"?b.blob:t==="mediumblob"?b.mediumblob:t==="longblob"?b.longblob:t==="json"?b.json:t==="date"?b.date:t==="time"?b.time:t==="datetime"?b.datetime:t==="timestamp"?b.timestamp:t==="year"?b.year:t==="enum"?b.enum:t==="set"?b.set:b.text}function lr(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"?M.number:e==="bit"?M.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?M.date:e==="json"?M.json:M.text}function Rn(n){if(!n)return b.text;let e=n.toLowerCase().trim();return e==="tinyint"?b.tinyint:e==="smallint"?b.smallint:e==="int"?b.int:e==="bigint"?b.bigint:e==="decimal"||e==="numeric"?b.numeric:e==="float"||e==="real"?b.float:e==="money"||e==="smallmoney"?b.money:e==="bit"?b.boolean:e==="char"?b.char:e==="varchar"?b.varchar:e==="text"?b.text:e==="nchar"?b.char:e==="nvarchar"?b.varchar:e==="ntext"?b.text:e==="binary"?b.binary:e==="varbinary"?b.varbinary:e==="image"?b.blob:e==="uniqueidentifier"?b.uuid:e==="date"?b.date:e==="time"?b.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?b.datetime:e==="datetimeoffset"?b.timestamptz:e==="json"?b.json:e==="xml"?b.xml:b.text}function cr(n){let e=n?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?M.boolean:e==="json"?M.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?M.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?M.number:M.text}function Sn(n){let e=n?.toLowerCase().trim()||"";return e==="integer"||e==="int"?b.int:e==="bigint"||e.startsWith("bigint(")?b.bigint:e==="smallint"||e.startsWith("smallint(")?b.smallint:e==="tinyint"||e.startsWith("tinyint(")?b.tinyint:e==="mediumint"||e.startsWith("mediumint(")?b.mediumint:e.includes("int")?b.int:e==="real"||e==="float"||e.startsWith("float(")?b.float:e==="double"||e==="double precision"||e.startsWith("double(")?b.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?b.numeric:e==="boolean"||e==="bool"?b.boolean:e==="text"||e==="clob"?b.text:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="char"||e.startsWith("char(")?b.char:e==="json"?b.json:e==="date"?b.date:e==="time"?b.time:e==="datetime"?b.datetime:e==="timestamp"?b.timestamp:e==="blob"?b.blob:b.text}function ur(n){let e=n?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?M.json:e==="boolean"||e==="bool"?M.boolean:e.startsWith("enum")?M.enum:e==="interval"?M.text:e==="date"||e.startsWith("time")||e==="datetime"?M.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?M.number:M.text}function An(n){let e=n?.toLowerCase().trim()||"";return e.endsWith("]")?b.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?b.json:e.startsWith("enum")?b.enum:e==="interval"?b.interval:e==="tinyint"||e==="utinyint"?b.tinyint:e==="smallint"||e==="usmallint"?b.smallint:e==="integer"||e==="int"?b.int:e.includes("int")||e==="bignum"?b.bigint:e.startsWith("decimal")||e.startsWith("numeric")?b.numeric:e==="float"||e==="real"?b.float:e==="double"?b.double:e==="boolean"||e==="bool"?b.boolean:e==="varchar"||e.startsWith("varchar(")?b.varchar:e==="uuid"?b.uuid:e==="date"?b.date:e==="timestamp with time zone"||e==="timestamptz"?b.timestamptz:e.startsWith("timestamp")||e==="datetime"?b.timestamp:e.startsWith("time")?b.time:e==="blob"||e==="bytea"?b.blob:e==="bit"||e==="bitstring"?b.bit:b.text}function mr(n){let e=n?.toLowerCase().trim()||"";return e==="boolean"?M.boolean:e==="json"?M.json:e==="date"||e.startsWith("timestamp")?M.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?M.number:M.text}function Nn(n){let e=n?.toLowerCase().trim()||"";if(e==="boolean")return b.boolean;if(e==="json")return b.json;if(e==="xmltype")return b.xml;if(e==="integer")return b.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let r=Number(t[1]);if(r<=4)return b.smallint;if(r<=10)return b.int;if(r<=19)return b.bigint}return e.startsWith("number")?b.numeric:e==="binary_float"?b.float:e==="binary_double"||e.startsWith("float")?b.double:e.startsWith("varchar")||e.startsWith("nvarchar")?b.varchar:e.startsWith("char")||e.startsWith("nchar")?b.char:e.startsWith("timestamp")&&e.endsWith("time zone")?b.timestamptz:e==="date"||e.startsWith("timestamp")?b.timestamp:e.startsWith("interval")?b.interval:e==="blob"||e==="long raw"?b.blob:e.startsWith("raw")?b.varbinary:b.text}function Tt(n){let e=n.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function dr(n){let e=Tt(n);return e.startsWith("Array(")?M.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?M.enum:e==="Bool"?M.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?M.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?M.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?M.json:M.text}function Dn(n){let e=Tt(n);return e.startsWith("Array(")?b.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?b.enum:e==="Bool"?b.boolean:/^U?Int8$/.test(e)?b.tinyint:/^U?Int16$/.test(e)?b.smallint:/^U?Int32$/.test(e)?b.int:/^U?Int(64|128|256)$/.test(e)?b.bigint:e==="Float32"||e==="BFloat16"?b.float:e==="Float64"?b.double:e.startsWith("Decimal")?b.numeric:e.startsWith("FixedString(")?b.char:e==="UUID"?b.uuid:e==="IPv4"||e==="IPv6"?b.inet:e==="Date"||e==="Date32"?b.date:e.startsWith("DateTime64")?b.timestamp:e.startsWith("DateTime")?b.datetime:e.startsWith("Time")?b.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?b.json:b.text}var b,co=S(()=>{"use strict";h();En();b={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 ye}from"zod";var uo,_n,mo,po,On,fo=S(()=>{"use strict";h();uo=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],_n=ye.enum(uo),mo=ye.object({columnName:ye.string("Column name is required"),columnType:ye.string("Column type is required"),defaultValue:ye.string().optional(),isPrimaryKey:ye.boolean().default(!1),isNullable:ye.boolean().default(!1),isUnique:ye.boolean().default(!1),isIdentity:ye.boolean().default(!1),isArray:ye.boolean().default(!1)}),po=ye.object({columnName:ye.string("Column name is required"),referencedTable:ye.string("Referenced table is required"),referencedColumn:ye.string("Referenced column is required"),onUpdate:_n.default("NO ACTION"),onDelete:_n.default("NO ACTION")}),On=ye.object({tableName:ye.string("Table name is required"),fields:ye.array(mo).min(1,"At least one field is required"),foreignKeys:ye.array(po).optional()})});var ee,Et,yo=S(()=>{"use strict";h();$e();ee={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,rowMutation:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,rowMutation:!0},sqlite:{label:"SQLite / libSQL",protocols:["sqlite","libsql"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,rowMutation:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,rowMutation:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique."}},Et=n=>ht.find(e=>ee[e].protocols.includes(n))});import{z as we}from"zod";var ho,Il,Ll,bo=S(()=>{"use strict";h();$e();ho=we.object({name:we.string("Name is required"),size:we.string("Size is required"),owner:we.string("Owner is required"),encoding:we.string("Encoding is required")}),Il=we.object({databases:we.array(ho),dbType:xt}),Ll=we.object({version:we.string("Version is required"),database:we.string("Database is required"),user:we.string("User is required"),host:we.string("Host is required").nullable(),port:we.number("Port is required").nullable(),active_connections:we.coerce.number("Active connections is required"),max_connections:we.coerce.number("Max connections is required")})});var go=S(()=>{"use strict";h()});import{z as wt}from"zod";var pr,To=S(()=>{"use strict";h();pr=wt.object({tableName:wt.string("Table name is required"),primaryKeys:wt.array(wt.object({columnName:wt.string("Column name is required"),value:wt.any()})).min(1,"At least one primary key is required")})});import{z as Ml}from"zod";var $n,Eo=S(()=>{"use strict";h();$e();$n=x.extend({cascade:Ml.string().optional().transform(n=>n==="true")})});import{z as wo}from"zod";var Pn,Co=S(()=>{"use strict";h();Pn=wo.object({query:wo.string("Query is required")})});import{z as kl}from"zod";var Ro,In,So=S(()=>{"use strict";h();$e();Ro=["csv","xlsx","json"],In=x.extend({format:kl.enum(Ro,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as T}from"zod";var fr,B,Ln,Mn,xl,kn,Ct,vl,ql,Ul,Bl,Fl,Kl,jl,Ao,Hl,xn,Wl,Vl,Yl,zl,Gl,Ql,Jl,vn,Xl,Zl,ec,tc,rc,nc,ac,oc,sc,ic,lc,cc,uc,mc,dc,qn,Un,pc,No=S(()=>{"use strict";h();fr=T.enum(["string","hash","list","set","zset","stream","unknown"]),B=T.object({base64:T.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:T.string().optional()}),Ln=T.object({db:T.string(),cursor:T.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:T.coerce.number().int().min(1).max(200).default(50),search:T.string().max(512).optional(),exactPattern:T.stringbool().default(!1),type:fr.exclude(["unknown"]).optional()}),Mn=T.object({key:B,type:fr,ttlMs:T.number().int(),memoryBytes:T.number().int().nonnegative().nullable()}),xl=T.object({keys:T.array(Mn),nextCursor:T.string().nullable(),hasMore:T.boolean()}),kn=T.object({db:T.string(),cursor:T.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:T.coerce.number().int().min(1).max(500).default(100),full:T.stringbool().default(!1),direction:T.enum(["forward","backward"]).default("forward")}),Ct=T.object({key:T.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),vl=T.object({kind:T.literal("string"),value:B,truncated:T.boolean()}),ql=T.object({kind:T.literal("hash"),entries:T.array(T.object({field:B,value:B}))}),Ul=T.object({kind:T.literal("list"),entries:T.array(T.object({index:T.number().int(),value:B}))}),Bl=T.object({kind:T.literal("set"),members:T.array(B)}),Fl=T.object({kind:T.literal("zset"),entries:T.array(T.object({member:B,score:T.union([T.number(),T.literal("inf"),T.literal("-inf")])}))}),Kl=T.object({kind:T.literal("stream"),entries:T.array(T.object({id:T.string(),fields:T.array(T.object({field:B,value:B}))}))}),jl=T.object({kind:T.literal("unknown")}),Ao=T.discriminatedUnion("kind",[vl,ql,Ul,Bl,Fl,Kl,jl]),Hl=Mn.extend({length:T.number().int().nonnegative().nullable(),revision:T.string(),value:Ao,nextCursor:T.string().nullable(),hasMore:T.boolean()}),xn=T.object({db:T.string(),offset:T.coerce.number().int().nonnegative().default(0),limit:T.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:T.string().optional()}),Wl=T.object({chunk:B,length:T.number().int().nonnegative(),nextOffset:T.number().int().nonnegative().nullable(),hasMore:T.boolean()}),Vl=T.object({kind:T.literal("string"),value:B}),Yl=T.object({kind:T.literal("hash"),entries:T.array(T.object({field:B,value:B})).min(1)}),zl=T.object({kind:T.literal("list"),entries:T.array(B).min(1)}),Gl=T.object({kind:T.literal("set"),members:T.array(B).min(1)}),Ql=T.object({kind:T.literal("zset"),entries:T.array(T.object({member:B,score:T.number()})).min(1)}),Jl=T.object({kind:T.literal("stream"),id:T.string().default("*"),fields:T.array(T.object({field:B,value:B})).min(1)}),vn=T.object({key:B,type:fr.exclude(["unknown"]),value:T.discriminatedUnion("kind",[Vl,Yl,zl,Gl,Ql,Jl]),ttlMs:T.number().int().positive().nullable().default(null)}),Xl=T.object({key:B,revision:T.string().nullable(),deleted:T.boolean()}),Zl=T.object({action:T.literal("rename"),newKey:B}),ec=T.object({action:T.literal("setTtl"),ttlMs:T.number().int().positive().nullable()}),tc=T.object({action:T.literal("setString"),value:B}),rc=T.object({action:T.literal("upsertHash"),field:B,value:B}),nc=T.object({action:T.literal("deleteHash"),field:B}),ac=T.object({action:T.literal("pushList"),side:T.enum(["left","right"]),value:B}),oc=T.object({action:T.literal("setList"),index:T.number().int(),value:B}),sc=T.object({action:T.literal("deleteList"),index:T.number().int()}),ic=T.object({action:T.literal("addSet"),member:B}),lc=T.object({action:T.literal("removeSet"),member:B}),cc=T.object({action:T.literal("upsertZset"),member:B,score:T.number()}),uc=T.object({action:T.literal("removeZset"),member:B}),mc=T.object({action:T.literal("appendStream"),id:T.string().default("*"),fields:T.array(T.object({field:B,value:B})).min(1)}),dc=T.object({action:T.literal("deleteStream"),id:T.string()}),qn=T.object({expectedRevision:T.string(),force:T.boolean().default(!1),operation:T.discriminatedUnion("action",[Zl,ec,tc,rc,nc,ac,oc,sc,ic,lc,cc,uc,mc,dc])}),Un=T.object({db:T.string(),expectedRevision:T.string(),force:T.stringbool().default(!1)}),pc=T.object({deleted:T.boolean()})});var Do=S(()=>{"use strict";h()});import{z as Bn}from"zod";var yr,fc,yc,_o=S(()=>{"use strict";h();$e();or();yr=Bn.object({newColumnName:Bn.string("New column name is required")}),fc=Ee,yc=Bn.object({db:x.shape.db,tableName:Ee.shape.tableName,columnName:Ee.shape.columnName,newColumnName:yr.shape.newColumnName})});import{z as hr}from"zod";var Ut,hc,bc,Oo=S(()=>{"use strict";h();$e();Ut=hr.object({newTableName:hr.string("New table name is required").trim().min(1,"New table name is required"),schemaName:hr.string().trim().min(1).optional()}),hc=Te,bc=hr.object({db:x.shape.db,tableName:Te.shape.tableName,newTableName:Ut.shape.newTableName,schemaName:Ut.shape.schemaName})});import{z as G}from"zod";var gc,Bt,Tc,$o,Ec,Fn,Po=S(()=>{"use strict";h();$e();gc=G.object({columnName:G.string(),operator:G.string(),value:G.string()}),Bt=["asc","desc"],Tc=G.object({columnName:G.string(),direction:G.enum(Bt)}),$o=G.object({limit:G.number(),total:G.number(),hasNextPage:G.boolean(),hasPreviousPage:G.boolean(),nextCursor:G.string().nullable(),prevCursor:G.string().nullable()}),Ec=G.object({data:G.array(G.record(G.string(),G.unknown())),meta:$o}),Fn=G.object({db:x.shape.db,cursor:G.string().optional(),limit:G.string().optional().default("50").transform(Number),direction:G.enum(Bt).optional().default(Bt[0]),sort:G.string().optional().transform(n=>{if(!n)return"";try{let e=JSON.parse(n);return Array.isArray(e)?e:n}catch{return n}}),order:G.enum(Bt).optional(),filters:G.string().optional().transform(n=>{if(!n)return[];try{return JSON.parse(n)}catch{return[]}})})});import{z as br}from"zod";var wc,Io=S(()=>{"use strict";h();wc=br.object({tableName:br.string("Table name is required"),schemaName:br.string().optional(),rowCount:br.coerce.number("Row count is required")})});import{z as Lo}from"zod";var Cc,Mo=S(()=>{"use strict";h();Cc=Lo.object({schema:Lo.string()})});import{z as Le}from"zod";var Kn,ko=S(()=>{"use strict";h();Kn=Le.object({tableName:Le.string("Table name is required"),primaryKey:Le.string("Primary key is required").default("id"),primaryKeys:Le.array(Le.string().min(1)).min(1).optional(),updates:Le.array(Le.object({rowData:Le.record(Le.string("Column name is required"),Le.any()),columnName:Le.string("Column name is required"),value:Le.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var xo={};nr(xo,{AI_PROVIDERS:()=>eo,AI_PROVIDER_OPTIONS:()=>to,DATABASE_ENGINES:()=>ee,DATABASE_TYPES:()=>ht,DataTypes:()=>M,FOREIGN_KEY_ACTIONS:()=>uo,FORMAT_TYPES:()=>Ro,StandardizedDataType:()=>b,addColumnParamSchema:()=>El,addColumnParamsSchema:()=>wl,addColumnSchema:()=>qe,addRecordSchema:()=>pn,aiProviderSchema:()=>fn,alterColumnParamSchema:()=>Al,alterColumnParamsSchema:()=>Nl,alterColumnSchema:()=>bt,bulkInsertRecordsSchema:()=>gn,chatSchema:()=>Tn,columnInfoSchema:()=>Pl,connectionInfoSchema:()=>Ll,createKeySchema:()=>vn,createTableSchema:()=>On,currentDatabaseSchema:()=>gl,dataTypesSchema:()=>io,databaseInfoSchema:()=>ho,databaseListSchema:()=>Il,databaseSchema:()=>x,databaseTypeParamSchema:()=>Tl,databaseTypeSchema:()=>xt,dbTypeFromProtocol:()=>Et,deleteColumnParamSchema:()=>Ee,deleteColumnParamsSchema:()=>Rl,deleteColumnQuerySchema:()=>bn,deleteColumnSuccessResponseSchema:()=>Sl,deleteKeyQuerySchema:()=>Un,deleteKeyResultSchema:()=>pc,deleteRecordSchema:()=>pr,deleteTableQuerySchema:()=>$n,encodedRedisValueSchema:()=>B,executeQuerySchema:()=>Pn,exportTableSchema:()=>In,fieldDataSchema:()=>mo,filterSchema:()=>gc,foreignKeyActionSchema:()=>_n,foreignKeyDataSchema:()=>po,getDefaultAiModel:()=>yn,keyActionSchema:()=>qn,keyDetailsQuerySchema:()=>kn,keyDetailsResultSchema:()=>Hl,keyParamSchema:()=>Ct,keyRawQuerySchema:()=>xn,keyRawResultSchema:()=>Wl,keyScanQuerySchema:()=>Ln,keyScanResultSchema:()=>xl,keyWriteResultSchema:()=>Xl,mapClickhouseToDataType:()=>dr,mapDuckdbToDataType:()=>ur,mapMssqlToDataType:()=>lr,mapMysqlToDataType:()=>ir,mapOracleToDataType:()=>mr,mapPostgresToDataType:()=>sr,mapSqliteToDataType:()=>cr,redisKeySummarySchema:()=>Mn,redisKeyTypeSchema:()=>fr,redisKeyValueSchema:()=>Ao,renameColumnParamSchema:()=>fc,renameColumnParamsSchema:()=>yc,renameColumnSchema:()=>yr,renameTableParamSchema:()=>hc,renameTableParamsSchema:()=>bc,renameTableSchema:()=>Ut,sortDirections:()=>Bt,sortSchema:()=>Tc,standardizeClickhouseDataTypeLabel:()=>Dn,standardizeDataTypeLabel:()=>wn,standardizeDuckdbDataTypeLabel:()=>An,standardizeMssqlDataTypeLabel:()=>Rn,standardizeMysqlDataTypeLabel:()=>Cn,standardizeOracleDataTypeLabel:()=>Nn,standardizeSqliteDataTypeLabel:()=>Sn,standardizedDataTypeSchema:()=>lo,tableDataMetaSchema:()=>$o,tableDataQuerySchema:()=>Fn,tableDataResultSchema:()=>Ec,tableInfoSchema:()=>wc,tableNameSchema:()=>Te,tableSchemaResultSchema:()=>Cc,unwrapClickhouseType:()=>Tt,updateRecordsSchema:()=>Kn});var ae=S(()=>{"use strict";h();Xa();Za();hn();ro();no();ao();oo();so();co();En();fo();$e();yo();bo();go();or();To();Eo();Co();So();No();Do();_o();Oo();Po();Io();Mo();ko()});import{AsyncLocalStorage as _c}from"async_hooks";import{randomUUID as Uo}from"crypto";import{HTTPException as Bo}from"hono/http-exception";var Oc,$c,jn,Fo,Ko,lt,Pc,Ic,Lc,jo,Hn,le,Q,Ze=S(()=>{"use strict";h();Oc=Uo(),$c=/^[A-Za-z0-9_-]{8,64}$/,jn=new _c,Fo=n=>n&&$c.test(n)?n:Uo(),Ko=(n,e)=>jn.run(n,e),lt=()=>jn.getStore()?.requestId,Pc=n=>{let e=n instanceof Bo?"HTTPException":n instanceof Error?n.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},Ic=/^[A-Z0-9_-]{2,32}$/,Lc=[[/^timeout exceeded when trying to connect$/,"POOL_ACQUIRE_TIMEOUT"],[/^(timeout expired|Connection terminated due to connection timeout)$/,"CONNECT_TIMEOUT"],[/^Connection terminated/,"CONNECTION_TERMINATED"],[/^Client has encountered a connection error/,"CONNECTION_BROKEN"]],jo=n=>{if(!(n instanceof Error))return;let{code:e,errno:t,number:r,cause:a}=n;return typeof r=="number"&&Number.isSafeInteger(r)?String(r):typeof e=="string"&&Ic.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):n.name==="ReplyError"?n.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:Lc.find(([o])=>o.test(n.message))?.[1]??jo(a)},Hn=n=>n instanceof Bo&&n.cause?n.cause:n,le=n=>{let e=Hn(n);return{error_type:Pc(e),error_code:jo(e)}},Q=(n,e,t={})=>{let r=jn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:n,event:e,instance_id:Oc,request_id:r?.requestId,operation:r?.operation,db_type:r?.dbType,...t})}
|
|
3
|
+
`)}});function Ae(n=process.env.DATABASE_URL){if(!n)return{host:"localhost",port:5432};try{let e=new URL(n);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||Mc(e)}}catch(e){return Q("error","database_url_unparseable",le(e)),{host:"localhost",port:5432}}}var gr,Mc,Ho,je=S(()=>{"use strict";h();ae();Ze();gr={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},Mc=n=>{let e=n.protocol.replace(":",""),t=Et(e);return gr[e]?.defaultPort??(t&&ee[t].defaultPort)??5432},Ho=n=>{let e=new URL(n),t=gr[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):n}});var ct,Wn=S(()=>{ct={name:"db-studio",type:"module",version:"1.16.2",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <husam@ql3.dev>",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",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",e2e:"tsx e2e/contract.ts"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.0.1","@clickhouse/client":"^1.24.0","@duckdb/node-api":"^1.5.6-r.1","@hono/node-server":"^2.0.0","@hono/zod-validator":"^0.9.0","@libsql/client":"^0.18.0","@sentry/node":"^10.73.0",commander:"^15.0.0",dotenv:"^18.0.0",hono:"^4.10.4",ioredis:"^6.0.0",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",open:"^11.0.0",oracledb:"^7.0.1",pg:"^8.13.1",picocolors:"^1.1.1","posthog-node":"^5.20.0",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.0.0","@types/oracledb":"^7.0.3","@types/pg":"^8.16.0","@vitest/coverage-v8":"^5.0.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^7.0.2",vitest:"^5.0.0"}}});var es={};nr(es,{captureInstallationActive:()=>Gn,captureServerError:()=>Qn,captureServerEvent:()=>Rr,databaseTypeForRequest:()=>Ft,durationBucket:()=>Yn,getTelemetryConfig:()=>wr,initServerObservability:()=>Zo,isTelemetryEnabled:()=>Nt,operationForRequest:()=>Dt,outcomeForStatus:()=>zn,resetTelemetryId:()=>Vn,setTelemetryEnabled:()=>Cr,startServerSpan:()=>Jn});import{randomUUID as Qo}from"crypto";import{existsSync as Bc,mkdirSync as Fc,readFileSync as Kc,writeFileSync as jc}from"fs";import{homedir as Go,platform as Hc}from"os";import Tr from"path";import*as Me from"@sentry/node";import{PostHog as Wc}from"posthog-node";var Vc,Jo,Er,Yc,zc,rt,St,Gc,Qc,At,Nt,wr,Cr,Vn,Yn,zn,Xo,Dt,Ft,Zo,Rr,Gn,Jc,Qn,Jn,Kt=S(()=>{"use strict";h();ae();Ze();Wn();Vc=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",Jo=()=>{let n=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Tr.join(Go(),".local","state"));return Tr.join(n||Tr.join(Go(),".db-studio"),"db-studio","telemetry.json")},Er=n=>{try{let e=Jo();Fc(Tr.dirname(e),{recursive:!0}),jc(e,JSON.stringify(n),{encoding:"utf8",mode:384})}catch{}},Yc=()=>({installationId:Qo(),enabled:!0}),zc=()=>{let n=Jo();try{if(Bc(n)){let t=JSON.parse(Kc(n,"utf8"));if(typeof t.installationId=="string"&&typeof t.enabled=="boolean")return{installationId:t.installationId,enabled:t.enabled,lastActiveAt:typeof t.lastActiveAt=="string"?t.lastActiveAt:void 0}}}catch{}let e=Yc();return Er(e),e},Gc="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",Qc="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",At=()=>rt??=zc(),Nt=()=>!Vc()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&At().enabled,wr=()=>({enabled:Nt(),installationId:At().installationId,appVersion:ct.version}),Cr=n=>{rt={...At(),enabled:n},Er(rt),n?(St?.enable(),Zo()):(St?.disable(),Me.close(500))},Vn=()=>(rt={...At(),installationId:Qo(),lastActiveAt:void 0},Er(rt),rt.installationId),Yn=n=>n<100?"under_100ms":n<1e3?"100ms_1s":n<5e3?"1s_5s":"over_5s",zn=n=>n>=500?"server_error":n>=400?"client_error":"success",Xo=new RegExp(`^/api/(${ht.join("|")})(?=/|$)`),Dt=(n,e)=>{let t=e.replace(Xo,"/api"),a=[[/^\/api\/databases(?:\/|$)/,"databases"],[/^\/api\/tables(?:\/|$)/,"tables"],[/^\/api\/records(?:\/|$)/,"records"],[/^\/api\/query(?:\/|$)/,"query"],[/^\/api\/keys(?:\/|$)/,"keys"],[/^\/api\/chat(?:\/|$)/,"chat"]].find(([o])=>o.test(t))?.[1]??"other";return`${n.toLowerCase()}_${a}`},Ft=n=>n.match(Xo)?.[1],Zo=()=>{if(!Nt())return;let n=process.env.DB_STUDIO_SENTRY_DSN??Gc;n&&(!Me.isInitialized()||Me.getClient()?.getOptions().enabled===!1)&&Me.init({dsn:n,environment:process.env.NODE_ENV??"production",release:`db-studio@${ct.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,delete t.user,delete t.breadcrumbs,delete t.server_name,t},beforeSendSpan(t){return{...t,data:Object.fromEntries(Object.entries(t.data??{}).filter(([r])=>r.startsWith("db_studio.")))}}});let e=process.env.DB_STUDIO_POSTHOG_KEY??Qc;e&&!St&&(St=new Wc(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Rr=n=>{!Nt()||!St||St.capture({distinctId:At().installationId,event:n.event,properties:{...n.properties,source:"server",app_version:ct.version,$geoip_disable:!1}})},Gn=()=>{if(!Nt())return;let n=At(),e=n.lastActiveAt?Date.parse(n.lastActiveAt):0;Date.now()-e<864e5||(rt={...n,lastActiveAt:new Date().toISOString()},Er(rt),Rr({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:Hc()}}))},Jc=(n,e,t)=>{let r=new Error(t);if(r.name=e,n instanceof Error&&n.stack){let a=n.stack.split(`
|
|
4
4
|
`).slice(1).filter(o=>/^\s*at\s/.test(o));r.stack=[`${e}: ${t}`,...a].join(`
|
|
5
5
|
`)}return r},Qn=(n,{operation:e,status:t,dbType:r})=>{if(!Nt()||t<500)return;let{error_type:a,error_code:o}=le(n),s=lt(),i=`${e} failed with ${t}${o?` ${o}`:""}`;Me.captureException(Jc(Hn(n),a,i),{tags:{operation:e,source:"server",release:ct.version,status:String(t),...r?{db_type:r}:{},error_type:a,...o?{error_code:o}:{},...s?{request_id:s}:{}},fingerprint:[e,String(t),a,o??"unknown"]})},Jn=(n,e,t)=>Me.startSpan({name:n,op:"http.server",attributes:{"db_studio.operation":n,...e?{"db_studio.db_type":e}:{}}},t)});import{resolve as Xc}from"path";import{pathToFileURL as Zc}from"url";import{ClickHouseLogLevel as eu,createClient as tu}from"@clickhouse/client";import{DuckDBInstance as ru}from"@duckdb/node-api";import{createClient as nu}from"@libsql/client";import{Redis as au}from"ioredis";import{MongoClient as ou,ObjectId as Xn}from"mongodb";import su from"mssql";import{createPool as iu}from"mysql2/promise";import lu from"oracledb";import{Pool as ts}from"pg";var Zn,Ne,Sr,Ar,Nr,Dr,nt,_r,Or,$r,Pr,Ir,rs,Lr,ns,as,Mr,kr,ut=S(()=>{"use strict";h();ae();Ze();je();Zn=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;sqliteClient=null;duckdb=null;duckdbQueue=Promise.resolve();oraclePool=null;redisClients=new Map;redisClusterChecked=!1;clickhouseClients=new Map;baseConfig=null;initError=null;constructor(){try{this.initializeBaseConfig()}catch(e){this.initError=e instanceof Error?e:new Error(String(e)),Q("error","db_config_invalid",le(this.initError))}}detectDbType(e){let t=e.protocol.replace(":",""),r=Et(t);if(r)return r;let a=Object.values(ee).map(({label:o,protocols:s})=>`${o} (${s.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");let t=Et(e.split("://")[0]);if(t&&ee[t].defaultPort===null){this.baseConfig={url:e,host:"localhost",port:0,user:"",password:"",dbType:t};return}try{let r=Ho(e),a=new URL(r),o=this.detectDbType(a);this.baseConfig={url:r,host:a.hostname,port:Number.parseInt(a.port,10)||(ee[o].defaultPort??0),user:a.username,password:a.password,dbType:o}}catch(r){throw new Error(r instanceof Error?r.message:String(r))}}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(ee[this.baseConfig.dbType].defaultPort===null)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)}`)}}getSqliteClient(){if(!this.baseConfig||this.baseConfig.dbType!=="sqlite")throw new Error("DATABASE_URL is not a sqlite:// or libsql:// connection");let{url:e}=this.baseConfig;return this.sqliteClient??=this.openSqliteClient(e).catch(t=>{throw this.sqliteClient=null,t}),this.sqliteClient}async openSqliteClient(e){let t=e.startsWith("sqlite://")?e.slice(9):null,r=t===null?e:t===":memory:"?t:Zc(Xc(t)).href,a=nu({url:r,intMode:"bigint"});return a.protocol==="file"&&(await a.execute("PRAGMA journal_mode = WAL"),await a.execute("PRAGMA foreign_keys = ON")),a}async closeSqliteClient(){let e=this.sqliteClient;this.sqliteClient=null,e&&(await e.catch(()=>null))?.close()}withDuckdbConnection(e){let t=this.duckdbQueue.then(async()=>e((await this.openDuckdb()).connection));return this.duckdbQueue=t.catch(()=>{}),t}openDuckdb(){if(!this.baseConfig||this.baseConfig.dbType!=="duckdb")throw new Error("DATABASE_URL is not a duckdb:// connection");if(!this.duckdb){let e=this.baseConfig.url.replace(/^duckdb:\/\//,"");this.duckdb=(async()=>{try{let t=await ru.create(e,{checkpoint_threshold:"0b"});return{instance:t,connection:await t.connect()}}catch(t){this.duckdb=null;let r=t instanceof Error?t.message:String(t);throw r.includes("Could not set lock on file")?new Error(`The DuckDB file "${e}" is locked by another process. Close the other program using it and try again. (${r})`):t}})()}return this.duckdb}async closeDuckdb(){let e=this.duckdb;this.duckdb=null;let t=await e?.catch(()=>null);t?.connection.closeSync(),t?.instance.closeSync()}getOraclePool(){if(!this.baseConfig||this.baseConfig.dbType!=="oracle")throw new Error("DATABASE_URL is not an oracle:// connection");let{url:e,host:t,port:r,user:a,password:o}=this.baseConfig,s=decodeURIComponent(new URL(e).pathname.slice(1));return this.oraclePool??=lu.createPool({user:decodeURIComponent(a),password:decodeURIComponent(o),connectString:`${t}:${r}/${s}`,poolMin:0,poolMax:10,connectTimeout:5,sessionCallback:(i,l,c)=>{i.execute("ALTER SESSION SET TIME_ZONE = '+00:00'").then(()=>i.execute(`ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9' NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM' NLS_NUMERIC_CHARACTERS = '.,'`)).then(()=>c(),c)}}).catch(i=>{throw this.oraclePool=null,i}),this.oraclePool}async closeOraclePool(){let e=this.oraclePool;this.oraclePool=null,await(await e?.catch(()=>null))?.close(0)}getPgPool(e){let t=this.buildConnectionString(e);if(!this.pgPools.has(t)){let r={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new ts(r);a.on("connect",o=>{o.query(`SELECT set_config(
|
|
6
6
|
'search_path',
|
|
@@ -502,7 +502,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
502
502
|
`)}if(n.relationships&&n.relationships.length>0){t+=`
|
|
503
503
|
**Relationships:**
|
|
504
504
|
`;for(let r of n.relationships)t+=` - ${r.fromTable}.${r.fromColumn} -> ${r.toTable}.${r.toColumn}
|
|
505
|
-
`}return t}var $i=S(()=>{"use strict";h();ae()});function _m(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 Om(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 $m(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 Pm(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,$m(s)])))}catch(r){return Q("warn","schema_sample_rows_failed",le(r)),[]}}async function Im(n,e,t){try{return await n.getTableColumns({tableName:e,db:t})}catch(r){return Q("warn","schema_columns_failed",le(r)),[]}}async function Lm(n,e={}){let t=nt(),{includeSampleData:r=!1,maxTables:a}=e,o=F(t);try{let s=await o.getTablesList(n),l=s.slice(0,a??s.length).map(async({schemaName:m,tableName:p})=>{let[d,f]=await Promise.all([Im(o,p,n),r?Pm(o,p,n):Promise.resolve([])]),y={name:m?`${m}.${p}`:p,columns:d.map(_m)};return f.length>0&&(y.sampleData=f),y}),c=await Promise.all(l),u=Om(c);return{dbType:t,tables:c,relationships:u}}catch(s){throw Q("error","schema_fetch_failed",le(s)),new Error(`Failed to fetch database schema: ${s instanceof Error?s.message:"Unknown error"}`)}}async function Pi(n){return Lm(n,{includeSampleData:!0,includeDescriptions:!0})}var Ii=S(()=>{"use strict";h();et();ut();Ze()});import{zValidator as Mm}from"@hono/zod-validator";import{Hono as km}from"hono";import{HTTPException as Li}from"hono/http-exception";var xm,Mi,ki,xi=S(()=>{"use strict";h();kt();ae();Ze();$i();Ii();xm=new Set(["localhost","127.0.0.1","::1","[::1]"]),Mi=()=>{let n;try{n=new URL(Xe.PROXY_URL)}catch{throw new Li(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=xm.has(n.hostname)||n.hostname.endsWith(".localhost");if(n.protocol!=="https:"&&!(n.protocol==="http:"&&e))throw new Li(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return n.origin},ki=new km().basePath("/chat").get("/limit",async n=>{let e=Mi();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")??"","x-request-id":lt()??""}});return t.ok?n.json(await t.json(),200):(Q("warn","chat_limit_unavailable",{proxy_status:t.status}),n.json({limit:3,used:3,remaining:0},200))}catch(t){return Q("warn","chat_limit_unavailable",le(t)),n.json({limit:3,used:3,remaining:0},200)}}).post("/",Mm("json",Tn),async n=>{let{messages:e,data:t,provider:r,model:a}=n.req.valid("json"),{db:o,conversationId:s,includeSchema:i}=t,l=i?await Pi(o):null,c=Oi(l),u={messages:e,conversationId:s,systemPrompt:c,provider:r,model:a},m=await fetch(`${Mi()}/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")??"","x-request-id":lt()??""},body:JSON.stringify(u)});if(!m.ok){Q("warn","chat_proxy_rejected",{proxy_status:m.status,provider:r,model:a});let p=await m.json();return n.json({error:p.error||"Proxy request failed"},m.status)}return new Response(m.body,{status:m.status,headers:m.headers})})});import{Hono as vm}from"hono";var vi,qi=S(()=>{"use strict";h();et();ut();vi=new vm().basePath("/databases").get("/",async n=>{let e=nt(),r=await F(e).getDatabasesList();return n.json({data:{databases:r,dbType:e}},200)}).get("/current",async n=>{let e=nt(),r=await F(e).getCurrentDatabase();return n.json({data:{db:r.db,dbType:e}},200)}).get("/connection",async n=>{let e=nt(),r=await F(e).getDatabaseConnectionInfo();return n.json({data:r},200)})});import{zValidator as ve}from"@hono/zod-validator";import{Hono as qm}from"hono";var Ui,Bi=S(()=>{"use strict";h();ae();et();Ui=new qm().basePath("/keys").get("/",ve("query",Ln),async n=>{let e=n.req.valid("query"),t=n.get("dbType"),r=mt(F(t),t);return n.json({data:await r.scanKeys(e)},200)}).post("/",ve("query",x),ve("json",vn),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.createKey({db:e,...t})},200)}).get("/:key/raw",ve("param",Ct),ve("query",xn),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.getStringChunk({...t,key:e})},200)}).get("/:key",ve("param",Ct),ve("query",kn),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.getKeyDetails({...t,key:e})},200)}).post("/:key/actions",ve("param",Ct),ve("query",x),ve("json",qn),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=mt(F(a),a);return n.json({data:await o.applyKeyAction({db:t,key:e,...r})},200)}).delete("/:key",ve("param",Ct),ve("query",Un),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.deleteKey({...t,key:e})},200)})});import{zValidator as Fi}from"@hono/zod-validator";import{Hono as Um}from"hono";var Ki,ji=S(()=>{"use strict";h();ae();et();Ki=new Um().basePath("/query").post("/",Fi("query",x),Fi("json",Pn),async n=>{let{query:e}=n.req.valid("json"),{db:t}=n.req.valid("query"),r=n.get("dbType"),o=await F(r).executeQuery({query:e,db:t});return n.json({data:o},200)})});import{zValidator as Qe}from"@hono/zod-validator";import{Hono as Bm}from"hono";var Hi,Wi=S(()=>{"use strict";h();ae();et();Hi=new Bm().basePath("/records").post("/",Qe("query",x),Qe("json",pn),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,data:r}=n.req.valid("json"),a=n.get("dbType"),o=F(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("/",Qe("query",x),Qe("json",Kn),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType"),a=F(r),{updatedCount:o}=await a.updateRecords({params:t,db:e});return n.json({data:`Updated ${o} records in "${t.tableName}"`},200)}).delete("/",Qe("query",x),Qe("json",pr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),o=F(a),{deletedCount:s,fkViolation:i,relatedRecords:l}=await o.deleteRecords({tableName:t,primaryKeys:r,db:e});return i?n.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:l}},409):n.json({data:{deletedCount:s,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",Qe("query",x),Qe("json",pr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),s=await F(a).forceDeleteRecords({tableName:t,primaryKeys:r,db:e});return n.json({data:s},200)}).post("/bulk",Qe("query",x),Qe("json",gn),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,records:r}=n.req.valid("json"),a=n.get("dbType"),s=await F(a).bulkInsertRecords({tableName:t,records:r,db:e});return n.json({data:s},200)})});import{utils as Zt,write as Fm}from"xlsx";function Yi({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=Zt.aoa_to_sheet(Vi(n,e)),o=Zt.sheet_to_csv(a);return new Uint8Array(Buffer.from(o,"utf-8"))}case"xlsx":{let a=Zt.aoa_to_sheet(Vi(n,e)),o=Zt.book_new();Zt.book_append_sheet(o,a,r.slice(0,31));let s=Fm(o,{bookType:"xlsx",type:"buffer"});return new Uint8Array(s)}}}var Km,Vi,zi=S(()=>{"use strict";h();Km=n=>n==null||n instanceof Date?n:Buffer.isBuffer(n)?`0x${n.toString("hex")}`:typeof n=="object"?JSON.stringify(n):typeof n=="bigint"?n.toString():n,Vi=(n,e)=>[n,...e?.map(t=>n?.map(r=>Km(t[r])))??[]]});import{zValidator as z}from"@hono/zod-validator";import{Hono as jm}from"hono";var Gi,Qi=S(()=>{"use strict";h();ae();et();zi();Gi=new jm().basePath("/tables").get("/",z("query",x),async n=>{let{db:e}=n.req.valid("query"),t=n.get("dbType"),a=await F(t).getTablesList(e);return n.json({data:a},200)}).post("/",z("query",x),z("json",On),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType");return await F(r).createTable({tableData:t,db:e}),n.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",z("query",$n),z("param",Te),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r}=n.req.valid("param"),a=n.get("dbType"),s=await F(a).deleteTable({tableName:r,db:e,cascade:t});return n.json({data:s},200)}).patch("/:tableName/rename",z("query",x),z("param",Te),z("json",Ut),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 F(a).renameTable({tableName:t,db:e,...r}),n.json({data:`Table "${t}" renamed to "${r.newTableName}"`},200)}).delete("/:tableName/columns/:columnName",z("query",bn),z("param",Ee),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r,columnName:a}=n.req.valid("param"),o=n.get("dbType"),s=F(o),{deletedCount:i}=await s.deleteColumn({tableName:r,columnName:a,cascade:t,db:e});return n.json({data:`Column "${a}" deleted successfully from table "${r}" with ${i} rows deleted`},200)}).post("/:tableName/columns",z("query",x),z("param",Te),z("json",qe),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 F(a).addColumn({tableName:t,db:e,...r}),n.json({data:`Column "${r.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",z("query",x),z("param",Ee),z("json",yr),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 F(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",z("query",x),z("param",Ee),z("json",bt),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 F(o).alterColumn({tableName:t,columnName:r,db:e,...a}),n.json({data:`Column "${r}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",z("query",x),z("param",Te),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await F(r).getTableColumns({tableName:t,db:e});return n.json({data:o},200)}).get("/:tableName/schema",z("query",x),z("param",Te),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await F(r).getTableSchema({tableName:t,db:e});return n.json({data:{schema:o}},200)}).get("/:tableName/data",z("param",Te),z("query",Fn),async n=>{let{tableName:e}=n.req.valid("param"),{cursor:t,limit:r,direction:a,sort:o,order:s,filters:i,db:l}=n.req.valid("query"),c=n.get("dbType"),m=await F(c).getTableData({tableName:e,cursor:t,limit:r,direction:a,sort:o,order:s,filters:i,db:l});return n.json({data:m},200)}).get("/:tableName/export",z("param",Te),z("query",In),async n=>{let{tableName:e}=n.req.valid("param"),{db:t,format:r}=n.req.valid("query"),a=n.get("dbType"),o=F(a),{cols:s,rows:i}=await o.exportTableData({tableName:e,db:t}),l=Yi({cols:s,rows:i,format:r,tableName:e}),c;switch(r){case"csv":c="text/csv";break;case"xlsx":c="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":c="application/json";break}return new Response(l,{headers:{"Content-Type":c??"","Content-Disposition":`attachment; filename="${e}_export.${r}"`}})})});import{Hono as Hm}from"hono";import{z as Ji}from"zod";var Wm,Xi,Zi=S(()=>{"use strict";h();Kt();Wm=Ji.object({enabled:Ji.boolean()}).strict(),Xi=new Hm().basePath("/telemetry").get("/config",async n=>((n.req.header("x-db-studio-gpc")==="1"||n.req.header("sec-gpc")==="1")&&Cr(!1),Gn(),n.json({data:wr()},200))).put("/preference",async n=>{let e=Wm.safeParse(await n.req.json().catch(()=>{}));return e.success?(Cr(e.data.enabled),n.json({data:wr()},200)):n.json({error:"Invalid telemetry preference"},400)}).post("/reset",async n=>n.json({data:{installationId:Vn()}},200))});var nl={};nr(nl,{createServer:()=>Zm});import{existsSync as el}from"fs";import st from"path";import{fileURLToPath as Vm}from"url";import{serveStatic as er}from"@hono/node-server/serve-static";import{zValidator as Ym}from"@hono/zod-validator";import{Hono as zm}from"hono";import{cors as Gm}from"hono/cors";import{HTTPException as Qm}from"hono/http-exception";import{logger as Jm}from"hono/logger";import{prettyJSON as Xm}from"hono/pretty-json";import{z as tl}from"zod";var Fe,tr,rl,Zm,al=S(()=>{"use strict";h();kt();et();Ci();Di();Kt();Ze();xi();qi();Bi();ji();Wi();Qi();Zi();({API_PREFIX:Fe}=Xe),tr=()=>{if(process.env.NODE_ENV==="development")return st.resolve(process.cwd(),"../web/dist");let n=st.dirname(Vm(import.meta.url)),e=st.resolve(n,"./web-dist"),t=st.resolve(process.cwd(),"../web/dist"),r=st.resolve(e,"index.html"),a=st.resolve(t,"index.html");return!el(r)&&el(a)?t:e},rl=tl.object({dbType:tl.string().refine(n=>ge.getSupportedTypes().includes(n),{message:`Invalid database type. Supported types: ${ge.getSupportedTypes().join(", ")}`})}),Zm=()=>{wi();let n=new zm({strict:!1}).use("/*",(e,t)=>{let r=Fo(e.req.header("x-request-id"));return Ko({requestId:r,operation:Dt(e.req.method,e.req.path),dbType:Ft(e.req.path)},async()=>{await t(),e.header("X-Request-Id",r)})}).use("/*",Gm({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","PATCH","DELETE","OPTIONS"],allowHeaders:["Content-Type","X-Run-Id","X-Request-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],maxAge:600})).use(Xm({space:2})).use(process.env.NODE_ENV==="development"?Jm():(e,t)=>t()).use(`${Fe}/*`,async(e,t)=>{if(e.req.path.startsWith(`${Fe}/telemetry`))return t();let r=performance.now(),a=Dt(e.req.method,e.req.path),o=e.req.path.split("/")[2],s=ge.getSupportedTypes().find(i=>i===o);await Jn(a,s,t),Rr({event:"server_operation",properties:{operation:a,method:e.req.method,outcome:zn(e.res.status),duration_bucket:Yn(performance.now()-r),db_type:s}})}).use("/favicon.ico",er({path:st.resolve(tr(),"favicon.ico")})).onError(Ni).route(Fe,vi).route(Fe,ki).route(Fe,Xi).use("/assets/*",er({root:tr()})).use("/image.png",er({root:tr()})).use(`${Fe}/:dbType/*`,Ym("param",rl,(e,t)=>{if(!e.success){let r=t.req.param("dbType");throw new Qm(400,{message:`Invalid database type: "${r}". Supported types: ${ge.getSupportedTypes().join(", ")}`})}}),async(e,t)=>{let{dbType:r}=rl.parse({dbType:e.req.param("dbType")});e.set("dbType",r),await t()}).route(`${Fe}/:dbType`,Gi).route(`${Fe}/:dbType`,Hi).route(`${Fe}/:dbType`,Ki).route(`${Fe}/:dbType`,Ui);return process.env.NODE_ENV!=="test"&&(n.all(`${Fe}/*`,e=>e.json({error:"Not found"},404)),n.use("/*",er({root:tr()})),n.get("/*",er({path:st.resolve(tr(),"index.html")}))),{app:n}}});h();h();(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new n.Error().stack;e&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[e]="15319065-444a-462f-b1f3-fe5e5971de4c",n._sentryDebugIdIdentifier="sentry-dbid-15319065-444a-462f-b1f3-fe5e5971de4c")}catch{}})();h();kt();import{intro as ed,log as sn,outro as ol,spinner as td}from"@clack/prompts";import{serve as rd}from"@hono/node-server";import rr from"picocolors";h();import{program as cn}from"commander";var Va=()=>{cn.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=cn.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&cn.error("Do not combine --open and --no-open"),{...n,open:e?!0:t?!1:void 0}};h();import{readFile as il}from"fs/promises";import{resolve as ll}from"path";import{cancel as ar,isCancel as un,note as Ya,select as cl,spinner as ul,text as za}from"@clack/prompts";import{parse as ml}from"dotenv";import mn from"picocolors";var Ga=async(n,e)=>{let t=e||"DATABASE_URL";if(n?.[t])return n[t];if(process.env[t])return process.env[t];let r=ul();r.start("Looking for database connection..."),n?Ya(mn.red(`${t} not found in .env or process.env`)):Ya(mn.red(`No .env file found and ${t} not set in process.env`));let a=await cl({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((un(a)||a==="cancel")&&(ar("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){r.start("Waiting for path...");let s=await za({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(l){if(!l?.trim())return"Path is required"}});un(s)&&(ar("Cancelled."),process.exit(0)),r.stop("Trying custom .env...");let i=ll(s);try{let l=await il(i,"utf-8"),c=ml(l);if(c[t])return c[t];throw new Error(`${t} still missing in custom file`)}catch(l){let c=l;ar(`Cannot read or parse file: ${mn.dim(c.message)}`),process.exit(1)}}r.stop("Manual input...");let o=await za({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 un(o)&&(ar("Cancelled."),process.exit(0)),o.trim()};h();import{access as dl,readFile as pl}from"fs/promises";import{dirname as fl,resolve as dn}from"path";import{parse as yl}from"dotenv";var hl=async n=>{let e=dn(n);for(;;){let t=dn(e,".env");try{return await dl(t),t}catch{}let r=fl(e);if(r===e)return null;e=r}},ft=async n=>{let e;if(n?e=dn(n):e=await hl(process.cwd()),!e)return null;try{let t=await pl(e,"utf-8");return yl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};h();import bl from"open";var Qa=n=>n===!0,Ja=async n=>{await bl(n)};h();ae();var Rc=Object.values(ee).flatMap(({protocols:n})=>n).map(n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),Sc=new RegExp(`\\b(?:${Rc}):\\/\\/\\S+`,"gi"),Ac=/\b(authToken=)[^&\s]+/gi,vo=n=>n.replace(Sc,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(Ac,"$1[redacted]");h();ln();ae();import{intro as Nc,outro as Dc}from"@clack/prompts";import Rt from"picocolors";var qo=()=>{Nc(Rt.inverse(" db-studio ")),console.log(Rt.bold(`
|
|
505
|
+
`}return t}var $i=S(()=>{"use strict";h();ae()});function _m(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 Om(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 $m(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 Pm(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,$m(s)])))}catch(r){return Q("warn","schema_sample_rows_failed",le(r)),[]}}async function Im(n,e,t){try{return await n.getTableColumns({tableName:e,db:t})}catch(r){return Q("warn","schema_columns_failed",le(r)),[]}}async function Lm(n,e={}){let t=nt(),{includeSampleData:r=!1,maxTables:a}=e,o=F(t);try{let s=await o.getTablesList(n),l=s.slice(0,a??s.length).map(async({schemaName:m,tableName:p})=>{let[d,f]=await Promise.all([Im(o,p,n),r?Pm(o,p,n):Promise.resolve([])]),y={name:m?`${m}.${p}`:p,columns:d.map(_m)};return f.length>0&&(y.sampleData=f),y}),c=await Promise.all(l),u=Om(c);return{dbType:t,tables:c,relationships:u}}catch(s){throw Q("error","schema_fetch_failed",le(s)),new Error(`Failed to fetch database schema: ${s instanceof Error?s.message:"Unknown error"}`)}}async function Pi(n){return Lm(n,{includeSampleData:!0,includeDescriptions:!0})}var Ii=S(()=>{"use strict";h();et();ut();Ze()});import{zValidator as Mm}from"@hono/zod-validator";import{Hono as km}from"hono";import{HTTPException as Li}from"hono/http-exception";var xm,Mi,ki,xi=S(()=>{"use strict";h();kt();ae();Ze();$i();Ii();xm=new Set(["localhost","127.0.0.1","::1","[::1]"]),Mi=()=>{let n;try{n=new URL(Xe.PROXY_URL)}catch{throw new Li(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=xm.has(n.hostname)||n.hostname.endsWith(".localhost");if(n.protocol!=="https:"&&!(n.protocol==="http:"&&e))throw new Li(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return n.origin},ki=new km().basePath("/chat").get("/limit",async n=>{let e=Mi();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")??"","x-request-id":lt()??""}});return t.ok?n.json(await t.json(),200):(Q("warn","chat_limit_unavailable",{proxy_status:t.status}),n.json({limit:3,used:3,remaining:0},200))}catch(t){return Q("warn","chat_limit_unavailable",le(t)),n.json({limit:3,used:3,remaining:0},200)}}).post("/",Mm("json",Tn),async n=>{let{messages:e,data:t,provider:r,model:a}=n.req.valid("json"),{db:o,conversationId:s,includeSchema:i}=t,l=i?await Pi(o):null,c=Oi(l),u={messages:e,conversationId:s,systemPrompt:c,provider:r,model:a},m=await fetch(`${Mi()}/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")??"","x-request-id":lt()??""},body:JSON.stringify(u)});if(!m.ok){Q("warn","chat_proxy_rejected",{proxy_status:m.status,provider:r,model:a});let p=await m.json();return n.json({error:p.error||"Proxy request failed"},m.status)}return new Response(m.body,{status:m.status,headers:m.headers})})});import{Hono as vm}from"hono";var vi,qi=S(()=>{"use strict";h();et();ut();vi=new vm().basePath("/databases").get("/",async n=>{let e=nt(),r=await F(e).getDatabasesList();return n.json({data:{databases:r,dbType:e}},200)}).get("/current",async n=>{let e=nt(),r=await F(e).getCurrentDatabase();return n.json({data:{db:r.db,dbType:e}},200)}).get("/connection",async n=>{let e=nt(),r=await F(e).getDatabaseConnectionInfo();return n.json({data:r},200)})});import{zValidator as ve}from"@hono/zod-validator";import{Hono as qm}from"hono";var Ui,Bi=S(()=>{"use strict";h();ae();et();Ui=new qm().basePath("/keys").get("/",ve("query",Ln),async n=>{let e=n.req.valid("query"),t=n.get("dbType"),r=mt(F(t),t);return n.json({data:await r.scanKeys(e)},200)}).post("/",ve("query",x),ve("json",vn),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.createKey({db:e,...t})},200)}).get("/:key/raw",ve("param",Ct),ve("query",xn),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.getStringChunk({...t,key:e})},200)}).get("/:key",ve("param",Ct),ve("query",kn),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.getKeyDetails({...t,key:e})},200)}).post("/:key/actions",ve("param",Ct),ve("query",x),ve("json",qn),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=mt(F(a),a);return n.json({data:await o.applyKeyAction({db:t,key:e,...r})},200)}).delete("/:key",ve("param",Ct),ve("query",Un),async n=>{let{key:e}=n.req.valid("param"),t=n.req.valid("query"),r=n.get("dbType"),a=mt(F(r),r);return n.json({data:await a.deleteKey({...t,key:e})},200)})});import{zValidator as Fi}from"@hono/zod-validator";import{Hono as Um}from"hono";var Ki,ji=S(()=>{"use strict";h();ae();et();Ki=new Um().basePath("/query").post("/",Fi("query",x),Fi("json",Pn),async n=>{let{query:e}=n.req.valid("json"),{db:t}=n.req.valid("query"),r=n.get("dbType"),o=await F(r).executeQuery({query:e,db:t});return n.json({data:o},200)})});import{zValidator as Qe}from"@hono/zod-validator";import{Hono as Bm}from"hono";var Hi,Wi=S(()=>{"use strict";h();ae();et();Hi=new Bm().basePath("/records").post("/",Qe("query",x),Qe("json",pn),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,data:r}=n.req.valid("json"),a=n.get("dbType"),o=F(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("/",Qe("query",x),Qe("json",Kn),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType"),a=F(r),{updatedCount:o}=await a.updateRecords({params:t,db:e});return n.json({data:`Updated ${o} records in "${t.tableName}"`},200)}).delete("/",Qe("query",x),Qe("json",pr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),o=F(a),{deletedCount:s,fkViolation:i,relatedRecords:l}=await o.deleteRecords({tableName:t,primaryKeys:r,db:e});return i?n.json({data:{deletedCount:0,fkViolation:!0,relatedRecords:l}},409):n.json({data:{deletedCount:s,fkViolation:!1,relatedRecords:[]}},200)}).delete("/force",Qe("query",x),Qe("json",pr),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,primaryKeys:r}=n.req.valid("json"),a=n.get("dbType"),s=await F(a).forceDeleteRecords({tableName:t,primaryKeys:r,db:e});return n.json({data:s},200)}).post("/bulk",Qe("query",x),Qe("json",gn),async n=>{let{db:e}=n.req.valid("query"),{tableName:t,records:r}=n.req.valid("json"),a=n.get("dbType"),s=await F(a).bulkInsertRecords({tableName:t,records:r,db:e});return n.json({data:s},200)})});import{utils as Zt,write as Fm}from"xlsx";function Yi({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=Zt.aoa_to_sheet(Vi(n,e)),o=Zt.sheet_to_csv(a);return new Uint8Array(Buffer.from(o,"utf-8"))}case"xlsx":{let a=Zt.aoa_to_sheet(Vi(n,e)),o=Zt.book_new();Zt.book_append_sheet(o,a,r.slice(0,31));let s=Fm(o,{bookType:"xlsx",type:"buffer"});return new Uint8Array(s)}}}var Km,Vi,zi=S(()=>{"use strict";h();Km=n=>n==null||n instanceof Date?n:Buffer.isBuffer(n)?`0x${n.toString("hex")}`:typeof n=="object"?JSON.stringify(n):typeof n=="bigint"?n.toString():n,Vi=(n,e)=>[n,...e?.map(t=>n?.map(r=>Km(t[r])))??[]]});import{zValidator as z}from"@hono/zod-validator";import{Hono as jm}from"hono";var Gi,Qi=S(()=>{"use strict";h();ae();et();zi();Gi=new jm().basePath("/tables").get("/",z("query",x),async n=>{let{db:e}=n.req.valid("query"),t=n.get("dbType"),a=await F(t).getTablesList(e);return n.json({data:a},200)}).post("/",z("query",x),z("json",On),async n=>{let{db:e}=n.req.valid("query"),t=n.req.valid("json"),r=n.get("dbType");return await F(r).createTable({tableData:t,db:e}),n.json({data:`Table ${t.tableName} created successfully`},200)}).delete("/:tableName",z("query",$n),z("param",Te),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r}=n.req.valid("param"),a=n.get("dbType"),s=await F(a).deleteTable({tableName:r,db:e,cascade:t});return n.json({data:s},200)}).patch("/:tableName/rename",z("query",x),z("param",Te),z("json",Ut),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 F(a).renameTable({tableName:t,db:e,...r}),n.json({data:`Table "${t}" renamed to "${r.newTableName}"`},200)}).delete("/:tableName/columns/:columnName",z("query",bn),z("param",Ee),async n=>{let{db:e,cascade:t}=n.req.valid("query"),{tableName:r,columnName:a}=n.req.valid("param"),o=n.get("dbType"),s=F(o),{deletedCount:i}=await s.deleteColumn({tableName:r,columnName:a,cascade:t,db:e});return n.json({data:`Column "${a}" deleted successfully from table "${r}" with ${i} rows deleted`},200)}).post("/:tableName/columns",z("query",x),z("param",Te),z("json",qe),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 F(a).addColumn({tableName:t,db:e,...r}),n.json({data:`Column "${r.columnName}" added successfully to table "${t}"`},200)}).patch("/:tableName/columns/:columnName/rename",z("query",x),z("param",Ee),z("json",yr),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 F(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",z("query",x),z("param",Ee),z("json",bt),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 F(o).alterColumn({tableName:t,columnName:r,db:e,...a}),n.json({data:`Column "${r}" updated successfully in table "${t}"`},200)}).get("/:tableName/columns",z("query",x),z("param",Te),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await F(r).getTableColumns({tableName:t,db:e});return n.json({data:o},200)}).get("/:tableName/schema",z("query",x),z("param",Te),async n=>{let{db:e}=n.req.valid("query"),{tableName:t}=n.req.valid("param"),r=n.get("dbType"),o=await F(r).getTableSchema({tableName:t,db:e});return n.json({data:{schema:o}},200)}).get("/:tableName/data",z("param",Te),z("query",Fn),async n=>{let{tableName:e}=n.req.valid("param"),{cursor:t,limit:r,direction:a,sort:o,order:s,filters:i,db:l}=n.req.valid("query"),c=n.get("dbType"),m=await F(c).getTableData({tableName:e,cursor:t,limit:r,direction:a,sort:o,order:s,filters:i,db:l});return n.json({data:m},200)}).get("/:tableName/export",z("param",Te),z("query",In),async n=>{let{tableName:e}=n.req.valid("param"),{db:t,format:r}=n.req.valid("query"),a=n.get("dbType"),o=F(a),{cols:s,rows:i}=await o.exportTableData({tableName:e,db:t}),l=Yi({cols:s,rows:i,format:r,tableName:e}),c;switch(r){case"csv":c="text/csv";break;case"xlsx":c="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":c="application/json";break}return new Response(l,{headers:{"Content-Type":c??"","Content-Disposition":`attachment; filename="${e}_export.${r}"`}})})});import{Hono as Hm}from"hono";import{z as Ji}from"zod";var Wm,Xi,Zi=S(()=>{"use strict";h();Kt();Wm=Ji.object({enabled:Ji.boolean()}).strict(),Xi=new Hm().basePath("/telemetry").get("/config",async n=>((n.req.header("x-db-studio-gpc")==="1"||n.req.header("sec-gpc")==="1")&&Cr(!1),Gn(),n.json({data:wr()},200))).put("/preference",async n=>{let e=Wm.safeParse(await n.req.json().catch(()=>{}));return e.success?(Cr(e.data.enabled),n.json({data:wr()},200)):n.json({error:"Invalid telemetry preference"},400)}).post("/reset",async n=>n.json({data:{installationId:Vn()}},200))});var nl={};nr(nl,{createServer:()=>Zm});import{existsSync as el}from"fs";import st from"path";import{fileURLToPath as Vm}from"url";import{serveStatic as er}from"@hono/node-server/serve-static";import{zValidator as Ym}from"@hono/zod-validator";import{Hono as zm}from"hono";import{cors as Gm}from"hono/cors";import{HTTPException as Qm}from"hono/http-exception";import{logger as Jm}from"hono/logger";import{prettyJSON as Xm}from"hono/pretty-json";import{z as tl}from"zod";var Fe,tr,rl,Zm,al=S(()=>{"use strict";h();kt();et();Ci();Di();Kt();Ze();xi();qi();Bi();ji();Wi();Qi();Zi();({API_PREFIX:Fe}=Xe),tr=()=>{if(process.env.NODE_ENV==="development")return st.resolve(process.cwd(),"../web/dist");let n=st.dirname(Vm(import.meta.url)),e=st.resolve(n,"./web-dist"),t=st.resolve(process.cwd(),"../web/dist"),r=st.resolve(e,"index.html"),a=st.resolve(t,"index.html");return!el(r)&&el(a)?t:e},rl=tl.object({dbType:tl.string().refine(n=>ge.getSupportedTypes().includes(n),{message:`Invalid database type. Supported types: ${ge.getSupportedTypes().join(", ")}`})}),Zm=()=>{wi();let n=new zm({strict:!1}).use("/*",(e,t)=>{let r=Fo(e.req.header("x-request-id"));return Ko({requestId:r,operation:Dt(e.req.method,e.req.path),dbType:Ft(e.req.path)},async()=>{await t(),e.header("X-Request-Id",r)})}).use("/*",Gm({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","PATCH","DELETE","OPTIONS"],allowHeaders:["Content-Type","X-Run-Id","X-Request-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],maxAge:600})).use(Xm({space:2})).use(process.env.NODE_ENV==="development"?Jm():(e,t)=>t()).use(`${Fe}/*`,async(e,t)=>{if(e.req.path.startsWith(`${Fe}/telemetry`))return t();let r=performance.now(),a=Dt(e.req.method,e.req.path),o=e.req.path.split("/")[2],s=ge.getSupportedTypes().find(i=>i===o);await Jn(a,s,t),Rr({event:"server_operation",properties:{operation:a,method:e.req.method,outcome:zn(e.res.status),duration_bucket:Yn(performance.now()-r),db_type:s}})}).use("/favicon.ico",er({path:st.resolve(tr(),"favicon.ico")})).onError(Ni).route(Fe,vi).route(Fe,ki).route(Fe,Xi).use("/assets/*",er({root:tr()})).use("/image.png",er({root:tr()})).use(`${Fe}/:dbType/*`,Ym("param",rl,(e,t)=>{if(!e.success){let r=t.req.param("dbType");throw new Qm(400,{message:`Invalid database type: "${r}". Supported types: ${ge.getSupportedTypes().join(", ")}`})}}),async(e,t)=>{let{dbType:r}=rl.parse({dbType:e.req.param("dbType")});e.set("dbType",r),await t()}).route(`${Fe}/:dbType`,Gi).route(`${Fe}/:dbType`,Hi).route(`${Fe}/:dbType`,Ki).route(`${Fe}/:dbType`,Ui);return process.env.NODE_ENV!=="test"&&(n.all(`${Fe}/*`,e=>e.json({error:"Not found"},404)),n.use("/*",er({root:tr()})),n.get("/*",er({path:st.resolve(tr(),"index.html")}))),{app:n}}});h();h();(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new n.Error().stack;e&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[e]="9dda6ff8-5421-4915-8058-82913025d24c",n._sentryDebugIdIdentifier="sentry-dbid-9dda6ff8-5421-4915-8058-82913025d24c")}catch{}})();h();kt();import{intro as ed,log as sn,outro as ol,spinner as td}from"@clack/prompts";import{serve as rd}from"@hono/node-server";import rr from"picocolors";h();import{program as cn}from"commander";var Va=()=>{cn.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=cn.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&cn.error("Do not combine --open and --no-open"),{...n,open:e?!0:t?!1:void 0}};h();import{readFile as il}from"fs/promises";import{resolve as ll}from"path";import{cancel as ar,isCancel as un,note as Ya,select as cl,spinner as ul,text as za}from"@clack/prompts";import{parse as ml}from"dotenv";import mn from"picocolors";var Ga=async(n,e)=>{let t=e||"DATABASE_URL";if(n?.[t])return n[t];if(process.env[t])return process.env[t];let r=ul();r.start("Looking for database connection..."),n?Ya(mn.red(`${t} not found in .env or process.env`)):Ya(mn.red(`No .env file found and ${t} not set in process.env`));let a=await cl({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((un(a)||a==="cancel")&&(ar("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){r.start("Waiting for path...");let s=await za({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(l){if(!l?.trim())return"Path is required"}});un(s)&&(ar("Cancelled."),process.exit(0)),r.stop("Trying custom .env...");let i=ll(s);try{let l=await il(i,"utf-8"),c=ml(l);if(c[t])return c[t];throw new Error(`${t} still missing in custom file`)}catch(l){let c=l;ar(`Cannot read or parse file: ${mn.dim(c.message)}`),process.exit(1)}}r.stop("Manual input...");let o=await za({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 un(o)&&(ar("Cancelled."),process.exit(0)),o.trim()};h();import{access as dl,readFile as pl}from"fs/promises";import{dirname as fl,resolve as dn}from"path";import{parse as yl}from"dotenv";var hl=async n=>{let e=dn(n);for(;;){let t=dn(e,".env");try{return await dl(t),t}catch{}let r=fl(e);if(r===e)return null;e=r}},ft=async n=>{let e;if(n?e=dn(n):e=await hl(process.cwd()),!e)return null;try{let t=await pl(e,"utf-8");return yl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};h();import bl from"open";var Qa=n=>n===!0,Ja=async n=>{await bl(n)};h();ae();var Rc=Object.values(ee).flatMap(({protocols:n})=>n).map(n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),Sc=new RegExp(`\\b(?:${Rc}):\\/\\/\\S+`,"gi"),Ac=/\b(authToken=)[^&\s]+/gi,vo=n=>n.replace(Sc,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(Ac,"$1[redacted]");h();ln();ae();import{intro as Nc,outro as Dc}from"@clack/prompts";import Rt from"picocolors";var qo=()=>{Nc(Rt.inverse(" db-studio ")),console.log(Rt.bold(`
|
|
506
506
|
Usage:`)),console.log(` db-studio [options]
|
|
507
507
|
`),console.log(Rt.bold("Supported Databases:")),console.log(` ${Object.values(ee).map(({label:n})=>n).join(", ")}
|
|
508
508
|
`),console.log(Rt.bold("Options:")),console.log(" -e, --env <path> Path to custom .env file"),console.log(" -p, --port <port> Port to run the server on (default: 3333)"),console.log(" -d, --database-url <url> Database URL to use"),console.log(" --open Open db-studio in the default browser (off by default)"),console.log(" --no-open Do not open db-studio in the default browser"),console.log(" -n, --var-name <name> Custom environment variable name (default: DATABASE_URL)"),console.log(" -s, --status Show status of the database connection"),console.log(" -h, --help Show this help message"),console.log(` -v, --version Show version number
|