mngr
Version:
Command-line cross-platform databases management TUI tool
25 lines (19 loc) • 32.7 kB
JavaScript
var Mt={focus:null,sql:"",status:"",databases:[],database:0,tables:[],table:0,count:0,cols:[],rows:[],palette:{dark0:"#282828",dark1:"#3c3836",dark2:"#504945",dark3:"#665c54",light1:"#ebdbb2",light4:"#a89984"}},kt={setFocus(m,t=null){return{...m,focus:t}},setSql(m,t=""){return{...m,sql:t}},setStatus(m,t=""){return{...m,status:t}},setDatabases(m,t=[]){return{...m,databases:t}},setDatabase(m,t=0){return{...m,database:t}},setTables(m,t=[]){return{...m,tables:t}},setTable(m,t=0){return{...m,table:t}},setCols(m,t=[]){return{...m,cols:t}},setRows(m,t=[]){return{...m,rows:t}},setCount(m,t=0){return{...m,count:t}}};import{useSyncExternalStore as ne}from"react";var re=m=>{let t=m,e=new Set;return{getState:()=>t,dispatch:(n,r)=>{t=kt[n](t,r),e.forEach(s=>s(t))},subscribe:n=>(e.add(n),()=>e.delete(n))}},ut=re(Mt),x=(m=t=>t)=>ne(ut.subscribe,()=>m(ut.getState())),y=ut.dispatch;import H,{useMemo as se}from"react";import{Separator as oe,Text as J,useSize as ie}from"react-curse";function dt(){let{width:m}=ie(),t=x(r=>r.focus),e=x(r=>r.palette),n=se(()=>{switch(t){case"sidebar":case"sidebar/create":case"sidebar/edit":case"sidebar/search":return[["Enter, Tab","jump to rows"],["A","create table"],["rn","rename table"],["dD","delete table"],["/","search"],["n","next occurrence"]];case"main":case"main/edit":return[["i","preview"],["Tab","jump to tables"],["E, Enter","edit selected"],["A, Y","insert, duplicate selected"],["dD","delete selected"],["[, ]","prev, next page"],["-, =, _, +","sort, add sort"],["r, Backspace","reload, reset"],["Space, uv","mark row, unmark all"],["C-a, C-x","inrement, decrement"],[".","relation jump"],["/","search"]];case"main/search":return[[":","like"],["=","equals"]]}},[t]);return n?H.createElement(J,{absolute:!0,y:`100%-${n.length+3}`,x:0,height:n.length+1,width:"100%",clear:!0},H.createElement(oe,{type:"horizontal",width:m,color:e.dark1}),H.createElement(J,{y:0,x:16,color:e.dark1,block:!0},"\u2534"),n.map(([r,s])=>H.createElement(J,{key:r,block:!0},H.createElement(J,{x:1},r.split(", ").map((i,o)=>H.createElement(J,{key:i},H.createElement(J,{dim:!0,bold:!0},i),o<r.split(", ").length-1&&", ")))," \u2192"+" ".repeat(Math.max(0,14-r.length))+s))):null}import{readFile as ae,writeFile as ce}from"fs/promises";var Q=class{#n;constructor(t){this.#n=t}#r(t){return Array.isArray(t)&&(t.length===0||t.find(e=>typeof e=="object"))}async#t(){try{let t=await ae(this.#n,"utf8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return await this.#e({}),{};if(t instanceof SyntaxError)process.exit();else throw t}}#e(t){return ce(this.#n,JSON.stringify(t,null,2))}async tables(){let t=await this.#t(),e=Object.entries(t),n=e.filter(([,s])=>this.#r(s)),r=n.map(([s])=>s).sort((s,i)=>s.localeCompare(i));return e.length>n.length?[".",...r]:r}cols(t,e){let n={};return e?.forEach(r=>Object.entries(r).forEach(([s,i])=>{let o="string";typeof i=="number"?o="number":typeof i=="boolean"?o="boolean":Array.isArray(i)?o="array":typeof i=="object"&&(o="object"),n[s]===void 0&&(n[s]=o)})),Object.entries(n).map(([r,s])=>({name:r,type:s}))}async rows(t,e={},n={},r=0,s=100){if(!t)return["",0,[],[]];let i=`db.${t}(${JSON.stringify(e)}).sort(${JSON.stringify(n)})`.replace(".sort({})",""),o=await this.#t(),u;t==="."?(u=[Object.fromEntries(Object.entries(o).filter(([,a])=>!this.#r(a)))],i=i.substring(0,2)+i.substring(4)):u=o[t];let f=u.length;Object.keys(e).length>0&&Object.entries(e).forEach(([a,g])=>{u=u.filter(g.$regex?l=>new RegExp(g.$regex,"i").test(l[a]):l=>g===l[a])}),Object.keys(n).length>0&&Object.entries(n).reverse().forEach(([a,g])=>{u=u.sort((l,E)=>l[a]===E[a]?0:l[a]>E[a]?g:g*-1)}),u=u.filter((a,g)=>g>=r&&g<r+s);let d=this.cols(t,u);return[i,f,u,d]}id(){return"id"}types(){return{array:{icon:"\uEA8A",color:"Red"},boolean:{icon:"\uEAE8",color:"Red"},number:{icon:"\uEA90",color:"Magenta"},object:{icon:"\uE60B",color:"Red"},string:{icon:"\uEB69",color:"Yellow"}}}format(t,e){let n=Object.fromEntries(t.map(({name:r,type:s})=>[r,s]));return e.map(r=>Object.fromEntries(Object.entries(r).map(([s,i])=>(["object","array"].includes(n[s])&&(i=JSON.stringify(i)),[s,i]))))}#s(t,e){let n=Object.fromEntries(t.map(({name:r,type:s})=>[r,s]));return Object.fromEntries(Object.entries(e).map(([r,s])=>(n[r]==="number"?s=parseInt(s)||0:n[r]==="boolean"&&(s=s.toString().toLowerCase()==="true"),[r,s])))}async template(t,e,n){return n?n.map(r=>Object.fromEntries(Object.entries(r).filter(([s])=>s!==this.id()))):[{}]}async insert(t,e,n){if(t===".")return null;let r=await this.#t(),s=n.map(i=>{if(!i[this.id()]){let o=r[t].reduce((u,{id:f})=>Math.max(u,f),0)+1;delete i[this.id()],i={id:o,...i}}return r[t].find(({id:o})=>o.toString()===i[this.id()].toString())?null:(r[t].push(this.#s(e,i)),i[this.id()].toString())});return await this.#e(r),s}async update(t,e,n,r){let s=await this.#t();if(t==="."){let i=Object.fromEntries(Object.entries(s).filter(([,o])=>this.#r(o)));return await this.#e({...this.#s(e,n[0]),...i}),"."}else return r.forEach((i,o)=>{let u=s[t].findIndex(({id:f})=>f===i[this.id()]);if(u===-1)return!1;s[t][u]=this.#s(e,n[o])}),await this.#e(s),r.map(i=>i[this.id()].toString())}async delete(t,e,n){if(t===".")return null;Array.isArray(n)||(n=[n]);let r=await this.#t();return r[t]=r[t].filter(s=>!n.includes(s[this.id()])),await this.#e(r),n.map(s=>s.toString())}async createTable(t){if(t===".")return!1;let e=await this.#t();return e[t]!==void 0?!1:(e[t]=[],await this.#e(e),!0)}async renameTable(t,e){if(t==="."||t===e)return!1;let n=await this.#t();return n[t]===void 0||n[e]!==void 0?!1:(n[e]=n[t],delete n[t],await this.#e(n),!0)}async dropTable(t){if(t===".")return!1;let e=await this.#t();return e[t]===void 0?!1:(delete e[t],await this.#e(e),!0)}};import le from"mariadb";var v=class{constructor(t){this.db=le.createPool(`mariadb://root@${t}`)}async tables(){return(await this.db.query("SHOW TABLES")).map(e=>Object.values(e)[0])}async cols(t){return(await this.db.query(`SHOW COLUMNS FROM ${t}`)).map(({Field:n,Type:r,Key:s})=>({name:n,type:r,pk:s==="PRI"?1:0}))}async rows(t,e={},n={},r=0,s=100){let i=await this.db.query(`SELECT COUNT(*) FROM ${t}`),o=parseInt(i?.[0]?.["COUNT(*)"]??0),u=`SELECT * FROM ${t}${Object.keys(e).length>0?` WHERE ${Object.entries(e).map(([d,a])=>a.$regex?`${d} LIKE '%${a.$regex}%'`:`${d} = '${a}'`).join(" AND ")}`:""}${Object.keys(n).length>0?` ORDER BY ${Object.entries(n).map(([d,a])=>`${d} ${a===1?"ASC":"DESC"}`).join(", ")}`:""}${o>s?` LIMIT ${s}`:""}${r>0?` OFFSET ${r}`:""}`,f=await this.db.query(u);return[u,o,f,void 0]}id(t){return t.find(({pk:e})=>e===1)?.name??"id"}types(){return{char:{icon:"\uEB69",color:"Yellow"},date:{icon:"\uEAB0",color:"Red"},decimal:{icon:"\uEA90",color:"Magenta"},int:{icon:"\uEA90",color:"Magenta"},tinyint:{icon:"\uEA90",color:"Magenta"},varchar:{icon:"\uEB69",color:"Yellow"}}}format(t,e){return e}async template(t,e,n){let r=this.id(e),s=await this.db.query(`SELECT ${r} FROM ${t} ORDER BY ${r} DESC LIMIT 1`),i=parseInt(s?.[0]?.[r]||0);return(n||[{}]).map(o=>Object.fromEntries(e.map(u=>[u.name,u.name===r?++i:o[u.name]])))}async insert(t,e,n){let r=[];for(let s of n){let i=await this.db.query(`INSERT INTO ${t} VALUES (${Object.keys(s).map(()=>"?").join(", ")})`,[...Object.values(s)]);r.push(i.insertId.toString())}return r}async update(t,e,n,r){let s=this.id(e),i=[];for(let o in n){let u=n[o],f=r[o],d=f[s],a=Object.keys(f).map(l=>f[l].toString()!==u[l].toString()&&[l,u[l]]).filter(l=>l),g=Object.fromEntries(a);await this.db.query(`UPDATE ${t} SET ${Object.keys(g).map(l=>l+" = ?")} WHERE ${s} = ?`,[...Object.values(g),d]),i.push(d.toString())}return i}async delete(t,e,n){let r=this.id(e);return Array.isArray(n)||(n=[n]),await this.db.query(`DELETE FROM ${t} WHERE (${r}) IN (?)`,[n]),n.map(s=>s.toString())}async createTable(t){try{return await this.db.query(`CREATE TABLE ${t} (id INT AUTO_INCREMENT PRIMARY KEY)`),!0}catch{return!1}}async renameTable(t,e){try{return await this.db.query(`ALTER TABLE ${t} RENAME TO ${e}`),!0}catch{return!1}}async dropTable(t){try{return await this.db.query(`DROP TABLE ${t}`),!0}catch{return!1}}};import{MongoClient as ue,ObjectId as It}from"mongodb";var tt=class{constructor(t){let[e,n]=t.split("/",2),r=new ue(`mongodb://${e}`);r.connect(),this.db=r.db(n)}async tables(){return(await this.db.listCollections().toArray()).map(({name:e})=>e).sort((e,n)=>e.localeCompare(n))}cols(t,e){let n={};return e?.forEach(r=>Object.entries(r).forEach(([s,i])=>{let o="string";typeof i=="object"?i instanceof It?o="id":i instanceof Date?o="datetime":o="object":typeof i=="number"?o="number":typeof i=="boolean"&&(o="boolean"),n[s]===void 0&&(n[s]=o)})),Object.entries(n).map(([r,s])=>({name:r,type:s}))}async rows(t,e={},n={},r=0,s=100){if(!t)return["",0,[],[]];let i=await this.db.collection(t).countDocuments(),o=`db.${t}.find(${JSON.stringify(e)})${Object.keys(n).length>0?`.sort(${JSON.stringify(n)})`:""}${r>0?`.skip(${r})`:""}${i>s?`.limit(${s})`:""}`;e=Object.fromEntries(Object.entries(e).map(([d,a])=>(d&&(a=new It(a.$regex?a.$regex:a)),a.$regex&&(a={$regex:new RegExp(a.$regex,"i")}),[d,a])));let u=await this.db.collection(t).find(e).sort(n).skip(r).limit(s).toArray(),f=this.cols(t,u);return[o,i,u,f]}id(){return"_id"}types(){return{array:{icon:"\uEA8A",color:"Red"},boolean:{icon:"\uEAE8",color:"Red"},datetime:{icon:"\uEAB0",color:"Red"},id:{icon:"\uEA90",color:"Magenta"},number:{icon:"\uEA90",color:"Magenta"},object:{icon:"\uE60B",color:"Red"},string:{icon:"\uEB69",color:"Yellow"}}}format(t,e){let n=Object.fromEntries(t.map(({name:r,type:s})=>[r,s]));return e.map(r=>Object.fromEntries(Object.entries(r).map(([s,i])=>(n[s]==="datetime"?i=i.toISOString():n[s]==="object"&&(i=JSON.stringify(i)),[s,i]))))}#n(t,e){let n=Object.fromEntries(t.map(({name:r,type:s})=>[r,s]));return Object.fromEntries(Object.entries(e).map(([r,s])=>(n[r]==="number"?s=parseInt(s)||0:n[r]==="datetime"?s=new Date(s):n[r]==="object"?s=JSON.parse(s):n[r]==="boolean"?s=s.toString().toLowerCase()==="true":s.toString().toLowerCase()==="null"&&(s=null),[r,s])))}async template(t,e,n){return n?n.map(r=>Object.fromEntries(Object.entries(r).filter(([s])=>s!==this.id()))):[{}]}async insert(t,e,n){let{insertedIds:r}=await this.db.collection(t).insertMany(n.map(s=>this.#n(e,s)));return Object.values(r).map(s=>s.toString())}async update(t,e,n,r){let s=[];for(let i in n){let o=n[i],u=r[i],{_id:f}=u,d=this.#n(e,Object.fromEntries(Object.entries(o).filter(([g])=>g!==this.id()).map(([g,l])=>u[g]!==l&&[g,l]).filter(g=>g))),a=this.#n(e,Object.fromEntries(Object.keys(u).filter(g=>g!==this.id()).map(g=>o[g]===void 0&&[g,1]).filter(g=>g)));await this.db.collection(t).updateOne({_id:f},{$set:d,$unset:a}),s.push(f.toString())}return s}async delete(t,e,n){return Array.isArray(n)?(await this.db.collection(t).deleteMany({_id:{$in:n}}),n.map(r=>r.toString())):(await this.db.collection(t).deleteOne({_id:n}),n.toString())}async createTable(t){try{return await this.db.createCollection(t),!0}catch{return!1}}async renameTable(t,e){try{return await this.db.renameCollection(t,e),!0}catch{return!1}}async dropTable(t){try{return await this.db.dropCollection(t),!0}catch{return!1}}};import{readFileSync as de}from"fs";var bt=class{constructor(){this.data={};this.parse()}async parse(){try{let t=de("prisma/schema.prisma"),n=String(t).matchAll(/model\s+(\w+)\s*{([^}]*)}/g);for(let[,r,s]of n){let i=s.split(`
`).map(o=>o.trim()).filter(Boolean).map(o=>o.replace(/^(\w+).*/,"$1"));this.data[r]=i}}catch{}}getCols(t){return this.data[t]??[]}},At=new bt;import be from"pg";var et=class{constructor(t){let e=new URL(`postgress://${t}`),[,n]=e.pathname.split("/",3);this.db=new be.Client({user:e.username,password:e.password,host:e.hostname,port:e.port?Number(e.port):void 0,database:n}),this.db.connect()}async databases(){let{rows:t}=await this.db.query("SELECT * FROM pg_catalog.pg_database");return t.map(e=>e.datname).sort((e,n)=>e.localeCompare(n))}async tables(){let{rows:t}=await this.db.query("SELECT * FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'");return t.map(e=>e.tablename).sort((e,n)=>e.localeCompare(n))}async cols(t){let{rows:e}=await this.db.query("SELECT * FROM information_schema.columns WHERE table_name = $1",[t]),n=e.map((s,i)=>({name:s.column_name,type:s.udt_name,pk:i===0?1:0})),r=At.getCols(t);return n.sort((s,i)=>r.indexOf(s.name)-r.indexOf(i.name))}async rows(t,e={},n={},r=0,s=100){let{rows:i}=await this.db.query(`SELECT COUNT(*) FROM "${t}"`),o=parseInt(i?.[0]?.count??0),u=`SELECT * FROM "${t}"${Object.keys(e).length>0?` WHERE ${Object.entries(e).map(([d,a])=>a.$regex?`"${d}" LIKE '%${a.$regex}%'`:`"${d}" = '${a}'`).join(" AND ")}`:""}${Object.keys(n).length>0?` ORDER BY ${Object.entries(n).map(([d,a])=>`"${d}" ${a===1?"ASC":"DESC"}`).join(", ")}`:" ORDER BY 1"}${o>s?` LIMIT ${s}`:""}${r>0?` OFFSET ${r}`:""}`,f=[];try{f=(await this.db.query(u)).rows}catch{}return u=u.replace(" ORDER BY 1",""),[u,o,f,void 0]}id(t){return t.find(e=>e.name==="id")?.name??t.find(e=>e.pk===1)?.name??"id"}types(){return{_float:{icon:"\uEA8A",color:"Magenta"},_int:{icon:"\uEA8A",color:"Magenta"},_text:{icon:"\uEA8A",color:"Yellow"},bool:{icon:"\uEAE8",color:"Red"},bytea:{icon:"\uE60B",color:"Magenta"},date:{icon:"\uEAB0",color:"Red"},float:{icon:"\uEA90",color:"Magenta"},int:{icon:"\uEA90",color:"Magenta"},text:{icon:"\uEB69",color:"Yellow"},timestamp:{icon:"\uEAB0",color:"Red"},varchar:{icon:"\uEB69",color:"Yellow"},jsonb:{icon:"\uE60B",color:"Magenta"}}}format(t,e){let n=Object.fromEntries(t.map(({name:r,type:s})=>[r,s]));return e.map(r=>Object.fromEntries(Object.entries(r).map(([s,i])=>(i!==null&&(["date","timestamp","timestamptz"].includes(n[s])?i=i.toISOString():["bytea","jsonb"].includes(n[s])?i=JSON.stringify(i):n[s]==="bool"&&(i=i.toString().toLowerCase()==="true")),[s,i]))))}async template(t,e,n){let r=this.id(e),{rows:s}=await this.db.query(`SELECT "${r}" FROM "${t}" ORDER BY "${r}" DESC LIMIT 1`),i=parseInt(s?.[0]?.[r]||0);return(n||[{}]).map(o=>Object.fromEntries(e.map(u=>[u.name,u.name===r?++i:o[u.name]])))}async insert(t,e,n){let r=this.id(e),s=[];for(let i of n){let{rows:o}=await this.db.query(`INSERT INTO "${t}" VALUES (${Object.keys(i).map((u,f)=>`$${f+1}`).join(", ")}) RETURNING "${r}"`,Object.values(i));s.push(o?.[0]?.[r]?.toString())}return s}async update(t,e,n,r){let s=[];for(let i in n){let o=n[i],u=r[i],f=this.id(e),d=u[f],a=Object.keys(u).map(l=>u[l]?.toString()!==o[l]?.toString()&&[l,o[l]||null]).filter(l=>l),g=Object.fromEntries(a);a.length>0&&(await this.db.query(`UPDATE "${t}" SET ${Object.keys(g).map((l,E)=>`"${l}" = $${E+1}`)} WHERE "${f}" = ${d}`,Object.values(g)),s.push(d.toString()))}return s}async delete(t,e,n){let r=this.id(e);return Array.isArray(n)||(n=[n]),await this.db.query(`DELETE FROM "${t}" WHERE "${r}" IN (${n.map((s,i)=>`$${i+1}`).join(", ")})`,n),n.map(s=>s.toString())}async createTable(t){try{return await this.db.query(`CREATE TABLE "${t}" (id SERIAL PRIMARY KEY)`),!0}catch{return!1}}async renameTable(t,e){try{return await this.db.query(`ALTER TABLE "${t}" RENAME TO ${e}`),!0}catch{return!1}}async dropTable(t){try{return await this.db.query(`DROP TABLE "${t}"`),!0}catch{return!1}}};import me from"sqlite3";var{Database:fe}=me.verbose(),nt=class{constructor(t){this.db=new fe(t)}tables(){return new Promise((t,e)=>{this.db.all('SELECT name FROM sqlite_master WHERE type = "table"',(n,r)=>{if(n)return e(n);t(r.map(s=>s.name).sort((s,i)=>s.localeCompare(i)))})})}cols(t){return new Promise((e,n)=>{this.db.all(`PRAGMA table_info(${t})`,(r,s)=>{if(r)return n(r);let i=s.find(o=>o.pk===1)?[]:[{name:"rowid",type:"INTEGER",pk:1}];e([...i,...s])})})}async rows(t,e={},n={},r=0,s=100){let i=await new Promise((f,d)=>{this.db.get(`SELECT COUNT(*) FROM ${t}`,(a,g)=>{if(a)return d(a);f(g["COUNT(*)"])})}),o=`SELECT rowid, * FROM ${t}${Object.keys(e).length>0?` WHERE ${Object.entries(e).map(([f,d])=>d.$regex?`${f} LIKE '%${d.$regex}%'`:`${f} = '${d}'`).join(" AND ")}`:""}${Object.keys(n).length>0?` ORDER BY ${Object.entries(n).map(([f,d])=>`${f} ${d===1?"ASC":"DESC"}`).join(", ")}`:""}${i>s?` LIMIT ${s}`:""}${r>0?` OFFSET ${r}`:""}`,u=await new Promise(f=>{try{this.db.all(o,(d,a)=>{d&&f([]),f(a)})}catch{f([])}});return o=o.replace("SELECT rowid, ","SELECT ").replace(" ORDER BY id ASC",""),[o,i,u,void 0]}id(t){return t.find(({pk:e})=>e===1)?.name??"rowid"}types(){return{boolean:{icon:"\uEAE8",color:"Red"},datetime:{icon:"\uEAB0",color:"Red"},integer:{icon:"\uEA90",color:"Magenta"},integer_unsigned:{icon:"\uEA90",color:"Magenta"},numeric:{icon:"\uEA90",color:"Magenta"},nvarchar:{icon:"\uEB69",color:"Yellow"},text:{icon:"\uEB69",color:"Yellow"}}}format(t,e){return e}async template(t,e,n){return(n||[{}]).map(r=>Object.fromEntries(e.filter(s=>s.name!==this.id(e)).map(({name:s,type:i})=>[s,r[s]||(i==="INTEGER"?0:"")])))}async insert(t,e,n){let r=[];for(let s of n)try{let i=await new Promise(o=>{this.db.run(`INSERT INTO ${t} VALUES (${Object.keys(s).map(()=>"?").join(", ")})`,[...Object.values(s)],function(u){if(u)throw u;o(this.lastID.toString())})});r.push(i)}catch{return null}return r}async update(t,e,n,r){let s=[];for(let i in n){let o=n[i],u=r[i],f=u[Object.keys(u)[0]],d=Object.keys(u).map(a=>u[a].toString()!==o[a].toString()&&[a,o[a]]).filter(a=>a);try{let a=await new Promise(g=>{if(d.length<1)return g(null);let l=Object.fromEntries(d);this.db.run(`UPDATE ${t} SET ${Object.keys(l).map(E=>E+" = ?")} WHERE rowid = ?`,[...Object.values(l),f],E=>{if(E)throw E;g(f)})});a&&s.push(a)}catch{return null}}return s}delete(t,e,n){return Array.isArray(n)||(n=[n]),new Promise(r=>{let s=this.db.prepare(`DELETE FROM ${t} WHERE rowid = ?`);for(let i of n)s.run(i);s.finalize(i=>{if(i)return r(null);r(n.map(o=>o.toString()))})})}createTable(t){return new Promise(e=>{this.db.run(`CREATE TABLE ${t} (id INTEGER)`,n=>{if(n)return e(!1);e(!0)})})}renameTable(t,e){return new Promise(n=>{this.db.run(`ALTER TABLE ${t} RENAME TO ${e}`,r=>{if(r)return n(!1);n(!0)})})}dropTable(t){return new Promise(e=>{this.db.run(`DROP TABLE ${t}`,n=>{if(n)return e(!1);e(!0)})})}};var B={json:{db:Q,aliases:"js"},mariadb:{db:v,aliases:"mysql"},mongodb:{db:tt,aliases:"mongo"},postgresql:{db:et,aliases:["pg","postgres"]},sqlite:{db:nt,aliases:"sqlite3"}},qt,mt=m=>{let[t,e]=m.split("://",2);qt=new B[t].db(e)},rt=()=>qt;import Lt,{argv as ft}from"node:process";var C="";if(ft.length>2)if(C=ft[ft.length-1],!C.includes("://"))C.endsWith(".json")&&(C=`json://${C}`),(C.endsWith(".db")||C.endsWith(".sqlite")||C.endsWith("sqlite3"))&&(C=`sqlite://${C}`);else{let[m,t]=C.split("://",2);if(!Object.keys(B).includes(m)){let e=Object.values(B).findIndex(n=>n.aliases.includes(m));e>-1&&(C=`${Object.keys(B)[e]}://${t}`)}}C||(console.log(`USAGE:
mngr [URL]
EXAMPLES:
mngr db.json
mngr json://db.json
mngr mongodb:///db
mngr mongodb://localhost/db
mngr postgresql:///db
mngr postgresql://localhost/db
mngr mariadb:///db
mngr mariadb://localhost/db
mngr db.sqlite3
mngr sqlite://db.sqlite3
mngr sqlite://db.sqlite
mngr sqlite://db.db`),Lt.exit(0));(!C.includes("://")||!Object.keys(B).includes(C.split("://")[0]))&&(console.log("protocol not supported"),Lt.exit(0));var st=C;import Ft from"react";import{Text as Nt}from"react-curse";function gt(m){let t="x1b[0m"+JSON.stringify(m,(e,n)=>e.startsWith("$")?n:typeof n=="string"?{[`$${typeof n}`]:`x1b[Yellowm${n}x1b[0m`}:typeof n=="number"?{[`$${typeof n}`]:`x1b[Magentam${n}x1b[0m`}:typeof n=="boolean"?{[`$${typeof n}`]:`x1b[Magentam${n}x1b[0m`}:n,2).replace(/\{\s*"\$(string)":\s*"(.*?)"\s*\}/g,'"$2"').replace(/\{\s*"\$(number|boolean)":\s*"(.*?)"\s*\}/g,"$2").replace(/"([^"]+)":/g,"x1b[Redm$1x1b[0m:");return Ft.createElement(Nt,null,t.split("x1b[").map((e,n)=>{let[r]=e.split("m",2);return Ft.createElement(Nt,{key:n,color:r!=="0"?r:void 0},e.substring(r.length+1))}))}import{stat as Rt,writeFile as ge,readFile as ye,unlink as yt}from"node:fs/promises";import{tmpdir as pe}from"node:os";import{join as he}from"node:path";import Pt from"react-curse";var pt=m=>{let t=process.env.EDITOR||"vim",e=he(pe(),`mngr-${+new Date}.json`),n=JSON.stringify(m,void 0,2).split(`
`).map(r=>r.startsWith(" ")&&r.substring(1)).filter(r=>r).join(`
`);return new Promise(r=>{(async()=>{await ge(e,n);let s=(await Rt(e)).mtimeMs,i=async()=>{let o=(await Rt(e)).mtimeMs;if(s===o)return yt(e),r([]);let u=await ye(e,{encoding:"utf8"});if(u.length===0)return yt(e),r([]);try{let f=JSON.parse(`[${u.trim().replace(/},$/,"}")}]`);yt(e),r(f)}catch{Pt.spawnSync(t,[e],{stdio:"inherit"}),i()}};Pt.spawnSync(t,[e],{stdio:"inherit"}),i()})()})};import j,{useCallback as ht,useEffect as _t,useMemo as ot,useRef as we,useState as W}from"react";import{Text as k,Input as Yt,ListTable as Ee,View as je,useClipboard as $e,useInput as xe,useSize as Se,useMouse as Te}from"react-curse";var Ht=process.env.SEP_R1??"\uE0B2",wt=class{constructor(t,e={}){this.text=t,this.props=e}toString(){return this.text}},Oe=({item:m,widths:t})=>j.createElement(j.Fragment,null,m.map(({text:e,props:n},r)=>j.createElement(k,{key:r,...n,width:t[r]},e))),Ce=({focus:m,item:t,y:e,x:n,widths:r,index:s,pass:i})=>{let{selected:o,palette:u}=i,f=(d,a)=>d===void 0?"":d===null?"null":d.toString().length<=a?d.toString():j.createElement(k,null,d.toString().substring(0,a-1),j.createElement(k,{dim:!0},"~"));return j.createElement(k,{color:o.includes(s)?"Yellow":void 0,width:"100%"},t.map((d,a)=>j.createElement(k,{key:a,width:r[a],dim:d===null,color:e===s&&n===a?"Yellow":void 0,background:e===s&&m&&n===a?u.dark1:void 0},f(d,r[a]))))};function Et(){let{width:m,height:t}=Se(),e=rt(),[,n]=$e(),r=we({}),s=x(c=>c.focus),i=x(c=>c.status),o=x(c=>c.tables),u=x(c=>c.table),f=x(c=>c.count),d=x(c=>c.cols),a=x(c=>c.rows),g=x(c=>c.palette),[l,E]=W({y:0,x:0,yo:0,xo:0,x1:0,x2:0}),[h,A]=W({where:{},order:{},skip:0,limit:100}),[T,N]=W([]),[R,V]=W(null),[G,it]=W(null),[O,K]=W(""),[b,L]=W(""),q=c=>{let p=c.replace(/Id$/,"").replace(/_id$/,"").toLowerCase();return o.findIndex(w=>[p,`${p}s`,`${p}es`].includes(w.toLowerCase()))},U=ot(()=>d.map(({type:c,name:p})=>{let[w,$]=c.split(/[()]/),S=w.toLowerCase().replaceAll(" ","_").replace(/_^/,""),M=Object.entries(e.types()).find(([ee])=>S.startsWith(ee))?.[1],at=M?.icon||c,X=$||"",lt=M?.color,Z=h.order[p]!==void 0?` ${h.order[p]===1?"\uF0DE":"\uF0DD"}`:"",te=[-1,u].includes(q(p))?"":" \uEB15";return new wt(`${at}${X} ${p}${Z}${te}`,{color:lt})}),[d,h.order]),_=ot(()=>e.format?.(d,a)||a,[d,a]),F=ot(()=>_.map(c=>d.map(({name:p})=>c[p])),[_]),Tt=ot(()=>{let c=h.skip+F.length;return` ${f>0?`${h.skip+1}-`:""}${c}${c!==f?`/${f}`:""} `},[h.skip,F,f]),Ot=ot(()=>` ${l.y+1}:${l.x+1} `,[l.y,l.x]),Y=async()=>{let[c,p,w,$]=await e.rows(o[u],h.where,h.order,h.skip,h.limit);return y("setCount",p),y("setSql",c),y("setCols",$??await e.cols(o[u])),y("setRows",w),w},Wt=ht(c=>{a[c.y]!==void 0&&(E(c),y("setFocus","main/edit"))},[a]),Ut=()=>({initialValue:_[l.y][d[l.x].name]?.toString()||"",y:l.y-l.yo,x:l.x1-l.xo,width:l.x2-l.x1}),Jt=ht(c=>{(async()=>{y("setFocus","main");let p=a[l.y],w={...p,[d[l.x].name]:c},$=await e.update(o[u],d,[w],[p]);$.length!==0&&(y("setStatus",`"${$}" written`),Y())})()},[a,l,d,o,u]),zt=async()=>{if(a.length===0)return;let c=T.length>0?T.map($=>a[$]):[a[l.y]],p=await pt(c);if(p.length===0)return;let w=await e.update(o[u],d,p,c);w&&(y("setStatus",`"${w}" written`),Y(),T.length>0&&N([]))},Ct=async(c=!1)=>{if(c&&a.length===0)return;let p=c?T.length>0?T.map(M=>a[M]):[a[l.y]]:void 0,w=await e.template(o[u],d,p),$=await pt(w);if($.length===0)return;let S=await e.insert(o[u],d,$);S&&(y("setStatus",`"${S}" inserted`),Y(),T.length>0&&N([]))},Vt=()=>{N(T.includes(l.y)?T.filter(c=>c!==l.y):[...T,l.y]),E({...l,y:l.y+1})},Gt=()=>{if(a.length===0)return;it("dD");let c=e.id(d),p=T.length>0?T.map(w=>a[w][c]):[a[l.y][c]];y("setStatus",`Confirm deletion of: ${p.map(w=>`"${w}"`).join(", ")} ? (y/N)`)},Kt=async()=>{let c=e.id(d),p=a[l.y][c],w=await e.delete(o[u],d,T.length>0?T.map(M=>a[M][c]):p);if(!w)return;y("setStatus",`"${w}" deleted`);let S=(await Y()).findIndex(M=>M[c]===p);S>-1&&S!==l.y&&E({...l,y:S}),T.length>0&&N([])},Xt=()=>{if(!d[l.x])return;let{type:c,name:p}=d[l.x],w=["text"].includes(c)?":":"=";L(p?`/${p}${w}`:""),setTimeout(()=>y("setFocus","main/search"),0)},Zt=ht(c=>{y("setFocus","main");let p=c.match(/^\/([A-Za-z_]+)([:=])(.+)$/);if(p===null)return A({...h,where:{}});let[,w,$]=p,S=p[3];parseFloat(S).toString()===S&&(S=parseFloat(S)),A({...h,where:{...h.where,[w]:$===":"?{$regex:S}:S}})},[h]),Dt=async c=>{if(a.length===0||d.length===0||a[l.y][d[l.x].name]===void 0)return;let{name:p,type:w}=d[l.x],$=a[l.y],S=$[p],M;switch(w){case"boolean":{M=!S;break}case"number":{M=S+c;break}case"string":{let X;if(X=S.match(/(-?\d+[,.]?\d*)$/)){let[,lt]=X,{index:Z}=X;(Z===0||!S[Z-1].match(/[-\d,.]/))&&(M=S.substring(0,Z)+(parseFloat(lt)+c))}break}}if(M===void 0)return;let at=await e.update(o[u],d,[{...$,[p]:M}],[$]);at&&(y("setStatus",`"${at}" written`),Y())},Qt=()=>{if(a.length===0||d.length===0||a[l.y][d[l.x].name]===void 0)return;let{name:c}=d[l.x],w=a[l.y][c],$=q(c);$!==-1&&(y("setTable",$),r.current={where:{id:w}})},vt=()=>{if(a.length===0||d.length===0||a[l.y][d[l.x].name]===void 0)return;let c=n(a[l.y][d[l.x].name]);c&&y("setStatus",`${c.length} chars yanked`)};return _t(()=>{E({...l,y:0,x:0}),A({order:{},where:r.current?.where||{},skip:0,limit:100}),N([]),V(null),r.current&&(r.current={})},[o,u]),_t(()=>{o.length!==0&&Y()},[h]),xe(c=>{if(s==="main"){if(i&&y("setStatus"),G&&(it(null),["y","Y"].includes(c))){G==="dD"&&Kt();return}if(c.match(/\d/)){K(O+c);return}if(c===""&&Dt(parseInt(O)||1),c===""&&Dt((parseInt(O)||1)*-1),O===""&&["u","d"].includes(c))K(c);else if(O!==""){O==="u"&&c==="v"&&N([]),O==="d"&&c==="D"&&Gt(),O.match(/^\d+$/)&&(c==="k"&&E({...l,y:l.y-parseInt(O)}),c==="j"&&E({...l,y:l.y+parseInt(O)}),["g","G"].includes(c)&&E({...l,y:parseInt(O)-1})),K("");return}c==="-"&&F.length>0&&A({...h,order:{[d[l.x].name]:-1}}),c==="_"&&F.length>0&&A({...h,order:{...h.order,[d[l.x].name]:-1}}),c==="="&&F.length>0&&A({...h,order:{[d[l.x].name]:1}}),c==="+"&&F.length>0&&A({...h,order:{...h.order,[d[l.x].name]:1}}),c==="\x7F"&&A({order:{},where:{},skip:0,limit:100}),c===" "&&y("setFocus","sidebar"),c==="E"&&zt(),c==="r"&&Y(),c==="Y"&&Ct(!0),c==="i"&&V(R===null?a[l.y]:null),c==="\x1B"&&V(null),c==="["&&h.skip>0&&A({...h,skip:Math.max(0,h.skip-h.limit)}),c==="]"&&h.skip<f-h.limit&&A({...h,skip:Math.max(0,Math.min(f-a.length,h.skip+h.limit))}),c==="A"&&Ct(),c==="/"&&Xt(),c===" "&&Vt(),c==="."&&Qt(),c==="y"&&vt()}},[s,i,G,O,d,l,a,h,R,f]),Te(c=>{["sidebar","main"].includes(s)&&["mousedown","wheeldown","wheelup"].includes(c.type)&&(c.y<1||c.y>t-3||c.x<=16||(s!=="main"&&y("setFocus","main"),c.type==="mousedown"&&E({...l,y:l.yo+Math.max(0,Math.min(t-5,c.y-2)),xm:c.x-16}),c.type==="wheelup"&&l.y>0&&E({...l,y:l.y-1}),c.type==="wheeldown"&&l.y<F.length&&E({...l,y:l.y+1})))},[s,l]),j.createElement(j.Fragment,null,!R&&F.length===0&&s==="main"&&j.createElement(k,{dim:!0},"empty"),!R&&F.length>0&&j.createElement(j.Fragment,null,j.createElement(Ee,{focus:s==="main",initialPos:l,head:U,renderHead:Oe,data:F,renderItem:Ce,width:m-16,height:t-3,pass:{selected:T,palette:g},scrollbarBackground:g.dark1,scrollbarColor:g.light4,onChange:E,onSubmit:Wt}),s==="main/edit"&&j.createElement(k,{y:1,x:0},j.createElement(Yt,{...Ut(),height:1,background:g.dark2,color:g.light1,onSubmit:Jt,onCancel:()=>y("setFocus","main")}))),R&&j.createElement(je,{focus:s==="main",width:m-16,height:t-3},gt(R)),j.createElement(k,{absolute:!0,y:"100%-2",x:`100%-${Tt.length+Ot.length+2}`,height:1,bold:!0},j.createElement(k,{background:g.dark1,color:g.dark2},Ht),j.createElement(k,{background:g.dark2,color:g.light1},Tt),j.createElement(k,{background:g.dark2,color:g.light4},Ht),j.createElement(k,{background:g.light4,color:g.dark0,bold:!0},Ot)),j.createElement(k,{absolute:!0,y:"100%-1",x:0,height:1},s!=="main/search"&&i,s==="main/search"&&j.createElement(Yt,{initialValue:b,onCancel:()=>y("setFocus","main"),onSubmit:Zt})),O&&j.createElement(k,{absolute:!0,y:"100%-1",x:"100%-11"},O))}import I,{useCallback as jt,useEffect as Bt,useMemo as De,useState as ct}from"react";import{Input as $t,Text as z,List as Me,useInput as ke,useMouse as Ie,useSize as Ae}from"react-curse";function xt(){let{height:m}=Ae(),t=rt(),e=x(b=>b.focus),n=x(b=>b.status),r=x(b=>b.tables),s=x(b=>b.table),i=x(b=>b.palette),[o,u]=ct({y:s,x:0,yo:0,xo:0,x1:0,x2:0}),[f,d]=ct(null),[a,g]=ct(""),[l,E]=ct([]),h=De(()=>Math.min(m-4,r.length),[m,r]),A=()=>{r.length!==0&&(s!==o.y&&y("setTable",o.y),y("setFocus","main"))},T=async()=>{y("setFocus","sidebar/create")},N=jt(b=>{(async()=>{if(y("setFocus","sidebar"),b=b.trim(),b===""||!await t.createTable(b))return;let q=await t.tables(),U=q.findIndex(_=>_===b);y("setTables",q),u({...o,y:U}),y("setTable",U),y("setFocus","main")})()},[]),R=()=>{r.length!==0&&y("setFocus","sidebar/edit")},V=jt(b=>{(async()=>{if(y("setFocus","sidebar"),b=b.trim(),b===""||!await t.renameTable(r[o.y],b))return;let q=await t.tables();y("setTables",q),y("setTable",o.y),y("setFocus","main")})()},[r,o.y]),G=()=>{r.length!==0&&(d("dD"),y("setStatus",`Confirm deletion of: "${r[o.y]}" ? (y/N)`))},it=async()=>{if(!await t.dropTable(r[o.y]))return;let L=await t.tables();y("setTables",L),o.y===s&&(y("setCols",[]),y("setRows",[]))},O=jt(b=>{if(b==="")return;let L=r.reduce((q,U,_)=>(U.toLowerCase().includes(b.toLowerCase())&&q.push(_),q),[]);L.length!==0&&(u({...o,y:L[0]}),E(L))},[r,o]),K=()=>{if(l.length<2)return;let b=[...l.slice(1),l[0]];u({...o,y:b[0]}),E(b)};return Bt(()=>{(async()=>{let b=await t.tables();y("setTables",b),e===null&&y("setFocus",b.length>0?"main":"sidebar")})()},[]),Bt(()=>{u({...o,y:s})},[s]),ke(b=>{if(e==="sidebar"){if(n&&y("setStatus"),f&&(d(null),["y","Y"].includes(b))){f==="dD"&&it();return}if(b.match(/\d/)){g(a+b);return}if(a===""&&["r","d"].includes(b))g(b);else if(a!==""){a==="r"&&b==="n"&&R(),a==="d"&&b==="D"&&G(),a.match(/^\d+$/)&&(b==="k"&&u({...o,y:o.y-parseInt(a)}),b==="j"&&u({...o,y:o.y+parseInt(a)}),["g","G"].includes(b)&&u({...o,y:parseInt(a)-1})),g("");return}[" ","\r"].includes(b)&&A(),b==="A"&&T(),b==="/"&&y("setFocus","sidebar/search"),b==="n"&&K()}},[e,n,f,a,A]),Ie(b=>{["sidebar","main"].includes(e)&&["mousedown","wheeldown","wheelup"].includes(b.type)&&(b.y<1||b.y>m-3||b.x>=16||(e!=="sidebar"&&y("setFocus","sidebar"),b.type==="mousedown"&&u({...o,y:o.yo+Math.max(0,Math.min(m-5,b.y-1))}),b.type==="wheelup"&&o.y>0&&u({...o,y:o.y-1}),b.type==="wheeldown"&&o.y<r.length&&u({...o,y:o.y+1})))},[e,o]),I.createElement(I.Fragment,null,r.length===0&&e==="sidebar"&&I.createElement(z,{dim:!0},"empty"),r.length>0&&I.createElement(I.Fragment,null,I.createElement(Me,{focus:e==="sidebar",initialPos:o,data:r,renderItem:({item:b,focus:L,selected:q})=>I.createElement(z,{color:q?"Green":void 0,background:q&&L?i.dark1:void 0,width:"100%"},"\uF0CE ",b),width:16,height:m-3,scrollbar:!1,scrollbarBackground:i.dark1,scrollbarColor:i.light4,onChange:u}),e==="sidebar/edit"&&I.createElement($t,{y:o.y,x:2,width:14,initialValue:r[o.y],height:1,background:i.dark2,color:i.light1,onSubmit:V,onCancel:()=>y("setFocus","sidebar")})),e==="sidebar/create"&&I.createElement(z,{y:h,x:0},I.createElement(z,null,"\uF9EB "),I.createElement($t,{width:14,height:1,background:i.dark2,color:i.light1,onSubmit:N,onCancel:()=>y("setFocus","sidebar")})),I.createElement(z,{absolute:!0,y:"100%-1",x:0,height:1},e==="sidebar/search"&&I.createElement($t,{onChange:O,onSubmit:()=>y("setFocus","sidebar"),onCancel:()=>y("setFocus","sidebar")})),a&&I.createElement(z,{absolute:!0,y:"100%-1",x:"100%-11"},a))}import D,{useMemo as qe,useState as Le}from"react";import St,{Text as P,Separator as Fe,useInput as Ne,useSize as Re}from"react-curse";mt(st);var Pe=()=>{let{height:m}=Re(),t=x(o=>o.focus),e=x(o=>o.sql),n=x(o=>o.palette),[r,s]=Le(!1),i=qe(()=>{let[o]=st.split("://",2);return{json:"\uE60B ",mariadb:"\uE704 ",mongodb:"\uE7A4 ",postgresql:"\uE76E ",sqlite:"\uE7C4 "}[o]},[st]);return Ne(o=>{[null,"sidebar","main"].includes(t)&&(o==="\r"&&St.exit(),o==="q"&&St.exit(),o==="?"&&s(u=>!u),o==="\x1B"&&r&&s(!1))},[t,r]),D.createElement(D.Fragment,null,D.createElement(P,{height:1,color:n.light4,background:n.dark1},D.createElement(P,{x:"100%-17",color:n.dark3},"press ",D.createElement(P,{bold:!0},"?")," for help"),D.createElement(P,{y:0,x:0})," "+i+st+" "),D.createElement(P,{y:"100%-2",x:0,height:1,color:n.light4,background:n.dark1}," \uEAB6 "+e),D.createElement(P,{y:1,x:0,height:"100%-3"},D.createElement(P,{width:16},D.createElement(xt,null)),D.createElement(Fe,{height:m-3,color:n.dark1}),D.createElement(P,null,D.createElement(Et,null))),r&&D.createElement(dt,null))};St.render(D.createElement(Pe,null));