db-studio 2.2.0 → 2.2.1
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-DSqP7uLw.js → _pathlessLayout-1KXlcJn5.js} +1 -1
- package/dist/web-dist/assets/{_pathlessLayout-sBYxFR0u.js → _pathlessLayout-D4dS7_ZZ.js} +2 -2
- package/dist/web-dist/assets/{_queryId-D-e6Pm3D.js → _queryId-DfjPCkx7.js} +1 -1
- package/dist/web-dist/assets/{_table-ziU6yws2.js → _table-ChX0JQnV.js} +1 -1
- package/dist/web-dist/assets/{_table-CuzwG7mZ.js → _table-DQvTfc38.js} +1 -1
- package/dist/web-dist/assets/{_table-CUkeoJ5r.js → _table-M7xRcFSl.js} +1 -1
- package/dist/web-dist/assets/{abap-CNHfI6UP.js → abap-DYZIj1QT.js} +1 -1
- package/dist/web-dist/assets/{apex-DTJWTIPK.js → apex-CaiB2cHW.js} +1 -1
- package/dist/web-dist/assets/{azcli-Degrf7_O.js → azcli-BSMSllBA.js} +1 -1
- package/dist/web-dist/assets/{badge-BfsYSaL9.js → badge-DAJ-55CZ.js} +1 -1
- package/dist/web-dist/assets/{bat-og3u3-iX.js → bat-DslF3aSP.js} +1 -1
- package/dist/web-dist/assets/{bicep-DWKWUTZk.js → bicep-BaONjKcy.js} +1 -1
- package/dist/web-dist/assets/{browser-ZSYFt_6v.js → browser-BXjW1U6_.js} +1 -1
- package/dist/web-dist/assets/{bundle-mjs-DBtz6MiX.js → bundle-mjs-DGKUXiQC.js} +1 -1
- package/dist/web-dist/assets/{cameligo-wkA_VlQe.js → cameligo-B-VCpHXR.js} +1 -1
- package/dist/web-dist/assets/{chat-sidebar-BzjjNUcW.js → chat-sidebar-DhhMmf_h.js} +4 -4
- package/dist/web-dist/assets/{clojure-DOzhadKJ.js → clojure-CQdNGvuT.js} +1 -1
- package/dist/web-dist/assets/{code-editor-BMXfdFhg.js → code-editor-B9_5weuZ.js} +1 -1
- package/dist/web-dist/assets/{coffee-CS5CzV5M.js → coffee-GJxdv8v9.js} +1 -1
- package/dist/web-dist/assets/{connect-DGQjyh4c.js → connect-CCHOGwiQ.js} +1 -1
- package/dist/web-dist/assets/{constants-iNJwkB3Z.js → constants-CJqw7w68.js} +3 -3
- package/dist/web-dist/assets/{cpp-BMgiE7AJ.js → cpp-bdOuYgjm.js} +1 -1
- package/dist/web-dist/assets/{csharp-Bsvbb6s9.js → csharp-DtT4S3qG.js} +1 -1
- package/dist/web-dist/assets/{csp-BrZ2q231.js → csp-DcT8MidV.js} +1 -1
- package/dist/web-dist/assets/{css-Uqgocp1T.js → css-aK0ks7hY.js} +1 -1
- package/dist/web-dist/assets/{cssMode-BoXwzMyE.js → cssMode-5aGt4Xk4.js} +1 -1
- package/dist/web-dist/assets/{cypher-BtFHfHba.js → cypher-gkqrqdhb.js} +1 -1
- package/dist/web-dist/assets/{dart-C5lyYd0g.js → dart-D55faCn9.js} +1 -1
- package/dist/web-dist/assets/{database.store-BbWvMDJ7.js → database.store-BOgNcBMG.js} +2 -2
- package/dist/web-dist/assets/{dist-BbZuOizk.js → dist-BA0_BdMR.js} +1 -1
- package/dist/web-dist/assets/{dist-CISR_13N.js → dist-DAuUtATJ.js} +1 -1
- package/dist/web-dist/assets/{dockerfile-BvQ8yybz.js → dockerfile-CsHs8WRI.js} +1 -1
- package/dist/web-dist/assets/{ecl-DkR5NtXz.js → ecl-CQKiIf56.js} +1 -1
- package/dist/web-dist/assets/{editor.api-BQRmhEY6.js → editor.api-BZk1XbZs.js} +1 -1
- package/dist/web-dist/assets/{elixir-DwgH4lv4.js → elixir-CfFxQLCK.js} +1 -1
- package/dist/web-dist/assets/{esm-DHn0u-mG.js → esm-BhcGPxbM.js} +1 -1
- package/dist/web-dist/assets/{esm-HKPuItQJ.js → esm-C1Qg-CCP.js} +1 -1
- package/dist/web-dist/assets/{flow9-DdhMBw5Q.js → flow9-CLkaJU-U.js} +1 -1
- package/dist/web-dist/assets/{format-cell-value-CUgsp8Xn.js → format-cell-value-BcH_SExw.js} +1 -1
- package/dist/web-dist/assets/{freemarker2-g_nJsTeC.js → freemarker2-Dbf5KAvd.js} +1 -1
- package/dist/web-dist/assets/{fsharp-D3Xp09Vk.js → fsharp-4RCsDl1X.js} +1 -1
- package/dist/web-dist/assets/{go-DiDKwy3n.js → go-BCuLk40y.js} +1 -1
- package/dist/web-dist/assets/{graphql-BgFph-jF.js → graphql-Cuc1fjZl.js} +1 -1
- package/dist/web-dist/assets/{handlebars-RA6uoaMW.js → handlebars-Bc8nHcpq.js} +1 -1
- package/dist/web-dist/assets/{hcl-D4fzt9AB.js → hcl-BqquCvZs.js} +1 -1
- package/dist/web-dist/assets/{highlighted-body-JLMTFACH-D8jkzP7m.js → highlighted-body-JLMTFACH-Q1Yc-gaw.js} +1 -1
- package/dist/web-dist/assets/{html-DchTZAEc.js → html-ZcQmh2HM.js} +1 -1
- package/dist/web-dist/assets/{htmlMode-BcLYF6v1.js → htmlMode-BkwHscgL.js} +1 -1
- package/dist/web-dist/assets/{icons-DKLzom80.js → icons-IBpZgbE4.js} +1 -1
- package/dist/web-dist/assets/{index-L3nylpEA.js → index-DfnmlclA.js} +4 -4
- package/dist/web-dist/assets/{indexes-B3M1QTrn.js → indexes-DUzB2YOr.js} +1 -1
- package/dist/web-dist/assets/{ini-CjG9jGLJ.js → ini-DK3PnweE.js} +1 -1
- package/dist/web-dist/assets/{java-DitR3Nwd.js → java-CCKilWzS.js} +1 -1
- package/dist/web-dist/assets/{javascript-l9pEcFVL.js → javascript-Cy_Mv9Jz.js} +1 -1
- package/dist/web-dist/assets/{json-editor-CeBQ9FBf.js → json-editor-CE8bI5n-.js} +1 -1
- package/dist/web-dist/assets/{jsonMode-D4edoDNQ.js → jsonMode-wvGZQK-h.js} +1 -1
- package/dist/web-dist/assets/{julia-_g8mQYsr.js → julia-yMXHdeoG.js} +1 -1
- package/dist/web-dist/assets/{keys-DhNPoWOm.js → keys-B1bnQf8h.js} +1 -1
- package/dist/web-dist/assets/{kotlin-3o4lP58u.js → kotlin-BbY6gpqm.js} +1 -1
- package/dist/web-dist/assets/{label-CavJMZd3.js → label-B5lrF5vb.js} +1 -1
- package/dist/web-dist/assets/{less-CdRSAxY_.js → less-rp9k6ONg.js} +1 -1
- package/dist/web-dist/assets/{lexon-B1v3Gspe.js → lexon-rRyNfudJ.js} +1 -1
- package/dist/web-dist/assets/{liquid-3wMbC9OJ.js → liquid-TDvflZF7.js} +1 -1
- package/dist/web-dist/assets/{logs-C22dj_JT.js → logs-C2iyjCnP.js} +1 -1
- package/dist/web-dist/assets/{lspLanguageFeatures-TaH7V4jh.js → lspLanguageFeatures-DkWvqpF_.js} +1 -1
- package/dist/web-dist/assets/{lua-D3D-_pEE.js → lua-DInTck7-.js} +1 -1
- package/dist/web-dist/assets/{m3-fsgnMtjU.js → m3-D1zMDYBU.js} +1 -1
- package/dist/web-dist/assets/{markdown-DTtmtPZi.js → markdown-DTHzen51.js} +1 -1
- package/dist/web-dist/assets/{mdx-B7jfJVLI.js → mdx-D9pd4Hjw.js} +1 -1
- package/dist/web-dist/assets/{mermaid-WFAXDIZX-qzZppTtW.js → mermaid-WFAXDIZX-B2YMTdfH.js} +1 -1
- package/dist/web-dist/assets/{middleware-DLeL20gb.js → middleware-gB5jp1rF.js} +1 -1
- package/dist/web-dist/assets/{mips-BA6kSOEZ.js → mips-7Slzy87X.js} +1 -1
- package/dist/web-dist/assets/{module-B7dXHbVt.js → module-BHjgyYxe.js} +1 -1
- package/dist/web-dist/assets/{monaco-theme-BwGcwpJl.js → monaco-theme-CFrVB-OG.js} +4 -4
- package/dist/web-dist/assets/{msdax-B96QDI_e.js → msdax-CVw_oFJe.js} +1 -1
- package/dist/web-dist/assets/{mysql-ZJG-Zmb7.js → mysql-92xfRPFN.js} +1 -1
- package/dist/web-dist/assets/{objective-c-D1BqZdFg.js → objective-c-BXnCggXS.js} +1 -1
- package/dist/web-dist/assets/{overlay.store-DoGHwFxO.js → overlay.store-wgNV6JkK.js} +1 -1
- package/dist/web-dist/assets/{pascal-CXwopv-V.js → pascal-3fByeJdZ.js} +1 -1
- package/dist/web-dist/assets/{pascaligo-DbxCO0kO.js → pascaligo-BdC4YsoB.js} +1 -1
- package/dist/web-dist/assets/{perl-DL95F-1i.js → perl-ClTLOqGp.js} +1 -1
- package/dist/web-dist/assets/{personal-preferences.store-BgUar1W1.js → personal-preferences.store-dG5rDcRw.js} +1 -1
- package/dist/web-dist/assets/{pgsql-D6V7y-We.js → pgsql-DEzB6Ucu.js} +1 -1
- package/dist/web-dist/assets/{php-Cl4Rc77T.js → php-DVFKZpKp.js} +1 -1
- package/dist/web-dist/assets/{pla-C2-KEJLZ.js → pla-0ER0Ntvs.js} +1 -1
- package/dist/web-dist/assets/{postiats-CnwS6VBM.js → postiats-CEuE_fTP.js} +1 -1
- package/dist/web-dist/assets/{powerquery-IxSHxxBc.js → powerquery-IX0j-GcX.js} +1 -1
- package/dist/web-dist/assets/{powershell-DAkyXnxj.js → powershell-PrZfSRSf.js} +1 -1
- package/dist/web-dist/assets/{preload-helper-BmptvQqE.js → preload-helper-Bpqt02Xx.js} +1 -1
- package/dist/web-dist/assets/{protobuf-FnPVBP5H.js → protobuf-CCWom7A4.js} +1 -1
- package/dist/web-dist/assets/{pug-C_d8B8nZ.js → pug-B-mwU8C7.js} +1 -1
- package/dist/web-dist/assets/{python-DK9sRx0Y.js → python-B-RGw6sh.js} +1 -1
- package/dist/web-dist/assets/{qsharp-DHzbHTnS.js → qsharp-zXtiGbGZ.js} +1 -1
- package/dist/web-dist/assets/{queries.store-CXQwDZiV.js → queries.store-CL_QZ9kV.js} +1 -1
- package/dist/web-dist/assets/{query-runner-D0LqVvy4.js → query-runner-__vttAd8.js} +3 -3
- package/dist/web-dist/assets/{r-BreUQjgc.js → r-ff7AzNUE.js} +1 -1
- package/dist/web-dist/assets/{radix-ui-CJhaEsHV.js → radix-ui-BLYTVDm9.js} +1 -1
- package/dist/web-dist/assets/{razor-CI-yLdex.js → razor-f0SZhWBH.js} +1 -1
- package/dist/web-dist/assets/{react-CGNcTA1t.js → react-Cuc8VqJk.js} +1 -1
- package/dist/web-dist/assets/{react-dom-Czf_u9MH.js → react-dom-Cx6AFOpM.js} +1 -1
- package/dist/web-dist/assets/{redis-BdhjrevD.js → redis-3WrJd2UX.js} +1 -1
- package/dist/web-dist/assets/{redis-value-Cq8YBvSS.js → redis-value-DvCMBdEM.js} +1 -1
- package/dist/web-dist/assets/{redshift-CwVMUyQc.js → redshift-BFFZqrqe.js} +1 -1
- package/dist/web-dist/assets/{restructuredtext-D6U9PIiF.js → restructuredtext-BRpKlTYP.js} +1 -1
- package/dist/web-dist/assets/{rolldown-runtime-D_n5YsVB.js → rolldown-runtime-v8MIZ6et.js} +1 -1
- package/dist/web-dist/assets/{ruby-D0QS81Wd.js → ruby-Dik41UlM.js} +1 -1
- package/dist/web-dist/assets/{runner-BE2YTdi9.js → runner-DIQss6Kz.js} +1 -1
- package/dist/web-dist/assets/{rust-Bsq9cLDY.js → rust-DADSh0Pc.js} +1 -1
- package/dist/web-dist/assets/{sb-DAQADLLd.js → sb-DuvpHrMN.js} +1 -1
- package/dist/web-dist/assets/{scala-oEMLo0pl.js → scala-CtuFqcla.js} +1 -1
- package/dist/web-dist/assets/{schema-JCqbh3DE.js → schema-BqwkN_6u.js} +1 -1
- package/dist/web-dist/assets/{schema-B-jmgfHC.js → schema-qGsKd6zv.js} +1 -1
- package/dist/web-dist/assets/{scheme-DDI6muad.js → scheme-hPwS1w0C.js} +1 -1
- package/dist/web-dist/assets/{scss-BU9Ttlwm.js → scss-477oFtwU.js} +1 -1
- package/dist/web-dist/assets/{select-3l4LDMzT.js → select-DDjmR6pO.js} +1 -1
- package/dist/web-dist/assets/{separator-BD46sVx9.js → separator-CGjaYtx-.js} +1 -1
- package/dist/web-dist/assets/{sheet-sidebar-CjbtFAKn.js → sheet-sidebar-Cde4bLIJ.js} +1 -1
- package/dist/web-dist/assets/{shell-BI6rOefn.js → shell-n9PWT21s.js} +1 -1
- package/dist/web-dist/assets/{solidity-B17zzzu-.js → solidity-BUjaJYHp.js} +1 -1
- package/dist/web-dist/assets/{sophia-DQi6mooo.js → sophia-BCcvs9t1.js} +1 -1
- package/dist/web-dist/assets/{sparql-DGFBDMPi.js → sparql-BflQKwzI.js} +1 -1
- package/dist/web-dist/assets/{spinner-D7Cvt3BD.js → spinner-ioIImnLq.js} +1 -1
- package/dist/web-dist/assets/{sql-DGzRlxQo.js → sql-B-t7xHK1.js} +1 -1
- package/dist/web-dist/assets/{st-Ceq2dhS_.js → st-CSYG-jYM.js} +1 -1
- package/dist/web-dist/assets/{swift-8-FeeRSy.js → swift-CKmn3JdQ.js} +1 -1
- package/dist/web-dist/assets/{systemverilog-mmioB6wo.js → systemverilog-rn_hwEIB.js} +1 -1
- package/dist/web-dist/assets/{table-sVAmZLcg.js → table-BWy367NZ.js} +1 -1
- package/dist/web-dist/assets/{tables-TW8L7_FW.js → tables-geLC-tRf.js} +4 -4
- package/dist/web-dist/assets/{tanstack-D9GckDbx.js → tanstack-2cKzRGRb.js} +1 -1
- package/dist/web-dist/assets/{tcl-BTUJQo2X.js → tcl-Fn2CV_28.js} +1 -1
- package/dist/web-dist/assets/{tsMode-BRJ2WiSx.js → tsMode-C-8HcC0f.js} +1 -1
- package/dist/web-dist/assets/{twig-C6ea54bM.js → twig-CLjUHOwE.js} +1 -1
- package/dist/web-dist/assets/{typescript-U3aTTn2d.js → typescript-BubYBQa0.js} +1 -1
- package/dist/web-dist/assets/{typespec-B4z8l2XF.js → typespec-IO61FhU-.js} +1 -1
- package/dist/web-dist/assets/{use-database-engine-CG7rZQXQ.js → use-database-engine-C1fvJDyS.js} +1 -1
- package/dist/web-dist/assets/{use-theme-CKjVHAZg.js → use-theme-uud1RcFP.js} +1 -1
- package/dist/web-dist/assets/{utils-CZdosIsH.js → utils-D49oYrWW.js} +1 -1
- package/dist/web-dist/assets/{vb-BbQNgbjG.js → vb-Lm9DdJMK.js} +1 -1
- package/dist/web-dist/assets/{visualizer-c23lRr6o.js → visualizer-Bd-PB2Fm.js} +1 -1
- package/dist/web-dist/assets/{wgsl-SWAFFAY4.js → wgsl-CG8088eu.js} +1 -1
- package/dist/web-dist/assets/{workers-DeOJBffb.js → workers-H_G6sPzI.js} +1 -1
- package/dist/web-dist/assets/{xml-DM-qLhlQ.js → xml-Da0DCKCb.js} +1 -1
- package/dist/web-dist/assets/{yaml-BB3LUpV7.js → yaml-C-84Dbfu.js} +1 -1
- package/dist/web-dist/index.html +30 -30
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var Kl=Object.defineProperty;var C=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(n){throw t=[n],n}};var $t=(r,e)=>{for(var t in e)Kl(r,t,{get:e[t],enumerable:!0})};var y=C(()=>{"use strict";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};r.SENTRY_RELEASE={id:"db-studio@2.2.0"}}catch{}})()});var Us=C(()=>{"use strict";y()});var qs=C(()=>{"use strict";y()});var Bs=C(()=>{"use strict";y()});var Ks,Fs,ct,Hs=C(()=>{"use strict";y();Ks=globalThis.process?.env,Fs=Ks?.NODE_ENV,ct={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:Fs==="development",PROXY_URL:Ks?.DB_STUDIO_PROXY_URL??(Fs==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var js=C(()=>{"use strict";y()});var Ws,Pr=C(()=>{"use strict";y();Ws={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:"Every database. One studio. Browse tables, edit records, and run queries in a free, open-source database GUI.",SITE_KEYWORDS:["database studio","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:"db-studio | Every database. One studio",SITE_COLOR:"#1447e6"}});var Vs=C(()=>{"use strict";y()});var on=C(()=>{"use strict";y();Us();qs();Bs();Hs();js();Pr();Vs()});import{z as St}from"zod";var U,k,kt,yt,Gl,Ql,ie,we=C(()=>{"use strict";y();U=St.object({db:St.string("Database name is required")}),k=U.extend({schemaName:St.string().optional()}),kt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],yt=St.enum(kt,{message:"Invalid database type"}),Gl=U.extend({dbType:yt}),Ql=St.object({dbType:yt}),ie=St.object({tableName:St.string("Table name is required")})});import{z as Ve}from"zod";var Ke,Jl,Xl,Js=C(()=>{"use strict";y();we();Ke=Ve.object({columnName:Ve.string("Column name is required"),columnType:Ve.string("Column type is required"),defaultValue:Ve.string().optional(),isPrimaryKey:Ve.boolean().default(!1),isNullable:Ve.boolean().default(!1),isUnique:Ve.boolean().default(!1),isIdentity:Ve.boolean().default(!1),isArray:Ve.boolean().default(!1)}),Jl=ie,Xl=Ve.object({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName,columnName:Ke.shape.columnName,columnType:Ke.shape.columnType,defaultValue:Ke.shape.defaultValue,isPrimaryKey:Ke.shape.isPrimaryKey,isNullable:Ke.shape.isNullable,isUnique:Ke.shape.isUnique,isIdentity:Ke.shape.isIdentity,isArray:Ke.shape.isArray})});import{z as cn}from"zod";var kr,Xs=C(()=>{"use strict";y();kr=cn.object({tableName:cn.string("Table name is required"),data:cn.record(cn.string("Column name is required"),cn.any())})});import{z as Zl}from"zod";var Zs,vr,eo,Ur,qr=C(()=>{"use strict";y();Zs=["gemini","openai","anthropic","grok","openrouter"],vr=Zl.enum(Zs),eo=[{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"}]}],Ur=r=>eo.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as He}from"zod";var Br,Se,eu,tu,$n=C(()=>{"use strict";y();we();Br=k.extend({cascade:He.string().optional().transform(r=>r==="true")}),Se=He.object({tableName:He.string("Table name is required"),columnName:He.string("Column name is required")}),eu=He.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,cascade:He.boolean().optional()}),tu=He.object({message:He.string("Message is required"),tableName:He.string("Table name is required"),columnName:He.string("Column name is required"),deletedCount:He.number("Deleted count is required").default(0)})});import{z as ln}from"zod";var vt,nu,ru,to=C(()=>{"use strict";y();we();$n();vt=ln.object({columnType:ln.string("Column type is required"),isNullable:ln.boolean(),defaultValue:ln.string().nullable().optional()}),nu=Se,ru=ln.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,columnType:vt.shape.columnType,isNullable:vt.shape.isNullable,defaultValue:vt.shape.defaultValue})});var no=C(()=>{"use strict";y()});import{z as Ut}from"zod";var Fr,ro=C(()=>{"use strict";y();Fr=Ut.object({tableName:Ut.string().min(1,"Table name is required"),records:Ut.array(Ut.record(Ut.string(),Ut.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var au,su,Kr,ao=C(()=>{"use strict";y();qr();we();au=me.object({type:me.string(),content:me.string().optional()}).passthrough(),su=me.object({provider:vr.optional().default("gemini"),model:me.string().min(1).optional(),messages:me.array(me.object({id:me.string(),role:me.enum(["user","assistant","system","tool","reasoning"]),content:me.union([me.string(),me.null(),me.array(me.unknown())]).optional(),parts:me.array(au).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:U.shape.db,includeSchema:me.boolean().optional().default(!0)})}),Kr=su.transform(r=>({...r,model:r.model??Ur(r.provider)}))});var so=C(()=>{"use strict";y()});import{z as Le}from"zod";var ou,oo,L,iu,io,cu,Hr=C(()=>{"use strict";y();ou=["text","boolean","number","enum","json","date","array"],oo=Le.enum(ou),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},iu=["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"],io=Le.enum(iu),cu=Le.object({columnName:Le.string(),dataType:oo,dataTypeLabel:io,isNullable:Le.boolean(),columnDefault:Le.string().nullable(),isPrimaryKey:Le.boolean(),isForeignKey:Le.boolean(),referencedTable:Le.string().nullable(),referencedSchema:Le.string().optional(),referencedColumn:Le.string().nullable(),enumValues:Le.array(Le.string()).nullable()})});function Mn(r){let e=r?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?L.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"?L.number:e==="boolean"||e==="bool"?L.boolean:e==="json"||e==="jsonb"?L.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?L.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"?L.text:L.text}function jr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?g.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?g.bigint:e==="smallint"||e==="int2"?g.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?g.numeric:e==="real"||e==="float4"?g.float:e==="double precision"||e==="float8"||e==="float"?g.double:e==="money"?g.money:e==="boolean"||e==="bool"?g.boolean:e==="text"?g.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?g.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?g.char:e==="json"?g.json:e==="jsonb"?g.jsonb:e==="xml"?g.xml:e==="uuid"?g.uuid:e==="date"?g.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?g.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?g.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?g.timestamptz:e==="interval"||e.startsWith("interval")?g.interval:e==="bytea"?g.bytea:e==="inet"?g.inet:e==="cidr"?g.cidr:e==="macaddr"?g.macaddr:e==="macaddr8"?g.macaddr8:e==="point"?g.point:e==="line"?g.line:e==="polygon"?g.polygon:e.startsWith("array")||e.includes("[]")?g.text:e.startsWith("user-defined")||e==="enum"?g.enum:g.text}function kn(r,e){let t=r?.toLowerCase().trim()||"",n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?L.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"?L.number:t==="boolean"||t==="bool"?L.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?L.date:t==="json"?L.json:t==="enum"||t==="set"?L.enum:L.text}function Wr(r,e){if(!r)return g.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?g.boolean:t==="tinyint"?g.tinyint:t==="smallint"?g.smallint:t==="mediumint"?g.mediumint:t==="int"||t==="integer"?g.int:t==="bigint"?g.bigint:t==="decimal"||t==="numeric"?g.numeric:t==="float"||t==="real"?g.float:t==="double"?g.double:t==="bit"?g.bit:t==="boolean"||t==="bool"?g.boolean:t==="char"?g.char:t==="varchar"?g.varchar:t==="tinytext"?g.tinytext:t==="text"?g.text:t==="mediumtext"?g.mediumtext:t==="longtext"?g.longtext:t==="binary"?g.binary:t==="varbinary"?g.varbinary:t==="tinyblob"?g.tinyblob:t==="blob"?g.blob:t==="mediumblob"?g.mediumblob:t==="longblob"?g.longblob:t==="json"?g.json:t==="date"?g.date:t==="time"?g.time:t==="datetime"?g.datetime:t==="timestamp"?g.timestamp:t==="year"?g.year:t==="enum"?g.enum:t==="set"?g.set:g.text}function vn(r){let e=r?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?L.number:e==="bit"?L.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?L.date:e==="json"?L.json:L.text}function Vr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="tinyint"?g.tinyint:e==="smallint"?g.smallint:e==="int"?g.int:e==="bigint"?g.bigint:e==="decimal"||e==="numeric"?g.numeric:e==="float"||e==="real"?g.float:e==="money"||e==="smallmoney"?g.money:e==="bit"?g.boolean:e==="char"?g.char:e==="varchar"?g.varchar:e==="text"?g.text:e==="nchar"?g.char:e==="nvarchar"?g.varchar:e==="ntext"?g.text:e==="binary"?g.binary:e==="varbinary"?g.varbinary:e==="image"?g.blob:e==="uniqueidentifier"?g.uuid:e==="date"?g.date:e==="time"?g.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?g.datetime:e==="datetimeoffset"?g.timestamptz:e==="json"?g.json:e==="xml"?g.xml:g.text}function Un(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?L.boolean:e==="json"?L.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?L.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?L.number:L.text}function Yr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?g.int:e==="bigint"||e.startsWith("bigint(")?g.bigint:e==="smallint"||e.startsWith("smallint(")?g.smallint:e==="tinyint"||e.startsWith("tinyint(")?g.tinyint:e==="mediumint"||e.startsWith("mediumint(")?g.mediumint:e.includes("int")?g.int:e==="real"||e==="float"||e.startsWith("float(")?g.float:e==="double"||e==="double precision"||e.startsWith("double(")?g.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?g.numeric:e==="boolean"||e==="bool"?g.boolean:e==="text"||e==="clob"?g.text:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="char"||e.startsWith("char(")?g.char:e==="json"?g.json:e==="date"?g.date:e==="time"?g.time:e==="datetime"?g.datetime:e==="timestamp"?g.timestamp:e==="blob"?g.blob:g.text}function qn(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?L.json:e==="boolean"||e==="bool"?L.boolean:e.startsWith("enum")?L.enum:e==="interval"?L.text:e==="date"||e.startsWith("time")||e==="datetime"?L.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?L.number:L.text}function zr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?g.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?g.json:e.startsWith("enum")?g.enum:e==="interval"?g.interval:e==="tinyint"||e==="utinyint"?g.tinyint:e==="smallint"||e==="usmallint"?g.smallint:e==="integer"||e==="int"?g.int:e.includes("int")||e==="bignum"?g.bigint:e.startsWith("decimal")||e.startsWith("numeric")?g.numeric:e==="float"||e==="real"?g.float:e==="double"?g.double:e==="boolean"||e==="bool"?g.boolean:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="uuid"?g.uuid:e==="date"?g.date:e==="timestamp with time zone"||e==="timestamptz"?g.timestamptz:e.startsWith("timestamp")||e==="datetime"?g.timestamp:e.startsWith("time")?g.time:e==="blob"||e==="bytea"?g.blob:e==="bit"||e==="bitstring"?g.bit:g.text}function Bn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"?L.boolean:e==="json"?L.json:e==="date"||e.startsWith("timestamp")?L.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?L.number:L.text}function Gr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return g.boolean;if(e==="json")return g.json;if(e==="xmltype")return g.xml;if(e==="integer")return g.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return g.smallint;if(n<=10)return g.int;if(n<=19)return g.bigint}return e.startsWith("number")?g.numeric:e==="binary_float"?g.float:e==="binary_double"||e.startsWith("float")?g.double:e.startsWith("varchar")||e.startsWith("nvarchar")?g.varchar:e.startsWith("char")||e.startsWith("nchar")?g.char:e.startsWith("timestamp")&&e.endsWith("time zone")?g.timestamptz:e==="date"||e.startsWith("timestamp")?g.timestamp:e.startsWith("interval")?g.interval:e==="blob"||e==="long raw"?g.blob:e.startsWith("raw")?g.varbinary:g.text}function qt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function Fn(r){let e=qt(r);return e.startsWith("Array(")?L.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?L.enum:e==="Bool"?L.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?L.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?L.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?L.json:L.text}function Qr(r){let e=qt(r);return e.startsWith("Array(")?g.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?g.enum:e==="Bool"?g.boolean:/^U?Int8$/.test(e)?g.tinyint:/^U?Int16$/.test(e)?g.smallint:/^U?Int32$/.test(e)?g.int:/^U?Int(64|128|256)$/.test(e)?g.bigint:e==="Float32"||e==="BFloat16"?g.float:e==="Float64"?g.double:e.startsWith("Decimal")?g.numeric:e.startsWith("FixedString(")?g.char:e==="UUID"?g.uuid:e==="IPv4"||e==="IPv6"?g.inet:e==="Date"||e==="Date32"?g.date:e.startsWith("DateTime64")?g.timestamp:e.startsWith("DateTime")?g.datetime:e.startsWith("Time")?g.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?g.json:g.text}var g,co=C(()=>{"use strict";y();Hr();g={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as ye}from"zod";var lo,un,uo,lu,Jr,Xr,mo=C(()=>{"use strict";y();we();lo=["red","orange","amber","green","teal","blue","violet","pink"],un=ye.enum(lo),uo=ye.object({id:ye.string(),name:ye.string(),color:un.nullable(),readOnly:ye.boolean(),lastUsedAt:ye.number(),dbType:yt,maskedUrl:ye.string()}),lu=ye.object({connections:ye.array(uo),active:ye.object({id:ye.string().nullable(),dbType:yt,connectionId:ye.string()}).nullable()}),Jr=ye.object({url:ye.string().trim().min(1,"Paste a connection URL")}),Xr=ye.object({name:ye.string().trim().min(1,"Name is required").max(100).optional(),color:un.nullable().optional(),readOnly:ye.boolean().optional()})});import{z as de}from"zod";var po,Zr,fo,yo,ea,ho=C(()=>{"use strict";y();po=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Zr=de.enum(po),fo=de.object({columnName:de.string("Column name is required"),columnType:de.string("Column type is required"),defaultValue:de.string().optional(),isPrimaryKey:de.boolean().default(!1),isNullable:de.boolean().default(!1),isUnique:de.boolean().default(!1),isIdentity:de.boolean().default(!1),isArray:de.boolean().default(!1)}),yo=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:Zr.default("NO ACTION"),onDelete:Zr.default("NO ACTION")}),ea=de.object({tableName:de.string("Table name is required"),fields:de.array(fo).min(1,"At least one field is required"),foreignKeys:de.array(yo).optional()})});var M,Ye,go=C(()=>{"use strict";y();we();M={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:["btree","hash","gin","gist","spgist","brin"],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!1,sqlInsert:{quote:"[",booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!0},rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,cellDefault:!1,readOnly:!1,sqlInsert:null,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},sqlite:{label:"SQLite / libSQL / D1",protocols:["sqlite","libsql","d1"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!1,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!1},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,cellDefault:!1,readOnly:!1,sqlInsert:null,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:"DuckDB cannot alter or rename a table that has an index, or alter or drop a column an index covers."},serverLogs:!1},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,cellDefault:!1,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!1},indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},Ye=r=>kt.find(e=>M[e].protocols.includes(r))});import{z as Re}from"zod";var bo,uu,mu,To=C(()=>{"use strict";y();we();bo=Re.object({name:Re.string("Name is required"),size:Re.string("Size is required"),owner:Re.string("Owner is required"),encoding:Re.string("Encoding is required")}),uu=Re.object({databases:Re.array(bo),dbType:yt}),mu=Re.object({version:Re.string("Version is required"),database:Re.string("Database is required"),user:Re.string("User is required"),host:Re.string("Host is required").nullable(),port:Re.number("Port is required").nullable(),active_connections:Re.coerce.number("Active connections is required"),max_connections:Re.coerce.number("Max connections is required")})});var Eo=C(()=>{"use strict";y()});import{z as Bt}from"zod";var Kn,wo=C(()=>{"use strict";y();Kn=Bt.object({tableName:Bt.string("Table name is required"),primaryKeys:Bt.array(Bt.object({columnName:Bt.string("Column name is required"),value:Bt.any()})).min(1,"At least one primary key is required")})});import{z as du}from"zod";var ta,So=C(()=>{"use strict";y();we();ta=k.extend({cascade:du.string().optional().transform(r=>r==="true")})});import{z as Ro}from"zod";var na,Co=C(()=>{"use strict";y();na=Ro.object({query:Ro.string("Query is required")})});import{z as pu}from"zod";var No,ra,Ao=C(()=>{"use strict";y();we();No=["csv","xlsx","json"],ra=k.extend({format:pu.enum(No,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var Do,fu,Hn,yu,jn,hu,_o=C(()=>{"use strict";y();we();Do=["primary","unique-constraint","index"],fu=ce.object({indexName:ce.string(),columns:ce.array(ce.string()),isUnique:ce.boolean(),isSparse:ce.boolean().optional(),expireAfterSeconds:ce.number().nonnegative().optional(),method:ce.string().nullable(),kind:ce.enum(Do),definition:ce.string().nullable()}),Hn=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),yu=Hn.extend({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName}),jn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),hu=jn.extend({db:U.shape.db,schemaName:k.shape.schemaName})});import{z as E}from"zod";var Wn,v,aa,sa,gu,oa,Ft,bu,Tu,Eu,wu,Su,Ru,Cu,Oo,Nu,ia,Au,Du,_u,Ou,Iu,xu,Lu,ca,Pu,$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,Vu,Yu,la,ua,zu,Io=C(()=>{"use strict";y();Wn=E.enum(["string","hash","list","set","zset","stream","unknown"]),v=E.object({base64:E.string().max(16*1024*1024).refine(r=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(r),"Invalid unpadded base64url value"),utf8:E.string().optional()}),aa=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(200).default(50),search:E.string().max(512).optional(),exactPattern:E.stringbool().default(!1),type:Wn.exclude(["unknown"]).optional()}),sa=E.object({key:v,type:Wn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),gu=E.object({keys:E.array(sa),nextCursor:E.string().nullable(),hasMore:E.boolean()}),oa=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(500).default(100),full:E.stringbool().default(!1),direction:E.enum(["forward","backward"]).default("forward")}),Ft=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),bu=E.object({kind:E.literal("string"),value:v,truncated:E.boolean()}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v}))}),Eu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:v}))}),wu=E.object({kind:E.literal("set"),members:E.array(v)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),Ru=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:v,value:v}))}))}),Cu=E.object({kind:E.literal("unknown")}),Oo=E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Ru,Cu]),Nu=sa.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Oo,nextCursor:E.string().nullable(),hasMore:E.boolean()}),ia=E.object({db:E.string(),offset:E.coerce.number().int().nonnegative().default(0),limit:E.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:E.string().optional()}),Au=E.object({chunk:v,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),Du=E.object({kind:E.literal("string"),value:v}),_u=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v})).min(1)}),Ou=E.object({kind:E.literal("list"),entries:E.array(v).min(1)}),Iu=E.object({kind:E.literal("set"),members:E.array(v).min(1)}),xu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.number()})).min(1)}),Lu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),ca=E.object({key:v,type:Wn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[Du,_u,Ou,Iu,xu,Lu]),ttlMs:E.number().int().positive().nullable().default(null)}),Pu=E.object({key:v,revision:E.string().nullable(),deleted:E.boolean()}),$u=E.object({action:E.literal("rename"),newKey:v}),Mu=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),ku=E.object({action:E.literal("setString"),value:v}),vu=E.object({action:E.literal("upsertHash"),field:v,value:v}),Uu=E.object({action:E.literal("deleteHash"),field:v}),qu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:v}),Bu=E.object({action:E.literal("setList"),index:E.number().int(),value:v}),Fu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Ku=E.object({action:E.literal("addSet"),member:v}),Hu=E.object({action:E.literal("removeSet"),member:v}),ju=E.object({action:E.literal("upsertZset"),member:v,score:E.number()}),Wu=E.object({action:E.literal("removeZset"),member:v}),Vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),Yu=E.object({action:E.literal("deleteStream"),id:E.string()}),la=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,Vu,Yu])}),ua=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),zu=E.object({deleted:E.boolean()})});var xo=C(()=>{"use strict";y()});import{z as ma}from"zod";var Vn,Gu,Qu,Lo=C(()=>{"use strict";y();we();$n();Vn=ma.object({newColumnName:ma.string("New column name is required")}),Gu=Se,Qu=ma.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,newColumnName:Vn.shape.newColumnName})});import{z as Yn}from"zod";var mn,Ju,Xu,Po=C(()=>{"use strict";y();we();mn=Yn.object({newTableName:Yn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Yn.string().trim().min(1).optional()}),Ju=ie,Xu=Yn.object({db:U.shape.db,tableName:ie.shape.tableName,newTableName:mn.shape.newTableName,schemaName:mn.shape.schemaName})});import{z as ve}from"zod";var $o,Mo,Zu,ko=C(()=>{"use strict";y();$o=["fatal","error","warning","info","debug"],Mo=ve.enum($o),Zu=ve.object({ts:ve.string(),level:Mo,rawLevel:ve.string(),source:ve.string().optional(),code:ve.string().optional(),message:ve.string(),durationMs:ve.number().optional(),statement:ve.string().optional(),detail:ve.record(ve.string(),ve.string())})});import{z as q}from"zod";var vo,dn,Uo,qo,em,da,Bo=C(()=>{"use strict";y();we();vo=q.object({columnName:q.string(),operator:q.string(),value:q.string()}),dn=["asc","desc"],Uo=q.object({columnName:q.string(),direction:q.enum(dn)}),qo=q.object({limit:q.number(),total:q.number(),totalEstimated:q.boolean().optional(),hasNextPage:q.boolean(),hasPreviousPage:q.boolean(),nextCursor:q.string().nullable(),prevCursor:q.string().nullable()}),em=q.object({data:q.array(q.record(q.string(),q.unknown())),meta:qo}),da=q.object({db:U.shape.db,schemaName:k.shape.schemaName,cursor:q.string().optional(),limit:q.string().optional().default("50").transform(Number),direction:q.enum(dn).optional().default(dn[0]),sort:q.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(q.union([q.string(),q.array(Uo)])),order:q.enum(dn).optional(),filters:q.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(q.array(vo))})});import{z as pn}from"zod";var tm,Fo=C(()=>{"use strict";y();tm=pn.object({tableName:pn.string("Table name is required"),schemaName:pn.string().optional(),rowCount:pn.coerce.number("Row count is required"),rowCountEstimated:pn.boolean().optional()})});import{z as Ko}from"zod";var nm,Ho=C(()=>{"use strict";y();nm=Ko.object({schema:Ko.string()})});import{z as Pe}from"zod";var pa,jo=C(()=>{"use strict";y();pa=Pe.object({tableName:Pe.string("Table name is required"),primaryKey:Pe.string("Primary key is required").default("id"),primaryKeys:Pe.array(Pe.string().min(1)).min(1).optional(),updates:Pe.array(Pe.object({rowData:Pe.record(Pe.string("Column name is required"),Pe.any()),columnName:Pe.string("Column name is required"),value:Pe.any(),useDefault:Pe.boolean().optional()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Wo={};$t(Wo,{AI_PROVIDERS:()=>Zs,AI_PROVIDER_OPTIONS:()=>eo,CONNECTION_COLORS:()=>lo,DATABASE_ENGINES:()=>M,DATABASE_TYPES:()=>kt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>po,FORMAT_TYPES:()=>No,INDEX_KINDS:()=>Do,SERVER_LOG_LEVELS:()=>$o,StandardizedDataType:()=>g,addColumnParamSchema:()=>Jl,addColumnParamsSchema:()=>Xl,addColumnSchema:()=>Ke,addRecordSchema:()=>kr,aiProviderSchema:()=>vr,alterColumnParamSchema:()=>nu,alterColumnParamsSchema:()=>ru,alterColumnSchema:()=>vt,bulkInsertRecordsSchema:()=>Fr,chatSchema:()=>Kr,columnInfoSchema:()=>cu,connectUrlSchema:()=>Jr,connectionColorSchema:()=>un,connectionInfoSchema:()=>mu,connectionSummarySchema:()=>uo,connectionsStateSchema:()=>lu,createIndexParamsSchema:()=>yu,createIndexSchema:()=>Hn,createKeySchema:()=>ca,createTableSchema:()=>ea,currentDatabaseSchema:()=>Gl,dataTypesSchema:()=>oo,databaseInfoSchema:()=>bo,databaseListSchema:()=>uu,databaseSchema:()=>U,databaseTypeParamSchema:()=>Ql,databaseTypeSchema:()=>yt,dbTypeFromProtocol:()=>Ye,deleteColumnParamSchema:()=>Se,deleteColumnParamsSchema:()=>eu,deleteColumnQuerySchema:()=>Br,deleteColumnSuccessResponseSchema:()=>tu,deleteKeyQuerySchema:()=>ua,deleteKeyResultSchema:()=>zu,deleteRecordSchema:()=>Kn,deleteTableQuerySchema:()=>ta,dropIndexParamSchema:()=>jn,dropIndexParamsSchema:()=>hu,encodedRedisValueSchema:()=>v,executeQuerySchema:()=>na,exportTableSchema:()=>ra,fieldDataSchema:()=>fo,filterSchema:()=>vo,foreignKeyActionSchema:()=>Zr,foreignKeyDataSchema:()=>yo,getDefaultAiModel:()=>Ur,indexInfoSchema:()=>fu,keyActionSchema:()=>la,keyDetailsQuerySchema:()=>oa,keyDetailsResultSchema:()=>Nu,keyParamSchema:()=>Ft,keyRawQuerySchema:()=>ia,keyRawResultSchema:()=>Au,keyScanQuerySchema:()=>aa,keyScanResultSchema:()=>gu,keyWriteResultSchema:()=>Pu,mapClickhouseToDataType:()=>Fn,mapDuckdbToDataType:()=>qn,mapMssqlToDataType:()=>vn,mapMysqlToDataType:()=>kn,mapOracleToDataType:()=>Bn,mapPostgresToDataType:()=>Mn,mapSqliteToDataType:()=>Un,redisKeySummarySchema:()=>sa,redisKeyTypeSchema:()=>Wn,redisKeyValueSchema:()=>Oo,renameColumnParamSchema:()=>Gu,renameColumnParamsSchema:()=>Qu,renameColumnSchema:()=>Vn,renameTableParamSchema:()=>Ju,renameTableParamsSchema:()=>Xu,renameTableSchema:()=>mn,serverLogEntrySchema:()=>Zu,serverLogLevelSchema:()=>Mo,sortDirections:()=>dn,sortSchema:()=>Uo,standardizeClickhouseDataTypeLabel:()=>Qr,standardizeDataTypeLabel:()=>jr,standardizeDuckdbDataTypeLabel:()=>zr,standardizeMssqlDataTypeLabel:()=>Vr,standardizeMysqlDataTypeLabel:()=>Wr,standardizeOracleDataTypeLabel:()=>Gr,standardizeSqliteDataTypeLabel:()=>Yr,standardizedDataTypeSchema:()=>io,tableDataMetaSchema:()=>qo,tableDataQuerySchema:()=>da,tableDataResultSchema:()=>em,tableInfoSchema:()=>tm,tableNameSchema:()=>ie,tableQuerySchema:()=>k,tableSchemaResultSchema:()=>nm,unwrapClickhouseType:()=>qt,updateConnectionSchema:()=>Xr,updateRecordsSchema:()=>pa});var j=C(()=>{"use strict";y();Js();Xs();qr();to();no();ro();ao();so();co();Hr();mo();ho();we();go();To();Eo();$n();wo();So();Co();Ao();_o();Io();xo();Lo();Po();ko();Bo();Fo();Ho();jo()});var rm,am,sm,zn,fa=C(()=>{"use strict";y();j();rm=Object.values(M).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),am=new RegExp(`\\b(?:${rm}):\\/\\/\\S+`,"gi"),sm=/\b(authToken=)[^&\s]+/gi,zn=r=>r.replace(am,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(sm,"$1[redacted]")});var d,Q=C(()=>{"use strict";y();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}status}});import{AsyncLocalStorage as cm}from"async_hooks";import{randomUUID as Yo}from"crypto";var lm,um,Gn,zo,Go,lt,ya,mm,dm,pm,Qo,ha,he,Z,ze=C(()=>{"use strict";y();Q();lm=Yo(),um=/^[A-Za-z0-9_-]{8,64}$/,Gn=new cm,zo=r=>r&&um.test(r)?r:Yo(),Go=(r,e)=>Gn.run(r,e),lt=()=>Gn.getStore()?.requestId,ya=()=>Gn.getStore()?.connectionId,mm=r=>{let e=r instanceof d?"HTTPException":r instanceof Error?r.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},dm=/^[A-Z0-9_-]{2,32}$/,pm=[[/^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"]],Qo=r=>{if(!(r instanceof Error))return;let{code:e,errno:t,number:n,cause:a}=r;return typeof n=="number"&&Number.isSafeInteger(n)?String(n):typeof e=="string"&&dm.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):r.name==="ReplyError"?r.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:pm.find(([s])=>s.test(r.message))?.[1]??Qo(a)},ha=r=>r instanceof d&&r.cause?r.cause:r,he=r=>{let e=ha(r);return{error_type:mm(e),error_code:Qo(e)}},Z=(r,e,t={})=>{let n=Gn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:lm,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
|
|
3
|
-
`)}});function Oe(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||fm(e)}}catch(e){return Z("error","database_url_unparseable",he(e)),{host:"localhost",port:5432}}}var Qn,fm,Jo,Ge=C(()=>{"use strict";y();j();ze();Qn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},fm=r=>{let e=r.protocol.replace(":",""),t=Ye(e);return Qn[e]?.defaultPort??(t&&M[t].defaultPort)??5432},Jo=r=>{let e=new URL(r),t=Qn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Rt,ga=C(()=>{Rt={name:"db-studio",type:"module",version:"2.2.
|
|
2
|
+
var Kl=Object.defineProperty;var C=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(n){throw t=[n],n}};var $t=(r,e)=>{for(var t in e)Kl(r,t,{get:e[t],enumerable:!0})};var y=C(()=>{"use strict";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};r.SENTRY_RELEASE={id:"db-studio@2.2.1"}}catch{}})()});var Us=C(()=>{"use strict";y()});var qs=C(()=>{"use strict";y()});var Bs=C(()=>{"use strict";y()});var Ks,Fs,ct,Hs=C(()=>{"use strict";y();Ks=globalThis.process?.env,Fs=Ks?.NODE_ENV,ct={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"https://api.db-studio.localhost",API_PREFIX:"/api",IS_DEV:Fs==="development",PROXY_URL:Ks?.DB_STUDIO_PROXY_URL??(Fs==="development"?"https://proxy.db-studio.localhost":"https://db-studio-proxy.husamql3.workers.dev")}});var js=C(()=>{"use strict";y()});var Ws,Pr=C(()=>{"use strict";y();Ws={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:"Every database. One studio. Browse tables, edit records, and run queries in a free, open-source database GUI.",SITE_KEYWORDS:["database studio","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:"db-studio | Every database. One studio",SITE_COLOR:"#1447e6"}});var Vs=C(()=>{"use strict";y()});var on=C(()=>{"use strict";y();Us();qs();Bs();Hs();js();Pr();Vs()});import{z as St}from"zod";var U,k,kt,yt,Gl,Ql,ie,we=C(()=>{"use strict";y();U=St.object({db:St.string("Database name is required")}),k=U.extend({schemaName:St.string().optional()}),kt=["pg","mysql","mssql","mongodb","sqlite","redis","duckdb","oracle","clickhouse"],yt=St.enum(kt,{message:"Invalid database type"}),Gl=U.extend({dbType:yt}),Ql=St.object({dbType:yt}),ie=St.object({tableName:St.string("Table name is required")})});import{z as Ve}from"zod";var Ke,Jl,Xl,Js=C(()=>{"use strict";y();we();Ke=Ve.object({columnName:Ve.string("Column name is required"),columnType:Ve.string("Column type is required"),defaultValue:Ve.string().optional(),isPrimaryKey:Ve.boolean().default(!1),isNullable:Ve.boolean().default(!1),isUnique:Ve.boolean().default(!1),isIdentity:Ve.boolean().default(!1),isArray:Ve.boolean().default(!1)}),Jl=ie,Xl=Ve.object({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName,columnName:Ke.shape.columnName,columnType:Ke.shape.columnType,defaultValue:Ke.shape.defaultValue,isPrimaryKey:Ke.shape.isPrimaryKey,isNullable:Ke.shape.isNullable,isUnique:Ke.shape.isUnique,isIdentity:Ke.shape.isIdentity,isArray:Ke.shape.isArray})});import{z as cn}from"zod";var kr,Xs=C(()=>{"use strict";y();kr=cn.object({tableName:cn.string("Table name is required"),data:cn.record(cn.string("Column name is required"),cn.any())})});import{z as Zl}from"zod";var Zs,vr,eo,Ur,qr=C(()=>{"use strict";y();Zs=["gemini","openai","anthropic","grok","openrouter"],vr=Zl.enum(Zs),eo=[{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"}]}],Ur=r=>eo.find(e=>e.id===r)?.models[0]?.id??"gemini-3-flash-preview"});import{z as He}from"zod";var Br,Se,eu,tu,$n=C(()=>{"use strict";y();we();Br=k.extend({cascade:He.string().optional().transform(r=>r==="true")}),Se=He.object({tableName:He.string("Table name is required"),columnName:He.string("Column name is required")}),eu=He.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,cascade:He.boolean().optional()}),tu=He.object({message:He.string("Message is required"),tableName:He.string("Table name is required"),columnName:He.string("Column name is required"),deletedCount:He.number("Deleted count is required").default(0)})});import{z as ln}from"zod";var vt,nu,ru,to=C(()=>{"use strict";y();we();$n();vt=ln.object({columnType:ln.string("Column type is required"),isNullable:ln.boolean(),defaultValue:ln.string().nullable().optional()}),nu=Se,ru=ln.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,columnType:vt.shape.columnType,isNullable:vt.shape.isNullable,defaultValue:vt.shape.defaultValue})});var no=C(()=>{"use strict";y()});import{z as Ut}from"zod";var Fr,ro=C(()=>{"use strict";y();Fr=Ut.object({tableName:Ut.string().min(1,"Table name is required"),records:Ut.array(Ut.record(Ut.string(),Ut.any())).min(1,"At least one record is required")})});import{z as me}from"zod";var au,su,Kr,ao=C(()=>{"use strict";y();qr();we();au=me.object({type:me.string(),content:me.string().optional()}).passthrough(),su=me.object({provider:vr.optional().default("gemini"),model:me.string().min(1).optional(),messages:me.array(me.object({id:me.string(),role:me.enum(["user","assistant","system","tool","reasoning"]),content:me.union([me.string(),me.null(),me.array(me.unknown())]).optional(),parts:me.array(au).optional()}).passthrough()),data:me.object({conversationId:me.string().optional(),db:U.shape.db,includeSchema:me.boolean().optional().default(!0)})}),Kr=su.transform(r=>({...r,model:r.model??Ur(r.provider)}))});var so=C(()=>{"use strict";y()});import{z as Le}from"zod";var ou,oo,L,iu,io,cu,Hr=C(()=>{"use strict";y();ou=["text","boolean","number","enum","json","date","array"],oo=Le.enum(ou),L={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},iu=["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"],io=Le.enum(iu),cu=Le.object({columnName:Le.string(),dataType:oo,dataTypeLabel:io,isNullable:Le.boolean(),columnDefault:Le.string().nullable(),isPrimaryKey:Le.boolean(),isForeignKey:Le.boolean(),referencedTable:Le.string().nullable(),referencedSchema:Le.string().optional(),referencedColumn:Le.string().nullable(),enumValues:Le.array(Le.string()).nullable()})});function Mn(r){let e=r?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?L.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"?L.number:e==="boolean"||e==="bool"?L.boolean:e==="json"||e==="jsonb"?L.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?L.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"?L.text:L.text}function jr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?g.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?g.bigint:e==="smallint"||e==="int2"?g.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?g.numeric:e==="real"||e==="float4"?g.float:e==="double precision"||e==="float8"||e==="float"?g.double:e==="money"?g.money:e==="boolean"||e==="bool"?g.boolean:e==="text"?g.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?g.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?g.char:e==="json"?g.json:e==="jsonb"?g.jsonb:e==="xml"?g.xml:e==="uuid"?g.uuid:e==="date"?g.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?g.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?g.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?g.timestamptz:e==="interval"||e.startsWith("interval")?g.interval:e==="bytea"?g.bytea:e==="inet"?g.inet:e==="cidr"?g.cidr:e==="macaddr"?g.macaddr:e==="macaddr8"?g.macaddr8:e==="point"?g.point:e==="line"?g.line:e==="polygon"?g.polygon:e.startsWith("array")||e.includes("[]")?g.text:e.startsWith("user-defined")||e==="enum"?g.enum:g.text}function kn(r,e){let t=r?.toLowerCase().trim()||"",n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?L.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"?L.number:t==="boolean"||t==="bool"?L.boolean:t==="date"||t==="datetime"||t==="timestamp"||t==="time"||t==="year"?L.date:t==="json"?L.json:t==="enum"||t==="set"?L.enum:L.text}function Wr(r,e){if(!r)return g.text;let t=r.toLowerCase().trim(),n=e?.toLowerCase().trim()||"";return t==="tinyint"&&n==="tinyint(1)"?g.boolean:t==="tinyint"?g.tinyint:t==="smallint"?g.smallint:t==="mediumint"?g.mediumint:t==="int"||t==="integer"?g.int:t==="bigint"?g.bigint:t==="decimal"||t==="numeric"?g.numeric:t==="float"||t==="real"?g.float:t==="double"?g.double:t==="bit"?g.bit:t==="boolean"||t==="bool"?g.boolean:t==="char"?g.char:t==="varchar"?g.varchar:t==="tinytext"?g.tinytext:t==="text"?g.text:t==="mediumtext"?g.mediumtext:t==="longtext"?g.longtext:t==="binary"?g.binary:t==="varbinary"?g.varbinary:t==="tinyblob"?g.tinyblob:t==="blob"?g.blob:t==="mediumblob"?g.mediumblob:t==="longblob"?g.longblob:t==="json"?g.json:t==="date"?g.date:t==="time"?g.time:t==="datetime"?g.datetime:t==="timestamp"?g.timestamp:t==="year"?g.year:t==="enum"?g.enum:t==="set"?g.set:g.text}function vn(r){let e=r?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?L.number:e==="bit"?L.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?L.date:e==="json"?L.json:L.text}function Vr(r){if(!r)return g.text;let e=r.toLowerCase().trim();return e==="tinyint"?g.tinyint:e==="smallint"?g.smallint:e==="int"?g.int:e==="bigint"?g.bigint:e==="decimal"||e==="numeric"?g.numeric:e==="float"||e==="real"?g.float:e==="money"||e==="smallmoney"?g.money:e==="bit"?g.boolean:e==="char"?g.char:e==="varchar"?g.varchar:e==="text"?g.text:e==="nchar"?g.char:e==="nvarchar"?g.varchar:e==="ntext"?g.text:e==="binary"?g.binary:e==="varbinary"?g.varbinary:e==="image"?g.blob:e==="uniqueidentifier"?g.uuid:e==="date"?g.date:e==="time"?g.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?g.datetime:e==="datetimeoffset"?g.timestamptz:e==="json"?g.json:e==="xml"?g.xml:g.text}function Un(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"||e==="bool"?L.boolean:e==="json"?L.json:e==="date"||e==="datetime"||e==="timestamp"||e==="time"?L.date:e.includes("int")||e==="real"||e.includes("floa")||e.includes("doub")||e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?L.number:L.text}function Yr(r){let e=r?.toLowerCase().trim()||"";return e==="integer"||e==="int"?g.int:e==="bigint"||e.startsWith("bigint(")?g.bigint:e==="smallint"||e.startsWith("smallint(")?g.smallint:e==="tinyint"||e.startsWith("tinyint(")?g.tinyint:e==="mediumint"||e.startsWith("mediumint(")?g.mediumint:e.includes("int")?g.int:e==="real"||e==="float"||e.startsWith("float(")?g.float:e==="double"||e==="double precision"||e.startsWith("double(")?g.double:e==="numeric"||e.startsWith("numeric(")||e==="decimal"||e.startsWith("decimal(")?g.numeric:e==="boolean"||e==="bool"?g.boolean:e==="text"||e==="clob"?g.text:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="char"||e.startsWith("char(")?g.char:e==="json"?g.json:e==="date"?g.date:e==="time"?g.time:e==="datetime"?g.datetime:e==="timestamp"?g.timestamp:e==="blob"?g.blob:g.text}function qn(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")||e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?L.json:e==="boolean"||e==="bool"?L.boolean:e.startsWith("enum")?L.enum:e==="interval"?L.text:e==="date"||e.startsWith("time")||e==="datetime"?L.date:e.includes("int")||e==="float"||e==="real"||e==="double"||e.startsWith("decimal")||e.startsWith("numeric")||e==="bignum"?L.number:L.text}function zr(r){let e=r?.toLowerCase().trim()||"";return e.endsWith("]")?g.array:e.startsWith("struct")||e.startsWith("map")||e.startsWith("union")||e==="json"?g.json:e.startsWith("enum")?g.enum:e==="interval"?g.interval:e==="tinyint"||e==="utinyint"?g.tinyint:e==="smallint"||e==="usmallint"?g.smallint:e==="integer"||e==="int"?g.int:e.includes("int")||e==="bignum"?g.bigint:e.startsWith("decimal")||e.startsWith("numeric")?g.numeric:e==="float"||e==="real"?g.float:e==="double"?g.double:e==="boolean"||e==="bool"?g.boolean:e==="varchar"||e.startsWith("varchar(")?g.varchar:e==="uuid"?g.uuid:e==="date"?g.date:e==="timestamp with time zone"||e==="timestamptz"?g.timestamptz:e.startsWith("timestamp")||e==="datetime"?g.timestamp:e.startsWith("time")?g.time:e==="blob"||e==="bytea"?g.blob:e==="bit"||e==="bitstring"?g.bit:g.text}function Bn(r){let e=r?.toLowerCase().trim()||"";return e==="boolean"?L.boolean:e==="json"?L.json:e==="date"||e.startsWith("timestamp")?L.date:e.startsWith("number")||e.startsWith("float")||e==="integer"||e==="binary_float"||e==="binary_double"?L.number:L.text}function Gr(r){let e=r?.toLowerCase().trim()||"";if(e==="boolean")return g.boolean;if(e==="json")return g.json;if(e==="xmltype")return g.xml;if(e==="integer")return g.int;let t=e.match(/^number\((\d+)(?:,0)?\)$/);if(t){let n=Number(t[1]);if(n<=4)return g.smallint;if(n<=10)return g.int;if(n<=19)return g.bigint}return e.startsWith("number")?g.numeric:e==="binary_float"?g.float:e==="binary_double"||e.startsWith("float")?g.double:e.startsWith("varchar")||e.startsWith("nvarchar")?g.varchar:e.startsWith("char")||e.startsWith("nchar")?g.char:e.startsWith("timestamp")&&e.endsWith("time zone")?g.timestamptz:e==="date"||e.startsWith("timestamp")?g.timestamp:e.startsWith("interval")?g.interval:e==="blob"||e==="long raw"?g.blob:e.startsWith("raw")?g.varbinary:g.text}function qt(r){let e=r.trim();for(;;){let t=e.match(/^(?:Nullable|LowCardinality)\((.*)\)$/);if(!t?.[1])return e;e=t[1].trim()}}function Fn(r){let e=qt(r);return e.startsWith("Array(")?L.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?L.enum:e==="Bool"?L.boolean:/^(Date|Date32|DateTime|DateTime64|Time|Time64)\b/.test(e)?L.date:/^(U?Int\d+|Float\d+|BFloat16|Decimal\d*)\b/.test(e)?L.number:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?L.json:L.text}function Qr(r){let e=qt(r);return e.startsWith("Array(")?g.array:e.startsWith("Enum8(")||e.startsWith("Enum16(")?g.enum:e==="Bool"?g.boolean:/^U?Int8$/.test(e)?g.tinyint:/^U?Int16$/.test(e)?g.smallint:/^U?Int32$/.test(e)?g.int:/^U?Int(64|128|256)$/.test(e)?g.bigint:e==="Float32"||e==="BFloat16"?g.float:e==="Float64"?g.double:e.startsWith("Decimal")?g.numeric:e.startsWith("FixedString(")?g.char:e==="UUID"?g.uuid:e==="IPv4"||e==="IPv6"?g.inet:e==="Date"||e==="Date32"?g.date:e.startsWith("DateTime64")?g.timestamp:e.startsWith("DateTime")?g.datetime:e.startsWith("Time")?g.time:/^(JSON|Object|Map|Tuple|Variant|Dynamic|Nested)\b/.test(e)?g.json:g.text}var g,co=C(()=>{"use strict";y();Hr();g={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as ye}from"zod";var lo,un,uo,lu,Jr,Xr,mo=C(()=>{"use strict";y();we();lo=["red","orange","amber","green","teal","blue","violet","pink"],un=ye.enum(lo),uo=ye.object({id:ye.string(),name:ye.string(),color:un.nullable(),readOnly:ye.boolean(),lastUsedAt:ye.number(),dbType:yt,maskedUrl:ye.string()}),lu=ye.object({connections:ye.array(uo),active:ye.object({id:ye.string().nullable(),dbType:yt,connectionId:ye.string()}).nullable()}),Jr=ye.object({url:ye.string().trim().min(1,"Paste a connection URL")}),Xr=ye.object({name:ye.string().trim().min(1,"Name is required").max(100).optional(),color:un.nullable().optional(),readOnly:ye.boolean().optional()})});import{z as de}from"zod";var po,Zr,fo,yo,ea,ho=C(()=>{"use strict";y();po=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Zr=de.enum(po),fo=de.object({columnName:de.string("Column name is required"),columnType:de.string("Column type is required"),defaultValue:de.string().optional(),isPrimaryKey:de.boolean().default(!1),isNullable:de.boolean().default(!1),isUnique:de.boolean().default(!1),isIdentity:de.boolean().default(!1),isArray:de.boolean().default(!1)}),yo=de.object({columnName:de.string("Column name is required"),referencedTable:de.string("Referenced table is required"),referencedColumn:de.string("Referenced column is required"),onUpdate:Zr.default("NO ACTION"),onDelete:Zr.default("NO ACTION")}),ea=de.object({tableName:de.string("Table name is required"),fields:de.array(fo).min(1,"At least one field is required"),foreignKeys:de.array(yo).optional()})});var M,Ye,go=C(()=>{"use strict";y();we();M={pg:{label:"PostgreSQL",protocols:["postgres","postgresql","cockroachdb"],defaultPort:5432,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!0,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:["btree","hash","gin","gist","spgist","brin"],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mysql:{label:"MySQL",protocols:["mysql","mysql2","mariadb","tidb"],defaultPort:3306,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},mssql:{label:"SQL Server",protocols:["mssql","sqlserver"],defaultPort:1433,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!1,sqlInsert:{quote:"[",booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!0},rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},mongodb:{label:"MongoDB",protocols:["mongodb","mongodb+srv"],defaultPort:27017,dataModel:"document",editorLanguage:"json",liveMode:!1,schemaSelector:!1,cellDefault:!1,readOnly:!1,sqlInsert:null,rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!0},sqlite:{label:"SQLite / libSQL / D1",protocols:["sqlite","libsql","d1"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!1,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:null},serverLogs:!1},redis:{label:"Redis",protocols:["redis","rediss"],defaultPort:6379,dataModel:"key-value",editorLanguage:"plaintext",liveMode:!1,schemaSelector:!1,cellDefault:!1,readOnly:!1,sqlInsert:null,rowMutation:!0,indexes:!1,serverLogs:!0},duckdb:{label:"DuckDB",protocols:["duckdb"],defaultPort:null,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!0,sqlInsert:{quote:'"',booleanKeywords:!0,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:"DuckDB cannot alter or rename a table that has an index, or alter or drop a column an index covers."},serverLogs:!1},oracle:{label:"Oracle",protocols:["oracle"],defaultPort:1521,dataModel:"relational",editorLanguage:"pgsql",liveMode:!0,schemaSelector:!1,cellDefault:!0,readOnly:!1,sqlInsert:{quote:'"',booleanKeywords:!1,backslashEscapes:!1,unicodePrefix:!1},rowMutation:!0,indexes:{methods:[],createNote:"Building an index blocks writes to this table until it finishes."},serverLogs:!0},clickhouse:{label:"ClickHouse",protocols:["clickhouse","clickhouses"],defaultPort:8123,dataModel:"relational",editorLanguage:"pgsql",liveMode:!1,schemaSelector:!1,cellDefault:!1,readOnly:!0,sqlInsert:{quote:"`",booleanKeywords:!0,backslashEscapes:!0,unicodePrefix:!1},indexes:!1,rowMutation:!1,rowMutationReason:"Use a SQL query to update or delete ClickHouse rows; sorting keys are not unique.",serverLogs:!0}},Ye=r=>kt.find(e=>M[e].protocols.includes(r))});import{z as Re}from"zod";var bo,uu,mu,To=C(()=>{"use strict";y();we();bo=Re.object({name:Re.string("Name is required"),size:Re.string("Size is required"),owner:Re.string("Owner is required"),encoding:Re.string("Encoding is required")}),uu=Re.object({databases:Re.array(bo),dbType:yt}),mu=Re.object({version:Re.string("Version is required"),database:Re.string("Database is required"),user:Re.string("User is required"),host:Re.string("Host is required").nullable(),port:Re.number("Port is required").nullable(),active_connections:Re.coerce.number("Active connections is required"),max_connections:Re.coerce.number("Max connections is required")})});var Eo=C(()=>{"use strict";y()});import{z as Bt}from"zod";var Kn,wo=C(()=>{"use strict";y();Kn=Bt.object({tableName:Bt.string("Table name is required"),primaryKeys:Bt.array(Bt.object({columnName:Bt.string("Column name is required"),value:Bt.any()})).min(1,"At least one primary key is required")})});import{z as du}from"zod";var ta,So=C(()=>{"use strict";y();we();ta=k.extend({cascade:du.string().optional().transform(r=>r==="true")})});import{z as Ro}from"zod";var na,Co=C(()=>{"use strict";y();na=Ro.object({query:Ro.string("Query is required")})});import{z as pu}from"zod";var No,ra,Ao=C(()=>{"use strict";y();we();No=["csv","xlsx","json"],ra=k.extend({format:pu.enum(No,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});import{z as ce}from"zod";var Do,fu,Hn,yu,jn,hu,_o=C(()=>{"use strict";y();we();Do=["primary","unique-constraint","index"],fu=ce.object({indexName:ce.string(),columns:ce.array(ce.string()),isUnique:ce.boolean(),isSparse:ce.boolean().optional(),expireAfterSeconds:ce.number().nonnegative().optional(),method:ce.string().nullable(),kind:ce.enum(Do),definition:ce.string().nullable()}),Hn=ce.object({indexName:ce.string().min(1),columns:ce.array(ce.string().min(1)).min(1),isUnique:ce.boolean(),method:ce.string().optional()}),yu=Hn.extend({db:U.shape.db,tableName:ie.shape.tableName,schemaName:k.shape.schemaName}),jn=ce.object({tableName:ce.string("Table name is required"),indexName:ce.string("Index name is required")}),hu=jn.extend({db:U.shape.db,schemaName:k.shape.schemaName})});import{z as E}from"zod";var Wn,v,aa,sa,gu,oa,Ft,bu,Tu,Eu,wu,Su,Ru,Cu,Oo,Nu,ia,Au,Du,_u,Ou,Iu,xu,Lu,ca,Pu,$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,Vu,Yu,la,ua,zu,Io=C(()=>{"use strict";y();Wn=E.enum(["string","hash","list","set","zset","stream","unknown"]),v=E.object({base64:E.string().max(16*1024*1024).refine(r=>/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/.test(r),"Invalid unpadded base64url value"),utf8:E.string().optional()}),aa=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(200).default(50),search:E.string().max(512).optional(),exactPattern:E.stringbool().default(!1),type:Wn.exclude(["unknown"]).optional()}),sa=E.object({key:v,type:Wn,ttlMs:E.number().int(),memoryBytes:E.number().int().nonnegative().nullable()}),gu=E.object({keys:E.array(sa),nextCursor:E.string().nullable(),hasMore:E.boolean()}),oa=E.object({db:E.string(),cursor:E.string().max(2048).regex(/^[A-Za-z0-9_-]+$/).optional(),limit:E.coerce.number().int().min(1).max(500).default(100),full:E.stringbool().default(!1),direction:E.enum(["forward","backward"]).default("forward")}),Ft=E.object({key:E.string().min(1).max(16*1024).regex(/^[A-Za-z0-9_-]+$/)}),bu=E.object({kind:E.literal("string"),value:v,truncated:E.boolean()}),Tu=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v}))}),Eu=E.object({kind:E.literal("list"),entries:E.array(E.object({index:E.number().int(),value:v}))}),wu=E.object({kind:E.literal("set"),members:E.array(v)}),Su=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.union([E.number(),E.literal("inf"),E.literal("-inf")])}))}),Ru=E.object({kind:E.literal("stream"),entries:E.array(E.object({id:E.string(),fields:E.array(E.object({field:v,value:v}))}))}),Cu=E.object({kind:E.literal("unknown")}),Oo=E.discriminatedUnion("kind",[bu,Tu,Eu,wu,Su,Ru,Cu]),Nu=sa.extend({length:E.number().int().nonnegative().nullable(),revision:E.string(),value:Oo,nextCursor:E.string().nullable(),hasMore:E.boolean()}),ia=E.object({db:E.string(),offset:E.coerce.number().int().nonnegative().default(0),limit:E.coerce.number().int().min(1).max(1024*1024).default(1024*1024),expectedRevision:E.string().optional()}),Au=E.object({chunk:v,length:E.number().int().nonnegative(),nextOffset:E.number().int().nonnegative().nullable(),hasMore:E.boolean()}),Du=E.object({kind:E.literal("string"),value:v}),_u=E.object({kind:E.literal("hash"),entries:E.array(E.object({field:v,value:v})).min(1)}),Ou=E.object({kind:E.literal("list"),entries:E.array(v).min(1)}),Iu=E.object({kind:E.literal("set"),members:E.array(v).min(1)}),xu=E.object({kind:E.literal("zset"),entries:E.array(E.object({member:v,score:E.number()})).min(1)}),Lu=E.object({kind:E.literal("stream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),ca=E.object({key:v,type:Wn.exclude(["unknown"]),value:E.discriminatedUnion("kind",[Du,_u,Ou,Iu,xu,Lu]),ttlMs:E.number().int().positive().nullable().default(null)}),Pu=E.object({key:v,revision:E.string().nullable(),deleted:E.boolean()}),$u=E.object({action:E.literal("rename"),newKey:v}),Mu=E.object({action:E.literal("setTtl"),ttlMs:E.number().int().positive().nullable()}),ku=E.object({action:E.literal("setString"),value:v}),vu=E.object({action:E.literal("upsertHash"),field:v,value:v}),Uu=E.object({action:E.literal("deleteHash"),field:v}),qu=E.object({action:E.literal("pushList"),side:E.enum(["left","right"]),value:v}),Bu=E.object({action:E.literal("setList"),index:E.number().int(),value:v}),Fu=E.object({action:E.literal("deleteList"),index:E.number().int()}),Ku=E.object({action:E.literal("addSet"),member:v}),Hu=E.object({action:E.literal("removeSet"),member:v}),ju=E.object({action:E.literal("upsertZset"),member:v,score:E.number()}),Wu=E.object({action:E.literal("removeZset"),member:v}),Vu=E.object({action:E.literal("appendStream"),id:E.string().default("*"),fields:E.array(E.object({field:v,value:v})).min(1)}),Yu=E.object({action:E.literal("deleteStream"),id:E.string()}),la=E.object({expectedRevision:E.string(),force:E.boolean().default(!1),operation:E.discriminatedUnion("action",[$u,Mu,ku,vu,Uu,qu,Bu,Fu,Ku,Hu,ju,Wu,Vu,Yu])}),ua=E.object({db:E.string(),expectedRevision:E.string(),force:E.stringbool().default(!1)}),zu=E.object({deleted:E.boolean()})});var xo=C(()=>{"use strict";y()});import{z as ma}from"zod";var Vn,Gu,Qu,Lo=C(()=>{"use strict";y();we();$n();Vn=ma.object({newColumnName:ma.string("New column name is required")}),Gu=Se,Qu=ma.object({db:U.shape.db,tableName:Se.shape.tableName,schemaName:k.shape.schemaName,columnName:Se.shape.columnName,newColumnName:Vn.shape.newColumnName})});import{z as Yn}from"zod";var mn,Ju,Xu,Po=C(()=>{"use strict";y();we();mn=Yn.object({newTableName:Yn.string("New table name is required").trim().min(1,"New table name is required"),schemaName:Yn.string().trim().min(1).optional()}),Ju=ie,Xu=Yn.object({db:U.shape.db,tableName:ie.shape.tableName,newTableName:mn.shape.newTableName,schemaName:mn.shape.schemaName})});import{z as ve}from"zod";var $o,Mo,Zu,ko=C(()=>{"use strict";y();$o=["fatal","error","warning","info","debug"],Mo=ve.enum($o),Zu=ve.object({ts:ve.string(),level:Mo,rawLevel:ve.string(),source:ve.string().optional(),code:ve.string().optional(),message:ve.string(),durationMs:ve.number().optional(),statement:ve.string().optional(),detail:ve.record(ve.string(),ve.string())})});import{z as q}from"zod";var vo,dn,Uo,qo,em,da,Bo=C(()=>{"use strict";y();we();vo=q.object({columnName:q.string(),operator:q.string(),value:q.string()}),dn=["asc","desc"],Uo=q.object({columnName:q.string(),direction:q.enum(dn)}),qo=q.object({limit:q.number(),total:q.number(),totalEstimated:q.boolean().optional(),hasNextPage:q.boolean(),hasPreviousPage:q.boolean(),nextCursor:q.string().nullable(),prevCursor:q.string().nullable()}),em=q.object({data:q.array(q.record(q.string(),q.unknown())),meta:qo}),da=q.object({db:U.shape.db,schemaName:k.shape.schemaName,cursor:q.string().optional(),limit:q.string().optional().default("50").transform(Number),direction:q.enum(dn).optional().default(dn[0]),sort:q.string().optional().transform(r=>{if(!r)return"";try{let e=JSON.parse(r);return Array.isArray(e)?e:r}catch{return r}}).pipe(q.union([q.string(),q.array(Uo)])),order:q.enum(dn).optional(),filters:q.string().optional().transform(r=>{if(!r)return[];try{return JSON.parse(r)}catch{return[]}}).pipe(q.array(vo))})});import{z as pn}from"zod";var tm,Fo=C(()=>{"use strict";y();tm=pn.object({tableName:pn.string("Table name is required"),schemaName:pn.string().optional(),rowCount:pn.coerce.number("Row count is required"),rowCountEstimated:pn.boolean().optional()})});import{z as Ko}from"zod";var nm,Ho=C(()=>{"use strict";y();nm=Ko.object({schema:Ko.string()})});import{z as Pe}from"zod";var pa,jo=C(()=>{"use strict";y();pa=Pe.object({tableName:Pe.string("Table name is required"),primaryKey:Pe.string("Primary key is required").default("id"),primaryKeys:Pe.array(Pe.string().min(1)).min(1).optional(),updates:Pe.array(Pe.object({rowData:Pe.record(Pe.string("Column name is required"),Pe.any()),columnName:Pe.string("Column name is required"),value:Pe.any(),useDefault:Pe.boolean().optional()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var Wo={};$t(Wo,{AI_PROVIDERS:()=>Zs,AI_PROVIDER_OPTIONS:()=>eo,CONNECTION_COLORS:()=>lo,DATABASE_ENGINES:()=>M,DATABASE_TYPES:()=>kt,DataTypes:()=>L,FOREIGN_KEY_ACTIONS:()=>po,FORMAT_TYPES:()=>No,INDEX_KINDS:()=>Do,SERVER_LOG_LEVELS:()=>$o,StandardizedDataType:()=>g,addColumnParamSchema:()=>Jl,addColumnParamsSchema:()=>Xl,addColumnSchema:()=>Ke,addRecordSchema:()=>kr,aiProviderSchema:()=>vr,alterColumnParamSchema:()=>nu,alterColumnParamsSchema:()=>ru,alterColumnSchema:()=>vt,bulkInsertRecordsSchema:()=>Fr,chatSchema:()=>Kr,columnInfoSchema:()=>cu,connectUrlSchema:()=>Jr,connectionColorSchema:()=>un,connectionInfoSchema:()=>mu,connectionSummarySchema:()=>uo,connectionsStateSchema:()=>lu,createIndexParamsSchema:()=>yu,createIndexSchema:()=>Hn,createKeySchema:()=>ca,createTableSchema:()=>ea,currentDatabaseSchema:()=>Gl,dataTypesSchema:()=>oo,databaseInfoSchema:()=>bo,databaseListSchema:()=>uu,databaseSchema:()=>U,databaseTypeParamSchema:()=>Ql,databaseTypeSchema:()=>yt,dbTypeFromProtocol:()=>Ye,deleteColumnParamSchema:()=>Se,deleteColumnParamsSchema:()=>eu,deleteColumnQuerySchema:()=>Br,deleteColumnSuccessResponseSchema:()=>tu,deleteKeyQuerySchema:()=>ua,deleteKeyResultSchema:()=>zu,deleteRecordSchema:()=>Kn,deleteTableQuerySchema:()=>ta,dropIndexParamSchema:()=>jn,dropIndexParamsSchema:()=>hu,encodedRedisValueSchema:()=>v,executeQuerySchema:()=>na,exportTableSchema:()=>ra,fieldDataSchema:()=>fo,filterSchema:()=>vo,foreignKeyActionSchema:()=>Zr,foreignKeyDataSchema:()=>yo,getDefaultAiModel:()=>Ur,indexInfoSchema:()=>fu,keyActionSchema:()=>la,keyDetailsQuerySchema:()=>oa,keyDetailsResultSchema:()=>Nu,keyParamSchema:()=>Ft,keyRawQuerySchema:()=>ia,keyRawResultSchema:()=>Au,keyScanQuerySchema:()=>aa,keyScanResultSchema:()=>gu,keyWriteResultSchema:()=>Pu,mapClickhouseToDataType:()=>Fn,mapDuckdbToDataType:()=>qn,mapMssqlToDataType:()=>vn,mapMysqlToDataType:()=>kn,mapOracleToDataType:()=>Bn,mapPostgresToDataType:()=>Mn,mapSqliteToDataType:()=>Un,redisKeySummarySchema:()=>sa,redisKeyTypeSchema:()=>Wn,redisKeyValueSchema:()=>Oo,renameColumnParamSchema:()=>Gu,renameColumnParamsSchema:()=>Qu,renameColumnSchema:()=>Vn,renameTableParamSchema:()=>Ju,renameTableParamsSchema:()=>Xu,renameTableSchema:()=>mn,serverLogEntrySchema:()=>Zu,serverLogLevelSchema:()=>Mo,sortDirections:()=>dn,sortSchema:()=>Uo,standardizeClickhouseDataTypeLabel:()=>Qr,standardizeDataTypeLabel:()=>jr,standardizeDuckdbDataTypeLabel:()=>zr,standardizeMssqlDataTypeLabel:()=>Vr,standardizeMysqlDataTypeLabel:()=>Wr,standardizeOracleDataTypeLabel:()=>Gr,standardizeSqliteDataTypeLabel:()=>Yr,standardizedDataTypeSchema:()=>io,tableDataMetaSchema:()=>qo,tableDataQuerySchema:()=>da,tableDataResultSchema:()=>em,tableInfoSchema:()=>tm,tableNameSchema:()=>ie,tableQuerySchema:()=>k,tableSchemaResultSchema:()=>nm,unwrapClickhouseType:()=>qt,updateConnectionSchema:()=>Xr,updateRecordsSchema:()=>pa});var j=C(()=>{"use strict";y();Js();Xs();qr();to();no();ro();ao();so();co();Hr();mo();ho();we();go();To();Eo();$n();wo();So();Co();Ao();_o();Io();xo();Lo();Po();ko();Bo();Fo();Ho();jo()});var rm,am,sm,zn,fa=C(()=>{"use strict";y();j();rm=Object.values(M).flatMap(({protocols:r})=>r).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),am=new RegExp(`\\b(?:${rm}):\\/\\/\\S+`,"gi"),sm=/\b(authToken=)[^&\s]+/gi,zn=r=>r.replace(am,e=>`the configured database${e.match(/[),.]+$/)?.[0]??""}`).replace(sm,"$1[redacted]")});var d,Q=C(()=>{"use strict";y();d=class extends Error{constructor(t,{message:n,cause:a}={}){super(n,{cause:a});this.status=t}status}});import{AsyncLocalStorage as cm}from"async_hooks";import{randomUUID as Yo}from"crypto";var lm,um,Gn,zo,Go,lt,ya,mm,dm,pm,Qo,ha,he,Z,ze=C(()=>{"use strict";y();Q();lm=Yo(),um=/^[A-Za-z0-9_-]{8,64}$/,Gn=new cm,zo=r=>r&&um.test(r)?r:Yo(),Go=(r,e)=>Gn.run(r,e),lt=()=>Gn.getStore()?.requestId,ya=()=>Gn.getStore()?.connectionId,mm=r=>{let e=r instanceof d?"HTTPException":r instanceof Error?r.name:"Error";return/^[A-Za-z][A-Za-z0-9]{0,49}$/.test(e)?e:"Error"},dm=/^[A-Z0-9_-]{2,32}$/,pm=[[/^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"]],Qo=r=>{if(!(r instanceof Error))return;let{code:e,errno:t,number:n,cause:a}=r;return typeof n=="number"&&Number.isSafeInteger(n)?String(n):typeof e=="string"&&dm.test(e)?e:typeof e=="number"&&Number.isSafeInteger(e)?String(e):typeof t=="number"&&Number.isSafeInteger(t)?String(t):r.name==="ReplyError"?r.message.match(/^[A-Z]{3,32}(?= |$)/)?.[0]:pm.find(([s])=>s.test(r.message))?.[1]??Qo(a)},ha=r=>r instanceof d&&r.cause?r.cause:r,he=r=>{let e=ha(r);return{error_type:mm(e),error_code:Qo(e)}},Z=(r,e,t={})=>{let n=Gn.getStore();process.stderr.write(`${JSON.stringify({timestamp:new Date().toISOString(),level:r,event:e,instance_id:lm,request_id:n?.requestId,operation:n?.operation,db_type:n?.dbType,...t})}
|
|
3
|
+
`)}});function Oe(r){try{let e=new URL(r);return{host:e.hostname||"localhost",port:Number.parseInt(e.port,10)||fm(e)}}catch(e){return Z("error","database_url_unparseable",he(e)),{host:"localhost",port:5432}}}var Qn,fm,Jo,Ge=C(()=>{"use strict";y();j();ze();Qn={cockroachdb:{driverScheme:"postgresql",defaultPort:26257},mariadb:{driverScheme:"mysql",defaultPort:3306},tidb:{driverScheme:"mysql",defaultPort:4e3}},fm=r=>{let e=r.protocol.replace(":",""),t=Ye(e);return Qn[e]?.defaultPort??(t&&M[t].defaultPort)??5432},Jo=r=>{let e=new URL(r),t=Qn[e.protocol.replace(":","")];return t?(e.port||=String(t.defaultPort),e.protocol=t.driverScheme,e.toString()):r}});var Rt,ga=C(()=>{Rt={name:"db-studio",type:"module",version:"2.2.1",description:"Every database. One studio. Browse tables, edit records, design schemas, and run queries across SQL, document, and key-value databases. Free and open source.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","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",typecheck:"bun check",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",e2e:"tsx e2e/contract.ts","e2e:perf":"tsx e2e/perf.ts","e2e:grid":"tsx e2e/grid.ts","e2e:schema-routing":"tsx e2e/schema-routing.ts","e2e:visualizer":"tsx e2e/visualizer.ts"},portless:{name:"api.db-studio",script:"dev:app"},dependencies:{"@clack/prompts":"^1.8.1","@clickhouse/client":"^1.24.1","@duckdb/node-api":"^1.5.6-r.1","@elysiajs/cors":"^1.4.2","@elysiajs/node":"^1.4.5","@libsql/client":"^0.18.0","@sentry/node":"^10.73.0",commander:"^15.0.0",dotenv:"^18.0.9",elysia:"^1.4.30",ioredis:"^6.0.0",mongodb:"^7.8.0",mssql:"^12.7.13",mysql2:"^3.24.6",open:"^11.0.4",oracledb:"^26.0.0",pg:"^8.23.1",picocolors:"^1.1.1","posthog-node":"^5.61.1",xlsx:"^0.18.5",zod:"^4.6.7"},devDependencies:{"@biomejs/biome":"^2.6.4","@db-studio/shared":"workspace:*","@sentry/esbuild-plugin":"^5.4.0","@types/mssql":"^12.3.0","@types/node":"^26.6.6","@types/oracledb":"^26.0.1","@types/pg":"^8.23.1","@vitest/coverage-v8":"^5.0.5","playwright-core":"1.64.1",tsup:"^9.0.0",tsx:"^4.23.15",typescript:"^7.0.2",vitest:"^5.0.5"}}});var oi={};$t(oi,{captureInstallationActive:()=>Sa,captureServerError:()=>Ra,captureServerEvent:()=>er,databaseTypeForRequest:()=>hn,durationBucket:()=>Ea,flushServerObservability:()=>Lm,getTelemetryConfig:()=>Xn,initServerObservability:()=>si,operationForRequest:()=>yn,outcomeForStatus:()=>wa,resetTelemetryId:()=>Ta,setTelemetryEnabled:()=>Zn,startServerSpan:()=>Ca});import{randomUUID as ni}from"crypto";import{existsSync as Em,mkdirSync as wm,readFileSync as Sm,writeFileSync as Rm}from"fs";import{homedir as ba,platform as Cm}from"os";import Ht from"path";import{pathToFileURL as Nm}from"url";import*as $e from"@sentry/node";import{PostHog as Am}from"posthog-node";var Dm,ri,Jn,_m,Om,ht,Ct,Im,xm,Nt,fn,Xn,Zn,Ta,Ea,wa,ai,yn,hn,si,Lm,er,Sa,Pm,Ra,Ca,gn=C(()=>{"use strict";y();j();ze();ga();Dm=()=>process.env.NODE_ENV==="test"||process.env.NODE_ENV==="development",ri=()=>{let r=process.env.DB_STUDIO_DATA_DIR??process.env.XDG_STATE_HOME??(process.platform==="win32"?process.env.LOCALAPPDATA:Ht.join(ba(),".local","state"));return Ht.join(r||Ht.join(ba(),".db-studio"),"db-studio","telemetry.json")},Jn=r=>{try{let e=ri();wm(Ht.dirname(e),{recursive:!0}),Rm(e,JSON.stringify(r),{encoding:"utf8",mode:384})}catch{}},_m=()=>({installationId:ni(),enabled:!0}),Om=()=>{let r=ri();try{if(Em(r)){let t=JSON.parse(Sm(r,"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=_m();return Jn(e),e},Im="https://a1e890d1105f1f27fcb1dbead71c30dd@o4509725125181440.ingest.de.sentry.io/4512040493383760",xm="phc_nxaQk54MWAehmL72J4gjVbrQCpbSTedMyHn3PvFxAhkd",Nt=()=>ht??=Om(),fn=()=>!Dm()&&process.env.DB_STUDIO_TELEMETRY!=="0"&&Nt().enabled,Xn=()=>({enabled:fn(),installationId:Nt().installationId,appVersion:Rt.version}),Zn=r=>{ht={...Nt(),enabled:r},Jn(ht),r?(Ct?.enable(),si()):(Ct?.disable(),$e.close(500))},Ta=()=>(ht={...Nt(),installationId:ni(),lastActiveAt:void 0},Jn(ht),ht.installationId),Ea=r=>r<100?"under_100ms":r<1e3?"100ms_1s":r<5e3?"1s_5s":"over_5s",wa=r=>r>=500?"server_error":r>=400?"client_error":"success",ai=new RegExp(`^/api/(${kt.join("|")})(?=/|$)`),yn=(r,e)=>{let t=e.replace(ai,"/api"),a=[[/^\/api\/databases(?:\/|$)/,"databases"],[/^\/api\/tables(?:\/|$)/,"tables"],[/^\/api\/records(?:\/|$)/,"records"],[/^\/api\/query(?:\/|$)/,"query"],[/^\/api\/keys(?:\/|$)/,"keys"],[/^\/api\/chat(?:\/|$)/,"chat"]].find(([s])=>s.test(t))?.[1]??"other";return`${r.toLowerCase()}_${a}`},hn=r=>r.match(ai)?.[1],si=()=>{if(!fn())return;let r=process.env.DB_STUDIO_SENTRY_DSN??Im;r&&(!$e.isInitialized()||$e.getClient()?.getOptions().enabled===!1)&&$e.init({dsn:r,environment:process.env.NODE_ENV??"production",release:`db-studio@${Rt.version}`,tracesSampleRate:.1,sendDefaultPii:!1,defaultIntegrations:!1,beforeSend(t){return delete t.request,t.user={id:Nt().installationId},delete t.breadcrumbs,delete t.server_name,t},beforeSendSpan(t){return{...t,data:Object.fromEntries(Object.entries(t.data??{}).filter(([n])=>n.startsWith("db_studio.")))}}});let e=process.env.DB_STUDIO_POSTHOG_KEY??xm;e&&!Ct&&(Ct=new Am(e,{host:process.env.DB_STUDIO_POSTHOG_HOST??"https://eu.i.posthog.com",flushAt:20,flushInterval:1e4,requestTimeout:2e3}))},Lm=()=>Promise.allSettled([Ct?.shutdown(2e3),$e.close(2e3)]),er=r=>{!fn()||!Ct||Ct.capture({distinctId:Nt().installationId,event:r.event,properties:{...r.properties,source:"server",app_version:Rt.version,$geoip_disable:!1}})},Sa=()=>{if(!fn())return;let r=Nt(),e=r.lastActiveAt?Date.parse(r.lastActiveAt):0;Date.now()-e<864e5||(ht={...r,lastActiveAt:new Date().toISOString()},Jn(ht),er({event:"installation_active",properties:{runtime:`node-${process.versions.node.split(".")[0]}`,os:Cm()}}))},Pm=(r,e,t)=>{let n=new Error(t);if(n.name=e,r instanceof Error&&r.stack){let a=ba(),s=a.replaceAll("\\","/"),o=a?[a,s,Nm(a,{windows:Ht.win32.isAbsolute(a)&&!Ht.posix.isAbsolute(a)}).pathname.replace(/^\/(?=[a-z]:\/)/i,"")].sort((c,l)=>l.length-c.length):[],i=r.stack.split(`
|
|
4
4
|
`).slice(1).filter(c=>/^\s*at\s/.test(c)).map(c=>o.reduce((l,u)=>l.replaceAll(u,"~"),c));n.stack=[`${e}: ${t}`,...i].join(`
|
|
5
5
|
`)}return n},Ra=(r,{operation:e,status:t,dbType:n})=>{if(!fn()||t<500)return;let{error_type:a,error_code:s}=he(r),o=lt(),i=`${e} failed with ${t}${s?` ${s}`:""}`;$e.captureException(Pm(ha(r),a,i),{tags:{operation:e,source:"server",release:Rt.version,status:String(t),...n?{db_type:n}:{},error_type:a,...s?{error_code:s}:{},...o?{request_id:o}:{}},fingerprint:[e,String(t),a,s??"unknown"]})},Ca=(r,e,t)=>$e.startSpan({name:r,op:"http.server",attributes:{"db_studio.operation":r,...e?{"db_studio.db_type":e}:{}}},t)});var ii={};$t(ii,{checkDatabaseConnection:()=>Aa,getDatabaseConnectionDetails:()=>Mm});var $m,Na,Mm,Aa,Da=C(()=>{"use strict";y();j();Ge();$m=2e3,Na=async r=>{let e;try{return await Promise.race([r,new Promise((t,n)=>{e=setTimeout(()=>n(new Error("Database startup check timed out")),$m)})])}finally{e&&clearTimeout(e)}},Mm=r=>{let e=Ye(r.split("://")[0]?.toLowerCase()??"");if(!e)return null;let{label:t,defaultPort:n}=M[e];if(r.startsWith("sqlite://"))return{type:e,name:t,destination:"local file"};if(r.startsWith("d1://"))return{type:e,name:t,destination:"Cloudflare D1"};if(n===null)return{type:e,name:t,destination:new URL(r).host};let{host:a,port:s}=Oe(r);return{type:e,name:t,destination:`${a}:${s}`}},Aa=async r=>{switch(r.getDbType()){case"pg":await Na(r.getPgPool().then(e=>e.query("SELECT 1")));return;case"mysql":await(await r.getMysqlPool()).query("SELECT 1");return;case"mssql":await(await r.getMssqlPool()).request().query("SELECT 1");return;case"mongodb":{await(await r.getMongoClient()).db(r.getMongoDbName()).command({ping:1});return}case"sqlite":await Na(r.getSqliteClient().then(e=>e.execute("SELECT 1")));return;case"redis":await(await r.getRedisClient()).ping();return;case"duckdb":await r.withDuckdbConnection(e=>e.run("SELECT 1"));return;case"oracle":{let e=await(await r.getOraclePool()).getConnection();await e.execute("SELECT 1 FROM dual").finally(()=>e.close());return}case"clickhouse":await Na(r.getClickhouseClient().then(e=>e.query({query:"SELECT 1"})))}}});import{randomUUID as km}from"crypto";import{chmod as vm,mkdir as Um,readFile as qm,rename as Bm,writeFile as Fm}from"fs/promises";import{homedir as Km}from"os";import{basename as Hm,join as ui,resolve as jm}from"path";import{z as ut}from"zod";var Wm,Vm,mi,tr,ci,di,Ym,zm,Qe,pi,Gm,li,_a,Qm,Oa,Ia,xa,nr,La,fi,yi,hi,Pa=C(()=>{"use strict";y();j();Q();Wm=ut.object({id:ut.string(),name:ut.string(),url:ut.string(),color:un.nullable(),readOnly:ut.boolean().default(!1),lastUsedAt:ut.number()}),Vm=ut.object({version:ut.literal(1),connections:ut.array(Wm)}),mi=()=>process.env.DB_STUDIO_CONFIG_DIR??ui(Km(),".dbstudio"),tr=()=>ui(mi(),"connections.json"),ci="\u2022\u2022\u2022\u2022",di=/^(sqlite|duckdb):\/\/(.*)$/,Ym=new Set(["authtoken","password","token"]),zm=r=>{try{return decodeURIComponent(r.replaceAll("+"," ")).toLowerCase()}catch{return r.toLowerCase()}},Qe=r=>r.replace(/^([a-z][a-z0-9+.-]*:\/\/[^:/@?#]*:)[^/?#]*@/i,`$1${ci}@`).replace(/([?&])([^=&#]*)=[^&#]*/g,(e,t,n)=>Ym.has(zm(n))?`${t}${n}=${ci}`:e),pi=(r,e=process.cwd())=>{let t=r.trim(),n=t.match(di);if(!n)return t;let[,a,s=""]=n;return s===":memory:"||s.startsWith("/")?t:`${a}://${jm(e,s)}`},Gm=r=>{let e=r.match(di);if(e)return Hm(e[2]??"")||r;try{let t=new URL(r),n=decodeURIComponent(t.pathname.replace(/^\/+|\/+$/g,""));return n?`${t.hostname}/${n}`:t.hostname}catch{return Qe(r)}},li=r=>Qe(r),_a=async()=>{let r;try{r=await qm(tr(),"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}let e=Vm.safeParse(JSON.parse(r));if(!e.success)throw new Error(`${tr()} is not a valid connections file`);return e.data.connections},Qm=async r=>{let e=mi();await Um(e,{recursive:!0,mode:448}),await vm(e,448);let t=`${tr()}.${process.pid}.tmp`;await Fm(t,`${JSON.stringify({version:1,connections:r},null," ")}
|
|
6
6
|
`,{mode:384}),await Bm(t,tr())},Oa=Promise.resolve(),Ia=r=>{let e=Oa.then(async()=>{let[t,n]=r(await _a());return await Qm(t),n});return Oa=e.catch(()=>{}),e},xa=()=>new d(404,{message:"Saved connection not found"}),nr=()=>Oa.then(_a,_a),La=async r=>{let e=(await nr()).find(t=>t.id===r);if(!e)throw xa();return e},fi=r=>Ia(e=>{let t=e.find(a=>li(a.url)===li(r)),n=t?{...t,url:r,lastUsedAt:Date.now()}:{id:km(),name:Gm(r),url:r,color:null,readOnly:!1,lastUsedAt:Date.now()};return[t?e.map(a=>a.id===n.id?n:a):[...e,n],n]}),yi=(r,{name:e,color:t,readOnly:n})=>Ia(a=>{let s=a.find(i=>i.id===r);if(!s)throw xa();let o={...s,name:e??s.name,color:t===void 0?s.color:t,readOnly:n??s.readOnly};return[a.map(i=>i.id===r?o:i),o]}),hi=r=>Ia(e=>{if(!e.some(t=>t.id===r))throw xa();return[e.filter(t=>t.id!==r),void 0]})});import{statSync as Jm}from"fs";var $a,Xm,gi,Ma=C(()=>{"use strict";y();$a=r=>r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`,Xm=r=>{if(!r)return"in-memory";try{return $a(Jm(r).size)}catch{return"N/A"}},gi=r=>({execute:e=>r.execute(e),batch:(e,t)=>r.batch(e,t),rebuildTable:async e=>{await r.migrate(e)},info:async()=>{let[e,t]=await Promise.all([r.execute("PRAGMA database_list"),r.execute("SELECT sqlite_version()")]),n=e.rows.find(a=>a.name==="main")?.file;return{name:"main",size:r.protocol==="file"?Xm(typeof n=="string"?n:""):"N/A",version:`SQLite ${t.rows[0]?.[0]}`}},close:()=>r.close()})});var Ei,Zm,ed,td,bi,Ti,wi,Si=C(()=>{"use strict";y();Q();Ma();Ei=r=>{let{host:e,pathname:t,searchParams:n}=new URL(r),a=decodeURIComponent(t.slice(1)),s=n.get("authToken")||process.env.CLOUDFLARE_API_TOKEN;if(!e)throw new Error("The Cloudflare D1 URL has no account id: put it where the host goes");if(!a)throw new Error("The Cloudflare D1 URL has no database id: put it where the path goes");if(!s)throw new Error("The Cloudflare D1 URL has no authToken parameter and CLOUDFLARE_API_TOKEN is not set");return{accountId:e,databaseId:a,token:s}},Zm=BigInt(Number.MIN_SAFE_INTEGER),ed=BigInt(Number.MAX_SAFE_INTEGER),td=r=>typeof r!="bigint"?r:r>=Zm&&r<=ed?Number(r):r.toString(),bi=r=>typeof r=="string"?{sql:r,params:[]}:{sql:r.sql,params:r.args.map(td)},Ti=({results:r,meta:e})=>({columns:r.columns,rows:r.rows.map(t=>t.map(n=>Array.isArray(n)?Uint8Array.from(n).buffer:n)),rowsAffected:e.changes}),wi=({accountId:r,databaseId:e,token:t})=>{let n=`https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(r)}/d1/database/${encodeURIComponent(e)}`,a=async(o,i)=>{let c=await fetch(`${n}${o}`,{method:i===void 0?"GET":"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:i===void 0?void 0:JSON.stringify(i),signal:AbortSignal.timeout(3e4)}),l=await c.text(),u;try{u=JSON.parse(l)}catch{u=void 0}let m=u?.errors?.[0]?.message;if(c.status===401||c.status===403)throw new Error(`${m??"Cloudflare D1 refused the API token"} (HTTP status ${c.status})`);if(!u?.success||u.result===null)throw new Error(m??`Cloudflare D1 request failed with HTTP status ${c.status}`);return u.result},s=async o=>o.length?(await a("/raw",{batch:o.map(bi)})).map(Ti):[];return{execute:async o=>Ti((await a("/raw",bi(o)))[0]),batch:s,rebuildTable:async(o,i)=>{if(i.length){let c=i.map(u=>`"${u}"`).join(", "),l=i.length===1?"references":"reference";throw new d(400,{message:`Cloudflare D1 always enforces foreign keys, so changing a column of a table that ${c} ${l} would delete or block their rows`})}await s(o)},info:async()=>{let{name:o,file_size:i}=await a("");return{name:o,size:$a(i),version:"Cloudflare D1"}},close:()=>{}}}});var nd,bn,Je,We,Ue,jt,gt,rr,pe,bt=C(()=>{"use strict";y();nd={pg:()=>import("pg"),mysql:()=>import("mysql2/promise"),mssql:()=>import("mssql").then(r=>r.default),mongodb:()=>import("mongodb"),sqlite:()=>import("@libsql/client"),redis:()=>import("ioredis"),duckdb:()=>import("@duckdb/node-api"),oracle:()=>import("oracledb").then(r=>r.default),clickhouse:()=>import("@clickhouse/client")},bn={},Je=async r=>{let e=bn[r]??await nd[r]();return bn[r]=e,e},We=r=>{let e=bn[r];if(!e)throw new Error(`The ${r} driver is used before a connection opened`);return e},Ue=r=>bn.pg!==void 0&&r instanceof bn.pg.DatabaseError,jt=r=>Ue(r)&&r.code?.startsWith("23")===!0,gt=r=>Ue(r)&&r.code?.startsWith("22")===!0,rr="This database session is read-only. Disable read-only in Connections if enabled, or connect to a writable database.",pe=r=>Ue(r)&&r.code==="25006"||r instanceof Error&&(r.errno===1792||r.message.includes("attached in read-only mode"))});var es={};$t(es,{DatabaseManager:()=>Vt,closeAllDbPools:()=>od,closeConnection:()=>ka,coerceObjectId:()=>wn,getClickhouseClient:()=>Ha,getConnectionUrl:()=>ja,getDbPool:()=>Ba,getDbType:()=>Dt,getIsolatedRedisClient:()=>Xa,getMongoClient:()=>za,getMongoDb:()=>Qa,getMongoDbName:()=>Ga,getMssqlPool:()=>Ka,getMysqlPool:()=>Fa,getOpenConnection:()=>Tn,getOraclePool:()=>Ya,getRedisClient:()=>Ja,getRedisDefaultDb:()=>Za,getSqliteClient:()=>Wa,isValidObjectId:()=>En,latestConnectionId:()=>Ua,openConnection:()=>va,requestConnectionId:()=>qa,withDuckdbConnection:()=>Va});import{resolve as rd}from"path";import{pathToFileURL as ad}from"url";var Wt,Vt,At,Yt,sd,Ri,ka,va,Tn,Ua,qa,Ce,Ba,Fa,Ka,Ha,Dt,ja,od,Wa,Va,Ya,za,Ga,Qa,Ja,Xa,Za,En,wn,Xe=C(()=>{"use strict";y();j();Si();bt();Q();ze();Ma();Ge();Wt=r=>{try{return decodeURIComponent(r.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return r}},Vt=class{constructor(e=null,t=!1){this.readOnly=t;this.baseConfig=e?this.parseConfig(e):null;let n=this.baseConfig&&M[this.baseConfig.dbType];if(t&&n&&!n.readOnly)throw new Error(`${n.label} connections cannot be opened read-only`)}readOnly;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;detectDbType(e){let t=e.protocol.replace(":",""),n=Ye(t);if(n)return n;let a=Object.values(M).map(({label:s,protocols:o})=>`${s} (${o.join(", ")})`).join(", ");throw new Error(`Unsupported database type: ${t}. Supported types: ${a}.`)}parseConfig(e){let t=Ye(e.split("://")[0]);if(t&&M[t].defaultPort===null)return{url:e,host:"localhost",port:0,user:"",password:"",dbType:t};let n,a;try{n=Jo(e),a=new URL(n)}catch{throw new Error("The connection URL is not a valid URL")}let s=this.detectDbType(a);return{url:n,host:a.hostname,port:Number.parseInt(a.port,10)||(M[s].defaultPort??0),user:Wt(a.username),password:Wt(a.password),dbType:s}}config(){if(!this.baseConfig)throw new d(409,{message:"No database is connected"});return this.baseConfig}getDbType(){return this.config().dbType}getConnectionUrl(){return this.config().url}buildConnectionString(e){let t=this.config();if(M[t.dbType].defaultPort===null)return t.url;try{let n=new URL(t.url);return e&&(n.pathname=`/${encodeURIComponent(e)}`),n.toString()}catch(n){throw new Error(`Failed to build connection string for database "${e}": ${n instanceof Error?n.message:String(n)}`)}}getSqliteClient(){let{url:e,dbType:t}=this.config();if(t!=="sqlite")throw new Error("The connection is not a sqlite://, libsql:// or d1:// connection");return this.sqliteClient??=this.openSqliteClient(e).catch(n=>{throw this.sqliteClient=null,n}),this.sqliteClient}async openSqliteClient(e){if(e.startsWith("d1://"))return wi(Ei(e));let t=e.startsWith("sqlite://")?e.slice(9):null,n=t===null?e:t===":memory:"?t:ad(rd(t)).href,{createClient:a}=await Je("sqlite"),s=a({url:n,intMode:"bigint"});return s.protocol==="file"&&(await s.execute("PRAGMA journal_mode = WAL"),await s.execute("PRAGMA foreign_keys = ON")),gi(s)}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(){let e=this.config();if(e.dbType!=="duckdb")throw new Error("The connection is not a duckdb:// connection");if(!this.duckdb){let t=e.url.replace(/^duckdb:\/\//,"");this.duckdb=(async()=>{try{let{DuckDBInstance:n}=await Je("duckdb"),a=await n.create(t,{checkpoint_threshold:"0b",...this.readOnly&&{access_mode:"READ_ONLY"}});return{instance:a,connection:await a.connect()}}catch(n){this.duckdb=null;let a=n instanceof Error?n.message:String(n);throw a.includes("Could not set lock on file")?new Error(`The DuckDB file "${t}" is locked by another process. Close the other program using it and try again. (${a})`):n}})()}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(){let{url:e,host:t,port:n,user:a,password:s,dbType:o}=this.config();if(o!=="oracle")throw new Error("The connection is not an oracle:// connection");let i=decodeURIComponent(new URL(e).pathname.slice(1));return this.oraclePool??=Je("oracle").then(c=>c.createPool({user:a,password:s,connectString:`${t}:${n}/${i}`,poolMin:0,poolMax:10,connectTimeout:5,sessionCallback:(l,u,m)=>{l.execute("ALTER SESSION SET TIME_ZONE = '+00:00'").then(()=>l.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(()=>m(),m)}})).catch(c=>{throw this.oraclePool=null,c}),this.oraclePool}async closeOraclePool(){let e=this.oraclePool;this.oraclePool=null,await(await e?.catch(()=>null))?.close(0)}async getPgPool(e){let t=this.buildConnectionString(e),{Pool:n}=await Je("pg");if(!this.pgPools.has(t)){let a={connectionString:t,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:1e4},s=new n({...a,onConnect:async o=>{this.readOnly&&await o.query("SET default_transaction_read_only = on"),await o.query(`SELECT set_config(
|
|
@@ -598,7 +598,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
598
598
|
`)}}if(r.relationships&&r.relationships.length>0){t+=`
|
|
599
599
|
**Relationships:**
|
|
600
600
|
`;for(let n of r.relationships)t+=` - ${n.fromTable}.${n.fromColumn} -> ${n.toTable}.${n.toColumn}
|
|
601
|
-
`}return t}var ll=C(()=>{"use strict";y();j()});function wf(r){let e={name:r.columnName,type:r.dataTypeLabel,nullable:r.isNullable};return r.isPrimaryKey&&(e.isPrimaryKey=!0),r.isForeignKey&&r.referencedTable&&r.referencedColumn&&(e.foreignKey=`${r.referencedTable}.${r.referencedColumn}`),r.enumValues&&r.enumValues.length>0&&(e.enumValues=r.enumValues,e.description=`Enum values: ${r.enumValues.join(", ")}`),e}function Sf(r){let e=[];for(let t of r)for(let n of t.columns)if(n.foreignKey){let[a,s]=n.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:n.name,toTable:a,toColumn:s})}return e}async function Rf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",he(n)),[]}}async function ul(r){let e=Dt(),t=zt(e);try{let n=await t.getTablesList(r),a=await Promise.all(n.map(async({schemaName:o,tableName:i})=>({name:o?`${o}.${i}`:i,columns:(await Rf(t,i,r)).map(wf)}))),s=Sf(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",he(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var ml=C(()=>{"use strict";y();_t();Xe();ze()});import{Elysia as Cf}from"elysia";var Nf,Af,dl,pl,fl=C(()=>{"use strict";y();on();j();Q();ze();ll();ml();Nf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),Af=new Set(["localhost","127.0.0.1","::1","[::1]"]),dl=()=>{let r;try{r=new URL(ct.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=Af.has(r.hostname)||r.hostname.endsWith(".localhost");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&e))throw new d(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return r.origin},pl=new Cf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=dl();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":r["cf-connecting-ip"]??"","x-real-ip":r["x-real-ip"]??"","x-forwarded-for":r["x-forwarded-for"]??"","x-api-key":r["x-api-key"]??"","x-request-id":lt()??""}});return t.ok?await t.json():(Z("warn","chat_limit_unavailable",{proxy_status:t.status}),{limit:3,used:3,remaining:0})}catch{return{limit:3,used:3,remaining:0}}}).post("/",async({body:{messages:r,data:e,provider:t,model:n},headers:a,set:s})=>{let{db:o,conversationId:i,includeSchema:c}=e,l=c?await ul(o):null,u=cl(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${dl()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":a["cf-connecting-ip"]??"","x-real-ip":a["x-real-ip"]??"","x-forwarded-for":a["x-forwarded-for"]??"","x-api-key":a["x-api-key"]??"","x-byok-gemini":a["x-byok-gemini"]??"","x-byok-openai":a["x-byok-openai"]??"","x-byok-anthropic":a["x-byok-anthropic"]??"","x-byok-grok":a["x-byok-grok"]??"","x-byok-openrouter":a["x-byok-openrouter"]??"","x-request-id":lt()??""},body:JSON.stringify(m)});if(!p.ok){Z("warn","chat_proxy_rejected",{proxy_status:p.status,provider:t,model:n});let f=await p.json();return Response.json({error:f.error||"Proxy request failed"},{status:p.status})}for(let[f,b]of p.headers)Nf.has(f)||(s.headers[f]=b);return p.body},{body:Kr})});import{Elysia as Df}from"elysia";var yl,hl=C(()=>{"use strict";y();j();rs();Pa();yl=new Df({prefix:"/connections"}).get("/",async()=>({data:await Rn()})).post("/",async({body:r})=>{let e=await ar(r.url,{requireExistingFile:!0});return{data:await Rn(e)}},{body:Jr}).post("/:id/connect",async({params:r})=>({data:await Rn(await ts(r.id))})).patch("/:id",async({params:r,body:e})=>({data:await ns(r.id,e)}),{body:Xr}).delete("/:id",async({params:r})=>(await hi(r.id),{data:"Connection removed"}))});import{Elysia as _f}from"elysia";var gl,bl=C(()=>{"use strict";y();_t();Xe();gl=new _f({prefix:"/databases"}).derive(()=>{let r=Dt();return{dbType:r,adapter:zt(r)}}).get("/",async({adapter:r,dbType:e})=>({data:{databases:await r.getDatabasesList(),dbType:e}})).get("/current",async({adapter:r,dbType:e})=>({data:{db:(await r.getCurrentDatabase()).db,dbType:e}})).get("/connection",async({adapter:r})=>({data:await r.getDatabaseConnectionInfo()}))});import{Elysia as Of}from"elysia";var st,rn=C(()=>{"use strict";y();j();_t();Xe();Q();st=new Of().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!Te.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${Te.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!Tn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Dt();if(a!==t)throw new d(409,{message:`The open connection is ${M[a].label}. Reload the page.`});return{dbType:t,adapter:zt(t)}})});import{Elysia as If}from"elysia";var Tl,El=C(()=>{"use strict";y();j();_t();rn();Tl=new If({prefix:"/keys"}).use(st).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:xi(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:aa}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:U,body:ca}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:ia,params:Ft}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:oa,params:Ft}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:U,params:Ft,body:la}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:ua,params:Ft})});import{Elysia as xf}from"elysia";var wl,Sl=C(()=>{"use strict";y();j();rn();wl=new xf({prefix:"/logs"}).use(st).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:U})});import{Elysia as Lf}from"elysia";var Rl,Cl=C(()=>{"use strict";y();j();rn();Rl=new Lf({prefix:"/query"}).use(st).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:U,body:na})});import{Elysia as Pf}from"elysia";var Nl,Al=C(()=>{"use strict";y();j();Q();rn();Nl=new Pf({prefix:"/records"}).use(st).post("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,data:a}})=>{let{insertedCount:s}=await r.addRecord({db:e,schemaName:t,params:{tableName:n,data:a}});return{data:`Record inserted into "${n}" with ${s} rows inserted`}},{query:k,body:kr}).patch("/",async({adapter:r,dbType:e,query:{db:t,schemaName:n},body:a})=>{if(!M[e].cellDefault&&a.updates.some(o=>o.useDefault))throw new d(400,{message:`${M[e].label} cannot set a cell to its column default`});let{updatedCount:s}=await r.updateRecords({params:a,schemaName:n,db:t});return{data:`Updated ${s} records in "${a.tableName}"`}},{query:k,body:pa}).delete("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a},status:s})=>{let{deletedCount:o,fkViolation:i,relatedRecords:c}=await r.deleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e});return i?s(409,{data:{deletedCount:0,fkViolation:!0,relatedRecords:c}}):{data:{deletedCount:o,fkViolation:!1,relatedRecords:[]}}},{query:k,body:Kn}).delete("/force",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a}})=>({data:await r.forceDeleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e})}),{query:k,body:Kn}).post("/bulk",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,records:a}})=>({data:await r.bulkInsertRecords({tableName:n,schemaName:t,records:a,db:e})}),{query:k,body:Fr})});async function _l({cols:r,rows:e,format:t,tableName:n}){if(t==="json"){let o=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(o,"utf-8"))}let{utils:a,write:s}=await import("xlsx");switch(t){case"csv":{let o=a.aoa_to_sheet(Dl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(Dl(r,e)),i=a.book_new();a.book_append_sheet(i,o,n.slice(0,31));let c=s(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var $f,Dl,Ol=C(()=>{"use strict";y();$f=r=>r==null||r instanceof Date?r:Buffer.isBuffer(r)?`0x${r.toString("hex")}`:typeof r=="object"?JSON.stringify(r):typeof r=="bigint"?r.toString():r,Dl=(r,e)=>[r,...e?.map(t=>r?.map(n=>$f(t[n])))??[]]});import{Elysia as Mf}from"elysia";var kf,Il,xl=C(()=>{"use strict";y();j();rn();Ol();kf={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},Il=new Mf({prefix:"/tables"}).use(st).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:U}).get("/graph",async({adapter:r,query:{db:e}})=>{let t=await r.getTablesList(e);return{data:await Promise.all(t.map(async n=>({...n,columns:await r.getTableColumns({tableName:n.tableName,schemaName:n.schemaName,db:e})})))}},{query:U}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:U,body:ea}).delete("/:tableName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a}})=>({data:await r.deleteTable({tableName:a,schemaName:t,db:e,cascade:n})}),{query:ta,params:ie}).patch("/:tableName/rename",async({adapter:r,query:{db:e},params:{tableName:t},body:n})=>(await r.renameTable({tableName:t,db:e,...n}),{data:`Table "${t}" renamed to "${n.newTableName}"`}),{query:U,params:ie,body:mn}).delete("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a,columnName:s}})=>{let{deletedCount:o}=await r.deleteColumn({schemaName:t,tableName:a,columnName:s,cascade:n,db:e});return{data:`Column "${s}" deleted successfully from table "${a}" with ${o} rows deleted`}},{query:Br,params:Se}).post("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.addColumn({tableName:n,schemaName:t,db:e,...a}),{data:`Column "${a.columnName}" added successfully to table "${n}"`}),{query:k,params:ie,body:Ke}).patch("/:tableName/columns/:columnName/rename",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.renameColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" renamed to "${s.newColumnName}" in table "${n}"`}),{query:k,params:Se,body:Vn}).patch("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.alterColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" updated successfully in table "${n}"`}),{query:k,params:Se,body:vt}).get("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableColumns({tableName:n,schemaName:t,db:e})}),{query:k,params:ie}).get("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableIndexes({tableName:n,schemaName:t,db:e})}),{query:k,params:ie}).post("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.createIndex({tableName:n,schemaName:t,db:e,...a}),{data:`Index "${a.indexName}" created successfully on table "${n}"`}),{query:k,params:ie,body:Hn}).delete("/:tableName/indexes/:indexName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,indexName:a}})=>(await r.dropIndex({tableName:n,schemaName:t,indexName:a,db:e}),{data:`Index "${a}" dropped successfully from table "${n}"`}),{query:k,params:jn}).get("/:tableName/schema",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:{schema:await r.getTableSchema({tableName:n,schemaName:t,db:e})}}),{query:k,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:da,params:ie}).get("/:tableName/export",async({adapter:r,query:{db:e,schemaName:t,format:n},params:{tableName:a}})=>{let{cols:s,rows:o}=await r.exportTableData({tableName:a,schemaName:t,db:e});return new Response(await _l({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":kf[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:ra,params:ie})});import{Elysia as vf}from"elysia";import{z as Ll}from"zod";var Uf,Pl,$l=C(()=>{"use strict";y();gn();Uf=Ll.object({enabled:Ll.boolean()}).strict(),Pl=new vf({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Zn(!1),Sa(),{data:Xn()})).put("/preference",({body:r,status:e})=>{let t=Uf.safeParse(r);return t.success?(Zn(t.data.enabled),{data:Xn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:Ta()}}))});var Ul={};$t(Ul,{createServer:()=>ty});import{createHash as qf,timingSafeEqual as Bf}from"crypto";import{existsSync as Ml}from"fs";import{readFile as Ff,stat as Kf}from"fs/promises";import Fe from"path";import{fileURLToPath as Hf}from"url";import{cors as jf}from"@elysiajs/cors";import{node as Wf}from"@elysiajs/node";import{Elysia as Vf}from"elysia";var Pn,Yf,zf,Gf,vl,Qf,Jf,Xf,kl,Zf,ey,ty,ql=C(()=>{"use strict";y();on();_t();al();Xe();Q();ol();gn();ze();fl();hl();bl();El();Sl();Cl();Al();xl();$l();({API_PREFIX:Pn}=ct),Yf=()=>{if(process.env.NODE_ENV==="development")return Fe.resolve(process.cwd(),"../web/dist");let r=Fe.dirname(Hf(import.meta.url)),e=Fe.resolve(r,"./web-dist"),t=Fe.resolve(process.cwd(),"../web/dist"),n=Fe.resolve(e,"index.html"),a=Fe.resolve(t,"index.html");return!Ml(n)&&Ml(a)?t:e},zf={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".ttf":"font/ttf",".woff2":"font/woff2"},Gf=async(r,e)=>{let t=Fe.join(r,"index.html");try{let s=Fe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${Fe.sep}`)&&(await Kf(s)).isFile()&&(t=s)}catch{}let n=await Ff(t).catch(s=>{if(s.code==="ENOENT")return null;throw s});if(n===null)return new Response('The web app is not built. Run "bun run build" in the repository root, then restart db-studio.',{status:404,headers:{"Content-Type":"text/plain; charset=utf-8"}});let a=t.startsWith(Fe.join(r,"assets",Fe.sep));return new Response(n,{headers:{"Content-Type":zf[Fe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},vl=r=>{if(!r)return!1;if((process.env.ALLOWED_ORIGINS?.split(",").map(t=>t.trim()).filter(Boolean)??[]).includes(r))return!0;if(process.env.NODE_ENV!=="development")return!1;try{let{hostname:t}=new URL(r);return t==="localhost"||t.endsWith(".localhost")||t==="127.0.0.1"}catch{return!1}},Qf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Jf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Qf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},Xf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!vl(r.headers.get("origin"))},kl=r=>qf("sha256").update(r).digest(),Zf=r=>{let e=process.env.DB_STUDIO_PASSWORD;if(!e)return!0;if(!r?.startsWith("Basic "))return!1;let t=Buffer.from(r.slice(6),"base64").toString("utf8"),n=t.indexOf(":");return n!==-1&&Bf(kl(t.slice(n+1)),kl(e))},ey=(r,e)=>{let{pathname:t}=new URL(r.url),n=yn(r.method,t),a=hn(t),s={requestId:zo(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??Ua()??void 0};return Go(s,async()=>{if(!t.startsWith(`${Pn}/`)||t.startsWith(`${Pn}/telemetry`))return e();let o=performance.now(),i=a&&Te.has(a)?a:void 0,c=await Ca(n,i,e);return er({event:"server_operation",properties:{operation:n,method:r.method,outcome:wa(c.status),duration_bucket:Ea(performance.now()-o),db_type:i}}),c})},ty=()=>{rl();let r=Yf(),e=new Vf({adapter:Wf()}).wrap((t,n)=>(...a)=>ey(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=lt(),!Jf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Zf(t.headers.get("authorization")))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="db-studio", charset="UTF-8"'}});if(new URL(t.url).pathname.startsWith(`${Pn}/`)&&Xf(t))throw new d(403,{message:"Cross-site request refused"})}).use(jf({origin:t=>vl(t.headers.get("origin")),methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowedHeaders:["Content-Type","Authorization","X-Run-Id","X-Request-Id","X-Connection-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],credentials:!1,maxAge:600})).onTransform(t=>{t.query=Object.fromEntries(new URL(t.request.url).searchParams);let n=t.request.headers.get("content-type")??"";if(t.body!==void 0&&!/^application\/([\w.-]+\+)?json/.test(n))throw new d(400,{message:"Request body must be JSON"})}).onError(({error:t,request:n})=>sl(t,n)).group(Pn,t=>t.use(yl).use(gl).use(pl).use(Pl).group("/:dbType",n=>n.use(Il).use(Nl).use(Rl).use(Tl).use(wl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${Pn}/`)?Gf(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});y();y();(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="d5ffff7b-e2bd-4bad-903c-0e7d70a592ee",r._sentryDebugIdIdentifier="sentry-dbid-d5ffff7b-e2bd-4bad-903c-0e7d70a592ee")}catch{}})();y();on();import{intro as ny,log as an,outro as Bl,spinner as ry}from"@clack/prompts";import sn from"picocolors";y();import{program as $r}from"commander";var Ys=()=>{$r.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 r=$r.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&$r.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};y();var zs=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;y();import{access as Hl,readFile as jl}from"fs/promises";import{dirname as Wl,resolve as Mr}from"path";import{parse as Vl}from"dotenv";var Yl=async r=>{let e=Mr(r);for(;;){let t=Mr(e,".env");try{return await Hl(t),t}catch{}let n=Wl(e);if(n===e)return null;e=n}},Mt=async r=>{let e;if(r?e=Mr(r):e=await Yl(process.cwd()),!e)return null;try{let t=await jl(e,"utf-8");return Vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};y();import zl from"open";var Gs=r=>r===!0,Qs=async r=>{await zl(r)};fa();y();Pr();j();import{intro as om,outro as im}from"@clack/prompts";import Kt from"picocolors";var Vo=()=>{om(Kt.inverse(" db-studio ")),console.log(Kt.bold(`
|
|
601
|
+
`}return t}var ll=C(()=>{"use strict";y();j()});function wf(r){let e={name:r.columnName,type:r.dataTypeLabel,nullable:r.isNullable};return r.isPrimaryKey&&(e.isPrimaryKey=!0),r.isForeignKey&&r.referencedTable&&r.referencedColumn&&(e.foreignKey=`${r.referencedTable}.${r.referencedColumn}`),r.enumValues&&r.enumValues.length>0&&(e.enumValues=r.enumValues,e.description=`Enum values: ${r.enumValues.join(", ")}`),e}function Sf(r){let e=[];for(let t of r)for(let n of t.columns)if(n.foreignKey){let[a,s]=n.foreignKey.split(".");e.push({fromTable:t.name,fromColumn:n.name,toTable:a,toColumn:s})}return e}async function Rf(r,e,t){try{return await r.getTableColumns({tableName:e,db:t})}catch(n){return Z("warn","schema_columns_failed",he(n)),[]}}async function ul(r){let e=Dt(),t=zt(e);try{let n=await t.getTablesList(r),a=await Promise.all(n.map(async({schemaName:o,tableName:i})=>({name:o?`${o}.${i}`:i,columns:(await Rf(t,i,r)).map(wf)}))),s=Sf(a);return{dbType:e,tables:a,relationships:s}}catch(n){throw Z("error","schema_fetch_failed",he(n)),new Error(`Failed to fetch database schema: ${n instanceof Error?n.message:"Unknown error"}`)}}var ml=C(()=>{"use strict";y();_t();Xe();ze()});import{Elysia as Cf}from"elysia";var Nf,Af,dl,pl,fl=C(()=>{"use strict";y();on();j();Q();ze();ll();ml();Nf=new Set(["connection","keep-alive","transfer-encoding","content-length","content-encoding"]),Af=new Set(["localhost","127.0.0.1","::1","[::1]"]),dl=()=>{let r;try{r=new URL(ct.PROXY_URL)}catch{throw new d(500,{message:"DB_STUDIO_PROXY_URL is not a valid URL"})}let e=Af.has(r.hostname)||r.hostname.endsWith(".localhost");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&e))throw new d(500,{message:"DB_STUDIO_PROXY_URL must use HTTPS unless it points at loopback"});return r.origin},pl=new Cf({prefix:"/chat"}).get("/limit",async({headers:r})=>{let e=dl();try{let t=await fetch(`${e}/chat/limit`,{headers:{"cf-connecting-ip":r["cf-connecting-ip"]??"","x-real-ip":r["x-real-ip"]??"","x-forwarded-for":r["x-forwarded-for"]??"","x-api-key":r["x-api-key"]??"","x-request-id":lt()??""}});return t.ok?await t.json():(Z("warn","chat_limit_unavailable",{proxy_status:t.status}),{limit:3,used:3,remaining:0})}catch{return{limit:3,used:3,remaining:0}}}).post("/",async({body:{messages:r,data:e,provider:t,model:n},headers:a,set:s})=>{let{db:o,conversationId:i,includeSchema:c}=e,l=c?await ul(o):null,u=cl(l),m={messages:r,conversationId:i,systemPrompt:u,provider:t,model:n},p=await fetch(`${dl()}/chat`,{method:"POST",headers:{"Content-Type":"application/json","cf-connecting-ip":a["cf-connecting-ip"]??"","x-real-ip":a["x-real-ip"]??"","x-forwarded-for":a["x-forwarded-for"]??"","x-api-key":a["x-api-key"]??"","x-byok-gemini":a["x-byok-gemini"]??"","x-byok-openai":a["x-byok-openai"]??"","x-byok-anthropic":a["x-byok-anthropic"]??"","x-byok-grok":a["x-byok-grok"]??"","x-byok-openrouter":a["x-byok-openrouter"]??"","x-request-id":lt()??""},body:JSON.stringify(m)});if(!p.ok){Z("warn","chat_proxy_rejected",{proxy_status:p.status,provider:t,model:n});let f=await p.json();return Response.json({error:f.error||"Proxy request failed"},{status:p.status})}for(let[f,b]of p.headers)Nf.has(f)||(s.headers[f]=b);return p.body},{body:Kr})});import{Elysia as Df}from"elysia";var yl,hl=C(()=>{"use strict";y();j();rs();Pa();yl=new Df({prefix:"/connections"}).get("/",async()=>({data:await Rn()})).post("/",async({body:r})=>{let e=await ar(r.url,{requireExistingFile:!0});return{data:await Rn(e)}},{body:Jr}).post("/:id/connect",async({params:r})=>({data:await Rn(await ts(r.id))})).patch("/:id",async({params:r,body:e})=>({data:await ns(r.id,e)}),{body:Xr}).delete("/:id",async({params:r})=>(await hi(r.id),{data:"Connection removed"}))});import{Elysia as _f}from"elysia";var gl,bl=C(()=>{"use strict";y();_t();Xe();gl=new _f({prefix:"/databases"}).derive(()=>{let r=Dt();return{dbType:r,adapter:zt(r)}}).get("/",async({adapter:r,dbType:e})=>({data:{databases:await r.getDatabasesList(),dbType:e}})).get("/current",async({adapter:r,dbType:e})=>({data:{db:(await r.getCurrentDatabase()).db,dbType:e}})).get("/connection",async({adapter:r})=>({data:await r.getDatabaseConnectionInfo()}))});import{Elysia as Of}from"elysia";var st,rn=C(()=>{"use strict";y();j();_t();Xe();Q();st=new Of().derive({as:"scoped"},({params:r,headers:e})=>{let{dbType:t=""}=r;if(!Te.has(t))throw new d(400,{message:`Invalid database type: "${t}". Supported types: ${Te.getSupportedTypes().join(", ")}`});let n=e["x-connection-id"];if(n&&!Tn(n))throw new d(409,{message:"The connection closed. Reload the page."});let a=Dt();if(a!==t)throw new d(409,{message:`The open connection is ${M[a].label}. Reload the page.`});return{dbType:t,adapter:zt(t)}})});import{Elysia as If}from"elysia";var Tl,El=C(()=>{"use strict";y();j();_t();rn();Tl=new If({prefix:"/keys"}).use(st).resolve(({adapter:r,dbType:e})=>({keyValueAdapter:xi(r,e)})).get("/",async({keyValueAdapter:r,query:e})=>({data:await r.scanKeys(e)}),{query:aa}).post("/",async({keyValueAdapter:r,query:{db:e},body:t})=>({data:await r.createKey({db:e,...t})}),{query:U,body:ca}).get("/:key/raw",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getStringChunk({...e,key:t})}),{query:ia,params:Ft}).get("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.getKeyDetails({...e,key:t})}),{query:oa,params:Ft}).post("/:key/actions",async({keyValueAdapter:r,query:{db:e},params:{key:t},body:n})=>({data:await r.applyKeyAction({db:e,key:t,...n})}),{query:U,params:Ft,body:la}).delete("/:key",async({keyValueAdapter:r,query:e,params:{key:t}})=>({data:await r.deleteKey({...e,key:t})}),{query:ua,params:Ft})});import{Elysia as xf}from"elysia";var wl,Sl=C(()=>{"use strict";y();j();rn();wl=new xf({prefix:"/logs"}).use(st).get("/",async({adapter:r,query:e})=>({data:await r.getServerLogs(e)}),{query:U})});import{Elysia as Lf}from"elysia";var Rl,Cl=C(()=>{"use strict";y();j();rn();Rl=new Lf({prefix:"/query"}).use(st).post("/",async({adapter:r,query:{db:e},body:{query:t}})=>({data:await r.executeQuery({query:t,db:e})}),{query:U,body:na})});import{Elysia as Pf}from"elysia";var Nl,Al=C(()=>{"use strict";y();j();Q();rn();Nl=new Pf({prefix:"/records"}).use(st).post("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,data:a}})=>{let{insertedCount:s}=await r.addRecord({db:e,schemaName:t,params:{tableName:n,data:a}});return{data:`Record inserted into "${n}" with ${s} rows inserted`}},{query:k,body:kr}).patch("/",async({adapter:r,dbType:e,query:{db:t,schemaName:n},body:a})=>{if(!M[e].cellDefault&&a.updates.some(o=>o.useDefault))throw new d(400,{message:`${M[e].label} cannot set a cell to its column default`});let{updatedCount:s}=await r.updateRecords({params:a,schemaName:n,db:t});return{data:`Updated ${s} records in "${a.tableName}"`}},{query:k,body:pa}).delete("/",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a},status:s})=>{let{deletedCount:o,fkViolation:i,relatedRecords:c}=await r.deleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e});return i?s(409,{data:{deletedCount:0,fkViolation:!0,relatedRecords:c}}):{data:{deletedCount:o,fkViolation:!1,relatedRecords:[]}}},{query:k,body:Kn}).delete("/force",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,primaryKeys:a}})=>({data:await r.forceDeleteRecords({tableName:n,schemaName:t,primaryKeys:a,db:e})}),{query:k,body:Kn}).post("/bulk",async({adapter:r,query:{db:e,schemaName:t},body:{tableName:n,records:a}})=>({data:await r.bulkInsertRecords({tableName:n,schemaName:t,records:a,db:e})}),{query:k,body:Fr})});async function _l({cols:r,rows:e,format:t,tableName:n}){if(t==="json"){let o=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(o,"utf-8"))}let{utils:a,write:s}=await import("xlsx");switch(t){case"csv":{let o=a.aoa_to_sheet(Dl(r,e)),i=a.sheet_to_csv(o);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let o=a.aoa_to_sheet(Dl(r,e)),i=a.book_new();a.book_append_sheet(i,o,n.slice(0,31));let c=s(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var $f,Dl,Ol=C(()=>{"use strict";y();$f=r=>r==null||r instanceof Date?r:Buffer.isBuffer(r)?`0x${r.toString("hex")}`:typeof r=="object"?JSON.stringify(r):typeof r=="bigint"?r.toString():r,Dl=(r,e)=>[r,...e?.map(t=>r?.map(n=>$f(t[n])))??[]]});import{Elysia as Mf}from"elysia";var kf,Il,xl=C(()=>{"use strict";y();j();rn();Ol();kf={csv:"text/csv",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",json:"application/json"},Il=new Mf({prefix:"/tables"}).use(st).get("/",async({adapter:r,query:e})=>({data:await r.getTablesList(e.db)}),{query:U}).get("/graph",async({adapter:r,query:{db:e}})=>{let t=await r.getTablesList(e);return{data:await Promise.all(t.map(async n=>({...n,columns:await r.getTableColumns({tableName:n.tableName,schemaName:n.schemaName,db:e})})))}},{query:U}).post("/",async({adapter:r,query:e,body:t})=>(await r.createTable({tableData:t,db:e.db}),{data:`Table ${t.tableName} created successfully`}),{query:U,body:ea}).delete("/:tableName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a}})=>({data:await r.deleteTable({tableName:a,schemaName:t,db:e,cascade:n})}),{query:ta,params:ie}).patch("/:tableName/rename",async({adapter:r,query:{db:e},params:{tableName:t},body:n})=>(await r.renameTable({tableName:t,db:e,...n}),{data:`Table "${t}" renamed to "${n.newTableName}"`}),{query:U,params:ie,body:mn}).delete("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t,cascade:n},params:{tableName:a,columnName:s}})=>{let{deletedCount:o}=await r.deleteColumn({schemaName:t,tableName:a,columnName:s,cascade:n,db:e});return{data:`Column "${s}" deleted successfully from table "${a}" with ${o} rows deleted`}},{query:Br,params:Se}).post("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.addColumn({tableName:n,schemaName:t,db:e,...a}),{data:`Column "${a.columnName}" added successfully to table "${n}"`}),{query:k,params:ie,body:Ke}).patch("/:tableName/columns/:columnName/rename",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.renameColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" renamed to "${s.newColumnName}" in table "${n}"`}),{query:k,params:Se,body:Vn}).patch("/:tableName/columns/:columnName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,columnName:a},body:s})=>(await r.alterColumn({tableName:n,schemaName:t,columnName:a,db:e,...s}),{data:`Column "${a}" updated successfully in table "${n}"`}),{query:k,params:Se,body:vt}).get("/:tableName/columns",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableColumns({tableName:n,schemaName:t,db:e})}),{query:k,params:ie}).get("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:await r.getTableIndexes({tableName:n,schemaName:t,db:e})}),{query:k,params:ie}).post("/:tableName/indexes",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n},body:a})=>(await r.createIndex({tableName:n,schemaName:t,db:e,...a}),{data:`Index "${a.indexName}" created successfully on table "${n}"`}),{query:k,params:ie,body:Hn}).delete("/:tableName/indexes/:indexName",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n,indexName:a}})=>(await r.dropIndex({tableName:n,schemaName:t,indexName:a,db:e}),{data:`Index "${a}" dropped successfully from table "${n}"`}),{query:k,params:jn}).get("/:tableName/schema",async({adapter:r,query:{db:e,schemaName:t},params:{tableName:n}})=>({data:{schema:await r.getTableSchema({tableName:n,schemaName:t,db:e})}}),{query:k,params:ie}).get("/:tableName/data",async({adapter:r,query:e,params:{tableName:t}})=>({data:await r.getTableData({tableName:t,...e})}),{query:da,params:ie}).get("/:tableName/export",async({adapter:r,query:{db:e,schemaName:t,format:n},params:{tableName:a}})=>{let{cols:s,rows:o}=await r.exportTableData({tableName:a,schemaName:t,db:e});return new Response(await _l({cols:s,rows:o,format:n,tableName:a}),{headers:{"Content-Type":kf[n],"Content-Disposition":`attachment; filename="${a}_export.${n}"`}})},{query:ra,params:ie})});import{Elysia as vf}from"elysia";import{z as Ll}from"zod";var Uf,Pl,$l=C(()=>{"use strict";y();gn();Uf=Ll.object({enabled:Ll.boolean()}).strict(),Pl=new vf({prefix:"/telemetry"}).get("/config",({headers:r})=>((r["x-db-studio-gpc"]==="1"||r["sec-gpc"]==="1")&&Zn(!1),Sa(),{data:Xn()})).put("/preference",({body:r,status:e})=>{let t=Uf.safeParse(r);return t.success?(Zn(t.data.enabled),{data:Xn()}):e(400,{error:"Invalid telemetry preference"})}).post("/reset",()=>({data:{installationId:Ta()}}))});var Ul={};$t(Ul,{createServer:()=>ty});import{createHash as qf,timingSafeEqual as Bf}from"crypto";import{existsSync as Ml}from"fs";import{readFile as Ff,stat as Kf}from"fs/promises";import Fe from"path";import{fileURLToPath as Hf}from"url";import{cors as jf}from"@elysiajs/cors";import{node as Wf}from"@elysiajs/node";import{Elysia as Vf}from"elysia";var Pn,Yf,zf,Gf,vl,Qf,Jf,Xf,kl,Zf,ey,ty,ql=C(()=>{"use strict";y();on();_t();al();Xe();Q();ol();gn();ze();fl();hl();bl();El();Sl();Cl();Al();xl();$l();({API_PREFIX:Pn}=ct),Yf=()=>{if(process.env.NODE_ENV==="development")return Fe.resolve(process.cwd(),"../web/dist");let r=Fe.dirname(Hf(import.meta.url)),e=Fe.resolve(r,"./web-dist"),t=Fe.resolve(process.cwd(),"../web/dist"),n=Fe.resolve(e,"index.html"),a=Fe.resolve(t,"index.html");return!Ml(n)&&Ml(a)?t:e},zf={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json",".png":"image/png",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".ttf":"font/ttf",".woff2":"font/woff2"},Gf=async(r,e)=>{let t=Fe.join(r,"index.html");try{let s=Fe.resolve(r,`.${decodeURIComponent(e)}`);s.startsWith(`${r}${Fe.sep}`)&&(await Kf(s)).isFile()&&(t=s)}catch{}let n=await Ff(t).catch(s=>{if(s.code==="ENOENT")return null;throw s});if(n===null)return new Response('The web app is not built. Run "bun run build" in the repository root, then restart db-studio.',{status:404,headers:{"Content-Type":"text/plain; charset=utf-8"}});let a=t.startsWith(Fe.join(r,"assets",Fe.sep));return new Response(n,{headers:{"Content-Type":zf[Fe.extname(t)]??"application/octet-stream","Cache-Control":a?"public, max-age=31536000, immutable":"no-cache"}})},vl=r=>{if(!r)return!1;if((process.env.ALLOWED_ORIGINS?.split(",").map(t=>t.trim()).filter(Boolean)??[]).includes(r))return!0;if(process.env.NODE_ENV!=="development")return!1;try{let{hostname:t}=new URL(r);return t==="localhost"||t.endsWith(".localhost")||t==="127.0.0.1"}catch{return!1}},Qf=new Set(["localhost","127.0.0.1","[::1]","::1"]),Jf=r=>{let e=r.replace(/:\d+$/,"").toLowerCase();return Qf.has(e)||e.endsWith(".localhost")?!0:(process.env.ALLOWED_HOSTS?.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean)??[]).includes(e)},Xf=r=>{let e=r.headers.get("sec-fetch-site");return(e==="cross-site"||e==="same-site")&&!vl(r.headers.get("origin"))},kl=r=>qf("sha256").update(r).digest(),Zf=r=>{let e=process.env.DB_STUDIO_PASSWORD;if(!e)return!0;if(!r?.startsWith("Basic "))return!1;let t=Buffer.from(r.slice(6),"base64").toString("utf8"),n=t.indexOf(":");return n!==-1&&Bf(kl(t.slice(n+1)),kl(e))},ey=(r,e)=>{let{pathname:t}=new URL(r.url),n=yn(r.method,t),a=hn(t),s={requestId:zo(r.headers.get("x-request-id")??void 0),operation:n,dbType:a,connectionId:r.headers.get("x-connection-id")??Ua()??void 0};return Go(s,async()=>{if(!t.startsWith(`${Pn}/`)||t.startsWith(`${Pn}/telemetry`))return e();let o=performance.now(),i=a&&Te.has(a)?a:void 0,c=await Ca(n,i,e);return er({event:"server_operation",properties:{operation:n,method:r.method,outcome:wa(c.status),duration_bucket:Ea(performance.now()-o),db_type:i}}),c})},ty=()=>{rl();let r=Yf(),e=new Vf({adapter:Wf()}).wrap((t,n)=>(...a)=>ey(n,async()=>await t(...a))).onRequest(({request:t,set:n})=>{if(n.headers["x-request-id"]=lt(),!Jf(t.headers.get("host")??new URL(t.url).host))throw new d(403,{message:"Host not allowed"});if(t.method!=="OPTIONS"&&!Zf(t.headers.get("authorization")))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="db-studio", charset="UTF-8"'}});if(new URL(t.url).pathname.startsWith(`${Pn}/`)&&Xf(t))throw new d(403,{message:"Cross-site request refused"})}).use(jf({origin:t=>vl(t.headers.get("origin")),methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowedHeaders:["Content-Type","Authorization","X-Run-Id","X-Request-Id","X-Connection-Id","X-DB-Studio-GPC","x-byok-gemini","x-byok-openai","x-byok-anthropic","x-byok-grok","x-byok-openrouter"],exposeHeaders:["X-Request-Id"],credentials:!1,maxAge:600})).onTransform(t=>{t.query=Object.fromEntries(new URL(t.request.url).searchParams);let n=t.request.headers.get("content-type")??"";if(t.body!==void 0&&!/^application\/([\w.-]+\+)?json/.test(n))throw new d(400,{message:"Request body must be JSON"})}).onError(({error:t,request:n})=>sl(t,n)).group(Pn,t=>t.use(yl).use(gl).use(pl).use(Pl).group("/:dbType",n=>n.use(Il).use(Nl).use(Rl).use(Tl).use(wl)));return process.env.NODE_ENV!=="test"&&e.all("/*",({request:t,path:n})=>(t.method==="GET"||t.method==="HEAD")&&!n.startsWith(`${Pn}/`)?Gf(r,n):Response.json({error:"Not found"},{status:404})),{app:e}}});y();y();(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="2e763d0a-eda9-42e8-a4ba-82c5cd939d38",r._sentryDebugIdIdentifier="sentry-dbid-2e763d0a-eda9-42e8-a4ba-82c5cd939d38")}catch{}})();y();on();import{intro as ny,log as an,outro as Bl,spinner as ry}from"@clack/prompts";import sn from"picocolors";y();import{program as $r}from"commander";var Ys=()=>{$r.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 r=$r.opts(),e=process.argv.includes("--open"),t=process.argv.includes("--no-open");return e&&t&&$r.error("Do not combine --open and --no-open"),{...r,open:e?!0:t?!1:void 0}};y();var zs=(r,e="DATABASE_URL")=>r?.[e]||process.env[e]||void 0;y();import{access as Hl,readFile as jl}from"fs/promises";import{dirname as Wl,resolve as Mr}from"path";import{parse as Vl}from"dotenv";var Yl=async r=>{let e=Mr(r);for(;;){let t=Mr(e,".env");try{return await Hl(t),t}catch{}let n=Wl(e);if(n===e)return null;e=n}},Mt=async r=>{let e;if(r?e=Mr(r):e=await Yl(process.cwd()),!e)return null;try{let t=await jl(e,"utf-8");return Vl(t)}catch(t){if(t instanceof Error&&t.message.includes("ENOENT"))return null;throw t}};y();import zl from"open";var Gs=r=>r===!0,Qs=async r=>{await zl(r)};fa();y();Pr();j();import{intro as om,outro as im}from"@clack/prompts";import Kt from"picocolors";var Vo=()=>{om(Kt.inverse(" db-studio ")),console.log(Kt.bold(`
|
|
602
602
|
Usage:`)),console.log(` db-studio [options]
|
|
603
603
|
`),console.log(Kt.bold("Supported Databases:")),console.log(` ${Object.values(M).map(({label:r})=>r).join(", ")}
|
|
604
604
|
`),console.log(Kt.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
|