db-studio 1.7.10 → 1.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/core-dist/assets/_pathlessLayout-DtaYfYwJ.js +2 -0
  2. package/dist/core-dist/assets/{_queryId-k0QvsBGf.js → _queryId-BuwY4WmY.js} +1 -1
  3. package/dist/core-dist/assets/{_table-cCBv5kB-.js → _table-D8MYcfMf.js} +1 -1
  4. package/dist/core-dist/assets/_table-dqCYe5jr.js +10 -0
  5. package/dist/core-dist/assets/{cdoe-editor-IGx3GQWB.js → cdoe-editor-DT99U124.js} +1 -1
  6. package/dist/core-dist/assets/{chat-sidebar-D2GaNd69.js → chat-sidebar-_z_c1b34.js} +1 -1
  7. package/dist/core-dist/assets/{dist-v6aWpqmu.js → dist-DZQDOYlI.js} +1 -1
  8. package/dist/core-dist/assets/{dist-ZzQZZhtF.js → dist-lZgQTehN.js} +1 -1
  9. package/dist/core-dist/assets/{index-BtQYs6UF.js → index-D9Wxg2ot.js} +3 -3
  10. package/dist/core-dist/assets/index-fMzwkmHJ.css +2 -0
  11. package/dist/core-dist/assets/{queries.store-BtuppsNj.js → queries.store-D-hvraJW.js} +1 -1
  12. package/dist/core-dist/assets/{runner-VSPg2lHo.js → runner-D2QKCRKR.js} +1 -1
  13. package/dist/core-dist/assets/{runner-tab-BQH-lTnK.js → runner-tab-BgDrAAsO.js} +3 -3
  14. package/dist/core-dist/assets/{scroll-area-BnT9xy-y.js → scroll-area-XVOss7Ty.js} +1 -1
  15. package/dist/core-dist/assets/tanstack-CJpNvQIy.js +9 -0
  16. package/dist/core-dist/assets/{tooltip-B3DXDN3Y.js → tooltip-CFEia1PZ.js} +1 -1
  17. package/dist/core-dist/assets/use-delete-column-B78zy_1_.js +1 -0
  18. package/dist/core-dist/assets/{use-rate-limit-BenJo7Lk.js → use-rate-limit-FcN06qzk.js} +1 -1
  19. package/dist/core-dist/index.html +3 -3
  20. package/dist/index.js +2 -2
  21. package/dist/index.js.map +1 -1
  22. package/package.json +2 -2
  23. package/dist/core-dist/assets/_pathlessLayout-Dh-wnEbU.js +0 -2
  24. package/dist/core-dist/assets/_table-BuJCKd_h.js +0 -10
  25. package/dist/core-dist/assets/index-Dv6o03bL.css +0 -2
  26. package/dist/core-dist/assets/tanstack-DyfKDo5s.js +0 -9
  27. package/dist/core-dist/assets/use-delete-column-B-oY2CU8.js +0 -1
@@ -1 +1 @@
1
- import{C as i,D as d,E as n,O as s,Ot as l,T as p,w as m}from"./radix-ui-C0u6gLux.js";import{Dt as f}from"./index-BtQYs6UF.js";var o=l();function u({delayDuration:t=0,...a}){return(0,o.jsx)(n,{"data-slot":"tooltip-provider",delayDuration:t,...a})}function g({...t}){return(0,o.jsx)(u,{children:(0,o.jsx)(d,{"data-slot":"tooltip",...t})})}function j({...t}){return(0,o.jsx)(s,{"data-slot":"tooltip-trigger",...t})}function _({className:t,sideOffset:a=0,children:e,...r}){return(0,o.jsx)(p,{children:(0,o.jsxs)(m,{"data-slot":"tooltip-content",sideOffset:a,className:f("data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-md px-3 py-1.5 text-xs **:data-[slot=kbd]:rounded-md bg-foreground text-background z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin)",t),...r,children:[e,(0,o.jsx)(i,{className:"size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]"})]})})}export{j as i,_ as n,u as r,g as t};
1
+ import{C as i,D as d,E as n,O as s,Ot as l,T as p,w as m}from"./radix-ui-C0u6gLux.js";import{Dt as f}from"./index-D9Wxg2ot.js";var o=l();function u({delayDuration:t=0,...a}){return(0,o.jsx)(n,{"data-slot":"tooltip-provider",delayDuration:t,...a})}function g({...t}){return(0,o.jsx)(u,{children:(0,o.jsx)(d,{"data-slot":"tooltip",...t})})}function j({...t}){return(0,o.jsx)(s,{"data-slot":"tooltip-trigger",...t})}function _({className:t,sideOffset:a=0,children:e,...r}){return(0,o.jsx)(p,{children:(0,o.jsxs)(m,{"data-slot":"tooltip-content",sideOffset:a,className:f("data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-md px-3 py-1.5 text-xs **:data-[slot=kbd]:rounded-md bg-foreground text-background z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin)",t),...r,children:[e,(0,o.jsx)(i,{className:"size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]"})]})})}export{j as i,_ as n,u as r,g as t};
@@ -0,0 +1 @@
1
+ import{r as p}from"./rolldown-runtime-Bnw7wDfq.js";import{i as y,n as g,r as C,t as x,v as h,x as b}from"./tanstack-CJpNvQIy.js";import{K as v,P as z,nt as w}from"./icons-BywMJ5og.js";import{Ot as S}from"./radix-ui-C0u6gLux.js";import{Dt as f,ct as j,it as d,kt as R,st as D}from"./index-D9Wxg2ot.js";import{t as _}from"./format-cell-value-DyKHFyYf.js";var m=p(w(),1),l=S(),E=({value:e,className:t})=>{const[o,r]=(0,m.useState)(!1),i=(0,m.useRef)(null);(0,m.useEffect)(()=>()=>{i.current&&window.clearTimeout(i.current)},[]);const n=_(e),s=(0,m.useCallback)(async u=>{u.stopPropagation();try{await navigator.clipboard.writeText(n),r(!0)}catch(a){console.error("Failed to copy cell value:",a);return}i.current&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{r(!1)},1200)},[n]);return n?(0,l.jsx)("button",{type:"button",className:f("absolute right-0.5 top-1/2 inline-flex size-5 -translate-y-1/2 items-center justify-center","text-muted-foreground opacity-0 transition-opacity","hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none","group-hover:opacity-100",t),onClick:s,"aria-label":o?"Copied":"Copy",children:o?(0,l.jsx)(v,{className:"size-3.5"}):(0,l.jsx)(z,{className:"size-3.5"})}):null},N=({columnVirtualizer:e,row:t,rowVirtualizer:o,virtualPaddingLeft:r,virtualPaddingRight:i,virtualRow:n})=>{const s=t.getVisibleCells(),u=e.getVirtualItems();return(0,l.jsxs)("tr",{"data-index":n.index,ref:a=>o.measureElement(a),className:"flex absolute w-fit border-b items-center text-sm hover:bg-accent/20 data-[state=open]:bg-accent/40 [&_svg]:size-4",style:{transform:`translateY(${n.start}px)`},children:[r?(0,l.jsx)("td",{style:{display:"flex",width:r}}):null,u.map(a=>{const c=s[a.index];return(0,l.jsxs)("td",{className:"group relative flex border-r border-zinc-800 h-8 items-center px-3 truncate",style:{width:c.column.getSize()},children:[g(c.column.columnDef.cell,c.getContext()),(0,l.jsx)(E,{value:c.getValue()})]},c.id)}),i?(0,l.jsx)("td",{style:{display:"flex",width:i}}):null]},t.id)},T=({columnVirtualizer:e,table:t,tableContainerRef:o,virtualPaddingLeft:r,virtualPaddingRight:i})=>{const{rows:n}=t.getRowModel(),s=x({count:n.length,estimateSize:()=>33,getScrollElement:()=>o.current,measureElement:typeof window<"u"&&navigator.userAgent.indexOf("Firefox")===-1?a=>a?.getBoundingClientRect().height:void 0,overscan:5}),u=s.getVirtualItems();return(0,l.jsx)("tbody",{style:{display:"grid",height:`${s.getTotalSize()}px`,position:"relative"},children:u.map(a=>{const c=n[a.index];return(0,l.jsx)(N,{columnVirtualizer:e,row:c,rowVirtualizer:s,virtualPaddingLeft:r,virtualPaddingRight:i,virtualRow:a},c.id)})})};function A({header:e,table:t,label:o}){const r=t._getDefaultColumnDef(),i=(0,m.useCallback)(()=>{t.setColumnSizing(n=>{const s={...n};return delete s[e.column.id],s})},[e.column.id,t]);return(0,l.jsx)("div",{role:"separator","aria-orientation":"vertical","aria-label":`Resize ${o} column`,"aria-valuenow":e.column.getSize(),"aria-valuemin":r.minSize,"aria-valuemax":r.maxSize,tabIndex:0,className:f("after:-translate-x-1/2 -right-px absolute top-0 z-50 h-full w-0.5 cursor-ew-resize touch-none select-none bg-border transition-opacity after:absolute after:inset-y-0 after:left-1/2 after:h-full after:w-[18px] after:content-[''] hover:bg-primary focus:bg-primary focus:outline-none",e.column.getIsResizing()?"bg-primary":"opacity-0 hover:opacity-100"),onDoubleClick:i,onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler()})}var I=(0,m.memo)(A,(e,t)=>{const o=e.header.column,r=t.header.column;return!(o.getIsResizing()!==r.getIsResizing()||o.getSize()!==r.getSize()||e.label!==t.label)}),V=({columnVirtualizer:e,table:t,virtualPaddingLeft:o,virtualPaddingRight:r})=>{const i=e.getVirtualItems(),n=t.getState().columnSizingInfo.isResizingColumn;return(0,l.jsx)("thead",{className:"h-9 grid sticky top-0 z-10",children:t.getHeaderGroups().map(s=>(0,l.jsxs)("tr",{className:f("flex w-fit bg-black border-b border-zinc-800 items-center text-sm [&_svg]:size-4",n&&"pointer-events-none"),children:[o?(0,l.jsx)("th",{style:{display:"flex",width:o}}):null,i.map(u=>{const a=s.headers[u.index];return(0,l.jsxs)("th",{className:"relative h-full flex items-center border-r border-zinc-800 text-xs font-medium text-zinc-500",style:{width:a.getSize()},children:[(0,l.jsx)("div",{className:"flex w-full h-full items-center px-3",children:g(a.column.columnDef.header,a.getContext())}),a.column.getCanResize()&&(0,l.jsx)(I,{header:a,table:t,label:a.column.id})]},a.id)}),r?(0,l.jsx)("th",{style:{display:"flex",width:r}}):null]},s.id))})},k=({table:e})=>{const t=e.getVisibleLeafColumns(),o=(0,m.useRef)(null),r=x({count:t.length,estimateSize:u=>t[u].getSize(),getScrollElement:()=>o.current,horizontal:!0,overscan:3}),i=r.getVirtualItems();let n,s;return r&&i?.length&&(n=i[0]?.start??0,s=r.getTotalSize()-(i[i.length-1]?.end??0)),(0,l.jsx)("div",{className:"w-full flex-1 overflow-auto",ref:o,style:{position:"relative"},children:(0,l.jsxs)("table",{style:{display:"grid"},children:[(0,l.jsx)(V,{columnVirtualizer:r,table:e,virtualPaddingLeft:n,virtualPaddingRight:s}),(0,l.jsx)(T,{columnVirtualizer:r,table:e,tableContainerRef:o,virtualPaddingLeft:n,virtualPaddingRight:s})]})})},L=({columns:e,data:t})=>(0,l.jsx)(k,{table:C({data:t,columns:e,getCoreRowModel:y(),enableColumnResizing:!0,columnResizeMode:"onChange"})}),$=()=>{const e=b(),{selectedDatabase:t}=D(),{mutateAsync:o,isPending:r}=h({mutationFn:async({tableName:n,columnName:s,cascade:u})=>{const a=new URLSearchParams({db:t??"",cascade:u?"true":"false"});return(await j.delete(`/tables/${encodeURIComponent(n)}/columns/${encodeURIComponent(s)}`,{params:a})).data.data},onSuccess:async(n,s)=>{await Promise.all([e.invalidateQueries({queryKey:[d.CACHE_KEYS.TABLE_COLUMNS,s.tableName],exact:!1}),e.invalidateQueries({queryKey:[d.CACHE_KEYS.TABLE_DATA,s.tableName],exact:!1}),e.invalidateQueries({queryKey:[d.CACHE_KEYS.TABLES_LIST],exact:!1})])},onError:n=>{console.error("Error deleting column:",n)}});return{deleteColumn:async({tableName:n,columnName:s,cascade:u})=>R.promise(o({tableName:n,columnName:s,cascade:u,db:""}),{loading:"Deleting column...",success:a=>a||"Column deleted successfully",error:a=>a.message||"Failed to delete column"}),isDeletingColumn:r}};export{L as n,E as r,$ as t};
@@ -1 +1 @@
1
- import{y as a}from"./tanstack-DyfKDo5s.js";import{lt as m}from"./index-BtQYs6UF.js";var s=()=>{const{data:t,isLoading:r,error:i,refetch:e}=a({queryKey:["rate-limit"],queryFn:async()=>{try{return(await m.get("/chat/limit")).data}catch{return{limit:0,used:0,remaining:0}}}});return{rateLimit:t,isLoadingRateLimit:r,errorRateLimit:i,refetchRateLimit:e}};export{s as t};
1
+ import{y as a}from"./tanstack-CJpNvQIy.js";import{lt as m}from"./index-D9Wxg2ot.js";var s=()=>{const{data:t,isLoading:r,error:i,refetch:e}=a({queryKey:["rate-limit"],queryFn:async()=>{try{return(await m.get("/chat/limit")).data}catch{return{limit:0,used:0,remaining:0}}}});return{rateLimit:t,isLoadingRateLimit:r,errorRateLimit:i,refetchRateLimit:e}};export{s as t};
@@ -5,16 +5,16 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/image.png" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>db-studio</title>
8
- <script type="module" crossorigin src="/assets/index-BtQYs6UF.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-D9Wxg2ot.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Bnw7wDfq.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/monaco-editor-B6TxHuqP.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/icons-BywMJ5og.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/radix-ui-C0u6gLux.js">
13
- <link rel="modulepreload" crossorigin href="/assets/tanstack-DyfKDo5s.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/tanstack-CJpNvQIy.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/bundle-mjs-DkNbwow-.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/react-dom-JJlWtX5O.js">
16
16
  <link rel="stylesheet" crossorigin href="/assets/monaco-editor-DVSAlpqy.css">
