db-studio 1.7.5 → 1.7.6

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 (44) hide show
  1. package/dist/core-dist/assets/_pathlessLayout-Dj-vL1ro.js +2 -0
  2. package/dist/core-dist/assets/{_pathlessLayout-BgaXE7MD.js → _pathlessLayout-lti_XhXr.js} +1 -1
  3. package/dist/core-dist/assets/_queryId-BlmTSMat.js +1 -0
  4. package/dist/core-dist/assets/_table-B6EDRVAF.js +10 -0
  5. package/dist/core-dist/assets/_table-Bexe-PRD.js +1 -0
  6. package/dist/core-dist/assets/{cdoe-editor--A2X22TE.js → cdoe-editor-C6c3JNwJ.js} +2 -2
  7. package/dist/core-dist/assets/{chat-sidebar-Dq5zKCoF.js → chat-sidebar-A3iurUmg.js} +2 -2
  8. package/dist/core-dist/assets/{chunk-BO2N2NFS-CtrFqJix.js → chunk-BO2N2NFS-BWASkQ7r.js} +4 -4
  9. package/dist/core-dist/assets/{dist-C-W9v39G.js → dist-BY1hG1Ya.js} +1 -1
  10. package/dist/core-dist/assets/{dist-CWf64aZV.js → dist-CX0IXul5.js} +1 -1
  11. package/dist/core-dist/assets/{highlighted-body-OFNGDK62-Dqw8vrq4.js → highlighted-body-OFNGDK62-BEkQLPsL.js} +1 -1
  12. package/dist/core-dist/assets/{icons-CAZJbhBz.js → icons-BywMJ5og.js} +1 -1
  13. package/dist/core-dist/assets/index-B7KYpPyV.js +57 -0
  14. package/dist/core-dist/assets/index-Dv6o03bL.css +2 -0
  15. package/dist/core-dist/assets/{indexes-B2pdcOTa.js → indexes-WJgC6xdV.js} +1 -1
  16. package/dist/core-dist/assets/{logs-DItnmo1m.js → logs-BD6ggRmF.js} +1 -1
  17. package/dist/core-dist/assets/mermaid-GHXKKRXX-Cey0AJ6z.js +1 -0
  18. package/dist/core-dist/assets/queries.store-CwP6d13j.js +1 -0
  19. package/dist/core-dist/assets/{radix-ui-B93Y7STU.js → radix-ui-C0u6gLux.js} +1 -1
  20. package/dist/core-dist/assets/{react-dom-KMIgB9GW.js → react-dom-JJlWtX5O.js} +1 -1
  21. package/dist/core-dist/assets/runner-DT89R_pW.js +1 -0
  22. package/dist/core-dist/assets/{runner-tab-JuHyhE5I.js → runner-tab-CJfQuLY7.js} +3 -3
  23. package/dist/core-dist/assets/{schema-B1a8u8dT.js → schema-fNXfq0jj.js} +1 -1
  24. package/dist/core-dist/assets/{scroll-area-DIT4iXSA.js → scroll-area-A-6bIiHh.js} +1 -1
  25. package/dist/core-dist/assets/{table-Bq-YbPAX.js → table-NRrQaCx4.js} +1 -1
  26. package/dist/core-dist/assets/{tanstack-COAHM0pn.js → tanstack-DyfKDo5s.js} +1 -1
  27. package/dist/core-dist/assets/{tooltip-BPnX8rwL.js → tooltip-BSKLiphS.js} +1 -1
  28. package/dist/core-dist/assets/use-delete-column-JnaJwJqm.js +1 -0
  29. package/dist/core-dist/assets/{use-rate-limit-JM72I-Qe.js → use-rate-limit-Bdyk6haf.js} +1 -1
  30. package/dist/core-dist/assets/{visualizer-CQk0bfHO.js → visualizer-DBsb8pcK.js} +1 -1
  31. package/dist/core-dist/index.html +6 -6
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/core-dist/assets/_pathlessLayout-7XOLasgU.js +0 -2
  36. package/dist/core-dist/assets/_queryId-DHd3r8hS.js +0 -1
  37. package/dist/core-dist/assets/_table-BrQjEEkt.js +0 -8
  38. package/dist/core-dist/assets/_table-C6uuIAjA.js +0 -1
  39. package/dist/core-dist/assets/index-Cw94sGcz.js +0 -57
  40. package/dist/core-dist/assets/index-hsgkD-V0.css +0 -2
  41. package/dist/core-dist/assets/mermaid-GHXKKRXX--wNt23Qo.js +0 -1
  42. package/dist/core-dist/assets/queries.store-B8yJ67Tq.js +0 -1
  43. package/dist/core-dist/assets/runner-DGQg7j15.js +0 -1
  44. package/dist/core-dist/assets/use-delete-column-DfaGMfjR.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-B93Y7STU.js";import{Tt as f}from"./index-Cw94sGcz.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 T({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,T 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{Et as f}from"./index-B7KYpPyV.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 C}from"./rolldown-runtime-Bnw7wDfq.js";import{i as p,n as f,r as y,t as x,v as z,x as h}from"./tanstack-DyfKDo5s.js";import{nt as b}from"./icons-BywMJ5og.js";import{Ot as v}from"./radix-ui-C0u6gLux.js";import{Et as d,Ot as S,ct as w,it as m,st as R}from"./index-B7KYpPyV.js";var g=C(b(),1),a=v(),j=({columnVirtualizer:e,row:t,rowVirtualizer:i,virtualPaddingLeft:r,virtualPaddingRight:o,virtualRow:l})=>{const n=t.getVisibleCells(),u=e.getVirtualItems();return(0,a.jsxs)("tr",{"data-index":l.index,ref:s=>i.measureElement(s),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(${l.start}px)`},children:[r?(0,a.jsx)("td",{style:{display:"flex",width:r}}):null,u.map(s=>{const c=n[s.index];return(0,a.jsx)("td",{className:d("flex border-r border-zinc-800 h-8 items-center px-3 truncate"),style:{width:c.column.getSize()},children:f(c.column.columnDef.cell,c.getContext())},c.id)}),o?(0,a.jsx)("td",{style:{display:"flex",width:o}}):null]},t.id)},D=({columnVirtualizer:e,table:t,tableContainerRef:i,virtualPaddingLeft:r,virtualPaddingRight:o})=>{const{rows:l}=t.getRowModel(),n=x({count:l.length,estimateSize:()=>33,getScrollElement:()=>i.current,measureElement:typeof window<"u"&&navigator.userAgent.indexOf("Firefox")===-1?s=>s?.getBoundingClientRect().height:void 0,overscan:5}),u=n.getVirtualItems();return(0,a.jsx)("tbody",{style:{display:"grid",height:`${n.getTotalSize()}px`,position:"relative"},children:u.map(s=>{const c=l[s.index];return(0,a.jsx)(j,{columnVirtualizer:e,row:c,rowVirtualizer:n,virtualPaddingLeft:r,virtualPaddingRight:o,virtualRow:s},c.id)})})};function _({header:e,table:t,label:i}){const r=t._getDefaultColumnDef(),o=(0,g.useCallback)(()=>{t.setColumnSizing(l=>{const n={...l};return delete n[e.column.id],n})},[e.column.id,t]);return(0,a.jsx)("div",{role:"separator","aria-orientation":"vertical","aria-label":`Resize ${i} column`,"aria-valuenow":e.column.getSize(),"aria-valuemin":r.minSize,"aria-valuemax":r.maxSize,tabIndex:0,className:d("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:o,onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler()})}var E=(0,g.memo)(_,(e,t)=>{const i=e.header.column,r=t.header.column;return!(i.getIsResizing()!==r.getIsResizing()||i.getSize()!==r.getSize()||e.label!==t.label)}),A=({columnVirtualizer:e,table:t,virtualPaddingLeft:i,virtualPaddingRight:r})=>{const o=e.getVirtualItems(),l=t.getState().columnSizingInfo.isResizingColumn;return(0,a.jsx)("thead",{className:"h-9 grid sticky top-0 z-10",children:t.getHeaderGroups().map(n=>(0,a.jsxs)("tr",{className:d("flex w-fit bg-black border-b border-zinc-800 items-center text-sm [&_svg]:size-4",l&&"pointer-events-none"),children:[i?(0,a.jsx)("th",{style:{display:"flex",width:i}}):null,o.map(u=>{const s=n.headers[u.index];return(0,a.jsxs)("th",{className:"relative h-full flex items-center border-r border-zinc-800 text-xs font-medium text-zinc-500",style:{width:s.getSize()},children:[(0,a.jsx)("div",{className:"flex w-full h-full items-center px-3",children:f(s.column.columnDef.header,s.getContext())}),s.column.getCanResize()&&(0,a.jsx)(E,{header:s,table:t,label:s.column.id})]},s.id)}),r?(0,a.jsx)("th",{style:{display:"flex",width:r}}):null]},n.id))})},I=({table:e})=>{const t=e.getVisibleLeafColumns(),i=(0,g.useRef)(null),r=x({count:t.length,estimateSize:u=>t[u].getSize(),getScrollElement:()=>i.current,horizontal:!0,overscan:3}),o=r.getVirtualItems();let l,n;return r&&o?.length&&(l=o[0]?.start??0,n=r.getTotalSize()-(o[o.length-1]?.end??0)),(0,a.jsx)("div",{className:"w-full flex-1 overflow-auto",ref:i,style:{position:"relative"},children:(0,a.jsxs)("table",{style:{display:"grid"},children:[(0,a.jsx)(A,{columnVirtualizer:r,table:e,virtualPaddingLeft:l,virtualPaddingRight:n}),(0,a.jsx)(D,{columnVirtualizer:r,table:e,tableContainerRef:i,virtualPaddingLeft:l,virtualPaddingRight:n})]})})},H=({columns:e,data:t})=>(0,a.jsx)(I,{table:y({data:t,columns:e,getCoreRowModel:p(),enableColumnResizing:!0,columnResizeMode:"onChange"})}),q=()=>{const e=h(),{selectedDatabase:t}=R(),{mutateAsync:i,isPending:r}=z({mutationFn:async({tableName:l,columnName:n,cascade:u})=>{const s=new URLSearchParams({db:t??"",cascade:u?"true":"false"});return(await w.delete(`/tables/${encodeURIComponent(l)}/columns/${encodeURIComponent(n)}`,{params:s})).data.data},onSuccess:async(l,n)=>{await Promise.all([e.invalidateQueries({queryKey:[m.CACHE_KEYS.TABLE_COLUMNS,n.tableName],exact:!1}),e.invalidateQueries({queryKey:[m.CACHE_KEYS.TABLE_DATA,n.tableName],exact:!1}),e.invalidateQueries({queryKey:[m.CACHE_KEYS.TABLES_LIST],exact:!1})])},onError:l=>{console.error("Error deleting column:",l)}});return{deleteColumn:async({tableName:l,columnName:n,cascade:u})=>S.promise(i({tableName:l,columnName:n,cascade:u,db:""}),{loading:"Deleting column...",success:s=>s||"Column deleted successfully",error:s=>s.message||"Failed to delete column"}),isDeletingColumn:r}};export{H as n,q as t};
