db-studio 1.7.11 → 1.7.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core-dist/assets/_pathlessLayout-XL9BaZh5.js +2 -0
- package/dist/core-dist/assets/{_queryId-BuwY4WmY.js → _queryId-CAjVLs-F.js} +1 -1
- package/dist/core-dist/assets/{_table-D8MYcfMf.js → _table-BI_XiC1K.js} +1 -1
- package/dist/core-dist/assets/_table-DKnSwqFc.js +10 -0
- package/dist/core-dist/assets/{cdoe-editor-DT99U124.js → cdoe-editor-Lwkji0wU.js} +1 -1
- package/dist/core-dist/assets/{chat-sidebar-_z_c1b34.js → chat-sidebar-DTwB3fym.js} +2 -2
- package/dist/core-dist/assets/{dist-lZgQTehN.js → dist-C6mIPWhR.js} +1 -1
- package/dist/core-dist/assets/{dist-DZQDOYlI.js → dist-UBwYqP_w.js} +1 -1
- package/dist/core-dist/assets/index-B8u-3J3b.js +57 -0
- package/dist/core-dist/assets/index-Bv_0Afnk.css +2 -0
- package/dist/core-dist/assets/{queries.store-D-hvraJW.js → queries.store-BTgqNNws.js} +1 -1
- package/dist/core-dist/assets/{runner-D2QKCRKR.js → runner-CJikZjx7.js} +1 -1
- package/dist/core-dist/assets/{runner-tab-BgDrAAsO.js → runner-tab-CSDL4L8O.js} +3 -3
- package/dist/core-dist/assets/{scroll-area-XVOss7Ty.js → scroll-area-CnrU1Pgb.js} +1 -1
- package/dist/core-dist/assets/{tooltip-CFEia1PZ.js → tooltip-DttVuH4f.js} +1 -1
- package/dist/core-dist/assets/{use-delete-column-B78zy_1_.js → use-delete-column-CA96Lesz.js} +1 -1
- package/dist/core-dist/assets/{use-rate-limit-FcN06qzk.js → use-rate-limit-B1ivFudi.js} +1 -1
- package/dist/core-dist/index.html +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/core-dist/assets/_pathlessLayout-DtaYfYwJ.js +0 -2
- package/dist/core-dist/assets/_table-dqCYe5jr.js +0 -10
- package/dist/core-dist/assets/index-D9Wxg2ot.js +0 -57
- package/dist/core-dist/assets/index-fMzwkmHJ.css +0 -2
package/dist/core-dist/assets/{use-delete-column-B78zy_1_.js → use-delete-column-CA96Lesz.js}
RENAMED
|
@@ -1 +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{
|
|
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{Et as f,Ot as j,ot as R,rt as d,st as D}from"./index-B8u-3J3b.js";import{t as E}from"./format-cell-value-DyKHFyYf.js";var m=p(w(),1),l=S(),_=({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(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)(_,{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))})},M=({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)(M,{table:C({data:t,columns:e,getCoreRowModel:y(),enableColumnResizing:!0,columnResizeMode:"onChange"})}),O=()=>{const e=b(),{selectedDatabase:t}=R(),{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 D.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})=>j.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,_ as r,O as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{y as a}from"./tanstack-CJpNvQIy.js";import{
|
|
1
|
+
import{y as a}from"./tanstack-CJpNvQIy.js";import{ct as m}from"./index-B8u-3J3b.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,7 +5,7 @@
|
|
|
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-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-B8u-3J3b.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">
|
|
@@ -14,7 +14,7 @@
|
|
|
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-
|
|
17
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Bv_0Afnk.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body>
|
|
20
20
|
<div id="root"></div>
|
package/dist/index.js
CHANGED
|
@@ -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.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};
|
|
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.12",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
|