drixio 1.1.3 → 1.1.5

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/cli.js CHANGED
@@ -9,7 +9,7 @@ var Jt=Object.defineProperty;var E=(s,a)=>()=>(s&&(a=s(s=0)),a);var L=(s,a)=>{fo
9
9
  `)+aa(` \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u255D \u2588\u2588\u2557 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D
10
10
  `)+oa(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D")))}function se(s,a){let r="\u2550".repeat(72);console.log(N.cyan(`
11
11
  \u2554${r}\u2557`));let o=72-s.length,e=Math.max(0,Math.floor(o/2)),n=Math.max(0,o-e),c=" ".repeat(e)+N.bold(N.white(s))+" ".repeat(n);console.log(N.cyan("\u2551")+c+N.cyan("\u2551")),console.log(N.cyan(`\u2560${"\u2550".repeat(72)}\u2563`));let i=(l,m)=>{let p=l.padEnd(12),u=` ${N.bold(p)}: ${m}`,d=` ${p}: `+m.replace(/\x1b\[[0-9;]*m/g,""),f=" ".repeat(Math.max(0,72-d.length));console.log(N.cyan("\u2551")+u+f+N.cyan("\u2551"))};for(let l of a)i(l.label,l.value);console.log(N.cyan(`\u255A${"\u2550".repeat(72)}\u255D`)),console.log(N.dim(` Use arrow keys to navigate \u2022 Enter to select \u2022 Ctrl+C to exit
12
- `))}function Fe(s){let a=" Lightweight Interactive TUI Database Client \u2022 v1.1.3 ",t="None",r="-",o="None";s.type==="unknown"?o=N.dim("No configuration found. Please run check to configure."):(t=s.type.toUpperCase(),r=s.targetUrl,o=s.source===".env"?"Loaded from project .env file":s.source==="auto-detected"?"Auto-detected local SQLite file":"Manual connection config"),se(a,[{label:"Database",value:t},{label:"Target",value:r.length>45?"..."+r.slice(-42):r},{label:"Source",value:o},{label:"Working Dir",value:process.cwd().length>45?"..."+process.cwd().slice(-42):process.cwd()}])}var J,Xt,Zt,ea,ta,aa,oa,Se=E(()=>{"use strict";J=(s,a,t)=>r=>`\x1B[38;2;${s};${a};${t}m${r}\x1B[39m`,Xt=J(0,255,255),Zt=J(0,230,245),ea=J(0,210,235),ta=J(0,188,220),aa=J(0,168,205),oa=J(0,148,188)});var $e,We=E(()=>{"use strict";$e=class{dbPath;db=null;constructor(a){this.dbPath=a}async getDb(){if(!this.db){if(!(await import("fs")).existsSync(this.dbPath))throw new Error(`Failed to found database file at: ${this.dbPath}`);let t=await import("sqlite");this.db=new t.DatabaseSync(this.dbPath)}return this.db}quoteIdentifier(a){return`"${a.replace(/"/g,'""')}"`}async getTables(){return(await this.getDb()).prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name;").all().map(r=>r.name)}async getSchema(a){let t=await this.getDb(),r=this.quoteIdentifier(a),e=t.prepare(`PRAGMA table_info(${r})`).all(),c=t.prepare(`PRAGMA foreign_key_list(${r})`).all();return e.map(i=>{let l=c.find(m=>m.from===i.name);return{name:i.name,type:i.type,isPk:i.pk>0,nullable:i.notnull===0,defaultValue:i.dflt_value!=null?String(i.dflt_value):void 0,fkTarget:l?{table:l.table,column:l.to}:void 0}})}async getIndexes(a){let t=await this.getDb(),r=this.quoteIdentifier(a),e=t.prepare(`PRAGMA index_list(${r})`).all(),n=[];for(let c of e){if(c.origin==="pk")continue;let l=t.prepare(`PRAGMA index_info(${this.quoteIdentifier(c.name)})`).all();n.push({name:c.name,columns:l.map(m=>m.name),isUnique:c.unique>0})}return n}async getData(a,t=50,r=0,o,e){let n=await this.getDb(),i=(await this.getSchema(a)).map(u=>u.name),l=`SELECT * FROM ${this.quoteIdentifier(a)}`;o&&(l+=` WHERE ${o}`),e&&(l+=` ORDER BY ${this.quoteIdentifier(e.col)} ${e.asc?"ASC":"DESC"}`),l+=` LIMIT ${t} OFFSET ${r}`;let p=n.prepare(l).all();return{columns:i,rows:p}}async query(a){let t=await this.getDb(),r=a.trim().toUpperCase();if(r.startsWith("SELECT")||r.startsWith("PRAGMA")||r.startsWith("EXPLAIN")||r.startsWith("WITH")){let n=t.prepare(a).all(),c=[];return n.length>0&&(c=Object.keys(n[0])),{columns:c,rows:n}}else return t.prepare(a).run(),{columns:["Result"],rows:[{Result:"Success"}]}}async executeSql(a){(await this.getDb()).exec(a)}async close(){this.db&&(this.db.close(),this.db=null)}async insert(a,t){if(t.length===0)return;let r=await this.getDb(),o=Object.keys(t[0]),e=o.map(l=>this.quoteIdentifier(l)).join(", "),n=o.map(()=>"?").join(", "),c=`INSERT INTO ${this.quoteIdentifier(a)} (${e}) VALUES (${n})`,i=r.prepare(c);for(let l of t){let m=o.map(p=>l[p]);i.run(...m)}}}});import na from"pg";var xe,je=E(()=>{"use strict";xe=class{client;connected=!1;constructor(a){this.client=new na.Client({connectionString:a})}async connectIfNecessary(){this.connected||(await this.client.connect(),this.connected=!0)}quoteIdentifier(a){return`"${a.replace(/"/g,'""')}"`}async getTables(){return await this.connectIfNecessary(),(await this.client.query(`
12
+ `))}function Ue(s){let a=" Lightweight Interactive TUI Database Client \u2022 v1.1.5 ",t="None",r="-",o="None";s.type==="unknown"?o=N.dim("No configuration found. Please run check to configure."):(t=s.type.toUpperCase(),r=s.targetUrl,o=s.source===".env"?"Loaded from project .env file":s.source==="auto-detected"?"Auto-detected local SQLite file":"Manual connection config"),se(a,[{label:"Database",value:t},{label:"Target",value:r.length>45?"..."+r.slice(-42):r},{label:"Source",value:o},{label:"Working Dir",value:process.cwd().length>45?"..."+process.cwd().slice(-42):process.cwd()}])}var J,Xt,Zt,ea,ta,aa,oa,Se=E(()=>{"use strict";J=(s,a,t)=>r=>`\x1B[38;2;${s};${a};${t}m${r}\x1B[39m`,Xt=J(0,255,255),Zt=J(0,230,245),ea=J(0,210,235),ta=J(0,188,220),aa=J(0,168,205),oa=J(0,148,188)});var $e,We=E(()=>{"use strict";$e=class{dbPath;db=null;constructor(a){this.dbPath=a}async getDb(){if(!this.db){if(!(await import("fs")).existsSync(this.dbPath))throw new Error(`Failed to found database file at: ${this.dbPath}`);let t=await import("sqlite");this.db=new t.DatabaseSync(this.dbPath)}return this.db}quoteIdentifier(a){return`"${a.replace(/"/g,'""')}"`}async getTables(){return(await this.getDb()).prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name;").all().map(r=>r.name)}async getSchema(a){let t=await this.getDb(),r=this.quoteIdentifier(a),e=t.prepare(`PRAGMA table_info(${r})`).all(),c=t.prepare(`PRAGMA foreign_key_list(${r})`).all();return e.map(i=>{let l=c.find(m=>m.from===i.name);return{name:i.name,type:i.type,isPk:i.pk>0,nullable:i.notnull===0,defaultValue:i.dflt_value!=null?String(i.dflt_value):void 0,fkTarget:l?{table:l.table,column:l.to}:void 0}})}async getIndexes(a){let t=await this.getDb(),r=this.quoteIdentifier(a),e=t.prepare(`PRAGMA index_list(${r})`).all(),n=[];for(let c of e){if(c.origin==="pk")continue;let l=t.prepare(`PRAGMA index_info(${this.quoteIdentifier(c.name)})`).all();n.push({name:c.name,columns:l.map(m=>m.name),isUnique:c.unique>0})}return n}async getData(a,t=50,r=0,o,e){let n=await this.getDb(),i=(await this.getSchema(a)).map(u=>u.name),l=`SELECT * FROM ${this.quoteIdentifier(a)}`;o&&(l+=` WHERE ${o}`),e&&(l+=` ORDER BY ${this.quoteIdentifier(e.col)} ${e.asc?"ASC":"DESC"}`),l+=` LIMIT ${t} OFFSET ${r}`;let p=n.prepare(l).all();return{columns:i,rows:p}}async query(a){let t=await this.getDb(),r=a.trim().toUpperCase();if(r.startsWith("SELECT")||r.startsWith("PRAGMA")||r.startsWith("EXPLAIN")||r.startsWith("WITH")){let n=t.prepare(a).all(),c=[];return n.length>0&&(c=Object.keys(n[0])),{columns:c,rows:n}}else return t.prepare(a).run(),{columns:["Result"],rows:[{Result:"Success"}]}}async executeSql(a){(await this.getDb()).exec(a)}async close(){this.db&&(this.db.close(),this.db=null)}async insert(a,t){if(t.length===0)return;let r=await this.getDb(),o=Object.keys(t[0]),e=o.map(l=>this.quoteIdentifier(l)).join(", "),n=o.map(()=>"?").join(", "),c=`INSERT INTO ${this.quoteIdentifier(a)} (${e}) VALUES (${n})`,i=r.prepare(c);for(let l of t){let m=o.map(p=>l[p]);i.run(...m)}}}});import na from"pg";var xe,je=E(()=>{"use strict";xe=class{client;connected=!1;constructor(a){this.client=new na.Client({connectionString:a})}async connectIfNecessary(){this.connected||(await this.client.connect(),this.connected=!0)}quoteIdentifier(a){return`"${a.replace(/"/g,'""')}"`}async getTables(){return await this.connectIfNecessary(),(await this.client.query(`
13
13
  SELECT tablename
14
14
  FROM pg_catalog.pg_tables
15
15
  WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'
@@ -55,7 +55,7 @@ var Jt=Object.defineProperty;var E=(s,a)=>()=>(s&&(a=s(s=0)),a);var L=(s,a)=>{fo
55
55
  AND t.relname = $1
56
56
  ORDER BY
57
57
  i.relname, a.attnum;
58
- `,[a])).rows,e=new Map;for(let n of o){if(n.is_primary)continue;let c=n.index_name;e.has(c)||e.set(c,{name:c,columns:[],isUnique:n.is_unique}),e.get(c).columns.push(n.column_name)}return Array.from(e.values())}async getData(a,t=50,r=0,o,e){await this.connectIfNecessary();let c=(await this.getSchema(a)).map(m=>m.name),i=`SELECT * FROM ${this.quoteIdentifier(a)}`;o&&(i+=` WHERE ${o}`),e&&(i+=` ORDER BY ${this.quoteIdentifier(e.col)} ${e.asc?"ASC":"DESC"}`),i+=" LIMIT $1 OFFSET $2";let l=await this.client.query(i,[t,r]);return{columns:c,rows:l.rows}}async query(a){await this.connectIfNecessary();let t=await this.client.query(a),r=[];return t.fields&&(r=t.fields.map(o=>o.name)),{columns:r,rows:t.rows||[]}}async executeSql(a){await this.connectIfNecessary(),await this.client.query(a)}async close(){this.connected&&(await this.client.end(),this.connected=!1)}async insert(a,t){if(t.length===0)return;await this.connectIfNecessary();let r=Object.keys(t[0]),o=r.map(e=>this.quoteIdentifier(e)).join(", ");for(let e of t){let n=r.map((l,m)=>`$${m+1}`).join(", "),c=`INSERT INTO ${this.quoteIdentifier(a)} (${o}) VALUES (${n})`,i=r.map(l=>e[l]);await this.client.query(c,i)}}}});import sa from"mysql2/promise";var Te,Qe=E(()=>{"use strict";Te=class{connection;pool=null;constructor(a){this.connection=a}async getPool(){return this.pool||(this.pool=sa.createPool(this.connection)),this.pool}quoteIdentifier(a){return`\`${a.replace(/`/g,"``")}\``}async getTables(){let a=await this.getPool(),[t]=await a.query("SHOW TABLES;");return t.map(r=>Object.values(r)[0])}async getSchema(a){let t=await this.getPool(),[r]=await t.query(`SHOW COLUMNS FROM ${this.quoteIdentifier(a)}`),o=r,[e]=await t.query(`
58
+ `,[a])).rows,e=new Map;for(let n of o){if(n.is_primary)continue;let c=n.index_name;e.has(c)||e.set(c,{name:c,columns:[],isUnique:n.is_unique}),e.get(c).columns.push(n.column_name)}return Array.from(e.values())}async getData(a,t=50,r=0,o,e){await this.connectIfNecessary();let c=(await this.getSchema(a)).map(m=>m.name),i=`SELECT * FROM ${this.quoteIdentifier(a)}`;o&&(i+=` WHERE ${o}`),e&&(i+=` ORDER BY ${this.quoteIdentifier(e.col)} ${e.asc?"ASC":"DESC"}`),i+=" LIMIT $1 OFFSET $2";let l=await this.client.query(i,[t,r]);return{columns:c,rows:l.rows}}async query(a){await this.connectIfNecessary();let t=await this.client.query(a),r=[];return t.fields&&(r=t.fields.map(o=>o.name)),{columns:r,rows:t.rows||[]}}async executeSql(a){await this.connectIfNecessary(),await this.client.query(a)}async close(){this.connected&&(await this.client.end(),this.connected=!1)}async insert(a,t){if(t.length===0)return;await this.connectIfNecessary();let r=Object.keys(t[0]),o=r.map(e=>this.quoteIdentifier(e)).join(", ");for(let e of t){let n=r.map((l,m)=>`$${m+1}`).join(", "),c=`INSERT INTO ${this.quoteIdentifier(a)} (${o}) VALUES (${n})`,i=r.map(l=>e[l]);await this.client.query(c,i)}}}});import sa from"mysql2/promise";var Te,Qe=E(()=>{"use strict";Te=class{connection;pool=null;constructor(a){this.connection=a}async getPool(){return this.pool||(this.pool=sa.createPool(this.connection),this.pool.on("connection",a=>{a.query("SET SESSION sql_mode = 'ANSI_QUOTES'")})),this.pool}quoteIdentifier(a){return`\`${a.replace(/`/g,"``")}\``}async getTables(){let a=await this.getPool(),[t]=await a.query("SHOW TABLES;");return t.map(r=>Object.values(r)[0])}async getSchema(a){let t=await this.getPool(),[r]=await t.query(`SHOW COLUMNS FROM ${this.quoteIdentifier(a)}`),o=r,[e]=await t.query(`
59
59
  SELECT COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
60
60
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
61
61
  WHERE TABLE_SCHEMA = DATABASE()
@@ -74,12 +74,12 @@ ${r.join(`,
74
74
  \u2554${d}\u2557`)),r){let f=m-2-r.length,y=Math.max(0,Math.floor(f/2)),b=Math.max(0,f-y),x=" ".repeat(y)+$.bold($.white(r))+" ".repeat(b);console.log($.cyan("\u2551")+x+$.cyan("\u2551")),console.log($.cyan(`\u2560${d}\u2563`))}if(s.length>0){let f=s.map(y=>$.bold($.white(u(y,n[y]).padEnd(n[y])))).join($.cyan(" \u2551 "));console.log($.cyan("\u2551 ")+f+$.cyan(" \u2551")),console.log($.cyan(`\u2560${d}\u2563`))}if(a.length===0){let f=m-4-o.length,y=Math.max(0,Math.floor(f/2)),b=Math.max(0,f-y);console.log($.cyan("\u2551 ")+" ".repeat(y)+$.yellow(o)+" ".repeat(b)+$.cyan(" \u2551"))}else for(let f of a){let y=s.map(b=>$.white(u(String(f[b]??""),n[b]).padEnd(n[b]))).join($.cyan(" \u2551 "));console.log($.cyan("\u2551 ")+y+$.cyan(" \u2551"))}console.log($.cyan(`\u255A${d}\u255D`))}var Ce=E(()=>{"use strict"});var at={};L(at,{runQueryCommand:()=>ga});import ce from"picocolors";async function ga(s,a){s.type==="unknown"&&(console.log(ce.red("Error: No database connection found. Cannot run query.")),process.exit(1));let t=h(s),r=a[0];if(!r){let{input:o}=await import("@inquirer/prompts");r=await o({message:"Enter your SQL query:"})}(!r||r.trim()==="")&&(console.log(ce.yellow("No query provided. Exiting.")),process.exit(0));try{let o=await t.query(r);o.columns.length===0&&(console.log(ce.yellow("Query executed successfully. (No output)")),process.exit(0)),ee(o.columns,o.rows,{title:"Query Result",maxColWidth:50}),console.log(ce.dim(`
75
75
  (${o.rows.length} rows)`)),await t.close(),process.exit(0)}catch(o){console.log(ce.red(`
76
76
  Query Error: ${o.message}
77
- `)),process.exit(1)}}var ot=E(()=>{"use strict";A();Ce()});var nt={};L(nt,{runExportCommand:()=>fa});import U from"picocolors";import me from"fs/promises";import ue from"path";async function fa(s,a,t){s.type==="unknown"&&(console.log(U.red("Error: No database connection found. Cannot run export.")),process.exit(1));let r=h(s),o=a[0],e=t.format,n=t["schema-only"],{select:c}=await import("@inquirer/prompts");if(!o){let m=await r.getTables();m.length===0&&(console.log(U.yellow("No tables found in the database.")),process.exit(0));let p=[{name:"All Tables (*)",value:"*"},...m.map(u=>({name:u,value:u}))];o=await c({message:"Which table do you want to export?",choices:p})}e||(e=await c({message:"Which format do you want to export?",choices:[{name:"CSV",value:"csv"},{name:"JSON",value:"json"}]}));let i=ue.join(process.cwd(),"drixio_exports");await me.mkdir(i,{recursive:!0});let l=o==="*"?await r.getTables():[o];console.log(U.cyan(`
78
- Starting export to ${i}...`));for(let m of l)try{if(n){let p=await r.getSchema(m);if(e==="json"){let u=ue.join(i,`${m}_schema.json`);await me.writeFile(u,JSON.stringify(p,null,2),"utf-8"),console.log(U.green(`\u2714 Exported Schema (JSON): ${m}`))}else{let u=ue.join(i,`${m}_schema.csv`),d=`Name,Type,IsPrimaryKey,Nullable
77
+ `)),process.exit(1)}}var ot=E(()=>{"use strict";A();Ce()});var nt={};L(nt,{runExportCommand:()=>fa});import F from"picocolors";import me from"fs/promises";import ue from"path";async function fa(s,a,t){s.type==="unknown"&&(console.log(F.red("Error: No database connection found. Cannot run export.")),process.exit(1));let r=h(s),o=a[0],e=t.format,n=t["schema-only"],{select:c}=await import("@inquirer/prompts");if(!o){let m=await r.getTables();m.length===0&&(console.log(F.yellow("No tables found in the database.")),process.exit(0));let p=[{name:"All Tables (*)",value:"*"},...m.map(u=>({name:u,value:u}))];o=await c({message:"Which table do you want to export?",choices:p})}e||(e=await c({message:"Which format do you want to export?",choices:[{name:"CSV",value:"csv"},{name:"JSON",value:"json"}]}));let i=ue.join(process.cwd(),"drixio_exports");await me.mkdir(i,{recursive:!0});let l=o==="*"?await r.getTables():[o];console.log(F.cyan(`
78
+ Starting export to ${i}...`));for(let m of l)try{if(n){let p=await r.getSchema(m);if(e==="json"){let u=ue.join(i,`${m}_schema.json`);await me.writeFile(u,JSON.stringify(p,null,2),"utf-8"),console.log(F.green(`\u2714 Exported Schema (JSON): ${m}`))}else{let u=ue.join(i,`${m}_schema.csv`),d=`Name,Type,IsPrimaryKey,Nullable
79
79
  `,f=p.map(y=>`"${y.name}","${y.type}","${y.isPk}","${y.nullable}"`).join(`
80
- `);await me.writeFile(u,d+f,"utf-8"),console.log(U.green(`\u2714 Exported Schema (CSV): ${m}`))}}else{let p=await r.getData(m,9999999,0);if(e==="json"){let u=ue.join(i,`${m}_data.json`);await me.writeFile(u,JSON.stringify(p.rows,null,2),"utf-8"),console.log(U.green(`\u2714 Exported Data (JSON): ${m} (${p.rows.length} rows)`))}else{let u=ue.join(i,`${m}_data.csv`),d="";if(p.columns.length>0){let f=p.columns.join(",")+`
80
+ `);await me.writeFile(u,d+f,"utf-8"),console.log(F.green(`\u2714 Exported Schema (CSV): ${m}`))}}else{let p=await r.getData(m,9999999,0);if(e==="json"){let u=ue.join(i,`${m}_data.json`);await me.writeFile(u,JSON.stringify(p.rows,null,2),"utf-8"),console.log(F.green(`\u2714 Exported Data (JSON): ${m} (${p.rows.length} rows)`))}else{let u=ue.join(i,`${m}_data.csv`),d="";if(p.columns.length>0){let f=p.columns.join(",")+`
81
81
  `,y=p.rows.map(b=>p.columns.map(x=>`"${String(b[x]??"").replace(/"/g,'""')}"`).join(",")).join(`
82
- `);d=f+y}await me.writeFile(u,d,"utf-8"),console.log(U.green(`\u2714 Exported Data (CSV): ${m} (${p.rows.length} rows)`))}}}catch(p){console.log(U.red(`\u2718 Failed to export table ${m}: ${p.message}`))}await r.close(),console.log(U.cyan("Export complete.")),process.exit(0)}var st=E(()=>{"use strict";A()});import{Hono as ya}from"hono";function rt(s,a){let t=new ya,r=h(a);t.get("/tables",async o=>{try{let e=await r.getTables();return o.json({success:!0,data:e})}catch(e){return o.json({success:!1,error:e.message},500)}}),t.get("/tables/stats",async o=>{try{let e=await r.getTables(),n={};for(let c of e)try{let i=await r.query(`SELECT COUNT(*) as c FROM ${r.quoteIdentifier(c)}`);if(i&&i.rows&&i.rows.length>0){let l=i.rows[0],m=Object.values(l)[0];n[c]=parseInt(String(m),10)||0}else n[c]=0}catch{n[c]=0}return o.json({success:!0,data:n})}catch(e){return o.json({success:!1,error:e.message},500)}}),t.get("/tables/:name/schema",async o=>{let e=o.req.param("name");try{let n=await r.getSchema(e);return o.json({success:!0,data:n})}catch(n){return o.json({success:!1,error:n.message},500)}}),t.get("/tables/:name/indexes",async o=>{let e=o.req.param("name");try{let n=await r.getIndexes(e);return o.json({success:!0,data:n})}catch(n){return o.json({success:!1,error:n.message},500)}}),t.get("/tables/:name/data",async o=>{let e=o.req.param("name"),n=parseInt(o.req.query("limit")||"50",10),c=parseInt(o.req.query("offset")||"0",10),i=o.req.query("where")||"",l=o.req.query("orderCol"),m=o.req.query("orderAsc"),p;l&&(p={col:l,asc:m!=="false"});try{let u=await r.getData(e,n,c,i,p);return o.json({success:!0,data:u})}catch(u){return o.json({success:!1,error:u.message},500)}}),t.post("/query",async o=>{try{let{sql:e}=await o.req.json(),n=await r.query(e);return o.json({success:!0,data:n})}catch(e){return o.json({success:!1,error:e.message},500)}}),s.route("/api",t)}var it=E(()=>{"use strict";A()});var ct={};L(ct,{runStudio:()=>xa});import{serve as ha}from"@hono/node-server";import{Hono as wa}from"hono";import{serveStatic as ba}from"@hono/node-server/serve-static";import Ea from"open";import pe from"path";import lt from"picocolors";import{fileURLToPath as Sa}from"url";async function xa(s){let a=new wa;rt(a,s);let r=qe.includes("src")||qe.includes("server")?pe.resolve(qe,"../../dist/studio"):pe.resolve(qe,"./studio"),o=await import("fs/promises");a.use("/*",ba({root:pe.relative(process.cwd(),r)})),a.get("*",async c=>{let i=pe.join(r,"index.html");try{let l=await o.readFile(i,"utf-8");return c.html(l)}catch{return c.text("Drixio Studio static files not found. Did you run build?",404)}});let e=process.env.PORT?parseInt(process.env.PORT,10):51213,n=await Ta(e);console.log(lt.cyan(`
82
+ `);d=f+y}await me.writeFile(u,d,"utf-8"),console.log(F.green(`\u2714 Exported Data (CSV): ${m} (${p.rows.length} rows)`))}}}catch(p){console.log(F.red(`\u2718 Failed to export table ${m}: ${p.message}`))}await r.close(),console.log(F.cyan("Export complete.")),process.exit(0)}var st=E(()=>{"use strict";A()});import{Hono as ya}from"hono";function rt(s,a){let t=new ya,r=h(a);t.get("/tables",async o=>{try{let e=await r.getTables();return o.json({success:!0,data:e})}catch(e){return o.json({success:!1,error:e.message},500)}}),t.get("/config",o=>o.json({success:!0,data:{dbType:a.type}})),t.get("/tables/stats",async o=>{try{let e=await r.getTables(),n={};for(let c of e)try{let i=await r.query(`SELECT COUNT(*) as c FROM ${r.quoteIdentifier(c)}`);if(i&&i.rows&&i.rows.length>0){let l=i.rows[0],m=Object.values(l)[0];n[c]=parseInt(String(m),10)||0}else n[c]=0}catch{n[c]=0}return o.json({success:!0,data:n})}catch(e){return o.json({success:!1,error:e.message},500)}}),t.get("/tables/:name/schema",async o=>{let e=o.req.param("name");try{let n=await r.getSchema(e);return o.json({success:!0,data:n})}catch(n){return o.json({success:!1,error:n.message},500)}}),t.get("/tables/:name/indexes",async o=>{let e=o.req.param("name");try{let n=await r.getIndexes(e);return o.json({success:!0,data:n})}catch(n){return o.json({success:!1,error:n.message},500)}}),t.get("/tables/:name/data",async o=>{let e=o.req.param("name"),n=parseInt(o.req.query("limit")||"50",10),c=parseInt(o.req.query("offset")||"0",10),i=o.req.query("where")||"",l=o.req.query("orderCol"),m=o.req.query("orderAsc"),p;l&&(p={col:l,asc:m!=="false"});try{let u=await r.getData(e,n,c,i,p);return o.json({success:!0,data:u})}catch(u){return o.json({success:!1,error:u.message},500)}}),t.post("/query",async o=>{try{let{sql:e}=await o.req.json(),n=await r.query(e);return o.json({success:!0,data:n})}catch(e){return o.json({success:!1,error:e.message},500)}}),s.route("/api",t)}var it=E(()=>{"use strict";A()});var ct={};L(ct,{runStudio:()=>xa});import{serve as ha}from"@hono/node-server";import{Hono as wa}from"hono";import{serveStatic as ba}from"@hono/node-server/serve-static";import Ea from"open";import pe from"path";import lt from"picocolors";import{fileURLToPath as Sa}from"url";async function xa(s){let a=new wa;rt(a,s);let r=qe.includes("src")||qe.includes("server")?pe.resolve(qe,"../../dist/studio"):pe.resolve(qe,"./studio"),o=await import("fs/promises");a.use("/*",ba({root:pe.relative(process.cwd(),r)})),a.get("*",async c=>{let i=pe.join(r,"index.html");try{let l=await o.readFile(i,"utf-8");return c.html(l)}catch{return c.text("Drixio Studio static files not found. Did you run build?",404)}});let e=process.env.PORT?parseInt(process.env.PORT,10):51213,n=await Ta(e);console.log(lt.cyan(`
83
83
  Starting Drixio Studio on http://localhost:${n}...`)),console.log(lt.dim(`Press Ctrl+C to stop the server.
84
84
  `)),ha({fetch:a.fetch,port:n}),await Ea(`http://localhost:${n}`)}async function Ta(s){let a=await import("net"),t=s;for(;;){if(await new Promise(o=>{let e=a.createServer();e.unref(),e.on("error",()=>o(!1)),e.listen(t,()=>{e.close(()=>o(!0))})}))return t;t++}}var $a,qe,mt=E(()=>{"use strict";it();$a=Sa(import.meta.url),qe=pe.dirname($a)});var ut={};L(ut,{runBackupCommand:()=>Da});import I from"picocolors";import Ie from"fs/promises";import ve from"path";async function Da(s){s.type==="unknown"&&(console.log(I.red("Error: No database connection found. Cannot run backup.")),process.exit(1));let a=new Date().toISOString().replace(/[:.]/g,"-"),t=ve.join(process.cwd(),`drixio_backup_${a}`);if(console.log(I.cyan(`
85
85
  Starting database backup...`)),console.log(I.dim(`Database: ${s.type}`)),console.log(I.dim(`Target: ${s.targetUrl}`)),console.log(I.dim(`Backup Directory: ${t}
@@ -109,7 +109,7 @@ ${r}
109
109
  `,e=Ia.resolve(process.cwd(),"drixio_schema.md");await Na.writeFile(e,o.trim(),"utf-8"),console.log(Q.green(`
110
110
  \u2714 Diagram generated successfully!`)),console.log(Q.white(`Output saved to: ${Q.bold(e)}`)),console.log(Q.dim("Tip: Open this file in VSCode with a Markdown viewer or paste it into Draw.io."))}catch(t){console.log(Q.red(`
111
111
  \u2718 Failed to generate diagram: ${t.message}`))}finally{await a.close()}process.exit(0)}var bt=E(()=>{"use strict";A()});var St={};L(St,{runExecCommand:()=>Ba});import oe from"picocolors";import Et from"fs/promises";import Pa from"path";async function Ba(s,a){s.type==="unknown"&&(console.log(oe.red("Error: No database connection found. Cannot run exec.")),process.exit(1));let t=a[0],{input:r}=await import("@inquirer/prompts");t||(t=await r({message:"Enter the path to your .sql file:"}));let o=Pa.resolve(process.cwd(),t);try{await Et.access(o)}catch{console.log(oe.red(`Error: File not found at ${o}`)),process.exit(1)}let e=await Et.readFile(o,"utf-8");e.trim()||(console.log(oe.yellow("File is empty.")),process.exit(0));let n=h(s);console.log(oe.cyan(`
112
- Executing SQL script from ${t}...`));try{await n.executeSql(e),console.log(oe.green("\u2714 Script executed successfully!"))}catch(c){console.log(oe.red(`\u2718 Execution failed: ${c.message}`))}finally{await n.close()}process.exit(0)}var $t=E(()=>{"use strict";A()});var xt={};L(xt,{runGenerateTypesCommand:()=>Fa});import Y from"picocolors";import Ma from"fs/promises";import _a from"path";function Oa(s){let a=s.toLowerCase();return a.includes("int")||a.includes("num")||a.includes("float")||a.includes("double")||a.includes("real")?"number":a.includes("bool")||a==="tinyint(1)"?"boolean":a.includes("char")||a.includes("text")||a.includes("uuid")||a.includes("string")?"string":a.includes("date")||a.includes("time")?"Date":a.includes("json")?"any":"string"}async function Fa(s){s.type==="unknown"&&(console.log(Y.red("Error: No database connection found. Cannot generate types.")),process.exit(1));let a=h(s);console.log(Y.cyan(`
112
+ Executing SQL script from ${t}...`));try{await n.executeSql(e),console.log(oe.green("\u2714 Script executed successfully!"))}catch(c){console.log(oe.red(`\u2718 Execution failed: ${c.message}`))}finally{await n.close()}process.exit(0)}var $t=E(()=>{"use strict";A()});var xt={};L(xt,{runGenerateTypesCommand:()=>Ua});import Y from"picocolors";import Ma from"fs/promises";import _a from"path";function Oa(s){let a=s.toLowerCase();return a.includes("int")||a.includes("num")||a.includes("float")||a.includes("double")||a.includes("real")?"number":a.includes("bool")||a==="tinyint(1)"?"boolean":a.includes("char")||a.includes("text")||a.includes("uuid")||a.includes("string")?"string":a.includes("date")||a.includes("time")?"Date":a.includes("json")?"any":"string"}async function Ua(s){s.type==="unknown"&&(console.log(Y.red("Error: No database connection found. Cannot generate types.")),process.exit(1));let a=h(s);console.log(Y.cyan(`
113
113
  Scanning database to generate TypeScript interfaces...`));try{let t=await a.getTables();t.length===0&&(console.log(Y.yellow("No tables found in the database.")),process.exit(0));let r=`// Generated by Drixio CLI
114
114
  // Database: ${s.type.toUpperCase()}
115
115
 
@@ -119,7 +119,7 @@ Scanning database to generate TypeScript interfaces...`));try{let t=await a.getT
119
119
 
120
120
  `}let o=_a.resolve(process.cwd(),"drixio-types.d.ts");await Ma.writeFile(o,r.trim()+`
121
121
  `,"utf-8"),console.log(Y.green("\u2714 TypeScript interfaces generated successfully!")),console.log(Y.white(`Output saved to: ${Y.bold(o)}`))}catch(t){console.log(Y.red(`
122
- \u2718 Failed to generate types: ${t.message}`))}finally{await a.close()}process.exit(0)}var Tt=E(()=>{"use strict";A()});var At={};L(At,{runInitCommand:()=>Ua});import S from"picocolors";import Re from"fs/promises";import Dt from"path";async function Ua(s){let{select:a,input:t,password:r}=await import("@inquirer/prompts"),o=s[0];(!o||!["sqlite","mysql","postgres"].includes(o.toLowerCase()))&&(o=await a({message:"Which database do you want to initialize locally?",choices:[{name:"SQLite (Local File)",value:"sqlite"},{name:"MySQL (Local Server)",value:"mysql"},{name:"PostgreSQL (Local Server)",value:"postgres"}]})),o=o.toLowerCase(),console.log(S.cyan(`
122
+ \u2718 Failed to generate types: ${t.message}`))}finally{await a.close()}process.exit(0)}var Tt=E(()=>{"use strict";A()});var At={};L(At,{runInitCommand:()=>Fa});import S from"picocolors";import Re from"fs/promises";import Dt from"path";async function Fa(s){let{select:a,input:t,password:r}=await import("@inquirer/prompts"),o=s[0];(!o||!["sqlite","mysql","postgres"].includes(o.toLowerCase()))&&(o=await a({message:"Which database do you want to initialize locally?",choices:[{name:"SQLite (Local File)",value:"sqlite"},{name:"MySQL (Local Server)",value:"mysql"},{name:"PostgreSQL (Local Server)",value:"postgres"}]})),o=o.toLowerCase(),console.log(S.cyan(`
123
123
  Initializing a local ${o} database...`));let e="";if(o==="sqlite"){let i=s[1]||"database.sqlite";!i.endsWith(".sqlite")&&!i.endsWith(".db")&&(i+=".sqlite");let l=Dt.resolve(process.cwd(),i);try{await Re.access(l),console.log(S.yellow(`File ${i} already exists.`))}catch{await Re.writeFile(l,""),console.log(S.green(`\u2714 Created local database file: ${i}`))}e=`file:${i}`}else{console.log(S.dim("Please provide credentials for your local server (e.g. running via XAMPP, Homebrew, etc.)"));let i=await t({message:"Server Host:",default:"localhost"}),l=await t({message:"Server Port:",default:o==="mysql"?"3306":"5432"}),m=await t({message:"Username:",default:o==="mysql"?"root":"postgres"}),p=await r({message:"Password (leave empty if none):"}),u=s[1];u||(u=await t({message:"New Database Name (e.g. my_project):"})),(!u||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(u))&&(console.log(S.red("Invalid database name. Please use only letters, numbers, and underscores.")),process.exit(1)),console.log(S.cyan(`
124
124
  Connecting to local server to create database '${u}'...`));try{if(o==="mysql"){let b=await(await import("mysql2/promise")).createConnection({host:i,port:parseInt(l),user:m,password:p});await b.query(`CREATE DATABASE IF NOT EXISTS \`${u}\``),await b.end()}else if(o==="postgres"){let y=await import("pg"),b=new y.Client({host:i,port:parseInt(l),user:m,password:p,database:"postgres"});await b.connect(),(await b.query("SELECT 1 FROM pg_database WHERE datname = $1",[u])).rowCount===0&&await b.query(`CREATE DATABASE "${u}"`),await b.end()}console.log(S.green(`\u2714 Created local database: ${u}`))}catch(y){console.log(S.red(`\u2718 Failed to create database on server: ${y.message}`)),console.log(S.dim(`
125
125
  Could not connect to the local ${o} server on ${i}:${l}.`)),(y.code==="ECONNREFUSED"||y.message.includes("ECONNREFUSED")||y.message.includes("connect"))&&(console.log(S.yellow(`
@@ -144,10 +144,10 @@ x Failed to read file: ${e.message}`));return}let o=r;if(t.toLowerCase().endsWit
144
144
  \u2713 SQL executed successfully!`))}finally{await e.close()}}else console.log(K.yellow(`
145
145
  \u26A0\uFE0F No SQL found in the file. Aborted.`))}else console.log(K.yellow(`
146
146
  No file path entered. Aborted.`))}catch(a){console.log(K.red(`
147
- Error executing SQL: ${a.message}`))}}var _t=E(()=>{"use strict";A()});import{select as ye,confirm as Ot,input as Xa}from"@inquirer/prompts";import C from"picocolors";async function Ft(s){let a=h(s);try{let t=await a.getTables();if(t.length===0){console.log(C.yellow("No tables found in the database."));return}let r=await ye({message:"Select a table to drop:",choices:t.map(e=>({name:e,value:e}))});if(await Ot({message:`Are you sure you want to DROP TABLE '${r}'? This will delete all its data!`,default:!1})){let e=`DROP TABLE ${r}`;s.type==="sqlite"||s.type==="postgres"?e=`DROP TABLE "${r}"`:s.type==="mysql"&&(e=`DROP TABLE \`${r}\``),await a.executeSql(e),console.log(C.green(`\u2713 Table '${r}' dropped successfully.`))}}catch(t){console.log(C.red(`Error: ${t.message}`))}finally{await a.close()}}async function he(s,a){let t=h(s),r=j(s.type);try{let o=await t.getTables();if(o.length===0){console.log(C.yellow("No tables found in the database."));return}let e=await ye({message:"Select a table to modify:",choices:o.map(c=>({name:c,value:c}))}),n=await t.getSchema(e);if(a==="add"){let c=n.some(m=>m.isPk),i=n.map(m=>m.name),{col:l}=await fe(t,c,i);if(l){let m=r.buildCreateTable("tmp",[l]).split(`
147
+ Error executing SQL: ${a.message}`))}}var _t=E(()=>{"use strict";A()});import{select as ye,confirm as Ot,input as Xa}from"@inquirer/prompts";import C from"picocolors";async function Ut(s){let a=h(s);try{let t=await a.getTables();if(t.length===0){console.log(C.yellow("No tables found in the database."));return}let r=await ye({message:"Select a table to drop:",choices:t.map(e=>({name:e,value:e}))});if(await Ot({message:`Are you sure you want to DROP TABLE '${r}'? This will delete all its data!`,default:!1})){let e=`DROP TABLE ${r}`;s.type==="sqlite"||s.type==="postgres"?e=`DROP TABLE "${r}"`:s.type==="mysql"&&(e=`DROP TABLE \`${r}\``),await a.executeSql(e),console.log(C.green(`\u2713 Table '${r}' dropped successfully.`))}}catch(t){console.log(C.red(`Error: ${t.message}`))}finally{await a.close()}}async function he(s,a){let t=h(s),r=j(s.type);try{let o=await t.getTables();if(o.length===0){console.log(C.yellow("No tables found in the database."));return}let e=await ye({message:"Select a table to modify:",choices:o.map(c=>({name:c,value:c}))}),n=await t.getSchema(e);if(a==="add"){let c=n.some(m=>m.isPk),i=n.map(m=>m.name),{col:l}=await fe(t,c,i);if(l){let m=r.buildCreateTable("tmp",[l]).split(`
148
148
  `)[1].trim().replace(/,$/,""),p=`ALTER TABLE ${e} ADD COLUMN ${m}`;s.type==="sqlite"||s.type==="postgres"?p=`ALTER TABLE "${e}" ADD COLUMN ${m}`:s.type==="mysql"&&(p=`ALTER TABLE \`${e}\` ADD COLUMN ${m}`),await t.executeSql(p),console.log(C.green(`\u2713 Column '${l.name}' added successfully.`))}}else if(a==="rename"){if(n.length===0)return console.log(C.yellow("Table has no columns."));let c=await ye({message:"Select a column to rename:",choices:n.map(l=>({name:`${l.name} (${l.type})`,value:l.name}))}),i=await Xa({message:`New name for '${c}':`});if(i&&i!==c){let l=`ALTER TABLE ${e} RENAME COLUMN ${c} TO ${i}`;s.type==="sqlite"||s.type==="postgres"?l=`ALTER TABLE "${e}" RENAME COLUMN "${c}" TO "${i}"`:s.type==="mysql"&&(l=`ALTER TABLE \`${e}\` RENAME COLUMN \`${c}\` TO \`${i}\``),await t.executeSql(l),console.log(C.green(`\u2713 Column renamed to '${i}' successfully.`))}}else if(a==="modify"){if(n.length===0)return console.log(C.yellow("Table has no columns."));if(s.type==="sqlite"){console.log(C.yellow("SQLite does not support altering column types directly. Please recreate the table."));return}let c=await ye({message:"Select a column to modify:",choices:n.map(p=>({name:`${p.name} (${p.type})`,value:p.name}))}),i=n.some(p=>p.isPk&&p.name!==c),l=n.map(p=>p.name).filter(p=>p!==c),{col:m}=await fe(t,i,l,c);if(m){let p=r.buildCreateTable("tmp",[m]).split(`
149
- `)[1].trim().replace(/,$/,""),u="";s.type==="postgres"?(console.log(C.yellow("Note: Complex constraint modifications might require raw SQL in Postgres.")),u=`ALTER TABLE "${e}" ALTER COLUMN ${p.replace(m.name,`"${m.name}" TYPE`)}`):s.type==="mysql"&&(u=`ALTER TABLE \`${e}\` MODIFY COLUMN ${p}`);try{await t.executeSql(u),console.log(C.green(`\u2713 Column '${c}' modified successfully.`))}catch(d){console.log(C.red("x Could not modify column automatically. Try using Raw SQL.")),console.log(C.dim(d.message))}}}else if(a==="delete"){if(n.length===0)return console.log(C.yellow("Table has no columns."));let c=await ye({message:"Select a column to delete:",choices:n.map(l=>({name:`${l.name} (${l.type})`,value:l.name}))});if(await Ot({message:`Are you sure you want to delete column '${c}'? Data will be lost!`,default:!1})){let l=`ALTER TABLE ${e} DROP COLUMN ${c}`;s.type==="sqlite"||s.type==="postgres"?l=`ALTER TABLE "${e}" DROP COLUMN "${c}"`:s.type==="mysql"&&(l=`ALTER TABLE \`${e}\` DROP COLUMN \`${c}\``);try{await t.executeSql(l),console.log(C.green(`\u2713 Column '${c}' deleted successfully.`))}catch(m){console.log(C.red(`x Error deleting column: ${m.message}`))}}}}catch(o){console.log(C.red(`Error: ${o.message}`))}finally{await t.close()}}var Ut=E(()=>{"use strict";A();Ae();Pe()});var jt={};L(jt,{runTableManagerFlow:()=>eo});import W from"picocolors";import{select as Wt,Separator as Za}from"@inquirer/prompts";async function eo(s){if(s.type==="unknown"){console.log(W.yellow(`
150
- No database connection found. Please setup first.`)),await Be();return}let a=await Promise.resolve().then(()=>(A(),Ve)).then(r=>r.createDBAdapter(s)),t=!0;for(;t;){console.clear();let r="Scanning...";try{r=`${(await a.getTables()).length} tables detected`}catch(n){r=W.red(n.message)}let o=s.targetUrl;switch(se(` Table Builder & Manager \u2022 [${s.type.toUpperCase()}]`,[{label:"Database",value:s.type.toUpperCase()},{label:"Target",value:o.length>45?"..."+o.slice(-42):o},{label:"Tables",value:r}]),await Rt()){case"create":let n=await Wt({message:"How do you want to create the table?",theme:{prefix:W.cyan("\u2713 "),icon:{cursor:W.cyan("\u203A ")},style:{message:c=>W.bold(W.white(c)),highlight:c=>{let i=c.replace(/\x1b\[[0-9;]*m/g,"");return i.includes("Cancel")?W.red(i):W.cyan(i)}}},choices:[{name:" Interactive Wizard (Beginner Friendly)",value:"wizard",description:"Follow the step-by-step guide to build your table."},{name:" Raw SQL (Experts)",value:"sql",description:"Write / Import your own CREATE TABLE statement."},new Za,{name:W.dim(" Cancel"),value:"cancel",description:"Back to Table Manager"}]});n==="wizard"?await Pt(s):n==="sql"&&await Mt(s);break;case"modify":await to(s);break;case"drop":await Ft(s),await Be();break;case"back":t=!1;break}}await a.close()}async function to(s){let a=await Wt({message:"Modify Table Actions:",choices:[{name:"Add Column",value:"add_col"},{name:"Rename Column",value:"rename_col"},{name:"Modify Column Settings (MySQL/Postgres)",value:"mod_col",disabled:s.type==="sqlite"},{name:"Delete Column",value:"del_col"},{name:" Back",value:"back"}]});if(a!=="back"){switch(a){case"add_col":await he(s,"add");break;case"rename_col":await he(s,"rename");break;case"mod_col":await he(s,"modify");break;case"del_col":await he(s,"delete");break}await Be()}}async function Be(){let{input:s}=await import("@inquirer/prompts");await s({message:"Press Enter to continue..."})}var Qt=E(()=>{"use strict";Lt();Bt();_t();Ut();Se()});Se();import D from"picocolors";import re from"fs/promises";import X from"path";async function q(s){let a=process.cwd();if(s){let e="sqlite";return s.startsWith("postgres://")||s.startsWith("postgresql://")?e="postgres":s.startsWith("mysql://")?e="mysql":e="sqlite",{type:e,targetUrl:s.replace("file:",""),source:"manual"}}let t=[".","prisma","db","database","src/db","src/database"];for(let e of t)try{let n=X.join(a,e),i=(await re.readdir(n)).find(l=>l.endsWith(".db")||l.endsWith(".sqlite")||l.endsWith(".sqlite3"));if(i)return{type:"sqlite",targetUrl:X.join(n,i),source:"auto-detected"}}catch{}let r=X.join(a,"prisma","schema.prisma");try{let e=await re.readFile(r,"utf-8"),n=e.match(/provider\s*=\s*["']([^"']+)["']/),c=e.match(/url\s*=\s*(?:env\(["']([^"']+)["']\)|["']([^"']+)["'])/);if(n){let i=n[1];i==="postgresql"&&(i="postgres");let l="";if(c&&c[2]&&(l=c[2],l.startsWith("file:")&&(l=X.join(a,"prisma",l.replace("file:","")))),l&&(i==="sqlite"||i==="postgres"||i==="mysql"))return{type:i,targetUrl:l,source:".env"}}}catch{}let o=X.join(a,".env");try{let e=await re.readFile(o,"utf-8"),n=["DATABASE_URL","DB_URL","POSTGRES_URL","POSTGRES_PRISMA_URL","MYSQL_URL"];for(let c of n){let i=new RegExp(`${c}\\s*=\\s*["']?([^"'\\r\\n]+)["']?`),l=e.match(i);if(l){let m=l[1];if(m.startsWith("file:")||m.endsWith(".db")||m.includes(".sqlite"))return{type:"sqlite",targetUrl:m.replace("file:",""),source:".env"};if(m.startsWith("postgres://")||m.startsWith("postgresql://"))return{type:"postgres",targetUrl:m,source:".env"};if(m.startsWith("mysql://"))return{type:"mysql",targetUrl:m,source:".env"}}}}catch{}return{type:"unknown",targetUrl:"",source:"manual"}}async function Ue(s){let a=X.join(process.cwd(),".env"),t="";try{t=await re.readFile(a,"utf-8")}catch{}let r=/DATABASE_URL\s*=\s*["']?([^"'\r\n]+)["']?/;r.test(t)?t=t.replace(r,`DATABASE_URL="${s}"`):(t&&!t.endsWith(`
149
+ `)[1].trim().replace(/,$/,""),u="";s.type==="postgres"?(console.log(C.yellow("Note: Complex constraint modifications might require raw SQL in Postgres.")),u=`ALTER TABLE "${e}" ALTER COLUMN ${p.replace(m.name,`"${m.name}" TYPE`)}`):s.type==="mysql"&&(u=`ALTER TABLE \`${e}\` MODIFY COLUMN ${p}`);try{await t.executeSql(u),console.log(C.green(`\u2713 Column '${c}' modified successfully.`))}catch(d){console.log(C.red("x Could not modify column automatically. Try using Raw SQL.")),console.log(C.dim(d.message))}}}else if(a==="delete"){if(n.length===0)return console.log(C.yellow("Table has no columns."));let c=await ye({message:"Select a column to delete:",choices:n.map(l=>({name:`${l.name} (${l.type})`,value:l.name}))});if(await Ot({message:`Are you sure you want to delete column '${c}'? Data will be lost!`,default:!1})){let l=`ALTER TABLE ${e} DROP COLUMN ${c}`;s.type==="sqlite"||s.type==="postgres"?l=`ALTER TABLE "${e}" DROP COLUMN "${c}"`:s.type==="mysql"&&(l=`ALTER TABLE \`${e}\` DROP COLUMN \`${c}\``);try{await t.executeSql(l),console.log(C.green(`\u2713 Column '${c}' deleted successfully.`))}catch(m){console.log(C.red(`x Error deleting column: ${m.message}`))}}}}catch(o){console.log(C.red(`Error: ${o.message}`))}finally{await t.close()}}var Ft=E(()=>{"use strict";A();Ae();Pe()});var jt={};L(jt,{runTableManagerFlow:()=>eo});import W from"picocolors";import{select as Wt,Separator as Za}from"@inquirer/prompts";async function eo(s){if(s.type==="unknown"){console.log(W.yellow(`
150
+ No database connection found. Please setup first.`)),await Be();return}let a=await Promise.resolve().then(()=>(A(),Ve)).then(r=>r.createDBAdapter(s)),t=!0;for(;t;){console.clear();let r="Scanning...";try{r=`${(await a.getTables()).length} tables detected`}catch(n){r=W.red(n.message)}let o=s.targetUrl;switch(se(` Table Builder & Manager \u2022 [${s.type.toUpperCase()}]`,[{label:"Database",value:s.type.toUpperCase()},{label:"Target",value:o.length>45?"..."+o.slice(-42):o},{label:"Tables",value:r}]),await Rt()){case"create":let n=await Wt({message:"How do you want to create the table?",theme:{prefix:W.cyan("\u2713 "),icon:{cursor:W.cyan("\u203A ")},style:{message:c=>W.bold(W.white(c)),highlight:c=>{let i=c.replace(/\x1b\[[0-9;]*m/g,"");return i.includes("Cancel")?W.red(i):W.cyan(i)}}},choices:[{name:" Interactive Wizard (Beginner Friendly)",value:"wizard",description:"Follow the step-by-step guide to build your table."},{name:" Raw SQL (Experts)",value:"sql",description:"Write / Import your own CREATE TABLE statement."},new Za,{name:W.dim(" Cancel"),value:"cancel",description:"Back to Table Manager"}]});n==="wizard"?await Pt(s):n==="sql"&&await Mt(s);break;case"modify":await to(s);break;case"drop":await Ut(s),await Be();break;case"back":t=!1;break}}await a.close()}async function to(s){let a=await Wt({message:"Modify Table Actions:",choices:[{name:"Add Column",value:"add_col"},{name:"Rename Column",value:"rename_col"},{name:"Modify Column Settings (MySQL/Postgres)",value:"mod_col",disabled:s.type==="sqlite"},{name:"Delete Column",value:"del_col"},{name:" Back",value:"back"}]});if(a!=="back"){switch(a){case"add_col":await he(s,"add");break;case"rename_col":await he(s,"rename");break;case"mod_col":await he(s,"modify");break;case"del_col":await he(s,"delete");break}await Be()}}async function Be(){let{input:s}=await import("@inquirer/prompts");await s({message:"Press Enter to continue..."})}var Qt=E(()=>{"use strict";Lt();Bt();_t();Ft();Se()});Se();import D from"picocolors";import re from"fs/promises";import X from"path";async function q(s){let a=process.cwd();if(s){let e="sqlite";return s.startsWith("postgres://")||s.startsWith("postgresql://")?e="postgres":s.startsWith("mysql://")?e="mysql":e="sqlite",{type:e,targetUrl:s.replace("file:",""),source:"manual"}}let t=[".","prisma","db","database","src/db","src/database"];for(let e of t)try{let n=X.join(a,e),i=(await re.readdir(n)).find(l=>l.endsWith(".db")||l.endsWith(".sqlite")||l.endsWith(".sqlite3"));if(i)return{type:"sqlite",targetUrl:X.join(n,i),source:"auto-detected"}}catch{}let r=X.join(a,"prisma","schema.prisma");try{let e=await re.readFile(r,"utf-8"),n=e.match(/provider\s*=\s*["']([^"']+)["']/),c=e.match(/url\s*=\s*(?:env\(["']([^"']+)["']\)|["']([^"']+)["'])/);if(n){let i=n[1];i==="postgresql"&&(i="postgres");let l="";if(c&&c[2]&&(l=c[2],l.startsWith("file:")&&(l=X.join(a,"prisma",l.replace("file:","")))),l&&(i==="sqlite"||i==="postgres"||i==="mysql"))return{type:i,targetUrl:l,source:".env"}}}catch{}let o=X.join(a,".env");try{let e=await re.readFile(o,"utf-8"),n=["DATABASE_URL","DB_URL","POSTGRES_URL","POSTGRES_PRISMA_URL","MYSQL_URL"];for(let c of n){let i=new RegExp(`${c}\\s*=\\s*["']?([^"'\\r\\n]+)["']?`),l=e.match(i);if(l){let m=l[1];if(m.startsWith("file:")||m.endsWith(".db")||m.includes(".sqlite"))return{type:"sqlite",targetUrl:m.replace("file:",""),source:".env"};if(m.startsWith("postgres://")||m.startsWith("postgresql://"))return{type:"postgres",targetUrl:m,source:".env"};if(m.startsWith("mysql://"))return{type:"mysql",targetUrl:m,source:".env"}}}}catch{}return{type:"unknown",targetUrl:"",source:"manual"}}async function Fe(s){let a=X.join(process.cwd(),".env"),t="";try{t=await re.readFile(a,"utf-8")}catch{}let r=/DATABASE_URL\s*=\s*["']?([^"'\r\n]+)["']?/;r.test(t)?t=t.replace(r,`DATABASE_URL="${s}"`):(t&&!t.endsWith(`
151
151
  `)&&(t+=`
152
152
  `),t+=`DATABASE_URL="${s}"
153
153
  `),await re.writeFile(a,t,"utf-8")}A();import{select as Je,Separator as le}from"@inquirer/prompts";import T from"picocolors";import{select as ra}from"@inquirer/prompts";import Z from"picocolors";var Ke=async s=>await ra({message:"Select a table to edit data:",theme:{prefix:Z.cyan("\u2713 "),icon:{cursor:Z.cyan("\u203A ")},style:{message:a=>Z.bold(Z.white(a)),highlight:a=>{let t=a.replace(/\x1b\[[0-9;]*m/g,"");return t.includes(" Back")?Z.red(t):Z.cyan(t)}}},choices:s});Ae();import{input as ie,select as ia}from"@inquirer/prompts";import w from"picocolors";import la from"fs/promises";import ca from"path";async function He(s,a,t,r){let o=j(a);console.log(w.cyan(`
@@ -168,17 +168,17 @@ x Error executing SQL: ${e.message}`))}}else console.log(w.yellow(`
168
168
  No file path entered. Aborted.`))}catch(a){console.log(w.red(`
169
169
  Error: ${a.message}`))}}Ce();Se();async function Xe(s){let a=h(s),t=!0;for(;t;){console.clear();let r=[],o=0,e="Scanning...";try{r=await a.getTables();for(let i of r)try{let l=s.type==="mysql"?"`":'"',m=await a.query(`SELECT COUNT(*) as count FROM ${l}${i}${l}`);m.rows.length>0&&m.rows[0].count!=null&&(o+=Number(m.rows[0].count))}catch{}e=`${o.toLocaleString()} rows across ${r.length} tables`}catch(i){e=T.red(i.message)}let n=s.targetUrl,c=s.source===".env"?"Loaded from project .env file":s.source==="auto-detected"?"Auto-detected local SQLite file":"Manual connection config";se(` Data Browser & Editor \u2022 [${s.type.toUpperCase()}]`,[{label:"Database",value:s.type.toUpperCase()},{label:"Target",value:n.length>45?"..."+n.slice(-42):n},{label:"Source",value:c},{label:"Total Data",value:e}]);try{if(r.length===0){console.log(T.yellow("No tables found in this database.")),await te(),await a.close();return}let i=[...r.map(f=>({name:f,value:f})),new le,{name:T.dim(" Back"),value:"BACK"}],l=await Ke(i);if(l==="BACK"){t=!1;continue}let m=!0,p=1,u="",d=50;for(;m;){console.clear();let f=(p-1)*d,y=await a.getSchema(l),b=y.map(P=>P.name),x;try{x=await a.getData(l,d,f,u)}catch(P){console.log(T.red(`
170
170
  Error fetching data: ${P.message}
171
- `)),u="";let{input:R}=await import("@inquirer/prompts");await R({message:"Click Enter to continue..."});continue}let k=x.rows,Kt=` ${l} (Page ${p}) `;ee(b,k,{title:Kt,maxColWidth:30});let Ht=k.length===d,Yt=p>1,we=[{name:"Add Data",value:"add"},{name:"Edit Data",value:"edit"},{name:"Delete Data",value:"delete"},new le,{name:"Search Data",value:"search"},{name:u?"Clear Search":T.dim("Clear Search (disabled)"),value:u?"clear_search":"noop"},new le,{name:"Export to CSV",value:"exportCsv"},{name:"Export to JSON",value:"exportJson"},new le];Yt&&we.push({name:"Previous Page",value:"prev"}),Ht&&we.push({name:"Next Page",value:"next"}),we.push({name:T.dim(" Back"),value:"BACK"});let v=await Je({message:"Select an action for this table:",theme:{prefix:T.cyan("\u2713 "),icon:{cursor:T.cyan("\u203A ")},style:{message:P=>T.bold(T.white(P)),highlight:P=>{let R=P.replace(/\x1b\[[0-9;]*m/g,"");return R.includes(" Back")?T.red(R):T.cyan(R)}}},choices:we});if(v==="prev"){p--;continue}if(v==="next"){p++;continue}if(v==="noop")continue;if(v==="BACK"){m=!1;continue}if(v==="clear_search"){u="",p=1;continue}if(v==="search"){let{input:P}=await import("@inquirer/prompts"),O=(await P({message:"Enter Search (e.g. `age > 18` or `John` for fuzzy search):"})).trim();if(O){if(/[=<>]|LIKE|IN|AND|OR/i.test(O))u=O;else{let z=y.filter(F=>F.type.toLowerCase().includes("char")||F.type.toLowerCase().includes("text"));if(z.length>0){let F=s.type==="postgres"?"ILIKE":"LIKE";u=z.map(Ee=>`"${Ee.name}" ${F} '%${O.replace(/'/g,"''")}%'`).join(" OR ")}else u=`"${y[0].name}" = '${O}'`}p=1}continue}if(v==="exportCsv"||v==="exportJson"){try{console.log(T.yellow(`
172
- Exporting data...`));let R=await a.getData(l,9999999,0,u),O=await import("fs/promises"),be=await import("path"),z=be.join(process.cwd(),"drixio_exports");if(await O.mkdir(z,{recursive:!0}),v==="exportCsv"){let F=R.columns.join(",")+`
171
+ `)),u="";let{input:R}=await import("@inquirer/prompts");await R({message:"Click Enter to continue..."});continue}let k=x.rows,Kt=` ${l} (Page ${p}) `;ee(b,k,{title:Kt,maxColWidth:30});let Ht=k.length===d,Yt=p>1,we=[{name:"Add Data",value:"add"},{name:"Edit Data",value:"edit"},{name:"Delete Data",value:"delete"},new le,{name:"Search Data",value:"search"},{name:u?"Clear Search":T.dim("Clear Search (disabled)"),value:u?"clear_search":"noop"},new le,{name:"Export to CSV",value:"exportCsv"},{name:"Export to JSON",value:"exportJson"},new le];Yt&&we.push({name:"Previous Page",value:"prev"}),Ht&&we.push({name:"Next Page",value:"next"}),we.push({name:T.dim(" Back"),value:"BACK"});let v=await Je({message:"Select an action for this table:",theme:{prefix:T.cyan("\u2713 "),icon:{cursor:T.cyan("\u203A ")},style:{message:P=>T.bold(T.white(P)),highlight:P=>{let R=P.replace(/\x1b\[[0-9;]*m/g,"");return R.includes(" Back")?T.red(R):T.cyan(R)}}},choices:we});if(v==="prev"){p--;continue}if(v==="next"){p++;continue}if(v==="noop")continue;if(v==="BACK"){m=!1;continue}if(v==="clear_search"){u="",p=1;continue}if(v==="search"){let{input:P}=await import("@inquirer/prompts"),O=(await P({message:"Enter Search (e.g. `age > 18` or `John` for fuzzy search):"})).trim();if(O){if(/[=<>]|LIKE|IN|AND|OR/i.test(O))u=O;else{let z=y.filter(U=>U.type.toLowerCase().includes("char")||U.type.toLowerCase().includes("text"));if(z.length>0){let U=s.type==="postgres"?"ILIKE":"LIKE";u=z.map(Ee=>`"${Ee.name}" ${U} '%${O.replace(/'/g,"''")}%'`).join(" OR ")}else u=`"${y[0].name}" = '${O}'`}p=1}continue}if(v==="exportCsv"||v==="exportJson"){try{console.log(T.yellow(`
172
+ Exporting data...`));let R=await a.getData(l,9999999,0,u),O=await import("fs/promises"),be=await import("path"),z=be.join(process.cwd(),"drixio_exports");if(await O.mkdir(z,{recursive:!0}),v==="exportCsv"){let U=R.columns.join(",")+`
173
173
  `,_e=R.rows.map(Gt=>R.columns.map(zt=>`"${String(Gt[zt]??"").replace(/"/g,'""')}"`).join(",")).join(`
174
- `),Ee=be.join(z,`${l}.csv`);await O.writeFile(Ee,F+_e,"utf-8"),console.log(T.green(`
175
- Exported to ${Ee}`))}else{let F=be.join(z,`${l}.json`);await O.writeFile(F,JSON.stringify(R.rows,null,2),"utf-8"),console.log(T.green(`
176
- Exported to ${F}`))}}catch(R){console.log(T.red(`
174
+ `),Ee=be.join(z,`${l}.csv`);await O.writeFile(Ee,U+_e,"utf-8"),console.log(T.green(`
175
+ Exported to ${Ee}`))}else{let U=be.join(z,`${l}.json`);await O.writeFile(U,JSON.stringify(R.rows,null,2),"utf-8"),console.log(T.green(`
176
+ Exported to ${U}`))}}catch(R){console.log(T.red(`
177
177
  Export Error: ${R.message}`))}let{input:P}=await import("@inquirer/prompts");await P({message:"Click Enter to continue..."});continue}let Me=await Je({message:`Select mode for ${v} data:`,choices:[{name:"Beginner (Interactive Step-by-Step)",value:"beginner"},{name:"Expert (Load SQL from .sql or .md file)",value:"expert"},new le,{name:T.dim("Cancel"),value:"cancel"}]});if(Me!=="cancel"){if(Me==="expert"){await ze(a),await te();continue}v==="add"?(await He(a,s.type,l,y),await te()):v==="edit"?(await Ye(a,s.type,l,y),await te()):v==="delete"&&(await Ge(a,s.type,l,y),await te())}}}catch(i){console.log(T.red(`
178
178
  x Error: ${i.message}`)),await te(),t=!1}}await a.close()}async function te(){let{input:s}=await import("@inquirer/prompts");await s({message:"Press Enter to continue..."})}import{select as ma,input as ua}from"@inquirer/prompts";import ae from"picocolors";A();async function Ze(s){let a=await ma({message:"What method you want to use to setup database connection?",choices:[{name:" Auto-Config",value:"auto",description:"Automatically detect and setup database connection (May fail for some cases)."},{name:" Manual Config",value:"manual",description:"Manually setup database connection by entering parameters step by step."}]}),t=s;switch(a){case"auto":let r=await q();r.type!=="unknown"?(t=r,console.log(ae.green(`
179
179
  Database connection setup successfully.`))):console.log(ae.red(`
180
180
  Failed to auto-detect database connection. Please try manual configuration.`));break;case"manual":let o=await ua({message:"Enter the database connection URL: "});if(o){let e=await q(o);console.log(ae.dim(`
181
- Testing connection...`));try{let n=h(e);await n.getTables(),await n.close(),t=e,await Ue(o),console.log(ae.green("\u2713 Database connection setup successfully and saved to .env!"))}catch(n){console.log(ae.red(`
181
+ Testing connection...`));try{let n=h(e);await n.getTables(),await n.close(),t=e,await Fe(o),console.log(ae.green("\u2713 Database connection setup successfully and saved to .env!"))}catch(n){console.log(ae.red(`
182
182
  x Connection failed: ${n.message}
183
183
  Please enter a valid database URL or check your database status.`))}}else console.log(ae.red(`
184
184
  Failed to detect database connection. Please enter valid database URL.`));break}return t}import{select as pa,Separator as da}from"@inquirer/prompts";import H from"picocolors";var et=async s=>await pa({message:"Select an action:",theme:{prefix:H.cyan("\u2713 "),icon:{cursor:H.cyan("\u203A ")},style:{message:a=>H.bold(H.white(a)),highlight:a=>{let t=a.replace(/\x1b\[[0-9;]*m/g,"");return t.includes("Exit")?H.red(t):H.cyan(t)}}},choices:[{name:" Data Browser & Editor",value:"editor",description:"View, insert, update, and delete row data in your tables.",disabled:s.type==="unknown"},{name:" Run Raw SQL (REPL)",value:"repl",description:"Execute arbitrary SQL queries interactively.",disabled:s.type==="unknown"},{name:" Table Builder & Manager",value:"table",description:"Create new tables, or modify/drop existing tables.",disabled:s.type==="unknown"},new da,{name:s.type==="unknown"?" Setup Connection":" Connection Settings",value:s.type==="unknown"?"setup":"re-configure",description:s.type==="unknown"?"Setup the database connection manually.":"Re-configure the database connection."},{name:H.dim(" Exit"),value:"exit",description:"Exit the Drixio CLI application."}]});A();Ce();import B from"picocolors";async function tt(s){if(s.type==="unknown")return;let a=h(s),t=!0,{input:r}=await import("@inquirer/prompts");for(console.clear(),console.log(B.cyan(`
@@ -191,7 +191,7 @@ Drixio CLI - Modern Database Manager
191
191
  `)),console.log(`${D.bold("Usage:")} npx drixio [command] [options]
192
192
  `),console.log(`${D.bold("Commands:")}`),console.log(` ${D.green("query")} "<sql>" Run a quick SQL query`),console.log(` ${D.green("exec")} <file.sql> Execute a SQL script file`),console.log(` ${D.green("export")} [table] Export table(s) to CSV/JSON`),console.log(` ${D.green("import")} [file] Import JSON/CSV into a table`),console.log(` ${D.green("seed")} [table] [count] Generate fake data for a table`),console.log(` ${D.green("diagram")} Generate a Mermaid ER diagram`),console.log(` ${D.green("generate-types")} Generate TypeScript interfaces`),console.log(` ${D.green("backup")} Backup the entire database`),console.log(` ${D.green("studio")} Launch the Web UI Studio`),console.log(` ${D.green("init")} [db_type] Initialize a local database & .env`),console.log(` ${D.green("drop-db")} [db_type] Drop a local database`),console.log(`
193
193
  ${D.bold("Options:")}`),console.log(" --help Show this help message"),console.log(" --format <type> Specify export format (csv|json)"),console.log(" --schema-only Export schema without data"),console.log(" --table <name> Specify table for import"),console.log(`
194
- If you don't provide a command, Drixio will launch the Interactive UI!`),process.exit(0));let o=a?void 0:t[0];if(o==="query"){let{runQueryCommand:i}=await Promise.resolve().then(()=>(ot(),at)),l=await q();await i(l,t.slice(1));return}if(o==="export"){let{runExportCommand:i}=await Promise.resolve().then(()=>(st(),nt)),l=await q();await i(l,t.slice(1),r);return}if(o==="studio"){let{runStudio:i}=await Promise.resolve().then(()=>(mt(),ct)),l=await q();await i(l);return}if(o==="backup"){let{runBackupCommand:i}=await Promise.resolve().then(()=>(pt(),ut)),l=await q();await i(l);return}if(o==="import"){let{runImportCommand:i}=await Promise.resolve().then(()=>(ft(),gt)),l=await q();await i(l,t.slice(1),r);return}if(o==="seed"){let{runSeedCommand:i}=await Promise.resolve().then(()=>(ht(),yt)),l=await q();await i(l,t.slice(1));return}if(o==="diagram"){let{runDiagramCommand:i}=await Promise.resolve().then(()=>(bt(),wt)),l=await q();await i(l);return}if(o==="exec"){let{runExecCommand:i}=await Promise.resolve().then(()=>($t(),St)),l=await q();await i(l,t.slice(1));return}if(o==="generate-types"){let{runGenerateTypesCommand:i}=await Promise.resolve().then(()=>(Tt(),xt)),l=await q();await i(l);return}if(o==="init"){let{runInitCommand:i}=await Promise.resolve().then(()=>(Ct(),At));await i(t.slice(1));return}if(o==="drop-db"){let{runDropDbCommand:i}=await Promise.resolve().then(()=>(vt(),qt));await i(t.slice(1));return}let e=!0,n=await q(a);for(;e;)switch(console.clear(),Oe(),Fe(n),await et(n)){case"editor":n.type==="unknown"?(console.log(D.yellow(`
194
+ If you don't provide a command, Drixio will launch the Interactive UI!`),process.exit(0));let o=a?void 0:t[0];if(o==="query"){let{runQueryCommand:i}=await Promise.resolve().then(()=>(ot(),at)),l=await q();await i(l,t.slice(1));return}if(o==="export"){let{runExportCommand:i}=await Promise.resolve().then(()=>(st(),nt)),l=await q();await i(l,t.slice(1),r);return}if(o==="studio"){let{runStudio:i}=await Promise.resolve().then(()=>(mt(),ct)),l=await q();await i(l);return}if(o==="backup"){let{runBackupCommand:i}=await Promise.resolve().then(()=>(pt(),ut)),l=await q();await i(l);return}if(o==="import"){let{runImportCommand:i}=await Promise.resolve().then(()=>(ft(),gt)),l=await q();await i(l,t.slice(1),r);return}if(o==="seed"){let{runSeedCommand:i}=await Promise.resolve().then(()=>(ht(),yt)),l=await q();await i(l,t.slice(1));return}if(o==="diagram"){let{runDiagramCommand:i}=await Promise.resolve().then(()=>(bt(),wt)),l=await q();await i(l);return}if(o==="exec"){let{runExecCommand:i}=await Promise.resolve().then(()=>($t(),St)),l=await q();await i(l,t.slice(1));return}if(o==="generate-types"){let{runGenerateTypesCommand:i}=await Promise.resolve().then(()=>(Tt(),xt)),l=await q();await i(l);return}if(o==="init"){let{runInitCommand:i}=await Promise.resolve().then(()=>(Ct(),At));await i(t.slice(1));return}if(o==="drop-db"){let{runDropDbCommand:i}=await Promise.resolve().then(()=>(vt(),qt));await i(t.slice(1));return}let e=!0,n=await q(a);for(;e;)switch(console.clear(),Oe(),Ue(n),await et(n)){case"editor":n.type==="unknown"?(console.log(D.yellow(`
195
195
  No database connection found. Please run ${D.bold("drixio check")} first.`)),await c()):await Xe(n);break;case"table":let{runTableManagerFlow:l}=await Promise.resolve().then(()=>(Qt(),jt));await l(n);break;case"repl":await tt(n);break;case"setup":case"re-configure":n=await Ze(n),await c();break;case"exit":e=!1,console.log(D.dim(`
196
196
  Thanks for using Drixio. Goodbye!`));break}async function c(){let{input:i}=await import("@inquirer/prompts");await i({message:"Click Enter to continue..."})}}Vt().catch(s=>{s.name==="ExitPromptError"&&(console.log(`
197
197
  Exit Drixio.`),process.exit(0)),console.error(`
@@ -0,0 +1 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";:root{--color-bg-primary:#fff;--color-bg-secondary:#f8fafc;--color-bg-secondary-dark:#f1f5f9;--color-primary:#2c68ec;--color-primary-active:#eff6ff;--color-primary-dark:#285bb8;--color-text:#0f172a;--color-text-soft:#94a3b8;--color-text-secondary:#64748b;--color-border:#e2e8f0;--color-border-soft:#f1f5f9;--ring-primary-2:0 0 0 2px #2c68ec33;--font-inter:"Inter", sans-serif;--color-btn-active-text:var(--color-primary);--color-cell-range-bg:#dbeafe;--color-cell-edited-bg:#fffbeb;--color-cell-edited-text:#b45309;--color-cell-error-bg:#fef2f2;--color-row-deleted-bg:#fee2e2;--color-row-deleted-text:#ef4444;--color-ghost-row-bg:#f8fafc}[data-theme=dark]{--color-bg-primary:#0f172a;--color-bg-secondary:#1e293b;--color-bg-secondary-dark:#334155;--color-primary:#3b82f6;--color-primary-active:#1e3a8a;--color-primary-dark:#60a5fa;--color-text:#f8fafc;--color-text-soft:#64748b;--color-text-secondary:#cbd5e1;--color-border:#334155;--color-border-soft:#1e293b;--ring-primary-2:0 0 0 2px #3b82f633;--color-btn-active-text:#fff;--color-cell-range-bg:#3b82f626;--color-cell-edited-bg:#f59e0b26;--color-cell-edited-text:#fbbf24;--color-cell-error-bg:#ef444426;--color-row-deleted-bg:#ef444426;--color-row-deleted-text:#f87171;--color-ghost-row-bg:var(--color-bg-secondary)}body,html{background-color:var(--color-bg-primary);width:100vw;height:100vh;color:var(--color-text);font-family:var(--font-inter);margin:0;padding:0;display:flex;overflow:hidden}main{flex-direction:column;flex:1;min-width:0;display:flex}aside{border-right:1px var(--color-border) solid;box-sizing:border-box;flex-direction:column;width:256px;height:100vh;display:flex}#sidebar-header{border-bottom:1px var(--color-border-soft) solid;box-sizing:border-box;align-items:center;gap:8px;height:64px;padding:0 16px;display:flex}.table-btn{color:var(--color-text-secondary);cursor:pointer;letter-spacing:.5px;background-color:#0000;border:1px solid #0000;border-radius:8px;outline:none;justify-content:space-between;align-items:center;padding:10px 16px;font-size:12px;font-weight:500;transition:all .2s;display:flex}#sidebar-footer{flex:1;align-items:center;min-width:0;display:flex}aside{border-right:1px var(--color-border) solid;flex-direction:column;width:256px;height:100vh;display:flex}#sidebar-header{border-bottom:1px var(--color-border-soft) solid;align-items:center;gap:8px;height:64px;padding:0 16px;display:flex}#database-icon{color:var(--color-primary);font-size:26px}#brand-title{letter-spacing:.5px;align-items:center;gap:4px;margin:0;padding:0;font-size:16px;font-weight:bolder;line-height:1;display:flex}#brand-subtitle{background-color:var(--color-primary);color:#fff;border-radius:5px;align-items:center;height:100%;padding:4px 6px;font-size:12px;font-weight:600;line-height:1;display:flex}#sidebar-content{flex-direction:column;flex:1;gap:24px;padding:16px;display:flex}#search-bar{background-color:var(--color-bg-secondary);border:1px var(--color-border) solid;border-radius:8px;outline:none;align-items:center;padding:0 4px;transition:all .1s linear;display:flex;overflow:hidden}#search-bar:focus-within{border:1px var(--color-primary) solid;box-shadow:var(--ring-primary-2);background-color:var(--color-bg-primary);transform:scale(1.02)}#search-icon{color:var(--color-text-soft);margin:0 3px 0 6px;font-size:20px;transition:all .1s linear}#search-bar:focus-within #search-icon{color:var(--color-primary);transform:scale(1.15)}#search-input{width:100%;height:34px;color:var(--color-text);background-color:#0000;border:none;outline:none;font-size:12px}#search-input::placeholder{color:var(--color-text-soft)}#table-nav{flex-direction:column;flex:1;gap:6px;display:flex;overflow-y:auto}#table-nav::-webkit-scrollbar{width:4px}#table-nav::-webkit-scrollbar-track{background:0 0}#table-nav::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:4px}#table-nav::-webkit-scrollbar-thumb:hover{background:var(--color-text-soft)}.table-btn{color:var(--color-text-secondary);cursor:pointer;background-color:#0000;border:1px solid #0000;border-radius:8px;outline:none;justify-content:space-between;align-items:center;padding:10px 16px;font-size:12px;font-weight:500;transition:all .2s;display:flex}.table-btn:hover{background-color:var(--color-bg-secondary);color:var(--color-text)}.table-btn:active{transform:scale(.97)}.table-btn.active{background-color:var(--color-primary-active);border:1px var(--color-primary) solid;color:var(--color-btn-active-text);font-weight:600}.table-btn-badge{background-color:var(--color-bg-secondary-dark);color:var(--color-text-secondary);border-radius:10px;justify-content:center;align-items:center;min-width:16px;min-height:16px;padding:1px;font-size:8px;font-weight:600;line-height:1;display:flex}.table-btn.active .table-btn-badge{background-color:var(--color-primary);color:#fff}#not-found-msg{color:var(--color-text-soft);flex:1;justify-content:center;align-items:center;font-size:12px;font-weight:400;display:flex}#sidebar-footer{border-top:1px var(--color-border-soft) solid;justify-content:center;align-items:center;max-height:fit-content;margin-top:auto;padding:16px;display:flex}#theme-toggle{background-color:var(--color-bg-secondary);color:var(--color-text-secondary);border:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;width:100%;padding:12px 24px;font-weight:600;transition:all .1s linear;display:flex}#theme-toggle:hover{color:var(--color-primary);border-color:var(--color-primary);background-color:var(--color-bg-primary)}header{border-bottom:1px var(--color-border) solid;box-sizing:border-box;justify-content:space-between;align-items:center;width:100%;height:64px;padding:0 32px;font-size:14px;font-weight:300;display:flex;position:sticky;top:0}#current-path{text-transform:lowercase;align-items:center;gap:10px;display:flex}#db-name{color:var(--color-text-secondary)}#slash{color:var(--color-text-soft);font-size:18px;font-weight:lighter}#current-table{align-items:center;gap:4px;display:flex}#table-icon{color:var(--color-primary);font-size:20px}#table-name{color:var(--color-text);font-weight:600}#tab-nav{border-bottom:1px var(--color-border) solid;gap:24px;height:48px;padding:0 32px;display:flex}.tab-btn{height:100%;color:var(--color-text-secondary);cursor:pointer;background-color:#0000;border:none;border-bottom:2px solid #0000;outline:none;align-items:center;gap:8px;padding:0 6px;font-size:12px;font-weight:300;line-height:1;transition:all .1s linear;display:flex}.tab-btn:hover{border-bottom:2px var(--color-border) solid;color:var(--color-text)}.tab-btn.isCurrentTab{border-bottom:2px var(--color-primary) solid;color:var(--color-primary)}.tab-btn .material-symbols-outlined{font-size:16px}#main-content{background-color:var(--color-bg-primary);flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.toolbar{border-bottom:1px var(--color-border) solid;background-color:var(--color-bg-secondary);flex-shrink:0;align-items:center;height:48px;display:flex}.filter-group{flex:1;align-items:center;height:100%;transition:all .15s;display:flex;overflow:hidden}.filter-icon-container{background-color:var(--color-bg-secondary);border-right:1px var(--color-border) solid;align-items:center;gap:6px;height:100%;padding:0 16px;font-size:16px;display:flex}.filter-icon-container .material-symbols-outlined{color:var(--color-text-secondary);font-size:18px}.filter-icon-container span:not(.material-symbols-outlined){text-transform:uppercase;color:var(--color-text-secondary);font-size:13px;font-weight:500}.filter-select{height:100%;color:var(--color-text-secondary);border:none;border-right:1px var(--color-border) solid;cursor:pointer;background-color:#0000;outline:none;padding:0 16px;font-size:13px;font-weight:500}.filter-select:hover{background-color:var(--color-bg-secondary)}.filter-input{height:100%;color:var(--color-text);background:0 0;border:none;outline:none;flex:1;padding:0 20px;font-size:13px;font-weight:200}.filter-input::placeholder{color:var(--color-text-soft)}#btn-run-query{background-color:var(--color-primary);color:#fff;border:none;border-right:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;padding:8px 12px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}#btn-run-query:hover{background-color:var(--color-primary-dark)}#btn-run-query .material-symbols-outlined{margin-bottom:.5px;font-size:16px}#btn-clear-query{background-color:var(--color-bg-primary);color:var(--color-text-secondary);border:none;border:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;margin-left:16px;padding:8px 12px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}#btn-clear-query:hover{background-color:var(--color-bg-secondary-dark);color:var(--color-text)}#btn-run-query:active,#btn-clear-query:active,.btn-primary:active,.btn-secondary:active,.table-btn:active{transform:scale(.96)}#btn-clear-query .material-symbols-outlined{margin-bottom:.5px;font-size:16px}.refresh-btn{background-color:var(--color-bg-secondary);border:1px var(--color-border) solid;color:var(--color-text-secondary);cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;margin:16px;padding:6px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}.refresh-btn:hover{background-color:var(--color-bg-secondary-dark);color:var(--color-text)}.refresh-btn .material-symbols-outlined{margin-bottom:.5px;font-size:18px}.sql-console-wrapper{background-color:var(--color-bg-secondary);text-wrap:nowrap;flex-direction:column-reverse;height:100%;display:flex}#console-welcome-msg{color:var(--color-text-soft);text-align:center;letter-spacing:.5px;flex-direction:column;justify-content:center;align-items:center;gap:10px;margin:auto 0;font-family:monospace;display:flex}#console-welcome-title{color:var(--color-text);flex-direction:column;align-items:center;gap:36px;font-size:24px;font-weight:bolder;display:flex}#console-welcome-title #icon-container{background-color:var(--color-primary);color:#fff;border-radius:12px;justify-content:center;align-items:center;width:fit-content;padding:14px;display:flex}#console-welcome-description{text-wrap:wrap;max-width:50%;font-size:14px;line-height:2}#console-welcome-description b{color:var(--color-primary);background-color:var(--color-bg-secondary);border-radius:4px;padding:2px 6px;font-size:16px}#console-welcome-hint{opacity:.65;margin-top:24px;font-size:12px}.sql-console-wrapper{background-color:var(--color-bg-primary);flex-direction:column;height:100%;display:flex;overflow:hidden}.sql-console-wrapper ::-webkit-scrollbar{display:none}.sql-console-wrapper{-ms-overflow-style:none;scrollbar-width:none}#console-history-pane{flex-direction:column;flex:1;gap:24px;padding:24px;display:flex;overflow-y:auto}#console-input-pane{border-top:1px solid var(--color-border);background-color:var(--color-bg-secondary);flex-direction:column;flex-shrink:0;padding:16px 24px;display:flex;position:relative;box-shadow:0 -4px 12px #00000005}.sql-editor-wrapper{align-items:flex-start;gap:8px;display:flex}.sql-prompt{color:var(--color-primary);-webkit-user-select:none;user-select:none;margin-top:1.5px;font-family:monospace;font-size:14px;font-weight:700}.sql-editor-layer-container{flex:1;height:fit-content;min-height:128px;position:relative}#sql-highlight-layer{pointer-events:none;white-space:pre-wrap;word-break:break-all;z-index:1;margin:0;padding:0;position:absolute;inset:1.5px 0 0;overflow:hidden}.sql-editor{resize:none;width:100%;height:fit-content;min-height:128px;color:var(--color-text);letter-spacing:.8px;background-color:#0000;border:none;outline:none;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:14px;line-height:normal}textarea#sql-editor{z-index:2;width:100%;height:100%;caret-color:var(--color-text);margin:0;padding:0;position:absolute;top:0;left:0;color:#0000!important}.console-history-block{background-color:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:8px;flex-shrink:0;overflow:hidden;box-shadow:0 2px 8px #0000000d}.console-history-header{background-color:var(--color-bg-primary);border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:flex-start;gap:16px;padding:12px 16px;display:flex}.console-history-sql{color:var(--color-text);white-space:pre-wrap;word-break:break-all;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.5}.console-history-actions{flex-shrink:0;gap:4px;display:flex}.console-history-actions .icon-btn{cursor:pointer;color:var(--color-text-soft);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.console-history-results{max-height:400px;padding:16px;overflow:auto}.console-msg-executing,.console-msg-error,.console-msg-success{align-items:center;gap:8px;font-family:monospace;font-size:13px;display:flex}.console-msg-executing{color:var(--color-text-soft)}.console-msg-error{color:var(--color-error);white-space:pre-wrap;align-items:flex-start}.console-msg-success{color:#10b981}.console-stats-header{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.console-stats-info{color:var(--color-text-soft);align-items:center;gap:6px;font-family:monospace;font-size:12px;display:flex}.console-export-btn{border:1px solid var(--color-border);cursor:pointer;color:var(--color-text);background:0 0;border-radius:4px;align-items:center;gap:4px;padding:4px 8px;font-size:12px;font-weight:500;display:flex}.hl-string{color:#98c379}.hl-number{color:#d19a66}.hl-keyword{color:#c678dd;font-weight:700}.hl-placeholder{color:var(--color-text-soft);opacity:.5}.data-cell-truncate{white-space:nowrap;text-overflow:ellipsis;max-width:300px;overflow:hidden}.table-container{background-color:var(--color-bg-primary);scrollbar-width:none;-ms-overflow-style:none;flex:1;width:100%;min-width:0;overflow:auto}.table-container::-webkit-scrollbar{display:none}.data-table{border-collapse:separate;border-spacing:0;-webkit-user-select:none;user-select:none;width:max-content;min-width:100%}.data-table input,.data-table select{-webkit-user-select:text;user-select:text;box-sizing:border-box}.data-table th,.data-table td{text-align:left;border-bottom:1px var(--color-border-soft) solid;border-right:1px var(--color-border-soft) solid;white-space:nowrap;cursor:cell;height:24px;padding:8px 16px;font-size:13px;position:relative}.data-table th{background-color:var(--color-primary);color:#fff;text-transform:uppercase;letter-spacing:.5px;z-index:10;border-bottom:1px var(--color-border) solid;box-shadow:0 1px 0 var(--color-border);cursor:default;border-right:1px solid #fff3;font-size:11px;font-weight:600;position:sticky;top:0}.data-table td.cell-in-range{background-color:var(--color-cell-range-bg)}.data-table td.cell-in-range:after{content:"";box-sizing:border-box;pointer-events:none;border-top:var(--border-t,0);border-bottom:var(--border-b,0);border-left:var(--border-l,0);border-right:var(--border-r,0);position:absolute;inset:0}.data-table td.range-top{--border-t:2px solid var(--color-primary)}.data-table td.range-bottom{--border-b:2px solid var(--color-primary)}.data-table td.range-left{--border-l:2px solid var(--color-primary)}.data-table td.range-right{--border-r:2px solid var(--color-primary)}.data-table td.cell-selected{background-color:var(--color-bg-primary);z-index:5;box-shadow:inset 0 0 0 2px var(--color-primary)}.data-table td.row-header,.data-table th.row-header{z-index:9;background-color:var(--color-bg-secondary);color:var(--color-text-soft);text-align:center;border-right:1px var(--color-border) solid;width:32px;min-width:32px;padding:8px 4px;font-weight:500;position:sticky;left:0}.data-table th.row-header{z-index:11;background-color:var(--color-primary);color:#fff}.data-table td.cell-edited{background-color:var(--color-cell-edited-bg);color:var(--color-cell-edited-text);font-weight:700}.data-table td.cell-error{background-color:var(--color-cell-error-bg)}.data-table td.cell-error:not(.cell-in-range):not(.cell-selected){box-shadow:inset 0 0 0 2px #ef4444}.data-table tr.row-deleted td{text-decoration:line-through;background-color:var(--color-row-deleted-bg)!important;color:var(--color-row-deleted-text)!important}.data-table td.ghost-row{color:var(--color-text-soft);background-color:var(--color-ghost-row-bg);font-style:italic}.data-table td input,.data-table td select{box-sizing:border-box;width:100%;height:100%;color:var(--color-text);background-color:var(--color-bg-primary);box-shadow:var(--ring-primary-2);border:none;outline:none;padding:0 16px;font-family:inherit;font-size:13px;position:absolute;top:0;left:0}.data-table tbody tr:hover:not(:has(.manage-indexes-cell:hover)){background-color:var(--color-bg-secondary)}.manage-indexes-cell{background-color:var(--color-bg-primary)!important}.manage-indexes-cell:hover{background-color:var(--color-bg-secondary)!important}.resizer{cursor:col-resize;-webkit-user-select:none;user-select:none;z-index:10;width:8px;height:100%;position:absolute;top:0;right:-4px}.resizer:hover,.resizer:active{background-color:var(--color-primary);opacity:.5}.cell-expand-btn{cursor:pointer;color:var(--color-text-soft);background-color:var(--color-bg-primary);border:1px var(--color-border) solid;z-index:10;border-radius:4px;justify-content:center;align-items:center;padding:3px;font-size:14px;transition:all .1s;display:flex;position:absolute;top:50%;right:6px;transform:translateY(-50%);box-shadow:0 2px 4px #0000000d}.cell-expand-btn:hover{color:var(--color-primary);border-color:var(--color-primary)}#modal-editor-overlay{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:9999;background-color:#0f172a66;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.modal-editor-container{background-color:var(--color-bg-primary);background-color:rgba(var(--color-bg-primary), .85);background:var(--color-bg-primary);border-radius:12px;flex-direction:column;width:600px;max-width:90vw;height:500px;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 10px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.modal-header{border-bottom:1px var(--color-border) solid;color:var(--color-text);align-items:center;gap:8px;padding:16px 20px;display:flex}.modal-header h3{margin:0;font-size:16px;font-weight:600}.modal-header .material-symbols-outlined{color:var(--color-primary)}#modal-textarea{resize:none;color:var(--color-text);background-color:var(--color-bg-secondary-dark);border:none;outline:none;flex:1;padding:20px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px}#modal-textarea:focus{background-color:var(--color-bg-primary)}.modal-footer{border-top:1px var(--color-border) solid;background-color:var(--color-bg-secondary);justify-content:flex-end;gap:12px;padding:16px 20px;display:flex}.modal-footer button{cursor:pointer;border:1px var(--color-border) solid;background-color:var(--color-bg-primary);color:var(--color-text);border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;transition:all .2s}.modal-footer button:active{transform:scale(.97)}.modal-footer button:hover{background-color:var(--color-bg-secondary-dark)}.modal-footer button.primary{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.modal-footer button.primary:hover{background-color:var(--color-primary-dark)}.empty-state{flex-direction:column;flex:1;justify-content:center;align-items:center;display:flex}.empty-state .icon-container{background-color:var(--color-primary);color:#fff;border-radius:10px;justify-content:center;align-items:center;width:64px;height:64px;display:flex;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.empty-state .material-symbols-outlined{font-size:36px}.empty-state h2{color:var(--color-text);margin-top:32px;margin-bottom:10px;font-size:24px;font-weight:700}.empty-state p{color:var(--color-text-secondary);text-align:center;max-width:500px;margin:0;font-size:16px;line-height:1.5}#toast-container{z-index:10000;flex-direction:column;gap:10px;display:flex;position:fixed;bottom:20px;right:20px}.toast{background-color:var(--color-bg-primary);color:var(--color-text);border-left:4px solid var(--color-primary);opacity:0;border-radius:8px;align-items:center;gap:8px;padding:12px 20px;font-size:14px;font-weight:500;animation:.3s ease-out forwards slideIn,.3s ease-in 2.7s forwards fadeOut;display:flex;transform:translate(100%);box-shadow:0 4px 12px #00000026}.toast.error{border-left-color:#ef4444}@keyframes slideIn{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}#theme-toggle{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:all .2s;display:flex}#theme-toggle:hover{background-color:var(--color-bg-secondary);color:var(--color-text)}#theme-toggle:active{transform:scale(.9)}.erd-node{border:1px solid var(--color-border);background:var(--color-bg-primary);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:12px;flex-direction:column;width:300px;transition:box-shadow .2s,transform .1s;display:flex;position:absolute;overflow:hidden;box-shadow:0 4px 12px #0000001a}.erd-node:hover{box-shadow:0 8px 24px #00000026}.erd-node.is-selected{border:1px solid var(--color-primary);box-shadow:0 0 0 3px var(--color-cell-range-bg)}.erd-node-header{background-color:var(--color-primary);color:#fff;cursor:grab;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;padding:12px 14px;font-size:16px;display:flex}.erd-node-header:active{cursor:grabbing}.erd-node-body{flex-direction:column;display:flex}.erd-column{border-bottom:1px solid var(--color-border);background-color:#0000;justify-content:space-between;align-items:center;padding:12px 14px;font-size:12px;transition:background-color .15s;display:flex}.erd-column:last-child{border-bottom:none}.erd-column:hover{background-color:var(--color-bg-secondary)}.erd-col-left{align-items:center;gap:8px;display:flex}.erd-col-name{color:var(--color-text);font-family:JetBrains Mono,Fira Code,monospace;font-size:12px}.erd-col-right{align-items:center;display:flex}.erd-col-type{color:var(--color-text-soft);background-color:var(--color-bg-secondary);border-radius:4px;padding:4px 6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:10px}#erd-wrapper{scrollbar-width:none;-ms-overflow-style:none;background-color:var(--color-bg-secondary)}#erd-wrapper::-webkit-scrollbar{display:none}.erd-node.is-draft{border:2px dashed var(--color-primary);box-shadow:0 0 15px rgba(var(--color-primary-rgb), .2)}.erd-column.is-draft{background-color:rgba(var(--color-primary-rgb), .05)}.erd-add-col-btn{text-align:center;color:var(--color-primary);cursor:pointer;border-top:1px dashed var(--color-border);background-color:#0000;justify-content:center;align-items:center;gap:6px;padding:14px;font-size:12px;font-weight:500;transition:background-color .15s;display:flex}.erd-add-col-btn:hover{background-color:var(--color-bg-secondary)}.drixio-context-menu{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:9999;border-radius:8px;min-width:180px;padding:6px 0;font-family:inherit;display:none;position:fixed;box-shadow:0 8px 24px #00000026}.drixio-context-menu.visible{display:block}.drixio-context-menu-item{cursor:pointer;color:var(--color-text);align-items:center;gap:12px;padding:8px 16px;font-size:13px;transition:background-color .1s;display:flex}.drixio-context-menu-item:hover{background-color:var(--color-cell-range-bg)}.drixio-context-menu-item.danger,.drixio-context-menu-item.danger .material-symbols-outlined{color:#ef4444}.drixio-context-menu-item.danger:hover{background-color:#ef44441a}.drixio-context-menu-item .material-symbols-outlined{color:var(--color-text-soft);font-size:18px}.drixio-menu-label{flex:1}.drixio-menu-shortcut{color:var(--color-text-soft);opacity:.7;font-size:11px}.drixio-context-menu-divider{background-color:var(--color-border);height:1px;margin:4px 0}.erd-inline-input{background:var(--color-bg-primary);border:1px solid var(--color-primary);color:var(--color-text);font:inherit;border-radius:4px;outline:none;width:100%;padding:2px 6px}.erd-drag-handle{border:2px solid var(--color-primary);background:var(--color-bg-primary);cursor:crosshair;opacity:.4;border-radius:50%;width:14px;height:14px;margin-left:8px;transition:opacity .2s,transform .2s}.erd-drag-handle:hover{transform:scale(1.2)}.erd-column:hover .erd-reorder-handle{opacity:1}.erd-drag-line{pointer-events:none;z-index:50;width:100%;height:100%;position:absolute;top:0;left:0}.erd-grid-bg{background-image:linear-gradient(90deg,#0000000d 1px,#0000 1px),linear-gradient(#0000000d 1px,#0000 1px);background-position:50%;background-size:20px 20px}.erd-ui-overlay{pointer-events:none;z-index:100;justify-content:space-between;padding:16px;display:flex;position:fixed;top:60px;left:320px;right:0}.erd-toolbar{pointer-events:auto;gap:8px;display:flex}.erd-search-container{pointer-events:auto;align-items:center;display:flex;position:relative}.erd-search-container .search-icon{color:var(--color-text-soft);font-size:18px;position:absolute;left:8px}.erd-search-container input{background-color:var(--color-bg-primary);border:1px solid var(--color-border);color:var(--color-text);border-radius:6px;width:250px;padding:8px 12px 8px 32px;font-family:inherit;font-size:13px;box-shadow:0 4px 6px #0000000d}.erd-search-container input:focus{border-color:var(--color-primary);outline:none}.erd-search-results{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:110;border-radius:6px;max-height:300px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 8px 16px #0000001a}.erd-search-item{cursor:pointer;color:var(--color-text);padding:8px 12px;font-size:13px}.erd-search-item:hover{background-color:var(--color-bg-secondary)}.erd-minimap{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:100;pointer-events:auto;border-radius:8px;width:180px;height:130px;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.erd-minimap-content{width:100%;height:100%;position:relative}.erd-minimap-viewport{border:2px solid var(--color-primary);box-sizing:border-box;pointer-events:none;background-color:#3b82f61a;position:absolute}