@@ -1 +1 @@
1
- import{y as n}from"./tanstack-COAHM0pn.js";import{ct as s}from"./index-Cw94sGcz.js";var t={limit:999,used:0,remaining:999},m=typeof window<"u"&&window.location.hostname==="localhost",L=()=>{const{data:e,isLoading:i,error:a,refetch:o}=n({queryKey:["rate-limit"],queryFn:async()=>{if(m)return t;try{const r=await fetch(`${s.PROXY_URL}/chat/limit`);return r.ok?await r.json():t}catch{return t}}});return{rateLimit:e,isLoadingRateLimit:i,errorRateLimit:a,refetchRateLimit:o}};export{L as t};
1
+ import{y as n}from"./tanstack-DyfKDo5s.js";import{lt as s}from"./index-B7KYpPyV.js";var t={limit:999,used:0,remaining:999},m=typeof window<"u"&&window.location.hostname==="localhost",c=()=>{const{data:e,isLoading:i,error:a,refetch:o}=n({queryKey:["rate-limit"],queryFn:async()=>{if(m)return t;try{const r=await fetch(`${s.PROXY_URL}/chat/limit`);return r.ok?await r.json():t}catch{return t}}});return{rateLimit:e,isLoadingRateLimit:i,errorRateLimit:a,refetchRateLimit:o}};export{c as t};
@@ -1 +1 @@
1
- import{Ot as e}from"./radix-ui-B93Y7STU.js";var r=e();function i(){return(0,r.jsx)("main",{className:"flex-1 flex items-center justify-center",children:"Visualizer will be available soon!"})}export{i as component};
1
+ import{Ot as e}from"./radix-ui-C0u6gLux.js";var r=e();function i(){return(0,r.jsx)("main",{className:"flex-1 flex items-center justify-center",children:"Visualizer will be available soon!"})}export{i as component};
@@ -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-Cw94sGcz.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-B7KYpPyV.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
- <link rel="modulepreload" crossorigin href="/assets/icons-CAZJbhBz.js">
12
- <link rel="modulepreload" crossorigin href="/assets/radix-ui-B93Y7STU.js">
13
- <link rel="modulepreload" crossorigin href="/assets/tanstack-COAHM0pn.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/icons-BywMJ5og.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/radix-ui-C0u6gLux.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/tanstack-DyfKDo5s.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/bundle-mjs-DkNbwow-.js">
15
- <link rel="modulepreload" crossorigin href="/assets/react-dom-KMIgB9GW.js">
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-hsgkD-V0.css">
17
+ <link rel="stylesheet" crossorigin href="/assets/index-Dv6o03bL.css">
18
18
  </head>