17
- <link rel="stylesheet" crossorigin href="/assets/index-Dv6o03bL.css">
17
+ <link rel="stylesheet" crossorigin href="/assets/index-fMzwkmHJ.css">
18
18
  </head>
19
19
  <body>
20
20
  <div id="root"></div>
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var hs=Object.defineProperty;var d=(t,e)=>()=>(t&&(e=t(t=0)),e);var Cs=(t,e)=>{for(var o in e)hs(t,o,{get:e[o],enumerable:!0})};var qt=d(()=>{"use strict"});var kt=d(()=>{"use strict"});var vt=d(()=>{"use strict"});var Ut,re,Ft=d(()=>{"use strict";Ut=globalThis.process?.env?.NODE_ENV,re={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",IS_DEV:Ut==="development",PROXY_URL:Ut==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var Bt=d(()=>{"use strict"});var Ht,st=d(()=>{"use strict";Ht={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"DB Studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var jt=d(()=>{"use strict"});var Oe=d(()=>{"use strict";qt();kt();vt();Ft();Bt();st();jt()});import{z as de}from"zod";var w,Us,$e,ym,oo,ne,W=d(()=>{"use strict";w=de.object({db:de.string("Database name is required")}),Us=["pg","mysql","mssql","mongodb"],$e=de.enum(Us,{message:"Invalid database type"}),ym=w.extend({dbType:$e}),oo=de.object({dbType:$e}),ne=de.object({tableName:de.string("Table name is required")})});import{z as J}from"zod";var X,hm,ao=d(()=>{"use strict";W();X=J.object({columnName:J.string("Column name is required"),columnType:J.string("Column type is required"),defaultValue:J.string().optional(),isPrimaryKey:J.boolean().default(!1),isNullable:J.boolean().default(!1),isUnique:J.boolean().default(!1),isIdentity:J.boolean().default(!1),isArray:J.boolean().default(!1)}),hm=J.object({db:w.shape.db,tableName:ne.shape.tableName,columnName:X.shape.columnName,columnType:X.shape.columnType,defaultValue:X.shape.defaultValue,isPrimaryKey:X.shape.isPrimaryKey,isNullable:X.shape.isNullable,isUnique:X.shape.isUnique,isIdentity:X.shape.isIdentity,isArray:X.shape.isArray})});import{z as Re}from"zod";var no,ro=d(()=>{"use strict";no=Re.object({tableName:Re.string("Table name is required"),data:Re.record(Re.string("Column name is required"),Re.any())})});import{z as Y}from"zod";var so,V,wm,Dm,qe=d(()=>{"use strict";W();so=w.extend({cascade:Y.string().optional().transform(t=>t==="true")}),V=Y.object({tableName:Y.string("Table name is required"),columnName:Y.string("Column name is required")}),wm=Y.object({db:w.shape.db,tableName:V.shape.tableName,columnName:V.shape.columnName,cascade:Y.boolean().optional()}),Dm=Y.object({message:Y.string("Message is required"),tableName:Y.string("Table name is required"),columnName:Y.string("Column name is required"),deletedCount:Y.number("Deleted count is required").default(0)})});import{z as Ne}from"zod";var Ae,Om,io=d(()=>{"use strict";W();qe();Ae=Ne.object({columnType:Ne.string("Column type is required"),isNullable:Ne.boolean(),defaultValue:Ne.string().nullable().optional()}),Om=Ne.object({db:w.shape.db,tableName:V.shape.tableName,columnName:V.shape.columnName,columnType:Ae.shape.columnType,isNullable:Ae.shape.isNullable,defaultValue:Ae.shape.defaultValue})});var co=d(()=>{"use strict"});import{z as fe}from"zod";var lo,mo=d(()=>{"use strict";lo=fe.object({tableName:fe.string().min(1,"Table name is required"),records:fe.array(fe.record(fe.string(),fe.any())).min(1,"At least one record is required")})});import{z}from"zod";var Fs,uo,po=d(()=>{"use strict";W();Fs=z.object({type:z.string(),content:z.string().optional()}).passthrough(),uo=z.object({messages:z.array(z.object({id:z.string(),role:z.enum(["user","assistant","system","tool"]),parts:z.array(Fs)}).passthrough()),data:z.object({conversationId:z.string().optional(),db:w.shape.db})})});var fo=d(()=>{"use strict"});import{z as Q}from"zod";var Bs,Hs,I,js,Ks,Fm,mt=d(()=>{"use strict";Bs=["text","boolean","number","enum","json","date","array"],Hs=Q.enum(Bs),I={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},js=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],Ks=Q.enum(js),Fm=Q.object({columnName:Q.string(),dataType:Hs,dataTypeLabel:Ks,isNullable:Q.boolean(),columnDefault:Q.string().nullable(),isPrimaryKey:Q.boolean(),isForeignKey:Q.boolean(),referencedTable:Q.string().nullable(),referencedColumn:Q.string().nullable(),enumValues:Q.array(Q.string()).nullable()})});function bo(t){let e=t?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?I.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?I.number:e==="boolean"||e==="bool"?I.boolean:e==="json"||e==="jsonb"?I.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?I.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?I.text:I.text}function yo(t){if(!t)return T.text;let e=t.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?T.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?T.bigint:e==="smallint"||e==="int2"?T.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?T.numeric:e==="real"||e==="float4"?T.float:e==="double precision"||e==="float8"||e==="float"?T.double:e==="money"?T.money:e==="boolean"||e==="bool"?T.boolean:e==="text"?T.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?T.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?T.char:e==="json"?T.json:e==="jsonb"?T.jsonb:e==="xml"?T.xml:e==="uuid"?T.uuid:e==="date"?T.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?T.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?T.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?T.timestamptz:e==="interval"||e.startsWith("interval")?T.interval:e==="bytea"?T.bytea:e==="inet"?T.inet:e==="cidr"?T.cidr:e==="macaddr"?T.macaddr:e==="macaddr8"?T.macaddr8:e==="point"?T.point:e==="line"?T.line:e==="polygon"?T.polygon:e.startsWith("array")||e.includes("[]")?T.text:e.startsWith("user-defined")||e==="enum"?T.enum:T.text}function go(t,e){let o=t?.toLowerCase().trim()||"",a=e?.toLowerCase().trim()||"";return o==="tinyint"&&a==="tinyint(1)"?I.boolean:o==="tinyint"||o==="smallint"||o==="mediumint"||o==="int"||o==="integer"||o==="bigint"||o==="decimal"||o==="numeric"||o==="float"||o==="double"||o==="real"||o==="bit"?I.number:o==="boolean"||o==="bool"?I.boolean:o==="date"||o==="datetime"||o==="timestamp"||o==="time"||o==="year"?I.date:o==="json"?I.json:o==="enum"||o==="set"?I.enum:I.text}function To(t,e){if(!t)return T.text;let o=t.toLowerCase().trim(),a=e?.toLowerCase().trim()||"";return o==="tinyint"&&a==="tinyint(1)"?T.boolean:o==="tinyint"?T.tinyint:o==="smallint"?T.smallint:o==="mediumint"?T.mediumint:o==="int"||o==="integer"?T.int:o==="bigint"?T.bigint:o==="decimal"||o==="numeric"?T.numeric:o==="float"||o==="real"?T.float:o==="double"?T.double:o==="bit"?T.bit:o==="boolean"||o==="bool"?T.boolean:o==="char"?T.char:o==="varchar"?T.varchar:o==="tinytext"?T.tinytext:o==="text"?T.text:o==="mediumtext"?T.mediumtext:o==="longtext"?T.longtext:o==="binary"?T.binary:o==="varbinary"?T.varbinary:o==="tinyblob"?T.tinyblob:o==="blob"?T.blob:o==="mediumblob"?T.mediumblob:o==="longblob"?T.longblob:o==="json"?T.json:o==="date"?T.date:o==="time"?T.time:o==="datetime"?T.datetime:o==="timestamp"?T.timestamp:o==="year"?T.year:o==="enum"?T.enum:o==="set"?T.set:T.text}function Eo(t){let e=t?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?I.number:e==="bit"?I.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?I.date:e==="json"?I.json:I.text}function ho(t){if(!t)return T.text;let e=t.toLowerCase().trim();return e==="tinyint"?T.tinyint:e==="smallint"?T.smallint:e==="int"?T.int:e==="bigint"?T.bigint:e==="decimal"||e==="numeric"?T.numeric:e==="float"||e==="real"?T.float:e==="money"||e==="smallmoney"?T.money:e==="bit"?T.boolean:e==="char"?T.char:e==="varchar"?T.varchar:e==="text"?T.text:e==="nchar"?T.char:e==="nvarchar"?T.varchar:e==="ntext"?T.text:e==="binary"?T.binary:e==="varbinary"?T.varbinary:e==="image"?T.blob:e==="uniqueidentifier"?T.uuid:e==="date"?T.date:e==="time"?T.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?T.datetime:e==="datetimeoffset"?T.timestamptz:e==="json"?T.json:e==="xml"?T.xml:T.text}var T,Co=d(()=>{"use strict";mt();T={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as U}from"zod";var Vs,So,Qs,Ws,Ro,No=d(()=>{"use strict";Vs=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],So=U.enum(Vs),Qs=U.object({columnName:U.string("Column name is required"),columnType:U.string("Column type is required"),defaultValue:U.string().optional(),isPrimaryKey:U.boolean().default(!1),isNullable:U.boolean().default(!1),isUnique:U.boolean().default(!1),isIdentity:U.boolean().default(!1),isArray:U.boolean().default(!1)}),Ws=U.object({columnName:U.string("Column name is required"),referencedTable:U.string("Referenced table is required"),referencedColumn:U.string("Referenced column is required"),onUpdate:So.default("NO ACTION"),onDelete:So.default("NO ACTION")}),Ro=U.object({tableName:U.string("Table name is required"),fields:U.array(Qs).min(1,"At least one field is required"),foreignKeys:U.array(Ws).optional()})});import{z as B}from"zod";var Ys,Ym,Ao,wo=d(()=>{"use strict";W();Ys=B.object({name:B.string("Name is required"),size:B.string("Size is required"),owner:B.string("Owner is required"),encoding:B.string("Encoding is required")}),Ym=B.object({databases:B.array(Ys),dbType:$e}),Ao=B.object({version:B.string("Version is required"),database:B.string("Database is required"),user:B.string("User is required"),host:B.string("Host is required").nullable(),port:B.number("Port is required").nullable(),active_connections:B.coerce.number("Active connections is required"),max_connections:B.coerce.number("Max connections is required")})});var Do=d(()=>{"use strict"});import{z as be}from"zod";var ut,_o=d(()=>{"use strict";ut=be.object({tableName:be.string("Table name is required"),primaryKeys:be.array(be.object({columnName:be.string("Column name is required"),value:be.any()})).min(1,"At least one primary key is required")})});import{z as zs}from"zod";var xo,Mo=d(()=>{"use strict";W();xo=w.extend({cascade:zs.string().optional().transform(t=>t==="true")})});import{z as Lo}from"zod";var Oo,Po=d(()=>{"use strict";Oo=Lo.object({query:Lo.string("Query is required")})});import{z as Gs}from"zod";var Js,Io,$o=d(()=>{"use strict";W();Js=["csv","xlsx","json"],Io=w.extend({format:Gs.enum(Js,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var qo=d(()=>{"use strict"});import{z as pt}from"zod";var dt,lu,ko=d(()=>{"use strict";W();qe();dt=pt.object({newColumnName:pt.string("New column name is required")}),lu=pt.object({db:w.shape.db,tableName:V.shape.tableName,columnName:V.shape.columnName,newColumnName:dt.shape.newColumnName})});import{z as M}from"zod";var du,ke,fu,Xs,bu,vo,Uo=d(()=>{"use strict";W();du=M.object({columnName:M.string(),operator:M.string(),value:M.string()}),ke=["asc","desc"],fu=M.object({columnName:M.string(),direction:M.enum(ke)}),Xs=M.object({limit:M.number(),total:M.number(),hasNextPage:M.boolean(),hasPreviousPage:M.boolean(),nextCursor:M.string().nullable(),prevCursor:M.string().nullable()}),bu=M.object({data:M.array(M.record(M.string(),M.unknown())),meta:Xs}),vo=M.object({db:w.shape.db,cursor:M.string().optional(),limit:M.string().optional().default("50").transform(Number),direction:M.enum(ke).optional().default(ke[0]),sort:M.string().optional().transform(t=>{if(!t)return"";try{let e=JSON.parse(t);return Array.isArray(e)?e:t}catch{return t}}),order:M.enum(ke).optional(),filters:M.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})})});import{z as ve}from"zod";var Tu,Fo=d(()=>{"use strict";Tu=ve.object({tableName:ve.string("Table name is required"),schemaName:ve.string().optional(),rowCount:ve.coerce.number("Row count is required")})});import{z as Bo}from"zod";var Cu,Ho=d(()=>{"use strict";Cu=Bo.object({schema:Bo.string()})});import{z as Z}from"zod";var jo,Ko=d(()=>{"use strict";jo=Z.object({tableName:Z.string("Table name is required"),primaryKey:Z.string("Primary key is required").default("id"),updates:Z.array(Z.object({rowData:Z.record(Z.string("Column name is required"),Z.any()),columnName:Z.string("Column name is required"),value:Z.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var ee=d(()=>{"use strict";ao();ro();io();co();mo();po();fo();Co();mt();No();W();wo();Do();qe();_o();Mo();Po();$o();qo();ko();Uo();Fo();Ho();Ko()});import{HTTPException as Zs}from"hono/http-exception";import{DatabaseError as ei}from"pg";import{ZodError as ti}from"zod";function Vo(t,e){if(t instanceof Zs)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof ti){let o=t.issues[0];return e.json({error:"Validation error",details:o.message},400)}if(t instanceof Error){let o=t;if(o.code==="ECONNREFUSED"||o.code==="ENOTFOUND"||o.code==="ETIMEDOUT"||o.code==="ER_ACCESS_DENIED_ERROR"||o.code==="ER_BAD_HOST_ERROR"||o.code==="ECONNRESET"||o.errno===1045||o.errno===2003||o.errno===2002||t.message.includes("ECONNREFUSED")||t.message.includes("connection refused")||t.message.includes("timeout expired")||t.message.includes("Connection terminated")||t.message.includes("MongoNetworkError")||t.message.includes("MongoServerSelectionError")||t instanceof ei&&t.code?.startsWith("08"))return e.json({error:"Database connection failed",details:t.message},503)}return e.json({error:t instanceof Error?t.message:"Internal server error"},500)}var Qo,Wo=d(()=>{"use strict";Qo=(t,e)=>{if(!t.success){let o=t.error?.issues[0];return e.json({error:"Validation error",details:o?.message??"Unknown validation error"},400)}}});import{MongoClient as oi,ObjectId as ft}from"mongodb";import ai from"mssql";import{createPool as ni}from"mysql2/promise";import{Pool as Yo}from"pg";var bt,me,C,S,N,ye,yt,gt,D,Tt,te,E=d(()=>{"use strict";bt=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let o=e.protocol.replace(":","");switch(o){case"postgres":case"postgresql":return"pg";case"mysql":case"mysql2":return"mysql";case"mssql":case"sqlserver":return"mssql";case"mongodb":case"mongodb+srv":return"mongodb";default:throw new Error(`Unsupported database type: ${o}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), SQL Server (mssql://), MongoDB (mongodb://).`)}}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let o=new URL(e);this.baseConfig={url:e,host:o.hostname,port:Number.parseInt(o.port,10)||(this.detectDbType(o)==="mysql"?3306:this.detectDbType(o)==="mssql"?1433:5432),user:o.username,password:o.password,dbType:this.detectDbType(o)}}catch(o){throw new Error(o instanceof Error?o.message:String(o))}}getDbType(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");e||(e=new URL(this.baseConfig.url).pathname.slice(1));try{let o=new URL(this.baseConfig.url);return o.pathname=`/${e}`,o.toString()}catch(o){throw new Error(`Failed to build connection string for database "${e}": ${o instanceof Error?o.message:String(o)}`)}}getPgPool(e){let o=this.buildConnectionString(e);if(!this.pgPools.has(o)){let a={connectionString:o,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},n=new Yo(a);n.on("error",r=>{}),this.pgPools.set(o,n)}return this.pgPools.get(o)??new Yo({connectionString:o})}getMysqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let o=this.buildConnectionString(e);if(!this.mysqlPools.has(o)){let n=new URL(o).pathname.slice(1),r=ni({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:n||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.mysqlPools.set(o,r)}return this.mysqlPools.get(o)}async getMssqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let o=this.buildConnectionString(e);if(!this.mssqlPools.has(o)){let n=new URL(o).pathname.slice(1),r={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:n||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},i=await new ai.ConnectionPool(r).connect();i.on("error",c=>{}),this.mssqlPools.set(o,i)}return this.mssqlPools.get(o)}getPool(e){return this.getPgPool(e)}async closePgPool(e){let o=this.pgPools.get(e);o&&(await o.end(),this.pgPools.delete(e))}async closeMysqlPool(e){let o=this.mysqlPools.get(e);o&&(await o.end(),this.mysqlPools.delete(e))}async closeMssqlPool(e){let o=this.mssqlPools.get(e);o&&(await o.close(),this.mssqlPools.delete(e))}async closePool(e){await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){let o=this.buildConnectionString(e);await this.closePool(o)}async getMongoClient(){if(!this.mongoClient){if(!this.baseConfig)throw new Error("Base configuration not initialized");let e=new oi(this.baseConfig.url);try{await e.connect(),this.mongoClient=e}catch(o){try{await e.close()}catch{}throw o}}return this.mongoClient}getMongoDbName(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return new URL(this.baseConfig.url).pathname?.replace(/^\//,"")||"admin"}async getMongoDb(e){return(await this.getMongoClient()).db(e??this.getMongoDbName())}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([n,r])=>{await r.end()}),o=Array.from(this.mysqlPools.entries()).map(async([n,r])=>{await r.end()}),a=Array.from(this.mssqlPools.entries()).map(async([n,r])=>{await r.close()});await Promise.all([...e,...o,...a]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null)}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},me=new bt,C=t=>me.getPgPool(t),S=t=>me.getMysqlPool(t),N=async t=>me.getMssqlPool(t),ye=()=>me.getDbType(),yt=()=>me.getMongoClient(),gt=()=>me.getMongoDbName(),D=t=>me.getMongoDb(t),Tt=t=>typeof t=="string"&&ft.isValid(t),te=t=>typeof t=="string"&&ft.isValid(t)?new ft(t):t});function Fe(t){return typeof t=="string"&&Tt(t)}var j,zo,Go,Jo,Ue,oe=d(()=>{"use strict";E();j=t=>{if(t instanceof Date)return t.toISOString();if(typeof t=="bigint")return t.toString();if(t&&typeof t=="object"){if("_bsontype"in t&&t._bsontype==="ObjectId")return t.toHexString();if(Array.isArray(t))return t.map(o=>j(o));let e=Object.entries(t).map(([o,a])=>[o,j(a)]);return Object.fromEntries(e)}return t},zo=t=>t instanceof Date?"date":t&&typeof t=="object"?Array.isArray(t)?"array":"_bsontype"in t?"text":"json":typeof t=="boolean"?"boolean":typeof t=="number"||typeof t=="bigint"?"number":"text",Go=t=>{switch(t){case"number":return"numeric";case"boolean":return"boolean";case"json":return"json";case"date":return"date";case"array":return"array";case"enum":return"enum";default:return"text"}},Jo=t=>{if(!t||t.length===0)return{};let e=[],o=n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=n=>{let r=n.trim();if(r==="null")return null;if(r==="true")return!0;if(r==="false")return!1;let i=Number(r);return!Number.isNaN(i)&&r!==""?i:Tt(r)?te(r):r};for(let n of t){let r=n.columnName,i=a(n.value),c=n.operator.toLowerCase();if(r)switch(c){case"=":e.push({[r]:i});break;case"!=":e.push({[r]:{$ne:i}});break;case">":e.push({[r]:{$gt:i}});break;case">=":e.push({[r]:{$gte:i}});break;case"<":e.push({[r]:{$lt:i}});break;case"<=":e.push({[r]:{$lte:i}});break;case"is":e.push({[r]:i});break;case"is not":e.push({[r]:{$ne:i}});break;case"like":e.push({[r]:{$regex:o(String(i)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:o(String(i)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:o(String(i)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:o(String(i)),$options:"i"}}});break;default:e.push({[r]:i});break}}return e.length?{$and:e}:{}},Ue=(t,e)=>{if(!t)return{_id:1};if(Array.isArray(t)){let o=t.map(a=>[a.columnName,a.direction==="desc"?-1:1]);return Object.fromEntries(o)}return typeof t=="string"&&t.length>0?{[t]:e==="desc"?-1:1}:{_id:1}}});async function Be({tableName:t,db:e}){let n=await(await D(e)).collection(t).find({}).limit(ri).toArray(),r=n.length,i=new Map,c=(s,l)=>{let m=zo(l);if(!i.has(s))i.set(s,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=i.get(s);p&&(p.types.add(m),p.presentCount+=1)}};for(let s of n)for(let[l,m]of Object.entries(s)){if(m==null){if(!i.has(l))i.set(l,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=i.get(l);p&&(p.nullable=!0),p&&(p.presentCount+=1)}continue}c(l,m)}if(r>0)for(let s of i.values())s.presentCount<r&&(s.nullable=!0);return i.has("_id")||i.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:r}),Array.from(i.entries()).map(([s,l])=>{let m=l.types.values().next().value??"text";return{columnName:s,dataType:m,dataTypeLabel:Go(m),isNullable:l.nullable,columnDefault:null,isPrimaryKey:s==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}var ri,Et=d(()=>{"use strict";E();oe();ri=200});async function Xo(t,e={}){let{includeSampleData:o=!1,maxTables:a}=e,n=await D(t),r=await n.listCollections().toArray(),c=(typeof a=="number"&&a>0?r.slice(0,a):r).map(async l=>{let m=l.name,p=await Be({tableName:m,db:t}),u={name:m,columns:p.map(ii)};if(o){let g=(await n.collection(m).find({}).limit(3).toArray()).map(y=>j(y));u.sampleData=g.map(y=>Object.fromEntries(Object.entries(y).map(([b,h])=>[b,String(h)])))}return u});return{dbType:"mongodb",tables:await Promise.all(c),relationships:[]}}var ii,Zo=d(()=>{"use strict";E();oe();Et();ii=t=>({name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable,isPrimaryKey:t.isPrimaryKey})});import{Pool as ci}from"pg";var He,li,ht,ea=d(()=>{"use strict";He=null,li=()=>{if(!He){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{He=new ci({connectionString:process.env.DATABASE_URL}),He.on("error",t=>{})}catch(t){throw t}}return He},ht=new Proxy({},{get(t,e){try{return li()[e]}catch(o){throw o}}})});import{HTTPException as mi}from"hono/http-exception";async function je({tableName:t,db:e}){let o=C(e),a=`
2
+ var hs=Object.defineProperty;var d=(t,e)=>()=>(t&&(e=t(t=0)),e);var Cs=(t,e)=>{for(var o in e)hs(t,o,{get:e[o],enumerable:!0})};var qt=d(()=>{"use strict"});var kt=d(()=>{"use strict"});var vt=d(()=>{"use strict"});var Ut,re,Ft=d(()=>{"use strict";Ut=globalThis.process?.env?.NODE_ENV,re={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",IS_DEV:Ut==="development",PROXY_URL:Ut==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var Bt=d(()=>{"use strict"});var Ht,st=d(()=>{"use strict";Ht={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["pgadmin alternative","database client","database gui","database browser","sql editor","postgresql client","mysql client","table editor","ai sql","er diagram"],SITE_TITLE:"dbstudio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_GITHUB_NEW_ISSUE_LINK:"https://github.com/husamql3/db-studio/issues/new/choose",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"https://dbstudio.sh/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var jt=d(()=>{"use strict"});var Oe=d(()=>{"use strict";qt();kt();vt();Ft();Bt();st();jt()});import{z as de}from"zod";var w,Us,$e,ym,oo,ne,W=d(()=>{"use strict";w=de.object({db:de.string("Database name is required")}),Us=["pg","mysql","mssql","mongodb"],$e=de.enum(Us,{message:"Invalid database type"}),ym=w.extend({dbType:$e}),oo=de.object({dbType:$e}),ne=de.object({tableName:de.string("Table name is required")})});import{z as J}from"zod";var X,hm,ao=d(()=>{"use strict";W();X=J.object({columnName:J.string("Column name is required"),columnType:J.string("Column type is required"),defaultValue:J.string().optional(),isPrimaryKey:J.boolean().default(!1),isNullable:J.boolean().default(!1),isUnique:J.boolean().default(!1),isIdentity:J.boolean().default(!1),isArray:J.boolean().default(!1)}),hm=J.object({db:w.shape.db,tableName:ne.shape.tableName,columnName:X.shape.columnName,columnType:X.shape.columnType,defaultValue:X.shape.defaultValue,isPrimaryKey:X.shape.isPrimaryKey,isNullable:X.shape.isNullable,isUnique:X.shape.isUnique,isIdentity:X.shape.isIdentity,isArray:X.shape.isArray})});import{z as Re}from"zod";var no,ro=d(()=>{"use strict";no=Re.object({tableName:Re.string("Table name is required"),data:Re.record(Re.string("Column name is required"),Re.any())})});import{z as Y}from"zod";var so,V,wm,Dm,qe=d(()=>{"use strict";W();so=w.extend({cascade:Y.string().optional().transform(t=>t==="true")}),V=Y.object({tableName:Y.string("Table name is required"),columnName:Y.string("Column name is required")}),wm=Y.object({db:w.shape.db,tableName:V.shape.tableName,columnName:V.shape.columnName,cascade:Y.boolean().optional()}),Dm=Y.object({message:Y.string("Message is required"),tableName:Y.string("Table name is required"),columnName:Y.string("Column name is required"),deletedCount:Y.number("Deleted count is required").default(0)})});import{z as Ne}from"zod";var Ae,Om,io=d(()=>{"use strict";W();qe();Ae=Ne.object({columnType:Ne.string("Column type is required"),isNullable:Ne.boolean(),defaultValue:Ne.string().nullable().optional()}),Om=Ne.object({db:w.shape.db,tableName:V.shape.tableName,columnName:V.shape.columnName,columnType:Ae.shape.columnType,isNullable:Ae.shape.isNullable,defaultValue:Ae.shape.defaultValue})});var co=d(()=>{"use strict"});import{z as fe}from"zod";var lo,mo=d(()=>{"use strict";lo=fe.object({tableName:fe.string().min(1,"Table name is required"),records:fe.array(fe.record(fe.string(),fe.any())).min(1,"At least one record is required")})});import{z}from"zod";var Fs,uo,po=d(()=>{"use strict";W();Fs=z.object({type:z.string(),content:z.string().optional()}).passthrough(),uo=z.object({messages:z.array(z.object({id:z.string(),role:z.enum(["user","assistant","system","tool"]),parts:z.array(Fs)}).passthrough()),data:z.object({conversationId:z.string().optional(),db:w.shape.db})})});var fo=d(()=>{"use strict"});import{z as Q}from"zod";var Bs,Hs,I,js,Ks,Fm,mt=d(()=>{"use strict";Bs=["text","boolean","number","enum","json","date","array"],Hs=Q.enum(Bs),I={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"},js=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],Ks=Q.enum(js),Fm=Q.object({columnName:Q.string(),dataType:Hs,dataTypeLabel:Ks,isNullable:Q.boolean(),columnDefault:Q.string().nullable(),isPrimaryKey:Q.boolean(),isForeignKey:Q.boolean(),referencedTable:Q.string().nullable(),referencedColumn:Q.string().nullable(),enumValues:Q.array(Q.string()).nullable()})});function bo(t){let e=t?.toLowerCase().trim()||"";return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?I.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?I.number:e==="boolean"||e==="bool"?I.boolean:e==="json"||e==="jsonb"?I.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?I.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?I.text:I.text}function yo(t){if(!t)return T.text;let e=t.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?T.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?T.bigint:e==="smallint"||e==="int2"?T.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?T.numeric:e==="real"||e==="float4"?T.float:e==="double precision"||e==="float8"||e==="float"?T.double:e==="money"?T.money:e==="boolean"||e==="bool"?T.boolean:e==="text"?T.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?T.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?T.char:e==="json"?T.json:e==="jsonb"?T.jsonb:e==="xml"?T.xml:e==="uuid"?T.uuid:e==="date"?T.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?T.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?T.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?T.timestamptz:e==="interval"||e.startsWith("interval")?T.interval:e==="bytea"?T.bytea:e==="inet"?T.inet:e==="cidr"?T.cidr:e==="macaddr"?T.macaddr:e==="macaddr8"?T.macaddr8:e==="point"?T.point:e==="line"?T.line:e==="polygon"?T.polygon:e.startsWith("array")||e.includes("[]")?T.text:e.startsWith("user-defined")||e==="enum"?T.enum:T.text}function go(t,e){let o=t?.toLowerCase().trim()||"",a=e?.toLowerCase().trim()||"";return o==="tinyint"&&a==="tinyint(1)"?I.boolean:o==="tinyint"||o==="smallint"||o==="mediumint"||o==="int"||o==="integer"||o==="bigint"||o==="decimal"||o==="numeric"||o==="float"||o==="double"||o==="real"||o==="bit"?I.number:o==="boolean"||o==="bool"?I.boolean:o==="date"||o==="datetime"||o==="timestamp"||o==="time"||o==="year"?I.date:o==="json"?I.json:o==="enum"||o==="set"?I.enum:I.text}function To(t,e){if(!t)return T.text;let o=t.toLowerCase().trim(),a=e?.toLowerCase().trim()||"";return o==="tinyint"&&a==="tinyint(1)"?T.boolean:o==="tinyint"?T.tinyint:o==="smallint"?T.smallint:o==="mediumint"?T.mediumint:o==="int"||o==="integer"?T.int:o==="bigint"?T.bigint:o==="decimal"||o==="numeric"?T.numeric:o==="float"||o==="real"?T.float:o==="double"?T.double:o==="bit"?T.bit:o==="boolean"||o==="bool"?T.boolean:o==="char"?T.char:o==="varchar"?T.varchar:o==="tinytext"?T.tinytext:o==="text"?T.text:o==="mediumtext"?T.mediumtext:o==="longtext"?T.longtext:o==="binary"?T.binary:o==="varbinary"?T.varbinary:o==="tinyblob"?T.tinyblob:o==="blob"?T.blob:o==="mediumblob"?T.mediumblob:o==="longblob"?T.longblob:o==="json"?T.json:o==="date"?T.date:o==="time"?T.time:o==="datetime"?T.datetime:o==="timestamp"?T.timestamp:o==="year"?T.year:o==="enum"?T.enum:o==="set"?T.set:T.text}function Eo(t){let e=t?.toLowerCase().trim()||"";return e==="tinyint"||e==="smallint"||e==="int"||e==="bigint"||e==="decimal"||e==="numeric"||e==="float"||e==="real"||e==="money"||e==="smallmoney"?I.number:e==="bit"?I.boolean:e==="date"||e==="datetime"||e==="datetime2"||e==="smalldatetime"||e==="time"||e==="datetimeoffset"?I.date:e==="json"?I.json:I.text}function ho(t){if(!t)return T.text;let e=t.toLowerCase().trim();return e==="tinyint"?T.tinyint:e==="smallint"?T.smallint:e==="int"?T.int:e==="bigint"?T.bigint:e==="decimal"||e==="numeric"?T.numeric:e==="float"||e==="real"?T.float:e==="money"||e==="smallmoney"?T.money:e==="bit"?T.boolean:e==="char"?T.char:e==="varchar"?T.varchar:e==="text"?T.text:e==="nchar"?T.char:e==="nvarchar"?T.varchar:e==="ntext"?T.text:e==="binary"?T.binary:e==="varbinary"?T.varbinary:e==="image"?T.blob:e==="uniqueidentifier"?T.uuid:e==="date"?T.date:e==="time"?T.time:e==="datetime"||e==="datetime2"||e==="smalldatetime"?T.datetime:e==="datetimeoffset"?T.timestamptz:e==="json"?T.json:e==="xml"?T.xml:T.text}var T,Co=d(()=>{"use strict";mt();T={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",tinyint:"tinyint",mediumint:"mediumint",bit:"bit",boolean:"boolean",text:"text",varchar:"varchar",char:"char",tinytext:"tinytext",mediumtext:"mediumtext",longtext:"longtext",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",datetime:"datetime",year:"year",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",binary:"binary",varbinary:"varbinary",blob:"blob",tinyblob:"tinyblob",mediumblob:"mediumblob",longblob:"longblob",array:"array",enum:"enum",set:"set"}});import{z as U}from"zod";var Vs,So,Qs,Ws,Ro,No=d(()=>{"use strict";Vs=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],So=U.enum(Vs),Qs=U.object({columnName:U.string("Column name is required"),columnType:U.string("Column type is required"),defaultValue:U.string().optional(),isPrimaryKey:U.boolean().default(!1),isNullable:U.boolean().default(!1),isUnique:U.boolean().default(!1),isIdentity:U.boolean().default(!1),isArray:U.boolean().default(!1)}),Ws=U.object({columnName:U.string("Column name is required"),referencedTable:U.string("Referenced table is required"),referencedColumn:U.string("Referenced column is required"),onUpdate:So.default("NO ACTION"),onDelete:So.default("NO ACTION")}),Ro=U.object({tableName:U.string("Table name is required"),fields:U.array(Qs).min(1,"At least one field is required"),foreignKeys:U.array(Ws).optional()})});import{z as B}from"zod";var Ys,Ym,Ao,wo=d(()=>{"use strict";W();Ys=B.object({name:B.string("Name is required"),size:B.string("Size is required"),owner:B.string("Owner is required"),encoding:B.string("Encoding is required")}),Ym=B.object({databases:B.array(Ys),dbType:$e}),Ao=B.object({version:B.string("Version is required"),database:B.string("Database is required"),user:B.string("User is required"),host:B.string("Host is required").nullable(),port:B.number("Port is required").nullable(),active_connections:B.coerce.number("Active connections is required"),max_connections:B.coerce.number("Max connections is required")})});var Do=d(()=>{"use strict"});import{z as be}from"zod";var ut,_o=d(()=>{"use strict";ut=be.object({tableName:be.string("Table name is required"),primaryKeys:be.array(be.object({columnName:be.string("Column name is required"),value:be.any()})).min(1,"At least one primary key is required")})});import{z as zs}from"zod";var xo,Mo=d(()=>{"use strict";W();xo=w.extend({cascade:zs.string().optional().transform(t=>t==="true")})});import{z as Lo}from"zod";var Oo,Po=d(()=>{"use strict";Oo=Lo.object({query:Lo.string("Query is required")})});import{z as Gs}from"zod";var Js,Io,$o=d(()=>{"use strict";W();Js=["csv","xlsx","json"],Io=w.extend({format:Gs.enum(Js,{message:"Invalid format. Supported formats: csv, xlsx, json"})})});var qo=d(()=>{"use strict"});import{z as pt}from"zod";var dt,lu,ko=d(()=>{"use strict";W();qe();dt=pt.object({newColumnName:pt.string("New column name is required")}),lu=pt.object({db:w.shape.db,tableName:V.shape.tableName,columnName:V.shape.columnName,newColumnName:dt.shape.newColumnName})});import{z as M}from"zod";var du,ke,fu,Xs,bu,vo,Uo=d(()=>{"use strict";W();du=M.object({columnName:M.string(),operator:M.string(),value:M.string()}),ke=["asc","desc"],fu=M.object({columnName:M.string(),direction:M.enum(ke)}),Xs=M.object({limit:M.number(),total:M.number(),hasNextPage:M.boolean(),hasPreviousPage:M.boolean(),nextCursor:M.string().nullable(),prevCursor:M.string().nullable()}),bu=M.object({data:M.array(M.record(M.string(),M.unknown())),meta:Xs}),vo=M.object({db:w.shape.db,cursor:M.string().optional(),limit:M.string().optional().default("50").transform(Number),direction:M.enum(ke).optional().default(ke[0]),sort:M.string().optional().transform(t=>{if(!t)return"";try{let e=JSON.parse(t);return Array.isArray(e)?e:t}catch{return t}}),order:M.enum(ke).optional(),filters:M.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})})});import{z as ve}from"zod";var Tu,Fo=d(()=>{"use strict";Tu=ve.object({tableName:ve.string("Table name is required"),schemaName:ve.string().optional(),rowCount:ve.coerce.number("Row count is required")})});import{z as Bo}from"zod";var Cu,Ho=d(()=>{"use strict";Cu=Bo.object({schema:Bo.string()})});import{z as Z}from"zod";var jo,Ko=d(()=>{"use strict";jo=Z.object({tableName:Z.string("Table name is required"),primaryKey:Z.string("Primary key is required").default("id"),updates:Z.array(Z.object({rowData:Z.record(Z.string("Column name is required"),Z.any()),columnName:Z.string("Column name is required"),value:Z.any()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")})});var ee=d(()=>{"use strict";ao();ro();io();co();mo();po();fo();Co();mt();No();W();wo();Do();qe();_o();Mo();Po();$o();qo();ko();Uo();Fo();Ho();Ko()});import{HTTPException as Zs}from"hono/http-exception";import{DatabaseError as ei}from"pg";import{ZodError as ti}from"zod";function Vo(t,e){if(t instanceof Zs)return e.json({error:t.message??"Internal server error"},t.status);if(t instanceof ti){let o=t.issues[0];return e.json({error:"Validation error",details:o.message},400)}if(t instanceof Error){let o=t;if(o.code==="ECONNREFUSED"||o.code==="ENOTFOUND"||o.code==="ETIMEDOUT"||o.code==="ER_ACCESS_DENIED_ERROR"||o.code==="ER_BAD_HOST_ERROR"||o.code==="ECONNRESET"||o.errno===1045||o.errno===2003||o.errno===2002||t.message.includes("ECONNREFUSED")||t.message.includes("connection refused")||t.message.includes("timeout expired")||t.message.includes("Connection terminated")||t.message.includes("MongoNetworkError")||t.message.includes("MongoServerSelectionError")||t instanceof ei&&t.code?.startsWith("08"))return e.json({error:"Database connection failed",details:t.message},503)}return e.json({error:t instanceof Error?t.message:"Internal server error"},500)}var Qo,Wo=d(()=>{"use strict";Qo=(t,e)=>{if(!t.success){let o=t.error?.issues[0];return e.json({error:"Validation error",details:o?.message??"Unknown validation error"},400)}}});import{MongoClient as oi,ObjectId as ft}from"mongodb";import ai from"mssql";import{createPool as ni}from"mysql2/promise";import{Pool as Yo}from"pg";var bt,me,C,S,N,ye,yt,gt,D,Tt,te,E=d(()=>{"use strict";bt=class{pgPools=new Map;mysqlPools=new Map;mssqlPools=new Map;mongoClient=null;baseConfig=null;constructor(){this.initializeBaseConfig()}detectDbType(e){let o=e.protocol.replace(":","");switch(o){case"postgres":case"postgresql":return"pg";case"mysql":case"mysql2":return"mysql";case"mssql":case"sqlserver":return"mssql";case"mongodb":case"mongodb+srv":return"mongodb";default:throw new Error(`Unsupported database type: ${o}. Supported types: PostgreSQL (postgres://), MySQL (mysql://), SQL Server (mssql://), MongoDB (mongodb://).`)}}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let o=new URL(e);this.baseConfig={url:e,host:o.hostname,port:Number.parseInt(o.port,10)||(this.detectDbType(o)==="mysql"?3306:this.detectDbType(o)==="mssql"?1433:5432),user:o.username,password:o.password,dbType:this.detectDbType(o)}}catch(o){throw new Error(o instanceof Error?o.message:String(o))}}getDbType(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return this.baseConfig.dbType}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");e||(e=new URL(this.baseConfig.url).pathname.slice(1));try{let o=new URL(this.baseConfig.url);return o.pathname=`/${e}`,o.toString()}catch(o){throw new Error(`Failed to build connection string for database "${e}": ${o instanceof Error?o.message:String(o)}`)}}getPgPool(e){let o=this.buildConnectionString(e);if(!this.pgPools.has(o)){let a={connectionString:o,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},n=new Yo(a);n.on("error",r=>{}),this.pgPools.set(o,n)}return this.pgPools.get(o)??new Yo({connectionString:o})}getMysqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let o=this.buildConnectionString(e);if(!this.mysqlPools.has(o)){let n=new URL(o).pathname.slice(1),r=ni({host:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:n||void 0,waitForConnections:!0,connectionLimit:10,idleTimeout:3e4,connectTimeout:2e3,multipleStatements:!1});this.mysqlPools.set(o,r)}return this.mysqlPools.get(o)}async getMssqlPool(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");let o=this.buildConnectionString(e);if(!this.mssqlPools.has(o)){let n=new URL(o).pathname.slice(1),r={server:this.baseConfig.host,port:this.baseConfig.port,user:this.baseConfig.user,password:this.baseConfig.password,database:n||void 0,options:{encrypt:!1,trustServerCertificate:!0,enableArithAbort:!0,connectTimeout:2e3},pool:{max:10,min:0,idleTimeoutMillis:3e4}},i=await new ai.ConnectionPool(r).connect();i.on("error",c=>{}),this.mssqlPools.set(o,i)}return this.mssqlPools.get(o)}getPool(e){return this.getPgPool(e)}async closePgPool(e){let o=this.pgPools.get(e);o&&(await o.end(),this.pgPools.delete(e))}async closeMysqlPool(e){let o=this.mysqlPools.get(e);o&&(await o.end(),this.mysqlPools.delete(e))}async closeMssqlPool(e){let o=this.mssqlPools.get(e);o&&(await o.close(),this.mssqlPools.delete(e))}async closePool(e){await this.closePgPool(e),await this.closeMysqlPool(e),await this.closeMssqlPool(e)}async closePoolByDatabase(e){let o=this.buildConnectionString(e);await this.closePool(o)}async getMongoClient(){if(!this.mongoClient){if(!this.baseConfig)throw new Error("Base configuration not initialized");let e=new oi(this.baseConfig.url);try{await e.connect(),this.mongoClient=e}catch(o){try{await e.close()}catch{}throw o}}return this.mongoClient}getMongoDbName(){if(!this.baseConfig)throw new Error("Base configuration not initialized");return new URL(this.baseConfig.url).pathname?.replace(/^\//,"")||"admin"}async getMongoDb(e){return(await this.getMongoClient()).db(e??this.getMongoDbName())}async closeAll(){let e=Array.from(this.pgPools.entries()).map(async([n,r])=>{await r.end()}),o=Array.from(this.mysqlPools.entries()).map(async([n,r])=>{await r.end()}),a=Array.from(this.mssqlPools.entries()).map(async([n,r])=>{await r.close()});await Promise.all([...e,...o,...a]),this.pgPools.clear(),this.mysqlPools.clear(),this.mssqlPools.clear(),this.mongoClient&&(await this.mongoClient.close(),this.mongoClient=null)}getActivePools(){return[...Array.from(this.pgPools.keys()),...Array.from(this.mysqlPools.keys()),...Array.from(this.mssqlPools.keys())]}},me=new bt,C=t=>me.getPgPool(t),S=t=>me.getMysqlPool(t),N=async t=>me.getMssqlPool(t),ye=()=>me.getDbType(),yt=()=>me.getMongoClient(),gt=()=>me.getMongoDbName(),D=t=>me.getMongoDb(t),Tt=t=>typeof t=="string"&&ft.isValid(t),te=t=>typeof t=="string"&&ft.isValid(t)?new ft(t):t});function Fe(t){return typeof t=="string"&&Tt(t)}var j,zo,Go,Jo,Ue,oe=d(()=>{"use strict";E();j=t=>{if(t instanceof Date)return t.toISOString();if(typeof t=="bigint")return t.toString();if(t&&typeof t=="object"){if("_bsontype"in t&&t._bsontype==="ObjectId")return t.toHexString();if(Array.isArray(t))return t.map(o=>j(o));let e=Object.entries(t).map(([o,a])=>[o,j(a)]);return Object.fromEntries(e)}return t},zo=t=>t instanceof Date?"date":t&&typeof t=="object"?Array.isArray(t)?"array":"_bsontype"in t?"text":"json":typeof t=="boolean"?"boolean":typeof t=="number"||typeof t=="bigint"?"number":"text",Go=t=>{switch(t){case"number":return"numeric";case"boolean":return"boolean";case"json":return"json";case"date":return"date";case"array":return"array";case"enum":return"enum";default:return"text"}},Jo=t=>{if(!t||t.length===0)return{};let e=[],o=n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=n=>{let r=n.trim();if(r==="null")return null;if(r==="true")return!0;if(r==="false")return!1;let i=Number(r);return!Number.isNaN(i)&&r!==""?i:Tt(r)?te(r):r};for(let n of t){let r=n.columnName,i=a(n.value),c=n.operator.toLowerCase();if(r)switch(c){case"=":e.push({[r]:i});break;case"!=":e.push({[r]:{$ne:i}});break;case">":e.push({[r]:{$gt:i}});break;case">=":e.push({[r]:{$gte:i}});break;case"<":e.push({[r]:{$lt:i}});break;case"<=":e.push({[r]:{$lte:i}});break;case"is":e.push({[r]:i});break;case"is not":e.push({[r]:{$ne:i}});break;case"like":e.push({[r]:{$regex:o(String(i)),$options:""}});break;case"not like":e.push({[r]:{$not:{$regex:o(String(i)),$options:""}}});break;case"ilike":e.push({[r]:{$regex:o(String(i)),$options:"i"}});break;case"not ilike":e.push({[r]:{$not:{$regex:o(String(i)),$options:"i"}}});break;default:e.push({[r]:i});break}}return e.length?{$and:e}:{}},Ue=(t,e)=>{if(!t)return{_id:1};if(Array.isArray(t)){let o=t.map(a=>[a.columnName,a.direction==="desc"?-1:1]);return Object.fromEntries(o)}return typeof t=="string"&&t.length>0?{[t]:e==="desc"?-1:1}:{_id:1}}});async function Be({tableName:t,db:e}){let n=await(await D(e)).collection(t).find({}).limit(ri).toArray(),r=n.length,i=new Map,c=(s,l)=>{let m=zo(l);if(!i.has(s))i.set(s,{types:new Set([m]),nullable:!1,presentCount:1});else{let p=i.get(s);p&&(p.types.add(m),p.presentCount+=1)}};for(let s of n)for(let[l,m]of Object.entries(s)){if(m==null){if(!i.has(l))i.set(l,{types:new Set(["text"]),nullable:!0,presentCount:1});else{let p=i.get(l);p&&(p.nullable=!0),p&&(p.presentCount+=1)}continue}c(l,m)}if(r>0)for(let s of i.values())s.presentCount<r&&(s.nullable=!0);return i.has("_id")||i.set("_id",{types:new Set(["text"]),nullable:!1,presentCount:r}),Array.from(i.entries()).map(([s,l])=>{let m=l.types.values().next().value??"text";return{columnName:s,dataType:m,dataTypeLabel:Go(m),isNullable:l.nullable,columnDefault:null,isPrimaryKey:s==="_id",isForeignKey:!1,referencedTable:null,referencedColumn:null,enumValues:null}})}var ri,Et=d(()=>{"use strict";E();oe();ri=200});async function Xo(t,e={}){let{includeSampleData:o=!1,maxTables:a}=e,n=await D(t),r=await n.listCollections().toArray(),c=(typeof a=="number"&&a>0?r.slice(0,a):r).map(async l=>{let m=l.name,p=await Be({tableName:m,db:t}),u={name:m,columns:p.map(ii)};if(o){let g=(await n.collection(m).find({}).limit(3).toArray()).map(y=>j(y));u.sampleData=g.map(y=>Object.fromEntries(Object.entries(y).map(([b,h])=>[b,String(h)])))}return u});return{dbType:"mongodb",tables:await Promise.all(c),relationships:[]}}var ii,Zo=d(()=>{"use strict";E();oe();Et();ii=t=>({name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable,isPrimaryKey:t.isPrimaryKey})});import{Pool as ci}from"pg";var He,li,ht,ea=d(()=>{"use strict";He=null,li=()=>{if(!He){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{He=new ci({connectionString:process.env.DATABASE_URL}),He.on("error",t=>{})}catch(t){throw t}}return He},ht=new Proxy({},{get(t,e){try{return li()[e]}catch(o){throw o}}})});import{HTTPException as mi}from"hono/http-exception";async function je({tableName:t,db:e}){let o=C(e),a=`
3
3
  SELECT
4
4
  c.column_name as "columnName",
5
5
  c.data_type as "dataType",
@@ -717,5 +717,5 @@ ${i.join(`,
717
717
  SELECT 1 FROM information_schema.columns
718
718
  WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
719
719
  ) as exists;
720
- `,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new Pt(404,{message:`Column "${o}" does not exist in table "${e}"`});let{rows:m}=await r.query(s,[e,a]);if(m[0]?.exists)throw new Pt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.query(`ALTER TABLE "${e}" RENAME COLUMN "${o}" TO "${a}"`)}var ds=d(()=>{"use strict";E()});import{utils as Me,write as fl}from"xlsx";function fs({cols:t,rows:e,format:o,tableName:a}){switch(o){case"json":{let n=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(n,"utf-8"))}case"csv":{let n=[t,...e?.map(c=>t?.map(s=>c[s]))??[]],r=Me.aoa_to_sheet(n),i=Me.sheet_to_csv(r);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let n=[t,...e?.map(s=>t?.map(l=>s[l]))??[]],r=Me.aoa_to_sheet(n),i=Me.book_new();Me.book_append_sheet(i,r,a.slice(0,31));let c=fl(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var bs=d(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as bl}from"hono";var ys,gs=d(()=>{"use strict";ee();Yr();Jr();xe();es();as();ss();ls();us();ds();bs();ys=new bl().basePath("/tables").get("/",L("query",w),async t=>{let{db:e}=t.req.valid("query"),o=t.get("dbType"),n=await P(o).getTablesList(e);return t.json({data:n},200)}).post("/",L("query",w),L("json",Ro),async t=>{let{db:e}=t.req.valid("query"),o=t.req.valid("json"),a=t.get("dbType");return await P(a).createTable({tableData:o,db:e}),t.json({data:`Table ${o.tableName} created successfully`},200)}).delete("/:tableName",L("query",xo),L("param",ne),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a}=t.req.valid("param"),n=t.get("dbType"),i=await P(n).deleteTable({tableName:a,db:e,cascade:o});return t.json({data:i},200)}).delete("/:tableName/columns/:columnName",L("query",so),L("param",V),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a,columnName:n}=t.req.valid("param"),r=t.get("dbType"),i=P(r),{deletedCount:c}=await i.deleteColumn({tableName:a,columnName:n,cascade:o,db:e});return t.json({data:`Column "${n}" deleted successfully from table "${a}" with ${c} rows deleted`},200)}).post("/:tableName/columns",L("query",w),L("param",ne),L("json",X),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.req.valid("json"),n=t.get("dbType");return n==="mysql"?await rs({tableName:o,db:e,...a}):n==="mongodb"?await Zr({tableName:o,db:e,...a}):await Wr({tableName:o,db:e,...a}),t.json({data:`Column "${a.columnName}" added successfully to table "${o}"`},200)}).patch("/:tableName/columns/:columnName/rename",L("query",w),L("param",V),L("json",dt),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,columnName:a}=t.req.valid("param"),n=t.req.valid("json"),r=t.get("dbType");return r==="mysql"?await ms({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await ts({tableName:o,columnName:a,db:e,...n}):await ps({tableName:o,columnName:a,db:e,...n}),t.json({data:`Column "${a}" renamed to "${n.newColumnName}" in table "${o}"`},200)}).patch("/:tableName/columns/:columnName",L("query",w),L("param",V),L("json",Ae),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,columnName:a}=t.req.valid("param"),n=t.req.valid("json"),r=t.get("dbType");return r==="mysql"?await cs({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await os({tableName:o,columnName:a,db:e,...n}):await Gr({tableName:o,columnName:a,db:e,...n}),t.json({data:`Column "${a}" updated successfully in table "${o}"`},200)}).get("/:tableName/columns",L("query",w),L("param",ne),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.get("dbType"),r=await P(a).getTableColumns({tableName:o,db:e});return t.json({data:r},200)}).get("/:tableName/schema",L("query",w),L("param",ne),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.get("dbType"),r=await P(a).getTableSchema({tableName:o,db:e});return t.json({data:{schema:r}},200)}).get("/:tableName/data",L("param",ne),L("query",vo),async t=>{let{tableName:e}=t.req.valid("param"),{cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s}=t.req.valid("query"),l=t.get("dbType"),p=await P(l).getTableData({tableName:e,cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s});return t.json({data:p},200)}).get("/:tableName/export",L("param",ne),L("query",Io),async t=>{let{tableName:e}=t.req.valid("param"),{db:o,format:a}=t.req.valid("query"),n=t.get("dbType"),r=P(n),{cols:i,rows:c}=await r.exportTableData({tableName:e,db:o}),s=fs({cols:i,rows:c,format:a,tableName:e}),l;switch(a){case"csv":l="text/csv";break;case"xlsx":l="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":l="application/json";break}return new Response(s,{headers:{"Content-Type":l??"","Content-Disposition":`attachment; filename="${e}_export.${a}"`}})})});var Ts={};Cs(Ts,{createServer:()=>Sl});import rt from"path";import{fileURLToPath as yl}from"url";import{serveStatic as at}from"@hono/node-server/serve-static";import{zValidator as gl}from"@hono/zod-validator";import{Hono as Tl}from"hono";import{cors as El}from"hono/cors";import{logger as hl}from"hono/logger";import{prettyJSON as Cl}from"hono/pretty-json";var nt,Sl,Es=d(()=>{"use strict";ee();Wo();ia();Fr();jr();Vr();gs();nt=()=>{if(process.env.NODE_ENV==="development")return rt.resolve(process.cwd(),"../core/dist");let t=rt.dirname(yl(import.meta.url));return rt.resolve(t,"./core-dist")},Sl=()=>({app:new Tl({strict:!1}).use("/*",El()).use(Cl({space:2})).use(process.env.NODE_ENV==="development"?hl():(e,o)=>o()).use("/favicon.ico",at({path:rt.resolve(nt(),"favicon.ico")})).use("*",async(e,o)=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),await o()}).onError(Vo).route("/",Ur).route("/",sa).use("/assets/*",at({root:nt()})).use("/image.png",at({root:nt()})).use("/:dbType/*",gl("param",oo,Qo)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",ys).route("/:dbType",Kr).route("/:dbType",Hr).use("/*",at({root:nt()}))})});Oe();import{intro as Rl,outro as Nl}from"@clack/prompts";import{serve as Al}from"@hono/node-server";import It from"picocolors";import{program as Kt}from"commander";var Vt=()=>(Kt.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv),Kt.opts());import{readFile as Ss}from"fs/promises";import{resolve as Rs}from"path";import{cancel as Pe,isCancel as it,note as Qt,select as Ns,spinner as As,text as Wt}from"@clack/prompts";import{parse as ws}from"dotenv";import ct from"picocolors";var Yt=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let a=As();a.start("Looking for database connection..."),t?Qt(ct.red(`${o} not found in .env or process.env`)):Qt(ct.red(`No .env file found and ${o} not set in process.env`));let n=await Ns({message:`How do you want to provide ${o}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((it(n)||n==="cancel")&&(Pe("No database connection provided. Exiting..."),process.exit(0)),n==="other-env"){a.start("Waiting for path...");let i=await Wt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});it(i)&&(Pe("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=Rs(i);try{let s=await Ss(c,"utf-8"),l=ws(s);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(s){let l=s;Pe(`Cannot read or parse file: ${ct.dim(l.message)}`),process.exit(1)}}a.stop("Manual input...");let r=await Wt({message:`Paste your ${o}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(i){if(!i?.trim())return"Connection string is required!";try{new URL(i);return}catch{return"Must be a valid URL format"}}});return it(r)&&(Pe("Cancelled."),process.exit(0)),r.trim()};import{access as Ds,readFile as _s}from"fs/promises";import{dirname as xs,resolve as lt}from"path";import{parse as Ms}from"dotenv";var Ls=async t=>{let e=lt(t);for(;;){let o=lt(e,".env");try{return await Ds(o),o}catch{}let a=xs(e);if(a===e)return null;e=a}},pe=async t=>{let e;if(t?e=lt(t):e=await Ls(process.cwd()),!e)return null;try{let o=await _s(e,"utf-8");return Ms(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};st();import{intro as Os,outro as Ps}from"@clack/prompts";import zt from"picocolors";var Gt=()=>{Os(zt.inverse(" db-studio ")),Ps(zt.green(`For more information, visit: ${Ht.SITE_DOCS_LINK}`))};Oe();import{intro as Is,note as $s,outro as Jt}from"@clack/prompts";import Ie from"picocolors";var Xt=async(t,e,o)=>{Is(Ie.inverse(" db-studio "));let a=o||re.VAR_NAME,n=null;if(e)n=e;else{let r=t?await pe(t):await pe();r?.[a]?n=r[a]:process.env[a]&&(n=process.env[a]??null)}n?Jt(Ie.green(`\u2713 Database connection configured (using ${a})`)):($s(Ie.red(`\u2717 ${a} not found`),"Status"),Jt(Ie.yellow("\u26A0 No database connection configured")))};import{intro as ks,outro as vs}from"@clack/prompts";import eo from"picocolors";var Zt={name:"db-studio",type:"module",version:"1.7.10",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",prepack:"cd ../core && bun run build && cd ../server && bun run build",start:"node dist/index.js",check:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^1.19.7","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",dotenv:"^17.3.1",hono:"^4.10.4",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@types/node":"^25.6.0","@types/pg":"^8.16.0","@types/mssql":"^12.3.0","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^6.0.3",vitest:"^4.0.17"}};var to=()=>{ks(eo.inverse(" db-studio ")),vs(eo.green(`\u{1F680} db-studio v${Zt.version}`))};var wl=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:i}=Vt();r&&(Gt(),process.exit(0)),i&&(to(),process.exit(0)),n&&(await Xt(t,o,a),process.exit(0)),Rl(It.inverse(" db-studio "));let c=e?parseInt(e,10):re.PORT,s=a||re.VAR_NAME,l=t?await pe(t):await pe(),m=o||await Yt(l,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(Es(),Ts)),{app:u}=p();Al({fetch:u.fetch,port:c}),Nl(It.green(`Server running at ${It.cyan(`http://localhost:${c}`)}`))};wl().catch(t=>{process.exit(1)});export{wl as main};
720
+ `,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new Pt(404,{message:`Column "${o}" does not exist in table "${e}"`});let{rows:m}=await r.query(s,[e,a]);if(m[0]?.exists)throw new Pt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.query(`ALTER TABLE "${e}" RENAME COLUMN "${o}" TO "${a}"`)}var ds=d(()=>{"use strict";E()});import{utils as Me,write as fl}from"xlsx";function fs({cols:t,rows:e,format:o,tableName:a}){switch(o){case"json":{let n=JSON.stringify(e??[],null,2);return new Uint8Array(Buffer.from(n,"utf-8"))}case"csv":{let n=[t,...e?.map(c=>t?.map(s=>c[s]))??[]],r=Me.aoa_to_sheet(n),i=Me.sheet_to_csv(r);return new Uint8Array(Buffer.from(i,"utf-8"))}case"xlsx":{let n=[t,...e?.map(s=>t?.map(l=>s[l]))??[]],r=Me.aoa_to_sheet(n),i=Me.book_new();Me.book_append_sheet(i,r,a.slice(0,31));let c=fl(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var bs=d(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as bl}from"hono";var ys,gs=d(()=>{"use strict";ee();Yr();Jr();xe();es();as();ss();ls();us();ds();bs();ys=new bl().basePath("/tables").get("/",L("query",w),async t=>{let{db:e}=t.req.valid("query"),o=t.get("dbType"),n=await P(o).getTablesList(e);return t.json({data:n},200)}).post("/",L("query",w),L("json",Ro),async t=>{let{db:e}=t.req.valid("query"),o=t.req.valid("json"),a=t.get("dbType");return await P(a).createTable({tableData:o,db:e}),t.json({data:`Table ${o.tableName} created successfully`},200)}).delete("/:tableName",L("query",xo),L("param",ne),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a}=t.req.valid("param"),n=t.get("dbType"),i=await P(n).deleteTable({tableName:a,db:e,cascade:o});return t.json({data:i},200)}).delete("/:tableName/columns/:columnName",L("query",so),L("param",V),async t=>{let{db:e,cascade:o}=t.req.valid("query"),{tableName:a,columnName:n}=t.req.valid("param"),r=t.get("dbType"),i=P(r),{deletedCount:c}=await i.deleteColumn({tableName:a,columnName:n,cascade:o,db:e});return t.json({data:`Column "${n}" deleted successfully from table "${a}" with ${c} rows deleted`},200)}).post("/:tableName/columns",L("query",w),L("param",ne),L("json",X),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.req.valid("json"),n=t.get("dbType");return n==="mysql"?await rs({tableName:o,db:e,...a}):n==="mongodb"?await Zr({tableName:o,db:e,...a}):await Wr({tableName:o,db:e,...a}),t.json({data:`Column "${a.columnName}" added successfully to table "${o}"`},200)}).patch("/:tableName/columns/:columnName/rename",L("query",w),L("param",V),L("json",dt),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,columnName:a}=t.req.valid("param"),n=t.req.valid("json"),r=t.get("dbType");return r==="mysql"?await ms({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await ts({tableName:o,columnName:a,db:e,...n}):await ps({tableName:o,columnName:a,db:e,...n}),t.json({data:`Column "${a}" renamed to "${n.newColumnName}" in table "${o}"`},200)}).patch("/:tableName/columns/:columnName",L("query",w),L("param",V),L("json",Ae),async t=>{let{db:e}=t.req.valid("query"),{tableName:o,columnName:a}=t.req.valid("param"),n=t.req.valid("json"),r=t.get("dbType");return r==="mysql"?await cs({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await os({tableName:o,columnName:a,db:e,...n}):await Gr({tableName:o,columnName:a,db:e,...n}),t.json({data:`Column "${a}" updated successfully in table "${o}"`},200)}).get("/:tableName/columns",L("query",w),L("param",ne),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.get("dbType"),r=await P(a).getTableColumns({tableName:o,db:e});return t.json({data:r},200)}).get("/:tableName/schema",L("query",w),L("param",ne),async t=>{let{db:e}=t.req.valid("query"),{tableName:o}=t.req.valid("param"),a=t.get("dbType"),r=await P(a).getTableSchema({tableName:o,db:e});return t.json({data:{schema:r}},200)}).get("/:tableName/data",L("param",ne),L("query",vo),async t=>{let{tableName:e}=t.req.valid("param"),{cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s}=t.req.valid("query"),l=t.get("dbType"),p=await P(l).getTableData({tableName:e,cursor:o,limit:a,direction:n,sort:r,order:i,filters:c,db:s});return t.json({data:p},200)}).get("/:tableName/export",L("param",ne),L("query",Io),async t=>{let{tableName:e}=t.req.valid("param"),{db:o,format:a}=t.req.valid("query"),n=t.get("dbType"),r=P(n),{cols:i,rows:c}=await r.exportTableData({tableName:e,db:o}),s=fs({cols:i,rows:c,format:a,tableName:e}),l;switch(a){case"csv":l="text/csv";break;case"xlsx":l="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";break;case"json":l="application/json";break}return new Response(s,{headers:{"Content-Type":l??"","Content-Disposition":`attachment; filename="${e}_export.${a}"`}})})});var Ts={};Cs(Ts,{createServer:()=>Sl});import rt from"path";import{fileURLToPath as yl}from"url";import{serveStatic as at}from"@hono/node-server/serve-static";import{zValidator as gl}from"@hono/zod-validator";import{Hono as Tl}from"hono";import{cors as El}from"hono/cors";import{logger as hl}from"hono/logger";import{prettyJSON as Cl}from"hono/pretty-json";var nt,Sl,Es=d(()=>{"use strict";ee();Wo();ia();Fr();jr();Vr();gs();nt=()=>{if(process.env.NODE_ENV==="development")return rt.resolve(process.cwd(),"../core/dist");let t=rt.dirname(yl(import.meta.url));return rt.resolve(t,"./core-dist")},Sl=()=>({app:new Tl({strict:!1}).use("/*",El()).use(Cl({space:2})).use(process.env.NODE_ENV==="development"?hl():(e,o)=>o()).use("/favicon.ico",at({path:rt.resolve(nt(),"favicon.ico")})).use("*",async(e,o)=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),await o()}).onError(Vo).route("/",Ur).route("/",sa).use("/assets/*",at({root:nt()})).use("/image.png",at({root:nt()})).use("/:dbType/*",gl("param",oo,Qo)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",ys).route("/:dbType",Kr).route("/:dbType",Hr).use("/*",at({root:nt()}))})});Oe();import{intro as Rl,outro as Nl}from"@clack/prompts";import{serve as Al}from"@hono/node-server";import It from"picocolors";import{program as Kt}from"commander";var Vt=()=>(Kt.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv),Kt.opts());import{readFile as Ss}from"fs/promises";import{resolve as Rs}from"path";import{cancel as Pe,isCancel as it,note as Qt,select as Ns,spinner as As,text as Wt}from"@clack/prompts";import{parse as ws}from"dotenv";import ct from"picocolors";var Yt=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let a=As();a.start("Looking for database connection..."),t?Qt(ct.red(`${o} not found in .env or process.env`)):Qt(ct.red(`No .env file found and ${o} not set in process.env`));let n=await Ns({message:`How do you want to provide ${o}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((it(n)||n==="cancel")&&(Pe("No database connection provided. Exiting..."),process.exit(0)),n==="other-env"){a.start("Waiting for path...");let i=await Wt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});it(i)&&(Pe("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=Rs(i);try{let s=await Ss(c,"utf-8"),l=ws(s);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(s){let l=s;Pe(`Cannot read or parse file: ${ct.dim(l.message)}`),process.exit(1)}}a.stop("Manual input...");let r=await Wt({message:`Paste your ${o}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(i){if(!i?.trim())return"Connection string is required!";try{new URL(i);return}catch{return"Must be a valid URL format"}}});return it(r)&&(Pe("Cancelled."),process.exit(0)),r.trim()};import{access as Ds,readFile as _s}from"fs/promises";import{dirname as xs,resolve as lt}from"path";import{parse as Ms}from"dotenv";var Ls=async t=>{let e=lt(t);for(;;){let o=lt(e,".env");try{return await Ds(o),o}catch{}let a=xs(e);if(a===e)return null;e=a}},pe=async t=>{let e;if(t?e=lt(t):e=await Ls(process.cwd()),!e)return null;try{let o=await _s(e,"utf-8");return Ms(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};st();import{intro as Os,outro as Ps}from"@clack/prompts";import zt from"picocolors";var Gt=()=>{Os(zt.inverse(" db-studio ")),Ps(zt.green(`For more information, visit: ${Ht.SITE_DOCS_LINK}`))};Oe();import{intro as Is,note as $s,outro as Jt}from"@clack/prompts";import Ie from"picocolors";var Xt=async(t,e,o)=>{Is(Ie.inverse(" db-studio "));let a=o||re.VAR_NAME,n=null;if(e)n=e;else{let r=t?await pe(t):await pe();r?.[a]?n=r[a]:process.env[a]&&(n=process.env[a]??null)}n?Jt(Ie.green(`\u2713 Database connection configured (using ${a})`)):($s(Ie.red(`\u2717 ${a} not found`),"Status"),Jt(Ie.yellow("\u26A0 No database connection configured")))};import{intro as ks,outro as vs}from"@clack/prompts";import eo from"picocolors";var Zt={name:"db-studio",type:"module",version:"1.7.11",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database client","database gui","database browser","sql client","sql editor","query tool","table editor","data editor","postgres","postgresql","postgresql client","postgresql gui","pgadmin alternative","mysql","mysql client","ai sql","er diagram","database management","database studio"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",prepack:"cd ../core && bun run build && cd ../server && bun run build",start:"node dist/index.js",check:"biome check --write --unsafe",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},dependencies:{"@clack/prompts":"^1.0.1","@hono/node-server":"^2.0.0","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",dotenv:"^17.3.1",hono:"^4.10.4",mongodb:"^7.1.1",mssql:"^12.2.0",mysql2:"^3.18.2",pg:"^8.13.1",picocolors:"^1.1.1",xlsx:"^0.18.5",zod:"^4.2.1"},devDependencies:{"@biomejs/biome":"^2.2.6","@types/node":"^25.6.0","@types/pg":"^8.16.0","@types/mssql":"^12.3.0","@vitest/coverage-v8":"^4.0.17",shared:"workspace:*",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^6.0.3",vitest:"^4.0.17"}};var to=()=>{ks(eo.inverse(" db-studio ")),vs(eo.green(`\u{1F680} db-studio v${Zt.version}`))};var wl=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:i}=Vt();r&&(Gt(),process.exit(0)),i&&(to(),process.exit(0)),n&&(await Xt(t,o,a),process.exit(0)),Rl(It.inverse(" db-studio "));let c=e?parseInt(e,10):re.PORT,s=a||re.VAR_NAME,l=t?await pe(t):await pe(),m=o||await Yt(l,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(Es(),Ts)),{app:u}=p();Al({fetch:u.fetch,port:c}),Nl(It.green(`Server running at ${It.cyan(`http://localhost:${c}`)}`))};wl().catch(t=>{process.exit(1)});export{wl as main};
721
721
  //# sourceMappingURL=index.js.map