19
19
  <body>
20
20
  <div id="root"></div>
package/dist/index.js CHANGED
@@ -715,5 +715,5 @@ ${i.join(`,
715
715
  SELECT 1 FROM information_schema.columns
716
716
  WHERE table_name = $1 AND column_name = $2 AND table_schema = 'public'
717
717
  ) as exists;
718
- `,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new xt(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 xt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.query(`ALTER TABLE "${e}" RENAME COLUMN "${o}" TO "${a}"`)}var ts=f(()=>{"use strict";h()});import{utils as Le,write as jc}from"xlsx";function os({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=Le.aoa_to_sheet(n),i=Le.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=Le.aoa_to_sheet(n),i=Le.book_new();Le.book_append_sheet(i,r,a.slice(0,31));let c=jc(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var as=f(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as Kc}from"hono";var ns,rs=f(()=>{"use strict";X();qr();Ur();xe();Hr();Vr();Yr();Jr();Zr();ts();as();ns=new Kc().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",ho),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",wo),L("param",ee),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",ao),L("param",K),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",ee),L("json",G),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 Wr({tableName:o,db:e,...a}):n==="mongodb"?await Br({tableName:o,db:e,...a}):await $r({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",K),L("json",pt),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 Xr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await jr({tableName:o,columnName:a,db:e,...n}):await es({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",K),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 Gr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await Kr({tableName:o,columnName:a,db:e,...n}):await vr({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",ee),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",ee),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",ee),L("query",$o),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",ee),L("query",Lo),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=os({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 ss={};Pt(ss,{createServer:()=>Jc});import nt from"path";import{fileURLToPath as Vc}from"url";import{serveStatic as ot}from"@hono/node-server/serve-static";import{zValidator as Qc}from"@hono/zod-validator";import{Hono as Wc}from"hono";import{cors as Yc}from"hono/cors";import{logger as zc}from"hono/logger";import{prettyJSON as Gc}from"hono/pretty-json";var at,Jc,is=f(()=>{"use strict";X();Ko();pa();_r();Lr();Pr();rs();at=()=>{if(process.env.NODE_ENV==="development")return nt.resolve(process.cwd(),"../core/dist");let t=nt.dirname(Vc(import.meta.url));return nt.resolve(t,"./core-dist")},Jc=()=>({app:new Wc({strict:!1}).use("/*",Yc()).use(Gc({space:2})).use(process.env.NODE_ENV==="development"?zc():(e,o)=>o()).use("/favicon.ico",ot({path:nt.resolve(at(),"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(Ho).route("/",Dr).route("/",ua).use("/assets/*",ot({root:at()})).use("/image.png",ot({root:at()})).use("/:dbType/*",Qc("param",Zt,jo)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",ns).route("/:dbType",Or).route("/:dbType",xr).use("/*",ot({root:at()}))})});Pe();import{intro as Xc,outro as Zc}from"@clack/prompts";import{serve as el}from"@hono/node-server";import Lt from"picocolors";import{program as Bt}from"commander";var Ht=()=>(Bt.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),Bt.opts());import{readFile as ms}from"fs/promises";import{resolve as us}from"path";import{cancel as Ie,isCancel as st,note as jt,select as ps,spinner as ds,text as Kt}from"@clack/prompts";import{parse as fs}from"dotenv";import it from"picocolors";var Vt=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let a=ds();a.start("Looking for database connection..."),t?jt(it.red(`${o} not found in .env or process.env`)):jt(it.red(`No .env file found and ${o} not set in process.env`));let n=await ps({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((st(n)||n==="cancel")&&(Ie("No database connection provided. Exiting..."),process.exit(0)),n==="other-env"){a.start("Waiting for path...");let i=await Kt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});st(i)&&(Ie("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=us(i);try{let s=await ms(c,"utf-8"),l=fs(s);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(s){let l=s;Ie(`Cannot read or parse file: ${it.dim(l.message)}`),process.exit(1)}}a.stop("Manual input...");let r=await Kt({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 st(r)&&(Ie("Cancelled."),process.exit(0)),r.trim()};import{access as bs,readFile as ys}from"fs/promises";import{dirname as gs,resolve as ct}from"path";import{parse as Ts}from"dotenv";var Es=async t=>{let e=ct(t);for(;;){let o=ct(e,".env");try{return await bs(o),o}catch{}let a=gs(e);if(a===e)return null;e=a}},pe=async t=>{let e;if(t?e=ct(t):e=await Es(process.cwd()),!e)return null;try{let o=await ys(e,"utf-8");return Ts(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};rt();import{intro as hs,outro as Cs}from"@clack/prompts";import Qt from"picocolors";var Wt=()=>{hs(Qt.inverse(" db-studio ")),Cs(Qt.green(`For more information, visit: ${Ut.SITE_DOCS_LINK}`))};Pe();import{intro as Ss,note as Ns,outro as Yt}from"@clack/prompts";import $e from"picocolors";var zt=async(t,e,o)=>{Ss($e.inverse(" db-studio "));let a=o||se.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?Yt($e.green(`\u2713 Database connection configured (using ${a})`)):(Ns($e.red(`\u2717 ${a} not found`),"Status"),Yt($e.yellow("\u26A0 No database connection configured")))};import{intro as As,outro as ws}from"@clack/prompts";import Jt from"picocolors";var Gt={name:"db-studio",type:"module",version:"1.7.5",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 Xt=()=>{As(Jt.inverse(" db-studio ")),ws(Jt.green(`\u{1F680} db-studio v${Gt.version}`))};var tl=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:i}=Ht();r&&(Wt(),process.exit(0)),i&&(Xt(),process.exit(0)),n&&(await zt(t,o,a),process.exit(0)),Xc(Lt.inverse(" db-studio "));let c=e?parseInt(e,10):se.PORT,s=a||se.VAR_NAME,l=t?await pe(t):await pe(),m=o||await Vt(l,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(is(),ss)),{app:u}=p();el({fetch:u.fetch,port:c}),Zc(Lt.green(`Server running at ${Lt.cyan(`http://localhost:${c}`)}`))};tl().catch(t=>{process.exit(1)});export{tl as main};
718
+ `,{rows:l}=await r.query(s,[e,o]);if(!l[0]?.exists)throw new xt(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 xt(409,{message:`Column "${a}" already exists in table "${e}"`});await r.query(`ALTER TABLE "${e}" RENAME COLUMN "${o}" TO "${a}"`)}var ts=f(()=>{"use strict";h()});import{utils as Le,write as jc}from"xlsx";function os({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=Le.aoa_to_sheet(n),i=Le.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=Le.aoa_to_sheet(n),i=Le.book_new();Le.book_append_sheet(i,r,a.slice(0,31));let c=jc(i,{bookType:"xlsx",type:"buffer"});return new Uint8Array(c)}}}var as=f(()=>{"use strict"});import{zValidator as L}from"@hono/zod-validator";import{Hono as Kc}from"hono";var ns,rs=f(()=>{"use strict";X();qr();Ur();xe();Hr();Vr();Yr();Jr();Zr();ts();as();ns=new Kc().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",ho),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",wo),L("param",ee),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",ao),L("param",K),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",ee),L("json",G),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 Wr({tableName:o,db:e,...a}):n==="mongodb"?await Br({tableName:o,db:e,...a}):await $r({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",K),L("json",pt),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 Xr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await jr({tableName:o,columnName:a,db:e,...n}):await es({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",K),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 Gr({tableName:o,columnName:a,db:e,...n}):r==="mongodb"?await Kr({tableName:o,columnName:a,db:e,...n}):await vr({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",ee),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",ee),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",ee),L("query",$o),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",ee),L("query",Lo),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=os({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 ss={};Pt(ss,{createServer:()=>Jc});import nt from"path";import{fileURLToPath as Vc}from"url";import{serveStatic as ot}from"@hono/node-server/serve-static";import{zValidator as Qc}from"@hono/zod-validator";import{Hono as Wc}from"hono";import{cors as Yc}from"hono/cors";import{logger as zc}from"hono/logger";import{prettyJSON as Gc}from"hono/pretty-json";var at,Jc,is=f(()=>{"use strict";X();Ko();pa();_r();Lr();Pr();rs();at=()=>{if(process.env.NODE_ENV==="development")return nt.resolve(process.cwd(),"../core/dist");let t=nt.dirname(Vc(import.meta.url));return nt.resolve(t,"./core-dist")},Jc=()=>({app:new Wc({strict:!1}).use("/*",Yc()).use(Gc({space:2})).use(process.env.NODE_ENV==="development"?zc():(e,o)=>o()).use("/favicon.ico",ot({path:nt.resolve(at(),"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(Ho).route("/",Dr).route("/",ua).use("/assets/*",ot({root:at()})).use("/image.png",ot({root:at()})).use("/:dbType/*",Qc("param",Zt,jo)).use("/:dbType/*",async(e,o)=>{let a=e.req.param("dbType");e.set("dbType",a),await o()}).route("/:dbType",ns).route("/:dbType",Or).route("/:dbType",xr).use("/*",ot({root:at()}))})});Pe();import{intro as Xc,outro as Zc}from"@clack/prompts";import{serve as el}from"@hono/node-server";import Lt from"picocolors";import{program as Bt}from"commander";var Ht=()=>(Bt.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),Bt.opts());import{readFile as ms}from"fs/promises";import{resolve as us}from"path";import{cancel as Ie,isCancel as st,note as jt,select as ps,spinner as ds,text as Kt}from"@clack/prompts";import{parse as fs}from"dotenv";import it from"picocolors";var Vt=async(t,e)=>{let o=e||"DATABASE_URL";if(t?.[o])return t[o];if(process.env[o])return process.env[o];let a=ds();a.start("Looking for database connection..."),t?jt(it.red(`${o} not found in .env or process.env`)):jt(it.red(`No .env file found and ${o} not set in process.env`));let n=await ps({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((st(n)||n==="cancel")&&(Ie("No database connection provided. Exiting..."),process.exit(0)),n==="other-env"){a.start("Waiting for path...");let i=await Kt({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(s){if(!s?.trim())return"Path is required"}});st(i)&&(Ie("Cancelled."),process.exit(0)),a.stop("Trying custom .env...");let c=us(i);try{let s=await ms(c,"utf-8"),l=fs(s);if(l[o])return l[o];throw new Error(`${o} still missing in custom file`)}catch(s){let l=s;Ie(`Cannot read or parse file: ${it.dim(l.message)}`),process.exit(1)}}a.stop("Manual input...");let r=await Kt({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 st(r)&&(Ie("Cancelled."),process.exit(0)),r.trim()};import{access as bs,readFile as ys}from"fs/promises";import{dirname as gs,resolve as ct}from"path";import{parse as Ts}from"dotenv";var Es=async t=>{let e=ct(t);for(;;){let o=ct(e,".env");try{return await bs(o),o}catch{}let a=gs(e);if(a===e)return null;e=a}},pe=async t=>{let e;if(t?e=ct(t):e=await Es(process.cwd()),!e)return null;try{let o=await ys(e,"utf-8");return Ts(o)}catch(o){if(o instanceof Error&&o.message.includes("ENOENT"))return null;throw o}};rt();import{intro as hs,outro as Cs}from"@clack/prompts";import Qt from"picocolors";var Wt=()=>{hs(Qt.inverse(" db-studio ")),Cs(Qt.green(`For more information, visit: ${Ut.SITE_DOCS_LINK}`))};Pe();import{intro as Ss,note as Ns,outro as Yt}from"@clack/prompts";import $e from"picocolors";var zt=async(t,e,o)=>{Ss($e.inverse(" db-studio "));let a=o||se.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?Yt($e.green(`\u2713 Database connection configured (using ${a})`)):(Ns($e.red(`\u2717 ${a} not found`),"Status"),Yt($e.yellow("\u26A0 No database connection configured")))};import{intro as As,outro as ws}from"@clack/prompts";import Jt from"picocolors";var Gt={name:"db-studio",type:"module",version:"1.7.6",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 Xt=()=>{As(Jt.inverse(" db-studio ")),ws(Jt.green(`\u{1F680} db-studio v${Gt.version}`))};var tl=async()=>{let{env:t,port:e,databaseUrl:o,varName:a,status:n,help:r,version:i}=Ht();r&&(Wt(),process.exit(0)),i&&(Xt(),process.exit(0)),n&&(await zt(t,o,a),process.exit(0)),Xc(Lt.inverse(" db-studio "));let c=e?parseInt(e,10):se.PORT,s=a||se.VAR_NAME,l=t?await pe(t):await pe(),m=o||await Vt(l,s);process.env.DATABASE_URL=m;let{createServer:p}=await Promise.resolve().then(()=>(is(),ss)),{app:u}=p();el({fetch:u.fetch,port:c}),Zc(Lt.green(`Server running at ${Lt.cyan(`http://localhost:${c}`)}`))};tl().catch(t=>{process.exit(1)});export{tl as main};
719
719
  //# sourceMappingURL=index.js.map